chore(deps): update pnpm.catalog.default @takumi-rs/core-v1 to v2 - #665
Open
renovate[bot] wants to merge 1 commit into
Open
chore(deps): update pnpm.catalog.default @takumi-rs/core-v1 to v2#665renovate[bot] wants to merge 1 commit into
renovate[bot] wants to merge 1 commit into
Conversation
commit: |
📦 Package Size✅ No notable size changes All tracked output (18)
Runtime dependencies (30)
Baseline: main_@_dd04d3f2___2026-08-21 · gzip is the comparison metric · changes below 16 B gzip are ignored |
renovate
Bot
force-pushed
the
renovate/takumi-rs-core-v1-2.x
branch
11 times, most recently
from
August 15, 2026 22:59
7d8e5b2 to
cc663d3
Compare
renovate
Bot
force-pushed
the
renovate/takumi-rs-core-v1-2.x
branch
2 times, most recently
from
August 25, 2026 16:14
32a00a3 to
ffb2ce7
Compare
renovate
Bot
force-pushed
the
renovate/takumi-rs-core-v1-2.x
branch
2 times, most recently
from
August 30, 2026 07:39
31422b7 to
9bbde03
Compare
renovate
Bot
force-pushed
the
renovate/takumi-rs-core-v1-2.x
branch
from
August 30, 2026 19:32
9bbde03 to
7215eff
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
1.8.7→2.13.2Warning
Some dependencies could not be looked up. Check the Dependency Dashboard for more information.
Release Notes
kane50613/takumi (@takumi-rs/core-v1)
v2.13.2Stop an oversized node from crashing the render
A node far larger than the viewport wrapped its buffer size past
u32and crashed the render. A clip path now rasterizes only the part that reaches the canvas, an oversized shadow is dropped, and a mask too large to rasterize hides its node instead of leaving it unmasked.v2.13.1Encode only the changed region of each animated WebP frame
Animated WebP frames after the first now carry just the rectangle that changed since the previous frame, stored with the no-blend flag so it replaces the canvas. Animations with a small moving region over a static background come out much smaller and encode faster. Frames that change everywhere are unaffected, and
dispose: truekeeps full-canvas frames.Read premultiplied pixels as straight colour in
filterA colour filter ran on the canvas's premultiplied pixels as if they held straight colour, so it only landed on the right value where the element was fully opaque. Antialiased edges came out washed out, and
opacity()left the colour unscaled, so a faded layer went pale instead of translucent.v2.13.0Resolve
twutilities through CSS variablesUtilities now read the CSS variables Tailwind compiles them to, falling back to the built-in value. Define tokens in
:root.--color-brand-500makesbg-brand-500work, and spacing, fonts, shadows, animations and breakpoints follow the same rule.Gradients now match Tailwind on two counts. Stops alone no longer paint without
bg-linear-*,bg-radialorbg-conic, and a missingtostop fades totransparent.Let stylesheet rules win over
twutilitiesUtilities now sit in the last cascade layer, below unlayered CSS and above rules in a named
@layer. Important reverses that order. An important utility beats unlayered important CSS but loses to one in a named layer. Inline important declarations stay on top. A template that relied ontwbeating a matching rule needs a fix. Move that rule into a layer, or mark the utility!.Honor
!importantin inline stylesAn inline
!importantdeclaration now outranks important rules and animations. Both thestyleobject and an HTMLstyleattribute read the marker.Inherit
text-fitfrom a parenttext-fitnow inherits. Descendant text uses the inherited value to calculate its scale.Parse
@themeblocks as:rootrulesA Tailwind v4 source stylesheet now works in
csswithout compiling it first.@themedeclarations land on:root, and@keyframesinside the block register. Modifiers likereferenceread the same way. Theprefix()modifier is not supported.Wrap
box-sizing: content-boxtext inside its paddingA box with
box-sizing: content-boxand horizontal padding wrapped its textagainst the border box, so the text took fewer lines than it needed and
overflowed the bottom of the box.
Cut allocations in style property parsing
Parsing a string-valued property copied the value before handing it to cssparser. Normalizing a kebab-case or camelCase property name allocated a second string just to trim leading underscores. String values now parse in place, and names normalize in one allocation.
Compose filters and transforms through custom properties
Filter, translate, scale and grid-line utilities now compose through
--tw-*variables like Tailwind's compiled CSS. Stacked filters follow Tailwind's fixed chain order instead of class order.Size
autotable columns by their contentAn all-
autotable shared its free space evenly, so a one-word column took asmuch room as a paragraph. Each column now grows in proportion to its
max-content width, the way Blink distributes it, and never below the widest
word it has to hold. A table narrower than its content still approximates.
Escape control characters in serialized CSS strings
A quoted string containing a newline left it unescaped. This produced invalid CSS. CSS strings now use cssparser's escaping.
Write a
cssentry as an objectA
cssentry can be a rule,{ selector, style, rules }, or an animation,{ keyframes, steps }. Takumi checks the selector and every value before the entry reaches the parser, so a token that comes from application data cannot escape the rule it was written for. Thekeyframesoption is deprecated and goes away in v3.Turn on Preflight through
@import "tailwindcss"The import line at the top of a Tailwind v4 stylesheet now works. Preflight replaces the UA preset. Margins and padding go, lists lose their markers, and
h1throughh6drop their font sizing. It also brings the universal border reset, link and table resets, block-level images, andhiddenon any element. Author rules outrank Preflight, apart fromhidden, which it marks important. Other@importtargets stay unsupported.Support the
disclosure-openanddisclosure-closedcounter styleslist-style-typenow acceptsdisclosure-openanddisclosure-closed, drawing the triangles CSS Counter Styles defines.disclosure-closedpoints the way the text runs, so it flips underdirection: rtl. Font subsetting covers all three characters.Report text runs for a node that holds text directly
measurereturned no text runs for<div>word</div>, the shape an HTML parseproduces most often, while
<div><span>word</span></div>reported them. Therender was correct either way; only the measurement was missing its geometry.
Support legacy WebKit box alignment properties
Map
-webkit-box-orienttoflex-direction,-webkit-box-packtojustify-content, and-webkit-box-aligntoalign-items.Stop a box narrower than its padding from panicking
A box whose horizontal padding exceeds its own width left the text a negative
width to lay out in, which tripped an assertion inside the text layouter and
crashed the render. The width the text lays out against now stops at zero.
Write a group of
cssentries as an objectA
cssentry can be{ media, rules },{ supports, rules }, or{ layer, rules }. A layer withoutrulesdeclares its order alone. Takumi reads each prelude with the grammar its rule takes, so it cannot close the rule and open another.Expand
@applyinside stylesheet rules.card { @apply mt-4 bg-brand-500; }now expands through thetwparser where it is written,!suffix included. Variants likemd:are rejected. A static render has nothing for them to gate on.Rename the
stylesheetsrender option tocsscsstakes inline CSS as one string or a list. The oldstylesheetsname still works everywhere and warns once ontakumi-jsandtakumi-pdf.Support legacy WebKit display values
Map
-webkit-boxand-webkit-flextoflex, and-webkit-inline-boxand-webkit-inline-flextoinline-flex.Render
<text>elements in SVG image sourcesSVG images with
<text>,<tspan>andtextPathnow draw their text usingthe registered fonts instead of dropping it. Glyphs render from font outlines;
color emoji glyphs inside SVG text are not supported.
Accept CSS-wide keywords on shorthand properties
margin: inherit,padding: initialandborder: unsetwere rejected. Only longhands took CSS-wide keywords. A shorthand now expands the keyword across the longhands it targets.Reject trailing content in
stylevaluesA
styleobject acceptedwidth: "55px zzz", applied55px, and ignored the rest. It now rejects the whole value, the way a stylesheet already drops such a declaration. A substitutedvar()value follows the same rule.Take an inline-block's baseline from the lines it actually laid out
An inline-block with horizontal padding re-wrapped its content against the
border box to find its baseline, so text beside it aligned with the wrong line.
v2.12.0Support the legacy
page-break-*propertiesPrint stylesheets written for
page-break-before,page-break-after, andpage-break-insidehad those declarations dropped. They now drive the same pagination asbreak-before,break-after, andbreak-inside, and the forced-break keywordsalways,left, andrightare accepted alongsidepage.Support
table-layout: fixedandborder-spacingborder-spacingwas a hardcoded 2px gap with no way to change it, andtable-layoutdid nothing. Column widths now come from the first row undertable-layout: fixedand the rest of the width is shared evenly, whileborder-spacingsets both the gap between cells and the inset from the table's own edges. On a three-column table measured against headless Chrome,autocolumns land 67px to 136px away andfixedcolumns land within 2px.border-spacingstarts at 0 as CSS defines it, and the HTML and JSX element presets give<table>the 2px browsers apply, so adisplay: tablebox no longer gets a gap it never asked for.Support
border-collapse: collapseNeighbouring cells each painted their own border either side of the
border-spacinggap. A collapsing table now resolves every shared line once: the wider border wins,hiddenclears the line, and a row's borders reach its cells the way its background already did.v2.11.0Align table cell content with
vertical-alignvertical-align: middleon a table cell now centers its content in the cell, andbottompushes it to the cell's bottom edge.baselinestill renders astop.A row's element children that are not
table-cell, such as a<td style="display: flex">, are now laid out in the row instead of dropped. Text sitting directly in a row is still dropped: it has no anonymous cell to go into.Start backwards-filled step animations on the first step
An animation with
animation-fill-mode: backwardsorbothand a positive delay held the second step during the delay when its timing function wassteps(n, jump-start)orsteps(n, jump-both). Samples taken before the active phase now land on the step below the jump, as the CSS easing algorithm requires.steps()also serializes the way the spec asks:steps(4, end)andsteps(4, jump-end)both print assteps(4), since an end position is the default.Store
calc()as its non-zero termsLengthshrinks from 84 to 20 bytes, and a computed style from 5.9KB to 2.3KB. Acalc()expression mixing more than four distinct units now fails to parse.Sample background-clip text at pixel centres
Text clipped to a background or mask image sampled that image at pixel corners rather than centres, blending every pixel with its neighbour. The clip is now read exactly where it should be, so a
background-clip: textfill is half a pixel sharper, and drawing one is about a third faster.Animate WebP image sources
An animated WebP used as an image source now plays through its frames, the same way an animated GIF does. Before, decoding one threw
WebP encode failedand took the whole render down with it. The still-image paths, which the SVG backend and the size cache go through, fall back to the first frame instead of failing.ImageSource::Gifis nowImageSource::Animated, andGifSourceis nowAnimatedSource, since both carry GIF and WebP animations.ImageError::InvalidGifis nowImageError::InvalidAnimationfor the same reason.An animated source keeps only its encoded bytes and a frame timing table. It used to hold a decoded full-size copy of the first frame as well, which also meant the first frame ignored the draw box it was scaled into.
Reuse layout styles across sizing passes
Layout runs several sizing passes over each node, and each pass rebuilt that node's layout style from scratch. Only container query units (
cqw,cqh,cqmin,cqmax) can change between passes, so a style using none of them is now built once and reused. A deeply nested flex tree lays out about 36% faster.Support the full
steps()step position syntaxsteps()now acceptsjump-start,jump-end,jump-none, andjump-both, and the position argument is optional, sosteps(4)meanssteps(4, jump-end). Onlystartandendparsed before, so a declaration likesteps(4, jump-none)was dropped as invalid and the animation fell back toease, drawing a smooth curve instead of a staircase.Undo premultiplication in integers
Converting the finished canvas back to straight alpha now divides in integers rather than
f64. Rendering any image is a few percent faster, and pixels land on the same value on every target instead of depending on the platform's float division. Semi-transparent pixels can differ by one from previous output, which is where the float landed a hair under a rounding step.Share inherited font lists across nodes
font-family,font-variation-settings, andfont-feature-settingslists are nowArc-shared, so inheriting them no longer copies the list per node.Keep
direction: ltrblocks left-to-rightBlocks with
direction: ltrnow keep an LTR layout when text starts with an RTL script. The bidi base direction followsdirection, matching browsers.Composite opaque effect layers without resampling them
A blur, shadow or opacity group that is fully opaque and composites normally is copied onto its parent row by row instead of going through the sampling pipeline. Such a drop shadow is about 40% faster to render, such a blur about 30%. A group with partial opacity or a blend mode is unaffected.
Keep degenerate CSS values out of layout
aspect-ratiowith a zero, negative, or non-finite ratio (such as1/0) now behaves asauto, and an infinite percentage length is clamped instead of feeding infinity into layout.Draw animated frames without replaying the ones before them
A frame that covers the whole canvas and replaces what is under it does not depend on the frames before it, so it is now decoded on its own. Reaching the last frame of a 300-frame animation drops from 16.6ms to 0.13ms for GIF, 158ms to 0.39ms for APNG, and 97ms to 0.05ms for WebP. Frames that do blend onto their predecessors still replay, as they must.
Render list markers on the right under
direction: rtlA
direction: rtllist item now places its marker at the right edge and mirrors the counter suffix, matching Chrome. RTL blocks also force the right-to-left base direction instead of inferring it from the first strong character, so their text aligns to the right regardless of content.Draw whole-pixel images without resampling them
An image placed at a whole-pixel offset is copied row by row instead of going through the sampling pipeline. Drawing one into a node is about three times faster; clips, shadows and blurs that composite an image get a few percent.
Share custom property maps across nodes
ComputedStyle::custom_propertiesandregistered_custom_propertiesare nowArc-shared, so inheriting them no longer copies the maps per node.Animate APNG image sources
An animated PNG used as an image source now plays through its frames, the same way an animated GIF or WebP does. Before, only the default image was decoded and the render held that one frame for the whole animation, with nothing to signal the rest had been dropped. Subframes composite through the
fcTLdispose and blend operations, and a default image that nofcTLclaims stays out of the timeline.Match selectors against the rules that could apply
Stylesheet rules are grouped by what their rightmost selector requires, so a node only runs the matcher against rules naming one of its classes, its id or its tag. Rendering 800 nodes against 800 rules drops from 67ms to 2.5ms; the cost now grows with the rules that could match rather than with the whole stylesheet.
v2.10.0Update the font stack
parley 0.11.1, skrifa 0.44, and write-fonts 0.50, with the hinting-gate fork rebased so a single fontations version serves layout and subsetting.
Lay out tables on the grid algorithm
A
<table>used to fall back to block layout, so cells stacked instead of forming columns. Table boxes now lower onto a grid whose column tracks are shared by every row. Header groups render first, footer groups last.colspanandrowspanspan tracks, captions render on the sidecaption-sidepicks, and a row's background lands on its cells. HTML and JSX gain element presets fortable,thead,tbody,tfoot,tr,td,th, andcaption.Count the pages a repeated box prints on
A page counter filled only inside a
headerorfooterband. A footer written into the document itself, as afixedbox, printed empty hooks, so the numbers had to come from a render option standing beside the document. A repeated box now lays out again for every page it draws on, with that page's numbers, so a component can carry its own footer.Match Blink's spacing between a bullet marker and its item
An outside bullet keeps Blink's fixed 7px gap on top of its suffix space, an inside bullet separates with
1em, and thesquarestyle draws▪, approximating Blink's painted size.Drop
reversed, gradient marker images, andmenu/dirlist countingAn
<ol reversed>now counts up, a gradientlist-style-imagefalls back to the counter style, and onlyul/olscope a list's count.v2.9.2Treat 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, andfromHtmldrops the whitespace roots the way the Rust crate already did.v2.9.1Close 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.0Restore JPEG, WebP and GIF decoding
takumidisablestakumi-core's default features and never re-enables image decoding, so every build decoded PNG and ICO only. A WebP source failed withThe image format could not be determined.image-decodingis now atakumifeature as well, on by default, and it splits intojpeg,webpandgiffor a build that wants one format and not the others. The napi and wasm bindings turn it on too.v2.6.0Route shared codepoints to the subset that declares them
A Google Fonts subset encodes more than the
unicode-rangeit 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.5Type render output as backed by
ArrayBufferrenderandrenderAnimationdeclared their output asBuffer/Uint8ArrayoverArrayBufferLike, so passing the bytes straight tonew Response(...)failed to typecheck. They now declareBuffer<ArrayBuffer>/Uint8Array<ArrayBuffer>, whichBodyInitaccepts.v2.5.0Add
setGlyphCacheMaxBytesThe resolved-glyph and glyph-mask caches share an 8 MiB budget that no binding exposed.
cacheMaxByteslooks like the knob for it but covers a different set of caches: decoded images, SVG rasters, and parsed stylesheets.setGlyphCacheMaxBytessets the glyph budget. It is a module-level function rather than aRendereroption 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-jsforwards 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.2Stop 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_veccopy first. Both now cross into the async tasks zero-copy; only bare ArrayBuffer inputs still copy.v2.4.0Unify 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.
ImageCacheis nowResourceCache: 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, with0disabling 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.stylesheetis nowArc<StyleSheet>; passsheet.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
InvalidViewporterror instead. Internal offscreen canvases keep their bounded sizes and are unaffected.Blend animated WebP frames by default on the native binding
AnimatedWebpOptions::builder()leftblendanddisposeunset, so they fell back tofalsewhile the type'sDefaultand the wasm backend useblend: 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 theDefaultvalues.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.0Accept raw RGBA pixels as an image source
An image node's
srctakes{ width, height, data, premultiplied? }and renders the pixels without decoding; theBitmapJSX helper wraps it as an<img>.v2.2.0Extend the built-in Geist to weight 300
The embedded last-resort font covers
wght300..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'sfont-monoresolve to registered fonts without naming the family.v2.0.2Accept a promise in the
fontsoptionfontsnow takesPromise<FontLoader[]>as well as the plain list, sogoogleFontsresults pass straight through withoutawait.Extend the embedded font weight axis to 800
The embedded last-resort Geist subset now covers weights 400 to 800.
v2.0.0Make 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-serifgeneric family and always sorts after registered fonts infallback selection, so generic families and unstyled text resolve to the fonts
you load. The new
FontResource::last_resortmarks a font's families to sortafter 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_animationnow rejects a frame rateabove
AnimationFormat::max_fpswith the newAnimationFrameRateTooHigherror:90 fps for WebP and APNG, 50 fps for GIF (centisecond delays). The napi and WASM
renderAnimationbindings surface the error.Apply structured keyframes in
renderAnimationrenderAnimationaccepted akeyframesoption but never registered it, sostructured keyframes animated with
renderyet stayed static in animations. Itnow 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_dirtyreserves beforeset_len. A pooled buffer can no longer belengthened 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 keptin 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 andselection 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
Rendererwrappers now build on a sharedprepareRenderInputhelper in
@takumi-rs/helpers/renderer, so their option types and render bodieslive in one place. Both backends check
signalbefore and after resolvingfonts 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
encodeFramesRenderer.encodeFramesand itsEncodeFramesOptions/AnimationFrameSourcetypes are gone.
renderAnimationcovers scene-based animation; pre-renderedframe encoding had no callers.
Replace
fetchResources/extractResourceUrlswithprepareImages@takumi-rs/helpersexportsprepareImages({ node, sources?, fetchCache?, fetch?, timeout? }),which collects a node tree's remote images and fetches the ones not already supplied. Pass a
fetchCache(aMap<string, Promise<ArrayBuffer>>, or anyMap-like store) to coalesceconcurrent fetches of the same URL and reuse the bytes across renders; a failed fetch is
evicted so a later call retries.
The
extractResourceUrlsandfetchResourceshelpers are removed. Theimagesrender optiontakes 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 theencoder as it arrives, holding one raw frame at a time instead of the whole
sequence. Both the napi and WASM
renderAnimationbindings use it, so a highframe 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
u32shadow-buffer area and panic orover-allocate. Sizing now uses saturating math and skips shadows above a 256
Mi-pixel budget.
Type keyframe declarations with
csstypeinstead of DOM'sCSSStyleDeclarationKeyframesMapandKeyframeRuletyped each keyframe's declarations asRecord<string, CSSStyleDeclaration>, requiring every CSS property on a singleoffset and needing the
DOMlib. Declarations are now typed withcsstype'sProperties, an optional peer dependency, so a single offset only needs theproperties it sets and consumers without the
DOMlib still typecheck.Accept a bare URL string in
fontsfontsentries 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
fontFromUrlto@takumi-rs/helpers.Cap image decode dimensions and GIF frame volume
Decoders reject images beyond 8192x8192 (via
image::Limitsfor PNG and JPEG,dimension checks for WebP) and GIFs beyond a total-frame pixel budget, stopping
decode-bomb OOM.
Configuration
📅 Schedule: (UTC)
🚦 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.
This PR was generated by Mend Renovate. View the repository job log.