Releases: excalidraw/excalidraw
v0.18.0 (2025-03-11)
Excalidraw Library
0.18.0 (2025-03-11)
Highlights
-
Command 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
-
Flowcharts #8329
-
Scene search #8438
-
Image cropping #8613
-
Element linking #8812
Breaking changes
Deprecated UMD bundle in favor of ES modules #7441, #9127
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.
Typescript: deprecated "moduleResolution": "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.
ESM strict resolution
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.
New structure of the imports
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>Deprecated excalidraw-assets and excalidraw-assets-dev folders #8012, #9127
The excalidraw-assets and excalidraw-assets-dev folders, which contained locales and fonts, are no longer used and have been deprecated.
Locales
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,
},
}Fonts
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>Deprecated 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,
}); // BThe 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. |
Other
-
ExcalidrawTextElement.baselinewas 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 theFONT_METRICSobject with the related properties. #7693 -
ExcalidrawEmbeddableElement.validatedwas 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 publicprops.validateEmbeddablestill 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. [#836...
v0.17.3 (2024-02-09)
v0.17.0 (2023-11-14)
v0.17.0 (2023-11-14)
Features
-
Added support for disabling
imagetool (also disabling image insertion in general, though keeps support for importing from.excalidrawfiles) #6320.For disabling
imageyou need to set 👇UIOptions.tools = { image: false } -
Support
excalidrawAPIprop for accessing the Excalidraw API #7251. -
Export
getCommonBoundshelper from the package #7247. -
Support frames via programmatic API #7205.
-
Export
elementsOverlappingBBox,isElementInsideBBox,elementPartiallyOverlapsWithOrContainsBBoxhelpers 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
selectedprop forMainMenu.ItemandMainMenu.ItemCustomcomponents to indicate active state. #7078
Fixes
- Double image dialog on image insertion #7152.
Breaking Changes
-
The
Refsupport has been removed in v0.17.0 so if you are using refs, please update the integration to use theexcalidrawAPI#7251. -
Additionally
readyandreadyPromisefrom 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. -
useDevicehook's return value was changed to differentiate betweeneditorandviewportbreakpoints. #7243
Build
-
Support Preact #7255. The host needs to set
process.env.IS_PREACTtotrueWhen using
viteor any build tools, you will have to make sure theprocessis accessible as we are accessingprocess.env.IS_PREACTto decide whether to use thepreactbuild.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, },
Excalidraw Library
This section lists the updates made to the excalidraw library and will not affect the integration.
Features
-
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
Fixes
-
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/:focuswith 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
ClipboardItemcreated 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
Refactor
-
DRY out tool typing #7086
-
Refactor event globals to differentiate from
lastPointerUp#7084 -
DRY out and simplify setting active tool from toolbar #7079
Performance
- Improve element in frame check #7124
v0.16.1 (2023-09-21)
v0.16.0 (2023-09-19)
0.16.0 (2023-09-19)
Features
-
Support creating containers, linear elements, text containers, labelled arrows and arrow bindings programatically #6546
-
Added
props.validateEmbeddableto customize embeddable src url validation. #6691 -
Add support for
opts.fitToViewportandopts.viewportZoomFactorin theExcalidrawAPI.scrollToContentAPI. #6581. -
Sidebar component now supports tabs — for more detailed description of new behavior and breaking changes, see the linked PR. #6213
-
Exposed
DefaultSidebarcomponent to allow modifying the default sidebar, such as adding custom tabs to it. #6213BREAKING CHANGES
props.renderSidebaris removed in favor of rendering aschildren.appState.isSidebarDockedreplaced withappState.defaultSidebarDockedPreferencewith slightly different semantics, and relating only to the default sidebar. You need to handledockedstate for your custom sidebars yourself.- Sidebar
props.dockableis removed. To indicate dockability, supplyprops.onDock()alongside settingprops.docked. Sidebar.Headeris no longer rendered by default. You need to render it yourself.props.onClosereplaced withprops.onStateChange.restore()/restoreAppState()now retainsappState.openSidebarregardless of docked state.
Excalidraw Library
This section lists the updates made to the excalidraw library and will not affect the integration.
Features
-
Properly sanitize element
linkurls. #6728. -
allow
avif,jfif,webp,bmp,icoimage 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()andgetFormValue(). #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.selectedElementIdsmore 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
seedon shift-paste #6509 -
Allow
avif,jfif,webp,bmp,icoimage types (#6500
Fixes
-
Improperly disabling UI pointer-events on canvas interaction #7005
-
Several eyeDropper fixes #7002
-
IsBindableElement to affirm frames #6900
-
Use
device.isMobilefor 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
selectedElementIdswhen box selecting #6912 -
Resetting deleted elements on duplication #6906
-
Make canvas compos memoize appState on props they declare #6897
-
Scope
--color-selectionretrieval to given instance #6886 -
Webpack config exclude statement to system agnostic #6857
-
Remove
embeddablefrom 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
canvasBackgroundlabel whenUIOptions.canvasActions.changeViewBackgroundColoris 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](https://github.com/excalidraw/excalidraw/pu...
v0.15.0 (2023-04-18)
Features
-
ExcalidrawAPI.scrolToContenthas new opts object allowing you to fit viewport to content, and animate the scrolling. #6319 -
Expose
useI18n()hook return an object containingt()i18n helper and currentlangCode. You can use this in components you render as<Excalidraw>children to render any of our i18n locale strings. #6224 -
restoreElementsAPI now takes an optional parameteroptswhich 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
BREAKING CHANGE
- The optional parameter
refreshDimensionsinrestoreElementshas been removed and can be enabled viaopts
Fixes
- Exporting labelled arrows via export utils #6443
Excalidraw Library
This section lists the updates made to the excalidraw library and will not affect the integration.
Features
-
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
Fixes
-
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
ideographictextBaseline to improve layout shift when editing text" #6400 -
Call stack size exceeded when paste large text #6373 (#6396)
-
Use
ideographictextBaseline 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.tsfile 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
tabclashing 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
Refactor
-
Inline
SingleLibraryItemintoPublishLibrary#6462 -
Make the example React app reusable without duplication #6188
Performance
- Break early if the line width <= max width of the container #6347
Build
- Move TS and types to devDependencies #6346
v0.14.2
0.14.2 (2023-02-01)
Features
- Welcome screen no longer renders by default, and you need to render it yourself.
UIOptions.welcomeScreenoption is now deprecated. #6117 MainMenu,MainMenu.Item, andMainMenu.ItemLinkcomponents now all supportonSelect(event: Event): voidcallback. If you callevent.preventDefault(), it will prevent the menu from closing when an item is selected (clicked on). #6152
Fixes
- declare css variable for font in excalidraw so its available in host #6160
Excalidraw Library
This section lists the updates made to the excalidraw library and will not affect the integration.
Features
-
Add hand/panning tool #6141
-
Show copy-as-png export button on firefox and show steps how to enable it #6125
Fixes
-
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
Styles
Build
- Temporarily disable pre-commit #6132
v0.14.1
v0.14.0 (2023-01-13)
0.14.0 (2023-01-13)
Features
-
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
-
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.
BREAKING CHANGES
props.onCollabButtonClickis 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.- The prop
renderFooteris now removed in favor of rendering as a child component.
Excalidraw schema
- Merged
appState.currentItemStrokeSharpnessandappState.currentItemLinearStrokeSharpnessintoappState.currentItemRoundness. RenamedchangeSharpnessaction tochangeRoundness. Excalidraw element'sstrokeSharpnesswas changed toroundness. Check the PR for types and more details #5553.
Excalidraw Library
This section lists the updates made to the excalidraw library and will not affect the integration.
Features
-
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
xshortcut forfreedraw#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
Fixes
-
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
grabbingcursor when holdingspacebar#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 -
ExcalidrawArrowElementrather thanExcalidrawArrowEleement#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
loadingdonenot fired #5923 -
Stop replacing
delword withDelete#5897 -
Remove legacy React.render() from the editor #5893
-
Allow adding text via enter only for text containers #5891
-
Stop font
loadingdoneloop 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...
0.13.0 (2022-10-27)
0.13.0 (2022-10-27)
Excalidraw API
Features
- Support rendering custom sidebar using
renderSidebarprop (#5663). - Add
toggleMenuprop to toggle specific menu open/close state (#5663). - Support theme to be semi-controlled #5660.
- Added support for storing
customDataon Excalidraw elements [#5592]. - Added
exportPadding?: number;to exportToCanvas and exportToBlob. The default value of the padding is10.
Breaking Changes
props.UIOptions.canvasActions.themeis now renamed toprops.UIOptions.canvasActions.toggleTheme#5660.setToastMessageAPI is now renamed tosetToastAPI and the function signature is also updated #5427. You can also passdurationandclosableattributes along withmessage.
Excalidraw Library
This section lists the updates made to the excalidraw library and will not affect the integration.
Features
-
Render library into
Sidebaron 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
Fixes
-
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
@nextruntime #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
titleattribute 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 [#54...