Compare commits

..

2363 Commits

Author SHA1 Message Date
Excalidraw Bot
54e748b958 Auto commit: Calculate translation coverage 2025-10-21 06:45:27 +00:00
Excalidraw Bot
662e0a3ca6 New translations en.json (Romanian) 2025-10-21 08:45:09 +02:00
Excalidraw Bot
032e2d8a1e Auto commit: Calculate translation coverage 2025-10-21 05:17:10 +00:00
Excalidraw Bot
abb92a43f9 New translations en.json (Romanian) 2025-10-21 07:16:47 +02:00
Excalidraw Bot
da48df3c37 Auto commit: Calculate translation coverage 2025-10-20 20:29:48 +00:00
Excalidraw Bot
f06d3d11bb New translations en.json (Chinese Simplified) 2025-10-20 22:29:21 +02:00
Excalidraw Bot
d8e00614e8 Auto commit: Calculate translation coverage 2025-10-20 20:12:16 +00:00
dwelle
840ca2ba60 Merge branch 'master' into l10n_master 2025-10-20 21:51:16 +02:00
Excalidraw Bot
13d0caf9d9 New translations en.json (Karakalpak) 2025-10-20 20:19:23 +02:00
Excalidraw Bot
c724e9b36b New translations en.json (Kabyle) 2025-10-20 20:19:21 +02:00
Excalidraw Bot
8f2f55cb46 New translations en.json (Bengali, India) 2025-10-20 20:19:20 +02:00
Excalidraw Bot
d5d2d5524a New translations en.json (German, Switzerland) 2025-10-20 20:19:18 +02:00
Excalidraw Bot
80cc1d4916 New translations en.json (Occitan) 2025-10-20 20:19:17 +02:00
Excalidraw Bot
9c25a3d0c9 New translations en.json (Norwegian Bokmal) 2025-10-20 20:19:16 +02:00
Excalidraw Bot
fd7a849e29 New translations en.json (Uzbek) 2025-10-20 20:19:15 +02:00
Excalidraw Bot
debf695d85 New translations en.json (Sinhala) 2025-10-20 20:19:14 +02:00
Excalidraw Bot
1acd9b40ca New translations en.json (Chinese Traditional, Hong Kong) 2025-10-20 20:19:13 +02:00
Excalidraw Bot
92ff46cb98 New translations en.json (Burmese) 2025-10-20 20:19:12 +02:00
Excalidraw Bot
217243d347 New translations en.json (Hindi) 2025-10-20 20:19:11 +02:00
Excalidraw Bot
5e384d74d2 New translations en.json (Azerbaijani) 2025-10-20 20:19:09 +02:00
Excalidraw Bot
35221debb6 New translations en.json (Latvian) 2025-10-20 20:19:08 +02:00
Excalidraw Bot
ee76b8d68f New translations en.json (Kazakh) 2025-10-20 20:19:07 +02:00
Excalidraw Bot
13b34182cf New translations en.json (Norwegian Nynorsk) 2025-10-20 20:19:06 +02:00
Excalidraw Bot
ab6587be8e New translations en.json (Thai) 2025-10-20 20:19:05 +02:00
Excalidraw Bot
5e9beefc32 New translations en.json (Marathi) 2025-10-20 20:19:04 +02:00
Excalidraw Bot
ef06b5be52 New translations en.json (Bengali) 2025-10-20 20:19:03 +02:00
Excalidraw Bot
fda21bb20f New translations en.json (Tamil) 2025-10-20 20:19:02 +02:00
Excalidraw Bot
260ab12312 New translations en.json (Khmer) 2025-10-20 20:19:01 +02:00
Excalidraw Bot
e2f6a55e64 New translations en.json (Persian) 2025-10-20 20:18:59 +02:00
Excalidraw Bot
0971464f6f New translations en.json (Indonesian) 2025-10-20 20:18:58 +02:00
Excalidraw Bot
fe962b7846 New translations en.json (Portuguese, Brazilian) 2025-10-20 20:18:57 +02:00
Excalidraw Bot
3ed517de70 New translations en.json (Galician) 2025-10-20 20:18:56 +02:00
Excalidraw Bot
0c1215ee25 New translations en.json (Vietnamese) 2025-10-20 20:18:55 +02:00
Excalidraw Bot
34e60da5f1 New translations en.json (Chinese Traditional) 2025-10-20 20:18:53 +02:00
Excalidraw Bot
d0fae644a0 New translations en.json (Chinese Simplified) 2025-10-20 20:18:52 +02:00
Excalidraw Bot
254390a565 New translations en.json (Ukrainian) 2025-10-20 20:18:51 +02:00
Excalidraw Bot
6feb6d90ab New translations en.json (Turkish) 2025-10-20 20:18:50 +02:00
Excalidraw Bot
2c68a3bca4 New translations en.json (Swedish) 2025-10-20 20:18:49 +02:00
Excalidraw Bot
628966d009 New translations en.json (Slovenian) 2025-10-20 20:18:47 +02:00
Excalidraw Bot
cdc4133372 New translations en.json (Slovak) 2025-10-20 20:18:46 +02:00
Excalidraw Bot
841d850f21 New translations en.json (Russian) 2025-10-20 20:18:45 +02:00
Excalidraw Bot
0b62885670 New translations en.json (Portuguese) 2025-10-20 20:18:44 +02:00
Excalidraw Bot
215c618aa5 New translations en.json (Polish) 2025-10-20 20:18:43 +02:00
Excalidraw Bot
3002f87f1c New translations en.json (Punjabi) 2025-10-20 20:18:42 +02:00
Excalidraw Bot
0e9240e4f0 New translations en.json (Dutch) 2025-10-20 20:18:41 +02:00
Excalidraw Bot
e93b929ffc New translations en.json (Lithuanian) 2025-10-20 20:18:40 +02:00
Excalidraw Bot
58977064e7 New translations en.json (Kurdish) 2025-10-20 20:18:38 +02:00
Excalidraw Bot
cd7f707011 New translations en.json (Korean) 2025-10-20 20:18:37 +02:00
Excalidraw Bot
2d7765d88c New translations en.json (Japanese) 2025-10-20 20:18:36 +02:00
Excalidraw Bot
bffae66135 New translations en.json (Italian) 2025-10-20 20:18:35 +02:00
Excalidraw Bot
93e0d7750d New translations en.json (Hungarian) 2025-10-20 20:18:34 +02:00
Excalidraw Bot
e1f026ef19 New translations en.json (Hebrew) 2025-10-20 20:18:33 +02:00
Excalidraw Bot
b88835c4ad New translations en.json (Finnish) 2025-10-20 20:18:32 +02:00
Excalidraw Bot
1fc391fe69 New translations en.json (Basque) 2025-10-20 20:18:31 +02:00
Excalidraw Bot
f6e8663812 New translations en.json (Greek) 2025-10-20 20:18:30 +02:00
Excalidraw Bot
946c8db0c9 New translations en.json (German) 2025-10-20 20:18:28 +02:00
Excalidraw Bot
871c28a287 New translations en.json (Danish) 2025-10-20 20:18:28 +02:00
Excalidraw Bot
29f2c20a79 New translations en.json (Czech) 2025-10-20 20:18:26 +02:00
Excalidraw Bot
a81b8a647a New translations en.json (Catalan) 2025-10-20 20:18:25 +02:00
Excalidraw Bot
161755338d New translations en.json (Bulgarian) 2025-10-20 20:18:24 +02:00
Excalidraw Bot
96d9e67016 New translations en.json (Arabic) 2025-10-20 20:18:23 +02:00
Excalidraw Bot
73ea335e42 New translations en.json (Spanish) 2025-10-20 20:18:22 +02:00
Excalidraw Bot
ddfe9c2f7f New translations en.json (French) 2025-10-20 20:18:21 +02:00
Excalidraw Bot
696092f9d5 New translations en.json (Romanian) 2025-10-20 20:18:19 +02:00
David Luzar
4e0441eeb4 fix: small tweaks to shortcut hints (#10214) 2025-10-20 16:57:40 +02:00
Omar Brikaa
8013eb5e16 feat: More prominent keyboard shortcuts in hints (#10057)
* Initial

* Memoize

* Styling

* Use double angle brackets for keyboard shortcuts

* Use rem in gap

* Use an existing function for substituting tags in a string

* Revert styling

* Avoid unique key warnings

* Styling

* getTransChildren -> nodesFromTextWithTags

* Use height and padding instead of padding only

* Initial new idea

* WIP shortcut substitutions

* Use simple regex for parsing shortcuts

* Use single shortcut for combos

* Use kbd instead of span

* shortcutFromKeyString -> getTaggedShortcutKey

* Bug fix

* FlowChart -> Flowchart

* memo is useless here

* Trigger CI

* Translate in getShortcutKey

* More normalized shortcuts

* improve shortcut normalization and replacement & support multi-key tagged shortcuts

* fix regex

* tweak css

---------

Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-10-20 16:09:20 +02:00
Ryan Di
725412ebd3 fix: context menu getting covered (#10199)
* do not show z-index actions on mobile or tablet

* fix: context menu getting covered

* fix lint

* fix style popup getting covered

* put contextmenu z-index above sidebar

---------

Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-10-20 11:56:55 +02:00
Márk Tolmács
7da176ff7d fix: Increase transform handle offset (#10180)
* fix: Increase transform handle offset

Signed-off-by: Mark Tolmacs <mark@lazycat.hu>

* fix: Temporarily disable transform handles for linear elements on mobile and tablets

Signed-off-by: Mark Tolmacs <mark@lazycat.hu>

* fix: Linear hidden resize

Signed-off-by: Mark Tolmacs <mark@lazycat.hu>

* disable mobielOrTablet linear element bbox completely

* fix: Test

Signed-off-by: Mark Tolmacs <mark@lazycat.hu>

* fix: Lint

Signed-off-by: Mark Tolmacs <mark@lazycat.hu>

---------

Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-10-15 21:16:20 +02:00
David Luzar
5fffc4743f fix: mobile UI and other fixes (#10177)
* remove legacy openMenu=shape state and unused actions

* close menus/popups in applicable cases when opening a different one

* split ui z-indexes to account prefer different overlap

* make top canvas area clickable on mobile

* make mobile main menu closable by clicking outside and reduce width

* offset picker popups from viewport border on mobile

* reduce items gap in mobile main menu

* show top picks for canvas bg colors in all ui modes

* fix menu separator visibility on mobile

* fix command palette items not being filtered
2025-10-14 16:34:49 +02:00
David Luzar
8608d7b2e0 fix: revert preferred selection to box once you switch to full UI (#10160) 2025-10-12 23:33:02 +02:00
Omar Brikaa
19b03b4ca9 fix: remove redundant selectionStart/End resetting that causes scroll-reset bug on firefox (#8263)
Remove redundant selectionStart/End resetting that causes scroll-reset bug on firefox
2025-10-10 18:12:08 +02:00
Ryan Di
416e8b3e42 feat: new mobile layout (#9996)
* compact bottom toolbar

* put menu trigger to top left

* add popup to switch between grouped tool types

* add a dedicated mobile toolbar

* update position for mobile

* fix active tool type

* add mobile mode as well

* mobile actions

* remove refactored popups

* excali logo mobile

* include mobile

* update mobile menu layout

* move selection and deletion back to right

* do not fill eraser

* fix styling

* fix active styling

* bigger buttons, smaller gaps

* fix other tools not opened

* fix: Style panel persistence and restore

Signed-off-by: Mark Tolmacs <mark@lazycat.hu>

* move hidden action btns to extra popover

* fix dropdown overlapping with welcome screen

* replace custom popup with popover

* improve button styles

* swapping redo and delete

* always show undo & redo and improve styling

* change background

* toolbar styles

* no any

* persist perferred selection tool and align tablet as well

* add a renderTopLeftUI to props

* tweak border and bg

* show combined properties only when using suitable tools

* fix preferred tool

* new stroke icon

* hide color picker hot keys

* init preferred tool based on device

* fix main menu sizing

* fix welcome screen offset

* put text before image

* disable call highlight on buttons

* fix renderTopLeftUI

---------

Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
Co-authored-by: Mark Tolmacs <mark@lazycat.hu>
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-10-09 23:48:31 +02:00
David Espinoza
98e0cd9078 build: Docker compose version removed (#10074) 2025-10-05 14:48:54 +02:00
Akibur Rahman
f3c16a600d fix: text to diagram translation update issue on language update (#10016) 2025-10-02 16:47:26 +02:00
Emil
835eb8d2fd fix: display error message when local storage quota is exceeded (#9961)
* fix: display error message when local storage quota is exceeded

* add danger alert instead of toast

* tweak text

---------

Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-09-30 23:54:43 +02:00
zsviczian
fde796a7a0 feat: Make naming of library items discoverable (#10041)
* updated library relevant strings

* fix: detect name changes

* clarify hashing function

---------

Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-09-30 18:38:10 +00:00
Yago Dórea
7c41944856 fix: small improvement on binary heap implementation (#9992) 2025-09-30 17:09:20 +02:00
Omar Eltomy
f1b097ad06 fix: support bidirectional shift+click selection in library items (#10034)
* fix: support bidirectional shift+click selection in library items

- Enable bottom-up multi-selection (previously only top-down worked)
- Use Math.min/max to handle selection range in both directions
- Maintains existing behavior for preserving non-contiguous selections
- Fixes issue where shift+clicking items above last selected item failed

* improve deselection behavior

---------

Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-09-29 11:46:42 +00:00
David Luzar
9fcbbe0d27 fix: library search UI fixes/tweaks (#10032)
* fix library icon height in command palette

* add clear button when no results
2025-09-29 12:06:17 +02:00
Archie Sengupta
ec070911b8 feat: library search (#9903)
* feat(utils): add support for search input type in isWritableElement

* feat(i18n): add search text

* feat(cmdp+lib): add search functionality for command pallete and lib menu items

* chore: fix formats, and whitespaces

* fix: opt to optimal code changes

* chore: fix for linting

* focus input on mount

* tweak placeholder

* design and UX changes

* tweak item hover/active/seletected states

* unrelated: move publish button above delete/clear to keep it more stable

* esc to clear search input / close sidebar

* refactor command pallete library stuff

* make library commands bigger

---------

Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-09-28 22:16:28 +02:00
Davide Wietlisbach
dcdeb2be57 fix: increase rejection delay for opening files with legacy api (#8961)
* Increased input change interval to 1000 ms to fix IOS 18 file opening issue

* increase more

---------

Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-09-26 16:30:23 +02:00
David Luzar
a8acc8212d feat: better file normalization (#10024)
* feat: better file normalization

* fix lint

* fix png detection

* optimize

* fix type
2025-09-25 22:26:58 +02:00
Márk Tolmács
a89a03c66c fix: Arrow eraser precision arrow selection (#10006) 2025-09-24 20:28:41 +02:00
Márk Tolmács
e32836f799 fix: Use analytical Jacobian for curve intersection testing (#10007) 2025-09-24 19:33:20 +02:00
Márk Tolmács
06c40006db fix: Elbow arrow routing issue with diamonds and ellipses (#10021) 2025-09-24 19:22:32 +02:00
Mossberg
91c7748c3d fix: added normalization to images added with the image tool to prevent MIME-mismatches (#10018)
* fix: fixed a bug where a MIME-mismatch in an image would cause an error to update cache

* fix: fixed a bug where a MIME-mismatch in an image would cause an error to update cache

* normalize inside insertImages()

---------

Co-authored-by: Mårten Mossberg <marmo607@student.liu.se>
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-09-24 16:30:50 +00:00
David Luzar
f738b74791 fix: reintroduce height-based mobile query detection (#10020) 2025-09-24 18:17:39 +02:00
Omar Brikaa
00ae455873 fix: Remove local elements when there is room data during startCollaboration (#9786)
* Remove local elements when there is room data

* Update excalidraw-app/collab/Collab.tsx

---------

Co-authored-by: David Luzar <5153846+dwelle@users.noreply.github.com>
2025-09-23 22:18:41 +00:00
ericvannunen
06c5ea94d3 fix: Race conditions when adding many library items (#10013)
* Fix for race condition when adding many library items

* Remove unused import

* Replace any with LibraryItem type

* Fix comments on pr

* Fix build errors

* Fix hoisted variable

* new mime type

* duplicate before passing down to be sure

* lint

* fix tests

* Remove unused import

---------

Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-09-23 23:47:03 +02:00
Márk Tolmács
f55ecb96cc fix: Mobile arrow point drag broken (#9998)
* fix: Mobile bound arrow point drag broken

* fix:Check real point
2025-09-19 19:41:03 +02:00
David Luzar
a6a32b9b29 fix: align MQ breakpoints and always use editor dimensions (#9991)
* fix: align MQ breakpoints and always use editor dimensions

* naming

* update snapshots
2025-09-17 07:57:10 +00:00
Márk Tolmács
ac0d3059dc fix: Use the right polygon enclosure test (#9979) 2025-09-15 10:07:37 +02:00
Christopher Tangonan
1161f1b8ba fix: eraser can handle dots without regressing prior performance improvements (#9946)
Co-authored-by: Márk Tolmács <mark@lazycat.hu>
2025-09-14 11:33:43 +00:00
Ryan Di
204e06b77b feat: compact layout for tablets (#9910)
* feat: allow the hiding of top picks

* feat: allow the hiding of default fonts

* refactor: rename to compactMode

* feat: introduce layout (incomplete)

* tweak icons

* do not show border

* lint

* add isTouchMobile to device

* add isTouchMobile to device

* refactor to use showCompactSidebar instead

* hide library label in compact

* fix icon color in dark theme

* fix library and share btns getting hidden in smaller tablet widths

* update tests

* use a smaller gap between shapes

* proper fix of range

* quicker switching between different popovers

* to not show properties panel at all when editing text

* fix switching between different popovers for texts

* fix popover not closable and font search auto focus

* change properties for a new or editing text

* change icon for more style settings

* use bolt icon for extra actions

* fix breakpoints

* use rem for icon sizes

* fix tests

* improve switching between triggers (incomplete)

* improve trigger switching (complete)

* clean up code

* put compact into app state

* fix button size

* remove redundant PanelComponentProps["compactMode"]

* move fontSize UI on top

* mobile detection (breakpoints incomplete)

* tweak compact mode detection

* rename appState prop & values

* update snapshots

---------

Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-09-12 10:18:31 +10:00
David Luzar
414182f599 fix: normalize file on paste/drop (#9959) 2025-09-10 17:59:02 +02:00
David Luzar
b9d27d308e fix: pasting not working in firefox (#9947) 2025-09-06 22:51:23 +02:00
Omar Brikaa
3bdaafe4b5 feat: [cont.] support inserting multiple images (#9875)
* feat: support inserting multiple images

* Initial

* handleAppOnDrop, onImageToolbarButtonClick, pasteFromClipboard

* Initial get history working

* insertMultipleImages -> insertImages

* Bug fixes, improvements

* Remove redundant branch

* Refactor addElementsFromMixedContentPaste

* History, drag & drop bug fixes

* Update snapshots

* Remove redundant try-catch

* Refactor pasteFromClipboard

* Plain paste check in mermaid paste

* Move comment

* processClipboardData -> insertClipboardContent

* Redundant variable

* Redundant variable

* Refactor insertImages

* createImagePlaceholder -> newImagePlaceholder

* Get rid of unneeded NEVER schedule, filter out failed images

* Trigger CI

* Position placeholders before initializing

* Don't mutate scene with positionElementsOnGrid, captureUpdate: CaptureUpdateAction.IMMEDIATELY

* Comment

* Move positionOnGrid out of file

* Rename file

* Get rid of generic

* Initial tests

* More asserts, test paste

* Test image tool

* De-duplicate

* Stricter assert, move rest of logic outside of waitFor

* Modify history tests

* De-duplicate update snapshots

* Trigger CI

* Fix package build

* Make setupImageTest more explicit

* Re-introduce generic to use latest placeholder versions

* newElementWith instead of mutateElement to delete failed placeholder

* Insert failed images separately with CaptureUpdateAction.NEVER

* Refactor

* Don't re-order elements

* WIP

* Get rid of 'never' for failed

* refactor type check

* align max file size constant

* make grid padding scale to zoom

---------

Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-09-01 17:31:24 +02:00
Christopher Tangonan
ae89608985 fix: bound text rotation across alignments (#9914)
Co-authored-by: A-Mundanilkunathil <aaronchackom2002@gmail.com>
2025-08-29 12:31:23 +02:00
Ryan Di
3085f4af81 fix: tighten distance for double tap text creation (#9889) 2025-08-22 18:12:51 +02:00
David Luzar
531f3e5524 fix: restore from invalid fixedSegments & type-safer point updates (#9899)
* fix: restore from invalid fixedSegments & type-safer point updates

* fix: Type updates and throw for invalid point states

---------

Co-authored-by: Mark Tolmacs <mark@lazycat.hu>
2025-08-22 15:45:58 +00:00
David Luzar
90ec2739ae fix: calling toLowerCase on potentially undefined navigator.* values (#9901) 2025-08-22 17:37:16 +02:00
David Luzar
f29e9df72d chore: bump mermaid-to-excalidraw to 1.1.3 (#9898) 2025-08-21 20:58:04 +02:00
Marcel Mraz
b5ad7ae4e3 fix: even deltas with version & version nonce are valid (#9897) 2025-08-21 16:09:19 +02:00
David Luzar
c78e4aab7f chore: tweak title & remove timeout (#9883) 2025-08-20 14:09:20 +02:00
Ryan Di
b4903a7eab feat: drag, resize, and rotate after selecting in lasso (#9732)
* feat: drag, resize, and rotate after selecting in lasso

* alternative ux: drag with lasso right away

* fix: lasso dragging should snap too

* fix: alt+cmd getting stuck

* test: snapshots

* alternatvie: keep lasso drag to only mobile

* alternative: drag after selection on PCs

* improve mobile dection

* add mobile lasso icon

* add default selection tool

* render according to default selection tool

* return to default selection tool after deletion

* reset to default tool after clearing out the canvas

* return to default tool after eraser toggle

* if default lasso, close lasso toggle

* finalize to default selection tool

* toggle between laser and default selection

* return to default selection tool after creation

* double click to add text when using default selection tool

* set to default selection tool after unlocking tool

* paste to center on touch screen

* switch to default selection tool after pasting

* lint

* fix tests

* show welcome screen when using default selection tool

* fix tests

* fix snapshots

* fix context menu not opening

* prevent potential displacement issue

* prevent element jumping during lasso selection

* fix dragging on mobile

* use same selection icon

* fix alt+cmd lasso getting cut off

* fix: shortcut handling

* lint

---------

Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-08-20 00:03:02 +02:00
zsviczian
c6f8ef9ad2 fix: Scene deleted after pica image resize failure (#9879)
Revert change in private updateImageCache
2025-08-18 11:45:05 +02:00
Marcel Mraz
2535d73054 feat: apply deltas API (#9869) 2025-08-15 15:25:56 +02:00
David Luzar
dda3affcb0 fix: do not strip invisible elements from array (#9844) 2025-08-12 11:56:11 +02:00
Marcel Mraz
54c148f390 fix: text restore & deletion issues (#9853) 2025-08-12 09:27:04 +02:00
zsviczian
cc8e490c75 fix: do not auto-add elements to locked frame (#9851)
* Do not return locked frames when filtering for top level frame

* lint

* lint

* lint
2025-08-11 11:52:44 +02:00
Marcel Mraz
9036812b6d fix: editing linear element (#9839) 2025-08-08 09:30:11 +02:00
Marcel Mraz
df25de7e68 feat: fix delta apply to issues (#9830) 2025-08-07 15:38:58 +02:00
David Luzar
a3763648fe chore: update title (#9814)
* chore: update title

* update meta tag

* lint
2025-08-01 17:17:42 +02:00
Ryan Di
178eca5828 fix: add frame clipping to new element canvas (#9794)
* fix: add frame clipping to new element canvas

* cleanup save/restore

---------

Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-07-31 12:10:59 +00:00
Ryan Di
cb33de25f4 feat: allow a frame to snap to its children (#9795) 2025-07-31 13:58:29 +02:00
Omar Brikaa
37ad85cbaf fix: Fix the root cause of flushSync flickering (#9791)
* More reliable width and height change detection

* Put the dimensions useEffect before the scene render one, just in case
2025-07-27 23:52:07 +02:00
Márk Tolmács
d6a934ed19 chore: Remove editingLinearElement (#9771)
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-07-24 17:02:21 +02:00
Omar Brikaa
416da62138 fix: multiple line editor bugs (#9760)
Co-authored-by: Mark Tolmacs <mark@lazycat.hu>
2025-07-24 09:11:04 +02:00
Omar Brikaa
f38f381989 fix: Remove flushSync from alt-lasso and elbow dragging (#9734)
* Remove lasso flushSync

* Remove selectedLinearElement flushSync

* Early return
2025-07-23 23:39:16 +02:00
Ryan Di
e5e07260c6 fix: improve line creation ux on touch screens (#9740)
* fix: awkward point adding and removing on touch device

* feat: move finalize to next to last point

* feat: on touch screen, click would create a default line/arrow

* fix: make default adaptive to zoom

* fix: increase padding to avoid cutoffs

* refactor: simplify

* fix: only use bigger padding when needed

* center arrow horizontally on pointer

* increase min drag distance before we start 2-point-arrow-drag-creating

* do not render 0-width arrow while creating

* dead code

* fix tests

* fix: remove redundant code

* do not enter line editor on creation

---------

Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-07-23 18:49:56 +10:00
Christopher Tangonan
8492b144b0 test: added test file for distribute (#9754) 2025-07-17 19:52:16 +02:00
Marcel Mraz
e46f038132 feat: expose applyTo options, don't commit empty text element (#9744)
* Expose applyTo options, skip re-draw for empty text

* Don't commit empty text elements
2025-07-17 15:22:32 +02:00
David Luzar
678dff25ed fix: ellipsify MainMenu and CommandPalette items (#9743)
* fix: ellipsify MainMenu and CommandPalette items

* fix lint
2025-07-15 12:59:55 +02:00
Christopher Tangonan
0cfa53b764 fix: aligning and distributing elements and nested groups while editing a group (#9721) 2025-07-15 12:43:42 +02:00
David Luzar
cde46793f8 feat: support timestamps for youtube video emebds (#9737) 2025-07-13 19:19:10 +02:00
Aakansha Doshi
2d127f8c22 docs: fix broken update scene button example in docs (#9726)
fix: update scene example in docs
2025-07-08 19:29:44 +05:30
Soham Kulkarni
4eadb891f8 fix(toast): prevent toast from re-rendering and resetting timeout Fixes #9714 (#9715)
* Update App.tsx

* fix: lint

---------

Co-authored-by: Ryan Di <ryan.weihao.di@gmail.com>
2025-07-03 17:07:26 +10:00
Marcel Mraz
258605d1d5 chore: release multiple packages (#9698) 2025-06-30 12:19:15 +02:00
Márk Tolmács
c141500400 chore: Relocate visualdebug so ESLint doesn't complain (#9668) 2025-06-18 14:45:51 +02:00
Márk Tolmács
8e27de2cdc fix: Frame dimensions change by stats don't include new elements (#9568) 2025-06-16 14:07:03 +02:00
Márk Tolmács
0a19c93509 fix: Bindings at partially overlapping binding areas (#9536) 2025-06-16 12:30:59 +02:00
Márk Tolmács
958597dfaa chore: Refactor doBoundsIntersect (#9657) 2025-06-16 12:30:42 +02:00
Marcel Mraz
058918f8e5 feat: capture images after they initialize (#9643)
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-06-15 23:43:14 +02:00
Spawn
3f194918e6 feat: add mulitplatform Docker image support (#9594) 2025-06-15 20:11:37 +02:00
Ryan Di
93c92d13e9 feat: wrap texts from stats panel (#9552) 2025-06-14 13:05:24 +02:00
zsviczian
84e96e9393 fix: move doBoundsIntersect from element/src/bounds.ts to common/math/src/utils.ts (#9650)
move doBoundsIntersect to math/utils

Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-06-14 11:01:30 +00:00
zsviczian
320af405e9 fix: move elementCenterPoint from common/src/utils.ts to element/src/bounds.ts (#9647)
move elementCenterPoint from utils to bounds.ts
2025-06-14 12:49:22 +02:00
Marcel Mraz
60512f13d5 Fix broken history when eleemnt in update scene are optional 2025-06-14 12:29:58 +02:00
Márk Tolmács
f0458cc216 fix: Mid-point for rounded linears are not precisely centered (#9544) 2025-06-12 21:08:37 +02:00
Márk Tolmács
9f3fdf5505 fix: Test hook usage in production code (#9645) 2025-06-12 10:39:50 +02:00
Márk Tolmács
f42e1ab64e perf: Improve elbow arrow indirect binding logic (#9624) 2025-06-11 19:15:48 +02:00
Ashwin Temkar
18808481fd fix: set cursor to auto when not hovering a point on linear element (#9642)
* fix: set cursor to auto when not hovering a point on linear element #9628

* Simplify hover test for cursor

* Add back comment

* Fix test for hit testing

---------

Co-authored-by: Mark Tolmacs <mark@lazycat.hu>
2025-06-11 16:52:02 +02:00
Marcel Mraz
a7b64f02b3 fix: remove image preview on image insertion (#9626)
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-06-10 21:31:11 +02:00
Marcel Mraz
0d4abd1ddc fix: add history capture for paste and drop of images and embeds (#9605) 2025-06-10 14:28:16 +02:00
Sachintha Lakmin
9e77373c81 fix: add generic font family fallbacks before Segoe UI Emoji to fix glyph rendering on windows (#9425) 2025-06-10 13:43:39 +02:00
Marcel Mraz
d108053351 feat: various delta improvements (#9571) 2025-06-09 09:55:35 +02:00
David Luzar
d4e85a9480 feat: use enter to edit line points & update hints (#9630)
feat: use enter to edit line points & update hints
2025-06-07 18:05:20 +02:00
David Luzar
08cd4c4f9a test: improve getTextEditor test helper (#9629)
* test: improve getTextEditor test helper

* fix test
2025-06-07 17:45:37 +02:00
cheapster
469caadb87 fix: prevent double-click to edit/create text scenarios on line (#9597)
* fix : double click on line enables line editor

* fix : prevent double-click to edit/create text
when inside line editor

* refactor: use lineCheck instead of arrowCheck in
doubleClick handler to align with updated logic

* fix: replace negative arrowCheck with lineCheck in
dbl click handler and fix double-click bind text
test in linearElementEditor tests

* clean up test

* simplify check

* add tests

* prevent text editing on dblclick when inside arrow editor

---------

Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-06-07 17:08:35 +02:00
Márk Tolmács
ca1a4f25e7 feat: Precise hit testing (#9488) 2025-06-07 12:56:32 +02:00
Sujal Gupta
56c05b3099 fix: prevent search menu from opening when dialog is open (#9279) 2025-06-03 15:53:00 +02:00
Aarav Dayal
6c0ff7fc5c docs: added the correct CSS import for nextjs dynamic first import integration example (#9584)
Added the correct CSS import for nextjs dynamic first import integration example

This is with reference to [this](https://github.com/excalidraw/excalidraw/issues/9562)
2025-05-29 22:03:20 +02:00
Muhammad Khuzaima Umair
7cad3645a0 perf: Simplify normalizeRadians function (#9572)
Co-authored-by: Mark Tolmacs <mark@lazycat.hu>
2025-05-28 15:58:42 +02:00
Márk Tolmács
5921ebc416 fix: Regression in long press context menu closure (#9588) 2025-05-28 13:38:47 +02:00
Márk Tolmács
864353be5f feat: Try to preserve line angle on SHIFT+drag (#9570) 2025-05-27 12:39:45 +02:00
cheapster
db2911c6c4 fix: ghost point issue when moving a shape after dragging a point in the line editor (#9530)
fix: ghost point issue when moving a shape after
dragging a point in the line editor
2025-05-26 21:34:41 +02:00
David Luzar
fc3e062074 feat: do not break polygon on point delete inside line editor (#9580)
* feat: do not break polygon on point delete inside line editor

* fix: polygon point highlighting when selected point == 0
2025-05-26 16:51:47 +02:00
zsviczian
87c87a9fb1 feat: line polygons (#9477)
* Loop Lock/Unlock

* fixed condition. 4 line points are required for the action to be available

* extracted updateLoopLock to improve readability. Removed unnecessary SVG attributes

* lint + added loopLock to restore.ts

* added  loopLock to newElement, updated test snapshots

* lint

* dislocate enpoint when breaking the loop.

* change icon & turn into a state style button

* POC: auto-transform to polygon on bg set

* keep polygon icon constant

* do not split points on de-polygonizing & highlight overlapping points

* rewrite color picker to support no (mixed) colors & fix focus handling

* refactor

* tweak point rendering inside line editor

* do not disable polygon when creating new points via alt

* auto-enable polygon when aligning start/end points

* TBD: remove bg color when disabling polygon

* TBD: only show polygon button for enabled polygons

* fix polygon behavior when adding/removing/moving points within line editor

* convert to polygon when creating line

* labels tweak

* add to command palette

* loopLock -> polygon

* restore `polygon` state on type conversions

* update snapshots

* naming

* break polygon on restore/finalize if invalid & prevent creation

* snapshots

* fix: merge issue and forgotten debug

* snaps

* do not merge points for 3-point lines

---------

Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-05-26 11:14:55 +02:00
Márk Tolmács
4dc205537c feat: Call actionFinalize at the end of arrow creation and drag (#9453)
* First iter

Signed-off-by: Mark Tolmacs <mark@lazycat.hu>

* Restore binding

Signed-off-by: Mark Tolmacs <mark@lazycat.hu>

* More actionFinalize

Signed-off-by: Mark Tolmacs <mark@lazycat.hu>

* Additional fixes

Signed-off-by: Mark Tolmacs <mark@lazycat.hu>

* New elbow arrow is removed if  too small

Signed-off-by: Mark Tolmacs <mark@lazycat.hu>

* Remove very small arrows

* Still allow loops

* Restore tests

Signed-off-by: Mark Tolmacs <mark@lazycat.hu>

* Update history snapshot

* More history snapshot updates

* keep invisible 2-point lines/freedraw elements

---------

Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-05-25 22:28:24 +02:00
David Luzar
cc571c4681 chore: init CLAUDE.md (#9563)
* chore: init CLAUDE.md

* Add Copilot instructions

* update gitignore

* simplify

---------

Co-authored-by: Mark Tolmacs <mark@lazycat.hu>
2025-05-25 21:23:40 +02:00
Marcel Mraz
14d512f321 Fix import.meta.env.MODE being undefined in host apps 2025-05-22 15:25:48 +02:00
Marcel Mraz
41c036e1a5 chore: Add DeepWiki badge (#9559) 2025-05-22 13:05:56 +02:00
Márk Tolmács
91d36e9b81 fix: Linear to elbow conversion crash (#9556)
* Fix linear to elbow conversion

* Add invariant check

* Add dev invariant fix

* Add arrowhead
2025-05-22 12:34:15 +02:00
Kamil Wąż
27522110df fix: fix keybindings for arrowheads (#9557) 2025-05-22 09:47:41 +02:00
Ryan Di
712f267519 feat: better unlock (#9546)
* change lock label

* feat: add unlock logic for single units on pointer up

* feat: add unlock popup

* fix: linting errors

* style: padding tweaks

* style: remove redundant line

* feat: lock multiple units together

* style: tweak color & position

* feat: add highlight for locked elements

* feat: select groups correctly after unlocking

* test: update snapshots

* fix: lasso from selecting locked elements

* fix: should prevent selecting unlocked elements and setting locked id at the same time

* fix: reset hit locked id immediately when appropriate

* feat: capture locked units in delta

* test: update locking test

* feat: show lock highlight when locking (including undo/redo)

* feat: make locked highlighting consistent

* feat: show correct cursor type when moving over locked elements

* fix history

* remove `lockedUnits.singleUnits`

* tweak button

* do not render UnlockPopup if not locked element selected

* tweak actions

* refactor: simplify type

* refactor: rename type

* refactor: simplify hit element setting & checking

* fix: prefer locked over link

* rename to `activeLockedId`

* refactor: getElementAtPosition takes an optional hitelments array

* fix: avoid setting active locked id after resizing

---------

Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-05-21 21:57:12 +10:00
Márk Tolmács
41a7613dff fix: Elbow arrow conversion labels mixed up (#9547) 2025-05-19 20:35:48 +02:00
David Luzar
95d89a751a refactor: decouple radio button selection from .buttonList wrapper (#9528)
* refactor: decouple radio button selection from `.buttonList`

* fix
2025-05-15 13:22:26 +02:00
Marcel Mraz
6b5fb30d69 fix: unify line height across default fonts (#9513) 2025-05-14 16:02:01 +02:00
Marcel Mraz
d92a849038 fix: issues when importing package outside of browser (#9525) 2025-05-14 16:01:43 +02:00
David Luzar
0a534f1bc6 fix: never show snap lines when lasso tool active (#9523) 2025-05-14 22:04:40 +10:00
Ryan Di
4ca5f53b1f fix: alt + ctrl lasso selected elements not always kept (#9522)
* fix: alt + ctrl lasso selected elements not always kept

* Update packages/excalidraw/components/App.tsx

---------

Co-authored-by: David Luzar <5153846+dwelle@users.noreply.github.com>
2025-05-14 22:04:03 +10:00
zsviczian
f7dcc893ea feat: transparent link background, scale link icon when zooming to below 100% (#9520)
* Do not set link background color, dynamically scale down link icon size with zoom.

* removed unnecessary change

* use canvas bg color & reduce size and stroke width

---------

Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-05-14 13:38:18 +02:00
zsviczian
4dfb8a3f8e feat: allow forms.microsoft.com domain for embeddables (#9519)
* Update embeddable.ts

* no need for same origin

* The form does not load without allow same origin

* automatically add embed=true to link if not present

* fix link check
2025-05-13 19:48:26 +02:00
David Luzar
298812e1d0 fix: improve ctrl+alt lasso selecting (#9514) 2025-05-12 18:09:37 +02:00
Ryan Di
35bb449a4b fix: update cached segments when visible area changes (#9512) 2025-05-12 15:55:36 +02:00
David Luzar
c4c064982f feat: show empty active color if no common color (#9506) 2025-05-11 15:07:57 +02:00
David Luzar
51dbd4831b refactor: make element type conversion more generic (#9504)
* feat: add `reduceToCommonValue()` & improve opacity slider

* feat: generalize and simplify type conversion cache

* refactor: change cache from atoms to Map

* feat: always attempt to reuse original fontSize when converting generic types
2025-05-10 20:06:16 +02:00
Marcel Mraz
7e41026812 refactor: export everything from @excalidraw/element, don't import from subpaths (#9466)
* Don't import from subpaths

* Fix tests, move related tests to element
2025-05-09 23:01:33 +02:00
shindi-renuo
a8ebe514da Replace tongue emoji with globe emoji (#9489) 2025-05-09 16:59:06 +00:00
Ryan Di
a30e1b25c6 feat: include frame names in canvas searches (#9484)
* fix frame name clipping on zooming

* include assistant font

* default frame name

* extend search to frame names

* add a simple test

* collpase search match items

* id check out of loop

* fix frame name check

* include focusedId for small perf improvement

* optionally show and hide collapse icon

* update section title

* fix tests

* rename `serverSide` -> `private`

* revert: do not reset zoom on zoom change

* feat: do not close menu on repeated ctrl+f

* remove collapsible

* tweak results CSS

* remove redundant check

* set `appState.searchMatches` to null if empty

---------

Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-05-09 18:32:16 +02:00
David Luzar
ff2ed5d26a refactor: change movePoints pointUpdates type (#9499) 2025-05-08 16:47:13 +02:00
Narek Malkhasyan
e058a08b33 fix: use rimraf instead of rm -rf (#9460) 2025-05-07 14:13:27 +02:00
Narek Malkhasyan
a306a909a0 fix: don't scroll page when TTDDialog is opened (#9455) 2025-05-07 13:33:18 +02:00
Marcel Mraz
3dc54a724a feat: add onIncrement API (#9450) 2025-05-06 19:23:02 +02:00
David Luzar
a7c61319dd fix: do not translate bound elements twice (#9486) 2025-05-06 13:09:00 +02:00
Narek Malkhasyan
cec5232a7a fix: when resizing element, update bound elements after final size of element is determined (#9475) 2025-05-05 12:15:42 +02:00
Márk Tolmács
d4f70e9f31 feat: Quarter snap points for diamonds (#9387) 2025-05-05 11:34:40 +02:00
Márk Tolmács
e19fd1332a feat: Precise highlights for bindings (#9472) 2025-05-05 09:51:20 +02:00
Hazem Krimi
6e655cdb24 fix: When moving a frame through the stats inputs or drags move along its children (#9433)
Co-authored-by: Mark Tolmacs <mark@lazycat.hu>
2025-05-02 17:07:17 +02:00
Gowtham Selvaraj
192c4e7658 docs: added shape cycling shortcut in helper dialog (#9465)
* docs: added shape cycling shortcut in helper dialog

- Document Tab and Shift+Tab usage for shape cycling

* docs: added shape cycling shortcut in helper dialog

* Update packages/excalidraw/components/HelpDialog.tsx

* Update packages/excalidraw/locales/en.json

---------

Co-authored-by: David Luzar <5153846+dwelle@users.noreply.github.com>
2025-05-01 12:12:45 +02:00
Ryan Di
195a743874 feat: switch between basic shapes (#9270)
* feat: switch between basic shapes

* add tab for testing

* style tweaks

* only show hint when a new node is created

* fix panel state

* refactor

* combine captures into one

* keep original font size

* switch multi

* switch different types altogether

* use tab only

* fix font size atom

* do not switch from active tool change

* prefer generic when mixed

* provide an optional direction when shape switching

* adjust panel bg & shadow

* redraw to correctly position text

* remove redundant code

* only tab to switch if focusing on app container

* limit which linear elements can be switched

* add shape switch to command palette

* remove hint

* cache initial panel position

* bend line to elbow if needed

* remove debug logic

* clean switch of arrows using app state

* safe conversion between line, sharp, curved, and elbow

* cache linear when panel shows up

* type safe element conversion

* rename type

* respect initial type when switching between linears

* fix elbow segment indexing

* use latest linear

* merge converted elbow points if too close

* focus on panel after click

* set roudness to null to fix drag points offset for elbows

* remove Mutable

* add arrowBoundToElement check

* make it dependent on one signle state

* unmount when not showing

* simpler types, tidy up code

* can change linear when it's linear + non-generic

* fix popup component lifecycle

* move constant to CLASSES

* DRY out type detection

* file & variable renaming

* refactor

* throw in not-prod instead

* simplify

* semi-fix bindings on `generic` type conversion

---------

Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-04-30 18:07:31 +02:00
David Luzar
4a60fe3d22 fix: remove noreferrer on internal links (#9452)
* fix: remove `noreferrer` on internal links

* fix snaps

* fix lint
2025-04-29 18:45:17 +02:00
Narek Malkhasyan
2a0d15799c fix: when dragging arrow endpoint, update binding only on the dragged side (#9367) 2025-04-25 10:46:58 +02:00
CharitSinghChauhan
a18b139a60 fix: laser pointer trail disappearing on pointerup (#9413) (#9427)
* Fix laser pointer trail disappearing on pointerup (#9413)

Previously, the laser pointer trail would disappear as soon as the pointerup event was triggered. This fix delays the trail removal to ensure it persists for a smoother visual experience.

Fixes #9413.

* Remove extra blank lines

Minor formatting cleanup. No functional changes.
2025-04-24 10:05:08 +10:00
Marcel Mraz
1913599594 refactor: remove dependency on the (static) Scene (#9389) 2025-04-23 13:45:08 +02:00
Vedant Mishra
debf2ad608 docs: Fix missing verb in Footer component documentation (#9393) 2025-04-20 12:35:38 +02:00
David Luzar
8fb2f70414 fix: scrollbar rendering and improve dragging (#9417)
* fix: scrollbar rendering and improve dragging

* tweak offsets
2025-04-20 12:28:41 +02:00
Jack Walsh
5fc13e4309 feat: add props.renderScrollbars (#9399)
* Expose renderScrollbars to AppState

* fix: scrollbar rendering should use al renderable elements

* remove `appState.renderScrollbars`

* clean unused

---------

Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-04-19 21:50:44 +00:00
David Luzar
b5d60973b7 fix: duplication tests pointer state leaking between tests (#9414)
* fix: duplication tests pointer state leaking between tests

* fix snapshots
2025-04-18 11:11:12 +02:00
David Luzar
a5d6939826 fix: keep orig elem in place on alt-duplication (#9403)
* fix: keep orig elem in place on alt-duplication

* clarify comment

* fix: incorrect selection on duplicating labeled containers

* fix: duplicating within group outside frame should remove from group
2025-04-17 16:08:07 +02:00
David Luzar
0cf36d6b30 fix: erasing locked elements (#9400)
* fix: erasing locked elements

* signature tweaks
2025-04-16 10:28:56 +02:00
Ryan Di
58f7d33d80 perf: make eraser great again (#9352)
* perf: make eraser great again

* lint

* refactor and improve perf

* lint
2025-04-15 16:58:45 +02:00
Rubén Norte
6fe7de8020 fix: Add DOCTYPE and XML preamble in exported SVG documents (#9386)
* Add DOCTYPE and XML preamble in exported SVG documents

* Update packages/excalidraw/data/index.ts

---------

Co-authored-by: David Luzar <5153846+dwelle@users.noreply.github.com>
2025-04-14 21:25:18 +02:00
Márk Tolmács
01304aac49 feat: Keep text label horizontal (#9364)
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-04-13 21:21:49 +02:00
jhanma17dev
dff69e9191 chore: Element center point util (#9298) 2025-04-09 17:04:51 +02:00
Ryan Di
6fc85022ae fix: lasso selection issues (#9353)
* revert stroke slicing hack for knot

* fix incorrect closing of path

* nonzero enclosure

* lint
2025-04-08 00:50:52 +10:00
Márk Tolmács
e48b63a0ae fix: Rounded diamond edge elbow arrow U route (#9349) 2025-04-07 10:43:07 +02:00
David Luzar
c2caf78e95 fix: deselected hit element being duplicated + incorrect re-seeding (#9333)
* fix: deselected hit element being duplicated + incorrect re-seeding

* snapshots

* Fix alt-drag binding

Signed-off-by: Mark Tolmacs <mark@lazycat.hu>

* Add alt-drag bound arrow test

Signed-off-by: Mark Tolmacs <mark@lazycat.hu>

---------

Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
Co-authored-by: Mark Tolmacs <mark@lazycat.hu>
2025-04-07 10:41:31 +02:00
Ryan Di
ce267aa0d3 feat: lasso selection (#9169)
* lasso without 'real' shape detection

* select a single linear el

* improve ux

* feed segments to worker

* simplify path threshold adaptive to zoom

* add a tiny threshold for checks

* refactor code

* lasso tests

* fix: ts

* do not capture lasso tool

* try worker-loader in next config

* update config

* refactor

* lint

* feat: show active tool when using "more tools"

* keep lasso if selected from toolbar

* fix incorrect checks for resetting to selection

* shift for additive selection

* bound text related fixes

* lint

* keep alt toggled lasso selection if shift pressed

* fix regression

* fix 'dead' lassos

* lint

* use workerpool and polyfill

* fix worker bundled with window related code

* refactor

* add file extension for worker constructor error

* another attempt at constructor error

* attempt at build issue

* attempt with dynamic import

* test not importing from math

* narrow down imports

* Reusing existing workers infrastructure (fallback to the main thread, type-safety)

* Points on curve inside the shared chunk

* Give up on experimental code splitting

* Remove potentially unnecessary optimisation

* Removing workers as the complexit is much worse, while perf. does not seem to be much better

* fix selecting text containers and containing frames together

* render fill directly from animated trail

* do not re-render static when setting selected element ids in lasso

* remove unnecessary property

* tweak trail animation

* slice points to remove notch

* always start alt-lasso from initial point

* revert build & worker changes (unused)

* remove `lasso` from `hasStrokeColor`

* label change

* remove unused props

* remove unsafe optimization

* snaps

---------

Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
Co-authored-by: Marcel Mraz <marcel@excalidraw.com>
2025-04-07 16:44:25 +10:00
Narek Malkhasyan
6e47fadb59 feat: add container to multiple text elements (#9348) 2025-04-07 00:57:27 +02:00
Márk Tolmács
b3d5ba0567 fix: Linear element is not normalized (#9347)
* Fix #9292
2025-04-06 13:41:11 +02:00
Panagiotis Papadopoulos
c79e892e55 chore: bump @radix-ui/react-tabs version to 1.1.3 (#9329)
* chore: bump @radix-ui/react-tabs version to 1.1.3

bumped the version to latest stable that includes
react ^19 as peerDepenecy.
This fixes peerDependency issues, as reported in #9253

* redeploy

---------

Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-04-02 16:23:15 +02:00
David Luzar
57a9e301d4 feat: tweak color swatch, and button bgs (#9330)
* feat: tweak color swatch, and button bgs

* snapshots
2025-04-02 14:36:13 +02:00
David Luzar
7c58477382 feat: tweak properties panel styling (#9322) 2025-03-30 19:20:13 +02:00
David Luzar
83fac6d0db feat: tweak stats panel input styles (#9321) 2025-03-30 19:00:31 +02:00
David Luzar
f2e8404c7b feat: allow to disable preventUnload in dev (#9319)
* feat: allow to disable preventUnload in dev

* add template
2025-03-29 19:42:33 +01:00
David Luzar
d797c2e210 fix: strip legacy attrs on element restore (#9318) 2025-03-29 19:31:16 +01:00
Marcel Mraz
0cd5a259ae fix: incorrect type imports (#9308) 2025-03-27 12:00:12 +01:00
Marcel Mraz
432a46ef9e refactor: separate elements logic into a standalone package (#9285) 2025-03-26 15:24:59 +01:00
Márk Tolmács
a18f059188 fix: Reduce allocations in collision detection (#9299)
Reduce allocations
2025-03-26 15:10:43 +01:00
KODIFY
ab89d4c16f feat: add keyboard shortcut to save file in text (#9295)
Co-authored-by: Aviral Sharma <aviralsharma954@gmail.com>
2025-03-25 22:18:55 +01:00
Mubaraq Wahab
6c3a434f2a docs: Fix table rendering and broken links in Props page (#9293)
* Fix table rendering and broken links

---------

Co-authored-by: Marcel Mraz <marcel@excalidraw.com>
2025-03-25 14:32:15 +01:00
Mursaleen Nisar
e1bb59fb8f chore: Use isDevEnv() and isTestEnv() (#9264)
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
Co-authored-by: Mark Tolmacs <mark@lazycat.hu>
2025-03-24 19:44:00 +01:00
Márk Tolmács
77aca48c84 fix: Refactor and merge duplication and binding (#9246) 2025-03-23 18:39:33 +01:00
WalterMitty
58990b41ae fix: 'Rotate' spell error (#9288) 2025-03-22 09:06:23 +00:00
David Luzar
99d8bff175 fix: elements offset incorrectly when action-duplicated during drag (#9275)
* fix: elements offset incorrectly when action-duplicated during drag

* prevent duplicate action during drag altogether
2025-03-15 20:05:42 +01:00
Márk Tolmács
30983d801a fix: Arrow conversion regression (#9241)
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
2025-03-15 12:31:25 +01:00
Marcel Mraz
21ffaf4d76 refactor: auto ordered imports (#9163) 2025-03-12 15:23:31 +01:00
Marcel Mraz
82b9a6b464 docs: CHANGELOG typos 🙏 (#9250) 2025-03-11 23:18:15 +01:00
Marcel Mraz
817d8c553c docs: update CHANGELOG (#9243) 2025-03-11 13:44:10 +01:00
Marcel Mraz
69bc5bdaab chore: post publish docs & examples changes (#9217) 2025-03-11 13:02:59 +01:00
Márk Tolmács
d587b8a3de fix: Do not rebind undragged elbow arrow endpoint (#9191) 2025-03-10 16:25:33 +01:00
Márk Tolmács
4ec812bc18 fix: Bound elbow arrow on duplication does not route correctly (#9236) 2025-03-08 12:39:54 +01:00
Márk Tolmács
a9e2d2348b chore: Logging and fixing extremely large scenes (#9225) 2025-03-05 23:06:01 +01:00
David Luzar
70c3e921bb fix: package env vars (#9221) 2025-03-04 21:45:48 +01:00
David Luzar
d92384b77d revert: vite@6 -> vite@5 (#9220) 2025-03-04 17:45:52 +00:00
Ritobroto Kalita
c5d3bb0b6a fix: #8475 Arrow updated on both sides (#8593) 2025-03-04 17:24:39 +01:00
David Luzar
d21c6a1bc6 chore: bump vite@6.x (#9210) 2025-03-04 14:00:13 +01:00
David Luzar
d1112bbf4f fix: docked sidebar width (#9213) 2025-03-02 18:24:20 +01:00
Márk Tolmács
2523624f15 fix: React 18 element.ref was accessed error (#9208)
Bump @radix-ui/react-popover to fix element.ref React 19 error

Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
2025-03-02 14:24:50 +01:00
David Luzar
68578556ff fix: cleanup legacy element.rawText (obsidian) (#9203) 2025-03-01 11:03:02 +01:00
Marcel Mraz
ecef5d12f4 chore: release @excalidraw/excalidraw@18.0.0 🎉 (#9127) 2025-02-28 16:49:09 +01:00
Márk Tolmács
392118bf26 fix: Fix elbow arrow fixed binding on restore (#9197) 2025-02-28 15:36:41 +01:00
Márk Tolmács
0ffeaeaecf feat: Remove GA code from binding (#9042)
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-02-25 22:52:06 +01:00
David Luzar
31e8476c78 chore: upgrade to react@19 (#9182) 2025-02-25 19:18:42 +01:00
Abhinav Pant
9ee0b8ffcb Enhancement: grouped together Undo and Redo buttons on mobile (#9109)
* bugfix: put the redo and undo button under the same div so that they look grouped together

* fixed the position of the redo and undo buttons to the right
2025-02-13 13:07:44 +00:00
David Luzar
16b86d7d16 chore: update firebase@8 to @11 (#9136) 2025-02-13 13:57:14 +01:00
Márk Tolmács
f12b92ce9d chore: Upgrade Sentry to latest and update debug messages (#9134)
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-02-13 12:47:27 +01:00
Márk Tolmács
77dc055d81 chore: Revert aspect ratio fix with element size limits and chk (#9131) 2025-02-12 15:02:35 +01:00
David Luzar
26f02bebea fix: stop using structuredClone (#9128)
fix: stop using `structuredClone`
2025-02-12 13:02:53 +01:00
Marcel Mraz
e3060dfb8f feat: custom text metrics provider (#9121) 2025-02-11 14:23:08 +01:00
Kyosuke Fujimoto
c329470b73 fix: Fix inconsistency in resizing while maintaining aspect ratio (#9116) 2025-02-10 15:24:08 +01:00
David Luzar
c8f4a4cb41 feat: add props.onDuplicate (#9117)
* feat: add `props.onDuplicate`

* docs

* clarify docs

* fix docs
2025-02-10 14:20:18 +00:00
Márk Tolmács
9e49c9254b fix: IFrame and elbow arrow interaction fix (#9101) 2025-02-06 14:45:49 +01:00
David Luzar
b0c8c5f7a7 feat: change empty arrowhead icon (#9100) 2025-02-06 10:52:03 +01:00
tothatt81
4f64372506 perf: Improved pointer events related performance when the sidebar is docked with a large library open (#9086)
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-02-04 22:05:56 +01:00
David Luzar
424e94a403 fix: duplicating/removing frame while children selected (#9079) 2025-02-04 19:23:47 +01:00
Excalidraw Bot
c507d1726a New translations en.json (Portuguese) 2025-02-04 11:04:24 +01:00
Márk Tolmács
302664e500 fix: Elbow arrow z-index binding (#9067) 2025-02-01 19:21:03 +01:00
David Luzar
86c67bd37f fix: library item checkbox style regression (#9080) 2025-02-01 12:27:41 +01:00
David Luzar
511433988c feat: tweak slider colors to be more muted (#9076) 2025-01-31 16:52:50 +01:00
Márk Tolmács
9b6edc767a fix: Elbow arrow orthogonality (#9073) 2025-01-31 14:19:07 +01:00
David Luzar
6cdb683410 fix: button bg CSS variable leaking into other styles (#9075) 2025-01-31 12:33:54 +01:00
Shalini
84bab403ff Fix: issue #8818 Xiaolai font has been set as a fallback for Excalifont (#9055)
Co-authored-by: David Luzar <5153846+dwelle@users.noreply.github.com>
2025-01-30 13:41:41 +00:00
Are
61e0bb83d0 feat: improve library sidebar performance (#9060)
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-01-30 14:41:08 +01:00
Saikat Das
bd1590fc74 feat: implement custom Range component for opacity control (#9009)
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-01-29 21:46:40 +00:00
Marcel Mraz
d29c3db7f6 fix: fonts not loading on export (again) (#9064) 2025-01-29 22:24:26 +01:00
Marcel Mraz
a58822c1c1 fix: merge server-side fonts with liberation sans (#9052) 2025-01-29 22:04:49 +01:00
David Luzar
a3e1619635 fix: hyperlinks html entities (#9063) 2025-01-29 19:02:54 +01:00
Ryan Di
52eaf64591 feat: box select frame & children to allow resizing at the same time (#9031)
* box select frame & children

* avoid selecting children twice to avoid double their moving

* do not show ele stats if frame and children selected together

* do not update frame membership if selected together

* do not group frame and its children

* comment and refactor code

* hide align altogether

* include frame children when selecting all

* simplify

---------

Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-01-28 22:10:16 +01:00
David Luzar
7028daa44a fix: remove flushSync to fix flickering (#9057) 2025-01-28 19:23:35 +01:00
Ashwin Temkar
65f218b100 fix: excalidraw issue #9045 flowcharts: align attributes of new node (#9047)
* fix: excalidraw#9045 by modifying the stroke style, opacity, and fill style for the new node and next nodes.

* fix: added roughness and opacity to the arrowbindings
2025-01-25 17:05:50 +01:00
Alplune
807b3c59f2 fix: align arrows bound to elements excalidraw#8833 (#8998) 2025-01-25 17:00:39 +01:00
Alplune
b8da5065fd fix: update elbow arrow on font size change #8798 (#9002) 2025-01-25 17:00:26 +01:00
Márk Tolmács
49f1276ef2 fix: Undo for elbow arrows create incorrect routing (#9046) 2025-01-24 20:18:08 +01:00
Ashwin Temkar
8f20b29b73 fix: #8575 , Flowchart clones the current arrowhead (#8581)
* fix: #8575, Flowchart clones the current arrowhead

* fix: #8575, changed stroke color, style and width to startBindingElement
2025-01-24 16:50:07 +01:00
David Luzar
f87c2cde09 feat: allow installing libs from excal github (#9041) 2025-01-23 16:50:47 +01:00
Ryan Di
0bf234fcc9 fix: adding partial group to frame (#9014)
* prevent new frame from including partial groups

* separate wrapped partial group
2025-01-23 07:26:12 +08:00
Ryan Di
dd1b45a25a perf: reduce unnecessary frame clippings (#8980)
* reduce unnecessary frame clippings

* further optim
2025-01-23 07:25:46 +08:00
David Luzar
ec06fbc1fc fix: do not refocus element link input on unrelated updates (#9037) 2025-01-22 21:30:15 +01:00
Excalidraw Bot
d6ef71c15c New translations en.json (German) 2025-01-22 20:35:23 +01:00
David Luzar
fa05ae1230 refactor: remove defaultProps (#9035) 2025-01-22 12:43:02 +01:00
Excalidraw Bot
4b9978cd57 New translations en.json (Slovak) 2025-01-21 03:20:22 +01:00
Márk Tolmács
91ebf8b0ea feat: Elbow arrow segment fixing & positioning (#8952)
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
Co-authored-by: David Luzar <5153846+dwelle@users.noreply.github.com>
2025-01-17 18:07:03 +01:00
Arnost Pleskot
8551823da9 feat: update jotai (#9015)
* feat: update jotai in excalidraw package

* feat: update jotai in excalidraw-app

* fix: exports from excalidraw/jotai

* fix: use isolated react hooks

* test: use jotai provider in <Trans /> test

* remove unused package

* refactor & make safer

---------

Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-01-16 16:59:11 +01:00
Excalidraw Bot
79cac89d45 New translations en.json (Hindi) 2025-01-16 07:15:41 +01:00
Excalidraw Bot
2651ce2e9b New translations en.json (Marathi) 2025-01-16 07:15:40 +01:00
Excalidraw Bot
6c3c6f26d9 New translations en.json (Chinese Simplified) 2025-01-16 01:06:46 +01:00
David Luzar
ae6bee3403 feat: do not delete frame children on frame delete (#9011) 2025-01-14 21:08:25 +01:00
David Luzar
46f42ef8d7 fix: arrow binding behaving unexpectedly on pointerup (#9010)
* fix: arrow binding behaving unexpectedly on pointerup

* update snaps
2025-01-14 19:36:47 +01:00
Excalidraw Bot
38da08662c New translations en.json (Spanish) 2025-01-14 14:59:30 +01:00
Excalidraw Bot
571053aec9 New translations en.json (Romanian) 2025-01-14 11:01:30 +01:00
Excalidraw Bot
88b3d9b6a5 New translations en.json (Russian) 2025-01-13 19:17:34 +01:00
Excalidraw Bot
f2b9da3255 New translations en.json (German) 2025-01-13 18:13:41 +01:00
Excalidraw Bot
ba4a9f1e82 New translations en.json (Karakalpak) 2025-01-13 17:08:29 +01:00
Excalidraw Bot
90ee80a3fa New translations en.json (Kabyle) 2025-01-13 17:08:28 +01:00
Excalidraw Bot
01c6cbefbc New translations en.json (Bengali, India) 2025-01-13 17:08:27 +01:00
Excalidraw Bot
8aee0f5f24 New translations en.json (German, Switzerland) 2025-01-13 17:08:26 +01:00
Excalidraw Bot
d865bfb985 New translations en.json (Occitan) 2025-01-13 17:08:25 +01:00
Excalidraw Bot
4ac707927a New translations en.json (Norwegian Bokmal) 2025-01-13 17:08:24 +01:00
Excalidraw Bot
e102ee38cd New translations en.json (Uzbek) 2025-01-13 17:08:23 +01:00
Excalidraw Bot
4df31a063a New translations en.json (Sinhala) 2025-01-13 17:08:21 +01:00
Excalidraw Bot
f8e0e7cda9 New translations en.json (Chinese Traditional, Hong Kong) 2025-01-13 17:08:20 +01:00
Excalidraw Bot
bfd79929b7 New translations en.json (Burmese) 2025-01-13 17:08:19 +01:00
Excalidraw Bot
182df6516a New translations en.json (Hindi) 2025-01-13 17:08:17 +01:00
Excalidraw Bot
08840c89ca New translations en.json (Azerbaijani) 2025-01-13 17:08:16 +01:00
Excalidraw Bot
30cf52e15c New translations en.json (Latvian) 2025-01-13 17:08:15 +01:00
Excalidraw Bot
09f2f38ce7 New translations en.json (Kazakh) 2025-01-13 17:08:14 +01:00
Excalidraw Bot
df54053d44 New translations en.json (Norwegian Nynorsk) 2025-01-13 17:08:13 +01:00
Excalidraw Bot
1850a09ffd New translations en.json (Thai) 2025-01-13 17:08:11 +01:00
Excalidraw Bot
16e2694301 New translations en.json (Marathi) 2025-01-13 17:08:10 +01:00
Excalidraw Bot
48fdd416e4 New translations en.json (Bengali) 2025-01-13 17:08:09 +01:00
Excalidraw Bot
0e71b552a0 New translations en.json (Tamil) 2025-01-13 17:08:08 +01:00
Excalidraw Bot
201df105a0 New translations en.json (Khmer) 2025-01-13 17:08:06 +01:00
Excalidraw Bot
8b0297e024 New translations en.json (Persian) 2025-01-13 17:08:05 +01:00
Excalidraw Bot
88f2d3d848 New translations en.json (Indonesian) 2025-01-13 17:08:04 +01:00
Excalidraw Bot
2262458d08 New translations en.json (Portuguese, Brazilian) 2025-01-13 17:08:02 +01:00
Excalidraw Bot
367dbb6a20 New translations en.json (Galician) 2025-01-13 17:08:01 +01:00
Excalidraw Bot
15bb6af068 New translations en.json (Vietnamese) 2025-01-13 17:08:00 +01:00
Excalidraw Bot
0da5f82b4b New translations en.json (Chinese Simplified) 2025-01-13 17:07:58 +01:00
Excalidraw Bot
b6fadd90c6 New translations en.json (Ukrainian) 2025-01-13 17:07:57 +01:00
Excalidraw Bot
f4dd5ced14 New translations en.json (Turkish) 2025-01-13 17:07:56 +01:00
Excalidraw Bot
67b4a6083e New translations en.json (Swedish) 2025-01-13 17:07:54 +01:00
Excalidraw Bot
d011d8ffbe New translations en.json (Slovenian) 2025-01-13 17:07:53 +01:00
Excalidraw Bot
9341ae94fe New translations en.json (Russian) 2025-01-13 17:07:52 +01:00
Excalidraw Bot
5d9d93e400 New translations en.json (Portuguese) 2025-01-13 17:07:51 +01:00
Excalidraw Bot
8660a48958 New translations en.json (Polish) 2025-01-13 17:07:49 +01:00
Excalidraw Bot
361cb1b94c New translations en.json (Punjabi) 2025-01-13 17:07:48 +01:00
Excalidraw Bot
4282f3c2dc New translations en.json (Dutch) 2025-01-13 17:07:47 +01:00
Excalidraw Bot
37ee37caaa New translations en.json (Lithuanian) 2025-01-13 17:07:46 +01:00
Excalidraw Bot
9ef56c2b20 New translations en.json (Kurdish) 2025-01-13 17:07:44 +01:00
Excalidraw Bot
7f235f5830 New translations en.json (Japanese) 2025-01-13 17:07:43 +01:00
Excalidraw Bot
cbe30a553f New translations en.json (Italian) 2025-01-13 17:07:42 +01:00
Excalidraw Bot
28eef4fc08 New translations en.json (Finnish) 2025-01-13 17:07:41 +01:00
Excalidraw Bot
10bf4dae6b New translations en.json (Basque) 2025-01-13 17:07:39 +01:00
Excalidraw Bot
ccb2b9e5e2 New translations en.json (Greek) 2025-01-13 17:07:38 +01:00
Excalidraw Bot
25c9334ebe New translations en.json (German) 2025-01-13 17:07:36 +01:00
Excalidraw Bot
057a5b555a New translations en.json (Danish) 2025-01-13 17:07:34 +01:00
Excalidraw Bot
7adb935619 New translations en.json (Czech) 2025-01-13 17:07:33 +01:00
Excalidraw Bot
6d6bb7a6d0 New translations en.json (Catalan) 2025-01-13 17:07:31 +01:00
Excalidraw Bot
7fa8edcdfe New translations en.json (Bulgarian) 2025-01-13 17:07:29 +01:00
Excalidraw Bot
63facdd1b3 New translations en.json (Arabic) 2025-01-13 17:07:28 +01:00
Excalidraw Bot
0ead775db7 New translations en.json (Spanish) 2025-01-13 17:07:27 +01:00
Excalidraw Bot
5af0f1c11e New translations en.json (French) 2025-01-13 17:07:25 +01:00
Excalidraw Bot
fd5c2b81d8 New translations en.json (Romanian) 2025-01-13 17:07:24 +01:00
Excalidraw Bot
052e456826 New translations en.json (Chinese Traditional) 2025-01-13 17:07:23 +01:00
Excalidraw Bot
0e71e2e49b New translations en.json (Korean) 2025-01-13 17:07:22 +01:00
Excalidraw Bot
0d50481428 New translations en.json (Hungarian) 2025-01-13 17:07:21 +01:00
Excalidraw Bot
c82882e7e4 New translations en.json (Hebrew) 2025-01-13 17:07:19 +01:00
Excalidraw Bot
62bd7cca34 New translations en.json (Slovak) 2025-01-13 17:07:18 +01:00
Ryan Di
00b5b0a0ca feat: add action to wrap selected items in a frame (#9005)
* feat: add action to wrap selected items in a frame

* fix type

* select frame on wrap & refactor

---------

Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2025-01-13 15:03:56 +00:00
Excalidraw Bot
0e37679c89 New translations en.json (Slovak) 2025-01-13 02:34:56 +01:00
Excalidraw Bot
cfcac1d74d New translations en.json (Turkish) 2025-01-09 20:19:36 +01:00
YongJoon Kim
c92f3bebf5 fix: change cursor by tool change immediately (#8212) 2025-01-09 14:26:12 +01:00
Marcel Mraz
2ac55067cd fix: package build fails on worker chunks (#8990) 2025-01-07 11:22:36 +00:00
Excalidraw Bot
f8935be5fd New translations en.json (Chinese Traditional) 2025-01-07 08:35:18 +01:00
David Luzar
78ab12c7e6 fix: z-index clash in mobile UI (#8985) 2025-01-06 21:21:11 +01:00
Excalidraw Bot
2ad3c1e3a0 New translations en.json (Russian) 2025-01-06 20:51:27 +01:00
Excalidraw Bot
8c69e77458 New translations en.json (Spanish) 2025-01-06 17:36:56 +01:00
Excalidraw Bot
7c60960708 New translations en.json (Chinese Simplified) 2025-01-06 06:18:41 +01:00
Excalidraw Bot
c050f50920 New translations en.json (Slovenian) 2025-01-05 23:23:46 +01:00
Excalidraw Bot
fc0364e49b New translations en.json (German) 2025-01-05 23:23:44 +01:00
Excalidraw Bot
1c2bc960e3 New translations en.json (Romanian) 2025-01-05 23:23:43 +01:00
David Luzar
f2f8219917 feat: reintroduce .excalidraw.png default when embedding scene (#8979) 2025-01-05 22:21:39 +01:00
Excalidraw Bot
fa3e95e62d New translations en.json (Karakalpak) 2025-01-05 22:14:04 +01:00
Excalidraw Bot
91ff8ece0d New translations en.json (Kabyle) 2025-01-05 22:14:03 +01:00
Excalidraw Bot
08241465c4 New translations en.json (Bengali, India) 2025-01-05 22:14:02 +01:00
Excalidraw Bot
4a70e3c8c6 New translations en.json (German, Switzerland) 2025-01-05 22:14:01 +01:00
Excalidraw Bot
58ae2ef67f New translations en.json (Occitan) 2025-01-05 22:14:00 +01:00
Excalidraw Bot
d4474ce348 New translations en.json (Norwegian Bokmal) 2025-01-05 22:13:59 +01:00
Excalidraw Bot
a02df75456 New translations en.json (Uzbek) 2025-01-05 22:13:58 +01:00
Excalidraw Bot
e0d1d4ae53 New translations en.json (Sinhala) 2025-01-05 22:13:57 +01:00
Excalidraw Bot
91f906d122 New translations en.json (Chinese Traditional, Hong Kong) 2025-01-05 22:13:56 +01:00
Excalidraw Bot
8e76a3576a New translations en.json (Burmese) 2025-01-05 22:13:55 +01:00
Excalidraw Bot
575ba7c167 New translations en.json (Hindi) 2025-01-05 22:13:54 +01:00
Excalidraw Bot
f4ea623e65 New translations en.json (Azerbaijani) 2025-01-05 22:13:52 +01:00
Excalidraw Bot
a74946d8ba New translations en.json (Latvian) 2025-01-05 22:13:51 +01:00
Excalidraw Bot
5cf9ce5a19 New translations en.json (Kazakh) 2025-01-05 22:13:50 +01:00
Excalidraw Bot
06b26a347e New translations en.json (Norwegian Nynorsk) 2025-01-05 22:13:50 +01:00
Excalidraw Bot
4a071e90e8 New translations en.json (Thai) 2025-01-05 22:13:48 +01:00
Excalidraw Bot
11e7ea11df New translations en.json (Marathi) 2025-01-05 22:13:48 +01:00
Excalidraw Bot
01b0ac438c New translations en.json (Bengali) 2025-01-05 22:13:46 +01:00
Excalidraw Bot
3b6c1fdbaa New translations en.json (Tamil) 2025-01-05 22:13:45 +01:00
Excalidraw Bot
a6119a0910 New translations en.json (Khmer) 2025-01-05 22:13:44 +01:00
Excalidraw Bot
c42898a939 New translations en.json (Persian) 2025-01-05 22:13:43 +01:00
Excalidraw Bot
aaa239113f New translations en.json (Indonesian) 2025-01-05 22:13:42 +01:00
Excalidraw Bot
110d3d7c69 New translations en.json (Portuguese, Brazilian) 2025-01-05 22:13:41 +01:00
Excalidraw Bot
1e9fe91adf New translations en.json (Galician) 2025-01-05 22:13:40 +01:00
Excalidraw Bot
b8baa27839 New translations en.json (Vietnamese) 2025-01-05 22:13:39 +01:00
Excalidraw Bot
c1c2091a88 New translations en.json (Chinese Simplified) 2025-01-05 22:13:38 +01:00
Excalidraw Bot
8f7aa71a4c New translations en.json (Ukrainian) 2025-01-05 22:13:37 +01:00
Excalidraw Bot
d38ea58a27 New translations en.json (Turkish) 2025-01-05 22:13:36 +01:00
Excalidraw Bot
cb62a51426 New translations en.json (Swedish) 2025-01-05 22:13:35 +01:00
Excalidraw Bot
c300216307 New translations en.json (Slovenian) 2025-01-05 22:13:34 +01:00
Excalidraw Bot
a01bbedada New translations en.json (Russian) 2025-01-05 22:13:33 +01:00
Excalidraw Bot
0d9e1e8f92 New translations en.json (Portuguese) 2025-01-05 22:13:32 +01:00
Excalidraw Bot
93a95db1b2 New translations en.json (Polish) 2025-01-05 22:13:31 +01:00
Excalidraw Bot
b22d830b3b New translations en.json (Punjabi) 2025-01-05 22:13:30 +01:00
Excalidraw Bot
de09e6867c New translations en.json (Dutch) 2025-01-05 22:13:29 +01:00
Excalidraw Bot
6f37102175 New translations en.json (Lithuanian) 2025-01-05 22:13:28 +01:00
Excalidraw Bot
351aac987b New translations en.json (Kurdish) 2025-01-05 22:13:27 +01:00
Excalidraw Bot
9c534fe870 New translations en.json (Japanese) 2025-01-05 22:13:26 +01:00
Excalidraw Bot
fbe2745b2d New translations en.json (Italian) 2025-01-05 22:13:25 +01:00
Excalidraw Bot
cfa03593a6 New translations en.json (Finnish) 2025-01-05 22:13:24 +01:00
Excalidraw Bot
b13771496f New translations en.json (Basque) 2025-01-05 22:13:23 +01:00
Excalidraw Bot
a7cc1247d1 New translations en.json (Greek) 2025-01-05 22:13:22 +01:00
Excalidraw Bot
323008553e New translations en.json (German) 2025-01-05 22:13:21 +01:00
Excalidraw Bot
253017fe8e New translations en.json (Danish) 2025-01-05 22:13:20 +01:00
Excalidraw Bot
97ee0973dd New translations en.json (Czech) 2025-01-05 22:13:19 +01:00
Excalidraw Bot
a0f3c50ceb New translations en.json (Catalan) 2025-01-05 22:13:18 +01:00
Excalidraw Bot
0a9ae2505d New translations en.json (Bulgarian) 2025-01-05 22:13:17 +01:00
Excalidraw Bot
5bb7a37121 New translations en.json (Arabic) 2025-01-05 22:13:16 +01:00
Excalidraw Bot
532c4bb639 New translations en.json (Spanish) 2025-01-05 22:13:15 +01:00
Excalidraw Bot
218c9ef1c3 New translations en.json (French) 2025-01-05 22:13:14 +01:00
Excalidraw Bot
21016e21a5 New translations en.json (Romanian) 2025-01-05 22:13:13 +01:00
Excalidraw Bot
20ca0ccf12 New translations en.json (Chinese Traditional) 2025-01-05 22:13:12 +01:00
Excalidraw Bot
a96c2013b7 New translations en.json (Korean) 2025-01-05 22:13:10 +01:00
Excalidraw Bot
bf9733f7ef New translations en.json (Hungarian) 2025-01-05 22:13:09 +01:00
Excalidraw Bot
7566d96b35 New translations en.json (Hebrew) 2025-01-05 22:13:08 +01:00
Excalidraw Bot
4b8642d1d0 New translations en.json (Slovak) 2025-01-05 22:13:07 +01:00
한별
12c39d1034 feat: add mimeTypes on file save (#8946) 2025-01-05 21:12:07 +00:00
Ryan Di
d33e42e3a1 feat: add crowfoot to arrowheads (#8942)
* crowfoot many

* crowfoot one

* one or many

* add icons for crowfoot

* add crowfoot icons

* adjust arrowhead selection popover

* make options collapsible

* swap triangle and bar

* switch to radix popover

* put triangle outline in the first row

* align shadow with new design spec

* remove unused flag

* swap order

* tweak labels

* handle shift+tab

---------

Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
Co-authored-by: Jakub Królak <108676707+j-krolak@users.noreply.github.com>
2025-01-05 21:50:24 +01:00
zsviczian
3b9ffd9586 fix: elbow arrows do not work within frames (issue: #8964) (#8969)
check for !isFrameLikeElement
2025-01-05 21:47:20 +01:00
David Luzar
b63689c230 feat: make HTML attribute sanitization stricter (#8977)
* feat: make HTML attribute sanitization stricter

* fix double escape
2025-01-05 21:45:04 +01:00
David Luzar
c84babf574 feat: validate library install urls (#8976) 2025-01-05 17:10:55 +01:00
David Luzar
36274f1f3e feat: cleanup svg export and move payload to <metadata> (#8975) 2025-01-05 16:53:05 +01:00
Excalidraw Bot
3ca773f54d New translations en.json (Hungarian) 2024-12-31 16:17:49 +01:00
Excalidraw Bot
3dbdfdcffc New translations en.json (Hungarian) 2024-12-31 15:16:38 +01:00
Excalidraw Bot
4acea43b12 New translations en.json (Slovak) 2024-12-30 10:40:20 +01:00
Excalidraw Bot
aabc4b701e New translations en.json (Slovak) 2024-12-30 08:55:51 +01:00
Excalidraw Bot
1325c85a48 New translations en.json (Hebrew) 2024-12-28 00:16:03 +01:00
Excalidraw Bot
3f3134435e New translations en.json (Hebrew) 2024-12-27 22:51:12 +01:00
Aakansha Doshi
798c795405 docs: add demo link for browser integration (#8956) 2024-12-27 14:39:08 +09:00
Ryan Di
107eae3916 refactor: separate resizing logic from pointer (#8155)
* separate resizing logic for a single element

* replace resize logic in stats

* do not recompute width and height from points when they're already given

* correctly update linear elements' position when resized

* update snapshots

* lint

* simplify linear resizing logic

* fix initial scale for aspect ratio

* update tests for linear elements

* test typo

* separate pointer from resizing for multiple elements

* lint and simplify

* fix tests

* lint

* provide scene in param instead

* type

* refactor code

* fix floating in tests

* remove restrictions/checks on width & height

* update pointer to dimension to prevent regression

---------

Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2024-12-23 11:10:35 +01:00
Excalidraw Bot
2d370b9360 New translations en.json (Chinese Traditional) 2024-12-23 10:29:20 +01:00
Excalidraw Bot
dab6df1a77 New translations en.json (Korean) 2024-12-23 07:42:22 +01:00
zsviczian
56fca30bd0 fix: normalizeSVG width and height from viewbox when size includes decimal points (#8939)
Update image.ts
2024-12-22 23:10:11 +01:00
Ryan Di
1e3399eac8 fix: make arrow binding area adapt to zoom levels (#8927)
* make binding area adapt to zoom

* revert stroke color

* normalize binding gap

* reduce normalized gap
2024-12-22 22:55:50 +01:00
David Luzar
873698a1a2 fix: robust state.editingFrame teardown (#8941) 2024-12-22 22:47:39 +01:00
Ryan Di
606ac6c743 fix: regression on dragging a selected frame by its name (#8924)
fix hit element check for a selected frame's name
2024-12-22 22:47:21 +01:00
Excalidraw Bot
4390f6d75e New translations en.json (Romanian) 2024-12-18 11:57:51 +01:00
Excalidraw Bot
4d1730882b New translations en.json (Polish) 2024-12-18 10:37:52 +01:00
Excalidraw Bot
6bff123aea New translations en.json (Chinese Simplified) 2024-12-18 04:04:53 +01:00
Excalidraw Bot
e255caefc5 New translations en.json (German) 2024-12-17 21:04:56 +01:00
Excalidraw Bot
a62ebd7f71 New translations en.json (Hindi) 2024-12-17 18:15:21 +01:00
Excalidraw Bot
376d25ad8b New translations en.json (Marathi) 2024-12-17 18:15:19 +01:00
Excalidraw Bot
dfc89f9d6e New translations en.json (Russian) 2024-12-17 15:27:00 +01:00
Excalidraw Bot
62114e309f New translations en.json (Portuguese) 2024-12-17 15:26:58 +01:00
Excalidraw Bot
c6901cae98 New translations en.json (Karakalpak) 2024-12-17 14:11:42 +01:00
Excalidraw Bot
d4b760f7b3 New translations en.json (Kabyle) 2024-12-17 14:11:41 +01:00
Excalidraw Bot
5e21607153 New translations en.json (Bengali, India) 2024-12-17 14:11:40 +01:00
Excalidraw Bot
3e79c6caab New translations en.json (German, Switzerland) 2024-12-17 14:11:38 +01:00
Excalidraw Bot
fee26ea12c New translations en.json (Occitan) 2024-12-17 14:11:37 +01:00
Excalidraw Bot
b551e5336c New translations en.json (Norwegian Bokmal) 2024-12-17 14:11:36 +01:00
Excalidraw Bot
172ecace2f New translations en.json (Uzbek) 2024-12-17 14:11:35 +01:00
Excalidraw Bot
e146d42598 New translations en.json (Sinhala) 2024-12-17 14:11:33 +01:00
Excalidraw Bot
0546406d4b New translations en.json (Chinese Traditional, Hong Kong) 2024-12-17 14:11:32 +01:00
Excalidraw Bot
4a5ca8d3ea New translations en.json (Burmese) 2024-12-17 14:11:31 +01:00
Excalidraw Bot
267341b9b7 New translations en.json (Hindi) 2024-12-17 14:11:29 +01:00
Excalidraw Bot
c3a15bc297 New translations en.json (Azerbaijani) 2024-12-17 14:11:28 +01:00
Excalidraw Bot
4b1d99fbf4 New translations en.json (Latvian) 2024-12-17 14:11:27 +01:00
Excalidraw Bot
c4c1193094 New translations en.json (Kazakh) 2024-12-17 14:11:25 +01:00
Excalidraw Bot
03adc9b7bc New translations en.json (Norwegian Nynorsk) 2024-12-17 14:11:24 +01:00
Excalidraw Bot
fd491e45e9 New translations en.json (Thai) 2024-12-17 14:11:23 +01:00
Excalidraw Bot
a19c1d64e4 New translations en.json (Marathi) 2024-12-17 14:11:21 +01:00
Excalidraw Bot
836c8f2dba New translations en.json (Bengali) 2024-12-17 14:11:20 +01:00
Excalidraw Bot
01f2001a0d New translations en.json (Tamil) 2024-12-17 14:11:19 +01:00
Excalidraw Bot
8136b719bd New translations en.json (Khmer) 2024-12-17 14:11:18 +01:00
Excalidraw Bot
20870a78c2 New translations en.json (Persian) 2024-12-17 14:11:16 +01:00
Excalidraw Bot
e741a6f370 New translations en.json (Portuguese, Brazilian) 2024-12-17 14:11:15 +01:00
Excalidraw Bot
e76ef06074 New translations en.json (Galician) 2024-12-17 14:11:14 +01:00
Excalidraw Bot
0fd05e34c4 New translations en.json (Vietnamese) 2024-12-17 14:11:12 +01:00
Excalidraw Bot
b11c80361a New translations en.json (Chinese Traditional) 2024-12-17 14:11:11 +01:00
Excalidraw Bot
f19c0d14ed New translations en.json (Ukrainian) 2024-12-17 14:11:09 +01:00
Excalidraw Bot
b242a9df79 New translations en.json (Turkish) 2024-12-17 14:11:07 +01:00
Excalidraw Bot
9fed9613fa New translations en.json (Russian) 2024-12-17 14:11:06 +01:00
Excalidraw Bot
01fa484a5e New translations en.json (Polish) 2024-12-17 14:11:04 +01:00
Excalidraw Bot
9a7e1710a4 New translations en.json (Punjabi) 2024-12-17 14:11:03 +01:00
Excalidraw Bot
d1957e4056 New translations en.json (Dutch) 2024-12-17 14:11:02 +01:00
Excalidraw Bot
68c96c5c9f New translations en.json (Lithuanian) 2024-12-17 14:11:00 +01:00
Excalidraw Bot
617897be5b New translations en.json (Kurdish) 2024-12-17 14:10:59 +01:00
Excalidraw Bot
b116388c7e New translations en.json (Korean) 2024-12-17 14:10:57 +01:00
Excalidraw Bot
473d4da923 New translations en.json (Japanese) 2024-12-17 14:10:56 +01:00
Excalidraw Bot
4c15aa2cf2 New translations en.json (Indonesian) 2024-12-17 14:10:55 +01:00
Excalidraw Bot
73f1d98d06 New translations en.json (Portuguese) 2024-12-17 14:10:53 +01:00
Excalidraw Bot
4e75a68ad3 New translations en.json (Chinese Simplified) 2024-12-17 14:10:52 +01:00
Excalidraw Bot
c0cf71a6f5 New translations en.json (Swedish) 2024-12-17 14:10:50 +01:00
Excalidraw Bot
4b5b7e8f5a New translations en.json (Slovenian) 2024-12-17 14:10:49 +01:00
Excalidraw Bot
e0dff46a28 New translations en.json (Slovak) 2024-12-17 14:10:48 +01:00
Excalidraw Bot
505b6ace2b New translations en.json (Italian) 2024-12-17 14:10:47 +01:00
Excalidraw Bot
4845574506 New translations en.json (Hungarian) 2024-12-17 14:10:45 +01:00
Excalidraw Bot
a9f69d750b New translations en.json (Hebrew) 2024-12-17 14:10:44 +01:00
Excalidraw Bot
f883167acc New translations en.json (Finnish) 2024-12-17 14:10:43 +01:00
Excalidraw Bot
3d89b04ac4 New translations en.json (Basque) 2024-12-17 14:10:42 +01:00
Excalidraw Bot
3ffa6c93e4 New translations en.json (Greek) 2024-12-17 14:10:40 +01:00
Excalidraw Bot
6be95e9fbf New translations en.json (German) 2024-12-17 14:10:39 +01:00
Excalidraw Bot
be0d4241e4 New translations en.json (Danish) 2024-12-17 14:10:37 +01:00
Excalidraw Bot
dc0b951dfa New translations en.json (Catalan) 2024-12-17 14:10:36 +01:00
Excalidraw Bot
b92b0ec82b New translations en.json (Bulgarian) 2024-12-17 14:10:35 +01:00
Excalidraw Bot
774fd07ca8 New translations en.json (Arabic) 2024-12-17 14:10:34 +01:00
Excalidraw Bot
a18a1ace4d New translations en.json (Spanish) 2024-12-17 14:10:32 +01:00
Excalidraw Bot
728ac246d5 New translations en.json (French) 2024-12-17 14:10:31 +01:00
Excalidraw Bot
a1b5ff5372 New translations en.json (Romanian) 2024-12-17 14:10:30 +01:00
Excalidraw Bot
80b98ca5e4 New translations en.json (Czech) 2024-12-17 14:10:28 +01:00
Ryan Di
d99e4a23ca feat: use stats panel to crop (#8848)
* feat: use stats panel to crop

* fix: test flake

---------

Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2024-12-17 13:15:30 +01:00
Excalidraw Bot
4d22570b55 New translations en.json (Czech) 2024-12-17 12:44:37 +01:00
Ryan Di
551bae07a7 feat: snap when cropping as well (#8831)
* crop with snap

* make crop snap work with cmd as well

* turn off grid with cmd as well in crop
2024-12-16 18:31:33 +08:00
Excalidraw Bot
f1a2bb6677 New translations en.json (Indonesian) 2024-12-16 00:25:54 +01:00
Excalidraw Bot
b213e344fb New translations en.json (Indonesian) 2024-12-15 23:23:04 +01:00
Excalidraw Bot
ed61daeb16 New translations en.json (Portuguese) 2024-12-15 21:05:23 +01:00
Excalidraw Bot
4e752e95a3 New translations en.json (Chinese Simplified) 2024-12-12 03:59:20 +01:00
Shreyansh Jain
2af3221974 fix: right-click paste for images in clipboard (Issue #8826) (#8845)
* Fix right-click paste command for images (Issue #8826)

* Fix clipboard logic for multiple paste types

* fix: remove unused code

* refactor & robustness

* fix: creating paste event with image files

---------

Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2024-12-10 20:10:34 +00:00
Antonio Della Fortuna
9b401f6ea3 fix: fixed image transparency by adding alpha option to preserve image alpha channel (#8895)
added alpha option to preserve image alpha channel
2024-12-10 13:41:10 +01:00
Marcel Mraz
8a1152ce36 fix: Flush pending DOM updates before .focus() (#8901) 2024-12-09 21:57:37 +01:00
Excalidraw Bot
e459e07af5 New translations en.json (Swedish) 2024-12-09 08:39:44 +01:00
Excalidraw Bot
1aa82f1c80 New translations en.json (Slovak) 2024-12-07 17:51:15 +01:00
Excalidraw Bot
ae9dca08b5 New translations en.json (Slovak) 2024-12-07 16:55:39 +01:00
Excalidraw Bot
7af0ba734d New translations en.json (Slovenian) 2024-12-03 07:13:08 +01:00
Excalidraw Bot
d200ee2d0d New translations en.json (Italian) 2024-12-01 16:32:30 +01:00
Excalidraw Bot
597bde73d4 New translations en.json (Persian) 2024-11-30 14:11:06 +01:00
Excalidraw Bot
44642e29e4 New translations en.json (Persian) 2024-11-30 13:08:35 +01:00
Excalidraw Bot
d01091c094 New translations en.json (Persian) 2024-11-30 12:05:49 +01:00
Excalidraw Bot
9cbe0a89a7 New translations en.json (Chinese Traditional) 2024-11-28 15:43:42 +01:00
Ryan Di
b5652b8e36 fix: normalize svg using only absolute sizing (#8854) 2024-11-27 13:09:44 +01:00
Excalidraw Bot
09c53b975e New translations en.json (Hindi) 2024-11-27 06:51:41 +01:00
Excalidraw Bot
356d13cae7 New translations en.json (Marathi) 2024-11-27 06:51:40 +01:00
Excalidraw Bot
37a3caf5a9 New translations en.json (Hindi) 2024-11-27 05:10:53 +01:00
Excalidraw Bot
baaad3a443 New translations en.json (Marathi) 2024-11-27 05:10:52 +01:00
David Luzar
31e2a0cb4a fix: element link selector dialog z-index & positioning (#8853) 2024-11-26 23:18:20 +01:00
Excalidraw Bot
d679f40082 New translations en.json (Chinese Simplified) 2024-11-26 23:12:40 +01:00
Excalidraw Bot
9a7cd4f7ef New translations en.json (Russian) 2024-11-26 21:32:27 +01:00
Excalidraw Bot
f94ca28f79 New translations en.json (German) 2024-11-26 20:27:07 +01:00
Excalidraw Bot
f264ae11f4 New translations en.json (Romanian) 2024-11-26 20:27:06 +01:00
Excalidraw Bot
d864979a03 New translations en.json (Karakalpak) 2024-11-26 19:16:20 +01:00
Excalidraw Bot
0a6d3d1adb New translations en.json (Kabyle) 2024-11-26 19:16:19 +01:00
Excalidraw Bot
1d9a5047ad New translations en.json (Bengali, India) 2024-11-26 19:16:18 +01:00
Excalidraw Bot
e3ec60d5f0 New translations en.json (German, Switzerland) 2024-11-26 19:16:16 +01:00
Excalidraw Bot
7d13b85641 New translations en.json (Occitan) 2024-11-26 19:16:15 +01:00
Excalidraw Bot
5d507846bc New translations en.json (Norwegian Bokmal) 2024-11-26 19:16:14 +01:00
Excalidraw Bot
b75e141298 New translations en.json (Uzbek) 2024-11-26 19:16:13 +01:00
Excalidraw Bot
884c74fbb2 New translations en.json (Sinhala) 2024-11-26 19:16:12 +01:00
Excalidraw Bot
bcf4d508f1 New translations en.json (Chinese Traditional, Hong Kong) 2024-11-26 19:16:11 +01:00
Excalidraw Bot
dc539e6820 New translations en.json (Burmese) 2024-11-26 19:16:10 +01:00
Excalidraw Bot
6f2eb61779 New translations en.json (Hindi) 2024-11-26 19:16:08 +01:00
Excalidraw Bot
9f616b80ad New translations en.json (Azerbaijani) 2024-11-26 19:16:07 +01:00
Excalidraw Bot
054616a1cc New translations en.json (Latvian) 2024-11-26 19:16:06 +01:00
Excalidraw Bot
cec851802c New translations en.json (Kazakh) 2024-11-26 19:16:04 +01:00
Excalidraw Bot
3a0185547b New translations en.json (Norwegian Nynorsk) 2024-11-26 19:16:03 +01:00
Excalidraw Bot
3ff94c62d8 New translations en.json (Thai) 2024-11-26 19:16:02 +01:00
Excalidraw Bot
5c389ba4f8 New translations en.json (Marathi) 2024-11-26 19:16:01 +01:00
Excalidraw Bot
17e68174e0 New translations en.json (Bengali) 2024-11-26 19:15:59 +01:00
Excalidraw Bot
e709161793 New translations en.json (Tamil) 2024-11-26 19:15:58 +01:00
Excalidraw Bot
20f73f04d0 New translations en.json (Khmer) 2024-11-26 19:15:57 +01:00
Excalidraw Bot
fbac5eca10 New translations en.json (Persian) 2024-11-26 19:15:55 +01:00
Excalidraw Bot
cad57ed57f New translations en.json (Portuguese, Brazilian) 2024-11-26 19:15:54 +01:00
Excalidraw Bot
4df28ca379 New translations en.json (Galician) 2024-11-26 19:15:53 +01:00
Excalidraw Bot
1a89311bf1 New translations en.json (Vietnamese) 2024-11-26 19:15:52 +01:00
Excalidraw Bot
e419fbf34f New translations en.json (Chinese Traditional) 2024-11-26 19:15:50 +01:00
Excalidraw Bot
84f2ab1730 New translations en.json (Chinese Simplified) 2024-11-26 19:15:49 +01:00
Excalidraw Bot
4d0d230a2a New translations en.json (Ukrainian) 2024-11-26 19:15:48 +01:00
Excalidraw Bot
b1c73bfa1d New translations en.json (Turkish) 2024-11-26 19:15:47 +01:00
Excalidraw Bot
f6b5f846a0 New translations en.json (Swedish) 2024-11-26 19:15:45 +01:00
Excalidraw Bot
db0f79925b New translations en.json (Slovenian) 2024-11-26 19:15:43 +01:00
Excalidraw Bot
f23ba3ef04 New translations en.json (Slovak) 2024-11-26 19:15:42 +01:00
Excalidraw Bot
8c0adc2057 New translations en.json (Russian) 2024-11-26 19:15:41 +01:00
Excalidraw Bot
a9276c6be4 New translations en.json (Portuguese) 2024-11-26 19:15:39 +01:00
Excalidraw Bot
e9239f7cd6 New translations en.json (Polish) 2024-11-26 19:15:38 +01:00
Excalidraw Bot
3607ed03a4 New translations en.json (Punjabi) 2024-11-26 19:15:37 +01:00
Excalidraw Bot
0fbc118070 New translations en.json (Dutch) 2024-11-26 19:15:34 +01:00
Excalidraw Bot
6a620a5384 New translations en.json (Lithuanian) 2024-11-26 19:15:33 +01:00
Excalidraw Bot
c87d215ca7 New translations en.json (Kurdish) 2024-11-26 19:15:32 +01:00
Excalidraw Bot
2a31a1ff29 New translations en.json (Korean) 2024-11-26 19:15:30 +01:00
Excalidraw Bot
cdc50c727e New translations en.json (Japanese) 2024-11-26 19:15:29 +01:00
Excalidraw Bot
73c788b92a New translations en.json (Italian) 2024-11-26 19:15:28 +01:00
Excalidraw Bot
b14ddf04bd New translations en.json (Hungarian) 2024-11-26 19:15:26 +01:00
Excalidraw Bot
2099a5a9ce New translations en.json (Hebrew) 2024-11-26 19:15:25 +01:00
Excalidraw Bot
e645dde8cb New translations en.json (Finnish) 2024-11-26 19:15:23 +01:00
Excalidraw Bot
481c01a2f1 New translations en.json (Basque) 2024-11-26 19:15:22 +01:00
Excalidraw Bot
3cbff07c4d New translations en.json (Greek) 2024-11-26 19:15:21 +01:00
Excalidraw Bot
afff916b38 New translations en.json (German) 2024-11-26 19:15:19 +01:00
Excalidraw Bot
89b4bf9ba9 New translations en.json (Danish) 2024-11-26 19:15:18 +01:00
Excalidraw Bot
0d2c2589ff New translations en.json (Czech) 2024-11-26 19:15:17 +01:00
Excalidraw Bot
8bad0ff2f4 New translations en.json (Bulgarian) 2024-11-26 19:15:15 +01:00
Excalidraw Bot
5f395cb853 New translations en.json (Arabic) 2024-11-26 19:15:14 +01:00
Excalidraw Bot
7fff5d5b81 New translations en.json (Spanish) 2024-11-26 19:15:12 +01:00
Excalidraw Bot
b025fee131 New translations en.json (French) 2024-11-26 19:15:11 +01:00
Excalidraw Bot
be6bed7ef6 New translations en.json (Romanian) 2024-11-26 19:15:10 +01:00
Excalidraw Bot
14d3a5d24c New translations en.json (Indonesian) 2024-11-26 19:15:09 +01:00
Excalidraw Bot
185e8c2872 New translations en.json (Catalan) 2024-11-26 19:15:07 +01:00
Ryan Di
c0b80a03bd feat: in canvas links between shapes (#8812)
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2024-11-26 18:53:25 +01:00
Excalidraw Bot
911acf5563 New translations en.json (Indonesian) 2024-11-26 18:06:22 +01:00
David Luzar
a758aaf8f6 fix: update old blog links & add canonical url (#8846) 2024-11-26 17:42:25 +01:00
Márk Tolmács
b2a6a87b10 chore: Remove @tldraw/vec (#8762)
Not needed.
2024-11-21 15:19:20 +01:00
Márk Tolmács
ab8b3537b3 fix: Optimize frameToHighlight state change and snapLines state change (#8763)
Fix case when frame interactions recursively call setState() without any change.
2024-11-21 15:19:00 +01:00
Márk Tolmács
d21e0008dd fix: Make some events expllicitly active to avoid console warnings (#8757)
Avoid chrome/edge reporting of by-default blocking event handlers
2024-11-21 15:18:18 +01:00
David Luzar
840f1428c4 chore: bump @excalidraw/mermaid-to-excalidraw@1.1.2 (#8830) 2024-11-20 13:10:07 +01:00
Márk Tolmács
2db5bbcb29 fix: Unify binding update options for updateBoundElements() (#8832)
Fix insonsistent naming for option newSize/oldSize for updateBoundElements()
2024-11-20 11:46:45 +01:00
David Luzar
0927431d0d chore: bump @excalidraw/mermaid-to-excalidraw (#8829) 2024-11-19 20:46:55 +01:00
dependabot[bot]
98c0a67333 build(deps): bump cross-spawn from 7.0.3 to 7.0.6 (#8824)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-19 20:34:35 +01:00
Excalidraw Bot
06f4d4bdf6 New translations en.json (Catalan) 2024-11-19 12:11:10 +01:00
Excalidraw Bot
51df6af4d5 New translations en.json (Catalan) 2024-11-19 09:45:38 +01:00
Aakansha Doshi
57cf577376 fix: cleanup scripts and support upto node 22 (#8794) 2024-11-11 23:56:00 +05:30
Hamir Mahal
6e0ee89ee4 fix: usage of node12 which is deprecated (#8791) 2024-11-11 12:05:55 +01:00
David Luzar
35f778a734 build: set PWA flag in dev to false (#8788) 2024-11-09 21:04:50 +01:00
Aakansha Doshi
ee091d0dbd build: add a flag VITE_APP_ENABLE_PWA for enabling pwa in dev environment (#8784)
* build: add a flag VITE_APP_ENABLE_PWA for enabling pwa in dev environment

* fix

* set VITE_ENABLE_PWA to false in .env.development
2024-11-09 21:45:37 +05:30
Aakansha Doshi
ef9ea14a75 fix: remove manifest.json (#8783)
* fix: remove manifest.json

* disable pwa in dev
2024-11-09 13:42:11 +05:30
Aakansha Doshi
df168a6883 fix: load env vars correctly and set debug and linter flags to false explicitly in prod mode (#8770)
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2024-11-07 21:14:49 +00:00
David Luzar
798f5f4dfb feat: update blog url (#8767) 2024-11-06 16:41:41 +00:00
Excalidraw Bot
2b82cfeb17 New translations en.json (Persian) 2024-11-06 16:00:23 +01:00
Excalidraw Bot
45412a5b9f New translations en.json (Persian) 2024-11-06 14:10:19 +01:00
Excalidraw Bot
0d02fe5357 New translations en.json (Portuguese, Brazilian) 2024-11-05 21:43:37 +01:00
Barnabás Molnár
d9ad7c039b feat: export scene to e+ on workspace creation/redemption (#8514)
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
2024-11-04 22:35:45 +00:00
Márk Tolmács
7c0239e693 fix: Console error in dev mode due to missing font path in non-prod (#8756)
Fix console error due to missing font path in dev mode reported by Firefox.
2024-11-04 17:54:00 +01:00
Aakansha Doshi
da33481fa3 chore: support upto node 22.x.x (#8755) 2024-11-04 18:57:40 +05:30
Marcel Mraz
70e0e8dc29 fix: text pushes UI due to padding (#8745) 2024-11-01 23:43:48 +02:00
Marcel Mraz
2734e646ca chore: simplify line-break regexes, separate text wrapping (#8715) 2024-10-30 14:24:12 +01:00
Marcel Mraz
dfaaff4432 fix: fix trailing line whitespaces layout shift (#8714) 2024-10-30 14:11:13 +01:00
Marcel Mraz
03028eaa8c fix: load font faces in Safari manually (#8693) 2024-10-30 12:40:24 +01:00
David Luzar
79b181bcdc fix: restore svg image DataURL dimensions (#8730) 2024-10-29 22:40:24 +01:00
David Luzar
f9815b8b4f fix: image cropping svg + compat mode (#8710)
Co-authored-by: Ryan Di <ryan.weihao.di@gmail.com>
2024-10-28 10:08:05 +01:00
Excalidraw Bot
7173691477 New translations en.json (Chinese Simplified) 2024-10-26 12:43:37 +02:00
codeman
96ed8a4331 chore: remove duplicated meta tag (#8718)
Co-authored-by: David Luzar <5153846+dwelle@users.noreply.github.com>
2024-10-25 16:29:48 +00:00
Hamir Mahal
33b01d4e80 fix: usage of node12 which is deprecated (#8709) 2024-10-25 10:39:44 +05:30
Excalidraw Bot
48b9a4d5dc New translations en.json (Hindi) 2024-10-24 09:47:16 +02:00
Excalidraw Bot
76dd970ded New translations en.json (Marathi) 2024-10-24 09:47:14 +02:00
Excalidraw Bot
9c963374c1 New translations en.json (Marathi) 2024-10-24 07:40:11 +02:00
Excalidraw Bot
9be077c0af New translations en.json (Polish) 2024-10-23 14:28:30 +02:00
Excalidraw Bot
6980e289ba New translations en.json (Thai) 2024-10-23 13:16:18 +02:00
Excalidraw Bot
4ac09f6b2b New translations en.json (Polish) 2024-10-23 13:16:16 +02:00
Excalidraw Bot
62e9b39ac5 New translations en.json (Chinese Traditional) 2024-10-23 06:40:53 +02:00
Excalidraw Bot
f9b0d26c7f New translations en.json (German) 2024-10-22 19:44:31 +02:00
Excalidraw Bot
43e8ae3bdd New translations en.json (Romanian) 2024-10-22 12:29:39 +02:00
Excalidraw Bot
695c2580cd New translations en.json (Slovenian) 2024-10-22 06:25:46 +02:00
Excalidraw Bot
41a7111e19 New translations en.json (Karakalpak) 2024-10-21 23:42:54 +02:00
Excalidraw Bot
0338f74b45 New translations en.json (Kabyle) 2024-10-21 23:42:53 +02:00
Excalidraw Bot
baa1858a95 New translations en.json (Bengali, India) 2024-10-21 23:42:52 +02:00
Excalidraw Bot
e011b47e58 New translations en.json (German, Switzerland) 2024-10-21 23:42:51 +02:00
Excalidraw Bot
a97c8a0360 New translations en.json (Occitan) 2024-10-21 23:42:50 +02:00
Excalidraw Bot
976ffab80f New translations en.json (Norwegian Bokmal) 2024-10-21 23:42:49 +02:00
Excalidraw Bot
84a363fe4d New translations en.json (Uzbek) 2024-10-21 23:42:48 +02:00
Excalidraw Bot
62d05d7f25 New translations en.json (Sinhala) 2024-10-21 23:42:47 +02:00
Excalidraw Bot
66e5170691 New translations en.json (Chinese Traditional, Hong Kong) 2024-10-21 23:42:46 +02:00
Excalidraw Bot
da16dd3eff New translations en.json (Burmese) 2024-10-21 23:42:44 +02:00
Excalidraw Bot
00f0f85cd8 New translations en.json (Hindi) 2024-10-21 23:42:43 +02:00
Excalidraw Bot
8c864ea97b New translations en.json (Azerbaijani) 2024-10-21 23:42:42 +02:00
Excalidraw Bot
b20083c572 New translations en.json (Latvian) 2024-10-21 23:42:41 +02:00
Excalidraw Bot
c91a774849 New translations en.json (Kazakh) 2024-10-21 23:42:40 +02:00
Excalidraw Bot
835be2ae12 New translations en.json (Norwegian Nynorsk) 2024-10-21 23:42:39 +02:00
Excalidraw Bot
3831c17d45 New translations en.json (Thai) 2024-10-21 23:42:38 +02:00
Excalidraw Bot
3b2779dacc New translations en.json (Marathi) 2024-10-21 23:42:36 +02:00
Excalidraw Bot
31a0a79438 New translations en.json (Bengali) 2024-10-21 23:42:35 +02:00
Excalidraw Bot
310e04cd63 New translations en.json (Tamil) 2024-10-21 23:42:34 +02:00
Excalidraw Bot
ebd84c318d New translations en.json (Khmer) 2024-10-21 23:42:33 +02:00
Excalidraw Bot
3b5a918176 New translations en.json (Persian) 2024-10-21 23:42:32 +02:00
Excalidraw Bot
c878278c4c New translations en.json (Indonesian) 2024-10-21 23:42:31 +02:00
Excalidraw Bot
2fb60ffdd2 New translations en.json (Portuguese, Brazilian) 2024-10-21 23:42:30 +02:00
Excalidraw Bot
3ed09450bf New translations en.json (Galician) 2024-10-21 23:42:29 +02:00
Excalidraw Bot
6ba9228ee1 New translations en.json (Vietnamese) 2024-10-21 23:42:27 +02:00
Excalidraw Bot
9cbc5fe090 New translations en.json (Chinese Traditional) 2024-10-21 23:42:26 +02:00
Excalidraw Bot
4cb605f65e New translations en.json (Ukrainian) 2024-10-21 23:42:25 +02:00
Excalidraw Bot
b9f7b1b927 New translations en.json (Slovenian) 2024-10-21 23:42:24 +02:00
Excalidraw Bot
1ce313ef8d New translations en.json (Russian) 2024-10-21 23:42:23 +02:00
Excalidraw Bot
92f40dee15 New translations en.json (Portuguese) 2024-10-21 23:42:22 +02:00
Excalidraw Bot
349d4336c4 New translations en.json (Polish) 2024-10-21 23:42:21 +02:00
Excalidraw Bot
d678395574 New translations en.json (Punjabi) 2024-10-21 23:42:20 +02:00
Excalidraw Bot
699a08aed7 New translations en.json (Dutch) 2024-10-21 23:42:18 +02:00
Excalidraw Bot
eb17963a56 New translations en.json (Lithuanian) 2024-10-21 23:42:17 +02:00
Excalidraw Bot
0be2c0be9d New translations en.json (Kurdish) 2024-10-21 23:42:16 +02:00
Excalidraw Bot
3e52ed7c45 New translations en.json (Japanese) 2024-10-21 23:42:15 +02:00
Excalidraw Bot
84a89d4f74 New translations en.json (Italian) 2024-10-21 23:42:14 +02:00
Excalidraw Bot
80cc680fff New translations en.json (Hungarian) 2024-10-21 23:42:13 +02:00
Excalidraw Bot
255f47483f New translations en.json (Hebrew) 2024-10-21 23:42:12 +02:00
Excalidraw Bot
10f5c6b509 New translations en.json (Finnish) 2024-10-21 23:42:11 +02:00
Excalidraw Bot
6e0fac82d3 New translations en.json (Basque) 2024-10-21 23:42:10 +02:00
Excalidraw Bot
2be2924fa0 New translations en.json (Greek) 2024-10-21 23:42:09 +02:00
Excalidraw Bot
9fd4565e4a New translations en.json (German) 2024-10-21 23:42:07 +02:00
Excalidraw Bot
4e5ea9c740 New translations en.json (Danish) 2024-10-21 23:42:06 +02:00
Excalidraw Bot
0ab0d44cd3 New translations en.json (Czech) 2024-10-21 23:42:05 +02:00
Excalidraw Bot
6c26b4e569 New translations en.json (Catalan) 2024-10-21 23:42:04 +02:00
Excalidraw Bot
5b0253d3a6 New translations en.json (Bulgarian) 2024-10-21 23:42:03 +02:00
Excalidraw Bot
28a654fccc New translations en.json (Arabic) 2024-10-21 23:42:02 +02:00
Excalidraw Bot
bda68283d3 New translations en.json (Spanish) 2024-10-21 23:42:00 +02:00
Excalidraw Bot
eb7140181d New translations en.json (Romanian) 2024-10-21 23:41:59 +02:00
Excalidraw Bot
9b93b1c568 New translations en.json (French) 2024-10-21 23:41:58 +02:00
Excalidraw Bot
d32aed4330 New translations en.json (Chinese Simplified) 2024-10-21 23:41:57 +02:00
Excalidraw Bot
419f9f2a2f New translations en.json (Korean) 2024-10-21 23:41:56 +02:00
Excalidraw Bot
86dfb3dff2 New translations en.json (Slovak) 2024-10-21 23:41:55 +02:00
Excalidraw Bot
4a650dc607 New translations en.json (Swedish) 2024-10-21 23:41:54 +02:00
Excalidraw Bot
6db2847d10 New translations en.json (Turkish) 2024-10-21 23:41:53 +02:00
Excalidraw Bot
0c24264185 New translations en.json (French) 2024-10-21 17:02:51 +02:00
Excalidraw Bot
9391e8090a New translations en.json (Slovak) 2024-10-20 19:51:59 +02:00
Excalidraw Bot
c0c3ca85d7 New translations en.json (Russian) 2024-10-18 10:39:46 +02:00
Excalidraw Bot
d183629ca4 New translations en.json (Chinese Simplified) 2024-10-18 07:52:05 +02:00
Excalidraw Bot
cd4846f8aa New translations en.json (Chinese Traditional) 2024-10-18 05:37:32 +02:00
Excalidraw Bot
997bd7f6b3 New translations en.json (Polish) 2024-10-17 23:06:53 +02:00
Excalidraw Bot
a93a36c94a New translations en.json (Slovenian) 2024-10-17 21:45:50 +02:00
Excalidraw Bot
84314ed5ec New translations en.json (German) 2024-10-17 21:45:49 +02:00
Excalidraw Bot
ae09870836 New translations en.json (Karakalpak) 2024-10-17 20:17:04 +02:00
Excalidraw Bot
bff8aaee01 New translations en.json (Kabyle) 2024-10-17 20:17:02 +02:00
Excalidraw Bot
b059d9ac0b New translations en.json (Bengali, India) 2024-10-17 20:17:01 +02:00
Excalidraw Bot
46c9b1d2a9 New translations en.json (German, Switzerland) 2024-10-17 20:17:00 +02:00
Excalidraw Bot
3e36e07d80 New translations en.json (Occitan) 2024-10-17 20:16:59 +02:00
Excalidraw Bot
0080bcfce5 New translations en.json (Norwegian Bokmal) 2024-10-17 20:16:58 +02:00
Excalidraw Bot
0bd6ce4b47 New translations en.json (Uzbek) 2024-10-17 20:16:57 +02:00
Excalidraw Bot
f4c88d5669 New translations en.json (Sinhala) 2024-10-17 20:16:56 +02:00
Excalidraw Bot
b6038126c5 New translations en.json (Chinese Traditional, Hong Kong) 2024-10-17 20:16:55 +02:00
Excalidraw Bot
5ab897112c New translations en.json (Burmese) 2024-10-17 20:16:54 +02:00
Excalidraw Bot
1b2d4e59a3 New translations en.json (Hindi) 2024-10-17 20:16:53 +02:00
Excalidraw Bot
569860cde6 New translations en.json (Azerbaijani) 2024-10-17 20:16:51 +02:00
Excalidraw Bot
7de2e0975d New translations en.json (Latvian) 2024-10-17 20:16:50 +02:00
Excalidraw Bot
653bcd7898 New translations en.json (Kazakh) 2024-10-17 20:16:49 +02:00
Excalidraw Bot
733b0b45ce New translations en.json (Norwegian Nynorsk) 2024-10-17 20:16:48 +02:00
Excalidraw Bot
ed2c4ccbba New translations en.json (Thai) 2024-10-17 20:16:47 +02:00
Excalidraw Bot
aab15eef3e New translations en.json (Marathi) 2024-10-17 20:16:45 +02:00
Excalidraw Bot
ce7ede5fb0 New translations en.json (Bengali) 2024-10-17 20:16:44 +02:00
Excalidraw Bot
944ffba66f New translations en.json (Tamil) 2024-10-17 20:16:43 +02:00
Excalidraw Bot
e600142ee6 New translations en.json (Khmer) 2024-10-17 20:16:42 +02:00
Excalidraw Bot
3a3e9f8701 New translations en.json (Persian) 2024-10-17 20:16:40 +02:00
Excalidraw Bot
dfdfeae79f New translations en.json (Indonesian) 2024-10-17 20:16:39 +02:00
Excalidraw Bot
a6b49fa014 New translations en.json (Portuguese, Brazilian) 2024-10-17 20:16:38 +02:00
Excalidraw Bot
a706962edd New translations en.json (Galician) 2024-10-17 20:16:37 +02:00
Excalidraw Bot
e69fd9f2f8 New translations en.json (Vietnamese) 2024-10-17 20:16:36 +02:00
Excalidraw Bot
3f7b5034e7 New translations en.json (Chinese Traditional) 2024-10-17 20:16:35 +02:00
Excalidraw Bot
fcbecec034 New translations en.json (Ukrainian) 2024-10-17 20:16:34 +02:00
Excalidraw Bot
e77fc90d90 New translations en.json (Slovenian) 2024-10-17 20:16:32 +02:00
Excalidraw Bot
112b16d9df New translations en.json (Russian) 2024-10-17 20:16:30 +02:00
Excalidraw Bot
dc4e625750 New translations en.json (Portuguese) 2024-10-17 20:16:29 +02:00
Excalidraw Bot
a25eae3edd New translations en.json (Polish) 2024-10-17 20:16:28 +02:00
Excalidraw Bot
7f58444112 New translations en.json (Punjabi) 2024-10-17 20:16:27 +02:00
Excalidraw Bot
6527ee5a11 New translations en.json (Dutch) 2024-10-17 20:16:25 +02:00
Excalidraw Bot
52a2558d11 New translations en.json (Lithuanian) 2024-10-17 20:16:24 +02:00
Excalidraw Bot
21a56e4a0b New translations en.json (Kurdish) 2024-10-17 20:16:23 +02:00
Excalidraw Bot
c2fdeda13e New translations en.json (Japanese) 2024-10-17 20:16:22 +02:00
Excalidraw Bot
4e0f644a55 New translations en.json (Italian) 2024-10-17 20:16:21 +02:00
Excalidraw Bot
257ffe1c07 New translations en.json (Hungarian) 2024-10-17 20:16:20 +02:00
Excalidraw Bot
5416ee4c7c New translations en.json (Hebrew) 2024-10-17 20:16:19 +02:00
Excalidraw Bot
833314cf7a New translations en.json (Finnish) 2024-10-17 20:16:17 +02:00
Excalidraw Bot
359c2c2bc6 New translations en.json (Basque) 2024-10-17 20:16:16 +02:00
Excalidraw Bot
e8e734be56 New translations en.json (Greek) 2024-10-17 20:16:15 +02:00
Excalidraw Bot
556e38edce New translations en.json (German) 2024-10-17 20:16:14 +02:00
Excalidraw Bot
aaeddcf0e1 New translations en.json (Danish) 2024-10-17 20:16:13 +02:00
Excalidraw Bot
6139cb6d98 New translations en.json (Czech) 2024-10-17 20:16:12 +02:00
Excalidraw Bot
aff50136ef New translations en.json (Catalan) 2024-10-17 20:16:11 +02:00
Excalidraw Bot
8a8c60adab New translations en.json (Bulgarian) 2024-10-17 20:16:09 +02:00
Excalidraw Bot
c09b46e964 New translations en.json (Arabic) 2024-10-17 20:16:08 +02:00
Excalidraw Bot
ed7ffe00a3 New translations en.json (Spanish) 2024-10-17 20:16:07 +02:00
Excalidraw Bot
67b8e63637 New translations en.json (Romanian) 2024-10-17 20:16:06 +02:00
Excalidraw Bot
c6a8e4de1e New translations en.json (French) 2024-10-17 20:16:05 +02:00
Excalidraw Bot
59982f4d84 New translations en.json (Chinese Simplified) 2024-10-17 20:16:04 +02:00
Excalidraw Bot
ab6e573497 New translations en.json (Korean) 2024-10-17 20:16:02 +02:00
Excalidraw Bot
dd377b2a0f New translations en.json (Slovak) 2024-10-17 20:16:01 +02:00
Excalidraw Bot
c6607c4d19 New translations en.json (Swedish) 2024-10-17 20:16:00 +02:00
Excalidraw Bot
f881d98ae7 New translations en.json (Turkish) 2024-10-17 20:15:59 +02:00
Excalidraw Bot
7a88e72f82 New translations en.json (French) 2024-10-15 13:15:42 +02:00
Excalidraw Bot
d132221f9f New translations en.json (Chinese Simplified) 2024-10-14 05:51:53 +02:00
Excalidraw Bot
46a7204d41 New translations en.json (Korean) 2024-10-12 10:18:26 +02:00
Excalidraw Bot
c46038b47e New translations en.json (Korean) 2024-10-12 09:08:57 +02:00
Excalidraw Bot
1ec6828470 New translations en.json (Slovak) 2024-10-05 09:29:19 +02:00
Excalidraw Bot
8d5d10b352 New translations en.json (Swedish) 2024-10-04 16:47:21 +02:00
Excalidraw Bot
09585d312b New translations en.json (Swedish) 2024-10-04 15:02:33 +02:00
Excalidraw Bot
7e8b2ad87e New translations en.json (Turkish) 2024-10-03 15:45:15 +02:00
Excalidraw Bot
26c6bd8942 New translations en.json (Portuguese, Brazilian) 2024-10-01 18:35:44 +02:00
Excalidraw Bot
d198280f6c New translations en.json (Chinese Simplified) 2024-09-26 12:55:03 +02:00
Excalidraw Bot
573adc72a2 New translations en.json (Japanese) 2024-09-26 12:55:01 +02:00
Excalidraw Bot
94dcc50578 New translations en.json (Hebrew) 2024-09-20 11:33:55 +02:00
Excalidraw Bot
1b8591d297 New translations en.json (Hebrew) 2024-09-20 09:16:14 +02:00
Excalidraw Bot
a3afb5551b New translations en.json (Chinese Traditional) 2024-09-16 05:50:12 +02:00
Excalidraw Bot
cda10a8aff New translations en.json (Persian) 2024-09-13 23:05:05 +02:00
Excalidraw Bot
a0d7a0a178 New translations en.json (Polish) 2024-09-12 18:49:55 +02:00
Excalidraw Bot
c94e69abbb New translations en.json (Polish) 2024-09-12 15:08:27 +02:00
Excalidraw Bot
c1227e5e65 New translations en.json (Ukrainian) 2024-09-12 14:10:48 +02:00
Excalidraw Bot
f535d1a2c1 New translations en.json (Hindi) 2024-09-12 08:06:48 +02:00
Excalidraw Bot
a2be6780de New translations en.json (Marathi) 2024-09-12 08:06:47 +02:00
Excalidraw Bot
fc174d14c4 New translations en.json (Hindi) 2024-09-12 07:08:04 +02:00
Excalidraw Bot
69fef3808b New translations en.json (Marathi) 2024-09-12 07:08:03 +02:00
Excalidraw Bot
d63e67f1ef New translations en.json (Russian) 2024-09-11 22:32:08 +02:00
Excalidraw Bot
bbbde64199 New translations en.json (Slovenian) 2024-09-11 20:55:49 +02:00
Excalidraw Bot
136eb8bbad New translations en.json (German) 2024-09-11 20:55:47 +02:00
Excalidraw Bot
220952d014 New translations en.json (Romanian) 2024-09-11 20:55:46 +02:00
Excalidraw Bot
789ccd857a New translations en.json (Hindi) 2024-09-11 19:34:29 +02:00
Excalidraw Bot
4270b2c013 New translations en.json (Marathi) 2024-09-11 19:34:24 +02:00
Excalidraw Bot
98f432ff8e New translations en.json (Chinese Traditional) 2024-09-11 19:34:19 +02:00
Excalidraw Bot
3aeb0dde1f New translations en.json (Swedish) 2024-09-11 19:34:15 +02:00
Excalidraw Bot
a6e3e4c1d9 New translations en.json (Slovenian) 2024-09-11 19:34:14 +02:00
Excalidraw Bot
34defc0327 New translations en.json (Russian) 2024-09-11 19:34:13 +02:00
Excalidraw Bot
a76508746a New translations en.json (Portuguese) 2024-09-11 19:34:12 +02:00
Excalidraw Bot
624c80e80a New translations en.json (German) 2024-09-11 19:34:03 +02:00
Excalidraw Bot
0f695e41e1 New translations en.json (Romanian) 2024-09-11 19:33:58 +02:00
Excalidraw Bot
13dbb4fcc5 New translations en.json (Polish) 2024-09-11 19:33:56 +02:00
Excalidraw Bot
59d5d7e0b5 New translations en.json (German, Switzerland) 2024-09-11 19:33:55 +02:00
Excalidraw Bot
8f6323fd38 New translations en.json (Hindi) 2024-09-11 11:46:51 +02:00
Excalidraw Bot
4f5ba867be New translations en.json (Marathi) 2024-09-11 11:46:49 +02:00
Excalidraw Bot
2ff791a31b New translations en.json (Polish) 2024-09-11 11:46:48 +02:00
Excalidraw Bot
678b8edb87 New translations en.json (Romanian) 2024-09-10 21:20:50 +02:00
Excalidraw Bot
6e29b3ad25 New translations en.json (Swedish) 2024-09-10 09:34:34 +02:00
Excalidraw Bot
31e812c084 New translations en.json (Slovenian) 2024-09-10 09:34:32 +02:00
Excalidraw Bot
4b3dd5ba71 New translations en.json (Chinese Traditional) 2024-09-10 06:19:12 +02:00
Excalidraw Bot
941219be23 New translations en.json (Russian) 2024-09-09 23:40:22 +02:00
Excalidraw Bot
c74ee59fee New translations en.json (Portuguese) 2024-09-09 21:08:26 +02:00
Excalidraw Bot
b35bcdb09e New translations en.json (German) 2024-09-09 19:49:08 +02:00
Excalidraw Bot
e3fdaf7e9d New translations en.json (Karakalpak) 2024-09-09 17:31:44 +02:00
Excalidraw Bot
55b438017f New translations en.json (Kabyle) 2024-09-09 17:31:43 +02:00
Excalidraw Bot
52a95589d6 New translations en.json (Bengali, India) 2024-09-09 17:31:42 +02:00
Excalidraw Bot
e1351768c8 New translations en.json (Occitan) 2024-09-09 17:31:40 +02:00
Excalidraw Bot
03867d184a New translations en.json (Norwegian Bokmal) 2024-09-09 17:31:39 +02:00
Excalidraw Bot
63511c149a New translations en.json (Uzbek) 2024-09-09 17:31:38 +02:00
Excalidraw Bot
28aa841d8e New translations en.json (Sinhala) 2024-09-09 17:31:35 +02:00
Excalidraw Bot
cbd1d07c91 New translations en.json (Chinese Traditional, Hong Kong) 2024-09-09 17:31:34 +02:00
Excalidraw Bot
b8add8f2ed New translations en.json (Burmese) 2024-09-09 17:31:33 +02:00
Excalidraw Bot
632e9d492f New translations en.json (Hindi) 2024-09-09 17:31:32 +02:00
Excalidraw Bot
5f848e58c3 New translations en.json (Azerbaijani) 2024-09-09 17:31:31 +02:00
Excalidraw Bot
f67c30d062 New translations en.json (Latvian) 2024-09-09 17:31:29 +02:00
Excalidraw Bot
195b05cd44 New translations en.json (Kazakh) 2024-09-09 17:31:28 +02:00
Excalidraw Bot
09ebef19dd New translations en.json (Norwegian Nynorsk) 2024-09-09 17:31:27 +02:00
Excalidraw Bot
d465b5df2a New translations en.json (Thai) 2024-09-09 17:31:26 +02:00
Excalidraw Bot
8a88c67b60 New translations en.json (Marathi) 2024-09-09 17:31:24 +02:00
Excalidraw Bot
4f3acdee72 New translations en.json (Bengali) 2024-09-09 17:31:23 +02:00
Excalidraw Bot
dab9274cdd New translations en.json (Tamil) 2024-09-09 17:31:22 +02:00
Excalidraw Bot
b0991c13d9 New translations en.json (Khmer) 2024-09-09 17:31:21 +02:00
Excalidraw Bot
0d727dd01a New translations en.json (Indonesian) 2024-09-09 17:31:20 +02:00
Excalidraw Bot
d4b6a1a89c New translations en.json (Portuguese, Brazilian) 2024-09-09 17:31:19 +02:00
Excalidraw Bot
425736cb55 New translations en.json (Galician) 2024-09-09 17:31:18 +02:00
Excalidraw Bot
094f35e1a1 New translations en.json (Vietnamese) 2024-09-09 17:31:17 +02:00
Excalidraw Bot
6f93afcbd7 New translations en.json (Chinese Traditional) 2024-09-09 17:31:16 +02:00
Excalidraw Bot
71678ed812 New translations en.json (Chinese Simplified) 2024-09-09 17:31:14 +02:00
Excalidraw Bot
d19c45d42c New translations en.json (Ukrainian) 2024-09-09 17:31:13 +02:00
Excalidraw Bot
9d29320bc0 New translations en.json (Turkish) 2024-09-09 17:31:12 +02:00
Excalidraw Bot
f083ba7f8d New translations en.json (Swedish) 2024-09-09 17:31:11 +02:00
Excalidraw Bot
bfa4205bf7 New translations en.json (Slovenian) 2024-09-09 17:31:10 +02:00
Excalidraw Bot
c4d3cb7d4e New translations en.json (Slovak) 2024-09-09 17:31:09 +02:00
Excalidraw Bot
1fe128e53b New translations en.json (Russian) 2024-09-09 17:31:07 +02:00
Excalidraw Bot
25f3c1486c New translations en.json (Portuguese) 2024-09-09 17:31:06 +02:00
Excalidraw Bot
620f837b82 New translations en.json (Punjabi) 2024-09-09 17:31:05 +02:00
Excalidraw Bot
65a58cb080 New translations en.json (Dutch) 2024-09-09 17:31:04 +02:00
Excalidraw Bot
f9d9d8eefc New translations en.json (Lithuanian) 2024-09-09 17:31:03 +02:00
Excalidraw Bot
5f5d8dea8a New translations en.json (Kurdish) 2024-09-09 17:31:01 +02:00
Excalidraw Bot
230827cba5 New translations en.json (Korean) 2024-09-09 17:31:00 +02:00
Excalidraw Bot
53c7487113 New translations en.json (Japanese) 2024-09-09 17:30:59 +02:00
Excalidraw Bot
d5b4287f41 New translations en.json (Italian) 2024-09-09 17:30:58 +02:00
Excalidraw Bot
c29b7a5c7a New translations en.json (Hungarian) 2024-09-09 17:30:57 +02:00
Excalidraw Bot
a56dd2a529 New translations en.json (Hebrew) 2024-09-09 17:30:55 +02:00
Excalidraw Bot
14b59805a2 New translations en.json (Finnish) 2024-09-09 17:30:54 +02:00
Excalidraw Bot
e01e1be3de New translations en.json (Basque) 2024-09-09 17:30:53 +02:00
Excalidraw Bot
d403251fd7 New translations en.json (German) 2024-09-09 17:30:52 +02:00
Excalidraw Bot
d46c9d35b7 New translations en.json (Danish) 2024-09-09 17:30:51 +02:00
Excalidraw Bot
5fa9193415 New translations en.json (Czech) 2024-09-09 17:30:50 +02:00
Excalidraw Bot
239767be22 New translations en.json (Catalan) 2024-09-09 17:30:49 +02:00
Excalidraw Bot
7ce49d3566 New translations en.json (Bulgarian) 2024-09-09 17:30:48 +02:00
Excalidraw Bot
e228cca96b New translations en.json (Arabic) 2024-09-09 17:30:47 +02:00
Excalidraw Bot
92f2b0b0e1 New translations en.json (Spanish) 2024-09-09 17:30:45 +02:00
Excalidraw Bot
01d1639141 New translations en.json (French) 2024-09-09 17:30:44 +02:00
Excalidraw Bot
11272a101f New translations en.json (Romanian) 2024-09-09 17:30:43 +02:00
Excalidraw Bot
d2bdb7ab0b New translations en.json (Greek) 2024-09-09 17:30:42 +02:00
Excalidraw Bot
bc0d3b1a67 New translations en.json (Polish) 2024-09-09 17:30:41 +02:00
Excalidraw Bot
e2451d9c7f New translations en.json (German, Switzerland) 2024-09-09 17:30:40 +02:00
Excalidraw Bot
670887e3f3 New translations en.json (Persian) 2024-09-09 17:30:38 +02:00
Excalidraw Bot
345e3535b4 New translations en.json (Slovak) 2024-09-05 15:45:17 +02:00
Excalidraw Bot
5eeeba0333 New translations en.json (Hebrew) 2024-09-03 23:55:19 +02:00
Excalidraw Bot
df351f3b30 New translations en.json (Portuguese) 2024-09-03 19:33:06 +02:00
Excalidraw Bot
29d5da3e66 New translations en.json (French) 2024-09-03 11:35:20 +02:00
Excalidraw Bot
12d35d3da3 New translations en.json (Ukrainian) 2024-08-31 17:08:12 +02:00
Excalidraw Bot
a067dd0faa New translations en.json (Greek) 2024-08-31 13:53:33 +02:00
Excalidraw Bot
4758d28ac1 New translations en.json (Portuguese, Brazilian) 2024-08-31 07:10:40 +02:00
Excalidraw Bot
bfc9692ad1 New translations en.json (Italian) 2024-08-30 14:42:21 +02:00
Excalidraw Bot
a23fef8afe New translations en.json (Chinese Traditional) 2024-08-28 16:34:09 +02:00
Excalidraw Bot
2827117eb4 New translations en.json (Polish) 2024-08-27 22:22:10 +02:00
Excalidraw Bot
e11d71d9c1 New translations en.json (German) 2024-08-27 13:48:03 +02:00
Excalidraw Bot
0aacafc032 New translations en.json (Romanian) 2024-08-27 11:46:25 +02:00
Excalidraw Bot
573e947b31 New translations en.json (Russian) 2024-08-27 10:37:45 +02:00
Excalidraw Bot
128e5a0ef0 New translations en.json (Hindi) 2024-08-27 08:40:04 +02:00
Excalidraw Bot
114033dde4 New translations en.json (Marathi) 2024-08-27 08:40:03 +02:00
Excalidraw Bot
3cc0f2e452 New translations en.json (Slovenian) 2024-08-27 08:40:01 +02:00
Excalidraw Bot
28a08686a8 New translations en.json (Russian) 2024-08-27 08:40:00 +02:00
Excalidraw Bot
100e47307b New translations en.json (Chinese Simplified) 2024-08-27 06:53:14 +02:00
Excalidraw Bot
254e6f4d30 New translations en.json (Karakalpak) 2024-08-27 00:32:35 +02:00
Excalidraw Bot
d63d5a2602 New translations en.json (Kabyle) 2024-08-27 00:32:34 +02:00
Excalidraw Bot
729cdc0c2b New translations en.json (Bengali, India) 2024-08-27 00:32:33 +02:00
Excalidraw Bot
253ac4af2d New translations en.json (Occitan) 2024-08-27 00:32:32 +02:00
Excalidraw Bot
63863f2530 New translations en.json (Norwegian Bokmal) 2024-08-27 00:32:31 +02:00
Excalidraw Bot
3bd04e55ab New translations en.json (Uzbek) 2024-08-27 00:32:30 +02:00
Excalidraw Bot
8fd9b5c791 New translations en.json (Sinhala) 2024-08-27 00:32:29 +02:00
Excalidraw Bot
3c7671f160 New translations en.json (Chinese Traditional, Hong Kong) 2024-08-27 00:32:28 +02:00
Excalidraw Bot
16b50fad38 New translations en.json (Burmese) 2024-08-27 00:32:27 +02:00
Excalidraw Bot
a09bd51978 New translations en.json (Hindi) 2024-08-27 00:32:26 +02:00
Excalidraw Bot
829624199b New translations en.json (Azerbaijani) 2024-08-27 00:32:25 +02:00
Excalidraw Bot
3fa3460d1a New translations en.json (Latvian) 2024-08-27 00:32:24 +02:00
Excalidraw Bot
309c1252a6 New translations en.json (Kazakh) 2024-08-27 00:32:23 +02:00
Excalidraw Bot
444673a54e New translations en.json (Norwegian Nynorsk) 2024-08-27 00:32:22 +02:00
Excalidraw Bot
0f58f4dbeb New translations en.json (Thai) 2024-08-27 00:32:21 +02:00
Excalidraw Bot
bbb4d88c2a New translations en.json (Marathi) 2024-08-27 00:32:20 +02:00
Excalidraw Bot
ad0964116a New translations en.json (Bengali) 2024-08-27 00:32:19 +02:00
Excalidraw Bot
91a58912ce New translations en.json (Tamil) 2024-08-27 00:32:18 +02:00
Excalidraw Bot
2c8a913770 New translations en.json (Khmer) 2024-08-27 00:32:17 +02:00
Excalidraw Bot
c37b4ee3f7 New translations en.json (Indonesian) 2024-08-27 00:32:16 +02:00
Excalidraw Bot
85726121a8 New translations en.json (Portuguese, Brazilian) 2024-08-27 00:32:15 +02:00
Excalidraw Bot
1b65578c44 New translations en.json (Galician) 2024-08-27 00:32:14 +02:00
Excalidraw Bot
24fe9663f0 New translations en.json (Vietnamese) 2024-08-27 00:32:13 +02:00
Excalidraw Bot
a54bccf04e New translations en.json (Chinese Traditional) 2024-08-27 00:32:12 +02:00
Excalidraw Bot
50777b6b43 New translations en.json (Chinese Simplified) 2024-08-27 00:32:11 +02:00
Excalidraw Bot
fde9dfe20f New translations en.json (Ukrainian) 2024-08-27 00:32:10 +02:00
Excalidraw Bot
d2ddce8012 New translations en.json (Turkish) 2024-08-27 00:32:09 +02:00
Excalidraw Bot
09a3831733 New translations en.json (Swedish) 2024-08-27 00:32:07 +02:00
Excalidraw Bot
a036419535 New translations en.json (Slovenian) 2024-08-27 00:32:06 +02:00
Excalidraw Bot
e278d51713 New translations en.json (Slovak) 2024-08-27 00:32:05 +02:00
Excalidraw Bot
fcfafce65b New translations en.json (Russian) 2024-08-27 00:32:04 +02:00
Excalidraw Bot
886eb2c588 New translations en.json (Portuguese) 2024-08-27 00:32:03 +02:00
Excalidraw Bot
cfa71f5045 New translations en.json (Punjabi) 2024-08-27 00:32:02 +02:00
Excalidraw Bot
f5c100ed62 New translations en.json (Dutch) 2024-08-27 00:32:01 +02:00
Excalidraw Bot
bd6f81b088 New translations en.json (Lithuanian) 2024-08-27 00:32:00 +02:00
Excalidraw Bot
13f2105589 New translations en.json (Kurdish) 2024-08-27 00:31:59 +02:00
Excalidraw Bot
80e9e037ea New translations en.json (Korean) 2024-08-27 00:31:58 +02:00
Excalidraw Bot
98a6ea7e3a New translations en.json (Japanese) 2024-08-27 00:31:57 +02:00
Excalidraw Bot
83b72ace65 New translations en.json (Italian) 2024-08-27 00:31:56 +02:00
Excalidraw Bot
406fb15bd9 New translations en.json (Hungarian) 2024-08-27 00:31:55 +02:00
Excalidraw Bot
a50b9be1de New translations en.json (Hebrew) 2024-08-27 00:31:54 +02:00
Excalidraw Bot
71cc6a3bfd New translations en.json (Finnish) 2024-08-27 00:31:53 +02:00
Excalidraw Bot
ec99637bb2 New translations en.json (Basque) 2024-08-27 00:31:52 +02:00
Excalidraw Bot
5d4ee260b3 New translations en.json (German) 2024-08-27 00:31:51 +02:00
Excalidraw Bot
32e295ed8c New translations en.json (Danish) 2024-08-27 00:31:50 +02:00
Excalidraw Bot
c22843a7f1 New translations en.json (Czech) 2024-08-27 00:31:49 +02:00
Excalidraw Bot
be155a676f New translations en.json (Catalan) 2024-08-27 00:31:48 +02:00
Excalidraw Bot
7288582ef2 New translations en.json (Bulgarian) 2024-08-27 00:31:47 +02:00
Excalidraw Bot
e1376f3f74 New translations en.json (Arabic) 2024-08-27 00:31:46 +02:00
Excalidraw Bot
7f25d2f5b5 New translations en.json (Spanish) 2024-08-27 00:31:45 +02:00
Excalidraw Bot
e36f9f56d0 New translations en.json (French) 2024-08-27 00:31:44 +02:00
Excalidraw Bot
2cf88adca9 New translations en.json (Romanian) 2024-08-27 00:31:43 +02:00
Excalidraw Bot
07ad3271b4 New translations en.json (Greek) 2024-08-27 00:31:42 +02:00
Excalidraw Bot
6861334dad New translations en.json (Polish) 2024-08-27 00:31:41 +02:00
Excalidraw Bot
fbc27a7fd1 New translations en.json (German, Switzerland) 2024-08-27 00:31:40 +02:00
Excalidraw Bot
557aa9fa33 New translations en.json (Persian) 2024-08-27 00:31:39 +02:00
Excalidraw Bot
376c7590b5 New translations en.json (Catalan) 2024-08-21 08:56:29 +02:00
Excalidraw Bot
f258ab3a4e New translations en.json (Karakalpak) 2024-08-20 18:38:10 +02:00
Excalidraw Bot
c4f6ff7acc New translations en.json (Kabyle) 2024-08-20 18:38:09 +02:00
Excalidraw Bot
b0e7b86670 New translations en.json (Bengali, India) 2024-08-20 18:38:08 +02:00
Excalidraw Bot
723e1f7b78 New translations en.json (Occitan) 2024-08-20 18:38:07 +02:00
Excalidraw Bot
e6ac11c33d New translations en.json (Norwegian Bokmal) 2024-08-20 18:38:06 +02:00
Excalidraw Bot
fbc5f0460d New translations en.json (Uzbek) 2024-08-20 18:38:05 +02:00
Excalidraw Bot
4c81264c8c New translations en.json (Sinhala) 2024-08-20 18:38:04 +02:00
Excalidraw Bot
fd6750f4cf New translations en.json (Chinese Traditional, Hong Kong) 2024-08-20 18:38:02 +02:00
Excalidraw Bot
c5fed6cdf1 New translations en.json (Burmese) 2024-08-20 18:38:01 +02:00
Excalidraw Bot
4e9f6f3e0e New translations en.json (Hindi) 2024-08-20 18:38:00 +02:00
Excalidraw Bot
b9b37c2b33 New translations en.json (Azerbaijani) 2024-08-20 18:37:59 +02:00
Excalidraw Bot
679a293a18 New translations en.json (Latvian) 2024-08-20 18:37:58 +02:00
Excalidraw Bot
d51dca6c40 New translations en.json (Kazakh) 2024-08-20 18:37:57 +02:00
Excalidraw Bot
a0f0aaab05 New translations en.json (Norwegian Nynorsk) 2024-08-20 18:37:55 +02:00
Excalidraw Bot
5af4b4e7ce New translations en.json (Thai) 2024-08-20 18:37:54 +02:00
Excalidraw Bot
c688d4cbe4 New translations en.json (Marathi) 2024-08-20 18:37:53 +02:00
Excalidraw Bot
c98d4795fb New translations en.json (Bengali) 2024-08-20 18:37:52 +02:00
Excalidraw Bot
c3ceace600 New translations en.json (Tamil) 2024-08-20 18:37:51 +02:00
Excalidraw Bot
3dd2ef328c New translations en.json (Khmer) 2024-08-20 18:37:50 +02:00
Excalidraw Bot
1f75307d2f New translations en.json (Indonesian) 2024-08-20 18:37:48 +02:00
Excalidraw Bot
b1b1cacddf New translations en.json (Portuguese, Brazilian) 2024-08-20 18:37:47 +02:00
Excalidraw Bot
ed564b64ec New translations en.json (Galician) 2024-08-20 18:37:46 +02:00
Excalidraw Bot
6eb4c1e59f New translations en.json (Vietnamese) 2024-08-20 18:37:45 +02:00
Excalidraw Bot
4009c4d69c New translations en.json (Chinese Traditional) 2024-08-20 18:37:44 +02:00
Excalidraw Bot
c143334183 New translations en.json (Chinese Simplified) 2024-08-20 18:37:43 +02:00
Excalidraw Bot
bddacee80d New translations en.json (Ukrainian) 2024-08-20 18:37:42 +02:00
Excalidraw Bot
e6d5fa793d New translations en.json (Turkish) 2024-08-20 18:37:40 +02:00
Excalidraw Bot
ffc0752cba New translations en.json (Swedish) 2024-08-20 18:37:39 +02:00
Excalidraw Bot
a8de15517a New translations en.json (Slovenian) 2024-08-20 18:37:38 +02:00
Excalidraw Bot
a6fb388f5d New translations en.json (Slovak) 2024-08-20 18:37:37 +02:00
Excalidraw Bot
1a61e8f98a New translations en.json (Russian) 2024-08-20 18:37:35 +02:00
Excalidraw Bot
defbbc327c New translations en.json (Portuguese) 2024-08-20 18:37:34 +02:00
Excalidraw Bot
12f5d3c516 New translations en.json (Punjabi) 2024-08-20 18:37:33 +02:00
Excalidraw Bot
045f75161e New translations en.json (Dutch) 2024-08-20 18:37:32 +02:00
Excalidraw Bot
dfcbfaf155 New translations en.json (Lithuanian) 2024-08-20 18:37:31 +02:00
Excalidraw Bot
d233f3b60f New translations en.json (Kurdish) 2024-08-20 18:37:30 +02:00
Excalidraw Bot
b4e84e1cb9 New translations en.json (Korean) 2024-08-20 18:37:29 +02:00
Excalidraw Bot
630991b85a New translations en.json (Japanese) 2024-08-20 18:37:27 +02:00
Excalidraw Bot
2afbb7b0cd New translations en.json (Italian) 2024-08-20 18:37:26 +02:00
Excalidraw Bot
e95f4bd56a New translations en.json (Hungarian) 2024-08-20 18:37:25 +02:00
Excalidraw Bot
88b7830aa7 New translations en.json (Hebrew) 2024-08-20 18:37:24 +02:00
Excalidraw Bot
035d6b8b95 New translations en.json (Finnish) 2024-08-20 18:37:22 +02:00
Excalidraw Bot
d3f1d67e82 New translations en.json (Basque) 2024-08-20 18:37:21 +02:00
Excalidraw Bot
27b3e5ad99 New translations en.json (German) 2024-08-20 18:37:20 +02:00
Excalidraw Bot
7512deca3d New translations en.json (Danish) 2024-08-20 18:37:19 +02:00
Excalidraw Bot
66eaa610d1 New translations en.json (Czech) 2024-08-20 18:37:17 +02:00
Excalidraw Bot
6e4dcd4829 New translations en.json (Catalan) 2024-08-20 18:37:16 +02:00
Excalidraw Bot
d24c462d1c New translations en.json (Bulgarian) 2024-08-20 18:37:14 +02:00
Excalidraw Bot
070b693163 New translations en.json (Arabic) 2024-08-20 18:37:13 +02:00
Excalidraw Bot
12c697a67c New translations en.json (Spanish) 2024-08-20 18:37:11 +02:00
Excalidraw Bot
8e260bb8f0 New translations en.json (French) 2024-08-20 18:37:09 +02:00
Excalidraw Bot
62c096deb2 New translations en.json (Romanian) 2024-08-20 18:37:08 +02:00
Excalidraw Bot
afddbd88c6 New translations en.json (Greek) 2024-08-20 18:37:06 +02:00
Excalidraw Bot
e907c2cb98 New translations en.json (Polish) 2024-08-20 18:37:05 +02:00
Excalidraw Bot
4f1df9a3bf New translations en.json (German, Switzerland) 2024-08-20 18:37:03 +02:00
Excalidraw Bot
3ac658dd26 New translations en.json (Persian) 2024-08-20 18:37:01 +02:00
Excalidraw Bot
1c5581be0d New translations en.json (Portuguese) 2024-08-20 16:04:08 +02:00
Excalidraw Bot
6a0a34e0e7 New translations en.json (Vietnamese) 2024-08-18 16:30:42 +02:00
Excalidraw Bot
f560a7da67 New translations en.json (Greek) 2024-08-15 21:43:42 +02:00
Excalidraw Bot
2d4f69f83f New translations en.json (Chinese Simplified) 2024-08-13 07:18:53 +02:00
Excalidraw Bot
c124d99010 New translations en.json (Swedish) 2024-08-13 07:18:52 +02:00
Excalidraw Bot
59e5678151 New translations en.json (Polish) 2024-08-12 13:40:48 +02:00
Excalidraw Bot
a179dd38cf New translations en.json (Chinese Traditional) 2024-08-12 11:58:44 +02:00
Excalidraw Bot
e014ffb5b3 New translations en.json (Romanian) 2024-08-12 09:54:49 +02:00
Excalidraw Bot
21453a4858 New translations en.json (Slovenian) 2024-08-11 21:52:58 +02:00
Excalidraw Bot
58b78e0744 New translations en.json (German) 2024-08-11 21:52:57 +02:00
Excalidraw Bot
ba14b526ab New translations en.json (Polish) 2024-08-11 20:55:44 +02:00
Excalidraw Bot
3aacd5baba New translations en.json (Karakalpak) 2024-08-11 19:53:34 +02:00
Excalidraw Bot
4625f1f01a New translations en.json (Kabyle) 2024-08-11 19:53:33 +02:00
Excalidraw Bot
8395c84aa9 New translations en.json (Bengali, India) 2024-08-11 19:53:32 +02:00
Excalidraw Bot
ee6d0a2a2c New translations en.json (Occitan) 2024-08-11 19:53:31 +02:00
Excalidraw Bot
0d91a3ee98 New translations en.json (Norwegian Bokmal) 2024-08-11 19:53:30 +02:00
Excalidraw Bot
5036bac094 New translations en.json (Uzbek) 2024-08-11 19:53:29 +02:00
Excalidraw Bot
b82556aafd New translations en.json (Sinhala) 2024-08-11 19:53:27 +02:00
Excalidraw Bot
50d04b5802 New translations en.json (Chinese Traditional, Hong Kong) 2024-08-11 19:53:26 +02:00
Excalidraw Bot
fd917664e7 New translations en.json (Burmese) 2024-08-11 19:53:25 +02:00
Excalidraw Bot
b3da75f525 New translations en.json (Hindi) 2024-08-11 19:53:23 +02:00
Excalidraw Bot
93d61a66c1 New translations en.json (Azerbaijani) 2024-08-11 19:53:22 +02:00
Excalidraw Bot
bed4fb9556 New translations en.json (Latvian) 2024-08-11 19:53:21 +02:00
Excalidraw Bot
7567ea5b20 New translations en.json (Kazakh) 2024-08-11 19:53:20 +02:00
Excalidraw Bot
964c253fb8 New translations en.json (Norwegian Nynorsk) 2024-08-11 19:53:19 +02:00
Excalidraw Bot
dba1ac4ac6 New translations en.json (Thai) 2024-08-11 19:53:18 +02:00
Excalidraw Bot
f30f1e9eff New translations en.json (Marathi) 2024-08-11 19:53:17 +02:00
Excalidraw Bot
a74bbb0549 New translations en.json (Bengali) 2024-08-11 19:53:16 +02:00
Excalidraw Bot
b5cc1b4ee0 New translations en.json (Tamil) 2024-08-11 19:53:15 +02:00
Excalidraw Bot
3df2c55850 New translations en.json (Khmer) 2024-08-11 19:53:14 +02:00
Excalidraw Bot
0e0b3c62bb New translations en.json (Indonesian) 2024-08-11 19:53:13 +02:00
Excalidraw Bot
ef9b51b47c New translations en.json (Portuguese, Brazilian) 2024-08-11 19:53:12 +02:00
Excalidraw Bot
972db67e55 New translations en.json (Galician) 2024-08-11 19:53:10 +02:00
Excalidraw Bot
e61102d919 New translations en.json (Vietnamese) 2024-08-11 19:53:09 +02:00
Excalidraw Bot
460ea95712 New translations en.json (Chinese Traditional) 2024-08-11 19:53:08 +02:00
Excalidraw Bot
be199f7abb New translations en.json (Chinese Simplified) 2024-08-11 19:53:07 +02:00
Excalidraw Bot
710bffc99c New translations en.json (Ukrainian) 2024-08-11 19:53:06 +02:00
Excalidraw Bot
dec4acdf27 New translations en.json (Turkish) 2024-08-11 19:53:05 +02:00
Excalidraw Bot
dfd70691a9 New translations en.json (Swedish) 2024-08-11 19:53:04 +02:00
Excalidraw Bot
50f7c9d484 New translations en.json (Slovenian) 2024-08-11 19:53:03 +02:00
Excalidraw Bot
f755b09d0d New translations en.json (Slovak) 2024-08-11 19:53:02 +02:00
Excalidraw Bot
70db9f695d New translations en.json (Russian) 2024-08-11 19:53:01 +02:00
Excalidraw Bot
7523ef5869 New translations en.json (Portuguese) 2024-08-11 19:53:00 +02:00
Excalidraw Bot
b7bc8e43ff New translations en.json (Punjabi) 2024-08-11 19:52:59 +02:00
Excalidraw Bot
21c4bac6fc New translations en.json (Dutch) 2024-08-11 19:52:58 +02:00
Excalidraw Bot
e90f450bce New translations en.json (Lithuanian) 2024-08-11 19:52:57 +02:00
Excalidraw Bot
816d3b4b9f New translations en.json (Kurdish) 2024-08-11 19:52:56 +02:00
Excalidraw Bot
9c41187f82 New translations en.json (Korean) 2024-08-11 19:52:55 +02:00
Excalidraw Bot
24b3f87fb3 New translations en.json (Japanese) 2024-08-11 19:52:54 +02:00
Excalidraw Bot
acdae07f35 New translations en.json (Italian) 2024-08-11 19:52:53 +02:00
Excalidraw Bot
a8a67eee74 New translations en.json (Hungarian) 2024-08-11 19:52:52 +02:00
Excalidraw Bot
88fe797d83 New translations en.json (Hebrew) 2024-08-11 19:52:51 +02:00
Excalidraw Bot
d832cfdf71 New translations en.json (Finnish) 2024-08-11 19:52:50 +02:00
Excalidraw Bot
4af813173c New translations en.json (Basque) 2024-08-11 19:52:48 +02:00
Excalidraw Bot
ceeef17c00 New translations en.json (German) 2024-08-11 19:52:47 +02:00
Excalidraw Bot
90a609e7fb New translations en.json (Danish) 2024-08-11 19:52:46 +02:00
Excalidraw Bot
4091d1ef45 New translations en.json (Czech) 2024-08-11 19:52:45 +02:00
Excalidraw Bot
8bfbb60161 New translations en.json (Catalan) 2024-08-11 19:52:44 +02:00
Excalidraw Bot
cea8eb7c35 New translations en.json (Bulgarian) 2024-08-11 19:52:43 +02:00
Excalidraw Bot
339904c990 New translations en.json (Arabic) 2024-08-11 19:52:42 +02:00
Excalidraw Bot
05a087a83d New translations en.json (Spanish) 2024-08-11 19:52:41 +02:00
Excalidraw Bot
c82509b5d2 New translations en.json (French) 2024-08-11 19:52:41 +02:00
Excalidraw Bot
b8ba1918c9 New translations en.json (Romanian) 2024-08-11 19:52:40 +02:00
Excalidraw Bot
f12bf79694 New translations en.json (Greek) 2024-08-11 19:52:38 +02:00
Excalidraw Bot
0b276a371e New translations en.json (Polish) 2024-08-11 19:52:37 +02:00
Excalidraw Bot
0902c97806 New translations en.json (German, Switzerland) 2024-08-11 19:52:36 +02:00
Excalidraw Bot
32d460878d New translations en.json (Persian) 2024-08-11 19:52:35 +02:00
Excalidraw Bot
9a379fb81c New translations en.json (Slovak) 2024-08-11 09:14:17 +02:00
Excalidraw Bot
2f207b561a New translations en.json (Slovak) 2024-08-11 07:50:50 +02:00
Excalidraw Bot
14304f8402 New translations en.json (Romanian) 2024-08-10 18:30:16 +02:00
Excalidraw Bot
d9421730a4 New translations en.json (German) 2024-08-09 20:49:39 +02:00
Excalidraw Bot
fe71ee55c6 New translations en.json (Chinese Traditional) 2024-08-09 09:10:20 +02:00
Excalidraw Bot
8b9cfc82ea New translations en.json (Chinese Traditional) 2024-08-09 07:50:42 +02:00
Excalidraw Bot
2384ac65c3 New translations en.json (Karakalpak) 2024-08-08 23:39:51 +02:00
Excalidraw Bot
71d487762e New translations en.json (Kabyle) 2024-08-08 23:39:49 +02:00
Excalidraw Bot
089136d6e6 New translations en.json (Bengali, India) 2024-08-08 23:39:48 +02:00
Excalidraw Bot
f9955e079e New translations en.json (Occitan) 2024-08-08 23:39:47 +02:00
Excalidraw Bot
1471f87845 New translations en.json (Norwegian Bokmal) 2024-08-08 23:39:46 +02:00
Excalidraw Bot
9467d53088 New translations en.json (Uzbek) 2024-08-08 23:39:45 +02:00
Excalidraw Bot
20eec11057 New translations en.json (Sinhala) 2024-08-08 23:39:44 +02:00
Excalidraw Bot
49dd1c376f New translations en.json (Chinese Traditional, Hong Kong) 2024-08-08 23:39:43 +02:00
Excalidraw Bot
47b4cc67fc New translations en.json (Burmese) 2024-08-08 23:39:42 +02:00
Excalidraw Bot
b4707a1f9f New translations en.json (Hindi) 2024-08-08 23:39:41 +02:00
Excalidraw Bot
c79060a5a4 New translations en.json (Azerbaijani) 2024-08-08 23:39:40 +02:00
Excalidraw Bot
3881f18b01 New translations en.json (Latvian) 2024-08-08 23:39:38 +02:00
Excalidraw Bot
a0d5fbac19 New translations en.json (Kazakh) 2024-08-08 23:39:37 +02:00
Excalidraw Bot
56cb6e7b4f New translations en.json (Norwegian Nynorsk) 2024-08-08 23:39:36 +02:00
Excalidraw Bot
2cc02f02b1 New translations en.json (Thai) 2024-08-08 23:39:35 +02:00
Excalidraw Bot
8f790a65a6 New translations en.json (Marathi) 2024-08-08 23:39:34 +02:00
Excalidraw Bot
fcd7f8daf4 New translations en.json (Bengali) 2024-08-08 23:39:33 +02:00
Excalidraw Bot
6db4b713eb New translations en.json (Tamil) 2024-08-08 23:39:32 +02:00
Excalidraw Bot
f902a93ea1 New translations en.json (Khmer) 2024-08-08 23:39:31 +02:00
Excalidraw Bot
a5e07e633d New translations en.json (Indonesian) 2024-08-08 23:39:30 +02:00
Excalidraw Bot
484a10779b New translations en.json (Portuguese, Brazilian) 2024-08-08 23:39:29 +02:00
Excalidraw Bot
62a9a97323 New translations en.json (Galician) 2024-08-08 23:39:28 +02:00
Excalidraw Bot
37d581abb7 New translations en.json (Vietnamese) 2024-08-08 23:39:27 +02:00
Excalidraw Bot
036f973fa2 New translations en.json (Chinese Traditional) 2024-08-08 23:39:26 +02:00
Excalidraw Bot
f4eeb8038e New translations en.json (Chinese Simplified) 2024-08-08 23:39:24 +02:00
Excalidraw Bot
a29c8365d9 New translations en.json (Ukrainian) 2024-08-08 23:39:23 +02:00
Excalidraw Bot
5d420f54a7 New translations en.json (Turkish) 2024-08-08 23:39:22 +02:00
Excalidraw Bot
35f4ab615f New translations en.json (Swedish) 2024-08-08 23:39:21 +02:00
Excalidraw Bot
043eadf13c New translations en.json (Slovenian) 2024-08-08 23:39:20 +02:00
Excalidraw Bot
a24077c0be New translations en.json (Slovak) 2024-08-08 23:39:19 +02:00
Excalidraw Bot
f958c99a84 New translations en.json (Russian) 2024-08-08 23:39:18 +02:00
Excalidraw Bot
cca43eee02 New translations en.json (Portuguese) 2024-08-08 23:39:17 +02:00
Excalidraw Bot
0d6e9c9537 New translations en.json (Punjabi) 2024-08-08 23:39:16 +02:00
Excalidraw Bot
9c94ea1544 New translations en.json (Dutch) 2024-08-08 23:39:15 +02:00
Excalidraw Bot
fb6804fbd3 New translations en.json (Lithuanian) 2024-08-08 23:39:13 +02:00
Excalidraw Bot
68c6247272 New translations en.json (Kurdish) 2024-08-08 23:39:12 +02:00
Excalidraw Bot
18042a880d New translations en.json (Korean) 2024-08-08 23:39:11 +02:00
Excalidraw Bot
ac06d58d48 New translations en.json (Japanese) 2024-08-08 23:39:10 +02:00
Excalidraw Bot
05d462a07d New translations en.json (Italian) 2024-08-08 23:39:09 +02:00
Excalidraw Bot
ab26013d32 New translations en.json (Hungarian) 2024-08-08 23:39:08 +02:00
Excalidraw Bot
2dcb0ccc1a New translations en.json (Hebrew) 2024-08-08 23:39:07 +02:00
Excalidraw Bot
73f5f9ce9b New translations en.json (Finnish) 2024-08-08 23:39:06 +02:00
Excalidraw Bot
b4fcde00d1 New translations en.json (Basque) 2024-08-08 23:39:05 +02:00
Excalidraw Bot
9d1a01d56d New translations en.json (German) 2024-08-08 23:39:04 +02:00
Excalidraw Bot
f6375b77d5 New translations en.json (Danish) 2024-08-08 23:39:02 +02:00
Excalidraw Bot
ff1c9b3405 New translations en.json (Czech) 2024-08-08 23:39:01 +02:00
Excalidraw Bot
9465e45c97 New translations en.json (Catalan) 2024-08-08 23:39:00 +02:00
Excalidraw Bot
a573fe6b71 New translations en.json (Bulgarian) 2024-08-08 23:38:59 +02:00
Excalidraw Bot
98655e64d5 New translations en.json (Arabic) 2024-08-08 23:38:58 +02:00
Excalidraw Bot
d35214c11b New translations en.json (Spanish) 2024-08-08 23:38:57 +02:00
Excalidraw Bot
2f813d00ed New translations en.json (French) 2024-08-08 23:38:56 +02:00
Excalidraw Bot
580724793b New translations en.json (Romanian) 2024-08-08 23:38:55 +02:00
Excalidraw Bot
fcb9b36b96 New translations en.json (Greek) 2024-08-08 23:38:54 +02:00
Excalidraw Bot
18e37b3abf New translations en.json (Polish) 2024-08-08 23:38:53 +02:00
Excalidraw Bot
379977edbe New translations en.json (German, Switzerland) 2024-08-08 23:38:52 +02:00
Excalidraw Bot
bf061edb78 New translations en.json (Persian) 2024-08-08 23:38:51 +02:00
Excalidraw Bot
616f84bc22 New translations en.json (Romanian) 2024-08-05 08:20:26 +02:00
Excalidraw Bot
a16be8b5c5 New translations en.json (Chinese Traditional) 2024-08-04 18:10:36 +02:00
Excalidraw Bot
296e50678a New translations en.json (Chinese Traditional) 2024-08-04 16:52:27 +02:00
Excalidraw Bot
a6bfa82517 New translations en.json (Hindi) 2024-08-03 17:31:40 +02:00
Excalidraw Bot
050ba515d6 New translations en.json (Marathi) 2024-08-03 17:31:39 +02:00
Excalidraw Bot
d5f559803f New translations en.json (German) 2024-08-02 19:51:09 +02:00
Excalidraw Bot
d0e64458ad New translations en.json (Swedish) 2024-08-02 11:43:46 +02:00
Excalidraw Bot
7715aa6360 New translations en.json (Catalan) 2024-08-02 11:43:45 +02:00
Excalidraw Bot
12e196efee New translations en.json (Chinese Simplified) 2024-08-02 01:53:35 +02:00
Excalidraw Bot
bae2574225 New translations en.json (Russian) 2024-08-01 23:14:35 +02:00
Excalidraw Bot
3137d222ad New translations en.json (Greek) 2024-08-01 23:14:34 +02:00
Excalidraw Bot
4dd0273105 New translations en.json (Slovenian) 2024-08-01 21:17:21 +02:00
Excalidraw Bot
b52ed3425f New translations en.json (Karakalpak) 2024-08-01 20:17:19 +02:00
Excalidraw Bot
9ed6b2576d New translations en.json (Kabyle) 2024-08-01 20:17:18 +02:00
Excalidraw Bot
c5d0401fe1 New translations en.json (Bengali, India) 2024-08-01 20:17:17 +02:00
Excalidraw Bot
da352d54e3 New translations en.json (Occitan) 2024-08-01 20:17:16 +02:00
Excalidraw Bot
40acfd5a25 New translations en.json (Norwegian Bokmal) 2024-08-01 20:17:15 +02:00
Excalidraw Bot
469ab67b2b New translations en.json (Uzbek) 2024-08-01 20:17:13 +02:00
Excalidraw Bot
94c8ca8ced New translations en.json (Sinhala) 2024-08-01 20:17:12 +02:00
Excalidraw Bot
096d6cdb80 New translations en.json (Chinese Traditional, Hong Kong) 2024-08-01 20:17:11 +02:00
Excalidraw Bot
a35abe3398 New translations en.json (Burmese) 2024-08-01 20:17:10 +02:00
Excalidraw Bot
d987d60c14 New translations en.json (Hindi) 2024-08-01 20:17:09 +02:00
Excalidraw Bot
04c2778906 New translations en.json (Azerbaijani) 2024-08-01 20:17:07 +02:00
Excalidraw Bot
e823664f11 New translations en.json (Latvian) 2024-08-01 20:17:06 +02:00
Excalidraw Bot
e09532fd6d New translations en.json (Kazakh) 2024-08-01 20:17:05 +02:00
Excalidraw Bot
26126fd2a5 New translations en.json (Norwegian Nynorsk) 2024-08-01 20:17:04 +02:00
Excalidraw Bot
e8bdb88744 New translations en.json (Thai) 2024-08-01 20:17:02 +02:00
Excalidraw Bot
b91cebbe52 New translations en.json (Marathi) 2024-08-01 20:17:01 +02:00
Excalidraw Bot
90082d3c0d New translations en.json (Bengali) 2024-08-01 20:17:00 +02:00
Excalidraw Bot
de6f6e26c2 New translations en.json (Tamil) 2024-08-01 20:16:59 +02:00
Excalidraw Bot
8ae8cab963 New translations en.json (Khmer) 2024-08-01 20:16:57 +02:00
Excalidraw Bot
436fe171ca New translations en.json (Indonesian) 2024-08-01 20:16:56 +02:00
Excalidraw Bot
0f7f5e0f15 New translations en.json (Portuguese, Brazilian) 2024-08-01 20:16:55 +02:00
Excalidraw Bot
3da680ad39 New translations en.json (Galician) 2024-08-01 20:16:54 +02:00
Excalidraw Bot
91d688d60d New translations en.json (Vietnamese) 2024-08-01 20:16:52 +02:00
Excalidraw Bot
eea678f3c2 New translations en.json (Chinese Traditional) 2024-08-01 20:16:51 +02:00
Excalidraw Bot
87ddb85ce7 New translations en.json (German, Switzerland) 2024-08-01 20:16:50 +02:00
Excalidraw Bot
01619e0dba New translations en.json (Persian) 2024-08-01 20:16:49 +02:00
Excalidraw Bot
63289b016b New translations en.json (Chinese Simplified) 2024-08-01 20:16:48 +02:00
Excalidraw Bot
466bfc5808 New translations en.json (Ukrainian) 2024-08-01 20:16:46 +02:00
Excalidraw Bot
8509ad4ea8 New translations en.json (Turkish) 2024-08-01 20:16:45 +02:00
Excalidraw Bot
f607f3ff01 New translations en.json (Swedish) 2024-08-01 20:16:44 +02:00
Excalidraw Bot
ac4942e64a New translations en.json (Slovenian) 2024-08-01 20:16:43 +02:00
Excalidraw Bot
df32b9e73c New translations en.json (Slovak) 2024-08-01 20:16:42 +02:00
Excalidraw Bot
f924b05782 New translations en.json (Russian) 2024-08-01 20:16:40 +02:00
Excalidraw Bot
804e408f0b New translations en.json (Portuguese) 2024-08-01 20:16:39 +02:00
Excalidraw Bot
5cf811f565 New translations en.json (Punjabi) 2024-08-01 20:16:38 +02:00
Excalidraw Bot
b0e307af53 New translations en.json (Dutch) 2024-08-01 20:16:37 +02:00
Excalidraw Bot
2b64bea8b8 New translations en.json (Lithuanian) 2024-08-01 20:16:35 +02:00
Excalidraw Bot
b938a4eeca New translations en.json (Kurdish) 2024-08-01 20:16:34 +02:00
Excalidraw Bot
ce1babba5a New translations en.json (Korean) 2024-08-01 20:16:33 +02:00
Excalidraw Bot
bdedd55a41 New translations en.json (Japanese) 2024-08-01 20:16:32 +02:00
Excalidraw Bot
fefce6a17b New translations en.json (Italian) 2024-08-01 20:16:30 +02:00
Excalidraw Bot
a9f7c54c74 New translations en.json (Hungarian) 2024-08-01 20:16:29 +02:00
Excalidraw Bot
77bb5164ed New translations en.json (Hebrew) 2024-08-01 20:16:28 +02:00
Excalidraw Bot
aa50fcf3e5 New translations en.json (Finnish) 2024-08-01 20:16:26 +02:00
Excalidraw Bot
101616769f New translations en.json (Basque) 2024-08-01 20:16:25 +02:00
Excalidraw Bot
d86fc99a00 New translations en.json (German) 2024-08-01 20:16:24 +02:00
Excalidraw Bot
d2d1155b18 New translations en.json (Danish) 2024-08-01 20:16:23 +02:00
Excalidraw Bot
a96576d1b2 New translations en.json (Czech) 2024-08-01 20:16:22 +02:00
Excalidraw Bot
6d7f05414b New translations en.json (Catalan) 2024-08-01 20:16:21 +02:00
Excalidraw Bot
f23b6e9350 New translations en.json (Bulgarian) 2024-08-01 20:16:19 +02:00
Excalidraw Bot
391db4a941 New translations en.json (Arabic) 2024-08-01 20:16:18 +02:00
Excalidraw Bot
eccb403da1 New translations en.json (Spanish) 2024-08-01 20:16:17 +02:00
Excalidraw Bot
cd567c3d7e New translations en.json (French) 2024-08-01 20:16:16 +02:00
Excalidraw Bot
570d5c3f15 New translations en.json (Romanian) 2024-08-01 20:16:14 +02:00
Excalidraw Bot
f5a6dffa0b New translations en.json (Greek) 2024-08-01 20:16:13 +02:00
Excalidraw Bot
7507dad1de New translations en.json (Polish) 2024-08-01 20:16:12 +02:00
Excalidraw Bot
844b52eff6 New translations en.json (Russian) 2024-08-01 12:06:17 +02:00
Excalidraw Bot
1ce7dedf67 New translations en.json (Slovak) 2024-07-29 08:46:17 +02:00
Excalidraw Bot
47e3460a0b New translations en.json (Greek) 2024-07-27 23:56:49 +02:00
Excalidraw Bot
d8fbc3236e New translations en.json (French) 2024-07-27 22:55:43 +02:00
Excalidraw Bot
fb78fee714 New translations en.json (Greek) 2024-07-27 22:55:42 +02:00
Excalidraw Bot
27b7338fb8 New translations en.json (Greek) 2024-07-27 21:59:59 +02:00
Excalidraw Bot
439319d77b New translations en.json (Ukrainian) 2024-07-27 10:34:54 +02:00
Excalidraw Bot
49baa6e291 New translations en.json (Ukrainian) 2024-07-27 09:31:27 +02:00
Excalidraw Bot
04eac5ed57 New translations en.json (Chinese Traditional) 2024-07-26 13:44:07 +02:00
Excalidraw Bot
3635c88325 New translations en.json (Catalan) 2024-07-26 11:22:23 +02:00
Excalidraw Bot
8b4fdd368a New translations en.json (Romanian) 2024-07-26 08:23:59 +02:00
Excalidraw Bot
70303a9662 New translations en.json (Russian) 2024-07-25 22:12:04 +02:00
Excalidraw Bot
a6b5ee5f91 New translations en.json (German) 2024-07-25 22:12:03 +02:00
Excalidraw Bot
fad2dc5f57 New translations en.json (Slovenian) 2024-07-25 20:32:19 +02:00
Excalidraw Bot
ffb90b6adb New translations en.json (Karakalpak) 2024-07-25 19:06:18 +02:00
Excalidraw Bot
0c63d297bb New translations en.json (Kabyle) 2024-07-25 19:06:17 +02:00
Excalidraw Bot
0066c94a74 New translations en.json (Bengali, India) 2024-07-25 19:06:16 +02:00
Excalidraw Bot
6c995f172c New translations en.json (Occitan) 2024-07-25 19:06:15 +02:00
Excalidraw Bot
0fd575172f New translations en.json (Norwegian Bokmal) 2024-07-25 19:06:14 +02:00
Excalidraw Bot
f84766f497 New translations en.json (Uzbek) 2024-07-25 19:06:13 +02:00
Excalidraw Bot
2795a33335 New translations en.json (Sinhala) 2024-07-25 19:06:12 +02:00
Excalidraw Bot
dc07d39761 New translations en.json (Chinese Traditional, Hong Kong) 2024-07-25 19:06:10 +02:00
Excalidraw Bot
074ece4fa4 New translations en.json (Burmese) 2024-07-25 19:06:09 +02:00
Excalidraw Bot
affa10abe8 New translations en.json (Hindi) 2024-07-25 19:06:08 +02:00
Excalidraw Bot
68712692fb New translations en.json (Azerbaijani) 2024-07-25 19:06:07 +02:00
Excalidraw Bot
4764f661a3 New translations en.json (Latvian) 2024-07-25 19:06:06 +02:00
Excalidraw Bot
e79d4e8ce6 New translations en.json (Kazakh) 2024-07-25 19:06:05 +02:00
Excalidraw Bot
19ecdea035 New translations en.json (Norwegian Nynorsk) 2024-07-25 19:06:04 +02:00
Excalidraw Bot
0519f6de47 New translations en.json (Thai) 2024-07-25 19:06:02 +02:00
Excalidraw Bot
7407ae0f31 New translations en.json (Marathi) 2024-07-25 19:06:01 +02:00
Excalidraw Bot
887de107ef New translations en.json (Bengali) 2024-07-25 19:06:00 +02:00
Excalidraw Bot
1c471944d1 New translations en.json (Tamil) 2024-07-25 19:05:59 +02:00
Excalidraw Bot
69ee56a228 New translations en.json (Khmer) 2024-07-25 19:05:58 +02:00
Excalidraw Bot
5371082087 New translations en.json (Indonesian) 2024-07-25 19:05:57 +02:00
Excalidraw Bot
2709ccdb56 New translations en.json (Portuguese, Brazilian) 2024-07-25 19:05:56 +02:00
Excalidraw Bot
02361a92dc New translations en.json (Galician) 2024-07-25 19:05:54 +02:00
Excalidraw Bot
175c931ddc New translations en.json (Vietnamese) 2024-07-25 19:05:53 +02:00
Excalidraw Bot
350ba84864 New translations en.json (Chinese Traditional) 2024-07-25 19:05:52 +02:00
Excalidraw Bot
9cca06ac84 New translations en.json (Chinese Simplified) 2024-07-25 19:05:51 +02:00
Excalidraw Bot
5eb4a3a448 New translations en.json (Ukrainian) 2024-07-25 19:05:50 +02:00
Excalidraw Bot
e2a9974791 New translations en.json (Turkish) 2024-07-25 19:05:49 +02:00
Excalidraw Bot
40322d37b6 New translations en.json (Swedish) 2024-07-25 19:05:48 +02:00
Excalidraw Bot
e42426655d New translations en.json (Slovenian) 2024-07-25 19:05:47 +02:00
Excalidraw Bot
d6b0990e2d New translations en.json (Slovak) 2024-07-25 19:05:46 +02:00
Excalidraw Bot
54c1909b9e New translations en.json (Russian) 2024-07-25 19:05:45 +02:00
Excalidraw Bot
7c8daea65b New translations en.json (Portuguese) 2024-07-25 19:05:43 +02:00
Excalidraw Bot
9b6ba7ada6 New translations en.json (Punjabi) 2024-07-25 19:05:42 +02:00
Excalidraw Bot
df389c37a4 New translations en.json (Dutch) 2024-07-25 19:05:41 +02:00
Excalidraw Bot
b616db2ab5 New translations en.json (Lithuanian) 2024-07-25 19:05:40 +02:00
Excalidraw Bot
c43d16f435 New translations en.json (Kurdish) 2024-07-25 19:05:39 +02:00
Excalidraw Bot
9d9c65dcbd New translations en.json (Korean) 2024-07-25 19:05:38 +02:00
Excalidraw Bot
3b01f2cfd4 New translations en.json (Japanese) 2024-07-25 19:05:37 +02:00
Excalidraw Bot
e29d4cbbdc New translations en.json (Italian) 2024-07-25 19:05:36 +02:00
Excalidraw Bot
de73b0df95 New translations en.json (Hungarian) 2024-07-25 19:05:34 +02:00
Excalidraw Bot
bdca46fb3f New translations en.json (Hebrew) 2024-07-25 19:05:33 +02:00
Excalidraw Bot
89e7e0507f New translations en.json (Finnish) 2024-07-25 19:05:32 +02:00
Excalidraw Bot
1092769eaf New translations en.json (Basque) 2024-07-25 19:05:31 +02:00
Excalidraw Bot
76c95fadd9 New translations en.json (German) 2024-07-25 19:05:30 +02:00
Excalidraw Bot
40a945c5c6 New translations en.json (Danish) 2024-07-25 19:05:29 +02:00
Excalidraw Bot
fc029f1581 New translations en.json (Czech) 2024-07-25 19:05:28 +02:00
Excalidraw Bot
160e8c6f08 New translations en.json (Catalan) 2024-07-25 19:05:27 +02:00
Excalidraw Bot
52ac6020dc New translations en.json (Bulgarian) 2024-07-25 19:05:26 +02:00
Excalidraw Bot
966404b2fb New translations en.json (Arabic) 2024-07-25 19:05:25 +02:00
Excalidraw Bot
d151c8be9c New translations en.json (Spanish) 2024-07-25 19:05:24 +02:00
Excalidraw Bot
bf2852b46b New translations en.json (French) 2024-07-25 19:05:23 +02:00
Excalidraw Bot
8d9710795b New translations en.json (Romanian) 2024-07-25 19:05:22 +02:00
Excalidraw Bot
a706856b2a New translations en.json (Greek) 2024-07-25 19:05:21 +02:00
Excalidraw Bot
5362326d91 New translations en.json (Polish) 2024-07-25 19:05:20 +02:00
Excalidraw Bot
a450687669 New translations en.json (German, Switzerland) 2024-07-25 19:05:18 +02:00
Excalidraw Bot
ca31245625 New translations en.json (Persian) 2024-07-25 19:05:17 +02:00
Excalidraw Bot
ea14136124 New translations en.json (Greek) 2024-07-22 22:45:54 +02:00
Excalidraw Bot
69f0b70f65 New translations en.json (Greek) 2024-07-22 21:35:33 +02:00
Excalidraw Bot
6998bef4a5 New translations en.json (Polish) 2024-07-21 22:15:48 +02:00
Excalidraw Bot
ffbeee5e5e New translations en.json (Polish) 2024-07-21 21:09:52 +02:00
Excalidraw Bot
55a203a413 New translations en.json (German, Switzerland) 2024-07-12 10:20:12 +02:00
Excalidraw Bot
d6e91d4cdb New translations en.json (Persian) 2024-07-12 10:20:11 +02:00
Excalidraw Bot
b70bc98b4b New translations en.json (Slovak) 2024-07-06 13:31:55 +02:00
Excalidraw Bot
aaf30dc34e New translations en.json (Slovak) 2024-07-06 11:51:10 +02:00
Excalidraw Bot
d44e0071f0 New translations en.json (Bulgarian) 2024-07-05 12:26:22 +02:00
Excalidraw Bot
790f1a65dc New translations en.json (Bulgarian) 2024-07-05 10:24:50 +02:00
Excalidraw Bot
f7e809c756 New translations en.json (Turkish) 2024-06-29 05:14:14 +02:00
Excalidraw Bot
4ee7585115 New translations en.json (Turkish) 2024-06-29 04:12:41 +02:00
Excalidraw Bot
5a7dd4da43 New translations en.json (Hindi) 2024-06-24 08:46:30 +02:00
Excalidraw Bot
176030fe23 New translations en.json (Marathi) 2024-06-24 08:46:28 +02:00
Excalidraw Bot
ecd17e23b8 New translations en.json (Azerbaijani) 2024-06-18 09:10:44 +02:00
Excalidraw Bot
26df1db785 New translations en.json (Italian) 2024-06-18 09:10:43 +02:00
Excalidraw Bot
5666a0d027 New translations en.json (Azerbaijani) 2024-06-18 07:50:05 +02:00
Excalidraw Bot
43956387b6 Auto commit: Calculate translation coverage 2024-06-17 08:17:41 +00:00
Excalidraw Bot
a6c594a4fa New translations en.json (Hindi) 2024-06-17 10:17:25 +02:00
Excalidraw Bot
733c5881b0 New translations en.json (Marathi) 2024-06-17 10:17:24 +02:00
Excalidraw Bot
6017f5b5a3 Auto commit: Calculate translation coverage 2024-06-17 06:34:30 +00:00
Excalidraw Bot
db4c6f8901 New translations en.json (Marathi) 2024-06-17 08:34:15 +02:00
Excalidraw Bot
73d17e6c08 Auto commit: Calculate translation coverage 2024-06-15 20:24:58 +00:00
Excalidraw Bot
8bc520f05f New translations en.json (French) 2024-06-15 22:24:47 +02:00
Excalidraw Bot
8794935ecb Auto commit: Calculate translation coverage 2024-06-15 18:39:29 +00:00
Excalidraw Bot
9ec989fbef New translations en.json (French) 2024-06-15 20:39:15 +02:00
Excalidraw Bot
470fd2e90c Auto commit: Calculate translation coverage 2024-06-15 14:54:20 +00:00
Excalidraw Bot
67d9217c2c New translations en.json (Occitan) 2024-06-15 16:54:06 +02:00
Excalidraw Bot
fc5f238985 Auto commit: Calculate translation coverage 2024-06-14 19:33:56 +00:00
Excalidraw Bot
9442c0c9ed New translations en.json (Portuguese) 2024-06-14 21:33:43 +02:00
Excalidraw Bot
5afbf5a459 Auto commit: Calculate translation coverage 2024-06-13 20:16:52 +00:00
Excalidraw Bot
a8408a5344 New translations en.json (Chinese Traditional) 2024-06-13 22:16:40 +02:00
Excalidraw Bot
ecf5f2a472 Auto commit: Calculate translation coverage 2024-06-13 08:42:20 +00:00
Excalidraw Bot
66a635eea3 New translations en.json (Romanian) 2024-06-13 10:42:07 +02:00
Excalidraw Bot
316c8b85f8 Auto commit: Calculate translation coverage 2024-06-13 07:34:44 +00:00
Excalidraw Bot
7bfb114ca4 New translations en.json (Swedish) 2024-06-13 09:34:32 +02:00
Excalidraw Bot
8eddf43b93 New translations en.json (Slovenian) 2024-06-13 09:34:30 +02:00
Excalidraw Bot
e83a7b7f93 New translations en.json (Russian) 2024-06-13 09:34:29 +02:00
Excalidraw Bot
c370a5bfeb Auto commit: Calculate translation coverage 2024-06-13 05:11:57 +00:00
Excalidraw Bot
0a0edfa77d New translations en.json (Slovenian) 2024-06-13 07:11:44 +02:00
Excalidraw Bot
e49845e097 Auto commit: Calculate translation coverage 2024-06-13 00:39:11 +00:00
Excalidraw Bot
0cef729b9d New translations en.json (Chinese Simplified) 2024-06-13 02:38:57 +02:00
Excalidraw Bot
59f9d60230 Auto commit: Calculate translation coverage 2024-06-12 23:32:44 +00:00
Excalidraw Bot
8c93c24be5 New translations en.json (Spanish) 2024-06-13 01:32:32 +02:00
Excalidraw Bot
c31f1031ba Auto commit: Calculate translation coverage 2024-06-12 21:05:10 +00:00
Excalidraw Bot
033d32f2e9 New translations en.json (Occitan) 2024-06-12 23:04:31 +02:00
Excalidraw Bot
c9723ca98c Auto commit: Calculate translation coverage 2024-06-12 18:50:51 +00:00
Excalidraw Bot
018372206d New translations en.json (Karakalpak) 2024-06-12 20:49:18 +02:00
Excalidraw Bot
f55a873706 New translations en.json (Kabyle) 2024-06-12 20:49:17 +02:00
Excalidraw Bot
666ad7a867 New translations en.json (Bengali, India) 2024-06-12 20:49:16 +02:00
Excalidraw Bot
a032634c31 New translations en.json (Occitan) 2024-06-12 20:49:15 +02:00
Excalidraw Bot
a5c07896c0 New translations en.json (Norwegian Bokmal) 2024-06-12 20:49:13 +02:00
Excalidraw Bot
c169aebe71 New translations en.json (Uzbek) 2024-06-12 20:49:12 +02:00
Excalidraw Bot
24420ca3b0 New translations en.json (Sinhala) 2024-06-12 20:49:11 +02:00
Excalidraw Bot
9ac67ea8df New translations en.json (Chinese Traditional, Hong Kong) 2024-06-12 20:49:10 +02:00
Excalidraw Bot
23d2c69a7c New translations en.json (Burmese) 2024-06-12 20:49:09 +02:00
Excalidraw Bot
06adcc87d2 New translations en.json (Hindi) 2024-06-12 20:49:08 +02:00
Excalidraw Bot
8a0bf98c41 New translations en.json (Azerbaijani) 2024-06-12 20:49:06 +02:00
Excalidraw Bot
e50436e88c New translations en.json (Latvian) 2024-06-12 20:49:05 +02:00
Excalidraw Bot
dc1b99c4fd New translations en.json (Kazakh) 2024-06-12 20:49:04 +02:00
Excalidraw Bot
468c30792a New translations en.json (Norwegian Nynorsk) 2024-06-12 20:49:03 +02:00
Excalidraw Bot
a9d9457f58 New translations en.json (Thai) 2024-06-12 20:49:02 +02:00
Excalidraw Bot
fcc9f611db New translations en.json (Marathi) 2024-06-12 20:49:00 +02:00
Excalidraw Bot
ecdf65e937 New translations en.json (Bengali) 2024-06-12 20:48:59 +02:00
Excalidraw Bot
643c3da142 New translations en.json (Tamil) 2024-06-12 20:48:58 +02:00
Excalidraw Bot
0e7c995af6 New translations en.json (Khmer) 2024-06-12 20:48:57 +02:00
Excalidraw Bot
f1738bda97 New translations en.json (Persian) 2024-06-12 20:48:55 +02:00
Excalidraw Bot
ede64dc114 New translations en.json (Indonesian) 2024-06-12 20:48:54 +02:00
Excalidraw Bot
42938ac5c5 New translations en.json (Portuguese, Brazilian) 2024-06-12 20:48:53 +02:00
Excalidraw Bot
d7125c969f New translations en.json (Galician) 2024-06-12 20:48:52 +02:00
Excalidraw Bot
37535456c3 New translations en.json (Vietnamese) 2024-06-12 20:48:51 +02:00
Excalidraw Bot
afd2efafe4 New translations en.json (Chinese Traditional) 2024-06-12 20:48:50 +02:00
Excalidraw Bot
67e2a97bfb New translations en.json (Chinese Simplified) 2024-06-12 20:48:49 +02:00
Excalidraw Bot
8d4f5174b2 New translations en.json (Ukrainian) 2024-06-12 20:48:47 +02:00
Excalidraw Bot
271466015b New translations en.json (Turkish) 2024-06-12 20:48:46 +02:00
Excalidraw Bot
6b52e63c57 New translations en.json (Swedish) 2024-06-12 20:48:45 +02:00
Excalidraw Bot
dc5f07105f New translations en.json (Slovenian) 2024-06-12 20:48:44 +02:00
Excalidraw Bot
24ea232cdc New translations en.json (Russian) 2024-06-12 20:48:43 +02:00
Excalidraw Bot
49cac6ed74 New translations en.json (Portuguese) 2024-06-12 20:48:41 +02:00
Excalidraw Bot
680b26f069 New translations en.json (Polish) 2024-06-12 20:48:40 +02:00
Excalidraw Bot
cdc2920522 New translations en.json (Punjabi) 2024-06-12 20:48:39 +02:00
Excalidraw Bot
b52ff062f8 New translations en.json (Dutch) 2024-06-12 20:48:38 +02:00
Excalidraw Bot
1aed1d64f5 New translations en.json (Lithuanian) 2024-06-12 20:48:37 +02:00
Excalidraw Bot
971e09ccc2 New translations en.json (Kurdish) 2024-06-12 20:48:35 +02:00
Excalidraw Bot
aed3f16d61 New translations en.json (Korean) 2024-06-12 20:48:34 +02:00
Excalidraw Bot
56a6563bb3 New translations en.json (Japanese) 2024-06-12 20:48:33 +02:00
Excalidraw Bot
18366513e4 New translations en.json (Italian) 2024-06-12 20:48:32 +02:00
Excalidraw Bot
b7c5435de0 New translations en.json (Hungarian) 2024-06-12 20:48:31 +02:00
Excalidraw Bot
778f2fd540 New translations en.json (Hebrew) 2024-06-12 20:48:29 +02:00
Excalidraw Bot
4649bbd853 New translations en.json (Finnish) 2024-06-12 20:48:28 +02:00
Excalidraw Bot
572c1e3bba New translations en.json (Greek) 2024-06-12 20:48:27 +02:00
Excalidraw Bot
772b232f70 New translations en.json (German) 2024-06-12 20:48:26 +02:00
Excalidraw Bot
86ca8872f5 New translations en.json (Danish) 2024-06-12 20:48:24 +02:00
Excalidraw Bot
2e001220c0 New translations en.json (Czech) 2024-06-12 20:48:23 +02:00
Excalidraw Bot
edf1a62d92 New translations en.json (Catalan) 2024-06-12 20:48:22 +02:00
Excalidraw Bot
605d18b9c5 New translations en.json (Bulgarian) 2024-06-12 20:48:21 +02:00
Excalidraw Bot
834b254a4a New translations en.json (Arabic) 2024-06-12 20:48:20 +02:00
Excalidraw Bot
2513479221 New translations en.json (Spanish) 2024-06-12 20:48:19 +02:00
Excalidraw Bot
41bdf1634d New translations en.json (French) 2024-06-12 20:48:18 +02:00
Excalidraw Bot
4ff5f9ece3 New translations en.json (Romanian) 2024-06-12 20:48:17 +02:00
Excalidraw Bot
6d730443c8 New translations en.json (Basque) 2024-06-12 20:48:16 +02:00
Excalidraw Bot
f7d52c580e New translations en.json (Slovak) 2024-06-12 20:48:14 +02:00
Excalidraw Bot
f0bc165b62 Auto commit: Calculate translation coverage 2024-06-07 11:23:03 +00:00
Excalidraw Bot
d6950a5f88 New translations en.json (Basque) 2024-06-07 13:22:49 +02:00
Excalidraw Bot
07c5d52267 Auto commit: Calculate translation coverage 2024-05-31 16:03:00 +00:00
Excalidraw Bot
bac18cb22f New translations en.json (Slovak) 2024-05-31 18:02:47 +02:00
Excalidraw Bot
f7873520c5 Auto commit: Calculate translation coverage 2024-05-22 10:30:48 +00:00
Excalidraw Bot
1acac43403 New translations en.json (Portuguese) 2024-05-22 12:30:36 +02:00
Excalidraw Bot
3b6a48e955 Auto commit: Calculate translation coverage 2024-05-16 13:26:35 +00:00
Excalidraw Bot
ef51ebb020 New translations en.json (Polish) 2024-05-16 15:26:21 +02:00
Excalidraw Bot
05864777df Auto commit: Calculate translation coverage 2024-05-16 07:13:51 +00:00
Excalidraw Bot
c8b2916c4f New translations en.json (Romanian) 2024-05-16 09:13:38 +02:00
Excalidraw Bot
3f05e42578 Auto commit: Calculate translation coverage 2024-05-16 05:31:07 +00:00
Excalidraw Bot
26e046a102 New translations en.json (Swedish) 2024-05-16 07:30:54 +02:00
Excalidraw Bot
3fc76b9927 New translations en.json (Chinese Traditional) 2024-05-16 04:26:34 +02:00
Excalidraw Bot
85c71304ab Auto commit: Calculate translation coverage 2024-05-15 23:33:43 +00:00
Excalidraw Bot
f6ddf56967 New translations en.json (Chinese Simplified) 2024-05-16 01:33:28 +02:00
Excalidraw Bot
9a59a18033 Auto commit: Calculate translation coverage 2024-05-15 18:07:51 +00:00
Excalidraw Bot
f55dc10b1e New translations en.json (German) 2024-05-15 20:07:39 +02:00
Excalidraw Bot
7128c6ed6c Auto commit: Calculate translation coverage 2024-05-15 17:06:58 +00:00
Excalidraw Bot
b80290f1c0 New translations en.json (Slovenian) 2024-05-15 19:06:46 +02:00
Excalidraw Bot
8fb81d2140 Auto commit: Calculate translation coverage 2024-05-15 13:14:17 +00:00
Excalidraw Bot
7a2b187b5f New translations en.json (Karakalpak) 2024-05-15 15:10:41 +02:00
Excalidraw Bot
f1728c7889 New translations en.json (Kabyle) 2024-05-15 15:10:40 +02:00
Excalidraw Bot
97d6c921a1 New translations en.json (Bengali, India) 2024-05-15 15:10:39 +02:00
Excalidraw Bot
e13b82ebe1 New translations en.json (Occitan) 2024-05-15 15:10:37 +02:00
Excalidraw Bot
a72c4959b2 New translations en.json (Norwegian Bokmal) 2024-05-15 15:10:36 +02:00
Excalidraw Bot
739d947ea3 New translations en.json (Uzbek) 2024-05-15 15:10:35 +02:00
Excalidraw Bot
20e8af7298 New translations en.json (Sinhala) 2024-05-15 15:10:34 +02:00
Excalidraw Bot
6064aeea72 New translations en.json (Chinese Traditional, Hong Kong) 2024-05-15 15:10:33 +02:00
Excalidraw Bot
122f8540a0 New translations en.json (Burmese) 2024-05-15 15:10:31 +02:00
Excalidraw Bot
6f0c6ac307 New translations en.json (Hindi) 2024-05-15 15:10:30 +02:00
Excalidraw Bot
bf26f39c8e New translations en.json (Azerbaijani) 2024-05-15 15:10:29 +02:00
Excalidraw Bot
2d71df249f New translations en.json (Latvian) 2024-05-15 15:10:28 +02:00
Excalidraw Bot
2f96c7705e New translations en.json (Kazakh) 2024-05-15 15:10:27 +02:00
Excalidraw Bot
1ea422d4b0 New translations en.json (Norwegian Nynorsk) 2024-05-15 15:10:25 +02:00
Excalidraw Bot
fb519f5210 New translations en.json (Thai) 2024-05-15 15:10:24 +02:00
Excalidraw Bot
5488f8f053 New translations en.json (Marathi) 2024-05-15 15:10:23 +02:00
Excalidraw Bot
3e8297b923 New translations en.json (Bengali) 2024-05-15 15:10:22 +02:00
Excalidraw Bot
324ff7e6f9 New translations en.json (Tamil) 2024-05-15 15:10:21 +02:00
Excalidraw Bot
d5ec2c5036 New translations en.json (Khmer) 2024-05-15 15:10:19 +02:00
Excalidraw Bot
2267d52345 New translations en.json (Persian) 2024-05-15 15:10:18 +02:00
Excalidraw Bot
3adb3c3943 New translations en.json (Indonesian) 2024-05-15 15:10:17 +02:00
Excalidraw Bot
33c7fb9cc3 New translations en.json (Portuguese, Brazilian) 2024-05-15 15:10:16 +02:00
Excalidraw Bot
595d2ca370 New translations en.json (Galician) 2024-05-15 15:10:14 +02:00
Excalidraw Bot
5f588bb474 New translations en.json (Vietnamese) 2024-05-15 15:10:13 +02:00
Excalidraw Bot
96a190538d New translations en.json (Chinese Traditional) 2024-05-15 15:10:12 +02:00
Excalidraw Bot
2237e6be7b New translations en.json (Chinese Simplified) 2024-05-15 15:10:11 +02:00
Excalidraw Bot
6405585cf6 New translations en.json (Ukrainian) 2024-05-15 15:10:10 +02:00
Excalidraw Bot
3116bc4298 New translations en.json (Turkish) 2024-05-15 15:10:09 +02:00
Excalidraw Bot
8b7572d70e New translations en.json (Swedish) 2024-05-15 15:10:08 +02:00
Excalidraw Bot
d6b0cce4c9 New translations en.json (Slovenian) 2024-05-15 15:10:06 +02:00
Excalidraw Bot
f881130398 New translations en.json (Slovak) 2024-05-15 15:10:05 +02:00
Excalidraw Bot
266c4626be New translations en.json (Russian) 2024-05-15 15:10:03 +02:00
Excalidraw Bot
38290a4887 New translations en.json (Portuguese) 2024-05-15 15:10:02 +02:00
Excalidraw Bot
40b10faa7b New translations en.json (Polish) 2024-05-15 15:10:00 +02:00
Excalidraw Bot
a17a122951 New translations en.json (Punjabi) 2024-05-15 15:09:59 +02:00
Excalidraw Bot
0285684c9e New translations en.json (Dutch) 2024-05-15 15:09:58 +02:00
Excalidraw Bot
20c664d9aa New translations en.json (Lithuanian) 2024-05-15 15:09:57 +02:00
Excalidraw Bot
861e9fae97 New translations en.json (Kurdish) 2024-05-15 15:09:56 +02:00
Excalidraw Bot
d86b27e4cd New translations en.json (Korean) 2024-05-15 15:09:55 +02:00
Excalidraw Bot
75f127506e New translations en.json (Japanese) 2024-05-15 15:09:54 +02:00
Excalidraw Bot
4616455ce6 New translations en.json (Italian) 2024-05-15 15:09:53 +02:00
Excalidraw Bot
255e639ea5 New translations en.json (Hungarian) 2024-05-15 15:09:51 +02:00
Excalidraw Bot
1cb1325ee6 New translations en.json (Finnish) 2024-05-15 15:09:50 +02:00
Excalidraw Bot
ebe229c8ed New translations en.json (Basque) 2024-05-15 15:09:49 +02:00
Excalidraw Bot
63f972a889 New translations en.json (Greek) 2024-05-15 15:09:48 +02:00
Excalidraw Bot
e8e03145a3 New translations en.json (German) 2024-05-15 15:09:47 +02:00
Excalidraw Bot
d2db5fb4ed New translations en.json (Danish) 2024-05-15 15:09:46 +02:00
Excalidraw Bot
b9627e639e New translations en.json (Czech) 2024-05-15 15:09:45 +02:00
Excalidraw Bot
9f9678337e New translations en.json (Catalan) 2024-05-15 15:09:44 +02:00
Excalidraw Bot
ba5dc117a4 New translations en.json (Bulgarian) 2024-05-15 15:09:43 +02:00
Excalidraw Bot
a587e9ab58 New translations en.json (Arabic) 2024-05-15 15:09:42 +02:00
Excalidraw Bot
f93f3732f3 New translations en.json (Spanish) 2024-05-15 15:09:40 +02:00
Excalidraw Bot
128bc579ce New translations en.json (French) 2024-05-15 15:09:39 +02:00
Excalidraw Bot
0dd000ce7e New translations en.json (Romanian) 2024-05-15 15:09:38 +02:00
Excalidraw Bot
926d9e6884 New translations en.json (Hebrew) 2024-05-15 15:09:37 +02:00
Excalidraw Bot
04c46eb668 Auto commit: Calculate translation coverage 2024-05-13 06:43:28 +00:00
Excalidraw Bot
7e09d00d62 New translations en.json (Swedish) 2024-05-13 08:43:12 +02:00
Excalidraw Bot
7ef2a08dff Auto commit: Calculate translation coverage 2024-05-10 14:59:37 +00:00
Excalidraw Bot
ca6d0bb98a New translations en.json (Spanish) 2024-05-10 16:59:25 +02:00
Excalidraw Bot
b70393f947 Auto commit: Calculate translation coverage 2024-05-10 10:46:37 +00:00
Excalidraw Bot
df78472681 New translations en.json (French) 2024-05-10 12:46:26 +02:00
Excalidraw Bot
22d201d2c3 New translations en.json (Romanian) 2024-05-10 12:46:25 +02:00
Excalidraw Bot
3263596166 Auto commit: Calculate translation coverage 2024-05-10 09:07:24 +00:00
Excalidraw Bot
43302acd47 New translations en.json (French) 2024-05-10 11:07:14 +02:00
Excalidraw Bot
c92fb897b0 Auto commit: Calculate translation coverage 2024-05-09 21:37:35 +00:00
Excalidraw Bot
969cdb6fa5 New translations en.json (Portuguese) 2024-05-09 23:37:22 +02:00
Excalidraw Bot
b7c273dad3 New translations en.json (Italian) 2024-05-09 19:35:41 +02:00
Excalidraw Bot
6c392443fc New translations en.json (Chinese Traditional) 2024-05-09 16:06:43 +02:00
Excalidraw Bot
71800f2bdf Auto commit: Calculate translation coverage 2024-05-09 09:15:50 +00:00
Excalidraw Bot
81718fb708 New translations en.json (Chinese Simplified) 2024-05-09 11:15:37 +02:00
Excalidraw Bot
6420601d00 New translations en.json (Russian) 2024-05-09 11:15:36 +02:00
Excalidraw Bot
1ba7399adc New translations en.json (Polish) 2024-05-09 11:15:35 +02:00
Excalidraw Bot
2eacd8be18 New translations en.json (German) 2024-05-09 11:15:34 +02:00
Excalidraw Bot
f9055ae50e Auto commit: Calculate translation coverage 2024-05-09 07:35:38 +00:00
Excalidraw Bot
26718821c0 New translations en.json (Polish) 2024-05-09 09:35:22 +02:00
Excalidraw Bot
0339872a2c Auto commit: Calculate translation coverage 2024-05-09 06:31:00 +00:00
Excalidraw Bot
86758895fa New translations en.json (Slovenian) 2024-05-09 08:30:42 +02:00
Excalidraw Bot
6390aef437 Auto commit: Calculate translation coverage 2024-05-08 20:51:00 +00:00
Excalidraw Bot
f782ee3f0e New translations en.json (Karakalpak) 2024-05-08 22:46:17 +02:00
Excalidraw Bot
971b46bb0d New translations en.json (Kabyle) 2024-05-08 22:46:16 +02:00
Excalidraw Bot
cdda24b859 New translations en.json (Bengali, India) 2024-05-08 22:46:15 +02:00
Excalidraw Bot
bdcbdad7ed New translations en.json (Occitan) 2024-05-08 22:46:14 +02:00
Excalidraw Bot
ae955d24fa New translations en.json (Norwegian Bokmal) 2024-05-08 22:46:13 +02:00
Excalidraw Bot
1787fd8612 New translations en.json (Uzbek) 2024-05-08 22:46:12 +02:00
Excalidraw Bot
ea8e86e4a9 New translations en.json (Sinhala) 2024-05-08 22:46:11 +02:00
Excalidraw Bot
2965f7ba26 New translations en.json (Chinese Traditional, Hong Kong) 2024-05-08 22:46:10 +02:00
Excalidraw Bot
f5e156d0d3 New translations en.json (Burmese) 2024-05-08 22:46:09 +02:00
Excalidraw Bot
e14bb1fa3d New translations en.json (Hindi) 2024-05-08 22:46:07 +02:00
Excalidraw Bot
3d8b49f913 New translations en.json (Azerbaijani) 2024-05-08 22:46:06 +02:00
Excalidraw Bot
3e58bebc04 New translations en.json (Latvian) 2024-05-08 22:46:05 +02:00
Excalidraw Bot
69b7e9c80d New translations en.json (Kazakh) 2024-05-08 22:46:04 +02:00
Excalidraw Bot
812d27cc7f New translations en.json (Norwegian Nynorsk) 2024-05-08 22:46:03 +02:00
Excalidraw Bot
7d383e8c00 New translations en.json (Thai) 2024-05-08 22:46:02 +02:00
Excalidraw Bot
036c8c0f59 New translations en.json (Marathi) 2024-05-08 22:46:01 +02:00
Excalidraw Bot
c08d7a771c New translations en.json (Bengali) 2024-05-08 22:46:00 +02:00
Excalidraw Bot
3bcced5d69 New translations en.json (Tamil) 2024-05-08 22:45:59 +02:00
Excalidraw Bot
9d5c90b5af New translations en.json (Khmer) 2024-05-08 22:45:58 +02:00
Excalidraw Bot
404f9328b7 New translations en.json (Persian) 2024-05-08 22:45:57 +02:00
Excalidraw Bot
35b16fcd6d New translations en.json (Indonesian) 2024-05-08 22:45:56 +02:00
Excalidraw Bot
0d83490292 New translations en.json (Portuguese, Brazilian) 2024-05-08 22:45:55 +02:00
Excalidraw Bot
3c1c3bbdd7 New translations en.json (Galician) 2024-05-08 22:45:54 +02:00
Excalidraw Bot
cc6e945a04 New translations en.json (Vietnamese) 2024-05-08 22:45:53 +02:00
Excalidraw Bot
db6ddf6b7c New translations en.json (Chinese Traditional) 2024-05-08 22:45:52 +02:00
Excalidraw Bot
faca670156 New translations en.json (Chinese Simplified) 2024-05-08 22:45:51 +02:00
Excalidraw Bot
07f39be1ff New translations en.json (Ukrainian) 2024-05-08 22:45:50 +02:00
Excalidraw Bot
5e18fe4c7f New translations en.json (Turkish) 2024-05-08 22:45:49 +02:00
Excalidraw Bot
a8312ec874 New translations en.json (Swedish) 2024-05-08 22:45:48 +02:00
Excalidraw Bot
cef937c880 New translations en.json (Slovenian) 2024-05-08 22:45:46 +02:00
Excalidraw Bot
a8e903a3e9 New translations en.json (Slovak) 2024-05-08 22:45:45 +02:00
Excalidraw Bot
c57c830316 New translations en.json (Russian) 2024-05-08 22:45:44 +02:00
Excalidraw Bot
5b56bfe960 New translations en.json (Portuguese) 2024-05-08 22:45:43 +02:00
Excalidraw Bot
7e3eff3b23 New translations en.json (Polish) 2024-05-08 22:45:42 +02:00
Excalidraw Bot
43f42ee9f0 New translations en.json (Punjabi) 2024-05-08 22:45:41 +02:00
Excalidraw Bot
2674fae183 New translations en.json (Dutch) 2024-05-08 22:45:40 +02:00
Excalidraw Bot
17606e6180 New translations en.json (Lithuanian) 2024-05-08 22:45:39 +02:00
Excalidraw Bot
e5592d566e New translations en.json (Kurdish) 2024-05-08 22:45:38 +02:00
Excalidraw Bot
61768c9d81 New translations en.json (Korean) 2024-05-08 22:45:37 +02:00
Excalidraw Bot
65f4537bd0 New translations en.json (Japanese) 2024-05-08 22:45:36 +02:00
Excalidraw Bot
acd4eda04b New translations en.json (Italian) 2024-05-08 22:45:35 +02:00
Excalidraw Bot
b51369ad97 New translations en.json (Hungarian) 2024-05-08 22:45:34 +02:00
Excalidraw Bot
5b9ec81880 New translations en.json (Finnish) 2024-05-08 22:45:33 +02:00
Excalidraw Bot
91b71c8c45 New translations en.json (Basque) 2024-05-08 22:45:32 +02:00
Excalidraw Bot
cab7c52280 New translations en.json (Greek) 2024-05-08 22:45:31 +02:00
Excalidraw Bot
b1f1ae9570 New translations en.json (German) 2024-05-08 22:45:30 +02:00
Excalidraw Bot
79dec7adc7 New translations en.json (Danish) 2024-05-08 22:45:29 +02:00
Excalidraw Bot
6662cc6828 New translations en.json (Czech) 2024-05-08 22:45:28 +02:00
Excalidraw Bot
8511e6d42c New translations en.json (Catalan) 2024-05-08 22:45:27 +02:00
Excalidraw Bot
aa0c056b2f New translations en.json (Bulgarian) 2024-05-08 22:45:26 +02:00
Excalidraw Bot
bacfe9d327 New translations en.json (Arabic) 2024-05-08 22:45:25 +02:00
Excalidraw Bot
193b40ff12 New translations en.json (Spanish) 2024-05-08 22:45:24 +02:00
Excalidraw Bot
020b88c77a New translations en.json (French) 2024-05-08 22:45:23 +02:00
Excalidraw Bot
77726e6606 New translations en.json (Romanian) 2024-05-08 22:45:22 +02:00
Excalidraw Bot
1f055c0bda New translations en.json (Hebrew) 2024-05-08 22:45:21 +02:00
Excalidraw Bot
0189a75ff3 Auto commit: Calculate translation coverage 2024-05-08 19:33:58 +00:00
Excalidraw Bot
60d55753e9 New translations en.json (Portuguese) 2024-05-08 21:33:46 +02:00
Excalidraw Bot
c962575aec Auto commit: Calculate translation coverage 2024-05-08 10:49:45 +00:00
Excalidraw Bot
50da3e0873 New translations en.json (Romanian) 2024-05-08 12:49:33 +02:00
Excalidraw Bot
8b7a5511b7 Auto commit: Calculate translation coverage 2024-05-08 05:01:04 +00:00
Excalidraw Bot
572185898c New translations en.json (Tamil) 2024-05-08 07:00:51 +02:00
Excalidraw Bot
f6ea289a0e New translations en.json (Chinese Traditional) 2024-05-08 05:50:02 +02:00
Excalidraw Bot
dc9b065689 Auto commit: Calculate translation coverage 2024-05-07 19:33:43 +00:00
Excalidraw Bot
a448dc81c4 New translations en.json (German) 2024-05-07 21:33:32 +02:00
Excalidraw Bot
d82dae0776 Auto commit: Calculate translation coverage 2024-05-07 18:35:50 +00:00
Excalidraw Bot
0447ac624d New translations en.json (Tamil) 2024-05-07 20:35:37 +02:00
Excalidraw Bot
b9c040d9ac New translations en.json (Chinese Simplified) 2024-05-07 20:35:36 +02:00
Excalidraw Bot
fc926448ac New translations en.json (Spanish) 2024-05-07 19:40:01 +02:00
Excalidraw Bot
70d85530c7 Auto commit: Calculate translation coverage 2024-05-07 13:49:47 +00:00
Excalidraw Bot
96b515e2fe New translations en.json (Slovenian) 2024-05-07 15:49:36 +02:00
Excalidraw Bot
bced18876d New translations en.json (Russian) 2024-05-07 15:49:35 +02:00
Excalidraw Bot
1be9d67d8a Auto commit: Calculate translation coverage 2024-05-07 12:32:31 +00:00
Excalidraw Bot
bd21a2b57f New translations en.json (Karakalpak) 2024-05-07 14:30:33 +02:00
Excalidraw Bot
8cd33a127c New translations en.json (Kabyle) 2024-05-07 14:30:32 +02:00
Excalidraw Bot
19f15becfe New translations en.json (Bengali, India) 2024-05-07 14:30:30 +02:00
Excalidraw Bot
4f0e0407f1 New translations en.json (Occitan) 2024-05-07 14:30:29 +02:00
Excalidraw Bot
dc1f76988a New translations en.json (Norwegian Bokmal) 2024-05-07 14:30:28 +02:00
Excalidraw Bot
8289f3e0ed New translations en.json (Uzbek) 2024-05-07 14:30:27 +02:00
Excalidraw Bot
a5f517c0d4 New translations en.json (Sinhala) 2024-05-07 14:30:26 +02:00
Excalidraw Bot
3c2cd278f7 New translations en.json (Chinese Traditional, Hong Kong) 2024-05-07 14:30:24 +02:00
Excalidraw Bot
c77e248aee New translations en.json (Burmese) 2024-05-07 14:30:23 +02:00
Excalidraw Bot
2948341728 New translations en.json (Hindi) 2024-05-07 14:30:22 +02:00
Excalidraw Bot
9eaf570ae7 New translations en.json (Azerbaijani) 2024-05-07 14:30:20 +02:00
Excalidraw Bot
5d3637d157 New translations en.json (Latvian) 2024-05-07 14:30:19 +02:00
Excalidraw Bot
955af18a01 New translations en.json (Kazakh) 2024-05-07 14:30:18 +02:00
Excalidraw Bot
77d8fd5493 New translations en.json (Norwegian Nynorsk) 2024-05-07 14:30:17 +02:00
Excalidraw Bot
40e6f4a7f2 New translations en.json (Thai) 2024-05-07 14:30:16 +02:00
Excalidraw Bot
640d838e28 New translations en.json (Marathi) 2024-05-07 14:30:15 +02:00
Excalidraw Bot
aa02c7610e New translations en.json (Bengali) 2024-05-07 14:30:13 +02:00
Excalidraw Bot
d1179f5ada New translations en.json (Tamil) 2024-05-07 14:30:12 +02:00
Excalidraw Bot
6df2d19fbf New translations en.json (Khmer) 2024-05-07 14:30:11 +02:00
Excalidraw Bot
52ba265c71 New translations en.json (Persian) 2024-05-07 14:30:10 +02:00
Excalidraw Bot
00d9e244c2 New translations en.json (Indonesian) 2024-05-07 14:30:08 +02:00
Excalidraw Bot
ee0c58f797 New translations en.json (Portuguese, Brazilian) 2024-05-07 14:30:07 +02:00
Excalidraw Bot
2fd1d1c371 New translations en.json (Galician) 2024-05-07 14:30:06 +02:00
Excalidraw Bot
7a51bc7f5d New translations en.json (Vietnamese) 2024-05-07 14:30:05 +02:00
Excalidraw Bot
28b61d73c8 New translations en.json (Chinese Traditional) 2024-05-07 14:30:03 +02:00
Excalidraw Bot
f8af81fb65 New translations en.json (Chinese Simplified) 2024-05-07 14:30:02 +02:00
Excalidraw Bot
d474fdd404 New translations en.json (Ukrainian) 2024-05-07 14:30:00 +02:00
Excalidraw Bot
1afd2d4030 New translations en.json (Turkish) 2024-05-07 14:29:59 +02:00
Excalidraw Bot
94bc8dd018 New translations en.json (Swedish) 2024-05-07 14:29:58 +02:00
Excalidraw Bot
f3e85108a8 New translations en.json (Slovenian) 2024-05-07 14:29:57 +02:00
Excalidraw Bot
149a7fc32b New translations en.json (Slovak) 2024-05-07 14:29:56 +02:00
Excalidraw Bot
7094c4c9b6 New translations en.json (Russian) 2024-05-07 14:29:55 +02:00
Excalidraw Bot
e7fb9494cb New translations en.json (Portuguese) 2024-05-07 14:29:53 +02:00
Excalidraw Bot
b335a96722 New translations en.json (Polish) 2024-05-07 14:29:52 +02:00
Excalidraw Bot
18f539c709 New translations en.json (Punjabi) 2024-05-07 14:29:51 +02:00
Excalidraw Bot
2bd173501c New translations en.json (Dutch) 2024-05-07 14:29:50 +02:00
Excalidraw Bot
27c47513e8 New translations en.json (Lithuanian) 2024-05-07 14:29:49 +02:00
Excalidraw Bot
bafd3d669b New translations en.json (Kurdish) 2024-05-07 14:29:48 +02:00
Excalidraw Bot
d9a3ec2680 New translations en.json (Korean) 2024-05-07 14:29:47 +02:00
Excalidraw Bot
b28f7b9b81 New translations en.json (Japanese) 2024-05-07 14:29:45 +02:00
Excalidraw Bot
f35b909ba9 New translations en.json (Italian) 2024-05-07 14:29:44 +02:00
Excalidraw Bot
dbe71af81a New translations en.json (Hungarian) 2024-05-07 14:29:43 +02:00
Excalidraw Bot
8a94fd0baf New translations en.json (Finnish) 2024-05-07 14:29:42 +02:00
Excalidraw Bot
b9a4bcb4fc New translations en.json (Basque) 2024-05-07 14:29:41 +02:00
Excalidraw Bot
11f6dd674c New translations en.json (Greek) 2024-05-07 14:29:40 +02:00
Excalidraw Bot
edfdf8ad21 New translations en.json (German) 2024-05-07 14:29:39 +02:00
Excalidraw Bot
40a4928f6e New translations en.json (Danish) 2024-05-07 14:29:38 +02:00
Excalidraw Bot
b35257ab5b New translations en.json (Czech) 2024-05-07 14:29:36 +02:00
Excalidraw Bot
4b9f2a722d New translations en.json (Catalan) 2024-05-07 14:29:35 +02:00
Excalidraw Bot
7c88a7c48b New translations en.json (Bulgarian) 2024-05-07 14:29:34 +02:00
Excalidraw Bot
a8adca5d98 New translations en.json (Arabic) 2024-05-07 14:29:33 +02:00
Excalidraw Bot
ee88a62da8 New translations en.json (Spanish) 2024-05-07 14:29:32 +02:00
Excalidraw Bot
acb23a5a7a New translations en.json (French) 2024-05-07 14:29:30 +02:00
Excalidraw Bot
1b63aa136b New translations en.json (Romanian) 2024-05-07 14:29:29 +02:00
Excalidraw Bot
cea3bb9764 New translations en.json (Hebrew) 2024-05-07 14:29:28 +02:00
Excalidraw Bot
1840949a81 Auto commit: Calculate translation coverage 2024-04-23 20:54:02 +00:00
Excalidraw Bot
b6678560ec New translations en.json (Hebrew) 2024-04-23 22:53:48 +02:00
Excalidraw Bot
01c144de36 Auto commit: Calculate translation coverage 2024-04-23 19:31:24 +00:00
Excalidraw Bot
5f387aeed1 New translations en.json (Hebrew) 2024-04-23 21:31:12 +02:00
Excalidraw Bot
1faad458f6 Auto commit: Calculate translation coverage 2024-04-22 15:39:31 +00:00
Excalidraw Bot
3357340772 New translations en.json (Bengali, India) 2024-04-22 17:39:12 +02:00
Excalidraw Bot
053606e460 New translations en.json (Bengali) 2024-04-22 17:39:11 +02:00
Excalidraw Bot
280bbc3e58 Auto commit: Calculate translation coverage 2024-04-22 14:43:54 +00:00
Excalidraw Bot
6adf3eb827 New translations en.json (Bengali) 2024-04-22 16:43:40 +02:00
Excalidraw Bot
2259ea6e80 Auto commit: Calculate translation coverage 2024-04-17 15:16:08 +00:00
Excalidraw Bot
51eec9d02c New translations en.json (Finnish) 2024-04-17 17:15:54 +02:00
Excalidraw Bot
6dcfe61f2e Auto commit: Calculate translation coverage 2024-04-16 11:45:30 +00:00
Excalidraw Bot
066bcddc82 New translations en.json (Portuguese) 2024-04-16 13:45:15 +02:00
Excalidraw Bot
67866e70cf Auto commit: Calculate translation coverage 2024-04-15 13:28:35 +00:00
Excalidraw Bot
3509c2e812 New translations en.json (Arabic) 2024-04-15 15:28:23 +02:00
Excalidraw Bot
4f0ea27632 Auto commit: Calculate translation coverage 2024-04-15 12:14:28 +00:00
Excalidraw Bot
5eb7b5a63e New translations en.json (Arabic) 2024-04-15 14:14:10 +02:00
Excalidraw Bot
865576946c Auto commit: Calculate translation coverage 2024-04-15 10:53:28 +00:00
Excalidraw Bot
5a376e0015 New translations en.json (Romanian) 2024-04-15 12:53:17 +02:00
Excalidraw Bot
d34d43d730 Auto commit: Calculate translation coverage 2024-04-15 05:38:15 +00:00
Excalidraw Bot
f7b4d9d424 New translations en.json (Swedish) 2024-04-15 07:38:04 +02:00
Excalidraw Bot
10b7e96c00 Auto commit: Calculate translation coverage 2024-04-13 21:41:12 +00:00
Excalidraw Bot
a5c09041e9 New translations en.json (Chinese Simplified) 2024-04-13 23:40:59 +02:00
Excalidraw Bot
c46e268ad0 Auto commit: Calculate translation coverage 2024-04-13 20:27:01 +00:00
Excalidraw Bot
5b6ce786a1 New translations en.json (Chinese Traditional) 2024-04-13 22:26:47 +02:00
Excalidraw Bot
70a2ccb51a New translations en.json (German) 2024-04-13 22:26:46 +02:00
Excalidraw Bot
a89a072cb4 Auto commit: Calculate translation coverage 2024-04-13 17:59:17 +00:00
Excalidraw Bot
65c040c075 New translations en.json (Karakalpak) 2024-04-13 19:55:18 +02:00
Excalidraw Bot
39b9e1e7a0 New translations en.json (Kabyle) 2024-04-13 19:55:17 +02:00
Excalidraw Bot
cb3050294b New translations en.json (Occitan) 2024-04-13 19:55:16 +02:00
Excalidraw Bot
455eeb63b4 New translations en.json (Norwegian Bokmal) 2024-04-13 19:55:15 +02:00
Excalidraw Bot
be4eb1e37e New translations en.json (Uzbek) 2024-04-13 19:55:14 +02:00
Excalidraw Bot
f3ff017e6f New translations en.json (Sinhala) 2024-04-13 19:55:13 +02:00
Excalidraw Bot
56c18f44c7 New translations en.json (Chinese Traditional, Hong Kong) 2024-04-13 19:55:12 +02:00
Excalidraw Bot
da2695ac35 New translations en.json (Burmese) 2024-04-13 19:55:11 +02:00
Excalidraw Bot
5614f1c62f New translations en.json (Azerbaijani) 2024-04-13 19:55:09 +02:00
Excalidraw Bot
b7d9e49039 New translations en.json (Latvian) 2024-04-13 19:55:08 +02:00
Excalidraw Bot
4da5b9e7b6 New translations en.json (Kazakh) 2024-04-13 19:55:07 +02:00
Excalidraw Bot
81958d4a3d New translations en.json (Norwegian Nynorsk) 2024-04-13 19:55:06 +02:00
Excalidraw Bot
12a7eb4885 New translations en.json (Thai) 2024-04-13 19:55:05 +02:00
Excalidraw Bot
dffc310969 New translations en.json (Marathi) 2024-04-13 19:55:05 +02:00
Excalidraw Bot
80ad916f4f New translations en.json (Bengali) 2024-04-13 19:55:04 +02:00
Excalidraw Bot
d216420f30 New translations en.json (Tamil) 2024-04-13 19:55:03 +02:00
Excalidraw Bot
4cf68fa98f New translations en.json (Khmer) 2024-04-13 19:55:02 +02:00
Excalidraw Bot
2996eb0bb5 New translations en.json (Persian) 2024-04-13 19:55:01 +02:00
Excalidraw Bot
422e6ad51e New translations en.json (Indonesian) 2024-04-13 19:55:00 +02:00
Excalidraw Bot
922675bf53 New translations en.json (Portuguese, Brazilian) 2024-04-13 19:54:59 +02:00
Excalidraw Bot
d92f555e93 New translations en.json (Galician) 2024-04-13 19:54:58 +02:00
Excalidraw Bot
48433bc9eb New translations en.json (Vietnamese) 2024-04-13 19:54:57 +02:00
Excalidraw Bot
db3f73c643 New translations en.json (Chinese Traditional) 2024-04-13 19:54:57 +02:00
Excalidraw Bot
ad0f8155a7 New translations en.json (Ukrainian) 2024-04-13 19:54:56 +02:00
Excalidraw Bot
060eee3afd New translations en.json (Turkish) 2024-04-13 19:54:55 +02:00
Excalidraw Bot
407ef4699d New translations en.json (Slovenian) 2024-04-13 19:54:54 +02:00
Excalidraw Bot
1ffb358d59 New translations en.json (Russian) 2024-04-13 19:54:53 +02:00
Excalidraw Bot
d9c4e12642 New translations en.json (Portuguese) 2024-04-13 19:54:52 +02:00
Excalidraw Bot
310f561488 New translations en.json (Polish) 2024-04-13 19:54:51 +02:00
Excalidraw Bot
dcd3636c96 New translations en.json (Punjabi) 2024-04-13 19:54:50 +02:00
Excalidraw Bot
a5442f8b7a New translations en.json (Dutch) 2024-04-13 19:54:50 +02:00
Excalidraw Bot
1dc32d9e0a New translations en.json (Lithuanian) 2024-04-13 19:54:49 +02:00
Excalidraw Bot
a767150e87 New translations en.json (Kurdish) 2024-04-13 19:54:48 +02:00
Excalidraw Bot
9691492f38 New translations en.json (Korean) 2024-04-13 19:54:47 +02:00
Excalidraw Bot
2f52f28631 New translations en.json (Japanese) 2024-04-13 19:54:46 +02:00
Excalidraw Bot
e0bef262a7 New translations en.json (Hungarian) 2024-04-13 19:54:45 +02:00
Excalidraw Bot
4cffdf216d New translations en.json (Hebrew) 2024-04-13 19:54:44 +02:00
Excalidraw Bot
2628d6807c New translations en.json (Finnish) 2024-04-13 19:54:43 +02:00
Excalidraw Bot
3e1012b080 New translations en.json (Basque) 2024-04-13 19:54:43 +02:00
Excalidraw Bot
6e575f2f8b New translations en.json (Greek) 2024-04-13 19:54:42 +02:00
Excalidraw Bot
ec7fa95672 New translations en.json (German) 2024-04-13 19:54:41 +02:00
Excalidraw Bot
753f492c86 New translations en.json (Danish) 2024-04-13 19:54:40 +02:00
Excalidraw Bot
8b04af03a1 New translations en.json (Czech) 2024-04-13 19:54:39 +02:00
Excalidraw Bot
8830f1138d New translations en.json (Catalan) 2024-04-13 19:54:38 +02:00
Excalidraw Bot
4567a16d65 New translations en.json (Bulgarian) 2024-04-13 19:54:37 +02:00
Excalidraw Bot
19eaf8240a New translations en.json (Arabic) 2024-04-13 19:54:36 +02:00
Excalidraw Bot
4a519f47b5 New translations en.json (Spanish) 2024-04-13 19:54:35 +02:00
Excalidraw Bot
edebbffe33 New translations en.json (French) 2024-04-13 19:54:34 +02:00
Excalidraw Bot
156285417b New translations en.json (Romanian) 2024-04-13 19:54:33 +02:00
Excalidraw Bot
cefc312e85 New translations en.json (Hindi) 2024-04-13 19:54:32 +02:00
Excalidraw Bot
c63d5da9e1 New translations en.json (Chinese Simplified) 2024-04-13 19:54:31 +02:00
Excalidraw Bot
a934d975e7 New translations en.json (Swedish) 2024-04-13 19:54:30 +02:00
Excalidraw Bot
f391e7b11a New translations en.json (Slovak) 2024-04-13 19:54:29 +02:00
Excalidraw Bot
7f93f19314 New translations en.json (Italian) 2024-04-13 19:54:29 +02:00
dwelle
cb1454f8db Merge branch 'master' into l10n_master 2024-04-13 18:52:39 +02:00
Excalidraw Bot
df4660c0c1 Auto commit: Calculate translation coverage 2024-04-13 12:29:26 +00:00
Excalidraw Bot
8751b38988 New translations en.json (Slovak) 2024-04-13 14:29:12 +02:00
Excalidraw Bot
287836fc6b Auto commit: Calculate translation coverage 2024-04-09 08:38:48 +00:00
Excalidraw Bot
4635477f37 New translations en.json (Swedish) 2024-04-09 10:38:34 +02:00
Excalidraw Bot
89f77ea24a Auto commit: Calculate translation coverage 2024-04-09 04:32:41 +00:00
Excalidraw Bot
3dc38ab06e New translations en.json (Chinese Simplified) 2024-04-09 06:32:30 +02:00
Excalidraw Bot
66a2dcdedc Auto commit: Calculate translation coverage 2024-04-09 03:32:30 +00:00
Excalidraw Bot
fddea948f0 New translations en.json (Marathi) 2024-04-09 05:32:14 +02:00
Excalidraw Bot
229ab44918 New translations en.json (Hindi) 2024-04-09 05:32:13 +02:00
Excalidraw Bot
a6a958de55 New translations en.json (Chinese Traditional) 2024-04-08 21:16:08 +02:00
Excalidraw Bot
c3969dcf12 Auto commit: Calculate translation coverage 2024-04-08 18:06:08 +00:00
Excalidraw Bot
d906fe2531 New translations en.json (German) 2024-04-08 20:05:52 +02:00
Excalidraw Bot
3eaa573951 Auto commit: Calculate translation coverage 2024-04-08 16:49:55 +00:00
Excalidraw Bot
50f98d193d New translations en.json (Slovenian) 2024-04-08 18:49:21 +02:00
Excalidraw Bot
7104d7bf17 New translations en.json (Romanian) 2024-04-08 18:49:20 +02:00
Excalidraw Bot
9403ef8656 Auto commit: Calculate translation coverage 2024-04-08 14:55:38 +00:00
Excalidraw Bot
092263b6b1 New translations en.json (Karakalpak) 2024-04-08 16:51:11 +02:00
Excalidraw Bot
6adb44ead4 New translations en.json (Kabyle) 2024-04-08 16:51:10 +02:00
Excalidraw Bot
b71cbe8352 New translations en.json (Occitan) 2024-04-08 16:51:09 +02:00
Excalidraw Bot
576cb578b0 New translations en.json (Norwegian Bokmal) 2024-04-08 16:51:08 +02:00
Excalidraw Bot
7198a613dd New translations en.json (Uzbek) 2024-04-08 16:51:07 +02:00
Excalidraw Bot
24d4eafbd0 New translations en.json (Sinhala) 2024-04-08 16:51:06 +02:00
Excalidraw Bot
8b52f043d5 New translations en.json (Chinese Traditional, Hong Kong) 2024-04-08 16:51:05 +02:00
Excalidraw Bot
6e2c5d7e82 New translations en.json (Burmese) 2024-04-08 16:51:04 +02:00
Excalidraw Bot
ae82cf1704 New translations en.json (Azerbaijani) 2024-04-08 16:51:03 +02:00
Excalidraw Bot
1e0f54b4df New translations en.json (Latvian) 2024-04-08 16:51:02 +02:00
Excalidraw Bot
4624dd5041 New translations en.json (Kazakh) 2024-04-08 16:51:01 +02:00
Excalidraw Bot
1e54ae0825 New translations en.json (Norwegian Nynorsk) 2024-04-08 16:50:59 +02:00
Excalidraw Bot
6bfc4b7212 New translations en.json (Thai) 2024-04-08 16:50:58 +02:00
Excalidraw Bot
81634d45e4 New translations en.json (Marathi) 2024-04-08 16:50:57 +02:00
Excalidraw Bot
cd1c9391f1 New translations en.json (Bengali) 2024-04-08 16:50:56 +02:00
Excalidraw Bot
726ccccb1c New translations en.json (Tamil) 2024-04-08 16:50:55 +02:00
Excalidraw Bot
74942af896 New translations en.json (Khmer) 2024-04-08 16:50:54 +02:00
Excalidraw Bot
89e52da2fe New translations en.json (Persian) 2024-04-08 16:50:53 +02:00
Excalidraw Bot
fcf153e420 New translations en.json (Indonesian) 2024-04-08 16:50:52 +02:00
Excalidraw Bot
c22f0896b7 New translations en.json (Portuguese, Brazilian) 2024-04-08 16:50:51 +02:00
Excalidraw Bot
b3bf5a215f New translations en.json (Galician) 2024-04-08 16:50:51 +02:00
Excalidraw Bot
5a0066ab52 New translations en.json (Vietnamese) 2024-04-08 16:50:49 +02:00
Excalidraw Bot
b85c365aa9 New translations en.json (Chinese Traditional) 2024-04-08 16:50:49 +02:00
Excalidraw Bot
7b1eaf3f48 New translations en.json (Ukrainian) 2024-04-08 16:50:48 +02:00
Excalidraw Bot
16cb262a26 New translations en.json (Turkish) 2024-04-08 16:50:46 +02:00
Excalidraw Bot
35e2663504 New translations en.json (Slovenian) 2024-04-08 16:50:44 +02:00
Excalidraw Bot
81aaa909af New translations en.json (Russian) 2024-04-08 16:50:43 +02:00
Excalidraw Bot
976384a0a7 New translations en.json (Portuguese) 2024-04-08 16:50:42 +02:00
Excalidraw Bot
e989f1ff6c New translations en.json (Polish) 2024-04-08 16:50:41 +02:00
Excalidraw Bot
4237138392 New translations en.json (Punjabi) 2024-04-08 16:50:40 +02:00
Excalidraw Bot
192b67ee73 New translations en.json (Dutch) 2024-04-08 16:50:39 +02:00
Excalidraw Bot
7e2c567e33 New translations en.json (Lithuanian) 2024-04-08 16:50:38 +02:00
Excalidraw Bot
0659407aa8 New translations en.json (Kurdish) 2024-04-08 16:50:37 +02:00
Excalidraw Bot
c2f5ac17a7 New translations en.json (Korean) 2024-04-08 16:50:36 +02:00
Excalidraw Bot
ab7c9a4106 New translations en.json (Japanese) 2024-04-08 16:50:35 +02:00
Excalidraw Bot
e9e5671356 New translations en.json (Hungarian) 2024-04-08 16:50:34 +02:00
Excalidraw Bot
f447cbcc9f New translations en.json (Hebrew) 2024-04-08 16:50:33 +02:00
Excalidraw Bot
cea81f15a7 New translations en.json (Finnish) 2024-04-08 16:50:32 +02:00
Excalidraw Bot
bae392ce50 New translations en.json (Basque) 2024-04-08 16:50:31 +02:00
Excalidraw Bot
5eea304b1d New translations en.json (Greek) 2024-04-08 16:50:30 +02:00
Excalidraw Bot
dba82deef4 New translations en.json (German) 2024-04-08 16:50:29 +02:00
Excalidraw Bot
14a64cad6e New translations en.json (Danish) 2024-04-08 16:50:28 +02:00
Excalidraw Bot
bf73490b78 New translations en.json (Czech) 2024-04-08 16:50:27 +02:00
Excalidraw Bot
50462b4956 New translations en.json (Catalan) 2024-04-08 16:50:26 +02:00
Excalidraw Bot
64087e6055 New translations en.json (Bulgarian) 2024-04-08 16:50:25 +02:00
Excalidraw Bot
8933a677c0 New translations en.json (Arabic) 2024-04-08 16:50:24 +02:00
Excalidraw Bot
ac487862e9 New translations en.json (Spanish) 2024-04-08 16:50:23 +02:00
Excalidraw Bot
6202f38f70 New translations en.json (French) 2024-04-08 16:50:22 +02:00
Excalidraw Bot
a4779bfe73 New translations en.json (Romanian) 2024-04-08 16:50:21 +02:00
Excalidraw Bot
40874a88ef New translations en.json (Hindi) 2024-04-08 16:50:20 +02:00
Excalidraw Bot
88f6c86c9e New translations en.json (Chinese Simplified) 2024-04-08 16:50:19 +02:00
Excalidraw Bot
55bc4a6365 New translations en.json (Swedish) 2024-04-08 16:50:18 +02:00
Excalidraw Bot
3fb6ab5e45 New translations en.json (Slovak) 2024-04-08 16:50:17 +02:00
Excalidraw Bot
44d7db20e6 New translations en.json (Italian) 2024-04-08 16:50:16 +02:00
Excalidraw Bot
8ffed1b059 Auto commit: Calculate translation coverage 2024-04-08 09:51:23 +00:00
Excalidraw Bot
5cae67c1cb New translations en.json (Vietnamese) 2024-04-08 11:51:09 +02:00
Excalidraw Bot
4c04ce1c48 Auto commit: Calculate translation coverage 2024-04-03 13:45:31 +00:00
Excalidraw Bot
a464402919 New translations en.json (Hebrew) 2024-04-03 15:45:17 +02:00
Excalidraw Bot
be18f35595 Auto commit: Calculate translation coverage 2024-04-03 12:16:58 +00:00
Excalidraw Bot
b4f9ee520a New translations en.json (Hebrew) 2024-04-03 14:16:29 +02:00
Excalidraw Bot
455153d728 Auto commit: Calculate translation coverage 2024-04-01 06:34:04 +00:00
Excalidraw Bot
1353ef62b8 New translations en.json (Marathi) 2024-04-01 08:33:49 +02:00
Excalidraw Bot
6fad1e745a New translations en.json (Hindi) 2024-04-01 08:33:48 +02:00
Excalidraw Bot
2c988961f7 New translations en.json (Marathi) 2024-04-01 07:08:38 +02:00
Excalidraw Bot
2cd9a7697f New translations en.json (Hindi) 2024-04-01 07:08:37 +02:00
Excalidraw Bot
d398528493 Auto commit: Calculate translation coverage 2024-03-30 11:18:17 +00:00
Excalidraw Bot
59fe6e7b6d New translations en.json (Marathi) 2024-03-30 12:18:05 +01:00
Excalidraw Bot
abaf858f6c Auto commit: Calculate translation coverage 2024-03-29 14:45:52 +00:00
Excalidraw Bot
949c5b7af1 New translations en.json (Marathi) 2024-03-29 15:45:40 +01:00
Excalidraw Bot
701eb7f9fd Auto commit: Calculate translation coverage 2024-03-29 10:31:55 +00:00
Excalidraw Bot
07d92f720b New translations en.json (Catalan) 2024-03-29 11:31:42 +01:00
Excalidraw Bot
d16b808bb9 Auto commit: Calculate translation coverage 2024-03-29 09:27:55 +00:00
Excalidraw Bot
b2e09157da New translations en.json (Chinese Traditional) 2024-03-29 10:27:44 +01:00
Excalidraw Bot
93ee60cd9b New translations en.json (Romanian) 2024-03-29 10:27:43 +01:00
Excalidraw Bot
9eb509e068 New translations en.json (Chinese Simplified) 2024-03-29 10:27:42 +01:00
Excalidraw Bot
89f3dfb399 New translations en.json (Slovak) 2024-03-29 10:27:41 +01:00
Excalidraw Bot
a4c9355b03 Auto commit: Calculate translation coverage 2024-03-29 07:56:59 +00:00
Excalidraw Bot
c79cdab613 New translations en.json (Chinese Traditional) 2024-03-29 08:56:48 +01:00
Excalidraw Bot
ae3735a150 Auto commit: Calculate translation coverage 2024-03-29 04:28:08 +00:00
Excalidraw Bot
38a5c6c01a New translations en.json (Russian) 2024-03-29 05:27:57 +01:00
Excalidraw Bot
68caccfc2a Auto commit: Calculate translation coverage 2024-03-29 01:11:19 +00:00
Excalidraw Bot
9482c7adc6 New translations en.json (Swedish) 2024-03-29 02:11:07 +01:00
Excalidraw Bot
ff23a04e27 Auto commit: Calculate translation coverage 2024-03-29 00:01:13 +00:00
Excalidraw Bot
9ea989ee2a New translations en.json (Swedish) 2024-03-29 01:01:01 +01:00
Excalidraw Bot
261bff5bea Auto commit: Calculate translation coverage 2024-03-28 21:45:56 +00:00
Excalidraw Bot
55740254ed New translations en.json (German) 2024-03-28 22:45:44 +01:00
Excalidraw Bot
acb4da9f5c Auto commit: Calculate translation coverage 2024-03-28 20:46:08 +00:00
Excalidraw Bot
78131cf48b New translations en.json (Occitan) 2024-03-28 21:45:52 +01:00
Excalidraw Bot
415d5d6f6a Auto commit: Calculate translation coverage 2024-03-28 19:44:22 +00:00
Excalidraw Bot
0789a3db47 New translations en.json (Slovenian) 2024-03-28 20:44:05 +01:00
Excalidraw Bot
7218ddea85 Auto commit: Calculate translation coverage 2024-03-28 18:27:06 +00:00
Excalidraw Bot
e94ca414fb New translations en.json (Slovenian) 2024-03-28 19:26:45 +01:00
Excalidraw Bot
2b374bfa3d New translations en.json (German) 2024-03-28 19:26:36 +01:00
Excalidraw Bot
a140db6244 Auto commit: Calculate translation coverage 2024-03-28 17:01:41 +00:00
Excalidraw Bot
07c0753d38 New translations en.json (Karakalpak) 2024-03-28 18:00:31 +01:00
Excalidraw Bot
26f3b861d7 New translations en.json (Kabyle) 2024-03-28 18:00:30 +01:00
Excalidraw Bot
f115a98333 New translations en.json (Occitan) 2024-03-28 18:00:29 +01:00
Excalidraw Bot
f45779c41c New translations en.json (Norwegian Bokmal) 2024-03-28 18:00:28 +01:00
Excalidraw Bot
8446097251 New translations en.json (Uzbek) 2024-03-28 18:00:27 +01:00
Excalidraw Bot
812dfcf633 New translations en.json (Sinhala) 2024-03-28 18:00:26 +01:00
Excalidraw Bot
7b3dcf2f03 New translations en.json (Chinese Traditional, Hong Kong) 2024-03-28 18:00:25 +01:00
Excalidraw Bot
aa27d5f8d1 New translations en.json (Burmese) 2024-03-28 18:00:24 +01:00
Excalidraw Bot
610ee586cb New translations en.json (Azerbaijani) 2024-03-28 18:00:23 +01:00
Excalidraw Bot
7f56e24078 New translations en.json (Latvian) 2024-03-28 18:00:22 +01:00
Excalidraw Bot
07bb8c524e New translations en.json (Kazakh) 2024-03-28 18:00:21 +01:00
Excalidraw Bot
9bed7b2086 New translations en.json (Norwegian Nynorsk) 2024-03-28 18:00:20 +01:00
Excalidraw Bot
5c5e6b851c New translations en.json (Thai) 2024-03-28 18:00:19 +01:00
Excalidraw Bot
ca415bca50 New translations en.json (Marathi) 2024-03-28 18:00:18 +01:00
Excalidraw Bot
7d6293d5a0 New translations en.json (Bengali) 2024-03-28 18:00:17 +01:00
Excalidraw Bot
0d35449faa New translations en.json (Tamil) 2024-03-28 18:00:16 +01:00
Excalidraw Bot
dd33aefac3 New translations en.json (Khmer) 2024-03-28 18:00:15 +01:00
Excalidraw Bot
8e137d1f72 New translations en.json (Persian) 2024-03-28 18:00:14 +01:00
Excalidraw Bot
2888c3bb6e New translations en.json (Indonesian) 2024-03-28 18:00:13 +01:00
Excalidraw Bot
aaef4e3402 New translations en.json (Portuguese, Brazilian) 2024-03-28 18:00:12 +01:00
Excalidraw Bot
8b0a35c832 New translations en.json (Galician) 2024-03-28 18:00:11 +01:00
Excalidraw Bot
ce2da48663 New translations en.json (Vietnamese) 2024-03-28 18:00:10 +01:00
Excalidraw Bot
869b89c136 New translations en.json (Chinese Traditional) 2024-03-28 18:00:09 +01:00
Excalidraw Bot
8bcbecc0ec New translations en.json (Ukrainian) 2024-03-28 18:00:08 +01:00
Excalidraw Bot
c7a0557e98 New translations en.json (Turkish) 2024-03-28 18:00:07 +01:00
Excalidraw Bot
c5e75439e4 New translations en.json (Slovenian) 2024-03-28 18:00:06 +01:00
Excalidraw Bot
8a07b5b907 New translations en.json (Russian) 2024-03-28 18:00:05 +01:00
Excalidraw Bot
584170eec3 New translations en.json (Portuguese) 2024-03-28 18:00:04 +01:00
Excalidraw Bot
6dd2501a19 New translations en.json (Polish) 2024-03-28 18:00:03 +01:00
Excalidraw Bot
3c3c1e9f8c New translations en.json (Punjabi) 2024-03-28 18:00:02 +01:00
Excalidraw Bot
17b01dec90 New translations en.json (Dutch) 2024-03-28 18:00:01 +01:00
Excalidraw Bot
eb4d64dcd8 New translations en.json (Lithuanian) 2024-03-28 17:59:59 +01:00
Excalidraw Bot
dc9f20c19e New translations en.json (Kurdish) 2024-03-28 17:59:59 +01:00
Excalidraw Bot
7c40b5ae3e New translations en.json (Korean) 2024-03-28 17:59:58 +01:00
Excalidraw Bot
bda85ff7ef New translations en.json (Japanese) 2024-03-28 17:59:57 +01:00
Excalidraw Bot
68b1bd80fa New translations en.json (Hungarian) 2024-03-28 17:59:56 +01:00
Excalidraw Bot
5771f5c0b7 New translations en.json (Hebrew) 2024-03-28 17:59:55 +01:00
Excalidraw Bot
fbbd953f42 New translations en.json (Finnish) 2024-03-28 17:59:53 +01:00
Excalidraw Bot
8d7e8e89db New translations en.json (Basque) 2024-03-28 17:59:53 +01:00
Excalidraw Bot
4e52529cbb New translations en.json (Greek) 2024-03-28 17:59:52 +01:00
Excalidraw Bot
a77c7bb41a New translations en.json (German) 2024-03-28 17:59:51 +01:00
Excalidraw Bot
5e2cdeb699 New translations en.json (Danish) 2024-03-28 17:59:50 +01:00
Excalidraw Bot
4d077f7324 New translations en.json (Czech) 2024-03-28 17:59:49 +01:00
Excalidraw Bot
7fda1f04cf New translations en.json (Catalan) 2024-03-28 17:59:48 +01:00
Excalidraw Bot
bce1d4a0e8 New translations en.json (Bulgarian) 2024-03-28 17:59:47 +01:00
Excalidraw Bot
cecd042357 New translations en.json (Arabic) 2024-03-28 17:59:46 +01:00
Excalidraw Bot
e4047f89c9 New translations en.json (Spanish) 2024-03-28 17:59:45 +01:00
Excalidraw Bot
1b457b3efd New translations en.json (French) 2024-03-28 17:59:44 +01:00
Excalidraw Bot
99fe0df4b1 New translations en.json (Romanian) 2024-03-28 17:59:43 +01:00
Excalidraw Bot
9f3209c487 New translations en.json (Hindi) 2024-03-28 17:59:42 +01:00
Excalidraw Bot
4388c33cd4 New translations en.json (Chinese Simplified) 2024-03-28 17:59:41 +01:00
Excalidraw Bot
3e5c45f674 New translations en.json (Swedish) 2024-03-28 17:59:40 +01:00
Excalidraw Bot
85bc583696 New translations en.json (Slovak) 2024-03-28 17:59:40 +01:00
Excalidraw Bot
2d2c35b6db New translations en.json (Italian) 2024-03-28 17:59:39 +01:00
Excalidraw Bot
b3bc9b9513 Auto commit: Calculate translation coverage 2024-03-21 10:59:59 +00:00
Excalidraw Bot
ad5c655b32 New translations en.json (Hebrew) 2024-03-21 11:59:41 +01:00
Excalidraw Bot
b91e6b5e4e New translations en.json (Swedish) 2024-03-19 08:12:42 +01:00
Excalidraw Bot
06ca0a66de New translations en.json (Chinese Simplified) 2024-03-18 22:31:28 +01:00
Excalidraw Bot
f170f8dfc2 New translations en.json (Chinese Traditional) 2024-03-18 19:47:46 +01:00
Excalidraw Bot
b6b7518992 New translations en.json (Marathi) 2024-03-18 15:47:50 +01:00
Excalidraw Bot
be7b9ce46b New translations en.json (German) 2024-03-18 15:47:49 +01:00
Excalidraw Bot
743ae9bef1 New translations en.json (Hindi) 2024-03-18 15:47:48 +01:00
Excalidraw Bot
1616535de5 New translations en.json (Catalan) 2024-03-18 14:27:10 +01:00
Excalidraw Bot
18471dbdc8 New translations en.json (Slovenian) 2024-03-18 13:01:13 +01:00
Excalidraw Bot
2c9302b33f New translations en.json (Russian) 2024-03-18 13:01:12 +01:00
Excalidraw Bot
f60ae05858 New translations en.json (Catalan) 2024-03-18 13:01:11 +01:00
Excalidraw Bot
b14aeed40e New translations en.json (Romanian) 2024-03-18 13:01:10 +01:00
Excalidraw Bot
28a2f33bd3 New translations en.json (Karakalpak) 2024-03-18 11:07:38 +01:00
Excalidraw Bot
8183c9a2b9 New translations en.json (Kabyle) 2024-03-18 11:07:37 +01:00
Excalidraw Bot
449f57c0c9 New translations en.json (Occitan) 2024-03-18 11:07:36 +01:00
Excalidraw Bot
6d3f9b1da1 New translations en.json (Norwegian Bokmal) 2024-03-18 11:07:35 +01:00
Excalidraw Bot
a4f9983250 New translations en.json (Uzbek) 2024-03-18 11:07:34 +01:00
Excalidraw Bot
cd6f1e7e25 New translations en.json (Sinhala) 2024-03-18 11:07:33 +01:00
Excalidraw Bot
fc5668fed0 New translations en.json (Chinese Traditional, Hong Kong) 2024-03-18 11:07:32 +01:00
Excalidraw Bot
6cf27e310f New translations en.json (Burmese) 2024-03-18 11:07:31 +01:00
Excalidraw Bot
1291a341f1 New translations en.json (Azerbaijani) 2024-03-18 11:07:30 +01:00
Excalidraw Bot
989b774e9d New translations en.json (Latvian) 2024-03-18 11:07:29 +01:00
Excalidraw Bot
372ef53228 New translations en.json (Kazakh) 2024-03-18 11:07:29 +01:00
Excalidraw Bot
279c446ca8 New translations en.json (Norwegian Nynorsk) 2024-03-18 11:07:28 +01:00
Excalidraw Bot
afa96620bc New translations en.json (Thai) 2024-03-18 11:07:27 +01:00
Excalidraw Bot
acf3847f8d New translations en.json (Marathi) 2024-03-18 11:07:26 +01:00
Excalidraw Bot
8882514053 New translations en.json (Bengali) 2024-03-18 11:07:25 +01:00
Excalidraw Bot
2eabd48630 New translations en.json (Tamil) 2024-03-18 11:07:24 +01:00
Excalidraw Bot
b4f90ab130 New translations en.json (Khmer) 2024-03-18 11:07:23 +01:00
Excalidraw Bot
e3698ae541 New translations en.json (Persian) 2024-03-18 11:07:22 +01:00
Excalidraw Bot
4cccf1b413 New translations en.json (Indonesian) 2024-03-18 11:07:21 +01:00
Excalidraw Bot
e168710885 New translations en.json (Portuguese, Brazilian) 2024-03-18 11:07:20 +01:00
Excalidraw Bot
955892aeec New translations en.json (Galician) 2024-03-18 11:07:19 +01:00
Excalidraw Bot
a574f4d2e9 New translations en.json (Vietnamese) 2024-03-18 11:07:18 +01:00
Excalidraw Bot
022b39c858 New translations en.json (Chinese Traditional) 2024-03-18 11:07:17 +01:00
Excalidraw Bot
7f1bfe6179 New translations en.json (Ukrainian) 2024-03-18 11:07:16 +01:00
Excalidraw Bot
de6b632fa3 New translations en.json (Turkish) 2024-03-18 11:07:15 +01:00
Excalidraw Bot
8a5de5b143 New translations en.json (Slovenian) 2024-03-18 11:07:15 +01:00
Excalidraw Bot
3cae9483b0 New translations en.json (Russian) 2024-03-18 11:07:14 +01:00
Excalidraw Bot
0c65e60ed1 New translations en.json (Portuguese) 2024-03-18 11:07:12 +01:00
Excalidraw Bot
f85ccc1a88 New translations en.json (Polish) 2024-03-18 11:07:12 +01:00
Excalidraw Bot
22d9a24ae6 New translations en.json (Punjabi) 2024-03-18 11:07:11 +01:00
Excalidraw Bot
f181775371 New translations en.json (Dutch) 2024-03-18 11:07:10 +01:00
Excalidraw Bot
a5fbefdc84 New translations en.json (Lithuanian) 2024-03-18 11:07:09 +01:00
Excalidraw Bot
d1b10f6276 New translations en.json (Kurdish) 2024-03-18 11:07:08 +01:00
Excalidraw Bot
a04a4a42ed New translations en.json (Korean) 2024-03-18 11:07:07 +01:00
Excalidraw Bot
a18159226a New translations en.json (Japanese) 2024-03-18 11:07:06 +01:00
Excalidraw Bot
0646e4453c New translations en.json (Hungarian) 2024-03-18 11:07:05 +01:00
Excalidraw Bot
2352af7196 New translations en.json (Hebrew) 2024-03-18 11:07:04 +01:00
Excalidraw Bot
46a6886ac4 New translations en.json (Finnish) 2024-03-18 11:07:03 +01:00
Excalidraw Bot
3ddf1c179a New translations en.json (Basque) 2024-03-18 11:07:02 +01:00
Excalidraw Bot
a0b2a0e4e6 New translations en.json (Greek) 2024-03-18 11:07:01 +01:00
Excalidraw Bot
43c46052f3 New translations en.json (German) 2024-03-18 11:07:00 +01:00
Excalidraw Bot
e8832fcb28 New translations en.json (Danish) 2024-03-18 11:06:59 +01:00
Excalidraw Bot
bd02772edb New translations en.json (Czech) 2024-03-18 11:06:58 +01:00
Excalidraw Bot
d5a38f3799 New translations en.json (Catalan) 2024-03-18 11:06:57 +01:00
Excalidraw Bot
921dca9f5b New translations en.json (Bulgarian) 2024-03-18 11:06:56 +01:00
Excalidraw Bot
8899453891 New translations en.json (Arabic) 2024-03-18 11:06:55 +01:00
Excalidraw Bot
7392af03a3 New translations en.json (Spanish) 2024-03-18 11:06:54 +01:00
Excalidraw Bot
7d1f4deb27 New translations en.json (French) 2024-03-18 11:06:53 +01:00
Excalidraw Bot
66724ac81d New translations en.json (Romanian) 2024-03-18 11:06:52 +01:00
Excalidraw Bot
2368d34ab3 New translations en.json (Hindi) 2024-03-18 11:06:52 +01:00
Excalidraw Bot
ddc2d8d2b7 New translations en.json (Chinese Simplified) 2024-03-18 11:06:51 +01:00
Excalidraw Bot
a7012a4b8e New translations en.json (Swedish) 2024-03-18 11:06:50 +01:00
Excalidraw Bot
88db54e11c New translations en.json (Slovak) 2024-03-18 11:06:49 +01:00
Excalidraw Bot
bc85f580ec New translations en.json (Italian) 2024-03-18 11:06:48 +01:00
Excalidraw Bot
02fd58ffc8 New translations en.json (Hindi) 2024-03-18 03:49:55 +01:00
Excalidraw Bot
93af0ce89d New translations en.json (Swedish) 2024-03-11 07:35:54 +01:00
Excalidraw Bot
1c025c166a New translations en.json (Polish) 2024-03-09 23:01:20 +01:00
Excalidraw Bot
150e0cef5d New translations en.json (Polish) 2024-03-09 22:05:45 +01:00
Excalidraw Bot
7f40852b11 New translations en.json (Bengali) 2024-03-09 20:53:27 +01:00
Excalidraw Bot
0b6fae0243 New translations en.json (Chinese Traditional) 2024-03-09 20:53:26 +01:00
Excalidraw Bot
37af96a577 New translations en.json (Bengali) 2024-03-09 19:49:38 +01:00
Excalidraw Bot
0e718265fa New translations en.json (Romanian) 2024-03-09 14:22:26 +01:00
Excalidraw Bot
16b103151b New translations en.json (German) 2024-03-09 08:30:33 +01:00
Excalidraw Bot
351db6e2b9 New translations en.json (Russian) 2024-03-09 07:34:41 +01:00
Excalidraw Bot
b2fb87cd40 New translations en.json (Marathi) 2024-03-09 06:18:09 +01:00
Excalidraw Bot
388ec9f4db New translations en.json (Hindi) 2024-03-09 06:18:08 +01:00
Excalidraw Bot
95dd7f0617 New translations en.json (Chinese Simplified) 2024-03-09 06:18:07 +01:00
Excalidraw Bot
2349b9dcfe New translations en.json (Slovenian) 2024-03-09 00:41:58 +01:00
Excalidraw Bot
ddd05ff030 New translations en.json (Karakalpak) 2024-03-08 22:39:03 +01:00
Excalidraw Bot
4bc30fda19 New translations en.json (Kabyle) 2024-03-08 22:39:02 +01:00
Excalidraw Bot
285744877c New translations en.json (Occitan) 2024-03-08 22:39:01 +01:00
Excalidraw Bot
2169ac6fba New translations en.json (Norwegian Bokmal) 2024-03-08 22:39:00 +01:00
Excalidraw Bot
d2b9034f5e New translations en.json (Uzbek) 2024-03-08 22:38:59 +01:00
Excalidraw Bot
f1bbd3c5a0 New translations en.json (Sinhala) 2024-03-08 22:38:58 +01:00
Excalidraw Bot
aec87f706b New translations en.json (Chinese Traditional, Hong Kong) 2024-03-08 22:38:57 +01:00
Excalidraw Bot
7bd06eef1b New translations en.json (Burmese) 2024-03-08 22:38:56 +01:00
Excalidraw Bot
3be12ef66c New translations en.json (Azerbaijani) 2024-03-08 22:38:55 +01:00
Excalidraw Bot
8dae7772b0 New translations en.json (Latvian) 2024-03-08 22:38:54 +01:00
Excalidraw Bot
f69532aebf New translations en.json (Kazakh) 2024-03-08 22:38:53 +01:00
Excalidraw Bot
5f4e421001 New translations en.json (Norwegian Nynorsk) 2024-03-08 22:38:52 +01:00
Excalidraw Bot
b350917852 New translations en.json (Thai) 2024-03-08 22:38:51 +01:00
Excalidraw Bot
d3d1e21107 New translations en.json (Marathi) 2024-03-08 22:38:50 +01:00
Excalidraw Bot
11a7d52578 New translations en.json (Bengali) 2024-03-08 22:38:49 +01:00
Excalidraw Bot
d8a4736c01 New translations en.json (Tamil) 2024-03-08 22:38:49 +01:00
Excalidraw Bot
2a4b70e26c New translations en.json (Khmer) 2024-03-08 22:38:47 +01:00
Excalidraw Bot
353c17dc3b New translations en.json (Persian) 2024-03-08 22:38:46 +01:00
Excalidraw Bot
f51efffd3a New translations en.json (Indonesian) 2024-03-08 22:38:45 +01:00
Excalidraw Bot
2618178a93 New translations en.json (Portuguese, Brazilian) 2024-03-08 22:38:44 +01:00
Excalidraw Bot
c57d36ba38 New translations en.json (Galician) 2024-03-08 22:38:44 +01:00
Excalidraw Bot
6fa91ecb5c New translations en.json (Vietnamese) 2024-03-08 22:38:43 +01:00
Excalidraw Bot
44d61bcb62 New translations en.json (Chinese Traditional) 2024-03-08 22:38:42 +01:00
Excalidraw Bot
dfeddba61b New translations en.json (Ukrainian) 2024-03-08 22:38:41 +01:00
Excalidraw Bot
d691aa87ce New translations en.json (Turkish) 2024-03-08 22:38:40 +01:00
Excalidraw Bot
5a56bbb01d New translations en.json (Slovenian) 2024-03-08 22:38:39 +01:00
Excalidraw Bot
675adb6f0d New translations en.json (Russian) 2024-03-08 22:38:38 +01:00
Excalidraw Bot
4969de2250 New translations en.json (Portuguese) 2024-03-08 22:38:37 +01:00
Excalidraw Bot
8f6d5b3871 New translations en.json (Polish) 2024-03-08 22:38:36 +01:00
Excalidraw Bot
7732cd1d87 New translations en.json (Punjabi) 2024-03-08 22:38:35 +01:00
Excalidraw Bot
a166aa0ac5 New translations en.json (Dutch) 2024-03-08 22:38:34 +01:00
Excalidraw Bot
51fe6a8203 New translations en.json (Lithuanian) 2024-03-08 22:38:33 +01:00
Excalidraw Bot
287c3fce76 New translations en.json (Kurdish) 2024-03-08 22:38:32 +01:00
Excalidraw Bot
b78404bd85 New translations en.json (Korean) 2024-03-08 22:38:31 +01:00
Excalidraw Bot
1e2cc0b6f1 New translations en.json (Japanese) 2024-03-08 22:38:30 +01:00
Excalidraw Bot
be303375c4 New translations en.json (Hungarian) 2024-03-08 22:38:29 +01:00
Excalidraw Bot
8ba188e429 New translations en.json (Hebrew) 2024-03-08 22:38:28 +01:00
Excalidraw Bot
10842ae839 New translations en.json (Finnish) 2024-03-08 22:38:27 +01:00
Excalidraw Bot
592b9862e1 New translations en.json (Basque) 2024-03-08 22:38:27 +01:00
Excalidraw Bot
01b44663e3 New translations en.json (Greek) 2024-03-08 22:38:26 +01:00
Excalidraw Bot
ce59dd6d07 New translations en.json (German) 2024-03-08 22:38:25 +01:00
Excalidraw Bot
199d0eec81 New translations en.json (Danish) 2024-03-08 22:38:24 +01:00
Excalidraw Bot
176558d6d6 New translations en.json (Czech) 2024-03-08 22:38:22 +01:00
Excalidraw Bot
94da21229b New translations en.json (Catalan) 2024-03-08 22:38:21 +01:00
Excalidraw Bot
58298a9758 New translations en.json (Bulgarian) 2024-03-08 22:38:20 +01:00
Excalidraw Bot
bc53ef2017 New translations en.json (Arabic) 2024-03-08 22:38:19 +01:00
Excalidraw Bot
2892c5d77d New translations en.json (Spanish) 2024-03-08 22:38:19 +01:00
Excalidraw Bot
833e83d57d New translations en.json (French) 2024-03-08 22:38:17 +01:00
Excalidraw Bot
47369822d8 New translations en.json (Romanian) 2024-03-08 22:38:16 +01:00
Excalidraw Bot
2da836df9d New translations en.json (Hindi) 2024-03-08 22:38:15 +01:00
Excalidraw Bot
c42d3700f0 New translations en.json (Chinese Simplified) 2024-03-08 22:38:14 +01:00
Excalidraw Bot
146c599e43 New translations en.json (Swedish) 2024-03-08 22:38:13 +01:00
Excalidraw Bot
950651ce0a New translations en.json (Slovak) 2024-03-08 22:38:12 +01:00
Excalidraw Bot
50ef5d664c New translations en.json (Italian) 2024-03-08 22:38:11 +01:00
Excalidraw Bot
1d1c6f35fa New translations en.json (Hindi) 2024-03-07 18:46:48 +01:00
Excalidraw Bot
fd43439dab New translations en.json (Swedish) 2024-03-04 16:57:04 +01:00
Excalidraw Bot
84ae576ad0 Auto commit: Calculate translation coverage 2024-02-29 16:15:01 +00:00
Excalidraw Bot
bc32a00d6a New translations en.json (Slovak) 2024-02-29 17:14:47 +01:00
Excalidraw Bot
441b2ff2fd Auto commit: Calculate translation coverage 2024-02-28 04:48:28 +00:00
Excalidraw Bot
941e350245 New translations en.json (Chinese Simplified) 2024-02-28 05:48:15 +01:00
Excalidraw Bot
e32290e9e1 Auto commit: Calculate translation coverage 2024-02-26 16:46:46 +00:00
Excalidraw Bot
231a806257 New translations en.json (Italian) 2024-02-26 17:46:32 +01:00
Excalidraw Bot
782daddfcc Auto commit: Calculate translation coverage 2024-02-26 15:47:06 +00:00
Excalidraw Bot
51ea204cb7 New translations en.json (Italian) 2024-02-26 16:46:49 +01:00
Excalidraw Bot
606979a539 New translations en.json (Hindi) 2024-02-25 19:30:01 +01:00
Excalidraw Bot
f1a51e5512 New translations en.json (Hindi) 2024-02-22 16:05:51 +01:00
Excalidraw Bot
2275532d10 New translations en.json (Marathi) 2024-02-22 16:05:49 +01:00
Excalidraw Bot
2d03d9b667 New translations en.json (Swedish) 2024-02-22 11:33:28 +01:00
Excalidraw Bot
917d5c81e3 Auto commit: Calculate translation coverage 2024-02-21 21:18:11 +00:00
Excalidraw Bot
d67ffe20ea New translations en.json (Romanian) 2024-02-21 22:17:56 +01:00
Excalidraw Bot
5252cc6f11 Auto commit: Calculate translation coverage 2024-02-21 19:01:07 +00:00
Excalidraw Bot
f006df974d New translations en.json (Chinese Traditional) 2024-02-21 20:00:53 +01:00
Excalidraw Bot
7bd061d996 Auto commit: Calculate translation coverage 2024-02-21 18:05:14 +00:00
Excalidraw Bot
2a3aa69f35 New translations en.json (German) 2024-02-21 19:05:01 +01:00
Excalidraw Bot
5908d8c07e Auto commit: Calculate translation coverage 2024-02-21 16:36:25 +00:00
Excalidraw Bot
e0fce912d5 New translations en.json (Slovenian) 2024-02-21 17:36:11 +01:00
Excalidraw Bot
8a77638f67 Auto commit: Calculate translation coverage 2024-02-21 15:23:40 +00:00
Excalidraw Bot
d3c43fb648 New translations en.json (Karakalpak) 2024-02-21 16:22:40 +01:00
Excalidraw Bot
1974b49b52 New translations en.json (Kabyle) 2024-02-21 16:22:39 +01:00
Excalidraw Bot
e729048c98 New translations en.json (Occitan) 2024-02-21 16:22:38 +01:00
Excalidraw Bot
6164bd47f9 New translations en.json (Norwegian Bokmal) 2024-02-21 16:22:37 +01:00
Excalidraw Bot
791fbfa2e8 New translations en.json (Sinhala) 2024-02-21 16:22:36 +01:00
Excalidraw Bot
fbdbcedf33 New translations en.json (Chinese Traditional, Hong Kong) 2024-02-21 16:22:35 +01:00
Excalidraw Bot
ca7c470793 New translations en.json (Burmese) 2024-02-21 16:22:34 +01:00
Excalidraw Bot
cf787e8b72 New translations en.json (Hindi) 2024-02-21 16:22:33 +01:00
Excalidraw Bot
998789dbe8 New translations en.json (Azerbaijani) 2024-02-21 16:22:32 +01:00
Excalidraw Bot
1b7098b775 New translations en.json (Latvian) 2024-02-21 16:22:31 +01:00
Excalidraw Bot
152dcae5bc New translations en.json (Kazakh) 2024-02-21 16:22:29 +01:00
Excalidraw Bot
42f2e1c5c3 New translations en.json (Norwegian Nynorsk) 2024-02-21 16:22:29 +01:00
Excalidraw Bot
a986a4f0bf New translations en.json (Thai) 2024-02-21 16:22:27 +01:00
Excalidraw Bot
f2fc6ee067 New translations en.json (Marathi) 2024-02-21 16:22:26 +01:00
Excalidraw Bot
043503a739 New translations en.json (Bengali) 2024-02-21 16:22:25 +01:00
Excalidraw Bot
83cd933987 New translations en.json (Tamil) 2024-02-21 16:22:24 +01:00
Excalidraw Bot
9efa749059 New translations en.json (Khmer) 2024-02-21 16:22:23 +01:00
Excalidraw Bot
c8fb8f0b2e New translations en.json (Persian) 2024-02-21 16:22:22 +01:00
Excalidraw Bot
ec719c131f New translations en.json (Indonesian) 2024-02-21 16:22:21 +01:00
Excalidraw Bot
90375a2f12 New translations en.json (Portuguese, Brazilian) 2024-02-21 16:22:20 +01:00
Excalidraw Bot
6051275d0a New translations en.json (Chinese Traditional) 2024-02-21 16:22:19 +01:00
Excalidraw Bot
06f0c2388d New translations en.json (Chinese Simplified) 2024-02-21 16:22:18 +01:00
Excalidraw Bot
7051bac7d8 New translations en.json (Ukrainian) 2024-02-21 16:22:17 +01:00
Excalidraw Bot
44aa5856cd New translations en.json (Swedish) 2024-02-21 16:22:15 +01:00
Excalidraw Bot
374dc52601 New translations en.json (Slovenian) 2024-02-21 16:22:14 +01:00
Excalidraw Bot
46345e9956 New translations en.json (Slovak) 2024-02-21 16:22:13 +01:00
Excalidraw Bot
f3c02d4298 New translations en.json (Russian) 2024-02-21 16:22:13 +01:00
Excalidraw Bot
b4cedca7da New translations en.json (Portuguese) 2024-02-21 16:22:11 +01:00
Excalidraw Bot
deaf828e84 New translations en.json (Polish) 2024-02-21 16:22:10 +01:00
Excalidraw Bot
38a5698bc7 New translations en.json (Punjabi) 2024-02-21 16:22:09 +01:00
Excalidraw Bot
70af8a3fa5 New translations en.json (Dutch) 2024-02-21 16:22:08 +01:00
Excalidraw Bot
37b172c8ca New translations en.json (Lithuanian) 2024-02-21 16:22:07 +01:00
Excalidraw Bot
1eef380425 New translations en.json (Kurdish) 2024-02-21 16:22:06 +01:00
Excalidraw Bot
1dcf411626 New translations en.json (Korean) 2024-02-21 16:22:05 +01:00
Excalidraw Bot
378a97553c New translations en.json (Italian) 2024-02-21 16:22:04 +01:00
Excalidraw Bot
3246b04911 New translations en.json (Hungarian) 2024-02-21 16:22:03 +01:00
Excalidraw Bot
dda48a7d6a New translations en.json (Hebrew) 2024-02-21 16:22:02 +01:00
Excalidraw Bot
29153f0d8d New translations en.json (Finnish) 2024-02-21 16:22:01 +01:00
Excalidraw Bot
70c513f568 New translations en.json (Basque) 2024-02-21 16:22:00 +01:00
Excalidraw Bot
56f75b259c New translations en.json (Greek) 2024-02-21 16:21:58 +01:00
Excalidraw Bot
f94a3a7711 New translations en.json (German) 2024-02-21 16:21:57 +01:00
Excalidraw Bot
5a166ee235 New translations en.json (Danish) 2024-02-21 16:21:56 +01:00
Excalidraw Bot
0c199e42c8 New translations en.json (Czech) 2024-02-21 16:21:55 +01:00
Excalidraw Bot
a377f55d7f New translations en.json (Bulgarian) 2024-02-21 16:21:54 +01:00
Excalidraw Bot
c4759c8ca8 New translations en.json (Arabic) 2024-02-21 16:21:53 +01:00
Excalidraw Bot
9d19230033 New translations en.json (Spanish) 2024-02-21 16:21:52 +01:00
Excalidraw Bot
5aa2ec962b New translations en.json (French) 2024-02-21 16:21:51 +01:00
Excalidraw Bot
b21e7f0a70 New translations en.json (Romanian) 2024-02-21 16:21:50 +01:00
Excalidraw Bot
0056d274d5 New translations en.json (Uzbek) 2024-02-21 16:21:49 +01:00
Excalidraw Bot
cf5d7f3928 New translations en.json (Catalan) 2024-02-21 16:21:48 +01:00
Excalidraw Bot
058eed953e New translations en.json (Vietnamese) 2024-02-21 16:21:47 +01:00
Excalidraw Bot
5feb41624d New translations en.json (Turkish) 2024-02-21 16:21:46 +01:00
Excalidraw Bot
10a74bf607 New translations en.json (Galician) 2024-02-21 16:21:45 +01:00
Excalidraw Bot
0d1bb00270 New translations en.json (Japanese) 2024-02-21 16:21:44 +01:00
Excalidraw Bot
506756f332 Auto commit: Calculate translation coverage 2024-02-20 03:48:35 +00:00
Excalidraw Bot
67239c874e New translations en.json (Uzbek) 2024-02-20 04:48:23 +01:00
Excalidraw Bot
d6cf042764 Auto commit: Calculate translation coverage 2024-02-19 13:24:59 +00:00
Excalidraw Bot
8e5f3ca841 New translations en.json (Catalan) 2024-02-19 14:24:43 +01:00
Excalidraw Bot
41d325fdd8 Auto commit: Calculate translation coverage 2024-02-15 15:43:56 +00:00
Excalidraw Bot
6b6761f654 New translations en.json (Vietnamese) 2024-02-15 16:43:43 +01:00
Excalidraw Bot
fc3ae973be Auto commit: Calculate translation coverage 2024-02-13 11:15:09 +00:00
Excalidraw Bot
0c3c4d4f22 New translations en.json (Galician) 2024-02-13 12:14:56 +01:00
Excalidraw Bot
4df91b980a Auto commit: Calculate translation coverage 2024-02-10 10:54:58 +00:00
Excalidraw Bot
3729104547 New translations en.json (Japanese) 2024-02-10 11:54:46 +01:00
Excalidraw Bot
9fd896c1d1 Auto commit: Calculate translation coverage 2024-02-06 19:24:30 +00:00
Excalidraw Bot
e6f4e1f027 New translations en.json (Portuguese) 2024-02-06 20:24:16 +01:00
Excalidraw Bot
35424f62ed New translations en.json (Swedish) 2024-02-06 09:32:24 +01:00
Excalidraw Bot
70943ae461 Auto commit: Calculate translation coverage 2024-02-05 13:44:35 +00:00
Excalidraw Bot
a976aa7123 New translations en.json (French) 2024-02-05 14:44:22 +01:00
Excalidraw Bot
e58111d93d New translations en.json (Russian) 2024-02-04 18:14:26 +01:00
Excalidraw Bot
311ebaa5a4 Auto commit: Calculate translation coverage 2024-02-04 10:18:20 +00:00
Excalidraw Bot
b058b2dff1 New translations en.json (Dutch) 2024-02-04 11:18:10 +01:00
Excalidraw Bot
6c77e76c4c Auto commit: Calculate translation coverage 2024-02-04 08:44:00 +00:00
Excalidraw Bot
691225f51a New translations en.json (Romanian) 2024-02-04 09:43:48 +01:00
Excalidraw Bot
d46c669f64 Auto commit: Calculate translation coverage 2024-02-03 23:48:17 +00:00
Excalidraw Bot
7f46da315f New translations en.json (Chinese Simplified) 2024-02-04 00:48:06 +01:00
Excalidraw Bot
b7e0d18fae Auto commit: Calculate translation coverage 2024-02-03 16:41:58 +00:00
Excalidraw Bot
f9095caa42 New translations en.json (German) 2024-02-03 17:41:47 +01:00
Excalidraw Bot
de5c825d01 Auto commit: Calculate translation coverage 2024-02-03 15:29:53 +00:00
Excalidraw Bot
5fd26d2a45 New translations en.json (Karakalpak) 2024-02-03 16:28:33 +01:00
Excalidraw Bot
06052b1f3e New translations en.json (Kabyle) 2024-02-03 16:28:32 +01:00
Excalidraw Bot
98b3fbbc18 New translations en.json (Norwegian Bokmal) 2024-02-03 16:28:31 +01:00
Excalidraw Bot
fd29c8dd44 New translations en.json (Sinhala) 2024-02-03 16:28:30 +01:00
Excalidraw Bot
f4e90f1888 New translations en.json (Chinese Traditional, Hong Kong) 2024-02-03 16:28:29 +01:00
Excalidraw Bot
d9d8a39d6a New translations en.json (Burmese) 2024-02-03 16:28:28 +01:00
Excalidraw Bot
aa1a99dcf2 New translations en.json (Azerbaijani) 2024-02-03 16:28:27 +01:00
Excalidraw Bot
01f863f268 New translations en.json (Latvian) 2024-02-03 16:28:26 +01:00
Excalidraw Bot
8779e7f36f New translations en.json (Kazakh) 2024-02-03 16:28:25 +01:00
Excalidraw Bot
703cfc02e9 New translations en.json (Norwegian Nynorsk) 2024-02-03 16:28:25 +01:00
Excalidraw Bot
d11c92ffc3 New translations en.json (Thai) 2024-02-03 16:28:24 +01:00
Excalidraw Bot
7f381a0d02 New translations en.json (Marathi) 2024-02-03 16:28:23 +01:00
Excalidraw Bot
b8b1b9d57f New translations en.json (Bengali) 2024-02-03 16:28:22 +01:00
Excalidraw Bot
103c0e5997 New translations en.json (Tamil) 2024-02-03 16:28:21 +01:00
Excalidraw Bot
696e3d6836 New translations en.json (Khmer) 2024-02-03 16:28:20 +01:00
Excalidraw Bot
07a6b9942e New translations en.json (Persian) 2024-02-03 16:28:19 +01:00
Excalidraw Bot
e3d2b854d7 New translations en.json (Indonesian) 2024-02-03 16:28:18 +01:00
Excalidraw Bot
5ee88f6c6b New translations en.json (Portuguese, Brazilian) 2024-02-03 16:28:17 +01:00
Excalidraw Bot
1681598c7d New translations en.json (Vietnamese) 2024-02-03 16:28:16 +01:00
Excalidraw Bot
8f6d92c45c New translations en.json (Chinese Traditional) 2024-02-03 16:28:15 +01:00
Excalidraw Bot
3445c340a1 New translations en.json (Chinese Simplified) 2024-02-03 16:28:14 +01:00
Excalidraw Bot
a82d3c15ff New translations en.json (Turkish) 2024-02-03 16:28:13 +01:00
Excalidraw Bot
8b44b2f2ed New translations en.json (Swedish) 2024-02-03 16:28:12 +01:00
Excalidraw Bot
3f4f9e914b New translations en.json (Slovenian) 2024-02-03 16:28:11 +01:00
Excalidraw Bot
721565f3c3 New translations en.json (Slovak) 2024-02-03 16:28:10 +01:00
Excalidraw Bot
4b8060b093 New translations en.json (Russian) 2024-02-03 16:28:10 +01:00
Excalidraw Bot
b61bbfea4e New translations en.json (Portuguese) 2024-02-03 16:28:09 +01:00
Excalidraw Bot
6c88eb12d7 New translations en.json (Polish) 2024-02-03 16:28:08 +01:00
Excalidraw Bot
5cb46022fb New translations en.json (Punjabi) 2024-02-03 16:28:07 +01:00
Excalidraw Bot
afa0f83349 New translations en.json (Dutch) 2024-02-03 16:28:06 +01:00
Excalidraw Bot
a3ddac93a6 New translations en.json (Lithuanian) 2024-02-03 16:28:05 +01:00
Excalidraw Bot
6dd1406716 New translations en.json (Kurdish) 2024-02-03 16:28:04 +01:00
Excalidraw Bot
59f11650f2 New translations en.json (Korean) 2024-02-03 16:28:03 +01:00
Excalidraw Bot
fb6e93fe8e New translations en.json (Italian) 2024-02-03 16:28:02 +01:00
Excalidraw Bot
b7ddf1ef3a New translations en.json (Hungarian) 2024-02-03 16:28:01 +01:00
Excalidraw Bot
5ffc582f76 New translations en.json (Hebrew) 2024-02-03 16:28:01 +01:00
Excalidraw Bot
d025f728cc New translations en.json (Finnish) 2024-02-03 16:28:00 +01:00
Excalidraw Bot
7172c833cb New translations en.json (Basque) 2024-02-03 16:27:59 +01:00
Excalidraw Bot
e22350f745 New translations en.json (Greek) 2024-02-03 16:27:58 +01:00
Excalidraw Bot
da9319411b New translations en.json (German) 2024-02-03 16:27:57 +01:00
Excalidraw Bot
a3bd43f3b2 New translations en.json (Danish) 2024-02-03 16:27:56 +01:00
Excalidraw Bot
4d0fd858be New translations en.json (Czech) 2024-02-03 16:27:55 +01:00
Excalidraw Bot
f89325507c New translations en.json (Bulgarian) 2024-02-03 16:27:54 +01:00
Excalidraw Bot
3cafe68e2b New translations en.json (Arabic) 2024-02-03 16:27:53 +01:00
Excalidraw Bot
e9ea414849 New translations en.json (Romanian) 2024-02-03 16:27:52 +01:00
Excalidraw Bot
fef5b41bd9 New translations en.json (Galician) 2024-02-03 16:27:51 +01:00
Excalidraw Bot
7a478bd508 New translations en.json (Japanese) 2024-02-03 16:27:50 +01:00
Excalidraw Bot
bba0033900 New translations en.json (Occitan) 2024-02-03 16:27:49 +01:00
Excalidraw Bot
2e773439ce New translations en.json (Hindi) 2024-02-03 16:27:48 +01:00
Excalidraw Bot
3ff668d7ed New translations en.json (French) 2024-02-03 16:27:47 +01:00
Excalidraw Bot
1801d9efcb New translations en.json (Catalan) 2024-02-03 16:27:46 +01:00
Excalidraw Bot
ecd9d7444f New translations en.json (Spanish) 2024-02-03 16:27:45 +01:00
Excalidraw Bot
2dc2b31e36 New translations en.json (Ukrainian) 2024-02-03 16:27:45 +01:00
Excalidraw Bot
50a5886455 Auto commit: Calculate translation coverage 2024-02-02 19:30:27 +00:00
Excalidraw Bot
8d4dde8411 New translations en.json (Galician) 2024-02-02 20:30:14 +01:00
Excalidraw Bot
b6c9bd6bfc Auto commit: Calculate translation coverage 2024-02-02 17:29:48 +00:00
Excalidraw Bot
a5977368b1 New translations en.json (Occitan) 2024-02-02 18:29:35 +01:00
Excalidraw Bot
401281d0eb New translations en.json (Japanese) 2024-02-01 10:44:58 +01:00
Excalidraw Bot
f7df761f7c Auto commit: Calculate translation coverage 2024-01-31 07:13:49 +00:00
Excalidraw Bot
e690653a3a New translations en.json (Occitan) 2024-01-31 08:13:38 +01:00
Excalidraw Bot
012094d32f New translations en.json (Hindi) 2024-01-30 03:20:20 +01:00
Excalidraw Bot
085099b770 Auto commit: Calculate translation coverage 2024-01-29 14:43:01 +00:00
Excalidraw Bot
c066a5d65a New translations en.json (French) 2024-01-29 15:42:49 +01:00
Excalidraw Bot
0bb4aa58a0 New translations en.json (Ukrainian) 2024-01-27 15:15:12 +01:00
Excalidraw Bot
3baf081831 New translations en.json (Ukrainian) 2024-01-27 14:18:19 +01:00
Excalidraw Bot
cd07cae68c Auto commit: Calculate translation coverage 2024-01-26 23:20:26 +00:00
Excalidraw Bot
f8862ff2b3 New translations en.json (Catalan) 2024-01-27 00:20:14 +01:00
Excalidraw Bot
79dd246722 New translations en.json (Ukrainian) 2024-01-26 18:01:08 +01:00
Excalidraw Bot
6ba4dd5d86 New translations en.json (Ukrainian) 2024-01-26 16:19:23 +01:00
Excalidraw Bot
da4896077b Auto commit: Calculate translation coverage 2024-01-25 01:58:25 +00:00
Excalidraw Bot
0321ea248a New translations en.json (Spanish) 2024-01-25 02:58:13 +01:00
Excalidraw Bot
07415a37c9 Auto commit: Calculate translation coverage 2024-01-17 15:48:05 +00:00
Excalidraw Bot
356eb47ca3 New translations en.json (Japanese) 2024-01-17 16:47:46 +01:00
Excalidraw Bot
9383e1a983 Auto commit: Calculate translation coverage 2024-01-14 21:44:10 +00:00
Excalidraw Bot
43ad9a7da9 New translations en.json (Ukrainian) 2024-01-14 22:43:59 +01:00
Excalidraw Bot
b661158a85 Auto commit: Calculate translation coverage 2024-01-14 20:35:38 +00:00
Excalidraw Bot
4d5f89fb2a New translations en.json (Norwegian Nynorsk) 2024-01-14 21:35:25 +01:00
Excalidraw Bot
c8d1cd6cc3 New translations en.json (Italian) 2024-01-06 20:07:42 +01:00
Excalidraw Bot
558e9382ae Auto commit: Calculate translation coverage 2024-01-06 10:54:10 +00:00
Excalidraw Bot
1ec0b25c3d New translations en.json (Romanian) 2024-01-06 11:53:58 +01:00
Excalidraw Bot
4d08a6568b Auto commit: Calculate translation coverage 2024-01-06 04:35:47 +00:00
Excalidraw Bot
2ef35fd2f8 New translations en.json (Hindi) 2024-01-06 05:35:33 +01:00
Excalidraw Bot
cc44844029 New translations en.json (Marathi) 2024-01-06 05:35:32 +01:00
Excalidraw Bot
970903992a Auto commit: Calculate translation coverage 2024-01-05 18:37:25 +00:00
Excalidraw Bot
ac160b6a18 New translations en.json (Slovak) 2024-01-05 19:37:11 +01:00
Excalidraw Bot
535a99a12f Auto commit: Calculate translation coverage 2024-01-05 08:09:35 +00:00
Excalidraw Bot
6415432eb5 New translations en.json (Chinese Simplified) 2024-01-05 09:09:23 +01:00
Excalidraw Bot
30e9692158 Auto commit: Calculate translation coverage 2024-01-04 21:12:51 +00:00
Excalidraw Bot
148bce498e New translations en.json (Portuguese) 2024-01-04 22:12:39 +01:00
Excalidraw Bot
9455b0942b Auto commit: Calculate translation coverage 2024-01-04 20:02:43 +00:00
Excalidraw Bot
a279bbb5fd New translations en.json (Portuguese, Brazilian) 2024-01-04 21:02:30 +01:00
Excalidraw Bot
3843e24ba0 New translations en.json (Portuguese) 2024-01-04 21:02:28 +01:00
Excalidraw Bot
91ada50547 Auto commit: Calculate translation coverage 2024-01-04 18:12:59 +00:00
Excalidraw Bot
c969c730a5 New translations en.json (Chinese Traditional) 2024-01-04 19:12:47 +01:00
Excalidraw Bot
560cd5ec32 New translations en.json (Russian) 2024-01-04 19:12:46 +01:00
Excalidraw Bot
186c3755e9 New translations en.json (Portuguese) 2024-01-04 19:12:45 +01:00
Excalidraw Bot
a8113203d4 New translations en.json (German) 2024-01-04 19:12:44 +01:00
Excalidraw Bot
2e1da33411 Auto commit: Calculate translation coverage 2024-01-04 16:21:40 +00:00
Excalidraw Bot
053dce7b8b New translations en.json (Swedish) 2024-01-04 17:21:27 +01:00
Excalidraw Bot
4941ffdcae New translations en.json (Slovenian) 2024-01-04 17:21:26 +01:00
Excalidraw Bot
845d519fc9 New translations en.json (Portuguese) 2024-01-04 17:21:25 +01:00
Excalidraw Bot
cb59638222 Auto commit: Calculate translation coverage 2024-01-04 14:48:12 +00:00
Excalidraw Bot
1cf00f8f28 New translations en.json (Karakalpak) 2024-01-04 15:46:16 +01:00
Excalidraw Bot
3138e75dfe New translations en.json (Kabyle) 2024-01-04 15:46:15 +01:00
Excalidraw Bot
c0fd470198 New translations en.json (Occitan) 2024-01-04 15:46:14 +01:00
Excalidraw Bot
44dd859a11 New translations en.json (Norwegian Bokmal) 2024-01-04 15:46:13 +01:00
Excalidraw Bot
fb207ad1d4 New translations en.json (Sinhala) 2024-01-04 15:46:11 +01:00
Excalidraw Bot
238324505f New translations en.json (Chinese Traditional, Hong Kong) 2024-01-04 15:46:09 +01:00
Excalidraw Bot
9685ac01a1 New translations en.json (Burmese) 2024-01-04 15:46:08 +01:00
Excalidraw Bot
ebf18e369b New translations en.json (Hindi) 2024-01-04 15:46:07 +01:00
Excalidraw Bot
d1663324be New translations en.json (Azerbaijani) 2024-01-04 15:46:06 +01:00
Excalidraw Bot
37e8eb1211 New translations en.json (Latvian) 2024-01-04 15:46:05 +01:00
Excalidraw Bot
d27063eea4 New translations en.json (Kazakh) 2024-01-04 15:46:04 +01:00
Excalidraw Bot
77a89d12f2 New translations en.json (Norwegian Nynorsk) 2024-01-04 15:46:03 +01:00
Excalidraw Bot
e66d7717ab New translations en.json (Thai) 2024-01-04 15:46:01 +01:00
Excalidraw Bot
828772e4f2 New translations en.json (Marathi) 2024-01-04 15:46:00 +01:00
Excalidraw Bot
087cfdfb9f New translations en.json (Bengali) 2024-01-04 15:45:59 +01:00
Excalidraw Bot
77a7cca80c New translations en.json (Tamil) 2024-01-04 15:45:58 +01:00
Excalidraw Bot
d24c875aeb New translations en.json (Khmer) 2024-01-04 15:45:57 +01:00
Excalidraw Bot
6c974d033b New translations en.json (Indonesian) 2024-01-04 15:45:56 +01:00
Excalidraw Bot
5ee8fd7448 New translations en.json (Portuguese, Brazilian) 2024-01-04 15:45:55 +01:00
Excalidraw Bot
23352dd668 New translations en.json (Galician) 2024-01-04 15:45:54 +01:00
Excalidraw Bot
60524a49be New translations en.json (Vietnamese) 2024-01-04 15:45:53 +01:00
Excalidraw Bot
76665cc7a1 New translations en.json (Chinese Traditional) 2024-01-04 15:45:52 +01:00
Excalidraw Bot
6cd8bbf5e2 New translations en.json (Ukrainian) 2024-01-04 15:45:51 +01:00
Excalidraw Bot
8602bb66ab New translations en.json (Turkish) 2024-01-04 15:45:50 +01:00
Excalidraw Bot
20d40522da New translations en.json (Swedish) 2024-01-04 15:45:48 +01:00
Excalidraw Bot
44d4e069e4 New translations en.json (Slovenian) 2024-01-04 15:45:47 +01:00
Excalidraw Bot
309790a707 New translations en.json (Russian) 2024-01-04 15:45:46 +01:00
Excalidraw Bot
8a17d6287c New translations en.json (Portuguese) 2024-01-04 15:45:45 +01:00
Excalidraw Bot
bea2193b82 New translations en.json (Polish) 2024-01-04 15:45:44 +01:00
Excalidraw Bot
3819b41865 New translations en.json (Punjabi) 2024-01-04 15:45:42 +01:00
Excalidraw Bot
52e7bab8e6 New translations en.json (Dutch) 2024-01-04 15:45:42 +01:00
Excalidraw Bot
7916134430 New translations en.json (Lithuanian) 2024-01-04 15:45:40 +01:00
Excalidraw Bot
e1944b4d45 New translations en.json (Kurdish) 2024-01-04 15:45:39 +01:00
Excalidraw Bot
7fe05e26d6 New translations en.json (Korean) 2024-01-04 15:45:38 +01:00
Excalidraw Bot
a654815139 New translations en.json (Japanese) 2024-01-04 15:45:37 +01:00
Excalidraw Bot
d7c69316f7 New translations en.json (Hungarian) 2024-01-04 15:45:35 +01:00
Excalidraw Bot
a22d237f2a New translations en.json (Hebrew) 2024-01-04 15:45:34 +01:00
Excalidraw Bot
f92acf6481 New translations en.json (Finnish) 2024-01-04 15:45:33 +01:00
Excalidraw Bot
c7adb02973 New translations en.json (Basque) 2024-01-04 15:45:32 +01:00
Excalidraw Bot
ce0ed0bdd3 New translations en.json (Greek) 2024-01-04 15:45:31 +01:00
Excalidraw Bot
3b51f9711c New translations en.json (German) 2024-01-04 15:45:30 +01:00
Excalidraw Bot
ca0f7f417b New translations en.json (Danish) 2024-01-04 15:45:29 +01:00
Excalidraw Bot
9f59e2080d New translations en.json (Czech) 2024-01-04 15:45:28 +01:00
Excalidraw Bot
1e6778ec11 New translations en.json (Catalan) 2024-01-04 15:45:27 +01:00
Excalidraw Bot
a1cdec0995 New translations en.json (Bulgarian) 2024-01-04 15:45:26 +01:00
Excalidraw Bot
6593913c7e New translations en.json (Arabic) 2024-01-04 15:45:25 +01:00
Excalidraw Bot
9fb3f7d223 New translations en.json (Spanish) 2024-01-04 15:45:24 +01:00
Excalidraw Bot
8a43bc35d7 New translations en.json (Romanian) 2024-01-04 15:45:23 +01:00
Excalidraw Bot
2e65fb9441 New translations en.json (French) 2024-01-04 15:45:22 +01:00
Excalidraw Bot
f0326c4a82 New translations en.json (Italian) 2024-01-04 15:45:21 +01:00
Excalidraw Bot
1deb577b6e New translations en.json (Persian) 2024-01-04 15:45:20 +01:00
Excalidraw Bot
60c59a9575 New translations en.json (Slovak) 2024-01-04 15:45:19 +01:00
Excalidraw Bot
fddc299b60 New translations en.json (Chinese Simplified) 2024-01-04 15:45:18 +01:00
Excalidraw Bot
892fe1917e Auto commit: Calculate translation coverage 2023-12-30 16:18:06 +00:00
Excalidraw Bot
7979b5e11c New translations en.json (French) 2023-12-30 17:17:53 +01:00
Excalidraw Bot
d5fba1e199 Auto commit: Calculate translation coverage 2023-12-23 13:08:01 +00:00
Excalidraw Bot
4629c88279 New translations en.json (Italian) 2023-12-23 14:07:47 +01:00
Excalidraw Bot
381809e1bd Auto commit: Calculate translation coverage 2023-12-23 10:34:22 +00:00
Excalidraw Bot
a06c103aa7 New translations en.json (Persian) 2023-12-23 11:34:06 +01:00
Excalidraw Bot
ae43f480d6 Auto commit: Calculate translation coverage 2023-12-22 10:38:58 +00:00
Excalidraw Bot
b7535f0b0e New translations en.json (Slovak) 2023-12-22 11:38:44 +01:00
Excalidraw Bot
9d7dd3afef New translations en.json (Slovak) 2023-12-22 09:45:33 +01:00
Excalidraw Bot
6e70165e8c Auto commit: Calculate translation coverage 2023-12-22 01:52:18 +00:00
Excalidraw Bot
b9759d2c77 New translations en.json (Chinese Simplified) 2023-12-22 02:52:03 +01:00
Excalidraw Bot
1cb3feec51 Auto commit: Calculate translation coverage 2023-12-20 17:36:37 +00:00
Excalidraw Bot
7c0f1f42f6 New translations en.json (Chinese Traditional) 2023-12-20 18:36:23 +01:00
Excalidraw Bot
4b9dae1986 Auto commit: Calculate translation coverage 2023-12-20 11:17:25 +00:00
Excalidraw Bot
8e13821456 New translations en.json (Hindi) 2023-12-20 12:17:11 +01:00
Excalidraw Bot
9ae10b66ab New translations en.json (Marathi) 2023-12-20 12:17:10 +01:00
Excalidraw Bot
f77fcc28d9 Auto commit: Calculate translation coverage 2023-12-20 06:13:39 +00:00
Excalidraw Bot
20a6bdb55c New translations en.json (Korean) 2023-12-20 07:13:22 +01:00
Excalidraw Bot
7f4bcbe853 Auto commit: Calculate translation coverage 2023-12-18 20:50:20 +00:00
Excalidraw Bot
a7e2e053f3 New translations en.json (Russian) 2023-12-18 21:50:07 +01:00
Excalidraw Bot
c870c7adab New translations en.json (German) 2023-12-18 21:50:06 +01:00
Excalidraw Bot
9075584a3a New translations en.json (Spanish) 2023-12-18 21:50:05 +01:00
Excalidraw Bot
00f35af572 Auto commit: Calculate translation coverage 2023-12-18 18:13:16 +00:00
Excalidraw Bot
24d5be9e8c New translations en.json (Romanian) 2023-12-18 19:13:02 +01:00
Excalidraw Bot
7b671d0d74 Auto commit: Calculate translation coverage 2023-12-18 17:05:33 +00:00
Excalidraw Bot
6ad3077c69 New translations en.json (Swedish) 2023-12-18 18:05:20 +01:00
Excalidraw Bot
4f1d578b2f New translations en.json (Slovenian) 2023-12-18 18:05:18 +01:00
Excalidraw Bot
685eb8cb50 Auto commit: Calculate translation coverage 2023-12-18 16:00:56 +00:00
Excalidraw Bot
998331f937 New translations en.json (Karakalpak) 2023-12-18 16:57:33 +01:00
Excalidraw Bot
fdd3ea29e0 New translations en.json (Kabyle) 2023-12-18 16:57:31 +01:00
Excalidraw Bot
f25781db38 New translations en.json (Occitan) 2023-12-18 16:57:30 +01:00
Excalidraw Bot
8bde613823 New translations en.json (Norwegian Bokmal) 2023-12-18 16:57:29 +01:00
Excalidraw Bot
e9db8195e0 New translations en.json (Sinhala) 2023-12-18 16:57:28 +01:00
Excalidraw Bot
944f823847 New translations en.json (Chinese Traditional, Hong Kong) 2023-12-18 16:57:27 +01:00
Excalidraw Bot
377243b07f New translations en.json (Burmese) 2023-12-18 16:57:26 +01:00
Excalidraw Bot
c86c73dd8f New translations en.json (Hindi) 2023-12-18 16:57:25 +01:00
Excalidraw Bot
4f453600db New translations en.json (Azerbaijani) 2023-12-18 16:57:24 +01:00
Excalidraw Bot
4ff1dbc8b1 New translations en.json (Latvian) 2023-12-18 16:57:23 +01:00
Excalidraw Bot
18463b79b3 New translations en.json (Kazakh) 2023-12-18 16:57:22 +01:00
Excalidraw Bot
9e19d2d166 New translations en.json (Norwegian Nynorsk) 2023-12-18 16:57:21 +01:00
Excalidraw Bot
17e9de9a53 New translations en.json (Thai) 2023-12-18 16:57:19 +01:00
Excalidraw Bot
4a0f4fc4ea New translations en.json (Marathi) 2023-12-18 16:57:18 +01:00
Excalidraw Bot
124d7a388f New translations en.json (Bengali) 2023-12-18 16:57:17 +01:00
Excalidraw Bot
0b34294156 New translations en.json (Tamil) 2023-12-18 16:57:16 +01:00
Excalidraw Bot
d296b12f0e New translations en.json (Khmer) 2023-12-18 16:57:15 +01:00
Excalidraw Bot
2d62da8dfe New translations en.json (Persian) 2023-12-18 16:57:14 +01:00
Excalidraw Bot
6115b9a808 New translations en.json (Indonesian) 2023-12-18 16:57:13 +01:00
Excalidraw Bot
e034410a91 New translations en.json (Portuguese, Brazilian) 2023-12-18 16:57:12 +01:00
Excalidraw Bot
800a609b4f New translations en.json (Galician) 2023-12-18 16:57:10 +01:00
Excalidraw Bot
ce69926f8a New translations en.json (Vietnamese) 2023-12-18 16:57:09 +01:00
Excalidraw Bot
e38a33b7b4 New translations en.json (Chinese Traditional) 2023-12-18 16:57:08 +01:00
Excalidraw Bot
95ab1256ba New translations en.json (Chinese Simplified) 2023-12-18 16:57:07 +01:00
Excalidraw Bot
f7a3dbd9f2 New translations en.json (Ukrainian) 2023-12-18 16:57:06 +01:00
Excalidraw Bot
4552db4fa1 New translations en.json (Turkish) 2023-12-18 16:57:05 +01:00
Excalidraw Bot
a33bb248a4 New translations en.json (Swedish) 2023-12-18 16:57:04 +01:00
Excalidraw Bot
2df55f0be7 New translations en.json (Slovenian) 2023-12-18 16:57:03 +01:00
Excalidraw Bot
a0094fce80 New translations en.json (Slovak) 2023-12-18 16:57:02 +01:00
Excalidraw Bot
72a525063a New translations en.json (Russian) 2023-12-18 16:57:01 +01:00
Excalidraw Bot
0484b8db51 New translations en.json (Portuguese) 2023-12-18 16:56:59 +01:00
Excalidraw Bot
c63781abe3 New translations en.json (Polish) 2023-12-18 16:56:58 +01:00
Excalidraw Bot
b496e68bf9 New translations en.json (Punjabi) 2023-12-18 16:56:57 +01:00
Excalidraw Bot
d0df605151 New translations en.json (Dutch) 2023-12-18 16:56:56 +01:00
Excalidraw Bot
0796621702 New translations en.json (Lithuanian) 2023-12-18 16:56:55 +01:00
Excalidraw Bot
d883fa7cc0 New translations en.json (Kurdish) 2023-12-18 16:56:54 +01:00
Excalidraw Bot
bf68b8b3b2 New translations en.json (Korean) 2023-12-18 16:56:53 +01:00
Excalidraw Bot
8136962237 New translations en.json (Japanese) 2023-12-18 16:56:52 +01:00
Excalidraw Bot
b8a62be016 New translations en.json (Italian) 2023-12-18 16:56:51 +01:00
Excalidraw Bot
f86bc0fab9 New translations en.json (Hungarian) 2023-12-18 16:56:50 +01:00
Excalidraw Bot
422941f260 New translations en.json (Hebrew) 2023-12-18 16:56:49 +01:00
Excalidraw Bot
b839775904 New translations en.json (Finnish) 2023-12-18 16:56:47 +01:00
Excalidraw Bot
69de41c981 New translations en.json (Basque) 2023-12-18 16:56:46 +01:00
Excalidraw Bot
037dfadbc2 New translations en.json (Greek) 2023-12-18 16:56:45 +01:00
Excalidraw Bot
d6a512f05b New translations en.json (German) 2023-12-18 16:56:44 +01:00
Excalidraw Bot
c2f83885cb New translations en.json (Danish) 2023-12-18 16:56:43 +01:00
Excalidraw Bot
4c8f41f312 New translations en.json (Czech) 2023-12-18 16:56:42 +01:00
Excalidraw Bot
93d66a7958 New translations en.json (Catalan) 2023-12-18 16:56:41 +01:00
Excalidraw Bot
8dce1413b9 New translations en.json (Bulgarian) 2023-12-18 16:56:39 +01:00
Excalidraw Bot
e4fdab7c96 New translations en.json (Arabic) 2023-12-18 16:56:38 +01:00
Excalidraw Bot
2a748aa76a New translations en.json (Spanish) 2023-12-18 16:56:37 +01:00
Excalidraw Bot
d8049f3843 New translations en.json (French) 2023-12-18 16:56:36 +01:00
Excalidraw Bot
d9edc2e30d New translations en.json (Romanian) 2023-12-18 16:56:35 +01:00
Excalidraw Bot
f8c48e44e0 Auto commit: Calculate translation coverage 2023-12-13 11:32:16 +00:00
Excalidraw Bot
f37bc01fe7 New translations en.json (Polish) 2023-12-13 12:32:03 +01:00
Excalidraw Bot
ae460c569a Auto commit: Calculate translation coverage 2023-12-13 10:07:05 +00:00
Excalidraw Bot
1e535dd779 New translations en.json (Hindi) 2023-12-13 11:06:51 +01:00
Excalidraw Bot
ea8f5a124e New translations en.json (Marathi) 2023-12-13 11:06:49 +01:00
Excalidraw Bot
93ad17baa7 Auto commit: Calculate translation coverage 2023-12-13 06:16:20 +00:00
Excalidraw Bot
b933ddb315 New translations en.json (Marathi) 2023-12-13 07:16:04 +01:00
Excalidraw Bot
e010d12752 New translations en.json (Portuguese, Brazilian) 2023-12-13 07:16:03 +01:00
Excalidraw Bot
3e4c51ebf9 Auto commit: Calculate translation coverage 2023-12-13 05:08:26 +00:00
Excalidraw Bot
58df7cfe70 New translations en.json (Marathi) 2023-12-13 06:08:08 +01:00
Excalidraw Bot
b5ec37b698 Auto commit: Calculate translation coverage 2023-12-12 18:31:08 +00:00
Excalidraw Bot
624f17bd3c New translations en.json (German) 2023-12-12 19:30:51 +01:00
Excalidraw Bot
744525dcaf Auto commit: Calculate translation coverage 2023-12-12 15:18:00 +00:00
Excalidraw Bot
05190598bc New translations en.json (Spanish) 2023-12-12 16:17:43 +01:00
Excalidraw Bot
da6f52a155 Auto commit: Calculate translation coverage 2023-12-12 14:11:43 +00:00
Excalidraw Bot
e5d639270e New translations en.json (Slovenian) 2023-12-12 15:11:28 +01:00
Excalidraw Bot
11da1e5b30 New translations en.json (Spanish) 2023-12-12 15:11:27 +01:00
Excalidraw Bot
7cfc7c7811 Auto commit: Calculate translation coverage 2023-12-12 13:02:31 +00:00
Excalidraw Bot
cf6af5e70d New translations en.json (Chinese Traditional) 2023-12-12 14:02:16 +01:00
Excalidraw Bot
898dfff1a0 Auto commit: Calculate translation coverage 2023-12-12 11:29:53 +00:00
Excalidraw Bot
2660e4edde New translations en.json (Karakalpak) 2023-12-12 12:29:43 +01:00
Excalidraw Bot
8e05ff0c32 New translations en.json (Occitan) 2023-12-12 12:29:41 +01:00
Excalidraw Bot
c4cb94bff8 New translations en.json (Norwegian Bokmal) 2023-12-12 12:29:40 +01:00
Excalidraw Bot
10ee9c4019 New translations en.json (Hindi) 2023-12-12 12:29:37 +01:00
Excalidraw Bot
042bcf0638 New translations en.json (Azerbaijani) 2023-12-12 12:29:36 +01:00
Excalidraw Bot
8c30adaf10 New translations en.json (Norwegian Nynorsk) 2023-12-12 12:29:33 +01:00
Excalidraw Bot
2fcd49791e New translations en.json (Thai) 2023-12-12 12:29:32 +01:00
Excalidraw Bot
ae0c96b66c New translations en.json (Marathi) 2023-12-12 12:29:31 +01:00
Excalidraw Bot
c195bb0739 New translations en.json (Tamil) 2023-12-12 12:29:29 +01:00
Excalidraw Bot
6de5305e72 New translations en.json (Khmer) 2023-12-12 12:29:28 +01:00
Excalidraw Bot
ca1d426fc0 New translations en.json (Persian) 2023-12-12 12:29:27 +01:00
Excalidraw Bot
4fd311364a New translations en.json (Indonesian) 2023-12-12 12:29:26 +01:00
Excalidraw Bot
9d6180e2fd New translations en.json (Portuguese, Brazilian) 2023-12-12 12:29:25 +01:00
Excalidraw Bot
eeeb7e4ed9 New translations en.json (Galician) 2023-12-12 12:29:24 +01:00
Excalidraw Bot
9c248e8ae9 New translations en.json (Vietnamese) 2023-12-12 12:29:23 +01:00
Excalidraw Bot
d579328746 New translations en.json (Chinese Traditional) 2023-12-12 12:29:22 +01:00
Excalidraw Bot
3b3cfc391e New translations en.json (Chinese Simplified) 2023-12-12 12:29:21 +01:00
Excalidraw Bot
222fa328ba New translations en.json (Ukrainian) 2023-12-12 12:29:20 +01:00
Excalidraw Bot
a83498fc61 New translations en.json (Turkish) 2023-12-12 12:29:19 +01:00
Excalidraw Bot
0bd531b612 New translations en.json (Swedish) 2023-12-12 12:29:18 +01:00
Excalidraw Bot
b9b35833d3 New translations en.json (Slovenian) 2023-12-12 12:29:16 +01:00
Excalidraw Bot
eac2a23d72 New translations en.json (Slovak) 2023-12-12 12:29:15 +01:00
Excalidraw Bot
641a766607 New translations en.json (Russian) 2023-12-12 12:29:14 +01:00
Excalidraw Bot
bf38bd6620 New translations en.json (Portuguese) 2023-12-12 12:29:13 +01:00
Excalidraw Bot
775e551c3d New translations en.json (Polish) 2023-12-12 12:29:12 +01:00
Excalidraw Bot
909cc53c3a New translations en.json (Punjabi) 2023-12-12 12:29:11 +01:00
Excalidraw Bot
99e5542f03 New translations en.json (Dutch) 2023-12-12 12:29:10 +01:00
Excalidraw Bot
96b8340210 New translations en.json (Kurdish) 2023-12-12 12:29:08 +01:00
Excalidraw Bot
f92d025434 New translations en.json (Korean) 2023-12-12 12:29:07 +01:00
Excalidraw Bot
bbbed516f2 New translations en.json (Japanese) 2023-12-12 12:29:06 +01:00
Excalidraw Bot
c86a878a75 New translations en.json (Italian) 2023-12-12 12:29:05 +01:00
Excalidraw Bot
6676f24c4f New translations en.json (Hungarian) 2023-12-12 12:29:04 +01:00
Excalidraw Bot
e2e336bd95 New translations en.json (Basque) 2023-12-12 12:29:01 +01:00
Excalidraw Bot
c5ec66e585 New translations en.json (Greek) 2023-12-12 12:29:00 +01:00
Excalidraw Bot
a0c7aae672 New translations en.json (German) 2023-12-12 12:28:59 +01:00
Excalidraw Bot
95c8418dee New translations en.json (Danish) 2023-12-12 12:28:58 +01:00
Excalidraw Bot
21f5934e44 New translations en.json (Czech) 2023-12-12 12:28:57 +01:00
Excalidraw Bot
d6e2936bf8 New translations en.json (Catalan) 2023-12-12 12:28:56 +01:00
Excalidraw Bot
0aa1b62108 New translations en.json (Bulgarian) 2023-12-12 12:28:55 +01:00
Excalidraw Bot
c7c41155f6 New translations en.json (Arabic) 2023-12-12 12:28:54 +01:00
Excalidraw Bot
492a643506 New translations en.json (Spanish) 2023-12-12 12:28:52 +01:00
Excalidraw Bot
1cc8ad6ed9 New translations en.json (French) 2023-12-12 12:28:51 +01:00
Excalidraw Bot
8f57c10d9b New translations en.json (Romanian) 2023-12-12 12:28:50 +01:00
727 changed files with 85690 additions and 50295 deletions

View File

@@ -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/
@@ -8,7 +10,7 @@ VITE_APP_LIBRARY_BACKEND=https://us-central1-excalidraw-room-persistence.cloudfu
VITE_APP_WS_SERVER_URL=http://localhost:3002
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:3015
@@ -37,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=

View File

@@ -1,3 +1,5 @@
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/
@@ -15,3 +17,18 @@ 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_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

View File

@@ -1,8 +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",
"@typescript-eslint/consistent-type-imports": ["error", { "prefer": "type-imports", "disallowTypeAnnotations": false, "fixStyle": "separate-type-imports" }]
"@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
.github/copilot-instructions.md vendored Normal file
View File

@@ -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}

View File

@@ -24,4 +24,4 @@ jobs:
- name: Auto release
run: |
yarn add @actions/core -W
yarn autorelease
yarn release --tag=next --non-interactive

View File

@@ -1,55 +0,0 @@
name: Auto release excalidraw preview
on:
issue_comment:
types: [created, edited]
jobs:
Auto-release-excalidraw-preview:
name: Auto release preview
if: github.event.comment.body == '@excalibot trigger release' && github.event.issue.pull_request
runs-on: ubuntu-latest
steps:
- name: React to release comment
uses: peter-evans/create-or-update-comment@v1
with:
token: ${{ secrets.PUSH_TRANSLATIONS_COVERAGE_PAT }}
comment-id: ${{ github.event.comment.id }}
reactions: "+1"
- name: Get PR SHA
id: sha
uses: actions/github-script@v4
with:
result-encoding: string
script: |
const { owner, repo, number } = context.issue;
const pr = await github.pulls.get({
owner,
repo,
pull_number: number,
});
return pr.data.head.sha
- uses: actions/checkout@v2
with:
ref: ${{ steps.sha.outputs.result }}
fetch-depth: 2
- name: Setup Node.js 18.x
uses: actions/setup-node@v2
with:
node-version: 18.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 preview
id: "autorelease"
run: |
yarn add @actions/core -W
yarn autorelease preview ${{ github.event.issue.number }}
- name: Post comment post release
if: always()
uses: peter-evans/create-or-update-comment@v1
with:
token: ${{ secrets.PUSH_TRANSLATIONS_COVERAGE_PAT }}
issue-number: ${{ github.event.issue.number }}
body: "@${{ github.event.comment.user.login }} ${{ steps.autorelease.outputs.result }}"

View File

@@ -10,7 +10,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
with:
token: ${{ secrets.PUSH_TRANSLATIONS_COVERAGE_PAT }}

View File

@@ -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

View File

@@ -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 }}

4
.gitignore vendored
View File

@@ -25,5 +25,5 @@ packages/excalidraw/types
coverage
dev-dist
html
examples/**/bundle.*
meta*.json
meta*.json
.claude

34
CLAUDE.md Normal file
View File

@@ -0,0 +1,34 @@
# CLAUDE.md
## Project Structure
Excalidraw is a **monorepo** with a clear separation between the core library and the application:
- **`packages/excalidraw/`** - Main React component library published to npm as `@excalidraw/excalidraw`
- **`excalidraw-app/`** - Full-featured web application (excalidraw.com) that uses the library
- **`packages/`** - Core packages: `@excalidraw/common`, `@excalidraw/element`, `@excalidraw/math`, `@excalidraw/utils`
- **`examples/`** - Integration examples (NextJS, browser script)
## Development Workflow
1. **Package Development**: Work in `packages/*` for editor features
2. **App Development**: Work in `excalidraw-app/` for app-specific features
3. **Testing**: Always run `yarn test:update` before committing
4. **Type Safety**: Use `yarn test:typecheck` to verify TypeScript
## Development Commands
```bash
yarn test:typecheck # TypeScript type checking
yarn test:update # Run all tests (with snapshot updates)
yarn fix # Auto-fix formatting and linting issues
```
## Architecture Notes
### Package System
- Uses Yarn workspaces for monorepo management
- Internal packages use path aliases (see `vitest.config.mts`)
- Build system uses esbuild for packages, Vite for the app
- TypeScript throughout with strict configuration

View File

@@ -1,4 +1,4 @@
FROM node:18 AS build
FROM --platform=${BUILDPLATFORM} node:18 AS build
WORKDIR /opt/node_app
@@ -6,13 +6,14 @@ COPY . .
# do not ignore optional dependencies:
# Error: Cannot find module @rollup/rollup-linux-x64-gnu
RUN yarn --network-timeout 600000
RUN --mount=type=cache,target=/root/.cache/yarn \
npm_config_target_arch=${TARGETARCH} yarn --network-timeout 600000
ARG NODE_ENV=production
RUN yarn build:app:docker
RUN npm_config_target_arch=${TARGETARCH} yarn build:app:docker
FROM nginx:1.27-alpine
FROM --platform=${TARGETPLATFORM} nginx:1.27-alpine
COPY --from=build /opt/node_app/excalidraw-app/build /usr/share/nginx/html

View File

@@ -7,7 +7,7 @@
<h4 align="center">
<a href="https://excalidraw.com">Excalidraw Editor</a> |
<a href="https://blog.excalidraw.com">Blog</a> |
<a href="https://plus.excalidraw.com/blog">Blog</a> |
<a href="https://docs.excalidraw.com">Documentation</a> |
<a href="https://plus.excalidraw.com">Excalidraw+</a>
</h4>
@@ -34,6 +34,9 @@
<a href="https://discord.gg/UexuTaE">
<img alt="Chat on Discord" src="https://img.shields.io/discord/723672430744174682?color=738ad6&label=Chat%20on%20Discord&logo=discord&logoColor=ffffff&widge=false"/>
</a>
<a href="https://deepwiki.com/excalidraw/excalidraw">
<img alt="Ask DeepWiki" src="https://deepwiki.com/badge.svg" />
</a>
<a href="https://twitter.com/excalidraw">
<img alt="Follow Excalidraw on Twitter" src="https://img.shields.io/twitter/follow/excalidraw.svg?label=follow+@excalidraw&style=social&logo=twitter"/>
</a>
@@ -63,7 +66,7 @@ The Excalidraw editor (npm package) supports:
- 🏗️&nbsp;Customizable.
- 📷&nbsp;Image support.
- 😀&nbsp;Shape libraries support.
- 👅&nbsp;Localization (i18n) support.
- 🌐&nbsp;Localization (i18n) support.
- 🖼️&nbsp;Export to PNG, SVG & clipboard.
- 💾&nbsp;Open format - export drawings as an `.excalidraw` json file.
- ⚒️&nbsp;Wide range of tools - rectangle, circle, diamond, arrow, line, free-draw, eraser...
@@ -87,13 +90,11 @@ We'll be adding these features as drop-in plugins for the npm package in the fut
**Note:** following instructions are for installing the Excalidraw [npm package](https://www.npmjs.com/package/@excalidraw/excalidraw) when integrating Excalidraw into your own app. To run the repository locally for development, please refer to our [Development Guide](https://docs.excalidraw.com/docs/introduction/development).
```
Use `npm` or `yarn` to install the package.
```bash
npm install react react-dom @excalidraw/excalidraw
```
or via yarn
```
# or
yarn add react react-dom @excalidraw/excalidraw
```

View File

@@ -2,7 +2,7 @@
Earlier we were using `renderFooter` prop to render custom footer which was removed in [#5970](https://github.com/excalidraw/excalidraw/pull/5970). Now you can pass a `Footer` component instead to render the custom UI for footer.
You will need to import the `Footer` component from the package and wrap your component with the Footer component. The `Footer` should a valid React Node.
You will need to import the `Footer` component from the package and wrap your component with the Footer component. The `Footer` should be a valid React Node.
**Usage**
@@ -25,7 +25,7 @@ function App() {
}
```
This will only for `Desktop` devices.
This will only work for `Desktop` devices.
For `mobile` you will need to render it inside the [MainMenu](#mainmenu). You can use the [`useDevice`](#useDevice) hook to check the type of device, this will be available only inside the `children` of `Excalidraw` component.
@@ -65,4 +65,4 @@ const App = () => (
// Need to render when code is span across multiple components
// in Live Code blocks editor
render(<App />);
```
```

View File

@@ -8,15 +8,15 @@
import { FONT_FAMILY } from "@excalidraw/excalidraw";
```
`FONT_FAMILY` contains all the font families used in `Excalidraw` as explained below
`FONT_FAMILY` contains all the font families used in `Excalidraw`. The default families are the following:
| Font Family | Description |
| ----------- | ---------------------- |
| `Virgil` | The `Hand-drawn` font |
| `Helvetica` | The `Normal` Font |
| `Cascadia` | The `Code` Font |
| `Excalifont` | The `Hand-drawn` font |
| `Nunito` | The `Normal` Font |
| `Comic Shanns` | The `Code` Font |
Defaults to `FONT_FAMILY.Virgil` unless passed in `initialData.appState.currentItemFontFamily`.
Pre-selected family is `FONT_FAMILY.Excalifont`, unless it's overriden with `initialData.appState.currentItemFontFamily`.
### THEME

View File

@@ -65,7 +65,7 @@ You can use this function to update the scene with the sceneData. It accepts the
| `elements` | [`ImportedDataState["elements"]`](https://github.com/excalidraw/excalidraw/blob/master/packages/excalidraw/data/types.ts#L38) | The `elements` to be updated in the scene |
| `appState` | [`ImportedDataState["appState"]`](https://github.com/excalidraw/excalidraw/blob/master/packages/excalidraw/data/types.ts#L39) | The `appState` to be updated in the scene. |
| `collaborators` | <code>Map<string, <a href="https://github.com/excalidraw/excalidraw/blob/master/packages/excalidraw/types.ts#L37">Collaborator></a></code> | The list of collaborators to be updated in the scene. |
| `commitToStore` | `boolean` | Implies if the change should be captured and commited to the `store`. Commited changes are emmitted and listened to by other components, such as `History` for undo / redo purposes. Defaults to `false`. |
| `captureUpdate` | [`CaptureUpdateAction`](https://github.com/excalidraw/excalidraw/blob/master/packages/excalidraw/store.ts#L40) | Controls which updates should be captured by the `Store`. Captured updates are emmitted and listened to by other components, such as `History` for undo / redo purposes. |
```jsx live
function App() {
@@ -105,6 +105,7 @@ function App() {
appState: {
viewBackgroundColor: "#edf2ff",
},
captureUpdate: CaptureUpdateAction.IMMEDIATELY,
};
excalidrawAPI.updateScene(sceneData);
};
@@ -121,6 +122,18 @@ function App() {
}
```
#### captureUpdate
You can use the `captureUpdate` to influence undo / redo behaviour.
> **NOTE**: Some updates are not observed by the store / history - i.e. updates to `collaborators` object or parts of `AppState` which are not observed (not `ObservedAppState`). Such updates will never make it to the undo / redo stacks, regardless of the passed `captureUpdate` value.
| | `captureUpdate` value | Notes |
| --- | --- | --- |
| _Immediately undoable_ | `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_ | `CaptureUpdateAction.EVENTUALLY` | 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_ | `CaptureUpdateAction.NEVER` | Use 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. |
### updateLibrary
<pre>
@@ -350,13 +363,7 @@ This API has the below signature. It sets the `tool` passed in param as the acti
```ts
(
tool: (
| (
| { type: Exclude<ToolType, "image"> }
| {
type: Extract<ToolType, "image">;
insertOnCanvasDirectly?: boolean;
}
)
| { type: ToolType }
| { type: "custom"; customType: string }
) & { locked?: boolean },
) => {};
@@ -364,7 +371,7 @@ This API has the below signature. It sets the `tool` passed in param as the acti
| Name | Type | Default | Description |
| --- | --- | --- | --- |
| `type` | [ToolType](https://github.com/excalidraw/excalidraw/blob/master/packages/excalidraw/types.ts#L91) | `selection` | The tool type which should be set as active tool. When setting `image` as active tool, the insertion onto canvas when using image tool is disabled by default, so you can enable it by setting `insertOnCanvasDirectly` to `true` |
| `type` | [ToolType](https://github.com/excalidraw/excalidraw/blob/master/packages/excalidraw/types.ts#L91) | `selection` | The tool type which should be set as active tool |
| `locked` | `boolean` | `false` | Indicates whether the the active tool should be locked. It behaves the same way when using the `lock` tool in the editor interface |
## setCursor

View File

@@ -5,31 +5,33 @@ All `props` are _optional_.
| Name | Type | Default | Description |
| --- | --- | --- | --- |
| [`initialData`](/docs/@excalidraw/excalidraw/api/props/initialdata) | `object` &#124; `null` &#124; <code>Promise<object &#124; null></code> | `null` | The initial data with which app loads. |
| [`excalidrawAPI`](/docs/@excalidraw/excalidraw/api/props/excalidraw-api) | `function` | _ | Callback triggered with the excalidraw api once rendered |
| [`isCollaborating`](#iscollaborating) | `boolean` | _ | This indicates if the app is in `collaboration` mode |
| [`onChange`](#onchange) | `function` | _ | This callback is triggered whenever the component updates due to any change. This callback will receive the excalidraw `elements` and the current `app state`. |
| [`onPointerUpdate`](#onpointerupdate) | `function` | _ | Callback triggered when mouse pointer is updated. |
| [`onPointerDown`](#onpointerdown) | `function` | _ | This prop if passed gets triggered on pointer down events |
| [`onScrollChange`](#onscrollchange) | `function` | _ | This prop if passed gets triggered when scrolling the canvas. |
| [`onPaste`](#onpaste) | `function` | _ | Callback to be triggered if passed when something is pasted into the scene |
| [`onLibraryChange`](#onlibrarychange) | `function` | _ | The callback if supplied is triggered when the library is updated and receives the library items. |
| [`onLinkOpen`](#onlinkopen) | `function` | _ | The callback if supplied is triggered when any link is opened. |
| [`excalidrawAPI`](/docs/@excalidraw/excalidraw/api/props/excalidraw-api) | `function` | \_ | Callback triggered with the excalidraw api once rendered |
| [`isCollaborating`](#iscollaborating) | `boolean` | \_ | This indicates if the app is in `collaboration` mode |
| [`onChange`](#onchange) | `function` | \_ | This callback is triggered whenever the component updates due to any change. This callback will receive the excalidraw `elements` and the current `app state`. |
| [`onPointerUpdate`](#onpointerupdate) | `function` | \_ | Callback triggered when mouse pointer is updated. |
| [`onPointerDown`](#onpointerdown) | `function` | \_ | This prop if passed gets triggered on pointer down events |
| [`onScrollChange`](#onscrollchange) | `function` | \_ | This prop if passed gets triggered when scrolling the canvas. |
| [`onPaste`](#onpaste) | `function` | \_ | Callback to be triggered if passed when something is pasted into the scene |
| [`onLibraryChange`](#onlibrarychange) | `function` | \_ | The callback if supplied is triggered when the library is updated and receives the library items. |
| [`generateLinkForSelection`](#generatelinkforselection) | `function` | \_ | Allows you to override `url` generation when linking to Excalidraw elements. |
| [`onLinkOpen`](#onlinkopen) | `function` | \_ | The callback if supplied is triggered when any link is opened. |
| [`langCode`](#langcode) | `string` | `en` | Language code string to be used in Excalidraw |
| [`renderTopRightUI`](/docs/@excalidraw/excalidraw/api/props/render-props#rendertoprightui) | `function` | _ | Render function that renders custom UI in top right corner |
| [`renderCustomStats`](/docs/@excalidraw/excalidraw/api/props/render-props#rendercustomstats) | `function` | _ | Render function that can be used to render custom stats on the stats dialog. |
| [`viewModeEnabled`](#viewmodeenabled) | `boolean` | _ | This indicates if the app is in `view` mode. |
| [`zenModeEnabled`](#zenmodeenabled) | `boolean` | _ | This indicates if the `zen` mode is enabled |
| [`gridModeEnabled`](#gridmodeenabled) | `boolean` | _ | This indicates if the `grid` mode is enabled |
| [`libraryReturnUrl`](#libraryreturnurl) | `string` | _ | What URL should [libraries.excalidraw.com](https://libraries.excalidraw.com) be installed to |
| [`renderTopRightUI`](/docs/@excalidraw/excalidraw/api/props/render-props#rendertoprightui) | `function` | \_ | Render function that renders custom UI in top right corner |
| [`renderCustomStats`](/docs/@excalidraw/excalidraw/api/props/render-props#rendercustomstats) | `function` | \_ | Render function that can be used to render custom stats on the stats dialog. |
| [`viewModeEnabled`](#viewmodeenabled) | `boolean` | \_ | This indicates if the app is in `view` mode. |
| [`zenModeEnabled`](#zenmodeenabled) | `boolean` | \_ | This indicates if the `zen` mode is enabled |
| [`gridModeEnabled`](#gridmodeenabled) | `boolean` | \_ | This indicates if the `grid` mode is enabled |
| [`libraryReturnUrl`](#libraryreturnurl) | `string` | \_ | What URL should [libraries.excalidraw.com](https://libraries.excalidraw.com) be installed to |
| [`theme`](#theme) | `"light"` &#124; `"dark"` | `"light"` | The theme of the Excalidraw component |
| [`name`](#name) | `string` | | Name of the drawing |
| [`UIOptions`](/docs/@excalidraw/excalidraw/api/props/ui-options) | `object` | [DEFAULT UI OPTIONS](https://github.com/excalidraw/excalidraw/blob/master/packages/excalidraw/constants.ts#L151) | To customise UI options. Currently we support customising [`canvas actions`](/docs/@excalidraw/excalidraw/api/props/ui-options#canvasactions) |
| [`detectScroll`](#detectscroll) | `boolean` | `true` | Indicates whether to update the offsets when nearest ancestor is scrolled. |
| [`handleKeyboardGlobally`](#handlekeyboardglobally) | `boolean` | `false` | Indicates whether to bind the keyboard events to document. |
| [`autoFocus`](#autofocus) | `boolean` | `false` | Indicates whether to focus the Excalidraw component on page load |
| [`generateIdForFile`](#generateidforfile) | `function` | _ | Allows you to override `id` generation for files added on canvas |
| [`validateEmbeddable`](#validateEmbeddable) | string[] | `boolean | RegExp | RegExp[] | ((link: string) => boolean | undefined)` | \_ | use for custom src url validation |
| [`generateIdForFile`](#generateidforfile) | `function` | \_ | Allows you to override `id` generation for files added on canvas |
| [`validateEmbeddable`](#validateembeddable) | `string[]` \| `boolean` \| `RegExp` \| `RegExp[]` \| <code>((link: string) => boolean &#124; undefined)</code> | \_ | use for custom src url validation |
| [`renderEmbeddable`](/docs/@excalidraw/excalidraw/api/props/render-props#renderEmbeddable) | `function` | \_ | Render function that can override the built-in `<iframe>` |
| [`renderScrollbars`] | `boolean`| | `false` | Indicates whether scrollbars will be shown
### Storing custom data on Excalidraw elements
@@ -93,9 +95,8 @@ This callback is triggered when mouse pointer is updated.
This prop if passed will be triggered on pointer down events and has the below signature.
<pre>
(activeTool:{" "}
(activeTool:{" "}
<a href="https://github.com/excalidraw/excalidraw/blob/master/packages/excalidraw/types.ts#L115">
{" "}
AppState["activeTool"]
@@ -143,6 +144,14 @@ This callback if supplied will get triggered when the library is updated and has
It is invoked with empty items when user clears the library. You can use this callback when you want to do something additional when library is updated for example persisting it to local storage.
### generateLinkForSelection
This prop if passed will be used to replace the default link generation function. The idea is that the host app can take over the creation of element links, which can be used to navigate to a particular element or a group. If the host app chooses a different key for element link id, then the host app should also take care of the handling and the navigation in `onLinkOpen`.
```tsx
(id: string, type: "element" | "group") => string;
```
### onLinkOpen
This prop if passed will be triggered when clicked on `link`. To handle the redirect yourself (such as when using your own router for internal links), you must call `event.preventDefault()`.
@@ -207,8 +216,7 @@ This prop indicates whether the shows the grid. When supplied, the value takes p
### libraryReturnUrl
If supplied, this URL will be used when user tries to install a library from [libraries.excalidraw.com](https://libraries.excalidraw.com).
Defaults to _window.location.origin + window.location.pathname_. To install the libraries in the same tab from which it was opened, you need to set `window.name` (to any alphanumeric string) — if it's not set it will open in a new tab.
If supplied, this URL will be used when user tries to install a library from [libraries.excalidraw.com](https://libraries.excalidraw.com). Defaults to _window.location.origin + window.location.pathname_. To install the libraries in the same tab from which it was opened, you need to set `window.name` (to any alphanumeric string) — if it's not set it will open in a new tab.
### theme
@@ -220,7 +228,6 @@ You can use [`THEME`](/docs/@excalidraw/excalidraw/api/utils#theme) to specify t
This prop sets the `name` of the drawing which will be used when exporting the drawing. When supplied, the value takes precedence over _intialData.appState.name_, the `name` will be fully controlled by host app and the users won't be able to edit from within Excalidraw.
### detectScroll
Indicates whether Excalidraw should listen for `scroll` event on the nearest scrollable container in the DOM tree and recompute the coordinates (e.g. to correctly handle the cursor) when the component's position changes. You can disable this when you either know this doesn't affect your app or you want to take care of it yourself (calling the [`refresh()`](#ref) method).

View File

@@ -31,7 +31,7 @@ You can pass `null` / `undefined` if not applicable.
restoreElements(
elements: <a href="https://github.com/excalidraw/excalidraw/blob/master/packages/excalidraw/element/types.ts#L114">ImportedDataState["elements"]</a>,<br/>&nbsp;
localElements: <a href="https://github.com/excalidraw/excalidraw/blob/master/packages/excalidraw/element/types.ts#L114">ExcalidrawElement[]</a> | null | undefined): <a href="https://github.com/excalidraw/excalidraw/blob/master/packages/excalidraw/element/types.ts#L114">ExcalidrawElement[]</a>,<br/>&nbsp;
opts: &#123; refreshDimensions?: boolean, repairBindings?: boolean }<br/>
opts: &#123; refreshDimensions?: boolean, repairBindings?: boolean, normalizeIndices?: boolean }<br/>
)
</pre>
@@ -51,8 +51,9 @@ The extra optional parameter to configure restored elements. It has the followin
| Prop | Type | Description|
| --- | --- | ------|
| `refreshDimensions` | `boolean` | Indicates whether we should also `recalculate` text element dimensions. Since this is a potentially costly operation, you may want to disable it if you restore elements in tight loops, such as during collaboration. |
| `repairBindings` |`boolean` | Indicates whether the `bindings` for the elements should be repaired. This is to make sure there are no containers with non existent bound text element id and no bound text elements with non existent container id. |
| `refreshDimensions` | `boolean` | Indicates whether we should also _recalculate_ text element dimensions. Since this is a potentially costly operation, you may want to disable it if you restore elements in tight loops, such as during collaboration. |
| `repairBindings` |`boolean` | Indicates whether the _bindings_ for the elements should be repaired. This is to make sure there are no containers with non existent bound text element id and no bound text elements with non existent container id. |
| `normalizeIndices` |`boolean` | Indicates whether _fractional indices_ for the elements should be normalized. This is to prevent possible issues caused by using stale (too old, too long) indices. |
**_How to use_**
@@ -73,7 +74,7 @@ restore(
data: <a href="https://github.com/excalidraw/excalidraw/blob/master/packages/excalidraw/data/types.ts#L34">ImportedDataState</a>,<br/>&nbsp;
localAppState: Partial&lt;<a href="https://github.com/excalidraw/excalidraw/blob/master/packages/excalidraw/types.ts#L95">AppState</a>> | null | undefined,<br/>&nbsp;
localElements: <a href="https://github.com/excalidraw/excalidraw/blob/master/packages/excalidraw/element/types.ts#L114">ExcalidrawElement[]</a> | null | undefined<br/>): <a href="https://github.com/excalidraw/excalidraw/blob/master/packages/excalidraw/data/types.ts#L4">DataState</a><br/>
opts: &#123; refreshDimensions?: boolean, repairBindings?: boolean }<br/>
opts: &#123; refreshDimensions?: boolean, repairBindings?: boolean, normalizeIndices?: boolean }<br/>
)
</pre>

View File

@@ -13,47 +13,27 @@ To start the example app using the `@excalidraw/excalidraw` package, follow the
1. Install the dependencies
```bash
cd packages/excalidraw && yarn
yarn
```
2. Start the example app
```bash
yarn start
yarn start:example
```
[http://localhost:3001](http://localhost:3001) will open in your default browser.
The example is same as the [codesandbox example](https://ehlz3.csb.app/)
This is the same example as the [CodeSandbox](https://codesandbox.io/p/sandbox/github/excalidraw/excalidraw/tree/master/examples/with-script-in-browser) example.
## Releasing
### Create a test release
You can create a test release by posting the below comment in your pull request:
```bash
@excalibot trigger release
```
Once the version is released `@excalibot` will post a comment with the release version.
### Creating a production release
To release the next stable version follow the below steps:
```bash
yarn prerelease:excalidraw
yarn release --tag=latest --version=0.19.0
```
You need to pass the `version` for which you want to create the release. This will make the changes needed before making the release like updating `package.json`, `changelog` and more.
The next step is to run the `release` script:
```bash
yarn release:excalidraw
```
This will publish the package.
Right now there are two steps to create a production release but once this works fine these scripts will be combined and more automation will be done.
You will need to pass the `latest` tag with `version` for which you want to create the release. This will make the changes needed before publishing the packages into NPM, like updating dependencies of all `@excalidraw/*` packages, generating new entries in `CHANGELOG.md` and more.

View File

@@ -17,11 +17,9 @@ We strongly recommend turning it off. You can follow the steps below on how to d
<div style={{width:'30rem'}}>
2. Once opened, look for **Aggressively Block Fingerprinting**
![Aggressive block fingerprinting](../../assets/aggressive-block-fingerprint.png)
3. Switch to **Block Fingerprinting**
![Block filtering](../../assets/block-fingerprint.png)
4. Thats all. All text elements should be fixed now 🎉

View File

@@ -1,16 +1,12 @@
# Installation
**Excalidraw** is published to npm as a component you can directly embed in your projects.
**Excalidraw** is exported as a component to be directly embedded in your project.
Using `npm`:
Use `npm` or `yarn` to install the package.
```bash
npm install react react-dom @excalidraw/excalidraw
```
or `yarn`:
```bash
# or
yarn add react react-dom @excalidraw/excalidraw
```
@@ -20,24 +16,40 @@ yarn add react react-dom @excalidraw/excalidraw
:::
### Static assets
### Self-hosting fonts
Excalidraw depends on assets such as localization files (if you opt to use them), fonts, and others.
By default, Excalidraw will try to download all the used fonts from the [CDN](https://esm.run/@excalidraw/excalidraw/dist/prod).
By default these assets are loaded from a public CDN [`https://unpkg.com/@excalidraw/excalidraw/dist/`](https://unpkg.com/@excalidraw/excalidraw/dist), so you don't need to do anything on your end.
However, if you want to host these files yourself, you can find them in your `node_modules/@excalidraw/excalidraw/dist` directory, in folders `excalidraw-assets` (for production) and `excalidraw-assets-dev` (for development).
Copy these folders to your static assets directory, and add a `window.EXCALIDRAW_ASSET_PATH` variable in your `index.html` or `index.js` entry file pointing to your public assets path (relative). For example, if you serve your assets from the root of your hostname, you would do:
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:
```js
window.EXCALIDRAW_ASSET_PATH = "/";
```
or, if you serve your assets from the root of your CDN, you would do:
```js
// Vanilla
<head>
<script>
window.EXCALIDRAW_ASSET_PATH = "https://my.cdn.com/assets/";
</script>
</head>
```
or, if you prefer the path to be dynamicly set based on the `location.origin`, you could do the following:
```jsx
// Next.js
<Script id="load-env-variables" strategy="beforeInteractive" >
{ `window["EXCALIDRAW_ASSET_PATH"] = location.origin;` } // or use just "/"!
</Script>
```
### Dimensions of Excalidraw
Excalidraw takes _100%_ of `width` and `height` of the containing block so make sure the container in which you render Excalidraw has non zero dimensions.
### Demo
## Demo
[Try here](https://codesandbox.io/s/excalidraw-ehlz3).
Go to [CodeSandbox](https://codesandbox.io/p/sandbox/github/excalidraw/excalidraw/tree/master/examples/with-script-in-browser) example.

View File

@@ -12,7 +12,7 @@ import { Excalidraw } from "@excalidraw/excalidraw";
Throughout the documentation we use live, editable Excalidraw examples like the one shown below.
While we aim for the examples to closely reflect what you'd get if you rendered it yourself, we actually initialize it with some props behind the scenes.
While we aim for the examples to closely reflect what you'd get if you rendered it yourself, we actually initialize it with some props behind the scenes.
For example, we're passing a `theme` prop to it based on the current color theme of the docs you're just reading.
:::
@@ -38,6 +38,8 @@ If you want to only import `Excalidraw` component you can do :point_down:
```jsx showLineNumbers
import dynamic from "next/dynamic";
import "@excalidraw/excalidraw/index.css";
const Excalidraw = dynamic(
async () => (await import("@excalidraw/excalidraw")).Excalidraw,
{
@@ -70,9 +72,9 @@ If you are using `pages router` then importing the wrapper dynamically would wor
height: 141.9765625,
},]));
return (
<div style={{height:"500px", width:"500px"}}>
<div style={{height:"500px", width:"500px"}}>
<Excalidraw />
</div>
</div>
);
};
export default ExcalidrawWrapper;
@@ -84,8 +86,8 @@ If you are using `pages router` then importing the wrapper dynamically would wor
```jsx showLineNumbers
import dynamic from "next/dynamic";
// Since client components get prerenderd on server as well hence importing
// Since client components get prerenderd on server as well hence importing
// the excalidraw stuff dynamically with ssr false
const ExcalidrawWrapper = dynamic(
@@ -97,7 +99,7 @@ If you are using `pages router` then importing the wrapper dynamically would wor
export default function Page() {
return (
<ExcalidrawWrapper />
<ExcalidrawWrapper />
);
}
```
@@ -108,7 +110,7 @@ If you are using `pages router` then importing the wrapper dynamically would wor
```jsx showLineNumbers
import dynamic from "next/dynamic";
// Since client components get prerenderd on server as well hence importing
// Since client components get prerenderd on server as well hence importing
// the excalidraw stuff dynamically with ssr false
const ExcalidrawWrapper = dynamic(
@@ -128,11 +130,10 @@ If you are using `pages router` then importing the wrapper dynamically would wor
</TabItem>
</Tabs>
{/* Link should be updated to point to the latest! */}
Here is a [source code](https://github.com/excalidraw/excalidraw/tree/master/examples/with-nextjs) for the example with app and pages router. You you can try it out [here](https://excalidraw-package-example-with-nextjs.vercel.app/).
Here is a [source code](https://github.com/excalidraw/excalidraw/tree/master/examples/excalidraw/with-nextjs) for the example with app and pages router. You you can try it out [here](https://excalidraw-package-example-with-nextjs-gh6smrdnq-excalidraw.vercel.app/).
The `types` are available at `@excalidraw/excalidraw/types`, you can view [example for typescript](https://codesandbox.io/s/excalidraw-types-9h2dm)
The `types` are available at `@excalidraw/excalidraw/types`, check [CodeSandbox](https://codesandbox.io/p/sandbox/github/excalidraw/excalidraw/tree/master/examples/with-script-in-browser) example for details.
### Preact
@@ -153,31 +154,13 @@ Since Vite removes env variables by default, you can update the vite config to e
"process.env.IS_PREACT": JSON.stringify("true"),
},
```
:::
:::
## Browser
To use it in a browser directly:
To use it Excalidraw in a browser directly, use the following setup :point_down:
For development use :point_down:
```js
<script
type="text/javascript"
src="https://unpkg.com/@excalidraw/excalidraw/dist/excalidraw.development.js"
></script>
```
For production use :point_down:
```js
<script
type="text/javascript"
src="https://unpkg.com/@excalidraw/excalidraw/dist/excalidraw.production.min.js"
></script>
```
You will need to make sure `react`, `react-dom` is available as shown in the below example. For prod please use the production versions of `react`, `react-dom`.
> **Note**: We rely on import maps to de-duplicate `react`, `react-dom` and `react/jsx-runtime` versions.
import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";
@@ -191,13 +174,23 @@ import TabItem from "@theme/TabItem";
<head>
<title>Excalidraw in browser</title>
<meta charset="UTF-8" />
<script src="https://unpkg.com/react@18.2.0/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@18.2.0/umd/react-dom.development.js"></script>
<script
type="text/javascript"
src="https://unpkg.com/@excalidraw/excalidraw/dist/excalidraw.development.js"
></script>
<link
rel="stylesheet"
href="https://esm.sh/@excalidraw/excalidraw@0.18.0/dist/dev/index.css"
/>
<link rel="stylesheet" href="./index.css" />
<script>
window.EXCALIDRAW_ASSET_PATH = "https://esm.sh/@excalidraw/excalidraw@0.18.0/dist/prod/";
</script>
<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>
</head>
<body>
@@ -214,6 +207,14 @@ import TabItem from "@theme/TabItem";
<TabItem value="js" label="Javascript">
```js showLineNumbers
// See https://www.npmjs.com/package/@excalidraw/excalidraw documentation.
import * as ExcalidrawLib from 'https://esm.sh/@excalidraw/excalidraw@0.18.0/dist/dev/index.js?external=react,react-dom';
import React from "https://esm.sh/react@19.0.0";
import ReactDOM from "https://esm.sh/react-dom@19.0.0"
window.ExcalidrawLib = ExcalidrawLib;
console.log("Excalidraw library", ExcalidrawLib);
const App = () => {
return React.createElement(
React.Fragment,
@@ -235,3 +236,5 @@ root.render(React.createElement(App));
</TabItem>
</Tabs>
You can try it out [here](https://jsfiddle.net/vfn6dm14/3/).

View File

@@ -66,7 +66,7 @@ const config = {
label: "Docs",
},
{
to: "https://blog.excalidraw.com",
to: "https://plus.excalidraw.com/blog",
label: "Blog",
position: "left",
},
@@ -111,7 +111,7 @@ const config = {
items: [
{
label: "Blog",
to: "https://blog.excalidraw.com",
to: "https://plus.excalidraw.com/blog",
},
{
label: "GitHub",
@@ -149,6 +149,29 @@ const config = {
systemvars: true,
},
],
function () {
return {
name: "disable-fully-specified-error",
configureWebpack() {
return {
module: {
rules: [
{
test: /\.m?js$/,
resolve: {
fullySpecified: false,
},
},
],
},
optimization: {
// disable terser minification
minimize: false,
},
};
},
};
},
],
};

View File

@@ -18,7 +18,7 @@
"@docusaurus/core": "2.2.0",
"@docusaurus/preset-classic": "2.2.0",
"@docusaurus/theme-live-codeblock": "2.2.0",
"@excalidraw/excalidraw": "0.17.6",
"@excalidraw/excalidraw": "0.18.0",
"@mdx-js/react": "^1.6.22",
"clsx": "^1.2.1",
"docusaurus-plugin-sass": "0.2.3",

View File

@@ -1,5 +1,6 @@
import React from "react";
import clsx from "clsx";
import React from "react";
import styles from "./styles.module.css";
const FeatureList = [

View File

@@ -1,5 +1,6 @@
import React from "react";
import clsx from "clsx";
import React from "react";
import styles from "./styles.module.css";
type FeatureItem = {

View File

@@ -1,10 +1,11 @@
import React from "react";
import clsx from "clsx";
import Layout from "@theme/Layout";
import Link from "@docusaurus/Link";
import useDocusaurusContext from "@docusaurus/useDocusaurusContext";
import styles from "./index.module.css";
import HomepageFeatures from "@site/src/components/Homepage";
import Layout from "@theme/Layout";
import clsx from "clsx";
import React from "react";
import styles from "./index.module.css";
function HomepageHeader() {
const { siteConfig } = useDocusaurusContext();

View File

@@ -1,6 +1,6 @@
// Import the original mapper
import MDXComponents from "@theme-original/MDXComponents";
import Highlight from "@site/src/components/Highlight";
import MDXComponents from "@theme-original/MDXComponents";
export default {
// Re-use the default mapping

View File

@@ -3,11 +3,18 @@ import ExecutionEnvironment from "@docusaurus/ExecutionEnvironment";
import initialData from "@site/src/initialData";
import { useColorMode } from "@docusaurus/theme-common";
import "@excalidraw/excalidraw/index.css";
let ExcalidrawComp = {};
if (ExecutionEnvironment.canUseDOM) {
ExcalidrawComp = require("@excalidraw/excalidraw");
}
const Excalidraw = React.forwardRef((props, ref) => {
if (!window.EXCALIDRAW_ASSET_PATH) {
window.EXCALIDRAW_ASSET_PATH =
"https://esm.sh/@excalidraw/excalidraw@0.18.0/dist/prod/";
}
const { colorMode } = useColorMode();
return <ExcalidrawComp.Excalidraw theme={colorMode} {...props} ref={ref} />;
});
@@ -26,6 +33,7 @@ const ExcalidrawScope = {
initialData,
useI18n: ExcalidrawComp.useI18n,
convertToExcalidrawElements: ExcalidrawComp.convertToExcalidrawElements,
CaptureUpdateAction: ExcalidrawComp.CaptureUpdateAction,
};
export default ExcalidrawScope;

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,3 @@
version: "3.8"
services:
excalidraw:
build:

View File

@@ -1,13 +0,0 @@
{
"name": "examples",
"version": "1.0.0",
"private": true,
"dependencies": {
"react": "18.2.0",
"react-dom": "18.2.0",
"@excalidraw/excalidraw": "*"
},
"devDependencies": {
"typescript": "^5"
}
}

View File

@@ -1,3 +0,0 @@
{
"extends": "../../tsconfig"
}

View File

@@ -1,21 +0,0 @@
{
"name": "with-script-in-browser",
"version": "1.0.0",
"private": true,
"dependencies": {
"react": "18.2.0",
"react-dom": "18.2.0",
"@excalidraw/excalidraw": "*"
},
"devDependencies": {
"vite": "5.0.12",
"typescript": "^5"
},
"scripts": {
"build:workspace": "yarn workspace @excalidraw/excalidraw run build:esm && yarn copy:assets",
"copy:assets": "cp -r ../../../packages/excalidraw/dist/prod/fonts ./public",
"start": "yarn build:workspace && vite",
"build": "yarn build:workspace && vite build",
"build:preview": "yarn build && vite preview --port 5002"
}
}

View File

@@ -1,4 +0,0 @@
{
"outputDirectory": "dist",
"installCommand": "yarn install"
}

View File

@@ -1,11 +0,0 @@
import { defineConfig } from "vite";
// https://vitejs.dev/config/
export default defineConfig({
server: {
port: 3001,
// open the browser
open: true,
},
publicDir: "public",
});

View File

@@ -1,313 +0,0 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@esbuild/aix-ppc64@0.19.11":
version "0.19.11"
resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz#2acd20be6d4f0458bc8c784103495ff24f13b1d3"
integrity sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==
"@esbuild/android-arm64@0.19.11":
version "0.19.11"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz#b45d000017385c9051a4f03e17078abb935be220"
integrity sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==
"@esbuild/android-arm@0.19.11":
version "0.19.11"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.11.tgz#f46f55414e1c3614ac682b29977792131238164c"
integrity sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==
"@esbuild/android-x64@0.19.11":
version "0.19.11"
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.11.tgz#bfc01e91740b82011ef503c48f548950824922b2"
integrity sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==
"@esbuild/darwin-arm64@0.19.11":
version "0.19.11"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz#533fb7f5a08c37121d82c66198263dcc1bed29bf"
integrity sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==
"@esbuild/darwin-x64@0.19.11":
version "0.19.11"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz#62f3819eff7e4ddc656b7c6815a31cf9a1e7d98e"
integrity sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==
"@esbuild/freebsd-arm64@0.19.11":
version "0.19.11"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz#d478b4195aa3ca44160272dab85ef8baf4175b4a"
integrity sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==
"@esbuild/freebsd-x64@0.19.11":
version "0.19.11"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz#7bdcc1917409178257ca6a1a27fe06e797ec18a2"
integrity sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==
"@esbuild/linux-arm64@0.19.11":
version "0.19.11"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz#58ad4ff11685fcc735d7ff4ca759ab18fcfe4545"
integrity sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==
"@esbuild/linux-arm@0.19.11":
version "0.19.11"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz#ce82246d873b5534d34de1e5c1b33026f35e60e3"
integrity sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==
"@esbuild/linux-ia32@0.19.11":
version "0.19.11"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz#cbae1f313209affc74b80f4390c4c35c6ab83fa4"
integrity sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==
"@esbuild/linux-loong64@0.19.11":
version "0.19.11"
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz#5f32aead1c3ec8f4cccdb7ed08b166224d4e9121"
integrity sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==
"@esbuild/linux-mips64el@0.19.11":
version "0.19.11"
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz#38eecf1cbb8c36a616261de858b3c10d03419af9"
integrity sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==
"@esbuild/linux-ppc64@0.19.11":
version "0.19.11"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz#9c5725a94e6ec15b93195e5a6afb821628afd912"
integrity sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==
"@esbuild/linux-riscv64@0.19.11":
version "0.19.11"
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz#2dc4486d474a2a62bbe5870522a9a600e2acb916"
integrity sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==
"@esbuild/linux-s390x@0.19.11":
version "0.19.11"
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz#4ad8567df48f7dd4c71ec5b1753b6f37561a65a8"
integrity sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==
"@esbuild/linux-x64@0.19.11":
version "0.19.11"
resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz#b7390c4d5184f203ebe7ddaedf073df82a658766"
integrity sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==
"@esbuild/netbsd-x64@0.19.11":
version "0.19.11"
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz#d633c09492a1721377f3bccedb2d821b911e813d"
integrity sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==
"@esbuild/openbsd-x64@0.19.11":
version "0.19.11"
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz#17388c76e2f01125bf831a68c03a7ffccb65d1a2"
integrity sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==
"@esbuild/sunos-x64@0.19.11":
version "0.19.11"
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz#e320636f00bb9f4fdf3a80e548cb743370d41767"
integrity sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==
"@esbuild/win32-arm64@0.19.11":
version "0.19.11"
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz#c778b45a496e90b6fc373e2a2bb072f1441fe0ee"
integrity sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==
"@esbuild/win32-ia32@0.19.11":
version "0.19.11"
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz#481a65fee2e5cce74ec44823e6b09ecedcc5194c"
integrity sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==
"@esbuild/win32-x64@0.19.11":
version "0.19.11"
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz#a5d300008960bb39677c46bf16f53ec70d8dee04"
integrity sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==
"@rollup/rollup-android-arm-eabi@4.9.5":
version "4.9.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.5.tgz#b752b6c88a14ccfcbdf3f48c577ccc3a7f0e66b9"
integrity sha512-idWaG8xeSRCfRq9KpRysDHJ/rEHBEXcHuJ82XY0yYFIWnLMjZv9vF/7DOq8djQ2n3Lk6+3qfSH8AqlmHlmi1MA==
"@rollup/rollup-android-arm64@4.9.5":
version "4.9.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.5.tgz#33757c3a448b9ef77b6f6292d8b0ec45c87e9c1a"
integrity sha512-f14d7uhAMtsCGjAYwZGv6TwuS3IFaM4ZnGMUn3aCBgkcHAYErhV1Ad97WzBvS2o0aaDv4mVz+syiN0ElMyfBPg==
"@rollup/rollup-darwin-arm64@4.9.5":
version "4.9.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.5.tgz#5234ba62665a3f443143bc8bcea9df2cc58f55fb"
integrity sha512-ndoXeLx455FffL68OIUrVr89Xu1WLzAG4n65R8roDlCoYiQcGGg6MALvs2Ap9zs7AHg8mpHtMpwC8jBBjZrT/w==
"@rollup/rollup-darwin-x64@4.9.5":
version "4.9.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.5.tgz#981256c054d3247b83313724938d606798a919d1"
integrity sha512-UmElV1OY2m/1KEEqTlIjieKfVwRg0Zwg4PLgNf0s3glAHXBN99KLpw5A5lrSYCa1Kp63czTpVll2MAqbZYIHoA==
"@rollup/rollup-linux-arm-gnueabihf@4.9.5":
version "4.9.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.5.tgz#120678a5a2b3a283a548dbb4d337f9187a793560"
integrity sha512-Q0LcU61v92tQB6ae+udZvOyZ0wfpGojtAKrrpAaIqmJ7+psq4cMIhT/9lfV6UQIpeItnq/2QDROhNLo00lOD1g==
"@rollup/rollup-linux-arm64-gnu@4.9.5":
version "4.9.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.5.tgz#c99d857e2372ece544b6f60b85058ad259f64114"
integrity sha512-dkRscpM+RrR2Ee3eOQmRWFjmV/payHEOrjyq1VZegRUa5OrZJ2MAxBNs05bZuY0YCtpqETDy1Ix4i/hRqX98cA==
"@rollup/rollup-linux-arm64-musl@4.9.5":
version "4.9.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.5.tgz#3064060f568a5718c2a06858cd6e6d24f2ff8632"
integrity sha512-QaKFVOzzST2xzY4MAmiDmURagWLFh+zZtttuEnuNn19AiZ0T3fhPyjPPGwLNdiDT82ZE91hnfJsUiDwF9DClIQ==
"@rollup/rollup-linux-riscv64-gnu@4.9.5":
version "4.9.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.5.tgz#987d30b5d2b992fff07d055015991a57ff55fbad"
integrity sha512-HeGqmRJuyVg6/X6MpE2ur7GbymBPS8Np0S/vQFHDmocfORT+Zt76qu+69NUoxXzGqVP1pzaY6QIi0FJWLC3OPA==
"@rollup/rollup-linux-x64-gnu@4.9.5":
version "4.9.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.5.tgz#85946ee4d068bd12197aeeec2c6f679c94978a49"
integrity sha512-Dq1bqBdLaZ1Gb/l2e5/+o3B18+8TI9ANlA1SkejZqDgdU/jK/ThYaMPMJpVMMXy2uRHvGKbkz9vheVGdq3cJfA==
"@rollup/rollup-linux-x64-musl@4.9.5":
version "4.9.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.5.tgz#fe0b20f9749a60eb1df43d20effa96c756ddcbd4"
integrity sha512-ezyFUOwldYpj7AbkwyW9AJ203peub81CaAIVvckdkyH8EvhEIoKzaMFJj0G4qYJ5sw3BpqhFrsCc30t54HV8vg==
"@rollup/rollup-win32-arm64-msvc@4.9.5":
version "4.9.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.5.tgz#422661ef0e16699a234465d15b2c1089ef963b2a"
integrity sha512-aHSsMnUw+0UETB0Hlv7B/ZHOGY5bQdwMKJSzGfDfvyhnpmVxLMGnQPGNE9wgqkLUs3+gbG1Qx02S2LLfJ5GaRQ==
"@rollup/rollup-win32-ia32-msvc@4.9.5":
version "4.9.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.5.tgz#7b73a145891c202fbcc08759248983667a035d85"
integrity sha512-AiqiLkb9KSf7Lj/o1U3SEP9Zn+5NuVKgFdRIZkvd4N0+bYrTOovVd0+LmYCPQGbocT4kvFyK+LXCDiXPBF3fyA==
"@rollup/rollup-win32-x64-msvc@4.9.5":
version "4.9.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.5.tgz#10491ccf4f63c814d4149e0316541476ea603602"
integrity sha512-1q+mykKE3Vot1kaFJIDoUFv5TuW+QQVaf2FmTT9krg86pQrGStOSJJ0Zil7CFagyxDuouTepzt5Y5TVzyajOdQ==
"@types/estree@1.0.5":
version "1.0.5"
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4"
integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==
esbuild@^0.19.3:
version "0.19.11"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.11.tgz#4a02dca031e768b5556606e1b468fe72e3325d96"
integrity sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==
optionalDependencies:
"@esbuild/aix-ppc64" "0.19.11"
"@esbuild/android-arm" "0.19.11"
"@esbuild/android-arm64" "0.19.11"
"@esbuild/android-x64" "0.19.11"
"@esbuild/darwin-arm64" "0.19.11"
"@esbuild/darwin-x64" "0.19.11"
"@esbuild/freebsd-arm64" "0.19.11"
"@esbuild/freebsd-x64" "0.19.11"
"@esbuild/linux-arm" "0.19.11"
"@esbuild/linux-arm64" "0.19.11"
"@esbuild/linux-ia32" "0.19.11"
"@esbuild/linux-loong64" "0.19.11"
"@esbuild/linux-mips64el" "0.19.11"
"@esbuild/linux-ppc64" "0.19.11"
"@esbuild/linux-riscv64" "0.19.11"
"@esbuild/linux-s390x" "0.19.11"
"@esbuild/linux-x64" "0.19.11"
"@esbuild/netbsd-x64" "0.19.11"
"@esbuild/openbsd-x64" "0.19.11"
"@esbuild/sunos-x64" "0.19.11"
"@esbuild/win32-arm64" "0.19.11"
"@esbuild/win32-ia32" "0.19.11"
"@esbuild/win32-x64" "0.19.11"
fsevents@~2.3.2, fsevents@~2.3.3:
version "2.3.3"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
"js-tokens@^3.0.0 || ^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
loose-envify@^1.1.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
dependencies:
js-tokens "^3.0.0 || ^4.0.0"
nanoid@^3.3.7:
version "3.3.7"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
picocolors@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
postcss@^8.4.32:
version "8.4.33"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.33.tgz#1378e859c9f69bf6f638b990a0212f43e2aaa742"
integrity sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==
dependencies:
nanoid "^3.3.7"
picocolors "^1.0.0"
source-map-js "^1.0.2"
react-dom@18.2.0:
version "18.2.0"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d"
integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==
dependencies:
loose-envify "^1.1.0"
scheduler "^0.23.0"
react@18.2.0:
version "18.2.0"
resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"
integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
dependencies:
loose-envify "^1.1.0"
rollup@^4.2.0:
version "4.9.5"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.9.5.tgz#62999462c90f4c8b5d7c38fc7161e63b29101b05"
integrity sha512-E4vQW0H/mbNMw2yLSqJyjtkHY9dslf/p0zuT1xehNRqUTBOFMqEjguDvqhXr7N7r/4ttb2jr4T41d3dncmIgbQ==
dependencies:
"@types/estree" "1.0.5"
optionalDependencies:
"@rollup/rollup-android-arm-eabi" "4.9.5"
"@rollup/rollup-android-arm64" "4.9.5"
"@rollup/rollup-darwin-arm64" "4.9.5"
"@rollup/rollup-darwin-x64" "4.9.5"
"@rollup/rollup-linux-arm-gnueabihf" "4.9.5"
"@rollup/rollup-linux-arm64-gnu" "4.9.5"
"@rollup/rollup-linux-arm64-musl" "4.9.5"
"@rollup/rollup-linux-riscv64-gnu" "4.9.5"
"@rollup/rollup-linux-x64-gnu" "4.9.5"
"@rollup/rollup-linux-x64-musl" "4.9.5"
"@rollup/rollup-win32-arm64-msvc" "4.9.5"
"@rollup/rollup-win32-ia32-msvc" "4.9.5"
"@rollup/rollup-win32-x64-msvc" "4.9.5"
fsevents "~2.3.2"
scheduler@^0.23.0:
version "0.23.0"
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe"
integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==
dependencies:
loose-envify "^1.1.0"
source-map-js@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
vite@5.0.6:
version "5.0.6"
resolved "https://registry.yarnpkg.com/vite/-/vite-5.0.6.tgz#f9e13503a4c5ccd67312c67803dec921f3bdea7c"
integrity sha512-MD3joyAEBtV7QZPl2JVVUai6zHms3YOmLR+BpMzLlX2Yzjfcc4gTgNi09d/Rua3F4EtC8zdwPU8eQYyib4vVMQ==
dependencies:
esbuild "^0.19.3"
postcss "^8.4.32"
rollup "^4.2.0"
optionalDependencies:
fsevents "~2.3.3"

View File

@@ -3,23 +3,23 @@
"version": "0.1.0",
"private": true,
"scripts": {
"build:workspace": "yarn workspace @excalidraw/excalidraw run build:esm && yarn copy:assets",
"copy:assets": "cp -r ../../../packages/excalidraw/dist/prod/fonts ./public",
"build:packages": "yarn --cwd ../../ build:packages",
"build:workspace": "yarn build:packages && yarn copy:assets",
"copy:assets": "cp -r ../../packages/excalidraw/dist/prod/fonts ./public",
"dev": "yarn build:workspace && next dev -p 3005",
"build": "yarn build:workspace && next build",
"start": "next start -p 3006",
"lint": "next lint"
},
"dependencies": {
"@excalidraw/excalidraw": "*",
"next": "14.1",
"react": "18.2.0",
"react-dom": "18.2.0"
"react": "19.0.0",
"react-dom": "19.0.0"
},
"devDependencies": {
"@types/node": "^20",
"@types/react": "18.2.0",
"@types/react-dom": "18.2.0",
"@types/react": "19.0.10",
"@types/react-dom": "19.0.4",
"path2d-polyfill": "2.0.1",
"typescript": "^5"
}

View File

Before

Width:  |  Height:  |  Size: 197 KiB

After

Width:  |  Height:  |  Size: 197 KiB

View File

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 39 KiB

View File

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

View File

@@ -1,5 +1,6 @@
import dynamic from "next/dynamic";
import Script from "next/script";
import "../common.scss";
// Since client components get prerenderd on server as well hence importing the excalidraw stuff dynamically

View File

@@ -1,10 +1,11 @@
"use client";
import * as excalidrawLib from "@excalidraw/excalidraw";
import { Excalidraw } from "@excalidraw/excalidraw";
import App from "../../components/ExampleApp";
import "@excalidraw/excalidraw/index.css";
import App from "../../with-script-in-browser/components/ExampleApp";
const ExcalidrawWrapper: React.FC = () => {
return (
<>

View File

@@ -1,4 +1,5 @@
import dynamic from "next/dynamic";
import "../common.scss";
// Since client components get prerenderd on server as well hence importing the excalidraw stuff dynamically

View File

@@ -0,0 +1,5 @@
FROM node:18-bullseye
# Vite wants to open the browser using `open`, so we
# need to install those utils.
RUN apt update -y && apt install -y xdg-utils

View File

@@ -0,0 +1,35 @@
{
// These tasks will run in order when initializing your CodeSandbox project.
"setupTasks": [
{
"name": "Install Dependencies",
"command": "yarn install"
}
],
// These tasks can be run from CodeSandbox. Running one will open a log in the app.
"tasks": {
"build": {
"name": "Build",
"command": "yarn build",
"runAtStart": false
},
"start": {
"name": "Start Example",
"command": "yarn start",
"runAtStart": true,
"preview": {
"port": 3001
}
},
"install-deps": {
"name": "Install Dependencies",
"command": "yarn install",
"restartOn": {
"files": ["yarn.lock"],
"branch": false,
"resume": false
}
}
}
}

View File

@@ -1,5 +1,7 @@
import React from "react";
import type * as TExcalidraw from "@excalidraw/excalidraw";
import type { ExcalidrawImperativeAPI } from "@excalidraw/excalidraw/dist/excalidraw/types";
import type { ExcalidrawImperativeAPI } from "@excalidraw/excalidraw/types";
const COMMENT_SVG = (
<svg

View File

@@ -52,7 +52,7 @@
transform: none;
}
.excalidraw .panelColumn {
.excalidraw .selected-shape-actions {
text-align: left;
}

View File

@@ -1,3 +1,4 @@
import { nanoid } from "nanoid";
import React, {
useEffect,
useState,
@@ -6,13 +7,24 @@ import React, {
Children,
cloneElement,
} from "react";
import ExampleSidebar from "./sidebar/ExampleSidebar";
import type * as TExcalidraw from "@excalidraw/excalidraw";
import type { ImportedLibraryData } from "@excalidraw/excalidraw/data/types";
import type {
NonDeletedExcalidrawElement,
Theme,
} from "@excalidraw/excalidraw/element/types";
import type {
AppState,
BinaryFileData,
ExcalidrawImperativeAPI,
ExcalidrawInitialDataState,
Gesture,
LibraryItems,
PointerDownState as ExcalidrawPointerDownState,
} from "@excalidraw/excalidraw/types";
import { nanoid } from "nanoid";
import type { ResolvablePromise } from "../utils";
import initialData from "../initialData";
import {
resolvablePromise,
distance2d,
@@ -23,25 +35,12 @@ import {
import CustomFooter from "./CustomFooter";
import MobileFooter from "./MobileFooter";
import initialData from "../initialData";
import type {
AppState,
BinaryFileData,
ExcalidrawImperativeAPI,
ExcalidrawInitialDataState,
Gesture,
LibraryItems,
PointerDownState as ExcalidrawPointerDownState,
} from "@excalidraw/excalidraw/dist/excalidraw/types";
import type {
NonDeletedExcalidrawElement,
Theme,
} from "@excalidraw/excalidraw/dist/excalidraw/element/types";
import type { ImportedLibraryData } from "@excalidraw/excalidraw/dist/excalidraw/data/types";
import ExampleSidebar from "./sidebar/ExampleSidebar";
import "./ExampleApp.scss";
import type { ResolvablePromise } from "../utils";
type Comment = {
x: number;
y: number;
@@ -105,6 +104,7 @@ export default function ExampleApp({
const [viewModeEnabled, setViewModeEnabled] = useState(false);
const [zenModeEnabled, setZenModeEnabled] = useState(false);
const [gridModeEnabled, setGridModeEnabled] = useState(false);
const [renderScrollbars, setRenderScrollbars] = useState(false);
const [blobUrl, setBlobUrl] = useState<string>("");
const [canvasUrl, setCanvasUrl] = useState<string>("");
const [exportWithDarkMode, setExportWithDarkMode] = useState(false);
@@ -193,6 +193,7 @@ export default function ExampleApp({
}) => setPointerData(payload),
viewModeEnabled,
zenModeEnabled,
renderScrollbars,
gridModeEnabled,
theme,
name: "Custom name of drawing",
@@ -711,6 +712,14 @@ export default function ExampleApp({
/>
Grid mode
</label>
<label>
<input
type="checkbox"
checked={renderScrollbars}
onChange={() => setRenderScrollbars(!renderScrollbars)}
/>
Render scrollbars
</label>
<label>
<input
type="checkbox"

View File

@@ -1,6 +1,9 @@
import type { ExcalidrawImperativeAPI } from "@excalidraw/excalidraw/dist/excalidraw/types";
import CustomFooter from "./CustomFooter";
import React from "react";
import type * as TExcalidraw from "@excalidraw/excalidraw";
import type { ExcalidrawImperativeAPI } from "@excalidraw/excalidraw/types";
import CustomFooter from "./CustomFooter";
const MobileFooter = ({
excalidrawAPI,

View File

@@ -1,4 +1,5 @@
import { useState } from "react";
import React, { useState } from "react";
import "./ExampleSidebar.scss";
export default function Sidebar({ children }: { children: React.ReactNode }) {

View File

@@ -11,17 +11,15 @@
<title>React App</title>
<script>
window.name = "codesandbox";
window.EXCALIDRAW_ASSET_PATH = window.origin;
window.EXCALIDRAW_ASSET_PATH =
"https://esm.sh/@excalidraw/excalidraw@0.18.0/dist/prod/";
</script>
<link rel="stylesheet" href="/dist/browser/dev/index.css" />
</head>
<body>
<noscript> You need to enable JavaScript to run this app. </noscript>
<div id="root"></div>
<!-- This is so that we use the bundled excalidraw.development.js file instead
of the actual source code -->
<script type="module">
import * as ExcalidrawLib from "@excalidraw/excalidraw";

View File

@@ -1,10 +1,11 @@
import App from "../components/ExampleApp";
import React, { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import "@excalidraw/excalidraw/index.css";
import type * as TExcalidraw from "@excalidraw/excalidraw";
import "@excalidraw/excalidraw/index.css";
import App from "./components/ExampleApp";
declare global {
interface Window {

View File

@@ -0,0 +1,22 @@
{
"name": "with-script-in-browser",
"version": "1.0.0",
"private": true,
"dependencies": {
"react": "19.0.0",
"react-dom": "19.0.0",
"@excalidraw/excalidraw": "*",
"browser-fs-access": "0.29.1"
},
"devDependencies": {
"vite": "5.0.12",
"typescript": "^5"
},
"scripts": {
"start": "vite",
"build": "vite build",
"preview": "vite preview --port 5002",
"build:preview": "yarn build && yarn preview",
"build:packages": "yarn --cwd ../../ build:packages"
}
}

View File

Before

Width:  |  Height:  |  Size: 197 KiB

After

Width:  |  Height:  |  Size: 197 KiB

View File

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 39 KiB

View File

@@ -0,0 +1,9 @@
{
"compilerOptions": {
"module": "ES2022",
"moduleResolution": "Bundler",
"lib": ["ESNext", "DOM", "DOM.Iterable"],
"jsx": "react-jsx",
"skipLibCheck": true
}
}

View File

@@ -1,7 +1,6 @@
import { unstable_batchedUpdates } from "react-dom";
import { fileOpen as _fileOpen } from "browser-fs-access";
import { MIME_TYPES } from "@excalidraw/excalidraw";
import { AbortError } from "../../packages/excalidraw/errors";
import { fileOpen as _fileOpen } from "browser-fs-access";
import { unstable_batchedUpdates } from "react-dom";
type FILE_EXTENSION = Exclude<keyof typeof MIME_TYPES, "binary">;
@@ -85,7 +84,7 @@ export const fileOpen = <M extends boolean | undefined = false>(opts: {
if (rejectPromise) {
// so that something is shown in console if we need to debug this
console.warn("Opening the file was canceled (legacy-fs).");
rejectPromise(new AbortError());
rejectPromise(new Error("Request Aborted"));
}
};
},

View File

@@ -0,0 +1,5 @@
{
"outputDirectory": "dist",
"installCommand": "yarn install",
"buildCommand": "yarn build:packages && yarn build"
}

View File

@@ -0,0 +1,19 @@
import { defineConfig } from "vite";
// https://vitejs.dev/config/
export default defineConfig({
server: {
port: 3001,
// open the browser
open: true,
},
publicDir: "public",
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",
treeShaking: true,
},
},
});

View File

@@ -1,40 +1,26 @@
import polyfill from "../packages/excalidraw/polyfill";
import { useCallback, useEffect, useRef, useState } from "react";
import { trackEvent } from "../packages/excalidraw/analytics";
import { getDefaultAppState } from "../packages/excalidraw/appState";
import { ErrorDialog } from "../packages/excalidraw/components/ErrorDialog";
import { TopErrorBoundary } from "./components/TopErrorBoundary";
import {
APP_NAME,
EVENT,
THEME,
TITLE_TIMEOUT,
VERSION_TIMEOUT,
} from "../packages/excalidraw/constants";
import { loadFromBlob } from "../packages/excalidraw/data/blob";
import type {
FileId,
NonDeletedExcalidrawElement,
OrderedExcalidrawElement,
} from "../packages/excalidraw/element/types";
import { useCallbackRefState } from "../packages/excalidraw/hooks/useCallbackRefState";
import { t } from "../packages/excalidraw/i18n";
import {
Excalidraw,
LiveCollaborationTrigger,
TTDDialogTrigger,
StoreAction,
CaptureUpdateAction,
reconcileElements,
} from "../packages/excalidraw";
import type {
AppState,
ExcalidrawImperativeAPI,
BinaryFiles,
ExcalidrawInitialDataState,
UIAppState,
} from "../packages/excalidraw/types";
import type { ResolvablePromise } from "../packages/excalidraw/utils";
} from "@excalidraw/excalidraw";
import { trackEvent } from "@excalidraw/excalidraw/analytics";
import { getDefaultAppState } from "@excalidraw/excalidraw/appState";
import {
CommandPalette,
DEFAULT_CATEGORIES,
} from "@excalidraw/excalidraw/components/CommandPalette/CommandPalette";
import { ErrorDialog } from "@excalidraw/excalidraw/components/ErrorDialog";
import { OverwriteConfirmDialog } from "@excalidraw/excalidraw/components/OverwriteConfirm/OverwriteConfirm";
import { openConfirmModal } from "@excalidraw/excalidraw/components/OverwriteConfirm/OverwriteConfirmState";
import { ShareableLinkDialog } from "@excalidraw/excalidraw/components/ShareableLinkDialog";
import Trans from "@excalidraw/excalidraw/components/Trans";
import {
APP_NAME,
EVENT,
THEME,
VERSION_TIMEOUT,
debounce,
getVersion,
getFrame,
@@ -42,71 +28,14 @@ import {
preventUnload,
resolvablePromise,
isRunningInIframe,
} from "../packages/excalidraw/utils";
import {
FIREBASE_STORAGE_PREFIXES,
isExcalidrawPlusSignedUser,
STORAGE_KEYS,
SYNC_BROWSER_TABS_TIMEOUT,
} from "./app_constants";
import type { CollabAPI } from "./collab/Collab";
import Collab, {
collabAPIAtom,
isCollaboratingAtom,
isOfflineAtom,
} from "./collab/Collab";
import {
exportToBackend,
getCollaborationLinkData,
isCollaborationLink,
loadScene,
} from "./data";
import {
importFromLocalStorage,
importUsernameFromLocalStorage,
} from "./data/localStorage";
import CustomStats from "./CustomStats";
import type { RestoredDataState } from "../packages/excalidraw/data/restore";
import { restore, restoreAppState } from "../packages/excalidraw/data/restore";
import {
ExportToExcalidrawPlus,
exportToExcalidrawPlus,
} from "./components/ExportToExcalidrawPlus";
import { updateStaleImageStatuses } from "./data/FileManager";
import { newElementWith } from "../packages/excalidraw/element/mutateElement";
import { isInitializedImageElement } from "../packages/excalidraw/element/typeChecks";
import { loadFilesFromFirebase } from "./data/firebase";
import {
LibraryIndexedDBAdapter,
LibraryLocalStorageMigrationAdapter,
LocalData,
} from "./data/LocalData";
import { isBrowserStorageStateNewer } from "./data/tabSync";
import clsx from "clsx";
import {
parseLibraryTokensFromUrl,
useHandleLibrary,
} from "../packages/excalidraw/data/library";
import { AppMainMenu } from "./components/AppMainMenu";
import { AppWelcomeScreen } from "./components/AppWelcomeScreen";
import { AppFooter } from "./components/AppFooter";
import { Provider, useAtom, useAtomValue } from "jotai";
import { useAtomWithInitialValue } from "../packages/excalidraw/jotai";
import { appJotaiStore } from "./app-jotai";
isDevEnv,
} from "@excalidraw/common";
import polyfill from "@excalidraw/excalidraw/polyfill";
import { useCallback, useEffect, useRef, useState } from "react";
import { loadFromBlob } from "@excalidraw/excalidraw/data/blob";
import { useCallbackRefState } from "@excalidraw/excalidraw/hooks/useCallbackRefState";
import { t } from "@excalidraw/excalidraw/i18n";
import "./index.scss";
import type { ResolutionType } from "../packages/excalidraw/utility-types";
import { ShareableLinkDialog } from "../packages/excalidraw/components/ShareableLinkDialog";
import { openConfirmModal } from "../packages/excalidraw/components/OverwriteConfirm/OverwriteConfirmState";
import { OverwriteConfirmDialog } from "../packages/excalidraw/components/OverwriteConfirm/OverwriteConfirm";
import Trans from "../packages/excalidraw/components/Trans";
import { ShareDialog, shareDialogStateAtom } from "./share/ShareDialog";
import CollabError, { collabErrorIndicatorAtom } from "./collab/CollabError";
import type { RemoteExcalidrawElement } from "../packages/excalidraw/data/reconcile";
import {
CommandPalette,
DEFAULT_CATEGORIES,
} from "../packages/excalidraw/components/CommandPalette/CommandPalette";
import {
GithubIcon,
XBrandIcon,
@@ -116,8 +45,86 @@ import {
exportToPlus,
share,
youtubeIcon,
} from "../packages/excalidraw/components/icons";
import { appThemeAtom, useHandleAppTheme } from "./useHandleAppTheme";
} from "@excalidraw/excalidraw/components/icons";
import { isElementLink } from "@excalidraw/element";
import { restore, restoreAppState } from "@excalidraw/excalidraw/data/restore";
import { newElementWith } from "@excalidraw/element";
import { isInitializedImageElement } from "@excalidraw/element";
import clsx from "clsx";
import {
parseLibraryTokensFromUrl,
useHandleLibrary,
} from "@excalidraw/excalidraw/data/library";
import type { RemoteExcalidrawElement } from "@excalidraw/excalidraw/data/reconcile";
import type { RestoredDataState } from "@excalidraw/excalidraw/data/restore";
import type {
FileId,
NonDeletedExcalidrawElement,
OrderedExcalidrawElement,
} from "@excalidraw/element/types";
import type {
AppState,
ExcalidrawImperativeAPI,
BinaryFiles,
ExcalidrawInitialDataState,
UIAppState,
} from "@excalidraw/excalidraw/types";
import type { ResolutionType } from "@excalidraw/common/utility-types";
import type { ResolvablePromise } from "@excalidraw/common/utils";
import CustomStats from "./CustomStats";
import {
Provider,
useAtom,
useAtomValue,
useAtomWithInitialValue,
appJotaiStore,
} from "./app-jotai";
import {
FIREBASE_STORAGE_PREFIXES,
isExcalidrawPlusSignedUser,
STORAGE_KEYS,
SYNC_BROWSER_TABS_TIMEOUT,
} from "./app_constants";
import Collab, {
collabAPIAtom,
isCollaboratingAtom,
isOfflineAtom,
} from "./collab/Collab";
import { AppFooter } from "./components/AppFooter";
import { AppMainMenu } from "./components/AppMainMenu";
import { AppWelcomeScreen } from "./components/AppWelcomeScreen";
import {
ExportToExcalidrawPlus,
exportToExcalidrawPlus,
} from "./components/ExportToExcalidrawPlus";
import { TopErrorBoundary } from "./components/TopErrorBoundary";
import {
exportToBackend,
getCollaborationLinkData,
isCollaborationLink,
loadScene,
} from "./data";
import { updateStaleImageStatuses } from "./data/FileManager";
import {
importFromLocalStorage,
importUsernameFromLocalStorage,
} from "./data/localStorage";
import { loadFilesFromFirebase } from "./data/firebase";
import {
LibraryIndexedDBAdapter,
LibraryLocalStorageMigrationAdapter,
LocalData,
localStorageQuotaExceededAtom,
} from "./data/LocalData";
import { isBrowserStorageStateNewer } from "./data/tabSync";
import { ShareDialog, shareDialogStateAtom } from "./share/ShareDialog";
import CollabError, { collabErrorIndicatorAtom } from "./collab/CollabError";
import { useHandleAppTheme } from "./useHandleAppTheme";
import { getPreferredLanguage } from "./app-language/language-detector";
import { useAppLangCode } from "./app-language/language-state";
import DebugCanvas, {
@@ -126,6 +133,11 @@ import DebugCanvas, {
loadSavedDebugState,
} from "./components/DebugCanvas";
import { AIComponents } from "./components/AI";
import { ExcalidrawPlusIframeExport } from "./ExcalidrawPlusIframeExport";
import "./index.scss";
import type { CollabAPI } from "./collab/Collab";
polyfill();
@@ -326,8 +338,7 @@ const ExcalidrawWrapper = () => {
const [errorMessage, setErrorMessage] = useState("");
const isCollabDisabled = isRunningInIframe();
const [appTheme, setAppTheme] = useAtom(appThemeAtom);
const { editorTheme } = useHandleAppTheme();
const { editorTheme, appTheme, setAppTheme } = useHandleAppTheme();
const [langCode, setLangCode] = useAppLangCode();
@@ -372,7 +383,7 @@ const ExcalidrawWrapper = () => {
const [, forceRefresh] = useState(false);
useEffect(() => {
if (import.meta.env.DEV) {
if (isDevEnv()) {
const debugState = loadSavedDebugState();
if (debugState.enabled && !window.visualDebug) {
@@ -481,18 +492,13 @@ const ExcalidrawWrapper = () => {
excalidrawAPI.updateScene({
...data.scene,
...restore(data.scene, null, null, { repairBindings: true }),
storeAction: StoreAction.CAPTURE,
captureUpdate: CaptureUpdateAction.IMMEDIATELY,
});
}
});
}
};
const titleTimeout = setTimeout(
() => (document.title = APP_NAME),
TITLE_TIMEOUT,
);
const syncData = debounce(() => {
if (isTestEnv()) {
return;
@@ -508,7 +514,7 @@ const ExcalidrawWrapper = () => {
setLangCode(getPreferredLanguage());
excalidrawAPI.updateScene({
...localDataState,
storeAction: StoreAction.UPDATE,
captureUpdate: CaptureUpdateAction.NEVER,
});
LibraryIndexedDBAdapter.load().then((data) => {
if (data) {
@@ -583,7 +589,6 @@ const ExcalidrawWrapper = () => {
visibilityChange,
false,
);
clearTimeout(titleTimeout);
};
}, [isCollabDisabled, collabAPI, excalidrawAPI, setLangCode]);
@@ -597,7 +602,13 @@ const ExcalidrawWrapper = () => {
excalidrawAPI.getSceneElements(),
)
) {
preventUnload(event);
if (import.meta.env.VITE_APP_DISABLE_PREVENT_UNLOAD !== "true") {
preventUnload(event);
} else {
console.warn(
"preventing unload disabled (VITE_APP_DISABLE_PREVENT_UNLOAD)",
);
}
}
};
window.addEventListener(EVENT.BEFORE_UNLOAD, unloadHandler);
@@ -640,7 +651,7 @@ const ExcalidrawWrapper = () => {
if (didChange) {
excalidrawAPI.updateScene({
elements,
storeAction: StoreAction.UPDATE,
captureUpdate: CaptureUpdateAction.NEVER,
});
}
}
@@ -717,6 +728,8 @@ const ExcalidrawWrapper = () => {
const isOffline = useAtomValue(isOfflineAtom);
const localStorageQuotaExceeded = useAtomValue(localStorageQuotaExceededAtom);
const onCollabDialogOpen = useCallback(
() => setShareDialogState({ isOpen: true, type: "collaborationOnly" }),
[setShareDialogState],
@@ -847,6 +860,12 @@ const ExcalidrawWrapper = () => {
</div>
);
}}
onLinkOpen={(element, event) => {
if (element.link && isElementLink(element.link)) {
event.preventDefault();
excalidrawAPI?.scrollToContent(element.link, { animate: true });
}
}}
>
<AppMainMenu
onCollabDialogOpen={onCollabDialogOpen}
@@ -885,10 +904,15 @@ const ExcalidrawWrapper = () => {
<TTDDialogTrigger />
{isCollaborating && isOffline && (
<div className="collab-offline-warning">
<div className="alertalert--warning">
{t("alerts.collabOfflineWarning")}
</div>
)}
{localStorageQuotaExceeded && (
<div className="alert alert--danger">
{t("alerts.localStorageQuotaExceeded")}
</div>
)}
{latestShareableLink && (
<ShareableLinkDialog
link={latestShareableLink}
@@ -1125,9 +1149,15 @@ const ExcalidrawWrapper = () => {
};
const ExcalidrawApp = () => {
const isCloudExportWindow =
window.location.pathname === "/excalidraw-plus-export";
if (isCloudExportWindow) {
return <ExcalidrawPlusIframeExport />;
}
return (
<TopErrorBoundary>
<Provider unstable_createStore={() => appJotaiStore}>
<Provider store={appJotaiStore}>
<ExcalidrawWrapper />
</Provider>
</TopErrorBoundary>

View File

@@ -1,15 +1,21 @@
import { Stats } from "@excalidraw/excalidraw";
import { copyTextToSystemClipboard } from "@excalidraw/excalidraw/clipboard";
import {
DEFAULT_VERSION,
debounce,
getVersion,
nFormatter,
} from "@excalidraw/common";
import { t } from "@excalidraw/excalidraw/i18n";
import { useEffect, useState } from "react";
import { debounce, getVersion, nFormatter } from "../packages/excalidraw/utils";
import type { NonDeletedExcalidrawElement } from "@excalidraw/element/types";
import type { UIAppState } from "@excalidraw/excalidraw/types";
import {
getElementsStorageSize,
getTotalStorageSize,
} from "./data/localStorage";
import { DEFAULT_VERSION } from "../packages/excalidraw/constants";
import { t } from "../packages/excalidraw/i18n";
import { copyTextToSystemClipboard } from "../packages/excalidraw/clipboard";
import type { NonDeletedExcalidrawElement } from "../packages/excalidraw/element/types";
import type { UIAppState } from "../packages/excalidraw/types";
import { Stats } from "../packages/excalidraw";
type StorageSizes = { scene: number; total: number };

View File

@@ -0,0 +1,224 @@
import { base64urlToString } from "@excalidraw/excalidraw/data/encode";
import { ExcalidrawError } from "@excalidraw/excalidraw/errors";
import { useLayoutEffect, useRef } from "react";
import type {
FileId,
OrderedExcalidrawElement,
} from "@excalidraw/element/types";
import type { AppState, BinaryFileData } from "@excalidraw/excalidraw/types";
import { STORAGE_KEYS } from "./app_constants";
import { LocalData } from "./data/LocalData";
const EVENT_REQUEST_SCENE = "REQUEST_SCENE";
const EXCALIDRAW_PLUS_ORIGIN = import.meta.env.VITE_APP_PLUS_APP;
// -----------------------------------------------------------------------------
// outgoing message
// -----------------------------------------------------------------------------
type MESSAGE_REQUEST_SCENE = {
type: "REQUEST_SCENE";
jwt: string;
};
type MESSAGE_FROM_PLUS = MESSAGE_REQUEST_SCENE;
// incoming messages
// -----------------------------------------------------------------------------
type MESSAGE_READY = { type: "READY" };
type MESSAGE_ERROR = { type: "ERROR"; message: string };
type MESSAGE_SCENE_DATA = {
type: "SCENE_DATA";
elements: OrderedExcalidrawElement[];
appState: Pick<AppState, "viewBackgroundColor">;
files: { loadedFiles: BinaryFileData[]; erroredFiles: Map<FileId, true> };
};
type MESSAGE_FROM_EDITOR = MESSAGE_ERROR | MESSAGE_SCENE_DATA | MESSAGE_READY;
// -----------------------------------------------------------------------------
const parseSceneData = async ({
rawElementsString,
rawAppStateString,
}: {
rawElementsString: string | null;
rawAppStateString: string | null;
}): Promise<MESSAGE_SCENE_DATA> => {
if (!rawElementsString || !rawAppStateString) {
throw new ExcalidrawError("Elements or appstate is missing.");
}
try {
const elements = JSON.parse(
rawElementsString,
) as OrderedExcalidrawElement[];
if (!elements.length) {
throw new ExcalidrawError("Scene is empty, nothing to export.");
}
const appState = JSON.parse(rawAppStateString) as Pick<
AppState,
"viewBackgroundColor"
>;
const fileIds = elements.reduce((acc, el) => {
if ("fileId" in el && el.fileId) {
acc.push(el.fileId);
}
return acc;
}, [] as FileId[]);
const files = await LocalData.fileStorage.getFiles(fileIds);
return {
type: "SCENE_DATA",
elements,
appState,
files,
};
} catch (error: any) {
throw error instanceof ExcalidrawError
? error
: new ExcalidrawError("Failed to parse scene data.");
}
};
const verifyJWT = async ({
token,
publicKey,
}: {
token: string;
publicKey: string;
}) => {
try {
if (!publicKey) {
throw new ExcalidrawError("Public key is undefined");
}
const [header, payload, signature] = token.split(".");
if (!header || !payload || !signature) {
throw new ExcalidrawError("Invalid JWT format");
}
// JWT is using Base64URL encoding
const decodedPayload = base64urlToString(payload);
const decodedSignature = base64urlToString(signature);
const data = `${header}.${payload}`;
const signatureArrayBuffer = Uint8Array.from(decodedSignature, (c) =>
c.charCodeAt(0),
);
const keyData = publicKey.replace(/-----\w+ PUBLIC KEY-----/g, "");
const keyArrayBuffer = Uint8Array.from(atob(keyData), (c) =>
c.charCodeAt(0),
);
const key = await crypto.subtle.importKey(
"spki",
keyArrayBuffer,
{ name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" },
true,
["verify"],
);
const isValid = await crypto.subtle.verify(
"RSASSA-PKCS1-v1_5",
key,
signatureArrayBuffer,
new TextEncoder().encode(data),
);
if (!isValid) {
throw new Error("Invalid JWT");
}
const parsedPayload = JSON.parse(decodedPayload);
// Check for expiration
const currentTime = Math.floor(Date.now() / 1000);
if (parsedPayload.exp && parsedPayload.exp < currentTime) {
throw new Error("JWT has expired");
}
} catch (error) {
console.error("Failed to verify JWT:", error);
throw new Error(error instanceof Error ? error.message : "Invalid JWT");
}
};
export const ExcalidrawPlusIframeExport = () => {
const readyRef = useRef(false);
useLayoutEffect(() => {
const handleMessage = async (event: MessageEvent<MESSAGE_FROM_PLUS>) => {
if (event.origin !== EXCALIDRAW_PLUS_ORIGIN) {
throw new ExcalidrawError("Invalid origin");
}
if (event.data.type === EVENT_REQUEST_SCENE) {
if (!event.data.jwt) {
throw new ExcalidrawError("JWT is missing");
}
try {
try {
await verifyJWT({
token: event.data.jwt,
publicKey: import.meta.env.VITE_APP_PLUS_EXPORT_PUBLIC_KEY,
});
} catch (error: any) {
console.error(`Failed to verify JWT: ${error.message}`);
throw new ExcalidrawError("Failed to verify JWT");
}
const parsedSceneData: MESSAGE_SCENE_DATA = await parseSceneData({
rawAppStateString: localStorage.getItem(
STORAGE_KEYS.LOCAL_STORAGE_APP_STATE,
),
rawElementsString: localStorage.getItem(
STORAGE_KEYS.LOCAL_STORAGE_ELEMENTS,
),
});
event.source!.postMessage(parsedSceneData, {
targetOrigin: EXCALIDRAW_PLUS_ORIGIN,
});
} catch (error) {
const responseData: MESSAGE_ERROR = {
type: "ERROR",
message:
error instanceof ExcalidrawError
? error.message
: "Failed to export scene data",
};
event.source!.postMessage(responseData, {
targetOrigin: EXCALIDRAW_PLUS_ORIGIN,
});
}
}
};
window.addEventListener("message", handleMessage);
// so we don't send twice in StrictMode
if (!readyRef.current) {
readyRef.current = true;
const message: MESSAGE_FROM_EDITOR = { type: "READY" };
window.parent.postMessage(message, EXCALIDRAW_PLUS_ORIGIN);
}
return () => {
window.removeEventListener("message", handleMessage);
};
}, []);
// Since this component is expected to run in a hidden iframe on Excaildraw+,
// it doesn't need to render anything. All the data we need is available in
// LocalStorage and IndexedDB. It only needs to handle the messaging between
// the parent window and the iframe with the relevant data.
return null;
};

View File

@@ -1,3 +1,37 @@
import { unstable_createStore } from "jotai";
// eslint-disable-next-line no-restricted-imports
import {
atom,
Provider,
useAtom,
useAtomValue,
useSetAtom,
createStore,
type PrimitiveAtom,
} from "jotai";
import { useLayoutEffect } from "react";
export const appJotaiStore = unstable_createStore();
export const appJotaiStore = createStore();
export { atom, Provider, useAtom, useAtomValue, useSetAtom };
export const useAtomWithInitialValue = <
T extends unknown,
A extends PrimitiveAtom<T>,
>(
atom: A,
initialValue: T | (() => T),
) => {
const [value, setValue] = useAtom(atom);
useLayoutEffect(() => {
if (typeof initialValue === "function") {
// @ts-ignore
setValue(initialValue());
} else {
setValue(initialValue);
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
return [value, setValue] as const;
};

View File

@@ -1,6 +1,8 @@
import { useSetAtom } from "jotai";
import { useI18n, languages } from "@excalidraw/excalidraw/i18n";
import React from "react";
import { useI18n, languages } from "../../packages/excalidraw/i18n";
import { useSetAtom } from "../app-jotai";
import { appLangCodeAtom } from "./language-state";
export const LanguageList = ({ style }: { style?: React.CSSProperties }) => {

View File

@@ -1,5 +1,5 @@
import { defaultLang, languages } from "@excalidraw/excalidraw";
import LanguageDetector from "i18next-browser-languagedetector";
import { defaultLang, languages } from "../../packages/excalidraw";
export const languageDetector = new LanguageDetector();

View File

@@ -1,5 +1,7 @@
import { atom, useAtom } from "jotai";
import { useEffect } from "react";
import { atom, useAtom } from "../app-jotai";
import { getPreferredLanguage, languageDetector } from "./language-detector";
export const appLangCodeAtom = atom(getPreferredLanguage());

View File

@@ -8,7 +8,8 @@ export const SYNC_BROWSER_TABS_TIMEOUT = 50;
export const CURSOR_SYNC_TIMEOUT = 33; // ~30fps
export const DELETED_ELEMENT_TIMEOUT = 24 * 60 * 60 * 1000; // 1 day
export const FILE_UPLOAD_MAX_BYTES = 3 * 1024 * 1024; // 3 MiB
// should be aligned with MAX_ALLOWED_FILE_BYTES
export const FILE_UPLOAD_MAX_BYTES = 4 * 1024 * 1024; // 4 MiB
// 1 year (https://stackoverflow.com/a/25201898/927631)
export const FILE_CACHE_MAX_AGE_SEC = 31536000;

View File

@@ -1,31 +1,55 @@
import throttle from "lodash.throttle";
import { PureComponent } from "react";
import type {
ExcalidrawImperativeAPI,
SocketId,
} from "../../packages/excalidraw/types";
import { ErrorDialog } from "../../packages/excalidraw/components/ErrorDialog";
import { APP_NAME, ENV, EVENT } from "../../packages/excalidraw/constants";
import type { ImportedDataState } from "../../packages/excalidraw/data/types";
import type {
ExcalidrawElement,
InitializedExcalidrawImageElement,
OrderedExcalidrawElement,
} from "../../packages/excalidraw/element/types";
import {
StoreAction,
CaptureUpdateAction,
getSceneVersion,
restoreElements,
zoomToFitBounds,
reconcileElements,
} from "../../packages/excalidraw";
import type { Collaborator, Gesture } from "../../packages/excalidraw/types";
} from "@excalidraw/excalidraw";
import { ErrorDialog } from "@excalidraw/excalidraw/components/ErrorDialog";
import { APP_NAME, EVENT } from "@excalidraw/common";
import {
IDLE_THRESHOLD,
ACTIVE_THRESHOLD,
UserIdleState,
assertNever,
isDevEnv,
isTestEnv,
preventUnload,
resolvablePromise,
throttleRAF,
} from "../../packages/excalidraw/utils";
} from "@excalidraw/common";
import { decryptData } from "@excalidraw/excalidraw/data/encryption";
import { getVisibleSceneBounds } from "@excalidraw/element";
import { newElementWith } from "@excalidraw/element";
import { isImageElement, isInitializedImageElement } from "@excalidraw/element";
import { AbortError } from "@excalidraw/excalidraw/errors";
import { t } from "@excalidraw/excalidraw/i18n";
import { withBatchedUpdates } from "@excalidraw/excalidraw/reactUtils";
import throttle from "lodash.throttle";
import { PureComponent } from "react";
import type {
ReconciledExcalidrawElement,
RemoteExcalidrawElement,
} from "@excalidraw/excalidraw/data/reconcile";
import type { ImportedDataState } from "@excalidraw/excalidraw/data/types";
import type {
ExcalidrawElement,
FileId,
InitializedExcalidrawImageElement,
OrderedExcalidrawElement,
} from "@excalidraw/element/types";
import type {
BinaryFileData,
ExcalidrawImperativeAPI,
SocketId,
Collaborator,
Gesture,
} from "@excalidraw/excalidraw/types";
import type { Mutable, ValueOf } from "@excalidraw/common/utility-types";
import { appJotaiStore, atom } from "../app-jotai";
import {
CURSOR_SYNC_TIMEOUT,
FILE_UPLOAD_MAX_BYTES,
@@ -36,15 +60,17 @@ import {
SYNC_FULL_SCENE_INTERVAL_MS,
WS_EVENTS,
} from "../app_constants";
import type {
SocketUpdateDataSource,
SyncableExcalidrawElement,
} from "../data";
import {
generateCollaborationLinkData,
getCollaborationLink,
getSyncableElements,
} from "../data";
import {
encodeFilesForUpload,
FileManager,
updateStaleImageStatuses,
} from "../data/FileManager";
import { LocalData } from "../data/LocalData";
import {
isSavedToFirebase,
loadFilesFromFirebase,
@@ -56,37 +82,15 @@ import {
importUsernameFromLocalStorage,
saveUsernameToLocalStorage,
} from "../data/localStorage";
import Portal from "./Portal";
import { t } from "../../packages/excalidraw/i18n";
import { UserIdleState } from "../../packages/excalidraw/types";
import {
IDLE_THRESHOLD,
ACTIVE_THRESHOLD,
} from "../../packages/excalidraw/constants";
import {
encodeFilesForUpload,
FileManager,
updateStaleImageStatuses,
} from "../data/FileManager";
import { AbortError } from "../../packages/excalidraw/errors";
import {
isImageElement,
isInitializedImageElement,
} from "../../packages/excalidraw/element/typeChecks";
import { newElementWith } from "../../packages/excalidraw/element/mutateElement";
import { decryptData } from "../../packages/excalidraw/data/encryption";
import { resetBrowserStateVersions } from "../data/tabSync";
import { LocalData } from "../data/LocalData";
import { atom } from "jotai";
import { appJotaiStore } from "../app-jotai";
import type { Mutable, ValueOf } from "../../packages/excalidraw/utility-types";
import { getVisibleSceneBounds } from "../../packages/excalidraw/element/bounds";
import { withBatchedUpdates } from "../../packages/excalidraw/reactUtils";
import { collabErrorIndicatorAtom } from "./CollabError";
import Portal from "./Portal";
import type {
ReconciledExcalidrawElement,
RemoteExcalidrawElement,
} from "../../packages/excalidraw/data/reconcile";
SocketUpdateDataSource,
SyncableExcalidrawElement,
} from "../data";
export const collabAPIAtom = atom<CollabAPI | null>(null);
export const isCollaboratingAtom = atom(false);
@@ -157,7 +161,7 @@ class Collab extends PureComponent<CollabProps, CollabState> {
throw new AbortError();
}
return saveFilesToFirebase({
const { savedFiles, erroredFiles } = await saveFilesToFirebase({
prefix: `${FIREBASE_STORAGE_PREFIXES.collabFiles}/${roomId}`,
files: await encodeFilesForUpload({
files: addedFiles,
@@ -165,6 +169,29 @@ class Collab extends PureComponent<CollabProps, CollabState> {
maxBytes: FILE_UPLOAD_MAX_BYTES,
}),
});
return {
savedFiles: savedFiles.reduce(
(acc: Map<FileId, BinaryFileData>, id) => {
const fileData = addedFiles.get(id);
if (fileData) {
acc.set(id, fileData);
}
return acc;
},
new Map(),
),
erroredFiles: erroredFiles.reduce(
(acc: Map<FileId, BinaryFileData>, id) => {
const fileData = addedFiles.get(id);
if (fileData) {
acc.set(id, fileData);
}
return acc;
},
new Map(),
),
};
},
});
this.excalidrawAPI = props.excalidrawAPI;
@@ -211,7 +238,7 @@ class Collab extends PureComponent<CollabProps, CollabState> {
appJotaiStore.set(collabAPIAtom, collabAPI);
if (import.meta.env.MODE === ENV.TEST || import.meta.env.DEV) {
if (isTestEnv() || isDevEnv()) {
window.collab = window.collab || ({} as Window["collab"]);
Object.defineProperties(window, {
collab: {
@@ -271,7 +298,13 @@ class Collab extends PureComponent<CollabProps, CollabState> {
// the purpose is to run in immediately after user decides to stay
this.saveCollabRoomToFirebase(syncableElements);
preventUnload(event);
if (import.meta.env.VITE_APP_DISABLE_PREVENT_UNLOAD !== "true") {
preventUnload(event);
} else {
console.warn(
"preventing unload disabled (VITE_APP_DISABLE_PREVENT_UNLOAD)",
);
}
}
});
@@ -359,7 +392,7 @@ class Collab extends PureComponent<CollabProps, CollabState> {
this.excalidrawAPI.updateScene({
elements,
storeAction: StoreAction.UPDATE,
captureUpdate: CaptureUpdateAction.NEVER,
});
}
};
@@ -394,7 +427,7 @@ class Collab extends PureComponent<CollabProps, CollabState> {
.filter((element) => {
return (
isInitializedImageElement(element) &&
!this.fileManager.isFileHandled(element.fileId) &&
!this.fileManager.isFileTracked(element.fileId) &&
!element.isDeleted &&
(opts.forceFetchFiles
? element.status !== "pending" ||
@@ -497,7 +530,10 @@ class Collab extends PureComponent<CollabProps, CollabState> {
return null;
}
if (!existingRoomLinkData) {
if (existingRoomLinkData) {
// when joining existing room, don't merge it with current scene data
this.excalidrawAPI.resetScene();
} else {
const elements = this.excalidrawAPI.getSceneElements().map((element) => {
if (isImageElement(element) && element.status === "saved") {
return newElementWith(element, { status: "pending" });
@@ -510,7 +546,7 @@ class Collab extends PureComponent<CollabProps, CollabState> {
// to database even if deleted before creating the room.
this.excalidrawAPI.updateScene({
elements,
storeAction: StoreAction.UPDATE,
captureUpdate: CaptureUpdateAction.NEVER,
});
this.saveCollabRoomToFirebase(getSyncableElements(elements));
@@ -748,7 +784,7 @@ class Collab extends PureComponent<CollabProps, CollabState> {
) => {
this.excalidrawAPI.updateScene({
elements,
storeAction: StoreAction.UPDATE,
captureUpdate: CaptureUpdateAction.NEVER,
});
this.loadImageFiles();
@@ -984,7 +1020,7 @@ declare global {
}
}
if (import.meta.env.MODE === ENV.TEST || import.meta.env.DEV) {
if (isTestEnv() || isDevEnv()) {
window.collab = window.collab || ({} as Window["collab"]);
}

View File

@@ -1,10 +1,11 @@
import { Tooltip } from "../../packages/excalidraw/components/Tooltip";
import { warning } from "../../packages/excalidraw/components/icons";
import { Tooltip } from "@excalidraw/excalidraw/components/Tooltip";
import { warning } from "@excalidraw/excalidraw/components/icons";
import clsx from "clsx";
import { useEffect, useRef, useState } from "react";
import { atom } from "../app-jotai";
import "./CollabError.scss";
import { atom } from "jotai";
type ErrorIndicator = {
message: string | null;
@@ -19,16 +20,16 @@ export const collabErrorIndicatorAtom = atom<ErrorIndicator>({
const CollabError = ({ collabError }: { collabError: ErrorIndicator }) => {
const [isAnimating, setIsAnimating] = useState(false);
const clearAnimationRef = useRef<string | number | NodeJS.Timeout>();
const clearAnimationRef = useRef<string | number>(0);
useEffect(() => {
setIsAnimating(true);
clearAnimationRef.current = setTimeout(() => {
clearAnimationRef.current = window.setTimeout(() => {
setIsAnimating(false);
}, 1000);
return () => {
clearTimeout(clearAnimationRef.current);
window.clearTimeout(clearAnimationRef.current);
};
}, [collabError.message, collabError.nonce]);

View File

@@ -1,25 +1,26 @@
import { CaptureUpdateAction } from "@excalidraw/excalidraw";
import { trackEvent } from "@excalidraw/excalidraw/analytics";
import { encryptData } from "@excalidraw/excalidraw/data/encryption";
import { newElementWith } from "@excalidraw/element";
import throttle from "lodash.throttle";
import type { UserIdleState } from "@excalidraw/common";
import type { OrderedExcalidrawElement } from "@excalidraw/element/types";
import type {
OnUserFollowedPayload,
SocketId,
} from "@excalidraw/excalidraw/types";
import { WS_EVENTS, FILE_UPLOAD_TIMEOUT, WS_SUBTYPES } from "../app_constants";
import { isSyncableElement } from "../data";
import type {
SocketUpdateData,
SocketUpdateDataSource,
SyncableExcalidrawElement,
} from "../data";
import { isSyncableElement } from "../data";
import type { TCollabClass } from "./Collab";
import type { OrderedExcalidrawElement } from "../../packages/excalidraw/element/types";
import { WS_EVENTS, FILE_UPLOAD_TIMEOUT, WS_SUBTYPES } from "../app_constants";
import type {
OnUserFollowedPayload,
SocketId,
UserIdleState,
} from "../../packages/excalidraw/types";
import { trackEvent } from "../../packages/excalidraw/analytics";
import throttle from "lodash.throttle";
import { newElementWith } from "../../packages/excalidraw/element/mutateElement";
import { encryptData } from "../../packages/excalidraw/data/encryption";
import type { Socket } from "socket.io-client";
import { StoreAction } from "../../packages/excalidraw";
class Portal {
collab: TCollabClass;
@@ -133,7 +134,7 @@ class Portal {
if (isChanged) {
this.collab.excalidrawAPI.updateScene({
elements: newElements,
storeAction: StoreAction.UPDATE,
captureUpdate: CaptureUpdateAction.NEVER,
});
}
}, FILE_UPLOAD_TIMEOUT);

View File

@@ -1,13 +1,14 @@
import type { ExcalidrawImperativeAPI } from "../../packages/excalidraw/types";
import {
DiagramToCodePlugin,
exportToBlob,
getTextFromElements,
MIME_TYPES,
TTDDialog,
} from "../../packages/excalidraw";
import { getDataURL } from "../../packages/excalidraw/data/blob";
import { safelyParseJSON } from "../../packages/excalidraw/utils";
} from "@excalidraw/excalidraw";
import { getDataURL } from "@excalidraw/excalidraw/data/blob";
import { safelyParseJSON } from "@excalidraw/common";
import type { ExcalidrawImperativeAPI } from "@excalidraw/excalidraw/types";
export const AIComponents = ({
excalidrawAPI,
@@ -72,7 +73,7 @@ export const AIComponents = ({
</br>
<div>You can also try <a href="${
import.meta.env.VITE_APP_PLUS_LP
}/plus?utm_source=excalidraw&utm_medium=app&utm_content=d2c" target="_blank" rel="noreferrer noopener">Excalidraw+</a> to get more requests.</div>
}/plus?utm_source=excalidraw&utm_medium=app&utm_content=d2c" target="_blank" rel="noopener">Excalidraw+</a> to get more requests.</div>
</div>
</body>
</html>`,

View File

@@ -1,9 +1,11 @@
import { Footer } from "@excalidraw/excalidraw/index";
import React from "react";
import { Footer } from "../../packages/excalidraw/index";
import { isExcalidrawPlusSignedUser } from "../app_constants";
import { DebugFooter, isVisualDebuggerEnabled } from "./DebugCanvas";
import { EncryptedIcon } from "./EncryptedIcon";
import { ExcalidrawPlusAppLink } from "./ExcalidrawPlusAppLink";
import { isExcalidrawPlusSignedUser } from "../app_constants";
import { DebugFooter, isVisualDebuggerEnabled } from "./DebugCanvas";
export const AppFooter = React.memo(
({ onChange }: { onChange: () => void }) => {

View File

@@ -1,13 +1,18 @@
import React from "react";
import {
loginIcon,
ExcalLogo,
eyeIcon,
} from "../../packages/excalidraw/components/icons";
import type { Theme } from "../../packages/excalidraw/element/types";
import { MainMenu } from "../../packages/excalidraw/index";
import { isExcalidrawPlusSignedUser } from "../app_constants";
} from "@excalidraw/excalidraw/components/icons";
import { MainMenu } from "@excalidraw/excalidraw/index";
import React from "react";
import { isDevEnv } from "@excalidraw/common";
import type { Theme } from "@excalidraw/element/types";
import { LanguageList } from "../app-language/LanguageList";
import { isExcalidrawPlusSignedUser } from "../app_constants";
import { saveDebugState } from "./DebugCanvas";
export const AppMainMenu: React.FC<{
@@ -54,7 +59,7 @@ export const AppMainMenu: React.FC<{
>
{isExcalidrawPlusSignedUser ? "Sign in" : "Sign up"}
</MainMenu.ItemLink>
{import.meta.env.DEV && (
{isDevEnv() && (
<MainMenu.Item
icon={eyeIcon}
onClick={() => {

View File

@@ -1,9 +1,10 @@
import { loginIcon } from "@excalidraw/excalidraw/components/icons";
import { POINTER_EVENTS } from "@excalidraw/common";
import { useI18n } from "@excalidraw/excalidraw/i18n";
import { WelcomeScreen } from "@excalidraw/excalidraw/index";
import React from "react";
import { loginIcon } from "../../packages/excalidraw/components/icons";
import { useI18n } from "../../packages/excalidraw/i18n";
import { WelcomeScreen } from "../../packages/excalidraw/index";
import { isExcalidrawPlusSignedUser } from "../app_constants";
import { POINTER_EVENTS } from "../../packages/excalidraw/constants";
export const AppWelcomeScreen: React.FC<{
onCollabDialogOpen: () => any;

View File

@@ -1,22 +1,30 @@
import { forwardRef, useCallback, useImperativeHandle, useRef } from "react";
import { type AppState } from "../../packages/excalidraw/types";
import { throttleRAF } from "../../packages/excalidraw/utils";
import {
bootstrapCanvas,
getNormalizedCanvasDimensions,
} from "../../packages/excalidraw/renderer/helpers";
import type { DebugElement } from "../../packages/excalidraw/visualdebug";
import {
ArrowheadArrowIcon,
CloseIcon,
TrashIcon,
} from "../../packages/excalidraw/components/icons";
import { STORAGE_KEYS } from "../app_constants";
} from "@excalidraw/excalidraw/components/icons";
import {
bootstrapCanvas,
getNormalizedCanvasDimensions,
} from "@excalidraw/excalidraw/renderer/helpers";
import { type AppState } from "@excalidraw/excalidraw/types";
import { throttleRAF } from "@excalidraw/common";
import { useCallback } from "react";
import {
isLineSegment,
type GlobalPoint,
type LineSegment,
} from "../../packages/math";
} from "@excalidraw/math";
import { isCurve } from "@excalidraw/math/curve";
import React from "react";
import type { Curve } from "@excalidraw/math";
import type { DebugElement } from "@excalidraw/utils/visualdebug";
import { STORAGE_KEYS } from "../app_constants";
const renderLine = (
context: CanvasRenderingContext2D,
@@ -33,6 +41,28 @@ const renderLine = (
context.restore();
};
const renderCubicBezier = (
context: CanvasRenderingContext2D,
zoom: number,
[start, control1, control2, end]: Curve<GlobalPoint>,
color: string,
) => {
context.save();
context.strokeStyle = color;
context.beginPath();
context.moveTo(start[0] * zoom, start[1] * zoom);
context.bezierCurveTo(
control1[0] * zoom,
control1[1] * zoom,
control2[0] * zoom,
control2[1] * zoom,
end[0] * zoom,
end[1] * zoom,
);
context.stroke();
context.restore();
};
const renderOrigin = (context: CanvasRenderingContext2D, zoom: number) => {
context.strokeStyle = "#888";
context.save();
@@ -60,6 +90,16 @@ const render = (
el.color,
);
break;
case isCurve(el.data):
renderCubicBezier(
context,
appState.zoom.value,
el.data as Curve<GlobalPoint>,
el.color,
);
break;
default:
throw new Error(`Unknown element type ${JSON.stringify(el)}`);
}
});
};
@@ -75,10 +115,6 @@ const _debugRenderer = (
scale,
);
if (appState.height !== canvas.height || appState.width !== canvas.width) {
refresh();
}
const context = bootstrapCanvas({
canvas,
scale,
@@ -278,17 +314,10 @@ interface DebugCanvasProps {
scale: number;
}
const DebugCanvas = forwardRef<HTMLCanvasElement, DebugCanvasProps>(
const DebugCanvas = React.forwardRef<HTMLCanvasElement, DebugCanvasProps>(
({ appState, scale }, ref) => {
const { width, height } = appState;
const canvasRef = useRef<HTMLCanvasElement>(null);
useImperativeHandle<HTMLCanvasElement | null, HTMLCanvasElement | null>(
ref,
() => canvasRef.current,
[canvasRef],
);
return (
<canvas
style={{
@@ -300,7 +329,7 @@ const DebugCanvas = forwardRef<HTMLCanvasElement, DebugCanvasProps>(
}}
width={width * scale}
height={height * scale}
ref={canvasRef}
ref={ref}
>
Debug Canvas
</canvas>

View File

@@ -1,6 +1,6 @@
import { shield } from "../../packages/excalidraw/components/icons";
import { Tooltip } from "../../packages/excalidraw/components/Tooltip";
import { useI18n } from "../../packages/excalidraw/i18n";
import { Tooltip } from "@excalidraw/excalidraw/components/Tooltip";
import { shield } from "@excalidraw/excalidraw/components/icons";
import { useI18n } from "@excalidraw/excalidraw/i18n";
export const EncryptedIcon = () => {
const { t } = useI18n();
@@ -8,9 +8,9 @@ export const EncryptedIcon = () => {
return (
<a
className="encrypted-icon tooltip"
href="https://blog.excalidraw.com/end-to-end-encryption/"
href="https://plus.excalidraw.com/blog/end-to-end-encryption"
target="_blank"
rel="noopener noreferrer"
rel="noopener"
aria-label={t("encrypted.link")}
>
<Tooltip label={t("encrypted.tooltip")} long={true}>

View File

@@ -10,7 +10,7 @@ export const ExcalidrawPlusAppLink = () => {
import.meta.env.VITE_APP_PLUS_APP
}?utm_source=excalidraw&utm_medium=app&utm_content=signedInUserRedirectButton#excalidraw-redirect`}
target="_blank"
rel="noreferrer"
rel="noopener"
className="plus-button"
>
Go to Excalidraw+

View File

@@ -1,30 +1,33 @@
import React from "react";
import { Card } from "../../packages/excalidraw/components/Card";
import { ToolButton } from "../../packages/excalidraw/components/ToolButton";
import { serializeAsJSON } from "../../packages/excalidraw/data/json";
import { loadFirebaseStorage, saveFilesToFirebase } from "../data/firebase";
import { uploadBytes, ref } from "firebase/storage";
import { nanoid } from "nanoid";
import { trackEvent } from "@excalidraw/excalidraw/analytics";
import { Card } from "@excalidraw/excalidraw/components/Card";
import { ExcalidrawLogo } from "@excalidraw/excalidraw/components/ExcalidrawLogo";
import { ToolButton } from "@excalidraw/excalidraw/components/ToolButton";
import { MIME_TYPES, getFrame } from "@excalidraw/common";
import {
encryptData,
generateEncryptionKey,
} from "@excalidraw/excalidraw/data/encryption";
import { serializeAsJSON } from "@excalidraw/excalidraw/data/json";
import { isInitializedImageElement } from "@excalidraw/element";
import { useI18n } from "@excalidraw/excalidraw/i18n";
import type {
FileId,
NonDeletedExcalidrawElement,
} from "../../packages/excalidraw/element/types";
} from "@excalidraw/element/types";
import type {
AppState,
BinaryFileData,
BinaryFiles,
} from "../../packages/excalidraw/types";
import { nanoid } from "nanoid";
import { useI18n } from "../../packages/excalidraw/i18n";
import {
encryptData,
generateEncryptionKey,
} from "../../packages/excalidraw/data/encryption";
import { isInitializedImageElement } from "../../packages/excalidraw/element/typeChecks";
} from "@excalidraw/excalidraw/types";
import { FILE_UPLOAD_MAX_BYTES } from "../app_constants";
import { encodeFilesForUpload } from "../data/FileManager";
import { MIME_TYPES } from "../../packages/excalidraw/constants";
import { trackEvent } from "../../packages/excalidraw/analytics";
import { getFrame } from "../../packages/excalidraw/utils";
import { ExcalidrawLogo } from "../../packages/excalidraw/components/ExcalidrawLogo";
import { loadFirebaseStorage, saveFilesToFirebase } from "../data/firebase";
export const exportToExcalidrawPlus = async (
elements: readonly NonDeletedExcalidrawElement[],
@@ -32,7 +35,7 @@ export const exportToExcalidrawPlus = async (
files: BinaryFiles,
name: string,
) => {
const firebase = await loadFirebaseStorage();
const storage = await loadFirebaseStorage();
const id = `${nanoid(12)}`;
@@ -49,15 +52,13 @@ export const exportToExcalidrawPlus = async (
},
);
await firebase
.storage()
.ref(`/migrations/scenes/${id}`)
.put(blob, {
customMetadata: {
data: JSON.stringify({ version: 2, name }),
created: Date.now().toString(),
},
});
const storageRef = ref(storage, `/migrations/scenes/${id}`);
await uploadBytes(storageRef, blob, {
customMetadata: {
data: JSON.stringify({ version: 2, name }),
created: Date.now().toString(),
},
});
const filesMap = new Map<FileId, BinaryFileData>();
for (const element of elements) {

View File

@@ -1,7 +1,8 @@
import { THEME } from "@excalidraw/common";
import oc from "open-color";
import React from "react";
import { THEME } from "../../packages/excalidraw/constants";
import type { Theme } from "../../packages/excalidraw/element/types";
import type { Theme } from "@excalidraw/element/types";
// https://github.com/tholman/github-corners
export const GitHubCorner = React.memo(

View File

@@ -1,7 +1,7 @@
import React from "react";
import Trans from "@excalidraw/excalidraw/components/Trans";
import { t } from "@excalidraw/excalidraw/i18n";
import * as Sentry from "@sentry/browser";
import { t } from "../../packages/excalidraw/i18n";
import Trans from "../../packages/excalidraw/components/Trans";
import React from "react";
interface TopErrorBoundaryState {
hasError: boolean;

View File

@@ -1,29 +1,42 @@
import { StoreAction } from "../../packages/excalidraw";
import { compressData } from "../../packages/excalidraw/data/encode";
import { newElementWith } from "../../packages/excalidraw/element/mutateElement";
import { isInitializedImageElement } from "../../packages/excalidraw/element/typeChecks";
import { CaptureUpdateAction } from "@excalidraw/excalidraw";
import { compressData } from "@excalidraw/excalidraw/data/encode";
import { newElementWith } from "@excalidraw/element";
import { isInitializedImageElement } from "@excalidraw/element";
import { t } from "@excalidraw/excalidraw/i18n";
import type {
ExcalidrawElement,
ExcalidrawImageElement,
FileId,
InitializedExcalidrawImageElement,
} from "../../packages/excalidraw/element/types";
import { t } from "../../packages/excalidraw/i18n";
} from "@excalidraw/element/types";
import type {
BinaryFileData,
BinaryFileMetadata,
ExcalidrawImperativeAPI,
BinaryFiles,
} from "../../packages/excalidraw/types";
} from "@excalidraw/excalidraw/types";
type FileVersion = Required<BinaryFileData>["version"];
export class FileManager {
/** files being fetched */
private fetchingFiles = new Map<ExcalidrawImageElement["fileId"], true>();
private erroredFiles_fetch = new Map<
ExcalidrawImageElement["fileId"],
true
>();
/** files being saved */
private savingFiles = new Map<ExcalidrawImageElement["fileId"], true>();
private savingFiles = new Map<
ExcalidrawImageElement["fileId"],
FileVersion
>();
/* files already saved to persistent storage */
private savedFiles = new Map<ExcalidrawImageElement["fileId"], true>();
private erroredFiles = new Map<ExcalidrawImageElement["fileId"], true>();
private savedFiles = new Map<ExcalidrawImageElement["fileId"], FileVersion>();
private erroredFiles_save = new Map<
ExcalidrawImageElement["fileId"],
FileVersion
>();
private _getFiles;
private _saveFiles;
@@ -37,8 +50,8 @@ export class FileManager {
erroredFiles: Map<FileId, true>;
}>;
saveFiles: (data: { addedFiles: Map<FileId, BinaryFileData> }) => Promise<{
savedFiles: Map<FileId, true>;
erroredFiles: Map<FileId, true>;
savedFiles: Map<FileId, BinaryFileData>;
erroredFiles: Map<FileId, BinaryFileData>;
}>;
}) {
this._getFiles = getFiles;
@@ -46,19 +59,28 @@ export class FileManager {
}
/**
* returns whether file is already saved or being processed
* returns whether file is saved/errored, or being processed
*/
isFileHandled = (id: FileId) => {
isFileTracked = (id: FileId) => {
return (
this.savedFiles.has(id) ||
this.fetchingFiles.has(id) ||
this.savingFiles.has(id) ||
this.erroredFiles.has(id)
this.fetchingFiles.has(id) ||
this.erroredFiles_fetch.has(id) ||
this.erroredFiles_save.has(id)
);
};
isFileSaved = (id: FileId) => {
return this.savedFiles.has(id);
isFileSavedOrBeingSaved = (file: BinaryFileData) => {
const fileVersion = this.getFileVersion(file);
return (
this.savedFiles.get(file.id) === fileVersion ||
this.savingFiles.get(file.id) === fileVersion
);
};
getFileVersion = (file: BinaryFileData) => {
return file.version ?? 1;
};
saveFiles = async ({
@@ -71,13 +93,16 @@ export class FileManager {
const addedFiles: Map<FileId, BinaryFileData> = new Map();
for (const element of elements) {
const fileData =
isInitializedImageElement(element) && files[element.fileId];
if (
isInitializedImageElement(element) &&
files[element.fileId] &&
!this.isFileHandled(element.fileId)
fileData &&
// NOTE if errored during save, won't retry due to this check
!this.isFileSavedOrBeingSaved(fileData)
) {
addedFiles.set(element.fileId, files[element.fileId]);
this.savingFiles.set(element.fileId, true);
this.savingFiles.set(element.fileId, this.getFileVersion(fileData));
}
}
@@ -86,8 +111,12 @@ export class FileManager {
addedFiles,
});
for (const [fileId] of savedFiles) {
this.savedFiles.set(fileId, true);
for (const [fileId, fileData] of savedFiles) {
this.savedFiles.set(fileId, this.getFileVersion(fileData));
}
for (const [fileId, fileData] of erroredFiles) {
this.erroredFiles_save.set(fileId, this.getFileVersion(fileData));
}
return {
@@ -121,10 +150,10 @@ export class FileManager {
const { loadedFiles, erroredFiles } = await this._getFiles(ids);
for (const file of loadedFiles) {
this.savedFiles.set(file.id, true);
this.savedFiles.set(file.id, this.getFileVersion(file));
}
for (const [fileId] of erroredFiles) {
this.erroredFiles.set(fileId, true);
this.erroredFiles_fetch.set(fileId, true);
}
return { loadedFiles, erroredFiles };
@@ -160,7 +189,7 @@ export class FileManager {
): element is InitializedExcalidrawImageElement => {
return (
isInitializedImageElement(element) &&
this.isFileSaved(element.fileId) &&
this.savedFiles.has(element.fileId) &&
element.status === "pending"
);
};
@@ -169,7 +198,8 @@ export class FileManager {
this.fetchingFiles.clear();
this.savingFiles.clear();
this.savedFiles.clear();
this.erroredFiles.clear();
this.erroredFiles_fetch.clear();
this.erroredFiles_save.clear();
}
}
@@ -239,6 +269,6 @@ export const updateStaleImageStatuses = (params: {
}
return element;
}),
storeAction: StoreAction.UPDATE,
captureUpdate: CaptureUpdateAction.NEVER,
});
};

View File

@@ -10,6 +10,13 @@
* (localStorage, indexedDB).
*/
import { clearAppStateForLocalStorage } from "@excalidraw/excalidraw/appState";
import {
CANVAS_SEARCH_TAB,
DEFAULT_SIDEBAR,
debounce,
} from "@excalidraw/common";
import { clearElementsForLocalStorage } from "@excalidraw/element";
import {
createStore,
entries,
@@ -19,32 +26,29 @@ import {
setMany,
get,
} from "idb-keyval";
import { clearAppStateForLocalStorage } from "../../packages/excalidraw/appState";
import {
CANVAS_SEARCH_TAB,
DEFAULT_SIDEBAR,
} from "../../packages/excalidraw/constants";
import type { LibraryPersistedData } from "../../packages/excalidraw/data/library";
import type { ImportedDataState } from "../../packages/excalidraw/data/types";
import { clearElementsForLocalStorage } from "../../packages/excalidraw/element";
import type {
ExcalidrawElement,
FileId,
} from "../../packages/excalidraw/element/types";
import { appJotaiStore, atom } from "excalidraw-app/app-jotai";
import type { LibraryPersistedData } from "@excalidraw/excalidraw/data/library";
import type { ImportedDataState } from "@excalidraw/excalidraw/data/types";
import type { ExcalidrawElement, FileId } from "@excalidraw/element/types";
import type {
AppState,
BinaryFileData,
BinaryFiles,
} from "../../packages/excalidraw/types";
import type { MaybePromise } from "../../packages/excalidraw/utility-types";
import { debounce } from "../../packages/excalidraw/utils";
} from "@excalidraw/excalidraw/types";
import type { MaybePromise } from "@excalidraw/common/utility-types";
import { SAVE_TO_LOCAL_STORAGE_TIMEOUT, STORAGE_KEYS } from "../app_constants";
import { FileManager } from "./FileManager";
import { Locker } from "./Locker";
import { updateBrowserStateVersion } from "./tabSync";
const filesStore = createStore("files-db", "files-store");
export const localStorageQuotaExceededAtom = atom(false);
class LocalFileManager extends FileManager {
clearObsoleteFiles = async (opts: { currentFileIds: FileId[] }) => {
await entries(filesStore).then((entries) => {
@@ -69,6 +73,9 @@ const saveDataStateToLocalStorage = (
elements: readonly ExcalidrawElement[],
appState: AppState,
) => {
const localStorageQuotaExceeded = appJotaiStore.get(
localStorageQuotaExceededAtom,
);
try {
const _appState = clearAppStateForLocalStorage(appState);
@@ -88,12 +95,22 @@ const saveDataStateToLocalStorage = (
JSON.stringify(_appState),
);
updateBrowserStateVersion(STORAGE_KEYS.VERSION_DATA_STATE);
if (localStorageQuotaExceeded) {
appJotaiStore.set(localStorageQuotaExceededAtom, false);
}
} catch (error: any) {
// Unable to access window.localStorage
console.error(error);
if (isQuotaExceededError(error) && !localStorageQuotaExceeded) {
appJotaiStore.set(localStorageQuotaExceededAtom, true);
}
}
};
const isQuotaExceededError = (error: any) => {
return error instanceof DOMException && error.name === "QuotaExceededError";
};
type SavingLockTypes = "collaboration";
export class LocalData {
@@ -183,8 +200,8 @@ export class LocalData {
);
},
async saveFiles({ addedFiles }) {
const savedFiles = new Map<FileId, true>();
const erroredFiles = new Map<FileId, true>();
const savedFiles = new Map<FileId, BinaryFileData>();
const erroredFiles = new Map<FileId, BinaryFileData>();
// before we use `storage` event synchronization, let's update the flag
// optimistically. Hopefully nothing fails, and an IDB read executed
@@ -195,10 +212,10 @@ export class LocalData {
[...addedFiles].map(async ([id, fileData]) => {
try {
await set(id, fileData, filesStore);
savedFiles.set(id, true);
savedFiles.set(id, fileData);
} catch (error: any) {
console.error(error);
erroredFiles.set(id, true);
erroredFiles.set(id, fileData);
}
}),
);

View File

@@ -1,30 +1,42 @@
import { reconcileElements } from "../../packages/excalidraw";
import { reconcileElements } from "@excalidraw/excalidraw";
import { MIME_TYPES } from "@excalidraw/common";
import { decompressData } from "@excalidraw/excalidraw/data/encode";
import {
encryptData,
decryptData,
} from "@excalidraw/excalidraw/data/encryption";
import { restoreElements } from "@excalidraw/excalidraw/data/restore";
import { getSceneVersion } from "@excalidraw/element";
import { initializeApp } from "firebase/app";
import {
getFirestore,
doc,
getDoc,
runTransaction,
Bytes,
} from "firebase/firestore";
import { getStorage, ref, uploadBytes } from "firebase/storage";
import type { RemoteExcalidrawElement } from "@excalidraw/excalidraw/data/reconcile";
import type {
ExcalidrawElement,
FileId,
OrderedExcalidrawElement,
} from "../../packages/excalidraw/element/types";
import { getSceneVersion } from "../../packages/excalidraw/element";
import type Portal from "../collab/Portal";
import { restoreElements } from "../../packages/excalidraw/data/restore";
} from "@excalidraw/element/types";
import type {
AppState,
BinaryFileData,
BinaryFileMetadata,
DataURL,
} from "../../packages/excalidraw/types";
} from "@excalidraw/excalidraw/types";
import { FILE_CACHE_MAX_AGE_SEC } from "../app_constants";
import { decompressData } from "../../packages/excalidraw/data/encode";
import {
encryptData,
decryptData,
} from "../../packages/excalidraw/data/encryption";
import { MIME_TYPES } from "../../packages/excalidraw/constants";
import type { SyncableExcalidrawElement } from ".";
import { getSyncableElements } from ".";
import type { ResolutionType } from "../../packages/excalidraw/utility-types";
import type { SyncableExcalidrawElement } from ".";
import type Portal from "../collab/Portal";
import type { Socket } from "socket.io-client";
import type { RemoteExcalidrawElement } from "../../packages/excalidraw/data/reconcile";
// private
// -----------------------------------------------------------------------------
@@ -41,80 +53,42 @@ try {
FIREBASE_CONFIG = {};
}
let firebasePromise: Promise<typeof import("firebase/app").default> | null =
null;
let firestorePromise: Promise<any> | null | true = null;
let firebaseStoragePromise: Promise<any> | null | true = null;
let firebaseApp: ReturnType<typeof initializeApp> | null = null;
let firestore: ReturnType<typeof getFirestore> | null = null;
let firebaseStorage: ReturnType<typeof getStorage> | null = null;
let isFirebaseInitialized = false;
const _loadFirebase = async () => {
const firebase = (
await import(/* webpackChunkName: "firebase" */ "firebase/app")
).default;
if (!isFirebaseInitialized) {
try {
firebase.initializeApp(FIREBASE_CONFIG);
} catch (error: any) {
// trying initialize again throws. Usually this is harmless, and happens
// mainly in dev (HMR)
if (error.code === "app/duplicate-app") {
console.warn(error.name, error.code);
} else {
throw error;
}
}
isFirebaseInitialized = true;
const _initializeFirebase = () => {
if (!firebaseApp) {
firebaseApp = initializeApp(FIREBASE_CONFIG);
}
return firebase;
return firebaseApp;
};
const _getFirebase = async (): Promise<
typeof import("firebase/app").default
> => {
if (!firebasePromise) {
firebasePromise = _loadFirebase();
const _getFirestore = () => {
if (!firestore) {
firestore = getFirestore(_initializeFirebase());
}
return firebasePromise;
return firestore;
};
const _getStorage = () => {
if (!firebaseStorage) {
firebaseStorage = getStorage(_initializeFirebase());
}
return firebaseStorage;
};
// -----------------------------------------------------------------------------
const loadFirestore = async () => {
const firebase = await _getFirebase();
if (!firestorePromise) {
firestorePromise = import(
/* webpackChunkName: "firestore" */ "firebase/firestore"
);
}
if (firestorePromise !== true) {
await firestorePromise;
firestorePromise = true;
}
return firebase;
};
export const loadFirebaseStorage = async () => {
const firebase = await _getFirebase();
if (!firebaseStoragePromise) {
firebaseStoragePromise = import(
/* webpackChunkName: "storage" */ "firebase/storage"
);
}
if (firebaseStoragePromise !== true) {
await firebaseStoragePromise;
firebaseStoragePromise = true;
}
return firebase;
return _getStorage();
};
interface FirebaseStoredScene {
type FirebaseStoredScene = {
sceneVersion: number;
iv: firebase.default.firestore.Blob;
ciphertext: firebase.default.firestore.Blob;
}
iv: Bytes;
ciphertext: Bytes;
};
const encryptElements = async (
key: string,
@@ -175,28 +149,21 @@ export const saveFilesToFirebase = async ({
prefix: string;
files: { id: FileId; buffer: Uint8Array }[];
}) => {
const firebase = await loadFirebaseStorage();
const storage = await loadFirebaseStorage();
const erroredFiles = new Map<FileId, true>();
const savedFiles = new Map<FileId, true>();
const erroredFiles: FileId[] = [];
const savedFiles: FileId[] = [];
await Promise.all(
files.map(async ({ id, buffer }) => {
try {
await firebase
.storage()
.ref(`${prefix}/${id}`)
.put(
new Blob([buffer], {
type: MIME_TYPES.binary,
}),
{
cacheControl: `public, max-age=${FILE_CACHE_MAX_AGE_SEC}`,
},
);
savedFiles.set(id, true);
const storageRef = ref(storage, `${prefix}/${id}`);
await uploadBytes(storageRef, buffer, {
cacheControl: `public, max-age=${FILE_CACHE_MAX_AGE_SEC}`,
});
savedFiles.push(id);
} catch (error: any) {
erroredFiles.set(id, true);
erroredFiles.push(id);
}
}),
);
@@ -205,7 +172,6 @@ export const saveFilesToFirebase = async ({
};
const createFirebaseSceneDocument = async (
firebase: ResolutionType<typeof loadFirestore>,
elements: readonly SyncableExcalidrawElement[],
roomKey: string,
) => {
@@ -213,10 +179,8 @@ const createFirebaseSceneDocument = async (
const { ciphertext, iv } = await encryptElements(roomKey, elements);
return {
sceneVersion,
ciphertext: firebase.firestore.Blob.fromUint8Array(
new Uint8Array(ciphertext),
),
iv: firebase.firestore.Blob.fromUint8Array(iv),
ciphertext: Bytes.fromUint8Array(new Uint8Array(ciphertext)),
iv: Bytes.fromUint8Array(iv),
} as FirebaseStoredScene;
};
@@ -236,20 +200,14 @@ export const saveToFirebase = async (
return null;
}
const firebase = await loadFirestore();
const firestore = firebase.firestore();
const firestore = _getFirestore();
const docRef = doc(firestore, "scenes", roomId);
const docRef = firestore.collection("scenes").doc(roomId);
const storedScene = await firestore.runTransaction(async (transaction) => {
const storedScene = await runTransaction(firestore, async (transaction) => {
const snapshot = await transaction.get(docRef);
if (!snapshot.exists) {
const storedScene = await createFirebaseSceneDocument(
firebase,
elements,
roomKey,
);
if (!snapshot.exists()) {
const storedScene = await createFirebaseSceneDocument(elements, roomKey);
transaction.set(docRef, storedScene);
@@ -269,7 +227,6 @@ export const saveToFirebase = async (
);
const storedScene = await createFirebaseSceneDocument(
firebase,
reconciledElements,
roomKey,
);
@@ -294,17 +251,17 @@ export const loadFromFirebase = async (
roomKey: string,
socket: Socket | null,
): Promise<readonly SyncableExcalidrawElement[] | null> => {
const firebase = await loadFirestore();
const db = firebase.firestore();
const docRef = db.collection("scenes").doc(roomId);
const doc = await docRef.get();
if (!doc.exists) {
const firestore = _getFirestore();
const docRef = doc(firestore, "scenes", roomId);
const docSnap = await getDoc(docRef);
if (!docSnap.exists()) {
return null;
}
const storedScene = doc.data() as FirebaseStoredScene;
const storedScene = docSnap.data() as FirebaseStoredScene;
const elements = getSyncableElements(
restoreElements(await decryptElements(storedScene, roomKey), null),
restoreElements(await decryptElements(storedScene, roomKey), null, {
deleteInvisibleElements: true,
}),
);
if (socket) {

View File

@@ -1,42 +1,46 @@
import {
compressData,
decompressData,
} from "../../packages/excalidraw/data/encode";
} from "@excalidraw/excalidraw/data/encode";
import {
decryptData,
generateEncryptionKey,
IV_LENGTH_BYTES,
} from "../../packages/excalidraw/data/encryption";
import { serializeAsJSON } from "../../packages/excalidraw/data/json";
import { restore } from "../../packages/excalidraw/data/restore";
import type { ImportedDataState } from "../../packages/excalidraw/data/types";
import type { SceneBounds } from "../../packages/excalidraw/element/bounds";
import { isInvisiblySmallElement } from "../../packages/excalidraw/element/sizeHelpers";
import { isInitializedImageElement } from "../../packages/excalidraw/element/typeChecks";
} from "@excalidraw/excalidraw/data/encryption";
import { serializeAsJSON } from "@excalidraw/excalidraw/data/json";
import { restore } from "@excalidraw/excalidraw/data/restore";
import { isInvisiblySmallElement } from "@excalidraw/element";
import { isInitializedImageElement } from "@excalidraw/element";
import { t } from "@excalidraw/excalidraw/i18n";
import { bytesToHexString } from "@excalidraw/common";
import type { UserIdleState } from "@excalidraw/common";
import type { ImportedDataState } from "@excalidraw/excalidraw/data/types";
import type { SceneBounds } from "@excalidraw/element";
import type {
ExcalidrawElement,
FileId,
OrderedExcalidrawElement,
} from "../../packages/excalidraw/element/types";
import { t } from "../../packages/excalidraw/i18n";
} from "@excalidraw/element/types";
import type {
AppState,
BinaryFileData,
BinaryFiles,
SocketId,
UserIdleState,
} from "../../packages/excalidraw/types";
import type { MakeBrand } from "../../packages/excalidraw/utility-types";
import { bytesToHexString } from "../../packages/excalidraw/utils";
import type { WS_SUBTYPES } from "../app_constants";
} from "@excalidraw/excalidraw/types";
import type { MakeBrand } from "@excalidraw/common/utility-types";
import {
DELETED_ELEMENT_TIMEOUT,
FILE_UPLOAD_MAX_BYTES,
ROOM_ID_BYTES,
} from "../app_constants";
import { encodeFilesForUpload } from "./FileManager";
import { saveFilesToFirebase } from "./firebase";
import type { WS_SUBTYPES } from "../app_constants";
export type SyncableExcalidrawElement = OrderedExcalidrawElement &
MakeBrand<"SyncableExcalidrawElement">;
@@ -254,11 +258,16 @@ export const loadScene = async (
await importFromBackend(id, privateKey),
localDataState?.appState,
localDataState?.elements,
{ repairBindings: true, refreshDimensions: false },
{
repairBindings: true,
refreshDimensions: false,
deleteInvisibleElements: true,
},
);
} else {
data = restore(localDataState || null, null, null, {
repairBindings: true,
deleteInvisibleElements: true,
});
}

Some files were not shown because too many files have changed in this diff Show More