Compare commits

..

2028 Commits

Author SHA1 Message Date
Excalidraw Bot
c507d1726a New translations en.json (Portuguese) 2025-02-04 11:04:24 +01:00
Excalidraw Bot
d6ef71c15c New translations en.json (German) 2025-01-22 20:35:23 +01:00
Excalidraw Bot
4b9978cd57 New translations en.json (Slovak) 2025-01-21 03:20:22 +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
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
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
Excalidraw Bot
f8935be5fd New translations en.json (Chinese Traditional) 2025-01-07 08:35:18 +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
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
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
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
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
Excalidraw Bot
4d22570b55 New translations en.json (Czech) 2024-12-17 12:44:37 +01: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
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
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
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
Excalidraw Bot
911acf5563 New translations en.json (Indonesian) 2024-11-26 18:06:22 +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
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
Excalidraw Bot
7173691477 New translations en.json (Chinese Simplified) 2024-10-26 12:43:37 +02:00
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
909 changed files with 45806 additions and 107004 deletions

View File

@@ -4,16 +4,8 @@
!.eslintrc.json
!.npmrc
!.prettierrc
!excalidraw-app/
!package.json
!public/
!packages/
!scripts/
!tsconfig.json
!yarn.lock
# keep (sub)sub directories at the end to exclude from explicit included
# e.g. ./packages/excalidraw/{dist,node_modules}
**/build
**/dist
**/node_modules

View File

@@ -8,7 +8,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=http://localhost:3000
VITE_APP_PLUS_APP=https://app.excalidraw.com
VITE_APP_AI_BACKEND=http://localhost:3015
@@ -17,10 +17,12 @@ VITE_APP_FIREBASE_CONFIG='{"apiKey":"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8","a
# put these in your .env.local, or make sure you don't commit!
# must be lowercase `true` when turned on
#
# whether to enable Service Workers in development
VITE_APP_DEV_ENABLE_SW=
# whether to disable live reload / HMR. Usuaully what you want to do when
# debugging Service Workers.
VITE_APP_DEV_DISABLE_LIVE_RELOAD=
VITE_APP_ENABLE_TRACKING=true
VITE_APP_DISABLE_TRACKING=true
FAST_REFRESH=false
@@ -37,14 +39,3 @@ 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'

View File

@@ -14,19 +14,4 @@ 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
VITE_APP_DISABLE_TRACKING=

View File

@@ -6,6 +6,3 @@ firebase/
dist/
public/workbox
packages/excalidraw/types
examples/**/public
dev-dist
coverage

View File

@@ -2,21 +2,6 @@
"extends": ["@excalidraw/eslint-config", "react-app"],
"rules": {
"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"
}
],
"no-restricted-imports": [
"error",
{
"name": "jotai",
"message": "Do not import from \"jotai\" directly. Use our app-specific modules (\"editor-jotai\" or \"app-jotai\")."
}
]
"no-restricted-globals": "off"
}
}

View File

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

View File

@@ -11,6 +11,6 @@ jobs:
semantic:
runs-on: ubuntu-latest
steps:
- uses: amannn/action-semantic-pull-request@v5
- uses: amannn/action-semantic-pull-request@v3.0.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -1,16 +1,14 @@
name: Tests
on:
push:
branches: master
on: pull_request
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v2
- name: Setup Node.js 18.x
uses: actions/setup-node@v4
uses: actions/setup-node@v2
with:
node-version: 18.x
- name: Install and test

1
.gitignore vendored
View File

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

View File

@@ -2,18 +2,16 @@ FROM node:18 AS build
WORKDIR /opt/node_app
COPY . .
# do not ignore optional dependencies:
# Error: Cannot find module @rollup/rollup-linux-x64-gnu
RUN yarn --network-timeout 600000
COPY package.json yarn.lock ./
RUN yarn --ignore-optional --network-timeout 600000
ARG NODE_ENV=production
COPY . .
RUN yarn build:app:docker
FROM nginx:1.27-alpine
FROM nginx:1.21-alpine
COPY --from=build /opt/node_app/excalidraw-app/build /usr/share/nginx/html
COPY --from=build /opt/node_app/build /usr/share/nginx/html
HEALTHCHECK CMD wget -q -O /dev/null http://localhost || exit 1

View File

