Excalidraw
Security patch release for @excalidraw/excalidraw@0.18.x, addressing upstream Mermaid XSS vulnerability CVE-2025-54881 / GHSA-7rqq-prvp-x9jh.
@excalidraw/mermaid-to-excalidraw to 2.2.2@types/d3-dispatch for compatibility with the 0.18.x TypeScript versionCommand palette #7804
Multiplayer undo / redo #7348
Editable element stats #6382
Text element wrapping #7999
Font picker with more fonts #8012
Font for Chinese, Japanese, and Korean #8530
Font subsetting for SVG export #8384
Elbow arrows #8299, #8952
Flowcharts #8329
Scene search #8438
Image cropping #8613
Element linking #8812
We've transitioned from UMD to ESM bundle format. Our new dist folder inside @excalidraw/excalidraw package now contains only bundled source files, making any dependencies tree-shakable. The package comes with the following structure:
Note: The structure is simplified for the sake of brevity, omitting lazy-loadable modules, including locales (previously treated as JSON assets) and source maps in the development bundle.
@excalidraw/excalidraw/
├── dist/
│ ├── dev/
│ │ ├── fonts/
│ │ ├── index.css
│ │ ├── index.js
│ │ ├── index.js.map
│ ├── prod/
│ │ ├── fonts/
│ │ ├── index.css
│ │ ├── index.js
│ └── types/
Make sure that your JavaScript environment supports ES modules. You may need to define "type": "module" in your package.json file or as part of the <script type="module" /> attribute.
"node" or "node10"Since "node" and "node10" do not support package.json "exports" fields, having these values in your tsconfig.json will not work. Instead, use "bundler", "node16" or "nodenext" values. For more information, see Typescript's documentation.
Due to ESM's strict resolution, if you're using Webpack or other bundler that expects import paths to be fully specified, you'll need to disable this feature explicitly.
For example in Webpack, you should set resolve.fullySpecified to false.
For this reason, CRA will no longer work unless you eject or use a workaround such as craco.
Depending on the environment, this is how imports should look like with the ESM:
With bundler (Vite, Next.js, etc.)
// excalidraw library with public API import * as excalidrawLib from "@excalidraw/excalidraw"; // excalidraw react component import { Excalidraw } from "@excalidraw/excalidraw"; // excalidraw styles, usually auto-processed by the build tool (i.e. vite, next, etc.) import "@excalidraw/excalidraw/index.css"; // excalidraw types (optional) import type { ExcalidrawImperativeAPI } from "@excalidraw/excalidraw/types";
Without bundler (Browser)
<!-- Environment: browser with a script tag and no bundler --> <!-- excalidraw styles --> <link rel="stylesheet" href="https://esm.sh/@excalidraw/excalidraw@0.18.0/dist/dev/index.css" /> <!-- import maps used for deduplicating react & react-dom versions --> <script type="importmap"> { "imports": { "react": "https://esm.sh/react@19.0.0", "react/jsx-runtime": "https://esm.sh/react@19.0.0/jsx-runtime", "react-dom": "https://esm.sh/react-dom@19.0.0" } } </script> <script type="module"> import React from "https://esm.sh/react@19.0.0"; import ReactDOM from "https://esm.sh/react-dom@19.0.0"; import * as ExcalidrawLib from "https://esm.sh/@excalidraw/excalidraw@0.18.0/dist/dev/index.js?external=react,react-dom"; </script>
excalidraw-assets and excalidraw-assets-dev folders #8012, #9127The excalidraw-assets and excalidraw-assets-dev folders, which contained locales and fonts, are no longer used and have been deprecated.
Locales are no longer treated as static .json assets but are transpiled with esbuild directly to the .js as ES modules. Note that some build tools (i.e. Vite) may require setting es2022 as a build target, in order to support "Arbitrary module namespace identifier names", e.g. export { english as "en-us" } ).
// vite.config.js optimizeDeps: { esbuildOptions: { // Bumping to 2022 due to "Arbitrary module namespace identifier names" not being // supported in Vite's default browser target https://github.com/vitejs/vite/issues/13556 target: "es2022", // Tree shaking is optional, but recommended treeShaking: true, }, }
All fonts are automatically loaded from the esm.run CDN. For self-hosting purposes, you'll have to copy the content of the folder node_modules/@excalidraw/excalidraw/dist/prod/fonts to the path where your assets should be served from (i.e. public/ directory in your project). In that case, you should also set window.EXCALIDRAW_ASSET_PATH to the very same path, i.e. / in case it's in the root:
<script>window.EXCALIDRAW_ASSET_PATH = "/";</script>
or, if you serve your assets from the root of your CDN, you would do:
<script> window.EXCALIDRAW_ASSET_PATH = "https://cdn.domain.com/subpath/"; </script>
or, if you prefer the path to be dynamically set based on the location.origin, you could do the following:
// Next.js <Script id="load-env-variables" strategy="beforeInteractive"> {`window["EXCALIDRAW_ASSET_PATH"] = location.origin;`} // or use just "/"! </Script>
commitToHistory in favor of captureUpdate in updateScene API #7348, #7898// before updateScene({ elements, appState, commitToHistory: true }); // A updateScene({ elements, appState, commitToHistory: false }); // B // after import { CaptureUpdateAction } from "@excalidraw/excalidraw"; updateScene({ elements, appState, captureUpdate: CaptureUpdateAction.IMMEDIATELY, }); // A updateScene({ elements, appState, captureUpdate: CaptureUpdateAction.NEVER, }); // B
The updateScene API has changed due to the added Store component, as part of the multiplayer undo / redo initiative. Specifically, optional sceneData parameter commitToHistory: boolean was replaced with optional captureUpdate: CaptureUpdateActionType parameter. Therefore, make sure to update all instances of updateScene, which use commitToHistory parameter according to the before / after table below.
Note: Some updates are not observed by the store / history - i.e. updates to
collaboratorsobject or parts ofAppStatewhich are not observed (notObservedAppState). Such updates will never make it to the undo / redo stacks, regardless of the passedcaptureUpdatevalue.
| Undo behaviour | commitToHistory (before) |
captureUpdate (after) |
Notes |
|---|---|---|---|
| Immediately undoable | true |
CaptureUpdateAction.IMMEDIATELY |
Use for updates which should be captured. Should be used for most of the local updates. These updates will immediately make it to the local undo / redo stacks. |
| Eventually undoable | false (default) |
CaptureUpdateAction.EVENTUALLY (default) |
Use for updates which should not be captured immediately - likely exceptions which are part of some async multi-step process. Otherwise, all such updates would end up being captured with the next CaptureUpdateAction.IMMEDIATELY - triggered either by the next updateScene or internally by the editor. These updates will eventually make it to the local undo / redo stacks. |
| Never undoable | n/a | CaptureUpdateAction.NEVER |
NEW: Previously there was no equivalent for this value. Now, it's recommended to use CaptureUpdateAction.NEVER for updates which should never be recorded, such as remote updates or scene initialization. These updates will never make it to the local undo / redo stacks. |
ExcalidrawTextElement.baseline was removed and replaced with a vertical offset computation based on font metrics, performed on each text element re-render. In case of custom font usage, extend the FONT_METRICS object with the related properties. #7693
ExcalidrawEmbeddableElement.validated was removed and moved to the private editor state. This should largely not affect your apps unless you were reading from this attribute. We keep validating embeddable urls internally, and the public props.validateEmbeddable still applies. #7539
Stats container CSS has changed, so if you're using renderCustomStats, you may need to adjust your styles to retain the same layout. #8361
<DefaultSidebar /> triggers are now always merged with host app triggers, rendered through <DefaultSidebar.Triggers/>. <DefaultSidebar.Triggers/> no longer accepts any props other than children. #8498
Prefer user defined coordinates and dimensions when creating a frame using convertToExcalidrawElements #8517
props.initialData can now be a function that returns ExcalidrawInitialDataState or Promise<ExcalidrawInitialDataState> #8107
MainMenu.DefaultItems.ToggleTheme now supports onSelect(theme: string) callback, and optionally allowSystemTheme: boolean alongside theme: string to indicate you want to allow users to set to system theme (you need to handle this yourself) #7853
Add useHandleLibrary's opts.adapter as the new recommended pattern to handle library initialization and persistence on library updates #7655
Add useHandleLibrary's opts.migrationAdapter adapter to handle library migration during init, when migrating from one data store to another (e.g. from LocalStorage to IndexedDB) #7655
Add onPointerUp prop #7638
Expose getVisibleSceneBounds helper to get scene bounds of visible canvas area #7450
Soft-deprecate useHandleLibrary's opts.getInitialLibraryItems in favor of opts.adapter. #7655
Extended window.EXCALIDRAW_ASSET_PATH to accept array of paths string[] as a value, allowing to specify multiple base URL fallbacks. #8286
Custom text metrics provider #9121
Add props.onDuplicate #9117
Change empty arrowhead icon #9100
Tweak slider colors to be more muted #9076
Improve library sidebar performance #9060
Implement custom Range component for opacity control #9009
Box select frame & children to allow resizing at the same time #9031
Allow installing libs from excal github #9041
Update jotai #9015
Do not delete frame children on frame delete #9011
Add action to wrap selected items in a frame #9005
Reintroduce .excalidraw.png default when embedding scene #8979
Add mimeTypes on file save #8946
Add crowfoot to arrowheads #8942
Make HTML attribute sanitization stricter #8977
Validate library install urls #8976
Cleanup svg export and move payload to <metadata> #8975
Use stats panel to crop #8848
Snap when cropping as well #8831
Update blog url #8767
Export scene to e+ on workspace creation/redemption #8514
Added sitemap & fixed robot txt #8699
Do not strip unknown element properties on restore #8682
Added reddit links as embeddable #8099
Self-hosting existing google fonts #8540
Flip arrowheads if only arrow(s) selected #8525
Common elbow mid segments #8440
Merge search sidebar back to default sidebar #8497
Smarter zooming when scrolling to match & only match on search/switch #8488
Reset copyStatus on export dialog settings change #8443
Tweak copy button success animation #8441
Enable panning/zoom while in wysiwyg #8437
Visual debugger #8344
Improve elbow arrow keyboard move #8392
Rewrite d2c to not require token #8269
Split gridSize from enabled state & support custom gridStep #8364
Improve zoom-to-content when creating flowchart #8368
Stats popup style tweaks #8361
Remove automatic frame naming #8302
Ability to debug the state of fractional indices #8235
Improve mermaid detection on paste #8287
Upgrade mermaid-to-excalidraw to v1.1.0 #8226
Bump max file size #8220
Smarter preferred lang detection #8205
Support Stats bound text fontSize editing #8187
Paste as mermaid if applicable #8116
Stop autoselecting text on text edit on mobile #8076
Create new text with width #8038
Wrap long text when pasting #8026
Upgrade to mermaid-to-excalidraw v1 🚀 #8022
Rerender canvas on focus #8035
Add missing type="button" #8030
Add install-PWA to command palette #7935
Tweak a few icons & add line editor button to side panel #7990
Allow binding only via linear element ends #7946
Resize elements from the sides #7855
Record freedraw tool selection to history #7949
Export reconciliation #7917
Add "toggle grid" to command palette #7887
Fractional indexing #7359
Show firefox-compatible command palette shortcut alias #7825
Upgrade mermaid-to-excalidraw to 0.3.0 #7819
Support to not render remote cursor & username #7130
Expose more collaborator status icons #7777
Close dropdown on escape #7750
Text measurements based on font metrics #7693
Improve collab error notification #7741
Grouped together Undo and Redo buttons on mobile #9109
Remove GA code from binding #9042
Load old library if migration fails
Change LibraryPersistenceAdapter load() source -> priority
Fix inconsistency in resizing while maintaining aspect ratio #9116
IFrame and elbow arrow interaction fix #9101
Duplicating/removing frame while children selected #9079
Elbow arrow z-index binding #9067
Library item checkbox style regression #9080
Elbow arrow orthogonality #9073
Button bg CSS variable leaking into other styles #9075
Fonts not loading on export (again) #9064
Merge server-side fonts with liberation sans #9052
Hyperlinks html entities #9063
Remove flushSync to fix flickering #9057
Excalidraw issue #9045 flowcharts: align attributes of new node #9047
Align arrows bound to elements #8833 #8998
Update elbow arrow on font size change #8798 #9002
Undo for elbow arrows create incorrect routing #9046
Flowchart clones the current arrowhead #8581
Adding partial group to frame #9014
Do not refocus element link input on unrelated updates #9037
Arrow binding behaving unexpectedly on pointerup #9010
Change cursor by tool change immediately #8212
Package build fails on worker chunks #8990
Z-index clash in mobile UI #8985
Elbow arrows do not work within frames (issue: #8964) #8969
NormalizeSVG width and height from viewbox when size includes decimal points #8939
Make arrow binding area adapt to zoom levels #8927
Robust state.editingFrame teardown #8941
Regression on dragging a selected frame by its name #8924
Right-click paste for images in clipboard (Issue #8826) #8845
Fixed image transparency by adding alpha option to preserve image alpha channel #8895
Flush pending DOM updates before .focus() #8901
Normalize svg using only absolute sizing #8854
Element link selector dialog z-index & positioning #8853
Update old blog links & add canonical url #8846
Optimize frameToHighlight state change and snapLines state change #8763
Make some events expllicitly active to avoid console warnings #8757
Unify binding update options for updateBoundElements() #8832
Cleanup scripts and support upto node 22 #8794
Usage of node12 which is deprecated #8791
Remove manifest.json #8783
Load env vars correctly and set debug and linter flags to false explicitly in prod mode #8770
Console error in dev mode due to missing font path in non-prod #8756
Text pushes UI due to padding #8745
Fix trailing line whitespaces layout shift #8714
Load font faces in Safari manually #8693
Restore svg image DataURL dimensions #8730
Image cropping svg + compat mode #8710
Usage of node12 which is deprecated #8709
Image render perf #8697
Undo/redo action for international keyboard layouts #8649
Comic Shanns issues, new fonts structure #8641
Remove export-to-clip-as-svg shortcut for now #8660
Text disappearing on edit #8558 (#8624)
Elbow arrow fixedpoint flipping now properly flips on inverted resize and flip action #8324
Svg and png frame clipping cases #8515
Re-route elbow arrows when pasted #8448
Buffer dependency #8474
Linear element complete button disabled #8492
Aspect ratios of distorted images are not preserved in SVG exports #8061
WYSIWYG editor padding is not normalized with zoom.value #8481
Improve canvas search scroll behavior further #8491
AddFiles clears the whole image cache when each file is added - regression from #8471 #8490
select instead of focus search input #8483
Image rendering issue when passed in initialData #8471
Add partial mocking #8473
PropertiesPopover maxWidth changing fixed units to relative units #8456
View mode wheel zooming does not work #8452
Fixed copy to clipboard button #8426
Context menu does not work after after dragging on StatsDragInput #8386
Perf regression in getCommonBounds #8429
Object snapping not working #8381
Reimplement rectangle intersection #8367
Round coordinates and sizes for rectangle intersection #8366
Text content with tab characters act differently in view/edit #8336
Drawing from 0-dimension canvas #8356
Disable flowchart keybindings inside inputs #8353
Yet more patching of intersect code #8352
Missing act() in flowchart tests #8354
Z-index change by one causes app to freeze #8314
Patch over intersection calculation issue #8350
Point duplication in LEE on ALT+click #8347
Do not allow resizing unbound elbow arrows either #8333
Docker build in CI #8312
Duplicating arrow without bound elements throws error #8316
CVE-2023-45133 #7988
Throttle fractional indices validation #8306
Allow binding elbow arrows to frame children #8309
Skip registering font faces for local fonts #8303
Load fonts for exportToCanvas #8298
Re-add Cascadia Code with ligatures #8291
Linear elements not selected on pointer up from hitting its bound text #8285
Revert default element canvas padding change #8266
Freedraw jittering #8238
Messed up env variable #8231
Log allowed events #8224
Memory leak - scene.destroy() and window.launchQueue #8198
Stop updating text versions on init #8191
Add binding update to manual stat changes #8183
Binding after duplicating is now applied for both the old and duplicate shapes #8185
Incorrect point offsetting in LinearElementEditor.movePoints() #8145
Stats state leaking & race conds #8177
Only bind arrow #8152
Repair invalid binding on restore & fix type check #8133
Wysiwyg blur-submit on mobile #8075
Restore linear dimensions from points #8062
Lp plus url #8056
Fix twitter og image #8050
Flaky snapshot tests with floating point precision issues #8049
Always re-generate index of defined moved elements #8040
Undo/redo when exiting view mode #8024
Two finger panning is slow #7849
Compatible safari layers button svg #8020
Correctly resolve the package version #8016
Re-introduce wysiwyg width offset #8014
Font not rendered correctly on init #8002
Command palette filter #7981
Remove unused param from drawImagePlaceholder #7991
Docker build of Excalidraw app #7430
Typo in doc api #7466
Use Reflect API instead of Object.hasOwn #7958
CTRL/CMD & arrow point drag unbinds both sides #6459 (#7877)
Z-index for laser pointer to be able to draw on embeds and such #7918
Double text rendering on edit #7904
Collision regressions from vector geometry rewrite #7902
Correct unit from 'eg' to 'deg' #7891
Allow same origin for all necessary domains #7889
Always make sure we render bound text above containers #7880
Parse embeddable srcdoc urls strictly #7884
Hit test for closed sharp curves #7881
Gist embed allowing unsafe html #7883
Command palette tweaks and fixes #7876
Include borders when testing insides of a shape #7865
External link not opening #7859
Add safe check for arrow points length in tranformToExcalidrawElements #7863
Import #7869
Theme toggle shortcut event.code #7868
Remove incorrect check from index.html #7867
Stop using lookbehind for backwards compat #7824
Ejs support in html files #7822
excalidrawAPI.toggleSidebar not switching between tabs correctly #7821
Correcting Assistant metrics #7758
Add missing font metrics for Assistant #7752
Export utils from excalidraw package in excalidraw library #7731
Split renderScene so that locales aren't imported unnecessarily #7718
Remove dependency of t in blob.ts #7717
Remove dependency of t from clipboard and image #7712
Remove scene hack from export.ts & remove pass elementsMap to getContainingFrame #7713
Decouple pure functions from hyperlink to prevent mermaid bundling #7710
Make bounds independent of scene #7679
Make LinearElementEditor independent of scene #7670
Remove scene from getElementAbsoluteCoords and dependent functions and use elementsMap #7663
Remove t from getDefaultAppState and allow name to be nullable #7666
Stop using structuredClone #9128
Fix elbow arrow fixed binding on restore #9197
Cleanup legacy element.rawText (obsidian) #9203
React 18 element.ref was accessed error #9208
Docked sidebar width #9213
Arrow updated on both sides #8593
Package env vars #9221
Bound elbow arrow on duplication does not route correctly #9236
Do not rebind undragged elbow arrow endpoint #9191
Logging and fixing extremely large scenes #9225
Remove defaultProps #9035
Separate resizing logic from pointer #8155
point() -> pointFrom() to fix compiler issue #8578
Rename example App.tsx -> ExampleApp.tsx #8501
Remove unused env variable #8457
Rename draggingElement -> newElement #8294
Update collision from ga to vector geometry #7636
Improved pointer events related performance when the sidebar is docked with a large library open #9086
Reduce unnecessary frame clippings #8980
Improve new element drawing #8340
Cache the temp canvas created for labeled arrows #8267
Set PWA flag in dev to false #8788
Add a flag VITE_APP_ENABLE_PWA for enabling pwa in dev environment #8784
Upgrade vite to 5.4.x, vitest to 2.x and related vite packages #8459
Add example apps public and vite dev-dist to eslintignore #8326
Add rm:build, rm:node_modules & clean-install scripts #8323
Update release script to build esm #8308
Run tests on master branch #8072
Specify packageManager field #8010
Enable consistent type imports eslint rule #7992
Export types for @excalidraw/utils #7736
Create ESM build for utils package 🥳 #7500
Upgrade to react@19 #9182
Keep customData when converting to ExcalidrawElement. #7656
Umd build for browser since it was breaking in v0.17.0 #7349. Also make sure that when using Vite, the process.env.IS_PREACT is set as "true" (string) and not a boolean.
define: {
"process.env.IS_PREACT": JSON.stringify("true"),
}
Disable caching bounds for arrow labels #7343
Bounds cached prematurely resulting in incorrectly rendered labels #7339
Added support for disabling image tool (also disabling image insertion in general, though keeps support for importing from .excalidraw files) #6320.
For disabling image you need to set 👇
UIOptions.tools = {
image: false
}
Support excalidrawAPI prop for accessing the Excalidraw API #7251.
Export getCommonBounds helper from the package #7247.
Support frames via programmatic API #7205.
Export elementsOverlappingBBox, isElementInsideBBox, elementPartiallyOverlapsWithOrContainsBBox helpers for filtering/checking if elements within bounds. #6727
Regenerate ids by default when using transform api and also update bindings by 0.5px to avoid possible overlapping #7195
Add onChange, onPointerDown, onPointerUp api subscribers #7154.
Support props.locked for setActiveTool #7153.
Add selected prop for MainMenu.Item and MainMenu.ItemCustom components to indicate active state. #7078
The Ref support has been removed in v0.17.0 so if you are using refs, please update the integration to use the excalidrawAPI #7251.
Additionally ready and readyPromise from the API have been discontinued. These APIs were found to be superfluous, and as part of the effort to streamline the APIs and maintain simplicity, they were removed in version v0.17.0 #7251.
useDevice hook's return value was changed to differentiate between editor and viewport breakpoints. #7243
Support Preact #7255. The host needs to set process.env.IS_PREACT to true
When using vite or any build tools, you will have to make sure the process is accessible as we are accessing process.env.IS_PREACT to decide whether to use the preact build.
Since Vite removes env variables by default, you can update the Vite config to ensure it's available 👇
define: {
"process.env.IS_PREACT": process.env.IS_PREACT,
},
This section lists the updates made to the excalidraw library and will not affect the integration.
Allow D&D dice app domain for embeds #7263
Remove full screen shortcut #7222
Make adaptive-roughness less aggressive #7250
Render frames on export #7210
Support mermaid flowchart and sequence diagrams to excalidraw diagrams 🥳 #6920
Support frames via programmatic API #7205
Make clipboard more robust and reintroduce contextmenu actions #7198
Support giphy.com embed domain #7192
Renderer tweaks #6698
Closing of "Save to.." Dialog on Save To Disk #7168
Added Copy/Paste from Google Docs #7136
Remove bound-arrows from frames #7157
New dark mode theme & light theme tweaks #7104
Better laser cursor for dark mode #7132
Laser pointer improvements #7128
Initial Laser Pointer MVP #6739
Export iconFillColor() #6996
Element alignments - snapping #6256
Image insertion bugs #7278
ExportToSvg to honor frameRendering also for name not only for frame itself #7270
Can't toggle penMode off due to missing typecheck in togglePenMode #7273
Replace hard coded font family with const value in addFrameLabelsAsTextElements #7269
Perf issue when ungrouping elements within frame #7265
Fixes the shortcut collision between "toggleHandTool" and "distributeHorizontally" #7189
Allow pointer events when editing a linear element #7238
Make modal use viewport breakpoints #7246
Align input :hover/:focus with spec #7225
Dialog remounting on className updates #7224
Don't update label position when dragging labelled arrows #6891
Frame add/remove/z-index ordering changes #7194
Element relative position when dragging multiple elements on grid #7107
Freedraw non-solid bg hitbox not working #7193
Actions panel ux improvement #6850
Better fill rendering with latest RoughJS #7031
Fix for Strange Symbol Appearing on Canvas after Deleting Grouped Graphics (Issue #7116) #7170
Attempt to fix flake in wysiwyg tests #7173
Ensure ClipboardItem created in the same tick to fix safari #7066
Wysiwyg left in undefined state on reload #7123
Ensure relative z-index of elements added to frame is retained #7134
Memoize static canvas on props.renderConfig #7131
Regression from #6739 preventing redirect link in view mode #7120
Update links to excalidraw-app #7072
Ensure we do not stop laser update prematurely #7100
Remove invisible elements safely #7083
Icon size in manifest #7073
Elements being dropped/duplicated when added to frame #7057
Frame name not editable on dbl-click #7037
Polyfill Element.replaceChildren #7034
DRY out tool typing #7086
Refactor event globals to differentiate from lastPointerUp #7084
DRY out and simplify setting active tool from toolbar #7079
This section lists the updates made to the excalidraw library and will not affect the integration.
Support creating containers, linear elements, text containers, labelled arrows and arrow bindings programatically #6546
Added props.validateEmbeddable to customize embeddable src url validation. #6691
Add support for opts.fitToViewport and opts.viewportZoomFactor in the ExcalidrawAPI.scrollToContent API. #6581.
Sidebar component now supports tabs — for more detailed description of new behavior and breaking changes, see the linked PR. #6213
Exposed DefaultSidebar component to allow modifying the default sidebar, such as adding custom tabs to it. #6213
props.renderSidebar is removed in favor of rendering as children.appState.isSidebarDocked replaced with appState.defaultSidebarDockedPreference with slightly different semantics, and relating only to the default sidebar. You need to handle docked state for your custom sidebars yourself.props.dockable is removed. To indicate dockability, supply props.onDock() alongside setting props.docked.Sidebar.Header is no longer rendered by default. You need to render it yourself.props.onClose replaced with props.onStateChange.restore()/restoreAppState() now retains appState.openSidebar regardless of docked state.This section lists the updates made to the excalidraw library and will not affect the integration.
Properly sanitize element link urls. #6728.
allow avif, jfif, webp, bmp, ico image types #6500
Zen-mode/go-to-plus button style tweaks #7006
Holding down CMD/CTRL will disable snap to grid when grid is active #6983
Update logo #6979
Export changeProperty() and getFormValue(). #6957
Partition main canvas vertically #6759
Add support for simplePDF in Web-Embeds #6810
Introducing Web-Embeds (alias iframe element)#6691
Add support for val.town embeds #6821
Render bold lines in grid #6779
Adds support for stackblitz.com embeds #6813
Cache most of element selection #6747
Support customizing what parts of frames are rendered #6752
Make appState.selectedElementIds more stable #6745
Overwrite confirmation dialogs #6658
Simple analitycs #6683
Introduce frames #6123
Add canvas-roundrect-polyfill package #6675
Polyfill CanvasRenderingContext2D.roundRect #6673
Disable collab feature when running in iframe #6646
Assign random user name when not set #6663
Redesigned collab cursors #6659
Eye dropper #6615
Redesign of Live Collaboration dialog #6635
Recover scrolled position after Library re-opening #6624
Clearing library cache #6621
Update design of ImageExportDialog #6614
Add flipping for multiple elements #5578
Color picker redesign #6216
Add "unlock all elements" to canvas contextMenu #5894
Library sidebar design tweaks #6582
Add Trans component for interpolating JSX in translations #6534
Testing simple analytics and fathom analytics for better privacy of the users #6529
Retain seed on shift-paste #6509
Allow avif, jfif, webp, bmp, ico image types (#6500
Improperly disabling UI pointer-events on canvas interaction #7005
Several eyeDropper fixes #7002
IsBindableElement to affirm frames #6900
Use device.isMobile for sidebar trigger label breakpoint #6994
Export to plus url #6980
Z-index inconsistencies during addition / deletion in frames #6914
Update size-limit so react is not installed as dependency #6964
Stale labeled arrow bounds cache after editing the label #6893
Canvas flickering due to resetting canvas on skipped frames #6960
Grid jittery after partition PR #6935
Regression in indexing when adding elements to frame #6904
Stabilize selectedElementIds when box selecting #6912
Resetting deleted elements on duplication #6906
Make canvas compos memoize appState on props they declare #6897
Scope --color-selection retrieval to given instance #6886
Webpack config exclude statement to system agnostic #6857
Remove embeddable from generic elements #6853
Resizing arrow labels #6789
Eye-dropper not working with app offset correctly on non-1 dPR #6835
Add self destroying service-worker.js to migrate everyone from CRA to Vite #6833
Forgotten REACT_APP env variables #6834
Refresh sw when browser refreshed #6824
Adding to selection via shift box-select #6815
Prevent binding focus NaN value #6803
Use pull request in semantic workflow for better security #6799
Don't show canvasBackground label when UIOptions.canvasActions.changeViewBackgroundColor is false #6781
Use subdirectory for @excalidraw/excalidraw size limit #6787
Use actual dock state to not close docked library on insert #6766
UI disappears when pressing the eyedropper shortcut on mobile #6725
Elements in non-existing frame getting removed #6708
Scrollbars renders but disable #6706
Typo in chart.ts #6696
Do not bind text to container using text tool when it has text already #6694
Don't allow binding text to images #6693
Updated link for documentation page under help section #6654
Collab username style fixes #6668
Bound arrows not updated when rotating multiple elements #6662
Delete setCursor when resize #6660
Creating text while color picker open #6651
Cleanup textWysiwyg and getAdjustedDimensions #6520
Eye dropper not accounting for offsets #6640
Color picker input closing problem #6599
Export dialog shortcut toggles console on firefox #6620
Add react v17 useTransition polyfill #6618
Library dropdown visibility issue for mobile #6613
withInternalFallback leaking state in multi-instance scenarios #6602
Language list containing duplicate en lang #6583
Garbled text displayed on avatars #6575
Assign the original text to text editor only during init #6580
I18n: Apply Trans component to publish library dialogue #6564
Fix brave error i18n string and remove unused #6561
Revert add version tags to Docker build #6540
Don't refresh dimensions for text containers on font load #6523
Cleanup getMaxContainerHeight and getMaxContainerWidth #6519
Cleanup redrawTextBoundingBox #6518
Text jumps when editing on Android Chrome #6503
Removes extra spaces #6558
Fix font family inconsistencies #6501
Factor out shape generation from renderElement.ts pt 2 #6878
Add typeScript support to enforce valid translation keys #6776
Simplify ImageExportDialog #6578
Limiting the suggested binding to fix performance issue #6877
Memoize rendering of library #6622
Improve rendering performance for Library #6587
Use UIAppState where possible to reduce UI rerenders #6560
Increase limit for bundle by 1kb #6880
Update to node 18 in docker #6822
Migrate to Vite 🚀 #6818
Migrate to Vite 🚀 #6713
Increase limit to 290 kB for prod bundle #6809
Add version tags to Docker build #6508
ExcalidrawAPI.scrolToContent has new opts object allowing you to fit viewport to content, and animate the scrolling. #6319
Expose useI18n() hook return an object containing t() i18n helper and current langCode. You can use this in components you render as <Excalidraw> children to render any of our i18n locale strings. #6224
restoreElements API now takes an optional parameter opts which currently supports the below attributes
{ refreshDimensions?: boolean, repairBindings?: boolean }
The same opts param has been added to restore API as well.
For more details refer to the docs
refreshDimensions in restoreElements has been removed and can be enabled via optsThis section lists the updates made to the excalidraw library and will not affect the integration.
Constrain export dialog preview size #6475
Zigzag fill easter egg #6439
Add container to multiple text elements #6428
Starting migration from GA to Matomo for better privacy #6398
Add line height attribute to text element #6360
Add thai lang support #6314
Create bound container from text #6301
Improve text measurements in bound containers #6187
Bind text to container if double clicked on filled shape or stroke #6250
Make repair and refreshDimensions configurable in restoreElements #6238
Show error message when not connected to internet while collabo… #6165
Shortcut for clearCanvas confirmDialog #6114
Disable canvas smoothing (antialiasing) for right-angled elements #6186Co-authored-by: Ignacio Cuadra 67276174+ignacio-cuadra@users.noreply.github.com
Center align text when wrapped in container via context menu #6480
Restore original container height when unbinding text which was binded via context menu #6444
Mark more props as optional for element #6448
Improperly cache-busting on canvas scale instead of zoom #6473
Incorrectly duplicating items on paste/library insert #6467
Library ids cross-contamination on multiple insert #6466
Color picker keyboard handling not working #6464
Abort freedraw line if second touch is detected #6440
Utils leaking Scene state #6461
Split "Edit selected shape" shortcut #6457
Center align text when bind to container via context menu #6451
Update coords when text unbinded from its container #6445
Autoredirect to plus in prod only #6446
Fixing popover overflow on small screen #6433
Introduce baseline to fix the layout shift when switching to text editor #6397
Don't refresh dimensions for deleted text elements #6438
Element vanishes when zoomed in #6417
Don't jump text to end when out of viewport in safari #6416
GetDefaultLineHeight should return default font family line height for unknown font #6399
Revert use ideographic textBaseline to improve layout shift when editing text" #6400
Call stack size exceeded when paste large text #6373 (#6396)
Use ideographic textBaseline to improve layout shift when editing text #6384
Chrome crashing when embedding scene on chrome arm #6383
Division by zero in findFocusPointForEllipse leads to infinite loop in wrapText freezing Excalidraw #6377
Containerizing text incorrectly updates arrow bindings #6369
Ensure export preview is centered #6337
Hide text align for labelled arrows #6339
Refresh dimensions when elements loaded from shareable link and blob #6333
Show error message when measureText API breaks in brave #6336
Add an offset of 0.5px for text editor in containers #6328
Move utility types out of .d.ts file to fix exported declaration files #6315
More jotai scopes missing #6313
Provide HelpButton title prop #6209
Respect text align when wrapping in a container #6310
Compute bounding box correctly for text element when multiple element resizing #6307
Use jotai scope for editor-specific atoms #6308
Consider arrow for bound text element #6297
Text never goes beyond max width for unbound text elements #6288
Svg text baseline #6285
Compute container height from bound text correctly #6273
Fit mobile toolbar and make scrollable #6270
Indenting via tab clashing with IME compositor #6258
Improve text wrapping inside rhombus and more fixes #6265
Improve text wrapping in ellipse and alignment #6172
Don't allow blank space in collab name #6211
Docker build architecture:linux/amd64 error occur on linux/arm64 instance #6197
Sort bound text elements to fix text duplication z-index error #5130
Hide welcome screen on mobile once user interacts #6185
Edit link in docs #6182
Inline SingleLibraryItem into PublishLibrary #6462
Make the example React app reusable without duplication #6188
UIOptions.welcomeScreen option is now deprecated. #6117MainMenu, MainMenu.Item, and MainMenu.ItemLink components now all support onSelect(event: Event): void callback. If you call event.preventDefault(), it will prevent the menu from closing when an item is selected (clicked on). #6152This section lists the updates made to the excalidraw library and will not affect the integration.
Add hand/panning tool #6141
Show copy-as-png export button on firefox and show steps how to enable it #6125
Horizontal padding when aligning bound text containers #6180
Make tunnels work in multi-instance scenarios #6178
Add 1px width to the container to calculate more accurately #6174
Quick typo fix #6167
Set the width correctly using measureText in editor #6162
🐛 broken emojis when wrap text #6153
Button background and svg sizes #6155
Support customization for the editor welcome screen #6048.
Expose component API for the Excalidraw main menu #6034, You can read more about its usage here
Support customization for the Excalidraw main menu #6034.
Footer is now rendered as child component instead of passed as a render prop #5970.
Any top-level children passed to the <Excalidraw/> component that do not belong to one of the officially supported Excalidraw children components are now rendered directly inside the Excalidraw container (previously, they weren't rendered at all) #6096.
Expose LiveCollaborationTrigger component. Replaces props.onCollabButtonClick #6104.
props.onCollabButtonClick is now removed. You need to render the main menu item yourself, and optionally also render the <LiveCollaborationTrigger> component using renderTopRightUI prop if you want to retain the canvas button at top-right.renderFooter is now removed in favor of rendering as a child component.appState.currentItemStrokeSharpness and appState.currentItemLinearStrokeSharpness into appState.currentItemRoundness. Renamed changeSharpness action to changeRoundness. Excalidraw element's strokeSharpness was changed to roundness. Check the PR for types and more details #5553.This section lists the updates made to the excalidraw library and will not affect the integration.
Generic button export #6092
Scroll using PageUp and PageDown #6038
Support shrinking text containers to original height when text removed #6025
Move contextMenu into the component tree and control via appState #6021
Allow readonly actions to be used in viewMode #5982
Support labels for arrow 🔥 #5723
Don't add midpoint until dragged beyond a threshold #5927
Changed text copy/paste behaviour #5786
Reintroduce x shortcut for freedraw #5840
Tweak toolbar shortcuts & remove library shortcut #5832
Clean unused images only after 24hrs (local-only) #5839
Refetch errored/pending images on collab room init load #5833
Stop deleting whole line when no point select in line editor #5676
Editor redesign 🔥 #5780
Mobile tools positioning #6107
Renamed folder MainMenu->main-menu and support rest props #6103
Use position absolute for mobile misc tools #6099
React.memo resolvers not accounting for all props #6042
Image horizontal flip fix + improved tests #5799
Png-exporting does not preserve angles correctly for flipped images #6085
Stale appState of MainMenu defaultItems rendered from Actions #6074
HelpDialog #6072
Show error message on collab save failure #6063
Remove ga from docker build #6059
Use displayName since name gets stripped off when uglifying/minifiyng in production #6036
Remove background from wysiwyg when editing arrow label #6033
Use canvas measureText to calculate width in measureText #6030
Restoring deleted bindings #6029
ColorPicker getColor #5949
Don't push whitespace to next line when exceeding max width during wrapping and make sure to use same width of text editor on DOM when measuring dimensions #5996
Showing grabbing cursor when holding spacebar #6015
Resize sometimes throwing on missing null-checks #6013
PWA not working after CRA@5 update #6012
Not properly restoring element stroke and bg colors #6002
Avatar outline on safari & center #5997
Chart pasting not working due to removing tab characters #5987
Apply the right type of roundness when pasting styles #5979
Remove editor onpaste handler #5971
Remove blank space #5950
Galego and Kurdî missing in languages plus two locale typos #5954
excalidraw-excalidraw-v0.14.0.tgz
ExcalidrawArrowElement rather than ExcalidrawArrowEleement #5955
RenderFooter styling #5962
Repair element bindings on restore #5956
Don't allow whitespaces for bound text #5939
Bindings do not survive history serialization #5942
Dedupe boundElement ids when container duplicated with alt+drag #5938
Scale font correctly when using shift #5935
Always bind to container selected by user #5880
Fonts not rendered on init if loadingdone not fired #5923
Stop replacing del word with Delete #5897
Remove legacy React.render() from the editor #5893
Allow adding text via enter only for text containers #5891
Stop font loadingdone loop when rendering element SVGs #5883
Refresh text dimensions only after font load done #5878
Correctly paste contents parsed by JSON.parse() as text. #5868
SVG element attributes in icons.tsx #5871
Merge existing text with new when pasted #5856
Disable FAST_REFRESH to fix live reload #5852
Paste clipboard contents into unbound text elements #5849
Compute dimensions of container correctly when text pasted on container #5845
Line editor points rendering below elements #5781
Syncing 1-point lines to remote clients #5677
Incorrectly selecting linear elements on creation while tool-locked #5785
Corrected typo in toggle theme shortcut #5813
Hide canvas-modifying UI in view mode #5815
Fix vertical/horizntal centering icons #5812
Consistent use of ZOOM_STEP #5801
Multiple elements resizing regressions #5586
Changelog typo #5795
Move release scripts to use release branch #5958
Stops ignoring .env files from docker context so env variables get set during react app build. #5809
renderSidebar prop (#5663).toggleMenu prop to toggle specific menu open/close state (#5663).customData on Excalidraw elements [#5592].exportPadding?: number; to exportToCanvas and exportToBlob. The default value of the padding is 10.props.UIOptions.canvasActions.theme is now renamed to props.UIOptions.canvasActions.toggleTheme #5660.setToastMessage API is now renamed to setToast API and the function signature is also updated #5427. You can also pass duration and closable attributes along with message.This section lists the updates made to the excalidraw library and will not affect the integration.
Render library into Sidebar on mobile #5774
Additional drag and drop image format support (webp, bmp, ico) #5749
Enter and Exit line editor via context menu #5719
Further reduce darkmode init flash #5701
Support segment midpoints in line editor #5641
Added exportPadding to PNG (blob) export in @excalidraw/utils #5626
Introduce ExcalidrawElements and ExcalidrawAppState provider #5463
Enable midpoint inside linear element editor #5564
Show a mid point for linear elements #5534
Lock angle when editing linear elements with shift pressed #5527
Redesign linear elements 🎉 #5501
Cursor alignment when creating linear elements with shift pressed #5518
Shift-clamp when creating multi-point lines/arrows #5500
Cursor alignment when creating generic elements #5516
Make context menu scrollable #4030
Ungroup short cut key #5779
Replaced KeyboardEvent.code with KeyboardEvent.key for all letters #5523
Free draw flip not scaling correctly #5752
Wait for window focus until prompting for library install #5751
Update perfect freehand library to fix extra dot #5727
RestoreElementWithProperties drops "parent" property #5742
Horizontal text alignment for bound text when resizing #5721
Set the dimensions of bound text correctly #5710
Image-mirroring in export preview and in exported svg #5700
Double state update incorrectly resetting state #5704
Remove no longer used code related to collab room loading #5699
Revert webpack deduping to fix @next runtime #5695
Move to release notes for v0.9.0 and after #5686
Zen-mode exit button not working #5682
Buttons jump around on the mobile menu #5658
#5622 - prevent session theme reset during collaboration #5640
Library actions inside the sidebar #5638
Don't render library menu twice for mobile #5636
Reintroduce help dialog button #5631
Add display name to components so it doesn't show as anonymous #5616
Improve solveQuadratic when a = 0 #5618
Add random tiny offsets to avoid linear elements from being clipped #5615
Crash when adding a new point in the line editor #5602 #5606
Allow box selection of points when inside editor #5594
Remove unnecessary conditions in pointerup for linear elements #5575
Check if hitting link in handleSelectionOnPointerDown #5589
Points not being normalized on single-elem resize #5581
Deselect linear element when clicked inside bounding box outside editor #5579
Resize multiple elements from center #5560
Call static methods via class instead of instance in linearElementEditor #5561
Show bounding box for 3 or more linear point elements #5554
Cleanup the condition for dragging elements #5555
Shareable links being merged with current scene data #5547
Scene lookup failing when looking up by id #5542
Remove rounding to fix jitter when shift-editing #5543
Line deselected when shift-dragging point outside editor #5540
Flip linear elements after redesign #5538
Disable locking aspect ratio for box-selection #5525
Add title attribute to the modal close button #5521
Context menu positioning when component has offsets #5520
Resolve paths in prebuild.js script #5498
Use flushSync when moving line editor since we need to read previous value after setting state #5508
UseLayout effect cleanup in dev mode for charts #5505
Revert browser toast for high/low zoom #5495
Fixing push to DockerHub #5468
Incorrectly rendering freedraw elements #5481
Generate types when building example #5480
Use React.FC as react-dom is not able to infer types of Modal #5479
Missing translation for "Scale" to Export Dialog #5456
Add display name for Excalidraw component so it doesn't show as anonymous #5464
Account for safe area for floating buttons on mobile #5420
Attribute warnings in comment svg example #5465
Check for ctrl key when wheel event triggered to only disable zooming #5459
Disable render throttling by default & during resize #5451
Attach wheel event to exscalidraw container only #5443
Show toast when browser zoom is not 100% #5304
Prevent browser zoom inside Excalidraw #5426
Typo in changelog #5425
Create a util to compute container dimensions for bound text container #5708
Reuse common ui dialogs and message for mobile and LayerUI #5611
Stats component #5610
Move footer to its own component #5609
Remove unused attribute hasHitElementInside from pointerDownState #5591
Cleanup renderScene #5573
Rename docs to dev-docs #5487
Remove unnecessary if condition for linear element onKeyDown #5486
Improve typing & check #5415
Don't pass zenModeEnable, viewModeEnabled and toggleZenMode props to LayerUI #5444
Add missing dependencies: pica, lodash #5656
Move dotenv to dev deps #5472
loadLibraryFromBlob now takes an additional parameter defaultStatus which sets the default status of library item if not present, defaults to unpublished #5067.
Add UIOptions.dockedSidebarBreakpoint to customize at which point to break from the docked sidebar #5274.
Added support for supplying user id in the Collaborator object (see collaborators in updateScene()), which will be used to deduplicate users when rendering collaborator avatar list. Cursors will still be rendered for every user. #5309
Export API to set and reset mouse cursor on the canvas #5215.
Export sceneCoordsToViewportCoords and viewportCoordsToSceneCoords utilities #5187.
Added useHandleLibrary hook to automatically handle importing of libraries when #addLibrary URL hash key is present, and potentially for initializing library as well #5115.
Also added parseLibraryTokensFromUrl to help in manually importing library from URL if desired.
#addLibrary hash key is present. Host apps now need to handle this themselves with the help of either of the above APIs (useHandleLibrary is recommended).Added updateLibrary API to update (replace/merge) the library #5115.
updateScene API no longer supports passing libraryItems. Instead, use the updateLibrary API.Add support for integrating custom elements #5164.
onPointerDown callback which gets triggered on pointer down events.onScrollChange callback which gets triggered when scrolling the canvas.setActiveTool which host can call to set the active tool.Exported loadSceneOrLibraryFromBlob function #5057.
Export MIME_TYPES supported by Excalidraw #5135.
Support avatarUrl for collaborators. Now onwards host can pass avatarUrl to render the customized avatar for collaborators #5114, renamed in #5177.
Support libraryItems argument in initialData.libraryItems and updateScene({ libraryItems }) to be a Promise resolving to LibraryItems, and support functional update of libraryItems in updateScene({ libraryItems }). #5101.
Expose util mergeLibraryItems #5101.
Expose util exportToClipboard which allows to copy the scene contents to clipboard as svg, png or json #5103.
Expose window.EXCALIDRAW_EXPORT_SOURCE which you can use to overwrite the source field in exported data #5095.
The exportToBlob utility now supports the exportEmbedScene option when generating a png image #5047.
Exported restoreLibraryItems API #4995.
Allow returning null in renderFooter prop #5282.
Transpile browser-fs-access dependency so that its for await syntax doesn't force es2018 requirement onto dependent projects #5041.
Use window.EXCALIDRAW_ASSET_PATH for fonts when exporting to svg #5065.
Library menu now properly rerenders if open when library is updated using updateScene({ libraryItems }) #4995.
appState.elementLocked to appState.activeTool.locked #4983.serializeLibraryAsJSON helper that we use when saving Excalidraw Library to a file.You will need to pass activeTool.locked instead of elementType from now onwards in appState.
appState.elementType to appState.activeTool which is now an object #4698.You will need to pass activeTool instead of elementType from now onwards in appState
You will need to import the named export from now onwards to use the component
Using bundler 👇
import { Excalidraw } from "@excalidraw/excalidraw";
In Browser 👇
React.createElement(ExcalidrawLib.Excalidraw, opts);
This section lists the updates made to the excalidraw library and will not affect the integration.
Throttle scene rendering to animation framerate #5422
Make toast closable and allow custom duration #5308
Collab component state handling rewrite & fixes #5046
Support debugging PWA in dev #4853
Redirect vscode.excalidraw.com to vscode marketplace #5285
Go-to-excalidrawplus button #5202
Autoredirect to Excalidraw+ if special cookie is present #5183
Support resubmitting published library items #5174
Support adding multiple library items on canvas #5116
Support customType in activeTool #5144
Stop event propagation when key handled #5091
Rewrite library state management & related refactor #5067
Delay initial loading message & tweak design #5049
Reconcile when saving to firebase #4991
Hide trash button during collaboration #5037
Refactor local persistence & fix race condition on SW reload #5032
Element locking #4964
Copy to clipboard all text nodes as text #5013
Create and expose serializeLibraryAsJSON #5009
Hide penMode button on reload if not enabled #4992
Eraser toggle to switch back to the previous tool #4981
Save penDetected and penMode, and detect pen already on ToolButton click #4955
Support binding text to container via context menu #4935
Map shortcut O to ellipse and Add eraser shortcut E #4930
Update eraser cursor #4922
Add Eraser 🎉 #4887
Added optional REACT_APP_WS_SERVER_URL for forks usecases #4889
Rewrite collab server connecting #4881
Support vertical text align for bound containers #4852
Support custom colors 🎉 #4843
Support Links in Exported SVG #4791
Scale font size when bound text containers resized with shift pressed #4828
Autorelease job name #5412
Action name for autorelease #5411
Typecast file to fix the build #5410
File handle not persisted when importing excalidraw files #5372
Library not scrollable when no published items installed #5352
Focus traps inside popovers #5317
Unable to use cmd/ctrl-delete/backspace in inputs #5348
Delay loading until language imported #5344
Command to trigger release #5347
Remove unnecessary options passed to language detector #5336
Stale appState.pendingImageElement #5322
Non-letter shortcuts being swallowed by color picker #5316
Bind text to correct container when nested #5307
Copy bound text style when copying element having bound text #5305
Copy arrow head when using copy styles #5303
Unsafely accessing draggingElement #5216
Library load button does not work #5205
Do not deselect when not zooming using touchscreen pinch #5181
Wheel zoom normalization #5165
Hide sidebar when custom tool active #5179
Don't save deleted ExcalidrawElements to Firebase #5108
Eraser removed deleted elements #5155
Handle ColorPicker parentSelector being undefined #5152
Library multiselect not accounting for published state #5132
Chart display fix #5154
Update opacity of bound text when opacity of container updated #5142
Jumping of text when typing single line in bound text #5139
Remove opacity scroll wheel interaction #5111
Propagate keydown events from excalidraw-wysiwyg inputs #5099
Don't bind text to container if double clicked else instead of center #5105
ToolIcon height not using rem #5092
Excalidraw named export type #5078
BoundElementIds when arrows bound to elements are deleted #5077
Don't merge libraryItems on updateScene #5076
SVG metadata extraction regex on multiline elements #5074
Eraser cursor showing on theme change when not using eraser #4990
Update storage.rules #5020
Add image button not working on iPad #5038
Ensure svg image dimensions are always set #5044
Pinch zoom in view mode #5001
Select whole group on righclick & few lock-related fixes #5022
Export serializeLibraryAsJSON from the package #5017
Support copying PNG to clipboard on Safari #3746
More copyText fixes #5016
Copy to clipboard all text nodes as text #5014
Update cursorButton once freedraw is released #4996
Decouple actionFinalize and actionErase #4984
Using stale state when switching tools #4989
UpdateWysiwygStyle updatedElement is undefined TypeError #4980
Adding check for link length to prevent early return #4982
Show link icon for bound text containers #4960
Cancel erase elements on pointer up if eraser is not active on pointer up #4956
Restore original opacities when alt pressed while erasing #4954
Don't bind text to container if already present #4946
Erase all elements which are hit with single point click #4934
Add multiElement-edit finalize action to Desktop (currently only visible in Mobile view) #4764
Hide eraser in view mode in desktop #4929
Undo when erasing elements by clicking #4921
Undo when erasing #4900
Incorrectly erasing on mobile #4899
Don't crash on drop highlighted text onto canvas #4890
Paste styles shortcut #4886
Freedraw element's background fill color missing from SVG when exporting with package API exportToSvg() #4871
Improve pointer syncing performance #4883
Collab room initialization #4882
Ensure verticalAlign properties not shown when no element selected #4860
Binding text to non-bindable containers and not always preferring selection #4655
Don't show align icons for single bound container element #4846
Redraw text bounding box when pasting styles #4845
Restore cursor position after bound text container value updated #4836
Support resizing multiple bound text containers #4824
Also check overflowY: overlay in detectScroll #4806
Stuck resizing when resizing bound text container very fast beyond threshold #4804
Extract all i18n files into locales folder #5419
Automate release step fully #5414
Use next and preview tags instead of separate packages for next and preview release #5346
Support runtime React Jsx in @excalidraw/utils #4866
Release @excalidraw/utils 0.1.1 #4862
Remove build packages workflow #4835
Add onLinkOpen prop which will be triggered when clicked on element hyperlink if present #4694.
Support updating library using updateScene API #4546.
Introduced primary colors to the app. The colors can be overriden. Check readme on how to do so #4387.
exportToBlob now automatically sets appState.exportBackground to true if exporting to image/jpeg MIME type (to ensure that alpha channel is not compressed to black color) #4342.
Remove getElementMap util #4306.
Changes to exportToCanvas util function #4321:
maxWidthOrHeight?: number attribute.scale returned from getDimensions() is now optional (default to 1).Image support added for host PR
General notes:
ExcalidrawAPI:
getFiles() to get current BinaryFiles (Record<FileId, BinaryFileData>). It may contain files that aren't referenced by any element, so if you're persisting the files to a storage, you should compare them against stored elements.Excalidraw app props:
generateIdForFile(file: File) optional prop so you can generate your own ids for added files.onChange(elements, appState, files) prop callback is now passed BinaryFiles as third argument.onPaste(data, event) data prop should contain data.files (BinaryFiles) if the elements pasted are referencing new files.initialData object now supports additional files (BinaryFiles) attribute.Other notes:
.excalidraw files may now contain top-level files key in format of Record<FileId, BinaryFileData> when exporting any (image) elements.files, you can refer to the docs for the same.Export isLinearElement and getNonDeletedElements #4072.
Support renderTopRightUI in mobile UI #4065.
Export THEME constant from the package so host can use this when passing the theme #4055.
The Appearance type is now removed and renamed to Theme so Theme type needs to be used.
unmounted state on the component once component mounts to fix the mounting/unmounting repeatedly when used with useEffect #4682.mousewheel-drag and space-drag now prevents the browser from scrolling the container/page #4489. @excalibot trigger release
#4750.
Added an example to test and develop the package locally using yarn start #4488
Remove file-loader so font assets are not duplicated by webpack and use webpack asset modules for font generation #4380.
We're now compiling to es2017 target. Notably, async/await is not compiled down to generators. #4341.
This section lists the updates made to the excalidraw library and will not affect the integration.
Show group/group and link action in mobile #4795
Support background fill for freedraw shapes #4610
Keep selected tool on canvas reset #4728
Make whole element clickable in view mode when it has hyperlink #4735
Allow any precision when zooming #4730
Throttle pointermove events per framerate #4727
Support hyperlinks 🔥 #4620
Added penMode for palm rejection #4657
Support unbinding bound text #4686
Sync local storage state across tabs when out of sync #4545
Support contextMenuLabel to be of function type to support dynmaic labels #4654
Support decreasing/increasing fontSize via keyboard #4553
Link to new LP for excalidraw plus #4549
Update stroke color of bounded text along with container #4541
Hints and shortcuts help around deep selection #4502
Support updating text properties by clicking on container #4499
Bind text to shapes when pressing enter and support sticky notes 🎉 #4343
Change boundElementIds → boundElements #4404
Support selecting multiple points when editing line #4373
Horizontally center toolbar menu commit link
Add support for rounded corners in diamond #4369
Allow zooming up to 3000% #4358
Stop discarding precision when rendering #4357
Support Image binding #4347
Add element.updated #4070
Compress shareLink data when uploading to json server #4225
Supply version param when installing libraries #4305
Log FS abortError to console #4279
Add validation for website and remove validation for library item name #4269
Allow publishing libraries from UI #4115
Create confirm dialog to use instead of window.confirm #4256
Allow letters in IDs for storing files in backend #4224
Remove support for V1 unencrypted backend #4189
Use separate backend for local storage #4187
Add hint around canvas panning #4159
Stop using production services for development #4113
Add triangle arrowhead #4024
Add rewrite to webex landing page #4102
Switch collab server #4092
Use dialog component for clear canvas instead of window confirm #4075
Rename --color-primary-chubb to --color-primary-contrast-offset and fallback to primary color if not present #4803
Add commits directly pushed to master in changelog #4798
Don't bump element version when adding files data #4794
Mobile link click #4742
ContextMenu timer & pointers not correctly reset on iOS #4765
Use absolute coords when rendering link popover #4753
Changing font size when text is not selected or edited #4751
Disable contextmenu on non-secondary pen events or touch #4675
Mobile context menu won't show on long press #4741
Do not open links twice #4738
Make link icon clickable in mobile #4736
Apple Pen missing strokes #4705
Freedraw slow movement jittery lines #4726
Disable three finger pinch zoom in penMode #4725
Remove click listener for opening popup #4700
Link popup position not accounting for offsets #4695
PenMode darkmode style #4692
Typing _+ in wysiwyg not working #4681
Keyboard-zooming in wysiwyg should zoom canvas #4676
SceneCoordsToViewportCoords, jumping text when there is an offset #4413 (#4630)
Right-click object menu displays partially off-screen #4572 (#4631)
Support collaboration in bound text #4573
Cmd/ctrl native browser behavior blocked in inputs #4589
Use cached width when calculating min width during resize #4585
Support collaboration in bounded text #4580
Port for collab server and update docs #4569
Don't mutate the bounded text if not updated when submitted #4543
Prevent canvas drag while editing text #4552
Support shift+P for freedraw #4550
Prefer spreadsheet data over image #4533
Show text properties button states correctly for bounded text #4542
Rotate bounded text when container is rotated before typing #4535
Undo should work when selecting bounded textr #4537
Reduce padding to 5px for bounded text #4530
Bound text doesn't inherit container #4521
Text wrapping with grid #4505 (#4506)
Check if process is defined before using so it works in browser #4497
Pending review fixes for sticky notes #4493
Pasted elements except binded text once paste action is complete #4472
Don't select binded text when ungrouping #4470
Set height correctly when text properties updated while editing in container until first submit #4469
Align and distribute binded text in container and cleanup #4468
Move binded text when moving container using keyboard #4466
Support dragging binded text in container selected in a group #4462
Vertically align single line when deleting text in bounded container #4460
Update height correctly when updating text properties in binded text #4459
Align library item previews to center #4447
Vertically center align text when text deleted #4457
Vertically center the first line as user starts typing in container #4454
Switch cursor to center of container when adding text when dimensions are too small #4452
Vertically center align the bounded text correctly when zoomed #4444
Support updating stroke color for text by typing in color picker input #4415
Bound text not atomic with container when changing z-index #4414
Update viewport coords correctly when editing text #4416
Use word-break break-word only and update text editor height only when binded to container #4410
Husky not able to execute pre-commit on windows #4370
Make firebase config parsing not fail on undefined env #4381
Adding to library via contextmenu when no image is selected #4356
Export scale quality regression #4316
Remove 100% height from tooltip container to fix layout issues #3980
Inline ENV variables when building excalidraw package #4311
SVG export in dark mode with embedded bitmap image #4285
New FS API not working on Linux #4280
Url -> URL for consistency #4277
Prevent adding images to library via contextMenu #4264
Account for libraries v2 when prompting #4263
Skia rendering issues #4200
Ellipse roughness when 0 #4194
Proper string for invalid SVG #4191
Images not initialized correctly #4157
Image-related fixes #4147
Rewrite collab element reconciliation to fix z-index issues #4076
Redirect excalidraw.com/about to for-webex.excalidraw.com #4104
Redirect to webex LP instead of rewrite to fix SW #4103
Clear image/shape cache of affected elements when adding files #4089
Clear LibraryUnit DOM on unmount #4084
Pasting images on firefox #4085
Simplify zoom by removing zoom.translation #4477
Deduplicate encryption helpers #4146
Rename release command to 'release package' #4783
Deploy excalidraw package example #4762
Allow package.json changes when autoreleasing next #4068
onPaste prop should return false to prevent the native excalidraw paste action #3974.
onPaste returned true, but now it should return false to prevent the paste action. This was done to make it semantically more correct and intuitive.This section lists the updates made to the excalidraw library and will not affect the integration.
Improve freedraw shape #3984
Make color ARIA labels better #3871
Add origin trial tokens #3853
Re-order zoom buttons #3837
Add undo/redo buttons & tweak footer #3832
Resave to png/svg with metadata if you loaded your scene from a png/svg file #3645
Abstract and fix legacy fs #4032
Context menu positioning #4025
Added alert for bad encryption key #3998
OnPaste should return false to prevent paste action #3974
Help-icon now visible on Safari #3939
Permanent zoom mode #3931
Undo/redo buttons gap in Safari #3836
Prevent gradual canvas misalignment #3833
Color picker shortcuts not working when elements selected #3817
restore(data, localAppState, localElements) and restoreElements(elements, localElements) now take localElements argument which will be used to ensure existing elements' versions are used and incremented. This fixes an issue where importing the same file would resolve to elements with older versions, potentially causing issues when reconciling #3797.
localElements argument is mandatory (can be null/undefined) if using TypeScript.Support appState.exportEmbedScene attribute in exportToSvg which allows to embed the scene data #3777.
metadata is now removed as metadata was only used to embed scene data which is now supported with the appState.exportEmbedScene attribute.exportToSvg now resolves to a promise which resolves to svg of the exported drawing.Expose loadLibraryFromBlob, loadFromBlob, and getFreeDrawSvgPath #3764.
Expose FONT_FAMILY so that consumer can use when passing initialData.appState.currentItemFontFamily #3710.
Added prop autoFocus to focus the excalidraw component on page load when enabled, defaults to false #3691.
Note: Earlier Excalidraw component was focussed by default on page load, you need to enable autoFocus prop to retain the same behaviour.
Added prop UIOptions.canvasActions.export.renderCustomUI to support Custom UI rendering inside export dialog #3666.
Added prop UIOptions.canvasActions.saveAsImage to show/hide the Save as image button in the canvas actions. Defauls to true hence the Save as Image button is rendered #3662.
Export dialog can be customised with UiOptions.canvasActions.export #3658.
Also, UIOptions is now memoized to avoid unnecessary rerenders.
UIOptions.canvasActions.saveAsScene is now renamed to UiOptions.canvasActions.export.saveFileToDisk. Defaults to true hence the save file to disk button is rendered inside the export dialog.exportToBackend is now renamed to UIOptions.canvasActions.export.exportToBackend. If this prop is not passed, the shareable-link button will not be rendered, same as before.UIOptions.canvasActions.saveScene to UIOptions.canvasActions.saveToActiveFile#3657.shouldAddWatermark: boolean attribute from options for export APIs #3639.appState.shouldAddWatermark so in case you were passing shouldAddWatermark in initialData.AppState it will not work anymore.This section lists the updates made to the excalidraw library and will not affect the integration.
Switch to selection tool on library item insert #3773
Show active file name when saving to current file #3733
Add hint around text editing #3708
Change library icon to be more clear #3583
Pass current theme when installing libraries #3701
Update virgil font #3692
Support exporting json to excalidraw plus #3678
Save exportScale in AppState #3580
Add shortcuts for stroke and background color picker #3318
Exporting redesign #3613
Auto-position tooltip and suport overflowing container #3631
Auto release @excalidraw/excalidraw-next on every change #3614
Allow inner-drag-selecting with cmd/ctrl #3603
view mode cursor adjustments #3809.
Pass next release to updatePackageVersion & replace ## unreleased with new version #3806
Include deleted elements when passing to restore #3802
Import React before using jsx #3804
Ensure s and g shortcuts work on no selection #3800
Keep binding for attached arrows after changing text #3754
Deselect elements on viewMode toggle #3741
Allow pointer events for disable zen mode button #3743
Use rgba instead of shorthand alpha #3688
Color pickers not opening on mobile #3676
On contextMenu, use selected element regardless of z-index #3668
SelectedGroupIds not being stored in history #3630
Overscroll on touch devices #3663
Small UI issues around image export dialog #3642
Normalize linear element points on restore #3633
Disable pointer-events on footer-center container #3629
Delete React SyntheticEvent persist #3700
Code clean up #3681
Add release script to update relevant files and commit for next release #3805
Add script to update changelog before a stable release #3784
Add script to update readme before stable release #3781