Skip to content

chore(deps): update pnpm.catalog.default @takumi-rs/core-v1 to v2 - #665

Open
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/takumi-rs-core-v1-2.x
Open

chore(deps): update pnpm.catalog.default @takumi-rs/core-v1 to v2#665
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/takumi-rs-core-v1-2.x

Conversation

@renovate

@renovate renovate Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

Package Change Age Confidence
@takumi-rs/core-v1 (source) 1.8.72.9.2 age confidence

Release Notes

kane50613/takumi (@​takumi-rs/core-v1)

v2.9.2

Treat the synthetic HTML root as a block container

Markup written in a template literal carries whitespace either side, which parsed into text roots. The synthetic root that holds them was inline, so the leading one kept a line box and pushed the content down the page. It is a block container now, the way <body> is, and fromHtml drops the whitespace roots the way the Rust crate already did.

v2.9.1

Close the gap between two boxes on a fractional parent

A box's position snapped to the pixel grid against its parent while its size snapped against the page. A parent sitting on a fraction, such as a container padded in points, pushed the two apart and left a hairline of background between boxes that should meet.

v2.7.0

Restore JPEG, WebP and GIF decoding

takumi disables takumi-core's default features and never re-enables image decoding, so every build decoded PNG and ICO only. A WebP source failed with The image format could not be determined. image-decoding is now a takumi feature as well, on by default, and it splits into jpeg, webp and gif for a build that wants one format and not the others. The napi and wasm bindings turn it on too.

v2.6.0

Route shared codepoints to the subset that declares them

A Google Fonts subset encodes more than the unicode-range it was cut for, and the Cyrillic and Greek ones also carry the ASCII space and the Latin capitals. Selection took the first subset whose glyphs covered a character, in family-name order, so those codepoints left the Latin subset and every word split into separate runs. Subsets now rank by the range they declare, lowest first.

v2.5.5

Type render output as backed by ArrayBuffer

render and renderAnimation declared their output as Buffer / Uint8Array over ArrayBufferLike, so passing the bytes straight to new Response(...) failed to typecheck. They now declare Buffer<ArrayBuffer> / Uint8Array<ArrayBuffer>, which BodyInit accepts.

v2.5.0

Add setGlyphCacheMaxBytes

The resolved-glyph and glyph-mask caches share an 8 MiB budget that no binding exposed. cacheMaxBytes looks like the knob for it but covers a different set of caches: decoded images, SVG rasters, and parsed stylesheets.

setGlyphCacheMaxBytes sets the glyph budget. It is a module-level function rather than a Renderer option because those caches live in the module and are shared by every renderer, and the budget is read the first time a cache is used, so the call has to come before the first render.

The default suits Latin text. A CJK outline runs a few kilobytes, so 8 MiB holds on the order of a thousand of them and a page of Chinese re-rasterizes glyphs it evicted a moment earlier.

takumi-js forwards it too. That one records the budget and hands it to the backend as it loads, so it stays synchronous and cannot race the resolution.

v2.4.2

Stop copying Uint8Array font and image inputs on the native binding

Buffer inputs were already passed to render tasks as ref-counted views, but Uint8Array inputs went through a full to_vec copy first. Both now cross into the async tasks zero-copy; only bare ArrayBuffer inputs still copy.

v2.4.0

Unify decoded resources behind one budgeted cache

Decoded images had a byte budget, but each SVG kept up to 32 rasterized pixmaps outside it, and every render re-parsed its stylesheets from scratch. ImageCache is now ResourceCache: SVG sources, their rasterized pixmaps, and parsed stylesheets all weigh against the same budget as decoded images. The default budget drops from 64 MiB to 16 MiB and becomes configurable — new Renderer({ cacheMaxBytes }) in the bindings, ResourceCache::new(max_bytes) in Rust, with 0 disabling caching. SVG rasters and parsed stylesheets now also survive across renders, so a server re-rendering the same template stops re-rasterizing and re-parsing per request. Rust callers: RenderOptions.stylesheet is now Arc<StyleSheet>; pass sheet.into().

Return an error for viewports too large to allocate

