Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
681 commits
Select commit Hold shift + click to select a range
2523624
fix: React 18 element.ref was accessed error (#9208)
mtolmacs Mar 2, 2025
d1112bb
fix: docked sidebar width (#9213)
dwelle Mar 2, 2025
d21c6a1
chore: bump [email protected] (#9210)
dwelle Mar 4, 2025
c5d3bb0
fix: #8475 Arrow updated on both sides (#8593)
ritk20 Mar 4, 2025
d92384b
revert: `vite@6` -> `vite@5` (#9220)
dwelle Mar 4, 2025
70c3e92
fix: package env vars (#9221)
dwelle Mar 4, 2025
a9e2d23
chore: Logging and fixing extremely large scenes (#9225)
mtolmacs Mar 5, 2025
4ec812b
fix: Bound elbow arrow on duplication does not route correctly (#9236)
mtolmacs Mar 8, 2025
d587b8a
fix: Do not rebind undragged elbow arrow endpoint (#9191)
mtolmacs Mar 10, 2025
69bc5bd
chore: post publish docs & examples changes (#9217)
Mrazator Mar 11, 2025
817d8c5
docs: update CHANGELOG (#9243)
Mrazator Mar 11, 2025
82b9a6b
docs: CHANGELOG typos 🙏 (#9250)
Mrazator Mar 11, 2025
21ffaf4
refactor: auto ordered imports (#9163)
Mrazator Mar 12, 2025
30983d8
fix: Arrow conversion regression (#9241)
mtolmacs Mar 15, 2025
99d8bff
fix: elements offset incorrectly when action-duplicated during drag (…
dwelle Mar 15, 2025
58990b4
fix: 'Rotate' spell error (#9288)
saifeiLee Mar 22, 2025
77aca48
fix: Refactor and merge duplication and binding (#9246)
mtolmacs Mar 23, 2025
e1bb59f
chore: Use isDevEnv() and isTestEnv() (#9264)
mursaleen-nisar Mar 24, 2025
6c3a434
docs: Fix table rendering and broken links in Props page (#9293)
mubaraqwahab Mar 25, 2025
ab89d4c
feat: add keyboard shortcut to save file in text (#9295)
kodify-js Mar 25, 2025
a18f059
fix: Reduce allocations in collision detection (#9299)
mtolmacs Mar 26, 2025
432a46e
refactor: separate elements logic into a standalone package (#9285)
Mrazator Mar 26, 2025
0cd5a25
fix: incorrect type imports (#9308)
Mrazator Mar 27, 2025
d797c2e
fix: strip legacy attrs on element restore (#9318)
dwelle Mar 29, 2025
f2e8404
feat: allow to disable preventUnload in dev (#9319)
dwelle Mar 29, 2025
83fac6d
feat: tweak stats panel input styles (#9321)
dwelle Mar 30, 2025
7c58477
feat: tweak properties panel styling (#9322)
dwelle Mar 30, 2025
57a9e30
feat: tweak color swatch, and button bgs (#9330)
dwelle Apr 2, 2025
c79e892
chore: bump @radix-ui/react-tabs version to 1.1.3 (#9329)
pano9000 Apr 2, 2025
b3d5ba0
fix: Linear element is not normalized (#9347)
mtolmacs Apr 6, 2025
6e47fad
feat: add container to multiple text elements (#9348)
narekmalk Apr 6, 2025
ce267aa
feat: lasso selection (#9169)
ryan-di Apr 7, 2025
c2caf78
fix: deselected hit element being duplicated + incorrect re-seeding (…
dwelle Apr 7, 2025
e48b63a
fix: Rounded diamond edge elbow arrow U route (#9349)
mtolmacs Apr 7, 2025
6fc8502
fix: lasso selection issues (#9353)
ryan-di Apr 7, 2025
dff69e9
chore: Element center point util (#9298)
jhanma17dev Apr 9, 2025
01304aa
feat: Keep text label horizontal (#9364)
mtolmacs Apr 13, 2025
6fe7de8
fix: Add DOCTYPE and XML preamble in exported SVG documents (#9386)
rubennorte Apr 14, 2025
58f7d33
perf: make eraser great again (#9352)
ryan-di Apr 15, 2025
0cf36d6
fix: erasing locked elements (#9400)
dwelle Apr 16, 2025
a5d6939
fix: keep orig elem in place on alt-duplication (#9403)
dwelle Apr 17, 2025
b5d6097
fix: duplication tests pointer state leaking between tests (#9414)
dwelle Apr 18, 2025
5fc13e4
feat: add `props.renderScrollbars` (#9399)
walshhub Apr 19, 2025
8fb2f70
fix: scrollbar rendering and improve dragging (#9417)
dwelle Apr 20, 2025
debf2ad
docs: Fix missing verb in Footer component documentation (#9393)
vedantmishra69 Apr 20, 2025
1913599
refactor: remove dependency on the (static) Scene (#9389)
Mrazator Apr 23, 2025
a18b139
fix: laser pointer trail disappearing on pointerup (#9413) (#9427)
CharitSinghChauhan Apr 24, 2025
2a0d157
fix: when dragging arrow endpoint, update binding only on the dragged…
narekmalk Apr 25, 2025
4a60fe3
fix: remove `noreferrer` on internal links (#9452)
dwelle Apr 29, 2025
195a743
feat: switch between basic shapes (#9270)
ryan-di Apr 30, 2025
192c4e7
docs: added shape cycling shortcut in helper dialog (#9465)
G0WTHAM-SELVARAJ May 1, 2025
6e655cd
fix: When moving a frame through the stats inputs or drags move along…
hazemKrimi May 2, 2025
e19fd13
feat: Precise highlights for bindings (#9472)
mtolmacs May 5, 2025
d4f70e9
feat: Quarter snap points for diamonds (#9387)
mtolmacs May 5, 2025
cec5232
fix: when resizing element, update bound elements after final size of…
narekmalk May 5, 2025
a7c6131
fix: do not translate bound elements twice (#9486)
dwelle May 6, 2025
3dc54a7
feat: add `onIncrement` API (#9450)
Mrazator May 6, 2025
a306a90
fix: don't scroll page when TTDDialog is opened (#9455)
narekmalk May 7, 2025
e058a08
fix: use rimraf instead of rm -rf (#9460)
narekmalk May 7, 2025
ff2ed5d
refactor: change movePoints pointUpdates type (#9499)
dwelle May 8, 2025
a30e1b2
feat: include frame names in canvas searches (#9484)
ryan-di May 9, 2025
a8ebe51
Replace tongue emoji with globe emoji (#9489)
shindi-renuo May 9, 2025
7e41026
refactor: export everything from `@excalidraw/element`, don't import …
Mrazator May 9, 2025
51dbd48
refactor: make element type conversion more generic (#9504)
dwelle May 10, 2025
c4c0649
feat: show empty active color if no common color (#9506)
dwelle May 11, 2025
35bb449
fix: update cached segments when visible area changes (#9512)
ryan-di May 12, 2025
298812e
fix: improve ctrl+alt lasso selecting (#9514)
dwelle May 12, 2025
4dfb8a3
feat: allow forms.microsoft.com domain for embeddables (#9519)
zsviczian May 13, 2025
f7dcc89
feat: transparent link background, scale link icon when zooming to be…
zsviczian May 14, 2025
4ca5f53
fix: alt + ctrl lasso selected elements not always kept (#9522)
ryan-di May 14, 2025
0a534f1
fix: never show snap lines when lasso tool active (#9523)
dwelle May 14, 2025
d92a849
fix: issues when importing package outside of browser (#9525)
Mrazator May 14, 2025
6b5fb30
fix: unify line height across default fonts (#9513)
Mrazator May 14, 2025
95d89a7
refactor: decouple radio button selection from `.buttonList` wrapper …
dwelle May 15, 2025
41a7613
fix: Elbow arrow conversion labels mixed up (#9547)
mtolmacs May 19, 2025
712f267
feat: better unlock (#9546)
ryan-di May 21, 2025
2752211
fix: fix keybindings for arrowheads (#9557)
kamilwaz May 22, 2025
91d36e9
fix: Linear to elbow conversion crash (#9556)
mtolmacs May 22, 2025
41c036e
chore: Add DeepWiki badge (#9559)
Mrazator May 22, 2025
14d512f
Fix import.meta.env.MODE being undefined in host apps
Mrazator May 22, 2025
cc571c4
chore: init CLAUDE.md (#9563)
dwelle May 25, 2025
4dc2055
feat: Call actionFinalize at the end of arrow creation and drag (#9453)
mtolmacs May 25, 2025
87c87a9
feat: line polygons (#9477)
zsviczian May 26, 2025
fc3e062
feat: do not break polygon on point delete inside line editor (#9580)
dwelle May 26, 2025
db2911c
fix: ghost point issue when moving a shape after dragging a point in …
Cheapstar May 26, 2025
864353b
feat: Try to preserve line angle on SHIFT+drag (#9570)
mtolmacs May 27, 2025
5921ebc
fix: Regression in long press context menu closure (#9588)
mtolmacs May 28, 2025
7cad364
perf: Simplify normalizeRadians function (#9572)
mkhuzaima May 28, 2025
6c0ff7f
docs: added the correct CSS import for nextjs dynamic first import in…
aludayalu May 29, 2025
56c05b3
fix: prevent search menu from opening when dialog is open (#9279)
heysujal Jun 3, 2025
ca1a4f2
feat: Precise hit testing (#9488)
mtolmacs Jun 7, 2025
469caad
fix: prevent double-click to edit/create text scenarios on line (#9597)
Cheapstar Jun 7, 2025
08cd4c4
test: improve getTextEditor test helper (#9629)
dwelle Jun 7, 2025
d4e85a9
feat: use `enter` to edit line points & update hints (#9630)
dwelle Jun 7, 2025
d108053
feat: various delta improvements (#9571)
Mrazator Jun 9, 2025
9e77373
fix: add generic font family fallbacks before Segoe UI Emoji to fix g…
sachintha-lk Jun 10, 2025
0d4abd1
fix: add history capture for paste and drop of images and embeds (#9605)
Mrazator Jun 10, 2025
a7b64f0
fix: remove image preview on image insertion (#9626)
Mrazator Jun 10, 2025
1880848
fix: set cursor to auto when not hovering a point on linear element (…
ashwintemkar Jun 11, 2025
f42e1ab
perf: Improve elbow arrow indirect binding logic (#9624)
mtolmacs Jun 11, 2025
9f3fdf5
fix: Test hook usage in production code (#9645)
mtolmacs Jun 12, 2025
f0458cc
fix: Mid-point for rounded linears are not precisely centered (#9544)
mtolmacs Jun 12, 2025
60512f1
Fix broken history when eleemnt in update scene are optional
Mrazator Jun 14, 2025
320af40
fix: move elementCenterPoint from common/src/utils.ts to element/src/…
zsviczian Jun 14, 2025
84e96e9
fix: move doBoundsIntersect from element/src/bounds.ts to common/math…
zsviczian Jun 14, 2025
93c92d1
feat: wrap texts from stats panel (#9552)
ryan-di Jun 14, 2025
3f19491
feat: add mulitplatform Docker image support (#9594)
leconio Jun 15, 2025
058918f
feat: capture images after they initialize (#9643)
Mrazator Jun 15, 2025
958597d
chore: Refactor doBoundsIntersect (#9657)
mtolmacs Jun 16, 2025
0a19c93
fix: Bindings at partially overlapping binding areas (#9536)
mtolmacs Jun 16, 2025
8e27de2
fix: Frame dimensions change by stats don't include new elements (#9568)
mtolmacs Jun 16, 2025
c141500
chore: Relocate visualdebug so ESLint doesn't complain (#9668)
mtolmacs Jun 18, 2025
258605d
chore: release multiple packages (#9698)
Mrazator Jun 30, 2025
4eadb89
fix(toast): prevent toast from re-rendering and resetting timeout Fi…
sohamsk13 Jul 3, 2025
2d127f8
docs: fix broken update scene button example in docs (#9726)
ad1992 Jul 8, 2025
cde4679
feat: support timestamps for youtube video emebds (#9737)
dwelle Jul 13, 2025
0cfa53b
fix: aligning and distributing elements and nested groups while editi…
cTangonan123 Jul 15, 2025
678dff2
fix: ellipsify MainMenu and CommandPalette items (#9743)
dwelle Jul 15, 2025
e46f038
feat: expose `applyTo` options, don't commit empty text element (#9744)
Mrazator Jul 17, 2025
8492b14
test: added test file for distribute (#9754)
cTangonan123 Jul 17, 2025
e5e0726
fix: improve line creation ux on touch screens (#9740)
ryan-di Jul 23, 2025
f38f381
fix: Remove flushSync from alt-lasso and elbow dragging (#9734)
Brikaa Jul 23, 2025
416da62
fix: multiple line editor bugs (#9760)
Brikaa Jul 24, 2025
d6a934e
chore: Remove editingLinearElement (#9771)
mtolmacs Jul 24, 2025
37ad85c
fix: Fix the root cause of `flushSync` flickering (#9791)
Brikaa Jul 27, 2025
cb33de2
feat: allow a frame to snap to its children (#9795)
ryan-di Jul 31, 2025
178eca5
fix: add frame clipping to new element canvas (#9794)
ryan-di Jul 31, 2025
a376364
chore: update title (#9814)
dwelle Aug 1, 2025
df25de7
feat: fix delta apply to issues (#9830)
Mrazator Aug 7, 2025
9036812
fix: editing linear element (#9839)
Mrazator Aug 8, 2025
cc8e490
fix: do not auto-add elements to locked frame (#9851)
zsviczian Aug 11, 2025
54c148f
fix: text restore & deletion issues (#9853)
Mrazator Aug 12, 2025
dda3aff
fix: do not strip invisible elements from array (#9844)
dwelle Aug 12, 2025
2535d73
feat: apply deltas API (#9869)
Mrazator Aug 15, 2025
c6f8ef9
fix: Scene deleted after pica image resize failure (#9879)
zsviczian Aug 18, 2025
b4903a7
feat: drag, resize, and rotate after selecting in lasso (#9732)
ryan-di Aug 19, 2025
c78e4aa
chore: tweak title & remove timeout (#9883)
dwelle Aug 20, 2025
b5ad7ae
fix: even deltas with version & version nonce are valid (#9897)
Mrazator Aug 21, 2025
f29e9df
chore: bump mermaid-to-excalidraw to 1.1.3 (#9898)
dwelle Aug 21, 2025
90ec273
fix: calling toLowerCase on potentially undefined `navigator.*` value…
dwelle Aug 22, 2025
531f3e5
fix: restore from invalid fixedSegments & type-safer point updates (#…
dwelle Aug 22, 2025
3085f4a
fix: tighten distance for double tap text creation (#9889)
ryan-di Aug 22, 2025
ae89608
fix: bound text rotation across alignments (#9914)
cTangonan123 Aug 29, 2025
3bdaafe
feat: [cont.] support inserting multiple images (#9875)
Brikaa Sep 1, 2025
b9d27d3
fix: pasting not working in firefox (#9947)
dwelle Sep 6, 2025
414182f
fix: normalize file on paste/drop (#9959)
dwelle Sep 10, 2025
204e06b
feat: compact layout for tablets (#9910)
ryan-di Sep 12, 2025
1161f1b
fix: eraser can handle dots without regressing prior performance impr…
cTangonan123 Sep 14, 2025
ac0d305
fix: Use the right polygon enclosure test (#9979)
mtolmacs Sep 15, 2025
a6a32b9
fix: align MQ breakpoints and always use editor dimensions (#9991)
dwelle Sep 17, 2025
f55ecb9
fix: Mobile arrow point drag broken (#9998)
mtolmacs Sep 19, 2025
06c5ea9
fix: Race conditions when adding many library items (#10013)
ericvannunen Sep 23, 2025
00ae455
fix: Remove local elements when there is room data during `startColla…
Brikaa Sep 23, 2025
f738b74
fix: reintroduce height-based mobile query detection (#10020)
dwelle Sep 24, 2025
91c7748
fix: added normalization to images added with the image tool to preve…
Mask1nen Sep 24, 2025
06c4000
fix: Elbow arrow routing issue with diamonds and ellipses (#10021)
mtolmacs Sep 24, 2025
e32836f
fix: Use analytical Jacobian for curve intersection testing (#10007)
mtolmacs Sep 24, 2025
a89a03c
fix: Arrow eraser precision arrow selection (#10006)
mtolmacs Sep 24, 2025
a8acc82
feat: better file normalization (#10024)
dwelle Sep 25, 2025
dcdeb2b
fix: increase rejection delay for opening files with legacy api (#8961)
DevKrieger Sep 26, 2025
ec07091
feat: library search (#9903)
ArchishmanSengupta Sep 28, 2025
9fcbbe0
fix: library search UI fixes/tweaks (#10032)
dwelle Sep 29, 2025
f1b097a
fix: support bidirectional shift+click selection in library items (#1…
omareltomy Sep 29, 2025
7c41944
fix: small improvement on binary heap implementation (#9992)
yagodorea Sep 30, 2025
fde796a
feat: Make naming of library items discoverable (#10041)
zsviczian Sep 30, 2025
835eb8d
fix: display error message when local storage quota is exceeded (#9961)
h0lm1 Sep 30, 2025
f3c16a6
fix: text to diagram translation update issue on language update (#10…
akib22 Oct 2, 2025
98e0cd9
build: Docker compose version removed (#10074)
despinozap Oct 5, 2025
416e8b3
feat: new mobile layout (#9996)
ryan-di Oct 9, 2025
19b03b4
fix: remove redundant selectionStart/End resetting that causes scroll…
Brikaa Oct 10, 2025
8608d7b
fix: revert preferred selection to box once you switch to `full` UI (…
dwelle Oct 12, 2025
5fffc47
fix: mobile UI and other fixes (#10177)
dwelle Oct 14, 2025
7da176f
fix: Increase transform handle offset (#10180)
mtolmacs Oct 15, 2025
725412e
fix: context menu getting covered (#10199)
ryan-di Oct 20, 2025
8013eb5
feat: More prominent keyboard shortcuts in hints (#10057)
Brikaa Oct 20, 2025
4e0441e
fix: small tweaks to shortcut hints (#10214)
dwelle Oct 20, 2025
19b3dc6
fix: set radix PropertiesPopover collision boundary (#10221)
zsviczian Oct 22, 2025
8d8f696
fix: prevent wrap text in a container to only text that are not bound…
cTangonan123 Oct 26, 2025
8fd9703
chore: Uncap the nodejs version requirement (#10238)
mtolmacs Nov 3, 2025
47cbb5b
refactor: single source of truths with editor interface (#10178)
ryan-di Nov 3, 2025
d1f3982
chore: Update translations from Crowdin (#7429)
excalibot Nov 3, 2025
c99e816
fix: mobile view ui issues (#10284)
ryan-di Nov 4, 2025
5bcd828
feat: add comments/presi eplus promos for discoveribility (#10294)
dwelle Nov 6, 2025
95ddc66
fix: add toggle pen-mode to MobileMenu (#10293)
zsviczian Nov 6, 2025
f2600fe
fix: close floating sidebar on main menu open (#10295)
dwelle Nov 6, 2025
8fb1666
feat: Add binding visual debug (#10222)
mtolmacs Nov 10, 2025
dc2f25c
fix: Alt-duplication copied elements placement (#10152)
mtolmacs Nov 10, 2025
2b45402
feat: Animation support (#10042)
mtolmacs Nov 10, 2025
7f66e1f
fix: banner url (#10315)
dwelle Nov 11, 2025
37882c6
fix: canvas panning stops when hovering over frame title (#10340) (#1…
gothamsidd Nov 18, 2025
b660478
fix: prevent translation of excalidraw container (#10389)
dwelle Nov 22, 2025
d7e63e6
fix: rounded left and top clipped image export to SVG (#10387)
zsviczian Nov 24, 2025
c141960
feat: Non-elbow arrow snapping and behavior changes (#9670)
mtolmacs Nov 25, 2025
019ce4c
fix: Corner jumping & hints (#10403)
mtolmacs Nov 26, 2025
210dc85
fix: do not finalize multi-point lines if binding not enabled (#10410)
dwelle Nov 26, 2025
7497a08
fix: Frame and Frame Element binding highlight offset (#10423)
zsviczian Dec 1, 2025
51ad895
chore: Update translations from Crowdin (#10316)
excalibot Dec 1, 2025
06f01e1
style: remove blue lines (#10425)
eolesinski Dec 1, 2025
451bcac
fix: Ctrl/Alt elbow arrow jumps (#10432)
mtolmacs Dec 1, 2025
d080833
chore: bump [email protected] (#10431)
dwelle Dec 1, 2025
8d18078
fix: Box selection of arrows (#10451)
mtolmacs Dec 3, 2025
bf4c65f
fix: Turn into inside bind when angle locked (#10479)
mtolmacs Dec 9, 2025
f06484c
fix: Angle snapping around bindable objects incorrectly resolves (#10…
mtolmacs Dec 15, 2025
becaabf
chore: bump node@20 in ci workflows (#10531)
dwelle Dec 16, 2025
859207b
fix: Broken bindings during collab (#10537)
mtolmacs Dec 17, 2025
071b17a
fix: Embeddables lost stroke color option in element properties after…
zsviczian Dec 19, 2025
7cc31ac
fix: Context menu paste adding image twice #10542 (#10543)
s1lverfish Dec 20, 2025
d87620b
fix: Circular reference (#10544)
mtolmacs Dec 21, 2025
e95222e
fix: add constants and side methods to packages (#10418)
ryan-di Dec 28, 2025
0586fc1
feat: add qr code to live session share dialog. (#10588)
Kiizon Jan 2, 2026
6c90855
fix: reconciliation of server updates & refactor restore (#10597)
dwelle Jan 4, 2026
b5fc873
chore: Update translations from Crowdin (#10453)
excalibot Jan 4, 2026
63e1148
feat: stop using CSS filters for dark mode (static canvas) (#10578)
dwelle Jan 4, 2026
c158187
fix: grid color in dark mode (#10600)
dwelle Jan 4, 2026
87faa5d
fix: sentry CI worfklow (#10610)
dwelle Jan 6, 2026
cc6c29c
fix: update wysiwyg color on theme change (#10618)
dwelle Jan 7, 2026
b9a2554
refactor: update SCSS syntax & remove open-color dep (#10633)
dwelle Jan 10, 2026
da59205
fix: Curve endpoint intersection (#10640)
mtolmacs Jan 12, 2026
3b97f5a
feat: move visualdebug to utils and introduce volume bindable visuali…
mtolmacs Jan 12, 2026
6ebf522
fix: Elbow end point disconnect (#10646)
mtolmacs Jan 15, 2026
a0b98a9
feat: TextToDiagram v2 (#10530)
tamas-excalidraw Jan 15, 2026
24a6941
fix: retries and related UX fixes (#10657)
dwelle Jan 16, 2026
5a73b9a
refactor: change TTD persistence to iDB (#10662)
dwelle Jan 16, 2026
0443511
fix: tweak error display in ttd (#10668)
dwelle Jan 17, 2026
9d76033
feat: reduce max tablet MQ size (#10669)
dwelle Jan 18, 2026
1f47d61
chore: bump node in tests.yml (#10670)
dwelle Jan 19, 2026
0988ecf
fix: Angle-locked line history (#10677)
mtolmacs Jan 20, 2026
60ab14c
fix: fail gracefully during restore (#10673)
dwelle Jan 20, 2026
9ba0f5d
fix: Arrow drag start in bindable area jumps across bindable (#10676)
mtolmacs Jan 20, 2026
3c8e893
fix: keep input focus during generation (#10679)
dwelle Jan 20, 2026
84a309d
fix: ttd 429 error handling (#10680)
dwelle Jan 21, 2026
acf54c6
fix: dropdownMenu item badge position (#10682)
dwelle Jan 21, 2026
6135548
fix: rerender TTD preview on message remove (#10681)
dwelle Jan 21, 2026
d5e37cd
fix: set link icon opacity based on element opacity (#10693)
zsviczian Jan 24, 2026
60759d3
fix: Regression - invert SVGs in Dark Mode (#10695)
zsviczian Jan 24, 2026
28691e1
fix: Bound arrow elements for distribute and wyswig updates (#10702)
cTangonan123 Jan 26, 2026
dfdd994
perf: Cache hits in collision detection (#10648)
mtolmacs Jan 26, 2026
54fa0c9
fix: Increase iteration on curve intersection calc (#10707)
mtolmacs Jan 26, 2026
6a89136
fix: Arrow endpoint offset (#10706)
mtolmacs Jan 26, 2026
f5cf81c
feat: prevent pasting excalidraw into textarea & paste element text i…
dwelle Jan 28, 2026
802cde3
feat: support customizing TTD welcome screen (#10719)
dwelle Jan 30, 2026
216afc3
fix: Coherent stats binding (#10718)
mtolmacs Jan 30, 2026
b552c60
feat: Focus indicator (#10613)
mtolmacs Jan 31, 2026
dfa1ce5
fix: SVG Inversion on Safari (#10712)
zsviczian Jan 31, 2026
94364af
fix: Clarify welcome screen message about browser storage limitations…
Yashh56 Jan 31, 2026
f7b537a
feat(packages/excalidraw): export CommandPalette (#10724)
dwelle Jan 31, 2026
f12ae80
chore: Update translations from Crowdin (#10598)
excalibot Jan 31, 2026
b57f3e0
fix(editor): image positioning in crop editor (#10726)
dwelle Feb 1, 2026
d29fd62
fix(editor): crop editor cursor drift (#10727)
dwelle Feb 1, 2026
54a9826
fix(editor): copying to clipboard with no ClipboardEvent (#10729)
dwelle Feb 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
10 changes: 9 additions & 1 deletion .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,16 @@
!.eslintrc.json
!.npmrc
!.prettierrc
!excalidraw-app/
!package.json
!public/
!src/
!packages/
!scripts/
!tsconfig.json
!yarn.lock

# keep (sub)sub directories at the end to exclude from explicit included
# e.g. ./packages/excalidraw/{dist,node_modules}
**/build
**/dist
**/node_modules
29 changes: 21 additions & 8 deletions .env.development
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
MODE="development"

VITE_APP_BACKEND_V2_GET_URL=https://json-dev.excalidraw.com/api/v2/
VITE_APP_BACKEND_V2_POST_URL=https://json-dev.excalidraw.com/api/v2/post/

Expand All @@ -7,28 +9,25 @@ VITE_APP_LIBRARY_BACKEND=https://us-central1-excalidraw-room-persistence.cloudfu
# collaboration WebSocket server (https://github.com/excalidraw/excalidraw-room)
VITE_APP_WS_SERVER_URL=http://localhost:3002

# set this only if using the collaboration workflow we use on excalidraw.com
VITE_APP_PORTAL_URL=

VITE_APP_PLUS_LP=https://plus.excalidraw.com
VITE_APP_PLUS_APP=https://app.excalidraw.com
VITE_APP_PLUS_APP=http://localhost:3000

VITE_APP_AI_BACKEND=http://localhost:3016

VITE_APP_FIREBASE_CONFIG='{"apiKey":"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8","authDomain":"excalidraw-oss-dev.firebaseapp.com","projectId":"excalidraw-oss-dev","storageBucket":"excalidraw-oss-dev.appspot.com","messagingSenderId":"664559512677","appId":"1:664559512677:web:a385181f2928d328a7aa8c"}'

# put these in your .env.local, or make sure you don't commit!
# must be lowercase `true` when turned on
#
# whether to enable Service Workers in development
VITE_APP_DEV_ENABLE_SW=
# whether to disable live reload / HMR. Usuaully what you want to do when
# debugging Service Workers.
VITE_APP_DEV_DISABLE_LIVE_RELOAD=
VITE_APP_DISABLE_TRACKING=true
VITE_APP_ENABLE_TRACKING=true

FAST_REFRESH=false

# The port the run the dev server
VITE_APP_PORT=3000
VITE_APP_PORT=3001

#Debug flags

Expand All @@ -40,3 +39,17 @@ VITE_APP_COLLAPSE_OVERLAY=true

# Set this flag to false to disable eslint
VITE_APP_ENABLE_ESLINT=true

# Enable PWA in dev server
VITE_APP_ENABLE_PWA=false

VITE_APP_PLUS_EXPORT_PUBLIC_KEY='MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm2g5T+Rub6Kbf1Mf57t0
7r2zeHuVg4dla3r5ryXMswtzz6x767octl6oLThn33mQsPSy3GKglFZoCTXJR4ij
ba8SxB04sL/N8eRrKja7TFWjCVtRwTTfyy771NYYNFVJclkxHyE5qw4m27crHF1y
UNWEjuqNMi/lwAErS9fFa2oJlWyT8U7zzv/5kQREkxZI6y9v0AF3qcbsy2731FnD
s9ChJvOUW9toIab2gsIdrKW8ZNpu084ZFVKb6LNjvIXI1Se4oMTHeszXzNptzlot
kdxxjOoaQMAyfljFSot1F1FlU6MQlag7UnFGvFjRHN1JI5q4K+n3a67DX+TMyRqS
HQIDAQAB'

# set to true in .env.development.local to disable the prevent unload dialog
VITE_APP_DISABLE_PREVENT_UNLOAD=
28 changes: 22 additions & 6 deletions .env.production
Original file line number Diff line number Diff line change
@@ -1,18 +1,34 @@
MODE="production"

VITE_APP_BACKEND_V2_GET_URL=https://json.excalidraw.com/api/v2/
VITE_APP_BACKEND_V2_POST_URL=https://json.excalidraw.com/api/v2/post/

VITE_APP_LIBRARY_URL=https://libraries.excalidraw.com
VITE_APP_LIBRARY_BACKEND=https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries

VITE_APP_PORTAL_URL=https://portal.excalidraw.com

VITE_APP_PLUS_LP=https://plus.excalidraw.com
VITE_APP_PLUS_APP=https://app.excalidraw.com

# Fill to set socket server URL used for collaboration.
# Meant for forks only: excalidraw.com uses custom VITE_APP_PORTAL_URL flow
VITE_APP_WS_SERVER_URL=
VITE_APP_AI_BACKEND=https://oss-ai.excalidraw.com

# socket server URL used for collaboration
VITE_APP_WS_SERVER_URL=https://oss-collab.excalidraw.com

VITE_APP_FIREBASE_CONFIG='{"apiKey":"AIzaSyAd15pYlMci_xIp9ko6wkEsDzAAA0Dn0RU","authDomain":"excalidraw-room-persistence.firebaseapp.com","databaseURL":"https://excalidraw-room-persistence.firebaseio.com","projectId":"excalidraw-room-persistence","storageBucket":"excalidraw-room-persistence.appspot.com","messagingSenderId":"654800341332","appId":"1:654800341332:web:4a692de832b55bd57ce0c1"}'

VITE_APP_DISABLE_TRACKING=
VITE_APP_ENABLE_TRACKING=false

VITE_APP_PLUS_EXPORT_PUBLIC_KEY='MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApQ0jM9Qz8TdFLzcuAZZX
/WvuKSOJxiw6AR/ZcE3eFQWM/mbFdhQgyK8eHGkKQifKzH1xUZjCxyXcxW6ZO02t
kPOPxhz+nxUrIoWCD/V4NGmUA1lxwHuO21HN1gzKrN3xHg5EGjyouR9vibT9VDGF
gq6+4Ic/kJX+AD2MM7Yre2+FsOdysrmuW2Fu3ahuC1uQE7pOe1j0k7auNP0y1q53
PrB8Ts2LUpepWC1l7zIXFm4ViDULuyWXTEpUcHSsEH8vpd1tckjypxCwkipfZsXx
iPszy0o0Dx2iArPfWMXlFAI9mvyFCyFC3+nSvfyAUb2C4uZgCwAuyFh/ydPF4DEE
PQIDAQAB'

# Set the below flags explicitly to false in production mode since vite loads and merges .env.local vars when running the build command
VITE_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX=false
VITE_APP_COLLAPSE_OVERLAY=false
# Enable eslint in dev server
VITE_APP_ENABLE_ESLINT=false

5 changes: 4 additions & 1 deletion .eslintignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,7 @@ package-lock.json
firebase/
dist/
public/workbox
src/packages/excalidraw/types
packages/excalidraw/types
examples/**/public
dev-dist
coverage
38 changes: 37 additions & 1 deletion .eslintrc.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,43 @@
{
"extends": ["@excalidraw/eslint-config", "react-app"],
"rules": {
"import/order": [
"warn",
{
"groups": ["builtin", "external", "internal", "parent", "sibling", "index", "object", "type"],
"pathGroups": [
{
"pattern": "@excalidraw/**",
"group": "external",
"position": "after"
}
],
"newlines-between": "always-and-inside-groups",
"warnOnUnassignedImports": true
}
],
"import/no-anonymous-default-export": "off",
"no-restricted-globals": "off"
"no-restricted-globals": "off",
"@typescript-eslint/consistent-type-imports": [
"error",
{
"prefer": "type-imports",
"disallowTypeAnnotations": false,
"fixStyle": "separate-type-imports"
}
],
"no-restricted-imports": [
"error",
{
"name": "jotai",
"message": "Do not import from \"jotai\" directly. Use our app-specific modules (\"editor-jotai\" or \"app-jotai\")."
}
],
"react/jsx-no-target-blank": [
"error",
{
"allowReferrer": true
}
]
}
}
45 changes: 45 additions & 0 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Project coding standards

## Generic Communication Guidelines

- Be succint and be aware that expansive generative AI answers are costly and slow
- Avoid providing explanations, trying to teach unless asked for, your chat partner is an expert
- Stop apologising if corrected, just provide the correct information or code
- Prefer code unless asked for explanation
- Stop summarizing what you've changed after modifications unless asked for

## TypeScript Guidelines

- Use TypeScript for all new code
- Where possible, prefer implementations without allocation
- When there is an option, opt for more performant solutions and trade RAM usage for less CPU cycles
- Prefer immutable data (const, readonly)
- Use optional chaining (?.) and nullish coalescing (??) operators

## React Guidelines

- Use functional components with hooks
- Follow the React hooks rules (no conditional hooks)
- Keep components small and focused
- Use CSS modules for component styling

## Naming Conventions

- Use PascalCase for component names, interfaces, and type aliases
- Use camelCase for variables, functions, and methods
- Use ALL_CAPS for constants

## Error Handling

- Use try/catch blocks for async operations
- Implement proper error boundaries in React components
- Always log errors with contextual information

## Testing

- Always attempt to fix #problems
- Always offer to run `yarn test:app` in the project root after modifications are complete and attempt fixing the issues reported

## Types

- Always include `packages/math/src/types.ts` in the context when your write math related code and always use the Point type instead of { x, y}
8 changes: 4 additions & 4 deletions .github/workflows/autorelease-excalidraw.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,16 @@ jobs:
- uses: actions/checkout@v2
with:
fetch-depth: 2
- name: Setup Node.js 18.x
- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: 18.x
node-version: 20.x
- name: Set up publish access
run: |
npm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN}
env:
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Auto release
run: |
yarn add @actions/core
yarn autorelease
yarn add @actions/core -W
yarn release --tag=next --non-interactive
55 changes: 0 additions & 55 deletions .github/workflows/autorelease-preview.yml

This file was deleted.

6 changes: 3 additions & 3 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@ jobs:
steps:
- uses: actions/checkout@v2

- name: Setup Node.js 18.x
- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: 18.x
node-version: 20.x

- name: Install and lint
run: |
yarn --frozen-lockfile
yarn install
yarn test:other
yarn test:code
yarn test:typecheck
10 changes: 5 additions & 5 deletions .github/workflows/locales-coverage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,23 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
with:
token: ${{ secrets.PUSH_TRANSLATIONS_COVERAGE_PAT }}

- name: Setup Node.js 18.x
- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: 18.x
node-version: 20.x

- name: Create report file
run: |
yarn locales-coverage
FILE_CHANGED=$(git diff src/locales/percentages.json)
FILE_CHANGED=$(git diff packages/excalidraw/locales/percentages.json)
if [ ! -z "${FILE_CHANGED}" ]; then
git config --global user.name 'Excalidraw Bot'
git config --global user.email '[email protected]'
git add src/locales/percentages.json
git add packages/excalidraw/locales/percentages.json
git commit -am "Auto commit: Calculate translation coverage"
git push
fi
Expand Down
7 changes: 6 additions & 1 deletion .github/workflows/publish-docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,14 @@ jobs:
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build and push
uses: docker/build-push-action@v3
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: excalidraw/excalidraw:latest
platforms: linux/amd64, linux/arm64, linux/arm/v7
2 changes: 1 addition & 1 deletion .github/workflows/semantic-pr-title.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,6 @@ jobs:
semantic:
runs-on: ubuntu-latest
steps:
- uses: amannn/action-semantic-pull-request@v3.0.0
- uses: amannn/action-semantic-pull-request@v5
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
6 changes: 3 additions & 3 deletions .github/workflows/sentry-production.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup Node.js 18.x
- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: 18.x
node-version: 20.x
- name: Install and build
run: |
yarn --frozen-lockfile
Expand All @@ -28,7 +28,7 @@ jobs:
export SENTRY_RELEASE=$(sentry-cli releases propose-version)
sentry-cli releases new $SENTRY_RELEASE --project $SENTRY_PROJECT
sentry-cli releases set-commits --auto $SENTRY_RELEASE
sentry-cli releases files $SENTRY_RELEASE upload-sourcemaps --no-rewrite ./build/static/js/ --url-prefix "~/static/js"
sentry-cli sourcemaps upload --release $SENTRY_RELEASE --no-rewrite ./build/static/js/ --url-prefix "~/static/js"
sentry-cli releases finalize $SENTRY_RELEASE
sentry-cli releases deploys $SENTRY_RELEASE new -e production
env:
Expand Down
Loading