10.4.0

konvajs/konva10.4.0Sep 7, 2026by github-actions[bot]

Full Release Notes

## Features
- destroy event; Transformer, Tween, pointer captures and stage timers release destroyed nodes ([Anton Lavrevov](https://github.com/konvajs/konva/commit/a2d52e3b610b75505dad8b4160265a14c119e180))

## Bug Fixes
- size the buffer canvas of cache() and toCanvas() to the target, allocate it lazily and release it ([Anton Lavrevov](https://github.com/konvajs/konva/commit/17dc2920775545ed746620068681d5d6fc8beff7))
- memoize isCSSFiltersSupported() and release its probe canvas ([Anton Lavrevov](https://github.com/konvajs/konva/commit/b48b09bba64bc73d92fbe30e65202f44d2023f9a))
- stop the frame interval of a Sprite on destroy() ([Anton Lavrevov](https://github.com/konvajs/konva/commit/2e3248d36171f954ccefbbe83cbbd6605c7aacb6))
- keep descendant caches on clearCache() and release the previous canvases on re-cache ([Anton Lavrevov](https://github.com/konvajs/konva/commit/0a8d3c9cff0fcdc36f624b419c819be73841da68))
- setAbsolutePosition() under a zero-scale ancestor no longer writes NaN ([Anton Lavrevov](https://github.com/konvajs/konva/commit/2cb015b1232810d25a9baf741cf20385a669fc65))
- negative radius and cornerRadius no longer throw and blank the layer ([Anton Lavrevov](https://github.com/konvajs/konva/commit/806dbeca0b60e0a098c7956695799198001ed933))
- batchDraw() no longer freezes the layer after a throwing draw ([Anton Lavrevov](https://github.com/konvajs/konva/commit/28fc8da169beef7fe25411d36af9263a7d4db94d))
- Blur keeps the colour of semi-transparent pixels and survives large radii ([Anton Lavrevov](https://github.com/konvajs/konva/commit/a17f4b011ffd341dbc327926f3b59acaeac24e64))
- Tween ownership bookkeeping ([Anton Lavrevov](https://github.com/konvajs/konva/commit/ce0f615456e1a72dfdda022b97bbf3879455ec60))
- clamp a negative cornerRadius in drawRoundedRectPath ([Anton Lavrevov](https://github.com/konvajs/konva/commit/666039819f11b46ccb5f5b7ccc62a52eea635295))
- hasShadow() follows shadowOffsetX and shadowOffsetY changes ([Anton Lavrevov](https://github.com/konvajs/konva/commit/383e485222cd6de6bcb04e461ef0519df92de936))
- cache() and transform batching clean up after a throw ([Anton Lavrevov](https://github.com/konvajs/konva/commit/fddd0af3c009cfec88000be160ec068717074f5c))
- split text into graphemes with Intl.Segmenter ([Anton Lavrevov](https://github.com/konvajs/konva/commit/2dbb0ae38d991e3cfaa783cb34531cb97642e585))
- toObject() copies attributes instead of mutating them, accepts frozen values and skips methods named like custom attributes ([Anton Lavrevov](https://github.com/konvajs/konva/commit/b53bd4ba7da37d4b69936a34a087026a5334b6d5))
- drawHitFromCache() honours hitCanvasPixelRatio ([Anton Lavrevov](https://github.com/konvajs/konva/commit/8fae0e4c445f361894d145257b9d4c025c7c4677))
- Path arc bounds, SVGO arc flags, empty data, and segment-relative getPointAtLength ([Anton Lavrevov](https://github.com/konvajs/konva/commit/e08b3cf74d8a615d0353572ab7e8a0124bb6dc22))
- Transformer follows the grabbing pointer, guards zero-size boxes, and resolves its anchors directly ([Anton Lavrevov](https://github.com/konvajs/konva/commit/b5826cfc865e12cf050e3cb1a182dcddf6130eb6))
- Tween of component attributes, of array attributes the node lacks, and to() no longer mutates its params ([Anton Lavrevov](https://github.com/konvajs/konva/commit/4811e6c0f22bbf2feae9ae8fa3eb701e35c1b0d0))
- absolute getters and derived caches of nodes under a cached container, fire(type, null), non-finite child rects ([Anton Lavrevov](https://github.com/konvajs/konva/commit/211d6d264fcc8c2e841b228cbbad544204659aae))
- Canvas size equals the truncated bitmap at a fractional pixel ratio and keeps its logical size; setSizeIfChanged() with NaN ([Anton Lavrevov](https://github.com/konvajs/konva/commit/813165966194e6a5994cce7da3e2e8958f943849))
- drag with several pointers releases only the lifted pointer; startDrag() without an event ends on release ([Anton Lavrevov](https://github.com/konvajs/konva/commit/936ebbc06b8367931d63b49e08fadec3b912dfdf))
- Transformer suppresses the hit graph of its own layers only (gate moved to Layer.shouldDrawHit), forwards getClientRect(config), honours top in getAbsoluteTransform() ([Anton Lavrevov](https://github.com/konvajs/konva/commit/1b9d180a2c7676a54b3455bd2bb0745501f28251))
- RegularPolygon without sides, Sprite getSelfRect() and guards for a missing animation or frame ([Anton Lavrevov](https://github.com/konvajs/konva/commit/be19dcb4dbc22e77fe64d096cb75bbf9aed8be0a))
- report a non-finite number at the core aggregation points instead of silently drawing nothing ([Anton Lavrevov](https://github.com/konvajs/konva/commit/c5ad7a4bbf1936dbc13cda55cf974c04b8640b82))
- Tag.getSelfRect() grows by exactly the pointer for a left or right pointer ([Anton Lavrevov](https://github.com/konvajs/konva/commit/6f86a4df99704111dcadfd71557c3aafa99d9989))
- eleven one-line bugs ([Anton Lavrevov](https://github.com/konvajs/konva/commit/09e5be2ede17013edf232bd9523a8be60272165c))
- layer.size() no longer resizes the layer canvas; getChildren() returns a copy ([Anton Lavrevov](https://github.com/konvajs/konva/commit/dc6e27375b8cbc4d582485a2a1e147ad63d3a25e))
- review follow-ups for the polishing batch ([Anton Lavrevov](https://github.com/konvajs/konva/commit/3528a09316aa8b8403b1fb3445f4cca62316010f))
- Transformer follows node changes made between pointer moves of a resize ([Anton Lavrevov](https://github.com/konvajs/konva/commit/5df8e1d712597cab8398d428c4cac6cf43bee797))

## Documentation
- JSDoc that contradicted the code, wrong names and types, examples that did not run ([Anton Lavrevov](https://github.com/konvajs/konva/commit/79315b8839b71049ab7b26f079ce79bc25846ef9))
- rewrite the unreleased changelog in the usual short style ([Anton Lavrevov](https://github.com/konvajs/konva/commit/1bf7d1b0fede05f399b667cf7b5044ec25703d7d))

## Performance Improvements
- keep a running grapheme index for charRenderFunc instead of recounting previous lines per character ([Anton Lavrevov](https://github.com/konvajs/konva/commit/05aa96269b21a998633cef8b0ead945f8caad5f0))
- upload filter chain result once and stop reallocating the filter canvas ([Anton Lavrevov](https://github.com/konvajs/konva/commit/3fafb937ee2caaae1d8d734f3968a1c063f46de2))
- release the per-layer canvases of a stage export and skip the client rect when the box is given ([Anton Lavrevov](https://github.com/konvajs/konva/commit/f6fff561e925a19fd48519f7d600df982a506e0e))
- resize a canvas in one pass ([Anton Lavrevov](https://github.com/konvajs/konva/commit/3e0d2169e4f83a934c61c436345aba1ded55f864))
- drop the two Maps every node allocated ([Anton Lavrevov](https://github.com/konvajs/konva/commit/65f8c1f79cac34c9d1cc0b10f1cfbce2d7d9dd7a))
- wrap fixed-width text in linear time ([Anton Lavrevov](https://github.com/konvajs/konva/commit/dcc11168e3134f384936f22166350ebdf2c0c0e2))
- resolve edge pixels of the hit graph directly and bound the search ([Anton Lavrevov](https://github.com/konvajs/konva/commit/bd0f7717648585c2ff7c301230cae46f6b4da580))
- relayout listeners of Text and TextPath on the prototype, listener cache keyed by class ([Anton Lavrevov](https://github.com/konvajs/konva/commit/9dadca6730ccdd385050c0c5ad543132fbbdff7e))
- getClientRect() no longer scans the subtree at every nesting level ([Anton Lavrevov](https://github.com/konvajs/konva/commit/b393f49f8cec7f0d160ef9501b9d0a37b86d2e2f))
- drag reads pointer positions once per stage, skips the redraw on a plain click, and resets the drag position per drag ([Anton Lavrevov](https://github.com/konvajs/konva/commit/a9bb13371dfcda1d39eea5def6cedba43a861e32))
- hoisted component getter names, single-array Transform, direct drawImage, hoisted TypedArray ([Anton Lavrevov](https://github.com/konvajs/konva/commit/81ff04d951e172934967849dc91e3fe31107b6b4))
- Animation keeps its running animations in a Set; an animation stopping itself no longer skips the next one; setLayers() copies its argument ([Anton Lavrevov](https://github.com/konvajs/konva/commit/b2bd6b0033d8249751617af98a6fb51a4b998bda))

## Tests
- hygiene ([Anton Lavrevov](https://github.com/konvajs/konva/commit/7e031bc216e732de827a6c548247eb60233cb03a))

## Builds
- keep JSDoc in the published .d.ts files ([Anton Lavrevov](https://github.com/konvajs/konva/commit/6a593acf3db70b1db23edec9cd4a9acd71debe0c))
- size budget of 48 KB, CI runs size, import and type checks on Node 22 ([Anton Lavrevov](https://github.com/konvajs/konva/commit/bfff52861eb71ff098b8dfb0c2a3a20811f3235a))
- release script runs the tests, drops the empty cdn-link commit and the hard-coded directory ([Anton Lavrevov](https://github.com/konvajs/konva/commit/f1fd0d2641ab906a31c3ef1d7473ea9dc6a9ae92))
- named exports and prepublishOnly ([Anton Lavrevov](https://github.com/konvajs/konva/commit/ce1d1ab11a783899196031637f968abf27022448))
- drop the named exports and the separate UMD entry ([Anton Lavrevov](https://github.com/konvajs/konva/commit/7af9127f7ebf89c663c881d32dd9d6baec5a6754))

## Chores
- remove dead Node internals and hoist the non-bubbling event list ([Anton Lavrevov](https://github.com/konvajs/konva/commit/af8326ced2fe87d1c7e078cbcb0dcd512e2eaf8d))
- build the browser tests from a clean Parcel cache ([Anton Lavrevov](https://github.com/konvajs/konva/commit/05a45385118e5cd09e00b440ff93fe7f65b805d4))
- drop the unregistered fillLinearRadial* declarations, build ellipses with context.ellipse() ([Anton Lavrevov](https://github.com/konvajs/konva/commit/adc74d698bf8ef435700317c9a034b11321e8c1b))
- remove dead code (hit fill/stroke duplicates, lineDash fallbacks, trace branch, unused globals, addDeprecatedGetterSetter) ([Anton Lavrevov](https://github.com/konvajs/konva/commit/4f583493ba76221960ad39a5d0da20c6e30a5e5f))
- red/green/blue registered once with the shared component validator, alpha uses afterSetFilter ([Anton Lavrevov](https://github.com/konvajs/konva/commit/e7d64c650d320d012170b67c71ca5849168f9c10))
- remove dead code; cloneObject() copies nested arrays and typed arrays; shadow probe releases its canvas ([Anton Lavrevov](https://github.com/konvajs/konva/commit/9889947be3a40cedb40f4874faa15090e59dd343))
- resolve every TODO comment in src and tests ([Anton Lavrevov](https://github.com/konvajs/konva/commit/b71ed5fb215361c0e71c24d941c57ebc8b04f2e0))
- remove dead code, dead files and unused devDependencies ([Anton Lavrevov](https://github.com/konvajs/konva/commit/b1d0c10f53f461053f2f5b60743adf7cefdf9411))

## Commits
- ad94d9d: update CHANGELOG (Anton Lavrevov)
- f142b6e: update CHANGELOG (Anton Lavrevov)
- 7ee3232: update CHANGELOG (Anton Lavrevov)
- c9f3830: update CHANGELOG (Anton Lavrevov)
- 0f88c28: update CHANGELOG (Anton Lavrevov)
- declarations that contradicted the runtime or the docs ([Anton Lavrevov](https://github.com/konvajs/konva/commit/1277b84076e4c128f8d3f2d8692138ec4a96d34d))
- ac581a4: update CHANGELOG with new version (Anton Lavrevov)
- e51c16d: build for 10.4.0 (Anton Lavrevov)