A viewport whose pixel buffer overflowed the backing allocation used to fall back to a 1x1 canvas, so the render produced a valid-looking but wrong tiny image with no error. The root canvas is now built through a fallible path that surfaces the allocation failure as an InvalidViewport error instead. Internal offscreen canvases keep their bounded sizes and are unaffected.

Blend animated WebP frames by default on the native binding

AnimatedWebpOptions::builder() left blend and dispose unset, so they fell back to false while the type's Default and the wasm backend use blend: true. Native animated WebP now alpha-blends frames over prior content like wasm does, so animations with partially transparent later frames render the same on both backends. The builder defaults are pinned to the Default values.

Convert native panics into catchable errors instead of aborting the process

The published napi artifacts are now built with unwind panics, so a Rust panic reached through malformed input surfaces as a JS error rather than killing the host process. Wasm keeps abort panics by design.

v2.3.0

Accept raw RGBA pixels as an image source

An image node's src takes { width, height, data, premultiplied? } and renders the pixels without decoding; the Bitmap JSX helper wraps it as an <img>.

v2.2.0

Extend the built-in Geist to weight 300

The embedded last-resort font covers wght 300..800 and trims unused stylistic sets, ending up slightly smaller than before.

Claim generic font families from the JS font API

Font descriptors accept generic (e.g. "monospace"), so stacks like Tailwind's font-mono resolve to registered fonts without naming the family.

v2.0.2

Accept a promise in the fonts option

fonts now takes Promise<FontLoader[]> as well as the plain list, so
googleFonts results pass straight through without await.

Extend the embedded font weight axis to 800

The embedded last-resort Geist subset now covers weights 400 to 800.

v2.0.0

Make the embedded font a true last resort

Both bindings now embed one font: a Latin Geist subset with a 400 to 700
weight axis (Geist Mono and Manrope are gone). It no longer claims the
sans-serif generic family and always sorts after registered fonts in
fallback selection, so generic families and unstyled text resolve to the fonts
you load. The new FontResource::last_resort marks a font's families to sort
after every normal registration.

Cap animation frame rate per format

Browsers clamp any animation frame of 10ms or less to 100ms, so a high frame
rate stalls instead of playing fast. write_animation now rejects a frame rate
above AnimationFormat::max_fps with the new AnimationFrameRateTooHigh error:
90 fps for WebP and APNG, 50 fps for GIF (centisecond delays). The napi and WASM
renderAnimation bindings surface the error.

Apply structured keyframes in renderAnimation

renderAnimation accepted a keyframes option but never registered it, so
structured keyframes animated with render yet stayed static in animations. It
now extends the stylesheet with them like the other entry points.

Fix buffer pool bucket capacity invariant

Release now buckets a buffer by the floor power of two its capacity guarantees,
and acquire_dirty reserves before set_len. A pooled buffer can no longer be
lengthened past its allocation.

Skip mask copies and per-pixel mask lookups in canvas fast paths

Borrow the combined constraint mask directly when it already matches the
canvas viewport instead of copying it per draw, and hoist mask lookups out of
the per-pixel blit loops. Output is unchanged.

Make subset-group font selection deterministic

Subsets registered under one logical family (via FontResource::subset_of) were kept
in registration order. Callers commonly register fonts concurrently, so that order — and
therefore which subset won for a codepoint covered by more than one (e.g. overlapping
weight subsets, where the loser is faux-bolded) — varied per process. Identical input
could render to different bytes run to run.

Subsets are now held in a BTreeSet, ordered by their family name, so expansion and
selection no longer depend on registration timing. Same input renders identically.

Shrink the published binaries

Size-optimize the layout and shaping crates that never run per pixel, cutting
the published WASM and native binary size.

Share the renderer facade between the napi and wasm bindings

The napi and wasm Renderer wrappers now build on a shared prepareRenderInput
helper in @takumi-rs/helpers/renderer, so their option types and render bodies
live in one place. Both backends check signal before and after resolving
fonts and images: on native, an already-aborted signal now throws before any
resource fetch.

Fix gradient stop snapping panic for oversized stop lists

Gradients with more color stops than the LUT can hold no longer panic. The
sample-index clamp and normalization passes stay within LUT bounds.

