Commit Graph

1529 Commits (fd4460be3787088a5a46daecedc52aabb00cc9b9)

Author SHA1 Message Date
David Luzar 964746e569
fix transform handles regression (#2018) 5 years ago
David Luzar 950bcd0b72
Refactor resize handle naming (#2013) 5 years ago
Michal Srb 85d000ccda
Add prevent binding keyboard shortcut to shortcuts dialog (#2010)
Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
Michal Srb 8bbeb32e87
Fix text selection broken by PR1899 (#2011) 5 years ago
Michal Srb 26f67d27ec
Allow binding linear elements to other elements (#1899)
* Refactor: simplify linear element type

* Refactor: dedupe scrollbar handling

* First step towards binding - establish relationship and basic test for dragged lines

* Refactor: use zoom from appstate

* Refactor: generalize getElementAtPosition

* Only consider bindable elements in hit test

* Refactor: pull out pieces of hit test for reuse later

* Refactor: pull out diamond from hit test for reuse later

* Refactor: pull out text from hit test for reuse later

* Suggest binding when hovering

* Give shapes in regression test real size

* Give shapes in undo/redo test real size

* Keep bound element highlighted

* Show binding suggestion for multi-point elements

* Move binding to its on module with functions so that I can use it from actions, add support for binding end of multi-point elements

* Use Id instead of ID

* Improve boundary offset for non-squarish elements

* Fix localStorage for binding on linear elements

* Simplify dragging code and fix elements bound twice to the same shape

* Fix binding for rectangles

* Bind both ends at the end of the linear element creation, needed for focus points

* wip

* Refactor: Renames and reshapes for next commit

* Calculate and store focus points and gaps, but dont use them yet

* Focus points for rectangles

* Dont blow up when canceling linear element

* Stop suggesting binding when a non-compatible tool is selected

* Clean up collision code

* Using Geometric Algebra for hit tests

* Correct binding for all shapes

* Constant gap around polygon corners

* Fix rotation handling

* Generalize update and fix hit test for rotated elements

* Handle rotation realtime

* Handle scaling

* Remove vibration when moving bound and binding element together

* Handle simultenous scaling

* Allow binding and unbinding when editing linear elements

* Dont delete binding when the end point wasnt touched

* Bind on enter/escape when editing

* Support multiple suggested bindable elements in preparation for supporting linear elements dragging

* Update binding when moving linear elements

* Update binding when resizing linear elements

* Dont re-render UI on binding hints

* Update both ends when one is moved

* Use distance instead of focus point for binding

* Complicated approach for posterity, ignore this commit

* Revert the complicated approach

* Better focus point strategy, working for all shapes

* Update snapshots

* Dont break binding gap when mirroring shape

* Dont break binding gap when grid mode pushes it inside

* Dont bind draw elements

* Support alt duplication

* Fix alt duplication to

* Support cmd+D duplication

* All copy mechanisms are supported

* Allow binding shapes to arrows, having arrows created first

* Prevent arrows from disappearing for ellipses

* Better binding suggestion highlight for shapes

* Dont suggest second binding for simple elements when editing or moving them

* Dont steal already bound linear elements when moving shapes

* Fix highlighting diamonds and more precisely highlight other shapes

* Highlight linear element edges for binding

* Highlight text binding too

* Handle deletion

* Dont suggest second binding for simple linear elements when creating them

* Dont highlight bound element during creation

* Fix binding for rotated linear elements

* Fix collision check for ellipses

* Dont show suggested bindings for selected pairs

* Bind multi-point linear elements when the tool is switched - important for mobile

* Handle unbinding one of two bound edges correctly

* Rename boundElement in state to startBoundElement

* Dont double account for zoom when rendering binding highlight

* Fix rendering of edited linear element point handles

* Suggest binding when adding new point to a linear element

* Bind when adding a new point to a linear element and dont unbind when moving middle elements

* Handle deleting points

* Add cmd modifier key to disable binding

* Use state for enabling binding, fix not binding for linear elements during creation

* Drop support for binding lines, only arrows are bindable

* Reset binding mode on blur

* Fix not binding lines
5 years ago
wasp77 5f195694ee
update simplifier distance to reflect zoom (#2004)
* update simplifier distance to reflect zoom

The distance used in the iterative end-point fit algorithm to
determine if points can be removed no longer ignores the
zoom. As the zoom gets larger this distance will get smaller
and fewer points will be removed, thus making for finer grain
control over the drawing. As the zoom gets smaller the drawing
will get more coarse as more points are removed.

* remove the comment

Co-authored-by: John Dupuis <wasp7@Johns-MacBook-Pro.local>
Co-authored-by: Michal Srb <xixixao@seznam.cz>
5 years ago
Rene 403e8bd307
clear selection from copied/duplicatated group (#1973)
Co-authored-by: rene_mbp <harryloveslearning@googlemail.com>
Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
David Luzar c06988a202
do not prevent UI scrolling on mobile (#2007) 5 years ago
David Luzar fea257765d
regenerate seed on change of sloppiness (#1986) 5 years ago
Daishi Kato 818821c293
feat: grid mode for line editing (#1984) 5 years ago
David Luzar c171fb4c7f
simplify by replacing draggingElementPointIndex with isDragging (#1982)
* simplify by replacing draggingElementPointIndex with isDragging

* add tsdoc
5 years ago
Aakansha Doshi 20500b7822
remove shared global scene and attach it to every instance (#1706)
Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
Lipis 54f8d8f820
New Crowdin updates (#1949) 5 years ago
David Luzar ab980b252c
make restore migration types required (#1977) 5 years ago
Christopher Chedeau 925db9dcca
Only insert text on double click when selection is enabled (#1937)
This was an oversight to enable it for all the shapes. I don't believe that we want to be able to insert text on double click when drawing a rectangle for example. And it's definitely a broken experience when doing so for free draw.

Fixes part of #1935
5 years ago
Mohammed Salman ee8fa6aaad
Import and export library from/to a file (#1940)
Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
Aakansha Doshi 7eff6893c5
calculate coords based on container viewport position (#1955)
* feat: calculate coords based on parent left and top so it renders correctly in host App

* fix text

* move offsets to state & fix bugs

* fix text jumping

* account for zoom in textWysiwyg & undo incorrect offsetting

Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
David Luzar f295550940
ensure editingLinearElement handles are rendered on top (#1967) 5 years ago
Farooq AR df4e903bd6
Add regression tests for context-menu actions (#1959) 5 years ago
Daishi Kato a2e7d8d560
feat: rotating multiple elements (#1960) 5 years ago
Rene ebf2923c5e
Issues/1827 group-ungroup icons (#1956)
* show group and ungroup action-icon

* change group-icon visiblilty

don't show group if selected is only a single element or a single group of elements

Co-authored-by: rene_mbp <harryloveslearning@googlemail.com>
5 years ago
Thomas Steiner 880cac2359
Update browser-nativefs (#1963)
Incorporates the latest changes in the Native File System API
5 years ago
Thomas Steiner d3a38202e3
Make sure extension gets set correctly for exports (#1962) 5 years ago
David Luzar dc1f6c4d4c
change selection/line/draw shortcut defaults (#1953) 5 years ago
David Luzar c5d37a07c8
fix resize hints not showing due to LayerUI bailing on updates (#1952) 5 years ago
Lipis f15d62aa44
New Crowdin updates (#1926)
* New translations en.json (French)

* New translations en.json (French)

* New translations en.json (Turkish)

* Auto commit: Calculate translation coverage

* New translations en.json (Arabic)

* New translations en.json (Turkish)

* Auto commit: Calculate translation coverage

Co-authored-by: Kostas Bariotis <konmpar@gmail.com>
5 years ago
David Luzar b07aa6e205
delay scene init until document active (#1920)
* delay scene init until document active

* use opts.once for the listener
5 years ago
Mohammed Salman cf36cb394b
Library improvements (#1925)
Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
Herb Caudill 29f803e25d
Fix display of some emoji on Windows (#1933) 5 years ago
David Luzar c1488fa353
try/catch localStorage access (#1932) 5 years ago
David Luzar 494b7d08c5
mute FS abort errors (#1929) 5 years ago
David Luzar 4cfc8bd4b3
fix accessing nonexisting config property during appState clearing (#1928) 5 years ago
Mohammed Salman bac20fa641
Choosing color before entering text does not update the swatch (Fixes #1897) (#1915)
Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
Lipis 8ab7921796
New Crowdin updates (#1883)
* New translations en.json (Norwegian Bokmal)

* Auto commit: Calculate translation coverage

* New translations en.json (Hindi)

* Auto commit: Calculate translation coverage

* New translations en.json (Hindi)

* Auto commit: Calculate translation coverage

* New translations en.json (French)

* New translations en.json (Russian)

* New translations en.json (Norwegian Bokmal)

* New translations en.json (Ukrainian)

* New translations en.json (Persian)

* New translations en.json (Albanian)

* New translations en.json (Catalan)

* New translations en.json (Hebrew)

* New translations en.json (Hindi)

* New translations en.json (Indonesian)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Simplified)

* New translations en.json (Turkish)

* New translations en.json (Portuguese)

* New translations en.json (Spanish)

* New translations en.json (Polish)

* New translations en.json (Dutch)

* New translations en.json (Korean)

* New translations en.json (Japanese)

* New translations en.json (Italian)

* New translations en.json (Hungarian)

* New translations en.json (Finnish)

* New translations en.json (Greek)

* New translations en.json (German)

* New translations en.json (Bulgarian)

* New translations en.json (Arabic)

* New translations en.json (Norwegian Nynorsk)

* Auto commit: Calculate translation coverage

* New translations en.json (Norwegian Bokmal)

* Auto commit: Calculate translation coverage

* New translations en.json (Portuguese)

* Auto commit: Calculate translation coverage

* New translations en.json (Persian)

* Auto commit: Calculate translation coverage

* New translations en.json (Chinese Traditional)

* Auto commit: Calculate translation coverage

* New translations en.json (Finnish)

* Auto commit: Calculate translation coverage

* New translations en.json (Hindi)

* Auto commit: Calculate translation coverage

* New translations en.json (German)

* New translations en.json (German)

* Auto commit: Calculate translation coverage

* New translations en.json (French)

* New translations en.json (Russian)

* New translations en.json (Norwegian Bokmal)

* New translations en.json (Ukrainian)

* New translations en.json (Persian)

* New translations en.json (Albanian)

* New translations en.json (Catalan)

* New translations en.json (Hebrew)

* New translations en.json (Hindi)

* New translations en.json (Indonesian)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Simplified)

* New translations en.json (Turkish)

* New translations en.json (Portuguese)

* New translations en.json (Spanish)

* New translations en.json (Polish)

* New translations en.json (Dutch)

* New translations en.json (Korean)

* New translations en.json (Japanese)

* New translations en.json (Italian)

* New translations en.json (Hungarian)

* New translations en.json (Finnish)

* New translations en.json (Greek)

* New translations en.json (German)

* New translations en.json (Bulgarian)

* New translations en.json (Arabic)

* New translations en.json (Norwegian Nynorsk)

* Auto commit: Calculate translation coverage

* New translations en.json (Chinese Traditional)

* Auto commit: Calculate translation coverage

* New translations en.json (Norwegian Bokmal)

* Auto commit: Calculate translation coverage

* New translations en.json (Ukrainian)

* Auto commit: Calculate translation coverage

* New translations en.json (Finnish)

* Auto commit: Calculate translation coverage

* New translations en.json (German)

* Auto commit: Calculate translation coverage

* New translations en.json (Catalan)

* Auto commit: Calculate translation coverage

* New translations en.json (Catalan)

* Auto commit: Calculate translation coverage

* New translations en.json (Spanish)

* New translations en.json (Catalan)

* Auto commit: Calculate translation coverage

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Italian)

* New translations en.json (Portuguese)

* Auto commit: Calculate translation coverage

* New translations en.json (Italian)

* Auto commit: Calculate translation coverage

* New translations en.json (Russian)

* New translations en.json (Russian)

* Auto commit: Calculate translation coverage

Co-authored-by: Kostas Bariotis <konmpar@gmail.com>
5 years ago
Aakansha Doshi 953cd5563c
move the excalidraw props to correct file and typo fix (#1907) 5 years ago
David Luzar 0ee2c15929
make clearing state for storage more type-safe (#1884) 5 years ago
Pete Hunt 6428b59ccb
Library MVP (#1787)
Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
David Luzar 7ab0c1aba8
reload scene on hashchange (#1893)
* reload scene on hashchange

* tweak isLoading
5 years ago
Michal Srb 4ab4fce998
Refactoring in pointer down event handler, step 3 (#1888)
* Refactor: use pointer down state for alt duplication flag

* Refactor: use pointer down state for drag state

* Refactor: simplify over scrollbars check

* Refactor: move pointer move handler out of pointer down handler

* Refactor: move pointer up handler out of pointer down handler

* Refactor: further simplify scrollbar check state in pointer down event

* Refactor: pull out initial pointer down state creation
5 years ago
David Luzar 6e357c0291
fix deleting multi-point elem during edit (#1892) 5 years ago
Rene 51a8ab65f3
Group / ungroup should not always be present in the context menu (#1890)
Co-authored-by: rene_mbp <harryloveslearning@googlemail.com>
Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
Michal Srb 5664de0459
Refactoring in pointer down event handler, step 2 (#1887)
* Refactor: introduce pointer down state to replace implicit closure state with an explicit object

* Refactor: use pointer down state for resize handle

* Refactor: use pointer down state for isResizing

* Refactor: use pointer down state for resizing offset

* Refactor: use pointer down state for hit element

* Refactor: move selection handling out of pointer down event handler

* Refactor: move text handling out of pointer down event handler

* Refactor: move linear tools handling out of pointer down event handler

* Refactor: move element creation out of pointer down handler
5 years ago
Daishi Kato 6cc6e13892
adjust font baseline on resize (#1820)
* adjust font baseline on resize

* simplify font scaling on resize

* fix: resizing text to avoid glitchy behavior

* make text resizing deterministic

* no TEXT_WIDTH_PADDING hack

Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
Michal Srb 5d7020cce6
Refactoring in pointer down event handler (#1880)
* Refactor: Move context menu touch device handling

* Refactor: Move more stuff out of pointer down

* Refactor: Move last coords into an object

* Refactor: Move scrollbar handling out of pointer down

* Refactor: simplify resizing in pointer down

* Refactor: further simplify resizing in pointer down

* Refactor: clarify clearing selection code

* Refactor: move out clearing selection from pointer down

* Refactor: further simplify deselection in pointer down
5 years ago
David Luzar d5e7d08586
prompt when loading external scene before overriding local one (#1862) 5 years ago
fujimoto kyosuke 6f13b5ac75
Fix status when do `selectAll` while editing lines (#1828) 5 years ago
David Luzar df5eb3f0d9
change copy/paste styles shortcuts (#1881)
* change copy/paste styles shortcuts

* use keyCode
5 years ago
Aakansha Doshi 01e546c230
use width,height from current appstate when initializing scene (#1882)
Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
Lipis ead58bf2d9
New Crowdin updates (#1856) 5 years ago
Aakansha Doshi 9351b2821c
feat: add width, height as props to App.tsx (#1871) 5 years ago
David Luzar b1261eea70
duplicate point on cmd+d (#1831) 5 years ago
Oren Me 84abda82d5
docs: add multiple selection docs (#1875) 5 years ago
Mehedi Hassan cc52ea4ac2
Add support for long press to context menu on iOS (#1769)
* Initial support for touch context menu

* Only deal with touch if it's available

* Fix touch checking

* Remove touch checking

* Added comments

* Combine onTouch with onPointer for mobile context menu support
5 years ago
Minh Nguyen 8621ddb6a2
Extract backend URLs into environment variables (#1772) (#1848) 5 years ago
Aakansha Doshi b21f723eee
use absolute positioning instead of fixed (#1860) 5 years ago
David Luzar d9e84b90ce
strip fragment (#1859) 5 years ago
Prashant Agarwal 79c3b846d7
Added Language support for Hindi in language selection dropdown (#1753)
* Added Language support for Hindi in language selection dropdown

* Update src/locales/hi-IN.json

* Update src/i18n.ts

Co-authored-by: Lipis <lipiridis@gmail.com>
5 years ago
Lipis d39d8e3cb1
New Crowdin updates (#1846) 5 years ago
Lipis 89cf826555
Change target branch of coverage and pretty print (#1850) 5 years ago
Kostas Bariotis 2a25480272
Expose Git SHA to window (#1847)
* expose git sha

* move to global.d.ts

* fix vercel domain
5 years ago
Kostas Bariotis 9a5ae05bbf Auto commit: Calculate translation coverage 5 years ago
Lipis 54a72b821a
New translations en.json (Greek) (#1845) 5 years ago
Kostas Bariotis 8c3549f336
Add script to calculate percentage of translation (#1826)
* add script to calculate percentage of translation

* test translation change

* change translation

* test

* change translation

* Calculate percentages of each translation file

* test

* Calculate percentages of each translation file

* change translation

* test

* test

* Calculate percentages of each translation file

* test

* Calculate percentages of each translation file

* fix workflow

* test

* test again

* Calculate percentages of each translation file

* Calculate percentages of each translation file

* test

* refactor

* change build logic

* fix types, move English first

* docs added

* test translation file

* test

* test

* test

* test

* test

* test

* test

* test

* test

* test

* test

* test

* Calculate percentages of each translation file

* let this be the final test please

* Calculate percentages of each translation file

* test

* test

* Test

* Calculate percentages of each translation file

* test

* Calculate percentages of each translation file

* test

* Calculate percentages of each translation file

* test

* Auto commit: Calculate translation coverage

* test

* test

* test

* test

* Auto commit: Calculate translation coverage

* test

* only on master

* test

* test

* Auto commit: Calculate translation coverage

* switch to master branch

Co-authored-by: i18n automation <runner@fv-az76.2iswp1o5zimezclxzdlwqia2gf.cx.internal.cloudapp.net>
Co-authored-by: i18n automation <runner@fv-az129.idlktykl4ure3gqe2lnji05orb.cx.internal.cloudapp.net>
Co-authored-by: i18n automation <runner@fv-az76.pjgcdo5npjpenpqz2nk0ztqvxd.cx.internal.cloudapp.net>
Co-authored-by: i18n automation <runner@fv-az33.senarqq4ucbulg04aytwntvgah.cx.internal.cloudapp.net>
Co-authored-by: i18n automation <runner@fv-az51.icvemaqob4xunfekbtdiz2tu2c.cx.internal.cloudapp.net>
Co-authored-by: i18n automation <runner@fv-az78.gikxu4m3dpiulftj3bftpuu3ee.cx.internal.cloudapp.net>
Co-authored-by: i18n automation <runner@fv-az121.cqdewbghluceforu5pkvpnveec.cx.internal.cloudapp.net>
Co-authored-by: i18n automation <runner@fv-az139.jsbds1i2htye3fh1bzwbe4ugmf.cx.internal.cloudapp.net>
Co-authored-by: i18n automation <runner@fv-az50.0bg2cysi0dkefjvuua0a0kbd1h.cx.internal.cloudapp.net>
Co-authored-by: i18n automation <runner@fv-az51.nhi3in4tbx4ehjtltcwuwbwsua.cx.internal.cloudapp.net>
5 years ago
Simon Riisnæs Dagfinrud e23f7d37b6
Update Norwegian languages in list (#1843) 5 years ago
Lipis 483796f6ff
New Crowdin updates (#1813) 5 years ago
Minh Nguyen a679ef7876
Refactor CJS require to ESM (#1841)
Resolves https://github.com/excalidraw/excalidraw/pull/1793#discussion_r447067827
5 years ago
Kostas Bariotis 0a3fb70ec7
Dynamicaly import locales (#1793)
* dynamicly import locales

* fix tests

* reformat languages
5 years ago
Lipis 5970bb7ee9
Remove duplicate string for toggle grid mode (#1821) 5 years ago
Saransh Barua 1991511ef7
Fix flickering outline on the dialogs while clicking (#1747) 5 years ago
David Luzar cd87bd6901
do not center text when not applicable (#1783) 5 years ago
Daishi Kato 9c89504b6f
fix: start dragging grouped elements (#1818)
Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
Daishi Kato caa9b54893
do not render grid on export (#1814) 5 years ago
Lipis e7ef02cc0f
New Crowdin updates and change code for Norwegian Bokmal (#1776)
* New translations en.json (Turkish)

* New translations en.json (French)

* New translations en.json (Turkish)

* New translations en.json (Turkish)

* New translations en.json (Turkish)

* New translations en.json (Turkish)

* New translations en.json (Turkish)

* New translations en.json (Turkish)

* New translations en.json (Norwegian Bokmal)

* Update i18n.ts

* Remove no-NO

* Update i18n.ts

* Update i18n.ts

* New translations en.json (Hindi)

* New translations en.json (Hindi)

* New translations en.json (Hindi)

* New translations en.json (Hindi)

* New translations en.json (French)

* New translations en.json (Russian)

* New translations en.json (Ukrainian)

* New translations en.json (Persian)

* New translations en.json (Albanian)

* New translations en.json (Catalan)

* New translations en.json (Hebrew)

* New translations en.json (Hindi)

* New translations en.json (Indonesian)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Simplified)

* New translations en.json (Turkish)

* New translations en.json (Portuguese)

* New translations en.json (Spanish)

* New translations en.json (Polish)

* New translations en.json (Dutch)

* New translations en.json (Korean)

* New translations en.json (Japanese)

* New translations en.json (Italian)

* New translations en.json (Hungarian)

* New translations en.json (Finnish)

* New translations en.json (Greek)

* New translations en.json (German)

* New translations en.json (Bulgarian)

* New translations en.json (Arabic)

* New translations en.json (Norwegian Bokmal)

* New translations en.json (Chinese Traditional)

* New translations en.json (Norwegian Bokmal)

* New translations en.json (Finnish)

* New translations en.json (Persian)

* New translations en.json (Portuguese)

* New translations en.json (Turkish)

* New translations en.json (Turkish)

* New translations en.json (Turkish)

* New translations en.json (German)

* New translations en.json (French)

* New translations en.json (Russian)

* New translations en.json (Ukrainian)

* New translations en.json (Persian)

* New translations en.json (Albanian)

* New translations en.json (Catalan)

* New translations en.json (Hebrew)

* New translations en.json (Hindi)

* New translations en.json (Indonesian)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Simplified)

* New translations en.json (Turkish)

* New translations en.json (Portuguese)

* New translations en.json (Spanish)

* New translations en.json (Polish)

* New translations en.json (Dutch)

* New translations en.json (Korean)

* New translations en.json (Japanese)

* New translations en.json (Italian)

* New translations en.json (Hungarian)

* New translations en.json (Finnish)

* New translations en.json (Greek)

* New translations en.json (German)

* New translations en.json (Bulgarian)

* New translations en.json (Arabic)

* New translations en.json (Norwegian Bokmal)

* New translations en.json (Polish)

* New translations en.json (Polish)

* New translations en.json (Norwegian Bokmal)

* New translations en.json (Portuguese)

* New translations en.json (Persian)

* New translations en.json (Finnish)

* New translations en.json (Hindi)

* New translations en.json (Ukrainian)

* New translations en.json (German)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Simplified)

* New translations en.json (Turkish)

* New translations en.json (French)

* New translations en.json (French)

* New translations en.json (French)

* New translations en.json (Russian)

* New translations en.json (Ukrainian)

* New translations en.json (Persian)

* New translations en.json (Albanian)

* New translations en.json (Catalan)

* New translations en.json (Hebrew)

* New translations en.json (Hindi)

* New translations en.json (Indonesian)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Simplified)

* New translations en.json (Turkish)

* New translations en.json (Portuguese)

* New translations en.json (Spanish)

* New translations en.json (Polish)

* New translations en.json (Dutch)

* New translations en.json (Korean)

* New translations en.json (Japanese)

* New translations en.json (Italian)

* New translations en.json (Hungarian)

* New translations en.json (Finnish)

* New translations en.json (Greek)

* New translations en.json (German)

* New translations en.json (Bulgarian)

* New translations en.json (Arabic)

* New translations en.json (Norwegian Bokmal)

* New translations en.json (Finnish)

* New translations en.json (Portuguese)

* New translations en.json (Chinese Traditional)
5 years ago
Daishi Kato baa8fb6c14
grid support (1st iteration) (#1788)
Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
Jed Fox b6bf011d0d
Inline the dropdown icon (#1782) 5 years ago
Daishi Kato 482fa2d90f
fix visibility check on rotated elements (#1799) 5 years ago
Kostas Bariotis a357d00bbe
Hint for shortcut for moving the visible area (#1784) 5 years ago
Kostas Bariotis bda8415714
Include stroke style when copy/paste styles (#1785) 5 years ago
Oliver Benns ca87ca6fe9
Add user list component + snap to user functionality (#1749) 5 years ago
Kostas Bariotis 8f65e37dac
Disable Sentry inside Docker (#1781) 5 years ago
Lipis 2eb58da4c3
New Crowdin translations (#1748)
* New translations en.json (Finnish)

* New translations en.json (French)

* New translations en.json (Portuguese)

* New translations en.json (Persian)

* New translations en.json (Albanian)

* New translations en.json (Catalan)

* New translations en.json (Hebrew)

* New translations en.json (Hindi)

* New translations en.json (Indonesian)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Simplified)

* New translations en.json (Turkish)

* New translations en.json (Russian)

* New translations en.json (Polish)

* New translations en.json (Spanish)

* New translations en.json (Norwegian)

* New translations en.json (Dutch)

* New translations en.json (Korean)

* New translations en.json (Japanese)

* New translations en.json (Italian)

* New translations en.json (Hungarian)

* New translations en.json (Finnish)

* New translations en.json (Greek)

* New translations en.json (German)

* New translations en.json (Bulgarian)

* New translations en.json (Arabic)

* New translations en.json (Ukrainian)

* New translations en.json (Italian)

* New translations en.json (Italian)

* New translations en.json (Persian)

* New translations en.json (Persian)

* New translations en.json (Persian)

* New translations en.json (German)

* New translations en.json (Portuguese)

* New translations en.json (Persian)

* New translations en.json (Persian)

* New translations en.json (Persian)

* New translations en.json (Persian)

* New translations en.json (Finnish)

* New translations en.json (Hindi)

* New translations en.json (Hindi)

* New translations en.json (Hindi)

* New translations en.json (French)

* New translations en.json (Greek)

* New translations en.json (Greek)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Traditional)
5 years ago
Thomas Steiner 3cee0768cc
Null file handle doesn’t need to be passed (#1752)
* Bump browser-nativefs version to v0.2.0

In reply to https://github.com/tomayac/browser-nativefs/issues/2.

* Update package-lock.json

* Null file handle doesn’t need to be passed
5 years ago
Thomas Steiner 5d3867d8ac
Implement Save without re-prompt and Save as (#1709)
* Implement Save without re-prompt and Save as
Fixes #1668

* Add save-as icon

* Make .excalidraw the default extension

* Only show save as button on supporting browsers
5 years ago
Lipis 0ed6a96b6a
New Crowdin translations (#1724) 5 years ago
David Luzar dadf054ea2
fix not always generating shape on render (#1741) 5 years ago
Thomas Steiner 6b87278a0f
Add file handling (#1736)
* Add file handling
https://github.com/WICG/file-handling/blob/master/explainer.md#example

* Only trigger on `.excalidraw` for now
5 years ago
Saransh Barua 998f0ae458
remove z-index for color-picker-hash div (#1711) 5 years ago
Aakansha Doshi 60973f6dc5
rename container class to excalidraw and move css from index.html to app.css (#1729)
Moved the css from index.html to app.css so it can be included in upstream app as well
5 years ago
Daishi Kato 53ab46126d
support resizing multiple elements including texts (#1726)
Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
Youness Fkhach d171e9705d
Fix RTL text direction rendering (reopened) (#1722)
Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
Pete Hunt f7c4efbd35
Excalicharts MVP (#1723)
Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
David Luzar d1be2a5481
fix text constructor groupIds & improve type safety (#1715) 5 years ago
fujimoto kyosuke 476c0e9f8a
Fix undo with line editing (#1717) 5 years ago
Lipis c6e73c56fd
New Crowdin translations (#1703) 5 years ago
Farooq AR 669e84b5d7
Add regression tests for context-menu (#1683) (#1697)
Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
David Luzar ff93d95998
Revert "Fix RTL text direction rendering (#1687)" (#1705)
This reverts commit a118bed82f.
5 years ago
Youness Fkhach a118bed82f
Fix RTL text direction rendering (#1687)
Co-authored-by: Lipis <lipiridis@gmail.com>
5 years ago
Steven Nguyen fd75b88bd3
Double finger zoom should not select things (#1333) 5 years ago
Lipis 1e9adf0a80
New Crowdin translations (#1700) 5 years ago
Lipis 3f31a6ce89
New Crowdin translations (#1696) 5 years ago
Lipis d3d9994c74
New Crowdin translations (#1690)
* New translations en.json (Persian)

* New translations en.json (Persian)

* New translations en.json (Persian)

* New translations en.json (French)

* New translations en.json (Portuguese)

* New translations en.json (Persian)

* New translations en.json (Albanian)

* New translations en.json (Catalan)

* New translations en.json (Hebrew)

* New translations en.json (Hindi)

* New translations en.json (Indonesian)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Simplified)

* New translations en.json (Turkish)

* New translations en.json (Russian)

* New translations en.json (Polish)

* New translations en.json (Spanish)

* New translations en.json (Norwegian)

* New translations en.json (Dutch)

* New translations en.json (Korean)

* New translations en.json (Japanese)

* New translations en.json (Italian)

* New translations en.json (Hungarian)

* New translations en.json (Finnish)

* New translations en.json (Greek)

* New translations en.json (German)

* New translations en.json (Bulgarian)

* New translations en.json (Arabic)

* New translations en.json (Ukrainian)

* New translations en.json (French)
5 years ago
David Luzar 14a66956d7
Implement line editing (#1616)
* implement line editing

* line editing with rotation

* ensure adding new points is disabled on point dragging

* fix hotkey replacement

* don't paint bounding box when creating new multipoint

* tweak points style, account for zoom and z-index

* don't persist editingLinearElement to localStorage

* don't mutate on noop points updates

* account for rotation when adding new point

* ensure clicking on points doesn't deselect element

* tweak history handling around editingline element

* update snapshots

* refactor pointerMove handling

* factor out point dragging

* factor out pointerDown

* improve positioning with rotation

* revert to use roughjs for calculating points bounds

* migrate from storing editingLinearElement.element to id

* make GlobalScene.getElement into O(1)

* use Alt for adding new points

* fix adding and deleting a point with rotation

* disable resize handlers & bounding box on line edit

Co-authored-by: daishi <daishi@axlight.com>
5 years ago
Lipis db316f32e0
New Crowdin translations (#1659) 5 years ago
Youness Fkhach 9151da772c
feat: hide the UI elements when printing the page (#1680) 5 years ago
David Luzar f413bab3de
Fix group element removing (#1676) 5 years ago
Aakansha Doshi 17e9cc4506
Some cleanup in App.tsx (#1681) 5 years ago
Aakansha Doshi fa359034c5
scroll the closest element to center (#1670)
Co-authored-by: Sanghyeon Lee <yongdamsh@gmail.com>
5 years ago
David Luzar 0db7ac78c4
fix fontFamily state updating (#1679) 5 years ago
David Luzar 44a88d2d58
Rewrite restore to guard against missing migrations (#1664) 5 years ago
Pete Hunt 56f8bc092d
Tests for groups, more test utils (#1669) 5 years ago
David Luzar 4f3bf79708
skip element mutation on noop updates (#1667) 5 years ago
Daishi Kato 7edcea9a93
feat: resize text element (#1650)
* feat: resize text element

* ignore small font size change that leads jankiness

Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
David Luzar 5327e8a3dc
fix language change not rerendering ui (#1638) 5 years ago
David Luzar 63c10743fb
split font into fontSize and fontFamily (#1635) 5 years ago
Pete Hunt 46b574283f
Fix zindex in groups (#1660) 5 years ago
Pete Hunt 61e5b66dac
Group/ungroup (#1648)
Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
Aakansha Doshi 5252726307
dynamically import socket.io-client when needed (#1631) 5 years ago
Lipis 1a1cbb345b
New Crowdin translations (#1617) 5 years ago
David Luzar 35049e3de7
History tweaks (#1641)
Co-authored-by: Pete Hunt <phunt@twitter.com>
5 years ago
Timur Khazamov d315e3dc4d
Update TypeScript to 3.9.3 (#1640)
Co-authored-by: tk338g <tkhazamov@wayfair.com>
5 years ago
Pete Hunt 6512ede9ca
Optimize undo history (#1632)
Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
Daishi Kato 51608c07b0
15-degree rotation locking (#1627) 5 years ago
David Luzar d2ae18995c
add history.shouldCreateEntry resolver (#1622) 5 years ago
David Luzar ce6f2ff88c
cache nonDeleted elements (#1626) 5 years ago
Preet 584e4182a7
Ensure arrows are not draggable from inside (#1620) 5 years ago
Lipis c427aa3cce
Prefer arrow functions and callbacks (#1210) 5 years ago
Richard Keenan 33fe223b5d
Typo fix in desc_exitSession en.json (#1619) 5 years ago
Daishi Kato 4d2e8f9ad1
feat: resize multiple elements including two-point lines (#1607) 5 years ago
Daishi Kato 6b628bb1a6
fix: resize non solid lines/arrows/draws (#1608) 5 years ago
Kostas Bariotis 7f35b805d1
Add Catalan translation (#1566) 5 years ago
Lipis 755cd9c320
New Crowdin translations (#1567)
* New translations en.json (Greek)

* New translations en.json (Norwegian)

* New translations en.json (Russian)

* New translations en.json (Russian)

* New translations en.json (Russian)

* New translations en.json (Catalan)

* New translations en.json (French)

* New translations en.json (French)

* New translations en.json (French)

* New translations en.json (Norwegian)

* New translations en.json (Hebrew)

* New translations en.json (Hindi)

* New translations en.json (Indonesian)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Simplified)

* New translations en.json (Turkish)

* New translations en.json (Russian)

* New translations en.json (Portuguese)

* New translations en.json (Polish)

* New translations en.json (Dutch)

* New translations en.json (Spanish)

* New translations en.json (Korean)

* New translations en.json (Japanese)

* New translations en.json (Italian)

* New translations en.json (Hungarian)

* New translations en.json (Finnish)

* New translations en.json (Greek)

* New translations en.json (German)

* New translations en.json (Bulgarian)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (Spanish)

* New translations en.json (Portuguese)

* New translations en.json (Norwegian)

* New translations en.json (Finnish)

* New translations en.json (German)

* New translations en.json (German)

* New translations en.json (German)

* New translations en.json (French)

* New translations en.json (French)

* New translations en.json (French)

* New translations en.json (Norwegian)

* New translations en.json (Hebrew)

* New translations en.json (Hindi)

* New translations en.json (Indonesian)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Simplified)

* New translations en.json (Turkish)

* New translations en.json (Russian)

* New translations en.json (Portuguese)

* New translations en.json (Polish)

* New translations en.json (Dutch)

* New translations en.json (Spanish)

* New translations en.json (Korean)

* New translations en.json (Japanese)

* New translations en.json (Italian)

* New translations en.json (Hungarian)

* New translations en.json (Finnish)

* New translations en.json (Greek)

* New translations en.json (German)

* New translations en.json (Bulgarian)

* New translations en.json (Arabic)

* New translations en.json (Catalan)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Greek)

* New translations en.json (French)

* New translations en.json (Norwegian)

* New translations en.json (Hebrew)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Simplified)

* New translations en.json (Turkish)

* New translations en.json (Russian)

* New translations en.json (Portuguese)

* New translations en.json (Polish)

* New translations en.json (Dutch)

* New translations en.json (Spanish)

* New translations en.json (Korean)

* New translations en.json (Japanese)

* New translations en.json (Italian)

* New translations en.json (Hungarian)

* New translations en.json (Finnish)

* New translations en.json (Greek)

* New translations en.json (German)

* New translations en.json (Bulgarian)

* New translations en.json (Arabic)

* New translations en.json (Spanish)

* New translations en.json (Finnish)

* New translations en.json (German)

* New translations en.json (German)

* New translations en.json (Catalan)

* New translations en.json (Catalan)

* New translations en.json (Spanish)

* New translations en.json (Catalan)

* New translations en.json (Catalan)

* New translations en.json (Catalan)

* New translations en.json (Catalan)

* New translations en.json (French)

* New translations en.json (Italian)

* New translations en.json (Portuguese)

* New translations en.json (Italian)
5 years ago
fujimoto kyosuke afbfe2b8b1
Alt should be labeled as Option on Mac (#1602) 5 years ago
Yuval Ashkenazi 9bd72f91fc
fixed typo: loose ==> lose (#1601) 5 years ago
David Luzar 876170ee27
fix snapshots (#1598) 5 years ago
David Luzar 39c56a4c01
implement stroke style (#1571) 5 years ago
Daishi Kato f6be200388
feat: resize multiple curved lines (#1596) 5 years ago
David Luzar 828c9c4d65
use commitToHistory prop for handling draw history (#1595) 5 years ago
fujimoto kyosuke c32640d174
Fix free draw to allow undo (#1594) 5 years ago
Thomas Steiner ad81033a78
Prompt for reload when new service worker is available (#1588) 5 years ago
Simonboeuf1 ece631b430
preserve spaces in text blocks in svg export (#1587) 5 years ago
Kostas Bariotis 9ec43d2626
Add free draw mode (#1570) 5 years ago
David Luzar a90ca5eb84
don't use unicode characters for shortcut help (#1565)
* don't use unicode characters for shortcut help

* use option instead of alt

* make shortcut replacement case-insensitive

* improve shortcut dialog layout
5 years ago
Daishi Kato 394237728f
Refactor: resize two-point lines/arrows (#1568) 5 years ago
Lipis cdb483b895
New Crowdin translations (#1551)
* New translations en.json (Spanish)

* New translations en.json (Japanese)

* New translations en.json (Spanish)

* New translations en.json (French)

* New translations en.json (Norwegian)

* New translations en.json (Hindi)

* New translations en.json (Indonesian)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Simplified)

* New translations en.json (Turkish)

* New translations en.json (Russian)

* New translations en.json (Portuguese)

* New translations en.json (Polish)

* New translations en.json (Dutch)

* New translations en.json (Spanish)

* New translations en.json (Korean)

* New translations en.json (Japanese)

* New translations en.json (Italian)

* New translations en.json (Hungarian)

* New translations en.json (Finnish)

* New translations en.json (Greek)

* New translations en.json (German)

* New translations en.json (Bulgarian)

* New translations en.json (Arabic)

* New translations en.json (Hebrew)

* New translations en.json (Finnish)

* New translations en.json (Spanish)

* New translations en.json (Portuguese)

* New translations en.json (German)

* New translations en.json (Dutch)
5 years ago
Herb Caudill 48264d1be0
Room dialog: Change 'Name' to 'Your name' (#1562)
* Change label 'Name' to 'Your name'

* add yourName as duplicate of Name in all locales
5 years ago
Aakansha Doshi 5b80ad045b
show reset icon with zoom percentage during zen mode (#1540) 5 years ago
Daishi Kato 3b1d6910aa
fix resizing: dynamic pointer offset for better UX (#1560) 5 years ago
David Luzar 8c8458ceb0
fix incorrect font rendered on late load (#1555) 5 years ago
Pete Hunt 4696c9ee0e
Syncing optimizations (#1554)
* Syncing optimizations

* Add comment
5 years ago
Justin Greenberg e27f3f9ad2
fix(data): removes unnecessary await (#1549) 5 years ago
Lipis 028f9b4b88
New Crowdin translations (#1508) 5 years ago
Daishi Kato 73d8c5b7c1
fix resizing lines with abs coords bigger than element w/h (#1427) 5 years ago
Ion Rosgrim 686af31d9d
on rtl languages the language dropdown is not visible (#1526) 5 years ago
Esteban 7522c48453
Make tools shortcuts case insensitive (#1532) (#1533) 5 years ago
Ion Rosgrim dd7aa29297
#1529 Rtl ui broken in zen mode (#1530) 5 years ago
David Luzar 4aa1784ba3
fix horizontal scroll via shift+wheel on mac (#1528) 5 years ago
David Luzar b7a37c157b
scroll horizontally on shift-scroll (#1519) 5 years ago
David Luzar 51f8146357
disable pointer events on hidden menus in zen mode (#1511) 5 years ago
Aakansha Doshi 0c2aa951d6
refactor toolbutton.tsx - add default props (#1492) 5 years ago
Kent Beck dd1dfc5950
One more socket listener moved to Portal (#1507)
* room-user-change listener moved to Portal

* Eliminate useless checks

* Update src/components/App.tsx

Co-Authored-By: Lipis <lipiridis@gmail.com>

Co-authored-by: Lipis <lipiridis@gmail.com>
5 years ago
Lipis 77f76a263b
New Crowdin translations (#1494)
* New translations en.json (German)

* New translations en.json (Finnish)

* New translations en.json (Indonesian)

* New translations en.json (Hebrew)

* New translations en.json (Japanese)
5 years ago
Kent Beck 0baabff41b
Begin moving socket listeners to Portal (#1504) 5 years ago
Daishi Kato da1031aeb4
Fix resize logic (partly) (#1475) 5 years ago
Lipis 4824f9e1d4
New Crowdin translations (#1491) 5 years ago
Lipis 5855fcf946
New Crowdin translations (#1490)
* New translations en.json (French)

* New translations en.json (Hebrew)

* New translations en.json (Hebrew)

* New translations en.json (Hebrew)

* New translations en.json (Hebrew)

* New translations en.json (Hebrew)
5 years ago
Lipis 9cd2b78d79
New Crowdin translations (#1471)
* New translations en.json (Norwegian)

* New translations en.json (French)

* New translations en.json (Dutch)

* New translations en.json (Chinese Simplified)

* New translations en.json (Turkish)

* New translations en.json (Russian)

* New translations en.json (Portuguese)

* New translations en.json (Polish)

* New translations en.json (Norwegian)

* New translations en.json (Korean)

* New translations en.json (Spanish)

* New translations en.json (Italian)

* New translations en.json (Hungarian)

* New translations en.json (Finnish)

* New translations en.json (Greek)

* New translations en.json (German)

* New translations en.json (Bulgarian)

* New translations en.json (Arabic)

* New translations en.json (Dutch)

* New translations en.json (Portuguese)

* New translations en.json (Polish)

* New translations en.json (Norwegian)

* New translations en.json (Italian)

* New translations en.json (Finnish)

* New translations en.json (German)

* New translations en.json (Finnish)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (German)

* New translations en.json (French)

* New translations en.json (Dutch)

* New translations en.json (Indonesian)

* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Simplified)

* New translations en.json (Turkish)

* New translations en.json (Russian)

* New translations en.json (Portuguese)

* New translations en.json (Polish)

* New translations en.json (Norwegian)

* New translations en.json (Korean)

* New translations en.json (Spanish)

* New translations en.json (Japanese)

* New translations en.json (Italian)

* New translations en.json (Hungarian)

* New translations en.json (Finnish)

* New translations en.json (Greek)

* New translations en.json (German)

* New translations en.json (Bulgarian)

* New translations en.json (Arabic)

* New translations en.json (Hindi)

* New translations en.json (Greek)

* New translations en.json (Norwegian)

* New translations en.json (Hebrew)

* New translations en.json (Hebrew)

* New translations en.json (Hebrew)

* Add Hebrew to dropdown

Co-authored-by: Jed Fox <git@twopointzero.us>
5 years ago
Faustino Kialungila 582d26e858
fix tool icon button on mobile (#1489) 5 years ago
David Luzar 2c5c770e78
rewrite picker color handling (#1487) 5 years ago
David Luzar a4b49ea350
ignore fileOpen error when user cancels (#1486) 5 years ago
Aakansha Doshi 1866074c07
Add Zen mode for distraction free drawing (#1450) 5 years ago
Warren Seine 71e7f130bc
Generalize color normalization (#1479) (#1483)
Following #1478, a bug was found related to transparent backgrounds. As Excalidraw only supports `transparent` as a valid transparent color, this commits generalizes the use of canvas to normalize color values.

It changes a few details:
- `rgba()` or `hsla()` syntaxes are not accepted anymore
- pasting values goes through the same normalization step, avoiding invalid values
- color validation is not regex-based anymore
- any CSS-valid black color is now accepted (e.g. previously, `rgb(0,0,0)` was rejected)
5 years ago
Warren Seine fa8354e306
Support different color inputs (#1478) (#1479) 5 years ago
Lipis fc802c758f
Update shield's tooltip (#1466) 5 years ago
José Quinto ed6fb60337
resize elements from center point (#1225)
* add hint & support multi-line hints

* resize from center point using the new resize maths

* resize with origin element when lifting alt key

* add readonly to elementOriginPosition

* add setResizeWithCenterKeyLifted

* isResizeFromCenter logic

* offsetX and offsetY

* simplify equations

* creating element from center point

* lint

* lint

* lint

* remove revert on key up logic

Co-authored-by: dwelle <luzar.david@gmail.com>
Co-authored-by: daishi <daishi@axlight.com>
5 years ago
Daishi Kato 8c49770e3b
Better resize cursors on rotated elements (#1470)
* better resize cursor on rotated elements

* refactor with Math.round
5 years ago
Jed Fox d7729d295a
RTL for the security badge, add an arrow to the tooltip (#1469)
* FIx RTL on the encryption shield

* Add an arrow to the tooltip
5 years ago
Lipis d1086f3624
New Crowdin translations (#1452) 5 years ago
Preet 9ac79061fa
Bump roughjs and resolve breaking change in roughjs refactoring… (#1463)
* Fix for roughjs refactoring curve-estinmation code into a separate package

* Update jest transformIgnorePatterns
5 years ago
Ed Bentley 9b7a743e8b
Fix bug: Undo multi element (#1461)
* Add failing test

* Fix multi element undo

* Update snapshots
5 years ago
Ed Bentley 5822117e23
Add optional watermark on export (#1365)
* Add optional watermark on export

* Address init PR feedback

* Add SVG export with refactoring

* Update export.ts

* Move addWatermark to appState

* Update snapshots

* Fit watermark in small scene

* Rename watermark things

Co-authored-by: Lipis <lipiridis@gmail.com>
5 years ago
Lipis 13cea081f3
New Crowdin translations (#1449)
* New translations en.json (Arabic)

* New translations en.json (Korean)

* New translations en.json (Bulgarian)

* New translations en.json (Turkish)

* New translations en.json (Spanish)

* New translations en.json (Russian)

* New translations en.json (Portuguese)

* New translations en.json (Polish)

* New translations en.json (Norwegian)

* New translations en.json (Italian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Indonesian)

* New translations en.json (Hungarian)

* New translations en.json (Hindi)

* New translations en.json (Greek)

* New translations en.json (German)

* New translations en.json (French)

* New translations en.json (Dutch)

* New translations en.json (Chinese Traditional)

* New translations en.json (Japanese)

* New translations en.json (Dutch)

* New translations en.json (Polish)

* New translations en.json (Norwegian)

* New translations en.json (Arabic)

* New translations en.json (Korean)

* New translations en.json (Bulgarian)

* New translations en.json (Turkish)

* New translations en.json (Spanish)

* New translations en.json (Russian)

* New translations en.json (Portuguese)

* New translations en.json (Polish)

* New translations en.json (Norwegian)

* New translations en.json (Italian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Indonesian)

* New translations en.json (Hungarian)

* New translations en.json (Hindi)

* New translations en.json (Greek)

* New translations en.json (German)

* New translations en.json (French)

* New translations en.json (Dutch)

* New translations en.json (Chinese Traditional)

* New translations en.json (Japanese)

* New translations en.json (Norwegian)

* New translations en.json (Italian)

* New translations en.json (Italian)

* New translations en.json (German)
5 years ago
fujimoto kyosuke 38c7d5a7bf
Reflect `textAlign` when pasting a style (#1378)
* Reflect `textAlign` when pasting a style

* Re-run Actions
5 years ago
Steven Nguyen 2bfb0c20c3
Add a button to show all content, if the zoom allows it. (#1406)
* add zoom center action button

* enhance zoom calculation and scroll to center

* add zoom out and center button

* filter deleted elements

* improve complexity

* add key shortcut

* calculate zoom value

* don't render zoomCenter action

* offset from top to account for shape menu

* change shortcut & add to shortcut dialog

* decrease offset

* revert offset

* change hotkey & description

* rename to zoomToFit

* change shortcut label & position

Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
Aakansha Doshi ff0ecb5e33
add always visible lock icon on top right to show info about e… (#1403)
* improvement(layerui.js): add lock icon on top right to show encrypted info about excalidraw

fixes https://github.com/excalidraw/excalidraw/issues/1313

* swap lock with shield

* fix dimensions

* make link open in new tab

* add newline between toolip text and link

* increase tooltip line-height

* remove unused GitHubCorner compo

* reposition; reintroduce GH icon

* make shield into link

* make tooltip not show when drawing

* Review fix

* remove link from tooltip

Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
Aakansha Doshi a18342b5b5
Refactor LayerUI (#1434)
* chore(gitignore): add .idea to gitignore

* refactor(layerui): pass named function to react.memo so that in dev tools the name shows up

This makes debugging easier as well

* refactor(layerui): break the functional component into multiple render methods
5 years ago
Lipis 9131813661
New Crowdin translations (#1430)
* New translations en.json (German)

* New translations en.json (French)

* New translations en.json (German)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Traditional)

* New translations en.json (Dutch)
5 years ago
David Luzar 83199164ae
don't prevent select-element devTools action (#1446) 5 years ago
Mohit kumar Bajoria 519a9ca493
Close sharing dialog on Enter when changing the username (#1437) 5 years ago
David Luzar 8cfc64a3ab
fix bg color picker rendered behind shape menu (#1445)
* fix bg color picker rendered behind shape menu

* add comment
5 years ago
Thomas Steiner c35d76cb4c
Use application/vnd.excalidraw+json and .excalidraw (#1440)
* Use application/vnd.excalidraw+json and .excalidraw

* UA sniff and use appication/json on mobile Safari
5 years ago
Thomas Steiner 9a59b7496e
Only load PWACompat when we really need it (#1439) 5 years ago
Thomas Steiner fe5e71a4e5
Add PWACompat (#1433)
* Add PWACompat (attempt)
Fixes #1425

* Fix CSS, use custom splash screen font

* Respect bottom safe area
5 years ago
David Luzar 75e0163dd1
tweak blurry bg for legibility & remove from modals (#1436) 5 years ago
Tom Hicks 3b357d8332
Improve UI continuity behind panels (#1435)
* Add variable for island color

* Make islands semi-transparent

This preserves the notion of the infinite canvas and helps
maintain context, especially on smaller screens.
5 years ago
Lipis 08e467f1a1
New Crowdin translations (#1416)
* New translations en.json (Portuguese)

* New translations en.json (Korean)

* New translations en.json (Russian)

* New translations en.json (German)
5 years ago
David Luzar d998a190df
persist pointerDown event (#1426) 5 years ago
dependabot-preview[bot] 7df16c1b1d
Bump prettier from 2.0.3 to 2.0.4 (#1412)
* Bump prettier from 2.0.3 to 2.0.4

Bumps [prettier](https://github.com/prettier/prettier) from 2.0.3 to 2.0.4.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/2.0.3...2.0.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

* format

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
Co-authored-by: Panayiotis Lipiridis <lipiridis@gmail.com>
5 years ago
Daishi Kato e77e2255bd
Add test for getElementBounds (#1395)
* fix calc diamond bounds

* Add test for getElementBounds

* use toEqual
5 years ago
Faustino Kialungila 51ccf61cc6
Bring root fonts back (#1422)
* redirect font loading

* bring preloading back

* change paths

* add css type

* move fonts to root

* correct paths

* remove redirects

* correct ext

* remove fonts from main CSS

* remove unneeded fonts

Co-authored-by: kbariotis <konmpar@gmail.com>
5 years ago
Faustino Kialungila cca15b0640
Disable notifications (#1421)
* Remove notifications

* remove dead component
5 years ago
David Luzar 692ceece65
fix not using className when querying container (#1420) 5 years ago
Kostas Bariotis 0e94303791
Ignore `undefined is not an object (evaluating 'window.__pad.pe… (#1417) 5 years ago
Timur Khazamov 4228c2e094
[POC] use serviceWorker from create-react-app (#1286)
* Service worker with toast notifications

* Update CSP to allow fetches from now.sh

* Fixed clearing timers

* rounded icon for pwa (#1301)

* rounded icon for pwa

* cirle pwa app icon

* fix fonts caching

* fix app

* fix css import

* Updated csp tp inlcude worker-src: self

* add worker CSP rule

* use square icon

Co-authored-by: Timur Khazamov <t1mmaas@skbkontur.ru>
Co-authored-by: Faustino Kialungila <Faustino.kialungila@gmail.com>
Co-authored-by: kbariotis <konmpar@gmail.com>
5 years ago
Jérémie Pardou-Piquemal e158dbc45a
Prevent next paste on middle clic with linux (#1402) 5 years ago
Lipis 0ffbde77ac
New Crowdin translations Bulgarian (#1388) 5 years ago
David Luzar 6771b505ad
rewrite wysiwyg property updating (#1387)
* rewrite wysiwyg property updating

* reuse existing class

* fix case of focus being stolen by other UIs

* revert mistake csp removal

* ensure we don't run cleanup twice

* fix opacity updating

* add shape actions menu class to constants
5 years ago
Aakansha Doshi 227ff60909
refactor(app.tsx): move Portal to new file and some refactoring (#1398) 5 years ago
fujimoto kyosuke 6abcb2d87f
Suppresses unnecessary fill-rule attribute in SVG (#1397) 5 years ago
fujimoto kyosuke 8b805d436f
Fix fill of looping lines in exported SVG (#1396) 5 years ago
Daishi Kato 038cff8793
fix calc diamond bounds (#1394) 5 years ago
Aakansha Doshi e98fba38be
refactor(app.tsx): use constants instead of hard coded strings for better readablility (#1391)
don't use inline function as it will create a new refrence everytime
5 years ago
Roxana Chiorean d902bbd618
Fix flickering mouse tracking when using two touches on mobile (#1390) 5 years ago
Lipis 2b9ae38946
Alt drag to shortcuts for duplicate (#1389) 5 years ago
Kostas Bariotis 2adae4132b
Global username instead of per room (#1382)
* global username

* remove string interpolation

Co-Authored-By: Lipis <lipiridis@gmail.com>

* remove string interpolation

Co-Authored-By: Lipis <lipiridis@gmail.com>

* remove backwards compat

Co-authored-by: Lipis <lipiridis@gmail.com>
5 years ago
fujimoto kyosuke 166ad0412c
Fix to reflect `textAlign` property to SVG export (#1375) 5 years ago
Kostas Bariotis 7b3816d0d3
Store username for every room (#1381)
* store username for every room

* add missing fun
5 years ago
Kostas Bariotis 5e2f164026
PoC: Expose wysiwyg element to manipulate from outside (#1356)
* expose wysiwyg element to manipulate from outside

* keep focus after changing style

* update editingElement correctly

* remove mistake

* update text only

* proper check for element

* udpate snapshots

* add error log

* remove try catch handler

* remove blur event

* add proper types

* merge if condition

* simplify if condition

Co-Authored-By: Lipis <lipiridis@gmail.com>

Co-authored-by: dwelle <luzar.david@gmail.com>
Co-authored-by: Lipis <lipiridis@gmail.com>
Co-authored-by: Fausto95 <faustino.kialungila@gmail.com>
5 years ago
Lipis d2246bfb30
New Crowdin translations (#1380) 5 years ago
Lipis a3fd464702
New Crowdin translations (#1344)
* New translations en.json (Spanish)

* New translations en.json (Russian)

* New translations en.json (Portuguese)

* New translations en.json (Portuguese)

* New translations en.json (Italian)

* New translations en.json (Arabic)

* New translations en.json (Italian)

* New translations en.json (Turkish)

* New translations en.json (Spanish)

* New translations en.json (Russian)

* New translations en.json (Portuguese)

* New translations en.json (Polish)

* New translations en.json (Norwegian)

* New translations en.json (Korean)

* New translations en.json (Indonesian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Hungarian)

* New translations en.json (Hindi)

* New translations en.json (Greek)

* New translations en.json (German)

* New translations en.json (French)

* New translations en.json (Dutch)

* New translations en.json (Chinese Traditional)

* New translations en.json (Bulgarian)

* New translations en.json (German)

* New translations en.json (Chinese Simplified)

* New translations en.json (Norwegian)

* New translations en.json (Spanish)

* New translations en.json (Greek)

* New translations en.json (Bulgarian)

* New translations en.json (Polish)

* New translations en.json (French)

* New translations en.json (Arabic)

* New translations en.json (Italian)

* New translations en.json (Turkish)

* New translations en.json (Spanish)

* New translations en.json (Russian)

* New translations en.json (Portuguese)

* New translations en.json (Polish)

* New translations en.json (Norwegian)

* New translations en.json (Korean)

* New translations en.json (Indonesian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Hungarian)

* New translations en.json (Hindi)

* New translations en.json (Greek)

* New translations en.json (German)

* New translations en.json (French)

* New translations en.json (Dutch)

* New translations en.json (Chinese Traditional)

* New translations en.json (Bulgarian)

* New translations en.json (Greek)

* New translations en.json (German)

* New translations en.json (French)

* New translations en.json (Norwegian)

* New translations en.json (Spanish)

* New translations en.json (Chinese Simplified)

* New translations en.json (German)

* New translations en.json (Indonesian)

* New translations en.json (Polish)
5 years ago
Tom Dohnal f3ef93e9ce
Allow to drag THEN press alt to duplicate (#1373)
* fix typo

* duplicate elements when alt is pressed on pointer move

* document use case

Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
Daishi Kato 5ca763cdbb
Calculate rotated element bounds properly (#1354)
* Calculate rotated element bounds properly, fixes #1303

* prefer isLinearElement

* empty commit
5 years ago
fujimoto kyosuke b971737d32
Restore textAlign property (#1374) 5 years ago
Jed Fox f7e3ee2064
Use open-color directly (#1371) 5 years ago
Jed Fox 8ce595e5d6
Add rule banning literal text in JSX (#1367) 5 years ago
Jed Fox 16a3aa7561
Fix mobile dialog styling (#1363) 5 years ago
Lipis f134211bf9
Ask for name instead of username (#1362) 5 years ago
Jed Fox 136b14cef5
Update shortcut display for enter on Mac (#1358) 5 years ago
Kostas Bariotis 0a284adc18
Allow opening empty excalidraw file (#1348)
* allow openning empty file

* correctly throw error

* fix error handling

* switch back to error objects

Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
Lipis 70e7dd6e3b
Add more shortcuts and minor refactor (#1347) 5 years ago
Lipis d04eaf7040
New Crowdin translations (#1323) 5 years ago
Sanghyeon Lee 9761d7ea50
Refactor ResizeArrowFnType to resolve Codesandbox parsing error (#1338) 5 years ago
José Quinto 8efe0b7d05
Shift loses pointer fixing #1296 (#1330)
* change resize math to absolute instead of delta

* typings

* small change for width on rotation

* apply absolute resize to other sides

* revert&change math.ts

* polish, polish, polish

* refactor with offset

* eliminate nextX

* rename to offsetPointer

* fix curved lines

* prefer arrow function

* remove unused variables/comments for now

Co-authored-by: daishi <daishi@axlight.com>
5 years ago
Sanghyeon Lee bd32a26653
Move GitHub corner and visually-hidden class (#1336)
* Move visually-hidden class to index.html

* Replace github corner with component

* Momoize GitHubCorner

* Simplify component return
5 years ago
fujimoto kyosuke b1ed5b4cdc
Support negative resize for multiple points line/arrow (#1237)
* Support negative resize for multiple points line

* prettier

* Fix an issue with width or height becoming zero
5 years ago
Edwin Lin d5899f6ca0
Make the mouse location broadcast volatile (#1331) 5 years ago
Preet 57bbc9fe55
Fill a looped curve with the selected background color (#1315) 5 years ago
Dreace fe6f482e96
Optimize ShortcutsDialog style (#1329)
* Optimize ShortcutsDialog style

* Add word-break only to ShortcutKey
5 years ago
Youness Fkhach ff82d1cfa3
feat/ability to change the alignment of the text (#1213)
* feat: add the ability to change the alignement of the text

* test: update the snapshots to included the newely textAlign state

* style: use explicit key assignment to object

* test: add missing new key textAlign to newElement.test.ts

* style: make the text on the buttons start with uppercase

* Update src/locales/en.json

* add types

* add migration

* remove incorrect update

Co-authored-by: Youness Fkhach <younessfkhach@porotonmail.com>
Co-authored-by: Lipis <lipiridis@gmail.com>
Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
David Luzar 3fd6f3023f
support newline on shift+enter (#1324) 5 years ago
Kent Beck fdebb38bf6
Move more stuff to Portal (#1309) 5 years ago
Pete Hunt df0613d8ac
Add NonDeleted<ExcalidrawElement> (#1068)
* add NonDeleted

* make test:all script run tests without prompt

* rename helper

* replace with helper

* make element contructors return nonDeleted elements

* cache filtered elements where appliacable for better perf

* rename manager element getter

* remove unnecessary assertion

* fix test

* make element types in resizeElement into nonDeleted

Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
Lipis c714c778ab
New Crowdin translations (#1319)
* New translations en.json (German)

* New translations en.json (Turkish)
5 years ago
Sanghyeon Lee 26facfa710
Fix 'Dialog' keydown event and prop type warning (#1305) 5 years ago
Lipis 020eebb663
New Crowdin translations (#1277) 5 years ago
Lipis 26fd2fe165
Better name for app state (#1300)
* Better name for app state

* Snapshot
5 years ago
Kent Beck 9a1af38c97
Begin extracting collaboration code to Portal (#1306) 5 years ago
Timur Khazamov ed378170b7
Use woff2 instead ttf (#1307)
* Use woff2 instead ttf

* Update font in svg-exported files to use woff2

Co-authored-by: Timur Khazamov <t1mmaas@skbkontur.ru>
5 years ago
Daishi Kato c3b83fba38
fix detecting rotated elements with selection (#1273)
* fix #1232

* Update src/element/bounds.ts

* prefer arrow functions

* fix merging

Co-authored-by: Lipis <lipiridis@gmail.com>
5 years ago
Lipis 03c22c1255
Switch to `Sentence case` instead of `Title Case` (#1279) 5 years ago
David Luzar 88cec2df5e
log console.error to sentry (#1243)
* log console.error to sentry

* fix
5 years ago
Lipis 5b684495ef
Translate click and change label (#1299) 5 years ago
Kostas Bariotis 67805bc7a7
Add collaborators names (#1223)
* add random usernames

* add username state

* add username input

* ability to set names

* fix tests

* set username oon mobile

* remove auto generated names

* remove commented code

* always string

* updaate snapshots

* maintain username when clearing canvas

* Update src/renderer/renderScene.ts

Co-Authored-By: Lipis <lipiridis@gmail.com>

* add border

* fix styles

Co-authored-by: Pete Hunt <petehunt@users.noreply.github.com>
Co-authored-by: Faustino Kialungila <faustino.kialungila@gmail.com>
Co-authored-by: Lipis <lipiridis@gmail.com>
5 years ago
Lipis 0c3d34261e
Fixes in Shortcuts dialog and minor refactor (#1297) 5 years ago
Mohit kumar Bajoria e4c154f43e
Button for shortcuts (#1253) 5 years ago
Shriram Balaji 22160f50d3
Wrap localStorage API Access in try-catch (#1241) 5 years ago
Daishi Kato 2cc1105ff5
Resize multiple elements (rectangles, diamonds and ellipses onl… (#1193)
* experiment resizing multiple elements

* hack common component

* calculate scale properly (still se only)fg

* prioritize multi selection

* take handle offset into calculation

* fix master merge

* refactor resizeElements out from App

* wip: handlerRectanglesFromCoords

* fix test with type assertion

* properly show handles wip

* revert previous one and do a tweak

* remove unnecessary assignments

* replace hack code with good one

* refactor coords in arg

* resize NW

* resize from sw,ne

* fix with setResizeHandle

* do not show hint while resizing multiple elements

* empty commit

* fix format
5 years ago
Kostas Bariotis b60f5fcf06
Save on CTRL/CMD + S (#1287)
* save on shortcut

* revert keys files

* remove constant
5 years ago
David Luzar 729aeacc47
prevent pasting svg copied from excalidraw (#1288)
* prevent pasting svg copied from excalidraw

* remove unnecessary template
5 years ago
David Luzar e9b4700bba
edit text when clicked on with text tool (#1283) 5 years ago
David Luzar d3ed5a42fc
fix font being reset to current state font on edit (#1282) 5 years ago
Lipis 0c41f3e7aa
Add curved lines/arrows shortcuts (#1274) 5 years ago
Lipis 854af8aed2
New Crowdin translations (#1228)
* New translations en.json (Portuguese)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Simplified)

* New translations en.json (Arabic)

* New translations en.json (Italian)

* New translations en.json (Spanish)

* New translations en.json (Russian)

* New translations en.json (Portuguese)

* New translations en.json (Polish)

* New translations en.json (Norwegian)

* New translations en.json (Korean)

* New translations en.json (Indonesian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Hungarian)

* New translations en.json (Hindi)

* New translations en.json (Greek)

* New translations en.json (German)

* New translations en.json (French)

* New translations en.json (Dutch)

* New translations en.json (Chinese Traditional)

* New translations en.json (Turkish)

* New translations en.json (Polish)

* New translations en.json (German)

* New translations en.json (Dutch)

* New translations en.json (French)

* New translations en.json (Korean)

* New translations en.json (Greek)

* New translations en.json (Polish)

* New translations en.json (Arabic)

* New translations en.json (Italian)

* New translations en.json (Spanish)

* New translations en.json (Russian)

* New translations en.json (Portuguese)

* New translations en.json (Polish)

* New translations en.json (Norwegian)

* New translations en.json (Korean)

* New translations en.json (Indonesian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Hungarian)

* New translations en.json (Hindi)

* New translations en.json (Greek)

* New translations en.json (German)

* New translations en.json (French)

* New translations en.json (Dutch)

* New translations en.json (Chinese Traditional)

* New translations en.json (Turkish)

* New translations en.json (Arabic)

* New translations en.json (Italian)

* New translations en.json (Spanish)

* New translations en.json (Russian)

* New translations en.json (Portuguese)

* New translations en.json (Polish)

* New translations en.json (Norwegian)

* New translations en.json (Korean)

* New translations en.json (Indonesian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Hungarian)

* New translations en.json (Hindi)

* New translations en.json (Greek)

* New translations en.json (German)

* New translations en.json (French)

* New translations en.json (Dutch)

* New translations en.json (Chinese Traditional)

* New translations en.json (Turkish)

* New translations en.json (Portuguese)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Simplified)

* New translations en.json (Norwegian)

* New translations en.json (Dutch)

* New translations en.json (Greek)

* New translations en.json (French)

* New translations en.json (Portuguese)
5 years ago
Lipis 60d9567e2d
Add Select All shortcut (#1270) 5 years ago
dependabot-preview[bot] 18f0b76231
Bump prettier from 2.0.2 to 2.0.3 (#1263)
* Bump prettier from 2.0.2 to 2.0.3

Bumps [prettier](https://github.com/prettier/prettier) from 2.0.2 to 2.0.3.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/2.0.2...2.0.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

* Format

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
Co-authored-by: Panayiotis Lipiridis <lipiridis@gmail.com>
5 years ago
Daishi Kato 4003fa24b2
fix #1254 (#1255) 5 years ago
Roxana Chiorean d5366db341
Adding ability to copy to clipboard as SVG (#1250) 5 years ago
Mohit kumar Bajoria 2de4fe29ad
Full Screen mode (#1212) 5 years ago
David Luzar 81b38d8808
fix wysiwyg event cleanup (#1248) 5 years ago
Shriram Balaji 290244660b
Restore selectedElements on undelete (#1242)
* Restore selectedElements on undelete

* Update regressionTest snapshots
5 years ago
Lipis 9a0889c698
Show shortcuts dialog when pressing `?` (#1224) 5 years ago
Lipis f6bf093fdd
New Crowdin translations (#1194)
* New translations en.json (Greek)

* New translations en.json (German)

* New translations en.json (Russian)

* New translations en.json (Norwegian)

* New translations en.json (Portuguese)

* New translations en.json (Spanish)

* New translations en.json (German)

* New translations en.json (Spanish)

* New translations en.json (Polish)
5 years ago
David Luzar 4dd947b261
fix scrollToCenter when no elements supplied (#1222)
* fix scrollToCenter when no elements supplied

* make getCommonBounds return default values on empty elements
5 years ago
Kostas Bariotis b97520400a
Broadcast mouse activity (#1175)
* broadcast mouse activity

* move to same MOUSE_LOCATION event

* remove key up handler

* update tests

* Fix border

* refactor

* rename activity to button

Co-authored-by: Panayiotis Lipiridis <lipiridis@gmail.com>
5 years ago
David Luzar 23540eba4c
sync remote selection (#1207)
* sync remote selection

* skip deleted elements

* remove unnecessary condition & change naming
5 years ago
Faustino Kialungila adc099ed15
Refactor dnd event handler (#1221) 5 years ago
Faustino Kialungila d243f3901c
Insert text on double tap (#1217)
* Insert text on double tap(mobile)

* handleCanvasRef
5 years ago
José Quinto 030954badb
shift locking 22.5 degree and move to constants (#1216)
* shift locking 22.5 degree and move to constants #1171

* review SHIFT_LOCKING_ANGLE
5 years ago
Daishi Kato 44f871de71
do not select deleted elements (#1215) 5 years ago
Lipis ae1eee15cc
Replace ev -> event (#1209) 5 years ago
Lipis 31f76d59a2
Skip transparent background for cursor (#1208)
* Skip transparent background for cursor

* slice
5 years ago
David Luzar 3afb4515b6
scroll to content on collab scene init (#1201) 5 years ago
David Luzar 036978b837
fix font not rendered on init in FF (#1197) 5 years ago
Sanghyeon Lee 96cea9b84b
Make left panel height flexible to avoid overflow (#1169)
* Make overall left menu scrollable

* Make only mid-left panel scrollable

* Update src/styles.scss

* Update src/styles.scss

* Update src/components/LayerUI.tsx

* Remove unused class

* Move the scrolling role to Island

Co-authored-by: Lipis <lipiridis@gmail.com>
5 years ago
Adil HADDAOUI ae655cd7d3
Align ToolButton Label in RTL mode (#1186) 5 years ago
David Luzar 8030a167c6
make text committing cross-platform (#1188) 5 years ago
Lipis cd3083e8e6
New translations en.json (French) (#1190) 5 years ago
Lipis c1b067a8b9
New Crowdin translations (Dutch) (#1187)
* New translations en.json (Dutch)

* Update i18n.ts
5 years ago
alaoui abdellah 980d08ce56
Add support for committing a text entry on cmd/shift click (#1185) 5 years ago
Adil HADDAOUI b9b58d4464
Change arabic language name (#1184) 5 years ago
Lipis c240fff0c5
New Crowdin translations (mostly Arabic updates) (#1181) 5 years ago
David Luzar 4912a29e75
sync intermediate text updates (#1174)
* sync intermediate text updates

* fix initial render text position

* batch updates

* tweak onChange subscription
5 years ago
Kostas Bariotis 0c9459e9e5
Warn on invalid JSON file (#1159)
* add error dialog

* show error modal on file dnd

* add locales

* Update src/locales/en.json

Co-Authored-By: Lipis <lipiridis@gmail.com>

* Update src/data/blob.ts

* Update src/data/blob.ts

* fix titles, update snapshots

* make modal smaller

* fix dnd wrong file type

* reset errorMessage

Co-authored-by: Faustino Kialungila <faustino.kialungila@gmail.com>
Co-authored-by: Lipis <lipiridis@gmail.com>
5 years ago
Lipis 2be34effd4
New Crowdin translations (#1178)
* New translations en.json (Norwegian)

* New translations en.json (Norwegian)
5 years ago
Christopher Chedeau 27075b028c
Update zoom refresh (#1180)
One second feels way too long. Let's try 300ms
5 years ago
Christopher Chedeau 79557676c2
Revert "simulate a db tap on mobile to insert text (#1155)" (#1179)
This reverts commit 56034eacb0.
5 years ago
José Quinto efa8b95c52
fix scrollbar and toolbar grid-gap #1170 (#1173) 5 years ago
Lipis a488555f30
New Crowdin translations (#1165)
* New translations en.json (Chinese Simplified)

* New translations en.json (Turkish)

* New translations en.json (Hindi)

* New translations en.json (Greek)

* New translations en.json (Italian)

* New translations en.json (Hungarian)

* New translations en.json (Chinese Traditional)

* New translations en.json (Korean)

* New translations en.json (Spanish)

* New translations en.json (French)

* New translations en.json (Russian)

* New translations en.json (Portuguese)

* New translations en.json (Polish)

* New translations en.json (Norwegian)

* New translations en.json (Indonesian)

* New translations en.json (German)

* New translations en.json (Arabic)

* New translations en.json (Greek)

* New translations en.json (Hungarian)

* New translations en.json (French)

* New translations en.json (Hungarian)

* New translations en.json (German)

* New translations en.json (Korean)

* New translations en.json (Polish)

* New translations en.json (Polish)

* New translations en.json (Polish)

* New translations en.json (Polish)

* New translations en.json (Polish)
5 years ago
Jed Fox 663526129a
Proper RTL support (#1154)
* Add RTL styles. Most of the work is done by the browser 💖

* Refactor getLanguage

* Additional fixes

* Mirror the mouse pointer icon

* Move the vertical scrollbar to the left on RTL

* Revert "Mirror the mouse pointer icon"

This reverts commit f69b132538.
5 years ago
José Quinto 8fea75b84f
fix for #1106 - Weird behavior when resize + shift a 2-point li… (#1152)
Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
Daishi Kato 65be7973be
Rotation support (#1099)
* rotate rectanble with fixed angle

* rotate dashed rectangle with fixed angle

* fix rotate handler rect

* fix canvas size with rotation

* angle in element base

* fix bug in calculating canvas size

* trial only for rectangle

* hitTest for rectangle rotation

* properly resize rotated rectangle

* fix canvas size calculation

* giving up... workaround for now

* **experimental** handler to rotate rectangle

* remove rotation on copy for debugging

* update snapshots

* better rotation handler with atan2

* rotate when drawImage

* add rotation handler

* hitTest for any shapes

* fix hitTest for curved lines

* rotate text element

* rotation locking

* hint messaage for rotating

* show proper handlers on mobile (a workaround, there should be a better way)

* refactor hitTest

* support exporting png

* support exporting svg

* fix rotating curved line

* refactor drawElementFromCanvas with getElementAbsoluteCoords

* fix export png and svg

* adjust resize positions for lines (N, E, S, W)

* do not make handlers big on mobile

* Update src/locales/en.json

Alright!

Co-Authored-By: Lipis <lipiridis@gmail.com>

* do not show rotation/resizing hints on mobile

* proper calculation for N and W positions

* simplify calculation

* use "rotation" as property name for clarification (may increase bundle size)

* update snapshots excluding rotation handle

* refactor with adjustPositionWithRotation

* refactor with adjustXYWithRotation

* forgot to rename rotation

* rename internal function

* initialize element angle on restore

* rotate wysiwyg editor

* fix shift-rotate around 270deg

* improve rotation locking

* refactor adjustXYWithRotation

* avoid rotation degree becomes >=360

* refactor with generateHandler

Co-authored-by: Lipis <lipiridis@gmail.com>
Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
Lipis 3e3ce18755
New translations en.json (Greek) (#1163) 5 years ago
Sanghyeon Lee 634410ad48
Modify action buttons visibility for desktop (#1156) 5 years ago
Lipis ffec3af635
New Crowdin translations (#1160)
* New translations en.json (French)

* New translations en.json (Russian)

* New translations en.json (French)
5 years ago
Mohit kumar Bajoria 9b6700755a
Add new line on Enter (#1161)
* Add new line on Enter

Fixes #1158

* Fix lint
5 years ago
Faustino Kialungila 56034eacb0
simulate a db tap on mobile to insert text (#1155) 5 years ago
Lipis 0e90996715
New Crowdin translations (#1151)
* New translations en.json (Arabic)

* New translations en.json (Chinese Simplified)

* New translations en.json (Turkish)

* New translations en.json (Hindi)

* New translations en.json (Greek)

* New translations en.json (Italian)

* New translations en.json (Hungarian)

* New translations en.json (Chinese Traditional)

* New translations en.json (Korean)

* New translations en.json (Spanish)

* New translations en.json (French)

* New translations en.json (Russian)

* New translations en.json (Portuguese)

* New translations en.json (Polish)

* New translations en.json (Norwegian)

* New translations en.json (Indonesian)

* New translations en.json (German)

* New translations en.json (Arabic)

* New translations en.json (Portuguese)

* New translations en.json (Polish)

* New translations en.json (Arabic)

* New translations en.json (Polish)

* New translations en.json (Arabic)

* New translations en.json (French)

* New translations en.json (German)

* Update i18n.ts

* New translations en.json (German)
5 years ago
Sanghyeon Lee 86d0da5204
Add duplicate button for mobile view (#1146)
* Add a icon for dulplication

* Add PanelComponent for duplication

* Add duplicate button for mobile

* Add styles for layout action buttons

* Add a translation for 'Actions'

* Show left action buttons only for desktop

* Add duplicate button at the bottom of mobile

It is provided depending on whether or not it is `multiElement` to maintain space between buttons.
5 years ago
Lipis 1a47ff5c52
New Crowdin translations (#1145) 5 years ago
Lipis e2e4f3c805
New Crowdin translations (Greek) (#1118) 5 years ago
Brock Balducci 81d4f611a3
add action ui for deleting an element - #1125 (#1140) 5 years ago
Kostas Bariotis 4ecbbab7da
Add sentry integration (#1141) 5 years ago
Christopher Chedeau a7bd21ccf2
Avoid broadcasting what was just received (#1116)
Fixes #1115

The issue is that replaceAllElements calls a render synchronously, preventing lastBroadcastedOrReceivedSceneVersion from being set correctly.

I tried using batchUpdate but it only takes a single argument ( c5d2fc7127/packages/react-reconciler/src/ReactFiberWorkLoop.js (L1088) ) whereas the callback takes two.

Test Plan:
- Add a console.log before `this.broadcastScene("SCENE_UPDATE");` in App.tsx
- Connect a bunch of clients
- Have one move a shape
- Make sure that this client has the console logged
- Make sure the other clients don't have it
5 years ago
Sanghyeon Lee 763735ac84
Add `SCENE_INIT` broadcast type for new user (#1095) 5 years ago
Christopher Chedeau 8e6d55cf75
Fix corner resize for multi-point arrows (#1105)
The logic to support it was not implemented. This is not the prettiest way to solve it in the world but it does work. Some more refactoring here is probably warranted.

Fixes #1039
5 years ago
Christopher Chedeau 24fa657093
Don't reset cache while zooming using a gesture (#1103)
* Don't reset cache while zooming using a gesture

This reuses the cached canvas while the gesture is happening. Once it has stop updating, then recompute the cache with the proper zoom.

This should massively improve performance when panning on big scenes on mobile

Fixes #1056

* update snapshot tests
5 years ago
Kent Beck 95eaadeb85
Refactor paste code (#1102) 5 years ago
Christopher Chedeau 6056170d4b
Fix wysiwyg center (#1101)
This wasn't taking into account zoom properly.

The logic should probably get refactored a bit, it's not ideal that we're passing canvas, state and scale as different arguments. Also it's weird that the function that returns the center is computing the viewport translation. But I'm not motivated enough to fix it right now...

Fixes #1100
5 years ago
Kent Beck aa54364bd6
Use existing helper to copy all state (#1098) 5 years ago
Lipis 2a373571f8
Change order of the fill options (#1097) 5 years ago
Lipis 90c83927ad
New Crowdin translations (#1089) 5 years ago
David Luzar cac2dda5ac
Add loading state (#1027)
* add loading state

* update snapshots

* add border radius

* fix comment breaking build jsx
5 years ago
Sanghyeon Lee d8708cb14f
Apply scroll-back-to-content's z-index only for mobile (#1086)
ref: https://github.com/excalidraw/excalidraw/pull/1002/files#diff-6a2256f44598ec970b4bd034962e011eR376
5 years ago
David Luzar 6fd2a3b2e5
fix z-index action to account for deleted elems and add tests (#1077) 5 years ago
Lipis fb82715ef7
New Crowdin translations (#1085)
* New translations en.json (Chinese Traditional)

* New translations en.json (Chinese Traditional)
5 years ago
Sanghyeon Lee 051a946438
Add Enter key handler that can start text editing (#1084)
* Add handler that can start text editing with Enter key

* Refine `startTextEditing` parameters

* Apply prettier fixes
5 years ago
Marcel Kloubert 12d7550958
fixed generateCollaborationLink() (#1081) 5 years ago
Faustino Kialungila 4442addc02
Type action names (#1079)
* Type action names

* improve typing

Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
Lipis 9cc1037e7b
New Crowdin translations (#1076) 5 years ago
David Luzar 42df058223
load from localStorage only if not in multiplayer (#1074) 5 years ago
Sanghyeon Lee 104e48b6cb
Add the shape lock button for mobile (#1054) 5 years ago
Lipis e38045ccad
New Crowdin translations (#1055)
* New translations en.json (Norwegian)

* New translations en.json (Norwegian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Simplified)

* New translations en.json (French)

* New translations en.json (German)

* New translations en.json (Indonesian)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Spanish)

* New translations en.json (Turkish)

* New translations en.json (Korean)

* New translations en.json (Chinese Traditional)

* New translations en.json (Hungarian)

* New translations en.json (Norwegian)

* New translations en.json (French)
5 years ago
Pete Hunt bd7856adf3
Much more thorough tests! (#1053) 5 years ago
David Luzar cf4fa30a57
tweak png copy button label (#1062)
* tweak png copy button label

* fix lint
5 years ago
dependabot-preview[bot] 722c498abe
Bump prettier from 1.19.1 to 2.0.1 (#1060)
* Bump prettier from 1.19.1 to 2.0.1

Bumps [prettier](https://github.com/prettier/prettier) from 1.19.1 to 2.0.1.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/1.19.1...2.0.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

* Update formatting

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
Co-authored-by: Panayiotis Lipiridis <lipiridis@gmail.com>
5 years ago
Lipis c7f10c5de2
New Crowdin translations (#1049)
* New translations en.json (German)

* New translations en.json (German)

* New translations en.json (German)
5 years ago
Jed Fox 8a6e2bf9cf
Use system fonts where possible. (#1050)
Also put Arial after Helvetica. I hate Arial.
5 years ago
Edwin Lin f1160a1534
load scene from localStorage in collaboration if user is first… (#1036)
* load scene from localStorage in collaboration if user is first in room

* load scene from localStorage in collaboration prior to syncing with server

* fix merge

Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
Kent Beck ba3cec8d0d
App mitosis begins (#1047) 5 years ago
Lipis 125d1294a0
New Crowdin translations (#1043) 5 years ago
Jed Fox daa121e909
Add a warning to encourage people to update translations direct… (#1045) 5 years ago
Lipis 5b6723b514
New Crowdin translations (#1037) 5 years ago
Kent Beck d3d25a128c
Extract helper for App context menu handling (#1033)
* Encapsulate SceneHistory. A little.

* Clean up TopErrorBoundary

* Extract helper for App context menu handling
5 years ago
Kent Beck 1e8cd2bd1c
Separated specification and implementation in TopErrorBoundary (#1031)
* Encapsulate SceneHistory. A little.

* Clean up TopErrorBoundary
5 years ago
David Luzar f6b36519f1
don't pass deleted elements to UI (#1029) 5 years ago
Kent Beck dc618ab122
Encapsulate SceneHistory. A little. (#1016) 5 years ago
Lipis 46e619d800
New Crowdin translations (#1020) 5 years ago
David Luzar edd54d93b3
revert #1017 (#1025)
This reverts commit 1546c00c0c.
5 years ago
Faustino Kialungila 0ad6f4ec6b
Remove deleted elements from svg export (#1021)
* Remove deleted elements from svg export

* skip deleted elements

* remove old comment

Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
Chang Yan 1546c00c0c
Fix adding incorrect dragging element when handleCanvasPointerD… (#1017) 5 years ago
Lipis 6b3dee6777
New Crowdin translations (#1011) 5 years ago
David Luzar fda06e4fc3
Fix history - the 2nd installment (#1014)
* don't regenerate versionNonce on pushEntry

* fix history handling around multi-point arrows

* remove filtering from getElementMap helper
5 years ago
Faustino Kialungila f14aaccc38
Fix SpaceBar pan (#1013) 5 years ago
David Luzar 82ce068972
fix history (#1009)
* fix history

* tweak withBatchedUpdates typing
5 years ago
Lipis 59fa371367
New translations en.json (Chinese Simplified) (#1006) 5 years ago
David Luzar ff033640e4
expose a few state props for debugging (#1008)
* expose a few state props for debugging

* rename h.appState & add h.setState

* support setting elements
5 years ago
Sanghyeon Lee cb66adc716
Add a Shortcut for Toggling Shape Lock (#1005)
* Update shortcuts.md for Lock

* Add 'Q' as a shortcut for toggling shape lock

* Add shortcut to LockIcon title

* use event.key instead

Co-authored-by: Faustino Kialungila <Faustino.kialungila@gmail.com>
5 years ago
Lipis cb68153a81
New Crowdin translations (#998) 5 years ago
David Luzar b7da524538
confirm arrow on doubleclick (#949)
* confirm arrow on double click

* change hint

* fix cursor not updating on click
5 years ago
David Luzar 254a0753ff
fix negative resize for non-multipoint elements (#1000) 5 years ago
Jed Fox d8bbe536a7
Restyle the mobile UI a bit (#1002)
* Restyle the bottom bar on mobile as an Island

* Shorter label for collaboration button, truncate too-long button labels

* Refactor safe area things to global vars

* Fix scroll bar positioning, don’t block scrollbars with menu island

* Update text
5 years ago
Lipis 793e0e4aa0
Remove redundant text (#918) 5 years ago
David Luzar 23b785de68
Trim trailing newlines (#999)
* trim newlines for text elements

* fix comment
5 years ago
Chang Yan 6fe40516bf
deselect all elements when inserting text with double click (#996) 5 years ago
Pete Hunt 7d57d124bd
Fix alt drag (#995) 5 years ago
David Luzar 373d16abe6
improve & granularize ExcalidrawElement types (#991)
* improve & granularize ExcalidrawElement types

* fix incorrectly passing type

* fix tests

* fix more tests

* fix unnecessary spreads & refactor

* add comments
5 years ago
Lipis 1c545c1d47
New Crowdin translations (#990) 5 years ago
Pete Hunt b603337c3f
Fix multielements (#987) 5 years ago
Christopher Chedeau 0dc07135b7
Fix three rendering when loading (#986)
The problem is that syncActionResult wasn't using batching.
5 years ago
Pete Hunt e9f5175f51
Fix performance bug (#984) 5 years ago
Lipis a985d1b9b8
New Crowdin translations (#983)
* New translations en.json (Chinese Simplified)

* New translations en.json (French)

* New translations en.json (German)

* New translations en.json (Indonesian)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Spanish)

* New translations en.json (Turkish)

* New translations en.json (Korean)

* New translations en.json (French)

* New translations en.json (Portuguese)
5 years ago
Faustino Kialungila ae9b64a623
CMD + D to Duplicate Selection (#982)
* cmd+d to duplicate selection

* use duplicateElement instead

* use duplicateElement instead

* Update actionDuplicateSelection.ts

* select the new duplicated element

* add locale

* use event.key instead of event.code

Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
Lipis 83e49232ee
New Crowdin translations (#978)
* New translations en.json (Korean)

* New translations en.json (Korean)

* New translations en.json (Korean)

* New translations en.json (Korean)

* New translations en.json (Korean)

* New translations en.json (Portuguese)

* New translations en.json (Portuguese)
5 years ago
Christopher Chedeau db1f97f59e
Revert "[RFC] Randomized names next to mouse pointers. (#971)" (#972)
This reverts commit dcb93f75e6.
5 years ago
Pete Hunt dcb93f75e6
[RFC] Randomized names next to mouse pointers. (#971)
* [WIP] Add names next to pointers

This implements the rendering and messaging across. Still need to do the UI to set the name.

Also, not really sure what's the best place to send the name and store it.

* Add randomized names

Co-authored-by: Christopher Chedeau <vjeux@fb.com>
5 years ago
Keyan Zhang d58216f5ec
[RFC] show confirmation dialog before the user closes the page (#957) 5 years ago
Christopher Chedeau fed7054114
Fix hit testing threshold (#969)
* Fix hit testing threshold

- The bounding box was not correctly extended to take into account the threshold. It was only for y axis but not x.
- The bezier threshold was using 20 instead of 10 and not taking into account zoom level.

Both those issues are fixed and now the behavior looks good on all the shapes I can test.

* fix_tests
5 years ago
Christopher Chedeau 2937efacde
Remove last get/setTransform (#964)
My original hack to put the scale when we create the canvas element doesn't make much sense. It should be done when we are rendering the scene. I moved it there in this PR.

The rest was all about forwarding the scale to where it's needed.
5 years ago
Lipis 79ea76b48b
Different color for the stroke of the collaborator's arrow (#963)
* Different color for the stroke of the arrow

* Sort
5 years ago
Jed Fox e44801123a
Restyle the color picker a touch (#920) 5 years ago
Lipis d834ff4d89
New Crowdin translations (#912) 5 years ago
Pete Hunt 35ce1729cc
remove most setState({}) (#959) 5 years ago
Pete Hunt e1e2249f57
Abstract away or eliminate most of the mutation of the Elements array (#955) 5 years ago
Keyan Zhang 05af9f04ed
[easy] run typechecking on CI (#954) 5 years ago
Pete Hunt 3f8144ef85
Fix many syncing issues (#952) 5 years ago
Christopher Chedeau b20d4539c0
Stop using getTransform (#950)
* Stop using getTransform

Fixes #861

The original motivation behind this is to make it work with Firefox. But it also helped make the code more intentional.

Test Plan:
- Create one square, select it, zoom in repeatedly, make sure that it zooms centered in the screen and everything looks good
- Scroll at various zoom levels, things look good
- Export a small scene at 1x and 3x, make sure the background is properly set and look good

* fix selection element
5 years ago
Christian Alfoni dbfc8bee57
Add copy to PNG option on context menu (#941)
* Add copy to PNG option on context menu

* lint & refactor & fixes

* add keybinding

* swap keybinding

* fix docs

Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
Christopher Chedeau e19088f214
Make selection handle resolution independent (#948)
They shouldn't really change when zooming in or out.
5 years ago
Christopher Chedeau 809d7ba9f5
Remove text trim (#947)
This was added when we were computing the width without adding "pre" behavior. Now it is no longer an issue
5 years ago
Christopher Chedeau b49f9b29e5
Render pointers out of screen (#945)
I opted to use transparency to indicate that the pointer is out of screen. It seems to be working relatively well.

Fixes #935
5 years ago
David Luzar b9c75b5bc4
use deletedIds map to sync deletions (#936)
* use deletedIds map for sync deletions

* refactor how we create data for syncing

* fix comments

* streamline broadcast API

* split broadcast methods
5 years ago
Christopher Chedeau ead6a083d4
Assign a colors to each pointers (#944)
I'm using the client id as a random number to index on the color array. So far it's been working better than using a sequential increment as the colors in the array are sorted by proximity. Also, it has the advantage that everyone in the room will see the same color for the same person.
5 years ago
Christopher Chedeau a6244e7602
Better looking pointer (#943)
Instead of a crude circle, this makes it look more like a pointer. I manually tweaked the numbers until it looked like a pointer :)
5 years ago
Jed Fox 668f8ec4a6
Make dialogs look better on mobile (#908)
* Standardize mobile media query

* Refactor & add mobile support to dialogs

* back & close icons
5 years ago
David Luzar c85315650f
fix calculating text width for indented text (#930) 5 years ago
David Luzar 450a024f5c
remove object.fromEntries (#933) 5 years ago
dwelle 642e47bd03 Merge remote-tracking branch 'origin/master' into fix_multiplayer_concurrency 5 years ago
dwelle c04fe403fc don't sync editing elements & prefer local versions 5 years ago
Edwin Lin 37284c9174
Merge pull request #915 from excalidraw/fix_remote_pointers
remove remote pointers on client disconnect
5 years ago
dwelle f1ac8cac32 remove unused selectedId 5 years ago
David Luzar 95e726bd6f
cancel text via doubleclick when in multiElement mode (#926) 5 years ago
David Luzar f0e6f4dbb8
Text esc fixes (#925)
* fix incorrectly resetting state on esc

* confirm text on esc
5 years ago
David Luzar 3a5ca27600
fix zero-coalescing roughness (#924) 5 years ago
dwelle 5706dd7ae2 consolidate & align collaboration socket eventing with server 5 years ago
dwelle 96320478e6 remove remote pointers on client disconnect 5 years ago
David Luzar 2db2f3f5e4
Collab ui tweaks (#913)
* decrease gap between menu icons

* reduce margin of copy button

* add collaboratorsCount to roomDialog toggle button
5 years ago
David Luzar b82b0754ac
Room dialog (#905)
* support ToolIcon className and fix label padding

* factor some ExportDialog classes out to Modal

* initial RoomDialog prototype

* change label for another-session button

* remove unused css

* add color comments

* Move the collaboration button to the main menu, add support for mobile

* remove button for creating another session

* add locks

* Fix alignment issue

* Reorder button

* reuse current scene for collab session

* keep collaboration state on restore

Co-authored-by: Jed Fox <git@twopointzero.us>
5 years ago
Lipis aa9a6b0909
New Crowdin translations (#893) 5 years ago
Pete Hunt 83a2f5de28
remove closures from mutateElement, get rid of the element spreading (#902) 5 years ago
David Luzar 13b838117c
filter out selection elements on restore (#901)
* filter out selection elements on restore

* add comment
5 years ago
idlewinn a0669f874e add comments 5 years ago
idlewinn 1419f17175 enable version bumping for collaboration 5 years ago
Jed Fox 30903fbe04
Fill the resize handles with white so they are visible on dark b… (#894)
* Fill the resize handles with white so they are visible on dark backgrounds

* revert package-lock.json

Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
David Luzar 5dadbcdcd5
don't set pointer on pointerMove if not already present (#889) 5 years ago
David Luzar 3bf3d96d9f
make error message more user-friendly (#812)
* make error message more user-friendly

* tweak aria

* override user-select for error splash screen

* localize messages

* fix naming

* log error

* include spaces in i18n
5 years ago
Lipis c261f089fc
New Crowdin translations (#888) 5 years ago
Edwin Lin 0e5c29b3f3
basic Socket.io implementation of collaborative editing (#879)
* Enable collaborative syncing for elements

* Don't fall back to local storage if using a room, as that is confusing

* Use remote socket server

* Send updates to new users when they join

* ~

* add mouse tracking

* enable collaboration, rooms, and mouse tracking

* fix syncing bugs and add a button to start syncing mid session

* enable collaboration, rooms, and mouse tracking

* fix syncing bugs and add a button to start syncing mid session

* Add Live button and app state to support tracking collaborator counts

* Enable collaborative syncing for elements

* add mouse tracking

* enable collaboration, rooms, and mouse tracking

* fix syncing bugs and add a button to start syncing mid session

* fix syncing bugs and add a button to start syncing mid session

* Add Live button and app state to support tracking collaborator counts

* prettier

* Fix bug with remote pointers not changing on scroll

* Enable collaborative syncing for elements

* add mouse tracking

* enable collaboration, rooms, and mouse tracking

* fix syncing bugs and add a button to start syncing mid session

* enable collaboration, rooms, and mouse tracking

* fix syncing bugs and add a button to start syncing mid session

* Add Live button and app state to support tracking collaborator counts

* enable collaboration, rooms, and mouse tracking

* fix syncing bugs and add a button to start syncing mid session

* fix syncing bugs and add a button to start syncing mid session

* Fix bug with remote pointers not changing on scroll

* remove UI for collaboration

* remove link

* clean up lingering unused UI

* set random IV passed per encrypted message, reduce room id length, refactored socket broadcasting API, rename room_id to room, removed throttling of pointer movement

* fix package.json conflict
5 years ago
David Luzar 463854e42a
fix pinch zoom (#885) 5 years ago
Lipis 9de3716324
Update send/bring shortcuts and show them properly per operating… (#784)
* Show proper shortcuts

* sort

* Add shortcuts to bring/send

* fix hotkeys matching greedily

* Space

* align zindex shortcuts with figma

* switch to event.code & change Darwin shortcuts

Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
Pete Hunt 05ebf3434b
Fix a bug introduced by #880 (#881) 5 years ago
Pete Hunt 86f9f32a59
Fix perf regression (#880) 5 years ago
Pete Hunt 8d8f9f23bd
Make gesture.pointers a Map instead of an array of pointers (#877) 5 years ago
Pete Hunt 92ba401da8
Pull onPointerDown, onDoubleClick, onPointerMove into instance methods (#876)
* Pull onPointerDown, onDoubleClick, onPointerMove into instance methods

* Use bound instance methods
5 years ago
Pete Hunt c89584832d
Reset selectedElementIds when deleting selected elements (#875) 5 years ago
Pete Hunt ccbbdb75a6
Refactor ExcalidrawElement (#874)
* Get rid of isSelected, canvas, canvasZoom, canvasOffsetX and canvasOffsetY on ExcalidrawElement.

* Fix most unit tests. Fix cmd a. Fix alt drag

* Focus on paste

* shift select should include previously selected items

* Fix last test

* Move this.shape out of ExcalidrawElement and into a WeakMap
5 years ago
Jed Fox 8ecb4201db
How could I have gotten this so wrong? (#873) 5 years ago
Jed Fox c6a0cfc2b1
Refactor (#862)
* Initial factoring out of parts of the LayerUI component

2360 → 2224 LOC

* Create a Section component

* Break up src/index.tsx

* Refactor actions to reduce duplication, fix CSS

Also consolidate icons

* Move scene/data.ts to its own directory

* Fix accidental reverts, banish further single-character variables

* ACTIVE_ELEM_COLOR → ACTIVE_ELEMENT_COLOR

* Further refactoring the icons file

* Log all errors

* Pointer Event polyfill to make the tests work

* add test hooks & fix tests

Co-authored-by: dwelle <luzar.david@gmail.com>
5 years ago
Lipis 1a6431a04a
New Crowdin Translations (#845)
* New translations en.json (Chinese Simplified)

* New translations en.json (Chinese Simplified)

* Update i18n.ts

* New translations en.json (Spanish)

* New translations en.json (French)

* New translations en.json (German)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Spanish)

* New translations en.json (Turkish)

* New translations en.json (Chinese Simplified)

* New translations en.json (French)

* New translations en.json (French)

* New translations en.json (Indonesian)

* Update i18n.ts

* Update i18n.ts

* New translations en.json (French)
5 years ago
lissitz e920c078b9
Improve scrollbar-mouse interaction (#667)
* fix scrollbar detection on high devicePixelRatio devices

* don't create a new element on pointerdown over a scrollbar

* Return scrollbars from renderScene and use it in isOverScrollBars

* remove unneeded setState

* show default cursor when hovering or dragging a scrollbar

* disable scrollbars when in multielement mode

Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
Jed Fox 8e0206cc1e
Undo/Redo buttons, refactor menu toggles (#793)
* Make Undo & Redo and the menu buttons into actions; add undo/redo buttons

* Create variables for the ToolIcon colors

* Darken the menu buttons when they’re active

* Put the more intensive test in `perform`

* Fix & restyle hint viewer

* Add pinch zoom for macOS Safari

* Chrome/Firefox trackpad pinch zoom

* openedMenu → openMenu

* needsShapeEditor.ts → showSelectedShapeActions.ts

* Call showSelectedShapeActions
5 years ago
Lipis 0ee33fe341
Change the extension to .excalidraw (#858)
* Change the extension to .excalidra

* Support opening as well

* support .excalidraw extension on canvas  DranAndDrop

Co-authored-by: Faustino Kialungila <Faustino.kialungila@gmail.com>
5 years ago
Lipis 097c5dfad7
Refactor: e -> event or error, err -> error, p -> pointer (#831)
* Refactor: e -> event or error, err -> error, p -> pointer

* simplify
5 years ago
Lipis 759df14143
Revert "Use direct URL for the backend (#846)" (#852)
This reverts commit 602f32b743.
5 years ago
Lipis 602f32b743
Use direct URL for the backend (#846) 5 years ago
David Luzar 7e0e885417
ensure restored elements are normalized before filter (#844) 5 years ago
Lipis a8a5733e50
New translations en.json (French) (#841) 5 years ago
Lipis 718713672a
New translations en.json (Portuguese) (#840) 5 years ago
Lipis 26ce7fc563
New Crowdin translations (#838) 5 years ago
David Luzar 8198d71af8
fix svg export (#837) 5 years ago
David Luzar 4977593ec4
fix exporting lines as svg (#836) 5 years ago
Lipis 19e746792e
New Crowdin translations (#829) 5 years ago
Faustino Kialungila 1355e0201c
use a const for default font value (#834) 5 years ago
Faustino Kialungila 2131befd7a
Fix pasting styles on text elements (#833) 5 years ago
Faustino Kialungila 2ad0716f3d
fix style pasting (#832)
* fix style pasting

* Update src/actions/actionStyles.ts
5 years ago
David Luzar 4b8b9965c2
fix early return from renderScene (#815) 5 years ago
Lipis 4e3a2f9e3b
New Crowdin translations (#813)
* New translations en.json (German)

* New translations en.json (German)

* New translations en.json (German)
5 years ago
Lipis 165ce17590
New Crowdin translations (#811)
* New translations en.json (French)

* New translations en.json (German)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Spanish)

* New translations en.json (Turkish)

* New translations en.json (Polish)
5 years ago
David Luzar 80a49e9611
improve error handling & map stack trace (#809)
* improve error handling & map stack trace

* log error message and tweak

* support logging multiple errors

* move dynamic import inside try/catch
5 years ago
Takumi a613d02147
Add cursor pointer style to hidden radio buttons (#810)
* Add cursor pointer style to hidden radio buttons

* ensure hidden input buttons don't interact with mouse

Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
Oren Me 07336bb168
feat: add reset zoom button (#777)
* feat: add reset zoom button

Add zoom reset button.
Button is shown only when zoom scale is different from 1

* change reset zoom icon

* always show zoom reset

* fix typo
5 years ago
Jed Fox 74add8661a
Fix error on export (#808) 5 years ago
Jed Fox 4e489bfb6d
Fix zoom being set to NaN (#807)
* Fix zoom being set to NaN

* recover zoom default value on restore if invalid

Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
Lipis d342cae2ae
New Crowdin translations (#806)
* New translations en.json (Polish)

* New translations en.json (Polish)
5 years ago
lissitz e80ab1c8a2
Don't render bounding box for multi-point lines during creation (#799)
* don't render bounding box for multi-point lines during creation

* force LayerUI rerender after creating a new point

Force LayerUI rerender after creating a new point so that the mobile UI
updates and the Done button is visible.

* don't select multiElement on confirm is locked

Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
Jed Fox 43236bed68
Fix error with contentEditable (#803) 5 years ago
Lipis 09fa56335e
New Crowdin translations (#796) 5 years ago
Jed Fox 0fd3fb4b5b
More mobile tweaks (#790)
* Disable text selection

* Set content-editable=plaintext-only to disable Touch Bar formatting buttons

* Enlarge resize handle tap targets for pen/touch

* Make the lock button a button in mobile mode

* Use icons instead of Unicode characters; add an alternate toolbar for creating multipoint lines

* Allow buttons to hide themselves

* Fix heuristic for showing shape actions

* Refactor icons

* Fix label for edit button

* Switch edit button icon

* Remove lock button on mobile

* Add language selector on mobile

* Fix showing edit button on mobile

* Fix showing edit button on mobile, part 2

* Fix handle touch regions

* Fix scroll-back button position

* Allow using the text tool on a text object to start editing it

* Fix deletion of last point in line
5 years ago
Lipis 949c3841ea
Show hint under toolbar (#783) 5 years ago
İsmail Namdar 626c99939e
add tr localization (#789) 5 years ago
Jed Fox ab176937e6
Add touch support (#788)
* Add touch support

* Mock media query

* Mock media query pt 2

* Fix tests

* Allow installing as an app on iOS

* Fix type error

* Math.hypot

* delete and finalize buttons, hint viewer

* skip failing tests

* skip the rest of the failing tests

* Hide the selected shape actions when nothing is selected

* Don’t go into mobile view on short-but-wide viewports

* lol
5 years ago
Jed Fox 7a7a73b78d
Initial support for mobile devices (#787)
* Initial support for mobile devices

No editing yet, but UI looks nice and you can open the canvas menu

* Add support for editing shape color, etc

* Allow the mobile menus to cover the shape selector

* Hopefully fix test error

* Fix touch on canvas

* Fix safe area handling & remove unused Island
5 years ago
David Luzar 9439908b92
use a better cloning algorithm (#753)
* use a better cloning algorithm

* Revert "use a better cloning algorithm"

This reverts commit 7279262129.

* implement custom cloning algorithm

* add tests

* refactor

* don't copy canvas & ignore canvas in related ops

* fix tests
5 years ago
Christopher Chedeau 5256096d76
Fast & Furious (#655)
* [WIP] Fast & Furious

* ensure we translate before scaling

* implement canvas caching for rest of elements

* remove unnecessary ts-ignore

* fix for devicePixelRatio

* initialize missing element props on restore

* factor out canvas padding

* remove unnecessary filtering

* simplify renderElement

* regenerate canvas on prop changes

* revert swapping shape resetting with canvas

* fix blurry rendering

* apply devicePixelRatio when clearing canvas

* improve blurriness; fix arrow canvas offset

* revert canvas clearing changes in anticipation of merge

* normalize scrollX/Y on update

* fix getDerivedStateFromProps

* swap derivedState for type brands

* tweak types

* remove renderScene offsets

* move selection element translations to renderElement

* dry out canvas zoom transformations

* fix padding offset

* Render cached canvas based on the zoom level

Co-authored-by: David Luzar <luzar.david@gmail.com>
Co-authored-by: Preet <833927+pshihn@users.noreply.github.com>
5 years ago
Sosuke Suzuki 2bb95f0651
Modify to avoid to blur while composing (#775) 5 years ago
Enzo Ferey 6ebd41734f
Resize handler detection should not be active when moving multip… (#767)
* Fix bug.

* Implement `getSelectedElements`.

* Explicit condition.

* Respect variable naming.

* Keep state consistent.

* Use `isSomeElementSelected` abstraction.

* Missing ones.
5 years ago
Timur Khazamov ad72946131
Shortcuts to zoom in/out and to reset zoom (#770)
* Shortcuts to zoom in/out and to reset zoom

* add support for numerical keys

* Fixed Firefox compatibility

Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
David Luzar 2d22ffda49
fix wheel zoom step (#771) 5 years ago
Timur Khazamov eee961d65f
Use meta key + wheel to zoom in/out (#769) 5 years ago
Szymon Pajka 360864ef3d
Add missing Polish translations (#766) 5 years ago
Enzo Ferey c7ff4c2ed6
Canvas zooming (#716)
* Zoom icons.

* Actions.

* Min zoom of 0 does not make sense.

* Zoom logic.

* Modify how zoom affects selection rendering.

* More precise scrollbar dimensions.

* Adjust elements visibility and scrollbars.

* Normalized canvas width and height.

* Apply zoom to resize test.

* [WIP] Zoom using canvas center as an origin.

* Undo zoom on `getScrollBars`.

* WIP: center zoom origin via scroll

* This was wrong for sure.

* Finish scaling using center as origin.

* Almost there.

* Scroll offset should be not part of zoom transforms.

* Better naming.

* Wheel movement should be the same no matter the zoom level.

* Panning movement should be the same no matter the zoom level.

* Fix elements pasting.

* Fix text WYSIWGT.

* Fix scrollbars and visibility.
5 years ago
rubjo 40b54a8780
Update translation: Norwegian Bokmål (#762) 5 years ago
Gasim Gasimzada 7183234895
Write integration tests (#719)
* Scaffold a simple test case for debugging

* Set up Jest environment that works with React

- Install and set up react-testing-library
- "Unignore" roughjs and browser-nativejs transformations
- Separate App component from ReactDOM

* Write first passing test

- Mock canvas
- Remove App file and mount/unmount ReactDOM on import

* Add tests for drag create behavior

* Fix comments in dragCreate

* Pin jest-mock-canvas dependency

* Remove dependency range for testing library

* Add tests for multi point mode and selection element

* Fix all tests due to decrease in updates to canvas when changing tools

* Disable state updates if component is unmounted

- Remove all event listeners
- Disable storing scene in state if component is unmounted

* Add tests for move and element selection

* Merge branch 'master' into add-integration-tests

* Add tests for resizing rectangle

* move unmounted check to syncActionResult method

* Use a custom test renderer instead of default testing-library functions

* Add custom query for selecting tools

* move files around

Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
Gasim Gasimzada ad4ad238ef
Remove invisibly small elements on scene load (#754) 5 years ago
lissitz fa12125db0
fix some element types reset to selection when the lock is active (#746)
* keep arrows and lines selected if locked

* keep element type selected if locked after inserting text

* ensure clicking outside doesn't create new text

* esc should switch to selection even if locked

* reset cursor when creating text via doubleClick

Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
David Luzar 6dd3620dd6 fix cloning element.points (#744) 5 years ago
David Luzar 2a472bb912
ensure duplicateElement does deep copy of points (#742) 5 years ago
David Luzar 389e40900c
z-index button fixes (#738)
* fix svg attributes

* center z-index icons

* remove unnecessary attributes

* differentiate button :active bg

* prevent selection of ToolIcon hints

* emphasize active elem color
5 years ago
wboucher 471ea4a747
Add zindex to panel (#736)
* Add z-index options back to panel

* Add formatting for z-index panel buttons

* make z-index buttons all the same width

* make z-index button spacing even

* use svg icons & translations

* add ui legend

Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
Gasim Gasimzada b09373acf7
Align arrow caps based on bezier curve instead of stored points (#737) 5 years ago
Christopher Chedeau c2a3b67ccc
Fix scrollbar (#735)
The computation was not correct. I'm not really sure how it used to work but it was not taking into account the dimensions of the scene so it was wrong.

The new algorithm is computing the scrollbar such that it's the position of the viewport in relationship to the bounding box of the viewport and all the elements.

Fixes #680
5 years ago
Christopher Chedeau 935a7f58a7
Remove previously loaded scenes (#734)
As mentioned in #724, the current implementation is suboptimal. Let's remove it until we come back with a better design.

Fixes #724
5 years ago
Christopher Chedeau 8d64ec8153
Add lock icon (#733)
Because it looks more secure ;)
5 years ago
Christopher Chedeau e6d03aeeea
End to end encryption description (#731)
* End to end encryption description

This PR updates the url upload description to mention that it is end to end encrypted. I used a very similar message as whatsapp so that it is familar to people.

I also removed the automatic copying and turned the alert into prompt. This should be less awkward than the current implementation.

* capitalize excalidraw

Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
Szymon Pajka f359a1ea1b
Fix grammar problems in Polish translation 🇵🇱🐛 (#730)
* corrected typos
* fixed grammar
5 years ago
David Luzar d79293de06
move footer into layerUI & refactor ActionManager (#729) 5 years ago
David Luzar 88eacc9da7
Improve pasting (#723)
* switch to selection tool on paste

* align pasting via contextMenu with pasting from event

* ensure only plaintext can be pasted

* fix findShapeByKey regression

* simplify wysiwyg pasting

* improve wysiwyg blurriness
5 years ago
Szymon Pajka 1cd0dfe922
Add Polish language support (#725) 5 years ago
BM a7dc067dfe
Fix language selection (#726) 5 years ago
David Luzar 3b20e6e2b8
fix decoding imported data from backend (#722) 5 years ago
Gasim Gasimzada 33016bf6bf
Fix issues related to history (#701)
* Separate UI from Canvas

* Explicitly define history recording

* ActionManager: Set syncActionState during construction instead of in every call

* Add commit to history flag to necessary actions

* Disable undoing during multiElement

* Write custom equality function for UI component to render it only when specific props and elements change

* Remove stale comments about history skipping

* Stop undo/redoing when in resizing element mode

* wip

* correctly reset resizingElement & add undo check

* Separate selection element from the rest of the array and stop redrawing the UI when dragging the selection

* Remove selectionElement from local storage

* Remove unnecessary readonly type casting in actionFinalize

* Fix undo / redo for multi points

* Fix an issue that did not update history when elements were locked

* Disable committing to history for noops

- deleteSelected without deleting anything
- Basic selection

* Use generateEntry only inside history and pass elements and appstate to history

* Update component after every history resume

* Remove last item from the history only if in multi mode

* Resume recording when element type is not selection

* ensure we prevent hotkeys only on writable elements

* Remove selection clearing from history

* Remove one point arrows as they are invisibly small

* Remove shape of elements from local storage

* Fix removing invisible element from the array

* add missing history resuming cases & simplify slice

* fix lint

* don't regenerate elements if no elements deselected

* regenerate elements array on selection

* reset state.selectionElement unconditionally

* Use getter instead of passing appState and scene data through functions to actions

* fix import

Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
David Luzar 972d69da6c
fix hotkeys not working when non-writable input focused (#717) 5 years ago
David Luzar 82eb97462b
fix restoring from localStorage (#715) 5 years ago
David Luzar b7a6ceba68
Eslint tweaks (#696)
* make eslint styleguide into warnings & drop no-else-return

* reintroduce max-warnings=0

* remove unnecessary eslint line disable

* reintroduce no-else-return rule
5 years ago
Christopher Chedeau 2dd1796351
Add encryption (#642)
* Add encryption

In order to avoid the server being able to read the content of the scene, this PR implements local encryption and decryption. This implements the algorithm described in #610.

Right now the server doesn't support uploading binary files. I mocked the server with comments. @lipis, could you add support on the server and update this PR? I added a bunch of TODO: that tell you where to comment/uncomment in order to get the server flow going.

To test locally right now:
- Import: Open http://localhost:3000/#json=1234,5oYVOnGpWYPPTz19-PMYYw and see a square
- Export: Click the export link and see the right url with the private key + the encrypted binary in the console

Fixes #610

* backend_v2

* v2
5 years ago
Gasim Gasimzada c7d7d65e1b
Set arrow cap size based on minimum the full length of the arrow instead of last segment (#709) 5 years ago
BM 27a1217981
Remove select color input on click (#708) 5 years ago
Gasim Gasimzada 08d80fb4fe
Add points to multi arrows in real time (#697)
* Add points to multi arrows in real time

* Fix linter issues

* Clear unecessary values from local storage
5 years ago
Bakhtiiar Muzakparov 173fe093b6
Fix typing into color picker popup text field (#694)
Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
David Luzar 954d805cb3
rewrite clipboard handling (#689) 5 years ago
Gasim Gasimzada dab35c9033
Multi Point Lines (based on Multi Point Arrows) (#660)
* Enable multi points in lines

* Stop retrieving arrow points for lines

* Migrate lines to new spec during load

* Clean up and refactor some code

- Normalize shape dimensions during load
- Rename getArrowAbsoluteBounds

* Fix linter issues
5 years ago
Gasim Gasimzada f70bd0081c
Feature: Hint viewer (#666)
* Add Hint viewer

- Add hints for arrows and lines
- Add hints for resizing elements

* Swap priority of multi mode and resize mode in Hint Viewer

* Remove dangling locales from public

* Add shortcut to hide hints

* Change hint texts and show resize hint ONLY during resizing

* Remove hints toggling
5 years ago
rubjo 23d40ae4a5
Added Norwegian Bokmål (#685)
* Added Norwegian Bokmål

* Lint long line
5 years ago
Bakhtiiar Muzakparov f955f58bc4
Allow changing opacity with scroll wheel (#662) 5 years ago
Christopher Chedeau 68ca63ec14
Add step for opacity slider (#670)
Instead of freeform, let's only support 10 increments of opacity. Should help keep things consistent
5 years ago
Faustino Kialungila abd04cb870
Load only valid excalidraw json when drag&drop (#678)
* Load only valid excalidraw json when drag&drop

* fix lint error
5 years ago
lissitz 92a0f100b8
Drag and drop JSON exports to canvas loads the scene (#676)
* Drag and drop JSON exports to canvas loads the scene

* remove unneeded onDragOver
5 years ago
Lipis 53994e71e5
Add more ESLint rules and change the formatting scripts (#626)
* Add curly rule in ESLint for consistency

* Fix rules

* More rules

* REturn

* Push

* no else return

* prefer const

* destructing
5 years ago
Faustino Kialungila 814299321e
Add missing locales for scrollBackToContent (#663)
* Add missing locales for scrollToContent

* remove duplicated locales
5 years ago
Christopher Chedeau f8a41cee16
Add keybindings for shapes (#648)
* Add keybindings for shapes

I'm not 100% sure about this one. I feel like it's going to help people be a lot more productive to display the key bindings at all time. But it also clutters the UI...

* increase font-size

* fix shape keybindings for non-qwerty keyboards

* tweak position and color

Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
Christopher Chedeau be97bd980e
Add button when scrolled outside of visible area (#643)
With the infinite scroll behavior, it's easy to scroll super far away from where the content is and have a hard time getting back. This PR adds a button to refocus on the center of the scene when no elements are visible anymore.
5 years ago
Faustino Kialungila 7c9e6dd3f1
support undo/redo for azerty keyboards (#630)
* support undo/redo for azerty keyboards

* migrate to event.key

* remove unnecessary shiftKey check

Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
Christopher Chedeau 46791e6da1
Add keybindings for color picker (#647)
* Add keybindings for color picker

This adds the ability to navigate using left/right/bottom/up keys and shows key bindings for all the different colors. This is only optimized for the qwerty keyboard layout, but unfortunately it's not possible to detect other keyboard layouts :(

* add aria-keyshortcuts and keybinding in title

* make focus select color, confirm on enter

Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
Gasim Gasimzada 1e4ce77612
Reintroduce multi-point arrows and add migration for it (#635)
* Revert "Revert "Feature: Multi Point Arrows (#338)" (#634)"

This reverts commit 3d2e59bfed.

* Convert old arrow spec to new one

* Remove unnecessary failchecks and fix context transform issue in retina displays

* Remove old points failcheck from getArrowAbsoluteBounds

* Remove all failchecks for old arrow

* remove the rest of unnecessary checks

* Set default values for the arrow during import

* Add translations

* fix restore using unmigrated elements for state computation

* don't use width/height when migrating from new arrow spec

Co-authored-by: David Luzar <luzar.david@gmail.com>
Co-authored-by: Christopher Chedeau <vjeuxx@gmail.com>
5 years ago
Christopher Chedeau 4ff88ae03d
Fix caret for real! (#653)
Turns out the root cause was the outline. For some reason, doing "transparent" doesn't work but doing "1px solid transparent" does. Don't know why but I'll take it!
5 years ago
Christopher Chedeau 9a76556bea
Fixed wysiwyg carret disappearing on Chrome (#652)
There's a bug where the carret doesn't show up when the text is first focused on Chrome with the previous combination of CSS. I tweaked it and now it seems to work (don't ask me why!).

Unfortunately on Safari, ever since we moved to contentEditable on #274, the carret disappeared the first time. I unsuccessfully tried to repro in a smaller codebase ( https://jsfiddle.net/u2mjs90y/1/ ) but it does work in Safari...

I'm not exactly sure what's going on, there are bunch of issues opened against this bug when googling against all the browsers...
5 years ago
Christopher Chedeau 70db792549
Allow copy pasting inside of wysiwyg element (#651)
We did some hackery to prevent copy pasting when we didn't support multilines. But we do now so we can remove it.

Interestingly, newlines are actually <br /> elements. So we need to tweak the isInputLike logic a bit
5 years ago
Christopher Chedeau f261d6f2fc
Fix font preloading (#649)
Thanks to this stack overflow answer ( https://stackoverflow.com/a/41678350/232122 ) I was able to fix the font preloading!

If we put fonts.css in the public/folder and include it with normal html, we can avoid going through the build pipeline!
5 years ago
Christopher Chedeau e50dc5dbed
Fix wysiwyg text overflow (#650)
By using position: fixed like the rest of the UI components, it will no longer make the body change size and have bad side effects like scrolling.

Fixes #365
5 years ago
Christopher Chedeau 47f6328ae1
Fix ability to use arrow keys to navigate between shapes (#646)
This is the only way to navigate using the keyboard and was prevented by #596. Now it works fine.

Test Plan:
- Click on selection icon
- Use left/right arrow keys to move between tool icons, that works.

- Click on a shape, cmd+c
- Click on the selection icon
- Cmd+v, it pastes correctly
5 years ago
Christopher Chedeau 39674fe2b0
Add outline to button list (#644)
It's unclear otherwise when using the keyboard
5 years ago
Christopher Chedeau 29f1465b81
Fix wrong cursor for selection keyboard shortcut (#645)
Pressing 1 would change the cursor to a + instead of normal cursor
5 years ago
Christopher Chedeau c7eebd42c1
Fix conflict (#641) 5 years ago
Lipis fc341c3763
Better handling of 404 errors when loading from backend (#608) 5 years ago
Christopher Chedeau ead9aab888
Remove enzyme (#640)
The test that was added is not a good test. If we want to test things, we should be testing logic that is error prone such as all the mouse handling logic and state management. Adding a test for something trivial as displaying a list of data is just going to be annoying when we eventually change the UI and the test breaks.

Since this is the only test using enzyme, I also removed enzyme. We can add it back if we want to test a component using it.
5 years ago
Christopher Chedeau e4919e2e6c
Replace i18n by a custom implementation (#638)
There are two problems with the current localization strategy:
- We download the translations on-demand, which means that it does a serial roundtrip for nothing.
- withTranslation helper actually renders the app 3 times on startup, instead of once (I haven't tried to debug it)
5 years ago
Christopher Chedeau 637276301a
Different call of resumeRecording() (#636)
Instead of finding all the places where we want to resume recording, we should do it after every componentDidUpdate(). The idea is that we just want to disable the history for certain setState, for which we call directly before skipHistory.
5 years ago
David Luzar 3d2e59bfed
Revert "Feature: Multi Point Arrows (#338)" (#634)
This reverts commit 16263e942b.
5 years ago
Gasim Gasimzada 16263e942b
Feature: Multi Point Arrows (#338)
* Add points to arrow on double click

* Use line generator instead of path to generate line segments

* Switch color of the circle when it is on an existing point in the segment

* Check point against both ends of the line segment to find collinearity

* Keep drawing the arrow based on mouse position until shape is changed

* Always select the arrow when in multi element mode

* Use curves instead of lines when drawing arrow points

* Add basic collision detection with some debug points

* Use roughjs shape when performing hit testing

* Draw proper handler rectangles for arrows

* Add argument to renderScene in export

* Globally resize all points on the arrow when bounds are resized

* Hide handler rectangles if an arrow has no size

- Allow continuing adding arrows when selected element is deleted

* Add dragging functionality to arrows

* Add SHIFT functionality to two point arrows

- Fix arrow positions when scrolling
- Revert the element back to selection when not in multi select mode

* Clean app state for export (JSON)

* Set curve options manually instead of using global options

- For some reason, this fixed the flickering issue in all shapes when arrows are rendered

* Set proper options for the arrow

* Increaase accuracy of hit testing arrows

- Additionally, skip testing if point is outside the domain of arrow and each curve

* Calculate bounding box of arrow based on roughjs curves

- Remove domain check per curve

* Change bounding box threshold to 10 and remove unnecessary code

* Fix handler rectangles for 2 and multi point arrows

- Fix margins of handler rectangles when using arrows
- Show handler rectangles in endpoints of 2-point arrows

* Remove unnecessary values from app state for export

* Use `resetTransform` instead of "retranslating" canvas space after each element rendering

* Allow resizing 2-point arrows

- Fix position of one of the handler rectangles

* refactor variable initialization

* Refactored to extract out mult-point generation to the abstracted function

* prevent dragging on arrow creation if under threshold

* Finalize selection during multi element mode when ENTER or ESC is clicked

* Set dragging element to null when finalizing

* Remove pathSegmentCircle from code

* Check if element is any "non-value" instead of NULL

* Show two points on any two point arrow and fix visibility of arrows during scroll

* Resume recording when done with drawing

- When deleting a multi select element, revert back to selection element type

* Resize arrow starting points perfectly

* Fix direction of arrow resize based for NW

* Resume recording history when there is more than one arrow

* Set dragging element to NULL when element is not locked

* Blur active element when finalizing

* Disable undo/redo for multielement, editingelement, and resizing element

- Allow undoing parts of the arrow

* Disable element visibility for arrow

* Use points array for arrow bounds when bezier curve shape is not available

Co-authored-by: David Luzar <luzar.david@gmail.com>
Co-authored-by: Preet <833927+pshihn@users.noreply.github.com>
5 years ago
David Luzar 6886dfdea7
ensure we reset draggingElement when tool locked (#627) 5 years ago
Guillermo Peralta Scura 35750d8d09
Panning with space key (#579)
* Panning with space key

* prevent panning when selecting/dragging & add more checks

* Fix changing current tool via shortcut while panning

* Fix order of statements

* teardown on blur event

* Refactor cursor setting

Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
Robinson Marquez 4ad38e317e
485: Ability to switch to previously loaded ids in UI (#583) 5 years ago
David Luzar bd1c00014b
fix not resuming recording (#614) 5 years ago
David Luzar 023400c3cc
Revert "Fix keyboard shortcut (#587)" (#617)
This reverts commit cc3d71f13c.
5 years ago
Bakhtiiar Muzakparov cc3d71f13c
Fix keyboard shortcut (#587)
* Fix keyboard shortcut

Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
Bakhtiiar Muzakparov 63c685af73
Add russian translation (#612) 5 years ago
Lipis 2dce2ce712
Show labels instead of icons for PNG, SVG (#606) 5 years ago
Lipis a9790c74f5
Wider export dialog (#603) 5 years ago
Lipis ba4fc0f1b3
Minor redesign of Export Dialog (#604) 5 years ago
Preet 97b11b0f53
SVG export (#598)
* first draft of export to SVG. WIP

* enabled text rendeing - which is not quite right atm

* placeholder svg icon

* size the canvas based on the bounding box of elements

* Do not add opacity attributes if default

* render background rect

* Ensure arrows are in the same SVG group

* parse font-size from font

* export web fonts

* use fixed locations for fonts

* Rename export functions

* renamed export file

* oops broke the icon.
5 years ago
lissitz 845484aecc Fix: refreshing the page while selecting saves the selection ele… (#601)
* Fix: refreshing the page while selecting saves the selection element

Fixes #591.

* fix lint

Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
David Luzar 26048ee469
improve clipboard handling (#596)
* improve clipboard handling

* fix regression of not defocusing tool icons
5 years ago
Faustino Kialungila de68561df5
lowercase pasted color (#594)
* lowercase pasted color

* remove unused class & don't lowercase input

Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
David Luzar 187cfbe2d8
temp hack fix for state updates (#593)
* temp hack fix state updates

* switch setTimeout for state mutation
5 years ago
Guillermo Peralta Scura 67eca2bda1
Add landmarks (#564)
Use HTML semantic elements to set the landmarks of the page.

This is helpful for assistive technologies to determine the different regions of content. In our case it's useful for jumping between the different islands that we use to group the form controls.
5 years ago
Lipis fc350f2ecd Adjust language selector (#552)
* Adjust language selector

* rem
5 years ago
Lipis 81d169e90c Add tool tip for shape lock (#551)
* Add tool tip for shape lock

* tweak label & fix master rebase

Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
David Luzar 61264ee2d6
move title to label (#584) 5 years ago
David Luzar e17f743df1 change cartoonist roughness (#582) 5 years ago
David Luzar 7b842fc330 simplify distance helper and factor out common bounds helper (#581)
* simplify distance helper

* factor out common bounds helper
5 years ago
Christopher Chedeau 5853fba821
Fix global settings (#572)
Some PR made the settings UI show up even though nothing is selected. However, you couldn't actually change any of those settings except for the colors. This PR pipes through the rest of the properties so everything works now!
5 years ago
Christopher Chedeau 8ab176b9a5
Disable UI rendering when history is skipped (#574)
When we are scrolling, resizing, or moving elements, we already disable the history. Since those actions do not change the state of the UI, we can also avoid re-drawing it and save ~10ms per frame.

I had to change all the forceUpdate() to setState({}), otherwise it would bypass shouldComponentUpdate.
5 years ago
Christopher Chedeau 263fef4eaa
Add a gap between shapes and lock (#569)
* Add a gap between shapes and lock

The lock is a different type as the rest of the shapes, so we should visually separate it.

* redesign lock icon

Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
Christopher Chedeau 141b7409a2 Only show correct settings (#565)
* Only show correct settings

The logic to display which settings when nothing was selected was incorrect. This PR ensures that they are in sync.

I also removed all the <hr /> which after the redesigned just looked like weird empty spaces

* fix handling editing/text elements

Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
Christopher Chedeau 2a87c7381b Set selection when unlocking (#567)
A common workflow I have is to enable the lock, draw a bunch of things, unlock to be able to select stuff. However, after I unlock, the last shape is still enabled, so I end up drawing yet another of the same shape :(

This PR resets to selection instead!
5 years ago
Christopher Chedeau ed42672fd3 Fix value when multiple elements are selected (#571)
If you have two elements selected that have a different value (eg: a green line and a red line), the value of the color picker should be undefined, not the default value.
5 years ago
Christopher Chedeau 3e381b75cb Remove image type description when saving to png (#566)
The description is the name of the file type in the dialog. This shouldn't be Excalidraw but the default one for a png.
5 years ago
Christopher Chedeau e1ed40be65 Fix exported size when drawing to the left (#575)
If you scroll and draw to the left of the origin, when you export the scene, there's a weird whitespace on the right. This is because we do the min() computation starting at 0 and not -Infinity

This also fixes pasted elements and scrollbars.
5 years ago
Christopher Chedeau 4b0f788945
Proper error handling for creating a link without internet (#577)
* Proper error handling for creating a link without internet

* shuffle code a bit

Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
Christopher Chedeau 1d9cdf4d46 Use local fonts (#573)
This updates the way fonts are handled to not have to download the font from the internet.

If you do `./public/font.ttf` in the .scss file, unfortunately the bundle packages them somewhere that's different from the public folder that is used by the index.html to preload them.

The fix I used is to use absolute path `/font.ttf` so that both work. Unfortunately, this means that the website will only work if at the root of the domain. That's the case so far so it's okay but still annoying if we want to embed it somewhere.
5 years ago
Christopher Chedeau c3e9f775e7 Disable escape when creating element (#576)
Problem:
- Select arrow
- Mouse down somewhere
- Mouse move somewhere to create an arrow
- Press escape
- Now you're in a weird situation where the shape is now "selection" but you're still dragging the arrow. If you mouse up, the arrow disappears

In order to solve this problem, we can avoid making escape do anything if you're currently dragging an element
5 years ago
Christopher Chedeau 94e18bd8e4 Untranslated lock icon (#568)
Sorry my OCD is kicking in... It's super weird that the base of the lock moves when we check / unckeck it. Instead, just the semi-circle shape should move (what this PR implements).
5 years ago
Christopher Chedeau 61f301c3e0 Cleanup saved json file (#578)
It turns out the only thing we need to save in the appState is the background color. All the rest is transient data.

I added `"type": "excalidraw"` at the beginning to explain where it was.

I removed `"source": "http://localhost:3000/"`. I don't think we want to leak on which webpage it was saved from.

I removed `isSelected` from the json

I added indentation so it's easier to read the content. I'm not 100% sure on this one, but I figure filesize doesn't matter too much those days. And if we want to shrink it, there are more effective ways than json.
5 years ago
Lipis 3901ad7dbe Adjust context menu and use open colors (#553)
* Adjust context menu and use open colors

* word wrap

* revert colors & padding

Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
Guillermo Peralta Scura e4ff408f23
Accessible modals (#560)
Improve the accessibility of our modals (the color picker and the export dialog)

Implement a focus trap so that tapping through the controls inside them don't escape to outer elements, it also allows to close the modals with the "Escape" key.
5 years ago
Christopher Chedeau ba13f88924
Do not trigger modal actions when not visible (#562)
Right now we're running useEffect block which runs getExportCanvasPreview on every state update, even if the modal is not visible (eg: when moving the mouse around!). This puts the modal code in its own component so that it doesn't trigger useEffect when not visible.

The code isn't very elegant as we're forwarding all the props, there's likely a better way to handle it (if anyone is interested, PR would be appreciated), but at least now it no longer double renders the scene.

Fixes #559
5 years ago
Christopher Chedeau c697938350
Do not store cursor position in state (#557)
* Do not store cursor position in state

Storing it in state causes a full re-render. The only time we use the cursor position is for pasting. This halves the number of renders on drag.

* remove passive change
5 years ago
Christopher Chedeau 5b19aeafe9
Make color selection accessible (#556)
By changing from a `<div>` to a `<button>`, it's now possible to use the space key in order to select it
5 years ago
lissitz 1bae203a78 changing new shape property sets it as default (#520)
* changing new shape property sets it as default

* set correct opacity while editing new test

Co-authored-by: Christopher Chedeau <vjeuxx@gmail.com>
5 years ago
Guillermo Peralta Scura 69061e20ac Some a11y fixes (#534)
* Rename ToolIcon to ToolButton

It makes more semantic sense

* Label and keyboard shortcuts announcement

* Refactor common props for ToolButton

* Better doc outline and form controls

* Adjust color picker

* Styling fixes

Co-authored-by: Christopher Chedeau <vjeuxx@gmail.com>
5 years ago
Marco Kaul 5fd6c4d853 Add german translation (#550)
* Add german translation

* Add german language option

* Fix missing german translation

* Alphabetical order for languages

* Sort

Co-authored-by: Lipis <lipiridis@gmail.com>
5 years ago
Loris 413c387c7c Add onCancel callback to textWysiwyg for cleanup (#555) 5 years ago
Lipis 829e827dcf Scroll content to the center when loading from backend or file (#554)
* Scroll content to the center when loading from backend

* spread

* Load from file

* Return type
5 years ago
Bakhtiiar Muzakparov 689c94151d fix: typos (#540) 5 years ago
David Luzar afb1d6725f
Normalize dimensions (#527)
* normalize dimensions of non-linear elements

* fix element type check regression
5 years ago
Jilles Soeters d65e90209c Allow multiline text (#535)
* Allow multiline text

* Figure out offset correctly

* Run prettier
5 years ago
Faustino Kialungila 54f9c296b5
Enhance language selection (#538)
* Enhance language selection

* remove top/left margin to limit unusable canvas area

Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
Lipis ee68af0fd3
Set Trailing Cmma to (#525) 5 years ago
Faustino Kialungila 25202aec11
Adding Portuguese Translation (#528)
* Add Portuguese Translation

Adding PT translations

* Update src/i18n.ts

Co-Authored-By: Lipis <lipiridis@gmail.com>

Co-authored-by: Lipis <lipiridis@gmail.com>
5 years ago
Thibaut SABOT 990e064c13 Add french translation (#522)
* Add french translation

* improve fill translation

* forget accent on select translation
5 years ago
Thibaut SABOT e8c909e35c Don't use translated value for shortcut (#526) 5 years ago
Thomas Steiner d24b9c4d78 Update to browser-nativefs v0.1.0 (#523) 5 years ago
Günay Mert Karadoğan 926b4f24e6 Draw horizontal/vertical lines/arrows when shift pressed (#430)
* Draw horizontal/vertical lines/arrows when shift pressed

* Refactor resizing with delta

* Resize arrows/lines perfectly when shift pressed
5 years ago
Enzo Ferey dfb7c2b744 Add app state to history (#309)
* Add app state to history.

* Pick missing state keys.

* Fix bug.

* Remove force update.
5 years ago
lissitz 3f1075cbcd fix: slider value resets to the default value when opacity is 0 (#516) 5 years ago
Lipis 48024c9116
Remove selected object when storing to backend (#506) 5 years ago
Fernando Alava Zambrano a436e70764 Internationalization followup (#500)
* add translations in data.ts

* add language list
add spanish version

* fixes pr review

* add more translations

* remove unused label

Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
Timur Khazamov 362cd74a9b Render only visible elements (#415)
* Render only visible elements

* Fixed exporting as PNG

* Moved isVisibleElement to module scope

* rerun-ci

Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
David Luzar 4942a452e0
Lint tweaks (#502)
* lint json files & add lint ignore list

* lint against plain console logs

* Update .lintstagedrc.js

Co-Authored-By: Lipis <lipiridis@gmail.com>

* format .tsconfig

* don't lint against console.info

* change log to console.info

Co-authored-by: Lipis <lipiridis@gmail.com>
5 years ago
Bakhtiiar Muzakparov bef279417e fix: cursor on keyboard tool toggle (#482)
* update events for GH actions to include PRs

* fix: cursor on keyboard tool toggle

* fix: change cursor type to constant

* fix: swap condition

Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
Thomas Steiner d1fb824369
Move file system operations to separate module (#510) 5 years ago
lissitz dc0a4f4cb8 fix: Preview image is being stretched when the proportions are w… (#503)
Fixes #490. Preserves the ratio of the preview image when width / height reaches max-width/max-height
5 years ago
Dvir Azulay a856ce06e9 Allow dragging transparent elements when selected (#508)
* Allow dragging transparent elements when selected

Addresses #339

* Update package.json
5 years ago
Lipis d30498a289 Pointer for Tool icons (#501) 5 years ago
lissitz 3de48d2893 fix: Transparent backgrounds result in bleed (#499) 5 years ago
Max Stoiber e657372ae4 Fix typo in "Opacity" (#489) 5 years ago
David Luzar 20cf1078fc
add top error boundary & reset localStorage on error (#493)
* add top error boundary & reset localStorage on error

* add issue tracker details and link

* add pointer cursor to buttons

* Update src/bug-issue-template.js

Co-Authored-By: Lipis <lipiridis@gmail.com>

* Update src/styles.scss

Co-Authored-By: Lipis <lipiridis@gmail.com>

* Update src/bug-issue-template.js

Co-Authored-By: Lipis <lipiridis@gmail.com>

* use open-color colors

* use Cascadia font

Co-authored-by: Lipis <lipiridis@gmail.com>
5 years ago
Jilles Soeters a72a143c84 Introduce Shapelock (#480)
* Introduce shape lock

* Format code with prettier

* Do not reset elementLocked on selection change

* Don't set isSelected to true if element is locked

* Don't reset the cursor

* Move reset cursor call to better spot

* Run prettier + lint
5 years ago
David Luzar 2340dddaad Sync panel props to editing element (#470)
* ensure panel props are sync to editing elem

* ensure we don't create empty-text elements (fixes #468)

* remove dead code

Co-authored-by: Christopher Chedeau <vjeuxx@gmail.com>
5 years ago
Fernando Alava Zambrano ff7a340d2f Internationalization support (#477)
* add i18next lib
add some translations

* add translations

* fix font-family

* fix pin versions
5 years ago
Guillermo Peralta Scura 1a03a29025 Use relative CSS units (#484) 5 years ago
Panayiotis Lipiridis 183a62627c id 5 years ago
Panayiotis Lipiridis 703d1e42e3 id instead of json 5 years ago
Lipis a210f442f4 Store background color in backend (#475)
* Store background color in backend

* Background
5 years ago
Lipis 4487e9af8a
Switch hashes to smaller IDs for the backend (#474)
* Update backend

* log
5 years ago
David Luzar d44c4ca2d8 flush autosave on unload (#473) 5 years ago
wei 37e082fcdc feat: Add Cascadia font (#465)
* adding cascadia font

* adding font file
5 years ago
Brady Madden 6ad596e9f1 Share excalidrawings as links! (#356)
* shareable links

* fix

* review comments

* json-excaliber (#464)

* draw

* Boom

* backend

* Remove local

Co-authored-by: Lipis <lipiridis@gmail.com>
5 years ago
Lipis 13e14b4d64 Change the font family names (#462) 5 years ago
David Luzar 0097652b79 disallow shape selection during creation (#449) 5 years ago
Faustino Kialungila 61be0f7b61
Render text actions panel on double click (#450)
* Render text actions panel on double click

* cleanup wysiwyg on click

* use `state.editingElement` instead of global to determine whether t ext panel is shown

* clarify comment

Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
Guillermo Peralta Scura 3715da9966
Remove not needed nesting for resize (#460) 5 years ago
Guillermo Peralta Scura 7ae52f1164
Add ColorInput component (#455)
* Add ColorInput component

* Use valid color on input blur

* Darken input text and add labels
5 years ago
Christopher Chedeau 7f6e1f420e
Pure node rendering (#443) 5 years ago
Mike Lewis 5ce5e5ac1e Adjust type of data URI when saving (#452)
Previously the type used for the data URI when saving was text/plain.
On iPad, this caused the file to automatically have a .txt extension
added (so files ended up with names like "drawing-xyz.json.txt"). This
meant that the files couldn't be loaded by the tool, which expects only
files with a .json extension.

Now, the type used is application/json, which means that the files get
saved with the correct extension and can be successfully loaded on iPad.
5 years ago
Günay Mert Karadoğan d505c6615d Fix reversed cursor issues on resize with bi-directional cursors (#451) 5 years ago
Faustino Kialungila 86cb228df4 Trim wysiwyg text to avoid misalignment on Firefox (#454) 5 years ago
Faustino Kialungila bbabf33d78 Render shape action on tool selected (#448) 5 years ago
Sosuke Suzuki 5563dd30d7 Modify to ignore enter-key in IME composing (#446) 5 years ago
Sosuke Suzuki 4180485eef Disable shortcuts for shapes while dragging the selection (#447) 5 years ago
Lipis 67aed07b72 Subtle border around the color picker (#442)
* Subtle border around the color picker

* Rename
5 years ago
Lipis 61d5615a81 Change order of Text and Line (#435) 5 years ago
Lipis 70b88a6a53
Force lowercase for the color inputs (#423) 5 years ago
Abhishek Kulshrestha 31403ab373 Bug 389 (#428)
* paste inside the viewport

* Buttons in top left panel aren't horizontally centered
5 years ago
JavaScript Joe b2d3d6eca3 fix: replace Draftsman with Architect (#427) 5 years ago
David Luzar 6892348c3d Revert 400 and 420 (#422)
* revert #400 font file

* Revert "Revert "Set scale for export images (#416)" (#420)"

This reverts commit d603921234.
5 years ago
Timur Khazamov d603921234
Revert "Set scale for export images (#416)" (#420)
This reverts commit 82f559f826.
5 years ago
Timur Khazamov 82f559f826
Set scale for export images (#416) 5 years ago
Thomas Steiner 7ddc206b8c
Add Native File System API saving/exporting and opening (#388)
* Add Native File System API saving/exporting

* Add Native File System API opening

* Add origin trial token placeholder

* Reuse an opened file handle for better saving experience

* Fix file handle reuse to only kick in for Excalidraw files

* Remove reference
5 years ago
Lipis f4d4b323e1 Update colors from open colors (#406)
* Update to open colors

* Update more

* More colors

* Dahh

* More

* Border none

* More

* Update
5 years ago
Günay Mert Karadoğan 8bc049a0b9 Remove resized element if it is invisibly small (#405) 5 years ago
JavaScript Joe e5e0e37f23 feat: update font file and add meta tags (#400)
* fix: add new, smaller FG_Virgil file

* fix: update with new codesandbox font file link

* feat: add og-image and meta tags

* feat: add pr template

* fix: update pr template

* fix: remove pr template

* refactor: remove twitter meta in favor of og:image

* fix: add og:image:width

* refactor: update image

* refactor: use image in readme
5 years ago
Lipis 8154ccd907 No named colors and lowercase hex (#395)
* No named colors and lowercase hex

* consistent
5 years ago
JavaScript Joe 1ae3c64860 fix(font): modify exclamation point in font (#394)
* fix: add new modified FG_Virgil font

* fix: update codesandbox links to use modified virgil font

* fix: typo in Contributing
5 years ago
Lipis cb8d866c33 Open colors (#378)
* Add open colors

* More colors

* Update colors

* Shade 0
5 years ago
Günay Mert Karadoğan 4ecc734659 Fix #360 prevent creating invisibly small elements (#387) 5 years ago
Jilles Soeters 2a8e562e98 Add numeric hotkeys (#380)
* Add numeric hotkeys

* Nit: add space after comma
5 years ago
Brady Madden a3aa57d98b
Add AppState to export json to fix various import bugs (#358)
* export background, app state

* review comments
5 years ago
David Luzar 0e56cd4f56 pan canvas on wheel button drag (#375)
* pan canvas on wheel button drag

* make mousemove passive
5 years ago
Shane O'Sullivan 80cee4d3c0 Add a title for the Export button as it was missing one (#376) 5 years ago
Bakhtiiar Muzakparov 8db8827c6f feat: add line shape (#371)
* feat: add line shape

* fix: align line tool

* fix: hitbox bug sw to ne

* fix: add stroke width n sloppiness  for line

* fix: center line inside a panel box

* fix: use color as a unique key
5 years ago
David Luzar 42968ef44d enable curveFitting & bump roughjs (#373) 5 years ago
Faustino Kialungila 657014466c Active styles bg color (#372)
* Active styles bg color

* fix whitespace

Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
Timur Khazamov 79aee53ff6 Redesign idea (#343)
* Redisign idea

* Code cleanup

* Fixed to right container

* Reoredered layout

* Reordering panels

* Export dialog

* Removed redunant code

* Fixed not removing temp canvas

* Fixed preview not using only selected elements

* Returned file name on export

* Toggle export selected/all elements

* Hide copy to clipboard button if no support of clipboard

* Added border to swatches

* Fixed modal flickering
5 years ago
David Luzar 8104c8525d ensure contextMenu doesn't overflow viewport (#364) 5 years ago
Preet 8dbd1b80df Update to rough.js 4.0.1 (#363)
* upgrade to latest rough.js

* remove random.ts because roughjs now supports seeding.
5 years ago
Timur Khazamov bc2bae2a9a Shift drag to add to selection (#355)
* Shift drag to add to selection

* Inlined variable
5 years ago
Guillermo Peralta Scura 4c62cbf57e Don't show resize cursor if multiple elements are selected (#353) 5 years ago
Christopher Chedeau f91b708abb
Revert "Shift drag to add to selection (#350)" (#352)
This reverts commit ce467f7b65.
5 years ago
Timur Khazamov ce467f7b65 Shift drag to add to selection (#350) 5 years ago
David Luzar 58ad6d741d fix selecting elem inside already selected element (#349) 5 years ago
David Luzar 5887be6eda select filled elements by clicking inside (#340) 5 years ago
Guillermo Peralta Scura c67435719f Use cursor delta to resize shape (#341) 5 years ago
Jeremy Press abf2aaa102 "Select All" only appears when clicking outside of a shape via actionFilter (#329)
Co-authored-by: Christopher Chedeau <vjeuxx@gmail.com>
5 years ago
Enzo Ferey 88a9cee8bb History improvements (#337)
* Simplified redoOnce.

* Help mental model.

* Move clear redo stack where it belongs.

* Not needed anymore as we check for same state.
5 years ago
Gasim Gasimzada ba8bc10431 Remove element shape object from local storage save (#336) 5 years ago
Christopher Chedeau bc909b76da
Move copy paste handler to document (#334)
Hopefully it should resolve the copy pasting issues

Fixes #249
5 years ago
Christopher Chedeau aad6e8f434
Reset to selection after creating a text (#333)
Fixes #252

Test plan:
- Click on text icon
- Click anywhere to start entering text
- Add a letter
- Make sure the cursor is selection and not text
- Click anywhere else, make sure it completes the text and not create a new one
5 years ago
Christopher Chedeau 44657efe71
Fix undoOnce (#332)
I just pasted @enzoferey's implementation and it fixed the bug reported by @dwelle

Fixes #307
5 years ago
Christopher Chedeau dd2a7eb597
Fix copy-paste on input (#331)
If the input is active, we shouldn't override copy paste behavior
5 years ago
Christopher Chedeau d45f48e60f
Set shape background to be transparent by default (#330)
Also makes "Clear canvas" reset the entire app state
5 years ago
Christopher Chedeau 3db7d69849
Debounce localstorage save (#328)
I profiled dragging and it looks like it takes ~3ms to save to localStorage a smallish scene and we're doing it twice per mousemove. Let's debounce so we don't pay that cost on every mouse move.

Stole the implementation from #220 which got reverted.
5 years ago
Christopher Chedeau c745fd4e5e
Prevent cmd-r from selecting rectangle (#327)
I keep adding empty rectangles because I reload with cmd-r which enables rectangle :p Let's only make the shortcut work if there's no modifier enabled
5 years ago
Christopher Chedeau 407f00bbd5
Fix alt-duplicate (#326)
We need to unselect all the previous elements and select all the new ones. Also made sure that the shape is regenerated when the element is duplicated
5 years ago
Christopher Chedeau 8785bef523
Support transparent background + inline picker (#325)
Unfortunately, react-color has a bug where transparent color doesn't trigger onChange. I've been annoyed by the huge dependency anyway so decided to take the generated html (which is awesome) and reimplement a specific component for it.

I also made sure that we don't actually render anything when the background is transparent on rough (I looked at the generated path and made sure it didn't have the commands for the background)
5 years ago
Christopher Chedeau 157f0eae0c
Export to canvas only selected elements (#323)
Fixes #308
5 years ago
Christopher Chedeau 9fa69448e4
Remove Delete from panel (#322)
Now that we have context menu, we don't need it there
5 years ago
Christopher Chedeau 5bdd0a35f6
Fix cmd-a drawing arrows (#321)
We need to quit if we have either elements OR appState, not both.
5 years ago
Gasim Gasimzada 74764b06eb Regenerate roughjs shape only when the item is updated (#316)
* Regenerate roughjs shape only when the item is updated

* Remove shape object during export and history undo/redo

* Remove shape element during copying

* Fix shape generation during creation
5 years ago
Christopher Chedeau 1bf18fe4ed
Tweak context menu style (#320)
- Move the context menu right next to the mouse so it's not so far away. But 1px out so that nothing is selected until you move your mouse
- Change the colors to be closer to the macos one. Unfortunately, macos has a 0.5px border that I'm not able to reproduce without some annoying hacks, 1px it'll be.
5 years ago
Christopher Chedeau b481a29024
Remove console.log (#317) 5 years ago
Enzo Ferey c6accd9fc7 Improve color suggestions (#304)
* Add palettes for each type of color picker.

* Add white canvas background and black element stroke.

* Add white for element background.
5 years ago
Christopher Chedeau 6399b1f318
Remove zindex options from panel (#315)
Now that they are in the context menu, we don't need to have them in the panel anymore.

Fixes #242
5 years ago
Timur Khazamov 8f28c59deb Removed SceneState from renderElement (#301) 5 years ago
Gasim Gasimzada 76467073f2 Use `innerText` instead of `innerHTML` when measuring text (#312) 5 years ago
Gasim Gasimzada f465121f9b Feature: Action System (#298)
* Add Action System

- Add keyboard test
- Add context menu label
- Add PanelComponent

* Show context menu items based on actions

* Add render action feature

- Replace bringForward etc buttons with action manager render functions

* Move all property changes and canvas into actions

* Remove unnecessary functions and add forgotten force update when elements array change

* Extract export operations into actions

* Add elements and app state as arguments to `keyTest` function

* Add key priorities

- Sort actions by key priority when handling key presses

* Extract copy/paste styles

* Add Context Menu Item order

- Sort context menu items based on menu item order parameter

* Remove unnecessary functions from App component
5 years ago
Timur Khazamov c253c0b635 Command clicking should "xor" selection (#300)
* Command clicking should "xor" selection

* Only shift key should play a role

* Get rid of `isDraggingElements`

* Renamed someElementIsDragged to draggingOccured
5 years ago
Gunay Mert Karadogan 3eb6d1de68 Fix history saving for resizing/dragging element (#292) 5 years ago
dwelle 81f23a8ccb fix text shape contenteditable & paste handling (fixes #293) 5 years ago
Gasim Gasimzada f2346275ef
Extract Side Panel from App component (#295)
* Extract Side Panel from App component

* Refactor SidePanel component

- Remove unnecessary props (we are already passing appState as a prop)
- Remove unnecessary allback (we are already passing setState)
5 years ago
Gasim Gasimzada 35b5f6dd0d Fix a bug where clipboard object doesn't exist in Safari (#296) 5 years ago
David Luzar 2fb3cdd5e4
fix copy/paste regression (#291) 5 years ago
David Luzar deee57314d
support export canvas to clipboard (#232) 5 years ago
Giovanni Giordano 1541428ab1 Clear active tool on escape (#286)
* Clear active tool on escape

* Remove console log
5 years ago
Gasim Gasimzada 862231da4f Make all operations on elements array immutable (#283)
* Make scene functions return array instead of mutate array

- Not all functions were changes; so the given argument was a new array to some

* Make data restoration functions immutable

- Make mutations in App component

* Make history actions immutable

* Fix an issue in change property that was causing elements to be removed

* mark elements params as readonly & remove unnecessary copying

* Make `clearSelection` return a new array

* Perform Id comparisons instead of reference comparisons in onDoubleClick

* Allow deselecting items with SHIFT key

- Refactor hit detection code

* Fix a bug in element selection and revert drag functionality

Co-authored-by: David Luzar <luzar.david@gmail.com>
5 years ago
Faustino Kialungila 1ea72e9134
Center element on paste (#248)
* Center element on paste

* paste on cursor position

* correctly center elements

* rename vars
5 years ago
Guillermo Peralta Scura 4a044d3ace Show move and resize cursors on hover (#280)
* Change to move cursor on hover

* Show resize handlers on hover
5 years ago
davidbonan a16cd3a34f Add font size and font familly option for selection (#278)
* Add font size and font familly option for selection

* Allow copy font style

* More clearner method name

* Update options size and font-familly
5 years ago
Gasim Gasimzada 299e7e9099
Extract app and keys (#276)
* Extract app component from entrypoint (index)

- Use refs to refer to canvas and rough context
- Remove ReactDOM double rendering

* Extract keys and key related utils into their own module

* Move everything back to entrypoint
5 years ago
Gasim Gasimzada 36ce6a26e6 Make panels collapsible (#239)
* Make panels collapsible

- Add Panel component with collapse logic
- Use the component in all the necessary panel groups

* Remove unnecessary container from PanelCanvas

* Add "hide property" to Pane component to hide Panel contents using a prop

- Instead of doing conditional rendering, pass the condition to Panel as props

* Change collapse icon rotation for closed

- Use one icon and use CSS transforms to rotate it

* Remove unnecessary imports from PanelSelection
5 years ago
Timur Khazamov e38f65dea7
Contenteditable wysiwyg (#274)
* Contenteditable wysiwyg

* Added comment about pasting multiline text
5 years ago
Timur Khazamov 1739540f00
Creating a text near the center of a shape should put it in the center (#270)
* Snap to element center

* Fixed typo

* Added comment

* Reduced threshold to 30

* Skip snapping if alt key is pressed

* Fixed creating text with shape tool
5 years ago
David Luzar 068dca604f
prevent commit on eslint warnings & fix lint (#268) 5 years ago
Timur Khazamov 37934c0f8b
Fixes text jumping on creation (#266)
* Fixes text jumping on creation

* Do not remove node on ESC

* Fixed typo
5 years ago
David Luzar 2122a9cf9f
fix for duplicating elements (#261) 5 years ago
David Luzar 58ec6567ae ensure alt+drag duplicates all selected elems (#258) 5 years ago
dwelle 08b804ac63 ensure only selected elems can be resized (fixes #256) 5 years ago
dwelle 009412a093 improve typing for handlerRectangles 5 years ago
Jeremy Scatigna e7bf034fef duplicate element by alt dragging (#255) 5 years ago
Gasim Gasimzada 4b7eb2f04a
Add IDs to elements (#236)
* Add IDs to elements

- Move round rect function within the renderer

* Generate IDs using nanoid

* If element ID does not exist, add the ID during restoration
5 years ago
Timur Khazamov 2f9aa0e3ca Async loading of TwitterPicker (#246) 5 years ago
Timur Khazamov 2d66616e3f Fixed: Copy + Paste moves text inside rectangle #229 (#245) 5 years ago
Faustino Kialungila 846f427732 adding comments about diamond dimensions (#241) 5 years ago
Timur Khazamov 10955f8bb0 Wysiwyg text 2.0 (#238)
* Fixed cleaning handlers after cleanup

* Double click to edit text

* Preserve text styles on change
5 years ago
Timur Khazamov ae982e9298 Revert "Save scene in URL (#220)" (#234)
This reverts commit db973c61e8.
5 years ago
Gasim Gasimzada 829a65b8cb
Refactor Element Functions (#233)
* Remove `generatedraw` from element object

- Create a function that renders a single element
- Refactor rendering selected elements

* Replace getElementAbsoluteXY with getElementAbsoluteCoords
5 years ago
Gasim Gasimzada 85365e5bcb
Extract Sidebar panels into separate components (#230)
* Extract Sidebar panels into separate components

* Add Jest TS types
5 years ago
Faustino Kialungila 2fb5c4cd13 Add styles copy and pasting in the context menu (#227) 5 years ago
Christopher Chedeau f2665408fc
Revert "Wysiwyg text (#200)" (#225)
This reverts commit abbc04df0e.
5 years ago
Timur Khazamov db973c61e8 Save scene in URL (#220)
Co-authored-by: Christopher Chedeau <vjeuxx@gmail.com>
5 years ago
Timur Khazamov abbc04df0e Wysiwyg text (#200) 5 years ago
Anirban Sengupta b2eb2807cc Use Ctrl instead of Cmd for keyboard shortcuts on Windows (#216)
Co-authored-by: Christopher Chedeau <vjeuxx@gmail.com>
5 years ago
Timur Khazamov 257f697a98 Context menu with some commands (#217) 5 years ago
Faustino Kialungila 9305a33dba
Copy and paste styles (#219)
* copy and paste styles

* save copied styles in memory
5 years ago
David Luzar 1443cf1cd5
implement shift+resize for all sides (#210) 5 years ago
Abhishek Kulshrestha b12ea7de3e paste inside the viewport (#214) 5 years ago
Faustino Kialungila 5ade8987e4
Fixes pasting colors in color picker (#215)
* improve lozenge dimensions

* fix pasting colors in color picker input
5 years ago
Timur Khazamov 7bf0184499
Fixed ellipse hit test if sizes are negative (#205) 5 years ago
Gasim Gasimzada d0365933a9
Extract history (#213)
* Extract History into its own module

* Encapsulate undo and redo actions within history

* Encapsulate clearing redo stack within History

* Add private access modifiers to scene history class member variables

* Remove duplicate files
5 years ago
Gasim Gasimzada 054669cfef
Extract components and shapes into their respective modules (#212) 5 years ago
Gasim Gasimzada 86a1c29eec
Extract scene functions to their respective modules (#208)
- Also, extract utilities into utils module -- capitalizeString, getDateTime, isInputLike
5 years ago
Gasim Gasimzada 01805f734d
Extract element functions into modules (#207) 5 years ago
Gasim Gasimzada e3eef04e00 Move math and random files into their respective modules (#198)
* Move math and random files into their respective modules

- Move distanceBetweenPointAndSegment to math module
- Move LCG, randomSeed, and withCustomMathRandom to random module

* Add everything else back
5 years ago
Faustino Kialungila b3667000e2
improve lozenge dimensions (#197) 5 years ago
Guillermo Peralta Scura ea534dd535 Implement redo (#191) 5 years ago
Christopher Chedeau 3bbcb9cbdc
Improve Color Picker *2 (#195) 5 years ago
Christopher Chedeau 23cd62d148
Improve selection view (#192) 5 years ago
Paulo Menezes d5c6dd49a2 Styles fix (#190)
* Styles improvements

* Default values when restore elements
5 years ago
Paulo Menezes feefb14bf5 Double click to add text (#184)
* Double click to add text

* Remove duplicate code

* Add text improvements

* Cast element to text element
5 years ago
Paulo Menezes f360c3cb33 Change styles (#179)
* Fill style

* Roughness, opacity and more styles

* Remove duplicated options

* Support diamonds

* Remove unused import

* Fix typo and remove react import
5 years ago
Faustino Kialungila 4be88c9c58 Adding diamond shape (#159)
* Adding diamond shape

* hittest diamond shape

* fix x,y arguments

* renaming
5 years ago
Christopher Chedeau fd6b5024c7
Reorganize menu (#178) 5 years ago
IA 5f806474e3 Allow user to set file name (#145)
* Allow user to set file name

* Add EditableText component

Added editable text component and use component for project name edit.

* rebased branch

* Updated EditableText component

* Set default project name

* Move project name field away from the top section.
5 years ago
Timur Khazamov 7201198f23
Better scrollbars (#177)
* Better scrollbars

* Get rid of all unused options
5 years ago
Jared Palmer b5c67260d7 Improved color picker (#174)
* Add react-color

* Prettier

* Better styles

* Use enum for color pickers instead of strings

* Run prettier on .scss file
5 years ago
Timur Khazamov e7e676e1eb
Merge pull request #171 from nanot1m/arrows-start-end-points
Adjust arrow start/end points
5 years ago
Giovanni Giordano be41bd0f1c
Merge pull request #168 from nanot1m/fix-square-selection
Square selection should work in all directions
5 years ago
hazam d4693e0b37 Adjust arrow start/end points 5 years ago
Jared Palmer 15251e6c61 Add titles to shape buttons with key shortcuts 5 years ago
hazam 8c1af23d59 Square selection should work in all directions 5 years ago
Timur Khazamov 910b30a08a Dragging scrollbars (#161) 5 years ago
Giovanni Giordano d61ecca184
Merge pull request #156 from gipsy-king/textmeasure-actualboundingbox
fallback if TextMeasure.actualBoundingBox* unavailable
5 years ago
Benjamin Große 2feedbdbb7 fallback if TextMeasure.actualBoundingBox* unavailable 5 years ago
Giovanni Giordano 02daf6ffbd Recover index.tsx 5 years ago
Giovanni Giordano c4f4f18b81 Remove deploy files 5 years ago
Lucas Azzola 7c321b49ab Add save/load functionality from file (#146)
Fixes #143
5 years ago
Lucas Azzola 30ccaf0152 Set the cursor to 'crosshair' when expected to draw (#142)
* Set the cursor to 'crosshair' when expected to draw

And reset it back to default on mouse up.

Fixes #102

* Also reset cursor on text selection

* Use 'text' cursor for text
5 years ago
Christopher Chedeau 85fe9f85fb
Fix missing mouseup (#144) 5 years ago
Christopher Chedeau 9e5c5daf64
Cmd-Z (#141) 5 years ago
Christopher Chedeau 4ca8f65887
Use device pixel ratio (#139)
* Use device pixel ratio

* Update index.tsx
5 years ago
Brady Madden 4ad49ff970
Merge pull request #137 from bradymadden97/master
[bugfix] fix drag out of window for move/resize shape
5 years ago
Brady Madden ec28c83626 fix other drag issues 5 years ago