Commit Graph

667 Commits (23f67c55d10afc237e197b1d9695bf497e45a530)

Author SHA1 Message Date
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