Reuse per-scene state across animation frames

Compute each scene's font snapshot once and share its image and stylesheet
handles across frames instead of re-snapshotting and deep-cloning the whole
option tree per frame. Frame output is unchanged.

Remove encodeFrames

Renderer.encodeFrames and its EncodeFramesOptions / AnimationFrameSource
types are gone. renderAnimation covers scene-based animation; pre-rendered
frame encoding had no callers.

Replace fetchResources/extractResourceUrls with prepareImages

@takumi-rs/helpers exports prepareImages({ node, sources?, fetchCache?, fetch?, timeout? }),
which collects a node tree's remote images and fetches the ones not already supplied. Pass a
fetchCache (a Map<string, Promise<ArrayBuffer>>, or any Map-like store) to coalesce
concurrent fetches of the same URL and reuse the bytes across renders; a failed fetch is
evicted so a later call retries.

The extractResourceUrls and fetchResources helpers are removed. The images render option
takes the same group form: { sources, fetchCache, fetch, timeout }.

Stream animation frames straight into the encoder

Add write_animation, which renders a timeline and feeds each frame to the
encoder as it arrives, holding one raw frame at a time instead of the whole
sequence. Both the napi and WASM renderAnimation bindings use it, so a high
frame rate or a long duration no longer exhausts memory. On native the WebP
encoder still runs frames in parallel, now over bounded chunks. The WASM WebP
encoder now merges runs of identical frames like the native one, so a static or
slow animation encodes and stores far less. The eager render_animation +
write_animated_* path stays for callers that want every frame at once.

Guard shadow and blur buffer sizing against overflow

Extreme blur radii could overflow the u32 shadow-buffer area and panic or
over-allocate. Sizing now uses saturating math and skips shadows above a 256
Mi-pixel budget.

Type keyframe declarations with csstype instead of DOM's CSSStyleDeclaration

KeyframesMap and KeyframeRule typed each keyframe's declarations as
Record<string, CSSStyleDeclaration>, requiring every CSS property on a single
offset and needing the DOM lib. Declarations are now typed with csstype's
Properties, an optional peer dependency, so a single offset only needs the
properties it sets and consumers without the DOM lib still typecheck.

Accept a bare URL string in fonts

fonts entries can now be a URL string, e.g. fonts: ["https://example.com/Inter.woff2"].
The bytes are fetched on demand and keyed by the URL; family name, weight, and style come
from the font file. The object form stays for overriding those. Adds fontFromUrl to
@takumi-rs/helpers.

Cap image decode dimensions and GIF frame volume

Decoders reject images beyond 8192x8192 (via image::Limits for PNG and JPEG,
dimension checks for WebP) and GIFs beyond a total-frame pixel budget, stopping
decode-bomb OOM.


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • "on Monday"
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@pkg-pr-new

pkg-pr-new Bot commented Aug 10, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/nuxt-og-image@665

commit: cc663d3

@github-actions

github-actions Bot commented Aug 10, 2026

Copy link
Copy Markdown

📦 Package Size

No notable size changes

