* feat: support creating text containers programatically
* fix
* fix
* fix
* fix
* update api to use label
* fix api and support individual shapes and text element
* update test case in package example
* support creating arrows and line
* support labelled arrows
* add in package example
* fix alignment
* better types
* fix
* keep element as is unless we support prog api
* fix tests
* fix lint
* ignore
* support arrow bindings via start and end in api
* fix lint
* fix coords
* support id as well for elements
* preserve bindings if present and fix testcases
* preserve bindings for labelled arrows
* support ids, clean up code and move the api related stuff to transform.ts
* allow multiple arrows to bind to single element
* fix singular elements
* fix single text element, unique id and tests
* fix lint
* fix
* support binding arrow to text element
* fix creation of regular text
* use same stroke color as parent for text containers and height 0 for linear element by default
* fix types
* fix
* remove more ts ignore
* remove ts ignore
* remove
* Add coverage script
* Add tests
* fix tests
* make type optional when id present
* remove type when id provided in tests
* Add more tests
* tweak
* let host call convertToExcalidrawElements when using programmatic API
* remove convertToExcalidrawElements call from restore
* lint
* update snaps
* Add new type excalidraw-api/clipboard for programmatic api
* cleanup
* rename tweak
* tweak
* make image attributes optional and better ts check
* support image via programmatic API
* fix lint
* more types
* make fileId mandatory for image and export convertToExcalidrawElements
* fix
* small tweaks
* update snaps
* fix
* use Object.assign instead of mutateElement
* lint
* preserve z-index by pushing all elements first and then add bindings
* instantiate instead of closure for storing elements
* use element API to create regular text, diamond, ellipse and rectangle
* fix snaps
* udpdate api
* ts fixes
* make `convertToExcalidrawElements` more typesafe
* update snaps
* refactor the approach so that order of elements doesn't matter
* Revert "update snaps"
This reverts commit 621dfadccfea975a1f77223f506dce9d260f91fd.
* review fixes
* rename ExcalidrawProgrammaticElement -> ExcalidrawELementSkeleton
* Add tests
* give preference to first element when duplicate ids found
* use console.error
---------
Co-authored-by: dwelle <luzar.david@gmail.com>
* init
* add: vite dev build working
* fix: href serving from public
* feat: add ejs plugin
* feat: migrated env files and ejs templating
* chore: add types related to envs
* chore: add vite-env types
* feat: support vite pwa
* chore: upgrade vite pwa
* chore: pin node version to 16.18.1
* chore: preserve use of nodejs 14
* refactor: preserve REACT_APP as env prefix
* chore: support esm environment variables
* fix ts config
* use VITE prefix and remove vite-plugin-env-compatible
* introduce import-meta-loader for building pacakge as webpack isn't compatible with import.meta syntax
* lint
* remove import.meta.env in main.js
* set debug flag to false
* migrate to vitest and use jest-canvas-mock 2.4.0 so its comp
atible with vite
* integrate vitest-ui
* fix most of teh test
* snaps
* Add script for testing with vite ui
* fix all tests related to mocking
* fix more test
* fix more
* fix flip.test.tsx
* fix contentxmenu snaps
* fix regression snaps
* fix excalidraw.test.tsx and this makes all tests finally pass :)
* use node 16
* specify node version
* use node 16 in lint as well
* fix mobile.test.tsx
* use node 16
* add style-loader
* upgrade to node 18
* fix lint package.json
* support eslint with vite
* fix lint
* fix lint
* fix ts
* remove pwa/sw stuff
* use env vars in EJS the vite way
* fix lint
* move remainig jest mock/spy to vite
* don't cache locales
* fix regex
* add fonts cache
* tweak
* add custom service worker
* upgrade vite and create font cache again
* cache fonts.css and locales
* tweak
* use manifestTransforms for filtering locales
* use assets js pattern for locales
* add font.css to globIgnore so its pushed to fonts cache
* create a separate chunk for locales with rollup
* remove manifestTransforms and fix glob pattern for locales to filter from workbox pre-cache
* push sourcemaps in production
* add comments in config
* lint
* use node 18
* disable pwa in dev
* fix
* fix
* increase limit of bundle
* upgrade vite-pwa to latest
* remove public/workbox so workbox assets are not precached
* fon't club en.json and percentages.json with manual locales chunk to fix first load+offline mode
* tweak regex
* remove happy-dom as its not used
* add comment
* use any instead of ts-ignore
* cleanup
* remove jest-canvas-mock resolution as vite-canvas-mock was patched locking deps at 2.4.0
* use same theme color present in entry point
* remove vite-plugin-eslint as it improves DX significantly
* integrate vite-plugin-checker for ts errors
* add nabla/vite-plugin-eslint
* use eslint from checker only
* add env variable VITE_APP_COLLAPSE_OVERLAY for collapsing the checker overlay
* tweak vite checker overlay badge position
* Enable eslint behind flag as its not working well with windows with non WSL
* make port configurable
* open the browser when server ready
* enable eslint by default
---------
Co-authored-by: Weslley Braga <weslley@bambee.com>
Co-authored-by: dwelle <luzar.david@gmail.com>
* init
* add: vite dev build working
* fix: href serving from public
* feat: add ejs plugin
* feat: migrated env files and ejs templating
* chore: add types related to envs
* chore: add vite-env types
* feat: support vite pwa
* chore: upgrade vite pwa
* chore: pin node version to 16.18.1
* chore: preserve use of nodejs 14
* refactor: preserve REACT_APP as env prefix
* chore: support esm environment variables
* fix ts config
* use VITE prefix and remove vite-plugin-env-compatible
* introduce import-meta-loader for building pacakge as webpack isn't compatible with import.meta syntax
* lint
* remove import.meta.env in main.js
* set debug flag to false
* migrate to vitest and use jest-canvas-mock 2.4.0 so its comp
atible with vite
* integrate vitest-ui
* fix most of teh test
* snaps
* Add script for testing with vite ui
* fix all tests related to mocking
* fix more test
* fix more
* fix flip.test.tsx
* fix contentxmenu snaps
* fix regression snaps
* fix excalidraw.test.tsx and this makes all tests finally pass :)
* use node 16
* specify node version
* use node 16 in lint as well
* fix mobile.test.tsx
* use node 16
* add style-loader
* upgrade to node 18
* fix lint package.json
* support eslint with vite
* fix lint
* fix lint
* fix ts
* remove pwa/sw stuff
* use env vars in EJS the vite way
* fix lint
* move remainig jest mock/spy to vite
* don't cache locales
* fix regex
* add fonts cache
* tweak
* add custom service worker
* upgrade vite and create font cache again
* cache fonts.css and locales
* tweak
* use manifestTransforms for filtering locales
* use assets js pattern for locales
* add font.css to globIgnore so its pushed to fonts cache
* create a separate chunk for locales with rollup
* remove manifestTransforms and fix glob pattern for locales to filter from workbox pre-cache
* push sourcemaps in production
* add comments in config
* lint
* use node 18
* disable pwa in dev
* fix
* fix
* increase limit of bundle
* upgrade vite-pwa to latest
* remove public/workbox so workbox assets are not precached
* fon't club en.json and percentages.json with manual locales chunk to fix first load+offline mode
* tweak regex
* remove happy-dom as its not used
* add comment
* use any instead of ts-ignore
* cleanup
* remove jest-canvas-mock resolution as vite-canvas-mock was patched locking deps at 2.4.0
* use same theme color present in entry point
---------
Co-authored-by: Weslley Braga <weslley@bambee.com>
Co-authored-by: dwelle <luzar.david@gmail.com>
* fix: introduce baseline to fix the layout shift when switching to text editor
* uncomment
* change offset to 8pixels
* [debug]
* introduce DOM baseline in canvas rendering instead
* introduce baseline in element making it backward compat
* fix
* lint
* fix
* update baseline when resizing text element
* fix safari backward compat
* fix for safari
* lint
* reduce safari LS
* floor line height and height when dom height increases than canvas height
* Revert "floor line height and height when dom height increases than canvas height"
This reverts commit 8de65168238b8fb9a638e0c75f596f371983c2c7.
* cleanup
* use DOM height only for safari to fix LS
* Revert "use DOM height only for safari to fix LS"
This reverts commit d75889238da59b7954ec3a6ac2c29dc0ba420635.
* fix lint and test
* fix
* calculate line height by rounding off instead of DOM
* cleanup
---------
Co-authored-by: dwelle <luzar.david@gmail.com>
* feat: add line height attribute to text element
* lint
* update line height when redrawing text bounding box
* fix tests
* retain line height when pasting styles
* fix test
* create a util for calculating ling height using old algo
* update line height when resizing multiple text elements
* make line height backward compatible
* udpate line height for older element when font size updated
* remove logs
* Add specs
* lint
* review fixes
* simplify by changing `lineHeight` from px to unitless
* make param non-optional
* update comment
* fix: jumping text due to font size being calculated incorrectly
* update line height when font family is updated
* lint
* Add spec
* more specs
* rename to getDefaultLineHeight
* fix getting lineHeight for potentially undefined fontFamily
* reduce duplication
* fix fallback
* refactor and comment tweaks
* fix
---------
Co-authored-by: dwelle <luzar.david@gmail.com>
* feat: move to canvas measureText
* calcualte height with better heuristic
* improve heuristic more
* remove vertical offset as its not needed
* lint
* calculate width of individual char and ceil to calculate width and remove adjustment factor
* push the word if equal to max width
* update height when text overflows for vertical alignment top/bottom
* remove the hack of updating height when line mismatch as its not needed
* remove scroll height and calculate the height instead
* remove unused code
* fix
* remove
* use math.ceil for whole width instead of individual chars
* fix tests
* fix
* fix
* redraw text bounding box instead when font loaded to fix alignment as well
* fix
* fix
* fix
* Add a 0.05px extra only for firefox
* Add spec
* stop taking ceil and increase firefox editor width by 0.05px
* Ad 0.05px in safari too
* lint
* lint
* remove baseline from measureFontSizeFromWH
* don't redraw on font load
* lint
* refactor name and signature
* fix: improve text wrapping inside rhombus
* Add comments
* specs
* fix: shift resize and multiple element regression for ellipse and rhombus
* use container width for scaling font size
* fix
* fix multiple resize
* lint
* redraw on submit
* redraw only newly pasted elements
* no padding when center
* fix tests
* fix
* dont add padding in rhombus when aligning
* refactor
* fix
* move getMaxContainerHeight and getMaxContainerWidth to textElement.ts
* Add specs
* feat: support arrow with text
* render arrow -> clear rect-> render text
* move bound text when linear elements move
* fix centering cursor when linear element rotated
* fix y coord when new line added and container has 3 points
* update text position when 2nd point moved
* support adding label on top of 2nd point when 3 points are present
* change linear element editor shortcut to cmd+enter and fix tests
* scale bound text points when resizing via bounding box
* ohh yeah rotation works :)
* fix coords when updating text properties
* calculate new position after rotation always from original position
* rotate the bound text by same angle as parent
* don't rotate text and make sure dimensions and coords are always calculated from original point
* hardcoding the text width for now
* Move the linear element when bound text hit
* Rotation working yaay
* consider text element angle when editing
* refactor
* update x2 coords if needed when text updated
* simplify
* consider bound text to be part of bounding box when hit
* show bounding box correctly when multiple element selected
* fix typo
* support rotating multiple elements
* support multiple element resizing
* shift bound text to mid point when odd points
* Always render linear element handles inside editor after element rendered so point is visible for bound text
* Delete bound text when point attached to it deleted
* move bound to mid segement mid point when points are even
* shift bound text when points nearby deleted and handle segment deletion
* Resize working :)
* more resize fixes
* don't update cache-its breaking delete points, look for better soln
* update mid point cache for bound elements when updated
* introduce wrapping when resizing
* wrap when resize for 2 pointer linear elements
* support adding text for linear elements with more than 3 points
* export to svg working :)
* clip from nearest enclosing element with non transparent color if present when exporting and fill with correct color in canvas
* fix snap
* use visible elements
* Make export to svg work with Mask :)
* remove id
* mask canvas linear element area where label is added
* decide the position of bound text during render
* fix coords when editing
* fix multiple resize
* update cache when bound text version changes
* fix masking when rotated
* render text in correct position in preview
* remove unnecessary code
* fix masking when rotating linear element
* fix masking with zoom
* fix mask in preview for export
* fix offsets in export view
* fix coords on svg export
* fix mask when element rotated in svg
* enable double-click to enter text
* fix hint
* Position cursor correctly and text dimensiosn when height of element is negative
* don't allow 2 pointer linear element with bound text width to go beyond min width
* code cleanup
* fix freedraw
* Add padding
* don't show vertical align action for linear element containers
* Add specs for getBoundTextElementPosition
* more specs
* move some utils to linearElementEditor.ts
* remove only :p
* check absoulte coods in test
* Add test to hide vertical align for linear eleemnt with bound text
* improve export preview
* support labels only for arrows
* spec
* fix large texts
* fix tests
* fix zooming
* enter line editor with cmd+double click
* Allow points to move beyond min width/height for 2 pointer arrow with bound text
* fix hint for line editing
* attempt to fix arrow getting deselected
* fix hint and shortcut
* Add padding of 5px when creating bound text and add spec
* Wrap bound text when arrow binding containers moved
* Add spec
* remove
* set boundTextElementVersion to null if not present
* dont use cache when version mismatch
* Add a padding of 5px vertically when creating text
* Add box sizing content box
* Set bound elements when text element created to fix the padding
* fix zooming in editor
* fix zoom in export
* remove globalCompositeOperation and use clearRect instead of fillRect
* feat: support vertical text align for bound containers
* update icons
* use const
* fix lint
* rename to and show when text editor active
* don't update vertical align if not center
* fix svgs
* fix y coords when vertical align bottm
Co-authored-by: dwelle <luzar.david@gmail.com>
* feat: Support hypelinks
* dont show edit when link not present
* auto submit on blur
* Add link button in sidebar and do it react way
* add key to hyperlink to remount when element selection changes
* autofocus input
* remove click handler and use pointerup/down to show /hide popup
* add keydown and support enter/escape to submit
* show extrrnal link icon when element has link
* use icons and open link in new tab
* dnt submit unless link updated
* renamed ffiles
* remove unnecessary changes
* update snap
* hide link popup once user starts interacting with element and show again only if clicked outside and clicked on element again
* render link icon outside the element
* fix hit testing
* rewrite implementation to render hyperlinks outside elements and hide when element selected
* remove
* remove
* tweak icon position and size
* rotate link icon when element rotated, handle zooming and render exactly where ne resize handle is rendered
* no need to create a new reference anymore for element when link added/updated
* rotate the link image as well when rotating element
* calculate hitbox of link icon and show pointer when hovering over link icon
* open link when clicked on link icon
* show tooltip when hovering over link icon
* show link action only when single element selected
* support other protocols
* add shortcut cmd/ctrl+k to edit/update link
* don't hide popup after submit
* renderes decreased woo
* Add context mneu label to add/edit link
* fix tests
* remove tick and show trash when in edit mode
* show edit view when element contains link
* fix snap
* horizontally center the hyperlink container with respect to elemnt
* fix padding
* remove checkcircle
* show popup on hover of selected element and dismiss when outside hitbox
* check if element has link before setting popup state
* move logic of auto hide to hyperlink and dnt hide when editing
* hide popover when drag/resize/rotate
* unmount during autohide
* autohide after 500ms
* fix regression
* prevent cmd/ctrl+k when inside link editor
* submit when input not updated
* allow custom urls
* fix centering of popup when zoomed
* fix hitbox during zoom
* fix
* tweak link normalization
* touch hyperlink tooltip DOM only if needed
* consider 0 if no offsetY
* reduce hitbox of link icon and make sure link icon doesn't show on top of higher z-index elements
* show link tooltip only if element has higher z-index
* dnt show hyperlink popup when selection changes from element with link to element with no link and also hide popover when element type changes from selection to something else
* lint: EOL
* fix link icon tooltip positioning
* open the link only when last pointer down and last pointer up hit the link hitbox
* render tooltip after 300ms delay
* ensure link popup and editor input have same height
* wip: cache the link icon canvas
* fix the image quality after caching using device pixel ratio yay
* some cleanup
* remove unused selectedElementIds from renderConfig
* Update src/renderer/renderElement.ts
* fix `opener` vulnerability
* tweak styling
* decrease padding
* open local links in the same tab
* fix caching
* code style refactor
* remove unnecessary save & restore
* show link shortcut in help dialog
* submit on cmd/ctrl+k
* merge state props
* Add title for link
* update editview if prop changes
* tweak link action logic
* make `Hyperlink` compo editor state fully controlled
* dont show popup when context menu open
* show in contextMenu only for single selection & change pos
* set button `selected` state
* set contextMenuOpen on pointerdown
* set contextMenyOpen to false when action triggered
* don't render link icons on export
* fix tests
* fix buttons wrap
* move focus states to input top-level rule
* fix elements sharing `Hyperlink` state
* fix hitbox for link icon in case of rect
* Early return if hitting link icon
Co-authored-by: dwelle <luzar.david@gmail.com>
* fix: support collaboration in bounded text
* align implementation irrespective of collab/submit
* don't wrap when submitted
* fix
* tests: exit editor via ESCAPE instead to remove async hacks
* simplify and remove dead comment
* remove mutating coords in submit since its taken care in updateWysiwygStyle
Co-authored-by: dwelle <luzar.david@gmail.com>
* fix: don't mutate the bounded text if not updated when submitted
* dont update text for bounded text unless submitted
* add specs
* use node 16
* fix
* Update text when editing and cache prev text
* update prev text when props updated
* remove only
* type properly and remove unnecessary type checks
* cache original text and compare with editor value to fix alignement issue after editing and add specs
* naming tweak
Co-authored-by: dwelle <luzar.david@gmail.com>