UNPKG

react-sketch-canvas

Version:

react-sketch-canvas - Freehand vector drawing tool for React using SVG as canvas

434 lines (280 loc) 12.7 kB
# Changelog ## 8.0.0 ### Major Changes - c3ce015: v8 release — modernized internals, new stroke-eraser mode, hi-DPI export, and a large pointer/rendering fix sweep. ### Breaking changes - Rewrote the package as a layered architecture: `ReactSketchCanvas` (stateful) is now built on top of a new low-level `Canvas` component you can use directly for custom state/history. - Default raster `exportImage()` size now matches the rendered SVG dimensions and scales by `window.devicePixelRatio` for crisp hi-DPI output. Passing explicit `width`/`height` opts out of DPR scaling (caller owns the pixel count). - Export functions (`exportImage`, `exportSvg`) now reject with descriptive errors instead of silently failing. - New `touchAction` prop changes default touch behavior: touch-drawing modes still default to `"none"`, but pen/mouse-only canvases now allow native pan/pinch. - Dropped Cypress; tests are now Vitest + Playwright (CT + E2E). - Bumped `engines.node` to `>=22.13.0`. ### Features - **Stroke eraser mode** — new `eraserMode: "mask" | "stroke"` prop (fixes #200). - **`readOnly` prop** to disable drawing. - **`viewBox` prop** to fix blank-space rendering. - **`touchAction` prop** so parent containers can scroll while drawing still works. - **Customizable export size** via `ExportImageOptions`. - Windows Surface pen barrel-button can be used as an eraser. - New React Router + Fumadocs documentation site with LLM-friendly text endpoints. ### Fixes Pointer & touch (#205, #213): - #192 — iPad/Apple Pencil blue selection highlight during drawing - #181 — `onChange` doubling up strokes - #180 — double-tap needed for buttons after drawing - #146 — two-finger horizontal scroll on mobile - #128 — allow parent element to scroll with touch - #208 — multi-touch / parent-container gesture handling Rendering & geometry (#206): - #127 — slow performance with heavy strokes - #126 — vector glitches while drawing - #121 — stroke artifacts from duplicate points - #114 — viewBox not set when paths are loaded Export (#203, #213): - #105 — `exportWithBackgroundImage={false}` with data-URI backgrounds - #137 — broken background image in canvas exports - #145 — blurry exported PNG edges (now DPR-aware, #207) - #153 — exported image background always transparent - #155 — custom background images not exporting correctly - #179 — `exportImage()` / `exportSvg()` failing with "Export function called before canvas loaded" SVG / Firefox compatibility (#199, #204): - #142 — eraser trace persisting after SVG export + clear - #177 — multiple canvases sharing/cross-referencing masks - #194 — Firefox eraser mask rendering - partially addresses #54 and #141 (Firefox stroke rendering) ### Known follow-ups Some milestone issues were only partially resolved in v8 and have been split into new tracking issues. - 4361d6c: - Add option to use Windows surface pen button as eraser - Memoize functions to reduce re-rendering ### Patch Changes - 98200c3: - Add option to disable canvas (readOnly prop) - Remove cypress tests - Add playwright component tests - 90ddaa0: Fix undo/redo behavior: - Fix timing issues by moving history update logic into mouse-down/redo/undo/clear functions - Prevent extra strokes from being recorded during history updates - Fix bug where canvas couldn't undo to empty state - Improve loadPath function to properly handle history state - Add proper history handling when using loadPaths - Fix reset canvas history logic - Implement event queue for undo/redo operations - Fix order of operations in history management - Add tests for undo behavior after clear and with loadPaths - 70d45ed: Fix blank white space bug by allowing developers to set viewBox - 77dd734: Fix: remove invalid mask attribute from stroke groups without eraser - f85461f: Add xlinkHref fallback for SVG mask `<use>` references to improve Firefox compatibility - 4daea40: - Add option to customize export image size - Upgrade packages - 549e8ed: Fix unused eraser masks - firefox and random gaps ## 7.0.0-next.8 ### Major Changes - c3ce015: v8 release — modernized internals, new stroke-eraser mode, hi-DPI export, and a large pointer/rendering fix sweep. ### Breaking changes - Rewrote the package as a layered architecture: `ReactSketchCanvas` (stateful) is now built on top of a new low-level `Canvas` component you can use directly for custom state/history. - Default raster `exportImage()` size now matches the rendered SVG dimensions and scales by `window.devicePixelRatio` for crisp hi-DPI output. Passing explicit `width`/`height` opts out of DPR scaling (caller owns the pixel count). - Export functions (`exportImage`, `exportSvg`) now reject with descriptive errors instead of silently failing. - New `touchAction` prop changes default touch behavior: touch-drawing modes still default to `"none"`, but pen/mouse-only canvases now allow native pan/pinch. - Dropped Cypress; tests are now Vitest + Playwright (CT + E2E). - Bumped `engines.node` to `>=22.13.0`. ### Features - **Stroke eraser mode** — new `eraserMode: "mask" | "stroke"` prop (fixes #200). - **`readOnly` prop** to disable drawing. - **`viewBox` prop** to fix blank-space rendering. - **`touchAction` prop** so parent containers can scroll while drawing still works. - **Customizable export size** via `ExportImageOptions`. - Windows Surface pen barrel-button can be used as an eraser. - New React Router + Fumadocs documentation site with LLM-friendly text endpoints. ### Fixes Pointer & touch (#205, #213): - #192 — iPad/Apple Pencil blue selection highlight during drawing - #181 — `onChange` doubling up strokes - #180 — double-tap needed for buttons after drawing - #146 — two-finger horizontal scroll on mobile - #128 — allow parent element to scroll with touch - #208 — multi-touch / parent-container gesture handling Rendering & geometry (#206): - #127 — slow performance with heavy strokes - #126 — vector glitches while drawing - #121 — stroke artifacts from duplicate points - #114 — viewBox not set when paths are loaded Export (#203, #213): - #105 — `exportWithBackgroundImage={false}` with data-URI backgrounds - #137 — broken background image in canvas exports - #145 — blurry exported PNG edges (now DPR-aware, #207) - #153 — exported image background always transparent - #155 — custom background images not exporting correctly - #179 — `exportImage()` / `exportSvg()` failing with "Export function called before canvas loaded" SVG / Firefox compatibility (#199, #204): - #142 — eraser trace persisting after SVG export + clear - #177 — multiple canvases sharing/cross-referencing masks - #194 — Firefox eraser mask rendering - partially addresses #54 and #141 (Firefox stroke rendering) ### Known follow-ups Some milestone issues were only partially resolved in v8 and have been split into new tracking issues. ## 7.0.0-next.7 ### Patch Changes - Add xlinkHref fallback for SVG mask `<use>` references to improve Firefox compatibility ## 7.0.0-next.6 ### Patch Changes - Fix: remove invalid mask attribute from stroke groups without eraser ## 7.0.0-next.5 ### Patch Changes - Fix undo/redo behavior: - Fix timing issues by moving history update logic into mouse-down/redo/undo/clear functions - Prevent extra strokes from being recorded during history updates - Fix bug where canvas couldn't undo to empty state - Improve loadPath function to properly handle history state - Add proper history handling when using loadPaths - Fix reset canvas history logic - Implement event queue for undo/redo operations - Fix order of operations in history management - Add tests for undo behavior after clear and with loadPaths ## 7.0.0-next.4 ### Patch Changes - Add option to disable canvas (readOnly prop) - Remove cypress tests - Add playwright component tests ## 7.0.0-next.3 ### Patch Changes - Add option to customize export image size - Upgrade packages ## 7.0.0-next.2 ### Patch Changes - Fix blank white space bug by allowing developers to set viewBox ## 7.0.0-next.1 ### Patch Changes - Fix unused eraser masks - firefox and random gaps ## 7.0.0-next.0 ### Major Changes - - Add option to use Windows surface pen button as eraser - Memoize functions to reduce re-rendering # [6.1.0] ### Added - Added optional id props to uniquely identify a sketch canvas - Upgraded dependencies ### Changed - Updated tests to use the id props ### Fixed - Fix multiple ReactSketchCanvas in one page causes issues due to id="background" #52 - Fix ReactSketchCanvas doesn't work on safari. #53 ## [6.0.3] ### Fixed - Fix Package cannot be installed via npm #51 - update contributing.md - update github actions ## [6.0.2] ### Added - Added cypress tests for all props and events - Added `onStroke` prop to get last stroke on pointer up - Adds a point on click (without moving) #45 ### Changed - Upgraded all dependencies - Moved to DTS (tsdx fork) instead of nx - Switched codebase to hook based implementation (support react >= 16.8) - Removed immer dependency ### Fixed - Changed React import to \* from React #40 - Export image fails when the background is not an image [beta] #46 - Fix partial transparent erase (eraser stroke color changed to black for masking, add maskUnits) #44 ### Breaking changes - Renamed `onUpdate` to `onChange` ## [6.0.1-beta] ### Added - Upgraded all dependencies - Updated directory structure - Added background image rendering directly in SVG - Added option to export background image while exporting the canvas as image or SVG - Added background image aspect ratio control - Updated erase option to use mask instead of canvas color - Add github action for deployment of storybook and package ### Breaking changes - Removed background option to set background image using CSS-in-JS (instead check feature-filled backgroundImage prop) ## [5.3.5] ## Changed - Changed import react as `import * as React from 'react'` ## [5.3.4] ### Added - Switched to Nx - Updated documentation ### Changed - Removed pepjs. Can be polyfilled by the web app directly instead ## [5.3.3] ### Fixed - add support any version above react 16.4 ## [5.3.2] ### Fixed - Bump dependency versions ## [5.3.1] ### Fixed - Set default value of `allowOnlyPointerType` as `'all'` again ## [5.3.0] ### Added - Reset canvas option to reset internal state and clean undo/redo stack ### Fixed - Fix exportImage function to export png in Firefox and Safari ## [5.2.0] ### Added - Add `withTimestamp` prop and `getSketchingTime` function to measure the sketching time of the user ## [5.1.2] & [5.1.1] (Both are same - Sorry) ### Added - Add index.d.ts to npm registry - Add Github as registry - Update example ## [5.1.0] ### Added - Added defaultProps to onUpdate in ReactSketchCanvas - Added touch-action="none" to allow pepjs polyfill pointer events - Update README.md ### Fixed - Removed the annoying console.log from Canvas ## [5.0.1] ### Added Added README :) ## [5.0.0] ### Added - Rewrote codebase in typescript - Added pepjs to support more browsers - Added onUpdate feature to get current paths in `CanvasPath` type ### Fixed - Fixed sketch offset issue when the canvas is scrolled ### Changed - Updated undo/redo/reset strategy - Updated demo in storybook ## [4.0.0] ### Added - Renamed SvgSketchCanvas to ReactSketchCanvas to keep naming convention - Added className property to set class names for CSS selectors ### Deprecated - Removed SvgSketchCanvas ## [3.0.1] ### Changed - Moved immutable dependency from Canvas file ## [3.0.0] ### Changed Removed onUpdate feature and made the system modular ### Added - Made Canvas as a separate module. Now event handlers can be hooked with Canvas class to update paths from server. (For Collaboration use case) ### Deprecated - Removed onUpdate feature and instead made Canvas module ## [2.3.0] ### Added - Added onUpdate property to get the current sketch paths after every update ## [2.2.0] allowOnlyPointerType ### Added - Added "allowOnlyPointerType" use-case. Now single pointer type can be targetted ## [2.1.0] ### Added - Switched to pointer events ## [2.0.1] ### Added - Add SVG background using CSS ## [2.0.0] ### Added - Export and load paths - Erase mode and eraser width ### Changed - Rename exportAsImage() to exportImage() for naming consistency ### Deprecated - Rename exportAsImage()