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)