@@ -7,7 +7,7 @@
<h4 align="center">
<a href="https://excalidraw.com">Excalidraw Editor</a> |
<a href="https://plus.excalidraw.com/blog">Blog</a> |
<a href="https://blog.excalidraw.com">Blog</a> |
<a href="https://docs.excalidraw.com">Documentation</a> |
<a href="https://plus.excalidraw.com">Excalidraw+</a>
</h4>
@@ -87,11 +87,13 @@ 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
```
or via yarn
```
yarn add react react-dom @excalidraw/excalidraw
```

View File

@@ -133,7 +133,7 @@ function App() {
}
```
Here is a [complete list](https://github.com/excalidraw/excalidraw/blob/master/packages/excalidraw/components/main-menu/DefaultItems.tsx) of the default items.
Here is a [complete list](https://github.com/excalidraw/excalidraw/blob/master/packages/excalidraw/components/mainMenu/DefaultItems.tsx) of the default items.
### MainMenu.Group

View File

@@ -31,7 +31,7 @@ The welcome screen consists of two main groups of subcomponents:
<img
src={require("@site/static/img/welcome-screen-overview.png").default}
alt="Excalidraw logo: Sketch hand-drawn like diagrams."
alt="Excalidraw logo: Sketch handrawn like diagrams."
/>
### Center

View File

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

View File

@@ -13,7 +13,7 @@ Once the callback is triggered, you will need to store the api in state to acces
```jsx showLineNumbers
export default function App() {
const [excalidrawAPI, setExcalidrawAPI] = useState(null);
return <Excalidraw excalidrawAPI={(api)=> setExcalidrawAPI(api)} />;
return <Excalidraw excalidrawAPI={{(api)=> setExcalidrawAPI(api)}} />;
}
```
@@ -22,7 +22,7 @@ You can use this prop when you want to access some [Excalidraw APIs](https://git
| API | Signature | Usage |
| --- | --- | --- |
| [updateScene](#updatescene) | `function` | updates the scene with the sceneData |
| [updateLibrary](#updatelibrary) | `function` | updates the library |
| [updateLibrary](#updatelibrary) | `function` | updates the scene with the sceneData |
| [addFiles](#addfiles) | `function` | add files data to the appState |
| [resetScene](#resetscene) | `function` | Resets the scene. If `resetLoadingState` is passed as true then it will also force set the loading state to false. |
| [getSceneElementsIncludingDeleted](#getsceneelementsincludingdeleted) | `function` | Returns all the elements including the deleted in the scene |
@@ -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. |
| `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. |
| `commitToHistory` | `boolean` | Implies if the `history (undo/redo)` should be recorded. Defaults to `false`. |
```jsx live
function App() {
@@ -105,7 +105,6 @@ function App() {
appState: {
viewBackgroundColor: "#edf2ff",
},
captureUpdate: CaptureUpdateAction.IMMEDIATELY,
};
excalidrawAPI.updateScene(sceneData);
};
@@ -116,24 +115,12 @@ function App() {
<button className="custom-button" onClick={updateScene}>
Update Scene
</button>
<Excalidraw excalidrawAPI={(api) => setExcalidrawAPI(api)} />
<Excalidraw ref={(api) => setExcalidrawAPI(api)} />
</div>
);
}
```
#### 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>
@@ -201,7 +188,7 @@ function App() {
Update Library
</button>
<Excalidraw
excalidrawAPI={(api) => setExcalidrawAPI(api)}
ref={(api) => setExcalidrawAPI(api)}
// initial data retrieved from https://github.com/excalidraw/excalidraw/blob/master/dev-docs/packages/excalidraw/initialData.js
initialData={{
libraryItems: initialData.libraryItems,

View File

@@ -3,32 +3,31 @@
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. |
| [`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. |
| [`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 evenets |
| [`onScrollChange`](#onscrollchange) | `function` | _ | This prop if passed gets triggered when scrolling the canvas. |
| [`onPaste`](#onpaste) | `function` | _ | Callback to be triggered if passed when the something is pasted in to 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. |
| [`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 |
| [`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 |
| [`renderEmbeddable`](/docs/@excalidraw/excalidraw/api/props/render-props#renderEmbeddable) | `function` | \_ | Render function that can override the built-in `<iframe>` |
@@ -94,8 +93,9 @@ 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,14 +143,6 @@ 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()`.
@@ -215,7 +207,8 @@ 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
@@ -227,6 +220,7 @@ 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

@@ -20,7 +20,7 @@ exportToCanvas(&#123;<br/>&nbsp;
getDimensions,<br/>&nbsp;
files,<br/>&nbsp;
exportPadding?: number;<br/>
&#125;: <a href="https://github.com/excalidraw/excalidraw/blob/master/packages/utils/export.ts#L24">ExportOpts</a>
&#125;: <a href="https://github.com/excalidraw/excalidraw/blob/master/packages/excalidraw/packages/utils.ts#L21">ExportOpts</a>
</pre>
| Name | Type | Default | Description |
@@ -90,7 +90,7 @@ function App() {
<img src={canvasUrl} alt="" />
</div>
<div style={{ height: "400px" }}>
<Excalidraw excalidrawAPI={(api) => setExcalidrawAPI(api)}
<Excalidraw ref={(api) => setExcalidrawAPI(api)}
/>
</div>
</>

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, normalizeIndices?: boolean }<br/>
opts: &#123; refreshDimensions?: boolean, repairBindings?: boolean }<br/>
)
</pre>
@@ -51,9 +51,8 @@ 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. |
| `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. |
| `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. |
**_How to use_**
@@ -74,7 +73,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, normalizeIndices?: boolean }<br/>
opts: &#123; refreshDimensions?: boolean, repairBindings?: boolean }<br/>
)
</pre>

View File

@@ -13,18 +13,18 @@ To start the example app using the `@excalidraw/excalidraw` package, follow the
1. Install the dependencies
```bash
yarn
cd packages/excalidraw && yarn
```
2. Start the example app
```bash
yarn start:example
yarn start
```
[http://localhost:3001](http://localhost:3001) will open in your default browser.
This is the same example as the [CodeSandbox](https://codesandbox.io/p/sandbox/github/excalidraw/excalidraw/tree/mrazator/release-v18/examples/with-script-in-browser) example.
The example is same as the [codesandbox example](https://ehlz3.csb.app/)
## Releasing

View File

@@ -17,9 +17,11 @@ 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,12 +1,16 @@
# Installation
**Excalidraw** is exported as a component to be directly embedded in your project.
**Excalidraw** is published to npm as a component you can directly embed in your projects.
Use `npm` or `yarn` to install the package.
Using `npm`:
```bash
npm install react react-dom @excalidraw/excalidraw
# or
```
or `yarn`:
```bash
yarn add react react-dom @excalidraw/excalidraw
```
@@ -16,40 +20,24 @@ yarn add react react-dom @excalidraw/excalidraw
:::
### Self-hosting fonts
### Static assets
By default, Excalidraw will try to download all the used fonts from the [CDN](https://esm.run/@excalidraw/excalidraw/dist/prod).
Excalidraw depends on assets such as localization files (if you opt to use them), fonts, and others.
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:
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:
```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
Go to [CodeSandbox](https://codesandbox.io/p/sandbox/github/excalidraw/excalidraw/tree/mrazator/release-v18/examples/with-script-in-browser) example.
[Try here](https://codesandbox.io/s/excalidraw-ehlz3).

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.
:::
@@ -70,9 +70,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 +84,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 +97,7 @@ If you are using `pages router` then importing the wrapper dynamically would wor
export default function Page() {
return (
<ExcalidrawWrapper />
<ExcalidrawWrapper />
);
}
```
@@ -108,7 +108,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,10 +128,11 @@ 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/).
The `types` are available at `@excalidraw/excalidraw/types`, check [CodeSandbox](https://codesandbox.io/p/sandbox/github/excalidraw/excalidraw/tree/mrazator/release-v18/examples/with-script-in-browser) example for details.
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)
### Preact
@@ -152,13 +153,31 @@ 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 Excalidraw in a browser directly, use the following setup :point_down:
To use it in a browser directly:
> **Note**: We rely on import maps to de-duplicate `react`, `react-dom` and `react/jsx-runtime` versions.
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`.
import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";
@@ -172,23 +191,13 @@ import TabItem from "@theme/TabItem";
<head>
<title>Excalidraw in browser</title>
<meta charset="UTF-8" />
<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>
<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>
</head>
<body>
@@ -205,14 +214,6 @@ 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-rc.1/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,
@@ -234,5 +235,3 @@ root.render(React.createElement(App));
</TabItem>
</Tabs>
You can try it out [here](https://jsfiddle.net/64y130L8/1/).

View File

@@ -14,7 +14,7 @@ This API receives the mermaid syntax as the input, and resolves to skeleton Exca
import { parseMermaidToExcalidraw } from "@excalidraw/mermaid-to-excalidraw";
import { convertToExcalidrawElements} from "@excalidraw/excalidraw"
try {
const { elements, files } = await parseMermaidToExcalidraw(mermaidSyntax: string, {
const { elements, files } = await parseMermaid(mermaidSyntax: string, {
fontSize: number,
});
const excalidrawElements = convertToExcalidrawElements(elements);

View File

@@ -43,7 +43,7 @@ When saving an Excalidraw scene locally to a file, the JSON file (`.excalidraw`)
// editor state (canvas config, preferences, ...)
"appState": {
"gridSize": 20,
"gridSize": null,
"viewBackgroundColor": "#ffffff"
},

View File

@@ -66,7 +66,7 @@ const config = {
label: "Docs",
},
{
to: "https://plus.excalidraw.com/blog",
to: "https://blog.excalidraw.com",
label: "Blog",
position: "left",
},
@@ -111,7 +111,7 @@ const config = {
items: [
{
label: "Blog",
to: "https://plus.excalidraw.com/blog",
to: "https://blog.excalidraw.com",
},
{
label: "GitHub",
@@ -149,29 +149,6 @@ 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,13 +18,13 @@
"@docusaurus/core": "2.2.0",
"@docusaurus/preset-classic": "2.2.0",
"@docusaurus/theme-live-codeblock": "2.2.0",
"@excalidraw/excalidraw": "0.18.0-rc.5",
"@excalidraw/excalidraw": "0.17.0",
"@mdx-js/react": "^1.6.22",
"clsx": "^1.2.1",
"docusaurus-plugin-sass": "0.2.3",
"prism-react-renderer": "^1.3.5",
"react": "18.2.0",
"react-dom": "18.2.0",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"sass": "1.57.1"
},
"devDependencies": {

View File

@@ -59,7 +59,7 @@ pre a {
padding: 5px;
background: #70b1ec;
color: white;
font-weight: 700;
font-weight: bold;
border: none;
}

View File

@@ -3,18 +3,11 @@ 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-rc.5/dist/prod/";
}
const { colorMode } = useColorMode();
return <ExcalidrawComp.Excalidraw theme={colorMode} {...props} ref={ref} />;
});

File diff suppressed because it is too large Load Diff

View File

@@ -12,9 +12,9 @@ import type * as TExcalidraw from "@excalidraw/excalidraw";
import { nanoid } from "nanoid";
import type { ResolvablePromise } from "../utils";
import {
resolvablePromise,
ResolvablePromise,
distance2d,
fileOpen,
withBatchedUpdates,
@@ -33,14 +33,14 @@ import type {
Gesture,
LibraryItems,
PointerDownState as ExcalidrawPointerDownState,
} from "@excalidraw/excalidraw/types";
} from "@excalidraw/excalidraw/dist/excalidraw/types";
import type {
NonDeletedExcalidrawElement,
Theme,
} from "@excalidraw/excalidraw/element/types";
import type { ImportedLibraryData } from "@excalidraw/excalidraw/data/types";
} from "@excalidraw/excalidraw/dist/excalidraw/element/types";
import type { ImportedLibraryData } from "@excalidraw/excalidraw/dist/excalidraw/data/types";
import "./ExampleApp.scss";
import "./App.scss";
type Comment = {
x: number;
@@ -73,7 +73,7 @@ export interface AppProps {
excalidrawLib: typeof TExcalidraw;
}
export default function ExampleApp({
export default function App({
appTitle,
useCustom,
customArgs,
@@ -872,7 +872,7 @@ export default function ExampleApp({
files: excalidrawAPI.getFiles(),
});
const ctx = canvas.getContext("2d")!;
ctx.font = "30px Excalifont";
ctx.font = "30px Virgil";
ctx.strokeText("My custom text", 50, 60);
setCanvasUrl(canvas.toDataURL());
}}
@@ -893,7 +893,7 @@ export default function ExampleApp({
files: excalidrawAPI.getFiles(),
});
const ctx = canvas.getContext("2d")!;
ctx.font = "30px Excalifont";
ctx.font = "30px Virgil";
ctx.strokeText("My custom text", 50, 60);
setCanvasUrl(canvas.toDataURL());
}}

View File

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

View File

@@ -1,5 +1,4 @@
import React from "react";
import type { ExcalidrawImperativeAPI } from "@excalidraw/excalidraw/types";
import { ExcalidrawImperativeAPI } from "@excalidraw/excalidraw/dist/excalidraw/types";
import CustomFooter from "./CustomFooter";
import type * as TExcalidraw from "@excalidraw/excalidraw";

View File

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

View File

@@ -46,7 +46,7 @@ const elements: ExcalidrawElementSkeleton[] = [
];
export default {
elements,
appState: { viewBackgroundColor: "#AFEEEE", currentItemFontFamily: 5 },
appState: { viewBackgroundColor: "#AFEEEE", currentItemFontFamily: 1 },
scrollToContent: true,
libraryItems: [
[

View File

@@ -0,0 +1,13 @@
{
"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

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

View File

@@ -1,6 +1,7 @@
import { unstable_batchedUpdates } from "react-dom";
import { fileOpen as _fileOpen } from "browser-fs-access";
import { MIME_TYPES } from "@excalidraw/excalidraw";
import type { MIME_TYPES } from "@excalidraw/excalidraw";
import { AbortError } from "../../packages/excalidraw/errors";
type FILE_EXTENSION = Exclude<keyof typeof MIME_TYPES, "binary">;
@@ -84,7 +85,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 Error("Request Aborted"));
rejectPromise(new AbortError());
}
};
},

View File

@@ -34,6 +34,3 @@ yarn-error.log*
# typescript
*.tsbuildinfo
next-env.d.ts
# copied assets
public/**/*.woff2

View File

@@ -3,22 +3,22 @@
"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:workspace": "yarn workspace @excalidraw/excalidraw run build:esm",
"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": "19.0.0",
"react-dom": "19.0.0"
"react": "^18",
"react-dom": "^18"
},
"devDependencies": {
"@types/node": "^20",
"@types/react": "19.0.10",
"@types/react-dom": "19.0.4",
"@types/react": "^18",
"@types/react-dom": "^18",
"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,4 @@
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
@@ -16,9 +15,7 @@ export default function Page() {
<>
<a href="/excalidraw-in-pages">Switch to Pages router</a>
<h1 className="page-title">App Router</h1>
<Script id="load-env-variables" strategy="beforeInteractive">
{`window["EXCALIDRAW_ASSET_PATH"] = window.origin;`}
</Script>
{/* @ts-expect-error - https://github.com/vercel/next.js/issues/42292 */}
<ExcalidrawWithClientOnly />
</>

View File

@@ -7,7 +7,7 @@ a {
color: #1c7ed6;
font-size: 20px;
text-decoration: none;
font-weight: 500;
font-weight: 550;
}
.page-title {

View File

@@ -1,7 +1,7 @@
"use client";
import * as excalidrawLib from "@excalidraw/excalidraw";
import { Excalidraw } from "@excalidraw/excalidraw";
import App from "../../with-script-in-browser/components/ExampleApp";
import App from "../../components/App";
import "@excalidraw/excalidraw/index.css";

View File

@@ -11,16 +11,16 @@
<title>React App</title>
<script>
window.name = "codesandbox";
window.EXCALIDRAW_ASSET_PATH =
"https://esm.sh/@excalidraw/excalidraw@0.18.0-rc.5/dist/prod/";
</script>
<link rel="stylesheet" href="/dist/dev/index.css" />
<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,4 +1,4 @@
import App from "./components/ExampleApp";
import App from "../components/App";
import React, { StrictMode } from "react";
import { createRoot } from "react-dom/client";

View File

@@ -3,18 +3,17 @@
"version": "1.0.0",
"private": true,
"dependencies": {
"react": "19.0.0",
"react-dom": "19.0.0",
"@excalidraw/excalidraw": "0.18.0-rc.5",
"browser-fs-access": "0.29.1"
"react": "18.2.0",
"react-dom": "18.2.0",
"@excalidraw/excalidraw": "*"
},
"devDependencies": {
"vite": "5.0.12",
"typescript": "^5"
},
"scripts": {
"start": "vite",
"build": "vite build",
"start": "yarn workspace @excalidraw/excalidraw run build:esm && vite",
"build": "yarn workspace @excalidraw/excalidraw run build:esm && vite build",
"build:preview": "yarn build && vite preview --port 5002"
}
}

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

View File

@@ -0,0 +1,313 @@
# 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

@@ -1,5 +0,0 @@
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

@@ -1,35 +0,0 @@
{
// 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,2 +0,0 @@
# copied assets
public/**/*.woff2

View File

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

View File

@@ -1,19 +0,0 @@
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,8 +1,9 @@
import polyfill from "@excalidraw/excalidraw/polyfill";
import polyfill from "../packages/excalidraw/polyfill";
import LanguageDetector from "i18next-browser-languagedetector";
import { useCallback, useEffect, useRef, useState } from "react";
import { trackEvent } from "@excalidraw/excalidraw/analytics";
import { getDefaultAppState } from "@excalidraw/excalidraw/appState";
import { ErrorDialog } from "@excalidraw/excalidraw/components/ErrorDialog";
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,
@@ -10,47 +11,47 @@ import {
THEME,
TITLE_TIMEOUT,
VERSION_TIMEOUT,
} from "@excalidraw/excalidraw/constants";
import { loadFromBlob } from "@excalidraw/excalidraw/data/blob";
import type {
} from "../packages/excalidraw/constants";
import { loadFromBlob } from "../packages/excalidraw/data/blob";
import {
FileId,
NonDeletedExcalidrawElement,
OrderedExcalidrawElement,
} from "@excalidraw/excalidraw/element/types";
import { useCallbackRefState } from "@excalidraw/excalidraw/hooks/useCallbackRefState";
import { t } from "@excalidraw/excalidraw/i18n";
} from "../packages/excalidraw/element/types";
import { useCallbackRefState } from "../packages/excalidraw/hooks/useCallbackRefState";
import { t } from "../packages/excalidraw/i18n";
import {
Excalidraw,
defaultLang,
LiveCollaborationTrigger,
TTDDialog,
TTDDialogTrigger,
CaptureUpdateAction,
reconcileElements,
} from "@excalidraw/excalidraw";
import type {
} from "../packages/excalidraw/index";
import {
AppState,
ExcalidrawImperativeAPI,
BinaryFiles,
ExcalidrawInitialDataState,
UIAppState,
} from "@excalidraw/excalidraw/types";
import type { ResolvablePromise } from "@excalidraw/excalidraw/utils";
} from "../packages/excalidraw/types";
import {
debounce,
getVersion,
getFrame,
isTestEnv,
preventUnload,
ResolvablePromise,
resolvablePromise,
isRunningInIframe,
} from "@excalidraw/excalidraw/utils";
} 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, {
CollabAPI,
collabAPIAtom,
isCollaboratingAtom,
isOfflineAtom,
@@ -66,15 +67,18 @@ import {
importUsernameFromLocalStorage,
} from "./data/localStorage";
import CustomStats from "./CustomStats";
import type { RestoredDataState } from "@excalidraw/excalidraw/data/restore";
import { restore, restoreAppState } from "@excalidraw/excalidraw/data/restore";
import {
restore,
restoreAppState,
RestoredDataState,
} from "../packages/excalidraw/data/restore";
import {
ExportToExcalidrawPlus,
exportToExcalidrawPlus,
} from "./components/ExportToExcalidrawPlus";
import { updateStaleImageStatuses } from "./data/FileManager";
import { newElementWith } from "@excalidraw/excalidraw/element/mutateElement";
import { isInitializedImageElement } from "@excalidraw/excalidraw/element/typeChecks";
import { newElementWith } from "../packages/excalidraw/element/mutateElement";
import { isInitializedImageElement } from "../packages/excalidraw/element/typeChecks";
import { loadFilesFromFirebase } from "./data/firebase";
import {
LibraryIndexedDBAdapter,
@@ -86,31 +90,30 @@ import clsx from "clsx";
import {
parseLibraryTokensFromUrl,
useHandleLibrary,
} from "@excalidraw/excalidraw/data/library";
} from "../packages/excalidraw/data/library";
import { AppMainMenu } from "./components/AppMainMenu";
import { AppWelcomeScreen } from "./components/AppWelcomeScreen";
import { AppFooter } from "./components/AppFooter";
import {
Provider,
useAtom,
useAtomValue,
useAtomWithInitialValue,
appJotaiStore,
} from "./app-jotai";
import { atom, Provider, useAtom, useAtomValue } from "jotai";
import { useAtomWithInitialValue } from "../packages/excalidraw/jotai";
import { appJotaiStore } from "./app-jotai";
import "./index.scss";
import type { ResolutionType } from "@excalidraw/excalidraw/utility-types";
import { ShareableLinkDialog } from "@excalidraw/excalidraw/components/ShareableLinkDialog";
import { openConfirmModal } from "@excalidraw/excalidraw/components/OverwriteConfirm/OverwriteConfirmState";
import { OverwriteConfirmDialog } from "@excalidraw/excalidraw/components/OverwriteConfirm/OverwriteConfirm";
import Trans from "@excalidraw/excalidraw/components/Trans";
import { 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 "@excalidraw/excalidraw/data/reconcile";
import {
RemoteExcalidrawElement,
reconcileElements,
} from "../packages/excalidraw/data/reconcile";
import {
CommandPalette,
DEFAULT_CATEGORIES,
} from "@excalidraw/excalidraw/components/CommandPalette/CommandPalette";
} from "../packages/excalidraw/components/CommandPalette/CommandPalette";
import {
GithubIcon,
XBrandIcon,
@@ -120,55 +123,13 @@ import {
exportToPlus,
share,
youtubeIcon,
} from "@excalidraw/excalidraw/components/icons";
import { useHandleAppTheme } from "./useHandleAppTheme";
import { getPreferredLanguage } from "./app-language/language-detector";
import { useAppLangCode } from "./app-language/language-state";
import DebugCanvas, {
debugRenderer,
isVisualDebuggerEnabled,
loadSavedDebugState,
} from "./components/DebugCanvas";
import { AIComponents } from "./components/AI";
import { ExcalidrawPlusIframeExport } from "./ExcalidrawPlusIframeExport";
import { isElementLink } from "@excalidraw/excalidraw/element/elementLink";
} from "../packages/excalidraw/components/icons";
import { appThemeAtom, useHandleAppTheme } from "./useHandleAppTheme";
polyfill();
window.EXCALIDRAW_THROTTLE_RENDER = true;
declare global {
interface BeforeInstallPromptEventChoiceResult {
outcome: "accepted" | "dismissed";
}
interface BeforeInstallPromptEvent extends Event {
prompt(): Promise<void>;
userChoice: Promise<BeforeInstallPromptEventChoiceResult>;
}
interface WindowEventMap {
beforeinstallprompt: BeforeInstallPromptEvent;
}
}
let pwaEvent: BeforeInstallPromptEvent | null = null;
// Adding a listener outside of the component as it may (?) need to be
// subscribed early to catch the event.
//
// Also note that it will fire only if certain heuristics are met (user has
// used the app for some time, etc.)
window.addEventListener(
"beforeinstallprompt",
(event: BeforeInstallPromptEvent) => {
// prevent Chrome <= 67 from automatically showing the prompt
event.preventDefault();
// cache for later use
pwaEvent = event;
},
);
let isSelfEmbedding = false;
if (window.self !== window.top) {
@@ -183,6 +144,11 @@ if (window.self !== window.top) {
}
}
const languageDetector = new LanguageDetector();
languageDetector.init({
languageUtils: {},
});
const shareableLinkConfirmDialog = {
title: t("overwriteConfirm.modal.shareableLink.title"),
description: (
@@ -328,13 +294,18 @@ const initializeScene = async (opts: {
return { scene: null, isExternalScene: false };
};
const detectedLangCode = languageDetector.detect() || defaultLang.code;
export const appLangCodeAtom = atom(
Array.isArray(detectedLangCode) ? detectedLangCode[0] : detectedLangCode,
);
const ExcalidrawWrapper = () => {
const [errorMessage, setErrorMessage] = useState("");
const [langCode, setLangCode] = useAtom(appLangCodeAtom);
const isCollabDisabled = isRunningInIframe();
const { editorTheme, appTheme, setAppTheme } = useHandleAppTheme();
const [langCode, setLangCode] = useAppLangCode();
const [appTheme, setAppTheme] = useAtom(appThemeAtom);
const { editorTheme } = useHandleAppTheme();
// initial state
// ---------------------------------------------------------------------------
@@ -347,8 +318,6 @@ const ExcalidrawWrapper = () => {
resolvablePromise<ExcalidrawInitialDataState | null>();
}
const debugCanvasRef = useRef<HTMLCanvasElement>(null);
useEffect(() => {
trackEvent("load", "frame", getFrame());
// Delayed so that the app has a time to load the latest SW
@@ -374,23 +343,6 @@ const ExcalidrawWrapper = () => {
migrationAdapter: LibraryLocalStorageMigrationAdapter,
});
const [, forceRefresh] = useState(false);
useEffect(() => {
if (import.meta.env.DEV) {
const debugState = loadSavedDebugState();
if (debugState.enabled && !window.visualDebug) {
window.visualDebug = {
data: [],
};
} else {
delete window.visualDebug;
}
forceRefresh((prev) => !prev);
}
}, [excalidrawAPI]);
useEffect(() => {
if (!excalidrawAPI || (!isCollabDisabled && !collabAPI)) {
return;
@@ -486,7 +438,7 @@ const ExcalidrawWrapper = () => {
excalidrawAPI.updateScene({
...data.scene,
...restore(data.scene, null, null, { repairBindings: true }),
captureUpdate: CaptureUpdateAction.IMMEDIATELY,
commitToHistory: true,
});
}
});
@@ -510,10 +462,13 @@ const ExcalidrawWrapper = () => {
if (isBrowserStorageStateNewer(STORAGE_KEYS.VERSION_DATA_STATE)) {
const localDataState = importFromLocalStorage();
const username = importUsernameFromLocalStorage();
setLangCode(getPreferredLanguage());
let langCode = languageDetector.detect() || defaultLang.code;
if (Array.isArray(langCode)) {
langCode = langCode[0];
}
setLangCode(langCode);
excalidrawAPI.updateScene({
...localDataState,
captureUpdate: CaptureUpdateAction.NEVER,
});
LibraryIndexedDBAdapter.load().then((data) => {
if (data) {
@@ -611,6 +566,10 @@ const ExcalidrawWrapper = () => {
};
}, [excalidrawAPI]);
useEffect(() => {
languageDetector.cacheUserLanguage(langCode);
}, [langCode]);
const onChange = (
elements: readonly OrderedExcalidrawElement[],
appState: AppState,
@@ -645,22 +604,11 @@ const ExcalidrawWrapper = () => {
if (didChange) {
excalidrawAPI.updateScene({
elements,
captureUpdate: CaptureUpdateAction.NEVER,
});
}
}
});
}
// Render the debug scene if the debug canvas is available
if (debugCanvasRef.current && excalidrawAPI) {
debugRenderer(
debugCanvasRef.current,
appState,
window.devicePixelRatio,
() => forceRefresh((prev) => !prev),
);
}
};
const [latestShareableLink, setLatestShareableLink] = useState<string | null>(
@@ -852,12 +800,6 @@ const ExcalidrawWrapper = () => {
</div>
);
}}
onLinkOpen={(element, event) => {
if (element.link && isElementLink(element.link)) {
event.preventDefault();
excalidrawAPI?.scrollToContent(element.link, { animate: true });
}
}}
>
<AppMainMenu
onCollabDialogOpen={onCollabDialogOpen}
@@ -865,7 +807,6 @@ const ExcalidrawWrapper = () => {
isCollabEnabled={!isCollabDisabled}
theme={appTheme}
setTheme={(theme) => setAppTheme(theme)}
refresh={() => forceRefresh((prev) => !prev)}
/>
<AppWelcomeScreen
onCollabDialogOpen={onCollabDialogOpen}
@@ -891,9 +832,64 @@ const ExcalidrawWrapper = () => {
</OverwriteConfirmDialog.Action>
)}
</OverwriteConfirmDialog>
<AppFooter onChange={() => excalidrawAPI?.refresh()} />
{excalidrawAPI && <AIComponents excalidrawAPI={excalidrawAPI} />}
<AppFooter />
<TTDDialog
onTextSubmit={async (input) => {
try {
const response = await fetch(
`${
import.meta.env.VITE_APP_AI_BACKEND
}/v1/ai/text-to-diagram/generate`,
{
method: "POST",
headers: {
Accept: "application/json",
"Content-Type": "application/json",
},
body: JSON.stringify({ prompt: input }),
},
);
const rateLimit = response.headers.has("X-Ratelimit-Limit")
? parseInt(response.headers.get("X-Ratelimit-Limit") || "0", 10)
: undefined;
const rateLimitRemaining = response.headers.has(
"X-Ratelimit-Remaining",
)
? parseInt(
response.headers.get("X-Ratelimit-Remaining") || "0",
10,
)
: undefined;
const json = await response.json();
if (!response.ok) {
if (response.status === 429) {
return {
rateLimit,
rateLimitRemaining,
error: new Error(
"Too many requests today, please try again tomorrow!",
),
};
}
throw new Error(json.message || "Generation failed...");
}
const generatedResponse = json.generatedResponse;
if (!generatedResponse) {
throw new Error("Generation failed...");
}
return { generatedResponse, rateLimit, rateLimitRemaining };
} catch (err: any) {
throw new Error("Request failed");
}
}}
/>
<TTDDialogTrigger />
{isCollaborating && isOffline && (
<div className="collab-offline-warning">
@@ -1106,45 +1102,17 @@ const ExcalidrawWrapper = () => {
);
},
},
{
label: t("labels.installPWA"),
category: DEFAULT_CATEGORIES.app,
predicate: () => !!pwaEvent,
perform: () => {
if (pwaEvent) {
pwaEvent.prompt();
pwaEvent.userChoice.then(() => {
// event cannot be reused, but we'll hopefully
// grab new one as the event should be fired again
pwaEvent = null;
});
}
},
},
]}
/>
{isVisualDebuggerEnabled() && excalidrawAPI && (
<DebugCanvas
appState={excalidrawAPI.getAppState()}
scale={window.devicePixelRatio}
ref={debugCanvasRef}
/>
)}
</Excalidraw>
</div>
);
};
const ExcalidrawApp = () => {
const isCloudExportWindow =
window.location.pathname === "/excalidraw-plus-export";
if (isCloudExportWindow) {
return <ExcalidrawPlusIframeExport />;
}
return (
<TopErrorBoundary>
<Provider store={appJotaiStore}>
<Provider unstable_createStore={() => appJotaiStore}>
<ExcalidrawWrapper />
</Provider>
</TopErrorBoundary>

View File

@@ -1,15 +1,14 @@
import { useEffect, useState } from "react";
import { debounce, getVersion, nFormatter } from "@excalidraw/excalidraw/utils";
import { debounce, getVersion, nFormatter } from "../packages/excalidraw/utils";
import {
getElementsStorageSize,
getTotalStorageSize,
} from "./data/localStorage";
import { DEFAULT_VERSION } from "@excalidraw/excalidraw/constants";
import { t } from "@excalidraw/excalidraw/i18n";
import { copyTextToSystemClipboard } from "@excalidraw/excalidraw/clipboard";
import type { NonDeletedExcalidrawElement } from "@excalidraw/excalidraw/element/types";
import type { UIAppState } from "@excalidraw/excalidraw/types";
import { Stats } from "@excalidraw/excalidraw";
import { DEFAULT_VERSION } from "../packages/excalidraw/constants";
import { t } from "../packages/excalidraw/i18n";
import { copyTextToSystemClipboard } from "../packages/excalidraw/clipboard";
import { NonDeletedExcalidrawElement } from "../packages/excalidraw/element/types";
import { UIAppState } from "../packages/excalidraw/types";
type StorageSizes = { scene: number; total: number };
@@ -52,33 +51,39 @@ const CustomStats = (props: Props) => {
}
return (
<Stats.StatsRows order={-1}>
<Stats.StatsRow heading>{t("stats.version")}</Stats.StatsRow>
<Stats.StatsRow
style={{ textAlign: "center", cursor: "pointer" }}
onClick={async () => {
try {
await copyTextToSystemClipboard(getVersion());
props.setToast(t("toast.copyToClipboard"));
} catch {}
}}
title={t("stats.versionCopy")}
>
{timestamp}
<br />
{hash}
</Stats.StatsRow>
<Stats.StatsRow heading>{t("stats.storage")}</Stats.StatsRow>
<Stats.StatsRow columns={2}>
<div>{t("stats.scene")}</div>
<div>{nFormatter(storageSizes.scene, 1)}</div>
</Stats.StatsRow>
<Stats.StatsRow columns={2}>
<div>{t("stats.total")}</div>
<div>{nFormatter(storageSizes.total, 1)}</div>
</Stats.StatsRow>
</Stats.StatsRows>
<>
<tr>
<th colSpan={2}>{t("stats.storage")}</th>
</tr>
<tr>
<td>{t("stats.scene")}</td>
<td>{nFormatter(storageSizes.scene, 1)}</td>
</tr>
<tr>
<td>{t("stats.total")}</td>
<td>{nFormatter(storageSizes.total, 1)}</td>
</tr>
<tr>
<th colSpan={2}>{t("stats.version")}</th>
</tr>
<tr>
<td
colSpan={2}
style={{ textAlign: "center", cursor: "pointer" }}
onClick={async () => {
try {
await copyTextToSystemClipboard(getVersion());
props.setToast(t("toast.copyToClipboard"));
} catch {}
}}
title={t("stats.versionCopy")}
>
{timestamp}
<br />
{hash}
</td>
</tr>
</>
);
};

View File

@@ -1,222 +0,0 @@
import { useLayoutEffect, useRef } from "react";
import { STORAGE_KEYS } from "./app_constants";
import { LocalData } from "./data/LocalData";
import type {
FileId,
OrderedExcalidrawElement,
} from "@excalidraw/excalidraw/element/types";
import type { AppState, BinaryFileData } from "@excalidraw/excalidraw/types";
import { ExcalidrawError } from "@excalidraw/excalidraw/errors";
import { base64urlToString } from "@excalidraw/excalidraw/data/encode";
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,37 +1,3 @@
// eslint-disable-next-line no-restricted-imports
import {
atom,
Provider,
useAtom,
useAtomValue,
useSetAtom,
createStore,
type PrimitiveAtom,
} from "jotai";
import { useLayoutEffect } from "react";
import { unstable_createStore } from "jotai";
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;
};
export const appJotaiStore = unstable_createStore();

View File

@@ -1,25 +0,0 @@
import LanguageDetector from "i18next-browser-languagedetector";
import { defaultLang, languages } from "@excalidraw/excalidraw";
export const languageDetector = new LanguageDetector();
languageDetector.init({
languageUtils: {},
});
export const getPreferredLanguage = () => {
const detectedLanguages = languageDetector.detect();
const detectedLanguage = Array.isArray(detectedLanguages)
? detectedLanguages[0]
: detectedLanguages;
const initialLanguage =
(detectedLanguage
? // region code may not be defined if user uses generic preferred language
// (e.g. chinese vs instead of chinese-simplified)
languages.find((lang) => lang.code.startsWith(detectedLanguage))?.code
: null) || defaultLang.code;
return initialLanguage;
};

View File

@@ -1,15 +0,0 @@
import { useEffect } from "react";
import { atom, useAtom } from "../app-jotai";
import { getPreferredLanguage, languageDetector } from "./language-detector";
export const appLangCodeAtom = atom(getPreferredLanguage());
export const useAppLangCode = () => {
const [langCode, setLangCode] = useAtom(appLangCodeAtom);
useEffect(() => {
languageDetector.cacheUserLanguage(langCode);
}, [langCode]);
return [langCode, setLangCode] as const;
};

View File

@@ -40,7 +40,6 @@ export const STORAGE_KEYS = {
LOCAL_STORAGE_APP_STATE: "excalidraw-state",
LOCAL_STORAGE_COLLAB: "excalidraw-collab",
LOCAL_STORAGE_THEME: "excalidraw-theme",
LOCAL_STORAGE_DEBUG: "excalidraw-debug",
VERSION_DATA_STATE: "version-dataState",
VERSION_FILES: "version-files",

View File

@@ -1,34 +1,29 @@
import throttle from "lodash.throttle";
import { PureComponent } from "react";
import type {
BinaryFileData,
import {
ExcalidrawImperativeAPI,
SocketId,
Collaborator,
Gesture,
} from "@excalidraw/excalidraw/types";
import { ErrorDialog } from "@excalidraw/excalidraw/components/ErrorDialog";
import { APP_NAME, ENV, EVENT } from "@excalidraw/excalidraw/constants";
import type { ImportedDataState } from "@excalidraw/excalidraw/data/types";
import type {
} from "../../packages/excalidraw/types";
import { ErrorDialog } from "../../packages/excalidraw/components/ErrorDialog";
import { APP_NAME, ENV, EVENT } from "../../packages/excalidraw/constants";
import { ImportedDataState } from "../../packages/excalidraw/data/types";
import {
ExcalidrawElement,
FileId,
InitializedExcalidrawImageElement,
OrderedExcalidrawElement,
} from "@excalidraw/excalidraw/element/types";
} from "../../packages/excalidraw/element/types";
import {
CaptureUpdateAction,
getSceneVersion,
restoreElements,
zoomToFitBounds,
reconcileElements,
} from "@excalidraw/excalidraw";
} from "../../packages/excalidraw/index";
import { Collaborator, Gesture } from "../../packages/excalidraw/types";
import {
assertNever,
preventUnload,
resolvablePromise,
throttleRAF,
} from "@excalidraw/excalidraw/utils";
} from "../../packages/excalidraw/utils";
import {
CURSOR_SYNC_TIMEOUT,
FILE_UPLOAD_MAX_BYTES,
@@ -39,14 +34,12 @@ import {
SYNC_FULL_SCENE_INTERVAL_MS,
WS_EVENTS,
} from "../app_constants";
import type {
SocketUpdateDataSource,
SyncableExcalidrawElement,
} from "../data";
import {
generateCollaborationLinkData,
getCollaborationLink,
getSyncableElements,
SocketUpdateDataSource,
SyncableExcalidrawElement,
} from "../data";
import {
isSavedToFirebase,
@@ -60,35 +53,37 @@ import {
saveUsernameToLocalStorage,
} from "../data/localStorage";
import Portal from "./Portal";
import { t } from "@excalidraw/excalidraw/i18n";
import { t } from "../../packages/excalidraw/i18n";
import { UserIdleState } from "../../packages/excalidraw/types";
import {
IDLE_THRESHOLD,
ACTIVE_THRESHOLD,
UserIdleState,
} from "@excalidraw/excalidraw/constants";
} from "../../packages/excalidraw/constants";
import {
encodeFilesForUpload,
FileManager,
updateStaleImageStatuses,
} from "../data/FileManager";
import { AbortError } from "@excalidraw/excalidraw/errors";
import { AbortError } from "../../packages/excalidraw/errors";
import {
isImageElement,
isInitializedImageElement,
} from "@excalidraw/excalidraw/element/typeChecks";
import { newElementWith } from "@excalidraw/excalidraw/element/mutateElement";
import { decryptData } from "@excalidraw/excalidraw/data/encryption";
} 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 { appJotaiStore, atom } from "../app-jotai";
import type { Mutable, ValueOf } from "@excalidraw/excalidraw/utility-types";
import { getVisibleSceneBounds } from "@excalidraw/excalidraw/element/bounds";
import { withBatchedUpdates } from "@excalidraw/excalidraw/reactUtils";
import { atom } from "jotai";
import { appJotaiStore } from "../app-jotai";
import { 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 type {
import {
ReconciledExcalidrawElement,
RemoteExcalidrawElement,
} from "@excalidraw/excalidraw/data/reconcile";
reconcileElements,
} from "../../packages/excalidraw/data/reconcile";
export const collabAPIAtom = atom<CollabAPI | null>(null);
export const isCollaboratingAtom = atom(false);
@@ -159,7 +154,7 @@ class Collab extends PureComponent<CollabProps, CollabState> {
throw new AbortError();
}
const { savedFiles, erroredFiles } = await saveFilesToFirebase({
return saveFilesToFirebase({
prefix: `${FIREBASE_STORAGE_PREFIXES.collabFiles}/${roomId}`,
files: await encodeFilesForUpload({
files: addedFiles,
@@ -167,29 +162,6 @@ 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;
@@ -384,7 +356,7 @@ class Collab extends PureComponent<CollabProps, CollabState> {
this.excalidrawAPI.updateScene({
elements,
captureUpdate: CaptureUpdateAction.NEVER,
commitToHistory: false,
});
}
};
@@ -419,7 +391,7 @@ class Collab extends PureComponent<CollabProps, CollabState> {
.filter((element) => {
return (
isInitializedImageElement(element) &&
!this.fileManager.isFileTracked(element.fileId) &&
!this.fileManager.isFileHandled(element.fileId) &&
!element.isDeleted &&
(opts.forceFetchFiles
? element.status !== "pending" ||
@@ -529,13 +501,14 @@ class Collab extends PureComponent<CollabProps, CollabState> {
}
return element;
});
// remove deleted elements from elements array to ensure we don't
// remove deleted elements from elements array & history to ensure we don't
// expose potentially sensitive user data in case user manually deletes
// existing elements (or clears scene), which would otherwise be persisted
// to database even if deleted before creating the room.
this.excalidrawAPI.history.clear();
this.excalidrawAPI.updateScene({
elements,
captureUpdate: CaptureUpdateAction.NEVER,
commitToHistory: true,
});
this.saveCollabRoomToFirebase(getSyncableElements(elements));
@@ -571,7 +544,9 @@ class Collab extends PureComponent<CollabProps, CollabState> {
const remoteElements = decryptedData.payload.elements;
const reconciledElements =
this._reconcileElements(remoteElements);
this.handleRemoteSceneUpdate(reconciledElements);
this.handleRemoteSceneUpdate(reconciledElements, {
init: true,
});
// noop if already resolved via init from firebase
scenePromise.resolve({
elements: reconciledElements,
@@ -770,12 +745,19 @@ class Collab extends PureComponent<CollabProps, CollabState> {
private handleRemoteSceneUpdate = (
elements: ReconciledExcalidrawElement[],
{ init = false }: { init?: boolean } = {},
) => {
this.excalidrawAPI.updateScene({
elements,
captureUpdate: CaptureUpdateAction.NEVER,
commitToHistory: !!init,
});
// We haven't yet implemented multiplayer undo functionality, so we clear the undo stack
// when we receive any messages from another peer. This UX can be pretty rough -- if you
// undo, a user makes a change, and then try to redo, your element(s) will be lost. However,
// right now we think this is the right tradeoff.
this.excalidrawAPI.history.clear();
this.loadImageFiles();
};

View File

@@ -23,7 +23,7 @@
transform: rotate(10deg);
}
50% {
transform: rotate(0deg);
transform: rotate(0eg);
}
75% {
transform: rotate(-10deg);

View File

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

View File

@@ -1,25 +1,24 @@
import type {
import {
isSyncableElement,
SocketUpdateData,
SocketUpdateDataSource,
SyncableExcalidrawElement,
} from "../data";
import { isSyncableElement } from "../data";
import type { TCollabClass } from "./Collab";
import { TCollabClass } from "./Collab";
import type { OrderedExcalidrawElement } from "@excalidraw/excalidraw/element/types";
import { OrderedExcalidrawElement } from "../../packages/excalidraw/element/types";
import { WS_EVENTS, FILE_UPLOAD_TIMEOUT, WS_SUBTYPES } from "../app_constants";
import type {
import {
OnUserFollowedPayload,
SocketId,
} from "@excalidraw/excalidraw/types";
import type { UserIdleState } from "@excalidraw/excalidraw/constants";
import { trackEvent } from "@excalidraw/excalidraw/analytics";
UserIdleState,
} from "../../packages/excalidraw/types";
import { trackEvent } from "../../packages/excalidraw/analytics";
import throttle from "lodash.throttle";
import { newElementWith } from "@excalidraw/excalidraw/element/mutateElement";
import { encryptData } from "@excalidraw/excalidraw/data/encryption";
import { newElementWith } from "../../packages/excalidraw/element/mutateElement";
import { encryptData } from "../../packages/excalidraw/data/encryption";
import type { Socket } from "socket.io-client";
import { CaptureUpdateAction } from "@excalidraw/excalidraw";
class Portal {
collab: TCollabClass;
@@ -116,26 +115,19 @@ class Portal {
}
}
let isChanged = false;
const newElements = this.collab.excalidrawAPI
.getSceneElementsIncludingDeleted()
.map((element) => {
if (this.collab.fileManager.shouldUpdateImageElementStatus(element)) {
isChanged = true;
// this will signal collaborators to pull image data from server
// (using mutation instead of newElementWith otherwise it'd break
// in-progress dragging)
return newElementWith(element, { status: "saved" });
}
return element;
});
if (isChanged) {
this.collab.excalidrawAPI.updateScene({
elements: newElements,
captureUpdate: CaptureUpdateAction.NEVER,
});
}
this.collab.excalidrawAPI.updateScene({
elements: this.collab.excalidrawAPI
.getSceneElementsIncludingDeleted()
.map((element) => {
if (this.collab.fileManager.shouldUpdateImageElementStatus(element)) {
// this will signal collaborators to pull image data from server
// (using mutation instead of newElementWith otherwise it'd break
// in-progress dragging)
return newElementWith(element, { status: "saved" });
}
return element;
}),
});
}, FILE_UPLOAD_TIMEOUT);
broadcastScene = async (

View File

@@ -0,0 +1,218 @@
import { useRef, useState } from "react";
import * as Popover from "@radix-ui/react-popover";
import { copyTextToSystemClipboard } from "../../packages/excalidraw/clipboard";
import { trackEvent } from "../../packages/excalidraw/analytics";
import { getFrame } from "../../packages/excalidraw/utils";
import { useI18n } from "../../packages/excalidraw/i18n";
import { KEYS } from "../../packages/excalidraw/keys";
import { Dialog } from "../../packages/excalidraw/components/Dialog";
import {
copyIcon,
playerPlayIcon,
playerStopFilledIcon,
share,
shareIOS,
shareWindows,
tablerCheckIcon,
} from "../../packages/excalidraw/components/icons";
import { TextField } from "../../packages/excalidraw/components/TextField";
import { FilledButton } from "../../packages/excalidraw/components/FilledButton";
import { ReactComponent as CollabImage } from "../../packages/excalidraw/assets/lock.svg";
import "./RoomDialog.scss";
const getShareIcon = () => {
const navigator = window.navigator as any;
const isAppleBrowser = /Apple/.test(navigator.vendor);
const isWindowsBrowser = navigator.appVersion.indexOf("Win") !== -1;
if (isAppleBrowser) {
return shareIOS;
} else if (isWindowsBrowser) {
return shareWindows;
}
return share;
};
export type RoomModalProps = {
handleClose: () => void;
activeRoomLink: string;
username: string;
onUsernameChange: (username: string) => void;
onRoomCreate: () => void;
onRoomDestroy: () => void;
setErrorMessage: (message: string) => void;
};
export const RoomModal = ({
activeRoomLink,
onRoomCreate,
onRoomDestroy,
setErrorMessage,
username,
onUsernameChange,
handleClose,
}: RoomModalProps) => {
const { t } = useI18n();
const [justCopied, setJustCopied] = useState(false);
const timerRef = useRef<number>(0);
const ref = useRef<HTMLInputElement>(null);
const isShareSupported = "share" in navigator;
const copyRoomLink = async () => {
try {
await copyTextToSystemClipboard(activeRoomLink);
} catch (e) {
setErrorMessage(t("errors.copyToSystemClipboardFailed"));
}
setJustCopied(true);
if (timerRef.current) {
window.clearTimeout(timerRef.current);
}
timerRef.current = window.setTimeout(() => {
setJustCopied(false);
}, 3000);
ref.current?.select();
};
const shareRoomLink = async () => {
try {
await navigator.share({
title: t("roomDialog.shareTitle"),
text: t("roomDialog.shareTitle"),
url: activeRoomLink,
});
} catch (error: any) {
// Just ignore.
}
};
if (activeRoomLink) {
return (
<>
<h3 className="RoomDialog__active__header">
{t("labels.liveCollaboration")}
</h3>
<TextField
value={username}
placeholder="Your name"
label="Your name"
onChange={onUsernameChange}
onKeyDown={(event) => event.key === KEYS.ENTER && handleClose()}
/>
<div className="RoomDialog__active__linkRow">
<TextField
ref={ref}
label="Link"
readonly
fullWidth
value={activeRoomLink}
/>
{isShareSupported && (
<FilledButton
size="large"
variant="icon"
label="Share"
icon={getShareIcon()}
className="RoomDialog__active__share"
onClick={shareRoomLink}
/>
)}
<Popover.Root open={justCopied}>
<Popover.Trigger asChild>
<FilledButton
size="large"
label="Copy link"
icon={copyIcon}
onClick={copyRoomLink}
/>
</Popover.Trigger>
<Popover.Content
onOpenAutoFocus={(event) => event.preventDefault()}
onCloseAutoFocus={(event) => event.preventDefault()}
className="RoomDialog__popover"
side="top"
align="end"
sideOffset={5.5}
>
{tablerCheckIcon} copied
</Popover.Content>
</Popover.Root>
</div>
<div className="RoomDialog__active__description">
<p>
<span
role="img"
aria-hidden="true"
className="RoomDialog__active__description__emoji"
>
🔒{" "}
</span>
{t("roomDialog.desc_privacy")}
</p>
<p>{t("roomDialog.desc_exitSession")}</p>
</div>
<div className="RoomDialog__active__actions">
<FilledButton
size="large"
variant="outlined"
color="danger"
label={t("roomDialog.button_stopSession")}
icon={playerStopFilledIcon}
onClick={() => {
trackEvent("share", "room closed");
onRoomDestroy();
}}
/>
</div>
</>
);
}
return (
<>
<div className="RoomDialog__inactive__illustration">
<CollabImage />
</div>
<div className="RoomDialog__inactive__header">
{t("labels.liveCollaboration")}
</div>
<div className="RoomDialog__inactive__description">
<strong>{t("roomDialog.desc_intro")}</strong>
{t("roomDialog.desc_privacy")}
</div>
<div className="RoomDialog__inactive__start_session">
<FilledButton
size="large"
label={t("roomDialog.button_startSession")}
icon={playerPlayIcon}
onClick={() => {
trackEvent("share", "room creation", `ui (${getFrame()})`);
onRoomCreate();
}}
/>
</div>
</>
);
};
const RoomDialog = (props: RoomModalProps) => {
return (
<Dialog size="small" onCloseRequest={props.handleClose} title={false}>
<div className="RoomDialog">
<RoomModal {...props} />
</div>
</Dialog>
);
};
export default RoomDialog;

View File

@@ -1,159 +0,0 @@
import type { ExcalidrawImperativeAPI } from "@excalidraw/excalidraw/types";
import {
DiagramToCodePlugin,
exportToBlob,
getTextFromElements,
MIME_TYPES,
TTDDialog,
} from "@excalidraw/excalidraw";
import { getDataURL } from "@excalidraw/excalidraw/data/blob";
import { safelyParseJSON } from "@excalidraw/excalidraw/utils";
export const AIComponents = ({
excalidrawAPI,
}: {
excalidrawAPI: ExcalidrawImperativeAPI;
}) => {
return (
<>
<DiagramToCodePlugin
generate={async ({ frame, children }) => {
const appState = excalidrawAPI.getAppState();
const blob = await exportToBlob({
elements: children,
appState: {
...appState,
exportBackground: true,
viewBackgroundColor: appState.viewBackgroundColor,
},
exportingFrame: frame,
files: excalidrawAPI.getFiles(),
mimeType: MIME_TYPES.jpg,
});
const dataURL = await getDataURL(blob);
const textFromFrameChildren = getTextFromElements(children);
const response = await fetch(
`${
import.meta.env.VITE_APP_AI_BACKEND
}/v1/ai/diagram-to-code/generate`,
{
method: "POST",
headers: {
Accept: "application/json",
"Content-Type": "application/json",
},
body: JSON.stringify({
texts: textFromFrameChildren,
image: dataURL,
theme: appState.theme,
}),
},
);
if (!response.ok) {
const text = await response.text();
const errorJSON = safelyParseJSON(text);
if (!errorJSON) {
throw new Error(text);
}
if (errorJSON.statusCode === 429) {
return {
html: `<html>
<body style="margin: 0; text-align: center">
<div style="display: flex; align-items: center; justify-content: center; flex-direction: column; height: 100vh; padding: 0 60px">
<div style="color:red">Too many requests today,</br>please try again tomorrow!</div>
</br>
</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>
</div>
</body>
</html>`,
};
}
throw new Error(errorJSON.message || text);
}
try {
const { html } = await response.json();
if (!html) {
throw new Error("Generation failed (invalid response)");
}
return {
html,
};
} catch (error: any) {
throw new Error("Generation failed (invalid response)");
}
}}
/>
<TTDDialog
onTextSubmit={async (input) => {
try {
const response = await fetch(
`${
import.meta.env.VITE_APP_AI_BACKEND
}/v1/ai/text-to-diagram/generate`,
{
method: "POST",
headers: {
Accept: "application/json",
"Content-Type": "application/json",
},
body: JSON.stringify({ prompt: input }),
},
);
const rateLimit = response.headers.has("X-Ratelimit-Limit")
? parseInt(response.headers.get("X-Ratelimit-Limit") || "0", 10)
: undefined;
const rateLimitRemaining = response.headers.has(
"X-Ratelimit-Remaining",
)
? parseInt(
response.headers.get("X-Ratelimit-Remaining") || "0",
10,
)
: undefined;
const json = await response.json();
if (!response.ok) {
if (response.status === 429) {
return {
rateLimit,
rateLimitRemaining,
error: new Error(
"Too many requests today, please try again tomorrow!",
),
};
}
throw new Error(json.message || "Generation failed...");
}
const generatedResponse = json.generatedResponse;
if (!generatedResponse) {
throw new Error("Generation failed...");
}
return { generatedResponse, rateLimit, rateLimitRemaining };
} catch (err: any) {
throw new Error("Request failed");
}
}}
/>
</>
);
};

View File

@@ -1,29 +1,25 @@
import React from "react";
import { Footer } from "@excalidraw/excalidraw/index";
import { Footer } from "../../packages/excalidraw/index";
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 }) => {
return (
<Footer>
<div
style={{
display: "flex",
gap: ".5rem",
alignItems: "center",
}}
>
{isVisualDebuggerEnabled() && <DebugFooter onChange={onChange} />}
{isExcalidrawPlusSignedUser ? (
<ExcalidrawPlusAppLink />
) : (
<EncryptedIcon />
)}
</div>
</Footer>
);
},
);
export const AppFooter = React.memo(() => {
return (
<Footer>
<div
style={{
display: "flex",
gap: ".5rem",
alignItems: "center",
}}
>
{isExcalidrawPlusSignedUser ? (
<ExcalidrawPlusAppLink />
) : (
<EncryptedIcon />
)}
</div>
</Footer>
);
});

View File

@@ -1,14 +1,12 @@
import React from "react";
import {
loginIcon,
arrowBarToLeftIcon,
ExcalLogo,
eyeIcon,
} from "@excalidraw/excalidraw/components/icons";
import type { Theme } from "@excalidraw/excalidraw/element/types";
import { MainMenu } from "@excalidraw/excalidraw/index";
} from "../../packages/excalidraw/components/icons";
import { Theme } from "../../packages/excalidraw/element/types";
import { MainMenu } from "../../packages/excalidraw/index";
import { isExcalidrawPlusSignedUser } from "../app_constants";
import { LanguageList } from "../app-language/LanguageList";
import { saveDebugState } from "./DebugCanvas";
import { LanguageList } from "./LanguageList";
export const AppMainMenu: React.FC<{
onCollabDialogOpen: () => any;
@@ -16,7 +14,6 @@ export const AppMainMenu: React.FC<{
isCollabEnabled: boolean;
theme: Theme | "system";
setTheme: (theme: Theme | "system") => void;
refresh: () => void;
}> = React.memo((props) => {
return (
<MainMenu>
@@ -31,14 +28,13 @@ export const AppMainMenu: React.FC<{
/>
)}
<MainMenu.DefaultItems.CommandPalette className="highlighted" />
<MainMenu.DefaultItems.SearchMenu />
<MainMenu.DefaultItems.Help />
<MainMenu.DefaultItems.ClearCanvas />
<MainMenu.Separator />
<MainMenu.ItemLink
icon={ExcalLogo}
href={`${
import.meta.env.VITE_APP_PLUS_LP
import.meta.env.VITE_APP_PLUS_APP
}/plus?utm_source=excalidraw&utm_medium=app&utm_content=hamburger`}
className=""
>
@@ -46,7 +42,7 @@ export const AppMainMenu: React.FC<{
</MainMenu.ItemLink>
<MainMenu.DefaultItems.Socials />
<MainMenu.ItemLink
icon={loginIcon}
icon={arrowBarToLeftIcon}
href={`${import.meta.env.VITE_APP_PLUS_APP}${
isExcalidrawPlusSignedUser ? "" : "/sign-up"
}?utm_source=signin&utm_medium=app&utm_content=hamburger`}
@@ -54,23 +50,6 @@ export const AppMainMenu: React.FC<{
>
{isExcalidrawPlusSignedUser ? "Sign in" : "Sign up"}
</MainMenu.ItemLink>
{import.meta.env.DEV && (
<MainMenu.Item
icon={eyeIcon}
onClick={() => {
if (window.visualDebug) {
delete window.visualDebug;
saveDebugState({ enabled: false });
} else {
window.visualDebug = { data: [] };
saveDebugState({ enabled: true });
}
props?.refresh();
}}
>
Visual Debug
</MainMenu.Item>
)}
<MainMenu.Separator />
<MainMenu.DefaultItems.ToggleTheme
allowSystemTheme

View File

@@ -1,9 +1,9 @@
import React from "react";
import { loginIcon } from "@excalidraw/excalidraw/components/icons";
import { useI18n } from "@excalidraw/excalidraw/i18n";
import { WelcomeScreen } from "@excalidraw/excalidraw/index";
import { arrowBarToLeftIcon } 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 "@excalidraw/excalidraw/constants";
import { POINTER_EVENTS } from "../../packages/excalidraw/constants";
export const AppWelcomeScreen: React.FC<{
onCollabDialogOpen: () => any;
@@ -61,7 +61,7 @@ export const AppWelcomeScreen: React.FC<{
import.meta.env.VITE_APP_PLUS_LP
}/plus?utm_source=excalidraw&utm_medium=app&utm_content=welcomeScreenGuest`}
shortcut={null}
icon={loginIcon}
icon={arrowBarToLeftIcon}
>
Sign up
</WelcomeScreen.Center.MenuItemLink>

View File

@@ -1,344 +0,0 @@
import { useCallback, useImperativeHandle, useRef } from "react";
import { type AppState } from "@excalidraw/excalidraw/types";
import { throttleRAF } from "@excalidraw/excalidraw/utils";
import {
bootstrapCanvas,
getNormalizedCanvasDimensions,
} from "@excalidraw/excalidraw/renderer/helpers";
import type { DebugElement } from "@excalidraw/excalidraw/visualdebug";
import {
ArrowheadArrowIcon,
CloseIcon,
TrashIcon,
} from "@excalidraw/excalidraw/components/icons";
import { STORAGE_KEYS } from "../app_constants";
import type { Curve } from "../../packages/math";
import {
isLineSegment,
type GlobalPoint,
type LineSegment,
} from "../../packages/math";
import { isCurve } from "../../packages/math/curve";
const renderLine = (
context: CanvasRenderingContext2D,
zoom: number,
segment: LineSegment<GlobalPoint>,
color: string,
) => {
context.save();
context.strokeStyle = color;
context.beginPath();
context.moveTo(segment[0][0] * zoom, segment[0][1] * zoom);
context.lineTo(segment[1][0] * zoom, segment[1][1] * zoom);
context.stroke();
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();
context.beginPath();
context.moveTo(-10 * zoom, -10 * zoom);
context.lineTo(10 * zoom, 10 * zoom);
context.moveTo(10 * zoom, -10 * zoom);
context.lineTo(-10 * zoom, 10 * zoom);
context.stroke();
context.save();
};
const render = (
frame: DebugElement[],
context: CanvasRenderingContext2D,
appState: AppState,
) => {
frame.forEach((el: DebugElement) => {
switch (true) {
case isLineSegment(el.data):
renderLine(
context,
appState.zoom.value,
el.data as LineSegment<GlobalPoint>,
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)}`);
}
});
};
const _debugRenderer = (
canvas: HTMLCanvasElement,
appState: AppState,
scale: number,
refresh: () => void,
) => {
const [normalizedWidth, normalizedHeight] = getNormalizedCanvasDimensions(
canvas,
scale,
);
if (appState.height !== canvas.height || appState.width !== canvas.width) {
refresh();
}
const context = bootstrapCanvas({
canvas,
scale,
normalizedWidth,
normalizedHeight,
viewBackgroundColor: "transparent",
});
// Apply zoom
context.save();
context.translate(
appState.scrollX * appState.zoom.value,
appState.scrollY * appState.zoom.value,
);
renderOrigin(context, appState.zoom.value);
if (
window.visualDebug?.currentFrame &&
window.visualDebug?.data &&
window.visualDebug.data.length > 0
) {
// Render only one frame
const [idx] = debugFrameData();
render(window.visualDebug.data[idx], context, appState);
} else {
// Render all debug frames
window.visualDebug?.data.forEach((frame) => {
render(frame, context, appState);
});
}
if (window.visualDebug) {
window.visualDebug!.data =
window.visualDebug?.data.map((frame) =>
frame.filter((el) => el.permanent),
) ?? [];
}
};
const debugFrameData = (): [number, number] => {
const currentFrame = window.visualDebug?.currentFrame ?? 0;
const frameCount = window.visualDebug?.data.length ?? 0;
if (frameCount > 0) {
return [currentFrame % frameCount, window.visualDebug?.currentFrame ?? 0];
}
return [0, 0];
};
export const saveDebugState = (debug: { enabled: boolean }) => {
try {
localStorage.setItem(
STORAGE_KEYS.LOCAL_STORAGE_DEBUG,
JSON.stringify(debug),
);
} catch (error: any) {
console.error(error);
}
};
export const debugRenderer = throttleRAF(
(
canvas: HTMLCanvasElement,
appState: AppState,
scale: number,
refresh: () => void,
) => {
_debugRenderer(canvas, appState, scale, refresh);
},
{ trailing: true },
);
export const loadSavedDebugState = () => {
let debug;
try {
const savedDebugState = localStorage.getItem(
STORAGE_KEYS.LOCAL_STORAGE_DEBUG,
);
if (savedDebugState) {
debug = JSON.parse(savedDebugState) as { enabled: boolean };
}
} catch (error: any) {
console.error(error);
}
return debug ?? { enabled: false };
};
export const isVisualDebuggerEnabled = () =>
Array.isArray(window.visualDebug?.data);
export const DebugFooter = ({ onChange }: { onChange: () => void }) => {
const moveForward = useCallback(() => {
if (
!window.visualDebug?.currentFrame ||
isNaN(window.visualDebug?.currentFrame ?? -1)
) {
window.visualDebug!.currentFrame = 0;
}
window.visualDebug!.currentFrame += 1;
onChange();
}, [onChange]);
const moveBackward = useCallback(() => {
if (
!window.visualDebug?.currentFrame ||
isNaN(window.visualDebug?.currentFrame ?? -1) ||
window.visualDebug?.currentFrame < 1
) {
window.visualDebug!.currentFrame = 1;
}
window.visualDebug!.currentFrame -= 1;
onChange();
}, [onChange]);
const reset = useCallback(() => {
window.visualDebug!.currentFrame = undefined;
onChange();
}, [onChange]);
const trashFrames = useCallback(() => {
if (window.visualDebug) {
window.visualDebug.currentFrame = undefined;
window.visualDebug.data = [];
}
onChange();
}, [onChange]);
return (
<>
<button
className="ToolIcon_type_button"
data-testid="debug-forward"
aria-label="Move forward"
type="button"
onClick={trashFrames}
>
<div
className="ToolIcon__icon"
aria-hidden="true"
aria-disabled="false"
>
{TrashIcon}
</div>
</button>
<button
className="ToolIcon_type_button"
data-testid="debug-forward"
aria-label="Move forward"
type="button"
onClick={moveBackward}
>
<div
className="ToolIcon__icon"
aria-hidden="true"
aria-disabled="false"
>
<ArrowheadArrowIcon flip />
</div>
</button>
<button
className="ToolIcon_type_button"
data-testid="debug-forward"
aria-label="Move forward"
type="button"
onClick={reset}
>
<div
className="ToolIcon__icon"
aria-hidden="true"
aria-disabled="false"
>
{CloseIcon}
</div>
</button>
<button
className="ToolIcon_type_button"
data-testid="debug-backward"
aria-label="Move backward"
type="button"
onClick={moveForward}
>
<div
className="ToolIcon__icon"
aria-hidden="true"
aria-disabled="false"
>
<ArrowheadArrowIcon />
</div>
</button>
</>
);
};
interface DebugCanvasProps {
appState: AppState;
scale: number;
ref?: React.Ref<HTMLCanvasElement>;
}
const DebugCanvas = ({ appState, scale, ref }: DebugCanvasProps) => {
const { width, height } = appState;
const canvasRef = useRef<HTMLCanvasElement>(null);
useImperativeHandle<HTMLCanvasElement | null, HTMLCanvasElement | null>(
ref,
() => canvasRef.current,
[canvasRef],
);
return (
<canvas
style={{
width,
height,
position: "absolute",
zIndex: 2,
pointerEvents: "none",
}}
width={width * scale}
height={height * scale}
ref={canvasRef}
>
Debug Canvas
</canvas>
);
};
export default DebugCanvas;

View File

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

View File

@@ -1,31 +1,30 @@
import React from "react";
import { Card } from "@excalidraw/excalidraw/components/Card";
import { ToolButton } from "@excalidraw/excalidraw/components/ToolButton";
import { serializeAsJSON } from "@excalidraw/excalidraw/data/json";
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 type {
import {
FileId,
NonDeletedExcalidrawElement,
} from "@excalidraw/excalidraw/element/types";
import type {
} from "../../packages/excalidraw/element/types";
import {
AppState,
BinaryFileData,
BinaryFiles,
} from "@excalidraw/excalidraw/types";
} from "../../packages/excalidraw/types";
import { nanoid } from "nanoid";
import { useI18n } from "@excalidraw/excalidraw/i18n";
import { useI18n } from "../../packages/excalidraw/i18n";
import {
encryptData,
generateEncryptionKey,
} from "@excalidraw/excalidraw/data/encryption";
import { isInitializedImageElement } from "@excalidraw/excalidraw/element/typeChecks";
} from "../../packages/excalidraw/data/encryption";
import { isInitializedImageElement } from "../../packages/excalidraw/element/typeChecks";
import { FILE_UPLOAD_MAX_BYTES } from "../app_constants";
import { encodeFilesForUpload } from "../data/FileManager";
import { uploadBytes, ref } from "firebase/storage";
import { MIME_TYPES } from "@excalidraw/excalidraw/constants";
import { trackEvent } from "@excalidraw/excalidraw/analytics";
import { getFrame } from "@excalidraw/excalidraw/utils";
import { ExcalidrawLogo } from "@excalidraw/excalidraw/components/ExcalidrawLogo";
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";
export const exportToExcalidrawPlus = async (
elements: readonly NonDeletedExcalidrawElement[],
@@ -33,7 +32,7 @@ export const exportToExcalidrawPlus = async (
files: BinaryFiles,
name: string,
) => {
const storage = await loadFirebaseStorage();
const firebase = await loadFirebaseStorage();
const id = `${nanoid(12)}`;
@@ -50,13 +49,15 @@ export const exportToExcalidrawPlus = async (
},
);
const storageRef = ref(storage, `/migrations/scenes/${id}`);
await uploadBytes(storageRef, blob, {
customMetadata: {
data: JSON.stringify({ version: 2, name }),
created: Date.now().toString(),
},
});
await firebase
.storage()
.ref(`/migrations/scenes/${id}`)
.put(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,7 @@
import oc from "open-color";
import React from "react";
import { THEME } from "@excalidraw/excalidraw/constants";
import type { Theme } from "@excalidraw/excalidraw/element/types";
import { THEME } from "../../packages/excalidraw/constants";
import { Theme } from "../../packages/excalidraw/element/types";
// https://github.com/tholman/github-corners
export const GitHubCorner = React.memo(

View File

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

View File

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

View File

@@ -1,41 +1,28 @@
import { CaptureUpdateAction } from "@excalidraw/excalidraw";
import { compressData } from "@excalidraw/excalidraw/data/encode";
import { newElementWith } from "@excalidraw/excalidraw/element/mutateElement";
import { isInitializedImageElement } from "@excalidraw/excalidraw/element/typeChecks";
import type {
import { compressData } from "../../packages/excalidraw/data/encode";
import { newElementWith } from "../../packages/excalidraw/element/mutateElement";
import { isInitializedImageElement } from "../../packages/excalidraw/element/typeChecks";
import {
ExcalidrawElement,
ExcalidrawImageElement,
FileId,
InitializedExcalidrawImageElement,
} from "@excalidraw/excalidraw/element/types";
import { t } from "@excalidraw/excalidraw/i18n";
import type {
} from "../../packages/excalidraw/element/types";
import { t } from "../../packages/excalidraw/i18n";
import {
BinaryFileData,
BinaryFileMetadata,
ExcalidrawImperativeAPI,
BinaryFiles,
} from "@excalidraw/excalidraw/types";
type FileVersion = Required<BinaryFileData>["version"];
} from "../../packages/excalidraw/types";
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"],
FileVersion
>();
private savingFiles = new Map<ExcalidrawImageElement["fileId"], true>();
/* files already saved to persistent storage */
private savedFiles = new Map<ExcalidrawImageElement["fileId"], FileVersion>();
private erroredFiles_save = new Map<
ExcalidrawImageElement["fileId"],
FileVersion
>();
private savedFiles = new Map<ExcalidrawImageElement["fileId"], true>();
private erroredFiles = new Map<ExcalidrawImageElement["fileId"], true>();
private _getFiles;
private _saveFiles;
@@ -49,8 +36,8 @@ export class FileManager {
erroredFiles: Map<FileId, true>;
}>;
saveFiles: (data: { addedFiles: Map<FileId, BinaryFileData> }) => Promise<{
savedFiles: Map<FileId, BinaryFileData>;
erroredFiles: Map<FileId, BinaryFileData>;
savedFiles: Map<FileId, true>;
erroredFiles: Map<FileId, true>;
}>;
}) {
this._getFiles = getFiles;
@@ -58,28 +45,19 @@ export class FileManager {
}
/**
* returns whether file is saved/errored, or being processed
* returns whether file is already saved or being processed
*/
isFileTracked = (id: FileId) => {
isFileHandled = (id: FileId) => {
return (
this.savedFiles.has(id) ||
this.savingFiles.has(id) ||
this.fetchingFiles.has(id) ||
this.erroredFiles_fetch.has(id) ||
this.erroredFiles_save.has(id)
this.savingFiles.has(id) ||
this.erroredFiles.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;
isFileSaved = (id: FileId) => {
return this.savedFiles.has(id);
};
saveFiles = async ({
@@ -92,16 +70,13 @@ export class FileManager {
const addedFiles: Map<FileId, BinaryFileData> = new Map();
for (const element of elements) {
const fileData =
isInitializedImageElement(element) && files[element.fileId];
if (
fileData &&
// NOTE if errored during save, won't retry due to this check
!this.isFileSavedOrBeingSaved(fileData)
isInitializedImageElement(element) &&
files[element.fileId] &&
!this.isFileHandled(element.fileId)
) {
addedFiles.set(element.fileId, files[element.fileId]);
this.savingFiles.set(element.fileId, this.getFileVersion(fileData));
this.savingFiles.set(element.fileId, true);
}
}
@@ -110,12 +85,8 @@ export class FileManager {
addedFiles,
});
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));
for (const [fileId] of savedFiles) {
this.savedFiles.set(fileId, true);
}
return {
@@ -149,10 +120,10 @@ export class FileManager {
const { loadedFiles, erroredFiles } = await this._getFiles(ids);
for (const file of loadedFiles) {
this.savedFiles.set(file.id, this.getFileVersion(file));
this.savedFiles.set(file.id, true);
}
for (const [fileId] of erroredFiles) {
this.erroredFiles_fetch.set(fileId, true);
this.erroredFiles.set(fileId, true);
}
return { loadedFiles, erroredFiles };
@@ -188,7 +159,7 @@ export class FileManager {
): element is InitializedExcalidrawImageElement => {
return (
isInitializedImageElement(element) &&
this.savedFiles.has(element.fileId) &&
this.isFileSaved(element.fileId) &&
element.status === "pending"
);
};
@@ -197,8 +168,7 @@ export class FileManager {
this.fetchingFiles.clear();
this.savingFiles.clear();
this.savedFiles.clear();
this.erroredFiles_fetch.clear();
this.erroredFiles_save.clear();
this.erroredFiles.clear();
}
}
@@ -268,6 +238,5 @@ export const updateStaleImageStatuses = (params: {
}
return element;
}),
captureUpdate: CaptureUpdateAction.NEVER,
});
};

View File

@@ -19,25 +19,21 @@ import {
setMany,
get,
} from "idb-keyval";
import { clearAppStateForLocalStorage } from "@excalidraw/excalidraw/appState";
import { clearAppStateForLocalStorage } from "../../packages/excalidraw/appState";
import { LibraryPersistedData } from "../../packages/excalidraw/data/library";
import { ImportedDataState } from "../../packages/excalidraw/data/types";
import { clearElementsForLocalStorage } from "../../packages/excalidraw/element";
import {
CANVAS_SEARCH_TAB,
DEFAULT_SIDEBAR,
} from "@excalidraw/excalidraw/constants";
import type { LibraryPersistedData } from "@excalidraw/excalidraw/data/library";
import type { ImportedDataState } from "@excalidraw/excalidraw/data/types";
import { clearElementsForLocalStorage } from "@excalidraw/excalidraw/element";
import type {
ExcalidrawElement,
FileId,
} from "@excalidraw/excalidraw/element/types";
import type {
} from "../../packages/excalidraw/element/types";
import {
AppState,
BinaryFileData,
BinaryFiles,
} from "@excalidraw/excalidraw/types";
import type { MaybePromise } from "@excalidraw/excalidraw/utility-types";
import { debounce } from "@excalidraw/excalidraw/utils";
} from "../../packages/excalidraw/types";
import { MaybePromise } from "../../packages/excalidraw/utility-types";
import { debounce } from "../../packages/excalidraw/utils";
import { SAVE_TO_LOCAL_STORAGE_TIMEOUT, STORAGE_KEYS } from "../app_constants";
import { FileManager } from "./FileManager";
import { Locker } from "./Locker";
@@ -70,22 +66,13 @@ const saveDataStateToLocalStorage = (
appState: AppState,
) => {
try {
const _appState = clearAppStateForLocalStorage(appState);
if (
_appState.openSidebar?.name === DEFAULT_SIDEBAR.name &&
_appState.openSidebar.tab === CANVAS_SEARCH_TAB
) {
_appState.openSidebar = null;
}
localStorage.setItem(
STORAGE_KEYS.LOCAL_STORAGE_ELEMENTS,
JSON.stringify(clearElementsForLocalStorage(elements)),
);
localStorage.setItem(
STORAGE_KEYS.LOCAL_STORAGE_APP_STATE,
JSON.stringify(_appState),
JSON.stringify(clearAppStateForLocalStorage(appState)),
);
updateBrowserStateVersion(STORAGE_KEYS.VERSION_DATA_STATE);
} catch (error: any) {
@@ -183,8 +170,8 @@ export class LocalData {
);
},
async saveFiles({ addedFiles }) {
const savedFiles = new Map<FileId, BinaryFileData>();
const erroredFiles = new Map<FileId, BinaryFileData>();
const savedFiles = new Map<FileId, true>();
const erroredFiles = new Map<FileId, true>();
// before we use `storage` event synchronization, let's update the flag
// optimistically. Hopefully nothing fails, and an IDB read executed
@@ -195,10 +182,10 @@ export class LocalData {
[...addedFiles].map(async ([id, fileData]) => {
try {
await set(id, fileData, filesStore);
savedFiles.set(id, fileData);
savedFiles.set(id, true);
} catch (error: any) {
console.error(error);
erroredFiles.set(id, fileData);
erroredFiles.set(id, true);
}
}),
);

View File

@@ -1,38 +1,31 @@
import { reconcileElements } from "@excalidraw/excalidraw";
import type {
import {
ExcalidrawElement,
FileId,
OrderedExcalidrawElement,
} from "@excalidraw/excalidraw/element/types";
import { getSceneVersion } from "@excalidraw/excalidraw/element";
import type Portal from "../collab/Portal";
import { restoreElements } from "@excalidraw/excalidraw/data/restore";
import type {
} from "../../packages/excalidraw/element/types";
import { getSceneVersion } from "../../packages/excalidraw/element";
import Portal from "../collab/Portal";
import { restoreElements } from "../../packages/excalidraw/data/restore";
import {
AppState,
BinaryFileData,
BinaryFileMetadata,
DataURL,
} from "@excalidraw/excalidraw/types";
} from "../../packages/excalidraw/types";
import { FILE_CACHE_MAX_AGE_SEC } from "../app_constants";
import { decompressData } from "@excalidraw/excalidraw/data/encode";
import { decompressData } from "../../packages/excalidraw/data/encode";
import {
encryptData,
decryptData,
} from "@excalidraw/excalidraw/data/encryption";
import { MIME_TYPES } from "@excalidraw/excalidraw/constants";
import type { SyncableExcalidrawElement } from ".";
import { getSyncableElements } from ".";
import { initializeApp } from "firebase/app";
import {
getFirestore,
doc,
getDoc,
runTransaction,
Bytes,
} from "firebase/firestore";
import { getStorage, ref, uploadBytes } from "firebase/storage";
} from "../../packages/excalidraw/data/encryption";
import { MIME_TYPES } from "../../packages/excalidraw/constants";
import { getSyncableElements, SyncableExcalidrawElement } from ".";
import { ResolutionType } from "../../packages/excalidraw/utility-types";
import type { Socket } from "socket.io-client";
import type { RemoteExcalidrawElement } from "@excalidraw/excalidraw/data/reconcile";
import {
RemoteExcalidrawElement,
reconcileElements,
} from "../../packages/excalidraw/data/reconcile";
// private
// -----------------------------------------------------------------------------
@@ -49,43 +42,81 @@ try {
FIREBASE_CONFIG = {};
}
let firebaseApp: ReturnType<typeof initializeApp> | null = null;
let firestore: ReturnType<typeof getFirestore> | null = null;
let firebaseStorage: ReturnType<typeof getStorage> | null = null;
let firebasePromise: Promise<typeof import("firebase/app").default> | null =
null;
let firestorePromise: Promise<any> | null | true = null;
let firebaseStoragePromise: Promise<any> | null | true = null;
const _initializeFirebase = () => {
if (!firebaseApp) {
firebaseApp = initializeApp(FIREBASE_CONFIG);
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;
}
return firebaseApp;
return firebase;
};
const _getFirestore = () => {
if (!firestore) {
firestore = getFirestore(_initializeFirebase());
const _getFirebase = async (): Promise<
typeof import("firebase/app").default
> => {
if (!firebasePromise) {
firebasePromise = _loadFirebase();
}
return firestore;
};
const _getStorage = () => {
if (!firebaseStorage) {
firebaseStorage = getStorage(_initializeFirebase());
}
return firebaseStorage;
return firebasePromise;
};
// -----------------------------------------------------------------------------
export const loadFirebaseStorage = async () => {
return _getStorage();
const loadFirestore = async () => {
const firebase = await _getFirebase();
if (!firestorePromise) {
firestorePromise = import(
/* webpackChunkName: "firestore" */ "firebase/firestore"
);
}
if (firestorePromise !== true) {
await firestorePromise;
firestorePromise = true;
}
return firebase;
};
type FirebaseStoredScene = {
sceneVersion: number;
iv: Bytes;
ciphertext: Bytes;
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;
};
interface FirebaseStoredScene {
sceneVersion: number;
iv: firebase.default.firestore.Blob;
ciphertext: firebase.default.firestore.Blob;
}
const encryptElements = async (
key: string,
elements: readonly ExcalidrawElement[],
@@ -145,21 +176,28 @@ export const saveFilesToFirebase = async ({
prefix: string;
files: { id: FileId; buffer: Uint8Array }[];
}) => {
const storage = await loadFirebaseStorage();
const firebase = await loadFirebaseStorage();
const erroredFiles: FileId[] = [];
const savedFiles: FileId[] = [];
const erroredFiles = new Map<FileId, true>();
const savedFiles = new Map<FileId, true>();
await Promise.all(
files.map(async ({ id, buffer }) => {
try {
const storageRef = ref(storage, `${prefix}/${id}`);
await uploadBytes(storageRef, buffer, {
cacheControl: `public, max-age=${FILE_CACHE_MAX_AGE_SEC}`,
});
savedFiles.push(id);
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);
} catch (error: any) {
erroredFiles.push(id);
erroredFiles.set(id, true);
}
}),
);
@@ -168,6 +206,7 @@ export const saveFilesToFirebase = async ({
};
const createFirebaseSceneDocument = async (
firebase: ResolutionType<typeof loadFirestore>,
elements: readonly SyncableExcalidrawElement[],
roomKey: string,
) => {
@@ -175,8 +214,10 @@ const createFirebaseSceneDocument = async (
const { ciphertext, iv } = await encryptElements(roomKey, elements);
return {
sceneVersion,
ciphertext: Bytes.fromUint8Array(new Uint8Array(ciphertext)),
iv: Bytes.fromUint8Array(iv),
ciphertext: firebase.firestore.Blob.fromUint8Array(
new Uint8Array(ciphertext),
),
iv: firebase.firestore.Blob.fromUint8Array(iv),
} as FirebaseStoredScene;
};
@@ -196,14 +237,20 @@ export const saveToFirebase = async (
return null;
}
const firestore = _getFirestore();
const docRef = doc(firestore, "scenes", roomId);
const firebase = await loadFirestore();
const firestore = firebase.firestore();
const storedScene = await runTransaction(firestore, async (transaction) => {
const docRef = firestore.collection("scenes").doc(roomId);
const storedScene = await firestore.runTransaction(async (transaction) => {
const snapshot = await transaction.get(docRef);
if (!snapshot.exists()) {
const storedScene = await createFirebaseSceneDocument(elements, roomKey);
if (!snapshot.exists) {
const storedScene = await createFirebaseSceneDocument(
firebase,
elements,
roomKey,
);
transaction.set(docRef, storedScene);
@@ -223,6 +270,7 @@ export const saveToFirebase = async (
);
const storedScene = await createFirebaseSceneDocument(
firebase,
reconciledElements,
roomKey,
);
@@ -247,13 +295,15 @@ export const loadFromFirebase = async (
roomKey: string,
socket: Socket | null,
): Promise<readonly SyncableExcalidrawElement[] | null> => {
const firestore = _getFirestore();
const docRef = doc(firestore, "scenes", roomId);
const docSnap = await getDoc(docRef);
if (!docSnap.exists()) {
const firebase = await loadFirestore();
const db = firebase.firestore();
const docRef = db.collection("scenes").doc(roomId);
const doc = await docRef.get();
if (!doc.exists) {
return null;
}
const storedScene = docSnap.data() as FirebaseStoredScene;
const storedScene = doc.data() as FirebaseStoredScene;
const elements = getSyncableElements(
restoreElements(await decryptElements(storedScene, roomKey), null),
);

View File

@@ -1,38 +1,38 @@
import {
compressData,
decompressData,
} from "@excalidraw/excalidraw/data/encode";
} from "../../packages/excalidraw/data/encode";
import {
decryptData,
generateEncryptionKey,
IV_LENGTH_BYTES,
} from "@excalidraw/excalidraw/data/encryption";
import { serializeAsJSON } from "@excalidraw/excalidraw/data/json";
import { restore } from "@excalidraw/excalidraw/data/restore";
import type { ImportedDataState } from "@excalidraw/excalidraw/data/types";
import type { SceneBounds } from "@excalidraw/excalidraw/element/bounds";
import { isInvisiblySmallElement } from "@excalidraw/excalidraw/element/sizeHelpers";
import { isInitializedImageElement } from "@excalidraw/excalidraw/element/typeChecks";
import type {
} from "../../packages/excalidraw/data/encryption";
import { serializeAsJSON } from "../../packages/excalidraw/data/json";
import { restore } from "../../packages/excalidraw/data/restore";
import { ImportedDataState } from "../../packages/excalidraw/data/types";
import { SceneBounds } from "../../packages/excalidraw/element/bounds";
import { isInvisiblySmallElement } from "../../packages/excalidraw/element/sizeHelpers";
import { isInitializedImageElement } from "../../packages/excalidraw/element/typeChecks";
import {
ExcalidrawElement,
FileId,
OrderedExcalidrawElement,
} from "@excalidraw/excalidraw/element/types";
import { t } from "@excalidraw/excalidraw/i18n";
import type {
} from "../../packages/excalidraw/element/types";
import { t } from "../../packages/excalidraw/i18n";
import {
AppState,
BinaryFileData,
BinaryFiles,
SocketId,
} from "@excalidraw/excalidraw/types";
import type { UserIdleState } from "@excalidraw/excalidraw/constants";
import type { MakeBrand } from "@excalidraw/excalidraw/utility-types";
import { bytesToHexString } from "@excalidraw/excalidraw/utils";
import type { WS_SUBTYPES } from "../app_constants";
UserIdleState,
} from "../../packages/excalidraw/types";
import { MakeBrand } from "../../packages/excalidraw/utility-types";
import { bytesToHexString } from "../../packages/excalidraw/utils";
import {
DELETED_ELEMENT_TIMEOUT,
FILE_UPLOAD_MAX_BYTES,
ROOM_ID_BYTES,
WS_SUBTYPES,
} from "../app_constants";
import { encodeFilesForUpload } from "./FileManager";
import { saveFilesToFirebase } from "./firebase";
@@ -269,6 +269,7 @@ export const loadScene = async (
// in the scene database/localStorage, and instead fetch them async
// from a different database
files: data.files,
commitToHistory: false,
};
};

View File

@@ -1,10 +1,10 @@
import type { ExcalidrawElement } from "@excalidraw/excalidraw/element/types";
import type { AppState } from "@excalidraw/excalidraw/types";
import { ExcalidrawElement } from "../../packages/excalidraw/element/types";
import { AppState } from "../../packages/excalidraw/types";
import {
clearAppStateForLocalStorage,
getDefaultAppState,
} from "@excalidraw/excalidraw/appState";
import { clearElementsForLocalStorage } from "@excalidraw/excalidraw/element";
} from "../../packages/excalidraw/appState";
import { clearElementsForLocalStorage } from "../../packages/excalidraw/element";
import { STORAGE_KEYS } from "../app_constants";
export const saveUsernameToLocalStorage = (username: string) => {

View File

@@ -1,6 +1,3 @@
import "@excalidraw/excalidraw/global";
import "@excalidraw/excalidraw/css";
interface Window {
__EXCALIDRAW_SHA__: string | undefined;
}

View File

@@ -20,7 +20,7 @@
name="description"
content="Excalidraw is a virtual collaborative whiteboard tool that lets you easily sketch diagrams that have a hand-drawn feel to them."
/>
<meta name="image" content="https://excalidraw.com/og-image-3.png" />
<meta name="image" content="https://excalidraw.com/og-image-2.png" />
<!-- Open Graph / Facebook -->
<meta property="og:site_name" content="Excalidraw" />
@@ -35,7 +35,7 @@
property="og:description"
content="Excalidraw is a virtual collaborative whiteboard tool that lets you easily sketch diagrams that have a hand-drawn feel to them."
/>
<meta property="og:image" content="https://excalidraw.com/og-image-3.png" />
<meta property="og:image" content="https://excalidraw.com/og-image-2.png" />
<!-- Twitter -->
<meta property="twitter:card" content="summary_large_image" />
@@ -51,10 +51,14 @@
/>
<meta
property="twitter:image"
content="https://excalidraw.com/og-image-3.png"
content="https://excalidraw.com/og-twitter-v2.png"
/>
<link rel="canonical" href="https://excalidraw.com" />
<!-- General tags -->
<meta
name="description"
content="Excalidraw is a virtual collaborative whiteboard tool that lets you easily sketch diagrams that have a hand-drawn feel to them."
/>
<!------------------------------------------------------------------------->
<!-- to minimize white flash on load when user has dark mode enabled -->
@@ -91,11 +95,6 @@
color: #fff;
}
</style>
<!-- Warmup the connection for Google fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<!------------------------------------------------------------------------->
<% if (typeof PROD != 'undefined' && PROD == true) { %>
<script>
@@ -116,21 +115,6 @@
window.location.href = "https://app.excalidraw.com";
}
</script>
<!-- Following placeholder is replaced during the build step -->
<!-- PLACEHOLDER:EXCALIDRAW_APP_FONTS -->
<!-- Register Assistant as the UI font, before the scene inits -->
<link
rel="stylesheet"
href="../packages/excalidraw/fonts/fonts.css"
type="text/css"
/>
<% } else { %>
<script>
window.EXCALIDRAW_ASSET_PATH = window.origin;
</script>
<% } %>
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
@@ -140,6 +124,22 @@
<!-- Excalidraw version -->
<meta name="version" content="{version}" />
<link
rel="preload"
href="/Virgil.woff2"
as="font"
type="font/woff2"
crossorigin="anonymous"
/>
<link
rel="preload"
href="/Cascadia.woff2"
as="font"
type="font/woff2"
crossorigin="anonymous"
/>
<link rel="stylesheet" href="/fonts/fonts.css" type="text/css" />
<% if (typeof VITE_APP_DEV_DISABLE_LIVE_RELOAD != 'undefined' &&
VITE_APP_DEV_DISABLE_LIVE_RELOAD == true) { %>
<script>
@@ -158,6 +158,7 @@
</script>
<% } %>
<script>
window.EXCALIDRAW_ASSET_PATH = "/";
// setting this so that libraries installation reuses this window tab.
window.name = "_excalidraw";
</script>
@@ -214,7 +215,6 @@
</header>
<div id="root"></div>
<script type="module" src="index.tsx"></script>
<% if (typeof PROD != 'undefined' && PROD == true) { %>
<!-- 100% privacy friendly analytics -->
<script>
// need to load this script dynamically bcs. of iframe embed tracking
@@ -247,6 +247,5 @@
}
</script>
<!-- end LEGACY GOOGLE ANALYTICS -->
<% } %>
</body>
</html>

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