* Deal with users on systems that don't handle emoji
* Leave no trailing space
* Move function to utils, and actually call it 🤣
Chapeau, TypeScript!
* Use grinning face instead of koala
* Tweak globalAlpha
* 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
* 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>
* 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
* 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>
* don't use unicode characters for shortcut help
* use option instead of alt
* make shortcut replacement case-insensitive
* improve shortcut dialog layout
* 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
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.
* 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>
* 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>
* Revert "Revert "Feature: Multi Point Arrows (#338)" (#634)"
This reverts commit 3d2e59bfed4fa41a0cae49ee567a6f95ca26e7bf.
* 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>
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
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
* 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>
* 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.