All tracked output (18)
Package output Gzipped Raw
nuxt-og-image · dependency @clack/prompts 12 kB 50 kB
nuxt-og-image · dependency @vue/compiler-sfc 574 kB 2.62 MB
nuxt-og-image · dependency chrome-launcher 21 kB 69 kB
nuxt-og-image · dependency lightningcss 1.4 kB 3.6 kB
nuxt-og-image · dependency magicast 72 kB 355 kB
nuxt-og-image · dependency mocked-exports 1.3 kB 2.6 kB
nuxt-og-image · dependency nuxt-site-config 9.8 kB 24 kB
nuxt-og-image · dependency nuxtseo-shared 21 kB 72 kB
nuxt-og-image · dependency oxc-parser 131 kB 1.38 MB
nuxt-og-image · dependency radix3 4.3 kB 16 kB
nuxt-og-image · dependency strip-literal 711 B 2.3 kB
nuxt-og-image · dependency tinyexec 4.1 kB 13 kB
nuxt-og-image · export . 373 B 900 B
nuxt-og-image · export ./content 324 B 607 B
nuxt-og-image · published payload 165 kB 573 kB
nuxt-og-image · app runtime 8.5 kB 26 kB
nuxt-og-image · server runtime 64 kB 177 kB
nuxt-og-image · shared runtime 3.1 kB 9.7 kB
Runtime dependencies (30)
Package Dependency Requested Resolved Cost
nuxt-og-image @clack/prompts ^1.7.0 1.7.0 📦 12 kB gzip
nuxt-og-image @nuxt/kit ^4.5.2 4.5.2 ♻️ free via Nuxt 4.5.2
nuxt-og-image @vue/compiler-sfc ^3.5.41 3.5.41 📦 574 kB gzip
nuxt-og-image chrome-launcher ^1.2.1 1.2.1 📦 21 kB gzip
nuxt-og-image consola ^3.4.2 3.4.2 ♻️ free via Nuxt 4.5.2
nuxt-og-image defu ^6.1.7 6.1.7 ♻️ free via Nuxt 4.5.2
nuxt-og-image devalue ^5.9.0 5.9.0 ♻️ free via Nuxt 4.5.2
nuxt-og-image exsolve ^1.1.1 1.1.1 ♻️ free via Nuxt 4.5.2
nuxt-og-image fnv1a-64 ^0.1.2 0.1.2 ♻️ free via Nuxt 4.5.2
nuxt-og-image lightningcss ^1.33.0 1.33.0 📦 1.4 kB gzip
nuxt-og-image magic-string ^1.1.0 1.1.0 ♻️ free via Nuxt 4.5.2
nuxt-og-image magicast ^0.5.4 0.5.4 📦 72 kB gzip
nuxt-og-image mocked-exports ^0.1.1 0.1.1 📦 1.3 kB gzip
nuxt-og-image nuxt-site-config ^4.2.0 4.2.0 📦 9.8 kB gzip
nuxt-og-image nuxtseo-shared ^5.3.12 5.3.12 📦 21 kB gzip
nuxt-og-image nypm ^0.6.9 0.6.9 ♻️ free via Nuxt 4.5.2
nuxt-og-image object-identity ^0.2.3 0.2.3 ♻️ free via Nuxt 4.5.2
nuxt-og-image ofetch ^1.5.1 1.5.1 ♻️ free via Nuxt 4.5.2
nuxt-og-image ohash ^2.0.11 2.0.11 ♻️ free via Nuxt 4.5.2
nuxt-og-image oxc-parser ^0.143.0 0.143.0 📦 131 kB gzip
nuxt-og-image oxc-walker ^1.1.1 1.1.1 ♻️ free via Nuxt 4.5.2
nuxt-og-image pathe ^2.0.3 2.0.3 ♻️ free via Nuxt 4.5.2
nuxt-og-image pkg-types ^2.3.1 2.3.1 ♻️ free via Nuxt 4.5.2
nuxt-og-image radix3 ^1.1.2 1.1.2 📦 4.3 kB gzip
nuxt-og-image std-env ^4.2.0 4.2.0 ♻️ free via Nuxt 4.5.2
nuxt-og-image strip-literal ^4.0.0 4.0.0 📦 711 B gzip
nuxt-og-image tinyexec ^1.3.0 1.3.0 📦 4.1 kB gzip
nuxt-og-image ufo ^1.6.4 1.6.4 ♻️ free via Nuxt 4.5.2
nuxt-og-image ultrahtml ^1.7.0 1.7.0 ♻️ free via Nuxt 4.5.2
nuxt-og-image unplugin ^3.3.0 3.3.0 ♻️ free via Nuxt 4.5.2

Baseline: main_@_f8308f5a___2026-08-11 · gzip is the comparison metric · changes below 16 B gzip are ignored

@renovate
renovate Bot force-pushed the renovate/takumi-rs-core-v1-2.x branch 10 times, most recently from deb1d5b to 7d8e5b2 Compare August 15, 2026 18:56
@renovate
renovate Bot force-pushed the renovate/takumi-rs-core-v1-2.x branch from 7d8e5b2 to cc663d3 Compare August 15, 2026 22:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants