diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..3131f71 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,12 @@ +.git +**/node_modules +**/build +**/.svelte-kit +**/.vercel +**/.netlify +**/.wrangler +**/dist +.superpowers +.remember +docs +apps/docs/.svelte-kit diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 23e7894..9a04a50 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,9 +1,8 @@ name: Release # Release channel is driven by the branch you merge into: -# main -> production (dist-tag: latest) -# dev -> beta (dist-tag: beta) version must be a -beta.x prerelease -# any -> next (dist-tag: next) whenever the version contains -next.x +# main -> production (dist-tag: latest) version must be a clean x.y.z +# dev -> next (dist-tag: next) version must be a -next.x prerelease # A merge only publishes when the version in package.json is NOT already on npm, # so ordinary merges that don't bump the version are no-ops. on: @@ -44,8 +43,8 @@ jobs: - run: pnpm install --frozen-lockfile # Decide the dist-tag from branch + version, or skip if this channel/version - # combination is not allowed. Enforces: production only from main, beta only - # from dev, next from anywhere. + # combination is not allowed. Enforces: production only from main, next only + # from dev. - name: Resolve release channel id: channel working-directory: packages/sveltekit-og @@ -55,10 +54,8 @@ jobs: BRANCH="${GITHUB_REF_NAME}" echo "name=$NAME"; echo "version=$VERSION"; echo "branch=$BRANCH" - if [[ "$VERSION" == *-next.* ]]; then + if [[ "$BRANCH" == "dev" && "$VERSION" == *-next.* ]]; then TAG=next - elif [[ "$BRANCH" == "dev" && "$VERSION" == *-beta.* ]]; then - TAG=beta elif [[ "$BRANCH" == "main" && "$VERSION" != *-* ]]; then TAG=latest else diff --git a/.node-version b/.node-version new file mode 100644 index 0000000..a45fd52 --- /dev/null +++ b/.node-version @@ -0,0 +1 @@ +24 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2dabb09..dce0e49 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -64,8 +64,7 @@ npm run format | Branch | Version | Published to | | ------ | ----------------- | ---------------- | | `main` | clean (`4.4.0`) | `latest` (prod) | -| `dev` | `-beta.x` | `beta` | -| any | `-next.x` | `next` | +| `dev` | `-next.x` | `next` | Any other branch/version combination does **not** publish. A push/merge only publishes when the version is not already on npm — merges that don't bump the version are no-ops. @@ -75,22 +74,14 @@ Bump the version with the interactive helper (it commits and pushes to the curre pnpm release ``` -### Beta +### Next (prerelease) ```bash git checkout dev -pnpm release # pick a -beta version, e.g. 4.4.0-beta.0 -``` - -Pushing to `dev` publishes `@beta`. Install with `npm i @ethercorps/sveltekit-og@beta`. - -### Next (experimental preview) - -```bash pnpm release # pick a -next version, e.g. 4.4.0-next.0 ``` -Publishes `@next` from any branch. Use for throwaway previews you don't want on `@beta`. +Pushing to `dev` publishes `@next`. Install with `npm i @ethercorps/sveltekit-og@next`. ### Production diff --git a/apps/docs/.hallmark/log.json b/apps/docs/.hallmark/log.json new file mode 100644 index 0000000..d119748 --- /dev/null +++ b/apps/docs/.hallmark/log.json @@ -0,0 +1,23 @@ +[ + { + "date": "2026-10-08", + "macrostructure": "Workbench", + "theme": "project tokens (svecodocs rose)", + "enrichment": "none", + "brief": "sveltekit-og docs \u00b7 /docs/playground redesigned as a Workbench: toolbar, editor | live render, code drawer" + }, + { + "date": "2026-10-08", + "macrostructure": "Narrative Workflow", + "theme": "project tokens (svecodocs rose)", + "enrichment": "none", + "brief": "sveltekit-og docs \u00b7 /docs/playground redesigned as a four-stage flow with twinkleplop highlighting" + }, + { + "date": "2026-10-08", + "macrostructure": "Component Playground", + "theme": "project tokens (svecodocs rose)", + "enrichment": "none", + "brief": "sveltekit-og docs \u00b7 /docs/playground for the client API" + } +] diff --git a/apps/docs/.node-version b/apps/docs/.node-version new file mode 100644 index 0000000..a45fd52 --- /dev/null +++ b/apps/docs/.node-version @@ -0,0 +1 @@ +24 diff --git a/apps/docs/package.json b/apps/docs/package.json index f8eb815..5eeda45 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -48,7 +48,11 @@ "vite": "^7.2.4" }, "dependencies": { - "@ethercorps/sveltekit-og": "^4.3.1-next.3", - "octokit": "^5.0.5" + "@ethercorps/sveltekit-og": "^4.4.0-next.2", + "@twinkleplop/html": "^0.1.7", + "@twinkleplop/theme-github": "^0.2.4", + "@twinkleplop/typescript": "^0.1.7", + "octokit": "^5.0.5", + "paneforge": "1.0.2" } } diff --git a/apps/docs/src/app.css b/apps/docs/src/app.css index f5e9f06..4986cbb 100644 --- a/apps/docs/src/app.css +++ b/apps/docs/src/app.css @@ -1,3 +1,9 @@ @import '@svecodocs/kit/theme-rose.css'; @import '@svecodocs/kit/globals.css'; @source "../node_modules/@svecodocs/kit"; + +/* Hallmark responsive gate 34: no horizontal scroll from clipped-edge content; clip (not hidden) keeps sticky working */ +html, +body { + overflow-x: clip; +} diff --git a/apps/docs/src/content/runtime/bun.md b/apps/docs/src/content/runtime/bun.md new file mode 100644 index 0000000..c1272c4 --- /dev/null +++ b/apps/docs/src/content/runtime/bun.md @@ -0,0 +1,107 @@ +--- +title: Bun +description: How to use SvelteKit OG with the official Bun adapter (@sveltejs/adapter-bun) +section: Runtime +priority: 6 +--- + + + +This section details the configuration needed to run SvelteKit OG on the [Bun](https://bun.sh) runtime with the official Bun adapter (`@sveltejs/adapter-bun`). Both engines work: Satori + ReSVG take the Node code path (the wasm is read from `node_modules`), and Takumi resolves its native backend through its `bun` export condition. + + + +`@sveltejs/adapter-bun` needs **SvelteKit 3** and **Bun 1.4 or newer**. The adapter also requires the build itself to run under Bun — `vite build` started by Node fails with "adapter-bun requires running the SvelteKit build with Bun". + + + +## Installation + +Install the Bun adapter: + + + +SvelteKit 3 has no `svelte.config.js`; pass the adapter to `sveltekit()` in `vite.config.js`: + +```javascript title="vite.config.js" showLineNumbers +import adapter from '@sveltejs/adapter-bun'; +import { sveltekit } from '@sveltejs/kit/vite'; +import { sveltekitOG } from '@ethercorps/sveltekit-og/plugin'; + +const config = { + plugins: [sveltekit({ adapter: adapter() }), sveltekitOG({ esmImport: false })] +}; + +export default config; +``` + +## Plugin Configuration + +Use the `sveltekitOG` Vite plugin with `{ esmImport: false }`, exactly as on Node: the Wasm module is then loaded with Bun's Node-compatible file APIs instead of an ESM `.wasm` import. The plugin only touches the server bundle, so the [client-side entry](/docs/usage/client) keeps working alongside it. + +## Build and run + +Build with Bun (not Node) and start the generated server: + +```json title="package.json" showLineNumbers +{ + "scripts": { + "build": "bun run --bun vite build", + "start": "bun ./build" + } +} +``` + +```shell title="Bash" +bun run build +bun run start +``` + +The server listens on `PORT` (default `3000`). See the adapter docs for `HOST`, `SOCKET_PATH`, proxy headers and the other environment variables. + +## Usage + +Once configured, usage is the same as any other SvelteKit environment. + +- Svelte Components: refer to the [Svelte Component](/docs/usage/svelte) usage. +- Raw HTML: refer to the [Raw HTML section](/docs/usage/html) for string templates. +- Takumi: refer to the [Takumi engine](/docs/usage/takumi) page. + +## Preview (Self Test) + +Source: https://github.com/etherCorps/sveltekit-og/tree/main/examples/bun-build + +### Step-by-Step Guide + +- Clone the repository and navigate: + +```shell title="Bash" +git clone https://github.com/etherCorps/sveltekit-og.git +cd sveltekit-og/examples/bun-build +``` + +- Install dependencies: + +```shell title="Bash" +pnpm install +``` + +- Build with Bun: + +```shell title="Bash" +bun run build +``` + +- Start the server: + +```shell title="Bash" +bun run start +``` + +Then open [http://localhost:3000](http://localhost:3000) to browse the example gallery — the **PNG**, **SVG** and **Takumi** routes, each as an HTML string, a Svelte component, and a pre-rendered image, plus the client-side renders. + +More on how to use [adapter-bun in SvelteKit](https://svelte.dev/docs/kit/adapter-bun) diff --git a/apps/docs/src/content/usage/client.md b/apps/docs/src/content/usage/client.md new file mode 100644 index 0000000..1676cd1 --- /dev/null +++ b/apps/docs/src/content/usage/client.md @@ -0,0 +1,131 @@ +--- +title: Client-side Rendering +description: Generate OG images in the browser or a web worker, with no server request. +section: Usage +priority: 4 +--- + + + +## Overview + +The `@ethercorps/sveltekit-og/client` entry renders images **in the browser** — on the main thread or inside a web worker — using the same two engines as the server: **Takumi** (default) or **Satori + ReSVG**. Nothing is sent to your server. + +Use it for live previews in an editor or CMS, or for sites with no server (`adapter-static`) that still want images generated at runtime. + + + +Open the [Playground](/docs/playground) — it renders in your browser with this API and shows the matching `createImage(...)` call. + + + + + +Client-side rendering is available from `sveltekit-og@4.4.0`. Try it early from the `next` tag: `npm i @ethercorps/sveltekit-og@next`. + + + +## Requirements + +- **Vite** (every SvelteKit app). The entry loads its WebAssembly and fonts through Vite `?url` asset imports; other bundlers are not supported. +- `takumi-js` must be installed to use the client entry with **either** engine: the bundler resolves the Takumi chunk at build time even if you only ever pick Satori. +- Pages that render client-side must run in the browser: set `export const ssr = false;` in the route's `+page.ts`, or only call the API inside `onMount`/event handlers. + +## Usage + +```ts title="src/routes/preview/+page.svelte (script)" showLineNumbers +import { createImage } from "@ethercorps/sveltekit-og/client"; + +const html = `
Hello
`; + +// Takumi is the default engine +const res = createImage(html, { width: 1200, height: 630, format: "png" }); +const url = URL.createObjectURL(await res.blob()); +``` + +`createImage` (and the `ImageResponse` class, which is the same thing as a `Response` subclass) returns a standard `Response`; read it with `.blob()`, `.arrayBuffer()` or `.text()`. + +### Choosing an engine + +```ts +// Satori + ReSVG: png or svg +createImage(html, { engine: "satori", format: "svg", width: 1200, height: 630 }); + +// Takumi: png, jpeg, webp, ico, raw, svg +createImage(html, { engine: "takumi", format: "webp", quality: 80, width: 1200, height: 630 }); +``` + +The options are a discriminated union on `engine`, so TypeScript narrows the remaining fields (formats, fonts, emoji) to the engine you picked. Satori raster formats other than `png` are rendered as `png`. + +**Only the engine you use is downloaded.** Each engine is a separate chunk; Takumi users never fetch Satori's WebAssembly and vice versa. Rough first-render downloads: Takumi ≈ 3.7 MB wasm; Satori ≈ 2.6 MB wasm (yoga + resvg) plus ≈ 1.2 MB of default fonts unless you pass your own. + +### Svelte components + +```ts +import Card from "./Card.svelte"; + +createImage(Card, { width: 1200, height: 630 }, { title: "Hello", subtitle: "from the browser" }); +``` + +Components are mounted in a detached shadow root and their HTML is captured, so page CSS can't leak into the image. **Only inline styles are captured** — scoped ` diff --git a/apps/docs/src/lib/components/playground/Playground.svelte b/apps/docs/src/lib/components/playground/Playground.svelte new file mode 100644 index 0000000..5db4fad --- /dev/null +++ b/apps/docs/src/lib/components/playground/Playground.svelte @@ -0,0 +1,685 @@ + + + +{#snippet segmented(name: string, value: string, options: readonly string[], set: (v: string) => void, label: (v: string) => string = (v) => v)} +
+ {#each options as o (o)} + + {/each} +
+{/snippet} + + +{#snippet labelled(stacked: boolean, text: string, body: import('svelte').Snippet)} + {#if stacked} +
+ {text} + {@render body()} +
+ {:else} + {@render body()} + {/if} +{/snippet} + +{#snippet options(stacked: boolean)} + {#if !isComponent} + {#snippet styling()} + {@render segmented('Styling', style, STYLES.map((s) => s.id), (v) => selectStyle(v as Style), (id) => STYLES.find((s) => s.id === id)?.label ?? id)} + {/snippet} + {@render labelled(stacked, 'Styling', styling)} + {/if} + {#snippet fmt()} + {@render segmented('Format', format, formats, (v) => (format = v), pretty)} + {/snippet} + {@render labelled(stacked, 'Format', fmt)} + {#snippet size()} +
+ + + + + +
+ {/snippet} + {@render labelled(stacked, 'Size', size)} + {#if showQuality} +
+ + +
+ {/if} +{/snippet} + + +{#snippet editorPane()} +
+
+ {#if isComponent} + Props · Card.svelte + markup below is read-only + {:else} + HTML · {hint} + +
+ {#if dirty} + + {/if} + + +
+ {/if} +
+ {#if isComponent} +
+
+
+ + +
+
+ + +
+
+ + +
+
+
+ +
+
+ {:else} + +
+ +
+ {/if} +
+{/snippet} + + +{#snippet engineShell()} +
+
+ {pretty(engine)} · {pretty(format)} + + {#if url && !error} + {(bytes / 1024).toFixed(1)} KB · {ms} ms + + + {:else if loading} + Rendering… + {/if} + +
+
+
+ {#if error} +
{error}
+ {:else if url} + Rendered Open Graph preview + {:else} + + {/if} +
+
+
+{/snippet} + + +{#snippet browserShell()} +
+
+ browser · same markup, no engine + {width} × {height} +
+
+
+
+ {#if isComponent} + + {:else} + + {/if} +
+
+
+
+{/snippet} + + +
+ +
+ + + {@render segmented('Engine', engine, ENGINES, (v) => setEngine(v as Engine), pretty)} + + {#if lg.current} + {@render options(false)} +
+ {#if dirty} + + {/if} + + +
+ {:else} + + {/if} +
+ + {#if !lg.current} +
+
{@render options(true)}
+
+ {/if} + + +
+
+ {#each examples as ex (ex.id)} + + {/each} +
+

{example.hint}

+
+ + {#if lg.current} + + + + {@render editorPane()} + + + + + + {@render engineShell()} + + + + {@render browserShell()} + + + + + {:else} +
+ {#each tabs as [id, label] (id)} + + {/each} +
+ {#if view === 'edit'} + {@render editorPane()} + {:else if view === 'image'} + {@render engineShell()} + {:else if view === 'browser'} + {@render browserShell()} + {:else} +
+
+ createImage + +
+ +
+ {@html snippetHtml} +

{INSTALL}

+
+
+ {/if} + {/if} + + + {#if lg.current} +
+ + {#if drawerOpen} + +
+ {@html snippetHtml} +
+ {/if} +
+ {/if} +
+ + diff --git a/apps/docs/src/lib/components/playground/Thumb.svelte b/apps/docs/src/lib/components/playground/Thumb.svelte new file mode 100644 index 0000000..953342f --- /dev/null +++ b/apps/docs/src/lib/components/playground/Thumb.svelte @@ -0,0 +1,44 @@ + + + +{#if url} + +{:else if failed} +
no preview
+{:else} + +{/if} diff --git a/apps/docs/src/lib/components/playground/examples.ts b/apps/docs/src/lib/components/playground/examples.ts new file mode 100644 index 0000000..3c8f5b0 --- /dev/null +++ b/apps/docs/src/lib/components/playground/examples.ts @@ -0,0 +1,242 @@ +// Playground templates. Each is the OG *content* — inline styles (or a `tw` attribute) +// only, because both engines read them and the client component path captures inline +// styles alone. Keep every template to one accent on a plain surface; the point is the +// API, not the art. +// +// Every HTML template is written two ways — vanilla CSS and Tailwind (`tw` attribute) — +// and the vanilla one is per engine: Satori gets flex only, Takumi gets CSS grid, +// box-shadow and gradients on top, since that is what it adds. + +export type Engine = 'takumi' | 'satori'; +export type Style = 'css' | 'tailwind'; + +export const STYLES: { id: Style; label: string }[] = [ + { id: 'css', label: 'Vanilla CSS' }, + { id: 'tailwind', label: 'Tailwind' } +]; + +/** one-line description of what the current template uses, for the editor head */ +export function styleHint(style: Style, engine: Engine): string { + if (style === 'tailwind') return 'tw attribute'; + return engine === 'takumi' ? 'grid, shadows, gradients' : 'flex only'; +} + +/** the markup to load for a template given the styling and the engine */ +export function templateFor(example: Example, style: Style, engine: Engine): string { + if (!example.html) return ''; + return style === 'tailwind' ? example.html.tailwind : example.html[engine]; +} + +export type Example = { + id: string; + label: string; + /** one line under the template picker explaining what this template shows */ + hint: string; + /** empty for the component template, which renders Card.svelte instead */ + html: Record | null; +}; + +const FONT = 'font-family:ui-sans-serif,system-ui,sans-serif'; + +export const examples: Example[] = [ + { + id: 'docs', + label: 'Docs page', + hint: 'Site name, a big title and three engine tiles — the same layout in every styling.', + html: { + satori: `
+
+
+ sveltekit-og.dev +
+
Client-side rendering
+
+
Takumi
+
Satori + ReSVG
+
No server request
+
+
`, + takumi: `
+
+
+ sveltekit-og.dev +
+
Client-side rendering
+
Takumi
+
Satori + ReSVG
+
No server request
+
`, + tailwind: `
+
+
+ sveltekit-og.dev +
+
Client-side rendering
+
+
Takumi
+
Satori + ReSVG
+
No server request
+
+
` + } + }, + { + id: 'post', + label: 'Blog post', + hint: 'Headline, author row and a series card — the same layout in every styling.', + html: { + satori: `
+
Engineering notes
+
+
+
Why we render OG images on the client now
+
+
SM
+
Shivam Meena · 8 Oct 2026 · 6 min read
+
+
+
+
SERIES
+
Open Graph, everywhere
+
Part 3 of 3
+
+
+
`, + takumi: `
+
Engineering notes
+
Why we render OG images on the client now
+
+
SERIES
+
Open Graph, everywhere
+
Part 3 of 3
+
+
+
SM
+
Shivam Meena · 8 Oct 2026 · 6 min read
+
+
`, + tailwind: `
+
Engineering notes
+
+
+
Why we render OG images on the client now
+
+
SM
+
Shivam Meena · 8 Oct 2026 · 6 min read
+
+
+
+
SERIES
+
Open Graph, everywhere
+
Part 3 of 3
+
+
+
` + } + }, + { + id: 'release', + label: 'Release', + hint: 'Version badge, a headline and two change cards — the same layout in every styling.', + html: { + satori: `
+
+
v4.4.0
+
@ethercorps/sveltekit-og
+
+
Render in the browser
+
+
+
ADDED
+
/client entry with Takumi and Satori engines
+
+
+
FIXED
+
Empty elements and multi-line styles on Satori
+
+
+
`, + takumi: `
+
+
v4.4.0
+
@ethercorps/sveltekit-og
+
+
Render in the browser
+
+
ADDED
+
/client entry with Takumi and Satori engines
+
+
+
FIXED
+
Empty elements and multi-line styles on Satori
+
+
`, + tailwind: `
+
+
v4.4.0
+
@ethercorps/sveltekit-og
+
+
Render in the browser
+
+
+
ADDED
+
/client entry with Takumi and Satori engines
+
+
+
FIXED
+
Empty elements and multi-line styles on Satori
+
+
+
` + } + }, + { + id: 'profile', + label: 'Profile', + hint: 'Avatar, name, handle and three tags — the same layout in every styling.', + html: { + satori: `
+
SM
+
+
Shivam Meena
+
@theether0
+
+
SvelteKit OG
+
Every runtime
+
Now the browser
+
+
+
`, + takumi: `
+
SM
+
Shivam Meena
+
@theether0
+
+
SvelteKit OG
+
Every runtime
+
Now the browser
+
+
`, + tailwind: `
+
SM
+
+
Shivam Meena
+
@theether0
+
+
SvelteKit OG
+
Every runtime
+
Now the browser
+
+
+
` + } + }, + { + id: 'component', + label: 'Svelte component', + hint: 'Renders Card.svelte with the props below — components mount in a detached shadow root.', + html: null + } +]; + +export const DEFAULT_EXAMPLE = examples[0]; diff --git a/apps/docs/src/lib/components/playground/format.ts b/apps/docs/src/lib/components/playground/format.ts new file mode 100644 index 0000000..045e9a6 --- /dev/null +++ b/apps/docs/src/lib/components/playground/format.ts @@ -0,0 +1,75 @@ +// Pretty-printer for the playground's OG markup: one element per line, two-space indent, +// and a `style` attribute broken into one declaration per line once a tag gets long. +// The engines strip newlines before parsing and trim each declaration, so the output +// renders identically to the one-line form. +// +// ponytail: regex tokenizer, no comments/CDATA/script handling — the templates are plain +// element + text markup. Reach for a real parser if that stops being true. + +const VOID = new Set(['img', 'br', 'hr', 'input', 'meta', 'link', 'source']); +const WIDTH = 72; + +type Tok = { kind: 'open' | 'close' | 'text'; raw: string; name?: string; attrs?: string; selfClosing?: boolean }; + +function tokenize(src: string): Tok[] { + const out: Tok[] = []; + const re = /<\/([a-zA-Z][\w-]*)\s*>|<([a-zA-Z][\w-]*)((?:\s+[^\s=>]+(?:=(?:"[^"]*"|'[^']*'|[^\s>]+))?)*)\s*(\/?)>|([^<]+)/g; + let m: RegExpExecArray | null; + while ((m = re.exec(src))) { + if (m[1]) out.push({ kind: 'close', raw: m[0], name: m[1].toLowerCase() }); + else if (m[2]) out.push({ kind: 'open', raw: m[0], name: m[2].toLowerCase(), attrs: m[3].trim(), selfClosing: m[4] === '/' }); + else if (m[5].trim()) out.push({ kind: 'text', raw: m[5].replace(/\s+/g, ' ').trim() }); + } + return out; +} + +/** `style="a:b;c:d"` → multi-line declarations; other attributes untouched. */ +function formatAttrs(attrs: string, indent: string): string { + const parts = attrs.match(/[^\s=]+(?:=(?:"[^"]*"|'[^']*'|[^\s]+))?/g) ?? []; + const lines = parts.map((a) => { + const m = /^style=(["'])([\s\S]*)\1$/.exec(a); + if (!m) return a; + const decls = m[2] + .split(';') + .map((d) => d.replace(/\s*:\s*/, ': ').trim()) + .filter(Boolean); + return `style="\n${decls.map((d) => `${indent} ${d};`).join('\n')}\n${indent} "`; + }); + return lines.map((l) => `${indent} ${l}`).join('\n'); +} + +export function formatHtml(src: string): string { + const toks = tokenize(src); + const out: string[] = []; + let depth = 0; + for (let i = 0; i < toks.length; i++) { + const t = toks[i]; + const indent = ' '.repeat(depth); + if (t.kind === 'close') { + depth = Math.max(0, depth - 1); + out.push(`${' '.repeat(depth)}`); + continue; + } + if (t.kind === 'text') { + out.push(indent + t.raw); + continue; + } + const leaf = VOID.has(t.name!) || t.selfClosing; + const next = toks[i + 1]; + // text stays on one line when it fits + const inlineText = !leaf && next?.kind === 'text' && toks[i + 2]?.kind === 'close' && toks[i + 2].name === t.name; + const openShort = `<${t.name}${t.attrs ? ' ' + t.attrs : ''}${leaf && t.selfClosing ? ' /' : ''}>`; + const oneLine = inlineText ? `${indent}${openShort}${next.raw}` : indent + openShort; + if (oneLine.length <= WIDTH) { + out.push(oneLine); + if (inlineText) i += 2; + else if (!leaf) depth++; + continue; + } + out.push(`${indent}<${t.name}`); + if (t.attrs) out.push(formatAttrs(t.attrs, indent)); + out.push(`${indent}${leaf && t.selfClosing ? '/>' : '>'}`); + if (!leaf) depth++; + } + return out.join('\n'); +} diff --git a/apps/docs/src/lib/navigation.ts b/apps/docs/src/lib/navigation.ts index e048504..2d880d1 100644 --- a/apps/docs/src/lib/navigation.ts +++ b/apps/docs/src/lib/navigation.ts @@ -4,6 +4,7 @@ import RocketLaunch from 'phosphor-svelte/lib/RocketLaunch'; import { defineNavigation } from '@svecodocs/kit'; import { getSectionItems } from './utils.js'; import Tag from 'phosphor-svelte/lib/Tag'; +import Flask from 'phosphor-svelte/lib/Flask'; const runtime = getSectionItems('Runtime'); @@ -29,6 +30,12 @@ export const navigation = defineNavigation({ description: 'A quick guide to get started using Sveltekit OG', icon: RocketLaunch }, + { + title: 'Playground', + description: 'Render an OG image in your browser with the client API', + href: '/docs/playground', + icon: Flask + }, { title: 'Releases', description: 'Sveltekit OG package release history and latest version', diff --git a/apps/docs/src/routes/(docs)/docs/playground/+page.svelte b/apps/docs/src/routes/(docs)/docs/playground/+page.svelte new file mode 100644 index 0000000..dd68e26 --- /dev/null +++ b/apps/docs/src/routes/(docs)/docs/playground/+page.svelte @@ -0,0 +1,13 @@ + + + + Playground — Sveltekit OG + + + + diff --git a/apps/docs/src/routes/(docs)/docs/playground/+page.ts b/apps/docs/src/routes/(docs)/docs/playground/+page.ts new file mode 100644 index 0000000..d856fe8 --- /dev/null +++ b/apps/docs/src/routes/(docs)/docs/playground/+page.ts @@ -0,0 +1,4 @@ +// Browser-only: the client entry loads its wasm through Vite `?url` assets and +// renders with the DOM, so this page is neither prerendered nor server-rendered. +export const prerender = false; +export const ssr = false; diff --git a/docs/superpowers/plans/2026-10-05-client-side-rendering.md b/docs/superpowers/plans/2026-10-05-client-side-rendering.md new file mode 100644 index 0000000..5f16dfa --- /dev/null +++ b/docs/superpowers/plans/2026-10-05-client-side-rendering.md @@ -0,0 +1,1171 @@ +# Client-side Rendering Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Finish the `@ethercorps/sveltekit-og/client` entry on branch `feat/client-side-rendering` so both engines render in the browser and in workers, users download only the engine they pick, satori works with zero font config, and the feature ships on `next` as `4.4.0-next.0`. + +**Architecture:** Everything lives under `packages/sveltekit-og/src/lib/client/`. `render.ts` dispatches to an engine module via dynamic `import()` (one Vite chunk per engine), lazy-loads the Svelte component mounter only on the main thread, and fills in bundled Noto Sans fonts for satori when the caller passes none. Server render files are not modified. + +**Tech Stack:** SvelteKit 2 / Svelte 5, Vite `?url` asset imports, vitest 1.x (node env), satori + `@resvg/resvg-wasm`, takumi-js 2.0.1, pnpm workspace. + +**Spec:** `docs/superpowers/specs/2026-10-05-client-side-rendering-design.md` + +## Global Constraints + +- Do not modify server render files: `src/lib/helpers/create.ts`, `src/lib/image-response.ts`, `src/lib/providers/*`, `src/lib/takumi/*`, `src/lib/helpers/toJSX.ts`, `src/lib/helpers/to-html.ts`, `src/lib/fonts.ts`. The single allowed shared edit is adding one constant to `ErrorCodes` in `src/lib/helpers/error-handler.ts`. +- All work happens in `packages/sveltekit-og/` unless a path says otherwise. Run commands from that directory. +- Tests are vitest only (`pnpm test` → `vitest`, run once with `npx vitest run`). No Playwright, no new CI workflow. +- `ImageResponseError` constructor is `(message: string, code: string, originalError?: Error)`. +- Satori raster formats stay pinned to `png` in `image-response.ts` (unchanged). +- Vite-only: wasm and font assets load via `?url` + `fetch(new URL(url, import.meta.url))`. +- Commit messages: Conventional Commits, no `Co-Authored-By` trailer (user rule). +- Next prerelease version must be `4.4.0-next.0` (the `4.3.1-next.1..3` versions already exist on npm). + +## Review Focus + +1. `fonts: []` (empty array) with `engine: "satori"` — a person expects the bundled fonts to kick in, same as `fonts: undefined`. Pinned in Task 4. +2. Bundled font fetch fails (404 because a consumer's asset path is wrong) — expect an `ImageResponseError` with code `FONT_LOAD_FAILED`, and the *next* render to retry rather than stay poisoned by a cached rejection. Pinned in Task 4. +3. `engine: "satori", format: "svg"` with no fonts — fallback must apply to SVG too (it is engine-based, not format-based). Pinned in Task 4. +4. A component passed inside a worker with `engine: "satori"` — the guard must fire *before* any wasm or font download starts. Pinned in Task 2. +5. `engine` omitted entirely — must dispatch to takumi and never touch the satori module. Pinned in Task 3. + +--- + +### Task 1: Rebase onto `dev`, squash, drop unrelated changes, retarget PR + +**Files:** +- Modify: `packages/sveltekit-og/package.json` (restore `dev`'s version, re-add only the `./client` export) +- Restore from `dev`: `packages/sveltekit-og/svelte.config.js`, `packages/sveltekit-og/src/lib/fonts.ts` +- Modify: `pnpm-lock.yaml` (root; regenerated by `pnpm install`) + +**Interfaces:** +- Consumes: nothing. +- Produces: a branch `feat/client-side-rendering` = `dev` + 1 squashed `feat(client)` commit + spec commits + 1 cleanup commit. PR #74 based on `dev`. + +- [ ] **Step 1: Safety branch, then rebase** + +```bash +cd /Users/shivammeena/Projects/ethercorps/sveltekit-og +git checkout feat/client-side-rendering +git branch backup/client-pre-rebase +GIT_EDITOR=true git rebase dev +``` + +Expected: `Successfully rebased and updated refs/heads/feat/client-side-rendering.` + +If it stops with a conflict in `pnpm-lock.yaml` only: keep `dev`'s lockfile and continue; the lockfile is regenerated in Step 4. + +```bash +git checkout --ours pnpm-lock.yaml && git add pnpm-lock.yaml && GIT_EDITOR=true git rebase --continue +``` + +If it stops with a conflict in any other file: stop and report; do not resolve by hand. + +- [ ] **Step 2: Squash the two identical `feat(client)` commits into one** + +The two feature commits are the first two commits above `dev`; the spec commits follow them. + +```bash +FEAT2=$(git log --format=%H --reverse dev..HEAD | sed -n 2p) +SPECS=$(git log --format=%H --reverse dev..HEAD | tail -n +3) +git reset --hard "$FEAT2" +git reset --soft dev +git commit -F - <<'EOF' +feat(client): add browser/worker rendering via new /client entry + +New `@ethercorps/sveltekit-og/client` export for generating OG images +in the browser or a worker, no server request. Single surface: +`ImageResponse` (extends Response) + `createImage`, with the engine +chosen in config: `{ engine: 'takumi' | 'satori', ...opts }` (default +takumi), typed as a per-engine discriminated union. + +Fully self-contained under src/lib/client/ — own browser wasm providers +(satori/yoga + resvg via bundler `?url` + fetch(new URL), same-origin so +no CORS, worker-safe) and own satori/resvg render path that reuses only +the engine-agnostic shared helpers. Server render code stays untouched. + +- Svelte components rendered client-side via mount into a detached + shadow root (not svelte/server), isolating page CSS from the image + and the component's styles from the page. +- Playground demo route at /client (ssr=false). +- Free resvg wasm objects after render; clamp satori raster formats to + png so Content-Type matches the bytes; revoke object URLs only once + the replacement is ready. +EOF +git cherry-pick $SPECS +git log --oneline dev..HEAD +``` + +Expected: one `feat(client)` commit followed by the `docs(spec)` commits. + +- [ ] **Step 3: Drop the unrelated changes** + +```bash +git checkout dev -- packages/sveltekit-og/svelte.config.js packages/sveltekit-og/src/lib/fonts.ts packages/sveltekit-og/package.json +``` + +Then re-add the client export to `packages/sveltekit-og/package.json`, directly after the `"./takumi"` block inside `"exports"`: + +```json + "./client": { + "types": "./dist/client/index.d.ts", + "svelte": "./dist/client/index.js", + "import": "./dist/client/index.js" + }, +``` + +Check: `git diff dev -- packages/sveltekit-og/package.json` must show only those five added lines. `@sveltejs/adapter-node` must not be in devDependencies. + +- [ ] **Step 4: Sync the lockfile and run the tests** + +```bash +cd /Users/shivammeena/Projects/ethercorps/sveltekit-og && pnpm install +cd packages/sveltekit-og && npx vitest run +``` + +Expected: `pnpm install` finishes without `ERR_PNPM`; vitest reports all test files passed (index, takumi, client — the client satori case is skipped, that's expected). + +- [ ] **Step 5: Commit, force-push, retarget PR** + +```bash +cd /Users/shivammeena/Projects/ethercorps/sveltekit-og +git add -A packages/sveltekit-og/package.json packages/sveltekit-og/svelte.config.js packages/sveltekit-og/src/lib/fonts.ts pnpm-lock.yaml +git commit -m "chore(client): drop adapter-node switch and unrelated edits from the branch" +git push --force-with-lease origin feat/client-side-rendering +gh pr edit 74 --base dev +gh pr view 74 --json baseRefName -q .baseRefName +``` + +Expected: last command prints `dev`. + +--- + +### Task 2: Worker guard + lazy component mounter + +**Files:** +- Modify: `packages/sveltekit-og/src/lib/helpers/error-handler.ts:19-30` (add one constant) +- Create: `packages/sveltekit-og/src/lib/client/component.ts` +- Modify: `packages/sveltekit-og/src/lib/client/render.ts` +- Test: `packages/sveltekit-og/src/client.test.ts` + +**Interfaces:** +- Consumes: `ImageResponseError(message, code)`, `ErrorCodes` from `$lib/helpers/error-handler.js`. +- Produces: `ErrorCodes.COMPONENT_IN_WORKER = "COMPONENT_IN_WORKER"`; `component.ts` exports `componentToHtml(component: Component, props: Record): string`; `render.ts` keeps exporting `createClientImage(element, options, props?)` but it now rejects with `COMPONENT_IN_WORKER` when `document` is undefined and `element` is a component. + +- [ ] **Step 1: Write the failing tests** + +Replace the header comment and add a new `describe` block at the bottom of `packages/sveltekit-og/src/client.test.ts`. Vitest runs in node, where `document` is undefined — that *is* the worker condition, so no stubbing is needed. + +Replace lines 1-6 (imports + stale comment) with: + +```ts +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { ImageResponse, createImage } from "$lib/client/index.js"; +import { ErrorCodes } from "$lib/helpers/error-handler.js"; +import Card from "./routes/client/Card.svelte"; + +// Vitest runs in node: no `document` (same as a worker), and the satori wasm +// can't be fetched from `?url` assets here. So these tests cover dispatch, +// the worker guard and the font fallback; real satori rendering is checked by +// hand in the browser (see the spec's manual checklist). +const html = `
Hello
`; +``` + +Append at the end of the file: + +```ts +describe("client render: components in a worker", () => { + it("rejects a component with COMPONENT_IN_WORKER when there is no document", async () => { + const { createClientImage } = await import("$lib/client/render.js"); + expect(typeof document).toBe("undefined"); + await expect( + createClientImage(Card, { engine: "takumi", width: 600, height: 300 }, { title: "t", subtitle: "s", num1: 1, num2: 2 }) + ).rejects.toMatchObject({ name: "ImageResponseError", code: ErrorCodes.COMPONENT_IN_WORKER }); + }); + + it("still renders HTML strings without a document", async () => { + const { createClientImage } = await import("$lib/client/render.js"); + const out = (await createClientImage(html, { engine: "takumi", width: 600, height: 300 })) as Uint8Array; + expect(Array.from(out.subarray(0, 4))).toEqual([0x89, 0x50, 0x4e, 0x47]); + }); +}); +``` + +- [ ] **Step 2: Run the tests to verify they fail** + +Run: `cd packages/sveltekit-og && npx vitest run src/client.test.ts` +Expected: FAIL — the first new test fails because `ErrorCodes.COMPONENT_IN_WORKER` is `undefined` and the rejection is a `document is not defined` ReferenceError wrapped as `VNODE_CREATION_FAILED`/other, not `COMPONENT_IN_WORKER`. + +- [ ] **Step 3: Add the error code** + +In `packages/sveltekit-og/src/lib/helpers/error-handler.ts`, inside `ErrorCodes`, add after `TAKUMI_RENDER_FAILED`: + +```ts + COMPONENT_IN_WORKER: "COMPONENT_IN_WORKER", +``` + +- [ ] **Step 4: Create `component.ts`** + +Create `packages/sveltekit-og/src/lib/client/component.ts`: + +```ts +import { mount, unmount, flushSync, type Component } from "svelte"; + +/** + * Render a Svelte component to an HTML string in the browser. The server path uses + * `svelte/server`'s `render`, which isn't reliable client-side, so here we mount the + * component instead. + * + * Mounted inside a detached shadow root: the host is never added to the document, so + * page CSS can't cascade into the component (nothing from the page leaks into the + * rendered image), and the component's own scoped styles stay in the shadow root + * instead of piling up in the page's on every render. + * + * Loaded lazily by render.js, only on the main thread and only when a component is + * passed — string-only users and workers never ship this (or Svelte's mount runtime). + * + * ponytail: captures innerHTML only — inline styles come through, but scoped / + * `css="injected"` styles won't (they're separate nodes an engine ignores). Use + * inline styles (or the `stylesheets`/tailwind options) for client component rendering. + */ +export function componentToHtml(component: Component, props: Record): string { + const host = document.createElement("div"); + const shadow = host.attachShadow({ mode: "open" }); + const target = document.createElement("div"); + shadow.appendChild(target); + const instance = mount(component, { target, props }); + try { + flushSync(); + return target.innerHTML; + } finally { + unmount(instance); + } +} +``` + +- [ ] **Step 5: Rewrite `render.ts` with the guard and lazy mounter** + +Replace the whole of `packages/sveltekit-og/src/lib/client/render.ts` with: + +```ts +import type { Component } from "svelte"; +import { createSatoriImage } from "./satori.js"; +import { createTakumiImage } from "../takumi/render.js"; +import { ImageResponseError, ErrorCodes } from "../helpers/error-handler.js"; +import type { ImageOptions } from "../types.js"; +import type { TakumiImageOptions } from "../takumi/types.js"; +import type { ClientImageResponseOptions } from "./types.js"; + +/** Components need the DOM to mount; workers have none. */ +const hasDocument = () => typeof document !== "undefined"; + +async function toHtml(element: string | Component, props?: Record): Promise { + if (typeof element === "string") return element; + if (!hasDocument()) { + throw new ImageResponseError( + "Svelte components can't be rendered in a worker (no document). Pass an HTML string instead.", + ErrorCodes.COMPONENT_IN_WORKER + ); + } + // lazy: only main-thread component users download the mounter + Svelte's mount runtime + const { componentToHtml } = await import("./component.js"); + return componentToHtml(element, props ?? {}); +} + +/** + * Dispatch to the chosen engine, both running in the browser/worker. Response-only + * keys are stripped so they don't leak into the engine options. + */ +export async function createClientImage( + element: string | Component, + options: ClientImageResponseOptions, + props?: Record +): Promise { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { engine = "takumi", status, statusText, headers, ...imageOptions } = options; + + // components are rendered to HTML here (browser mount), so engines only ever see a string + const html = await toHtml(element, props); + + if (engine === "satori") { + return createSatoriImage(html, imageOptions as ImageOptions); + } + + return createTakumiImage(html, imageOptions as TakumiImageOptions); +} +``` + +- [ ] **Step 6: Run the tests to verify they pass** + +Run: `cd packages/sveltekit-og && npx vitest run src/client.test.ts` +Expected: PASS for both new tests and all pre-existing ones (satori render case still skipped). + +- [ ] **Step 7: Type-check and commit** + +```bash +cd packages/sveltekit-og && npx svelte-check --tsconfig ./tsconfig.json 2>&1 | tail -3 +cd /Users/shivammeena/Projects/ethercorps/sveltekit-og +git add packages/sveltekit-og/src/lib/helpers/error-handler.ts packages/sveltekit-og/src/lib/client/component.ts packages/sveltekit-og/src/lib/client/render.ts packages/sveltekit-og/src/client.test.ts +git commit -m "feat(client): reject components in workers, lazy-load the component mounter" +``` + +Expected: svelte-check reports 0 errors (warnings about pre-existing files are fine). + +--- + +### Task 3: Split engines into lazy modules + +**Files:** +- Create: `packages/sveltekit-og/src/lib/client/engines/satori.ts` (content of `client/satori.ts` + `client/providers.ts`, html-string only) +- Create: `packages/sveltekit-og/src/lib/client/engines/takumi.ts` +- Delete: `packages/sveltekit-og/src/lib/client/satori.ts`, `packages/sveltekit-og/src/lib/client/providers.ts` +- Modify: `packages/sveltekit-og/src/lib/client/render.ts` +- Test: `packages/sveltekit-og/src/client.test.ts` + +**Interfaces:** +- Consumes: `createClientImage` from Task 2; `createTakumiImage(element, options, props?)` from `$lib/takumi/render.js` (server, unchanged). +- Produces: `engines/satori.ts` exports `render(html: string, options: ImageOptions): Promise`; `engines/takumi.ts` exports `render(html: string, options: TakumiImageOptions): Promise`. + +- [ ] **Step 1: Write the failing tests** + +Add near the top of `packages/sveltekit-og/src/client.test.ts`, right after the `html` constant. `vi.mock` is hoisted, so the flag object must come from `vi.hoisted`. The satori engine is mocked for the whole file (it can't run in node anyway). + +```ts +const loaded = vi.hoisted(() => ({ satori: false })); + +vi.mock("$lib/client/engines/satori.js", () => { + loaded.satori = true; + return { + render: vi.fn(async (_html: string, options: { format?: string }) => + options.format === "svg" ? "" : new Uint8Array([0x89, 0x50, 0x4e, 0x47]) + ), + }; +}); + +beforeEach(() => { + vi.resetModules(); + loaded.satori = false; +}); +``` + +Append at the end of the file: + +```ts +describe("client render: lazy engine dispatch", () => { + it("defaults to takumi and never loads the satori engine module", async () => { + const { createClientImage } = await import("$lib/client/render.js"); + const out = (await createClientImage(html, { width: 600, height: 300 })) as Uint8Array; + expect(Array.from(out.subarray(0, 4))).toEqual([0x89, 0x50, 0x4e, 0x47]); + expect(loaded.satori).toBe(false); + }); + + it("loads the satori engine module only when engine is satori", async () => { + const { createClientImage } = await import("$lib/client/render.js"); + const satori = await import("$lib/client/engines/satori.js"); + const out = await createClientImage(html, { engine: "satori", width: 600, height: 300, format: "png" }); + expect(loaded.satori).toBe(true); + expect(satori.render).toHaveBeenCalledTimes(1); + expect(out).toBeInstanceOf(Uint8Array); + }); + + it("does not load any engine when the worker guard fires", async () => { + const { createClientImage } = await import("$lib/client/render.js"); + await expect( + createClientImage(Card, { engine: "satori", width: 600, height: 300 }, { title: "t", subtitle: "s", num1: 1, num2: 2 }) + ).rejects.toMatchObject({ code: ErrorCodes.COMPONENT_IN_WORKER }); + expect(loaded.satori).toBe(false); + }); +}); +``` + +- [ ] **Step 2: Run the tests to verify they fail** + +Run: `cd packages/sveltekit-og && npx vitest run src/client.test.ts` +Expected: FAIL — `vi.mock` of `$lib/client/engines/satori.js` errors because the module doesn't exist yet (or, if vitest tolerates it, the first test fails with `loaded.satori` being `true` because `render.ts` imports `./satori.js` statically). + +- [ ] **Step 3: Create `engines/satori.ts`** + +Create `packages/sveltekit-og/src/lib/client/engines/satori.ts` (providers merged in; takes an HTML string only): + +```ts +import type { SatoriOptions } from "satori"; +import type { ResvgRenderOptions } from "@resvg/resvg-wasm"; +import _satori, { init as initSatoriWasm } from "satori/standalone"; +import { Resvg as _Resvg, initWasm as initResvgWasm } from "@resvg/resvg-wasm"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore - Vite resolves ?url to the emitted asset path +import yogaUrl from "satori/yoga.wasm?url"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore - Vite resolves ?url to the emitted asset path +import resvgWasmUrl from "@resvg/resvg-wasm/index_bg.wasm?url"; + +import { type EmojiType, loadDynamicAsset } from "../../helpers/emoji.js"; +import { DEFAULT_WIDTH } from "../../helpers/defaults.js"; +import type { ImageOptions } from "../../types.js"; +import { createVNode } from "../../helpers/toJSX.js"; +import { createLogger } from "../../helpers/logger.js"; +import { handleAsync, ErrorCodes } from "../../helpers/error-handler.js"; + +/* + * Browser/worker Satori + ReSVG engine. Loaded lazily by render.js so takumi users + * never download it. The wasm comes from same-origin bundler-emitted assets + * (Vite ?url + fetch(new URL(...))): no CORS, works in browsers and workers alike. + * Kept out of the server providers so neither bundle pulls in the other's runtime. + * + * Each init is memoized; a rejected init clears the cache so the next call retries. + */ + +let satoriPromise: Promise | undefined; +let resvgPromise: Promise | undefined; + +function useSatori(): Promise { + satoriPromise ??= (async () => { + const bytes = await fetch(new URL(yogaUrl, import.meta.url)).then((r) => r.arrayBuffer()); + await initSatoriWasm(await WebAssembly.compile(bytes)); + return _satori; + })().catch((error) => { + satoriPromise = undefined; + throw error; + }); + return satoriPromise; +} + +function useResvg(): Promise { + resvgPromise ??= (async () => { + await initResvgWasm(fetch(new URL(resvgWasmUrl, import.meta.url))); + return _Resvg; + })().catch((error) => { + resvgPromise = undefined; + throw error; + }); + return resvgPromise; +} + +/** Engine entry: HTML string in, svg string or png bytes out. Fonts are required here — + * render.js fills in the bundled defaults when the caller passes none. */ +export function render(html: string, options: ImageOptions): Promise { + return options.format === "svg" ? createSvg(html, options) : createPng(html, options); +} + +async function createSvg(html: string, options: ImageOptions): Promise { + const log = createLogger(options.debug ?? false); + const vnodes = createVNode(html); + const satori = await handleAsync( + () => useSatori(), + ErrorCodes.SATORI_INIT_FAILED, + "Failed to initialize Satori" + ); + + const satoriOptions = { ...options } as SatoriOptions; + satoriOptions.loadAdditionalAsset = loadDynamicAsset({ + emoji: options.emoji as EmojiType, + }) as SatoriOptions["loadAdditionalAsset"]; + + log.debug("Generating SVG with Satori (client)"); + + return handleAsync( + () => satori(vnodes, satoriOptions), + ErrorCodes.SATORI_RENDER_FAILED, + "Failed to render SVG with Satori" + ); +} + +async function createPng(html: string, options: ImageOptions): Promise { + const log = createLogger(options.debug ?? false); + const svg = await createSvg(html, options); + + const Resvg = await handleAsync( + () => useResvg(), + ErrorCodes.RESVG_INIT_FAILED, + "Failed to initialize ReSVG" + ); + + const resvg_options: ResvgRenderOptions = { + fitTo: { mode: "width", value: options.width || DEFAULT_WIDTH }, + }; + + log.debug("Rendering PNG with ReSVG (client)"); + + return handleAsync( + async () => { + // free the wasm-backed objects so repeated client renders don't grow wasm memory + const resvg = new Resvg(svg, resvg_options); + const rendered = resvg.render(); + try { + return rendered.asPng(); + } finally { + rendered.free(); + resvg.free(); + } + }, + ErrorCodes.RESVG_RENDER_FAILED, + "Failed to render PNG with ReSVG" + ); +} +``` + +- [ ] **Step 4: Create `engines/takumi.ts`** + +Create `packages/sveltekit-og/src/lib/client/engines/takumi.ts`: + +```ts +import { createTakumiImage } from "../../takumi/render.js"; +import type { TakumiImageOptions } from "../../takumi/types.js"; + +/** + * Takumi engine boundary for the client. Exists only so render.js can `import()` it + * lazily (own Vite chunk); the actual render is the shared takumi path. Takumi's wasm + * embeds a sans-serif font, so no default fonts are injected here. + */ +export function render(html: string, options: TakumiImageOptions): Promise { + return createTakumiImage(html, options); +} +``` + +- [ ] **Step 5: Delete the old files and switch `render.ts` to dynamic imports** + +```bash +cd packages/sveltekit-og && git rm -q src/lib/client/satori.ts src/lib/client/providers.ts +``` + +In `packages/sveltekit-og/src/lib/client/render.ts`: + +Remove these two imports: + +```ts +import { createSatoriImage } from "./satori.js"; +import { createTakumiImage } from "../takumi/render.js"; +``` + +Replace the body of `createClientImage` after `const html = await toHtml(element, props);` with: + +```ts + // lazy: one Vite chunk per engine, so the other engine's JS + wasm are never fetched + if (engine === "satori") { + const { render } = await import("./engines/satori.js"); + return render(html, imageOptions as ImageOptions); + } + + const { render } = await import("./engines/takumi.js"); + return render(html, imageOptions as TakumiImageOptions); +``` + +- [ ] **Step 6: Run the tests to verify they pass** + +Run: `cd packages/sveltekit-og && npx vitest run src/client.test.ts` +Expected: PASS — all three dispatch tests, the Task 2 tests, and the pre-existing ones. + +- [ ] **Step 7: Check that no file imports the deleted modules, type-check, commit** + +```bash +cd packages/sveltekit-og && grep -rn 'client/satori\|client/providers\|"./satori.js"\|"./providers.js"' src/ ; echo "grep exit=$? (1 = clean)" +npx svelte-check --tsconfig ./tsconfig.json 2>&1 | tail -3 +cd /Users/shivammeena/Projects/ethercorps/sveltekit-og +git add packages/sveltekit-og/src/lib/client packages/sveltekit-og/src/client.test.ts +git commit -m "feat(client): load engines lazily so users download only the one they pick" +``` + +Expected: grep prints nothing and exits 1; svelte-check 0 errors. + +--- + +### Task 4: Bundled default fonts for satori + +**Files:** +- Create: `packages/sveltekit-og/src/lib/client/assets/NotoSans-Regular.ttf`, `packages/sveltekit-og/src/lib/client/assets/NotoSans-Bold.ttf` +- Create: `packages/sveltekit-og/src/lib/client/fonts.ts` +- Modify: `packages/sveltekit-og/src/lib/client/render.ts` +- Test: `packages/sveltekit-og/src/client.test.ts` + +**Interfaces:** +- Consumes: `Font` type from `$lib/types.js` (`SatoriOptions["fonts"][number]` = `{ name, data, weight?, style?, lang? }`); `handleAsync`, `ErrorCodes.FONT_LOAD_FAILED`. +- Produces: `fonts.ts` exports `defaultClientFonts(): Promise` (memoized; rejection clears the memo). `render.ts` calls it when `engine === "satori"` and `imageOptions.fonts` is undefined or empty. + +- [ ] **Step 1: Download the fonts** + +```bash +cd packages/sveltekit-og && mkdir -p src/lib/client/assets +curl -fsSL -o src/lib/client/assets/NotoSans-Regular.ttf https://cdn-sveltekit-og.ethercorps.io/NotoSans-Regular.ttf +curl -fsSL -o src/lib/client/assets/NotoSans-Bold.ttf https://cdn-sveltekit-og.ethercorps.io/NotoSans-Bold.ttf +ls -l src/lib/client/assets/ +file src/lib/client/assets/*.ttf +``` + +Expected: two files of ~583 KB each; `file` reports `TrueType Font data`. + +- [ ] **Step 2: Write the failing tests** + +Add to the mock block near the top of `packages/sveltekit-og/src/client.test.ts` (next to the satori engine mock): + +```ts +// vi.mock factories are hoisted above every `const`, so anything they reference +// must come from vi.hoisted or vitest throws "cannot access before initialization". +const FALLBACK_FONTS = vi.hoisted(() => [ + { name: "Noto Sans", data: new ArrayBuffer(8), weight: 400, style: "normal" }, + { name: "Noto Sans", data: new ArrayBuffer(8), weight: 700, style: "normal" }, +]); + +vi.mock("$lib/client/fonts.js", () => ({ + defaultClientFonts: vi.fn(async () => FALLBACK_FONTS), +})); +``` + +Append at the end of the file: + +```ts +describe("client render: satori default fonts", () => { + const ownFont = [{ name: "Own", data: new ArrayBuffer(8), weight: 400 as const, style: "normal" as const }]; + + it("fills in the bundled fonts when satori gets no fonts", async () => { + const { createClientImage } = await import("$lib/client/render.js"); + const fonts = await import("$lib/client/fonts.js"); + const satori = await import("$lib/client/engines/satori.js"); + await createClientImage(html, { engine: "satori", width: 600, height: 300, format: "png" }); + expect(fonts.defaultClientFonts).toHaveBeenCalledTimes(1); + expect(vi.mocked(satori.render).mock.calls[0][1].fonts).toEqual(FALLBACK_FONTS); + }); + + it("treats an empty fonts array as 'no fonts'", async () => { + const { createClientImage } = await import("$lib/client/render.js"); + const satori = await import("$lib/client/engines/satori.js"); + await createClientImage(html, { engine: "satori", width: 600, height: 300, format: "png", fonts: [] }); + expect(vi.mocked(satori.render).mock.calls[0][1].fonts).toEqual(FALLBACK_FONTS); + }); + + it("applies the fallback to svg output too", async () => { + const { createClientImage } = await import("$lib/client/render.js"); + const satori = await import("$lib/client/engines/satori.js"); + const out = await createClientImage(html, { engine: "satori", width: 600, height: 300, format: "svg" }); + expect(out).toBe(""); + expect(vi.mocked(satori.render).mock.calls[0][1].fonts).toEqual(FALLBACK_FONTS); + }); + + it("leaves caller fonts alone", async () => { + const { createClientImage } = await import("$lib/client/render.js"); + const fonts = await import("$lib/client/fonts.js"); + const satori = await import("$lib/client/engines/satori.js"); + await createClientImage(html, { engine: "satori", width: 600, height: 300, format: "png", fonts: ownFont }); + expect(fonts.defaultClientFonts).not.toHaveBeenCalled(); + expect(vi.mocked(satori.render).mock.calls[0][1].fonts).toBe(ownFont); + }); + + it("never loads the bundled fonts for takumi", async () => { + const { createClientImage } = await import("$lib/client/render.js"); + const fonts = await import("$lib/client/fonts.js"); + await createClientImage(html, { width: 600, height: 300 }); + expect(fonts.defaultClientFonts).not.toHaveBeenCalled(); + }); +}); + +describe("client fonts: defaultClientFonts (real module)", () => { + // Vitest can't resolve the `?url` TTF imports to fetchable URLs, so stub fetch and + // test the memo/retry behaviour, which is what can go wrong in a consumer's build. + it("surfaces a failed fetch as FONT_LOAD_FAILED and retries on the next call", async () => { + vi.doUnmock("$lib/client/fonts.js"); + const fetchMock = vi + .fn() + .mockRejectedValueOnce(new Error("404")) + .mockResolvedValue({ ok: true, arrayBuffer: async () => new ArrayBuffer(8) }); + vi.stubGlobal("fetch", fetchMock); + try { + const { defaultClientFonts } = await import("$lib/client/fonts.js"); + await expect(defaultClientFonts()).rejects.toMatchObject({ code: ErrorCodes.FONT_LOAD_FAILED }); + const fonts = await defaultClientFonts(); + expect(fonts.map((f) => [f.name, f.weight])).toEqual([["Noto Sans", 400], ["Noto Sans", 700]]); + // both fonts are fetched concurrently per attempt: 2 (one failed) + 2 on retry + expect(fetchMock).toHaveBeenCalledTimes(4); + } finally { + vi.unstubAllGlobals(); + } + }); +}); +``` + +- [ ] **Step 3: Run the tests to verify they fail** + +Run: `cd packages/sveltekit-og && npx vitest run src/client.test.ts` +Expected: FAIL — `$lib/client/fonts.js` does not exist (mock/import error), and the fallback tests see `fonts` undefined on the engine call. + +- [ ] **Step 4: Create `fonts.ts`** + +Create `packages/sveltekit-og/src/lib/client/fonts.ts`: + +```ts +import type { Font } from "../types.js"; +import { handleAsync, ErrorCodes } from "../helpers/error-handler.js"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore - Vite resolves ?url to the emitted asset path +import regularUrl from "./assets/NotoSans-Regular.ttf?url"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore - Vite resolves ?url to the emitted asset path +import boldUrl from "./assets/NotoSans-Bold.ttf?url"; + +/* + * Bundled fallback fonts for the client satori engine. The server falls back to a + * CDN that doesn't send CORS headers, so browsers can't use it; these ship with the + * package and are served same-origin from the consumer's own build output. + * + * Loaded once and memoized; a rejected load clears the memo so the next render retries. + * Takumi doesn't need this — its wasm embeds a sans-serif. + */ + +let fontsPromise: Promise | undefined; + +export function defaultClientFonts(): Promise { + fontsPromise ??= load().catch((error) => { + fontsPromise = undefined; + throw error; + }); + return fontsPromise; +} + +async function fetchFont(url: string): Promise { + const res = await fetch(new URL(url, import.meta.url)); + if (!res.ok) throw new Error(`${res.status} fetching ${url}`); + return res.arrayBuffer(); +} + +async function load(): Promise { + const [regular, bold] = await handleAsync( + () => Promise.all([fetchFont(regularUrl), fetchFont(boldUrl)]), + ErrorCodes.FONT_LOAD_FAILED, + "Failed to load the bundled default fonts" + ); + return [ + { name: "Noto Sans", data: regular, weight: 400, style: "normal" }, + { name: "Noto Sans", data: bold, weight: 700, style: "normal" }, + ]; +} +``` + +- [ ] **Step 5: Add the fallback to `render.ts`** + +In `packages/sveltekit-og/src/lib/client/render.ts`, replace the satori branch with: + +```ts + if (engine === "satori") { + const satoriOptions = imageOptions as ImageOptions; + // satori has no built-in font; use the bundled ones unless the caller passed some. + // Lives here (not in the engine) so it's unit-testable in node, where the engine can't run. + if (!satoriOptions.fonts?.length) { + const { defaultClientFonts } = await import("./fonts.js"); + satoriOptions.fonts = await defaultClientFonts(); + } + const { render } = await import("./engines/satori.js"); + return render(html, satoriOptions); + } +``` + +- [ ] **Step 6: Run the tests to verify they pass** + +Run: `cd packages/sveltekit-og && npx vitest run` +Expected: PASS — every test file (`index`, `takumi`, `client`), one skipped satori render case. + +If the real-module test fails on the `?url` import under vitest (error mentions `NotoSans-Regular.ttf?url`), add `assetsInclude: ["**/*.ttf"]` at the top level of `defineConfig` in `vite.config.ts` and rerun. Vite then treats the TTF as an asset and `?url` resolves to a path string in node. + +- [ ] **Step 7: Verify the assets will ship, then commit** + +```bash +cd packages/sveltekit-og && npx svelte-package -o /tmp/og-dist-check >/dev/null 2>&1; ls /tmp/og-dist-check/client /tmp/og-dist-check/client/assets /tmp/og-dist-check/client/engines; rm -rf /tmp/og-dist-check +cd /Users/shivammeena/Projects/ethercorps/sveltekit-og +git add packages/sveltekit-og/src/lib/client/assets packages/sveltekit-og/src/lib/client/fonts.ts packages/sveltekit-og/src/lib/client/render.ts packages/sveltekit-og/src/client.test.ts packages/sveltekit-og/vite.config.ts +git commit -m "feat(client): bundle Noto Sans as satori's default fonts (same-origin, no CORS)" +``` + +Expected: `dist/client/assets/` lists both `.ttf` files; `dist/client/engines/` lists `satori.js` and `takumi.js`. + +--- + +### Task 5: Dev-only worker demo route + +**Files:** +- Create: `packages/sveltekit-og/src/routes/client/worker/+page.ts` +- Create: `packages/sveltekit-og/src/routes/client/worker/worker.ts` +- Create: `packages/sveltekit-og/src/routes/client/worker/+page.svelte` + +**Interfaces:** +- Consumes: `createImage` from `$lib/client/index.js`; `Card.svelte` from `../Card.svelte`. +- Produces: a page at `/client/worker` used by the manual checklist (Task 6). Lives in `src/routes`, so `svelte-package` never ships it. + +- [ ] **Step 1: Create the route files** + +`packages/sveltekit-og/src/routes/client/worker/+page.ts`: + +```ts +// Worker demo: module workers + wasm are browser-only, keep this off the SSR path. +export const ssr = false; +``` + +`packages/sveltekit-og/src/routes/client/worker/worker.ts`: + +```ts +import { createImage } from "$lib/client/index.js"; +import Card from "../Card.svelte"; + +// Dev-only worker for the manual checklist. Components can't cross postMessage, so +// the worker imports Card itself and passes it when asked — that path must fail with +// COMPONENT_IN_WORKER. +type Req = { id: number; engine: "takumi" | "satori"; kind: "html" | "component" }; +type Res = { id: number; ok: true; bytes: ArrayBuffer } | { id: number; ok: false; code: string; message: string }; + +const html = `
Rendered in a worker
`; + +// the project's TS lib is DOM, where `self.postMessage` has the window signature; +// narrow to the worker shape instead of pulling in the conflicting `webworker` lib. +const ctx = self as unknown as { + onmessage: ((e: MessageEvent) => void) | null; + postMessage(message: Res, transfer?: Transferable[]): void; +}; + +ctx.onmessage = async (e: MessageEvent) => { + const { id, engine, kind } = e.data; + try { + const res = + kind === "html" + ? createImage(html, { engine, width: 800, height: 400, format: "png" }) + : createImage(Card, { engine, width: 800, height: 400, format: "png" }, { title: "Card", subtitle: "in a worker", num1: 1, num2: 2 }); + const bytes = await res.arrayBuffer(); + const out: Res = { id, ok: true, bytes }; + ctx.postMessage(out, [bytes]); + } catch (err) { + const { code = "UNKNOWN", message = String(err) } = (err ?? {}) as { code?: string; message?: string }; + const out: Res = { id, ok: false, code, message }; + ctx.postMessage(out); + } +}; +``` + +`packages/sveltekit-og/src/routes/client/worker/+page.svelte`: + +```svelte + + +

Worker demo (dev only)

+

Renders happen inside a module worker. Components must fail with COMPONENT_IN_WORKER.

+ +
+ + + + +
+ +{#if error}
{error}
{/if} +{#if url}worker output{/if} +``` + +- [ ] **Step 2: Type-check and commit** + +```bash +cd packages/sveltekit-og && npx svelte-check --tsconfig ./tsconfig.json 2>&1 | tail -3 +cd /Users/shivammeena/Projects/ethercorps/sveltekit-og +git add packages/sveltekit-og/src/routes/client/worker +git commit -m "chore(client): add dev-only /client/worker demo for the manual checklist" +``` + +Expected: svelte-check 0 errors. + +--- + +### Task 6: Manual browser checklist + +**Files:** none changed. Results go into the PR description (Task 7). + +**Interfaces:** +- Consumes: the dev app (`/client`, `/client/worker`). +- Produces: a pass/fail record for each line below. + +- [ ] **Step 1: Start the dev server** + +```bash +cd packages/sveltekit-og && pnpm dev +``` + +Open the printed URL in Chromium with devtools → Network tab open, "Disable cache" ticked. + +- [ ] **Step 2: Playground, main thread (`/client`)** + +For each of: takumi·png, takumi·svg, satori·png, satori·svg — with the HTML editor, then with the component tab: +- an image appears, and for satori the text uses a sans font (not boxes/blank). +- Record: `main-thread: 8/8 pass` or list failures. + +- [ ] **Step 3: Network: no CDN font requests** + +Filter the Network tab by `ethercorps.io`. Expected: zero requests to `cdn-sveltekit-og.ethercorps.io` during all of Step 2. Filter by `NotoSans`: two same-origin requests appear the first time satori renders, none after. + +- [ ] **Step 4: Network: lazy engines** + +Hard-reload with takumi selected and render once. Filter by `.wasm`: `takumi_wasm` appears; `yoga` and `index_bg` (resvg) do **not**. Hard-reload again, switch to satori, render once: `yoga.wasm` and resvg's `index_bg.wasm` appear; `takumi_wasm` does **not**. + +Note the **Size** column for `takumi_wasm_bg.wasm`, `yoga.wasm` and `index_bg.wasm` — Task 7 puts these numbers in the docs. + +- [ ] **Step 5: Worker (`/client/worker`)** + +- `takumi · html` → image appears. +- `satori · html` → image appears with readable text. +- `takumi · component` and `satori · component` → red error starting with `COMPONENT_IN_WORKER:`; filter Network by `.wasm`/`NotoSans` and confirm the component clicks triggered **no** new downloads. + +- [ ] **Step 6: Record** + +Write the results as a short list (one line per step, pass/fail + notes) — it goes verbatim into the PR body in Task 7. Any failure: stop and report it before continuing; do not patch around it inside this task. + +--- + +### Task 7: Docs page, changelog, PR description + +**Files:** +- Create: `apps/docs/src/content/usage/client.md` +- Modify: `packages/sveltekit-og/CHANGELOG.md` (the `## [Unreleased]` section) + +**Interfaces:** +- Consumes: the public API (unchanged) and the behaviour pinned in Tasks 2-4. +- Produces: the docs page, a changelog entry, PR #74 body. + +- [ ] **Step 1: Write the docs page** + +Create `apps/docs/src/content/usage/client.md`: + +````markdown +--- +title: Client-side Rendering +description: Generate OG images in the browser or a web worker, with no server request. +section: Usage +priority: 4 +--- + + + +## Overview + +The `@ethercorps/sveltekit-og/client` entry renders images **in the browser** — on the main thread or inside a web worker — using the same two engines as the server: **Takumi** (default) or **Satori + ReSVG**. Nothing is sent to your server. + +Use it for live previews in an editor or CMS, or for sites with no server (`adapter-static`) that still want images generated at runtime. + + + +Client-side rendering is available from `sveltekit-og@4.4.0`. Try it early from the `next` tag: `npm i @ethercorps/sveltekit-og@next`. + + + +## Requirements + +- **Vite** (every SvelteKit app). The entry loads its WebAssembly and fonts through Vite `?url` asset imports; other bundlers are not supported. +- For Takumi, `takumi-js` must be installed (it is an optional peer dependency). +- Pages that render client-side must run in the browser: set `export const ssr = false;` in the route's `+page.ts`, or only call the API inside `onMount`/event handlers. + +## Usage + +```ts title="src/routes/preview/+page.svelte (script)" showLineNumbers +import { createImage } from "@ethercorps/sveltekit-og/client"; + +const html = `
Hello
`; + +// Takumi is the default engine +const res = createImage(html, { width: 1200, height: 630, format: "png" }); +const url = URL.createObjectURL(await res.blob()); +``` + +`createImage` (and the `ImageResponse` class, which is the same thing as a `Response` subclass) returns a standard `Response`; read it with `.blob()` or `.arrayBuffer()`. + +### Choosing an engine + +```ts +// Satori + ReSVG: png or svg +createImage(html, { engine: "satori", format: "svg", width: 1200, height: 630 }); + +// Takumi: png, jpeg, webp, ico, raw, svg +createImage(html, { engine: "takumi", format: "webp", quality: 80, width: 1200, height: 630 }); +``` + +The options are a discriminated union on `engine`, so TypeScript narrows the remaining fields (formats, fonts, emoji) to the engine you picked. Satori raster formats other than `png` are rendered as `png`. + +**Only the engine you use is downloaded.** Each engine is a separate chunk; Takumi users never fetch Satori's WebAssembly and vice versa. Rough first-render downloads: Takumi ≈ TAKUMI_WASM_SIZE wasm; Satori ≈ SATORI_WASM_SIZE wasm (yoga + resvg) plus ≈ 1.2 MB of default fonts unless you pass your own. + +### Svelte components + +```ts +import Card from "./Card.svelte"; + +createImage(Card, { width: 1200, height: 630 }, { title: "Hello", subtitle: "from the browser" }); +``` + +Components are mounted in a detached shadow root and their HTML is captured, so page CSS can't leak into the image. **Only inline styles are captured** — scoped ` diff --git a/examples/bun-build/src/routes/client/+page.svelte b/examples/bun-build/src/routes/client/+page.svelte new file mode 100644 index 0000000..a463eb8 --- /dev/null +++ b/examples/bun-build/src/routes/client/+page.svelte @@ -0,0 +1,5 @@ + + + diff --git a/examples/bun-build/src/routes/client/+page.ts b/examples/bun-build/src/routes/client/+page.ts new file mode 100644 index 0000000..e4c65d3 --- /dev/null +++ b/examples/bun-build/src/routes/client/+page.ts @@ -0,0 +1,2 @@ +// Rendering happens in the browser (wasm via Vite ?url assets), so keep this page off SSR. +export const ssr = false; diff --git a/examples/bun-build/src/routes/png/cog.png/+server.ts b/examples/bun-build/src/routes/png/cog.png/+server.ts new file mode 100644 index 0000000..0c3e829 --- /dev/null +++ b/examples/bun-build/src/routes/png/cog.png/+server.ts @@ -0,0 +1,9 @@ +import { satoriComponentHandler } from '@examples/shared/satori'; +import { fonts } from '#lib/utils/helper.js'; + +// Component: Svelte component → Satori → resvg PNG (rendered per request). +export const GET = satoriComponentHandler(fonts, 'png', { + provider: 'Satori · resvg', + format: 'PNG', + mode: 'Runtime' +}); diff --git a/examples/bun-build/src/routes/png/default.png/+server.ts b/examples/bun-build/src/routes/png/default.png/+server.ts new file mode 100644 index 0000000..3dca0a8 --- /dev/null +++ b/examples/bun-build/src/routes/png/default.png/+server.ts @@ -0,0 +1,9 @@ +import { satoriTemplateHandler } from '@examples/shared/satori'; +import { fonts } from '#lib/utils/helper.js'; + +// Default: HTML string → Satori → resvg PNG (rendered per request). +export const GET = satoriTemplateHandler(fonts, 'png', { + provider: 'Satori · resvg', + format: 'PNG', + mode: 'Runtime' +}); diff --git a/examples/bun-build/src/routes/png/prerendered.png/+server.ts b/examples/bun-build/src/routes/png/prerendered.png/+server.ts new file mode 100644 index 0000000..1dbc034 --- /dev/null +++ b/examples/bun-build/src/routes/png/prerendered.png/+server.ts @@ -0,0 +1,11 @@ +import { satoriTemplateHandler } from '@examples/shared/satori'; +import { fonts } from '#lib/utils/helper.js'; + +// Pre-rendered: generated once at build time, served as a static PNG. +export const prerender = true; + +export const GET = satoriTemplateHandler(fonts, 'png', { + provider: 'Satori · resvg', + format: 'PNG', + mode: 'Prerendered' +}); diff --git a/examples/bun-build/src/routes/svg/cog.svg/+server.ts b/examples/bun-build/src/routes/svg/cog.svg/+server.ts new file mode 100644 index 0000000..851dfdd --- /dev/null +++ b/examples/bun-build/src/routes/svg/cog.svg/+server.ts @@ -0,0 +1,9 @@ +import { satoriComponentHandler } from '@examples/shared/satori'; +import { fonts } from '#lib/utils/helper.js'; + +// Component: Svelte component → Satori SVG (rendered per request). +export const GET = satoriComponentHandler(fonts, 'svg', { + provider: 'Satori', + format: 'SVG', + mode: 'Runtime' +}); diff --git a/examples/bun-build/src/routes/svg/default.svg/+server.ts b/examples/bun-build/src/routes/svg/default.svg/+server.ts new file mode 100644 index 0000000..15241db --- /dev/null +++ b/examples/bun-build/src/routes/svg/default.svg/+server.ts @@ -0,0 +1,9 @@ +import { satoriTemplateHandler } from '@examples/shared/satori'; +import { fonts } from '#lib/utils/helper.js'; + +// Default: HTML string → Satori SVG (rendered per request). +export const GET = satoriTemplateHandler(fonts, 'svg', { + provider: 'Satori', + format: 'SVG', + mode: 'Runtime' +}); diff --git a/examples/bun-build/src/routes/svg/prerendered.svg/+server.ts b/examples/bun-build/src/routes/svg/prerendered.svg/+server.ts new file mode 100644 index 0000000..b6e9f2a --- /dev/null +++ b/examples/bun-build/src/routes/svg/prerendered.svg/+server.ts @@ -0,0 +1,11 @@ +import { satoriTemplateHandler } from '@examples/shared/satori'; +import { fonts } from '#lib/utils/helper.js'; + +// Pre-rendered: generated once at build time, served as a static SVG. +export const prerender = true; + +export const GET = satoriTemplateHandler(fonts, 'svg', { + provider: 'Satori', + format: 'SVG', + mode: 'Prerendered' +}); diff --git a/examples/bun-build/src/routes/takumi/cog/+server.ts b/examples/bun-build/src/routes/takumi/cog/+server.ts new file mode 100644 index 0000000..d8b5ab3 --- /dev/null +++ b/examples/bun-build/src/routes/takumi/cog/+server.ts @@ -0,0 +1,4 @@ +import { takumiComponentHandler } from '@examples/shared/takumi'; + +// Component: Svelte component → Takumi. `?format=` switches the output format. +export const GET = takumiComponentHandler({ provider: 'Takumi', mode: 'Runtime' }); diff --git a/examples/bun-build/src/routes/takumi/default/+server.ts b/examples/bun-build/src/routes/takumi/default/+server.ts new file mode 100644 index 0000000..fb88063 --- /dev/null +++ b/examples/bun-build/src/routes/takumi/default/+server.ts @@ -0,0 +1,5 @@ +import { takumiTemplateHandler } from '@examples/shared/takumi'; + +// Default: HTML string → Takumi. `?format=` switches the output format +// (png default, jpeg, webp, ico, svg, raw). +export const GET = takumiTemplateHandler({ provider: 'Takumi', mode: 'Runtime' }); diff --git a/examples/bun-build/src/routes/takumi/prerendered/+server.ts b/examples/bun-build/src/routes/takumi/prerendered/+server.ts new file mode 100644 index 0000000..2632443 --- /dev/null +++ b/examples/bun-build/src/routes/takumi/prerendered/+server.ts @@ -0,0 +1,11 @@ +import { takumiTemplatePrerenderedHandler } from '@examples/shared/takumi'; + +// Pre-rendered: generated once at build time. Prerendered output can't vary by +// query, so this one is a fixed PNG. +export const prerender = true; + +export const GET = takumiTemplatePrerenderedHandler({ + provider: 'Takumi', + format: 'PNG', + mode: 'Prerendered' +}); diff --git a/examples/bun-build/static/android-chrome-192x192.png b/examples/bun-build/static/android-chrome-192x192.png new file mode 100644 index 0000000..e9a9aae Binary files /dev/null and b/examples/bun-build/static/android-chrome-192x192.png differ diff --git a/examples/bun-build/static/android-chrome-512x512.png b/examples/bun-build/static/android-chrome-512x512.png new file mode 100644 index 0000000..1a4edd9 Binary files /dev/null and b/examples/bun-build/static/android-chrome-512x512.png differ diff --git a/examples/bun-build/static/apple-touch-icon.png b/examples/bun-build/static/apple-touch-icon.png new file mode 100644 index 0000000..a3127ef Binary files /dev/null and b/examples/bun-build/static/apple-touch-icon.png differ diff --git a/examples/bun-build/static/favicon-16x16.png b/examples/bun-build/static/favicon-16x16.png new file mode 100644 index 0000000..a9467ed Binary files /dev/null and b/examples/bun-build/static/favicon-16x16.png differ diff --git a/examples/bun-build/static/favicon-32x32.png b/examples/bun-build/static/favicon-32x32.png new file mode 100644 index 0000000..fb75399 Binary files /dev/null and b/examples/bun-build/static/favicon-32x32.png differ diff --git a/examples/bun-build/static/favicon.ico b/examples/bun-build/static/favicon.ico new file mode 100644 index 0000000..cb81b27 Binary files /dev/null and b/examples/bun-build/static/favicon.ico differ diff --git a/examples/bun-build/static/site.webmanifest b/examples/bun-build/static/site.webmanifest new file mode 100644 index 0000000..52a2fe3 --- /dev/null +++ b/examples/bun-build/static/site.webmanifest @@ -0,0 +1,11 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { "src": "/android-chrome-192x192.png", "sizes": "192x192", "type": "image/png" }, + { "src": "/android-chrome-512x512.png", "sizes": "512x512", "type": "image/png" } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/examples/bun-build/tests/test.js b/examples/bun-build/tests/test.js new file mode 100644 index 0000000..4e57937 --- /dev/null +++ b/examples/bun-build/tests/test.js @@ -0,0 +1,6 @@ +import { expect, test } from '@playwright/test'; + +test('index page has expected h1', async ({ page }) => { + await page.goto('/'); + expect(await page.textContent('h1')).toBe('Welcome to SvelteKit'); +}); diff --git a/examples/bun-build/tsconfig.json b/examples/bun-build/tsconfig.json new file mode 100644 index 0000000..efc0710 --- /dev/null +++ b/examples/bun-build/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "$app/tsconfig", + "compilerOptions": { + "sourceMap": true, + "strict": true, + "moduleResolution": "NodeNext", + "module": "NodeNext" + }, + "include": ["src", "vite.config.js", "playwright.config.js", "tests"] +} diff --git a/examples/bun-build/vite.config.js b/examples/bun-build/vite.config.js new file mode 100644 index 0000000..d5c94d3 --- /dev/null +++ b/examples/bun-build/vite.config.js @@ -0,0 +1,9 @@ +import adapter from '@sveltejs/adapter-bun'; +import { sveltekit } from '@sveltejs/kit/vite'; +import { sveltekitOG } from '@ethercorps/sveltekit-og/plugin'; + +const config = { + plugins: [sveltekit({ adapter: adapter() }), sveltekitOG({ esmImport: false })] +}; + +export default config; diff --git a/examples/cf-pages-build/src/routes/+page.svelte b/examples/cf-pages-build/src/routes/+page.svelte index 2ede761..4c21e6a 100644 --- a/examples/cf-pages-build/src/routes/+page.svelte +++ b/examples/cf-pages-build/src/routes/+page.svelte @@ -1,11 +1,12 @@ @@ -78,7 +88,11 @@ {#each section.routes as route (route.href)}
- {`${section.title} + {#if route.client} + + {:else} + {`${section.title} + {/if}
{route.kind} @@ -212,6 +226,9 @@ [data-accent='emerald'] { --accent: #10b981; } + [data-accent='amber'] { + --accent: #f59e0b; + } [data-accent='violet'] { --accent: #a855f7; } diff --git a/examples/cf-pages-build/src/routes/client/+page.svelte b/examples/cf-pages-build/src/routes/client/+page.svelte new file mode 100644 index 0000000..a463eb8 --- /dev/null +++ b/examples/cf-pages-build/src/routes/client/+page.svelte @@ -0,0 +1,5 @@ + + + diff --git a/examples/cf-pages-build/src/routes/client/+page.ts b/examples/cf-pages-build/src/routes/client/+page.ts new file mode 100644 index 0000000..e4c65d3 --- /dev/null +++ b/examples/cf-pages-build/src/routes/client/+page.ts @@ -0,0 +1,2 @@ +// Rendering happens in the browser (wasm via Vite ?url assets), so keep this page off SSR. +export const ssr = false; diff --git a/examples/cf-pages-build/vite.config.js b/examples/cf-pages-build/vite.config.js index 41cdc90..c3d89f4 100644 --- a/examples/cf-pages-build/vite.config.js +++ b/examples/cf-pages-build/vite.config.js @@ -1,12 +1,8 @@ import { sveltekit } from '@sveltejs/kit/vite'; -import { rollupWasm } from '@ethercorps/sveltekit-og/plugin'; +import { sveltekitOG } from '@ethercorps/sveltekit-og/plugin'; + const config = { - plugins: [sveltekit()], - build: { - rollupOptions: { - plugins: [rollupWasm()] - } - } + plugins: [sveltekit(), sveltekitOG()] }; export default config; diff --git a/examples/cf-workers-build/src/routes/+page.svelte b/examples/cf-workers-build/src/routes/+page.svelte index 9960840..bd6d73c 100644 --- a/examples/cf-workers-build/src/routes/+page.svelte +++ b/examples/cf-workers-build/src/routes/+page.svelte @@ -1,8 +1,9 @@ @@ -66,7 +76,11 @@ {#each section.routes as route (route.href)}
- {`${section.title} + {#if route.client} + + {:else} + {`${section.title} + {/if}
{route.kind} @@ -197,6 +211,9 @@ [data-accent='emerald'] { --accent: #10b981; } + [data-accent='amber'] { + --accent: #f59e0b; + } [data-accent='violet'] { --accent: #a855f7; } diff --git a/examples/cf-workers-build/src/routes/client/+page.svelte b/examples/cf-workers-build/src/routes/client/+page.svelte new file mode 100644 index 0000000..a463eb8 --- /dev/null +++ b/examples/cf-workers-build/src/routes/client/+page.svelte @@ -0,0 +1,5 @@ + + + diff --git a/examples/cf-workers-build/src/routes/client/+page.ts b/examples/cf-workers-build/src/routes/client/+page.ts new file mode 100644 index 0000000..e4c65d3 --- /dev/null +++ b/examples/cf-workers-build/src/routes/client/+page.ts @@ -0,0 +1,2 @@ +// Rendering happens in the browser (wasm via Vite ?url assets), so keep this page off SSR. +export const ssr = false; diff --git a/examples/deno-build/src/routes/+page.svelte b/examples/deno-build/src/routes/+page.svelte index 5eb89cd..b88ae0b 100644 --- a/examples/deno-build/src/routes/+page.svelte +++ b/examples/deno-build/src/routes/+page.svelte @@ -2,12 +2,13 @@ @@ -80,7 +90,11 @@ {#each section.routes as route (route.href)}
- {`${section.title} + {#if route.client} + + {:else} + {`${section.title} + {/if}
{route.kind} @@ -214,6 +228,9 @@ [data-accent='emerald'] { --accent: #10b981; } + [data-accent='amber'] { + --accent: #f59e0b; + } [data-accent='violet'] { --accent: #a855f7; } diff --git a/examples/deno-build/src/routes/client/+page.svelte b/examples/deno-build/src/routes/client/+page.svelte new file mode 100644 index 0000000..a463eb8 --- /dev/null +++ b/examples/deno-build/src/routes/client/+page.svelte @@ -0,0 +1,5 @@ + + + diff --git a/examples/deno-build/src/routes/client/+page.ts b/examples/deno-build/src/routes/client/+page.ts new file mode 100644 index 0000000..e4c65d3 --- /dev/null +++ b/examples/deno-build/src/routes/client/+page.ts @@ -0,0 +1,2 @@ +// Rendering happens in the browser (wasm via Vite ?url assets), so keep this page off SSR. +export const ssr = false; diff --git a/examples/deno-build/vite.config.js b/examples/deno-build/vite.config.js index 41cdc90..c3d89f4 100644 --- a/examples/deno-build/vite.config.js +++ b/examples/deno-build/vite.config.js @@ -1,12 +1,8 @@ import { sveltekit } from '@sveltejs/kit/vite'; -import { rollupWasm } from '@ethercorps/sveltekit-og/plugin'; +import { sveltekitOG } from '@ethercorps/sveltekit-og/plugin'; + const config = { - plugins: [sveltekit()], - build: { - rollupOptions: { - plugins: [rollupWasm()] - } - } + plugins: [sveltekit(), sveltekitOG()] }; export default config; diff --git a/examples/netlify-build/src/routes/+page.svelte b/examples/netlify-build/src/routes/+page.svelte index 763d0ee..e53b36e 100644 --- a/examples/netlify-build/src/routes/+page.svelte +++ b/examples/netlify-build/src/routes/+page.svelte @@ -1,8 +1,9 @@ @@ -66,7 +76,11 @@ {#each section.routes as route (route.href)}
- {`${section.title} + {#if route.client} + + {:else} + {`${section.title} + {/if}
{route.kind} @@ -197,6 +211,9 @@ [data-accent='emerald'] { --accent: #10b981; } + [data-accent='amber'] { + --accent: #f59e0b; + } [data-accent='violet'] { --accent: #a855f7; } diff --git a/examples/netlify-build/src/routes/client/+page.svelte b/examples/netlify-build/src/routes/client/+page.svelte new file mode 100644 index 0000000..a463eb8 --- /dev/null +++ b/examples/netlify-build/src/routes/client/+page.svelte @@ -0,0 +1,5 @@ + + + diff --git a/examples/netlify-build/src/routes/client/+page.ts b/examples/netlify-build/src/routes/client/+page.ts new file mode 100644 index 0000000..e4c65d3 --- /dev/null +++ b/examples/netlify-build/src/routes/client/+page.ts @@ -0,0 +1,2 @@ +// Rendering happens in the browser (wasm via Vite ?url assets), so keep this page off SSR. +export const ssr = false; diff --git a/examples/netlify-build/vite.config.js b/examples/netlify-build/vite.config.js index 9cf76d9..e1ecb50 100644 --- a/examples/netlify-build/vite.config.js +++ b/examples/netlify-build/vite.config.js @@ -1,14 +1,10 @@ import { sveltekit } from '@sveltejs/kit/vite'; -import { rollupWasm } from '@ethercorps/sveltekit-og/plugin'; +import { sveltekitOG } from '@ethercorps/sveltekit-og/plugin'; + const config = { - plugins: [sveltekit()], - build: { - rollupOptions: { - // esmImport: false inlines the wasm as base64 instead of emitting a - // `.wasm` chunk, so netlify's esbuild bundler never needs a wasm loader. - plugins: [rollupWasm({ esmImport: false })] - } - } + // esmImport: false inlines the wasm as base64 instead of emitting a + // `.wasm` chunk, so netlify's esbuild bundler never needs a wasm loader. + plugins: [sveltekit(), sveltekitOG({ esmImport: false })] }; export default config; diff --git a/examples/node-build/src/routes/+page.svelte b/examples/node-build/src/routes/+page.svelte index e46b652..d439afd 100644 --- a/examples/node-build/src/routes/+page.svelte +++ b/examples/node-build/src/routes/+page.svelte @@ -1,8 +1,9 @@ @@ -66,7 +76,11 @@ {#each section.routes as route (route.href)}
- {`${section.title} + {#if route.client} + + {:else} + {`${section.title} + {/if}
{route.kind} @@ -197,6 +211,9 @@ [data-accent='emerald'] { --accent: #10b981; } + [data-accent='amber'] { + --accent: #f59e0b; + } [data-accent='violet'] { --accent: #a855f7; } diff --git a/examples/node-build/src/routes/client/+page.svelte b/examples/node-build/src/routes/client/+page.svelte new file mode 100644 index 0000000..a463eb8 --- /dev/null +++ b/examples/node-build/src/routes/client/+page.svelte @@ -0,0 +1,5 @@ + + + diff --git a/examples/node-build/src/routes/client/+page.ts b/examples/node-build/src/routes/client/+page.ts new file mode 100644 index 0000000..e4c65d3 --- /dev/null +++ b/examples/node-build/src/routes/client/+page.ts @@ -0,0 +1,2 @@ +// Rendering happens in the browser (wasm via Vite ?url assets), so keep this page off SSR. +export const ssr = false; diff --git a/examples/node-build/vite.config.js b/examples/node-build/vite.config.js index fa9abcd..98c0bf2 100644 --- a/examples/node-build/vite.config.js +++ b/examples/node-build/vite.config.js @@ -1,17 +1,8 @@ import { sveltekit } from '@sveltejs/kit/vite'; -import { rollupWasm } from '@ethercorps/sveltekit-og/plugin'; +import { sveltekitOG } from '@ethercorps/sveltekit-og/plugin'; const config = { - plugins: [sveltekit()], - build: { - rollupOptions: { - plugins: [ - rollupWasm({ - esmImport: false - }) - ] - } - } + plugins: [sveltekit(), sveltekitOG({ esmImport: false })] }; export default config; diff --git a/examples/satori-only-build/package.json b/examples/satori-only-build/package.json index 1794912..4506a20 100644 --- a/examples/satori-only-build/package.json +++ b/examples/satori-only-build/package.json @@ -12,19 +12,24 @@ }, "devDependencies": { "@playwright/test": "^1.55.0", - "@sveltejs/adapter-cloudflare": "^7.2.4", - "@sveltejs/kit": "^2.48.5", - "@sveltejs/vite-plugin-svelte": "^5.1.1", + "@sveltejs/adapter-cloudflare": "^8.0.0", + "@sveltejs/kit": "^3.0.0", + "@sveltejs/vite-plugin-svelte": "^7.0.0", "eslint": "^8.57.1", "eslint-config-prettier": "^8.10.2", "prettier": "^3.6.2", "prettier-plugin-svelte": "^3.4.0", - "svelte": "^5.43.12", - "vite": "^6.4.1" + "svelte": "^5.57.1", + "vite": "^8.0.12" }, "type": "module", "dependencies": { "@ethercorps/sveltekit-og": "workspace:*", - "@examples/shared": "workspace:*" + "@examples/shared": "workspace:*", + "takumi-js": "2.0.1" + }, + "imports": { + "#lib": "./src/lib/index.js", + "#lib/*": "./src/lib/*" } } diff --git a/examples/satori-only-build/src/routes/+page.svelte b/examples/satori-only-build/src/routes/+page.svelte index 3a9831c..e3a7d7d 100644 --- a/examples/satori-only-build/src/routes/+page.svelte +++ b/examples/satori-only-build/src/routes/+page.svelte @@ -1,8 +1,14 @@ @@ -33,13 +45,20 @@
SvelteKit OG · examples · adapter-cloudflare · Satori only

@ethercorps/sveltekit-og

- The Satori engine (no Takumi) — PNG via resvg and vector SVG, each as an HTML string, a - Svelte component, and a pre-rendered build-time image. + The Satori engine (no Takumi) — PNG via resvg and vector SVG, each as an HTML string, a Svelte + component, and a pre-rendered build-time image.

@@ -56,7 +75,11 @@ {#each section.routes as route (route.href)}
- {`${section.title} + {#if route.client} + + {:else} + {`${section.title} + {/if}
{route.kind} @@ -88,12 +111,15 @@ --text: #ececf1; --muted: #8b8b9a; min-height: 100vh; - background: - radial-gradient(1200px 600px at 50% -10%, #1a1a2e 0%, transparent 60%), - var(--bg); + background: radial-gradient(1200px 600px at 50% -10%, #1a1a2e 0%, transparent 60%), var(--bg); color: var(--text); font-family: - ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; + ui-sans-serif, + system-ui, + -apple-system, + 'Segoe UI', + Roboto, + sans-serif; padding: 0 1.5rem 5rem; } @@ -187,6 +213,9 @@ [data-accent='emerald'] { --accent: #10b981; } + [data-accent='amber'] { + --accent: #f59e0b; + } [data-accent='violet'] { --accent: #a855f7; } diff --git a/examples/satori-only-build/src/routes/client/+page.svelte b/examples/satori-only-build/src/routes/client/+page.svelte new file mode 100644 index 0000000..98bd136 --- /dev/null +++ b/examples/satori-only-build/src/routes/client/+page.svelte @@ -0,0 +1,5 @@ + + + diff --git a/examples/satori-only-build/src/routes/client/+page.ts b/examples/satori-only-build/src/routes/client/+page.ts new file mode 100644 index 0000000..e4c65d3 --- /dev/null +++ b/examples/satori-only-build/src/routes/client/+page.ts @@ -0,0 +1,2 @@ +// Rendering happens in the browser (wasm via Vite ?url assets), so keep this page off SSR. +export const ssr = false; diff --git a/examples/satori-only-build/src/routes/png/cog.png/+server.ts b/examples/satori-only-build/src/routes/png/cog.png/+server.ts index ecaab61..0c3e829 100644 --- a/examples/satori-only-build/src/routes/png/cog.png/+server.ts +++ b/examples/satori-only-build/src/routes/png/cog.png/+server.ts @@ -1,5 +1,5 @@ import { satoriComponentHandler } from '@examples/shared/satori'; -import { fonts } from '$lib/utils/helper.js'; +import { fonts } from '#lib/utils/helper.js'; // Component: Svelte component → Satori → resvg PNG (rendered per request). export const GET = satoriComponentHandler(fonts, 'png', { diff --git a/examples/satori-only-build/src/routes/png/default.png/+server.ts b/examples/satori-only-build/src/routes/png/default.png/+server.ts index 8a03921..3dca0a8 100644 --- a/examples/satori-only-build/src/routes/png/default.png/+server.ts +++ b/examples/satori-only-build/src/routes/png/default.png/+server.ts @@ -1,5 +1,5 @@ import { satoriTemplateHandler } from '@examples/shared/satori'; -import { fonts } from '$lib/utils/helper.js'; +import { fonts } from '#lib/utils/helper.js'; // Default: HTML string → Satori → resvg PNG (rendered per request). export const GET = satoriTemplateHandler(fonts, 'png', { diff --git a/examples/satori-only-build/src/routes/png/prerendered.png/+server.ts b/examples/satori-only-build/src/routes/png/prerendered.png/+server.ts index ef56dc2..1dbc034 100644 --- a/examples/satori-only-build/src/routes/png/prerendered.png/+server.ts +++ b/examples/satori-only-build/src/routes/png/prerendered.png/+server.ts @@ -1,5 +1,5 @@ import { satoriTemplateHandler } from '@examples/shared/satori'; -import { fonts } from '$lib/utils/helper.js'; +import { fonts } from '#lib/utils/helper.js'; // Pre-rendered: generated once at build time, served as a static PNG. export const prerender = true; diff --git a/examples/satori-only-build/src/routes/svg/cog.svg/+server.ts b/examples/satori-only-build/src/routes/svg/cog.svg/+server.ts index 5a078f0..851dfdd 100644 --- a/examples/satori-only-build/src/routes/svg/cog.svg/+server.ts +++ b/examples/satori-only-build/src/routes/svg/cog.svg/+server.ts @@ -1,5 +1,5 @@ import { satoriComponentHandler } from '@examples/shared/satori'; -import { fonts } from '$lib/utils/helper.js'; +import { fonts } from '#lib/utils/helper.js'; // Component: Svelte component → Satori SVG (rendered per request). export const GET = satoriComponentHandler(fonts, 'svg', { diff --git a/examples/satori-only-build/src/routes/svg/default.svg/+server.ts b/examples/satori-only-build/src/routes/svg/default.svg/+server.ts index 938966f..15241db 100644 --- a/examples/satori-only-build/src/routes/svg/default.svg/+server.ts +++ b/examples/satori-only-build/src/routes/svg/default.svg/+server.ts @@ -1,5 +1,5 @@ import { satoriTemplateHandler } from '@examples/shared/satori'; -import { fonts } from '$lib/utils/helper.js'; +import { fonts } from '#lib/utils/helper.js'; // Default: HTML string → Satori SVG (rendered per request). export const GET = satoriTemplateHandler(fonts, 'svg', { diff --git a/examples/satori-only-build/src/routes/svg/prerendered.svg/+server.ts b/examples/satori-only-build/src/routes/svg/prerendered.svg/+server.ts index ec40468..b6e9f2a 100644 --- a/examples/satori-only-build/src/routes/svg/prerendered.svg/+server.ts +++ b/examples/satori-only-build/src/routes/svg/prerendered.svg/+server.ts @@ -1,5 +1,5 @@ import { satoriTemplateHandler } from '@examples/shared/satori'; -import { fonts } from '$lib/utils/helper.js'; +import { fonts } from '#lib/utils/helper.js'; // Pre-rendered: generated once at build time, served as a static SVG. export const prerender = true; diff --git a/examples/satori-only-build/svelte.config.js b/examples/satori-only-build/svelte.config.js deleted file mode 100644 index cef7e5d..0000000 --- a/examples/satori-only-build/svelte.config.js +++ /dev/null @@ -1,10 +0,0 @@ -import adapter from '@sveltejs/adapter-cloudflare'; - -/** @type {import('@sveltejs/kit').Config} */ -const config = { - kit: { - adapter: adapter() - } -}; - -export default config; diff --git a/examples/satori-only-build/tsconfig.json b/examples/satori-only-build/tsconfig.json index 939b931..efc0710 100644 --- a/examples/satori-only-build/tsconfig.json +++ b/examples/satori-only-build/tsconfig.json @@ -1,15 +1,10 @@ { - "extends": "./.svelte-kit/tsconfig.json", + "extends": "$app/tsconfig", "compilerOptions": { - "allowJs": true, - "checkJs": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "resolveJsonModule": true, - "skipLibCheck": true, "sourceMap": true, "strict": true, "moduleResolution": "NodeNext", "module": "NodeNext" - } + }, + "include": ["src", "vite.config.js", "playwright.config.js", "tests"] } diff --git a/examples/satori-only-build/vite.config.js b/examples/satori-only-build/vite.config.js index 41cdc90..6a2c5d5 100644 --- a/examples/satori-only-build/vite.config.js +++ b/examples/satori-only-build/vite.config.js @@ -1,12 +1,7 @@ +import adapter from '@sveltejs/adapter-cloudflare'; import { sveltekit } from '@sveltejs/kit/vite'; -import { rollupWasm } from '@ethercorps/sveltekit-og/plugin'; -const config = { - plugins: [sveltekit()], - build: { - rollupOptions: { - plugins: [rollupWasm()] - } - } -}; +import { sveltekitOG } from '@ethercorps/sveltekit-og/plugin'; + +const config = { plugins: [sveltekit({ adapter: adapter() }), sveltekitOG()] }; export default config; diff --git a/examples/shared/package.json b/examples/shared/package.json index 792328f..b883ace 100644 --- a/examples/shared/package.json +++ b/examples/shared/package.json @@ -17,6 +17,16 @@ "types": "./dist/takumi.d.ts", "svelte": "./dist/takumi.js", "default": "./dist/takumi.js" + }, + "./client": { + "types": "./dist/ClientDemo.svelte.d.ts", + "svelte": "./dist/ClientDemo.svelte", + "default": "./dist/ClientDemo.svelte" + }, + "./client-image": { + "types": "./dist/ClientImage.svelte.d.ts", + "svelte": "./dist/ClientImage.svelte", + "default": "./dist/ClientImage.svelte" } }, "dependencies": { diff --git a/examples/shared/src/lib/ClientDemo.svelte b/examples/shared/src/lib/ClientDemo.svelte new file mode 100644 index 0000000..aac5807 --- /dev/null +++ b/examples/shared/src/lib/ClientDemo.svelte @@ -0,0 +1,141 @@ + + + +
+
+
SvelteKit OG · examples · client-side
+

Client-side rendering

+

+ Rendered in your browser with @ethercorps/sveltekit-og/client — engine + {engine}, no server request. Only this engine's WebAssembly was downloaded. +

+
+ ← All examples + {#if !fixed} + Takumi + Satori + {/if} + {#if url} + {(bytes / 1024).toFixed(1)} KB · {ms} ms + + Download + {/if} +
+
+ +
+ {#key engine} + { + url = info.url; + bytes = info.bytes; + ms = info.ms; + }} + /> + {/key} +
+
+ + diff --git a/examples/shared/src/lib/ClientImage.svelte b/examples/shared/src/lib/ClientImage.svelte new file mode 100644 index 0000000..d71824a --- /dev/null +++ b/examples/shared/src/lib/ClientImage.svelte @@ -0,0 +1,72 @@ + + + +{#if error} +
{error}
+{:else if url} + +{:else} + Rendering in browser… +{/if} + + diff --git a/examples/takumi-only-build/package.json b/examples/takumi-only-build/package.json index c7ea154..45f973b 100644 --- a/examples/takumi-only-build/package.json +++ b/examples/takumi-only-build/package.json @@ -12,20 +12,24 @@ }, "devDependencies": { "@playwright/test": "^1.55.0", - "@sveltejs/adapter-cloudflare": "^7.2.4", - "@sveltejs/kit": "^2.48.5", - "@sveltejs/vite-plugin-svelte": "^5.1.1", + "@sveltejs/adapter-cloudflare": "^8.0.0", + "@sveltejs/kit": "^3.0.0", + "@sveltejs/vite-plugin-svelte": "^7.0.0", "eslint": "^8.57.1", "eslint-config-prettier": "^8.10.2", "prettier": "^3.6.2", "prettier-plugin-svelte": "^3.4.0", - "svelte": "^5.43.12", - "vite": "^6.4.1" + "svelte": "^5.57.1", + "vite": "^8.0.12" }, "type": "module", "dependencies": { "@ethercorps/sveltekit-og": "workspace:*", "@examples/shared": "workspace:*", "takumi-js": "2.0.1" + }, + "imports": { + "#lib": "./src/lib/index.js", + "#lib/*": "./src/lib/*" } } diff --git a/examples/takumi-only-build/src/routes/+page.svelte b/examples/takumi-only-build/src/routes/+page.svelte index 6d0a274..afee786 100644 --- a/examples/takumi-only-build/src/routes/+page.svelte +++ b/examples/takumi-only-build/src/routes/+page.svelte @@ -1,8 +1,14 @@ @@ -23,13 +37,20 @@
SvelteKit OG · examples · adapter-cloudflare · Takumi only

@ethercorps/sveltekit-og

- The Takumi engine on its own — a built-in font and multiple output formats, as an HTML - string, a Svelte component, and a pre-rendered build-time image. + The Takumi engine on its own — a built-in font and multiple output formats, as an HTML string, + a Svelte component, and a pre-rendered build-time image.

@@ -46,7 +67,11 @@ {#each section.routes as route (route.href)}
- {`${section.title} + {#if route.client} + + {:else} + {`${section.title} + {/if}
{route.kind} @@ -78,12 +103,15 @@ --text: #ececf1; --muted: #8b8b9a; min-height: 100vh; - background: - radial-gradient(1200px 600px at 50% -10%, #1a1a2e 0%, transparent 60%), - var(--bg); + background: radial-gradient(1200px 600px at 50% -10%, #1a1a2e 0%, transparent 60%), var(--bg); color: var(--text); font-family: - ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; + ui-sans-serif, + system-ui, + -apple-system, + 'Segoe UI', + Roboto, + sans-serif; padding: 0 1.5rem 5rem; } @@ -177,6 +205,9 @@ [data-accent='emerald'] { --accent: #10b981; } + [data-accent='amber'] { + --accent: #f59e0b; + } [data-accent='violet'] { --accent: #a855f7; } diff --git a/examples/takumi-only-build/src/routes/client/+page.svelte b/examples/takumi-only-build/src/routes/client/+page.svelte new file mode 100644 index 0000000..a463eb8 --- /dev/null +++ b/examples/takumi-only-build/src/routes/client/+page.svelte @@ -0,0 +1,5 @@ + + + diff --git a/examples/takumi-only-build/src/routes/client/+page.ts b/examples/takumi-only-build/src/routes/client/+page.ts new file mode 100644 index 0000000..e4c65d3 --- /dev/null +++ b/examples/takumi-only-build/src/routes/client/+page.ts @@ -0,0 +1,2 @@ +// Rendering happens in the browser (wasm via Vite ?url assets), so keep this page off SSR. +export const ssr = false; diff --git a/examples/takumi-only-build/svelte.config.js b/examples/takumi-only-build/svelte.config.js deleted file mode 100644 index cef7e5d..0000000 --- a/examples/takumi-only-build/svelte.config.js +++ /dev/null @@ -1,10 +0,0 @@ -import adapter from '@sveltejs/adapter-cloudflare'; - -/** @type {import('@sveltejs/kit').Config} */ -const config = { - kit: { - adapter: adapter() - } -}; - -export default config; diff --git a/examples/takumi-only-build/tsconfig.json b/examples/takumi-only-build/tsconfig.json index 939b931..efc0710 100644 --- a/examples/takumi-only-build/tsconfig.json +++ b/examples/takumi-only-build/tsconfig.json @@ -1,15 +1,10 @@ { - "extends": "./.svelte-kit/tsconfig.json", + "extends": "$app/tsconfig", "compilerOptions": { - "allowJs": true, - "checkJs": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "resolveJsonModule": true, - "skipLibCheck": true, "sourceMap": true, "strict": true, "moduleResolution": "NodeNext", "module": "NodeNext" - } + }, + "include": ["src", "vite.config.js", "playwright.config.js", "tests"] } diff --git a/examples/takumi-only-build/vite.config.js b/examples/takumi-only-build/vite.config.js index 41cdc90..6a2c5d5 100644 --- a/examples/takumi-only-build/vite.config.js +++ b/examples/takumi-only-build/vite.config.js @@ -1,12 +1,7 @@ +import adapter from '@sveltejs/adapter-cloudflare'; import { sveltekit } from '@sveltejs/kit/vite'; -import { rollupWasm } from '@ethercorps/sveltekit-og/plugin'; -const config = { - plugins: [sveltekit()], - build: { - rollupOptions: { - plugins: [rollupWasm()] - } - } -}; +import { sveltekitOG } from '@ethercorps/sveltekit-og/plugin'; + +const config = { plugins: [sveltekit({ adapter: adapter() }), sveltekitOG()] }; export default config; diff --git a/examples/vercel-build/src/routes/+page.svelte b/examples/vercel-build/src/routes/+page.svelte index ad5ea99..ac2e935 100644 --- a/examples/vercel-build/src/routes/+page.svelte +++ b/examples/vercel-build/src/routes/+page.svelte @@ -1,8 +1,9 @@ @@ -66,7 +76,11 @@ {#each section.routes as route (route.href)}
- {`${section.title} + {#if route.client} + + {:else} + {`${section.title} + {/if}
{route.kind} @@ -197,6 +211,9 @@ [data-accent='emerald'] { --accent: #10b981; } + [data-accent='amber'] { + --accent: #f59e0b; + } [data-accent='violet'] { --accent: #a855f7; } diff --git a/examples/vercel-build/src/routes/client/+page.svelte b/examples/vercel-build/src/routes/client/+page.svelte new file mode 100644 index 0000000..a463eb8 --- /dev/null +++ b/examples/vercel-build/src/routes/client/+page.svelte @@ -0,0 +1,5 @@ + + + diff --git a/examples/vercel-build/src/routes/client/+page.ts b/examples/vercel-build/src/routes/client/+page.ts new file mode 100644 index 0000000..e4c65d3 --- /dev/null +++ b/examples/vercel-build/src/routes/client/+page.ts @@ -0,0 +1,2 @@ +// Rendering happens in the browser (wasm via Vite ?url assets), so keep this page off SSR. +export const ssr = false; diff --git a/examples/vercel-build/svelte.config.js b/examples/vercel-build/svelte.config.js index e635ac8..b6572cd 100644 --- a/examples/vercel-build/svelte.config.js +++ b/examples/vercel-build/svelte.config.js @@ -3,7 +3,9 @@ import adapter from '@sveltejs/adapter-vercel'; /** @type {import('@sveltejs/kit').Config} */ const config = { kit: { - adapter: adapter() + // adapter-vercel 5.x infers the runtime from the local Node and rejects anything + // outside 18–22; the repo pins Node 24 (.node-version), so name the runtime explicitly. + adapter: adapter({ runtime: 'nodejs22.x' }) } }; diff --git a/examples/vercel-build/vite.config.js b/examples/vercel-build/vite.config.js index 41cdc90..c3d89f4 100644 --- a/examples/vercel-build/vite.config.js +++ b/examples/vercel-build/vite.config.js @@ -1,12 +1,8 @@ import { sveltekit } from '@sveltejs/kit/vite'; -import { rollupWasm } from '@ethercorps/sveltekit-og/plugin'; +import { sveltekitOG } from '@ethercorps/sveltekit-og/plugin'; + const config = { - plugins: [sveltekit()], - build: { - rollupOptions: { - plugins: [rollupWasm()] - } - } + plugins: [sveltekit(), sveltekitOG()] }; export default config; diff --git a/package.json b/package.json index fa4735c..f1d7f0b 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,8 @@ "workerd" ], "patchedDependencies": { - "@deno/svelte-adapter@0.2.1": "patches/@deno__svelte-adapter@0.2.1.patch" + "@deno/svelte-adapter@0.2.1": "patches/@deno__svelte-adapter@0.2.1.patch", + "ultrahtml@1.7.0": "patches/ultrahtml@1.7.0.patch" } } } diff --git a/packages/sveltekit-og/CHANGELOG.md b/packages/sveltekit-og/CHANGELOG.md index c5a0f1f..b6a34e5 100644 --- a/packages/sveltekit-og/CHANGELOG.md +++ b/packages/sveltekit-og/CHANGELOG.md @@ -7,17 +7,47 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -## [4.3.1-next.3] - 2025-12-05 +### Added + +- `@ethercorps/sveltekit-og/client`: render OG images in the browser or a web worker with Takumi (default) or Satori + ReSVG, no server request. Engines load lazily (only the one you pick is downloaded); Satori falls back to bundled Noto Sans served same-origin; components render on the main thread, HTML strings everywhere; passing a component in a worker rejects with `COMPONENT_IN_WORKER`. Errors reach `.blob()`/`.arrayBuffer()`/`.text()` as `ImageResponseError` with a `code`. Requires `takumi-js` with either engine; workers need `worker: { format: "es" }` in `vite.config`. + +### Fixed + +- Empty elements (`
` as a dot or divider) made Satori throw `Expected
to have explicit "display: flex" … if it has more than one child node`: satori-html emits `children: []` for them and Satori reads any array as "multiple children". Empty children are now dropped before rendering, in both the server and client paths. +- Svelte components with `css="injected"` styles spanning multiple lines (e.g. a multi-line `linear-gradient(...)`) failed with `object null is not iterable` on satori 0.25. The injected ` diff --git a/packages/sveltekit-og/src/routes/client/+page.svelte b/packages/sveltekit-og/src/routes/client/+page.svelte new file mode 100644 index 0000000..3790020 --- /dev/null +++ b/packages/sveltekit-og/src/routes/client/+page.svelte @@ -0,0 +1,355 @@ + + + + + diff --git a/packages/sveltekit-og/src/routes/client/+page.ts b/packages/sveltekit-og/src/routes/client/+page.ts new file mode 100644 index 0000000..a3afc89 --- /dev/null +++ b/packages/sveltekit-og/src/routes/client/+page.ts @@ -0,0 +1,4 @@ +// The client entry renders in the browser (satori loads its wasm from bundler +// `?url` assets), so this page is client-only — keeps the browser wasm providers +// out of the SSR/adapter bundle. +export const ssr = false; diff --git a/packages/sveltekit-og/src/routes/client/Card.svelte b/packages/sveltekit-og/src/routes/client/Card.svelte new file mode 100644 index 0000000..7821bba --- /dev/null +++ b/packages/sveltekit-og/src/routes/client/Card.svelte @@ -0,0 +1,12 @@ + + +
+
{title}
+
{subtitle}
+
{sum ?? "No input"}
+
diff --git a/packages/sveltekit-og/src/routes/client/worker/+page.svelte b/packages/sveltekit-og/src/routes/client/worker/+page.svelte new file mode 100644 index 0000000..fcf9e5f --- /dev/null +++ b/packages/sveltekit-og/src/routes/client/worker/+page.svelte @@ -0,0 +1,44 @@ + + +

Worker demo (dev only)

+

Renders happen inside a module worker. Components must fail with COMPONENT_IN_WORKER.

+ +
+ + + + +
+ +{#if error}
{error}
{/if} +{#if url}worker output{/if} diff --git a/packages/sveltekit-og/src/routes/client/worker/+page.ts b/packages/sveltekit-og/src/routes/client/worker/+page.ts new file mode 100644 index 0000000..6c15ccb --- /dev/null +++ b/packages/sveltekit-og/src/routes/client/worker/+page.ts @@ -0,0 +1,2 @@ +// Worker demo: module workers + wasm are browser-only, keep this off the SSR path. +export const ssr = false; diff --git a/packages/sveltekit-og/src/routes/client/worker/worker.ts b/packages/sveltekit-og/src/routes/client/worker/worker.ts new file mode 100644 index 0000000..50a61db --- /dev/null +++ b/packages/sveltekit-og/src/routes/client/worker/worker.ts @@ -0,0 +1,36 @@ +import type { Component } from "svelte"; +import { createImage } from "$lib/client/index.js"; + +// Dev-only worker for the manual checklist. Components can't cross postMessage and +// Vite's worker sub-build has no Svelte plugin, so stand in with a non-string element: +// the guard only checks `typeof element === "string"` and must reject it with +// COMPONENT_IN_WORKER before anything is mounted or downloaded. +const FakeCard = (() => {}) as unknown as Component<{ title: string }>; +type Req = { id: number; engine: "takumi" | "satori"; kind: "html" | "component" }; +type Res = { id: number; ok: true; bytes: ArrayBuffer } | { id: number; ok: false; code: string; message: string }; + +const html = `
Rendered in a worker
`; + +// the project's TS lib is DOM, where `self.postMessage` has the window signature; +// narrow to the worker shape instead of pulling in the conflicting `webworker` lib. +const ctx = self as unknown as { + onmessage: ((e: MessageEvent) => void) | null; + postMessage(message: Res, transfer?: Transferable[]): void; +}; + +ctx.onmessage = async (e: MessageEvent) => { + const { id, engine, kind } = e.data; + try { + const res = + kind === "html" + ? createImage(html, { engine, width: 800, height: 400, format: "png" }) + : createImage(FakeCard, { engine, width: 800, height: 400, format: "png" }, { title: "Card" }); + const bytes = await res.arrayBuffer(); + const out: Res = { id, ok: true, bytes }; + ctx.postMessage(out, [bytes]); + } catch (err) { + const { code = "UNKNOWN", message = String(err) } = (err ?? {}) as { code?: string; message?: string }; + const out: Res = { id, ok: false, code, message }; + ctx.postMessage(out); + } +}; diff --git a/packages/sveltekit-og/vite.config.ts b/packages/sveltekit-og/vite.config.ts index 7a6e1a9..2c2c655 100644 --- a/packages/sveltekit-og/vite.config.ts +++ b/packages/sveltekit-og/vite.config.ts @@ -18,6 +18,9 @@ export default defineConfig({ external: [/.+\.wasm$/i, /.+\.ttf$/i, /.+\.woff$/i], }, }, + // the client entry code-splits (lazy engines); Vite's default iife workers can't, + // so any worker importing /client needs es format — consumers must set this too + worker: { format: "es" }, test: { include: ["src/**/*.{test,spec}.{js,ts}"], }, diff --git a/patches/ultrahtml@1.7.0.patch b/patches/ultrahtml@1.7.0.patch new file mode 100644 index 0000000..02293e2 --- /dev/null +++ b/patches/ultrahtml@1.7.0.patch @@ -0,0 +1,26 @@ +diff --git a/dist/selector.js b/dist/selector.js +index 969dcd8aec1a7abaa71847013eb69d9e1ec6775c..134e1723a556416d23734fe8f5747b91f3680f60 100644 +--- a/dist/selector.js ++++ b/dist/selector.js +@@ -11,7 +11,7 @@ var r = (t2) => { + switch (t2) { + case "pseudo-element": + case "pseudo-class": +- return new RegExp(e[t2].source.replace("(?\xB6*)", "(?.*)"), "gu"); ++ return new RegExp(e[t2].source.replace(/\(\?[^)]*\)/, "(?.*)"), "gu"); + default: + return e[t2]; + } +diff --git a/dist/transformers/scope.js b/dist/transformers/scope.js +index 0360df295a3dad12849bff07a2ee2a876cbe47d1..beeba5a94c11ac805e899b52d8b6ad4157b69dfb 100644 +--- a/dist/transformers/scope.js ++++ b/dist/transformers/scope.js +@@ -8,7 +8,7 @@ var r = (t2) => { + switch (t2) { + case "pseudo-element": + case "pseudo-class": +- return new RegExp(e[t2].source.replace("(?\xB6*)", "(?.*)"), "gu"); ++ return new RegExp(e[t2].source.replace(/\(\?[^)]*\)/, "(?.*)"), "gu"); + default: + return e[t2]; + } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 95458df..b1ed736 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ patchedDependencies: '@deno/svelte-adapter@0.2.1': hash: a28e8e1c386834ae41f01ff4b054a70df14ed7404bdb0b5d8ca5f3285ae93cb2 path: patches/@deno__svelte-adapter@0.2.1.patch + ultrahtml@1.7.0: + hash: 07138908c903b0b671e3079e043028374ce5e2d5fe24cfdc5c097747382c11bf + path: patches/ultrahtml@1.7.0.patch importers: @@ -23,27 +26,39 @@ importers: apps/docs: dependencies: '@ethercorps/sveltekit-og': - specifier: ^4.3.1-next.3 - version: 4.3.1-next.3(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))) + specifier: ^4.4.0-next.2 + version: 4.4.0-next.2(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(takumi-js@2.0.1(csstype@3.2.3)) + '@twinkleplop/html': + specifier: ^0.1.7 + version: 0.1.7 + '@twinkleplop/theme-github': + specifier: ^0.2.4 + version: 0.2.4 + '@twinkleplop/typescript': + specifier: ^0.1.7 + version: 0.1.7 octokit: specifier: ^5.0.5 version: 5.0.5 + paneforge: + specifier: 1.0.2 + version: 1.0.2(svelte@5.53.10) devDependencies: '@svecodocs/kit': specifier: npm:@ethercorps/svecodocs@0.5.4 - version: '@ethercorps/svecodocs@0.5.4(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(bits-ui@2.16.3(@internationalized/date@3.12.0)(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10))(svelte@5.53.10)(tailwindcss@4.2.4)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))' + version: '@ethercorps/svecodocs@0.5.4(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(bits-ui@2.16.3(@internationalized/date@3.12.0)(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10))(svelte@5.53.10)(tailwindcss@4.2.4)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2))' '@sveltejs/adapter-cloudflare': specifier: ^7.2.4 - version: 7.2.8(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(wrangler@4.84.1(@cloudflare/workers-types@4.20260615.1)) + version: 7.2.8(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(wrangler@4.84.1(@cloudflare/workers-types@4.20260615.1)) '@sveltejs/kit': specifier: ^2.48.5 - version: 2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + version: 2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) '@sveltejs/vite-plugin-svelte': specifier: ^6.2.1 - version: 6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + version: 6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) '@tailwindcss/vite': specifier: ^4.1.17 - version: 4.2.2(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + version: 4.2.2(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) '@types/jsdom': specifier: ^27.0.0 version: 27.0.0 @@ -64,7 +79,7 @@ importers: version: 0.0.6(svelte@5.53.10) phosphor-svelte: specifier: ^3.0.1 - version: 3.1.0(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + version: 3.1.0(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) prettier: specifier: ^3.4.2 version: 3.8.1 @@ -112,7 +127,50 @@ importers: version: 0.2.4 vite: specifier: ^7.2.4 - version: 7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) + version: 7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2) + + examples/bun-build: + dependencies: + '@ethercorps/sveltekit-og': + specifier: workspace:* + version: link:../../packages/sveltekit-og + '@examples/shared': + specifier: workspace:* + version: link:../shared + takumi-js: + specifier: 2.0.1 + version: 2.0.1(csstype@3.2.3) + devDependencies: + '@playwright/test': + specifier: ^1.55.0 + version: 1.58.2 + '@sveltejs/adapter-bun': + specifier: ^1.0.0 + version: 1.0.0(@sveltejs/kit@3.0.1(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.1(@typescript-eslint/types@8.57.0))(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.57.1(@typescript-eslint/types@8.57.0))(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2))) + '@sveltejs/kit': + specifier: ^3.0.0 + version: 3.0.1(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.1(@typescript-eslint/types@8.57.0))(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.57.1(@typescript-eslint/types@8.57.0))(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte': + specifier: ^7.0.0 + version: 7.3.1(svelte@5.57.1(@typescript-eslint/types@8.57.0))(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)) + eslint: + specifier: ^8.57.1 + version: 8.57.1 + eslint-config-prettier: + specifier: ^8.10.2 + version: 8.10.2(eslint@8.57.1) + prettier: + specifier: ^3.6.2 + version: 3.8.1 + prettier-plugin-svelte: + specifier: ^3.4.0 + version: 3.5.1(prettier@3.8.1)(svelte@5.57.1(@typescript-eslint/types@8.57.0)) + svelte: + specifier: ^5.57.1 + version: 5.57.1(@typescript-eslint/types@8.57.0) + vite: + specifier: ^8.0.12 + version: 8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2) examples/cf-pages-build: dependencies: @@ -131,13 +189,13 @@ importers: version: 1.58.2 '@sveltejs/adapter-cloudflare': specifier: ^7.2.4 - version: 7.2.8(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(wrangler@4.84.1(@cloudflare/workers-types@4.20260615.1)) + version: 7.2.8(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(wrangler@4.84.1(@cloudflare/workers-types@4.20260615.1)) '@sveltejs/kit': specifier: ^2.48.5 - version: 2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + version: 2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) '@sveltejs/vite-plugin-svelte': specifier: ^5.1.1 - version: 5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + version: 5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) eslint: specifier: ^8.57.1 version: 8.57.1 @@ -155,7 +213,7 @@ importers: version: 5.53.10 vite: specifier: ^6.4.1 - version: 6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) + version: 6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2) examples/cf-workers-build: dependencies: @@ -174,13 +232,13 @@ importers: version: 1.58.2 '@sveltejs/adapter-cloudflare': specifier: ^7.2.4 - version: 7.2.8(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(wrangler@4.84.1(@cloudflare/workers-types@4.20260615.1)) + version: 7.2.8(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(wrangler@4.84.1(@cloudflare/workers-types@4.20260615.1)) '@sveltejs/kit': specifier: ^2.48.5 - version: 2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + version: 2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) '@sveltejs/vite-plugin-svelte': specifier: ^5.1.1 - version: 5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + version: 5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) eslint: specifier: ^8.57.1 version: 8.57.1 @@ -201,7 +259,7 @@ importers: version: 5.53.10 vite: specifier: ^6.4.1 - version: 6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) + version: 6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2) wrangler: specifier: ^4.49.0 version: 4.84.1(@cloudflare/workers-types@4.20260615.1) @@ -220,16 +278,16 @@ importers: devDependencies: '@deno/svelte-adapter': specifier: ^0.2.1 - version: 0.2.1(patch_hash=a28e8e1c386834ae41f01ff4b054a70df14ed7404bdb0b5d8ca5f3285ae93cb2)(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))) + version: 0.2.1(patch_hash=a28e8e1c386834ae41f01ff4b054a70df14ed7404bdb0b5d8ca5f3285ae93cb2)(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2))) '@playwright/test': specifier: ^1.55.0 version: 1.58.2 '@sveltejs/kit': specifier: ^2.48.5 - version: 2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + version: 2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) '@sveltejs/vite-plugin-svelte': specifier: ^5.1.1 - version: 5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + version: 5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) eslint: specifier: ^9.39.1 version: 9.39.3(jiti@2.6.1) @@ -247,7 +305,7 @@ importers: version: 5.53.10 vite: specifier: ^6.4.1 - version: 6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) + version: 6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2) examples/netlify-build: dependencies: @@ -266,13 +324,13 @@ importers: version: 1.58.2 '@sveltejs/adapter-netlify': specifier: ^6.0.4 - version: 6.0.4(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))) + version: 6.0.4(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2))) '@sveltejs/kit': specifier: ^2.48.5 - version: 2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + version: 2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) '@sveltejs/vite-plugin-svelte': specifier: ^6.2.1 - version: 6.2.4(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + version: 6.2.4(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) eslint: specifier: ^9.39.1 version: 9.39.3(jiti@2.6.1) @@ -290,7 +348,7 @@ importers: version: 5.53.10 vite: specifier: ^6.4.1 - version: 6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) + version: 6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2) examples/node-build: dependencies: @@ -309,13 +367,13 @@ importers: version: 1.58.2 '@sveltejs/adapter-node': specifier: ^5.4.0 - version: 5.5.4(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))) + version: 5.5.4(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2))) '@sveltejs/kit': specifier: ^2.48.5 - version: 2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + version: 2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) '@sveltejs/vite-plugin-svelte': specifier: ^5.1.1 - version: 5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + version: 5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) eslint: specifier: ^8.57.1 version: 8.57.1 @@ -333,7 +391,7 @@ importers: version: 5.53.10 vite: specifier: ^6.4.1 - version: 6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) + version: 6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2) examples/satori-only-build: dependencies: @@ -343,19 +401,22 @@ importers: '@examples/shared': specifier: workspace:* version: link:../shared + takumi-js: + specifier: 2.0.1 + version: 2.0.1(csstype@3.2.3) devDependencies: '@playwright/test': specifier: ^1.55.0 version: 1.58.2 '@sveltejs/adapter-cloudflare': - specifier: ^7.2.4 - version: 7.2.8(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(wrangler@4.84.1(@cloudflare/workers-types@4.20260615.1)) + specifier: ^8.0.0 + version: 8.0.0(@sveltejs/kit@3.0.1(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.1(@typescript-eslint/types@8.57.0))(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.57.1(@typescript-eslint/types@8.57.0))(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)))(wrangler@4.84.1(@cloudflare/workers-types@4.20260615.1)) '@sveltejs/kit': - specifier: ^2.48.5 - version: 2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + specifier: ^3.0.0 + version: 3.0.1(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.1(@typescript-eslint/types@8.57.0))(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.57.1(@typescript-eslint/types@8.57.0))(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)) '@sveltejs/vite-plugin-svelte': - specifier: ^5.1.1 - version: 5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + specifier: ^7.0.0 + version: 7.3.1(svelte@5.57.1(@typescript-eslint/types@8.57.0))(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)) eslint: specifier: ^8.57.1 version: 8.57.1 @@ -367,13 +428,13 @@ importers: version: 3.8.1 prettier-plugin-svelte: specifier: ^3.4.0 - version: 3.5.1(prettier@3.8.1)(svelte@5.53.10) + version: 3.5.1(prettier@3.8.1)(svelte@5.57.1(@typescript-eslint/types@8.57.0)) svelte: - specifier: ^5.43.12 - version: 5.53.10 + specifier: ^5.57.1 + version: 5.57.1(@typescript-eslint/types@8.57.0) vite: - specifier: ^6.4.1 - version: 6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) + specifier: ^8.0.12 + version: 8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2) examples/shared: dependencies: @@ -383,19 +444,19 @@ importers: devDependencies: '@sveltejs/kit': specifier: ^2.53.4 - version: 2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + version: 2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)) '@sveltejs/package': specifier: ^2.5.7 version: 2.5.7(svelte@5.53.10)(typescript@5.9.3) '@sveltejs/vite-plugin-svelte': specifier: ^6.2.1 - version: 6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + version: 6.2.4(svelte@5.53.10)(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)) svelte: specifier: ^5.53.10 version: 5.53.10 svelte-check: specifier: ^4.4.5 - version: 4.4.5(picomatch@4.0.3)(svelte@5.53.10)(typescript@5.9.3) + version: 4.4.5(picomatch@4.0.7)(svelte@5.53.10)(typescript@5.9.3) takumi-js: specifier: 2.0.1 version: 2.0.1(csstype@3.2.3) @@ -419,14 +480,14 @@ importers: specifier: ^1.55.0 version: 1.58.2 '@sveltejs/adapter-cloudflare': - specifier: ^7.2.4 - version: 7.2.8(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(wrangler@4.84.1(@cloudflare/workers-types@4.20260615.1)) + specifier: ^8.0.0 + version: 8.0.0(@sveltejs/kit@3.0.1(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.1(@typescript-eslint/types@8.57.0))(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.57.1(@typescript-eslint/types@8.57.0))(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)))(wrangler@4.84.1(@cloudflare/workers-types@4.20260615.1)) '@sveltejs/kit': - specifier: ^2.48.5 - version: 2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + specifier: ^3.0.0 + version: 3.0.1(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.1(@typescript-eslint/types@8.57.0))(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.57.1(@typescript-eslint/types@8.57.0))(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)) '@sveltejs/vite-plugin-svelte': - specifier: ^5.1.1 - version: 5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + specifier: ^7.0.0 + version: 7.3.1(svelte@5.57.1(@typescript-eslint/types@8.57.0))(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)) eslint: specifier: ^8.57.1 version: 8.57.1 @@ -438,13 +499,13 @@ importers: version: 3.8.1 prettier-plugin-svelte: specifier: ^3.4.0 - version: 3.5.1(prettier@3.8.1)(svelte@5.53.10) + version: 3.5.1(prettier@3.8.1)(svelte@5.57.1(@typescript-eslint/types@8.57.0)) svelte: - specifier: ^5.43.12 - version: 5.53.10 + specifier: ^5.57.1 + version: 5.57.1(@typescript-eslint/types@8.57.0) vite: - specifier: ^6.4.1 - version: 6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) + specifier: ^8.0.12 + version: 8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2) examples/vercel-build: dependencies: @@ -463,13 +524,13 @@ importers: version: 1.58.2 '@sveltejs/adapter-vercel': specifier: ^5.10.2 - version: 5.10.3(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(rollup@4.59.0) + version: 5.10.3(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(rollup@4.59.0) '@sveltejs/kit': specifier: ^2.48.5 - version: 2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + version: 2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) '@sveltejs/vite-plugin-svelte': specifier: ^5.1.1 - version: 5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + version: 5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) eslint: specifier: ^8.57.1 version: 8.57.1 @@ -487,7 +548,7 @@ importers: version: 5.53.10 vite: specifier: ^6.4.1 - version: 6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) + version: 6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2) packages/sveltekit-og: dependencies: @@ -515,16 +576,16 @@ importers: version: 9.39.3 '@sveltejs/adapter-auto': specifier: ^3.3.1 - version: 3.3.1(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.53.10)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.32.0)(terser@5.46.0)))(svelte@5.53.10)(typescript@5.9.3)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.32.0)(terser@5.46.0))) + version: 3.3.1(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.53.10)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.33.0)(terser@5.46.0)))(svelte@5.53.10)(typescript@5.9.3)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.33.0)(terser@5.46.0))) '@sveltejs/kit': specifier: ^2.53.4 - version: 2.55.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.53.10)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.32.0)(terser@5.46.0)))(svelte@5.53.10)(typescript@5.9.3)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.32.0)(terser@5.46.0)) + version: 2.55.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.53.10)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.33.0)(terser@5.46.0)))(svelte@5.53.10)(typescript@5.9.3)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.33.0)(terser@5.46.0)) '@sveltejs/package': specifier: ^2.5.7 version: 2.5.7(svelte@5.53.10)(typescript@5.9.3) '@sveltejs/vite-plugin-svelte': specifier: ^4.0.4 - version: 4.0.4(svelte@5.53.10)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.32.0)(terser@5.46.0)) + version: 4.0.4(svelte@5.53.10)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.33.0)(terser@5.46.0)) '@types/node': specifier: ^24.11.0 version: 24.11.0 @@ -569,13 +630,13 @@ importers: version: 0.1.16 rollup-plugin-visualizer: specifier: ^5.14.0 - version: 5.14.0(rollup@4.59.0) + version: 5.14.0(rolldown@1.2.11)(rollup@4.59.0) svelte: specifier: ^5.53.10 version: 5.53.10 svelte-check: specifier: ^4.4.5 - version: 4.4.5(picomatch@4.0.3)(svelte@5.53.10)(typescript@5.9.3) + version: 4.4.5(picomatch@4.0.7)(svelte@5.53.10)(typescript@5.9.3) takumi-js: specifier: 2.0.1 version: 2.0.1(csstype@3.2.3) @@ -590,10 +651,10 @@ importers: version: 8.57.0(eslint@8.57.1)(typescript@5.9.3) vite: specifier: ^5.4.21 - version: 5.4.21(@types/node@24.11.0)(lightningcss@1.32.0)(terser@5.46.0) + version: 5.4.21(@types/node@24.11.0)(lightningcss@1.33.0)(terser@5.46.0) vitest: specifier: ^1.6.1 - version: 1.6.1(@types/node@24.11.0)(jsdom@27.4.0)(lightningcss@1.32.0)(terser@5.46.0) + version: 1.6.1(@types/node@24.11.0)(jsdom@27.4.0)(lightningcss@1.33.0)(terser@5.46.0) packages: @@ -655,6 +716,9 @@ packages: '@cloudflare/workers-types@4.20260615.1': resolution: {integrity: sha512-fGOiTwoLj/8bU8mj3VAfa1EULx4ceZhDwnjvY+afDBlSXI9pvY7PE9t62rGEhJjbAOGd7i5WUDun0eZCWBDrzg==} + '@cloudflare/workers-types@5.20261006.1': + resolution: {integrity: sha512-5OclwQK1d8f5LCPvOlyldC3ryKLUa4nLXegcgPZeUxAPudczQ9xujJDdpS2Tenp7JqbBLW3OgGciHJmuc7QShg==} + '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} @@ -1374,10 +1438,14 @@ packages: svelte: ^5.0.0 tailwindcss: ^4.0.0 - '@ethercorps/sveltekit-og@4.3.1-next.3': - resolution: {integrity: sha512-S7lMf9Jpfl0RxcrMbOB2lsy4bKsc+ONlfIhDqQwu4EfngsCGJWAKlgQvFKNxEAkG9zO2TfUOJb7nE0UmY4RORA==} + '@ethercorps/sveltekit-og@4.4.0-next.2': + resolution: {integrity: sha512-EHrr4aqSahYyjI+lcORvcVx27NlefUpedMXUMFOCpvUyMhWW3bO9Si1gm0rSN12ABpO5qm2bwasKZOlX2+chzg==} peerDependencies: '@sveltejs/kit': '>=2.0.0' + takumi-js: ^2.0.1 + peerDependenciesMeta: + takumi-js: + optional: true '@exodus/bytes@1.15.1': resolution: {integrity: sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==} @@ -1609,6 +1677,9 @@ packages: '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} + '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} @@ -1742,6 +1813,9 @@ packages: resolution: {integrity: sha512-da6KbdNCV5sr1/txD896V+6W0iamFWrvVl8cHkBSPT+YlvmT3DwXa4jxZnQc+gnuTEqSWbBeoSZYTayXH9wXcw==} engines: {node: '>= 20'} + '@oxc-project/types@0.151.0': + resolution: {integrity: sha512-J1yXrIlNDZVzE3ada310xeAw7nH8yCAyLPuUIsjKatFPmfn5bS1oW+cM+QsGOtVWd5nhSpbwZWx/rue+r5Z+PA==} + '@oxlint/binding-android-arm-eabi@1.56.0': resolution: {integrity: sha512-IyfYPthZyiSKwAv/dLjeO18SaK8MxLI9Yss2JrRDyweQAkuL3LhEy7pwIwI7uA3KQc1Vdn20kdmj3q0oUIQL6A==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1889,6 +1963,105 @@ packages: resolution: {integrity: sha512-FqALmHI8D4o6lk/LRWDnhw95z5eO+eAa6ORjVg09YRR7BkcM6oPHU9uyC0gtQG5vpFLvgpeU4+zEAz2H8APHNw==} engines: {node: '>= 10'} + '@rolldown/binding-android-arm-eabi@1.2.11': + resolution: {integrity: sha512-A5kXfGKvKWWZE0TtPrfsvT+q4Y5d1QG8gGUzpYjGydM+fARM9MuX90PrXYXe0XbsDVgyxxNzHo6giCj90bsFNw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@rolldown/binding-android-arm64@1.2.11': + resolution: {integrity: sha512-z6cTycz+iJ4PVkuL4HHW4DfTfoeU/2nqYYuSOrTmH7yHK5Y0LCOnA03V4ZNxavyVaU1oOqUgIg2klN/s+USGOA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.2.11': + resolution: {integrity: sha512-jShvqNtP6vDC6/A5JOAzbVV+DkgHqhl/ScVCJEbt+TUY6QYz7YnXcrg3sLtFBniro0f/Ld50ZwCWA6f7KYD1nQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.2.11': + resolution: {integrity: sha512-f2i2xiNWq1Z1l2++q2fuhZRdLAT3aqxD6vRNm1RAxpUoBcdqNB3C0s1Bt+K+PbEx2F5F4gQp6hqKkphCY/xF9w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.2.11': + resolution: {integrity: sha512-4Ir5FSOKIAMr4r0kExpt1s3bMgzJU3rA45AYOHtQpls0oNeqcYBKrWMlckrYH4KCfGLfkfn1tN1dmZPMVsdXow==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.2.11': + resolution: {integrity: sha512-/gnRDM+39BROzAN/k1OZjDPnDMcZxB/0EUxKjONO5yVkNEvlsoMDrxGNKgZi/ttFriS2gwlDNzB65pvNbFOXIQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.2.11': + resolution: {integrity: sha512-PFaK8HwvAHbaKbBcDNQihjMKYvFnA5hiENx/l5tphTDz1E0WFp32l0A7aq7lyUwGsRw/xSrNIy/gIK4thrSCrw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.2.11': + resolution: {integrity: sha512-AskzJUIKRLPxkruR1wLKewGbOw+EYfU/9lOrBFj4AFrEA8hPpKFnODWNu2WLaNs0QNkEb9QIJufmVZZIL/bJlg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.2.11': + resolution: {integrity: sha512-qlUGAheh2yh8afH7QBgx0PrRHN85hKnNd78x8MeMhXivuevgd8vgf6/CstOzmNKY/lLTHvNTrPy98cLnAugzJw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.2.11': + resolution: {integrity: sha512-secpEad+0vCbSfn8upFySkDskv+bGPk3THSDS9Y89yc4rb4kzqHp8Dmyd9BkQW4SnhNXBZCl/6CrO//hZahNJQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.2.11': + resolution: {integrity: sha512-mOVBT3dPpkWm8XBWPmU4bf+U6dYDLeMo/9ojUmis4N0L5uu10qra5vOyngZ7/PSdoE4G9KvRt4bloRxNjLas7A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.2.11': + resolution: {integrity: sha512-Is78i9A8Ui4SqcxUwFJ9uMmjDn58IbVTjFWYdQestFEgeuEmHMLGNriXnVJKkwG2YiZjw8cP0zCTyDMdDGtOOg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.2.11': + resolution: {integrity: sha512-dUCXneZ87INUMyQ0D+C0HrEBNUPNXHaPmU5GTjyKTJEiussw9Kaj5Ln8UztPe4epV/ffvgNBEadksdYhmW6xJA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-win32-arm64-msvc@1.2.11': + resolution: {integrity: sha512-jByxb6qfd+bH1xUd0qnfFnb17i9sWBPY2tOavJ0l3tdr3OTu+Kvtm8cd/JV5nFt657b1VqGltxg9olOEfofXWw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.2.11': + resolution: {integrity: sha512-/PzKqzAJ03i19oy2ItPvyvaVjOjBCNnfaJs8yvUdGBKmiESgnrJSQ2awd81QzFbbnAmu7YO9ZnJrDCb9VSJPRA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + '@rollup/plugin-commonjs@29.0.2': resolution: {integrity: sha512-S/ggWH1LU7jTyi9DxZOKyxpVd4hF/OZ0JrEbeLjXk/DFXwRny0tjD2c992zOUYQobLrVkRVMDdmHP16HKP7GRg==} engines: {node: '>=16.0.0 || 14 >= 14.17'} @@ -2109,6 +2282,11 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@sveltejs/acorn-typescript@1.0.13': + resolution: {integrity: sha512-wgKggnhZVL9Bfx1OaKKTrYY9BFRk6C8UAkQNUcIv1+llzYrIqy+RZm5HPKzn0NpEBvTVhTqB4kQyllZywsRBRQ==} + peerDependencies: + acorn: ^8.9.0 + '@sveltejs/acorn-typescript@1.0.9': resolution: {integrity: sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==} peerDependencies: @@ -2119,12 +2297,24 @@ packages: peerDependencies: '@sveltejs/kit': ^2.0.0 + '@sveltejs/adapter-bun@1.0.0': + resolution: {integrity: sha512-CUfFNxrWrKk/0VqSM1DrXCAwpY3tWocaFwBohuBeyxKx07859shLqPdT9oo00lDti9PvVwhQMDS6bKQylTyv0g==} + engines: {bun: '>=1.4.0'} + peerDependencies: + '@sveltejs/kit': ^3.0.0-next.0 + '@sveltejs/adapter-cloudflare@7.2.8': resolution: {integrity: sha512-bIdhY/Fi4AQmqiBdQVKnafH1h9Gw+xbCvHyUu4EouC8rJOU02zwhi14k/FDhQ0mJF1iblIu3m8UNQ8GpGIvIOQ==} peerDependencies: '@sveltejs/kit': ^2.0.0 wrangler: ^4.0.0 + '@sveltejs/adapter-cloudflare@8.0.0': + resolution: {integrity: sha512-68jVq1x4nya+/Dpg1NrWlz6LFWAX/F3DrsR8KQGl1bOt4G8oUp0kLLeMx+LI4AZQccGEmE7Nt2tOZwsParE6FA==} + peerDependencies: + '@sveltejs/kit': ^3.0.0-next.0 + wrangler: ^4.118.0 + '@sveltejs/adapter-netlify@6.0.4': resolution: {integrity: sha512-Ln/vgZc1v/2JFXhl5QiVKJ61a75jKe2rdxMnDO8PPDpQN8Tq/0w4JnBGAMBqENtD+kDACyY00ZTyzP9uTP77wg==} peerDependencies: @@ -2156,6 +2346,22 @@ packages: typescript: optional: true + '@sveltejs/kit@3.0.1': + resolution: {integrity: sha512-8JMCCq7ZUJELi3hbhb0+c9Rs8qnbHW90vhOfM+t1FSF4fhIpG9/FOsH4IYgcITMhbdkSrrn+Kvd9G+q8A+UO6Q==} + engines: {node: '>=22.17'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.0.0 + '@sveltejs/vite-plugin-svelte': ^7.0.0 + svelte: ^5.57.1 + typescript: ^6.0.0 + vite: ^8.0.12 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + typescript: + optional: true + '@sveltejs/package@2.5.7': resolution: {integrity: sha512-qqD9xa9H7TDiGFrF6rz7AirOR8k15qDK/9i4MIE8te4vWsv5GEogPks61rrZcLy+yWph+aI6pIj2MdoK3YI8AQ==} engines: {node: ^16.14 || >=18} @@ -2208,6 +2414,13 @@ packages: svelte: ^5.0.0 vite: ^6.3.0 || ^7.0.0 + '@sveltejs/vite-plugin-svelte@7.3.1': + resolution: {integrity: sha512-ZPsLN8B1e/En+Ak5s4V7srFDT532oS0qieLsQwu63NGKsS+iAjoO2Js1BochlHlglcU+Pt7WAO3C5Ee+4f6gVA==} + engines: {node: ^20.19 || ^22.12 || >=24} + peerDependencies: + svelte: ^5.46.4 + vite: ^8.0.0-beta.7 || ^8.0.0 + '@swc/helpers@0.5.19': resolution: {integrity: sha512-QamiFeIK3txNjgUTNppE6MiG3p7TdninpZu0E0PbqVh1a9FNLT2FRhisaa4NcaX52XVhA5l7Pk58Ft7Sqi/2sA==} @@ -2387,6 +2600,24 @@ packages: csstype: optional: true + '@twinkleplop/core@0.3.1': + resolution: {integrity: sha512-fMbce7NcJlVROsyI34tz3DCWkAWRWLRlBNCbgwz36mm6yoEO09eyafi8JRN5HJGQIzMr0qjXQ3t3asc7MFSh8Q==} + + '@twinkleplop/css@0.1.7': + resolution: {integrity: sha512-eznre7EgC0IBE3/jqAUKXG2S4iWLczOSAxwLnknS+9BQQGuD82u2A2rCok94E+nMpjkeshhbSvnQxDSEo8YpUA==} + + '@twinkleplop/html@0.1.7': + resolution: {integrity: sha512-tpc+I1OXR5UJYkIhna74rxxEBYUJMWTNkjAVH9sA6fKeWq9lmbLRhutb10PHeMuF6BTHuHgD9oyET7yKdZGeQA==} + + '@twinkleplop/javascript@0.1.7': + resolution: {integrity: sha512-qZDFx0bTM8YdKBTCxIS+6dZ1itaTnn1Udf2wFW5Uo+S6liGm40Lq2rlCk3PYa+Hm4lmX6HSzFeO4ZaDqk6Cn9Q==} + + '@twinkleplop/theme-github@0.2.4': + resolution: {integrity: sha512-gCo1G/dGspjNSUoLPLE49MZx97LoEdGYQQHqh985Vfg0jsdupCPHRRvRkgXm8RsP7TvZ2ib/nORpCPNiauflSA==} + + '@twinkleplop/typescript@0.1.7': + resolution: {integrity: sha512-3lVdFUnOc40QQUJPnmTsiyTf7+RSEoXhDnmMwkUQ5Kzgemkk6eeXQGietPjxro8k+QuTAY/aQuWOtR/nUgfENw==} + '@types/aws-lambda@8.10.161': resolution: {integrity: sha512-rUYdp+MQwSFocxIOcSsYSF3YYYC/uUpMbCY/mbO21vGqfrEYvNSoPyKYDj6RhXXpPfS0KstW9RwG3qXh9sL7FQ==} @@ -2402,6 +2633,9 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -2560,6 +2794,7 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + deprecated: Potential CWE-502 - Update to 1.3.1 or higher '@vercel/nft@0.30.4': resolution: {integrity: sha512-wE6eAGSXScra60N2l6jWvNtVK0m+sh873CpfZW4KI2v8EHuUQp+mSEi4T+IcdPCSEDgCdAS/7bizbhQlkjzrSA==} @@ -2604,6 +2839,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.18.0: + resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} + engines: {node: '>=0.4.0'} + hasBin: true + agent-base@7.1.4: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} @@ -2729,6 +2969,9 @@ packages: engines: {node: '>=18'} hasBin: true + bun-types@1.4.2: + resolution: {integrity: sha512-bxV1FgK7yBIzjRe5zBozIM4Bem11ZJcCXSrjWRG3YWLt8yFDePu4cLjpebO8OvPeIE9trbyPF4fuj3Cia4Fj3w==} + bundle-name@4.1.0: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} @@ -2875,6 +3118,10 @@ packages: resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} engines: {node: '>=18'} + cookie@2.0.1: + resolution: {integrity: sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==} + engines: {node: '>=22'} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -2982,6 +3229,9 @@ packages: devalue@5.6.4: resolution: {integrity: sha512-Gp6rDldRsFh/7XuouDbxMH3Mx8GMCcgzIb1pDTvNyn8pZGQ22u+Wa+lGV9dQCltFQ7uVw0MhRyb8XDskNFOReA==} + devalue@5.9.4: + resolution: {integrity: sha512-sPAT4pztbu6586/hrhOnMKS17IJrvg12mXiSPSS3W5qDeN2RGgvZ0diZCm31dBbnevfVmujNO3IM2wrS4Y2Rhg==} + devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -3015,9 +3265,6 @@ packages: resolution: {integrity: sha512-1QFuh8l7LqUcKe24LsPUNzjrzJQ7pgRwp1QMcZ5MX6mFplk2zQ08NVCM84++1cveaUUYtcCYHmeFEuNg16sU4g==} engines: {node: '>=10.0.0'} - emoji-regex@10.6.0: - resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} - emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -3174,6 +3421,14 @@ packages: esrap@2.2.3: resolution: {integrity: sha512-8fOS+GIGCQZl/ZIlhl59htOlms6U8NvX6ZYgYHpRU/b6tVSh3uHkOHZikl3D4cMbYM0JlpBe+p/BkZEi8J9XIQ==} + esrap@2.3.14: + resolution: {integrity: sha512-Bj/f1mOb6SnJ5f+5wOF/eqOKfvY+g+nJIKLQRqrEFOJ2mrMVORqQ6Ot7RTL1GhFctr0o+i0o1xfsNLeuA+mu4A==} + peerDependencies: + '@typescript-eslint/types': ^8.2.0 + peerDependenciesMeta: + '@typescript-eslint/types': + optional: true + esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -3678,30 +3933,60 @@ packages: cpu: [arm64] os: [android] + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + lightningcss-darwin-arm64@1.32.0: resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + lightningcss-darwin-x64@1.32.0: resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + lightningcss-freebsd-x64@1.32.0: resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + lightningcss-linux-arm-gnueabihf@1.32.0: resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + lightningcss-linux-arm64-gnu@1.32.0: resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} engines: {node: '>= 12.0.0'} @@ -3709,6 +3994,13 @@ packages: os: [linux] libc: [glibc] + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + lightningcss-linux-arm64-musl@1.32.0: resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} engines: {node: '>= 12.0.0'} @@ -3716,6 +4008,13 @@ packages: os: [linux] libc: [musl] + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + lightningcss-linux-x64-gnu@1.32.0: resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} engines: {node: '>= 12.0.0'} @@ -3723,6 +4022,13 @@ packages: os: [linux] libc: [glibc] + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + lightningcss-linux-x64-musl@1.32.0: resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} engines: {node: '>= 12.0.0'} @@ -3730,22 +4036,45 @@ packages: os: [linux] libc: [musl] + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + lightningcss-win32-arm64-msvc@1.32.0: resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + lightningcss-win32-x64-msvc@1.32.0: resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + lightningcss@1.32.0: resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} engines: {node: '>= 12.0.0'} + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} + engines: {node: '>= 12.0.0'} + lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -3787,6 +4116,9 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + magic-string@1.4.2: + resolution: {integrity: sha512-vG+rjFRj1PqdIBozIxAGMjPlOhaVe+GXpbttY/iSK7rGcJRMlwNJO7dcUwmUqkymsFLJiNGI06t4D7Fr7yRC9g==} + markdown-extensions@2.0.0: resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} engines: {node: '>=16'} @@ -4042,6 +4374,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@3.3.19: + resolution: {integrity: sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} @@ -4173,6 +4510,11 @@ packages: pako@0.2.9: resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + paneforge@1.0.2: + resolution: {integrity: sha512-KzmIXQH1wCfwZ4RsMohD/IUtEjVhteR+c+ulb/CHYJHX8SuDXoJmChtsc/Xs5Wl8NHS4L5Q7cxL8MG40gSU1bA==} + peerDependencies: + svelte: ^5.29.0 + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -4261,6 +4603,10 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} + pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} @@ -4312,6 +4658,10 @@ packages: resolution: {integrity: sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.28: + resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==} + engines: {node: ^10 || ^12 || >=14} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -4538,6 +4888,11 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + rolldown@1.2.11: + resolution: {integrity: sha512-qpSwIyz0jHQq5qXBTNxFmE6664rJ7O+4TvPFOiOaBSrz8IOHc1koKKSqTM2H6u1UG1+TveuC6vaDHKXFOvb1Kw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rollup-plugin-visualizer@5.14.0: resolution: {integrity: sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA==} engines: {node: '>=18'} @@ -4573,6 +4928,11 @@ packages: peerDependencies: svelte: ^5.7.0 + runed@0.29.2: + resolution: {integrity: sha512-0cq6cA6sYGZwl/FvVqjx9YN+1xEBu9sDDyuWdDW1yWX7JF2wmvmVKfH+hVCZs+csW+P3ARH92MjI3H9QTagOQA==} + peerDependencies: + svelte: ^5.7.0 + runed@0.35.1: resolution: {integrity: sha512-2F4Q/FZzbeJTFdIS/PuOoPRSm92sA2LhzTnv6FXhCoENb3huf5+fDuNOg1LNvGOouy3u/225qxmuJvcV3IZK5Q==} peerDependencies: @@ -4589,10 +4949,6 @@ packages: satori-html@0.3.2: resolution: {integrity: sha512-wjTh14iqADFKDK80e51/98MplTGfxz2RmIzh0GqShlf4a67+BooLywF17TvJPD6phO0Hxm7Mf1N5LtRYvdkYRA==} - satori@0.10.14: - resolution: {integrity: sha512-abovcqmwl97WKioxpkfuMeZmndB1TuDFY/R+FymrZyiGP+pMYomvgSzVPnbNMWHHESOPosVHGL352oFbdAnJcA==} - engines: {node: '>=16'} - satori@0.25.0: resolution: {integrity: sha512-utINfLxrYrmSnLvxFT4ZwgwWa8KOjrz7ans32V5wItgHVmzESl/9i33nE38uG0miycab8hUqQtDlOpqrIpB/iw==} engines: {node: '>=16'} @@ -4757,6 +5113,12 @@ packages: peerDependencies: svelte: ^5.0.0 + svelte-toolbelt@0.9.3: + resolution: {integrity: sha512-HCSWxCtVmv+c6g1ACb8LTwHVbDqLKJvHpo6J8TaqwUme2hj9ATJCpjCPNISR1OCq2Q4U1KT41if9ON0isINQZw==} + engines: {node: '>=18', pnpm: '>=8.7.0'} + peerDependencies: + svelte: ^5.30.2 + svelte2tsx@0.7.52: resolution: {integrity: sha512-svdT1FTrCLpvlU62evO5YdJt/kQ7nxgQxII/9BpQUvKr+GJRVdAXNVw8UWOt0fhoe5uWKyU0WsUTMRVAtRbMQg==} peerDependencies: @@ -4767,6 +5129,10 @@ packages: resolution: {integrity: sha512-UcNfWzbrjvYXYSk+U2hME25kpb87oq6/WVLeBF4khyQrb3Ob/URVlN23khal+RbdCUTMfg4qWjI9KZjCNFtYMQ==} engines: {node: '>=18'} + svelte@5.57.1: + resolution: {integrity: sha512-Uqj49lWKB+iSSnneuwiYYJ7MZgkB+eXr0LXBhv4uDuAkXqnWmq65Sxflfvp0Lc6MdKjMUxGaeOKWJqz5SNiVIA==} + engines: {node: '>=18'} + symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} @@ -4833,6 +5199,10 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + tinypool@0.8.4: resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} engines: {node: '>=14.0.0'} @@ -4934,8 +5304,8 @@ packages: ufo@1.6.4: resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} - ultrahtml@1.6.0: - resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} + ultrahtml@1.7.0: + resolution: {integrity: sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==} undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} @@ -5104,15 +5474,56 @@ packages: yaml: optional: true - vite@7.3.2: - resolution: {integrity: sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==} + vite@7.3.2: + resolution: {integrity: sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vite@8.3.1: + resolution: {integrity: sha512-/bvH9E9tmCXRGp2uXY3WbOldqpTwFkbha/8ANaEQ6VkxhH60KyqLwgZq6lG2y+4uT55x9+9eUHMpQ7uGnOCKjA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.7.1 + esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' less: ^4.0.0 - lightningcss: ^1.21.0 sass: ^1.70.0 sass-embedded: ^1.70.0 stylus: '>=0.54.8' @@ -5123,12 +5534,14 @@ packages: peerDependenciesMeta: '@types/node': optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true jiti: optional: true less: optional: true - lightningcss: - optional: true sass: optional: true sass-embedded: @@ -5328,9 +5741,6 @@ packages: yoga-layout@3.2.1: resolution: {integrity: sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==} - yoga-wasm-web@0.3.3: - resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==} - youch-core@0.3.3: resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} @@ -5390,6 +5800,8 @@ snapshots: '@cloudflare/workers-types@4.20260615.1': {} + '@cloudflare/workers-types@5.20261006.1': {} + '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 @@ -5420,10 +5832,10 @@ snapshots: dependencies: urlpattern-polyfill: 10.1.0 - '@deno/svelte-adapter@0.2.1(patch_hash=a28e8e1c386834ae41f01ff4b054a70df14ed7404bdb0b5d8ca5f3285ae93cb2)(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))': + '@deno/svelte-adapter@0.2.1(patch_hash=a28e8e1c386834ae41f01ff4b054a70df14ed7404bdb0b5d8ca5f3285ae93cb2)(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))': dependencies: '@deno/experimental-route-config': 0.0.5 - '@sveltejs/kit': 2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + '@sveltejs/kit': 2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) '@emnapi/runtime@1.10.0': dependencies: @@ -5810,14 +6222,14 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 - '@ethercorps/svecodocs@0.5.4(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(bits-ui@2.16.3(@internationalized/date@3.12.0)(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10))(svelte@5.53.10)(tailwindcss@4.2.4)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))': + '@ethercorps/svecodocs@0.5.4(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(bits-ui@2.16.3(@internationalized/date@3.12.0)(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10))(svelte@5.53.10)(tailwindcss@4.2.4)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2))': dependencies: - '@sveltejs/kit': 2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) - bits-ui: 2.16.3(@internationalized/date@3.12.0)(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10) + '@sveltejs/kit': 2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) + bits-ui: 2.16.3(@internationalized/date@3.12.0)(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10) clsx: 2.1.1 flexsearch: 0.7.43 mode-watcher: 1.1.0(svelte@5.53.10) - phosphor-svelte: 3.1.0(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + phosphor-svelte: 3.1.0(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) rehype-autolink-headings: 7.1.0 rehype-pretty-code: 0.14.3(shiki@1.29.2) rehype-slug: 6.0.0 @@ -5825,7 +6237,7 @@ snapshots: remove-markdown: 0.5.5 shiki: 1.29.2 svelte: 5.53.10 - svelte-toolbelt: 0.10.6(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10) + svelte-toolbelt: 0.10.6(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10) tailwind-merge: 3.5.0 tailwind-variants: 1.0.0(tailwindcss@4.2.4) tailwindcss: 4.2.4 @@ -5835,14 +6247,16 @@ snapshots: - supports-color - vite - '@ethercorps/sveltekit-og@4.3.1-next.3(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))': + '@ethercorps/sveltekit-og@4.4.0-next.2(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(takumi-js@2.0.1(csstype@3.2.3))': dependencies: '@resvg/resvg-wasm': 2.6.2 - '@sveltejs/kit': 2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) - satori: 0.10.14 + '@sveltejs/kit': 2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) + satori: 0.25.0 satori-html: 0.3.2 - std-env: 3.10.0 + std-env: 4.1.0 unwasm: 0.5.3 + optionalDependencies: + takumi-js: 2.0.1(csstype@3.2.3) '@exodus/bytes@1.15.1': {} @@ -5999,7 +6413,7 @@ snapshots: '@jridgewell/gen-mapping@0.3.13': dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/remapping@2.3.5': @@ -6016,6 +6430,8 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/sourcemap-codec@1.6.0': {} + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -6024,7 +6440,7 @@ snapshots: '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 '@mapbox/node-pre-gyp@2.0.3': dependencies: @@ -6041,11 +6457,11 @@ snapshots: '@mdx-js/mdx@3.1.1': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 '@types/mdx': 2.0.13 - acorn: 8.16.0 + acorn: 8.18.0 collapse-white-space: 2.1.0 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 @@ -6054,7 +6470,7 @@ snapshots: hast-util-to-jsx-runtime: 2.3.6 markdown-extensions: 2.0.0 recma-build-jsx: 1.0.0 - recma-jsx: 1.0.1(acorn@8.16.0) + recma-jsx: 1.0.1(acorn@8.18.0) recma-stringify: 1.0.0 rehype-recma: 1.0.0 remark-mdx: 3.1.1 @@ -6229,6 +6645,8 @@ snapshots: '@octokit/request-error': 7.1.0 '@octokit/webhooks-methods': 6.0.0 + '@oxc-project/types@0.151.0': {} + '@oxlint/binding-android-arm-eabi@1.56.0': optional: true @@ -6309,15 +6727,62 @@ snapshots: '@resvg/resvg-wasm@2.6.2': {} + '@rolldown/binding-android-arm-eabi@1.2.11': + optional: true + + '@rolldown/binding-android-arm64@1.2.11': + optional: true + + '@rolldown/binding-darwin-arm64@1.2.11': + optional: true + + '@rolldown/binding-darwin-x64@1.2.11': + optional: true + + '@rolldown/binding-freebsd-x64@1.2.11': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.2.11': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.2.11': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.2.11': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.2.11': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.2.11': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.2.11': + optional: true + + '@rolldown/binding-linux-x64-musl@1.2.11': + optional: true + + '@rolldown/binding-openharmony-arm64@1.2.11': + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.2.11': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.2.11': + optional: true + + '@rolldown/pluginutils@1.0.1': {} + '@rollup/plugin-commonjs@29.0.2(rollup@4.59.0)': dependencies: '@rollup/pluginutils': 5.3.0(rollup@4.59.0) commondir: 1.0.1 estree-walker: 2.0.2 - fdir: 6.5.0(picomatch@4.0.3) + fdir: 6.5.0(picomatch@4.0.7) is-reference: 1.2.1 magic-string: 0.30.21 - picomatch: 4.0.3 + picomatch: 4.0.7 optionalDependencies: rollup: 4.59.0 @@ -6339,9 +6804,9 @@ snapshots: '@rollup/pluginutils@5.3.0(rollup@4.59.0)': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 estree-walker: 2.0.2 - picomatch: 4.0.3 + picomatch: 4.0.7 optionalDependencies: rollup: 4.59.0 @@ -6472,46 +6937,62 @@ snapshots: '@standard-schema/spec@1.1.0': {} + '@sveltejs/acorn-typescript@1.0.13(acorn@8.18.0)': + dependencies: + acorn: 8.18.0 + '@sveltejs/acorn-typescript@1.0.9(acorn@8.16.0)': dependencies: acorn: 8.16.0 - '@sveltejs/adapter-auto@3.3.1(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.53.10)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.32.0)(terser@5.46.0)))(svelte@5.53.10)(typescript@5.9.3)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.32.0)(terser@5.46.0)))': + '@sveltejs/adapter-auto@3.3.1(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.53.10)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.33.0)(terser@5.46.0)))(svelte@5.53.10)(typescript@5.9.3)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.33.0)(terser@5.46.0)))': dependencies: - '@sveltejs/kit': 2.55.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.53.10)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.32.0)(terser@5.46.0)))(svelte@5.53.10)(typescript@5.9.3)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.32.0)(terser@5.46.0)) + '@sveltejs/kit': 2.55.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.53.10)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.33.0)(terser@5.46.0)))(svelte@5.53.10)(typescript@5.9.3)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.33.0)(terser@5.46.0)) import-meta-resolve: 4.2.0 - '@sveltejs/adapter-cloudflare@7.2.8(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(wrangler@4.84.1(@cloudflare/workers-types@4.20260615.1))': + '@sveltejs/adapter-bun@1.0.0(@sveltejs/kit@3.0.1(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.1(@typescript-eslint/types@8.57.0))(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.57.1(@typescript-eslint/types@8.57.0))(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)))': + dependencies: + '@sveltejs/kit': 3.0.1(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.1(@typescript-eslint/types@8.57.0))(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.57.1(@typescript-eslint/types@8.57.0))(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)) + bun-types: 1.4.2 + + '@sveltejs/adapter-cloudflare@7.2.8(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(wrangler@4.84.1(@cloudflare/workers-types@4.20260615.1))': dependencies: '@cloudflare/workers-types': 4.20260615.1 - '@sveltejs/kit': 2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + '@sveltejs/kit': 2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) worktop: 0.8.0-next.18 wrangler: 4.84.1(@cloudflare/workers-types@4.20260615.1) - '@sveltejs/adapter-cloudflare@7.2.8(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(wrangler@4.84.1(@cloudflare/workers-types@4.20260615.1))': + '@sveltejs/adapter-cloudflare@7.2.8(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(wrangler@4.84.1(@cloudflare/workers-types@4.20260615.1))': dependencies: '@cloudflare/workers-types': 4.20260615.1 - '@sveltejs/kit': 2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + '@sveltejs/kit': 2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) worktop: 0.8.0-next.18 wrangler: 4.84.1(@cloudflare/workers-types@4.20260615.1) - '@sveltejs/adapter-netlify@6.0.4(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))': + '@sveltejs/adapter-cloudflare@8.0.0(@sveltejs/kit@3.0.1(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.1(@typescript-eslint/types@8.57.0))(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.57.1(@typescript-eslint/types@8.57.0))(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)))(wrangler@4.84.1(@cloudflare/workers-types@4.20260615.1))': + dependencies: + '@cloudflare/workers-types': 5.20261006.1 + '@rolldown/pluginutils': 1.0.1 + '@sveltejs/kit': 3.0.1(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.1(@typescript-eslint/types@8.57.0))(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.57.1(@typescript-eslint/types@8.57.0))(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)) + wrangler: 4.84.1(@cloudflare/workers-types@4.20260615.1) + + '@sveltejs/adapter-netlify@6.0.4(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))': dependencies: '@iarna/toml': 2.2.5 - '@sveltejs/kit': 2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + '@sveltejs/kit': 2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) esbuild: 0.25.12 - '@sveltejs/adapter-node@5.5.4(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))': + '@sveltejs/adapter-node@5.5.4(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))': dependencies: '@rollup/plugin-commonjs': 29.0.2(rollup@4.59.0) '@rollup/plugin-json': 6.1.0(rollup@4.59.0) '@rollup/plugin-node-resolve': 16.0.3(rollup@4.59.0) - '@sveltejs/kit': 2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + '@sveltejs/kit': 2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) rollup: 4.59.0 - '@sveltejs/adapter-vercel@5.10.3(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(rollup@4.59.0)': + '@sveltejs/adapter-vercel@5.10.3(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(rollup@4.59.0)': dependencies: - '@sveltejs/kit': 2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + '@sveltejs/kit': 2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) '@vercel/nft': 0.30.4(rollup@4.59.0) esbuild: 0.25.12 transitivePeerDependencies: @@ -6519,11 +7000,31 @@ snapshots: - rollup - supports-color - '@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.53.10)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.32.0)(terser@5.46.0)))(svelte@5.53.10)(typescript@5.9.3)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.32.0)(terser@5.46.0))': + '@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.53.10)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.33.0)(terser@5.46.0)))(svelte@5.53.10)(typescript@5.9.3)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.33.0)(terser@5.46.0))': + dependencies: + '@standard-schema/spec': 1.1.0 + '@sveltejs/acorn-typescript': 1.0.9(acorn@8.16.0) + '@sveltejs/vite-plugin-svelte': 4.0.4(svelte@5.53.10)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.33.0)(terser@5.46.0)) + '@types/cookie': 0.6.0 + acorn: 8.16.0 + cookie: 0.6.0 + devalue: 5.6.4 + esm-env: 1.2.2 + kleur: 4.1.5 + magic-string: 0.30.21 + mrmime: 2.0.1 + set-cookie-parser: 3.0.1 + sirv: 3.0.2 + svelte: 5.53.10 + vite: 5.4.21(@types/node@24.11.0)(lightningcss@1.33.0)(terser@5.46.0) + optionalDependencies: + typescript: 5.9.3 + + '@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2))': dependencies: '@standard-schema/spec': 1.1.0 '@sveltejs/acorn-typescript': 1.0.9(acorn@8.16.0) - '@sveltejs/vite-plugin-svelte': 4.0.4(svelte@5.53.10)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.32.0)(terser@5.46.0)) + '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) '@types/cookie': 0.6.0 acorn: 8.16.0 cookie: 0.6.0 @@ -6535,15 +7036,15 @@ snapshots: set-cookie-parser: 3.0.1 sirv: 3.0.2 svelte: 5.53.10 - vite: 5.4.21(@types/node@24.11.0)(lightningcss@1.32.0)(terser@5.46.0) + vite: 6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2) optionalDependencies: typescript: 5.9.3 - '@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))': + '@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2))': dependencies: '@standard-schema/spec': 1.1.0 '@sveltejs/acorn-typescript': 1.0.9(acorn@8.16.0) - '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) '@types/cookie': 0.6.0 acorn: 8.16.0 cookie: 0.6.0 @@ -6555,15 +7056,15 @@ snapshots: set-cookie-parser: 3.0.1 sirv: 3.0.2 svelte: 5.53.10 - vite: 6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) + vite: 6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2) optionalDependencies: typescript: 5.9.3 - '@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))': + '@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2))': dependencies: '@standard-schema/spec': 1.1.0 '@sveltejs/acorn-typescript': 1.0.9(acorn@8.16.0) - '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) '@types/cookie': 0.6.0 acorn: 8.16.0 cookie: 0.6.0 @@ -6575,15 +7076,15 @@ snapshots: set-cookie-parser: 3.0.1 sirv: 3.0.2 svelte: 5.53.10 - vite: 6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) + vite: 7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2) optionalDependencies: typescript: 5.9.3 - '@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))': + '@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2))': dependencies: '@standard-schema/spec': 1.1.0 '@sveltejs/acorn-typescript': 1.0.9(acorn@8.16.0) - '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.53.10)(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)) '@types/cookie': 0.6.0 acorn: 8.16.0 cookie: 0.6.0 @@ -6595,10 +7096,24 @@ snapshots: set-cookie-parser: 3.0.1 sirv: 3.0.2 svelte: 5.53.10 - vite: 7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) + vite: 8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2) optionalDependencies: typescript: 5.9.3 + '@sveltejs/kit@3.0.1(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.1(@typescript-eslint/types@8.57.0))(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.57.1(@typescript-eslint/types@8.57.0))(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2))': + dependencies: + '@rolldown/pluginutils': 1.0.1 + '@standard-schema/spec': 1.1.0 + '@sveltejs/vite-plugin-svelte': 7.3.1(svelte@5.57.1(@typescript-eslint/types@8.57.0))(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)) + cookie: 2.0.1 + devalue: 5.9.4 + esm-env: 1.2.2 + magic-string: 1.4.2 + mrmime: 2.0.1 + sirv: 3.0.2 + svelte: 5.57.1(@typescript-eslint/types@8.57.0) + vite: 8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2) + '@sveltejs/package@2.5.7(svelte@5.53.10)(typescript@5.9.3)': dependencies: chokidar: 5.0.0 @@ -6610,83 +7125,109 @@ snapshots: transitivePeerDependencies: - typescript - '@sveltejs/vite-plugin-svelte-inspector@3.0.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.53.10)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.32.0)(terser@5.46.0)))(svelte@5.53.10)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.32.0)(terser@5.46.0))': + '@sveltejs/vite-plugin-svelte-inspector@3.0.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.53.10)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.33.0)(terser@5.46.0)))(svelte@5.53.10)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.33.0)(terser@5.46.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 4.0.4(svelte@5.53.10)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.32.0)(terser@5.46.0)) + '@sveltejs/vite-plugin-svelte': 4.0.4(svelte@5.53.10)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.33.0)(terser@5.46.0)) debug: 4.4.3 svelte: 5.53.10 - vite: 5.4.21(@types/node@24.11.0)(lightningcss@1.32.0)(terser@5.46.0) + vite: 5.4.21(@types/node@24.11.0)(lightningcss@1.33.0)(terser@5.46.0) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))': + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) debug: 4.4.3 svelte: 5.53.10 - vite: 6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) + vite: 6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte-inspector@5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))': + '@sveltejs/vite-plugin-svelte-inspector@5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2))': + dependencies: + '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) + obug: 2.1.1 + svelte: 5.53.10 + vite: 6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2) + + '@sveltejs/vite-plugin-svelte-inspector@5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2))': dependencies: - '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) obug: 2.1.1 svelte: 5.53.10 - vite: 6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) + vite: 7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2) - '@sveltejs/vite-plugin-svelte-inspector@5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))': + '@sveltejs/vite-plugin-svelte-inspector@5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2))': dependencies: - '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.53.10)(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)) obug: 2.1.1 svelte: 5.53.10 - vite: 7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) + vite: 8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2) - '@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.53.10)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.32.0)(terser@5.46.0))': + '@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.53.10)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.33.0)(terser@5.46.0))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 3.0.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.53.10)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.32.0)(terser@5.46.0)))(svelte@5.53.10)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.32.0)(terser@5.46.0)) + '@sveltejs/vite-plugin-svelte-inspector': 3.0.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.53.10)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.33.0)(terser@5.46.0)))(svelte@5.53.10)(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.33.0)(terser@5.46.0)) debug: 4.4.3 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.21 svelte: 5.53.10 - vite: 5.4.21(@types/node@24.11.0)(lightningcss@1.32.0)(terser@5.46.0) - vitefu: 1.1.2(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.32.0)(terser@5.46.0)) + vite: 5.4.21(@types/node@24.11.0)(lightningcss@1.33.0)(terser@5.46.0) + vitefu: 1.1.2(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.33.0)(terser@5.46.0)) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))': + '@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) debug: 4.4.3 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.21 svelte: 5.53.10 - vite: 6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) - vitefu: 1.1.2(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + vite: 6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2) + vitefu: 1.1.2(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))': + '@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte-inspector': 5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) deepmerge: 4.3.1 magic-string: 0.30.21 obug: 2.1.1 svelte: 5.53.10 - vite: 6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) - vitefu: 1.1.2(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + vite: 6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2) + vitefu: 1.1.2(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) - '@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))': + '@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte-inspector': 5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) deepmerge: 4.3.1 magic-string: 0.30.21 obug: 2.1.1 svelte: 5.53.10 - vite: 7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) - vitefu: 1.1.2(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + vite: 7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2) + vitefu: 1.1.2(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) + + '@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)) + deepmerge: 4.3.1 + magic-string: 0.30.21 + obug: 2.1.1 + svelte: 5.53.10 + vite: 8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2) + vitefu: 1.1.2(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)) + + '@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.1(@typescript-eslint/types@8.57.0))(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2))': + dependencies: + deepmerge: 4.3.1 + magic-string: 1.4.2 + obug: 2.1.1 + svelte: 5.57.1(@typescript-eslint/types@8.57.0) + vite: 8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2) + vitefu: 1.1.2(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)) '@swc/helpers@0.5.19': dependencies: @@ -6753,12 +7294,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.2.2 '@tailwindcss/oxide-win32-x64-msvc': 4.2.2 - '@tailwindcss/vite@4.2.2(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))': + '@tailwindcss/vite@4.2.2(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2))': dependencies: '@tailwindcss/node': 4.2.2 '@tailwindcss/oxide': 4.2.2 tailwindcss: 4.2.2 - vite: 7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) + vite: 7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2) '@takumi-rs/core-darwin-arm64@2.0.1': optional: true @@ -6812,6 +7353,33 @@ snapshots: - react - react-dom + '@twinkleplop/core@0.3.1': {} + + '@twinkleplop/css@0.1.7': + dependencies: + '@twinkleplop/core': 0.3.1 + + '@twinkleplop/html@0.1.7': + dependencies: + '@twinkleplop/core': 0.3.1 + '@twinkleplop/css': 0.1.7 + '@twinkleplop/javascript': 0.1.7 + + '@twinkleplop/javascript@0.1.7': + dependencies: + '@twinkleplop/core': 0.3.1 + '@twinkleplop/css': 0.1.7 + '@twinkleplop/html': 0.1.7 + + '@twinkleplop/theme-github@0.2.4': + dependencies: + '@twinkleplop/core': 0.3.1 + + '@twinkleplop/typescript@0.1.7': + dependencies: + '@twinkleplop/core': 0.3.1 + '@twinkleplop/javascript': 0.1.7 + '@types/aws-lambda@8.10.161': {} '@types/cookie@0.6.0': {} @@ -6822,10 +7390,12 @@ snapshots: '@types/estree-jsx@1.0.5': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/estree@1.0.8': {} + '@types/estree@1.0.9': {} + '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 @@ -6995,7 +7565,7 @@ snapshots: debug: 4.4.3 minimatch: 10.2.4 semver: 7.7.4 - tinyglobby: 0.2.15 + tinyglobby: 0.2.17 ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -7043,15 +7613,15 @@ snapshots: dependencies: '@mapbox/node-pre-gyp': 2.0.3 '@rollup/pluginutils': 5.3.0(rollup@4.59.0) - acorn: 8.16.0 - acorn-import-attributes: 1.9.5(acorn@8.16.0) + acorn: 8.18.0 + acorn-import-attributes: 1.9.5(acorn@8.18.0) async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 glob: 10.5.0 graceful-fs: 4.2.11 node-gyp-build: 4.8.4 - picomatch: 4.0.3 + picomatch: 4.0.7 resolve-from: 5.0.0 transitivePeerDependencies: - encoding @@ -7089,20 +7659,22 @@ snapshots: abbrev@3.0.1: {} - acorn-import-attributes@1.9.5(acorn@8.16.0): + acorn-import-attributes@1.9.5(acorn@8.18.0): dependencies: - acorn: 8.16.0 + acorn: 8.18.0 - acorn-jsx@5.3.2(acorn@8.16.0): + acorn-jsx@5.3.2(acorn@8.18.0): dependencies: - acorn: 8.16.0 + acorn: 8.18.0 acorn-walk@8.3.5: dependencies: - acorn: 8.16.0 + acorn: 8.18.0 acorn@8.16.0: {} + acorn@8.18.0: {} + agent-base@7.1.4: {} ajv@6.14.0: @@ -7167,15 +7739,15 @@ snapshots: dependencies: file-uri-to-path: 1.0.0 - bits-ui@2.16.3(@internationalized/date@3.12.0)(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10): + bits-ui@2.16.3(@internationalized/date@3.12.0)(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10): dependencies: '@floating-ui/core': 1.7.5 '@floating-ui/dom': 1.7.6 '@internationalized/date': 3.12.0 esm-env: 1.2.2 - runed: 0.35.1(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10) + runed: 0.35.1(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10) svelte: 5.53.10 - svelte-toolbelt: 0.10.6(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10) + svelte-toolbelt: 0.10.6(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10) tabbable: 6.4.0 transitivePeerDependencies: - '@sveltejs/kit' @@ -7219,6 +7791,10 @@ snapshots: transitivePeerDependencies: - magicast + bun-types@1.4.2: + dependencies: + '@types/node': 24.11.0 + bundle-name@4.1.0: dependencies: run-applescript: 7.1.0 @@ -7389,6 +7965,8 @@ snapshots: cookie@1.1.1: {} + cookie@2.0.1: {} + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -7477,6 +8055,8 @@ snapshots: devalue@5.6.4: {} + devalue@5.9.4: {} + devlop@1.1.0: dependencies: dequal: 2.0.3 @@ -7501,8 +8081,6 @@ snapshots: emoji-regex-xs@2.0.1: {} - emoji-regex@10.6.0: {} - emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -7526,7 +8104,7 @@ snapshots: esast-util-from-js@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 - acorn: 8.16.0 + acorn: 8.18.0 esast-util-from-estree: 2.0.0 vfile-message: 4.0.3 @@ -7804,14 +8382,14 @@ snapshots: espree@10.4.0: dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.18.0 + acorn-jsx: 5.3.2(acorn@8.18.0) eslint-visitor-keys: 4.2.1 espree@9.6.1: dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.18.0 + acorn-jsx: 5.3.2(acorn@8.18.0) eslint-visitor-keys: 3.4.3 esquery@1.7.0: @@ -7820,12 +8398,18 @@ snapshots: esrap@1.4.9: dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 esrap@2.2.3: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + esrap@2.3.14(@typescript-eslint/types@8.57.0): + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + optionalDependencies: + '@typescript-eslint/types': 8.57.0 + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 @@ -7836,7 +8420,7 @@ snapshots: estree-util-attach-comments@3.0.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 estree-util-build-jsx@3.0.1: dependencies: @@ -7849,7 +8433,7 @@ snapshots: estree-util-scope@1.0.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 devlop: 1.1.0 estree-util-to-js@2.0.0: @@ -7867,7 +8451,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 esutils@2.0.3: {} @@ -7926,6 +8510,10 @@ snapshots: optionalDependencies: picomatch: 4.0.3 + fdir@6.5.0(picomatch@4.0.7): + optionalDependencies: + picomatch: 4.0.7 + fflate@0.7.4: {} figures@6.1.0: @@ -8145,7 +8733,7 @@ snapshots: hast-util-to-estree@3.1.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 @@ -8180,7 +8768,7 @@ snapshots: hast-util-to-jsx-runtime@2.3.6: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/hast': 3.0.4 '@types/unist': 3.0.3 comma-separated-tokens: 2.0.3 @@ -8341,7 +8929,7 @@ snapshots: is-reference@1.2.1: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 is-reference@3.0.3: dependencies: @@ -8435,36 +9023,69 @@ snapshots: lightningcss-android-arm64@1.32.0: optional: true + lightningcss-android-arm64@1.33.0: + optional: true + lightningcss-darwin-arm64@1.32.0: optional: true + lightningcss-darwin-arm64@1.33.0: + optional: true + lightningcss-darwin-x64@1.32.0: optional: true + lightningcss-darwin-x64@1.33.0: + optional: true + lightningcss-freebsd-x64@1.32.0: optional: true + lightningcss-freebsd-x64@1.33.0: + optional: true + lightningcss-linux-arm-gnueabihf@1.32.0: optional: true + lightningcss-linux-arm-gnueabihf@1.33.0: + optional: true + lightningcss-linux-arm64-gnu@1.32.0: optional: true + lightningcss-linux-arm64-gnu@1.33.0: + optional: true + lightningcss-linux-arm64-musl@1.32.0: optional: true + lightningcss-linux-arm64-musl@1.33.0: + optional: true + lightningcss-linux-x64-gnu@1.32.0: optional: true + lightningcss-linux-x64-gnu@1.33.0: + optional: true + lightningcss-linux-x64-musl@1.32.0: optional: true + lightningcss-linux-x64-musl@1.33.0: + optional: true + lightningcss-win32-arm64-msvc@1.32.0: optional: true + lightningcss-win32-arm64-msvc@1.33.0: + optional: true + lightningcss-win32-x64-msvc@1.32.0: optional: true + lightningcss-win32-x64-msvc@1.33.0: + optional: true + lightningcss@1.32.0: dependencies: detect-libc: 2.1.2 @@ -8481,6 +9102,22 @@ snapshots: lightningcss-win32-arm64-msvc: 1.32.0 lightningcss-win32-x64-msvc: 1.32.0 + lightningcss@1.33.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 + lilconfig@2.1.0: {} linebreak@1.1.0: @@ -8517,6 +9154,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + magic-string@1.4.2: + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + markdown-extensions@2.0.0: {} markdown-table@3.0.4: {} @@ -8789,7 +9430,7 @@ snapshots: micromark-extension-mdx-expression@3.0.1: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 devlop: 1.1.0 micromark-factory-mdx-expression: 2.0.3 micromark-factory-space: 2.0.1 @@ -8800,7 +9441,7 @@ snapshots: micromark-extension-mdx-jsx@3.0.2: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 micromark-factory-mdx-expression: 2.0.3 @@ -8817,7 +9458,7 @@ snapshots: micromark-extension-mdxjs-esm@3.0.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 micromark-util-character: 2.1.1 @@ -8829,8 +9470,8 @@ snapshots: micromark-extension-mdxjs@3.0.0: dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.18.0 + acorn-jsx: 5.3.2(acorn@8.18.0) micromark-extension-mdx-expression: 3.0.1 micromark-extension-mdx-jsx: 3.0.2 micromark-extension-mdx-md: 2.0.0 @@ -8853,7 +9494,7 @@ snapshots: micromark-factory-mdx-expression@2.0.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 devlop: 1.1.0 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 @@ -8917,7 +9558,7 @@ snapshots: micromark-util-events-to-acorn@2.0.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/unist': 3.0.3 devlop: 1.1.0 estree-util-visit: 2.0.0 @@ -9030,7 +9671,7 @@ snapshots: mlly@1.8.2: dependencies: - acorn: 8.16.0 + acorn: 8.18.0 pathe: 2.0.3 pkg-types: 1.3.1 ufo: 1.6.4 @@ -9049,6 +9690,8 @@ snapshots: nanoid@3.3.15: {} + nanoid@3.3.19: {} + natural-compare-lite@1.4.0: {} natural-compare@1.4.0: {} @@ -9206,6 +9849,12 @@ snapshots: pako@0.2.9: {} + paneforge@1.0.2(svelte@5.53.10): + dependencies: + runed: 0.23.4(svelte@5.53.10) + svelte: 5.53.10 + svelte-toolbelt: 0.9.3(svelte@5.53.10) + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -9266,13 +9915,13 @@ snapshots: perfect-debounce@2.1.0: {} - phosphor-svelte@3.1.0(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)): + phosphor-svelte@3.1.0(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)): dependencies: estree-walker: 3.0.3 magic-string: 0.30.21 svelte: 5.53.10 optionalDependencies: - vite: 7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) + vite: 7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2) picocolors@1.1.1: {} @@ -9280,6 +9929,8 @@ snapshots: picomatch@4.0.3: {} + picomatch@4.0.7: {} + pkg-types@1.3.1: dependencies: confbox: 0.1.8 @@ -9328,6 +9979,12 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.28: + dependencies: + nanoid: 3.3.19 + picocolors: 1.1.1 + source-map-js: 1.2.1 + prelude-ls@1.2.1: {} prettier-plugin-svelte@3.5.1(prettier@3.8.1)(svelte@5.53.10): @@ -9335,6 +9992,11 @@ snapshots: prettier: 3.8.1 svelte: 5.53.10 + prettier-plugin-svelte@3.5.1(prettier@3.8.1)(svelte@5.57.1(@typescript-eslint/types@8.57.0)): + dependencies: + prettier: 3.8.1 + svelte: 5.57.1(@typescript-eslint/types@8.57.0) + prettier-plugin-tailwindcss@0.6.14(prettier-plugin-svelte@3.5.1(prettier@3.8.1)(svelte@5.53.10))(prettier@3.8.1): dependencies: prettier: 3.8.1 @@ -9382,14 +10044,14 @@ snapshots: recma-build-jsx@1.0.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 estree-util-build-jsx: 3.0.1 vfile: 6.0.3 - recma-jsx@1.0.1(acorn@8.16.0): + recma-jsx@1.0.1(acorn@8.18.0): dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.18.0 + acorn-jsx: 5.3.2(acorn@8.18.0) estree-util-to-js: 2.0.0 recma-parse: 1.0.0 recma-stringify: 1.0.0 @@ -9397,14 +10059,14 @@ snapshots: recma-parse@1.0.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 esast-util-from-js: 2.0.1 unified: 11.0.5 vfile: 6.0.3 recma-stringify@1.0.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 estree-util-to-js: 2.0.0 unified: 11.0.5 vfile: 6.0.3 @@ -9454,7 +10116,7 @@ snapshots: rehype-recma@1.0.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/hast': 3.0.4 hast-util-to-estree: 3.1.3 transitivePeerDependencies: @@ -9557,13 +10219,35 @@ snapshots: dependencies: glob: 7.2.3 - rollup-plugin-visualizer@5.14.0(rollup@4.59.0): + rolldown@1.2.11: + dependencies: + '@oxc-project/types': 0.151.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm-eabi': 1.2.11 + '@rolldown/binding-android-arm64': 1.2.11 + '@rolldown/binding-darwin-arm64': 1.2.11 + '@rolldown/binding-darwin-x64': 1.2.11 + '@rolldown/binding-freebsd-x64': 1.2.11 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.11 + '@rolldown/binding-linux-arm64-gnu': 1.2.11 + '@rolldown/binding-linux-arm64-musl': 1.2.11 + '@rolldown/binding-linux-ppc64-gnu': 1.2.11 + '@rolldown/binding-linux-s390x-gnu': 1.2.11 + '@rolldown/binding-linux-x64-gnu': 1.2.11 + '@rolldown/binding-linux-x64-musl': 1.2.11 + '@rolldown/binding-openharmony-arm64': 1.2.11 + '@rolldown/binding-win32-arm64-msvc': 1.2.11 + '@rolldown/binding-win32-x64-msvc': 1.2.11 + + rollup-plugin-visualizer@5.14.0(rolldown@1.2.11)(rollup@4.59.0): dependencies: open: 8.4.2 picomatch: 4.0.3 source-map: 0.7.6 yargs: 17.7.2 optionalDependencies: + rolldown: 1.2.11 rollup: 4.59.0 rollup@4.59.0: @@ -9613,14 +10297,19 @@ snapshots: esm-env: 1.2.2 svelte: 5.53.10 - runed@0.35.1(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10): + runed@0.29.2(svelte@5.53.10): + dependencies: + esm-env: 1.2.2 + svelte: 5.53.10 + + runed@0.35.1(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10): dependencies: dequal: 2.0.3 esm-env: 1.2.2 lz-string: 1.5.0 svelte: 5.53.10 optionalDependencies: - '@sveltejs/kit': 2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + '@sveltejs/kit': 2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)) sade@1.8.1: dependencies: @@ -9628,20 +10317,7 @@ snapshots: satori-html@0.3.2: dependencies: - ultrahtml: 1.6.0 - - satori@0.10.14: - dependencies: - '@shuding/opentype.js': 1.4.0-beta.0 - css-background-parser: 0.1.0 - css-box-shadow: 1.0.0-3 - css-to-react-native: 3.2.0 - emoji-regex: 10.6.0 - escape-html: 1.0.3 - linebreak: 1.1.0 - parse-css-color: 0.2.1 - postcss-value-parser: 4.2.0 - yoga-wasm-web: 0.3.3 + ultrahtml: 1.7.0(patch_hash=07138908c903b0b671e3079e043028374ce5e2d5fe24cfdc5c097747382c11bf) satori@0.25.0: dependencies: @@ -9813,6 +10489,18 @@ snapshots: transitivePeerDependencies: - picomatch + svelte-check@4.4.5(picomatch@4.0.7)(svelte@5.53.10)(typescript@5.9.3): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + chokidar: 4.0.3 + fdir: 6.5.0(picomatch@4.0.7) + picocolors: 1.1.1 + sade: 1.8.1 + svelte: 5.53.10 + typescript: 5.9.3 + transitivePeerDependencies: + - picomatch + svelte-eslint-parser@0.43.0(svelte@5.53.10): dependencies: eslint-scope: 7.2.2 @@ -9823,10 +10511,10 @@ snapshots: optionalDependencies: svelte: 5.53.10 - svelte-toolbelt@0.10.6(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10): + svelte-toolbelt@0.10.6(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10): dependencies: clsx: 2.1.1 - runed: 0.35.1(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10) + runed: 0.35.1(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.53.10) style-to-object: 1.0.14 svelte: 5.53.10 transitivePeerDependencies: @@ -9839,6 +10527,13 @@ snapshots: style-to-object: 1.0.14 svelte: 5.53.10 + svelte-toolbelt@0.9.3(svelte@5.53.10): + dependencies: + clsx: 2.1.1 + runed: 0.29.2(svelte@5.53.10) + style-to-object: 1.0.14 + svelte: 5.53.10 + svelte2tsx@0.7.52(svelte@5.53.10)(typescript@5.9.3): dependencies: dedent-js: 1.0.1 @@ -9865,6 +10560,26 @@ snapshots: magic-string: 0.30.21 zimmerframe: 1.1.4 + svelte@5.57.1(@typescript-eslint/types@8.57.0): + dependencies: + '@jridgewell/remapping': 2.3.5 + '@jridgewell/sourcemap-codec': 1.6.0 + '@sveltejs/acorn-typescript': 1.0.13(acorn@8.18.0) + '@types/estree': 1.0.9 + acorn: 8.18.0 + aria-query: 5.3.1 + axobject-query: 4.1.0 + clsx: 2.1.1 + devalue: 5.9.4 + esm-env: 1.2.2 + esrap: 2.3.14(@typescript-eslint/types@8.57.0) + is-reference: 3.0.3 + locate-character: 3.0.0 + magic-string: 0.30.21 + zimmerframe: 1.1.4 + transitivePeerDependencies: + - '@typescript-eslint/types' + symbol-tree@3.2.4: {} tabbable@6.4.0: {} @@ -9914,7 +10629,7 @@ snapshots: terser@5.46.0: dependencies: '@jridgewell/source-map': 0.3.11 - acorn: 8.16.0 + acorn: 8.18.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -9930,8 +10645,13 @@ snapshots: tinyglobby@0.2.15: dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 tinypool@0.8.4: {} @@ -10014,7 +10734,7 @@ snapshots: ufo@1.6.4: {} - ultrahtml@1.6.0: {} + ultrahtml@1.7.0(patch_hash=07138908c903b0b671e3079e043028374ce5e2d5fe24cfdc5c097747382c11bf): {} undici-types@7.16.0: {} @@ -10149,13 +10869,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-node@1.6.1(@types/node@24.11.0)(lightningcss@1.32.0)(terser@5.46.0): + vite-node@1.6.1(@types/node@24.11.0)(lightningcss@1.33.0)(terser@5.46.0): dependencies: cac: 6.7.14 debug: 4.4.3 pathe: 1.1.2 picocolors: 1.1.1 - vite: 5.4.21(@types/node@24.11.0)(lightningcss@1.32.0)(terser@5.46.0) + vite: 5.4.21(@types/node@24.11.0)(lightningcss@1.33.0)(terser@5.46.0) transitivePeerDependencies: - '@types/node' - less @@ -10167,7 +10887,7 @@ snapshots: - supports-color - terser - vite@5.4.21(@types/node@24.11.0)(lightningcss@1.32.0)(terser@5.46.0): + vite@5.4.21(@types/node@24.11.0)(lightningcss@1.33.0)(terser@5.46.0): dependencies: esbuild: 0.21.5 postcss: 8.5.16 @@ -10175,10 +10895,10 @@ snapshots: optionalDependencies: '@types/node': 24.11.0 fsevents: 2.3.3 - lightningcss: 1.32.0 + lightningcss: 1.33.0 terser: 5.46.0 - vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2): + vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -10190,11 +10910,11 @@ snapshots: '@types/node': 24.11.0 fsevents: 2.3.3 jiti: 2.6.1 - lightningcss: 1.32.0 + lightningcss: 1.33.0 terser: 5.46.0 yaml: 2.8.2 - vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2): + vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2): dependencies: esbuild: 0.27.7 fdir: 6.5.0(picomatch@4.0.3) @@ -10206,23 +10926,42 @@ snapshots: '@types/node': 24.11.0 fsevents: 2.3.3 jiti: 2.6.1 - lightningcss: 1.32.0 + lightningcss: 1.33.0 + terser: 5.46.0 + yaml: 2.8.2 + + vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2): + dependencies: + lightningcss: 1.33.0 + picomatch: 4.0.7 + postcss: 8.5.28 + rolldown: 1.2.11 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 24.11.0 + esbuild: 0.27.7 + fsevents: 2.3.3 + jiti: 2.6.1 terser: 5.46.0 yaml: 2.8.2 - vitefu@1.1.2(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.32.0)(terser@5.46.0)): + vitefu@1.1.2(vite@5.4.21(@types/node@24.11.0)(lightningcss@1.33.0)(terser@5.46.0)): + optionalDependencies: + vite: 5.4.21(@types/node@24.11.0)(lightningcss@1.33.0)(terser@5.46.0) + + vitefu@1.1.2(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)): optionalDependencies: - vite: 5.4.21(@types/node@24.11.0)(lightningcss@1.32.0)(terser@5.46.0) + vite: 6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2) - vitefu@1.1.2(vite@6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)): + vitefu@1.1.2(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2)): optionalDependencies: - vite: 6.4.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) + vite: 7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(yaml@2.8.2) - vitefu@1.1.2(vite@7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)): + vitefu@1.1.2(vite@8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)): optionalDependencies: - vite: 7.3.2(@types/node@24.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) + vite: 8.3.1(@types/node@24.11.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2) - vitest@1.6.1(@types/node@24.11.0)(jsdom@27.4.0)(lightningcss@1.32.0)(terser@5.46.0): + vitest@1.6.1(@types/node@24.11.0)(jsdom@27.4.0)(lightningcss@1.33.0)(terser@5.46.0): dependencies: '@vitest/expect': 1.6.1 '@vitest/runner': 1.6.1 @@ -10241,8 +10980,8 @@ snapshots: strip-literal: 2.1.1 tinybench: 2.9.0 tinypool: 0.8.4 - vite: 5.4.21(@types/node@24.11.0)(lightningcss@1.32.0)(terser@5.46.0) - vite-node: 1.6.1(@types/node@24.11.0)(lightningcss@1.32.0)(terser@5.46.0) + vite: 5.4.21(@types/node@24.11.0)(lightningcss@1.33.0)(terser@5.46.0) + vite-node: 1.6.1(@types/node@24.11.0)(lightningcss@1.33.0)(terser@5.46.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 24.11.0 @@ -10378,8 +11117,6 @@ snapshots: yoga-layout@3.2.1: {} - yoga-wasm-web@0.3.3: {} - youch-core@0.3.3: dependencies: '@poppinss/exception': 1.2.3 diff --git a/render.yaml b/render.yaml new file mode 100644 index 0000000..30c2c27 --- /dev/null +++ b/render.yaml @@ -0,0 +1,13 @@ +# Render Blueprint — deploys the Bun adapter example as a Docker web service. +# Render injects PORT (10000) and the adapter listens on it; HOST is set in the image. +services: + - type: web + name: sveltekit-og-bun + runtime: docker + plan: free + region: oregon + branch: dev + dockerfilePath: ./examples/bun-build/Dockerfile + dockerContext: . + healthCheckPath: / + autoDeploy: true