Skip to content

Changelog ​

All notable changes to this project will be documented in this file. Each commit updates this file and the package version (semver).

8.4.0 (2026-11-02) ​

Features ​

  • plugins: addShapeType({ name, label, icon }) gives the type of the shapes of a plugin: the layers panel and screen readers name them by their type in the language of the drawer, with its icon in the layers panel (before: the name of the shape of the library, "Group" or "Path", or a label attribute in one language, taken for a name given by the user)
  • plugins: path shapes of plugins (a PathShapeWidget with its own shapeName and path) behave as the path shapes of the library: background color, dashed and dotted strokes, a text written inside, arrows linked to their outline, a click inside selects them, named "Shape" without type; also in a drawer without the plugin (named shapeName.pathShape too)

8.3.1 (2026-10-30) ​

Performance Improvements ​

  • big drawings: shapes with texts and arrows are looked up once per operation instead of once per shape, the texts of a big selection are placed with one measure of the selection box, and a drag moves only the texts and arrows of the dragged shapes (the rest of the drawing is placed once dropped): with 1000 notes, a change takes 24 ms instead of 66 ms, selecting everything 90 ms instead of 380 ms, a move of a drag 4 ms instead of 60 ms, duplicating everything 0.3 s instead of 4 s

Bug Fixes ​

  • collaboration: the first change of a session is kept over the changes of others received before the server acknowledged it, as the next ones (the server tells it acknowledges changes when the user joins; it was protected only after a first acknowledgement)

8.3.0 (2026-10-30) ​

Features ​

  • options: followWindow option: a drawer of the size of the window when it is created follows the window by default; false for a drawer sized by its app (given by the components of React and Vue and the web component), true for a drawer following the window whatever its first size
  • types: types reachable from the public API are exported: Replay, SpacePan, ReplayStep, GridStyle, WheelAction, FreehandSettings, ShapeMerge, DropdownEventMap, ToastEventMap, EmitterListener, EventArgs, EventName, and the texts and languages of the library as types (typeof en, typeof languages); the build checks that index.d.ts declares no type it does not export

Bug Fixes ​

  • ssr: the library can be imported on a server (server rendering of Next.js, Nuxt, Astro...): the size of the window is read when a drawer is created, no longer when the library is loaded (window is not defined)

8.2.5 (2026-10-30) ​

Bug Fixes ​

  • touch: a pinch with the text or note tool no longer adds a text or a note for each finger (taps of the fingers of a two finger gesture ignored, also their double tap); a text edited while another one is ends the edit of the first one (one field at a time, no hidden empty text left)
  • text: the field of a text being edited has an accessible name (Text, or Name for the title of a frame); Tab validates the edit (shortcuts of the drawer were disabled after it), Ctrl / Cmd + S validates it and saves the drawing instead of saving the page
  • snapping: turning snapping on or off is no longer a change of the drawing (it marked it unsaved, saved the drawing of an app, cut a drag in progress in history), nothing done when unchanged; turned off during a drag, its guides are removed and the next drag finds its own guides
  • menus: the settings menu and the panel of a collaboration session close on a tap or a stroke on the canvas; keys typed in the settings menu, the context menu and the library panel no longer run shortcuts of the drawer (Delete removed the selection, letters changed the tool)
  • layers: a shape moved in the layers panel (handle, Alt + Up / Down) moves with its text, its text above it (it stayed under a note or a filled shape)
  • keyboard: Space on a button of the drawer reached with the keyboard presses it, also with the pointer on the canvas (it moved the view); a tool chosen again (shortcut, button) keeps the selection
  • replay: destroy stops a replay playing (its animation frames ran until its end)

8.2.4 (2026-10-30) ​

Bug Fixes ​

  • persistence: a drawing saved in the browser while Space was held (moving the view) is loaded again with its shapes selectable and erasable, the view no longer moved by drags of the tools
  • storage: changes made while the drawing of the storage option loads (drawing loaded again, slow download) are kept over the loaded drawing, as one change, instead of being dropped; a loaded drawing replaces the drawing once the stroke or text edit in progress ended (the shape being drawn was removed). Changes of a drawing loaded while the save of the previous one ran are saved once it ends (they stayed unsaved)
  • export: exported SVG files no longer hold characters XML forbids (line breaks of Word or PowerPoint, other controls, lone surrogates): such files could not be opened, previews of the library were broken. A pasted text takes the line breaks of Windows, Word and PowerPoint as lines
  • images: SVG images of drawings of other apps are added once the stroke or text edit in progress ended (shapes being erased were recorded faded)
  • links: opening a link, joining or leaving a room keep the state of the history of the page (routers of apps, React Router, Next.js, keep theirs there): it was replaced by null

8.2.3 (2026-10-30) ​

Bug Fixes ​

  • collaboration: previews of shapes being drawn and shapes discarded (simple click) are no longer sent while joining a room again, before its drawing is merged: they made a room without drawing (last user gone, server restarted) look kept, and users joining meanwhile lost every shape it knew. A room holding previews only is taken as without drawing
  • collaboration: a change refused by the server (drawing too big, right to draw removed meanwhile) no longer keeps the version of this user over the changes of others set aside for it: they are applied (the version of the room), and later changes of others to its shapes too (they were ignored until it could be sent, then overwritten by it)
  • collaboration: a change received while shapes are dragged or transformed no longer cuts the move in two changes of history (undo stopped halfway) nor sends the shapes in the middle of the move: it is shown at once, recorded with the move once dropped
  • collaboration: a change dropped by the server beyond its rate of messages (servers of this version refuse it in its acknowledgement) is sent again after a second, the changes of others set aside for it applied, instead of being taken for applied

8.2.2 (2026-10-30) ​

Bug Fixes ​

  • security: the color of the heads of an arrow is escaped in exported SVG files: a drawing file, a link or a shape of another user of a collaboration session could put markup (a script) in them through it. Colors of shapes read from files, links and other users (fill, stroke, shadowColor) are also refused with characters of markup or beyond 100 characters
  • security: links and images holding a drawing (#drawing= links, exported PNG and SVG files) are decompressed by chunks up to 50 MB: a short crafted link inflating to gigabytes crashed the tab. Beyond, the drawing is refused with a new error text (error.drawingTooBig)

8.2.1 (2026-10-30) ​

Bug Fixes ​

  • collaboration: a frame or a group changed by two users at the same time keeps the changes of both. Shapes another user drew in a frame while this user drew in it, moved one of its shapes or changed it while disconnected are no longer removed for everyone (since 8.2.0, before it the two users could keep different versions); shapes of a group changed by each user keep the change of each one
  • texts: a pasted text is as wide as its longest line in the font of the library: its lines no longer wrap (measured with a fallback font since 8.2.0)

8.2.0 (2026-10-29) ​

Features ​

  • a11y: forced colors mode (Windows high contrast): color swatches keep their colors (the selected one in a ring of the highlight color of the system), the current tool, pressed buttons, the command chosen in the command palette and the selected rows of the layers panel take the highlight colors of the system (they looked like the others)

Bug Fixes ​

  • collaboration: two users changing one shape at the same time (within the time a message takes to reach the server and come back) no longer keep different versions: everyone keeps the one the server applied last. A change of another user is not applied to a shape whose change the server has not acknowledged yet, nor to a shape being moved here (or a text being typed), whose change is sent after it
  • texts: the font of the library is named free-drawing-ubuntu in its style sheet: a page using its own Ubuntu font (installed, or of its style sheet) keeps its bold and italic faces (it got the regular face of the library only). Texts keep Ubuntu as font family in drawings, drawn with the font of the library (exported SVG files name it before Ubuntu)

8.1.4 (2026-10-29) ​

Bug Fixes ​

  • a11y: collaboration dialog: the focus goes to the link of the session once "Start" is pressed, back to "Start" once the session is stopped (it fell to the page behind the dialog)
  • a11y: library panel: the focus never goes to a disabled button (last item removed with nothing selected, insertion disabled in read only, add button disabled with the focus)
  • a11y: layers panel: an action of a row disabled with the focus (read only started) gives the focus to the name of its row
  • tools: options panels of tools scroll in a short drawer: their sections no longer go out of the panel, under the toolbar

8.1.3 (2026-10-29) ​

Bug Fixes ​

  • texts: the text of a flipped shape is no longer upside down, nor mirrored in a flipped group
  • texts: an existing text emptied and validated is removed as a change (saved, in history, shared at once)
  • frames: the text of a shape enters or leaves a frame with its shape, above it (typing in a shape over a frame, frame drawn or resized around the text only, align, distribute and stack): no longer hidden under its shape or cut by another frame
  • layers: hiding or locking a shape hides or locks its text too (and a text its shape)
  • slideshow: the slideshow and the replay stopped after read only started leave the pan tool active (none before), the tool of the user before them comes back once read only ends (not the laser of the slideshow)

8.1.2 (2026-10-29) ​

Bug Fixes ​

  • persistence: a shape named like a layer of the drawer (selection, draw...) no longer prevents the drawer from being created again from its save: layers are found among the children of the stage, parts of frames among the children of their frame; files, links and changes of other users drop the names of the drawer and the names of other kinds of shapes (a rectangle named as a text)
  • persistence: saves of previous versions get unique ids, short enough for collaboration servers, as drawing files (links of texts and arrows follow a long id)
  • history: undo and redo of a change in a group or a frame keep the changes of other users (collaboration, other tabs) made in it since: shapes they added stay, shapes they took out are not put back (no copy)
  • persistence: the drawing saved by another tab during a stroke or a text edit is shown once it ends, unless this tab changed the drawing meanwhile (the stroke or the text is no longer lost)
  • persistence: a save of the storage option still running when another drawing is loaded (loadFromStorage) no longer saves the changes made meanwhile into the new drawing of the app
  • shapes: addShape of a copy (group with texts of shapes or linked arrows) links its texts and arrows to its own shapes, not to the originals
  • shapes: a shape of a group or frame with offsets copied alone (duplicate, library, drawing of a selection) keeps its place
  • images: an image pasted or inserted is added once a stroke or a text edit started meanwhile ends (the stroke is no longer cancelled, the text no longer saved hidden), not once read only started meanwhile

8.1.1 (2026-10-29) ​

Bug Fixes ​

  • collaboration: changes sent while the connection was lost unseen (until socket.io notices it) are sent again once joined: the servers acknowledge each change, so shapes drawn meanwhile are no longer removed nor changes reverted by the drawing of the room (servers of previous versions acknowledge none: changes of the last minute are sent again)
  • collaboration: the removal of a shape is sent even when a stacking order of another user is received before it (encrypted rooms, viewer allowed to draw again): the shape no longer stays for everyone
  • collaboration: changes of other users received during a drawing, erasing or selection are applied once the tool finished it: erased shapes are recorded as they were (undo no longer gives them back faded), the click of a shape tool sends no empty shape, an arrow is recorded once linked and a frame once filled
  • collaboration: the preview of a shape cancelled while disconnected is removed from the room once joined again (it came back for everyone)
  • collaboration: a user in several tabs is one member of the session (one row, counted once)

8.1.0 (2026-10-29) ​

Features ​

  • tools: Escape cancels the shape, stroke, erasing or selection rectangle being drawn (pointer still pressed): nothing kept, the tool stays active (shown in help)
  • view: a drag with the middle button moves the view whatever the tool, without the autoscroll of the browser (tools ignore the middle button; shown in help)
  • persistence: tabs of the same drawing (same localStorageKey, without storage option) follow each other: a drawing saved by a tab is shown in the others (not over changes they have not saved yet, nor during a collaboration session; not undone there), with its images and the library, so a tab no longer saves an older drawing or library over the other one
  • persistence: "Clear stored data" removes what the drawer keeps in the browser (drawing, images, tool, library, preferences, drawings known by collaboration rooms; identity in collaboration sessions kept), empties the drawing shown (unless read only or during a collaboration session) and confirms it with a message; not offered with the storage option

Performance Improvements ​

  • selection: dragging a big selection finds the snapping guides once per drag and updates links, texts of shapes, frames and the live view of collaborators once per move of the pointer, not once per selected shape (links now follow from the first move)
  • history: each change serializes the drawing once for the history and the collaboration
  • images: files of images no longer used by the drawing nor by its history are forgotten when another drawing is opened (loadDrawing, loadFromStorage)

Bug Fixes ​

  • search: results follow the reading order (rows, as keyboard navigation and slides), not the exact top of each text

8.0.6 (2026-10-28) ​

Bug Fixes ​

  • read only: setReadOnly of the app is kept when a collaboration session gives the right to draw, and a viewer of a session stays read only when the app turns read only off (options.readOnly follows setReadOnly)

8.0.5 (2026-10-28) ​

Bug Fixes ​

  • a11y: arrow keys on a button of the drawer (swatch, zoom, undo, rows of the layers panel) no longer move the selected shapes, they move it from the drawing; a press on the canvas takes the focus from a button of the drawer
  • a11y: the focus stays in the drawer when its button is hidden or disabled by its own action (undo and redo at the end of history, lock and group of the selection menu, group of the layers panel, Follow, previous and next of the slideshow and of the search) and when the layers or library panel is hidden with the focus in it (Alt + L, Alt + B, zen mode)
  • a11y: read only without the pan tool: the toolbar is still reached with Tab; Escape ending a composition of an input method no longer closes the dialog; "No results" of the search and "No command found" of the command palette are read
  • a11y: links of shapes opened with the keyboard: "Open link" in the context menu and the command palette (also in read only), Enter on a shape reached with the keyboard in read only
  • layers: Alt + Up / Down no longer reorders shapes in read only
  • help: shortcuts of the layers panel listed only with it
  • i18n: names of the keys of shortcuts in the language of the drawer (Strg, Umschalt, Maj, Échap, Entrée, Mayús, Intro...); requests to draw of the collaboration panel translated when the language changes; one form of address in German and Spanish

8.0.4 (2026-10-28) ​

Bug Fixes ​

  • frames: shapes flipped or turned out of their frame leave it, onto a frame enter it (they stayed in it, cut away); a locked frame no longer takes the shapes drawn, dropped or pasted on it (they were locked too)
  • groups: a shape of a group turned, flipped or scaled is moved by the arrow keys and flipped by Shift + H / V along the axes of the drawing; Ctrl / Cmd + drag on a shape of a group not selected yet drags the shape alone, not the group; a text written in a shape of a group is added to the group (it stayed behind when the group was moved, removed, hidden or locked)
  • align: texts of shapes and labels of arrows selected with their shape are no longer counted as shapes by align, distribute and stack (distribute with 2 shapes and a text, buttons shown for one shape)
  • tools: a tool stopped during its pointer action (read only, right to draw removed) removes what it was drawing, also for other users of a session; read only ends the edit of a text, its previous text kept
  • grid: drags snap to the grid of the drawing: shapes of frames wherever their frame is, frames and groups too
  • text: the field of a text being typed follows the view zoomed or moved meanwhile (wheel, pinch, Space)
  • view: a tool chosen while Space is held keeps moving the view until it is released, then only the pan tool moves it

8.0.3 (2026-10-28) ​

Bug Fixes ​

  • storage: a drawer removed during a save of the storage option no longer saves an empty drawing over the stored one; a load, a link, an image or a collaboration session ending after destroy() does nothing; only the last loadFromStorage started is applied (an app switching drawings quickly no longer gets an outdated drawing saved into the new one)
  • i18n: a locale (language: 'en-US', <free-drawing language="fr-FR">) gives its language and a language not supported the one of the browser: the drawer is created (every text failed); a saved preference such as "constructor" is ignored
  • files: ids of shapes made unique (a copy added by addShape, ids repeated in files and links) and short enough for collaboration servers (200 characters), background colors of files longer than 100 characters replaced: changes of a session are no longer dropped by the server, undo no longer removes another shape
  • export: png, pdf and copied images wait for their images to be decoded (right after a drawing is opened or an image added): no longer blank; the preview of the export dialog is drawn again once they are
  • files: the drawing kept in an export of selected shapes (withDrawing) and library items write shapes of frames and of groups at their place in the drawing, in the order they are drawn
  • plugins: the active tool of a plugin disabled by forceDisabled gives way to the selection tool and is not activated again when read only ends; a plugin whose asynchronous init ends after drawer.destroy() adds no listener, the next plugins are not initialized
  • files: SVG images of Excalidraw and tldraw drawings are read as images of the drawing (they were empty), also shared in a collaboration session
  • history: undo and redo place the texts of shapes too: redo is no longer lost when a text of another user is in a shape moved back

8.0.2 (2026-10-28) ​

Bug Fixes ​

  • collaboration: a page opened again in a room no longer sends its stale copy over the drawing of the room: it waits for the drawing of the room and merges it (changes of other users kept; shapes the room knew in a previous visit of this browser, kept in localStorage, removed when others removed them). A room emptied by its users stays empty after a reconnection, a room which lost its drawing gets it again with its image files
  • collaboration: text typed while another user changes it, its shape or its frame is kept and shared; changes received during a new text cancelled with Escape are applied
  • collaboration: groups and frames changed by other users are updated in place: a text being typed in a frame, a drag of its shapes and a shape of a frame selected are kept
  • collaboration: a change bigger than a message of the server is sent in several messages: a big drawing no longer blocks every later change (a shape or an image file too big alone is not sent until changed)
  • collaboration: changes refused by the server (drawing too big, right to draw removed meanwhile) are sent again later, changes made by a viewer are sent once allowed to draw (servers of this version)
  • collaboration: image files of encrypted rooms sent under the same id each time, files no shape uses released by the server when the drawing would be too big: a room no longer fills up with images and refuses every new shape
  • collaboration: changes received after the drawing of the room during a pointer action or a text edit are no longer reverted by its merge
  • collaboration: after a reconnection, a request to draw is asked again, cursors and lasers of users gone are removed, a presentation stopped meanwhile is no longer followed
  • collaboration: owner keys kept for the 20 rooms used last (not created last); the owner logged in on the server is the owner from another browser
  • collaboration: a double click on "Start" starts one session (a start overtaken by another room closes its connection)

8.0.1 (2026-10-28) ​

Bug Fixes ​

  • collaboration: the secret of the owner of a new room and its id come from crypto.getRandomValues: they were made with Math.random, whose outputs can be found again from the ids of shapes sent to other users
  • collaboration: the id of the user is sent with a secret of their browser (userKey of JOIN, kept in localStorage): the server of this version gives this id to this browser only, a user who saw it in the room or in a link can't take its right to draw any more. A user of the user option joining a room from another browser is a new user of the room there (users logged in on the server are recognized by their account)

8.0.0 (2026-10-28) ​

⚠ BREAKING CHANGES ​

  • toolbar: the heart, cloud, star, hexagon, block arrow, speech bubble, check box and highlighter tools are plugins of the new package @fabwcie/free-drawing-extra-tools (ExtraShapesPlugin, HighlighterPlugin): add them to the plugins option to keep them, they take their place in "More tools"; a drawer asked for one of them without its plugin (widgets option) tells which one to add in the console. Drawings holding their shapes still open, are drawn, selected, styled, exported and shared as before

Features ​

  • plugins: PathShapeWidget (tools of shapes drawn by a path in their box, with pathShapeData and scalePath), FreehandWidget (tools of freehand strokes), ColorPicker and createOverlaySection (options panels of tools) exported for plugins

7.53.0 (2026-10-28) ​

Features ​

  • events: events named without prefix: change, selection.change, readonly.change, options.change, preferences.change... (drawerEvents gives them); names prefixed by drawer. still work, with a warning in console (once)
  • events: events of the drawer typed (DrawerEventMap): in TypeScript an unknown name or a listener of other arguments is an error, listeners get the arguments of their event; plugins and apps add their own events by declaration merging (declare module '@fabwcie/free-drawing' { interface DrawerEventMap { ... } }). Nothing changes in JavaScript; in TypeScript, an event of an app not declared there is now an error

7.52.0 (2026-10-28) ​

Features ​

  • replay: "Replay the drawing" (Alt + Shift + R, menu, context menu, command palette, drawer.replay): its shapes appear again in the order they were created (time of their ids), outlines drawn, strokes traced, texts typed; bar to start again, play / pause, speed up (1×, 2×, 4×) and stop, keys to step; the drawing is not changed (copies shown above it), view and tool given back once stopped (drawer.replay.change)

7.51.0 (2026-10-28) ​

Features ​

  • files: drawings of Excalidraw (.excalidraw) and tldraw (.tldr) opened ("Open...", Ctrl / Cmd + O, drawer.loadDrawing(text)): their rectangles, ellipses, diamonds and other geometric shapes, texts (also of shapes and arrows), notes, lines, arrows (linked to their shapes, curved or elbow, their heads), freehand strokes, highlights, frames, groups and images become shapes of the library, with their colors, strokes, opacity and rotation

7.50.0 (2026-10-28) ​

Features ​

  • snapping: with snapping to objects, moved and resized shapes snap to the center of the view too (wherever it is moved and zoomed), to center a shape on the screen

Bug Fixes ​

  • snapping: guides cross the whole view whatever the zoom (zoomed out they stopped in the middle of it), with the same width and dashes on screen

7.49.0 (2026-10-28) ​

Features ​

  • preferences: a field of the preferences dialog applies at once, to see it behind the dialog (theme, language, zen mode, grid and its style...); Save keeps them, Cancel, Escape or close give back the preferences shown before (also when the drawer is destroyed meanwhile)

7.48.0 (2026-10-28) ​

Features ​

  • view: the mouse wheel zooms around the pointer, Ctrl / Cmd + wheel moves the view up and down, Shift + wheel left and right (wheelAction option and preference, preferences dialog, command palette, setWheelAction: 'pan' moves the view with the wheel and zooms with Ctrl / Cmd + wheel, as before for zooming); a pinch of a trackpad zooms in both, by its small steps (a notch of a mouse wheel by the scaling option)
  • view: Space held, a drag moves the view whatever the tool, the tool and the selection kept (drawer.spacePan)

7.47.0 (2026-10-28) ​

Features ​

  • grid: styles of the grid (preferences dialog, command palette, gridStyle option and preference, setGridStyle): squares, dots, lines of ruled paper or triangles of isometric paper; shapes snap to its crossings, dots, lines (heights) or corners of triangles, and rotate by 30° on isometric paper; zoomed out, its lines stay at least 10 px apart on screen

Bug Fixes ​

  • grid: resize anchors snapped to the lines of the grid of the drawing once the view is moved or zoomed (they snapped to a grid of the screen)

7.46.0 (2026-10-28) ​

Features ​

  • brush: shape recognition ("Recognize shapes": switch of the brush options, preferences dialog, command palette, shapeRecognition option and preference, off by default): a closed stroke becomes a rectangle, an ellipse, a triangle or a diamond, a straight one a line, a straight one with a head an arrow (linked to the shapes at its ends), drawn by the tool of the shape with the style of the options; undo gives back the stroke as drawn; small strokes (letters) and straight strokes of Shift are kept (setShapeRecognition, ShapeWidget.drawShape)

7.45.0 (2026-10-28) ​

Features ​

  • accessibility: keyboard navigation between shapes, the focus on the drawing: Enter selects the first shape, Tab / Shift + Tab the next / previous one in reading order (shapes of the same drawing, frame or group), Enter the shapes of a group or frame or edits the text of a shape, Shift + Enter its group or frame, Escape clears the selection; each shape reached is shown and described to screen readers (name, type, text, shapes inside, linked shapes, link, locked, its number), outlined in read only; keys described with the name of the drawer, in help (drawer.navigation)

7.44.0 (2026-10-28) ​

Features ​

  • plugins: options of a plugin given with its class in the plugins option: plugins: [[StampsPlugin, { max: 20 }]] (PluginEntry type), also for a plugin required by another one (created once, before it); the pluginOptions option is deprecated: no longer among the default options, still read under the options given with the class, with a warning
  • slideshow: slideshow option (default true): false removes the slideshow from the interface (menu, context menu, command palette, help, Alt + Shift + P left to the browser, button of a selected frame), drawer.slideshow.start() still presents the frames

7.43.0 (2026-10-27) ​

Features ​

  • slideshow: a selected frame shows "Present from this frame" in its selection menu, its options panel (actions), the context menu and the command palette; "Present slides" is now "Present frames": the slides are the frames of the drawing

7.42.0 (2026-10-27) ​

Features ​

  • slideshow: frames presented one after the other as slides ("Present slides", Alt + Shift + P, menu, context menu, command palette, drawer.slideshow): reading order of the frames, from the selected one; each slide fills the view, around it masked, the interface hidden but a bar (previous, number and name, next, stop), on the whole screen when the browser allows it; arrows, Page Up / Down, Space, Home / End go from one slide to another, Escape stops; laser as pointer; view, tool and size given back once stopped; drawer.slideshow.change event. In a live session, the owner presents its slides: the other users follow them, alone in their view

7.41.0 (2026-10-26) ​

Features ​

  • collaboration: sessions encrypted end to end: a new room gets a key (AES-GCM) put in the # of its links, never sent to the server; shapes, image files, background, pointers and presented views are encrypted before they are sent, the server keeps and relays them without reading them; a link without the key, or with another one, is refused (proof of the key checked by the server, REJECTED key); the dialog of the session tells whether it is encrypted; collaboration: { encrypt: false } creates rooms in clear, sessions and links of previous versions stay in clear. Needs a secure page (https or localhost)

7.40.0 (2026-10-26) ​

Features ​

  • export: drawing kept in exported PNG and SVG images ("Keep the drawing" of the export dialog, withDrawing option of exportImage): compressed in a tEXt chunk of PNG images, in a <metadata> element of SVG images; such images are opened again for editing like drawing files (drawer.open, Ctrl + O), an image without drawing is refused with its reason

7.39.0 (2026-10-26) ​

Features ​

  • search: search of the texts of the drawing (Ctrl + F, context menu, command palette, also in read only): bar at the top of the drawer, texts found highlighted in reading order (case and accents ignored: texts, texts of shapes and notes, labels of arrows, titles of frames), Enter / Shift + Enter from one to the next with the view moved to it, found again when the drawing changes (drawer.search: show, next, previous, hide, results)

7.38.0 (2026-10-26) ​

Features ​

  • library: library of shapes (library option, header button, Alt + B): the selection saved as an item (header button of the panel, context menu, command palette), inserted again in any drawing by a click (middle of the view) or a drag onto the drawing (new ids, links of its arrows and texts of its shapes kept between them), kept in the browser for the drawings of the drawer, exported and imported as .freedrawinglib files (drawer.library: add, insert, rename, remove, setItems, toFile, import; drawer.library.change event)

Bug Fixes ​

  • types: ArrowHandle (type of drawer.arrowHandle) exported by the entry

7.37.0 (2026-10-26) ​

Features ​

  • styles: copy the style of the selection (Ctrl + Alt + C) and paste it on other shapes (Ctrl + Alt + V), from the context menu and the command palette too: color, background, stroke width and style, corners, path and heads of arrows, text style and opacity, each part on the shapes it applies to, in one step of history (drawer.copyStyle, pasteStyle, copiedStyle)
  • colors: eyedropper of color fields in browsers with the EyeDropper API (Chrome, Edge): a color picked anywhere on the screen, the color of the drawing in dark mode
  • options: the options panel of a selected group shows the style of its shapes; the stroke width and style of a selection come from its first shape with a stroke (not from a note)

7.36.0 (2026-10-26) ​

Features ​

  • shapes: star, hexagon, block arrow, speech bubble and check box tools in "More tools": drawn in the dragged box, background color, stroke style, texts and linked arrows on their outline as the other shapes of the group
  • toolbar: the menu of a group of tools shows 4 tools per line (fewer columns for a smaller group), Up and Down arrows move to the line above or below: on one line, the 12 tools of "More tools" went out of a narrow drawer

7.35.0 (2026-10-26) ​

Features ​

  • notes: sticky notes: note tool (N) of the toolbar, a click adds a square of a light color (chosen in the panel of the tool) and writes in it at once, a click on a note writes in it; notes are rectangles drawn with a shadow (also in exports, dark in dark mode), growing with their text, linked by arrows, colored and resized as rectangles (NoteWidget.addNote)

7.34.0 (2026-10-26) ​

Features ​

  • arrows: curved and elbow arrows: path chosen in the panel of the arrow tool or of selected arrows (arrowType option, drawer.setArrowType); a curve bends on the side the pointer went while drawing it; elbow arrows are horizontal and vertical lines leaving the sides of the shapes they link facing each other, around the shapes (never through them), drawn again when these move
  • arrows: handle of a selected curved or elbow arrow: it bends the curve on either side (bend attribute) or moves the middle segment of the elbow arrow (elbowMid attribute), kept when the shapes move
  • arrows: head of each end of arrows: none, arrow, triangle, dot or bar (arrowheads option, drawer.setArrowheads, startHead / endHead attributes), also in svg exports; arrows of previous versions keep their triangle at the end

7.33.0 (2026-10-26) ​

Features ​

  • texts: texts of shapes: a double click on a rectangle, an ellipse or a path shape (selection tool, also in its empty inside) or a click of the text tool on it writes in it; the text is centered in the shape, as wide as its inside, and follows it when it is moved, resized (letters not scaled) or turned; selected, styled, copied and removed with it (containerId attribute: id of its shape)
  • texts: labels of arrows: written with a double click on an arrow, on its middle, with a halo of the background color cutting the line (also in svg exports); arrows link to the shape of a text, not to the text

Bug Fixes ​

  • texts: a text whose edit ended at once (Enter typed right after it opened) left a listener of presses out of the field: the next click of the text tool wrote nothing

7.32.0 (2026-10-26) ​

Features ​

  • images: images in drawings: "Insert image" (image tool of the toolbar, after the arrow: an action, never the active tool; settings menu, context menu at the right click, command palette) and paste of a copied image (Ctrl / Cmd + V) at the pointer; files reduced to 2048 px and encoded as WebP (else PNG or JPEG), shown whole in the view, proportions kept when resized, opacity, order and actions as options, colors kept in dark mode, svg export; drawer.addImage(file, position), insertImage(), addFiles(files), drawer.files, types DrawingFiles and DrawingImage
  • images: files of images kept apart from the shapes, by id (fileId): in the browser (<localStorageKey>-files), in drawing files, links and the storage option (files of DrawingFile, only PNG, JPEG, WebP or GIF data URLs read), sent once to the users of a collaboration session (files of DrawingChange, the server keeps them with the drawing of the room); a moved image does not send its file again

7.31.0 (2026-10-25) ​

Features ​

  • selection: align selected shapes on a side or the center of their box (left, center, right, top, middle, bottom), stack them in a row or a column, distribute them with even spaces (3 shapes or more), from the options panel (sections "Align" and "Distribute", 2 shapes or more) and the command palette; drawer.alignShapes(alignment), distributeShapes(direction), stackShapes(direction), types ShapeAlignment and Direction

7.30.0 (2026-10-25) ​

Features ​

  • zoom: zoom to fit the whole drawing (Shift + 1, not beyond 100 %), to the selection (Shift + 2, filling the view up to 200 %) and back to 100 % (Shift + 0), from the context menu, the command palette and help too (keys found by their place: digits typed with Shift on AZERTY); drawer.zoomToSelection()
  • zoom: the zoom level button goes back to 100 % keeping the center of the view (it also moved the view back to the origin: "Back to origin" of the position does it)

7.29.2 (2026-10-25) ​

Bug Fixes ​

  • arrows: arrows linked to triangles, diamonds, hearts and clouds end on their outline as drawn, and the sides they are fixed to are on it: they stopped on the box around these shapes (an arrow aiming at a triangle ended in the empty corner of its box), also when rotated. An end is linked near their outline, no longer in the empty corners of their box

7.29.1 (2026-10-25) ​

Bug Fixes ​

  • licence: MIT licence of Fabien Winkler: package.json declared Apache-2.0 while the LICENCE file held the MIT licence of another project

7.29.0 (2026-10-24) ​

Features ​

  • types: classes of the public API exported as types: members of the drawer (DrawerLayout of drawer.layout, Toolbar, I18n, UndoRedo, Collaboration, its dialogs and panels...), results of its methods (Toast), shapes (Frame), and the types they use (Command, ModalOptions, DrawingChange...): index.d.ts declared them without exporting them, apps could not name them

7.28.5 (2026-10-23) ​

Bug Fixes ​

  • theme: light theme in a dark page: native fields and scrollbars of the drawer light (color-scheme: light), they took the dark scheme of the page
  • theme: custom color of the options panel shown as the drawing shows it in dark mode, like the colors of the palette
  • help: shortcuts on one column in a narrow drawer, they overflowed the dialog under about 380 px wide

7.28.4 (2026-10-23) ​

Bug Fixes ​

  • a11y: switches of the preferences dialog are named by their label only (the shortcut shown next to them was in their name) and no longer announce a shortcut that does nothing in the dialog (aria-keyshortcuts)
  • a11y: the collaboration dialog opened by an invitation link focuses the name to give before joining (it focused its first button)

7.28.3 (2026-10-23) ​

Bug Fixes ​

  • i18n: Spanish "Empezar la sesión" to start a collaboration session ("Iniciar sesión" reads as signing in), German "Eckig" for sharp corners ("Spitz" is pointed)
  • settings: "Github" opens a new tab without access to the page of the drawer (noopener), it opened a window named "blank", reused by the next clicks

7.28.2 (2026-10-23) ​

Bug Fixes ​

  • i18n: details of errors in toasts in the language of the drawer, they were in English ("clipboard unavailable", "not a drawing file", "server unreachable", "nothing to export", invalid JSON or damaged link data, full storage and permissions of the browser): errors of the library carry a text key, messages of servers and apps are kept

7.28.1 (2026-10-23) ​

Bug Fixes ​

  • a11y: messages of toasts are read by screen readers from live regions kept in the page (polite, urgent for problems): a toast added with its status or alert role was not always announced; while a dialog is shown, from a region of the dialog (nothing out of an aria-modal dialog was read)

7.28.0 (2026-10-23) ​

Features ​

  • view: a file or a link opened is shown in the view, centered, zoomed out when it is bigger than the view (never zoomed in beyond 100 %): its shapes could be far from the view, the drawing looked empty
  • api: drawer.zoomToFit(shapes?) shows the whole drawing (or shapes) the same way

7.27.5 (2026-10-23) ​

Bug Fixes ​

  • export: png and pdf of a very big drawing: the scale is lowered so the image fits the canvas limits of browsers (32767 px of side, 268 Mpx of area, 16.7 Mpx on iPhone and iPad), there was no image (Firefox: a drawing 15000 px wide at scale 3); the pdf page keeps the size of the drawing

7.27.4 (2026-10-23) ​

Bug Fixes ​

  • links: links to drawings of a drawer without id option are #drawing=..., opened by the first drawer without id of the page: the key was drawer-<n>, numbered by the drawers created before, so a link copied from a drawer mounted again by an app did not open (links of previous versions still open); with the id option, #<id>=... as before. A link is opened by one drawer of the page only

7.27.3 (2026-10-23) ​

Bug Fixes ​

  • frames: a new frame is numbered after the highest number of the names of frames: after a deleted frame, the next one took the name of an existing one ("Frame 3" twice)

7.27.2 (2026-10-23) ​

Bug Fixes ​

  • snapping: moved and resized shapes snap to the shapes of frames and to the frame of a shape moved in it (they were ignored), not to the sides and center of the view (shapes jumped to the edge of the screen on an infinite drawing), nor to hidden shapes

7.27.1 (2026-10-23) ​

Bug Fixes ​

  • arrows: ends linked near the outline of rectangles and ellipses as drawn, not anywhere in their box: an arrow pointing at the empty inside of a big shape without background (a container) is no longer pulled to its outline, corners of the box of an ellipse or of a rotated rectangle are free; inside linked with a background, small shapes from their middle
  • arrows: distance of links (12 px) and of the sides of shapes on screen whatever the zoom: it was 3 px at 25 %, 48 px at 400 %
  • shapes: a press moved less than 3 px on screen is a click whatever the zoom (nothing drawn): at 400 %, drags of 7 px drew nothing, at 25 % a move of 1 px drew a shape

7.27.0 (2026-10-23) ​

Features ​

  • shortcuts: shown with the symbols of Apple keyboards on its devices (⇧⌘Z, ⌥⇧D, ⌘⌫, ⌘+Click), in the order of macOS menus, in menus, context menu, command palette, help (one key of macOS for Ctrl + Delete and Ctrl + Backspace), tooltips and aria-keyshortcuts (Meta), also the shortcuts of plugins; arrows shown as arrows (Ctrl+↑), names of keys translated in every menu. Shortcuts in the tooltips of undo, redo and save buttons
  • zoom: Cmd + wheel zooms like Ctrl + wheel on macOS
  • plugins: formatShortcut(shortcut, t) and ariaShortcut(shortcut) exported, to show shortcuts like the library

7.26.0 (2026-10-23) ​

Features ​

  • shortcuts: Ctrl / Cmd + S saves the drawing (saveNow: storage of the app, auto save off, "Drawing saved" message), Ctrl / Cmd + Shift + S saves it as a .freedrawing file (was Ctrl / Cmd + S); Ctrl / Cmd + Shift + Z redoes (macOS), like Ctrl / Cmd + Y. Shown in the settings menu, command palette, help, aria-keyshortcuts of the save and redo buttons

7.25.0 (2026-10-23) ​

Features ​

  • text: the text tool follows keepTool like the other tools: kept after a text (the press validating a text adds no other one, also on touch screens), else the selection tool comes back with the text selected (frame of a renamed title). A click of the tool on a text or a name of frame edits it instead of adding a text over it; its options panel is hidden while a text is edited

7.24.0 (2026-10-23) ​

Features ​

  • touch: two fingers on the drawing zoom it by pinching (zoom option) and move the view, with any tool and in read only. The second finger cancels the action of the first one (shape or stroke being drawn removed, also for collaborators, faded shapes of the eraser kept, selection rectangle, laser and drags stopped), nothing is drawn until every finger is lifted; fingers on the drawing no longer scroll nor zoom the page
  • plugins: BaseWidget.cancelAction() cancels the pointer action of a tool, onCancel() removes what it was drawing (done by ShapeWidget)

7.23.1 (2026-10-23) ​

Bug Fixes ​

  • selection: one change per drag: N selected shapes moved together fired N + 1 changes (drawing saved, drawer.change events, changes sent to collaborators and layers panel rebuilt each time)

7.23.0 (2026-10-23) ​

Features ​

  • drawer: destroy() removes a drawer for apps mounting and unmounting it: plugins destroyed, tool deactivated, collaboration session left, listeners of the page (window, document, media queries, resize observers) removed, stage destroyed, element emptied; drawer.signal is aborted then, for listeners of apps and plugins to go with the drawer

7.22.6 (2026-10-23) ​

Bug Fixes ​

  • focus: a drawer created below the fold no longer scrolls the page to it; created or changing its tool by code (e.g. right to draw given or removed by the owner of a collaboration session), it no longer takes the focus of a field of the page or of a dialog

7.22.5 (2026-10-23) ​

Bug Fixes ​

  • collaboration: a change bigger than a message of the server (10 MB, e.g. a big file opened) is no longer sent: the server closed the connection and the session reconnected and sent it again without end; the drawing is told too big for the session, its shapes are sent once it fits

7.22.4 (2026-10-23) ​

Bug Fixes ​

  • layout: the hidden context menu no longer makes the page scroll: taller than a short drawer (or window), it kept its place below it, and a drawer of window size lost the width of the scrollbar; a drawer of window size clips what goes out of it

7.22.3 (2026-10-23) ​

Bug Fixes ​

  • history: background color in undo / redo: undo after opening a file or changing the background puts the previous background back
  • collaboration: background color shared with the other users of the session: changes sent, users joining take the background of the room (the first one gives theirs), kept after a reconnection; viewers can no longer change it (choices of the settings menu disabled in read only)

7.22.2 (2026-10-22) ​

Bug Fixes ​

  • events: a listener removing itself (drawer.off) while its event is triggered no longer makes the next listener skipped; listeners added meanwhile are called from the next trigger, listeners removed before their turn are not called

7.22.1 (2026-10-22) ​

Bug Fixes ​

  • text: fonts of the text options browsed with the arrow keys: each arrow gave focus back to the drawer; it goes back to the drawer only after a choice with the pointer

7.22.0 (2026-10-22) ​

Features ​

  • collaboration: the owner presents its view (panel of the session, command palette, collaboration.present): the other users follow its zoom and moves, the area it shows fitted to their screen (drawer.getViewArea, drawer.showArea), until they move theirs; "Follow" in the header follows it again, users joining meanwhile follow it at once
  • collaboration: participants view only until the owner lets them draw (default of rooms created by the server of this version): a viewer asks to draw in one click (collaboration.requestEdit), the owner is told (toast, number on the reminder of the header) and accepts or refuses from the panel of the session (answerRequest)
  • collaboration: the reminder of the header opens a panel of the session: right of the user, requests to answer, participants with their rights (switches for the owner), presentation, link and settings in the dialog; types AccessRequest, CollaborationMember and ViewArea exported

7.21.1 (2026-10-22) ​

Bug Fixes ​

  • export: png, pdf and copy as image wait for the fonts of their texts, the preview of the export dialog is drawn again once they are loaded: exported right after opening a drawing (slow network), texts were drawn with a serif fallback font, and the preview kept it

7.21.0 (2026-10-22) ​

Features ​

  • layout: compact interface when the footer does not fit on one line (phone, tablet, narrow drawer): toolbar on its own line, scrolled in it, below zoom, undo / redo and help, header on several lines, options panel of the tool below the header instead of covering its widgets; is-compact class of the container, layout.updateCompact() (also run when an element is added to the footer)

Bug Fixes ​

  • toolbar: on narrow screens, the toolbar no longer goes out of view, pushed by zoom and undo / redo; the menu of a group of tools closes when the toolbar is scrolled

7.20.7 (2026-10-21) ​

Bug Fixes ​

  • ui: settings menu and context menu taller than the drawer (small screens, short windows) scroll in it: their last items were out of the drawer, out of reach

7.20.6 (2026-10-21) ​

Bug Fixes ​

  • theme: error and warning toasts readable in dark mode: dark text on the light red of errors and on the orange of warnings (contrast 2.3:1 and 1.7:1 before, over 7:1 now)

7.20.5 (2026-10-21) ​

Bug Fixes ​

  • collaboration: the owner toggling the right to draw of a user keeps the focus on its switch, the list of users is no longer rebuilt on each change: rows of users not changed are kept, so screen readers read only users joining or changed

7.20.4 (2026-10-21) ​

Bug Fixes ​

  • a11y: Tab and Shift + Tab stay in dialogs: hidden buttons and options (collaboration dialog without session, export with nothing selected) and the other radios of a group (export scale, theme) were counted as stops of the focus trap, Tab left the dialog

7.20.3 (2026-10-21) ​

Bug Fixes ​

  • a11y: a click out of a dialog or the settings menu on a field of the page or another drawer keeps the focus there: closing them gave it back to the drawer, keys typed went to the drawer

7.20.2 (2026-10-21) ​

Bug Fixes ​

  • collaboration: joining a room from a link closes the dialog once the name is given (it showed this name again), a toast tells the room is joined and the reminder of the header shows the session

7.20.1 (2026-10-21) ​

Bug Fixes ​

  • tools: a second finger put on the screen during a drawing (shape, stroke, eraser, selection...) is ignored: it started another one and left the first half drawn; the drawing ends when its own finger is lifted, where it is lifted (not where another finger is)

7.20.0 (2026-10-21) ​

Features ​

  • collaboration: reminder of a live session in the header, also in zen mode: live dot and number of people connected (opens the collaboration dialog), red stop button stopping the session (owner) or leaving it (other users, who had no way to leave it) once confirmed, so a click by mistake keeps it; "Stop session" / "Leave session" in the command palette

7.19.14 (2026-10-21) ​

Bug Fixes ​

  • selection: several selected shapes moved together keep their gaps while snapping: they snap to other shapes by the box of the selection, and to the grid by the shape dragged by the pointer (each one snapped on its own before)

7.19.13 (2026-10-21) ​

Bug Fixes ​

  • collaboration: a shape tool pressed then released at its start (nothing drawn) removes its preview for the other users of the session and from the drawing of the room: it stayed with them, and was sent to users joining later

7.19.12 (2026-10-21) ​

Bug Fixes ​

  • text: on touch devices, a tap out of the edited text (on the canvas) validates it: the editor stayed open, a tap gives no click there

7.19.11 (2026-10-21) ​

Bug Fixes ​

  • text: Enter or Escape ending a composition of an input method (Chinese, Japanese, Korean...) no longer validates or closes the field: text editor, name in the layers panel, link, name in preferences and collaboration, search of the command palette (also in Safari); Enter of the numeric keypad validates a text

7.19.10 (2026-10-21) ​

Bug Fixes ​

  • tools: a mouse event fired on the window (not on an element) during a pointer action ends it there instead of throwing an error

7.19.9 (2026-10-21) ​

Bug Fixes ​

  • arrows: an arrow drawn in a frame links its ends to the shapes of the frame, or to nothing in an empty place: it was linked to the frame, its end put on the border of the frame; a frame is linked only near its border (arrows between frames)

7.19.8 (2026-10-21) ​

Bug Fixes ​

  • groups: a group created in a frame, and the shapes of a group ungrouped in a frame, can be dragged at once (they could not until the tool was changed)

7.19.7 (2026-10-21) ​

Bug Fixes ​

  • keyboard: shortcuts work whatever the keyboard: Ctrl / Cmd shortcuts with Caps Lock on, Alt + S / Z / G / L with Option of macOS (it types other characters: the letter of the key is read on the keyboard layout), letters of AZERTY and other Latin layouts as typed (Shift + W fits texts on the W key, not on Z), keyboards of another alphabet by the place of the letter on a QWERTY keyboard; AltGr (Ctrl + Alt) typing a character no longer runs a shortcut
  • plugins: letters of commands of plugins are read the same way: Alt+Z on the key typing Z (it was the place of Z on a QWERTY keyboard)
  • keyboard: Alt shortcuts are not run in fields of the drawer, where Option of macOS types characters

7.19.6 (2026-10-21) ​

Bug Fixes ​

  • keyboard: arrow keys of the other direction in a menu or a toolbar (left / right in the context menu or a row of the layers panel, up / down in the toolbar, its groups or the selection menu) no longer move the selected shapes

7.19.5 (2026-10-21) ​

Bug Fixes ​

  • clipboard: pasting in a field of the drawer (search of the command palette, name in preferences or collaboration, link, radius) pastes in the field: it added a text to the drawing instead
  • clipboard: Ctrl / Cmd + V on the drawing adds the text in Chromium too (it fires the paste on the page out of fields), only in the drawer having the focus

7.19.4 (2026-10-21) ​

Bug Fixes ​

  • tools: a pointer released out of the canvas (bar of an app, page) ends the action of the tool where it is released: the shape, stroke, eraser, selection rectangle or pan follows the pointer out of the canvas and ends there. The tool stayed in action: interface ignoring the pointer, shortcuts disabled, stroke following the pointer back on the canvas
  • tools: a mouse button released while the window was left, or a cancelled touch, ends the action too; a brush stroke ended without pointer up (tool changed) is no longer contained in the next one

7.19.3 (2026-10-21) ​

Bug Fixes ​

  • files: a crafted file or link no longer empties the drawing: all its shapes are created before the drawing is replaced, so a file that can't be loaded leaves it as it is (it was destroyed first, then saved empty or partial at the next change)
  • files: attributes of shapes of files, links and collaboration changes are checked: values of the wrong type (path data, name, dash, points...) and other attributes read by Konva (patterns, functions, zIndex...) are ignored, so a shape can't throw while created or drawn (a drawing saved with it broke rendering on each load); frames without their box, title or content are ignored; attributes of data (e.g. of plugins) are kept

7.19.2 (2026-10-20) ​

Bug Fixes ​

  • save: changes are saved only once a save succeeds: a failed save (browser storage full, storage of an app rejecting it), a save of storage in progress or before its drawing is loaded keep them unsaved (hasUnsavedChanges, drawer.unsaved.change, save button and menu), "Drawing saved" is not shown then, and leaving the page asks a confirmation, also with auto save
  • save: a save failure after a successful save of browser storage is shown again, and "Save now" tells it saved again
  • storage: when nothing is stored (load gives null), changes made to the drawing kept are saved with auto save

7.19.1 (2026-10-20) ​

Bug Fixes ​

  • history: undo and redo during a collaboration session change only the shapes changed by this user: changes of the other users are kept, for everyone. The history records the shapes added, changed or removed by each change instead of a copy of the whole drawing (also lighter, a drawing opened no longer builds 100 growing copies), the drawing of a joined room is not a change to undo, shapes put back by undo or redo return to their place in the stacking order, and changes of shapes removed since by other users are skipped
  • types: HistoryEntry and HistoryChange, entries of drawer.undoRedo.entries

Deprecations ​

  • undoRedo.appHistory and undoRedo.appHistoryStep (use undoRedo.entries and undoRedo.step): still readable, appHistory gives the changes as JSON instead of whole drawings

7.19.0 (2026-10-20) ​

Features ​

  • plugins: options of plugins given by the app with the pluginOptions option (by plugin name), read by Plugin.getOptions(defaults)
  • plugins: drawer.getPointerPosition() gives the pointer in drawing coordinates (center of the view when it is out of the canvas), the SelectWidget type is exported to select shapes from code
  • docs: plugins guide (why plugins, steps, tools, commands, texts, options, shapes, events, packaging, testing) and a complete plugin template in the repository (packages/plugin-template)

Bug Fixes ​

  • plugins: commands of plugins marked readOnly (not modifying the drawing) stay available while their plugin is disabled by forceDisabled, as in read only

7.18.0 (2026-10-20) ​

Features ​

  • plugins: other developers add features with plugins, classes extending Plugin given to the plugins option: a unique pluginName, plugins they requires (classes added when missing, or names), steps (constructor before the toolbar, init once the drawer is created, possibly asynchronous and waited by drawer.ready, afterInit, destroy), addWidget (tool placed by the widgets and widgetGroups options, else at the end of the toolbar), addTranslations and t, addCommand (command palette, shortcut shown in help, context menu of the selection or of the drawing, not in read only unless readOnly), listenTo (drawer events, konva nodes, DOM elements, removed by destroy), forceDisabled / clearForceDisabled (drawer.plugin.change event); drawer.plugins (get, has, destroy); Plugin, BaseWidget, ShapeWidget, drawerEvents, shapeName, createButton, setLabel, setPressed and the types of plugins are exported; the translations option can replace texts of plugins

Bug Fixes ​

  • context menu: the unlock item shows its shortcut (Ctrl+Shift+L), not the one of delete

7.17.1 (2026-10-20) ​

Bug Fixes ​

  • text: the field editing a text is placed on the text wherever the drawer is in the page: it was moved down by the space above the drawer (bar of an app), e.g. into the frame when renaming it
  • frames: a frame title being renamed stays on one line above the frame: the field widens while typing instead of wrapping into the frame, Shift + Enter adds no line break and pasted ones become spaces

7.17.0 (2026-10-20) ​

Features ​

  • frames: a selected frame shows the options panel with its opacity (of the whole frame: border, title and shapes), its stacking order and the actions
  • selection: actions section in the options panel of a selection: duplicate, delete and link
  • links: a web page or an email address can be attached to shapes (also groups and frames): edited above the selection (link action of the panel, context menu, command palette; Enter applies, Escape cancels, open and remove buttons), shown above a selected shape having one, link icon at the top right of shapes with a link (end of the title of frames) opening it on click, address shown on hover; saved with shapes, shared with collaborators, around shapes in svg exports; other protocols are refused, also in files, drawing links and changes of collaborators; setShapeLink, getShapeLink and openShapeLink methods

Bug Fixes ​

  • frames: the options panel of shape tools no longer shows up after drawing a frame, nor stays over the selection panel once the tool is changed
  • selection: the menu next to the selection is no longer placed under the options panel

7.16.0 (2026-10-20) ​

Features ​

  • frames: frames a shape is moved into or out of are highlighted while it is dragged or resized (entered: solid and tinted, left: dashed), the highlight fades out once dropped, also after a move with arrow keys; placeInFrames returns the frames entered and left (FrameChanges type, exported)

Bug Fixes ​

  • frames: a shape of a frame dragged or resized out of it is drawn whole above the drawing instead of being cut at the edges of its frame (only its selection box was visible out of it)

7.15.0 (2026-10-20) ​

Features ​

  • types: AvailableTools, BrushWidgetOptions, ImageFormat, ShapeState and TranslationParams are exported with the other types of the library (options of tool, of the brush, export formats, shapes of drawing files, parameters of texts)

7.14.3 (2026-10-20) ​

Bug Fixes ​

  • collaboration: a user connected again after losing the connection no longer sends a stale copy of the drawing: shapes removed by other users meanwhile no longer come back and their changes are kept; the drawing of the room is merged with the changes made meanwhile, which are sent (also the ones made while disconnected)

7.14.2 (2026-10-18) ​

Bug Fixes ​

  • collaboration: a user is told when the server refuses their changes (drawing too big for the session: changes not shared) or their joining (session full: session stopped), with the REJECTED event

7.14.1 (2026-10-18) ​

Bug Fixes ​

  • collaboration: shapes received from other users are checked as shapes of files: only drawing shapes are created, so a stage or a layer sent by a user of the session can no longer empty an element of the page of every user; an invalid shape is ignored without stopping the rest of the change

7.14.0 (2026-10-18) ​

Features ​

  • eraser: shapes to erase are faded until the pointer is released, instead of red outlines, whatever their kind (strokes, filled shapes, texts, groups); thin shapes crossed quickly are found along the whole pointer path

Bug Fixes ​

  • eraser: a stroke starting on a shape erases it and the shapes it crosses next
  • eraser, text: right and middle clicks no longer erase a shape or add a text

7.13.0 (2026-10-16) ​

Features ​

  • collaboration: the owner of a session chooses in the dialog whether new participants can draw; when off, users joining for the first time (also with a new id) view only until the owner gives them the right

Bug Fixes ​

  • collaboration: an anonymous user can no longer take the place of the owner of a session or of a logged in user by sending their id: the owner is the user giving the secret of the room

7.12.0 (2026-10-16) ​

Features ​

  • selection: the options panel of a mixed selection (e.g. text, rectangle and brush stroke) shows the options of every kind of selected shape, text options included, each one applied to the shapes it fits; fields show the values of the shapes they apply to

7.11.0 (2026-10-16) ​

Features ​

  • save: save button in the header while auto save is off (saveButton option), a dot shows changes not saved yet; "Save now" has its own icon (floppy disk), the download one stays for "Save as file"

Bug Fixes ​

  • settings: "Save now" of the settings menu is hidden while auto save is on

7.10.0 (2026-10-16) ​

Features ​

  • selection: the selection rectangle selects the shapes it touches, not only the ones entirely in it: lines and strokes where they are drawn, rotated shapes as drawn, groups by their shapes; drawn inside a big shape or a frame, it selects the shapes it touches there, not the big shape

7.9.4 (2026-10-16) ​

Bug Fixes ​

  • toolbar: with "Keep tool active" turned off, the selection tool is activated after drawing without selecting the drawn shape

7.9.3 (2026-10-16) ​

Bug Fixes ​

  • help: "Documentation" link opens the documentation site (its address no longer existed)

7.9.2 (2026-10-16) ​

Bug Fixes ​

  • text: "Paste" of the context menu puts the text where the menu was opened (it went to the top left corner of the view), Ctrl / Cmd + V with the pointer out of the drawing puts it at the center of the view, no more Konva warning "Pointer position is missing"

7.9.1 (2026-10-16) ​

Bug Fixes ​

  • shortcuts: Ctrl / Cmd + A no longer selects the text of the page: a click on the drawing focuses the drawer when focus was elsewhere in the page (e.g. bar of an app), and a slider or checkbox of the drawer gives the shortcut to the drawer (text fields keep it)

7.9.0 (2026-10-16) ​

Features ​

  • text: "Fit width to text" (selection menu, context menu, command palette, Shift+W, fitTextWidth): width of selected texts (also texts of groups) fitted to their longest line, lines no longer wrapped, text kept in place whatever its alignment

7.8.0 (2026-10-16) ​

Features ​

  • toolbar: "Keep tool active" (pin button at the start of the toolbar, Q, preferences dialog, command palette, setKeepTool, keepTool option and preference): turned off, the selection tool is activated with the shape just drawn (shapes, frames, brush, highlighter)

7.7.0 (2026-10-15) ​

Features ​

  • preferences: dialog applies its changes together with "Save" (theme, language, zen mode, grid, snapping, auto save and name, Enter in name field), "Cancel", Escape or close keep current preferences

7.6.0 (2026-10-15) ​

Features ​

  • preferences: auto save can be turned off (preferences dialog, command palette, setAutoSave, autoSave preference): changes are then saved with "Save now" (settings menu, command palette, saveNow), the menu shows "Not saved" until then and leaving the page asks a confirmation; hasUnsavedChanges method and drawer.unsaved.change event

7.5.0 (2026-10-15) ​

Features ​

  • toolbar: "More tools" group in default toolbar: triangle, diamond (D), heart, cloud, highlighter (M), laser pointer (K), frame (F)
  • triangle, diamond, heart and cloud drawn in dragged box, with background color and stroke style
  • highlighter: wide strokes of its own fluorescent colors and widths, texts under them stay readable
  • laser pointer: fading trail, never saved, shown to users of a collaboration session, usable in read only
  • frames: named areas whose shapes are moved with them and cut at their edges; shapes drawn or moved in a frame belong to it, resizing a frame does not scale its shapes, exports cut its shapes

Bug Fixes ​

  • duplicated shape of a group selected alone at its place

7.4.0 (2026-10-15) ​

Features ​

  • layout: drawer.layout (DrawerLayout) manages the container and the regions of the interface: layout.add(region, $element, { hideInZen, after }) adds elements of an app to header, footerStart, footer or floating, LayoutRegion and LayoutItemOptions types exported

Deprecations ​

  • $headerContainer, $footerContainer, $footerLeftElement (use layout.add or layout.$header, layout.$footer, layout.$footerStart) and UIPointerEvents (use layout.setPointerEvents), still working

7.3.0 (2026-10-15) ​

Features ​

  • toolbar: groups of widgets (widgetGroups option): one button showing its widgets above it, highlighted while one of them is active, icon by name (shapes, more, grid, plus, a widget) or svg code, title; groups created by code with GroupWidget and toolbar.addGroup

7.2.0 (2026-10-15) ​

Features ​

  • rotate selection by 90° to the right or left around its center: Shift + R / Shift + L, buttons of selection menu, context menu, command palette, rotateShapes method (linked arrows follow)

7.1.0 (2026-10-15) ​

Features ​

  • selection menu: lock button (Ctrl+Shift+L), locked shapes stay selected with the unlock button

7.0.0 (2026-10-15) ​

⚠ BREAKING CHANGES ​

  • deps: konva 10 is required (peer dependency ^10.9.0): ES modules only, require('konva').default in CommonJS, see konva changelog. Konva 10 types getAttr / setAttr per class: on a DrawingShape (shape or group), read attributes from a Node (const node: Node = shape) or shape.attrs
  • texts are placed in their lines like HTML texts (konva 10): texts of existing drawings move down a little (about 6% of their font size)

Features ​

  • konva 10.9: rotation follows the pointer around the center of selection, faster transformer with many selected shapes, finer hit detection of thin lines, hit detection in Brave
  • text editor, svg export of texts (underline, line-through) and rotation by 15° with Shift follow konva 10

6.14.0 (2026-10-15) ​

Features ​

  • lock: locked shapes can be selected to unlock them: a click (after unlocked shapes under pointer), a right click or their row in layers panel selects them alone, with a dashed box and without anchors; they are not moved, transformed, styled nor deleted from canvas. Unlock button in selection menu, unlock item in context menu and command palette, Ctrl + Shift + L locks or unlocks the selection

6.13.1 (2026-10-15) ​

Bug Fixes ​

  • selection menu: no longer covers the rotation and resize anchors, also on rotated or flipped shapes: placed below the selection, else above, right or left of it

6.13.0 (2026-10-15) ​

Features ​

  • context menu: right click on a shape selects it and shows actions on selection with their shortcuts: duplicate, lock, delete, bring to front / forward, send backward / to back, flip horizontal / vertical, copy as PNG / SVG, select all; elsewhere actions on drawing: paste, copy as PNG / SVG, select all, snapping, grid
  • flip shapes around the center of the selection, texts still readable: Shift + H / Shift + V, flipShapes method, also in command palette
  • copy selection (or whole drawing) as PNG image or SVG (image and code): Shift + Alt + C / Shift + Alt + S, copyImage method, also in command palette
  • lock selection with Ctrl / Cmd + Shift + L
  • Shift + a letter does not activate a tool anymore (Shift + H flips)

Bug Fixes ​

  • context menu: shown at pointer and kept inside the drawer, also when the drawer is not at the top of the page

6.12.0 (2026-10-15) ​

Features ​

  • layers: several rows selected: Ctrl / Cmd + click or Ctrl + Space adds or removes a row, Shift + click or Shift + arrows selects the rows from the last one selected (shapes of a same group, hidden and locked ones skipped), shortcuts shown under the list and in help

6.11.0 (2026-10-15) ​

Features ​

  • switches instead of checkboxes in preferences, export and collaboration dialogs: on / off state announced by screen readers, keyboard (Space) and pointer as before, native checkboxes in high contrast mode

6.10.0 (2026-10-15) ​

Features ​

  • "Preferences..." item of settings menu, Ctrl / Cmd + , and command palette: dialog with theme (light, dark or system), language, zen mode, grid, snapping to objects and name in collaboration sessions, applied at once, showPreferences method
  • preferences saved in browser (<localStorageKey>-preferences): grid, snapping and zen mode restored on next visit too (also with storage option), theme and language chosen with previous versions kept
  • zen mode is a preference (zen of getPreferences, setPreferences and drawer.preferences.change event)

6.9.0 (2026-10-14) ​

Features ​

  • types exported for apps: DrawerOptions, DrawerStorage, DrawerUser, Preferences, CollaborationOptions, DrawingFile, Theme, Language, CustomTranslations, TranslationKey and types of drawing options (ColorLike, StrokeStyle, Edges, TextStyle...)

6.8.1 (2026-10-14) ​

Bug Fixes ​

  • collaboration: user id given by the server when joining a room (JOINED event, e.g. id of logged in account) used to recognize oneself: owner of the room, right to draw, "(you)" in users, links

6.8.0 (2026-10-14) ​

Features ​

  • storage option: drawing loaded from and saved to the storage of an app (e.g. its server) instead of localStorage, ready promise and loadFromStorage method, one save at a time with the last drawing, nothing saved before stored drawing is loaded (nor if it can't be)
  • user option and setUser method: id and name of the user of an app in collaboration sessions
  • preferences: getPreferences and setPreferences methods (theme, language, grid, snapping to objects), drawer.preferences.change event (one event for several changes)
  • collaboration option can be { url, auth }: data read by server on connection (e.g. token of logged in user), or function giving it

Bug Fixes ​

  • dialogs: keys of page (Escape, Tab) and clicks not taken anymore by a dialog whose drawer was removed from page while it was shown
  • toast: message shown as text (HTML of error messages not interpreted)
  • collaboration: name given in dialog kept for the visit when localStorage is unavailable

6.7.0 (2026-10-14) ​

Features ​

  • command palette: "Command palette" item of settings menu and Ctrl / Cmd + K, search field and list of tools and commands available now (edition, selection, view, file, language) with their shortcut and state, filtered while typing (case and accents ignored), run with Enter or click, commandPalette option and showCommandPalette method

6.6.0 (2026-10-14) ​

Features ​

  • interface in English, French, Spanish and German: "Language" choice in settings menu (saved, every text translated at once), browser language by default (English when not available), language option ('auto', 'en', 'fr', 'es' or 'de'), setLanguage and t methods, language property, drawer.language.change event
  • translations option: texts of interface replaced by language (e.g. { fr: { 'menu.open': 'Ouvrir un dessin' } })
  • zoom percentage written in language of interface

6.5.0 (2026-10-14) ​

Features ​

  • dark mode: "Dark mode" item of settings menu (Alt+Shift+D), choice saved, theme option ('light', 'dark' or 'system', device theme followed), setTheme, toggleDarkMode and isDarkMode methods, drawer.theme.change event
  • in dark mode, drawing shown with inverted colors (as dark export), colors of shapes kept, color swatches and text being edited shown the same way, export in dark mode by default

6.4.1 (2026-10-14) ​

Bug Fixes ​

  • selection: snapping to objects while resizing: resized sides and corners aligned on edges and centers of other shapes (guides shown), grid snapping kept when not snapped to a shape
  • selection: shapes moved or resized together are not snapping guides of each other

6.4.0 (2026-10-14) ​

Features ​

  • arrows linked to shapes: an arrow drawn from a shape to another one follows them when they move, are resized or rotated, ends fixed to the side whose middle is chosen (shown with arrow tool, e.g. bottom of a shape to side of another one) or on outline aiming at the other end, Ctrl / Cmd draws without links, arrows moved alone unlinked, copies linked together

6.3.0 (2026-10-14) ​

Features ​

  • round corners of rectangles: "Edges" buttons (sharp / round) and radius field of rectangle tool and selection options, also for rectangles of groups, edges option and setEdges method: radius following rectangle size (a quarter of its smallest side, 32 at most, empty field) or chosen one

6.2.0 (2026-10-14) ​

Features ​

  • Shift pressed or released while drawing applies at once (square, circle, 45° line or arrow), without moving pointer
  • brush draws a straight stroke from its start with Shift
  • selected shapes resized freely by corners, proportions kept with Shift (texts always keep them): before, corners always kept proportions
  • Shift while rotating rotates by 15°, while moving moves horizontally or vertically

6.1.0 (2026-10-14) ​

Features ​

  • events named drawer.<subject>.<action>: drawer.change, drawer.options.change, drawer.selection.change, drawer.readonly.change and drawer.collaboration.change (drawer), drawer.dropdown.hide and drawer.toast.hide (components)

Deprecations ​

  • events change, fd.options.change, fd.selection.change, fd.readonly.change, fd.collaboration.change, fd.dropdown.hide and fd.toast.hide: still listened and triggered, with a warning in console, use drawer.* names

6.0.0 (2026-10-14) ​

⚠ BREAKING CHANGES ​

  • drawing shapes may be groups (konva Group, DrawingShape type): getDrawingShapes, getSelectedShapes, duplicateShapes and ungroupShapes return shapes or groups, shape methods (fill, stroke...) need a check

Features ​

  • groups of shapes (Ctrl+G, Ctrl+Shift+G, selection menu, layers panel), moved, transformed, ordered, renamed, hidden, locked, duplicated and deleted together, groups of groups, groupShapes, ungroupShapes and canGroupShapes methods
  • click selects group of a shape, Ctrl+click selects the shape alone
  • layers panel: shapes of groups under their expanded group (arrow button, Right / Left arrows), reordered in their group
  • groups saved, in history, files, links, exports and live collaboration

Bug Fixes ​

  • eraser click on a shape saves the change (history, autosave, collaboration)

5.7.0 (2026-10-14) ​

Features ​

  • layers panel (button in header, Alt+L): list of shapes, top one first, to select, rename, reorder (drag handle, Alt + arrows), hide, lock and delete them (layersPanel option)
  • shapes names, hidden and locked states, saved with shapes: setShapeLabel, getShapeLabel, setShapesHidden and setShapesLocked methods, hidden and locked shapes are not selectable

5.6.0 (2026-10-14) ​

Features ​

  • selection: Shift + click adds or removes a shape, Alt + click selects the shape behind the selected one, Shift adds shapes of selection rectangle
  • selection: selection dragged from any place of its box (inside of shapes without background, around lines)

Bug Fixes ​

  • selection: click selects only the shape drawn under pointer, not every shape around it: a text (or a small shape) on a shape is selected alone, a pressed shape is selected and dragged alone
  • selection: selection rectangle selects shapes entirely in it, a rectangle drawn in a big shape selects the small shapes on it
  • inside of rectangles and ellipses without background does not hide shapes under it (click, eraser): an empty inside selects the smallest shape around pointer, the eraser erases their outline
  • lines saved while selected keep a wide hit region (easier to click)

5.5.0 (2026-10-14) ​

Features ​

  • menu next to selected shapes: duplicate, bring forward, send backward and delete (selectionMenu option)
  • duplicate selection with Ctrl+D, duplicateShapes and deleteShapes methods

5.4.0 (2026-10-14) ​

Features ​

  • stacking order of selected shapes: bring forward / send backward (past the next overlapping shape), bring to front / send to back, with "Layers" buttons of selection options, Ctrl+Up / Ctrl+Down (with Shift to front / back) and reorderShapes method
  • collaboration: stacking order shared with other users and kept for users joining later

5.3.0 (2026-10-14) ​

Features ​

  • collaboration: users who joined a session only see their name in the dialog (no link, QR code, users nor stop button), kept for the owner
  • collaboration: owner sees who invited each user: links and page URL contain the id of the user sharing them (#room=<id>&by=<user id>)

5.2.0 (2026-10-14) ​

Features ​

  • collaboration: name asked to users opening a room link before joining, owner of the room (its creator) joins it again without dialog
  • collaboration: owner gives or removes the right to draw of each user in the dialog, users without the right are in read only mode and their changes are ignored by server
  • read only mode: drawing can't be modified by user (tools except pan, shortcuts and menu items modifying drawing, text edition), readOnly option and setReadOnly method

5.1.0 (2026-10-14) ​

Features ​

  • collaboration: cursor of each other user with their name, same size whatever zoom, hidden out of drawer
  • collaboration: shapes are shown to other users while they are drawn, moved or transformed (every 50 ms at most), not only at the end

5.0.0 (2026-10-14) ​

⚠ BREAKING CHANGES ​

  • collaboration: collaboration option no longer connects every client at init: it adds "Live collaboration" to settings menu, sessions are started there (or with startCollaboration) in a room, or by opening a room link
  • collaboration: clients join a room (JOIN event with room and name) before sending CHANGE events, a custom socket.io server must handle rooms (see server/index.mjs)

Features ​

  • collaboration: live collaboration dialog: user name, start a session in a new room, room link with copy button and QR code to scan, connected users, stop session, message when server can't be reached
  • collaboration: room link (#room=<id>) joins the room, reloading page joins it again, startCollaboration, stopCollaboration, getCollaborationLink, setUserName and showCollaboration methods
  • collaboration: server keeps the drawing of each room, users of a room only get its changes

4.2.0 (2026-10-14) ​

Features ​

  • export: export dialog from settings menu (Ctrl+Shift+E) with preview: png, svg (vector), pdf and .freedrawing file, image copied to clipboard
  • export: selected shapes or whole drawing (chosen in dialog), with or without background, dark mode, png and pdf scale, exportImage and showExport methods

4.1.0 (2026-10-14) ​

Features ​

  • files: open and save as .freedrawing files (JSON of background and shapes) from settings menu, Ctrl+O and Ctrl+S, browser save dialog when available, saveAs, open, getDrawingFile and loadDrawing methods
  • files: copy link to drawing, drawing is compressed in link hash (no server), page opened with it loads the drawing, getLink and copyLink methods

4.0.1 (2026-10-14) ​

Bug Fixes ​

  • keyboard: Ctrl / Cmd + A selects shapes only, not page text (position widget...), interface panels texts are not selectable

4.0.0 (2026-10-14) ​

⚠ BREAKING CHANGES ​

  • collaboration: drawing changes are sent with CHANGE event ({ upsert, remove }: JSON of shapes added or updated, ids of removed shapes) instead of DRAW (brush strokes only), a custom socket.io server must relay CHANGE (see server/index.mjs), _socketDraw of widgets is removed

Features ​

  • collaboration: every drawing change is shared (all tools, eraser, moves, styles, undo / redo, clear canvas), concurrent drawings are merged shape by shape, changes received while drawing are applied at the end of the stroke, server sends the drawing to clients connecting later
  • drawing shapes have a unique id

Bug Fixes ​

  • history: undo and redo are saved (autoSave) and trigger drawer change event

3.8.0 (2026-10-14) ​

Features ​

  • shapes: stroke styles solid, dashed and dotted (round dots), dashes and dots follow stroke width, strokeStyle option and setStrokeStyle('dashed')

Bug Fixes ​

  • shapes: dashes of thick lines and arrows no longer look solid, same dash ends for lines, arrows, rectangles and ellipses

Deprecations ​

  • strokeDash option and dash array of setStrokeStyle: still accepted, a dash array gives 'dashed' style (fd.options.change event sends strokeStyle instead of strokeDash)

3.7.0 (2026-10-14) ​

Features ​

  • colors: custom color input (browser color picker) in every color choice: stroke, text and background colors
  • colors: transparent background color, setBgColor('transparent')
  • shapes: background color of rectangles and ellipses (transparent by default), in shape tools and selection options, fillColor option and setFillColor method

3.6.0 (2026-10-14) ​

Features ​

  • position: position widget at top left, shows x / y of view center (0, 0 at origin, not changed by zoom on view center) while moving, with a button back to origin keeping zoom, positionWidget option (default true), hidden in zen mode

3.5.1 (2026-10-14) ​

Bug Fixes ​

  • text: changing text style keeps width given to text box (scaled with font size) instead of fitting it to content, line breaks are kept

3.5.0 (2026-10-14) ​

Features ​

  • ui: consistent style: same colors, radius, shadows, spacing and font sizes for panels, menus, dialogs and toasts, drawer font in menus and buttons, visible icon of active tool, opacity slider in primary color, confirmation actions on the right

Bug Fixes ​

  • toast: toasts are stacked instead of overlapping and shown in drawer (were fixed to the page when drawer is not full page), with readable colors
  • ui: help button no longer cut in a small drawer
  • ui: pointer up over tool options ends the pointer action (tool stayed in action, shortcuts disabled)
  • a11y: contrast of tool shortcut letters, 24px color buttons, same keyboard focus outline for every control
  • css: drawer styles no longer apply to the page (.backdrop, toast animations)

3.4.0 (2026-10-14) ​

Features ​

  • eraser: trail behind pointer while erasing, thinner towards its tail and fading out

3.3.2 (2026-10-14) ​

Bug Fixes ​

  • eraser: shapes to erase are shown as a thin red outline until pointer up (struck out for texts), visible whatever their color and opacity, and come back unchanged if erasing stops before pointer up
  • widgets: changing tool during a pointer action ends it (shortcuts and interface usable again)

3.3.1 (2026-10-13) ​

Bug Fixes ​

  • a11y: settings menu items expose their shortcut, the confirmation dialog they open (clear canvas, clear stored data) and the new tab opened by Github
  • drawer buttons no longer submit a form of the page when drawer is inside a form (type="button")

3.3.0 (2026-10-13) ​

Features ​

  • a11y: keyboard navigation: one tab stop in toolbar with arrow keys, Home and End between tools, context menu with arrow keys (also opened with Shift+F10 or context menu key), Escape closes settings menu and context menu
  • a11y: help and confirmation dialogs: focus moves into dialog, stays in it with Tab, goes back to the opening element on close, drawer shortcuts are disabled while open
  • a11y: accessible names of icon buttons (tools, colors, widths, styles, zoom, undo / redo, help, menu), pressed, checked and expanded states, labelled groups of tool options, announced toasts
  • a11y: visible keyboard focus: frame around drawer when focused with keyboard, button outline only for keyboard focus (no more after a click)

Bug Fixes ​

  • keyboard: arrow keys in opacity slider no longer move selected shapes
  • confirm: cancel and confirm are focusable buttons, cancel is focused when shown
  • a11y: drawer is in the page tab order (tabindex 0 instead of 1)

3.2.1 (2026-10-13) ​

Bug Fixes ​

  • selection: select all hides overlay of active tool (shapes, text...), and does nothing without shapes

Deprecations ​

  • widgets isPaint, isErasing, isSelecting and isGrabbing are replaced by inAction (read only)

3.2.0 (2026-10-13) ​

Features ​

  • options: widgets option, list (['brush', 'eraser']) or object of widgets options ({ brush: {} }), toolbar keeps the given order
  • widgets: title and shortcut options for every widget, thinning, smoothing and streamline options for brush
  • help: shortcuts list shows available widgets with their shortcuts

3.1.0 (2026-10-13) ​

Features ​

  • text: side handles resize the text box (line breaks) without changing text size, corners still scale text

Bug Fixes ​

  • selection: shapes stay selected after a resize or rotation released outside of them
  • text: select all on texts no longer shows top / bottom handles which stretched text

3.0.3 (2026-10-13) ​

Bug Fixes ​

  • text: editing area exactly on text (was shifted down), accents and italic no longer cut
  • text: text font loaded before measuring texts, first text no longer wraps while editing

3.0.2 (2026-10-13) ​

Bug Fixes ​

  • pan: hand cursor visible on white canvas

3.0.1 (2026-10-13) ​

Build System ​

  • yarn release publishes the current version, version and changelog are updated by each commit

3.0.0 (2026-10-13) ​

⚠ BREAKING CHANGES ​

  • konva is a peer dependency, install it with the package: yarn add @fabwcie/free-drawing konva (9d075c1)
  • styles must be imported: import '@fabwcie/free-drawing/style.css' (9d075c1)
  • iife and cjs builds are removed, use es (import) or umd (require) build (9d075c1)
  • collaboration is disabled by default, enable it with collaboration option; drawer.socket is null without it (9d075c1)
  • triggerChange parameter of setters, TextWidget.addTextNodeEvents() and BrushWidget.getSvgPathFromStroke() are removed (55426b5)
  • undoRedo.appHistory stores JSON strings and keeps the last 100 states (d6c2604)
  • resetDrawer() clears drawing without confirmation and restores drawing options given on init (c055cf5)
  • canvas background color no longer fills selected shapes (c055cf5)

Features ​

  • text: text overlay with font family, size, bold, italic, underline, strikethrough and align, Drawer.setTextStyle() and textStyle option (d91f9c8)
  • shapes: rectangle, ellipse and arrow tools, shift draws square, circle or 45° lines (c055cf5)
  • Drawer.setZoomLevel() limited from 10% to 3000% (866c33a)
  • Drawer.addShape() and fd.options.change event, all overlays stay in sync with options (55426b5)
  • tool shortcuts L, R, C, A and caps lock support (55426b5)
  • paste text with Ctrl / Cmd + V, Cmd shortcuts on Mac (c055cf5)
  • lighter package and data: external dependencies, woff2 font, smaller saved data and history (9d075c1, d6c2604, c055cf5)

Bug Fixes ​

  • restore history from saved state (e7e0175)
  • context menu position shows scrollbar (1f84e44)
  • brush and line strokes altered by a mouseup started outside canvas, empty text kept on Escape, Alt+Z toggling snapping, keys blocked when shapes are selected, eraser and ctrl+wheel zoom (4a7b13f)
  • duplicated history entries, click selection after pan, text colored by background color, zoom buttons limits, duplicated transformer on reload (866c33a)
  • moved text not saved, restored texts not editable, shapes draggable with other tools after reload (55426b5)
  • published types and package entries (9d075c1)
  • grid hidden outside saved view after pan, corrupted or full localStorage (d6c2604)
  • undo / redo buttons state, toasts kept in page, arrow keys move not saved, several drawers on a page (c055cf5)

2.1.2 (2025-01-04) ​

Bug Fixes ​

  • brush: prevent overlay click fire twice (b2e4815)

2.1.1 (2025-01-03) ​

2.1.0 (2024-06-10) ​

Features ​

Bug Fixes ​

  • centralise data attributes (7a33480)
  • line: id/title (b5dfbc7)
  • optionnal _sockerDraw on abstract class BaseWidget (f26aabf)
  • resize when is full on window resizing (fb5511c)
  • same line draw multiple time (6bf0dc0)
  • types error (1415e22)

2.0.1 (2024-04-18) ​

Features ​

  • add microevent to dropdown (7310925)
  • toast: add MicroEvent and icon (1384cc4)

Bug Fixes ​

  • dropdown: trigger hide if is shown only (8a66747)

2.0.0 (2024-04-11) ​

⚠ BREAKING CHANGES ​

  • rename resetDraw to resetDrawer (e8d9e04)

Bug Fixes ​

  • width for text node editing (550bdc1)

1.0.0 (2024-04-11) ​

⚠ BREAKING CHANGES ​

  • rename clearConfirmModal and clearStoredConfirmModal

Features ​

  • create class for layout management (2837ef6)

Bug Fixes ​

  • rename clearConfirmModal and clearStoredConfirmModal (eafe34c)

0.0.0 (2024-04-10) ​

⚠ BREAKING CHANGES ​

  • change default options autoSave to true

  • move activeWidget from toolbar to drawer

  • default size full screen

  • add autoSave option

  • change default options autoSave to true (662f7f2)

  • move activeWidget from toolbar to drawer (a1496d6)

Features ​

  • add autoSave option (e4d2c00)
  • add Clear stored data button (09615e8)
  • add localStorageKey option (7c0aa4a)
  • add resetDraw method (1823090)
  • add strokeWidth and strokeColor options (2ed957d)
  • add strokeWidth and strokeColor options (4eafc81)
  • add Text widget (4e7865d)
  • add bgcolor button and optimise stling (0e2cfca)
  • add context menu (9afd7b3)
  • add context menu (d80c6bb)
  • add ctrl + a shortcut + unselect (16b4f46)
  • add dropdown / confirm modal (a9a1ac7)
  • add help button with modal (917feb0)
  • add hotkey info into toolbar buttons (6cab993)
  • add key event move shape (b2ea58d)
  • add method getDrawingShapes for get all shapes draw from user (78affae)
  • add microevent plugin (1ecb32b)
  • add opacity to overlay (ad2bd43)
  • add options (007b32d)
  • add overlay class (a385f53)
  • add rotation snap (a1cafae)
  • add save/load from json (862ac38)
  • add select overlay and update fieds (d5a6eff)
  • add setColor method (7e90d15)
  • add setting btn (9eb4470)
  • add shortcut for brush toolbar button (9da4a87)
  • add shortcut keyboard events (a960ac2)
  • add snapping shape (3e661cd)
  • add test hotkey (96019c6)
  • add text hotkey (3454b61)
  • add undo / redo tool (0e19950)
  • add undo redo widgets (491077a)
  • add wheel zoom event (9fb3a6e)
  • add zen mode (fd4652f)
  • add zoom tool (2104626)
  • change cursor on hover shape in selection mode (ff48e8d)
  • context-menu: add snapping button (1de0223)
  • hit detection for line to her rect zone (1ef9368)
  • implement perfect-freehand (53c2d23)
  • manage undo/redo buttons state (a750d04)
  • modal: add closeOnEsc option (f4fb1b2)
  • modal: add hotkey clear canvas (583a7b5)
  • paste from context menu (78bbefd)
  • snapping on resiz (depend on grid) (1d9ad37)
  • start drag snap on grid (af6ae8f)
  • start implementing overlay brush (3c435fc)
  • start implementing overlay brush (9cd9064)
  • toast (4a0120a)
  • use ModalConfirm for clear stored data (b5e5744)

Bug Fixes ​

  • add default id (41e4803)
  • anchor on selection (ad9902a)
  • available anchor for text shape (d9966b2)
  • calcul text width (be8d22e)
  • clear all draw (fb2e08d)
  • clear canvas draw line (7fcb672)
  • clear grid events (0e7cc64)
  • considere textnode for undo/redo (0fb9543)
  • default size full screen (87bb542)
  • dropdown button clickable (bd8a38b)
  • eraser mode inly on hover shape (bf2b232)
  • eraser take all drawing shape (364a6bb)
  • focus drawer on select all (ctrl+a) (a491332)
  • fontSize / textarea take scaling for calcul (acc9167)
  • hide grid (10b9890)
  • hide grid save (f56b51c)
  • hide undo/redo for zen mode (f4638f2)
  • hit detection on changing tool (86c7a44)
  • hotkey ctrl+a doesn't work (f200495)
  • infinite grid and remove snap lines (14031b5)
  • init default tool (a3d9f03)
  • keepRatio for text shape (c076a3f)
  • limit min/max scale (790039f)
  • line (f770e44)
  • modal: useless call to hide (71255d3)
  • order layer for selection layer on top (c32025f)
  • paste set draggable when selection mode active (382a6b5)
  • paste text and restore text state (22be243)
  • pointer position on erasing (7a3ee93)
  • pointer-events during draw/erase/selection or paning (3ace168)
  • prevent right click for select (3fd1ddd)
  • remove line hovering only (716bc2f)
  • remove shape on hovering with eraser (e7fa1f8)
  • remove zindex (layer order fix this) (5cd77af)
  • replacing error (infinite loop oops) (bab3c78)
  • restore saved content (9ce6738)
  • select zone not visible (eba59ac)
  • selected drawing shape (bc3ace3)
  • set draggable only for selection tool (0e20de8)
  • set focus to drawer for event key (020d74e)
  • set size from sotrage (5fe3a08)
  • show / hide overlay (2da855b)
  • show/hide overlay on delete node (5f4036f)
  • text sizing / edit depend on scaling (01c3e6c)
  • transform during draw/erase or other (7aafeb9)
  • trigger change on toggle snap (3eb66b9)
  • trigger change on update selected shape (c384787)
  • update _duringAction for considere text editing (88b8664)
  • update bg position (ec4b421)
  • update bg position and grid lines (daaba3e)
  • update cursor on zoom (a9ba5e2)
  • update cursor on zoom (brush) (fd99105)
  • update grid on zoom (c0c5cd4)
  • update hitFunc on unselected node (1295f85)