From 1d5e865da1353ff4ee9883bcf421357ff833ad16 Mon Sep 17 00:00:00 2001 From: zsviczian Date: Sun, 26 Feb 2023 20:48:47 +0100 Subject: [PATCH] update to latest master (#6286) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: fonts not rendered on init if `loadingdone` not fired (#5923) * fix: fonts not rendered on init if `loadingdone` not fired * remove unnecessary check * fix: Always bind to container selected by user (#5880) * fix: Always bind to container selected by user * Don't bind to container when using text tool * adjust z-index for bound text * fix * Add spec * Add test * Allow double click on transparent container and add spec * fix spec * adjust z-index only when binding * update index * fix * add index check * Update src/scene/Scene.ts Co-authored-by: dwelle * feat: changed text copy/paste behaviour (#5786) Co-authored-by: dwelle Co-authored-by: Antonio Della Fortuna * feat: Don't add midpoint until dragged beyond a threshold (#5927) * Don't add midpoint until dragged beyond a threshold * remove unnecessary code * fix tests * fix * add spec * remove isMidpoint * cleanup * fix threshold for zoom * split into shouldAddMidpoint and addMidpoint * wrap in flushSync for synchronous updates * remove threshold for line editor and add spec * [unrelated] fix stack overflow state update * fix tests * don't drag arrow when dragging to add mid point * add specs Co-authored-by: dwelle * refactor: remove unnecessary code (#5933) * fix: scale font correctly when using shift (#5935) * fix: scale font correctly when using shift * fix * Empty-Commit * Add spec * fix * fix: Dedupe boundElement ids when container duplicated with alt+drag (#5938) * Dedupe boundElement ids when container duplicated with alt+drag and add spec * set to null by default * fix: bindings do not survive history serialization (#5942) * fix: don't allow whitespaces for bound text (#5939) * fix: don't allow whitespaces for bound text * fix * remove * remove empty else * fix * fix * fix * feat: Support labels for arrow 🔥 (#5723) * 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 * fix: repair element bindings on restore (#5956) * fix: repair element bindings on restore * fix dropping non-text bound elements * be more conservative * build: move release scripts to use release branch (#5958) * fix: renderFooter styling (#5962) * fix: `ExcalidrawArrowElement` rather than `ExcalidrawArrowEleement` (#5955) * fix: Galego and Kurdî missing in languages plus two locale typos (#5954) * fix: remove blank space (#5950) * fix: remove editor onpaste handler (#5971) * feat: better default radius sizes for rectangles (#5553) Co-authored-by: Ryan Co-authored-by: dwelle * chore: add display name to context providers (#5974) * chore: add display name to context providers * fix typo * fix: apply the right type of roundness when pasting styles (#5979) * fix: only paste roundness when target and source elements are of the same type * apply roundness when pasting across different types * simplify Co-authored-by: dwelle * feat: allow readonly actions to be used in viewMode (#5982) * fix: chart pasting not working due to removing tab characters (#5987) * fix: Avatar outline on safari & center (#5997) * fix: not properly restoring element stroke and bg colors (#6002) * fix: PWA not working after CRA@5 update (#6012) * fix: PWA not working after CRA@5 update * fix: fallback to default locale when fetch fails * fix: resize sometimes throwing on missing null-checks (#6013) * fix: showing `grabbing` cursor when holding `spacebar` (#6015) * fix: don't push whitespace to next line when exceeding max width during wrapping and make sure to use same width of text editor on DOM when measuring dimensions (#5996) * fix: don't push whitespace to next line when exceeding max width during wrapping * add a helper function and never push empty line * use width same as in text area so dimensions are same * add tests * make sure dom element has exact same width as text editor * feat: render footer as a component instead of render prop (#5970) * feat: render footer as a component instead of render prop * Export FooterCenter as footer * remove useDevice export * revert some changes * remove * add spec * update specs * parse children into a dictionary * factor app footer components into a single file * Add docs * split app footer components Co-authored-by: dwelle * feat: move contextMenu into the component tree and control via appState (#6021) * fix: ColorPicker getColor (#5949) Co-authored-by: dwelle * chore: bump typescript @ 4.9.4 (#6024) * feat: support shrinking text containers to original height when text removed (#6025) * fix:cache bind text containers height so that it could autoshrink to original height when text deleted * revert * rename * reset cache when resized * safe check * restore original containr height when text is unbind * update cache when redrawing bounding box * reset cache when unbind * make type-safe * add specs * skip one test * remoe mock * fix Co-authored-by: dwelle * fix: restoring deleted bindings (#6029) * fix: restoring deleted bindings * add tests * add one more test * merge restore tests files * fix: use canvas measureText to calculate width in measureText (#6030) * fix: use canvas measureText to calculate width in measureText * calculate multiline width correctly using canvas measure text and rename functions * set correct width when pasting in bound container * take existing value + new pasted * remove debugger :p * fix snaps * fix: remove background from wysiwyg when editing arrow label (#6033) Co-authored-by: Aakansha Doshi * fix: use displayName since name gets stripped off when uglifying/minifiyng in production (#6036) fix: use displayName since name gets stripped off when uglifying/minifiy in production * feat: Scroll using PageUp and PageDown (#6038) * feat: Scroll using PageUp and PageDown * support x-axis via `shift` & enable in viewMode * tweak test Co-authored-by: dwelle * chore: Update translations from Crowdin (#5807) Co-authored-by: David Luzar * fix: remove ga from docker build (#6059) * fix: remove ga from docker build * lint * fix debug * fix: show error message on collab save failure (#6063) * fix: show error message on collab save failure * comment * feat: new Menu Component API (#6034) * feat: new Menu Component API * allow valid children types * introduce menu group to group items * Add lang footer * use display name * displayName * define types inside * fix default menu * add json export to menu * fix * simplify expression * put open menu into own compo to optimize perf So that we don't rerun `useOutsideClickHook` (and rebind event listeners all the time) * naming tweaks * rename MenuComponents->MenuDefaultItems and export default items from Menu.Items * import Menu.scss in Menu.tsx * move menu scss to excal app * Don't filter children inside menu group * move E+ out of socials * support style prop for MenuItem and MenuGroup * Support header in menu group and add Excalidraw links header for default items in social section * rename header to title * fix padding for lang * render menu in mobile * review fixes * tweaks * Export collaborators and show in mobile menu * revert .env * lint :p * again lint * show correct actions in view mode for mobile * Whitelist Collaborators Comp * mobile styling * padding * don't show nerds when menu open in mobile * lint :( * hide shortcuts * refactor userlist to support mobile and keep a wrapper comp for excal app * use only UserList * render only on mobile for default items * remove unused hooks * Show collab button in menu when onCollabButtonClick present and hide export when UIOptions.canvasActions.export is false * fix tests * lint * inject userlist inside menu on mobile * revert userlist * move menu socials to default menu * fix collab * use meny in library * Make Menu generic and create hamburgemenu for public excal menu and use menu in library as well * use appState.openMenu for mobile * fix tests * styling fixes and support style and class name in menu content * fix test * rename MenuDefaultItems->DefaultItems * move footer css to its own comp * rename HamburgerMenu -> MainMenu * rename menu -> dropdownMenu and update classes, onClick->onToggle * close main menu when dialog closes * by bye filtering * update docs * fix lint * update example, docs for useDevice and footer in mobile, rename menu ->DropDownMenu everywhere * spec * remove isMenuOpenAtom and set openMenu as canvas for main menu, render decreases in specs :) * [temp] remove cyclic depenedency to fix build * hack- update appstate to sync lang change * Add more specs * wip: rewrite MainMenu footer * fix margin * fix snaps * not needed as lang list no more imported * simplify custom footer rendering * Add DropdownMenuItemLink and DropdownMenuItemCustom and update API, docs * fix `MainMenu.ItemCustom` * naming * use onSelect and base class for custom items * fix lint * fix snap * use custom item for lang * update docs * fix * properly use `MainMenu.ItemCustom` for `LanguageList` * add margin top to custom items * flex Co-authored-by: dwelle * fix: HelpDialog (#6072) * chore: Update translations from Crowdin (#6052) * New translations en.json (German) * Auto commit: Calculate translation coverage * New translations en.json (Hindi) * New translations en.json (Marathi) * New translations en.json (Hindi) * Auto commit: Calculate translation coverage * New translations en.json (Galician) * Auto commit: Calculate translation coverage * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Bulgarian) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Basque) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Kurdish) * New translations en.json (Lithuanian) * New translations en.json (Dutch) * New translations en.json (Punjabi) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Slovak) * New translations en.json (Slovenian) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Vietnamese) * New translations en.json (Galician) * New translations en.json (Portuguese, Brazilian) * New translations en.json (Indonesian) * New translations en.json (Persian) * New translations en.json (Tamil) * New translations en.json (Bengali) * New translations en.json (Marathi) * New translations en.json (Norwegian Nynorsk) * New translations en.json (Kazakh) * New translations en.json (Latvian) * New translations en.json (Hindi) * New translations en.json (Burmese) * New translations en.json (Chinese Traditional, Hong Kong) * New translations en.json (Sinhala) * New translations en.json (Norwegian Bokmal) * New translations en.json (Occitan) * New translations en.json (Kabyle) * Auto commit: Calculate translation coverage * New translations en.json (Chinese Simplified) * Auto commit: Calculate translation coverage * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Traditional) * New translations en.json (Norwegian Bokmal) * Auto commit: Calculate translation coverage * New translations en.json (Latvian) * Auto commit: Calculate translation coverage * New translations en.json (Romanian) * Auto commit: Calculate translation coverage * New translations en.json (Slovenian) * Auto commit: Calculate translation coverage * New translations en.json (Spanish) * New translations en.json (Russian) * Auto commit: Calculate translation coverage * New translations en.json (German) * Auto commit: Calculate translation coverage * New translations en.json (Vietnamese) * Auto commit: Calculate translation coverage * New translations en.json (Hindi) * Auto commit: Calculate translation coverage * New translations en.json (Dutch) * Auto commit: Calculate translation coverage * New translations en.json (Marathi) * Auto commit: Calculate translation coverage * New translations en.json (Latvian) * New translations en.json (French) * Auto commit: Calculate translation coverage * New translations en.json (French) * Auto commit: Calculate translation coverage * New translations en.json (Portuguese, Brazilian) * Auto commit: Calculate translation coverage * New translations en.json (Japanese) * Auto commit: Calculate translation coverage * build(deps): bump json5 from 2.2.1 to 2.2.3 in /src/packages/excalidraw (#6062) Bumps [json5](https://github.com/json5/json5) from 2.2.1 to 2.2.3. - [Release notes](https://github.com/json5/json5/releases) - [Changelog](https://github.com/json5/json5/blob/main/CHANGELOG.md) - [Commits](https://github.com/json5/json5/compare/v2.2.1...v2.2.3) --- updated-dependencies: - dependency-name: json5 dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump json5 from 2.2.1 to 2.2.3 in /src/packages/utils (#6061) Bumps [json5](https://github.com/json5/json5) from 2.2.1 to 2.2.3. - [Release notes](https://github.com/json5/json5/releases) - [Changelog](https://github.com/json5/json5/blob/main/CHANGELOG.md) - [Commits](https://github.com/json5/json5/compare/v2.2.1...v2.2.3) --- updated-dependencies: - dependency-name: json5 dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump json5 from 2.2.1 to 2.2.3 in /dev-docs (#6060) Bumps [json5](https://github.com/json5/json5) from 2.2.1 to 2.2.3. - [Release notes](https://github.com/json5/json5/releases) - [Changelog](https://github.com/json5/json5/blob/main/CHANGELOG.md) - [Commits](https://github.com/json5/json5/compare/v2.2.1...v2.2.3) --- updated-dependencies: - dependency-name: json5 dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump decode-uri-component from 0.2.0 to 0.2.2 (#5963) Bumps [decode-uri-component](https://github.com/SamVerschueren/decode-uri-component) from 0.2.0 to 0.2.2. - [Release notes](https://github.com/SamVerschueren/decode-uri-component/releases) - [Commits](https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.2) --- updated-dependencies: - dependency-name: decode-uri-component dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump json5 from 1.0.1 to 1.0.2 (#6076) Bumps [json5](https://github.com/json5/json5) from 1.0.1 to 1.0.2. - [Release notes](https://github.com/json5/json5/releases) - [Changelog](https://github.com/json5/json5/blob/main/CHANGELOG.md) - [Commits](https://github.com/json5/json5/compare/v1.0.1...v1.0.2) --- updated-dependencies: - dependency-name: json5 dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump loader-utils from 2.0.3 to 2.0.4 (#5905) Bumps [loader-utils](https://github.com/webpack/loader-utils) from 2.0.3 to 2.0.4. - [Release notes](https://github.com/webpack/loader-utils/releases) - [Changelog](https://github.com/webpack/loader-utils/blob/v2.0.4/CHANGELOG.md) - [Commits](https://github.com/webpack/loader-utils/compare/v2.0.3...v2.0.4) --- updated-dependencies: - dependency-name: loader-utils dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump loader-utils from 2.0.3 to 2.0.4 in /src/packages/excalidraw (#5892) build(deps): bump loader-utils in /src/packages/excalidraw Bumps [loader-utils](https://github.com/webpack/loader-utils) from 2.0.3 to 2.0.4. - [Release notes](https://github.com/webpack/loader-utils/releases) - [Changelog](https://github.com/webpack/loader-utils/blob/v2.0.4/CHANGELOG.md) - [Commits](https://github.com/webpack/loader-utils/compare/v2.0.3...v2.0.4) --- updated-dependencies: - dependency-name: loader-utils dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * fix: stale appState of MainMenu defaultItems rendered from Actions (#6074) * fix: png-exporting does not preserve angles correctly for flipped images (#6085) * fix: png-exporting does not preserve angles correctly for flipped images * refactor related code * simplify further and comment * fix: image horizontal flip fix + improved tests (#5799) Co-authored-by: Antonio Della Fortuna Co-authored-by: dwelle fixes https://github.com/excalidraw/excalidraw/issues/5784 * fix: React.memo resolvers not accounting for all props (#6042) * fix: use position absolute for mobile misc tools (#6099) * feat: generic button export (#6092) Co-authored-by: dwelle * feat: render unknown supplied children to UI (#6096) * feat: support WelcomeScreen customization API (#6048) * fix: renamed folder MainMenu->main-menu and support rest props (#6103) * renamed folder MainMenu -> main-menu * rename ariaLabel -> aria-label and dataTestId -> data-testid * allow rest props * fix * lint * add ts check * ts for div * fix * fix * fix * feat: new Live Collaboration Component API (#6104) * feat: new Live Collaboration Component API * namespace export icons into `icons` dictionary and lowercase * update readme and changelog * review fixes * fix * fix * update docs * remove * allow button rest props * update docs * docs * add `WelcomeScreen.Center.MenuItemLiveCollaborationTrigger` * fix lint * update changelog Co-authored-by: dwelle * fix: mobile tools positioning (#6107) * fix: mobile tools positioning * add var for padding * use css var * new line * stupid mistake * lint * fix: remove overflow hidden from button (#6110) remove overflow hidden from button * docs: release @excalidraw/excalidraw@0.14.0 🎉 (#6109) * docs: release @excalidraw/excalidraw@0.14.1 🎉 (#6112) * build: temporarily disable pre-commit (#6132) * chore: Update translations from Crowdin (#6077) * feat: show copy-as-png export button on firefox and show steps how to enable it (#6125) * feat: hide copy-as-png shortcut from help dialog if not supported * fix: support firefox if clipboard.write supported * show shrotcut in firefox and instead show error message how to enable the flag support * widen to TypeError because minification * show copy-as-png on firefox even if it will throw * style: change in ExportButton style (#6147) (#6148) Co-authored-by: David Luzar * fix: button background and svg sizes (#6155) * fix: button background color fallback * fix svg width/height * feat: add hand/panning tool (#6141) * feat: add hand/panning tool * move hand tool right of tool lock separator * tweak i18n * rename `panning` -> `hand` * toggle between last tool and hand on `H` shortcut * hide properties sidebar when `hand` active * revert to rendering HandButton manually due to mobile toolbar * feat: close MainMenu and Library dropdown on item select (#6152) * fix: declare css variable for font in excalidraw so its available in host (#6160) declar css variable for font in excalidraw so its available in host * fix: :bug: broken emojis when wrap text (#6153) * fix: :bug: broken emojis when wrap text * refactor: Delete unnecessary "else" (reduce indentation) * fix: remove code block that causes the emojis to disappear * Apply suggestions from code review Co-authored-by: David Luzar * fix: :ambulance: possibly undefined value * Add spec Co-authored-by: David Luzar Co-authored-by: Aakansha Doshi * fix: set the width correctly using measureText in editor (#6162) * fix: quick typo fix (#6167) * fix: add 1px width to the container to calculate more accurately (#6174) * fix: add 1px width to the container to calculate accurately * fix tests * feat: rewrite public UI component rendering using tunnels (#6117) * feat: rewrite public UI component rendering using tunnels * factor out into components * comments * fix variable naming * fix not hiding welcomeScreen * factor out AppFooter and memoize components * remove `UIOptions.welcomeScreen` and render only from host app * factor out tunnels into own file * update changelog. Keep `UIOptions.welcomeScreen` as deprecated * update changelog * lint --------- Co-authored-by: Aakansha Doshi * fix: make tunnels work in multi-instance scenarios (#6178) * fix: make tunnels work in multi-instance scenarios * factor tunnels out * use tunnel-rat fork until upsteam updated * fix: horizontal padding when aligning bound text containers (#6180) * fix: horizontal padding when aligning bound text containers * Add specs * fix * docs: release @excalidraw/excalidraw@0.14.2 🎉 (#6181) * docs: migrating dev docs to docusaurus :) (#6073) * docs: migrating existing docs to docosaraus :) * log broken links * lint :p * fix * divide the doc into diff categories * fix * order sidebars and more * fix lint * point to installation * making docs better :) * fix * renaming git * renaming git * fix links * fix * update readme * fix * resolve duplicate url and make /docs as base url * fix * move main docs as well * making docs better * support mdx * update og * fix title * upgrade docusarus to stable version * use draculla theme * fix * make entire sidebar collapsable * live editor for footer wohoo * render excalidraw only on client to fix the prod build * migrate MainMenu to live editor too :) * lint :p * cleanup integration and use live editor and tabs * fix * Add welcome screen doc * Live Collaboration comp docs * Add collaborator example * Add example * add more * remove isCollaborating * Rewrite ref and move to sidebar * change color of links inside pre * add initial data * fix lint * Add styling * fix lint * Add example for customizing styles * fix lint * fix * fix lint * Add link to livecollabtrigger * fix * rewrite UIOptions to sidebar * move initialdata to sidebar * move render props to sidebar and rewrite renderTopRightUI and renderCustomStats * rewrite renderSidebar * update og * update url for testing * fix url * update readme * fix style * tweaks * Add highlight comp to highlight text * Add bash syntax highlight * fix * tweaks * fix * rewrite export utilities * fix restore * rewrite utils * move constants to sidebar * update readme * add copyright * fix links style * Add linkedin * tweaks * rename package to @excalidraw/excalidraw * enable algolia with dummy creds * tweaks to integration doc * tweak WelcomeScreen docs to reflect upcoming API changes * tweak components intro * tweak nomenclature * fix admonition * rename `components` sidebar item and change order of components list * uncollapse package section in sidebar * show level 4 haeadings in TOC * remove algolia * remove unused assets * capitalize C * tweak * rename components to App * rename components -> children-components in the routes * move notable used tools to intro * update MainMenu docs with `onSelect` preventDefault behavior * change sidebar label for children components * use code * tweak README & docs intro * tweak package development doc * make scrollbar gutter stable * tweak api intro * add admonition for export utils * use next * wip * wip * make excalidraw examples use current color theme & prefer system * fix welcomescreen docs * use latest temp release * fix component order * revert wip changes * use next * tweak * increase height to fix welcome screen hint * tweak editor height * update excal version * wrap Excal with forwardRef to fix refs * migrate contributing.md * fix broken links --------- Co-authored-by: dwelle * fix: edit link in docs (#6182) * docs: show last updated time and author (#6183) docs:show last updated time and author * fix: hide welcome screen on mobile once user interacts (#6185) * fix: hide welcome screen on mobile once started drawing * Add specs * fix: sort bound text elements to fix text duplication z-index error (#5130) * fix: sort bound text elements to fix text duplication z-index error * improve & sort groups & add tests * fix backtracking and discontiguous groups --------- Co-authored-by: dwelle * feat: disable canvas smoothing (antialiasing) for right-angled elements (#6186)Co-authored-by: Ignacio Cuadra <67276174+ignacio-cuadra@users.noreply.github.com> * feat: disable canvas smoothing for text and other types * disable smoothing for all right-angled elements * Update src/renderer/renderElement.ts Co-authored-by: Ignacio Cuadra <67276174+ignacio-cuadra@users.noreply.github.com> * Update src/renderer/renderElement.ts Co-authored-by: Ignacio Cuadra <67276174+ignacio-cuadra@users.noreply.github.com> * fix lint * always enable smoothing while zooming --------- Co-authored-by: Ignacio Cuadra <67276174+ignacio-cuadra@users.noreply.github.com> * chore: Update translations from Crowdin (#6150) * feat: shortcut for clearCanvas confirmDialog (#6114) Co-authored-by: dwelle resolve https://github.com/excalidraw/excalidraw/issues/5818 * feat: show error message when not connected to internet while collabo… (#6165) Co-authored-by: dwelle Resolves https://github.com/excalidraw/excalidraw/issues/5994 * fix: docker build architecture:linux/amd64 error occur on linux/arm64 instance (#6197) fix docker build when in linux/arm64 use docker buildx plugin to build linux/amd64 image, a build error will occur causing the build to break * refactor: Make the example React app reusable without duplication (#6188) * fix: don't allow blank space in collab name (#6211) * don't allow blank space in collab name * add spec * prevent blank * docs: enable Algolia for search (#6230) * feat: Make repair and refreshDimensions configurable in restoreElements (#6238) * fix: don't repair during reconcilation * Add opts to restoreElement and enable refreshDimensions and repair via config * remove * update changelog * fix tests * rename to repairBindings * docs: Fixed broken codesandbox link in the dev-docs (#6229) fixed broken link * docs: new readme (#6240) Co-authored-by: David Luzar * docs: fix next.js example (#6241) * docs: fix typo (#6252) * feat: Bind text to container if double clicked on filled shape or stroke (#6250) * feat: bind text to container when clicked on filled shape or element stroke * Bind if double clicked on stroke as well * remove * specs * remove * shuffle * fix * back to normal * docs: Fix outdated link in README.md (#6263) * fix: improve text wrapping in ellipse and alignment (#6172) * fix: improve text wrapping in ellipse * compute height when font properties updated * fix alignment * fix alignment when resizing * fix * ad padding * always compute height when redrawing bounding box and refactor * lint * fix specs * fix * redraw text bounding box when pasted or refreshed * fix * Add specs * fix * restore on font load * add comments * fix: improve text wrapping inside rhombus and more fixes (#6265) * 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 * fix: indenting via `tab` clashing with IME compositor (#6258) * chore: Update translations from Crowdin (#6191) * fix: rerender i18n in host components on lang change (#6224) * fix: fit mobile toolbar and make scrollable (#6270) Co-authored-by: dwelle * feat: improve text measurements in bound containers (#6187) * 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: compute container height from bound text correctly (#6273) * fix: compute container height from bound text correctly * fix specs * Add tests * fix: svg text baseline (#6285 * fix: svg text baseline * fix for multiline --------- Signed-off-by: dependabot[bot] Co-authored-by: David Luzar Co-authored-by: Aakansha Doshi Co-authored-by: Antonio Della Fortuna <50418432+adarkforce@users.noreply.github.com> Co-authored-by: Antonio Della Fortuna Co-authored-by: DanielJGeiger <1852529+DanielJGeiger@users.noreply.github.com> Co-authored-by: Fer <63980689+1fbr@users.noreply.github.com> Co-authored-by: fennghuang <89014758+fennghuang@users.noreply.github.com> Co-authored-by: Ryan Di Co-authored-by: Ryan Co-authored-by: Excalidraw Bot <77840495+excalibot@users.noreply.github.com> Co-authored-by: EternalWill43 <70084418+EternalWill43@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Barnabás Molnár <38168628+barnabasmolnar@users.noreply.github.com> Co-authored-by: Nishant-l <61119157+Nishant-l@users.noreply.github.com> Co-authored-by: Ignacio Cuadra <67276174+ignacio-cuadra@users.noreply.github.com> Co-authored-by: JUNYI OU <49964599+Irvingouj@users.noreply.github.com> Co-authored-by: Jang Min Co-authored-by: Matthieu Rossignon <51274353+Mattross45@users.noreply.github.com> Co-authored-by: Dejavu Moe Co-authored-by: Luka Hietala <95122845+LukaHietala@users.noreply.github.com> Co-authored-by: Milos Vetesnik Co-authored-by: Jan Klass Co-authored-by: Hikaru Yoshino <57059705+osushicrusher@users.noreply.github.com> Co-authored-by: Tengku Farhan <109069184+tfarhan00@users.noreply.github.com> --- .github/workflows/autorelease-excalidraw.yml | 2 +- .github/workflows/build-docker.yml | 2 +- .github/workflows/cancel.yml | 2 +- .github/workflows/publish-docker.yml | 2 +- .github/workflows/sentry-production.yml | 2 +- .husky/pre-commit | 2 +- CONTRIBUTING.md | 62 +- Dockerfile | 2 +- README.md | 301 +-- .../@excalidraw/excalidraw/api/api-intro.mdx | 11 + .../children-components-intro.mdx | 21 + .../api/children-components/footer.mdx | 69 + .../live-collaboration-trigger.mdx | 62 + .../api/children-components/main-menu.mdx | 169 ++ .../children-components/welcome-screen.mdx | 140 ++ .../@excalidraw/excalidraw/api/constants.mdx | 46 + .../excalidraw/api/props/initialdata.mdx | 55 + .../excalidraw/api/props/props.mdx | 230 ++ .../@excalidraw/excalidraw/api/props/ref.mdx | 391 ++++ .../excalidraw/api/props/render-props.mdx | 126 ++ .../excalidraw/api/props/ui-options.mdx | 72 + .../excalidraw/api/utils/export.mdx | 196 ++ .../excalidraw/api/utils/restore.mdx | 90 + .../excalidraw/api/utils/utils-intro.md | 341 +++ .../excalidraw/customizing-styles.mdx | 49 + .../@excalidraw/excalidraw/development.mdx | 59 + dev-docs/docs/@excalidraw/excalidraw/faq.mdx | 9 + .../@excalidraw/excalidraw/installation.mdx | 43 + .../@excalidraw/excalidraw/integration.mdx | 131 ++ dev-docs/docs/assets/nerd-stats.png | Bin 0 -> 84676 bytes dev-docs/docs/codebase/overview.md | 6 - dev-docs/docs/get-started.md | 8 - dev-docs/docs/introduction/contributing.mdx | 72 + dev-docs/docs/introduction/development.mdx | 102 + dev-docs/docs/introduction/get-started.mdx | 16 + dev-docs/docs/package/overview.md | 6 - dev-docs/docusaurus.config.js | 52 +- dev-docs/package.json | 10 +- dev-docs/sidebars.js | 87 +- dev-docs/src/components/Highlight.js | 15 + dev-docs/src/css/{custom.css => custom.scss} | 60 +- dev-docs/src/initialData.js | 1230 +++++++++++ dev-docs/src/pages/index.js | 42 - dev-docs/src/pages/index.tsx | 11 +- dev-docs/src/theme/MDXComponents.js | 11 + dev-docs/src/theme/ReactLiveScope/index.js | 29 + .../static/img}/doremon.png | Bin dev-docs/static/img/og-image-sm.png | Bin 0 -> 77545 bytes dev-docs/static/img/og-image.png | Bin 0 -> 81109 bytes .../public => dev-docs/static/img}/pika.jpeg | Bin .../static/img/welcome-screen-overview.png | Bin 0 -> 103250 bytes dev-docs/yarn.lock | 562 +++-- package.json | 26 +- public/index.html | 6 +- public/service-worker.js | 81 - scripts/locales-coverage-description.js | 6 +- scripts/prebuild.js | 21 - src/actions/actionBoundText.tsx | 19 +- src/actions/actionCanvas.tsx | 113 +- src/actions/actionClipboard.tsx | 32 +- src/actions/actionDeleteSelected.tsx | 4 +- src/actions/actionDuplicateSelection.tsx | 121 +- src/actions/actionExport.tsx | 36 +- src/actions/actionFinalize.tsx | 2 +- src/actions/actionFlip.ts | 20 +- src/actions/actionGroup.tsx | 6 +- src/actions/actionHistory.tsx | 3 +- src/actions/actionLinearEditor.ts | 2 +- src/actions/actionMenu.tsx | 18 +- src/actions/actionNavigate.tsx | 1 + src/actions/actionProperties.tsx | 110 +- src/actions/actionStyles.ts | 14 +- src/actions/actionToggleGridMode.tsx | 4 + src/actions/actionToggleLock.ts | 12 +- src/actions/actionToggleStats.tsx | 1 + src/actions/actionToggleViewMode.tsx | 4 + src/actions/actionToggleZenMode.tsx | 4 + src/actions/actionZindex.tsx | 3 +- src/actions/manager.tsx | 25 +- src/actions/shortcuts.ts | 4 +- src/actions/types.ts | 18 +- src/appState.ts | 18 +- src/charts.ts | 4 +- src/clients.ts | 2 +- src/clipboard.ts | 35 +- src/components/Actions.tsx | 24 +- src/components/ActiveConfirmDialog.tsx | 35 + src/components/ActiveFile.tsx | 23 - src/components/App.tsx | 1066 ++++++---- src/components/Avatar.scss | 13 +- src/components/Button.scss | 7 + src/components/Button.tsx | 35 + src/components/ClearCanvas.tsx | 39 - src/components/CollabButton.tsx | 49 - src/components/ColorPicker.tsx | 9 +- src/components/ConfirmDialog.tsx | 17 +- src/components/ContextMenu.scss | 22 +- src/components/ContextMenu.tsx | 224 +- src/components/Dialog.tsx | 16 +- src/components/EncryptedIcon.tsx | 19 - src/components/ExportDialog.scss | 4 + src/components/FixedSideContainer.scss | 10 +- src/components/HandButton.tsx | 32 + src/components/HelpDialog.tsx | 98 +- src/components/ImageExportDialog.tsx | 6 +- src/components/JSONExportDialog.tsx | 23 +- src/components/LayerUI.scss | 6 - src/components/LayerUI.tsx | 296 ++- src/components/LibraryMenu.scss | 23 + src/components/LibraryMenuHeaderContent.tsx | 159 +- src/components/LockButton.tsx | 1 - src/components/Menu.scss | 85 - src/components/MenuItem.tsx | 37 - src/components/MenuUtils.tsx | 53 - src/components/MobileMenu.tsx | 158 +- src/components/Sidebar/Sidebar.scss | 18 - src/components/ToolButton.tsx | 2 +- src/components/UserList.scss | 1 + src/components/UserList.tsx | 28 +- src/components/WelcomeScreen.tsx | 141 -- src/components/WelcomeScreenDecor.tsx | 11 - src/components/context/tunnels.ts | 32 + src/components/dropdownMenu/DropdownMenu.scss | 127 ++ src/components/dropdownMenu/DropdownMenu.tsx | 43 + .../dropdownMenu/DropdownMenuContent.tsx | 62 + .../dropdownMenu/DropdownMenuGroup.tsx | 23 + .../dropdownMenu/DropdownMenuItem.tsx | 40 + .../dropdownMenu/DropdownMenuItemContent.tsx | 23 + .../dropdownMenu/DropdownMenuItemCustom.tsx | 21 + .../dropdownMenu/DropdownMenuItemLink.tsx | 44 + .../dropdownMenu/DropdownMenuSeparator.tsx | 14 + .../dropdownMenu/DropdownMenuTrigger.tsx | 37 + src/components/dropdownMenu/common.ts | 31 + .../dropdownMenu/dropdownMenuUtils.ts | 35 + src/components/{ => footer}/Footer.tsx | 50 +- src/components/footer/FooterCenter.scss | 10 + src/components/footer/FooterCenter.tsx | 24 + src/components/hoc/withInternalFallback.tsx | 52 + src/components/icons.tsx | 13 +- .../LiveCollaborationTrigger.scss} | 35 +- .../LiveCollaborationTrigger.tsx | 40 + .../DefaultItems.scss} | 0 src/components/main-menu/DefaultItems.tsx | 257 +++ src/components/main-menu/MainMenu.tsx | 84 + .../welcome-screen/WelcomeScreen.Center.tsx | 196 ++ .../welcome-screen/WelcomeScreen.Hints.tsx | 52 + .../{ => welcome-screen}/WelcomeScreen.scss | 167 +- .../welcome-screen/WelcomeScreen.tsx | 26 + src/constants.ts | 44 +- src/css/styles.scss | 32 +- src/css/theme.scss | 10 +- src/css/variables.module.scss | 28 +- src/data/blob.ts | 1 + src/data/index.ts | 15 +- src/data/library.ts | 3 +- src/data/restore.ts | 140 +- src/element/Hyperlink.tsx | 2 +- src/element/binding.ts | 5 + src/element/bounds.test.ts | 2 + src/element/bounds.ts | 163 +- src/element/collision.ts | 40 +- src/element/linearElementEditor.ts | 403 +++- src/element/newElement.test.ts | 6 +- src/element/newElement.ts | 75 +- src/element/resizeElements.ts | 254 +-- src/element/resizeTest.ts | 2 +- src/element/showSelectedShapeActions.ts | 3 +- src/element/sortElements.test.ts | 402 ++++ src/element/sortElements.ts | 123 ++ src/element/textElement.test.ts | 152 +- src/element/textElement.ts | 752 +++++-- src/element/textWysiwyg.test.tsx | 727 ++++--- src/element/textWysiwyg.tsx | 243 ++- src/element/transformHandles.ts | 8 +- src/element/typeChecks.ts | 68 +- src/element/types.ts | 22 +- src/excalidraw-app/app-jotai.ts | 3 + src/excalidraw-app/app_constants.ts | 8 + src/excalidraw-app/collab/Collab.tsx | 28 +- src/excalidraw-app/collab/RoomDialog.tsx | 5 +- src/excalidraw-app/collab/reconciliation.ts | 52 +- src/excalidraw-app/components/AppFooter.tsx | 21 + src/excalidraw-app/components/AppMainMenu.tsx | 40 + .../components/AppWelcomeScreen.tsx | 65 + .../components/EncryptedIcon.tsx | 21 + .../components/ExcalidrawPlusAppLink.tsx | 17 + .../components/ExportToExcalidrawPlus.tsx | 3 +- .../components/LanguageList.tsx | 41 +- src/excalidraw-app/data/index.ts | 5 +- src/excalidraw-app/index.scss | 44 +- src/excalidraw-app/index.tsx | 105 +- src/excalidraw-app/pwa.ts | 2 +- src/global.d.ts | 2 + src/i18n.ts | 29 +- src/jotai.ts | 4 +- src/keys.ts | 6 +- src/locales/ar-SA.json | 82 +- src/locales/bg-BG.json | 42 +- src/locales/bn-BD.json | 48 +- src/locales/ca-ES.json | 54 +- src/locales/cs-CZ.json | 130 +- src/locales/da-DK.json | 44 +- src/locales/de-DE.json | 60 +- src/locales/el-GR.json | 50 +- src/locales/en.json | 41 +- src/locales/es-ES.json | 76 +- src/locales/eu-ES.json | 52 +- src/locales/fa-IR.json | 60 +- src/locales/fi-FI.json | 58 +- src/locales/fr-FR.json | 48 +- src/locales/gl-ES.json | 456 ++-- src/locales/he-IL.json | 46 +- src/locales/hi-IN.json | 50 +- src/locales/hu-HU.json | 50 +- src/locales/id-ID.json | 48 +- src/locales/it-IT.json | 48 +- src/locales/ja-JP.json | 52 +- src/locales/kab-KAB.json | 60 +- src/locales/kk-KZ.json | 36 +- src/locales/ko-KR.json | 48 +- src/locales/ku-TR.json | 98 +- src/locales/lt-LT.json | 358 ++-- src/locales/lv-LV.json | 48 +- src/locales/mr-IN.json | 48 +- src/locales/my-MM.json | 40 +- src/locales/nb-NO.json | 46 +- src/locales/nl-NL.json | 120 +- src/locales/nn-NO.json | 48 +- src/locales/oc-FR.json | 62 +- src/locales/pa-IN.json | 44 +- src/locales/percentages.json | 72 +- src/locales/pl-PL.json | 46 +- src/locales/pt-BR.json | 48 +- src/locales/pt-PT.json | 52 +- src/locales/ro-RO.json | 48 +- src/locales/ru-RU.json | 52 +- src/locales/si-LK.json | 34 +- src/locales/sk-SK.json | 48 +- src/locales/sl-SI.json | 48 +- src/locales/sv-SE.json | 50 +- src/locales/ta-IN.json | 52 +- src/locales/tr-TR.json | 48 +- src/locales/uk-UA.json | 48 +- src/locales/vi-VN.json | 70 +- src/locales/zh-CN.json | 58 +- src/locales/zh-HK.json | 36 +- src/locales/zh-TW.json | 48 +- src/math.ts | 48 +- src/packages/excalidraw/CHANGELOG.md | 256 +++ src/packages/excalidraw/README.md | 1440 +------------ src/packages/excalidraw/example/App.scss | 16 +- src/packages/excalidraw/example/App.tsx | 146 +- .../excalidraw/example/CustomFooter.tsx | 75 + .../excalidraw/example/MobileFooter.tsx | 20 + src/packages/excalidraw/example/index.tsx | 5 +- .../example/public/images/doremon.png | Bin 0 -> 201946 bytes .../example/public/{ => images}/excalibot.png | Bin .../example/public/images/pika.jpeg | Bin 0 -> 6250 bytes .../example/public/{ => images}/rocket.jpeg | Bin .../example/sidebar/ExampleSidebar.tsx | 4 +- src/packages/excalidraw/index.tsx | 47 +- src/packages/excalidraw/package.json | 2 +- src/packages/excalidraw/yarn.lock | 12 +- src/packages/utils/README.md | 4 +- src/packages/utils/yarn.lock | 6 +- src/points.ts | 1 - src/renderer/renderElement.ts | 404 +++- src/renderer/renderScene.ts | 52 +- src/scene/Fonts.ts | 93 + src/scene/Scene.ts | 18 + src/scene/comparisons.ts | 31 +- src/scene/index.ts | 3 +- src/scene/scroll.ts | 4 +- src/service-worker.ts | 147 ++ ...orker.tsx => serviceWorkerRegistration.ts} | 0 src/tests/MobileMenu.test.tsx | 45 + .../__snapshots__/MobileMenu.test.tsx.snap | 240 +++ .../__snapshots__/contextmenu.test.tsx.snap | 1871 +++++++++++++++-- .../__snapshots__/dragCreate.test.tsx.snap | 20 +- .../linearElementEditor.test.tsx.snap | 12 + src/tests/__snapshots__/move.test.tsx.snap | 24 +- .../multiPointCreate.test.tsx.snap | 8 +- .../regressionTests.test.tsx.snap | 1838 +++++++++++----- .../__snapshots__/selection.test.tsx.snap | 36 +- src/tests/clients.test.ts | 5 + src/tests/clipboard.test.tsx | 254 +++ .../data/__snapshots__/restore.test.ts.snap | 42 +- src/tests/data/restore.test.ts | 253 ++- src/tests/elementLocking.test.tsx | 4 +- src/tests/fixtures/elementFixture.ts | 2 +- src/tests/flip.test.tsx | 1120 +++++----- src/tests/helpers/api.ts | 36 +- src/tests/linearElementEditor.test.tsx | 654 +++++- .../__snapshots__/excalidraw.test.tsx.snap | 1294 ++---------- .../packages/__snapshots__/utils.test.ts.snap | 6 +- src/tests/packages/excalidraw.test.tsx | 307 ++- src/tests/regressionTests.test.tsx | 2 +- .../scene/__snapshots__/export.test.ts.snap | 2 +- src/tests/scroll.test.tsx | 59 + src/tests/test-utils.ts | 6 + src/tests/utils.ts | 19 + src/tests/zindex.test.tsx | 159 +- src/types.ts | 79 +- src/utils.ts | 66 +- yarn.lock | 183 +- 305 files changed, 20140 insertions(+), 9184 deletions(-) create mode 100644 dev-docs/docs/@excalidraw/excalidraw/api/api-intro.mdx create mode 100644 dev-docs/docs/@excalidraw/excalidraw/api/children-components/children-components-intro.mdx create mode 100644 dev-docs/docs/@excalidraw/excalidraw/api/children-components/footer.mdx create mode 100644 dev-docs/docs/@excalidraw/excalidraw/api/children-components/live-collaboration-trigger.mdx create mode 100644 dev-docs/docs/@excalidraw/excalidraw/api/children-components/main-menu.mdx create mode 100644 dev-docs/docs/@excalidraw/excalidraw/api/children-components/welcome-screen.mdx create mode 100644 dev-docs/docs/@excalidraw/excalidraw/api/constants.mdx create mode 100644 dev-docs/docs/@excalidraw/excalidraw/api/props/initialdata.mdx create mode 100644 dev-docs/docs/@excalidraw/excalidraw/api/props/props.mdx create mode 100644 dev-docs/docs/@excalidraw/excalidraw/api/props/ref.mdx create mode 100644 dev-docs/docs/@excalidraw/excalidraw/api/props/render-props.mdx create mode 100644 dev-docs/docs/@excalidraw/excalidraw/api/props/ui-options.mdx create mode 100644 dev-docs/docs/@excalidraw/excalidraw/api/utils/export.mdx create mode 100644 dev-docs/docs/@excalidraw/excalidraw/api/utils/restore.mdx create mode 100644 dev-docs/docs/@excalidraw/excalidraw/api/utils/utils-intro.md create mode 100644 dev-docs/docs/@excalidraw/excalidraw/customizing-styles.mdx create mode 100644 dev-docs/docs/@excalidraw/excalidraw/development.mdx create mode 100644 dev-docs/docs/@excalidraw/excalidraw/faq.mdx create mode 100644 dev-docs/docs/@excalidraw/excalidraw/installation.mdx create mode 100644 dev-docs/docs/@excalidraw/excalidraw/integration.mdx create mode 100644 dev-docs/docs/assets/nerd-stats.png delete mode 100644 dev-docs/docs/codebase/overview.md delete mode 100644 dev-docs/docs/get-started.md create mode 100644 dev-docs/docs/introduction/contributing.mdx create mode 100644 dev-docs/docs/introduction/development.mdx create mode 100644 dev-docs/docs/introduction/get-started.mdx delete mode 100644 dev-docs/docs/package/overview.md create mode 100644 dev-docs/src/components/Highlight.js rename dev-docs/src/css/{custom.css => custom.scss} (54%) create mode 100644 dev-docs/src/initialData.js delete mode 100644 dev-docs/src/pages/index.js create mode 100644 dev-docs/src/theme/MDXComponents.js create mode 100644 dev-docs/src/theme/ReactLiveScope/index.js rename {src/packages/excalidraw/example/public => dev-docs/static/img}/doremon.png (100%) create mode 100644 dev-docs/static/img/og-image-sm.png create mode 100644 dev-docs/static/img/og-image.png rename {src/packages/excalidraw/example/public => dev-docs/static/img}/pika.jpeg (100%) create mode 100644 dev-docs/static/img/welcome-screen-overview.png delete mode 100644 public/service-worker.js delete mode 100644 scripts/prebuild.js create mode 100644 src/components/ActiveConfirmDialog.tsx delete mode 100644 src/components/ActiveFile.tsx create mode 100644 src/components/Button.scss create mode 100644 src/components/Button.tsx delete mode 100644 src/components/ClearCanvas.tsx delete mode 100644 src/components/CollabButton.tsx delete mode 100644 src/components/EncryptedIcon.tsx create mode 100644 src/components/HandButton.tsx delete mode 100644 src/components/Menu.scss delete mode 100644 src/components/MenuItem.tsx delete mode 100644 src/components/MenuUtils.tsx delete mode 100644 src/components/WelcomeScreen.tsx delete mode 100644 src/components/WelcomeScreenDecor.tsx create mode 100644 src/components/context/tunnels.ts create mode 100644 src/components/dropdownMenu/DropdownMenu.scss create mode 100644 src/components/dropdownMenu/DropdownMenu.tsx create mode 100644 src/components/dropdownMenu/DropdownMenuContent.tsx create mode 100644 src/components/dropdownMenu/DropdownMenuGroup.tsx create mode 100644 src/components/dropdownMenu/DropdownMenuItem.tsx create mode 100644 src/components/dropdownMenu/DropdownMenuItemContent.tsx create mode 100644 src/components/dropdownMenu/DropdownMenuItemCustom.tsx create mode 100644 src/components/dropdownMenu/DropdownMenuItemLink.tsx create mode 100644 src/components/dropdownMenu/DropdownMenuSeparator.tsx create mode 100644 src/components/dropdownMenu/DropdownMenuTrigger.tsx create mode 100644 src/components/dropdownMenu/common.ts create mode 100644 src/components/dropdownMenu/dropdownMenuUtils.ts rename src/components/{ => footer}/Footer.tsx (65%) create mode 100644 src/components/footer/FooterCenter.scss create mode 100644 src/components/footer/FooterCenter.tsx create mode 100644 src/components/hoc/withInternalFallback.tsx rename src/components/{CollabButton.scss => live-collaboration/LiveCollaborationTrigger.scss} (64%) create mode 100644 src/components/live-collaboration/LiveCollaborationTrigger.tsx rename src/components/{ActiveFile.scss => main-menu/DefaultItems.scss} (100%) create mode 100644 src/components/main-menu/DefaultItems.tsx create mode 100644 src/components/main-menu/MainMenu.tsx create mode 100644 src/components/welcome-screen/WelcomeScreen.Center.tsx create mode 100644 src/components/welcome-screen/WelcomeScreen.Hints.tsx rename src/components/{ => welcome-screen}/WelcomeScreen.scss (61%) create mode 100644 src/components/welcome-screen/WelcomeScreen.tsx create mode 100644 src/element/sortElements.test.ts create mode 100644 src/element/sortElements.ts create mode 100644 src/excalidraw-app/app-jotai.ts create mode 100644 src/excalidraw-app/components/AppFooter.tsx create mode 100644 src/excalidraw-app/components/AppMainMenu.tsx create mode 100644 src/excalidraw-app/components/AppWelcomeScreen.tsx create mode 100644 src/excalidraw-app/components/EncryptedIcon.tsx create mode 100644 src/excalidraw-app/components/ExcalidrawPlusAppLink.tsx create mode 100644 src/packages/excalidraw/example/CustomFooter.tsx create mode 100644 src/packages/excalidraw/example/MobileFooter.tsx create mode 100644 src/packages/excalidraw/example/public/images/doremon.png rename src/packages/excalidraw/example/public/{ => images}/excalibot.png (100%) create mode 100644 src/packages/excalidraw/example/public/images/pika.jpeg rename src/packages/excalidraw/example/public/{ => images}/rocket.jpeg (100%) create mode 100644 src/scene/Fonts.ts create mode 100644 src/service-worker.ts rename src/{serviceWorker.tsx => serviceWorkerRegistration.ts} (100%) create mode 100644 src/tests/MobileMenu.test.tsx create mode 100644 src/tests/__snapshots__/MobileMenu.test.tsx.snap create mode 100644 src/tests/__snapshots__/linearElementEditor.test.tsx.snap create mode 100644 src/tests/clipboard.test.tsx diff --git a/.github/workflows/autorelease-excalidraw.yml b/.github/workflows/autorelease-excalidraw.yml index 24071b3a2..ad0a0a7e9 100644 --- a/.github/workflows/autorelease-excalidraw.yml +++ b/.github/workflows/autorelease-excalidraw.yml @@ -2,7 +2,7 @@ name: Auto release excalidraw next on: push: branches: - - master + - release jobs: Auto-release-excalidraw-next: diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index d767a3335..f5f9b45bb 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -3,7 +3,7 @@ name: Build Docker image on: push: branches: - - master + - release jobs: build-docker: diff --git a/.github/workflows/cancel.yml b/.github/workflows/cancel.yml index 13f6c73c9..e1ef21665 100644 --- a/.github/workflows/cancel.yml +++ b/.github/workflows/cancel.yml @@ -3,7 +3,7 @@ name: Cancel previous runs on: push: branches: - - master + - release pull_request: jobs: diff --git a/.github/workflows/publish-docker.yml b/.github/workflows/publish-docker.yml index 1ec35b8b8..a4a8a4c5f 100644 --- a/.github/workflows/publish-docker.yml +++ b/.github/workflows/publish-docker.yml @@ -3,7 +3,7 @@ name: Publish Docker on: push: branches: - - master + - release jobs: publish-docker: diff --git a/.github/workflows/sentry-production.yml b/.github/workflows/sentry-production.yml index 228b6f148..6f53f91eb 100644 --- a/.github/workflows/sentry-production.yml +++ b/.github/workflows/sentry-production.yml @@ -3,7 +3,7 @@ name: New Sentry production release on: push: branches: - - master + - release jobs: sentry: diff --git a/.husky/pre-commit b/.husky/pre-commit index 521508d8e..ab2a5ac5f 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,2 +1,2 @@ #!/bin/sh -yarn lint-staged +# yarn lint-staged diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b3a5c325c..509908e5d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,63 +1,3 @@ # Contributing -## Setup - -### Option 1 - Manual - -1. Fork and clone the repo -1. Run `yarn` to install dependencies -1. Create a branch for your PR with `git checkout -b your-branch-name` - -> To keep `master` branch pointing to remote repository and make pull requests from branches on your fork. To do this, run: -> -> ```sh -> git remote add upstream https://github.com/excalidraw/excalidraw.git -> git fetch upstream -> git branch --set-upstream-to=upstream/master master -> ``` - -### Option 2 - CodeSandbox - -1. Go to https://codesandbox.io/s/github/excalidraw/excalidraw -1. Connect your GitHub account -1. Go to Git tab on left side -1. Tap on `Fork Sandbox` -1. Write your code -1. Commit and PR automatically - -## Pull Request Guidelines - -Don't worry if you get any of the below wrong, or if you don't know how. We'll gladly help out. - -### Title - -Make sure the title starts with a semantic prefix: - -- **feat**: A new feature -- **fix**: A bug fix -- **docs**: Documentation only changes -- **style**: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc) -- **refactor**: A code change that neither fixes a bug nor adds a feature -- **perf**: A code change that improves performance -- **test**: Adding missing tests or correcting existing tests -- **build**: Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm) -- **ci**: Changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs) -- **chore**: Other changes that don't modify src or test files -- **revert**: Reverts a previous commit - -### Changelog - -Add a brief description of your pull request to the changelog located here: [`src/packages/excalidraw/CHANGELOG.md`](src/packages/excalidraw/CHANGELOG.md) - -Notes: - -- Make sure to prepend to the section corresponding with the semantic prefix you selected in the title -- Link to your pull request - this will require updating the CHANGELOG _after_ creating the pull request - -### Testing - -Once you submit your pull request it will automatically be tested. Be sure to check the results of the test and fix any issues that arise. - -It's also a good idea to consider if your change should include additional tests. This is highly recommended for new features or bug-fixes. For example, it's good practice to create a test for each bug you fix which ensures that we don't regress the code in the future. - -Finally - always manually test your changes using the convenient staging environment deployed for each pull request. As much as local development attempts to replicate production, there can still be subtle differences in behavior. For larger features consider testing your change in multiple browsers as well. +Head over to the [docs](https://docs.excalidraw.com/docs/introduction/contributing) diff --git a/Dockerfile b/Dockerfile index f295f7f6a..d1fa424e5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,7 +3,7 @@ FROM node:14-alpine AS build WORKDIR /opt/node_app COPY package.json yarn.lock ./ -RUN yarn --ignore-optional +RUN yarn --ignore-optional --network-timeout 600000 ARG NODE_ENV=production diff --git a/README.md b/README.md index 45fec41ba..31ee567de 100644 --- a/README.md +++ b/README.md @@ -1,201 +1,126 @@ -
- - Excalidraw logo: Sketch handrawn like diagrams. - -

Virtual whiteboard for sketching hand-drawn like diagrams.
Collaborative and end-to-end encrypted.

-

- - Follow Excalidraw on Twitter - - - - -

-

Ask questions or hang out on our discord.gg/UexuTaE.

+ + + + Excalidraw + + + +

+ Excalidraw Editor | + Blog | + Documentation | + Excalidraw+ +

+ +
+

+ An open source virtual hand-drawn style whiteboard.
+ Collaborative and end-to-end encrypted.
+
+

-## Try it now +
+

+ + Excalidraw is released under the MIT license. + + + PRs welcome! + + + Chat on Discord + + + Follow Excalidraw on Twitter + +

-Go to [excalidraw.com](https://excalidraw.com) to start sketching. +
+
+ + Product showcase + +
+

+ Create beautiful hand-drawn like diagrams, wireframes, or whatever you like. +

+
+
+
-Read the latest news and updates on our [blog](https://blog.excalidraw.com). A good start is to see all the updates of [One Year of Excalidraw](https://blog.excalidraw.com/one-year-of-excalidraw/). +## Features -## Supporting Excalidraw +The Excalidraw editor (npm package) supports: -If you like the project, you can become a sponsor at [Open Collective](https://opencollective.com/excalidraw). +- 💯 Free & open-source. +- 🎨 Infinite, canvas-based whiteboard. +- ✍️ Hand-drawn like style. +- 🌓 Dark mode. +- 🏗️ Customizable. +- 📷 Image support. +- 😀 Shape libraries support. +- 👅 Localization (i18n) support. +- 🖼️ Export to PNG, SVG & clipboard. +- 💾 Open format - export drawings as an `.excalidraw` json file. +- ⚒️ Wide range of tools - rectangle, circle, diamond, arrow, line, free-draw, eraser... +- ➡️ Arrow-binding & labeled arrows. +- 🔙 Undo / Redo. +- 🔍 Zoom and panning support. -[](https://opencollective.com/excalidraw/tiers/sponsors/0/website) [](https://opencollective.com/excalidraw/tiers/sponsors/1/website) [](https://opencollective.com/excalidraw/tiers/sponsors/2/website) [](https://opencollective.com/excalidraw/tiers/sponsors/3/website) [](https://opencollective.com/excalidraw/tiers/sponsors/4/website) [](https://opencollective.com/excalidraw/tiers/sponsors/5/website) [](https://opencollective.com/excalidraw/tiers/sponsors/6/website) [](https://opencollective.com/excalidraw/tiers/sponsors/7/website) [](https://opencollective.com/excalidraw/tiers/sponsors/8/website) [](https://opencollective.com/excalidraw/tiers/sponsors/9/website) [](https://opencollective.com/excalidraw/tiers/sponsors/10/website) +## Excalidraw.com + +The app hosted at [excalidraw.com](https://excalidraw.com) is a minimal showcase of what you can build with Excalidraw. Its [source code](https://github.com/excalidraw/excalidraw/tree/master/src/excalidraw-app) is part of this repository as well, and the app features: + +- 📡 PWA support (works offline). +- 🤼 Real-time collaboration. +- 🔒 End-to-end encryption. +- 💾 Local-first support (autosaves to the browser). +- 🔗 Shareable links (export to a readonly link you can share with others). + +We'll be adding these features as drop-in plugins for the npm package in the future. + +## Quick start + +Install the [Excalidraw npm package](https://www.npmjs.com/package/@excalidraw/excalidraw): + +``` +npm install react react-dom @excalidraw/excalidraw +``` + +or via yarn + +``` +yarn add react react-dom @excalidraw/excalidraw +``` + +Don't forget to check out our [Documentation](https://docs.excalidraw.com)! + +## Contributing + +- Missing something or found a bug? [Report here](https://github.com/excalidraw/excalidraw/issues). +- Want to contribute? Check out our [contribution guide](https://docs.excalidraw.com/docs/introduction/contributing) or let us know on [Discord](https://discord.gg/UexuTaE). +- Want to help with translations? See the [translation guide](https://docs.excalidraw.com/docs/introduction/contributing#translating). + +## Integrations + +- [VScode extension](https://marketplace.visualstudio.com/items?itemName=pomdtr.excalidraw-editor) +- [npm package](https://www.npmjs.com/package/@excalidraw/excalidraw) + +## Who's integrating Excalidraw + +[Google Cloud](https://googlecloudcheatsheet.withgoogle.com/architecture) • [Meta](https://meta.com/) • [CodeSandbox](https://codesandbox.io/) • [Obsidian Excalidraw](https://github.com/zsviczian/obsidian-excalidraw-plugin) • [Replit](https://replit.com/) • [Slite](https://slite.com/) • [Notion](https://notion.so/) • [HackerRank](https://www.hackerrank.com/) • and many others + +## Sponsors & support + +If you like the project, you can become a sponsor at [Open Collective](https://opencollective.com/excalidraw) or use [Excalidraw+](https://plus.excalidraw.com/). + +## Thank you for supporting Excalidraw + +[](https://opencollective.com/excalidraw/tiers/sponsors/0/website) [](https://opencollective.com/excalidraw/tiers/sponsors/1/website) [](https://opencollective.com/excalidraw/tiers/sponsors/2/website) [](https://opencollective.com/excalidraw/tiers/sponsors/3/website) [](https://opencollective.com/excalidraw/tiers/sponsors/4/website) [](https://opencollective.com/excalidraw/tiers/sponsors/5/website) [](https://opencollective.com/excalidraw/tiers/sponsors/6/website) [](https://opencollective.com/excalidraw/tiers/sponsors/7/website) [](https://opencollective.com/excalidraw/tiers/sponsors/8/website) [](https://opencollective.com/excalidraw/tiers/sponsors/9/website) [](https://opencollective.com/excalidraw/tiers/sponsors/10/website) Last but not least, we're thankful to these companies for offering their services for free: [![Vercel](./.github/assets/vercel.svg)](https://vercel.com) [![Sentry](./.github/assets/sentry.svg)](https://sentry.io) [![Crowdin](./.github/assets/crowdin.svg)](https://crowdin.com) - -## Who's integrating Excalidraw - -[Google Cloud](https://googlecloudcheatsheet.withgoogle.com/architecture) • [Meta](https://meta.com/) • [CodeSandbox](https://codesandbox.io/) • [Obsidian Excalidraw](https://github.com/zsviczian/obsidian-excalidraw-plugin) • [Replit](https://replit.com/) • [Slite](https://slite.com/) • [Notion](https://notion.so/) • [HackerRank](https://www.hackerrank.com/) • - -## Documentation - -### Shortcuts - -You can almost do anything with shortcuts. Click on the help icon on the bottom right corner to see them all. - -### Curved lines and arrows - -Choose line or arrow and click click click instead of drag. - -### Charts - -You can easily create charts by copy pasting data from Excel or just plain comma separated text. - -### Translating - -To translate Excalidraw into other languages, please visit [our Crowdin page](https://crowdin.com/project/excalidraw). To add a new language, [open an issue](https://github.com/excalidraw/excalidraw/issues/new) so we can get things set up on our end first. - -Translations will be available on the app if they exceed a certain threshold of completion (currently 85%). - -### Create a collaboration session manually - -In order to create a session manually, you just need to generate a link of this form: - -``` -https://excalidraw.com/#room=[0-9a-f]{20},[a-zA-Z0-9_-]{22} -``` - -#### Example - -``` -https://excalidraw.com/#room=91bd46ae3aa84dff9d20,pfLqgEoY1c2ioq8LmGwsFA -``` - -The first set of digits is the room. This is visible from the server that’s going to dispatch messages to everyone that knows this number. - -The second set of digits is the encryption key. The Excalidraw server doesn’t know about it. This is what all the participants use to encrypt/decrypt the messages. - -> Note: Please ensure that the encryption key is 22 characters long. - -## Shape libraries - -Find a growing list of libraries containing assets for your drawings at [libraries.excalidraw.com](https://libraries.excalidraw.com). - -## Embedding Excalidraw in your App? - -Try out [`@excalidraw/excalidraw`](https://www.npmjs.com/package/@excalidraw/excalidraw). This package allows you to easily embed Excalidraw as a React component into your apps. - -## Development - -### Code Sandbox - -- Go to https://codesandbox.io/p/github/excalidraw/excalidraw - - You may need to sign in with GitHub and reload the page -- You can start coding instantly, and even send PRs from there! - -### Local Installation - -These instructions will get you a copy of the project up and running on your local machine for development and testing purposes. - -#### Requirements - -- [Node.js](https://nodejs.org/en/) -- [Yarn](https://yarnpkg.com/getting-started/install) (v1 or v2.4.2+) -- [Git](https://git-scm.com/downloads) - -#### Clone the repo - -```bash -git clone https://github.com/excalidraw/excalidraw.git -``` - -#### Install the dependencies - -```bash -yarn -``` - -#### Start the server - -```bash -yarn start -``` - -Now you can open [http://localhost:3000](http://localhost:3000) and start coding in your favorite code editor. - -#### Collaboration - -For collaboration, you will need to set up [collab server](https://github.com/excalidraw/excalidraw-room) in local. - -#### Commands - -##### Install the dependencies - -``` -yarn -``` - -##### Run the project - -``` -yarn start -``` - -##### Reformat all files with Prettier - -``` -yarn fix -``` - -##### Run tests - -``` -yarn test -``` - -##### Update test snapshots - -``` -yarn test:update -``` - -##### Test for formatting with Prettier - -``` -yarn test:code -``` - -#### Docker Compose - -You can use docker-compose to work on Excalidraw locally if you don't want to setup a Node.js env. - -```sh -docker-compose up --build -d -``` - -### Self-hosting - -We publish a Docker image with the Excalidraw client at [excalidraw/excalidraw](https://hub.docker.com/r/excalidraw/excalidraw). You can use it to self-host your own client under your own domain, on Kubernetes, AWS ECS, etc. - -```sh -docker build -t excalidraw/excalidraw . -docker run --rm -dit --name excalidraw -p 5000:80 excalidraw/excalidraw:latest -``` - -The Docker image is free of analytics and other tracking libraries. - -**At the moment, self-hosting your own instance doesn't support sharing or collaboration features.** - -We are working towards providing a full-fledged solution for self-hosting your own Excalidraw. - -## Contributing - -Pull requests are welcome. For major changes, please [open an issue](https://github.com/excalidraw/excalidraw/issues/new) first to discuss what you would like to change. - -## Notable used tools - -- [Create React App](https://github.com/facebook/create-react-app) -- [Rough.js](https://roughjs.com) -- [TypeScript](https://www.typescriptlang.org) -- [Vercel](https://vercel.com) - -And the main source of inspiration for starting the project is the awesome [Zwibbler](https://zwibbler.com/demo/) app. diff --git a/dev-docs/docs/@excalidraw/excalidraw/api/api-intro.mdx b/dev-docs/docs/@excalidraw/excalidraw/api/api-intro.mdx new file mode 100644 index 000000000..aee7f3bfb --- /dev/null +++ b/dev-docs/docs/@excalidraw/excalidraw/api/api-intro.mdx @@ -0,0 +1,11 @@ +--- +slug: /@excalidraw/excalidraw/api +--- + +# API + +Currently the **API** is divided into 3 broad categories 👇 + +- [Props](/docs/@excalidraw/excalidraw/api/props) - The `props` you can pass to the `Excalidraw` component. +- [Children components](/docs/@excalidraw/excalidraw/api/children-components) - Official components you can use to customize the UI. +- [Utils](/docs/@excalidraw/excalidraw/api/utils) - Utilities and helpers you can use to export, restore and more. diff --git a/dev-docs/docs/@excalidraw/excalidraw/api/children-components/children-components-intro.mdx b/dev-docs/docs/@excalidraw/excalidraw/api/children-components/children-components-intro.mdx new file mode 100644 index 000000000..706adb594 --- /dev/null +++ b/dev-docs/docs/@excalidraw/excalidraw/api/children-components/children-components-intro.mdx @@ -0,0 +1,21 @@ +--- +sidebar_label: Children Components +slug: /@excalidraw/excalidraw/api/children-components +--- + +# `` children + +We expose several components you can render as children of the `` component to customize the UI. + +:::info + +We have only recently started migrating to this type of component API. Some UI components are still using render props, and some UI customization isn't supported yet (such as the toolbar or the element properties panel). Stay tuned for more updates! + +::: + +Below are the currently supported components: + +- [MainMenu](/docs/@excalidraw/excalidraw/api/children-components/main-menu) +- [WelcomeScreen](/docs/@excalidraw/excalidraw/api/children-components/welcome-screen) +- [Footer](/docs/@excalidraw/excalidraw/api/children-components/footer) +- [LiveCollaborationTrigger](/docs/@excalidraw/excalidraw/api/children-components/live-collaboration-trigger) diff --git a/dev-docs/docs/@excalidraw/excalidraw/api/children-components/footer.mdx b/dev-docs/docs/@excalidraw/excalidraw/api/children-components/footer.mdx new file mode 100644 index 000000000..262681895 --- /dev/null +++ b/dev-docs/docs/@excalidraw/excalidraw/api/children-components/footer.mdx @@ -0,0 +1,69 @@ +# Footer + +Earlier we were using `renderFooter` prop to render custom footer which was removed in [#5970](https://github.com/excalidraw/excalidraw/pull/5970). Now you can pass a `Footer` component instead to render the custom UI for footer. + +You will need to import the `Footer` component from the package and wrap your component with the Footer component. The `Footer` should a valid React Node. + +**Usage** + +```jsx live +function App() { + return ( +
+ +
+ +
+
+
+ ); +} +``` + +This will only for `Desktop` devices. + +For `mobile` you will need to render it inside the [MainMenu](#mainmenu). You can use the [`useDevice`](#useDevice) hook to check the type of device, this will be available only inside the `children` of `Excalidraw` component. + +Open the `Menu` in the below playground and you will see the `custom footer` rendered. + +```jsx live noInline +const MobileFooter = ({}) => { + const device = useDevice(); + if (device.isMobile) { + return ( +
+ +
+ ); + } + return null; +}; + +const App = () => ( +
+ + + Item1 + Item 2 + + + +
+); + +// Need to render when code is span across multiple components +// in Live Code blocks editor +render(); +``` \ No newline at end of file diff --git a/dev-docs/docs/@excalidraw/excalidraw/api/children-components/live-collaboration-trigger.mdx b/dev-docs/docs/@excalidraw/excalidraw/api/children-components/live-collaboration-trigger.mdx new file mode 100644 index 000000000..ef74d0e65 --- /dev/null +++ b/dev-docs/docs/@excalidraw/excalidraw/api/children-components/live-collaboration-trigger.mdx @@ -0,0 +1,62 @@ +# LiveCollaborationTrigger + +If you implement live collaboration support and want to expose the same UI button as on [excalidraw.com](https://excalidraw.com), you can render the `` component using the [renderTopRightUI](/docs/@excalidraw/excalidraw/api/props#rendertoprightui) prop. + +You'll need to supply `onSelect()` to handle opening of your collaboration dialog, but the button will display `appState.collaborators` count provided you have supplied it. + +| Prop | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| `onSelect` | `function` | Yes | | Handler called when the user clicks on the button | +| `isCollaborating` | `boolean` | Yes | false | Whether live collaboration session is in effect. Modifies button style. | + +```tsx live +function App() { + const [excalidrawAPI, setExcalidrawAPI] = useState(null); + const [isCollaborating, setIsCollaborating] = useState(false); + return ( +
+

+ Selecting the checkbox to see the collaborator count +

+ + setExcalidrawAPI(api)} + renderTopRightUI={() => ( + { + window.alert("You clicked on collab button"); + setIsCollaborating(true); + }} + /> + )} + > +
+ ); +} +``` diff --git a/dev-docs/docs/@excalidraw/excalidraw/api/children-components/main-menu.mdx b/dev-docs/docs/@excalidraw/excalidraw/api/children-components/main-menu.mdx new file mode 100644 index 000000000..8fbf228df --- /dev/null +++ b/dev-docs/docs/@excalidraw/excalidraw/api/children-components/main-menu.mdx @@ -0,0 +1,169 @@ +# MainMenu + +By default Excalidraw will render the `MainMenu` with default options. If you want to customise the `MainMenu`, you can pass the `MainMenu` component with the list options. + +**Usage** + +```jsx live +function App() { + return ( +
+ + + window.alert("Item1")}> + Item1 + + window.alert("Item2")}> + {" "} + Item 2{" "} + + + +
+ ); +} +``` + +### `` + +This is the `MainMenu` component. If you render it, you will need to populate the menu with your own items as we will not render any ourselves at that point. + +| Prop | Type | Required | Default | Description | +| --- | --- | :-: | :-: | --- | +| `onSelect` | `function` | No | - | Triggered when any item is selected (via mouse). Calling `event.preventDefault()` will stop menu from closing. | + +### MainMenu.Item + +To render an item, its recommended to use `MainMenu.Item`. + +| Prop | Type | Required | Default | Description | +| --- | --- | :-: | :-: | --- | +| `onSelect` | `function` | Yes | - | Triggered when selected (via mouse). Calling `event.preventDefault()` will stop menu from closing. | +| `children` | `React.ReactNode` | Yes | - | The content of the menu item | +| `icon` | `JSX.Element` | No | - | The icon used in the menu item | +| `shortcut` | `string` | No | - | The shortcut to be shown for the menu item | + +### MainMenu.ItemLink + +To render an item as a link, its recommended to use `MainMenu.ItemLink`. + +**Usage** + +```jsx live +function App() { + return ( +
+ + + + Google + + + Excalidraw + + + +
+ ); +} +``` + +| Prop | Type | Required | Default | Description | +| --- | --- | :-: | :-: | --- | +| `onSelect` | `function` | No | - | Triggered when selected (via mouse). Calling `event.preventDefault()` will stop menu from closing. | +| `href` | `string` | Yes | - | The `href` attribute to be added to the `anchor` element. | +| `children` | `React.ReactNode` | Yes | - | The content of the menu item | +| `icon` | `JSX.Element` | No | - | The icon used in the menu item | +| `shortcut` | `string` | No | - | The shortcut to be shown for the menu item | + +### MainMenu.ItemCustom + +To render a custom item, you can use `MainMenu.ItemCustom`. + +**Usage** + +```jsx live +function App() { + return ( +
+ + + + + + + +
+ ); +} +``` + +| Prop | Type | Required | Default | Description | +| --- | --- | :-: | :-: | --- | +| `children` | `React.ReactNode` | Yes | - | The content of the menu item | + +### MainMenu.DefaultItems + +For the items which are shown in the menu in [excalidraw.com](https://excalidraw.com), you can use `MainMenu.DefaultItems` + +```jsx live +function App() { + return ( +
+ + + + + window.alert("Item1")}> + Item1 + + window.alert("Item2")}> + Item 2 + + + +
+ ); +} +``` + +Here is a [complete list](https://github.com/excalidraw/excalidraw/blob/master/src/components/mainMenu/DefaultItems.tsx) of the default items. + +### MainMenu.Group + +To Group item in the main menu, you can use `MainMenu.Group` + +```jsx live +function App() { + return ( +
+ + + + + + + + window.alert("Item1")}> + Item1 + + window.alert("Item2")}> + Item 2 + + + + +
+ ); +} +``` + +| Prop | Type | Required | Default | Description | +| --- | --- | :-: | :-: | --- | +| `children ` | `React.ReactNode` | Yes | - | The content of the `Menu Group` | diff --git a/dev-docs/docs/@excalidraw/excalidraw/api/children-components/welcome-screen.mdx b/dev-docs/docs/@excalidraw/excalidraw/api/children-components/welcome-screen.mdx new file mode 100644 index 000000000..8150508bf --- /dev/null +++ b/dev-docs/docs/@excalidraw/excalidraw/api/children-components/welcome-screen.mdx @@ -0,0 +1,140 @@ +# WelcomeScreen + +When the canvas is empty, Excalidraw can show a welcome _splash_ screen with a logo, a few quick action items, and hints explaining what some of the UI buttons do. Once the user picks a tool, or has created an element on the canvas, the welcome screen will disappear. + +You can enable this behavior by rendering a `WelcomeScreen` component like this: + +```jsx live +function App() { + return ( +
+ + + +
+ ); +} +``` + +You can also customize the welcome screen by passing children to the `WelcomeScreen` component. See below. + +## + +This is the main component. If you render it without any children, we will render the default welcome screen. + +You can customize which welcome screen subcomponents are rendered by passing them as children. + +The welcome screen consists of two main groups of subcomponents: + +1. [WelcomeScreen.Center](#welcomescreencenterlogo). +2. [WeelcomeScreen.Hints](#welcomescreenhints). + +Excalidraw logo: Sketch handrawn like diagrams. + +### Center + +`` subcomponent is the center piece of the welcome screen, containing the `logo`, `heading`, and `menu`. All three subcomponents are optional, and you can render whatever you wish into the center component. + +```jsx live +function App() { + return ( +
+ + + + + + Welcome Screen Heading! + + + + Excalidraw GitHub + + + + + + +
+ ); +} +``` + +#### Logo + +Use the `` to render a logo. By default it renders the Excalidraw logo and name. Supply `children` to customize. + +#### Heading + +Use the `` to render a heading below the logo. Supply `children` to change the default message. + +#### Menu + +`` is a wrapper component for the menu items. You can build your menu using the `` and `` components, render your own, or render one of the default menu items. + +The default menu items are: + +- `` - opens the help dialog. + +- `` - open the load file dialog. + +- `` - intended to open the live collaboration dialog. Works similarly to [``](/docs/@excalidraw/excalidraw/api/children-components/live-collaboration-trigger) and you must supply `onSelect()` handler to integrate with your collaboration implementation. + +#### MenuItem + +The `` component can be used to render a menu item. + +| Prop | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| `onSelect` | `function` | Yes | | The handler is triggered when the item is selected. | +| `children` | `React.ReactNode` | Yes | | The content of the menu item | +| `icon` | `JSX.Element` | No | | The icon used in the menu item | +| `shortcut` | `string` | No | | The keyboard shortcut (label-only, does not affect behavior) | + +**WelcomeScreen.Center.MenuItemLink** + +To render an external link in a menu item, you can use this component. + +| Prop | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| `href` | `string` | Yes | | The `href` attribute to be added to the `anchor` element. | +| `children` | `React.ReactNode` | Yes | | The content of the menu item | +| `icon` | `JSX.Element` | No | | The icon used in the menu item | +| `shortcut` | `string` | No | | The keyboard shortcut (label-only, does not affect behavior) | + +### Hints + +These `` subcomponents render the UI hints. Text of each hint can be customized by supplying `children`. + +```jsx live +function App() { + return ( +
+ + + +

ToolBar Hints

+
+ + +
+
+
+ ); +} +``` + +#### MenuHint + +`` hint subcomponent for the main menu. Supply `children` to customize the hint text. + +#### ToolbarHint + +`` hint subcomponent for the toolbar. Supply `children` to customize the hint text. + +#### Help + +`` hint subcomponent for the help dialog. Supply `children` to customize the hint text. diff --git a/dev-docs/docs/@excalidraw/excalidraw/api/constants.mdx b/dev-docs/docs/@excalidraw/excalidraw/api/constants.mdx new file mode 100644 index 000000000..a6c95ab2a --- /dev/null +++ b/dev-docs/docs/@excalidraw/excalidraw/api/constants.mdx @@ -0,0 +1,46 @@ +# Constants + +### FONT_FAMILY + +**How to use** + +```js +import { FONT_FAMILY } from "@excalidraw/excalidraw"; +``` + +`FONT_FAMILY` contains all the font families used in `Excalidraw` as explained below + +| Font Family | Description | +| ----------- | ---------------------- | +| `Virgil` | The `handwritten` font | +| `Helvetica` | The `Normal` Font | +| `Cascadia` | The `Code` Font | + +Defaults to `FONT_FAMILY.Virgil` unless passed in `initialData.appState.currentItemFontFamily`. + +### THEME + +**How to use** + +```js +import { THEME } from "@excalidraw/excalidraw"; +``` + +`THEME` contains all the themes supported by `Excalidraw` as explained below + +| Theme | Description | +| ------- | ----------------- | +| `LIGHT` | The `light` theme | +| `DARK` | The `Dark` theme | + +Defaults to `THEME.LIGHT` unless passed in `initialData.appState.theme` + +### MIME_TYPES + +[`MIME_TYPES`](https://github.com/excalidraw/excalidraw/blob/master/src/constants.ts#L101) contains all the mime types supported by `Excalidraw`. + +**How to use ** + +```js +import { MIME_TYPES } from "@excalidraw/excalidraw"; +``` diff --git a/dev-docs/docs/@excalidraw/excalidraw/api/props/initialdata.mdx b/dev-docs/docs/@excalidraw/excalidraw/api/props/initialdata.mdx new file mode 100644 index 000000000..7d79128f0 --- /dev/null +++ b/dev-docs/docs/@excalidraw/excalidraw/api/props/initialdata.mdx @@ -0,0 +1,55 @@ +# initialData + +
+{ elements?: ExcalidrawElement[], appState?: AppState }
+
+ +This helps to load Excalidraw with `initialData`. It must be an object or a [promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/Promise) which resolves to an object containing the below optional fields. + +| Name | Type | Description | +| --- | --- | --- | +| `elements` | [ExcalidrawElement[]](https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L114) | The `elements` with which `Excalidraw` should be mounted. | +| `appState` | [AppState](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L95) | The `AppState` with which `Excalidraw` should be mounted. | +| `scrollToContent` | `boolean` | This attribute indicates whether to `scroll` to the nearest element to center once `Excalidraw` is mounted. By default, it will not scroll the nearest element to the center. Make sure you pass `initialData.appState.scrollX` and `initialData.appState.scrollY` when `scrollToContent` is false so that scroll positions are retained | +| `libraryItems` | [LibraryItems](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L247) | Promise<[LibraryItems](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L200)> | This library items with which `Excalidraw` should be mounted. | +| `files` | [BinaryFiles](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L82) | The `files` added to the scene. | + +You might want to use this when you want to load excalidraw with some initial elements and app state. + +```jsx live +function App() { + return ( +
+ +
+ ); +} +``` diff --git a/dev-docs/docs/@excalidraw/excalidraw/api/props/props.mdx b/dev-docs/docs/@excalidraw/excalidraw/api/props/props.mdx new file mode 100644 index 000000000..a871874c5 --- /dev/null +++ b/dev-docs/docs/@excalidraw/excalidraw/api/props/props.mdx @@ -0,0 +1,230 @@ +# Props + +All `props` are *optional*. + +| Name | Type | Default | Description | +| --- | --- | --- | --- | +| [`initialData`](/docs/@excalidraw/excalidraw/api/props/initialdata) | `object` | `null` | Promise | `null` | The initial data with which app loads. | +| [`ref`](/docs/@excalidraw/excalidraw/api/props/ref) | `object` | _ | `Ref` to be passed to Excalidraw | +| [`isCollaborating`](#iscollaborating) | `boolean` | _ | This indicates if the app is in `collaboration` mode | +| [`onChange`](#onchange) | `function` | _ | This callback is triggered whenever the component updates due to any change. This callback will receive the excalidraw `elements` and the current `app state`. | +| [`onPointerUpdate`](#onpointerupdate) | `function` | _ | Callback triggered when mouse pointer is updated. | +| [`onPointerDown`](#onpointerdown) | `function` | _ | This prop if passed gets triggered on pointer down evenets | +| [`onScrollChange`](#onscrollchange) | `function` | _ | This prop if passed gets triggered when scrolling the canvas. | +| [`onPaste`](#onpaste) | `function` | _ | Callback to be triggered if passed when the something is pasted in to the scene | +| [`onLibraryChange`](#onlibrarychange) | `function` | _ | The callback if supplied is triggered when the library is updated and receives the library items. | +| [`onLinkOpen`](#onlinkopen) | `function` | _ | The callback if supplied is triggered when any link is opened. | +| [`langCode`](#langcode) | `string` | `en` | Language code string to be used in Excalidraw | +| [`renderTopRightUI`](/docs/@excalidraw/excalidraw/api/props/render-props#rendertoprightui) | `function` | _ | Render function that renders custom UI in top right corner | +| [`renderCustomStats`](/docs/@excalidraw/excalidraw/api/props/render-props#rendercustomstats) | `function` | _ | Render function that can be used to render custom stats on the stats dialog. | +| [`renderSidebar`](/docs/@excalidraw/excalidraw/api/props/render-props#rendersidebar) | `function` | _ | Render function that renders custom sidebar. | +| [`viewModeEnabled`](#viewmodeenabled) | `boolean` | _ | This indicates if the app is in `view` mode. | +| [`zenModeEnabled`](#zenmodeenabled) | `boolean` | _ | This indicates if the `zen` mode is enabled | +| [`gridModeEnabled`](#gridmodeenabled) | `boolean` | _ | This indicates if the `grid` mode is enabled | +| [`libraryReturnUrl`](#libraryreturnurl) | `string` | _ | What URL should [libraries.excalidraw.com](https://libraries.excalidraw.com) be installed to | +| [`theme`](#theme) | `"light"` | `"dark"` | `"light"` | The theme of the Excalidraw component | +| [`name`](#name) | `string` | | Name of the drawing | +| [`UIOptions`](/docs/@excalidraw/excalidraw/api/props/ui-options) | `object` | [DEFAULT UI OPTIONS](https://github.com/excalidraw/excalidraw/blob/master/src/constants.ts#L151) | To customise UI options. Currently we support customising [`canvas actions`](#canvasactions) | +| [`detectScroll`](#detectscroll) | `boolean` | `true` | Indicates whether to update the offsets when nearest ancestor is scrolled. | +| [`handleKeyboardGlobally`](#handlekeyboardglobally) | `boolean` | `false` | Indicates whether to bind the keyboard events to document. | +| [`autoFocus`](#autofocus) | `boolean` | `false` | indicates whether to focus the Excalidraw component on page load | +| [`generateIdForFile`](#generateidforfile) | `function` | _ | Allows you to override `id` generation for files added on canvas | + +### Storing custom data on Excalidraw elements + +Beyond attributes that Excalidraw elements already support, you can store `custom` data on each `element` in a `customData` object. The type of the attribute is [`Record`](https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L66) and is optional. + +You can use this to add any extra information you need to keep track of. + +You can add `customData` to elements when passing them as [`initialData`](/docs/@excalidraw/excalidraw/api/props/initialdata), or using [`updateScene`](/docs/@excalidraw/excalidraw/api/props/ref#updatescene) / [`updateLibrary`](/docs/@excalidraw/excalidraw/api/props/ref#updatelibrary) afterwards. + +```js showLineNumbers +{ + type: "rectangle", + id: "oDVXy8D6rom3H1-LLH2-f", + customData: {customId: '162'}, +} +``` + +### isCollaborating + +This prop indicates if the app is in `collaboration` mode. + +### onChange + +Every time component updates, this callback if passed will get triggered and has the below signature. + +```js +(excalidrawElements, appState, files) => void; +``` + +1. `excalidrawElements`: Array of [excalidrawElements](https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L114) in the scene. + +2. `appState`: [AppState](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L95) of the scene. + +3. `files`: The [BinaryFiles](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L64) which are added to the scene. + +Here you can try saving the data to your backend or local storage for example. + +### onPointerUpdate + +This callback is triggered when mouse pointer is updated. + +```js +({ x, y }, button, pointersMap}) => void; +``` + +1.`{x, y}`: Pointer coordinates + +2.`button`: The position of the button. This will be one of `["down", "up"]` + +3.`pointersMap`: [`pointers`](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L131) map of the scene + +```js +(exportedElements, appState, canvas) => void +``` + +1. `exportedElements`: An array of [non deleted elements](https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L87) which needs to be exported. +2. `appState`: [AppState](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L95) of the scene. +3. `canvas`: The `HTMLCanvasElement` of the scene. + +### onPointerDown + +This prop if passed will be triggered on pointer down events and has the below signature. + +
+(activeTool:  AppState["activeTool"], pointerDownState: PointerDownState) => void
+
+ +### onScrollChange + +This prop if passed will be triggered when canvas is scrolled and has the below signature. + +```ts +(scrollX: number, scrollY: number) => void +``` + +### onPaste + +This callback is triggered if passed when something is pasted into the scene. You can use this callback in case you want to do something additional when the paste event occurs. + +
+(data: ClipboardData, event: ClipboardEvent | null) => boolean
+
+ +This callback must return a `boolean` value or a [promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/Promise) which resolves to a boolean value. + +In case you want to prevent the excalidraw paste action you must return `false`, it will stop the native excalidraw clipboard management flow (nothing will be pasted into the scene). + +### onLibraryChange + +This callback if supplied will get triggered when the library is updated and has the below signature. + +
+  (items:{" "}
+  
+    LibraryItems
+  
+  ) => void | Promise<any>
+
+ +It is invoked with empty items when user clears the library. You can use this callback when you want to do something additional when library is updated for example persisting it to local storage. + +### onLinkOpen + +This prop if passed will be triggered when clicked on `link`. To handle the redirect yourself (such as when using your own router for internal links), you must call `event.preventDefault()`. + +
+(element: ExcalidrawElement, 
+ event: CustomEvent<{ nativeEvent: MouseEvent }>) => void
+
+ +Example: + +```js showLineNumbers +const history = useHistory(); + +// open internal links using the app's router, but opens external links in +// a new tab/window +const onLinkOpen: ExcalidrawProps["onLinkOpen"] = useCallback( + (element, event) => { + const link = element.link; + const { nativeEvent } = event.detail; + const isNewTab = nativeEvent.ctrlKey || nativeEvent.metaKey; + const isNewWindow = nativeEvent.shiftKey; + const isInternalLink = + link.startsWith("/") || link.includes(window.location.origin); + if (isInternalLink && !isNewTab && !isNewWindow) { + history.push(link.replace(window.location.origin, "")); + // signal that we're handling the redirect ourselves + event.preventDefault(); + } + }, + [history], +); +``` + +### langCode + +Determines the `language` of the UI. It should be one of the [available language codes](https://github.com/excalidraw/excalidraw/blob/master/src/i18n.ts#L14). Defaults to `en` (English). We also export default language and supported languages which you can import as shown below. + +```js +import { defaultLang, languages } from "@excalidraw/excalidraw"; +``` + +| name | type | +| --- | --- | +| `defaultLang` | `string` | +| `languages` | [`Language[]`](https://github.com/excalidraw/excalidraw/blob/master/src/i18n.ts#L15) | + +### viewModeEnabled + +This prop indicates whether the app is in `view mode`. When supplied, the value takes precedence over *intialData.appState.viewModeEnabled*, the `view mode` will be fully controlled by the host app, and users won't be able to toggle it from within the app. + +### zenModeEnabled + +This prop indicates whether the app is in `zen mode`. When supplied, the value takes precedence over *intialData.appState.zenModeEnabled*, the `zen mode` will be fully controlled by the host app, and users won't be able to toggle it from within the app. + +### gridModeEnabled + +This prop indicates whether the shows the grid. When supplied, the value takes precedence over *intialData.appState.gridModeEnabled*, the grid will be fully controlled by the host app, and users won't be able to toggle it from within the app. + +### libraryReturnUrl + +If supplied, this URL will be used when user tries to install a library from [libraries.excalidraw.com](https://libraries.excalidraw.com). +Defaults to *window.location.origin + window.location.pathname*. To install the libraries in the same tab from which it was opened, you need to set `window.name` (to any alphanumeric string) — if it's not set it will open in a new tab. + +### theme + +This prop controls Excalidraw's theme. When supplied, the value takes precedence over *intialData.appState.theme*, the theme will be fully controlled by the host app, and users won't be able to toggle it from within the app unless *UIOptions.canvasActions.toggleTheme* is set to `true`, in which case the `theme` prop will control Excalidraw's default theme with ability to allow theme switching (you must take care of updating the `theme` prop when you detect a change to `appState.theme` from the [onChange](#onchange) callback). + +You can use [`THEME`](/docs/@excalidraw/excalidraw/api/utils#theme) to specify the theme. + +### name + +This prop sets the `name` of the drawing which will be used when exporting the drawing. When supplied, the value takes precedence over *intialData.appState.name*, the `name` will be fully controlled by host app and the users won't be able to edit from within Excalidraw. + + +### detectScroll + +Indicates whether Excalidraw should listen for `scroll` event on the nearest scrollable container in the DOM tree and recompute the coordinates (e.g. to correctly handle the cursor) when the component's position changes. You can disable this when you either know this doesn't affect your app or you want to take care of it yourself (calling the [`refresh()`](#ref) method). + +### handleKeyboardGlobally + +Indicates whether to bind keyboard events to `document`. Disabled by default, meaning the keyboard events are bound to the Excalidraw component. This allows for multiple Excalidraw components to live on the same page, and ensures that Excalidraw keyboard handling doesn't collide with your app's (or the browser) when the component isn't focused. + +Enable this if you want Excalidraw to handle keyboard even if the component isn't focused (e.g. a user is interacting with the navbar, sidebar, or similar). + + +### autoFocus + +This prop indicates whether to `focus` the Excalidraw component on page load. Defaults to false. + +### generateIdForFile + +Allows you to override `id` generation for files added on canvas (images). By default, an SHA-1 digest of the file is used. + +```tsx +(file: File) => string | Promise +``` + diff --git a/dev-docs/docs/@excalidraw/excalidraw/api/props/ref.mdx b/dev-docs/docs/@excalidraw/excalidraw/api/props/ref.mdx new file mode 100644 index 000000000..a37843c76 --- /dev/null +++ b/dev-docs/docs/@excalidraw/excalidraw/api/props/ref.mdx @@ -0,0 +1,391 @@ +# ref +
+createRef | useRef | callbackRef | 
{ current: { readyPromise: resolvablePromise } } +
+ +You can pass a `ref` when you want to access some excalidraw APIs. We expose the below APIs: + +| API | Signature | Usage | +| --- | --- | --- | +| ready | `boolean` | This is set to true once Excalidraw is rendered | +| [readyPromise](#readypromise) | `function` | This promise will be resolved with the api once excalidraw has rendered. This will be helpful when you want do some action on the host app once this promise resolves. For this to work you will have to pass ref as shown [here](#readypromise) | +| [updateScene](#updatescene) | `function` | updates the scene with the sceneData | +| [updateLibrary](#updatelibrary) | `function` | updates the scene with the sceneData | +| [addFiles](#addfiles) | `function` | add files data to the appState | +| [resetScene](#resetscene) | `function` | Resets the scene. If `resetLoadingState` is passed as true then it will also force set the loading state to false. | +| [getSceneElementsIncludingDeleted](#getsceneelementsincludingdeleted) | `function` | Returns all the elements including the deleted in the scene | +| [getSceneElements](#getsceneelements) | `function` | Returns all the elements excluding the deleted in the scene | +| [getAppState](#getappstate) | `function` | Returns current appState | +| [history](#history) | `object` | This is the history API. `history.clear()` will clear the history | +| [scrollToContent](#scrolltocontent) | `function` | Scroll the nearest element out of the elements supplied to the center. Defaults to the elements on the scene. | +| [refresh](#refresh) | `function` | Updates the offsets for the Excalidraw component so that the coordinates are computed correctly (for example the cursor position). | +| [setToast](#settoast) | `function` | This API can be used to show the toast with custom message. | +| [id](#id) | `string` | Unique ID for the excalidraw component. | +| [getFiles](#getfiles) | `function` | This API can be used to get the files present in the scene. | +| [setActiveTool](#setactivetool) | `function` | This API can be used to set the active tool | +| [setCursor](#setcursor) | `function` | This API can be used to set customise the mouse cursor on the canvas | +| [resetCursor](#resetcursor) | `function` | This API can be used to reset to default mouse cursor on the canvas | +| [toggleMenu](#togglemenu) | `function` | Toggles specific menus on/off | + +## readyPromise + +
+  const excalidrawRef = { current:{ readyPromise:
+  
+     resolvablePromise
+  
+   } }
+
+ +Since plain object is passed as a `ref`, the `readyPromise` is resolved as soon as the component is mounted. Most of the time you will not need this unless you have a specific use case where you can't pass the `ref` in the react way and want to do some action on the host when this promise resolves. + +```jsx showLineNumbers +const resolvablePromise = () => { + let resolve; + let reject; + const promise = new Promise((_resolve, _reject) => { + resolve = _resolve; + reject = _reject; + }); + promise.resolve = resolve; + promise.reject = reject; + return promise; +}; + +const App = () => { + const excalidrawRef = useMemo( + () => ({ + current: { + readyPromise: resolvablePromise(), + }, + }), + [], + ); + + useEffect(() => { + excalidrawRef.current.readyPromise.then((api) => { + console.log("loaded", api); + }); + }, [excalidrawRef]); + return ( +
+ +
+ ); +}; +``` + +## updateScene + +
+  (scene:{" "}
+  
+    sceneData
+  
+  ) => void
+
+ +You can use this function to update the scene with the sceneData. It accepts the below attributes. + +| Name | Type | Description | +| --- | --- | --- | +| `elements` | [`ImportedDataState["elements"]`](https://github.com/excalidraw/excalidraw/blob/master/src/data/types.ts#L38) | The `elements` to be updated in the scene | +| `appState` | [`ImportedDataState["appState"]`](https://github.com/excalidraw/excalidraw/blob/master/src/data/types.ts#L39) | The `appState` to be updated in the scene. | +| `collaborators` | MapCollaborator> | The list of collaborators to be updated in the scene. | +| `commitToHistory` | `boolean` | Implies if the `history (undo/redo)` should be recorded. Defaults to `false`. | + +```jsx live +function App() { + const updateScene = () => { + const sceneData = { + elements: [ + { + type: "rectangle", + version: 141, + versionNonce: 361174001, + isDeleted: false, + id: "oDVXy8D6rom3H1-LLH2-f", + fillStyle: "hachure", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 0, + x: 100.50390625, + y: 93.67578125, + strokeColor: "#c92a2a", + backgroundColor: "transparent", + width: 186.47265625, + height: 141.9765625, + seed: 1968410350, + groupIds: [], + boundElements: null, + locked: false, + link: null, + updated: 1, + roundness: { + type: 3, + value: 32, + }, + }, + ], + appState: { + viewBackgroundColor: "#edf2ff", + }, + }; + excalidrawAPI.updateScene(sceneData); + }; + const [excalidrawAPI, setExcalidrawAPI] = useState(null); + return ( +
+

Click to update the scene

+ + setExcalidrawAPI(api)} /> +
+ ); +} +``` + +### updateLibrary + +
+  (opts: { 
libraryItems:{" "} + + LibraryItemsSource + + ;
merge?: boolean;
prompt?: boolean; +
openLibraryMenu?: boolean; +
defaultStatus?: "unpublished" | "published";
}) => Promise< + + LibraryItems + + > +
+ +You can use this function to update the library. It accepts the below attributes. + +| Name | Type | Default | Description | +| --- | --- | --- | --- | +| `libraryItems` | [LibraryItemsSource](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L249) | \_ | The `libraryItems` to be replaced/merged with current library | +| `merge` | boolean | `false` | Whether to merge with existing library items. | +| `prompt` | boolean | `false` | Whether to prompt user for confirmation. | +| `openLibraryMenu` | boolean | `false` | Keep the library menu open after library is updated. | +| `defaultStatus` | "unpublished" | "published" | `"unpublished"` | Default library item's `status` if not present. | + +```tsx live +function App() { + const [excalidrawAPI, setExcalidrawAPI] = useState(null); + + useEffect(() => { + if (!excalidrawAPI) { + return; + } + // to open the library sidebar + excalidrawAPI.updateScene({ appState: { openSidebar: "library" } }); + }, [excalidrawAPI]); + + return ( +
+

Click to update the library items

+ + setExcalidrawAPI(api)} + // initial data retrieved from https://github.com/excalidraw/excalidraw/blob/master/dev-docs/src/initialData.js + initialData={{ + libraryItems: initialData.libraryItems, + appState: { openSidebar: "library" }, + }} + /> +
+ ); +} +``` + +### addFiles + +
+  (files:{" "}
+  
+    BinaryFileData
+  
+  ) => void
+
+ +Adds supplied files data to the `appState.files` cache on top of existing files present in the cache. + +## resetScene + +```tsx +(opts?: { resetLoadingState: boolean }) => void +``` + +Resets the scene. If `resetLoadingState` is passed as true then it will also force set the loading state to false. + +## getSceneElementsIncludingDeleted + +
+  () =>{" "}
+  
+    ExcalidrawElement[]
+  
+
+ +Returns all the elements including the deleted in the scene. + +## getSceneElements + +
+  () => NonDeleted<
+  
+    ExcalidrawElement
+  
+  []>
+
+ +Returns all the elements excluding the deleted in the scene + +## getAppState + +
+  () =>{" "}
+  
+    AppState
+  
+
+ +Returns current appState. + +## history + +```tsx +{ + clear: () => void +} +``` + +This is the history API. history.clear() will clear the history. + +## scrollToContent + +
+  (target?:{" "}
+  
+    ExcalidrawElement
+  {" "}
+  |{" "}
+  
+    ExcalidrawElement
+  
+  []) => void
+
+ +Scroll the nearest element out of the elements supplied to the center. Defaults to the elements on the scene. + +## refresh + +```tsx +() => void +``` + +Updates the `offsets` for the `Excalidraw` component so that the coordinates are computed correctly (for example the cursor position). + +You don't have to call this when the position is changed on page scroll or when the excalidraw container resizes (we handle that ourselves). + +For any other cases if the position of excalidraw is updated (example due to scroll on parent container and not page scroll) you should call this API. + +## setToast + +This API can be used to show the toast with custom message. + +```tsx +({ message: string, closable?:boolean,duration?:number + } | null) => void +``` + +| Attribute | type | Description | +| --- | --- | --- | +| message | string | The message to be shown on the toast. | +| closable | boolean | Indicates whether to show the closable button on toast to dismiss the toast. | +| duration | number | Determines the duration after which the toast should auto dismiss. To prevent autodimiss you can pass `Infinity`. | + +To dismiss an existing toast you can simple pass `null` + +```js +setToast(null); +``` + +## id + +The unique id of the excalidraw component. This can be used to identify the excalidraw component, for example importing the library items to the excalidraw component from where it was initiated when you have multiple excalidraw components rendered on the same page as shown in [multiple excalidraw demo](https://codesandbox.io/s/multiple-excalidraw-k1xx5). + +## getFiles + +
+  () =>{" "}
+  
+    files
+  
+
+ +This API can be used to get the files present in the scene. It may contain files that aren't referenced by any element, so if you're persisting the files to a storage, you should compare them against stored elements. + +## setActiveTool + +This API has the below signature. It sets the `tool` passed in param as the active tool. + + +
+(tool: 
{ type: SHAPES[number]["value"]| "eraser" } |
{ type: "custom"; customType: string }) => void +
+ +## setCursor + +This API can be used to customise the mouse cursor on the canvas and has the below signature. +It sets the mouse cursor to the cursor passed in param. + +```tsx +(cursor: string) => void +``` + +## toggleMenu + +```tsx +(type: "library" | "customSidebar", force?: boolean) => boolean; +``` + +This API can be used to toggle a specific menu (currently only the sidebars), and returns whether the menu was toggled on or off. If the `force` flag passed, it will force the menu to be toggled either on/off based on the `boolean` passed. + +This API is especially useful when you render a custom sidebar using [`renderSidebar`](#rendersidebar) prop, and you want to toggle it from your app based on a user action. + +## resetCursor + +```tsx +() => void +``` + +This API can be used to reset to default mouse cursor. diff --git a/dev-docs/docs/@excalidraw/excalidraw/api/props/render-props.mdx b/dev-docs/docs/@excalidraw/excalidraw/api/props/render-props.mdx new file mode 100644 index 000000000..ca329e3e6 --- /dev/null +++ b/dev-docs/docs/@excalidraw/excalidraw/api/props/render-props.mdx @@ -0,0 +1,126 @@ +# Render Props + +## renderTopRightUI + +
+  (isMobile: boolean, appState:{" "}
+  
+    AppState
+  
+  ) => JSX | null
+
+ +A function returning `JSX` to render `custom` UI in the top right corner of the app. + +```jsx live +function App() { + return ( +
+ { + return ( + + ); + }} + /> +
+ ); +} +``` + +## renderCustomStats + +A function that can be used to render custom stats (returns JSX) in the `nerd stats` dialog. + +![Nerd Stats](../../../../assets/nerd-stats.png) + +For example you can use this prop to render the size of the elements in the storage as do in [excalidraw.com](https://excalidraw.com). + +```jsx live +function App() { + return ( +
+ ( +

+ {" "} + Dummy stats will be shown here{" "} +

+ )} + /> +
+ ); +} +``` + +## renderSidebar + +```tsx +() => JSX | null; +``` + +You can render `custom sidebar` using this prop. This sidebar is the same that the library menu sidebar is using, and can be used for any purposes your app needs. + +You need to import the `Sidebar` component from `excalidraw` package and pass your content as its `children`. The function `renderSidebar` should return the `Sidebar` instance. + +### Sidebar +The `` component takes these props (all are optional except `children`): + +| Prop | Type | Description | +| --- | --- | --- | +| `children` | `React.ReactNode` | Content you want to render inside the `sidebar`. | +| `onClose` | `function` | Invoked when the component is closed (by user, or the editor). No need to act on this event, as the editor manages the sidebar open state on its own. | +| `onDock` | `function` | Invoked when the user toggles the `dock` button. The callback recieves a `boolean` parameter `isDocked` which indicates whether the sidebar is `docked` | +| `docked` | `boolean` | Indicates whether the sidebar is`docked`. By default, the sidebar is `undocked`. If passed, the docking becomes controlled, and you are responsible for updating the `docked` state by listening on `onDock` callback. To decide the breakpoint for docking you can use [UIOptions.dockedSidebarBreakpoint](/docs/@excalidraw/excalidraw/api/props/ui-options#dockedsidebarbreakpoint) for more info on docking. | +| `dockable` | `boolean` | Indicates whether to show the `dock` button so that user can `dock` the sidebar. If `false`, you can still dock programmatically by passing `docked` as `true`. | + +The sidebar will always include a header with `close / dock` buttons (when applicable). +You can also add custom content to the header, by rendering `` as a child of the `` component. Note that the custom header will still include the default buttons. + + +### Sidebar.Header + +| name | type | description | +| --- | --- | --- | +| children | `React.ReactNode` | Content you want to render inside the sidebar header as a sibling of `close` / `dock` buttons. | + +To control the visibility of the sidebar you can use [`toggleMenu("customSidebar")`](/docs/@excalidraw/excalidraw/api/props/ref#togglemenu) api available via `ref`. + +```tsx live +function App() { + const [excalidrawAPI, setExcalidrawAPI] = useState(null); + + return ( +
+ + setExcalidrawAPI(api)} + renderSidebar={() => { + return ( + + Custom Sidebar Header +

custom Sidebar Content

+
+ ); + }} + /> +
+ ); +} +``` diff --git a/dev-docs/docs/@excalidraw/excalidraw/api/props/ui-options.mdx b/dev-docs/docs/@excalidraw/excalidraw/api/props/ui-options.mdx new file mode 100644 index 000000000..d7551e366 --- /dev/null +++ b/dev-docs/docs/@excalidraw/excalidraw/api/props/ui-options.mdx @@ -0,0 +1,72 @@ +# UIOptions + +This prop can be used to customise UI of Excalidraw. Currently we support customising [`canvasActions`](#canvasactions), [`dockedSidebarBreakpoint`](#dockedsidebarbreakpoint) and [`welcomeScreen`](#welcmescreen). + +
+  {
+  
canvasActions?: + CanvasActions + ,
dockedSidebarBreakpoint?: number,
welcomeScreen?: boolean
+ + } +
+ +## canvasActions + +This `prop` controls the visibility of the canvas actions inside the `menu`. + +| Prop | Type | Default | Description | +| --- | --- | --- | --- | +| `changeViewBackgroundColor` | `boolean` | `true` | Indicates whether to show `Background color picker`. | +| `clearCanvas` | `boolean` | `true` | Indicates whether to show `Clear canvas` button. | +| `export` | `false` | [`exportOpts`](#exportopts) | `object` | This prop allows to customize the UI inside the export dialog. By default it shows the `save file to disk`. For more details visit [`exportOpts`](#exportopts). | +| `loadScene` | `boolean` | `true` | Indicates whether to show `Load` button. | +| `saveToActiveFile` | `boolean` | `true` | Indicates whether to show `Save` button to save to current file. | +| `toggleTheme` | `boolean` | `null` | `null` | Indicates whether to show `Theme toggle`. When defined as `boolean`, takes precedence over [`props.theme`](/docs/@excalidraw/excalidraw/api/props#theme) to show `Theme toggle`. | +| `saveAsImage` | `boolean` | `true` | Indicates whether to show `Save as image` button. | + +```tsx live +function App() { + const UIOptions = { + canvasActions: { + changeViewBackgroundColor: false, + clearCanvas: false, + loadScene: false, + }, + }; + return ( +
+ +
+ ); +} +``` + +### exportOpts + +The below attributes can be set in `UIOptions.canvasActions.export` to customize the export dialog. +If `UIOptions.canvasActions.export` is `false` the export button will not be rendered. + +| Prop | Type | Default | Description | +| --- | --- | --- | --- | +| `saveFileToDisk` | `boolean` | `true` | Indicates whether `save file to disk` button should be shown | +| `onExportToBackend` | `object` | \_ | This callback is triggered when the shareable-link button is clicked in the export dialog. The link button will only be shown if this callback is passed. | +| `renderCustomUI` | `object` | \_ | This callback should be supplied if you want to render custom UI in the export dialog. | + +## dockedSidebarBreakpoint + +This prop indicates at what point should we break to a docked, permanent sidebar. If not passed it defaults to [`MQ_RIGHT_SIDEBAR_MAX_WIDTH_PORTRAIT`](https://github.com/excalidraw/excalidraw/blob/master/src/constants.ts#L161). +If the _width_ of the _excalidraw_ container exceeds _dockedSidebarBreakpoint_, the sidebar will be `dockable` and the button to `dock` the sidebar will be shown +If user choses to `dock` the sidebar, it will push the right part of the UI towards the left, making space for the sidebar as shown below. + +![image](https://user-images.githubusercontent.com/11256141/174664866-c698c3fa-197b-43ff-956c-d79852c7b326.png) + +```tsx live +function App() { + return ( +
+ +
+ ); +} +``` diff --git a/dev-docs/docs/@excalidraw/excalidraw/api/utils/export.mdx b/dev-docs/docs/@excalidraw/excalidraw/api/utils/export.mdx new file mode 100644 index 000000000..f5469f01d --- /dev/null +++ b/dev-docs/docs/@excalidraw/excalidraw/api/utils/export.mdx @@ -0,0 +1,196 @@ +--- +title: Export Utilities +id: "export" +--- + +:::info + +We're working on much improved export utilities. Stay tuned! + +::: + +### exportToCanvas + +**_Signature_** + +
+exportToCanvas({
  + elements,
  + appState
  + getDimensions,
  + files,
  + exportPadding?: number;
+}: ExportOpts +
+ +| Name | Type | Default | Description | +| --- | --- | --- | --- | +| `elements` | [Excalidraw Element []](https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L114) | | The elements to be exported to canvas. | +| `appState` | [AppState](https://github.com/excalidraw/excalidraw/blob/master/src/packages/utils.ts#L23) | [Default App State](https://github.com/excalidraw/excalidraw/blob/master/src/appState.ts#L17) | The app state of the scene. | +| [`getDimensions`](#getdimensions) | `function` | _ | A function which returns the `width`, `height`, and optionally `scale` (defaults to `1`), with which canvas is to be exported. | +| `maxWidthOrHeight` | `number` | _ | The maximum `width` or `height` of the exported image. If provided, `getDimensions` is ignored. | +| `files` | [BinaryFiles](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L59) | _ | The files added to the scene. | +| `exportPadding` | `number` | `10` | The `padding` to be added on canvas. | + + +#### getDimensions + +```tsx +(width: number, height: number) => { + width: number, + height: number, + scale?: number +} +``` +A function which returns the `width`, `height`, and optionally `scale` (defaults to `1`), with which canvas is to be exported. + +**How to use** + +```js +import { exportToCanvas } from "@excalidraw/excalidraw"; +``` + +This function returns the canvas with the exported elements, appState and dimensions. + +```jsx live +function App() { + const [canvasUrl, setCanvasUrl] = useState(""); + const [excalidrawAPI, setExcalidrawAPI] = useState(null); + + return ( + <> + +
+ +
+
+ setExcalidrawAPI(api)} +/> +
+ + ) +} +``` + + +### exportToBlob + +**_Signature_** + +
+exportToBlob(
  + opts: ExportOpts & {
  + mimeType?: string,
  + quality?: number,
  + exportPadding?: number;
+}) +
+ +| Name | Type | Default | Description | +| --- | --- | --- | --- | +| `opts` | `object` | _ | This param is passed to `exportToCanvas`. You can refer to [`exportToCanvas`](#exporttocanvas) | +| `mimeType` | `string` | `image/png` | Indicates the image format. | +| `quality` | `number` | `0.92` | A value between `0` and `1` indicating the [image quality](https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob#parameters). Applies only to `image/jpeg`/`image/webp` MIME types. | +| `exportPadding` | `number` | `10` | The padding to be added on canvas. | + +**How to use** + +```js +import { exportToBlob } from "@excalidraw/excalidraw"; +``` + +Returns a promise which resolves with a [blob](https://developer.mozilla.org/en-US/docs/Web/API/Blob). It internally uses [canvas.ToBlob](https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob). + +### exportToSvg + +**_Signature_** + +
+exportToSvg({
  + elements:  + + ExcalidrawElement[] + ,
  + appState: + AppState + ,
  + exportPadding: number,
  + metadata: string,
  + files:  + + BinaryFiles + ,
+}); +
+ +| Name | Type | Default | Description | +| --- | --- | --- | --- | +| elements | [Excalidraw Element []](https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L114) | | The elements to exported as `svg `| +| appState | [AppState](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L95) | [defaultAppState](https://github.com/excalidraw/excalidraw/blob/master/src/appState.ts#L11) | The `appState` of the scene | +| exportPadding | number | 10 | The `padding` to be added on canvas | +| files | [BinaryFiles](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L64) | undefined | The `files` added to the scene. | + +This function returns a promise which resolves to `svg` of the exported drawing. + +### exportToClipboard + +**_Signature_** + +
+exportToClipboard(
  + opts: ExportOpts & {
  + mimeType?: string,
  + quality?: number;
  + type: 'png' | 'svg' |'json'
+}) +
+ +| Name | Type | Default | Description | +| --- | --- | --- | --- | +| `opts` | | | This param is same as the params passed to `exportToCanvas`. You can refer to [`exportToCanvas`](#exporttocanvas). | +| `mimeType` | `string` | `image/png` | Indicates the image format, this will be used when exporting as `png`. | +| `quality` | `number` | `0.92` | A value between `0` and `1` indicating the [image quality](https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob#parameters). Applies only to `image/jpeg` / `image/webp` MIME types. This will be used when exporting as `png`. | +| `type` | 'png' | 'svg' | 'json' | _ | This determines the format to which the scene data should be `exported`. | + +**How to use** + +```js +import { exportToClipboard } from "@excalidraw/excalidraw"; +``` + +Copies the scene data in the specified format (determined by `type`) to clipboard. + +### Additional attributes of appState for export\* APIs + +| Name | Type | Default | Description | +| --- | --- | --- | --- | +| `exportBackground` | `boolean` | `true` | Indicates whether `background` should be exported | +| `viewBackgroundColor` | `string` | `#fff` | The default background color | +| `exportWithDarkMode` | `boolean` | `false` | Indicates whether to export with `dark` mode | +| `exportEmbedScene` | `boolean` | `false` | Indicates whether scene data should be embedded in `svg/png`. This will increase the image size. | diff --git a/dev-docs/docs/@excalidraw/excalidraw/api/utils/restore.mdx b/dev-docs/docs/@excalidraw/excalidraw/api/utils/restore.mdx new file mode 100644 index 000000000..198626eec --- /dev/null +++ b/dev-docs/docs/@excalidraw/excalidraw/api/utils/restore.mdx @@ -0,0 +1,90 @@ +--- +title: Restore Utilities +id: "restore" +--- + +### restoreAppState + +**_Signature_** + +
+restoreAppState(appState: ImportedDataState["appState"],
  localAppState: Partial<AppState> | null): AppState +
+ +**_How to use_** + +```js +import { restoreAppState } from "@excalidraw/excalidraw"; +``` + +This function will make sure all the `keys` have appropriate `values` in [appState](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L95) and if any key is missing, it will be set to its `default` value. + +When `localAppState` is supplied, it's used in place of values that are missing (`undefined`) in `appState` instead of the defaults. +Use this as a way to not override user's defaults if you persist them. +You can pass `null` / `undefined` if not applicable. + +### restoreElements + +**_Signature_** + +
+restoreElements(
+  elements: ImportedDataState["elements"],
  + localElements: ExcalidrawElement[] | null | undefined): ExcalidrawElement[],
  + refreshDimensions?: boolean
+) +
+ +**_How to use_** + +```js +import { restoreElements } from "@excalidraw/excalidraw"; +``` + +This function will make sure all properties of element is correctly set and if any attribute is missing, it will be set to its default value. + +When `localElements` are supplied, they are used to ensure that existing restored elements reuse `version` (and increment it), and regenerate `versionNonce`. +Use this when you import elements which may already be present in the scene to ensure that you do not disregard the newly imported elements if you're using element version to detect the updates. + +Parameter `refreshDimensions` indicates whether we should also `recalculate` text element dimensions. Defaults to `false`. Since this is a potentially costly operation, you may want to disable it if you restore elements in tight loops, such as during collaboration. + +### restore + +**_Signature_** + +
+restore(
+  data: ImportedDataState,
  + localAppState: Partial<AppState> | null | undefined,
  + localElements: ExcalidrawElement[] | null | undefined
): DataState +) +
+ +See [`restoreAppState()`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#restoreAppState) about `localAppState`, and [`restoreElements()`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#restoreElements) about `localElements`. + +**_How to use_** + +```js +import { restore } from "@excalidraw/excalidraw"; +``` + +This function makes sure elements and state is set to appropriate values and set to default value if not present. It is a combination of [restoreElements](#restoreelements) and [restoreAppState](#restoreappstate). + +### restoreLibraryItems + +**_Signature_** + +
+restoreLibraryItems(libraryItems: ImportedDataState["libraryItems"],
  +defaultStatus: "published" | "unpublished") +
+ +**_How to use_** + +```js +import { restoreLibraryItems } from "@excalidraw/excalidraw"; + +restoreLibraryItems(libraryItems, "unpublished"); +``` + +This function normalizes library items elements, adding missing values when needed. diff --git a/dev-docs/docs/@excalidraw/excalidraw/api/utils/utils-intro.md b/dev-docs/docs/@excalidraw/excalidraw/api/utils/utils-intro.md new file mode 100644 index 000000000..c21592382 --- /dev/null +++ b/dev-docs/docs/@excalidraw/excalidraw/api/utils/utils-intro.md @@ -0,0 +1,341 @@ +--- +slug: /@excalidraw/excalidraw/api/utils +--- + +# Utils + +These are pure Javascript functions exported from the @excalidraw/excalidraw [`@excalidraw/excalidraw`](https://npmjs.com/@excalidraw/excalidraw). If you want to export your drawings in different formats eg `png`, `svg` and more you can check out [Export Utilities](/docs/@excalidraw/excalidraw/API/utils/export). If you want to restore your drawings you can check out [Restore Utilities](/docs/@excalidraw/excalidraw/API/utils/restore). + +### serializeAsJSON + +Takes the scene elements and state and returns a JSON string. `Deleted` elements as well as most properties from `AppState` are removed from the resulting JSON. (see [`serializeAsJSON()`](https://github.com/excalidraw/excalidraw/blob/master/src/data/json.ts#L42) source for details). + +If you want to overwrite the `source` field in the `JSON` string, you can set `window.EXCALIDRAW_EXPORT_SOURCE` to the desired value. + +**_Signature_** + +
+serializeAsJSON({
  + elements: ExcalidrawElement[],
  + appState: AppState,
+}): string +
+ +**How to use** + +```js +import { serializeAsJSON } from "@excalidraw/excalidraw"; +``` + +### serializeLibraryAsJSON + +Takes the `library` items and returns a `JSON` string. + +If you want to overwrite the source field in the JSON string, you can set `window.EXCALIDRAW_EXPORT_SOURCE` to the desired value. + +**_Signature_** + +
+serializeLibraryAsJSON(
+  libraryItems: LibraryItems[])
+
+ +**How to use** + +```js +import { serializeLibraryAsJSON } from "@excalidraw/excalidraw"; +``` + +#### isInvisiblySmallElement + +Returns `true` if element is invisibly small (e.g. width & height are zero). + +**_Signature_** + +
+isInvisiblySmallElement(element:  ExcalidrawElement): boolean
+
+ +**How to use** + +```js +import { isInvisiblySmallElement } from "@excalidraw/excalidraw"; +``` + +### loadFromBlob + +This function loads the scene data from the blob (or file). If you pass `localAppState`, `localAppState` value will be preferred over the `appState` derived from `blob`. Throws if blob doesn't contain valid scene data. + +**How to use** + +```js +import { loadFromBlob } from "@excalidraw/excalidraw"; + +const scene = await loadFromBlob(file, null, null); +excalidrawAPI.updateScene(scene); +``` + +**Signature** + +
+loadFromBlob(
  + blob: Blob,
  + localAppState: AppState | null,
  + localElements: ExcalidrawElement[] | null,
  + fileHandle?: FileSystemHandle | null
+) => Promise<RestoredDataState> +
+ +### loadLibraryFromBlob + +This function loads the library from the blob. Additonally takes `defaultStatus` param which sets the default status for library item if not present, defaults to `unpublished`. + +**How to use ** + +```js +import { loadLibraryFromBlob } from "@excalidraw/excalidraw"; +``` + +**_Signature_** + +
+loadLibraryFromBlob(blob: Blob, defaultStatus: "published" | "unpublished")
+
+ +### loadSceneOrLibraryFromBlob + +This function loads either scene or library data from the supplied blob. If the blob contains scene data, and you pass `localAppState`, `localAppState` value will be preferred over the `appState` derived from `blob`. + +:::caution + +Throws if blob doesn't contain valid `scene` data or `library` data. + +::: + +**How to use** + +```js showLineNumbers +import { loadSceneOrLibraryFromBlob, MIME_TYPES } from "@excalidraw/excalidraw"; + +const contents = await loadSceneOrLibraryFromBlob(file, null, null); +if (contents.type === MIME_TYPES.excalidraw) { + excalidrawAPI.updateScene(contents.data); +} else if (contents.type === MIME_TYPES.excalidrawlib) { + excalidrawAPI.updateLibrary(contents.data); +} +``` + +**_Signature_** + +
+loadSceneOrLibraryFromBlob(
  + blob: Blob, + localAppState: AppState | null,
  + localElements: ExcalidrawElement[] | null,
  + fileHandle?: FileSystemHandle | null
+) => Promise<{ type: string, data: RestoredDataState | ImportedLibraryState}> +
+ +### getFreeDrawSvgPath + +This function returns the `free draw` svg path for the element. + +**How to use** + +```js +import { getFreeDrawSvgPath } from "@excalidraw/excalidraw"; +``` + +**Signature** + +
+getFreeDrawSvgPath(element: ExcalidrawFreeDrawElement)
+
+ +### isLinearElement + +This function returns true if the element is `linear` type (`arrow` |`line`) else returns `false`. + +**How to use** + +```js +import { isLinearElement } from "@excalidraw/excalidraw"; +``` + +**Signature** + +```tsx +isLinearElement(elementType?: ExcalidrawElement): boolean +``` + +### getNonDeletedElements + +This function returns an array of `deleted` elements. + +**How to use** + +```js +import { getNonDeletedElements } from "@excalidraw/excalidraw"; +``` + +**Signature** + +
+getNonDeletedElements(elements: readonly ExcalidrawElement[]): as readonly NonDeletedExcalidrawElement[]
+
+ +### mergeLibraryItems + +This function merges two `LibraryItems` arrays, where unique items from `otherItems` are sorted first in the returned array. + +```js +import { mergeLibraryItems } from "@excalidraw/excalidraw"; +``` + +**_Signature_** + +
+mergeLibraryItems(localItems: LibraryItems,
  + otherItems: LibraryItems) => LibraryItems +
+ +### parseLibraryTokensFromUrl + +Parses library parameters from URL if present (expects the `#addLibrary` hash key), and returns an object with the `libraryUrl` and `idToken`. Returns `null` if `#addLibrary` hash key not found. + +**How to use** + +```js +import { parseLibraryTokensFromUrl } from "@excalidraw/excalidraw"; +``` + +**Signature** + +```tsx +parseLibraryTokensFromUrl(): { + libraryUrl: string; + idToken: string | null; +} | null +``` + +### useHandleLibrary + +A hook that automatically imports library from url if `#addLibrary` hash key exists on initial load, or when it changes during the editing session (e.g. when a user installs a new library), and handles initial library load if `getInitialLibraryItems` getter is supplied. + +**How to use** + +```js +import { useHandleLibrary } from "@excalidraw/excalidraw"; + +export const App = () => { + // ... + useHandleLibrary({ excalidrawAPI }); +}; +``` + +**Signature** + +
+useHandleLibrary(opts: {
  + excalidrawAPI: ExcalidrawAPI,
  + getInitialLibraryItems?: () => LibraryItemsSource
+}); +
+ +In the future, we will be adding support for handling `library` persistence to `browser storage` (or elsewhere). + +### getSceneVersion + +This function returns the current `scene` version. + +**_Signature_** + +
+getSceneVersion(elements:  ExcalidrawElement[])
+
+ +**How to use** + +```js +import { getSceneVersion } from "@excalidraw/excalidraw"; +``` + +### sceneCoordsToViewportCoords + +This function returns equivalent `viewport` coords for the provided `scene` coords in params. + +```js +import { sceneCoordsToViewportCoords } from "@excalidraw/excalidraw"; +``` + +**_Signature_** + +
+sceneCoordsToViewportCoords({ sceneX: number, sceneY: number },
  + appState: AppState
): { x: number, y: number } +
+ +### viewportCoordsToSceneCoords + +This function returns equivalent `scene` coords for the provided `viewport` coords in params. + +```js +import { viewportCoordsToSceneCoords } from "@excalidraw/excalidraw"; +``` + +**_Signature_** + +
+viewportCoordsToSceneCoords({ clientX: number, clientY: number },
  + appState: AppState
): {x: number, y: number} +
+ +### useDevice + +This hook can be used to check the type of device which is being used. It can only be used inside the `children` of `Excalidraw` component. + +Open the `main menu` in the below example to view the footer. + +```jsx live noInline +const MobileFooter = ({}) => { + const device = useDevice(); + if (device.isMobile) { + return ( +
+ +
+ ); + } + return null; +}; +const App = () => ( +
+ + + Item1 + Item 2 + + + +
+); + +// Need to render when code is span across multiple components +// in Live Code blocks editor +render(); +``` + +The `device` has the following `attributes` + +| Name | Type | Description | +| --- | --- | --- | +| `isSmScreen` | `boolean` | Set to `true` when the device small screen is small (Width < `640px` ) | +| `isMobile` | `boolean` | Set to `true` when the device is `mobile` | +| `isTouchScreen` | `boolean` | Set to `true` for `touch` devices | +| `canDeviceFitSidebar` | `boolean` | Implies whether there is enough space to fit the `sidebar` | diff --git a/dev-docs/docs/@excalidraw/excalidraw/customizing-styles.mdx b/dev-docs/docs/@excalidraw/excalidraw/customizing-styles.mdx new file mode 100644 index 000000000..7a1d423fc --- /dev/null +++ b/dev-docs/docs/@excalidraw/excalidraw/customizing-styles.mdx @@ -0,0 +1,49 @@ +# Customizing Styles + +Excalidraw is using CSS variables to style certain components. To override them, you should set your own on the `.excalidraw` and `.excalidraw.theme--dark` (for dark mode variables) selectors. + +Make sure the selector has higher specificity, e.g. by prefixing it with your app's selector: + +```css +.your-app .excalidraw { + --color-primary: red; +} +.your-app .excalidraw.theme--dark { + --color-primary: pink; +} +``` + +Most notably, you can customize the primary colors, by overriding these variables: + +- `--color-primary` +- `--color-primary-darker` +- `--color-primary-darkest` +- `--color-primary-light` +- `--color-primary-contrast-offset` — a slightly darker (in light mode), or lighter (in dark mode) `--color-primary` color to fix contrast issues (see [Chubb illusion](https://en.wikipedia.org/wiki/Chubb_illusion)). It will fall back to `--color-primary` if not present. + +For a complete list of variables, check [theme.scss](https://github.com/excalidraw/excalidraw/blob/master/src/css/theme.scss), though most of them will not make sense to override. + +```css showLineNumbers +.custom-styles .excalidraw { + --color-primary: #fcc6d9; + --color-primary-darker: #f783ac; + --color-primary-darkest: #e64980; + --color-primary-light: #f2a9c4; +} + +.custom-styles .excalidraw.theme--dark { + --color-primary: #d494aa; + --color-primary-darker: #d64c7e; + --color-primary-darkest: #e86e99; + --color-primary-light: #dcbec9; +} +``` +```tsx live +function App() { + return ( +
+ +
+ ); +} +``` diff --git a/dev-docs/docs/@excalidraw/excalidraw/development.mdx b/dev-docs/docs/@excalidraw/excalidraw/development.mdx new file mode 100644 index 000000000..066e0a24e --- /dev/null +++ b/dev-docs/docs/@excalidraw/excalidraw/development.mdx @@ -0,0 +1,59 @@ +--- +pagination_prev: "@excalidraw/excalidraw/installation" +--- + +# Development + +This page relates to developing the `@excalidraw/excalidraw` package itself. + +## Example app + +To start the example app using the `@excalidraw/excalidraw` package, follow the below steps: + +1. Install the dependencies + + ```bash + cd src/packages/excalidraw && yarn + ``` + +2. Start the example app + + ```bash + yarn start + ``` + + [http://localhost:3001](http://localhost:3001) will open in your default browser. + + The example is same as the [codesandbox example](https://ehlz3.csb.app/) + +## Releasing + +### Create a test release + +You can create a test release by posting the below comment in your pull request: + +```bash +@excalibot trigger release +``` + +Once the version is released `@excalibot` will post a comment with the release version. + +### Creating a production release + +To release the next stable version follow the below steps: + +```bash +yarn prerelease version +``` + +You need to pass the `version` for which you want to create the release. This will make the changes needed before making the release like updating `package.json`, `changelog` and more. + +The next step is to run the `release` script: + +```bash +yarn release +``` + +This will publish the package. + +Right now there are two steps to create a production release but once this works fine these scripts will be combined and more automation will be done. diff --git a/dev-docs/docs/@excalidraw/excalidraw/faq.mdx b/dev-docs/docs/@excalidraw/excalidraw/faq.mdx new file mode 100644 index 000000000..6f0fd30a7 --- /dev/null +++ b/dev-docs/docs/@excalidraw/excalidraw/faq.mdx @@ -0,0 +1,9 @@ +# FAQ + +### Does this package support collaboration ? + +No, Excalidraw package doesn't come with collaboration built in, since the implementation is specific to each host app. We expose APIs which you can use to communicate with Excalidraw which you can use to implement it. You can check our own implementation [here](https://github.com/excalidraw/excalidraw/blob/master/src/excalidraw-app/index.tsx). Here is a [detailed answer](https://github.com/excalidraw/excalidraw/discussions/3879#discussioncomment-1110524) on how you can achieve the same. + +## Need help? + +Check out the existing [Q&A](https://github.com/excalidraw/excalidraw/discussions?discussions_q=label%3Apackage%3Aexcalidraw). If you have any queries or need help, ask us [here](https://github.com/excalidraw/excalidraw/discussions?discussions_q=label%3Apackage%3Aexcalidraw). diff --git a/dev-docs/docs/@excalidraw/excalidraw/installation.mdx b/dev-docs/docs/@excalidraw/excalidraw/installation.mdx new file mode 100644 index 000000000..d8ddd59c3 --- /dev/null +++ b/dev-docs/docs/@excalidraw/excalidraw/installation.mdx @@ -0,0 +1,43 @@ +# Installation + +**Excalidraw** is published to npm as a component you can directly embed in your projects. + +Using `npm`: + +```bash +npm install react react-dom @excalidraw/excalidraw +``` + +or `yarn`: + +```bash +yarn add react react-dom @excalidraw/excalidraw +``` + +:::tip + +**If you don't want to wait for the next stable release and try out the unreleased changes you can use `@excalidraw/excalidraw@next`.** + +::: + +### Static assets + +Excalidraw depends on assets such as localization files (if you opt to use them), fonts, and others. + +By default these assets are loaded from a public CDN [`https://unpkg.com/@excalidraw/excalidraw/dist/`](https://unpkg.com/@excalidraw/excalidraw/dist), so you don't need to do anything on your end. + +However, if you want to host these files yourself, you can find them in your `node_modules/@excalidraw/excalidraw/dist` directory, in folders `excalidraw-assets` (for production) and `excalidraw-assets-dev` (for development). + +Copy these folders to your static assets directory, and add a `window.EXCALIDRAW_ASSET_PATH` variable in your `index.html` or `index.js` entry file pointing to your public assets path (relative). For example, if you serve your assets from the root of your hostname, you would do: + +```js +window.EXCALIDRAW_ASSET_PATH = "/"; +``` + +### Dimensions of Excalidraw + +Excalidraw takes _100%_ of `width` and `height` of the containing block so make sure the container in which you render Excalidraw has non zero dimensions. + +### Demo + +[Try here](https://codesandbox.io/s/excalidraw-ehlz3). diff --git a/dev-docs/docs/@excalidraw/excalidraw/integration.mdx b/dev-docs/docs/@excalidraw/excalidraw/integration.mdx new file mode 100644 index 000000000..7080c32e9 --- /dev/null +++ b/dev-docs/docs/@excalidraw/excalidraw/integration.mdx @@ -0,0 +1,131 @@ +# Integration + +## Module bundler + +If you are using a module bundler (for instance, Webpack), you can import it as an ES6 module as shown below + +```js +import { Excalidraw } from "@excalidraw/excalidraw"; +``` + +:::info + +Throughout the documentation we use live, editable Excalidraw examples like the one shown below. + +While we aim for the examples to closely reflect what you'd get if you rendered it yourself, we actually initialize it with some props behind the scenes. +For example, we're passing a `theme` prop to it based on the current color theme of the docs you're just reading. + +::: + +```jsx live +function App() { + return ( + <> +

Excalidraw Example

+
+ +
+ + ); +} +``` + +### Rendering Excalidraw only on client + +Since _Excalidraw_ doesn't support server side rendering, you should render the component once the host is `mounted`. + +The following worfklow shows one way how to render Excalidraw on Next.js. We'll add more detailed and alternative Next.js examples, soon. + +```jsx showLineNumbers +import { useState, useEffect } from "react"; +export default function App() { + const [Excalidraw, setExcalidraw] = useState(null); + useEffect(() => { + import("@excalidraw/excalidraw").then((comp) => setExcalidraw(comp.Excalidraw)); + }, []); + return <>{Excalidraw && }; +} +``` + +The `types` are available at `@excalidraw/excalidraw/types`, you can view [example for typescript](https://codesandbox.io/s/excalidraw-types-9h2dm) + +## Browser + +To use it in a browser directly: + +For development use :point_down: + +```js + +``` + +For production use :point_down: + +```js + +``` + +You will need to make sure `react`, `react-dom` is available as shown in the below example. For prod please use the production versions of `react`, `react-dom`. + +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + + + + +```html + + + + Excalidraw in browser + + + + + + + + +
+

Excalidraw Embed Example

+
+
+ + + +``` + +
+ + +```js showLineNumbers +const App = () => { + return React.createElement( + React.Fragment, + null, + React.createElement( + "div", + { + style: { height: "500px" }, + }, + React.createElement(ExcalidrawLib.Excalidraw), + ), + ); +}; + +const excalidrawWrapper = document.getElementById("app"); +const root = ReactDOM.createRoot(excalidrawWrapper); +root.render(React.createElement(App)); +``` + + +
diff --git a/dev-docs/docs/assets/nerd-stats.png b/dev-docs/docs/assets/nerd-stats.png new file mode 100644 index 0000000000000000000000000000000000000000..0c1a525e4ed716a50b591109f8ce384bd4822a0a GIT binary patch literal 84676 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�E!BPC|Oq0!-R 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

7ZCAP#fm2nuJ_*I@8ZK`A3er6 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 To keep `master` branch pointing to remote repository and make pull requests from branches on your fork. To do this, run: +> +> ```bash +> git remote add upstream https://github.com/excalidraw/excalidraw.git +> git fetch upstream +> git branch --set-upstream-to=upstream/master master +> ``` + +### Option 2 - CodeSandbox + +1. Go to https://codesandbox.io/p/github/excalidraw/excalidraw +1. Connect your GitHub account +1. Go to Git tab on left side +1. Tap on `Fork Sandbox` +1. Write your code +1. Commit and PR automatically + +## Pull Request Guidelines + +Don't worry if you get any of the below wrong, or if you don't know how. We'll gladly help out. + +### Title + +Make sure the title starts with a semantic prefix: + +- **feat**: A new feature +- **fix**: A bug fix +- **docs**: Documentation only changes +- **style**: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc) +- **refactor**: A code change that neither fixes a bug nor adds a feature +- **perf**: A code change that improves performance +- **test**: Adding missing tests or correcting existing tests +- **build**: Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm) +- **ci**: Changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs) +- **chore**: Other changes that don't modify src or test files +- **revert**: Reverts a previous commit + +### Changelog + +Add a brief description of your pull request to the changelog located here: [changelog](https://github.com/excalidraw/excalidraw/blob/master/CHANGELOG.md) + +Notes: + +- Make sure to prepend to the section corresponding with the semantic prefix you selected in the title +- Link to your pull request - this will require updating the CHANGELOG _after_ creating the pull request + +### Testing + +Once you submit your pull request it will automatically be tested. Be sure to check the results of the test and fix any issues that arise. + +It's also a good idea to consider if your change should include additional tests. This is highly recommended for new features or bug-fixes. For example, it's good practice to create a test for each bug you fix which ensures that we don't regress the code in the future. + +Finally - always manually test your changes using the convenient staging environment deployed for each pull request. As much as local development attempts to replicate production, there can still be subtle differences in behavior. For larger features consider testing your change in multiple browsers as well. + + +## Translating + +To translate Excalidraw into other languages, please visit [our Crowdin page](https://crowdin.com/project/excalidraw). To add a new language, [open an issue](https://github.com/excalidraw/excalidraw/issues/new) so we can get things set up on our end first. + +Translations will be available on the app if they exceed a certain threshold of completion (currently **85%**). diff --git a/dev-docs/docs/introduction/development.mdx b/dev-docs/docs/introduction/development.mdx new file mode 100644 index 000000000..63c1875e5 --- /dev/null +++ b/dev-docs/docs/introduction/development.mdx @@ -0,0 +1,102 @@ +# Development + +## Code Sandbox + +- Go to https://codesandbox.io/p/github/excalidraw/excalidraw + - You may need to sign in with GitHub and reload the page +- You can start coding instantly, and even send PRs from there! + +## Local Installation + +These instructions will get you a copy of the project up and running on your local machine for development and testing purposes. + +### Requirements + +- [Node.js](https://nodejs.org/en/) +- [Yarn](https://yarnpkg.com/getting-started/install) (v1 or v2.4.2+) +- [Git](https://git-scm.com/downloads) + +### Clone the repo + +```bash +git clone https://github.com/excalidraw/excalidraw.git +``` + +### Install the dependencies + +```bash +yarn +``` + +### Start the server + +```bash +yarn start +``` + +Now you can open [http://localhost:3000](http://localhost:3000) and start coding in your favorite code editor. + +## Collaboration + +For collaboration, you will need to set up [collab server](https://github.com/excalidraw/excalidraw-room) in local. + +## Commands + +### Install the dependencies + +```bash +yarn +``` + +### Run the project + +```bash +yarn start +``` + +### Reformat all files with Prettier + +```bash +yarn fix +``` + +### Run tests + +```bash +yarn test +``` + +### Update test snapshots + +```bash +yarn test:update +``` + +### Test for formatting with Prettier + +```bash +yarn test:code +``` + +### Docker Compose + +You can use docker-compose to work on Excalidraw locally if you don't want to setup a Node.js env. + +```bash +docker-compose up --build -d +``` + +## Self-hosting + +We publish a Docker image with the Excalidraw client at [excalidraw/excalidraw](https://hub.docker.com/r/excalidraw/excalidraw). You can use it to self-host your own client under your own domain, on Kubernetes, AWS ECS, etc. + +```bash +docker build -t excalidraw/excalidraw . +docker run --rm -dit --name excalidraw -p 5000:80 excalidraw/excalidraw:latest +``` + +The Docker image is free of analytics and other tracking libraries. + +**At the moment, self-hosting your own instance doesn't support sharing or collaboration features.** + +We are working towards providing a full-fledged solution for self-hosting your own Excalidraw. diff --git a/dev-docs/docs/introduction/get-started.mdx b/dev-docs/docs/introduction/get-started.mdx new file mode 100644 index 000000000..f122c9a77 --- /dev/null +++ b/dev-docs/docs/introduction/get-started.mdx @@ -0,0 +1,16 @@ +--- +title: Introduction +slug: ../ +--- + +## Try now + +Go to [excalidraw.com](https://excalidraw.com) to start sketching. + +## How are these docs structured + +These docs are focused on developers, and structured in the following way: + +- [Introduction](/docs/) — development setup and introduction. +- [@excalidraw/excalidraw](/docs/@excalidraw/excalidraw/installation) — docs for the npm package to help you integrate Excalidraw into your own app. +- Editor — IN PROGRESS. Docs describing the internals of the Excalidraw editor to help in contributing to the codebase. diff --git a/dev-docs/docs/package/overview.md b/dev-docs/docs/package/overview.md deleted file mode 100644 index b411dcf29..000000000 --- a/dev-docs/docs/package/overview.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -sidebar_position: 1 -title: Overview ---- - -In development. For now, refer to [excalidraw package readme](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md). diff --git a/dev-docs/docusaurus.config.js b/dev-docs/docusaurus.config.js index c1f9952df..390c619af 100644 --- a/dev-docs/docusaurus.config.js +++ b/dev-docs/docusaurus.config.js @@ -1,15 +1,12 @@ // @ts-check // Note: type annotations allow type checking and IDEs autocompletion -const lightCodeTheme = require("prism-react-renderer/themes/github"); -const darkCodeTheme = require("prism-react-renderer/themes/dracula"); - /** @type {import('@docusaurus/types').Config} */ const config = { title: "Excalidraw developer docs", tagline: "For Excalidraw contributors or those integrating the Excalidraw editor", - url: "https://docs.excalidraw.com.com", + url: "https://docs.excalidraw.com", baseUrl: "/", onBrokenLinks: "throw", onBrokenMarkdownLinks: "warn", @@ -33,10 +30,16 @@ const config = { docs: { sidebarPath: require.resolve("./sidebars.js"), // Please change this to your repo. - editUrl: "https://github.com/excalidraw/docs/tree/master/", + editUrl: + "https://github.com/excalidraw/excalidraw/tree/master/dev-docs/", + showLastUpdateAuthor: true, + showLastUpdateTime: true, }, theme: { - customCss: require.resolve("./src/css/custom.css"), + customCss: [ + require.resolve("./src/css/custom.scss"), + require.resolve("../src/packages/excalidraw/example/App.scss"), + ], }, }), ], @@ -45,18 +48,20 @@ const config = { themeConfig: /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ ({ + colorMode: { + respectPrefersColorScheme: true, + }, navbar: { - title: "Excalidraw Docs", + title: "Excalidraw", logo: { alt: "Excalidraw Logo", src: "img/logo.svg", }, items: [ { - type: "doc", - docId: "get-started", + to: "/docs", position: "left", - label: "Get started", + label: "Docs", }, { to: "https://blog.excalidraw.com", @@ -78,7 +83,7 @@ const config = { items: [ { label: "Get Started", - to: "/docs/get-started", + to: "/docs", }, ], }, @@ -93,6 +98,10 @@ const config = { label: "Twitter", href: "https://twitter.com/excalidraw", }, + { + label: "Linkedin", + href: "https://www.linkedin.com/company/excalidraw", + }, ], }, { @@ -109,13 +118,28 @@ const config = { ], }, ], - copyright: `Made with ❤️ Built with Docusaurus`, + copyright: `Copyright © 2023 Excalidraw community. Built with Docusaurus ❤️`, }, prism: { - theme: lightCodeTheme, - darkTheme: darkCodeTheme, + theme: require("prism-react-renderer/themes/dracula"), + }, + image: "img/og-image.png", + docs: { + sidebar: { + hideable: true, + }, + }, + tableOfContents: { + maxHeadingLevel: 4, + }, + algolia: { + appId: "8FEAOD28DI", + apiKey: "4b07cca33ff2d2919bc95ff98f148e9e", + indexName: "excalidraw", }, }), + themes: ["@docusaurus/theme-live-codeblock"], + plugins: ["docusaurus-plugin-sass"], }; module.exports = config; diff --git a/dev-docs/package.json b/dev-docs/package.json index 9f9d4a760..dd3c45872 100644 --- a/dev-docs/package.json +++ b/dev-docs/package.json @@ -15,13 +15,17 @@ "typecheck": "tsc" }, "dependencies": { - "@docusaurus/core": "2.0.0-rc.1", - "@docusaurus/preset-classic": "2.0.0-rc.1", + "@docusaurus/core": "2.2.0", + "@docusaurus/preset-classic": "2.2.0", + "@docusaurus/theme-live-codeblock": "2.2.0", + "@excalidraw/excalidraw": "0.14.2", "@mdx-js/react": "^1.6.22", "clsx": "^1.2.1", + "docusaurus-plugin-sass": "0.2.3", "prism-react-renderer": "^1.3.5", "react": "^17.0.2", - "react-dom": "^17.0.2" + "react-dom": "^17.0.2", + "sass": "1.57.1" }, "devDependencies": { "@docusaurus/module-type-aliases": "2.0.0-rc.1", diff --git a/dev-docs/sidebars.js b/dev-docs/sidebars.js index 966215066..00879c12f 100644 --- a/dev-docs/sidebars.js +++ b/dev-docs/sidebars.js @@ -13,19 +13,86 @@ /** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ const sidebars = { - // By default, Docusaurus generates a sidebar from the docs folder structure - tutorialSidebar: [{ type: "autogenerated", dirName: "." }], - - // But you can create a sidebar manually - /* - tutorialSidebar: [ + docs: [ { - type: 'category', - label: 'Tutorial', - items: ['hello'], + type: "category", + label: "Introduction", + link: { + type: "doc", + id: "introduction/get-started", + }, + items: ["introduction/development", "introduction/contributing"], + }, + + { + type: "category", + label: "@excalidraw/excalidraw", + collapsed: false, + items: [ + "@excalidraw/excalidraw/installation", + "@excalidraw/excalidraw/integration", + "@excalidraw/excalidraw/customizing-styles", + { + type: "category", + label: "API", + link: { + type: "doc", + id: "@excalidraw/excalidraw/api/api-intro", + }, + items: [ + { + type: "category", + label: "Props", + link: { + type: "doc", + id: "@excalidraw/excalidraw/api/props/props", + }, + items: [ + "@excalidraw/excalidraw/api/props/initialdata", + "@excalidraw/excalidraw/api/props/ref", + "@excalidraw/excalidraw/api/props/render-props", + "@excalidraw/excalidraw/api/props/ui-options", + ], + }, + { + type: "category", + label: "Children Components", + link: { + type: "doc", + id: "@excalidraw/excalidraw/api/children-components/children-components-intro", + }, + items: [ + "@excalidraw/excalidraw/api/children-components/main-menu", + "@excalidraw/excalidraw/api/children-components/welcome-screen", + "@excalidraw/excalidraw/api/children-components/footer", + "@excalidraw/excalidraw/api/children-components/live-collaboration-trigger", + ], + }, + { + type: "category", + label: "Utils", + link: { + type: "doc", + id: "@excalidraw/excalidraw/api/utils/utils-intro", + }, + items: [ + "@excalidraw/excalidraw/api/utils/export", + "@excalidraw/excalidraw/api/utils/restore", + ], + }, + { + type: "category", + label: "Constants", + link: { type: "doc", id: "@excalidraw/excalidraw/api/constants" }, + items: [], + }, + ], + }, + "@excalidraw/excalidraw/faq", + "@excalidraw/excalidraw/development", + ], }, ], - */ }; module.exports = sidebars; diff --git a/dev-docs/src/components/Highlight.js b/dev-docs/src/components/Highlight.js new file mode 100644 index 000000000..6ef30412b --- /dev/null +++ b/dev-docs/src/components/Highlight.js @@ -0,0 +1,15 @@ +import React from "react"; +export default function Highlight({ children }) { + return ( + + {children} + + ); +} diff --git a/dev-docs/src/css/custom.css b/dev-docs/src/css/custom.scss similarity index 54% rename from dev-docs/src/css/custom.css rename to dev-docs/src/css/custom.scss index bbdc13c56..93c7f90ab 100644 --- a/dev-docs/src/css/custom.css +++ b/dev-docs/src/css/custom.scss @@ -14,11 +14,13 @@ --ifm-color-primary-lighter: #5b57d1; --ifm-color-primary-lightest: #5b57d1; --ifm-code-font-size: 95%; + + scrollbar-gutter: stable; } /* For readability concerns, you should choose a lighter palette in dark mode. */ [data-theme="dark"] { - --ifm-color-primary: #5650f0; + --ifm-color-primary: #8784e3; --ifm-color-primary-dark: #4b46d8; --ifm-color-primary-darker: #4b46d8; --ifm-color-primary-darkest: #3e39be; @@ -41,3 +43,59 @@ [data-theme="dark"] .navbar__logo { filter: invert(93%) hue-rotate(180deg); } + +pre a { + color: #5dccff; + + &:hover { + color: #8fd3f3; + } +} + +.custom-button { + height: 40px; + max-width: 200px; + margin: 10px 0; + padding: 5px; + background: #70b1ec; + color: white; + font-weight: bold; + border: none; +} + +.custom-styles .excalidraw { + --color-primary: #fcc6d9; + --color-primary-darker: #f783ac; + --color-primary-darkest: #e64980; + --color-primary-light: #f2a9c4; +} + +.custom-styles .excalidraw.theme--dark { + --color-primary: #d494aa; + --color-primary-darker: #d64c7e; + --color-primary-darkest: #e86e99; + --color-primary-light: #dcbec9; +} + +/* The global css conflicts with Excal css hence overriding */ + +.excalidraw .context-menu-item__shortcut { + background-color: transparent; + border: none; + box-shadow: none; + padding: 0; +} +.excalidraw .Stats table td, +.excalidraw .Stats table th, +.excalidraw .Stats table tr { + border: none; + background: none; + padding: 0; +} +.excalidraw .Stats .close { + padding: 0; +} + +.excalidraw .Stats table { + display: table; +} diff --git a/dev-docs/src/initialData.js b/dev-docs/src/initialData.js new file mode 100644 index 000000000..d0a9b2127 --- /dev/null +++ b/dev-docs/src/initialData.js @@ -0,0 +1,1230 @@ +export const libraryItems = [ + [ + { + type: "line", + version: 1699, + versionNonce: 1813275999, + isDeleted: false, + id: "1OMHrnYMU3LJ3w3IaXU_R", + fillStyle: "hachure", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 0, + x: 209.72304760646858, + y: 338.83587294718825, + strokeColor: "#881fa3", + backgroundColor: "#be4bdb", + width: 116.42036295658873, + height: 103.65107323746608, + seed: 1445523839, + groupIds: [], + strokeSharpness: "sharp", + boundElementIds: [], + startBinding: null, + endBinding: null, + points: [ + [-92.28090097254909, 7.105427357601002e-15], + [-154.72281841151394, 19.199290805487394], + [-155.45758928571422, 79.43840749607878], + [-99.89923520113778, 103.6510732374661], + [-40.317783799181804, 79.1587107641305], + [-39.037226329125524, 21.285677238400705], + [-92.28090097254909, 7.105427357601002e-15], + ], + lastCommittedPoint: null, + startArrowhead: null, + endArrowhead: null, + }, + ], + [ + { + type: "line", + version: 3901, + versionNonce: 540959103, + isDeleted: false, + id: "b-rwW8s76ztV_uTu1SHq1", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 0, + x: -249.48446738689245, + y: 374.851387389359, + strokeColor: "#0a11d3", + backgroundColor: "#228be6", + width: 88.21658171083376, + height: 113.8575037534261, + seed: 1513238033, + groupIds: ["N2YAi9nU-wlRb0rDaDZoe"], + strokeSharpness: "round", + boundElementIds: [], + startBinding: null, + endBinding: null, + points: [ + [-0.22814350714115691, -43.414939319563715], + [0.06274947619197979, 42.63794490105306], + [-0.21453039840335475, 52.43469208825097], + [4.315205554872581, 56.66774540453215], + [20.089784992984285, 60.25027917349701], + [46.7532926683984, 61.365826671969444], + [72.22851104292477, 59.584691681394986], + [85.76368213524371, 55.325139565662596], + [87.67263486434864, 51.7342924478499], + [87.94074036468018, 43.84700272879395], + [87.73030872197806, -36.195582644606276], + [87.2559282533682, -43.758132174307036], + [81.5915337527493, -47.984890854524416], + [69.66352776578219, -50.4328058257654], + [42.481213744224995, -52.49167708145666], + [20.68789182864576, -51.26396751574663], + [3.5475921483286084, -47.099726468136254], + [-0.2758413461535838, -43.46664538034193], + [-0.22814350714115691, -43.414939319563715], + ], + lastCommittedPoint: null, + startArrowhead: null, + endArrowhead: null, + }, + { + type: "line", + version: 1635, + versionNonce: 1383184881, + isDeleted: false, + id: "3CMZYj34FwjhgPB7jUC3f", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 0, + x: -249.02524930453623, + y: 398.8804363713438, + strokeColor: "#0a11d3", + backgroundColor: "transparent", + width: 88.30808627974527, + height: 9.797916664247975, + seed: 683951089, + groupIds: ["N2YAi9nU-wlRb0rDaDZoe"], + strokeSharpness: "round", + boundElementIds: [], + startBinding: null, + endBinding: null, + points: [ + [0, -2.1538602707609424], + [2.326538897826852, 1.751753055375216], + [12.359939318521995, 5.028526743934819], + [25.710950037209347, 7.012921076245119], + [46.6269757640547, 7.193749997581346], + [71.03526003420632, 5.930375670950649], + [85.2899738827162, 1.3342483900732343], + [88.30808627974527, -2.6041666666666288], + ], + lastCommittedPoint: null, + startArrowhead: null, + endArrowhead: null, + }, + { + type: "line", + version: 1722, + versionNonce: 303290783, + isDeleted: false, + id: "DX3fUhBWtlJwYyrBDhebG", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 0, + x: -250.11899081659772, + y: 365.80628180927204, + strokeColor: "#0a11d3", + backgroundColor: "transparent", + width: 88.30808627974527, + height: 9.797916664247975, + seed: 1817746897, + groupIds: ["N2YAi9nU-wlRb0rDaDZoe"], + strokeSharpness: "round", + boundElementIds: [], + startBinding: null, + endBinding: null, + points: [ + [0, -2.1538602707609424], + [2.326538897826852, 1.751753055375216], + [12.359939318521995, 5.028526743934819], + [25.710950037209347, 7.012921076245119], + [46.6269757640547, 7.193749997581346], + [71.03526003420632, 5.930375670950649], + [85.2899738827162, 1.3342483900732343], + [88.30808627974527, -2.6041666666666288], + ], + lastCommittedPoint: null, + startArrowhead: null, + endArrowhead: null, + }, + { + type: "ellipse", + version: 4738, + versionNonce: 753357777, + isDeleted: false, + id: "a-Snvp2FgqDYqSLylF44S", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 0, + x: -251.23981350275943, + y: 323.4117518426986, + strokeColor: "#0a11d3", + backgroundColor: "#fff", + width: 87.65074610854188, + height: 17.72670397681366, + seed: 1409727409, + groupIds: ["N2YAi9nU-wlRb0rDaDZoe"], + strokeSharpness: "sharp", + boundElementIds: ["bxuMGTzXLn7H-uBCptINx"], + }, + { + type: "ellipse", + version: 109, + versionNonce: 1992641983, + isDeleted: false, + id: "7-6c-JFuB2yGoNQRgb2WM", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 0, + x: -179.73008120217884, + y: 347.98755471983213, + strokeColor: "#0a11d3", + backgroundColor: "#fff", + width: 12.846057046979809, + height: 13.941904362416096, + seed: 1073094033, + groupIds: ["N2YAi9nU-wlRb0rDaDZoe"], + strokeSharpness: "sharp", + boundElementIds: [], + }, + { + type: "ellipse", + version: 158, + versionNonce: 1028567473, + isDeleted: false, + id: "150XitJtlKDhTPRCyzv56", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 0, + x: -179.73008120217884, + y: 378.5900085788926, + strokeColor: "#0a11d3", + backgroundColor: "#fff", + width: 12.846057046979809, + height: 13.941904362416096, + seed: 526271345, + groupIds: ["N2YAi9nU-wlRb0rDaDZoe"], + strokeSharpness: "sharp", + boundElementIds: [], + }, + { + type: "ellipse", + version: 212, + versionNonce: 158547423, + isDeleted: false, + id: "cmwAR3NBl1VqvSorrQN2W", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 0, + x: -179.73008120217884, + y: 411.8508097533892, + strokeColor: "#0a11d3", + backgroundColor: "#fff", + width: 12.846057046979809, + height: 13.941904362416096, + seed: 243707217, + groupIds: ["N2YAi9nU-wlRb0rDaDZoe"], + strokeSharpness: "sharp", + boundElementIds: [], + }, + ], + [ + { + type: "diamond", + version: 659, + versionNonce: 1294871039, + isDeleted: false, + id: "aDDArXRjZugwyEawdhCeZ", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 0, + x: -109.55894395256101, + y: 381.22641397493356, + strokeColor: "#c92a2a", + backgroundColor: "#fd8888", + width: 112.64736525303451, + height: 36.77344700318558, + seed: 511870335, + groupIds: ["M6ByXuSmtHCr3RtPPKJQh"], + strokeSharpness: "sharp", + boundElementIds: [], + }, + { + type: "diamond", + version: 700, + versionNonce: 60864881, + isDeleted: false, + id: "Hzx8zkeyDs3YicO2Tdv6G", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 0, + x: -109.55894395256101, + y: 372.354634046675, + strokeColor: "#c92a2a", + backgroundColor: "#fd8888", + width: 112.64736525303451, + height: 36.77344700318558, + seed: 1283079231, + groupIds: ["M6ByXuSmtHCr3RtPPKJQh"], + strokeSharpness: "sharp", + boundElementIds: [], + }, + { + type: "diamond", + version: 780, + versionNonce: 251040287, + isDeleted: false, + id: "PNzYhT295VNCT5EXmqvmw", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 0, + x: -109.55894395256101, + y: 359.72407445196296, + strokeColor: "#c92a2a", + backgroundColor: "#fd8888", + width: 112.64736525303451, + height: 36.77344700318558, + seed: 996251633, + groupIds: ["M6ByXuSmtHCr3RtPPKJQh"], + strokeSharpness: "sharp", + boundElementIds: [], + }, + { + type: "diamond", + version: 822, + versionNonce: 1862951761, + isDeleted: false, + id: "jiMMAhQF3__7bF-obgXc0", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 0, + x: -109.55894395256101, + y: 347.1924021546656, + strokeColor: "#c92a2a", + backgroundColor: "#fd8888", + width: 112.64736525303451, + height: 36.77344700318558, + seed: 1764842481, + groupIds: ["M6ByXuSmtHCr3RtPPKJQh"], + strokeSharpness: "sharp", + boundElementIds: [], + }, + ], + [ + { + type: "line", + version: 4766, + versionNonce: 2003030321, + isDeleted: false, + id: "BXfdLRoPYZ9MIumzzoA9-", + fillStyle: "hachure", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 1.5707963267948957, + x: -471.6208001976387, + y: 520.7681448415112, + strokeColor: "#087f5b", + backgroundColor: "#40c057", + width: 52.317507746132115, + height: 154.56722543646003, + seed: 1424381745, + groupIds: ["HSrtfEf-CssQTf160Fb6R"], + strokeSharpness: "round", + boundElementIds: [], + startBinding: null, + endBinding: null, + points: [ + [-0.24755378372925183, -40.169554027464216], + [-0.07503751055611152, 76.6515171914404], + [-0.23948042713317108, 89.95108885873196], + [2.446913573036335, 95.69766931810295], + [11.802146636255692, 100.56113713047068], + [27.615140546177496, 102.07554835500338], + [42.72341054254274, 99.65756899883291], + [50.75054563137204, 93.87501510096598], + [51.88266441510958, 89.00026150397161], + [52.04166639997853, 78.29287333983132], + [51.916868330459295, -30.36891819848148], + [51.635533423123285, -40.63545540065934], + [48.27622163143906, -46.37349057843314], + [41.202227904674494, -49.69665692879073], + [25.081551986374073, -52.49167708145666], + [12.15685839679867, -50.825000270901], + [1.9916746648394732, -45.171835889467935], + [-0.2758413461535838, -40.23974757720194], + [-0.24755378372925183, -40.169554027464216], + ], + lastCommittedPoint: null, + startArrowhead: null, + endArrowhead: null, + }, + { + type: "line", + version: 2405, + versionNonce: 2120341087, + isDeleted: false, + id: "TYsYe2VvJ60T_yKa3kyOw", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 1.5707963267948957, + x: -496.3957643857249, + y: 541.7241190920508, + strokeColor: "#087f5b", + backgroundColor: "transparent", + width: 50.7174766392476, + height: 12.698053371678215, + seed: 726657713, + groupIds: ["HSrtfEf-CssQTf160Fb6R"], + strokeSharpness: "round", + boundElementIds: [], + startBinding: null, + endBinding: null, + points: [ + [0, -2.0205717204386002], + [1.3361877396713384, 3.0410845646550486], + [7.098613049589299, 7.287767671898479], + [14.766422451441104, 9.859533283467512], + [26.779003528407447, 10.093886705011586], + [40.79727342221974, 8.456559589697127], + [48.98410145879092, 2.500000505196364], + [50.7174766392476, -2.6041666666666288], + ], + lastCommittedPoint: null, + startArrowhead: null, + endArrowhead: null, + }, + { + type: "line", + version: 2538, + versionNonce: 1913946897, + isDeleted: false, + id: "VIuxhGjvYUBniitomEkKm", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 1.5707963267948957, + x: -450.969983237283, + y: 542.1789894334747, + strokeColor: "#087f5b", + backgroundColor: "transparent", + width: 50.57247907260371, + height: 10.178760037658167, + seed: 1977326481, + groupIds: ["HSrtfEf-CssQTf160Fb6R"], + strokeSharpness: "round", + boundElementIds: [], + startBinding: null, + endBinding: null, + points: [ + [0, -2.136356936862347], + [1.332367676378171, 1.9210669226078037], + [7.078318632616268, 5.325208253515953], + [14.724206326638113, 7.386735659885842], + [26.70244431044034, 7.574593370991538], + [40.68063699304561, 6.262111896696538], + [48.84405948536458, 1.4873339211608216], + [50.57247907260371, -2.6041666666666288], + ], + lastCommittedPoint: null, + startArrowhead: null, + endArrowhead: null, + }, + { + type: "ellipse", + version: 5503, + versionNonce: 1236644479, + isDeleted: false, + id: "1acGiqpJjntE3sr1JVnBP", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 1.5707963267948957, + x: -404.36521010516793, + y: 534.1894365757241, + strokeColor: "#087f5b", + backgroundColor: "#fff", + width: 51.27812853552538, + height: 22.797152568995934, + seed: 1774660383, + groupIds: ["HSrtfEf-CssQTf160Fb6R"], + strokeSharpness: "sharp", + boundElementIds: ["bxuMGTzXLn7H-uBCptINx"], + }, + ], + [ + { + type: "rectangle", + version: 4270, + versionNonce: 309922463, + isDeleted: false, + id: "SqGRpNqls7OV1QB2Eq-0m", + fillStyle: "solid", + strokeWidth: 2, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 0, + x: -393.3000561423187, + y: 338.9742643666818, + strokeColor: "#000000", + backgroundColor: "#fff", + width: 70.67858069123133, + height: 107.25081879410921, + seed: 371096063, + groupIds: ["9ppmKFUbA4iKjt8FaDFox"], + strokeSharpness: "sharp", + boundElementIds: [ + "CFu0B4Mw_1wC1Hbgx8Fs0", + "XIl_NhaFtRO00pX5Pq6VU", + "EndiSTFlx1AT7vcBVjgve", + ], + }, + { + type: "rectangle", + version: 4319, + versionNonce: 896119505, + isDeleted: false, + id: "fayss6b_GPh6LK1x4iX-q", + fillStyle: "solid", + strokeWidth: 2, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 0, + x: -400.8474891780329, + y: 331.95417508096745, + strokeColor: "#000000", + backgroundColor: "#fff", + width: 70.67858069123133, + height: 107.25081879410921, + seed: 685932433, + groupIds: ["0RJwA-yKP5dqk5oMiSeot", "9ppmKFUbA4iKjt8FaDFox"], + strokeSharpness: "sharp", + boundElementIds: [ + "CFu0B4Mw_1wC1Hbgx8Fs0", + "XIl_NhaFtRO00pX5Pq6VU", + "EndiSTFlx1AT7vcBVjgve", + ], + }, + { + type: "rectangle", + version: 4417, + versionNonce: 1968987839, + isDeleted: false, + id: "HgAnv2rwYhUpLiJiZAXv-", + fillStyle: "solid", + strokeWidth: 2, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 0, + x: -410.24257846374826, + y: 323.7002688309677, + strokeColor: "#000000", + backgroundColor: "#fff", + width: 70.67858069123133, + height: 107.25081879410921, + seed: 58634943, + groupIds: ["9ppmKFUbA4iKjt8FaDFox"], + strokeSharpness: "sharp", + boundElementIds: [ + "CFu0B4Mw_1wC1Hbgx8Fs0", + "XIl_NhaFtRO00pX5Pq6VU", + "EndiSTFlx1AT7vcBVjgve", + ], + }, + { + type: "draw", + version: 3541, + versionNonce: 1680683185, + isDeleted: false, + id: "12aO-Bs9HdALZN_-tuQTr", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 0, + x: -398.2561518768373, + y: 371.84603609547054, + strokeColor: "#000000", + backgroundColor: "#fff", + width: 46.57983585730082, + height: 3.249953844290203, + seed: 1673003743, + groupIds: ["9ppmKFUbA4iKjt8FaDFox"], + strokeSharpness: "round", + boundElementIds: [], + points: [ + [0, 0.6014697828497827], + [40.42449133807562, 0.7588628355182573], + [46.57983585730082, -2.491091008771946], + ], + lastCommittedPoint: null, + startArrowhead: null, + endArrowhead: null, + }, + { + type: "draw", + version: 3567, + versionNonce: 620768991, + isDeleted: false, + id: "Ck_Y0EVPh_fsY0qoRnGiD", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 0, + x: -396.400899638823, + y: 340.9822185794818, + strokeColor: "#000000", + backgroundColor: "#fff", + width: 45.567415680676426, + height: 2.8032978840147194, + seed: 1821527807, + groupIds: ["9ppmKFUbA4iKjt8FaDFox"], + strokeSharpness: "round", + boundElementIds: [], + points: [ + [0, 0], + [16.832548902953302, -2.8032978840147194], + [45.567415680676426, -0.3275477042019195], + ], + lastCommittedPoint: null, + startArrowhead: null, + endArrowhead: null, + }, + { + type: "draw", + version: 3592, + versionNonce: 1300624017, + isDeleted: false, + id: "a_7IZapEuD918VW1P8Ss_", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 0, + x: -396.4774991551924, + y: 408.37659284983897, + strokeColor: "#000000", + backgroundColor: "#fff", + width: 48.33668263438425, + height: 4.280657518731036, + seed: 1485707039, + groupIds: ["9ppmKFUbA4iKjt8FaDFox"], + strokeSharpness: "round", + boundElementIds: [], + points: [ + [0, 0], + [26.41225578429045, -0.2552319773002338], + [37.62000339651456, 2.3153712935189787], + [48.33668263438425, -1.9652862252120569], + ], + lastCommittedPoint: null, + startArrowhead: null, + endArrowhead: null, + }, + { + type: "draw", + version: 3629, + versionNonce: 737475327, + isDeleted: false, + id: "8io6FVNdFOLsQ266W8Lni", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 0, + x: -399.6615463367227, + y: 419.61974125811776, + strokeColor: "#000000", + backgroundColor: "#fff", + width: 54.40694982784246, + height: 2.9096445412231735, + seed: 1042012991, + groupIds: ["9ppmKFUbA4iKjt8FaDFox"], + strokeSharpness: "round", + boundElementIds: [], + points: [ + [0, 0], + [10.166093050596771, -1.166642430373031], + [16.130660965377448, -0.8422655250909383], + [46.26079588567538, 0.6125567455206506], + [54.40694982784246, -2.297087795702523], + ], + lastCommittedPoint: null, + startArrowhead: null, + endArrowhead: null, + }, + { + type: "draw", + version: 3594, + versionNonce: 1982560369, + isDeleted: false, + id: "LJI5kY6tg7UFAjPV3fKL-", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 0, + x: -399.3767034411569, + y: 356.042820132743, + strokeColor: "#000000", + backgroundColor: "#fff", + width: 46.92865289294453, + height: 2.4757501798128, + seed: 295443295, + groupIds: ["9ppmKFUbA4iKjt8FaDFox"], + strokeSharpness: "round", + boundElementIds: [], + points: [ + [0, 0], + [18.193786115221407, -0.5912874140789839], + [46.92865289294453, 1.884462765733816], + ], + lastCommittedPoint: null, + startArrowhead: null, + endArrowhead: null, + }, + { + type: "draw", + version: 3609, + versionNonce: 1857766175, + isDeleted: false, + id: "zCrZOHW-q8YWKLw6ltKxX", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 0, + x: -399.26921524500654, + y: 390.5261491685826, + strokeColor: "#000000", + backgroundColor: "#fff", + width: 46.92865289294453, + height: 2.4757501798128, + seed: 1734301567, + groupIds: ["9ppmKFUbA4iKjt8FaDFox"], + strokeSharpness: "round", + boundElementIds: [], + points: [ + [0, 0], + [8.093938105125233, 1.4279702913643746], + [18.193786115221407, -0.5912874140789839], + [46.92865289294453, 1.884462765733816], + ], + lastCommittedPoint: null, + startArrowhead: null, + endArrowhead: null, + }, + ], + [ + { + type: "rectangle", + version: 676, + versionNonce: 1841530687, + isDeleted: false, + id: "XOD3vRhtoLWoxC9wF9Sk8", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 0, + x: -593.9896997899341, + y: 343.9798351106279, + strokeColor: "#000000", + backgroundColor: "transparent", + width: 127.88383573213892, + height: 76.53703389977764, + seed: 106569279, + groupIds: ["TC0RSM64Cxmu17MlE12-o"], + strokeSharpness: "sharp", + boundElementIds: [], + }, + { + type: "line", + version: 462, + versionNonce: 1737150513, + isDeleted: false, + id: "WBkTga1PjKzYK-tcGjnjZ", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 0, + x: -595.0652975408293, + y: 354.6963695028721, + strokeColor: "#000000", + backgroundColor: "transparent", + width: 128.84193229844433, + height: 0, + seed: 73916127, + groupIds: ["TC0RSM64Cxmu17MlE12-o"], + strokeSharpness: "round", + boundElementIds: [], + startBinding: null, + endBinding: null, + points: [ + [0, 0], + [128.84193229844433, 0], + ], + lastCommittedPoint: null, + startArrowhead: null, + endArrowhead: null, + }, + { + type: "ellipse", + version: 282, + versionNonce: 1198409567, + isDeleted: false, + id: "FHX0ZsIzUUfYPJqrZ8Lso", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 0, + opacity: 100, + angle: 0, + x: -589.5016643209792, + y: 348.2514049106367, + strokeColor: "#000000", + backgroundColor: "#fa5252", + width: 5.001953125, + height: 5.001953125, + seed: 387857791, + groupIds: ["TC0RSM64Cxmu17MlE12-o"], + strokeSharpness: "sharp", + boundElementIds: [], + }, + { + type: "ellipse", + version: 327, + versionNonce: 1661182481, + isDeleted: false, + id: "ugVRR0f_uDOjrllO10yAs", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 0, + opacity: 100, + angle: 0, + x: -579.2389690084792, + y: 348.2514049106367, + strokeColor: "#000000", + backgroundColor: "#fab005", + width: 5.001953125, + height: 5.001953125, + seed: 1486370207, + groupIds: ["TC0RSM64Cxmu17MlE12-o"], + strokeSharpness: "sharp", + boundElementIds: [], + }, + { + type: "ellipse", + version: 385, + versionNonce: 2047607679, + isDeleted: false, + id: "SBzNA0Sn-ou4QGxotj0SB", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 0, + opacity: 100, + angle: 0, + x: -568.525552542133, + y: 348.7021260644829, + strokeColor: "#000000", + backgroundColor: "#40c057", + width: 5.001953125, + height: 5.001953125, + seed: 610150847, + groupIds: ["TC0RSM64Cxmu17MlE12-o"], + strokeSharpness: "sharp", + boundElementIds: [], + }, + { + type: "ellipse", + version: 664, + versionNonce: 2135373809, + isDeleted: false, + id: "VKcfbELTVlyJ90m0bGsj0", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 90, + angle: 0, + x: -552.4984915525058, + y: 364.75449494249875, + strokeColor: "#000000", + backgroundColor: "#04aaf7", + width: 42.72020253937572, + height: 42.72020253937572, + seed: 144280593, + groupIds: ["TC0RSM64Cxmu17MlE12-o"], + strokeSharpness: "sharp", + boundElementIds: [], + }, + { + type: "draw", + version: 1281, + versionNonce: 1708997535, + isDeleted: false, + id: "zWrJVrKnkF5K8iXNxi9Aa", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 0, + opacity: 100, + angle: 0, + x: -530.327851842306, + y: 378.9357912947449, + strokeColor: "#087f5b", + backgroundColor: "#40c057", + width: 28.226201983883442, + height: 24.44112284281997, + seed: 29167967, + groupIds: ["TC0RSM64Cxmu17MlE12-o"], + strokeSharpness: "round", + boundElementIds: [], + startBinding: null, + endBinding: null, + points: [ + [4.907524351775825, 2.043055712211473], + [3.0769604829149455, 1.6284171290602836], + [-2.66472604008681, -4.228569719133945], + [-6.450168189798415, -2.304577297733668], + [-7.704241049212052, 4.416384506147983], + [-6.361372181234263, 8.783101300254884], + [-12.516984713388897, 10.9291595737194], + [-12.295677738198286, 15.686226498407976], + [-7.473371426945252, 15.393030178104425], + [-3.787654025313423, 11.5207568827343], + [1.2873793872375165, 19.910682356036197], + [4.492232250183542, 20.212553123686025], + [1.1302787567009416, 6.843494873631317], + [6.294108177816019, 6.390688722156585], + [8.070028349098962, 7.910451897221202], + [14.143675334886687, 7.910451897221202], + [15.709217270494545, 2.6780252579576427], + [9.128749989671498, 3.1533849725326517], + [10.393751588600717, -3.7167773257046695], + [7.380151667177483, -3.30213874255348], + [4.669824267311791, 1.1200945145694894], + [4.907524351775825, 2.043055712211473], + ], + lastCommittedPoint: null, + startArrowhead: null, + endArrowhead: null, + }, + { + type: "line", + version: 701, + versionNonce: 1583157713, + isDeleted: false, + id: "LX6kTl9A8K36ld2MEV4tI", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 90, + angle: 0, + x: -551.4394290784783, + y: 385.71736850567976, + strokeColor: "#000000", + backgroundColor: "#99bcff", + width: 42.095115772272244, + height: 0, + seed: 1443027377, + groupIds: ["TC0RSM64Cxmu17MlE12-o"], + strokeSharpness: "round", + boundElementIds: [], + startBinding: null, + endBinding: null, + points: [ + [0, 0], + [42.095115772272244, 0], + ], + lastCommittedPoint: null, + startArrowhead: null, + endArrowhead: null, + }, + { + type: "line", + version: 2908, + versionNonce: 252866495, + isDeleted: false, + id: "SHmV_QtcwxIE-peI_QOX1", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 0, + opacity: 90, + angle: 0, + x: -546.3441000487039, + y: 372.6245229061568, + strokeColor: "#000000", + backgroundColor: "#99bcff", + width: 29.31860660384862, + height: 5.711199931375845, + seed: 244310513, + groupIds: ["TC0RSM64Cxmu17MlE12-o"], + strokeSharpness: "round", + boundElementIds: [], + startBinding: null, + endBinding: null, + points: [ + [0, -2.341683327443203], + [0.7724193963150375, -0.06510358900749044], + [4.103544916365185, 1.84492589414448], + [8.536129150893453, 3.0016281808630056], + [15.480325949120388, 3.1070332647092163], + [23.583965316012858, 2.3706131055211244], + [28.316582284417855, -0.3084668090492442], + [29.31860660384862, -2.6041666666666288], + ], + lastCommittedPoint: null, + startArrowhead: null, + endArrowhead: null, + }, + { + type: "ellipse", + version: 725, + versionNonce: 1969008561, + isDeleted: false, + id: "PKRg6SqIetkWIgRqBAnDY", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 90, + angle: 0, + x: -538.2701841247845, + y: 363.37196531290607, + strokeColor: "#000000", + backgroundColor: "transparent", + width: 15.528434353116108, + height: 44.82230388130942, + seed: 683572113, + groupIds: ["TC0RSM64Cxmu17MlE12-o"], + strokeSharpness: "sharp", + boundElementIds: [], + }, + { + type: "line", + version: 3113, + versionNonce: 533471199, + isDeleted: false, + id: "HrelUAgvfxi_4v8MyL_iT", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 0, + opacity: 90, + angle: 0, + x: -544.828148539078, + y: 402.0199316371545, + strokeColor: "#000000", + backgroundColor: "#99bcff", + width: 29.31860660384862, + height: 5.896061363392446, + seed: 318798801, + groupIds: ["TC0RSM64Cxmu17MlE12-o"], + strokeSharpness: "round", + boundElementIds: [], + startBinding: null, + endBinding: null, + points: [ + [0, 0], + [4.103544916365185, -4.322122351104391], + [8.536129150893453, -5.516265043290966], + [15.480325949120388, -5.625081903117008], + [23.583965316012858, -4.8648251269605955], + [28.316582284417855, -2.0990281379671547], + [29.31860660384862, 0.2709794602754383], + ], + lastCommittedPoint: null, + startArrowhead: null, + endArrowhead: null, + }, + ], + [ + { + type: "rectangle", + version: 685, + versionNonce: 706399231, + isDeleted: false, + id: "dba8s5bDYEnF20oGn2a8b", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 0, + x: -715.1043446306466, + y: 330.4231266309418, + strokeColor: "#000000", + backgroundColor: "#ced4da", + width: 70.81644178885557, + height: 108.30428902193904, + seed: 1914896753, + groupIds: ["GMZ-NW9lG7c1AtfBInZ0n"], + strokeSharpness: "sharp", + boundElementIds: [], + }, + { + type: "rectangle", + version: 835, + versionNonce: 851916657, + isDeleted: false, + id: "3HxCT4mFZF-jJ6m9pyOCt", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 0, + x: -706.996640540555, + y: 338.68030798133873, + strokeColor: "#000000", + backgroundColor: "#fff", + width: 55.801163535143246, + height: 82.83278895375764, + seed: 1306468145, + groupIds: ["GMZ-NW9lG7c1AtfBInZ0n"], + strokeSharpness: "sharp", + boundElementIds: [], + }, + { + type: "ellipse", + version: 881, + versionNonce: 704574495, + isDeleted: false, + id: "xX9mcMHy_0Bn-D0UAMyCc", + fillStyle: "solid", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 0, + x: -684.8099707762028, + y: 425.0579911039235, + strokeColor: "#000000", + backgroundColor: "#fff", + width: 11.427824006438863, + height: 11.427824006438863, + seed: 93422161, + groupIds: ["GMZ-NW9lG7c1AtfBInZ0n"], + strokeSharpness: "sharp", + boundElementIds: [], + }, + { + type: "rectangle", + version: 528, + versionNonce: 816914769, + isDeleted: false, + id: "h60d2h6UPYkopTlW_XEs4", + fillStyle: "cross-hatch", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 0, + x: -698.7169501405845, + y: 349.2244646574789, + strokeColor: "#000000", + backgroundColor: "#fab005", + width: 39.2417827352022, + height: 19.889460471185775, + seed: 11646495, + groupIds: ["GMZ-NW9lG7c1AtfBInZ0n"], + strokeSharpness: "sharp", + boundElementIds: [], + }, + { + type: "rectangle", + version: 570, + versionNonce: 1198069823, + isDeleted: false, + id: "bZbx28BjXM33JV1UezMcH", + fillStyle: "cross-hatch", + strokeWidth: 1, + strokeStyle: "solid", + roughness: 1, + opacity: 100, + angle: 0, + x: -698.7169501405845, + y: 384.7822247024333, + strokeColor: "#000000", + backgroundColor: "#fab005", + width: 39.2417827352022, + height: 19.889460471185775, + seed: 291717649, + groupIds: ["GMZ-NW9lG7c1AtfBInZ0n"], + strokeSharpness: "sharp", + boundElementIds: [], + }, + ], +]; + +const initialData = { + libraryItems, +}; +export default initialData; diff --git a/dev-docs/src/pages/index.js b/dev-docs/src/pages/index.js deleted file mode 100644 index 9437c6c71..000000000 --- a/dev-docs/src/pages/index.js +++ /dev/null @@ -1,42 +0,0 @@ -import React from "react"; -import clsx from "clsx"; -import Layout from "@theme/Layout"; -import Link from "@docusaurus/Link"; -import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; -import styles from "./index.module.css"; -import HomepageFeatures from "@site/src/components/Homepage"; - -function HomepageHeader() { - const { siteConfig } = useDocusaurusContext(); - return ( -

-
-

{siteConfig.title}

-

{siteConfig.tagline}

-
- - Get started - -
-
-
- ); -} - -export default function Home() { - const { siteConfig } = useDocusaurusContext(); - return ( - - -
- -
-
- ); -} diff --git a/dev-docs/src/pages/index.tsx b/dev-docs/src/pages/index.tsx index 9437c6c71..f35c2e4a7 100644 --- a/dev-docs/src/pages/index.tsx +++ b/dev-docs/src/pages/index.tsx @@ -14,10 +14,7 @@ function HomepageHeader() {

{siteConfig.title}

{siteConfig.tagline}

- + Get started
@@ -27,12 +24,8 @@ function HomepageHeader() { } export default function Home() { - const { siteConfig } = useDocusaurusContext(); return ( - +
diff --git a/dev-docs/src/theme/MDXComponents.js b/dev-docs/src/theme/MDXComponents.js new file mode 100644 index 000000000..35234301f --- /dev/null +++ b/dev-docs/src/theme/MDXComponents.js @@ -0,0 +1,11 @@ +// Import the original mapper +import MDXComponents from "@theme-original/MDXComponents"; +import Highlight from "@site/src/components/Highlight"; + +export default { + // Re-use the default mapping + ...MDXComponents, + // Map the "highlight" tag to our component! + // `Highlight` will receive all props that were passed to `highlight` in MDX + highlight: Highlight, +}; diff --git a/dev-docs/src/theme/ReactLiveScope/index.js b/dev-docs/src/theme/ReactLiveScope/index.js new file mode 100644 index 000000000..a282ad6f0 --- /dev/null +++ b/dev-docs/src/theme/ReactLiveScope/index.js @@ -0,0 +1,29 @@ +import React from "react"; +import ExecutionEnvironment from "@docusaurus/ExecutionEnvironment"; +import initialData from "@site/src/initialData"; +import { useColorMode } from "@docusaurus/theme-common"; + +let ExcalidrawComp = {}; +if (ExecutionEnvironment.canUseDOM) { + ExcalidrawComp = require("@excalidraw/excalidraw"); +} +const Excalidraw = React.forwardRef((props, ref) => { + const { colorMode } = useColorMode(); + return ; +}); +// Add react-live imports you need here +const ExcalidrawScope = { + React, + ...React, + Excalidraw, + Footer: ExcalidrawComp.Footer, + useDevice: ExcalidrawComp.useDevice, + MainMenu: ExcalidrawComp.MainMenu, + WelcomeScreen: ExcalidrawComp.WelcomeScreen, + LiveCollaborationTrigger: ExcalidrawComp.LiveCollaborationTrigger, + Sidebar: ExcalidrawComp.Sidebar, + exportToCanvas: ExcalidrawComp.exportToCanvas, + initialData, +}; + +export default ExcalidrawScope; diff --git a/src/packages/excalidraw/example/public/doremon.png b/dev-docs/static/img/doremon.png similarity index 100% rename from src/packages/excalidraw/example/public/doremon.png rename to dev-docs/static/img/doremon.png diff --git a/dev-docs/static/img/og-image-sm.png b/dev-docs/static/img/og-image-sm.png new file mode 100644 index 0000000000000000000000000000000000000000..5e88dba059f7f09db43886d3d4affca8340688cd GIT binary patch literal 77545 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�D$~l`8ghbnpaFyHqYKG~9i16z7$g=h^ zD4uOxTQ-J3=~*o^DjB0TC@AEZc@%d{+dMqd!B>^ zXqV=`xk%2ia&yTWbA!pP5||*}`^_^CeqSHfC4dwLUdm!K>w*N(82Hoc_HoZpE-W;! z1CfUn^UfkGV_I3@n?$)bo?SDuv@|y>_*6i%^JMO8*73>ab~wkGL=K5#HSH-V;C6Oq zqp9~^w-#V4BWl+%r0d2M1bgw=;(G_kZD)uKTrGXKHm8H|Dchq~$GCQfnSI3HAU z;sg*_oqn9u#&Qlli6Q6FtkBoF+RIXI*;dt_jNP44(Xa_ZEJ%otr^%In_39P0b>vm= z8HE`X4FTAdMfuO!LV#?|$ZToHm$vOd|2o?Vu=#td);Rk5V0qvZCR%alL{o8bkA%du zir@+f^SnXD`|4&AsB>Dk*B3F?BWUjn`ssgy1P05^&%e+bwk%$y_xoced+S*ka~*tp z%h}^VpjMvRQc>>i@dl1G^yrZek04%UA|dMEov5gg{nsH;`?G2E@GT~$;xV(j%jYk= zuH{OAUv!omAwup^!sLvo*3WA3|qa2D&M~@|2i$)RhC# z5Rdv`!$L3P6FNE`_>lm!9OPbcht9|MW*eIu*>Yb}F(x4u1fw81;vAeQ-Kbb|mH|x> zB3AJ)iOv9%*Gf#<-LTSEsPyaod-!DRT}T*XB~S@;HC2(ML$MP7@=G!K{_dK-gc$~D z+a&!|p=dM%yrnH08!1QQjr5E(mAkKdeWX3%#g~^m*iE0CGiHt*<`|9r} zG*lDMhqUJ|z8L2x*lD)( z9nccbF6xx^8+>U->X;!=|IZejr~A%*`fGb*ak%S0P(;y5 z?liPg-LBkwdJ~--x8^X&2w|yp8%7fqVSC(8%9!JPAQlc}+6~UJ=?jI8C4BAd`h*%^ zYHRAL9mC84KWY_6MM9^|shYy1B%<2HoQnOwrCROt+9m;z?;3c>2L*dsncHC)s_nh| zKkg5(jo-8V$T-;79nWssSk+6M4iSVwb zYauocost5cOz;L`q@Z%ZNv`hhD_!gEM~6JbUpKd&c_f$Mp6TzU(-MwJ$w@|L137$g zcJvXAZrkIE($bxf4gu(+Je2N>Ui){QT_k&qwaceY@ZASuCz5njK6YJ;WvYI z4au>k!Yu*Rk7Lqj@@O>wMabi@jLedWNZ>^>3TwC7MYA1cG{p>*D4uuuvmC@r)6)}? zUS3@YFAiB`O|`=Gw6K`|$bBX;<|s9_P*s}WRKlKZe}_H7 zTYZkZj61@AeUw$3tugJ66}-;?Qq$h)!3XIy1`EKztXWtrk#ZPdVShZIBEZFkIFZZ~ zSdw(l5%whBr^|?-Jrc~s#q~SdAQbgZWcYVg%>1I0C1Wb3Md(QwAan=I8-gc03(0wI z3^umNvYr{v*J}2=P^|(xjypgLL3A4mRB!@;^l39VaJPTuVYR^}idO&|l@XbA9l1-_ z$gVg~om`u#2;tu5U7(S_yFA^sQjV{BPnenc(hk0K+(*~nr)nsUSA>AfC?f!1_>hJPX`O$LIA zs5go{8MkV!qu~~@x0Ha(xf3KZq;EJPA~;?*)$#~nhbluZeReJECn#_Pe{}3Dvx6;j zooD@j)*g{f5T|H* zg_+#Pq^j(cP&cB}{H@O-V_~*jl1h0c(z8QBm{oHaM!|+31-|%FDCiN^myL zGwQOt|L-cQ=P6WzRlwZd4#2k~673@RJu+s#@3`?ALudX~AwmL;G{pAff__}Ho@WBU zAH1P8QM|Y|F_Tjtr{?_Y>l}MbMB|;gt<_C(ubZY}mT_M??xME(;*d)*fyPFFuh=CD zv_T0M)c2*P@nA;479GQta;w=ATPC*TQ(O#CX*UwIz)yj=rj^$VN}FRa$LDbp;#r^S z@?d)xC`oE(aXL^;tr@K$9mZ^_jNYj`aqf-3_3hhNsy@NK^aUXhGW4ciet(*iA(bgn zk+=A{sRYaJW$=tpURWBrqiep{e@R3nAR=%*<3^e&NXyQU%g4C=$tCa*2s*Ms zpgQu4K`}F;;mQ*Rr4s9Jj`oU*f#2@b{rt9O?omG|LY{)MoJUiGSSM}N>iSCVw3#ld zA9|*eyj(*@!abKGNOwpUpVcBL1v2xpUFA+1O8hqu6xDi%sqY&CSb0cwd;@KP0y!KX zVV}_TNwHeXXEJ3nc`ew7vq}^Vu1f=i3`<`oft$#gI03y@K;qdaub1)7Og6uXOVt{E z_ptvPV!~Hej*5~p6h{Cgu>Ac$s=k7)%CKve1_?nL1wo{{yHixUR8pj*rMpW+LTTw% z5Tv`54go>BTe>^W;{Cq&T<7c`z~1bAKkHs=X4Z_nJC&`X)6s`NYA@a@D5y%d426du zc0>aE4rIfvjmi8}&CsJqzz~p+HO^hpEng zw#7rDV`2cpNY4M>@Ta@`^)EC7$~0K+n+p5T;|ex2S@Oyc#fJY5l0C1Az>y_UfVK~yjFDWy=uu2yvyFnndnllh#Oj{f2G^!Clm_W2MSUV<0> z1u_zleW;4@vC)XFS53iEW}Q^SNZ4I5?I}yfDso{xl4gS!ts-dR_X#|+N;4ORyFNdl zAaCZZR{8=enI{TQsSSZ4*vm!=jr_uA16Rr77Gmkv^%p@z6@;(Ey>ut5*srN* z7%yE754-zZ6 z1pnZN4D|F;TsO#39n-MX0m?+6tQPFK#zJ_I#*xQ;hi}AR;~HCB&}yvXy#CYQ5i;ll zbC|CyG}Na;Jtt_@s3N4~7;%VF*aD=pO~BBI(h9GK}vyfv9Wp<7GaeO9f{+Q=#^n->w2$)Qnx<~ zMIY>>g@puA(gakGF9n4#RF^2lSTfC3(K_8B%uLAR0_YI6DqN>WQjDQk$=RSr^}0Aj zTtK`7aIX`cl5VN%?J}j^KM1y%X>dSCN*xDpYSxZ2MI?@Rh{jW)#CJdJyod1ybAsm4 zqmr(!fAb9<)~*jv`-=?_d4aLrEchoOFhKH=fC=YS%ADwr5w_{?+TZU>*AO(@pY2Dr zd&<$gS~&>8t=O4)je^*PxHIQaWjl=tJ5v1I0n(Y{|0pRi6aa8Jp_r^%yladb^k)W) zRF1sTaqw79-HlbeZMOeK;Q`eTa#JCPACQGbdeN7rEh#MhO)*g1`mgG?igD0tza4Go;`+dw}_|I1KY8^SjV=G;+iQ(0lbi%}K z4;`Q(%VO;KC{aZcVP@vXL}X6SJxRb1f;dN(81LHA;pt){?EXIa`?rj>~57c{F+d}E}UROl6~Mt?ZJOG}$A zD`XME(Ts@?@%{LuS@RJdsxDd6s+$kuYwn>x19QD*h^izS2?E1MAWNYH0Os#yc)`7m z!=xs^Yd}Xj6w?)820l7DYH+<4$wu9c`n~VSu+9n@h*RX4BG80{2?GTyTI(|UckoV= zYY9%;{>zv&pM!Rsh+<_=#>vHH*&7=>4=RyM%6T*`A1O=AR4E@=X!C6n53(Aob>pre zHRXIl$b+>&MKuTpy)g6x`sgSYYR8hF0885-syy00fail$SJxJ`ugr2)sj-qi8PT{M z^jYo>;#uIW;V;X>jd%#5g|Lc09k^n`2qy?!ZgtG9Hh*}FP7wS-;zXk8KAPOv=zi*} zDZU?z1Y_f_okLG{iWGu0%g#9WIzbp?_s#W*xNj<~x3iEDh8i2~$Eb(uVm;}>VEz8B zyIc9@Us{}1Q{dBvNA;ZaYI6)49FA!uL~rks{cQ9k&;ygm@nqvd(D+k|yAvk6!j4MS z!a`^Q;u(s2M`;TdXV=W{2vcW~q{_)(0fNlb7#mPHU@PmMdlSaYSO<4hM8ar9y|-6! z6~6}Nvq*^$1jXGBa3nn18j=UdD*L6DR%KJQ>rQa_@?ldgZ-xYhq#y(!14=s4+L~Sc z1B`u;7TJ=8`9X~+l=mp~H=t7x4n=kr`W1%|T|C%I9oBVzV@WAW+LI6w?%GKnh_`m( z^YViA0Ax{;D=mt2JA?Zi2iQIDEp|K(Ojj{)L<;l{gtW_OV3o^=Cm` ze<4>=|8oG_z>AaA;PtvTfx^?w_f+quowp`dH$1MVYG9e{UgskdzravC&|#e^1xz*bpHaTgZXE5sxuQ-aVfQ_Q zB|*b9poOZ_k|3f;+V|MQ{c-4YI`Is6g18-hOWM+S`(pP!fiZncOU__y)CS05kw0`l zSC%)yUs%YrnG%4cuBkZ{Ln`W+$=@kD{MN5*Z6inc__?L~{ezRBqMFZ3fnEq=xzg#u zp<=e$`TO-VhXSGbhg-qge0ueyi%F;v5^VC}r0>{xVixC3eQwU^JxQ@2e2jCv;7jK^ zJ>3KUgyzq{J-t;<@U=wm>iGb@?FA2FZ-zB&;2|gP%``mF`*n)hH7Jn_T=I&LYJf$0 zuxE-$V3S|ql9)&ESQYSEfcUNVTT@ThN)~J$AJ#*_83BmtKO?hK2-?#u&~;p7Nea1a zW2Ym$K>WJpU2;@db)%Lqfxs!99PuU)%yQ4as~Ep&~1{B z`iZYp23>Ez6b>R;v-*tOJ#!iq)^_#gGFT5oaXz>Dz;&$J(BB{VWVo(l(nCRg)eco< z?g6CE`I^Qh(+re@G;GOTaA5prZ}ua7!Bttgy65!x}O%73t+n6FX5SyS>=rvfx-t9VjCxf_xO)jttT_)@*f;x9(c-WYw zR)S_oMccsi^}F3>zdSNBqP{iW;Uy@2>6XR@S$kAb*#9}1GKh?uGYxf63vQ*6EH_`o zrBItOI1R2Z-E5qlfuhAAj~*=sAC>@`YI0&{dcm`!o_NK&0}wDXPzHY5r&Jz#?Ctt{ z9oxBdJgBIxVXR*B^Yx9klK;7AlJSc`p_6t^U|><-!a~ECW?_zwo?c}h7D#{UeN|5z zVzGNdMwaMc);~fop3SKSw7z8Yr)bsWDx0fkR6R~&pg?0%93EK_I#=NcdtZk2z{GU} z77h@Y!%R$fVKVaoK@=LCuk=UI4Uh@8w93f(J<`YF`pUsx+_f1>YMvw=9F;$UaE_+B`54}{*j=1S48=*TSJQDy?f%r!w3~EN^9A6 zF!GXn?->!i+O&5SD9TY6HKG;OKtv!g|-R)gBOt(^WC?rq;l~@N%Bc)14d9 zAgZsYSVH%$5JXe$Hi$_PT6S9SeFMF2m}QRD26&5RXdknRf->nzy!^?|5Tb?oH_)L! zk7tpbden-1Uq(wyOIf)e7Og<73Vj*?9!O$o4>YQIQz>JC_W_B_rj_;J5p*h&W=9hg6B`B3v z6;$l(ytF||jfSmMp|=*QLRGYZh*4oee(dL}3aWcBo7nmg_5!JU)F=@djKCixmX(RiX@3y-}fv@R6d!m)0UF*uckM~4NeQLbzl9R zk|@58hwhyw>=5jI-!{panaxI+V3d%EDCqgQV85p^<=9%%gM0VPaZG4)h@DdTJtV1K z>!azt()HY%5=40;l!k_jj%NRStN-txhvJRo#B{W@f4@x5h(&Q+nkELxwl4P^9>flo zy945V5#+Es<-C>jtyo;*X_))h2Og5l;Fm+$$7`~`gtIZ?hnc>Ci}t_d`x0;v(922u z2|)962EV0_j&`Ftn&yQ?0^8|tRe^ytV_TD5KU!Otva@68$k+;-E|0CJF!@`p-(L_g zlI^zYl$6Zj%o!Knt9|rEu&AP{EGzU1k|5%vqdB>Fz%JgXtNr+E<+1ErMjI&yR4T;} zA0yC|J{@6@BVVhly?AkO%-Yd2xDWZ@*-E8d_R{rPP~@rH-0()mxy{)4INwcFzZ?CX z0@73fMt#Rx=#}QgBOVI+H>GEZPEV&)Sv%M}>VhGGl`)S=H(|3Os59!WwRasEXoW8F zJWkewR`e{bx8}F+hPb`dk_*nk;H0#)fEz^QKA}b$g{D$Owct9gUUp$&;rH*>HJ*a& z+%}tI?dJ~MJ>c2`k}H(=4IfLzVXE5Sd%Wa0ey|FvNB~e4PA&htZG2Nl{ zl`bOx7L8#B(lzpTF7PwRputX69atg#*U}M*JpZ*(j@Ov8tLyh|jf3sE);*h6iIFre zRHGHQcbw0Lsl+%3rWoaCS$cb^jJovkFy^+FHKles@1?JSEH7d7?+|0CjN$z`KjT*X ztGnsWqurnCcX5Jz_1*=s0(BCcE!ju0=8wNB>Xk})5`E!@(M(ZMC{}}%2SfUO z73F5)cc9OpAz-DuVHz3p|KXQGPe+GV8{k3Bck3D3a+~!G98V&@OA%OxwYRsMuLC0M zy8Wr`)}JMbRnNl4)bzE@49c&dYI6RT?{O@zWUOeKulA@oI7Ht4E_`{4BW3tIvLn)$ zOr)p#C&dyYE=u#poE8F^pLLI4<0}pyv9|e0U*Y^*sZV{?DwYFj&1U*e3}d)W{E-!w z2x{1vYtKs~<1sh^=?0%P5NdmVS0Dg^?xiC#a!a*50d^4X7(|95Jlk&HdRF5bgqdY??Ch*7kK=7< z_6C_rx#BG2HPR*6PY}nT>s|w8}_;xP|aS+GYGxm!CUhw^Z7l0Su3Lu1A{~c1~4uVh#Iu7?Q zO%b%Gr|*IV&?fZn;+oCY@qr46ic9>sI$%=rJ?Fz=*gVjqpzvnMjI-U;+k_DXbj5I; zn65luQh!vrKkAZLwEdL10GQFAwgz$Wx0{(@th7O!pfaGm!^{n$hySkTkp3-rAQt|lq_e3MK+r^`ugsvlw zJNnbfC5})kzp;w(5o3QUsf}%z`*`W)wUd);Uw^47D+_KLkPn^hc9&xGZjR5cti#i* zE=#@Ia0+4KQf^w#Jy?G3Wk>aGOTV=R0gI0-O=~1(AZNj$MR9H8eCr>O2xmvkyMc{} z6`+h?SzelIblR|g@#2anJ~9%L%3!qP1H+I)y*fB5KYOt?li^i2|yvR z2XJLbq=GcTcTHc^!+*l4Q$0DfV^WHIfD=@EQ79;DAj<<%76^pgw;ozBVh@jw?kJQ# z`Lx%%X$aPV{0&)smdsm(68cTTfBVnE!lv}}2Hz86-S^V~nHJg$qLt-4 z_Fm{r;-!9*K&AEqHMY1vS+ zrKXxjvap%bM3#K<>2Yk7&wu(NSW^Je6?HmJ0Q$G2v24Vd0C4JM?{Bmse8<2;lby(T zh9T^8%<{%t#p5Rmc*w<>b#-;fCT{8H4h^u>^N#dV3q7 zppB3qNBxkdU ziE(=b*#Q_ubWApDZOMDn{7m0jJMh=OWH)GmH}kfX|zbV ztE)F1ym|15$nMN5n0+aw!jf3@xw)Vmi~XGS_+^McZI=AgXHQd2OeCen>RoWDxp@Tz z_eQ?!yn6?u?jXM{U-tmvt1s%kj%yuC^#t2El~Qja z5Gf`gIf_yM&k5OENJxMj2b0O?I@#)sT2Xp~OzpR5rR9^*ol47imHlt4Vjjf!v5WE*XBY+{(>=>Hi`fQ{4a9prU?|}x)#fEgz^Ef6Zr?REFO`8 z^`*yE_GA^=D!HUD&V8QHst?0DA4(z}0#Ptxlk=1>4h-^}ujbx@OG6YjtYjnn(yuok zylb`!#!Byv#n$Ma&>8Ym8#!qbwe5?95+}X92Znq*2M3moY*(k(qB0j?lOps9;T?uj zgrSzSVBNH*G=Q%$2wCzaImi~sCR<6ozIT7f8C5)JQ#EN_KLe?}%PDuXto1wzTXO+p zZsqmqBJPg{2eaQQQ^w#&*{4qN%Fypu)?Q-2^sV33c$dQ1(Sk~-2Fi@SzVX`^lF^bb zFzZ8h+`USUB{0~&Co213#TK<`?&&V71S=!s9SWi!wzGX3qc@l5vD$e9cA}^GkZ=yd z8FVBh6!9>!mH8Dp#m0CReR2Y#qaek6JVs^cpXa#=;{%+L!Da|L6n`IKJJ$8cPjELP zFbh?EQ&vunlM@%^RJl+3#QEWUd5BYoS{zS{jFH(i-CetTg&3Iv0H ze5o9$!vhsZ&mK2=AwM2YeXtW$Hf&*CJJx@wRR@3{_zna@0Q8|6`y3SG_k_;OATdv`bF%)h)^!KuB4WWi4+ zHzA_h`RH59M;xcvfoWfkkfRO6+&+aOMN+1NlH3)b9!N>5xht5c?oOqM+v)=>Wze*} z*f5|4>LrrjDGtEmotM9b0!a+ngH7CZCUNI_KPiMZ9pAZK?#{n|)3Ld=2?magTAnQ@ z$yL_R8oe$mnom?l8a+rHPdN}i8-2ssLFyEBokM8zN;Ne$bPON(lUcU)Er;lkB)C2= z1bxvd0u6Qig$`Do{!vh;eMV7{n5xbLmT|X@5s;JIMlmnq-{aT^w@$FW)3q|<(ok22 zwVc8t*ldw0MJz&YiX}F3`yL$J4y!xOKTllUP$|XlvgxPQ)D;%0zMTGwW4=@R2EA>s zB1PCmzr^ZgYb-O;!?xbIltec{5l;qnK8HA?T4M!IE0&A!r%=KXn024<@nYWik@O`A z5`dZ>e|J=E4O2u_LE-(v2V6{QlIF1AIGiu=icikY5G(Q>_zZ``AM$ov{rhukm|{JL zqS*ITxx=^ZajVbf-TELI$Zy)*0wXww(lQ;V>nj7PWdjcgwS$GM_CT&|DaaT#UjVjR zpk3Q8WjH2gWk~p^&1@~IkJ0g~b{}NwdH(@bPtkbvQvsXJ7wuo1H%7KV_gf%vC$y@4 zW)M8BMj!lfw1ELy^@HL|%p}5jGY~ws2M2?CTqZx@K4OTH((}N)J!eTJD@Put=X$gY z;m!t>lrn_+s1q=XrinR){Z=wTp&7^mM$OI2ZQ<UI)T|noA-MyRbP!z zX>Tzx(mXqQYisK;${S!OR62J#GYXY*9cK8V?X3ajZ1cJLSGx*jnC}Z zDiAj!R@cJ9otZ5{?^c~jWGEZ0K_cMm6QqIm;?8wLqvs{YkA>RCa*va31m^RqTkKn< zfZL>7CGc53;o3(!jSF~WU=xR(k5l!$M0k#At{l=$NuCET7yM@gc+v~fgZ6S>IjkQD zdw<>g?mHLzKTYIv+wa-8*H=8fC07W;vd{zOiu5bK!9G!OF|KE_;2SjQ!^Mm_l=@Gv zzjr3+q>hPvOpu}3N8Ze(p|i*@P~UMRBq5>XbIkwui55gRI|oM}!@>hC5#>>e&-2w; zGd=*zl?IWXB8rcsPJ!c0QfNjvx3I7fR8GS@^-wmEMQyG56^!$lUK!lKGs=o{mkBlh zW1_+R=MONY#NgPq_w1AdV`T452TCGeNE?C;7+z!?=))e&SIJlbjtBeRu-KXcYtniR zxp@V3BNIt`Y+y$Bs=_{}IrT1GAQ)N1roc_Q`Le81Sa|2)1pOULXP@=(K;6B2euJz( zEU+5!KG1-u(JwRrAz9dA1#ko)gZ7w4)F(H(yJNCxRPIGM1*8J$iP&5jxR@|V1vr~@ zP01?5?e>0;={XRI65oJ?S1I=d{Nm{FaIBw&IN=c?QlYtNAEMfzu9K8i$(QVco;|GF zJrvkt^EldH2A0j#8J&Dl!)_O>`@sKgb!Gj&+tx&yK@+A4J3;?eyvo@qf*dFTxdXc? zeJ&B5uqb*tv-rI4q_55owV1$cJWh!+(E6hVWA$X9ufGe{s?1m@5G9or70&K(6A~2T z@~=(R93*hQkvK%uZ@vCl%WiPHxDb^~Mrv+h4x&fDIfZFi835JxNGK>$K#Mj$F}69@ zc-1-o3pVm$gzkN=>;py(dYZJZ^_@?ZPmcCfHC11q`J)O#rNOOl1GBVr*8ZWoM`DQ7 zAF*-%c{-rFfwENq56=!9{i5>Ep0PPWvJaSeA>2|3SDlOyg1_O_($^g@>*pg}XW}m(_a0jPo$T2F!=~Pwa~LH#2(f=TtttiL7|}APn_X7FJMDp3Plj)u#ZZU<{rVu4_e^z$J*`>@uoVu%=O zqj`Uswcsm|xkDlA;qpRRi=#1C`q)X?HSx+Psd{U4(U{Ox)^+ zy!J~VL|Kahd6si!B`JlOa$4|xh*M5XC_Ix7+5?*r{^=Cwf z79BGV9J3-c3VU{5q6jlnQ?xcDdfg@)3LYPY*Yo{})%mLb8QdUV5CxCJR0B^N?^0mf z2ZTo84fUz2CsTq9_n|=ZHOmiLfpP>>zGhPpKAI)hN8AX!+kCMhR2M^UYWb#Yu%)GE zh~QC1eR<6C(A|>#Y|vh~y?X~96lxIC;CTsJ3V@6+b85eRyFOu+&bgE(H&@Xc0_iF~b^`SlSzu0ws%fYc!&}%)W8T-?zoD9l0#Fpg5 zR9F^`biJv3?Hoac2>w;7+UjpW9r*&x)}Xuz2nw0zxN;=Do2lRm{f2_47NpP0S~PwYsim%g)(( z>_-dSv!Ml`K$n!e`#?xTQx-MmnT$-JNpPNRni$j|7yu~~qsWUBFE+{6yY?x-5<~>H@{LS4=9_kMho<-F}eHQJe}DMdif82 z3$H$}FEjkx9ozneA7pJ0OG+e#YrT)YT};yImw^Mh;E>sBccR8~$iB#bIj{gR(Y_r$+LA?>;4wq< z>fYY2hJT~4%!z-VRB@oYU*4yk%CX3oFFBACqME-FC(M17z|Zz^Rni*y5*`jw4>3dt zkHhi58j%HuGq=o1E&Cww`qi0fyA$#yVB%tYVgeC|UjgR*-1Ui^9<4WvMlYf;KW*8q zVBW6xImfuUFd?G}TzZlrea7h#t_t?yxRY-_fd z($xVR7=_DiaS^kMi<@kB^!Es=B%-7HGo*ugtj2!eC)>7#HLcPQzk&5sUS6K^ii*h! z>q$lVJY`sh2TY9qleFUS-@gy|(Rg@xnt#W$zFgSZz`9@wcD`CTbKp>=m2KM*k=Kms zj$uTelpxb6(j|MU42w%I9ltRKrX?l40+FFAVN?>UPNmgQu43L@3YBWGf`A=?``i}8 zpY3C%5fA{p@zBOTe!~E3iTK+cLHPlJ6A z>VB<(D-#BH&1z+gFSxd~O!i>?HYk1j=_(ZV&DID_PAzz>M9P}IOwR+*D8!u$NwsY1 z`#L3*pTDWh%;T9USBTh{5PXW(T-kEm%$GeSI{=%5S<5}kVwq=UaQ{!nvGUMa!9O)8 z_cK+5F*8bL7MtsW)2l5B)U`2EB9F@y|I{li{!%@AWnt;EKBiiw!yj73nI(TC>Lo^4R6eFKhA6H|8ukMHKo*TxzZ=}z|m$*G=Oe}#R8 z=Pp?t&ZPM*>Ll|$o9+(@PmHL5#eyg>h)+*T8!ysZUteDcx%WQr6|d#-)=x;BYQ3!Jp837~CkSf}Mf|6}4sn{jy;!}Et+mO~N%>oR3!l!p zmbt9`iKomuQDm~AMddMsU0<%A(E1-%3kjw;*dgd9r|i_#U5I;wcd%~x7`rg{!B9tJ zT4`BJ=7N#YPq_TR!dBI;1?tSg_^RUG_K_tNiI-?-M;oIg;xo~k`9-=l_Bgb(74Ano zygXFmhmKB?YLCQkW9gi_W8558SNi-4Use2SMG4y&XbI@p+Je9u931DDj^4vtU-)-s z8n@ovh#9}1UF&*b$DqBR`*R5L}bGj<&oF13u%i8D0M}|2(Em8I8M%0dRB?r}AG_SlE@C$bOX=3hWefyR7bY z34gIYK2%`Vk3{bPNmZfkDk2XBMQI@vIPpn^{c`vGUwkwqL4oYng5hBapPOxWceT`# zvGTX-c-stYpK|27KafC5)~+E{tGLwEpPzOI=SR~kEBN2M5A#*;n*BE3kKU(z5S79q zc%WA|QTg_1b)1%|E=feAkIOr}TpyT(S|w#d!`WwJhL?PWe$a`uA__T;beT;|HqmrIBtA+ICG% zv}{$-9U@p)DblO;t?T*W)FLeXFr0!r7nJ#^d}yaGl(sty<1BkCf0@C#eShoJWi9HF zvcEr6dvaQ2j>W~}W0UTfGo$8N@$1tp*@G1}B_;cQ?vUQ-xKCUzzms#5lKh{tYgZOJ ze<1ewUU>ScDGik-Q`%8RX68`I&TeL9E)-*6pgzh`*U9ek@<&x!KpFl{#`?E!KVJ@p z(vi0zuxVVQR|&gxvN*q%l705f^7rO=sn^@zA-Es~f%wRv@4?9?h6oiZB2vrNa&q7f z(dF%q*Zpw1u4gYwAOb%a2=7Rblk=mkNqF>*JrVW-D+hi^BGaRz*Q_Q=ubl2~Pjl)_ z?k%>zwY2=z_Y;54sQ}7rvCTBdJ@rIl75807yPzz5u}pNb=T(`#S^TrPF+2E8Y~2!VoRv8>s52W zDst%SJ5scfHCkWo7f#>Rm?dO|&N*&Rfgf{$*7sLm)pBNiZW>g71y3Ix!luSy{b3N< z(%jr>G@>#ukR}2Jm_$s?2E3zxCai7P1PniB<+lVqeaJQ2*kJ$f6H4r#T&E4Mk&#kS z7iv-3w#6CITi1ZAP##u;%0gHFu50>*=%q0_)Ip&)#=S$oq_;JHsT%EaGBYb01A0PX z0r|wQb+o$USar%w`?&LzxE7-lJrW6%n`=s{_e`6tze=K*^#qtXm|XmU$4Yc% zW#P-c@p4GhHJW^tl#=+i*2@F#gwBGN$AbdP`n=?{*myJdUcUx$^*v&j;&r>AnIDARa98@)0`*7E-x&h)Y3`jT<-U< z!xj~Li!Vd(O76}Ds4BF4rT7#RmC zg`L;z4tM8`*rML5=kZw#hZ-ZCE3TCM7WlufY{|DIOwezR#KkEl@!ShkxLS@kfUEm9 z(S5D+34HUMY`+IvGHj-6HytrsyCAVdbbH#t*-=AFE4S%nb8s=R!Hbimb6vB*vDTTE zECDR%#DDw$KcDxn)bi}ql=j!JXxwHa-!z|b#3MZ#%yBR)M#nYw=zRRpywv*3Twn*^ zcby$hen=i}fPuR&iTB?Q^7#q7cZ%;O4mpRfvEh0QW2JmVCu|%2_x1GAQ!pRE*z>r2 zp{V%rV}&gLM=My0TaXMczKHq!s~h2y_tnwp(Z+~mGt|1;*#@0DXY2Dk)yML+0)j*i zi4uttX;IkNpr#gZIdHK1?@J}dA_E_sW@M0f-os)Gv$m4DIya91>4K!zj{nm;m>6qQ zU)9G;P5yn@orTYdb?0ud@y|LcZLmCUv0MI=W5h;K|1K!{o}NeLyDRq^ZG!)v2YE)B ze?&|>`c2MF9#wjimHt65o&XGiwbJhcR<}(xHKp!)BNr#|EPXX-61&L!rdd#=S4JmF zi^|>&VR;>s4~lbrc$4{e;Nfl4Wr?H|<(jPdY>W_82C;QDqlEwe`#^^w3V1jaGXw9l zAR^oWR>d!TqDF6!m#GR|yt=#Gq7!bD>cBnVJQM1!o}S)S{RgaZw1CmGi}O+`6F_yN z)ZlHRU%!S%@)I_!K|m6+&Ngpb%m2PqF;(4z!WvShXNU5bLuui4B^dyI(Z&KP`$D2u zu;Uubq-kU@4011+z=tfwOie`ZV1852yW8NqsmHitB&n5=66&h1scGWS`QJag9`0l^g`9BCdKh_RC`=IFx+7|E2`p6+r-L{DQO`vB5C! z>sRQX+H|>2?clcTlp%;A;`uVg{C^*vEW%74%vcy8Np$sKbh&_SMl20X?~h@-pzOSzpn`P+xOV)?S&G5c82oRIK?ok^#16Kauh zp87Sx)|>YqBZ_pY*cy6Q=31cJUtp(PE4L96qG^|aM_J{*ZvKA{rX3;o(=4z_J$Hfv z#H?M!g2%Mn9m|~{c<|P>+RC8Hx+m`X>b!*gd@)iS$gNCj>aiXw4Y>1PWZ16^e+6W6 zfjw=mSpt5g&T%f*iVBG7j{TCtdh%*&J z64is#f9wjv6{vHYs;toTC-A&8lCmoFy}CKrdjnZ*AQ@VVjc3#Kb!5Dz#`M@XhDhM0 zdJ-q6Bjk(YE)InI|2?4SAw2Ll%M-E8;IY95&g&968s9V&s&uOILovuc?Zfv67x~8r z{HEIRyl?+3&0SyFa&w`ONausmYKhb`oc}1cHUk+rn$Sx=*13UF9L{gu?S7-bP1Nz< zlcf4hr8clT#AWArXL=GYhdt?sfZk{qy^xIHiM~T6@<&~bE}YUJOAg0*P}@bcA>G#( z4u}87O<$ka$vJNzV#64;3Bg0ce~>Nu>}EtVmpjMfxmbw*`&-|=`}Xz?Ku*#T{_wks zip5ZEMOFN0UNZU12Ij}CTQHBP&~54j<36bDn5zGw0|NN*tc?t_CGdBKbcu7PjVDid z;PHzYgT`q|-{rQO_|Gc`Gv`@;Zwhx_O zYqmU$d~lOfIY=(|#CK@dyB$5<=KasptNLk|Q&{*BA0IVOj0-3HCqWtI7_q%ows8Jc zwX}$}8Ht#+rp&A<$VnM~jZV9`%$B-wUl8wJJ6Vpli+a$_vuWj11)-q#&`ynP93FzZ zt2P`8Nk_gM2$hE>z&i%>_5gw5RDYlKV5aQjVBFca7D;rGowsi$F81_;ih|po5pakD zG)S>(kbv|k0A2hJfIJ%`#X6&U%8`vZFs4DnjrZ`AcKn^du*j+^-4R`r2A`dsjc5Id z(11RDu0c4f+<$w79!YOjl!CyANj>*DJcu^4^^7N%@F-sTG7w48!ln3koQz5Ka+C1V z++zvDIJ|J?h>;#9RMBd^QnHk6_oH>mTF-aSY9;cgTwHu&lU`l69rbraD%`oFS)fHb z?rXGnxa*o2Lv!K|J?`8b1Ls)98}vJ~vod;K(8Nt0{Ay|0L(bH|hz&_i9k{dbp^-@= zf8d+RGamy3G9?nY(0-orS&c7O>LNFIoJ?JuSKA-4s=&e%Tqj&RR5 z#{RAA{I?H34X|B8UeCa4ELSmwsqZ}lQilE6f^1Flb6hww-(HrP(ip#lzIJPClLm$P zw*D|!fM3i*QBPO6=)dq;VH_S@6o)Fn67c)Qj*gEHs$h$JHwy36xh7ts3z>*%?G$u! z>?fC(<_Oky@9dLA-1fVPm@hp&#k}4Yeh$cz$y~yUP4`6zNaSwQ#8h)&{eHm4wqVBY z%?;1}?-WsH0pT`ys4p4%wvaMF@lEA+;59fuy)g>QL-dmx@MRm8T2D$VE7xe#qNB@y zMXfgnAE&u!@0%+ZJ-zA7hkA{!*PiN%iVI;Kkq=1j-Df(%XK+iG%7I1+!pY-2yuEp* zYTrp47#K(r@|LS+$$@{CeLp_B{9YD(vIZ@!29G0rZANIifQhw-r;2NHm-^SwT;(rv z{Yqy?qXzT3=|S)?KXs^+$WIpW77^l7V+%UI?)w7wA+!xlq11%zdZmFoj&OdW9`hCI zQOrQ-u}rzc!LPO(|0FL%@2;F zx<tdO;U?qzQf{MjF&daBmW8nNdBI!GVG0-r-R6Y=(MAIAo$jD}#SivxrY;^@a zy=Mp;&k*d?L%>vF3D{We?T30KN^3IckIIr&y|WT`blot;-QJ?w3m|Rap)QZfuHg}$E~NcP*!3=jM6;%q^bNll}4}gHumnp=VyZ^W~SSG z+<^VwV+4EciE(lfh7-(X25*T{u{)STrk0lFR^!8r>I}_GYM(yqkyBJzPp@w-#YD%^ zofO)~7^0kC;BL;Qoy%!z{{0aZmFY3<<#IBZB{w(<1!k+I!NZ=$UoU0mK8`j?aCDE(!>B;bh43bi46j0_HD6f^5ovWSS_UeY>{vg*iD8%yOsk5$Si z7xk>JOVuySRb2g@_*pko`J{Gd<#=@oC#f%;O_YX8$hN_$R z%72!J3tt`p3-OlSpnF|!m%>!o<&&bHqmV2>q9=7OO%{LTs5JPB4A_e$A7jKqswV&F zA8M%_fYU(6ynN-@g~lYxO4~L&deYtY0j9MSTXPJlX0!>@A)pYqXBtH%csjplXY+vj zV&+|vi>!G?x!|k-wWxv{ZQJ`(NxEH*Wz0$|L(#P7ko^Rm^JZ2Y4W z-QOa@FfDiU&B@wBmZ*F`Ka%8vvnlE|!E-KLyR$o>Vymot$t|7NiRm>Dqpv+t)zmsf@Ff(QVy@9pgiD9^p}GMhqtd620dff zIqVMHpu&?K0~)&EkicY@cYc4Jwuco4EV|>_4b)%O6fyi&QBzY@t?@o$3U>g^ZwU#S zv}A&NiO3jq#**bl6UpqM9^Xb$!a4pU*KqMWF0qLI1Ltz7M9#cF({23xE~*_=!d)g{ZVd6(NhXfrZKnDw(Ih*Q!A8_bv*cZwE}lgozT zGiyNG>?kXFg8CIWx;T&HPCFW|f!SHlQMQ))zFeFKQ`=K#6Y_TgyCEs5asCk(;+Qfh z6Y?S`-kPp}DJ-)Vm%J+Sr#FAH6)c{UKbQP7G*l++&cj4a&Bd~r@cnyamCJDmuG=Kq zeh_A0Z477iGi;>GODGuuwv>g%KC2_&jXZ2Utu~W13!aorJ`{cR)EWIFC4Yq8i(5?U z83`NVU>)3E#O%5Z=13%Zde8bVHA`NvFLh%4l*qnyZb1>RA=-Ap$2M71KGrH1x@{<8LvE1FBWruQNN67dzS7q;L4^;SU!fleD zpyvWcK%&}&7yFEnel@T`)I$l25R04{C74Hk5Q_?r=~+C>yCx59eUsDqX<@B@iYZ)e z8!gB+qbwnXQAgW)PgJ5Ra≪fIg93B`uwVCs~-}=sF{vA{ox&uMnKa+Lac6pSmA( zy5ER(&iaJBS7>VVY7vl>0NqgZN3hyaAnVjYnrZO%+Pgf1%lnROJ%c}HEC6(n*q%Pd z6hXu!*Av&p?C%B~#>sY}$+!G`!s+V<@S54<_TPzH)0DGEbf53?xsna50;M@~czEXy zf04dPU8*>f7CBh^ZIup=3@q$={Qai6S9e(a%;OCIp=o1A23#{!ch@98-sjc2PZo5O zFYl&CBu_9kF&Q3y8^2Qhu_~TKdyt%#lvX`IS;N*qY0*5>$7?g=SYa4Gdwe~N3 zyo9p;^k1RnEHmqKzyI(WN0|U4*5p}yw`zX+o3)`j{=|6s`~1$E;QF+zUq%k6X=^{{ z*~ZBCg6w>TBDLLTFlFLyPNLHua53Jg&1~*;I`sk%ktJe9Ma8$rL-g$(lwyugz(`1@ zEclZeG*dnRcfcTkdK1U2L)?9Nq3{bP^Q?P*p)9Ye@$B>0x}z|O@(VSYwFq^lOQcYx zAf`^cq~VpmZ_dB<^-?;_AulcC`S-7nVlB@YXV4FyK|^eLsh5kxe55cj zJ^B~tcL;p1972L3yEU1Idw~fsKU@z!zZ|=LjHFBe9`tf?5sX^`U|Qnzi76Tmxw*?> z{uFck;sqkNgOfe}CJ`Nl4}sGWkT4UJ!Ydn#pOcb7Sd2MKjf*C6rn@Njk)~L}mj~(Z z+Gv&SFEkt`?Qb-OkG3W%uPhf@;ShS=tZxV1$reWj$405-2zZqwt5KB6WIY zIpH9gi~t)N$&KTG(+^^rclO@YkjVN4J?4{lc>A zT_2rTIoJ`RK21_V)bpKHRad`&6EaR55f|PF5_c`({^t2~If?owq^_SNHq0)s_}x|h z^();I`AozFm}$(Ysk=WY7*re3GZ8WwPtKQ5y_*Jp>fVPnZt|+XCR60%M?Q9XnSzPpExhFnF8!iiOo|m~FA9Q&@J%ACCG4-VTo}r;$ zonuBE^6Xvxi>m?@tN^f20S}n*5yYd5wsFCP?Gqi_uRj4`JtbHB*_Xs8>UJq`H3Yn! zgt)k{&LnDZZ~)rf&A$bsU?Ba3pl)tKDi9MtrWXeA)--HBN_@g{$?bQ)e_Ppm?Qf!P~agSt504ss&1oiMh3`)^^1=GT#M4jHXtzJ!Ps zFJF^$6nZbGhxm%WBqS|@)s`DV>+*@KFnB{N3Ds5N?@3`aoLuz zEmI{Ul<8QVj|Yl~VybEOWbpAW(d)d}FCXLri|%J%x=H<<49EWWl97lBxUup2cZ>Xv zApjFY$3#aH8yU-#^Pk!R zyP7Lz3wlnm>x{g-ixlC=hK97@kYD!HKYvn7Nx#X=YMCi*v_ESc4M0~(Eo{qt8(O^5 z<{_EepCXFIeQUTecBeKKntLfHpqYLd-Nd@oD9G6;DLt{<9Usbz9G}qt+)+=i+t+%B z;K`k;;Su6~WVTRjth#qw_uc>M@Y_V?TNbLQ7HCHnqGw51evEwY=Yt#&qMWrD+jMpO z1+KZdmH>z~Szh17rlZRUl*+bCK>>`qvx!6FiZU|%!UwUUe8y^E z5ulT^8~y%@{7kNYscgekz4!ES=RJ^+464B#W(HdrWm%7DXqooR!u3N%9nBSi(@FikPGK6)dz)17$6A;d6bAlZM$dms#H^I=5HrPJ8;np+bU@I0RY z*PK|7A+{iEv;YRrV-h^w-Q948Wp+;c6qTqnM!xImWQQbq-2>G4AE-FG!fR`VUVNP@ zNRXzh1}+9H86=j+O*3fmcGz*8(xp(} zZms`ylqKE{T9+`pEnf&mh<`)vYmVgMi2sa&ooLpL2X}2cp+L*Ij%# zFQ`tLJ#a|B13uSF#tl*FxBRKOZF%nga!&wGK;c{i9>;YP6XDEVKIMQ#b zQI!zd#v1j6Ile_dmJc)doJa8UmzS6407K&z>!)adhEx6zQE$OkRoixL)7{-IUDDm% zC7seC-67rG-F-<)cZY(s2+|MknD5k1S{f&J=+yG?>Uz#V+Ci zcbrbo{7d@wx7CGH4JX>=C2KR1!G8IF_T^k{wx$H`y6_FnUK$q z6Fo8f7EsM;vG}a}`}{K~22Drfz5?}eG*&Jq0wEZ5KYBiSRAQdDS}^hXqs|W`TzATX+q2M+ z)t-Qr<+rsXnT?bAY`2i<*MKgtT6i6N{QDR5^=K7Pq4nu~Y_YU6+W2&pU?c8n2V1xS zhI)oYm0yrmG#xy=Zmw-}+VTZG{dK}V&W60xa+g!X@F${KrepCy43Db z9GDY(0YQx7c3bAQn7dI>x@TP6;rz-ue3)M$RaqTEki!YFL7X}s-pwCG3{0XN0&-QI ze^L?QElwK+pIs+1SPm9%(498w44UBn>QJatAX<$7yOKk1m;)+m(41WgP*BoFsN@gm z!yO&XuYfiu89g0&lV7)t=}HV1c%b3Zvl z&?cF#!=h1a`3Kf~eB&i}E*cqmxF;+N63_@uG7+*_-w*XV24 zsqc*b{Ib!2iN+sEF}x?~oU)j2?Ent9HE>{(U-Xw`nmN}d4Pz16f|9!UJBdnRLVN-q zn;njpj2&YP0$L0Y9v6um?1B;I54zXK3+lMTd~fr~AMpVFL7U-IvqQh3Z6u zBowt^n~ioeXrZpm$T6_vB!2I5o&>~SiB`(Fze$AdN*dxxIyw%jtM{e~!Y7k9fq&A^ z{QNu-Y7(k~_+BI_R1|b0*I%qgRchj29M=9zZ*BE7L$5LV0<52S&%+in*;qW!9N!QF zosiRG9!_(7k|v4pVQs5Egfz6g9ZQY5t2=KY!-&vusA4FrjGO!4?pk0K$)#0SfZ80+0vMNVGM3%k=wl?!`L|&^22T6DZ|y*+xbq zn(5PPV2m|R`V;wHgIP{xWf=m>fypd~Xv3dyWIUk!v1_LfCaDLhMN-*9s5#jQ$(aDY zQ$1UEPe(pZB^6;~4^DWSF!o|DLe)VV340#vb|a(M4z{}hC>suyO4D;D5A0|wm#0=p zlhcMjvxN;@S8KlOOQUgCK3DYoMfC!mzI}4g0Wb$LVPCFab9Ph;%F>nza2}wc!})e4 zN|i0{{#{&zs-x^H7+uwVOQqZB@L-a)V7a>u`NG5klTvgw^5x9$oQop` zW={$ZK=cfj@GKaNh%PP^t3X^0)XP?pMn%1Lj7+L|>;uoIYlBuF%@BbOm3Xn18omi9 z3sm)7c7Npj+iQArAXJzcsXhWX6l`hEU^yFRQ0R7h?jkk%$SndkK{MBBu}05q7XMuk zb6C?-6a4OK#RsN4UfrCC2$`$DKW5iw^#?lM-9yu5kqOwh;vy{b<97&)P@YAWHY0~c_lQuyv+>pE z3Q&E!x@G$fzy1`?pnQPKp|_bP5f$w3OduCrERl{KOwgzXn@B=reDd~>;Yd+a;AH|F z(HLJ~s?xv)x70jUOv+RXkOF{FNb%!vUjhV&8QlkGY9dnIH@c;knHktTzPm>ZfnnS^ z-j9kKm^uOw;QcljJva8CF=+{S9lEcNgg;ZMt$+oev#e?1^W#53D|@CdjMxacJ3n$w zIJh1}XD{-B&Pp~zz;i$73<(j9^;q4Ofq^cOJk#))qCQ1uwYZWzRkRI)lR|uQwnY-I zfyrE+W3AVyVHFLJ0F&suqj)i5&kLfTpW)8!oeQyg5I5|s66_L6&+|<@@$c}Ot|G)1 z2R<*>9#|YTRaI5PJnFV{Z)cZGHsdfnDp5uT#u75U{CleRm?AhVWU;7h0c2_ zXlb#~bYO`k;b_|Ro)EDTddgMnjZaP7xXuTjAJfy)hE3x2DdvgTDF?QBVP~rqie@=h z5iql-M+VM8G8f&hQH>hq3H~x(I~zUuLPcq4=pR7usjJWUIjg1EH-G{i%#khs{e0bR z+XfGHE!Cn}lIaz@1lNlA{renn&K=lh&4t3?NgUyY37TuJ=Zw}1RpC!_t+XfxZuZNd z5{J~^9}Nn z|4724P4cj_gC#Q9S2~m}0^9{yAj^AV?4uKf{grvW2Fq8d4@h%hk^q?7?Sn1M=WB*; zs)9lT3no!TVub{?U>8v0(Xy`2j?Ws5O`Kl0ZT9yAC~RIN3q`iLRwOa;b&3x8ZAiRR zBDkPLv|7`@xCdH;%1T?*P%>dri?MAQqJ&a5nM(P&t_WcBz%2+{JR`kF&s?r zx2P;M^!C**SRdYuRMe-h05J%fQy6kVDHG9>qOBV+qI}!!RJ6xsuuvzPAxjmgeM?LZ z4|!*80;+)uu`T$v=*byOO^clWkqIHmO^Tk&Y4{PKPKN9MfDwP$xz;h{I0k=#l_%2Szsvz9y&SB_F>cd8-d4~z zP=;rRf23~g&`H?EE?qHU)f=3yE!mLFl4j!Rxo&)IhzG)q&4QGCZ>|~q*cMEio}#4| z&=`pV-dRY370ECsoc1jZyPCEmyzl{7+~E$V(TIZ$etCE}Fk}}(SESM_)-aVY7-GR< z&Y-xzck9mgpa2xd(M<1iD~mw}i{4G2ZIkEsOvp&6Y>W;L2;Zj1;EhD{XG5Ht zS9@{;5cDw+-fQ70ed!lZ0svT7sqDKnEag&}xS$aQbAAApu{&JM!qcFl#sd%zO2=$~ zzrioUqto3*#0$-rfanrz;2MHiMn_2n-AxNyZHM4y_`R*1%^U4`_^)p!Q--Sqp8UD zwIm$k-!K^g(8qe7GzP>Vv&IUvVoV>$UhNiZmg}8NbYE{HYcUYgPYl|=^LmSRa&al< zkY6u5Cy2V*U?w<0qa=oPB3<5Y*jxS-4CKqMcpJ7oLkf&c;Iqzj(IBVueENON&W(zQ z^sxP3CFnhi3QOa}<<&7s*`+uxp{Zg6K~t+J+Ya7wot{5(wuU0!UU!DeUmZ4Q2eEV+ zl)S+5`si0pu-#y4X`u+LvV6cj2P^GgaGD=?u&ObG!xDg3!-YU$p2Yjpe-QPM$Ku?y zb*4(qb_GbIXO~2Sc%Zc7PYsiJ{dKgYhHvYuWX?WcJo!8cG*D@$CCtGdqbw5Sxx)eFwUuGNg>O#C9UcP%VG{ccb0RJLgGsyDXR zuH{&7J^%!GF1P(6$czPsqurRSM5K@kJNW91Gg@jRRW9D%fSVp?Yajuum+E=R_aQS4 z!^p1qtEAhIFNIR{5yz^E^1%g!AQWlxgE);=9!Nv*kP&ZWgbkFYl(ZW}NL*T4T3Jqh zR!?dl_X)n}eZ^+^?e6Mq+Ju_pG5hmFjuqNX;>Tj%l5@(t12bCs4EWpAU_C}ACVX9~ zqF?mndL8*f-{?|EJVX-{#NLQzO38?Rp2MoD{-^yjtS}^kKVY@Z*4_ySWchU!=+bAu z2X}B-JY>^Lf{y!21!zLABrp$;Ns>+)?%P}eeK&|BY%wwx%nCo`xRRVRaNq2W;CRg@ZnE%OE_#kw>0!H zU6Bz$wPv@-o+5K{h+NdpiIdE(n`eY-Ic$=`o=QE$CQBzD{~hgZ{|WmYsqHYzeEp7+ zO1%%moL)fuWdCq~X1;EADVNKZYRLp*D0Fpj?D8M2bQmZ#z#<U;baA;;+Cpd~l+ zs8r3%60lSNek4nl(Cm*Yq=Fi?RN_@ZpNlsJOKGP2o|*JRR=-%Q{w6M-Hv*yG`h;sd z4+lGAJ7WnRdO$m6WO9~&^-%eja+E^oM~Lh_{shfuAi z{GawQNe9APrt>)?N&I3;2)LXna$muEG`X5U4QZuRcJ{GkUw?NV`NE>v|NfTzdjuA6 zU$!p1KR(c`N_*RmMS3$v`BU&A32u{NllA~>#v6z#Fir3Q=&~p|xlI$O7rGUcd-nb= z#$@k9{DjkFU>4;XXV&$`_V8GY9x#wtYgBj1U^B{Tt07Uk{@nr`SDK7o#Ad6%wmGeL ze?B3)?mtXt8c+nx!&0LpyaMUD|2`fM^o;GP*J)5J#AffzC_o0Pj=<|w*4P+KSqV$7 zd{VHmy8_6{AhnT%J#QCTlAQKo(r9X6Niekvrs(<)mO(DT$jwz)*gyMUb96;x7ry63 z{f)$GbDKdyU0$a^@6Z9_s~<;E2~s}x#trWk&Gh3J!oZ3PiE&D<6j{zfd%6sOCbfue zq!5J@`qM{I7^*xJ+gb1GKQm^KjVf`m25p`!p9C>HkWo;Rd-}4lXCAK)LWM9M&_aLN zEut(}1ctYSl281H+<%+0<8t_=IyfEa1&Lb)29aZu)t^zRDu{VdAL{vOU9OQF4?ObY9E0?-0M_mcf$=?ws{4BlZ9v&uoVk&!Yzqf~{&`uV1ep zUVq;1EI7Su`v=y zDys6q`yq5}nP)4rax5Z+jhNjNfZ$l@SV4z|H-8#J>i`l2*1Spk(>G%l5Ng$c6&1z8eLd;V0XL@%TS2Y z#B>MB1{Vky2H{2kX0oECiLE1XudAouE2jk0fmMasY%jD59O5rf70>z4>za*r6la?n zu>X2%0ensdg*<`CUtR5weZrZPJO(3se$$x(NASzbSEP;TJrV)uAkt4E z!zLXcVFie@g-j^4W`6H7X^9<(5mhm2YH7Vqb8J5%xcW2oJDDE7^!Bn&O}Sb9_^2Z` zK;Yi#4oMhNtAN26;kFlnH{1v#HX)54Vm$}<0g!M}!J&`0p({RqzJpJ#4(lixN_0r3 zVPN?pJ^cgA&|Rx2Xy0-6U1?;65rQuo#_8Z+hph_A zp9ga@b9D>O7~qnXVhKU9y{|_Z`M~*@IB*60kPX-Z9gM}fIFL|p^4AC);h`(0VM06n zFQ^pcnO+^VX~6j^CnE5K2+0GM-mZeZj$q*Jo(OY^UX0L+>N^H^3}s$5ST*oHo$-Y0 zy*#UpM!3<#J30Cc(uxZD{!a#NbCBkMa+C-Sy;}5e*g!LRc;(@ABC~*_N0?;erGqzQ z{NGO2p)H%RYY}RZ19Z0Hq{T|-$mgn*mdI1?2Oz#I5{N;dsjdJM8-1GOMI&u@IDhVZ zO+Asp`l+AKENu(8k~4%${{tic%omSu+aoEwy*maJf6jY~#2N27u$FZjOd-D;_TMQh zE19leZviC}MJX&=@W6k|BQZclq9FydaIx9}>_Tr(=HXKu)^fOgw*Fl@MdpRxTCH#l zAA;Fsx9;RU^*mCEO6s|~GaEq!n3FDT+0gbbP->I~Vq@vI9d2In{h&7cp@e>HW2u=R4ef3~yI#Vw;}8I(kbQu$mI|ItJn)XhLrN*0==1&`)7_z3D=%w4*lnt`BxX zgaJ>2jiGho_IaeFwY4=W`Fxb#zq|R}>|$0E^m}}Pq|Q_oF$_y=!>ZAb*HBH_3N>OV zo3kD{dW!j-nj=Q=bugIKjK%7vLt(+82IIO+ha^Tpq1&_W_E2~uJy!C2A>y%lSg6%Al~0T=?~`V5kzaaTre z`tHdtY-pusk=i�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 bV)6$J{LTY@w*E+#Nn8IA2B!L8iTmLH$+OqQ literal 0 HcmV?d00001 diff --git a/src/packages/excalidraw/example/public/pika.jpeg b/dev-docs/static/img/pika.jpeg similarity index 100% rename from src/packages/excalidraw/example/public/pika.jpeg rename to dev-docs/static/img/pika.jpeg diff --git a/dev-docs/static/img/welcome-screen-overview.png b/dev-docs/static/img/welcome-screen-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..1067761629614e099f46546305af0efd50cf2aa8 GIT binary patch literal 103250 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

    `p@-A-vx6tk}!vr7OY4g!ZE`8|J?~p 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

    wE0IE3W8 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 literal 0 HcmV?d00001 diff --git a/dev-docs/yarn.lock b/dev-docs/yarn.lock index 1cf4b7358..5aaa9689f 100644 --- a/dev-docs/yarn.lock +++ b/dev-docs/yarn.lock @@ -1191,10 +1191,10 @@ "@docsearch/css" "3.1.1" algoliasearch "^4.0.0" -"@docusaurus/core@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-2.0.0-rc.1.tgz#828d93d241171565d8947a9ab404091e04759141" - integrity sha512-b9FX0Z+EddfQ6wAiNh+Wx4fysKfcvEcWJrZ5USROn3C+EVU5P4luaa8mwWK//O+hTwD9ur7/A44IZ/tWCTAoLQ== +"@docusaurus/core@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-2.2.0.tgz#64c9ee31502c23b93c869f8188f73afaf5fd4867" + integrity sha512-Vd6XOluKQqzG12fEs9prJgDtyn6DPok9vmUWDR2E6/nV5Fl9SVkhEQOBxwObjk3kQh7OY7vguFaLh0jqdApWsA== dependencies: "@babel/core" "^7.18.6" "@babel/generator" "^7.18.7" @@ -1206,13 +1206,13 @@ "@babel/runtime" "^7.18.6" "@babel/runtime-corejs3" "^7.18.6" "@babel/traverse" "^7.18.8" - "@docusaurus/cssnano-preset" "2.0.0-rc.1" - "@docusaurus/logger" "2.0.0-rc.1" - "@docusaurus/mdx-loader" "2.0.0-rc.1" + "@docusaurus/cssnano-preset" "2.2.0" + "@docusaurus/logger" "2.2.0" + "@docusaurus/mdx-loader" "2.2.0" "@docusaurus/react-loadable" "5.5.2" - "@docusaurus/utils" "2.0.0-rc.1" - "@docusaurus/utils-common" "2.0.0-rc.1" - "@docusaurus/utils-validation" "2.0.0-rc.1" + "@docusaurus/utils" "2.2.0" + "@docusaurus/utils-common" "2.2.0" + "@docusaurus/utils-validation" "2.2.0" "@slorber/static-site-generator-webpack-plugin" "^4.0.7" "@svgr/webpack" "^6.2.1" autoprefixer "^10.4.7" @@ -1268,33 +1268,33 @@ webpack-merge "^5.8.0" webpackbar "^5.0.2" -"@docusaurus/cssnano-preset@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-rc.1.tgz#76bbd7f6912779a0667f8f2fd8fc1a05618a6148" - integrity sha512-9/KmQvF+eTlMqUqG6UcXbRgxbGed/8bQInXuKEs+95/jI6jO/3xSzuRwuHHHP0naUvSVWjnNI9jngPrQerXE5w== +"@docusaurus/cssnano-preset@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-2.2.0.tgz#fc05044659051ae74ab4482afcf4a9936e81d523" + integrity sha512-mAAwCo4n66TMWBH1kXnHVZsakW9VAXJzTO4yZukuL3ro4F+JtkMwKfh42EG75K/J/YIFQG5I/Bzy0UH/hFxaTg== dependencies: cssnano-preset-advanced "^5.3.8" postcss "^8.4.14" postcss-sort-media-queries "^4.2.1" tslib "^2.4.0" -"@docusaurus/logger@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-2.0.0-rc.1.tgz#db95e9b15bc243695830a5b791c0eff705ef1b54" - integrity sha512-daa3g+SXuO9K60PVMiSUmDEK9Vro+Ed7i7uF8CH6QQJLcNZy/zJc0Xz62eH7ip1x77fmeb6Rg4Us1TqTFc9AbQ== +"@docusaurus/logger@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-2.2.0.tgz#ea2f7feda7b8675485933b87f06d9c976d17423f" + integrity sha512-DF3j1cA5y2nNsu/vk8AG7xwpZu6f5MKkPPMaaIbgXLnWGfm6+wkOeW7kNrxnM95YOhKUkJUophX69nGUnLsm0A== dependencies: chalk "^4.1.2" tslib "^2.4.0" -"@docusaurus/mdx-loader@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-rc.1.tgz#e78d7d416aacc289f2427c5ccdb9145820acb0cb" - integrity sha512-8Fg0c/ceu39knmr7w0dutm7gq3YxKYCqWVS2cB/cPATzChCCNH/AGLfBT6sz/Z4tjVXE+NyREq2pfOFvkhjVXg== +"@docusaurus/mdx-loader@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-2.2.0.tgz#fd558f429e5d9403d284bd4214e54d9768b041a0" + integrity sha512-X2bzo3T0jW0VhUU+XdQofcEeozXOTmKQMvc8tUnWRdTnCvj4XEcBVdC3g+/jftceluiwSTNRAX4VBOJdNt18jA== dependencies: "@babel/parser" "^7.18.8" "@babel/traverse" "^7.18.8" - "@docusaurus/logger" "2.0.0-rc.1" - "@docusaurus/utils" "2.0.0-rc.1" + "@docusaurus/logger" "2.2.0" + "@docusaurus/utils" "2.2.0" "@mdx-js/mdx" "^1.6.22" escape-html "^1.0.3" file-loader "^6.2.0" @@ -1323,18 +1323,32 @@ react-helmet-async "*" react-loadable "npm:@docusaurus/react-loadable@5.5.2" -"@docusaurus/plugin-content-blog@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-rc.1.tgz#8ae5d5ec2da08c583a057bf2754a5b9278b3eb08" - integrity sha512-BVVrAGZujpjS/0rarY2o24rlylRRh2NZuM65kg0JNkkViF79SeEHsepog7IuHyoqGWPm1N/I7LpEp7k+gowZzQ== +"@docusaurus/module-type-aliases@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-2.2.0.tgz#1e23e54a1bbb6fde1961e4fa395b1b69f4803ba5" + integrity sha512-wDGW4IHKoOr9YuJgy7uYuKWrDrSpsUSDHLZnWQYM9fN7D5EpSmYHjFruUpKWVyxLpD/Wh0rW8hYZwdjJIQUQCQ== dependencies: - "@docusaurus/core" "2.0.0-rc.1" - "@docusaurus/logger" "2.0.0-rc.1" - "@docusaurus/mdx-loader" "2.0.0-rc.1" - "@docusaurus/types" "2.0.0-rc.1" - "@docusaurus/utils" "2.0.0-rc.1" - "@docusaurus/utils-common" "2.0.0-rc.1" - "@docusaurus/utils-validation" "2.0.0-rc.1" + "@docusaurus/react-loadable" "5.5.2" + "@docusaurus/types" "2.2.0" + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router-config" "*" + "@types/react-router-dom" "*" + react-helmet-async "*" + react-loadable "npm:@docusaurus/react-loadable@5.5.2" + +"@docusaurus/plugin-content-blog@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.2.0.tgz#dc55982e76771f4e678ac10e26d10e1da2011dc1" + integrity sha512-0mWBinEh0a5J2+8ZJXJXbrCk1tSTNf7Nm4tYAl5h2/xx+PvH/Bnu0V+7mMljYm/1QlDYALNIIaT/JcoZQFUN3w== + dependencies: + "@docusaurus/core" "2.2.0" + "@docusaurus/logger" "2.2.0" + "@docusaurus/mdx-loader" "2.2.0" + "@docusaurus/types" "2.2.0" + "@docusaurus/utils" "2.2.0" + "@docusaurus/utils-common" "2.2.0" + "@docusaurus/utils-validation" "2.2.0" cheerio "^1.0.0-rc.12" feed "^4.2.2" fs-extra "^10.1.0" @@ -1345,18 +1359,18 @@ utility-types "^3.10.0" webpack "^5.73.0" -"@docusaurus/plugin-content-docs@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-rc.1.tgz#2dda88166bf21b0eeb3821ef748059b20c8c49f7" - integrity sha512-Yk5Hu6uaw3tRplzJnbDygwRhmZ3PCzEXD4SJpBA6cPC73ylfqOEh6qhiU+BWhMTtDXNhY+athk5Kycfk3DW1aQ== +"@docusaurus/plugin-content-docs@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.2.0.tgz#0fcb85226fcdb80dc1e2d4a36ef442a650dcc84d" + integrity sha512-BOazBR0XjzsHE+2K1wpNxz5QZmrJgmm3+0Re0EVPYFGW8qndCWGNtXW/0lGKhecVPML8yyFeAmnUCIs7xM2wPw== dependencies: - "@docusaurus/core" "2.0.0-rc.1" - "@docusaurus/logger" "2.0.0-rc.1" - "@docusaurus/mdx-loader" "2.0.0-rc.1" - "@docusaurus/module-type-aliases" "2.0.0-rc.1" - "@docusaurus/types" "2.0.0-rc.1" - "@docusaurus/utils" "2.0.0-rc.1" - "@docusaurus/utils-validation" "2.0.0-rc.1" + "@docusaurus/core" "2.2.0" + "@docusaurus/logger" "2.2.0" + "@docusaurus/mdx-loader" "2.2.0" + "@docusaurus/module-type-aliases" "2.2.0" + "@docusaurus/types" "2.2.0" + "@docusaurus/utils" "2.2.0" + "@docusaurus/utils-validation" "2.2.0" "@types/react-router-config" "^5.0.6" combine-promises "^1.1.0" fs-extra "^10.1.0" @@ -1367,84 +1381,84 @@ utility-types "^3.10.0" webpack "^5.73.0" -"@docusaurus/plugin-content-pages@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-rc.1.tgz#2be82f53d6c77e6aa66787726c30dc60b210e6f8" - integrity sha512-FdO79WC5hfWDQu3/CTFLRQzTNc0e5n+HNzavm2MNkSzGV08BFJ6RAkbPbtra5CWef+6iXZav6D/tzv2jDPvLzA== +"@docusaurus/plugin-content-pages@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.2.0.tgz#e3f40408787bbe229545dd50595f87e1393bc3ae" + integrity sha512-+OTK3FQHk5WMvdelz8v19PbEbx+CNT6VSpx7nVOvMNs5yJCKvmqBJBQ2ZSxROxhVDYn+CZOlmyrC56NSXzHf6g== dependencies: - "@docusaurus/core" "2.0.0-rc.1" - "@docusaurus/mdx-loader" "2.0.0-rc.1" - "@docusaurus/types" "2.0.0-rc.1" - "@docusaurus/utils" "2.0.0-rc.1" - "@docusaurus/utils-validation" "2.0.0-rc.1" + "@docusaurus/core" "2.2.0" + "@docusaurus/mdx-loader" "2.2.0" + "@docusaurus/types" "2.2.0" + "@docusaurus/utils" "2.2.0" + "@docusaurus/utils-validation" "2.2.0" fs-extra "^10.1.0" tslib "^2.4.0" webpack "^5.73.0" -"@docusaurus/plugin-debug@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-rc.1.tgz#73c06ad08d66810941e456d50b07be008f5235cb" - integrity sha512-aOsyYrPMbnsyqHwsVZ+0frrMRtnYqm4eaJpG4sC/6LYAJ07IDRQ9j3GOku2dKr5GsFK1Vx7VlE6ZLwe0MaGstg== +"@docusaurus/plugin-debug@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-2.2.0.tgz#b38741d2c492f405fee01ee0ef2e0029cedb689a" + integrity sha512-p9vOep8+7OVl6r/NREEYxf4HMAjV8JMYJ7Bos5fCFO0Wyi9AZEo0sCTliRd7R8+dlJXZEgcngSdxAUo/Q+CJow== dependencies: - "@docusaurus/core" "2.0.0-rc.1" - "@docusaurus/types" "2.0.0-rc.1" - "@docusaurus/utils" "2.0.0-rc.1" + "@docusaurus/core" "2.2.0" + "@docusaurus/types" "2.2.0" + "@docusaurus/utils" "2.2.0" fs-extra "^10.1.0" react-json-view "^1.21.3" tslib "^2.4.0" -"@docusaurus/plugin-google-analytics@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-rc.1.tgz#0136cc7534573ca56e023178ec2bda5c1e89ce71" - integrity sha512-f+G8z5OJWfg5QqWDLIdcN2SDoK5J5Gg8HMrqCI6Pfl+rxPb5I1niA+/UkAM+kMCpnekvhSt5AWz2fgkRenkPLA== +"@docusaurus/plugin-google-analytics@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.2.0.tgz#63c7137eff5a1208d2059fea04b5207c037d7954" + integrity sha512-+eZVVxVeEnV5nVQJdey9ZsfyEVMls6VyWTIj8SmX0k5EbqGvnIfET+J2pYEuKQnDIHxy+syRMoRM6AHXdHYGIg== dependencies: - "@docusaurus/core" "2.0.0-rc.1" - "@docusaurus/types" "2.0.0-rc.1" - "@docusaurus/utils-validation" "2.0.0-rc.1" + "@docusaurus/core" "2.2.0" + "@docusaurus/types" "2.2.0" + "@docusaurus/utils-validation" "2.2.0" tslib "^2.4.0" -"@docusaurus/plugin-google-gtag@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-rc.1.tgz#61698fdc41a4ace912fb8f6c834efd288edad3c0" - integrity sha512-yE1Et9hhhX9qMRnMJzpNq0854qIYiSEc2dZaXNk537HN7Q0rKkr/YONUHz2iqNYwPX2hGOY4LdpTxlMP88uVhA== +"@docusaurus/plugin-google-gtag@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.2.0.tgz#7b086d169ac5fe9a88aca10ab0fd2bf00c6c6b12" + integrity sha512-6SOgczP/dYdkqUMGTRqgxAS1eTp6MnJDAQMy8VCF1QKbWZmlkx4agHDexihqmYyCujTYHqDAhm1hV26EET54NQ== dependencies: - "@docusaurus/core" "2.0.0-rc.1" - "@docusaurus/types" "2.0.0-rc.1" - "@docusaurus/utils-validation" "2.0.0-rc.1" + "@docusaurus/core" "2.2.0" + "@docusaurus/types" "2.2.0" + "@docusaurus/utils-validation" "2.2.0" tslib "^2.4.0" -"@docusaurus/plugin-sitemap@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-rc.1.tgz#0b638e774b253d90e9f2d11663e961250f557bc4" - integrity sha512-5JmbNpssUF03odFM4ArvIsrO9bv7HnAJ0VtefXhh0WBpaFs8NgI3rTkCTFimvtRQjDR9U2bh23fXz2vjQQz6oA== +"@docusaurus/plugin-sitemap@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.2.0.tgz#876da60937886032d63143253d420db6a4b34773" + integrity sha512-0jAmyRDN/aI265CbWZNZuQpFqiZuo+5otk2MylU9iVrz/4J7gSc+ZJ9cy4EHrEsW7PV8s1w18hIEsmcA1YgkKg== dependencies: - "@docusaurus/core" "2.0.0-rc.1" - "@docusaurus/logger" "2.0.0-rc.1" - "@docusaurus/types" "2.0.0-rc.1" - "@docusaurus/utils" "2.0.0-rc.1" - "@docusaurus/utils-common" "2.0.0-rc.1" - "@docusaurus/utils-validation" "2.0.0-rc.1" + "@docusaurus/core" "2.2.0" + "@docusaurus/logger" "2.2.0" + "@docusaurus/types" "2.2.0" + "@docusaurus/utils" "2.2.0" + "@docusaurus/utils-common" "2.2.0" + "@docusaurus/utils-validation" "2.2.0" fs-extra "^10.1.0" sitemap "^7.1.1" tslib "^2.4.0" -"@docusaurus/preset-classic@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-2.0.0-rc.1.tgz#5e5b1cf80b3dd4e2c3f824c78a111f105858d853" - integrity sha512-5jjTVZkhArjyoNHwCI9x4PSG0zPmBJILjZLVrxPcHpm/K0ltkYcp6J3GxYpf5EbMuOh5+yCWM63cSshGcNOo3Q== +"@docusaurus/preset-classic@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-2.2.0.tgz#bece5a043eeb74430f7c6c7510000b9c43669eb7" + integrity sha512-yKIWPGNx7BT8v2wjFIWvYrS+nvN04W+UameSFf8lEiJk6pss0kL6SG2MRvyULiI3BDxH+tj6qe02ncpSPGwumg== dependencies: - "@docusaurus/core" "2.0.0-rc.1" - "@docusaurus/plugin-content-blog" "2.0.0-rc.1" - "@docusaurus/plugin-content-docs" "2.0.0-rc.1" - "@docusaurus/plugin-content-pages" "2.0.0-rc.1" - "@docusaurus/plugin-debug" "2.0.0-rc.1" - "@docusaurus/plugin-google-analytics" "2.0.0-rc.1" - "@docusaurus/plugin-google-gtag" "2.0.0-rc.1" - "@docusaurus/plugin-sitemap" "2.0.0-rc.1" - "@docusaurus/theme-classic" "2.0.0-rc.1" - "@docusaurus/theme-common" "2.0.0-rc.1" - "@docusaurus/theme-search-algolia" "2.0.0-rc.1" - "@docusaurus/types" "2.0.0-rc.1" + "@docusaurus/core" "2.2.0" + "@docusaurus/plugin-content-blog" "2.2.0" + "@docusaurus/plugin-content-docs" "2.2.0" + "@docusaurus/plugin-content-pages" "2.2.0" + "@docusaurus/plugin-debug" "2.2.0" + "@docusaurus/plugin-google-analytics" "2.2.0" + "@docusaurus/plugin-google-gtag" "2.2.0" + "@docusaurus/plugin-sitemap" "2.2.0" + "@docusaurus/theme-classic" "2.2.0" + "@docusaurus/theme-common" "2.2.0" + "@docusaurus/theme-search-algolia" "2.2.0" + "@docusaurus/types" "2.2.0" "@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": version "5.5.2" @@ -1454,23 +1468,23 @@ "@types/react" "*" prop-types "^15.6.2" -"@docusaurus/theme-classic@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-2.0.0-rc.1.tgz#4ab30745e6b03b0f277837debae786a0a83aee6a" - integrity sha512-qNiz7ieeq3AC+V8TbW6S63pWLJph1CbzWDDPTqxDLHgA8VQaNaSmJM8S92pH+yKALRb9u14ogjjYYc75Nj2JmQ== +"@docusaurus/theme-classic@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-2.2.0.tgz#a048bb1bc077dee74b28bec25f4b84b481863742" + integrity sha512-kjbg/qJPwZ6H1CU/i9d4l/LcFgnuzeiGgMQlt6yPqKo0SOJIBMPuz7Rnu3r/WWbZFPi//o8acclacOzmXdUUEg== dependencies: - "@docusaurus/core" "2.0.0-rc.1" - "@docusaurus/mdx-loader" "2.0.0-rc.1" - "@docusaurus/module-type-aliases" "2.0.0-rc.1" - "@docusaurus/plugin-content-blog" "2.0.0-rc.1" - "@docusaurus/plugin-content-docs" "2.0.0-rc.1" - "@docusaurus/plugin-content-pages" "2.0.0-rc.1" - "@docusaurus/theme-common" "2.0.0-rc.1" - "@docusaurus/theme-translations" "2.0.0-rc.1" - "@docusaurus/types" "2.0.0-rc.1" - "@docusaurus/utils" "2.0.0-rc.1" - "@docusaurus/utils-common" "2.0.0-rc.1" - "@docusaurus/utils-validation" "2.0.0-rc.1" + "@docusaurus/core" "2.2.0" + "@docusaurus/mdx-loader" "2.2.0" + "@docusaurus/module-type-aliases" "2.2.0" + "@docusaurus/plugin-content-blog" "2.2.0" + "@docusaurus/plugin-content-docs" "2.2.0" + "@docusaurus/plugin-content-pages" "2.2.0" + "@docusaurus/theme-common" "2.2.0" + "@docusaurus/theme-translations" "2.2.0" + "@docusaurus/types" "2.2.0" + "@docusaurus/utils" "2.2.0" + "@docusaurus/utils-common" "2.2.0" + "@docusaurus/utils-validation" "2.2.0" "@mdx-js/react" "^1.6.22" clsx "^1.2.1" copy-text-to-clipboard "^3.0.1" @@ -1485,17 +1499,17 @@ tslib "^2.4.0" utility-types "^3.10.0" -"@docusaurus/theme-common@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-2.0.0-rc.1.tgz#ea5d9732a16b03b488555e50107161bfa2abad98" - integrity sha512-1r9ZLKD9SeoCYVzWzcdR79Dia4ANlrlRjNl6uzETOEybjK6FF7yEa9Yra8EJcOCbi3coyYz5xFh/r1YHFTFHug== +"@docusaurus/theme-common@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-2.2.0.tgz#2303498d80448aafdd588b597ce9d6f4cfa930e4" + integrity sha512-R8BnDjYoN90DCL75gP7qYQfSjyitXuP9TdzgsKDmSFPNyrdE3twtPNa2dIN+h+p/pr+PagfxwWbd6dn722A1Dw== dependencies: - "@docusaurus/mdx-loader" "2.0.0-rc.1" - "@docusaurus/module-type-aliases" "2.0.0-rc.1" - "@docusaurus/plugin-content-blog" "2.0.0-rc.1" - "@docusaurus/plugin-content-docs" "2.0.0-rc.1" - "@docusaurus/plugin-content-pages" "2.0.0-rc.1" - "@docusaurus/utils" "2.0.0-rc.1" + "@docusaurus/mdx-loader" "2.2.0" + "@docusaurus/module-type-aliases" "2.2.0" + "@docusaurus/plugin-content-blog" "2.2.0" + "@docusaurus/plugin-content-docs" "2.2.0" + "@docusaurus/plugin-content-pages" "2.2.0" + "@docusaurus/utils" "2.2.0" "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router-config" "*" @@ -1505,19 +1519,34 @@ tslib "^2.4.0" utility-types "^3.10.0" -"@docusaurus/theme-search-algolia@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-rc.1.tgz#e78c0aeaea6a3717ae3a6ecd75a8652bd7c8e974" - integrity sha512-H5yq6V/B4qo6GZrDKMbeSpk3T9e9K2MliDzLonRu0w3QHW9orVGe0c/lZvRbGlDZjnsOo7XGddhXXIDWGwnpaA== +"@docusaurus/theme-live-codeblock@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-live-codeblock/-/theme-live-codeblock-2.2.0.tgz#a507e496a1a74d261beee30ad072e4341310809a" + integrity sha512-4XRFxfZGcyqmbLmNbnbZ2ZOsoY7FYCJUZKsYW5yzhZYjmjGg7lkdJH5trt9otUoKBsZopBpPWvcDZwCu1SENYg== + dependencies: + "@docusaurus/core" "2.2.0" + "@docusaurus/theme-common" "2.2.0" + "@docusaurus/theme-translations" "2.2.0" + "@docusaurus/utils-validation" "2.2.0" + "@philpl/buble" "^0.19.7" + clsx "^1.2.1" + fs-extra "^10.1.0" + react-live "2.2.3" + tslib "^2.4.0" + +"@docusaurus/theme-search-algolia@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.2.0.tgz#77fd9f7a600917e6024fe3ac7fb6cfdf2ce84737" + integrity sha512-2h38B0tqlxgR2FZ9LpAkGrpDWVdXZ7vltfmTdX+4RsDs3A7khiNsmZB+x/x6sA4+G2V2CvrsPMlsYBy5X+cY1w== dependencies: "@docsearch/react" "^3.1.1" - "@docusaurus/core" "2.0.0-rc.1" - "@docusaurus/logger" "2.0.0-rc.1" - "@docusaurus/plugin-content-docs" "2.0.0-rc.1" - "@docusaurus/theme-common" "2.0.0-rc.1" - "@docusaurus/theme-translations" "2.0.0-rc.1" - "@docusaurus/utils" "2.0.0-rc.1" - "@docusaurus/utils-validation" "2.0.0-rc.1" + "@docusaurus/core" "2.2.0" + "@docusaurus/logger" "2.2.0" + "@docusaurus/plugin-content-docs" "2.2.0" + "@docusaurus/theme-common" "2.2.0" + "@docusaurus/theme-translations" "2.2.0" + "@docusaurus/utils" "2.2.0" + "@docusaurus/utils-validation" "2.2.0" algoliasearch "^4.13.1" algoliasearch-helper "^3.10.0" clsx "^1.2.1" @@ -1527,10 +1556,10 @@ tslib "^2.4.0" utility-types "^3.10.0" -"@docusaurus/theme-translations@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-2.0.0-rc.1.tgz#bd647f78c741ee7f6c6d2cbbd3e3f282ef2f89ad" - integrity sha512-JLhNdlnbQhxVQzOnLyiCaTzKFa1lpVrM3nCrkGQKscoG2rY6ARGYMgMN2DkoH6hm7TflQ8+PE1S5MzzASeLs4Q== +"@docusaurus/theme-translations@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-2.2.0.tgz#5fbd4693679806f80c26eeae1381e1f2c23d83e7" + integrity sha512-3T140AG11OjJrtKlY4pMZ5BzbGRDjNs2co5hJ6uYJG1bVWlhcaFGqkaZ5lCgKflaNHD7UHBHU9Ec5f69jTdd6w== dependencies: fs-extra "^10.1.0" tslib "^2.4.0" @@ -1549,30 +1578,44 @@ webpack "^5.73.0" webpack-merge "^5.8.0" -"@docusaurus/utils-common@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-2.0.0-rc.1.tgz#3e233a28794325d5d9d3af3f7b1c22b59aa8b847" - integrity sha512-+iZICpeFPZJ9oGJXuG92WTWee6WRnVx5BdzlcfuKf/f5KQX8PvwXR2tDME78FGGhShB8zr+vjuNEXuLvXT7j2A== +"@docusaurus/types@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-2.2.0.tgz#02c577a4041ab7d058a3c214ccb13647e21a9857" + integrity sha512-b6xxyoexfbRNRI8gjblzVOnLr4peCJhGbYGPpJ3LFqpi5nsFfoK4mmDLvWdeah0B7gmJeXabN7nQkFoqeSdmOw== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + commander "^5.1.0" + joi "^17.6.0" + react-helmet-async "^1.3.0" + utility-types "^3.10.0" + webpack "^5.73.0" + webpack-merge "^5.8.0" + +"@docusaurus/utils-common@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-2.2.0.tgz#a401c1b93a8697dd566baf6ac64f0fdff1641a78" + integrity sha512-qebnerHp+cyovdUseDQyYFvMW1n1nv61zGe5JJfoNQUnjKuApch3IVsz+/lZ9a38pId8kqehC1Ao2bW/s0ntDA== dependencies: tslib "^2.4.0" -"@docusaurus/utils-validation@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-2.0.0-rc.1.tgz#dded12f036cda8a54a19e01694b35859fe0cf1d5" - integrity sha512-lj36gm9Ksu4tt/EUeLDWoMbXe3sfBxeIPIUUdqYcBYkF/rpQkh+uL/dncjNGiw6uvBOqXhOfsFVP045HtgShVw== +"@docusaurus/utils-validation@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-2.2.0.tgz#04d4d103137ad0145883971d3aa497f4a1315f25" + integrity sha512-I1hcsG3yoCkasOL5qQAYAfnmVoLei7apugT6m4crQjmDGxq+UkiRrq55UqmDDyZlac/6ax/JC0p+usZ6W4nVyg== dependencies: - "@docusaurus/logger" "2.0.0-rc.1" - "@docusaurus/utils" "2.0.0-rc.1" + "@docusaurus/logger" "2.2.0" + "@docusaurus/utils" "2.2.0" joi "^17.6.0" js-yaml "^4.1.0" tslib "^2.4.0" -"@docusaurus/utils@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-2.0.0-rc.1.tgz#53584b800df9e13864d5ef1a76aa7655a90ec86e" - integrity sha512-ym9I1OwIYbKs1LGaUajaA/vDG8VweJj/6YoZjHp+eDQHhTRIrHXiYoGDqorafRhftKwnA1EnyomuXpNd9bq8Gg== +"@docusaurus/utils@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-2.2.0.tgz#3d6f9b7a69168d5c92d371bf21c556a4f50d1da6" + integrity sha512-oNk3cjvx7Tt1Lgh/aeZAmFpGV2pDr5nHKrBVx6hTkzGhrnMuQqLt6UPlQjdYQ3QHXwyF/ZtZMO1D5Pfi0lu7SA== dependencies: - "@docusaurus/logger" "2.0.0-rc.1" + "@docusaurus/logger" "2.2.0" "@svgr/webpack" "^6.2.1" file-loader "^6.2.0" fs-extra "^10.1.0" @@ -1588,6 +1631,11 @@ url-loader "^4.1.1" webpack "^5.73.0" +"@excalidraw/excalidraw@0.14.2": + version "0.14.2" + resolved "https://registry.yarnpkg.com/@excalidraw/excalidraw/-/excalidraw-0.14.2.tgz#150cb4b7a1bf0d11cd64295936c930e7e0db8375" + integrity sha512-8LdjpTBWEK5waDWB7Bt/G9YBI4j0OxkstUhvaDGz7dwQGfzF6FW5CXBoYHNEoX0qmb+Fg/NPOlZ7FrKsrSVCqg== + "@hapi/hoek@^9.0.0": version "9.3.0" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" @@ -1709,6 +1757,21 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@philpl/buble@^0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@philpl/buble/-/buble-0.19.7.tgz#27231e6391393793b64bc1c982fc7b593198b893" + integrity sha512-wKTA2DxAGEW+QffRQvOhRQ0VBiYU2h2p8Yc1oBNlqSKws48/8faxqKNIuub0q4iuyTuLwtB8EkwiKwhlfV1PBA== + dependencies: + acorn "^6.1.1" + acorn-class-fields "^0.2.1" + acorn-dynamic-import "^4.0.0" + acorn-jsx "^5.0.1" + chalk "^2.4.2" + magic-string "^0.25.2" + minimist "^1.2.0" + os-homedir "^1.0.1" + regexpu-core "^4.5.4" + "@polka/url@^1.0.0-next.20": version "1.0.0-next.21" resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" @@ -2242,16 +2305,36 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" +acorn-class-fields@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/acorn-class-fields/-/acorn-class-fields-0.2.1.tgz#748058bceeb0ef25164bbc671993984083f5a085" + integrity sha512-US/kqTe0H8M4LN9izoL+eykVAitE68YMuYZ3sHn3i1fjniqR7oQ3SPvuMK/VT1kjOQHrx5Q88b90TtOKgAv2hQ== + +acorn-dynamic-import@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" + integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== + acorn-import-assertions@^1.7.6: version "1.8.0" resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== +acorn-jsx@^5.0.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + acorn-walk@^8.0.0: version "8.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== +acorn@^6.1.1: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + acorn@^8.0.4, acorn@^8.5.0, acorn@^8.7.1: version "8.8.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" @@ -2618,6 +2701,18 @@ browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4 node-releases "^2.0.6" update-browserslist-db "^1.0.4" +buble@0.19.6: + version "0.19.6" + resolved "https://registry.yarnpkg.com/buble/-/buble-0.19.6.tgz#915909b6bd5b11ee03b1c885ec914a8b974d34d3" + integrity sha512-9kViM6nJA1Q548Jrd06x0geh+BG2ru2+RMDkIHHgJY/8AcyCs34lTHwra9BX7YdPrZXd5aarkpr/SY8bmPgPdg== + dependencies: + chalk "^2.4.1" + magic-string "^0.25.1" + minimist "^1.2.0" + os-homedir "^1.0.1" + regexpu-core "^4.2.0" + vlq "^1.0.0" + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -2697,7 +2792,7 @@ ccount@^1.0.0: resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== -chalk@^2.0.0: +chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2754,7 +2849,7 @@ cheerio@^1.0.0-rc.12: parse5 "^7.0.0" parse5-htmlparser2-tree-adapter "^7.0.0" -chokidar@^3.4.2, chokidar@^3.5.3: +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.2, chokidar@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -2905,6 +3000,16 @@ commondir@^1.0.1: resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== +component-props@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/component-props/-/component-props-1.1.1.tgz#f9b7df9b9927b6e6d97c9bd272aa867670f34944" + integrity sha512-69pIRJs9fCCHRqCz3390YF2LV1Lu6iEMZ5zuVqqUn+G20V9BNXlMs0cWawWeW9g4Ynmg29JmkG6R7/lUJoGd1Q== + +component-xor@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/component-xor/-/component-xor-0.0.4.tgz#c55d83ccc1b94cd5089a4e93fa7891c7263e59aa" + integrity sha512-ZIt6sla8gfo+AFVRZoZOertcnD5LJaY2T9CKE2j13NJxQt/mUafD69Bl7/Y4AnpI2LGjiXH7cOfJDx/n2G9edA== + compressible@~2.0.16: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" @@ -3016,6 +3121,11 @@ core-js-pure@^3.20.2: resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.24.0.tgz#10eeb90dbf0d670a6b22b081aecc7deb2faec7e1" integrity sha512-uzMmW8cRh7uYw4JQtzqvGWRyC2T5+4zipQLQdi2FmiRqP83k3d6F3stv2iAlNhOs6cXN401FCD5TL0vvleuHgA== +core-js@^2.4.1: + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + core-js@^3.23.3: version "3.24.0" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.24.0.tgz#4928d4e99c593a234eb1a1f9abd3122b04d3ac57" @@ -3345,6 +3455,13 @@ dns-packet@^5.2.2: dependencies: "@leichtgewicht/ip-codec" "^2.0.1" +docusaurus-plugin-sass@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/docusaurus-plugin-sass/-/docusaurus-plugin-sass-0.2.3.tgz#5b61f7e560d236cfc1531ed497ac32fc166fc5e2" + integrity sha512-FbaE06K8NF8SPUYTwiG+83/jkXrwHJ/Afjqz3SUIGon6QvFwSSoKOcoxGQmUBnjTOk+deUONDx8jNWsegFJcBQ== + dependencies: + sass-loader "^10.1.1" + dom-converter@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" @@ -3352,6 +3469,14 @@ dom-converter@^0.2.0: dependencies: utila "~0.4" +dom-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dom-iterator/-/dom-iterator-1.0.0.tgz#9c09899846ec41c2d257adc4d6015e4759ef05ad" + integrity sha512-7dsMOQI07EMU98gQM8NSB3GsAiIeBYIPKpnxR3c9xOvdvBjChAcOM0iJ222I3p5xyiZO9e5oggkNaCusuTdYig== + dependencies: + component-props "1.1.1" + component-xor "0.0.4" + dom-serializer@^1.0.1: version "1.4.1" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" @@ -4340,6 +4465,11 @@ immer@^9.0.7: resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.15.tgz#0b9169e5b1d22137aba7d43f8a81a495dd1b62dc" integrity sha512-2eB/sswms9AEUSkOm4SbV5Y7Vmt/bKRwByd52jfLkW4OLYeaTP3EEiJ9agqU0O/tq6Dk62Zfj+TJSqfm1rLVGQ== +immutable@^4.0.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.2.2.tgz#2da9ff4384a4330c36d4d1bc88e90f9e0b0ccd16" + integrity sha512-fTMKDwtbvO5tldky9QZ2fMX7slR0mYpY5nbnFWYp0fOzDhHqhgIw9KoYgxLWsoNTS9ZHGauHj18DTyEw6BK3Og== + import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -4692,9 +4822,9 @@ json-schema-traverse@^1.0.0: integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== json5@^2.1.2, json5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonfile@^6.0.1: version "6.1.0" @@ -4722,7 +4852,7 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -klona@^2.0.5: +klona@^2.0.4, klona@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== @@ -4851,6 +4981,13 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +magic-string@^0.25.1, magic-string@^0.25.2: + version "0.25.9" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== + dependencies: + sourcemap-codec "^1.4.8" + make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" @@ -5208,6 +5345,11 @@ opener@^1.5.2: resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== +os-homedir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== + p-cancelable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" @@ -5737,7 +5879,7 @@ pretty-time@^1.1.0: resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== -prism-react-renderer@^1.3.5: +prism-react-renderer@^1.0.1, prism-react-renderer@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz#786bb69aa6f73c32ba1ee813fbe17a0115435085" integrity sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg== @@ -5767,7 +5909,7 @@ prompts@^2.4.2: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@^15.5.8, prop-types@^15.6.2, prop-types@^15.7.2: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -5967,6 +6109,19 @@ react-lifecycles-compat@^3.0.4: resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== +react-live@2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/react-live/-/react-live-2.2.3.tgz#260f99194213799f0005e473e7a4154c699d6a7c" + integrity sha512-tpKruvfytNETuzO3o1mrQUj180GVrq35IE8F5gH1NJVPt4szYCx83/dOSCOyjgRhhc3gQvl0pQ3k/CjOjwJkKQ== + dependencies: + buble "0.19.6" + core-js "^2.4.1" + dom-iterator "^1.0.0" + prism-react-renderer "^1.0.1" + prop-types "^15.5.8" + react-simple-code-editor "^0.10.0" + unescape "^1.0.1" + react-loadable-ssr-addon-v5-slorber@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz#2cdc91e8a744ffdf9e3556caabeb6e4278689883" @@ -6010,6 +6165,11 @@ react-router@5.3.3, react-router@^5.3.3: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" +react-simple-code-editor@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/react-simple-code-editor/-/react-simple-code-editor-0.10.0.tgz#73e7ac550a928069715482aeb33ccba36efe2373" + integrity sha512-bL5W5mAxSW6+cLwqqVWY47Silqgy2DKDTR4hDBrLrUqC5BXc29YVx17l2IZk5v36VcDEq1Bszu2oHm1qBwKqBA== + react-textarea-autosize@^8.3.2: version "8.3.4" resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.3.4.tgz#270a343de7ad350534141b02c9cb78903e553524" @@ -6082,6 +6242,13 @@ regenerate-unicode-properties@^10.0.1: dependencies: regenerate "^1.4.2" +regenerate-unicode-properties@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326" + integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA== + dependencies: + regenerate "^1.4.2" + regenerate@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" @@ -6099,6 +6266,18 @@ regenerator-transform@^0.15.0: dependencies: "@babel/runtime" "^7.8.4" +regexpu-core@^4.2.0, regexpu-core@^4.5.4: + version "4.8.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0" + integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^9.0.0" + regjsgen "^0.5.2" + regjsparser "^0.7.0" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" + regexpu-core@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.1.0.tgz#2f8504c3fd0ebe11215783a41541e21c79942c6d" @@ -6125,11 +6304,23 @@ registry-url@^5.0.0: dependencies: rc "^1.2.8" +regjsgen@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== + regjsgen@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d" integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA== +regjsparser@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968" + integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ== + dependencies: + jsesc "~0.5.0" + regjsparser@^0.8.2: version "0.8.4" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.8.4.tgz#8a14285ffcc5de78c5b95d62bbf413b6bc132d5f" @@ -6317,6 +6508,26 @@ safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sass-loader@^10.1.1: + version "10.4.1" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.4.1.tgz#bea4e173ddf512c9d7f53e9ec686186146807cbf" + integrity sha512-aX/iJZTTpNUNx/OSYzo2KsjIUQHqvWsAhhUijFjAPdZTEhstjZI9zTNvkTTwsx+uNUJqUwOw5gacxQMx4hJxGQ== + dependencies: + klona "^2.0.4" + loader-utils "^2.0.0" + neo-async "^2.6.2" + schema-utils "^3.0.0" + semver "^7.3.2" + +sass@1.57.1: + version "1.57.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.57.1.tgz#dfafd46eb3ab94817145e8825208ecf7281119b5" + integrity sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -6594,7 +6805,7 @@ sort-css-media-queries@2.0.4: resolved "https://registry.yarnpkg.com/sort-css-media-queries/-/sort-css-media-queries-2.0.4.tgz#b2badfa519cb4a938acbc6d3aaa913d4949dc908" integrity sha512-PAIsEK/XupCQwitjv7XxoMvYhT7EAfyzI3hsy/MyDgTvc+Ft55ctdkctJLOy6cQejaIC+zjpUL4djFVm2ivOOw== -source-map-js@^1.0.2: +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== @@ -6617,6 +6828,11 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + space-separated-tokens@^1.0.0: version "1.1.5" resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" @@ -6947,6 +7163,13 @@ ua-parser-js@^0.7.30: resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== +unescape@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unescape/-/unescape-1.0.1.tgz#956e430f61cad8a4d57d82c518f5e6cc5d0dda96" + integrity sha512-O0+af1Gs50lyH1nUu3ZyYS1cRh01Q/kUKatTOkSs7jukXE6/NebucDVxyiDsA9AQ4JC1V1jUH9EO8JX2nMDgGQ== + dependencies: + extend-shallow "^2.0.1" + unherit@^1.0.4: version "1.1.3" resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" @@ -7203,6 +7426,11 @@ vfile@^4.0.0: unist-util-stringify-position "^2.0.0" vfile-message "^2.0.0" +vlq@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/vlq/-/vlq-1.0.1.tgz#c003f6e7c0b4c1edd623fd6ee50bbc0d6a1de468" + integrity sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w== + wait-on@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-6.0.1.tgz#16bbc4d1e4ebdd41c5b4e63a2e16dbd1f4e5601e" diff --git a/package.json b/package.json index 60a831e14..a19b2fb89 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ ] }, "dependencies": { + "@dwelle/tunnel-rat": "0.1.1", "@sentry/browser": "6.2.5", "@sentry/integrations": "6.2.5", "@testing-library/jest-dom": "5.16.2", @@ -31,6 +32,7 @@ "@types/socket.io-client": "1.4.36", "browser-fs-access": "0.29.1", "clsx": "1.1.1", + "cross-env": "7.0.3", "fake-indexeddb": "3.1.7", "firebase": "8.3.3", "i18next-browser-languagedetector": "6.1.4", @@ -54,7 +56,20 @@ "roughjs": "4.5.2", "sass": "1.51.0", "socket.io-client": "2.3.1", - "typescript": "4.5.5" + "tunnel-rat": "0.1.0", + "typescript": "4.9.4", + "workbox-background-sync": "^6.5.4", + "workbox-broadcast-update": "^6.5.4", + "workbox-cacheable-response": "^6.5.4", + "workbox-core": "^6.5.4", + "workbox-expiration": "^6.5.4", + "workbox-google-analytics": "^6.5.4", + "workbox-navigation-preload": "^6.5.4", + "workbox-precaching": "^6.5.4", + "workbox-range-requests": "^6.5.4", + "workbox-routing": "^6.5.4", + "workbox-strategies": "^6.5.4", + "workbox-streams": "^6.5.4" }, "devDependencies": { "@excalidraw/eslint-config": "1.0.0", @@ -67,6 +82,7 @@ "dotenv": "16.0.1", "eslint-config-prettier": "8.5.0", "eslint-plugin-prettier": "3.3.1", + "http-server": "14.1.1", "husky": "7.0.4", "jest-canvas-mock": "2.4.0", "lint-staged": "12.3.7", @@ -89,11 +105,10 @@ "private": true, "scripts": { "build-node": "node ./scripts/build-node.js", - "build:app:docker": "REACT_APP_DISABLE_SENTRY=true react-scripts build", - "build:app": "REACT_APP_GIT_SHA=$VERCEL_GIT_COMMIT_SHA react-scripts build", + "build:app:docker": "cross-env REACT_APP_DISABLE_SENTRY=true REACT_APP_DISABLE_TRACKING=true react-scripts build", + "build:app": "cross-env REACT_APP_GIT_SHA=$VERCEL_GIT_COMMIT_SHA react-scripts build", "build:version": "node ./scripts/build-version.js", - "build:prebuild": "node ./scripts/prebuild.js", - "build": "yarn build:prebuild && yarn build:app && yarn build:version", + "build": "yarn build:app && yarn build:version", "eject": "react-scripts eject", "fix:code": "yarn test:code --fix", "fix:other": "yarn prettier --write", @@ -103,6 +118,7 @@ "prepare": "husky install", "prettier": "prettier \"**/*.{css,scss,json,md,html,yml}\" --ignore-path=.eslintignore", "start": "react-scripts start", + "start:production": "npm run build && npx http-server build -a localhost -p 5001 -o", "test:all": "yarn test:typecheck && yarn test:code && yarn test:other && yarn test:app --watchAll=false", "test:app": "react-scripts test --passWithNoTests", "test:code": "eslint --max-warnings=0 --ext .js,.ts,.tsx .", diff --git a/public/index.html b/public/index.html index e065e6700..35640c0dc 100644 --- a/public/index.html +++ b/public/index.html @@ -146,7 +146,8 @@ // setting this so that libraries installation reuses this window tab. window.name = "_excalidraw"; - <% if (process.env.REACT_APP_GOOGLE_ANALYTICS_ID) { %> + <% if (process.env.REACT_APP_DISABLE_TRACKING !== 'true' && + process.env.REACT_APP_GOOGLE_ANALYTICS_ID) { %> -``` - -For production use :point_down: - -```js - -``` - -You will need to make sure `react`, `react-dom` is available as shown in the below example. For prod please use the production versions of `react`, `react-dom`. - -

    View Example - -```html - - - - Excalidraw in browser - - - - - - - - -
    -

    Excalidraw Embed Example

    -
    -
    - - - -``` - -```js -/*eslint-disable */ -import "./styles.css"; -import InitialData from "./initialData"; - -const App = () => { - const excalidrawRef = React.useRef(null); - - const [viewModeEnabled, setViewModeEnabled] = React.useState(false); - const [zenModeEnabled, setZenModeEnabled] = React.useState(false); - const [gridModeEnabled, setGridModeEnabled] = React.useState(false); - - const updateScene = () => { - const sceneData = { - elements: [ - { - type: "rectangle", - version: 141, - versionNonce: 361174001, - isDeleted: false, - id: "oDVXy8D6rom3H1-LLH2-f", - fillStyle: "hachure", - strokeWidth: 1, - strokeStyle: "solid", - roughness: 1, - opacity: 100, - angle: 0, - x: 100.50390625, - y: 93.67578125, - strokeColor: "#c92a2a", - backgroundColor: "transparent", - width: 186.47265625, - height: 141.9765625, - seed: 1968410350, - groupIds: [], - }, - ], - appState: { - viewBackgroundColor: "#edf2ff", - }, - }; - excalidrawRef.current.updateScene(sceneData); - }; - - return React.createElement( - React.Fragment, - null, - React.createElement( - "div", - { className: "button-wrapper" }, - React.createElement( - "button", - { - className: "update-scene", - onClick: updateScene, - }, - "Update Scene", - ), - React.createElement( - "button", - { - className: "reset-scene", - onClick: () => excalidrawRef.current.resetScene(), - }, - "Reset Scene", - ), - React.createElement( - "label", - null, - React.createElement("input", { - type: "checkbox", - checked: viewModeEnabled, - onChange: () => setViewModeEnabled(!viewModeEnabled), - }), - "View mode", - ), - React.createElement( - "label", - null, - React.createElement("input", { - type: "checkbox", - checked: zenModeEnabled, - onChange: () => setZenModeEnabled(!zenModeEnabled), - }), - "Zen mode", - ), - React.createElement( - "label", - null, - React.createElement("input", { - type: "checkbox", - checked: gridModeEnabled, - onChange: () => setGridModeEnabled(!gridModeEnabled), - }), - "Grid mode", - ), - ), - React.createElement( - "div", - { - className: "excalidraw-wrapper", - ref: excalidrawWrapperRef, - }, - React.createElement(ExcalidrawLib.Excalidraw, { - initialData: InitialData, - onChange: (elements, state) => - console.log("Elements :", elements, "State : ", state), - onPointerUpdate: (payload) => console.log(payload), - onCollabButtonClick: () => window.alert("You clicked on collab button"), - viewModeEnabled: viewModeEnabled, - zenModeEnabled: zenModeEnabled, - gridModeEnabled: gridModeEnabled, - }), - ), - ); -}; - -const excalidrawWrapper = document.getElementById("app"); - -ReactDOM.render(React.createElement(App), excalidrawWrapper); -``` - -To view the full example visit :point_down: - -[![Edit excalidraw-in-browser](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/excalidraw-in-browser-tlqom?fontsize=14&hidenavigation=1&theme=dark) - -
    - -### Customizing styles - -Excalidraw is using CSS variables to style certain components. To override them, you should set your own on the `.excalidraw` and `.excalidraw.theme--dark` (for dark mode variables) selectors. - -Make sure the selector has higher specificity, e.g. by prefixing it with your app's selector: - -```css -.your-app .excalidraw { - --color-primary: red; -} -.your-app .excalidraw.theme--dark { - --color-primary: pink; -} -``` - -Most notably, you can customize the primary colors, by overriding these variables: - -- `--color-primary` -- `--color-primary-darker` -- `--color-primary-darkest` -- `--color-primary-light` -- `--color-primary-contrast-offset` — a slightly darker (in light mode), or lighter (in dark mode) `--color-primary` color to fix contrast issues (see [Chubb illusion](https://en.wikipedia.org/wiki/Chubb_illusion)). It will fall back to `--color-primary` if not present. - -For a complete list of variables, check [theme.scss](https://github.com/excalidraw/excalidraw/blob/master/src/css/theme.scss), though most of them will not make sense to override. - -### Does this package support collaboration ? - -No, Excalidraw package doesn't come with collaboration built in, since the implementation is specific to each host app. We expose APIs which you can use to communicate with Excalidraw which you can use to implement it. You can check our own implementation [here](https://github.com/excalidraw/excalidraw/blob/master/src/excalidraw-app/index.tsx). - -### Props - -| Name | Type | Default | Description | -| --- | --- | --- | --- | -| [`onChange`](#onChange) | Function | | This callback is triggered whenever the component updates due to any change. This callback will receive the excalidraw elements and the current app state. | -| [`initialData`](#initialData) | {elements?:
    ExcalidrawElement[], appState?: AppState } | null | The initial data with which app loads. | -| [`ref`](#ref) | [`createRef`](https://reactjs.org/docs/refs-and-the-dom.html#creating-refs) | [`useRef`](https://reactjs.org/docs/hooks-reference.html#useref) | [`callbackRef`](https://reactjs.org/docs/refs-and-the-dom.html#callback-refs) | { current: { readyPromise: resolvablePromise } } | | Ref to be passed to Excalidraw | -| [`onCollabButtonClick`](#onCollabButtonClick) | Function | | Callback to be triggered when the collab button is clicked | -| [`isCollaborating`](#isCollaborating) | `boolean` | | This implies if the app is in collaboration mode | -| [`onPointerUpdate`](#onPointerUpdate) | Function | | Callback triggered when mouse pointer is updated. | -| [`langCode`](#langCode) | string | `en` | Language code string | -| [`renderTopRightUI`](#renderTopRightUI) | Function | | Function that renders custom UI in top right corner | -| [`renderFooter `](#renderFooter) | Function | | Function that renders custom UI footer | -| [`renderCustomStats`](#renderCustomStats) | Function | | Function that can be used to render custom stats on the stats dialog. | -| [`renderSIdebar`](#renderSIdebar) | Function | | Render function that renders custom sidebar. | -| [`viewModeEnabled`](#viewModeEnabled) | boolean | | This implies if the app is in view mode. | -| [`zenModeEnabled`](#zenModeEnabled) | boolean | | This implies if the zen mode is enabled | -| [`gridModeEnabled`](#gridModeEnabled) | boolean | | This implies if the grid mode is enabled | -| [`libraryReturnUrl`](#libraryReturnUrl) | string | | What URL should [libraries.excalidraw.com](https://libraries.excalidraw.com) be installed to | -| [`theme`](#theme) | [THEME.LIGHT](#THEME-1) | [THEME.DARK](#THEME-1) | [THEME.LIGHT](#THEME-1) | The theme of the Excalidraw component | -| [`name`](#name) | string | | Name of the drawing | -| [`UIOptions`](#UIOptions) | { canvasActions: CanvasActions } | [DEFAULT UI OPTIONS](https://github.com/excalidraw/excalidraw/blob/master/src/constants.ts#L129) | To customise UI options. Currently we support customising [`canvas actions`](#canvasActions) | -| [`onPaste`](#onPaste) | (data: ClipboardData, event: ClipboardEvent | null) => boolean | | Callback to be triggered if passed when the something is pasted in to the scene | -| [`detectScroll`](#detectScroll) | boolean | true | Indicates whether to update the offsets when nearest ancestor is scrolled. | -| [`handleKeyboardGlobally`](#handleKeyboardGlobally) | boolean | false | Indicates whether to bind the keyboard events to document. | -| [`onLibraryChange`](#onLibraryChange) | (items: LibraryItems) => void | Promise<any> | | The callback if supplied is triggered when the library is updated and receives the library items. | -| [`autoFocus`](#autoFocus) | boolean | false | Implies whether to focus the Excalidraw component on page load | -| [`generateIdForFile`](#generateIdForFile) | `(file: File) => string | Promise` | Allows you to override `id` generation for files added on canvas | -| [`onLinkOpen`](#onLinkOpen) | (element: NonDeletedExcalidrawElement, event: CustomEvent) | | This prop if passed will be triggered when link of an element is clicked. | -| [`onPointerDown`](#onPointerDown) | (activeTool: AppState["activeTool"], pointerDownState: PointerDownState) => void | | This prop if passed gets triggered on pointer down evenets | -| [`onScrollChange`](#onScrollChange) | (scrollX: number, scrollY: number) | | This prop if passed gets triggered when scrolling the canvas. | - -### Dimensions of Excalidraw - -Excalidraw takes `100%` of `width` and `height` of the containing block so make sure the container in which you render Excalidraw has non zero dimensions. - -#### `onChange` - -Every time component updates, this callback if passed will get triggered and has the below signature. - -```js -(excalidrawElements, appState, files) => void; -``` - -1.`excalidrawElements`: Array of [excalidrawElements](https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L106) in the scene. - -2.`appState`: [AppState](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L79) of the scene. - -3. `files`: The [`BinaryFiles`]([BinaryFiles](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L64) which are added to the scene. - -Here you can try saving the data to your backend or local storage for example. - -#### `initialData` - -This helps to load Excalidraw with `initialData`. It must be an object or a [promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/Promise) which resolves to an object containing the below optional fields. - -| Name | Type | Description | -| --- | --- | --- | -| `elements` | [ExcalidrawElement[]](https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L106) | The elements with which Excalidraw should be mounted. | -| `appState` | [AppState](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L79) | The App state with which Excalidraw should be mounted. | -| `scrollToContent` | boolean | This attribute implies whether to scroll to the nearest element to center once Excalidraw is mounted. By default, it will not scroll the nearest element to the center. Make sure you pass `initialData.appState.scrollX` and `initialData.appState.scrollY` when `scrollToContent` is false so that scroll positions are retained | -| `libraryItems` | [LibraryItems](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L200) | Promise<[LibraryItems](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L200)> | This library items with which Excalidraw should be mounted. | -| `files` | [BinaryFiles](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L64) | The files added to the scene. | - -```json -{ - "elements": [ - { - "type": "rectangle", - "version": 141, - "versionNonce": 361174001, - "isDeleted": false, - "id": "oDVXy8D6rom3H1-LLH2-f", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 100.50390625, - "y": 93.67578125, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 186.47265625, - "height": 141.9765625, - "seed": 1968410350, - "groupIds": [] - } - ], - "appState": { "zenModeEnabled": true, "viewBackgroundColor": "#AFEEEE" } -} -``` - -You might want to use this when you want to load excalidraw with some initial elements and app state. - -#### Storing custom data on Excalidraw elements - -Beyond attributes that Excalidraw elements already support, you can store custom data on each element in a `customData` object. The type of the attribute is [`Record`](https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L59) and is optional. - -You can use this to add any extra information you need to keep track of. - -You can add `customData` to elements when passing them as `initialData`, or using [`updateScene`](#updateScene)/[`updateLibrary`](#updateLibrary) afterwards. - -#### `ref` - -You can pass a `ref` when you want to access some excalidraw APIs. We expose the below APIs: - -| API | Signature | Usage | -| --- | --- | --- | -| ready | `boolean` | This is set to true once Excalidraw is rendered | -| readyPromise | [resolvablePromise](https://github.com/excalidraw/excalidraw/blob/master/src/utils.ts#L317) | This promise will be resolved with the api once excalidraw has rendered. This will be helpful when you want do some action on the host app once this promise resolves. For this to work you will have to pass ref as shown [here](#readyPromise) | -| [updateScene](#updateScene) | (scene: sceneData) => void | updates the scene with the sceneData | -| [updateLibrary](#updateLibrary) | (opts) => Promise<LibraryItems> | updates the scene with the sceneData | -| [addFiles](#addFiles) | (files: BinaryFileData) => void | add files data to the appState | -| resetScene | `({ resetLoadingState: boolean }) => void` | Resets the scene. If `resetLoadingState` is passed as true then it will also force set the loading state to false. | -| getSceneElementsIncludingDeleted | () => ExcalidrawElement[] | Returns all the elements including the deleted in the scene | -| getSceneElements | () => ExcalidrawElement[] | Returns all the elements excluding the deleted in the scene | -| getAppState | () => AppState | Returns current appState | -| history | `{ clear: () => void }` | This is the history API. `history.clear()` will clear the history | -| scrollToContent | (target?: ExcalidrawElement | ExcalidrawElement[]) => void | Scroll the nearest element out of the elements supplied to the center. Defaults to the elements on the scene. | -| refresh | `() => void` | Updates the offsets for the Excalidraw component so that the coordinates are computed correctly (for example the cursor position). You don't have to call this when the position is changed on page scroll or when the excalidraw container resizes (we handle that ourselves). For any other cases if the position of excalidraw is updated (example due to scroll on parent container and not page scroll) you should call this API. | -| [importLibrary](#importlibrary) | (url: string, token?: string) => void | Imports library from given URL | -| [setToast](#setToast) | ({ message: string, closable?:boolean, duration?:number } | null) => void | This API can be used to show the toast with custom message. | -| [id](#id) | string | Unique ID for the excalidraw component. | -| [getFiles](#getFiles) | () => files | This API can be used to get the files present in the scene. It may contain files that aren't referenced by any element, so if you're persisting the files to a storage, you should compare them against stored elements. | -| [setActiveTool](#setActiveTool) | (tool: { type: typeof SHAPES [number]["value"]| "eraser" } | { type: "custom"; customType: string }) => void | This API can be used to set the active tool | -| [setCursor](#setCursor) | (cursor: string) => void | This API can be used to set customise the mouse cursor on the canvas | -| [resetCursor](#resetCursor) | () => void | This API can be used to reset to default mouse cursor on the canvas | -| [toggleMenu](#toggleMenu) | (type: string, force?: boolean) => boolean | Toggles specific menus on/off | - -#### `readyPromise` - -
    -const excalidrawRef = { current: { readyPromise: resolvablePromise}}
    -
    - -Since plain object is passed as a `ref`, the `readyPromise` is resolved as soon as the component is mounted. Most of the time you will not need this unless you have a specific use case where you can't pass the `ref` in the react way and want to do some action on the host when this promise resolves. You can check the [example](https://codesandbox.io/s/eexcalidraw-resolvable-promise-d0qg3?file=/src/App.js) for the usage. - -### `updateScene` - -
    -(scene: sceneData) => void
    -
    - -You can use this function to update the scene with the sceneData. It accepts the below attributes. - -| Name | Type | Description | -| --- | --- | --- | -| `elements` | [`ImportedDataState["elements"]`](https://github.com/excalidraw/excalidraw/blob/master/src/data/types.ts#L17) | The `elements` to be updated in the scene | -| `appState` | [`ImportedDataState["appState"]`](https://github.com/excalidraw/excalidraw/blob/master/src/data/types.ts#L18) | The `appState` to be updated in the scene. | -| `collaborators` |
    MapCollaborator>
    | The list of collaborators to be updated in the scene. | -| `commitToHistory` | `boolean` | Implies if the `history (undo/redo)` should be recorded. Defaults to `false`. | -| `libraryItems` | [LibraryItems](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L200) | Promise<[LibraryItems](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L200)> | ((currentItems: [LibraryItems](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L200)>) => [LibraryItems](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L200) | Promise<[LibraryItems](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L200)>) | The `libraryItems` to be update in the scene. | - -### `updateLibrary` - -
    -(opts: {
    -  libraryItems: LibraryItemsSource;
    -  merge?: boolean;
    -  prompt?: boolean;
    -  openLibraryMenu?: boolean;
    -  defaultStatus?: "unpublished" | "published";
    -}) => Promise<LibraryItems>
    -
    - -You can use this function to update the library. It accepts the below attributes. - -| Name | Type | Default | Description | -| --- | --- | --- | --- | -| `libraryItems` | | [LibraryItems](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L224) | The `libraryItems` to be replaced/merged with current library | -| `merge` | boolean | `false` | Whether to merge with existing library items. | -| `prompt` | boolean | `false` | Whether to prompt user for confirmation. | -| `openLibraryMenu` | boolean | `false` | Whether to open the library menu before importing. | -| `defaultStatus` | "unpublished" | "published" | `"unpublished"` | Default library item's `status` if not present. | - -### `addFiles` - -
    (files: BinaryFileData) => void 
    - -Adds supplied files data to the `appState.files` cache on top of existing files present in the cache. - -#### `onCollabButtonClick` - -This callback is triggered when clicked on the collab button in excalidraw. If not supplied, the collab dialog button is not rendered. - -#### `isCollaborating` - -This prop indicates if the app is in collaboration mode. - -#### `onPointerUpdate` - -This callback is triggered when mouse pointer is updated. - -```js -({ x, y }, button, pointersMap}) => void; -``` - -1.`{x, y}`: Pointer coordinates - -2.`button`: The position of the button. This will be one of `["down", "up"]` - -3.`pointersMap`: [`pointers map`](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L131) of the scene - -```js -(exportedElements, appState, canvas) => void -``` - -1. `exportedElements`: An array of [non deleted elements](https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L87) which needs to be exported. -2. `appState`: [AppState](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L79) of the scene. -3. `canvas`: The `HTMLCanvasElement` of the scene. - -#### `langCode` - -Determines the language of the UI. It should be one of the [available language codes](https://github.com/excalidraw/excalidraw/blob/master/src/i18n.ts#L14). Defaults to `en` (English). We also export default language and supported languages which you can import as shown below. - -```js -import { defaultLang, languages } from "@excalidraw/excalidraw"; -``` - -| name | type | -| --- | --- | -| defaultLang | string | -| languages | [Language[]](https://github.com/excalidraw/excalidraw/blob/master/src/i18n.ts#L8) | - -#### `renderTopRightUI` - -
    -(isMobile: boolean, appState: AppState) => JSX | null
    -
    - -A function returning JSX to render custom UI in the top right corner of the app. - -#### `renderFooter` - -
    -(isMobile: boolean, appState: AppState) => JSX | null
    -
    - -A function returning JSX to render custom UI footer. For example, you can use this to render a language picker that was previously being rendered by Excalidraw itself (for now, you'll need to implement your own language picker). - -#### `renderCustomStats` - -A function that can be used to render custom stats (returns JSX) in the nerd stats dialog. For example you can use this prop to render the size of the elements in the storage. - -#### `renderSidebar` - -
    -() => JSX | null
    -
    - -Optional function that can render custom sidebar. This sidebar is the same that the library menu sidebar is using, and can be used for any purposes your app needs. The render function should return a `` instance — a component that is exported from the Excalidraw package. It accepts `children` which can be any content you like to render inside. - -The `` component takes these props (all are optional except `children`): - -| name | type | description | -| --- | --- | --- | -| className | string | -| children |
    React.ReactNode
    | Content you want to render inside the sidebar. | -| onClose |
    () => void
    | Invoked when the component is closed (by user, or the editor). No need to act on this event, as the editor manages the sidebar open state on its own. | -| onDock |
    (isDocked: boolean) => void
    | Invoked when the user toggles the dock button. | -| docked | boolean | Indicates whether the sidebar is docked. By default, the sidebar is undocked. If passed, the docking becomes controlled, and you are responsible for updating the `docked` state by listening on `onDock` callback. See [here](#dockedSidebarBreakpoint) for more info docking. | -| dockable | boolean | Indicates whether the sidebar can be docked by user (=the dock button is shown). If `false`, you can still dock programmatically by passing `docked=true` | - -The sidebar will always include a header with close/dock buttons (when applicable). - -You can also add custom content to the header, by rendering `` as a child of the `` component. Note that the custom header will still include the default buttons. - -The `` component takes these props children (all are optional): - -| name | type | description | -| --- | --- | --- | -| className | string | -| children |
    React.ReactNode
    | Content you want to render inside the sidebar header, sibling of the header buttons. | - -For example code, see the example [`App.tsx`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/example/App.tsx#L524) file. - -#### `viewModeEnabled` - -This prop indicates whether the app is in `view mode`. When supplied, the value takes precedence over `intialData.appState.viewModeEnabled`, the `view mode` will be fully controlled by the host app, and users won't be able to toggle it from within the app. - -#### `zenModeEnabled` - -This prop indicates whether the app is in `zen mode`. When supplied, the value takes precedence over `intialData.appState.zenModeEnabled`, the `zen mode` will be fully controlled by the host app, and users won't be able to toggle it from within the app. - -#### `gridModeEnabled` - -This prop indicates whether the shows the grid. When supplied, the value takes precedence over `intialData.appState.gridModeEnabled`, the grid will be fully controlled by the host app, and users won't be able to toggle it from within the app. - -#### `libraryReturnUrl` - -If supplied, this URL will be used when user tries to install a library from [libraries.excalidraw.com](https://libraries.excalidraw.com). Defaults to `window.location.origin + window.location.pathname`. To install the libraries in the same tab from which it was opened, you need to set `window.name` (to any alphanumeric string) — if it's not set it will open in a new tab. - -#### `theme` - -This prop controls Excalidraw's theme. When supplied, the value takes precedence over `intialData.appState.theme`, the theme will be fully controlled by the host app, and users won't be able to toggle it from within the app unless `UIOptions.canvasActions.toggleTheme` is set to `true`, in which case the `theme` prop will control Excalidraw's default theme with ability to allow theme switching (you must take care of updating the `theme` prop when you detect a change to `appState.theme` from the [onChange](#onChange) callback). - -You can use [`THEME`](#THEME-1) to specify the theme. - -#### `name` - -This prop sets the name of the drawing which will be used when exporting the drawing. When supplied, the value takes precedence over `intialData.appState.name`, the `name` will be fully controlled by host app and the users won't be able to edit from within Excalidraw. - -#### `UIOptions` - -This prop can be used to customise UI of Excalidraw. Currently we support customising [`canvasActions`](#canvasActions) and [`dockedSidebarBreakpoint`](dockedSidebarBreakpoint). It accepts the below parameters - -
    -{ canvasActions:  CanvasActions }
    -
    - -##### canvasActions - -| Attribute | Type | Default | Description | -| --- | --- | --- | --- | -| `changeViewBackgroundColor` | boolean | true | Implies whether to show `Background color picker` | -| `clearCanvas` | boolean | true | Implies whether to show `Clear canvas button` | -| `export` | false | [exportOpts](#exportOpts) |
    { saveFileToDisk: true }
    | This prop allows to customize the UI inside the export dialog. By default it shows the "saveFileToDisk". If this prop is `false` the export button will not be rendered. For more details visit [`exportOpts`](#exportOpts). | -| `loadScene` | boolean | true | Implies whether to show `Load button` | -| `saveToActiveFile` | boolean | true | Implies whether to show `Save button` to save to current file | -| `toggleTheme` | boolean | null | null | Implies whether to show `Theme toggle`. When defined as `boolean`, takes precedence over [`props.theme`](#theme) to show `Theme toggle` | -| `saveAsImage` | boolean | true | Implies whether to show `Save as image button` | - -##### `dockedSidebarBreakpoint` - -This prop indicates at what point should we break to a docked, permanent sidebar. If not passed it defaults to [`MQ_RIGHT_SIDEBAR_MAX_WIDTH_PORTRAIT`](https://github.com/excalidraw/excalidraw/blob/master/src/constants.ts#L167). If the `width` of the `excalidraw` container exceeds `dockedSidebarBreakpoint`, the sidebar will be dockable. If user choses to dock the sidebar, it will push the right part of the UI towards the left, making space for the sidebar as shown below. - -![image](https://user-images.githubusercontent.com/11256141/174664866-c698c3fa-197b-43ff-956c-d79852c7b326.png) - -#### `exportOpts` - -The below attributes can be set in `UIOptions.canvasActions.export` to customize the export dialog. If `UIOptions.canvasActions.export` is `false` the export button will not be rendered. - -| Attribute | Type | Default | Description | -| --- | --- | --- | --- | -| `saveFileToDisk` | boolean | true | Implies if save file to disk button should be shown | -| `onExportToBackend` |
     (exportedElements: readonly NonDeletedExcalidrawElement[],appState: AppState,canvas: HTMLCanvasElement | null) => void 
    | | This callback is triggered when the shareable-link button is clicked in the export dialog. The link button will only be shown if this callback is passed. | -| `renderCustomUI` |
     (exportedElements: readonly NonDeletedExcalidrawElement[],appState: AppState,canvas: HTMLCanvasElement | null) => void 
    | | This callback should be supplied if you want to render custom UI in the export dialog. | - -#### `onPaste` - -This callback is triggered if passed when something is pasted into the scene. You can use this callback in case you want to do something additional when the paste event occurs. - -
    -(data: ClipboardData, event: ClipboardEvent | null) => boolean
    -
    - -This callback must return a `boolean` value or a [promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/Promise) which resolves to a boolean value. - -In case you want to prevent the excalidraw paste action you must return `false`, it will stop the native excalidraw clipboard management flow (nothing will be pasted into the scene). - -#### `importLibrary` - -Imports library from given URL. You should call this on `hashchange`, passing the `addLibrary` value if you detect it as shown below. Optionally pass a CSRF `token` to skip prompting during installation (retrievable via `token` key from the url coming from [https://libraries.excalidraw.com](https://libraries.excalidraw.com/)). - -```js -useEffect(() => { - const onHashChange = () => { - const hash = new URLSearchParams(window.location.hash.slice(1)); - const libraryUrl = hash.get("addLibrary"); - if (libraryUrl) { - excalidrawRef.current.importLibrary(libraryUrl, hash.get("token")); - } - }; - window.addEventListener("hashchange", onHashChange, false); - return () => { - window.removeEventListener("hashchange", onHashChange); - }; -}, []); -``` - -Try out the [Demo](#Demo) to see it in action. - -#### `setToast` - -This API can be used to show the toast with custom message. - -
    -({ message: string,
    - closable?:boolean,
    - duration?:number } | null) => void
    -
    - -| Attribute | type | Description | -| --- | --- | --- | -| message | string | The message to be shown on the toast. | -| closable | boolean | Indicates whether to show the closable button on toast to dismiss the toast. | -| duration | number | Determines the duration after which the toast should auto dismiss. To prevent autodimiss you can pass `Infinity`. | - -To dismiss an existing toast you can simple pass `null` - -```js -setToast(null); -``` - -#### `setActiveTool` - -This API has the below signature. It sets the `tool` passed in param as the active tool. - -
    -(tool: { type: typeof SHAPES[number]["value"] | "eraser" } | { type: "custom"; customType: string }) => void
    -
    - -#### `setCursor` - -This API can be used to customise the mouse cursor on the canvas and has the below signature. It sets the mouse cursor to the cursor passed in param. - -
    -(cursor: string) => void
    -
    - -#### `toggleMenu` - -
    -(type: "library" | "customSidebar", force?: boolean) => boolean
    -
    - -This API can be used to toggle a specific menu (currently only the sidebars), and returns whether the menu was toggled on or off. If the `force` flag passed, it will force the menu to be toggled either on/off based on the boolean passed. - -This API is especially useful when you render a custom sidebar using [`renderSidebar`](#renderSidebar) prop, and you want to toggle it from your app based on a user action. - -#### `resetCursor` - -This API can be used to reset to default mouse cursor. - -#### `detectScroll` - -Indicates whether Excalidraw should listen for `scroll` event on the nearest scrollable container in the DOM tree and recompute the coordinates (e.g. to correctly handle the cursor) when the component's position changes. You can disable this when you either know this doesn't affect your app or you want to take care of it yourself (calling the [`refresh()`](#ref) method). - -#### `handleKeyboardGlobally` - -Indicates whether to bind keyboard events to `document`. Disabled by default, meaning the keyboard events are bound to the Excalidraw component. This allows for multiple Excalidraw components to live on the same page, and ensures that Excalidraw keyboard handling doesn't collide with your app's (or the browser) when the component isn't focused. - -Enable this if you want Excalidraw to handle keyboard even if the component isn't focused (e.g. a user is interacting with the navbar, sidebar, or similar). - -#### `onLibraryChange` - -This callback if supplied will get triggered when the library is updated and has the below signature. - -
    -(items: LibraryItems) => void | Promise
    -
    - -It is invoked with empty items when user clears the library. You can use this callback when you want to do something additional when library is updated for example persisting it to local storage. - -#### `id` - -The unique id of the excalidraw component. This can be used to identify the excalidraw component, for example importing the library items to the excalidraw component from where it was initiated when you have multiple excalidraw components rendered on the same page as shown in [multiple excalidraw demo](https://codesandbox.io/s/multiple-excalidraw-k1xx5). - -#### `autoFocus` - -This prop implies whether to focus the Excalidraw component on page load. Defaults to false. - -#### `generateIdForFile` - -Allows you to override `id` generation for files added on canvas (images). By default, an SHA-1 digest of the file is used. - -``` -(file: File) => string | Promise -``` - -#### `onLinkOpen` - -This prop if passed will be triggered when clicked on link. To handle the redirect yourself (such as when using your own router for internal links), you must call `event.preventDefault()`. - -``` -(element: ExcalidrawElement, event: CustomEvent<{ nativeEvent: MouseEvent }>) => void -``` - -Example: - -```ts -const history = useHistory(); - -// open internal links using the app's router, but opens external links in -// a new tab/window -const onLinkOpen: ExcalidrawProps["onLinkOpen"] = useCallback( - (element, event) => { - const link = element.link; - const { nativeEvent } = event.detail; - const isNewTab = nativeEvent.ctrlKey || nativeEvent.metaKey; - const isNewWindow = nativeEvent.shiftKey; - const isInternalLink = - link.startsWith("/") || link.includes(window.location.origin); - if (isInternalLink && !isNewTab && !isNewWindow) { - history.push(link.replace(window.location.origin, "")); - // signal that we're handling the redirect ourselves - event.preventDefault(); - } - }, - [history], -); -``` - -#### `onPointerDown` - -This prop if passed will be triggered on pointer down events and has the below signature. - -
    -(activeTool:  AppState["activeTool"], pointerDownState: PointerDownState) => void
    -
    - -#### `onScrollChange` - -This prop if passed will be triggered when canvas is scrolled and has the below signature. - -```ts -(scrollX: number, scrollY: number) => void -``` - -### Restore utilities - -#### `restoreAppState` - -**_Signature_** - -
    -restoreAppState(appState: ImportedDataState["appState"], localAppState: Partial<AppState> | null): AppState
    -
    - -**_How to use_** - -```js -import { restoreAppState } from "@excalidraw/excalidraw"; -``` - -This function will make sure all the keys have appropriate values in [appState](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L79) and if any key is missing, it will be set to default value. - -When `localAppState` is supplied, it's used in place of values that are missing (`undefined`) in `appState` instead of defaults. Use this as a way to not override user's defaults if you persist them. Required: supply `null`/`undefined` if not applicable. - -#### `restoreElements` - -**_Signature_** - -
    -restoreElements(
    -  elements: ImportedDataState["elements"],
    -  localElements: ExcalidrawElement[] | null | undefined): ExcalidrawElement[],
    -  refreshDimensions: boolean
    -)
    -
    - -**_How to use_** - -```js -import { restoreElements } from "@excalidraw/excalidraw"; -``` - -This function will make sure all properties of element is correctly set and if any attribute is missing, it will be set to default value. - -When `localElements` are supplied, they are used to ensure that existing restored elements reuse `version` (and increment it), and regenerate `versionNonce`. Use this when you import elements which may already be present in the scene to ensure that you do not disregard the newly imported elements if you're using element version to detect the updates. - -Parameter `refreshDimensions` indicates whether we should also recalculate text element dimensions. Defaults to `false`. Since this is a potentially costly operation, you may want to disable it if you restore elements in tight loops, such as during collaboration. - -#### `restore` - -**_Signature_** - -
    -restoreElements(
    -  data: ImportedDataState,
    -  localAppState: Partial<AppState> | null | undefined,
    -  localElements: ExcalidrawElement[] | null | undefined): DataState
    -)
    -
    - -See [`restoreAppState()`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#restoreAppState) about `localAppState`, and [`restoreElements()`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#restoreElements) about `localElements`. - -**_How to use_** - -```js -import { restore } from "@excalidraw/excalidraw"; -``` - -This function makes sure elements and state is set to appropriate values and set to default value if not present. It is a combination of [restoreElements](#restoreElements) and [restoreAppState](#restoreAppState). - -#### `restoreLibraryItems` - -**_Signature_** - -
    -restoreLibraryItems(libraryItems: ImportedDataState["libraryItems"], defaultStatus: "published" | "unpublished")
    -
    - -**_How to use_** - -```js -import { restoreLibraryItems } from "@excalidraw/excalidraw"; - -restoreLibraryItems(libraryItems, "unpublished"); -``` - -This function normalizes library items elements, adding missing values when needed. - -### Export utilities - -#### `exportToCanvas` - -**_Signature_** - -
    exportToCanvas({
    -  elements,
    -  appState
    -  getDimensions,
    -  files,
    -  exportPadding?: number;
    -}: ExportOpts
    -
    - -| Name | Type | Default | Description | -| --- | --- | --- | --- | -| elements | [Excalidraw Element []](https://github.com/excalidraw/excalidraw/blob/master/src/element/types) | | The elements to be exported to canvas | -| appState | [AppState](https://github.com/excalidraw/excalidraw/blob/master/src/packages/utils.ts#L12) | [defaultAppState](https://github.com/excalidraw/excalidraw/blob/master/src/appState.ts#L11) | The app state of the scene | -| getDimensions | `(width: number, height: number) => { width: number, height: number, scale?: number }` | undefined | A function which returns the `width`, `height`, and optionally `scale` (defaults `1`), with which canvas is to be exported. | -| maxWidthOrHeight | `number` | undefined | The maximum width or height of the exported image. If provided, `getDimensions` is ignored. | -| files | [BinaryFiles](The [`BinaryFiles`](<[BinaryFiles](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L64)>) | undefined | The files added to the scene. | -| exportPadding | number | 10 | The padding to be added on canvas | - -**How to use** - -```js -import { exportToCanvas } from "@excalidraw/excalidraw"; -``` - -This function returns the canvas with the exported elements, appState and dimensions. - -#### `exportToBlob` - -**_Signature_** - -
    -exportToBlob(
    -  opts: ExportOpts & {
    -  mimeType?: string,
    -  quality?: number,
    -  exportPadding?: number;
    -})
    -
    - -| Name | Type | Default | Description | -| --- | --- | --- | --- | -| opts | | | This param is passed to `exportToCanvas`. You can refer to [`exportToCanvas`](#exportToCanvas) | -| mimeType | string | "image/png" | Indicates the image format | -| quality | number | 0.92 | A value between 0 and 1 indicating the [image quality](https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob#parameters). Applies only to `image/jpeg`/`image/webp` MIME types. | -| exportPadding | number | 10 | The padding to be added on canvas | - -**How to use** - -```js -import { exportToBlob } from "@excalidraw/excalidraw"; -``` - -Returns a promise which resolves with a [blob](https://developer.mozilla.org/en-US/docs/Web/API/Blob). It internally uses [canvas.ToBlob](https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob). - -#### `exportToSvg` - -**_Signature_** - -
    -exportToSvg({
    -  elements: ExcalidrawElement[],
    -  appState: AppState,
    -  exportPadding?: number,
    -  metadata?: string,
    -  files?: BinaryFiles
    -})
    -
    - -| Name | Type | Default | Description | -| --- | --- | --- | --- | -| elements | [Excalidraw Element []](https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L106) | | The elements to exported as svg | -| appState | [AppState](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L79) | [defaultAppState](https://github.com/excalidraw/excalidraw/blob/master/src/appState.ts#L11) | The app state of the scene | -| exportPadding | number | 10 | The padding to be added on canvas | -| files | [BinaryFiles](The [`BinaryFiles`](<[BinaryFiles](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L64)>) | undefined | The files added to the scene. | - -This function returns a promise which resolves to svg of the exported drawing. - -#### `exportToClipboard` - -**_Signature_** - -
    -exportToClipboard(
    -  opts: ExportOpts & {
    -  mimeType?: string,
    -  quality?: number;
    -  type: 'png' | 'svg' |'json'
    -})
    -
    - -| Name | Type | Default | Description | -| --- | --- | --- | --- | --- | --- | -| opts | | | This param is same as the params passed to `exportToCanvas`. You can refer to [`exportToCanvas`](#exportToCanvas). | -| mimeType | string | "image/png" | Indicates the image format, this will be used when exporting as `png`. | -| quality | number | 0.92 | A value between 0 and 1 indicating the [image quality](https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob#parameters). Applies only to `image/jpeg`/`image/webp` MIME types. This will be used when exporting as `png`. | -| type | 'png' | 'svg' | 'json' | | This determines the format to which the scene data should be exported. | - -**How to use** - -```js -import { exportToClipboard } from "@excalidraw/excalidraw"; -``` - -Copies the scene data in the specified format (determined by `type`) to clipboard. - -##### Additional attributes of appState for `export\*` APIs - -| Name | Type | Default | Description | -| --- | --- | --- | --- | -| exportBackground | boolean | true | Indicates whether background should be exported | -| viewBackgroundColor | string | #fff | The default background color | -| exportWithDarkMode | boolean | false | Indicates whether to export with dark mode | -| exportEmbedScene | boolean | false | Indicates whether scene data should be embedded in svg/png. This will increase the image size. | - -### Extra API's - -#### `serializeAsJSON` - -**_Signature_** - -
    -serializeAsJSON({
    -  elements: ExcalidrawElement[],
    -  appState: AppState,
    -}): string
    -
    - -Takes the scene elements and state and returns a JSON string. Deleted `elements`as well as most properties from `AppState` are removed from the resulting JSON. (see [`serializeAsJSON()`](https://github.com/excalidraw/excalidraw/blob/master/src/data/json.ts#L16) source for details). - -If you want to overwrite the source field in the JSON string, you can set `window.EXCALIDRAW_EXPORT_SOURCE` to the desired value. - -#### `serializeLibraryAsJSON` - -**_Signature_** - -
    -serializeLibraryAsJSON({
    -  libraryItems: LibraryItems[],
    -
    - -Takes the library items and returns a JSON string. - -If you want to overwrite the source field in the JSON string, you can set `window.EXCALIDRAW_EXPORT_SOURCE` to the desired value. - -#### `getSceneVersion` - -**How to use** - -
    -import { getSceneVersion } from "@excalidraw/excalidraw";
    -getSceneVersion(elements:  ExcalidrawElement[])
    -
    - -This function returns the current scene version. - -#### `isInvisiblySmallElement` - -**_Signature_** - -
    -isInvisiblySmallElement(element:  ExcalidrawElement): boolean
    -
    - -**How to use** - -```js -import { isInvisiblySmallElement } from "@excalidraw/excalidraw"; -``` - -Returns `true` if element is invisibly small (e.g. width & height are zero). - -#### `loadLibraryFromBlob` - -```js -import { loadLibraryFromBlob } from "@excalidraw/excalidraw"; -``` - -**_Signature_** - -
    -loadLibraryFromBlob(blob: Blob, defaultStatus: "published" | "unpublished")
    -
    - -This function loads the library from the blob. Additonally takes `defaultStatus` param which sets the default status for library item if not present, defaults to `unpublished`. - -#### `loadFromBlob` - -**How to use** - -```js -import { loadFromBlob } from "@excalidraw/excalidraw"; - -const scene = await loadFromBlob(file, null, null); -excalidrawAPI.updateScene(scene); -``` - -**Signature** - -
    -loadFromBlob(
    -  blob: Blob,
    -  localAppState: AppState | null,
    -  localElements: ExcalidrawElement[] | null,
    -  fileHandle?: FileSystemHandle | null
    -) => Promise<RestoredDataState>
    -
    - -This function loads the scene data from the blob (or file). If you pass `localAppState`, `localAppState` value will be preferred over the `appState` derived from `blob`. Throws if blob doesn't contain valid scene data. - -#### `loadSceneOrLibraryFromBlob` - -**How to use** - -```js -import { loadSceneOrLibraryFromBlob, MIME_TYPES } from "@excalidraw/excalidraw"; - -const contents = await loadSceneOrLibraryFromBlob(file, null, null); -if (contents.type === MIME_TYPES.excalidraw) { - excalidrawAPI.updateScene(contents.data); -} else if (contents.type === MIME_TYPES.excalidrawlib) { - excalidrawAPI.updateLibrary(contents.data); -} -``` - -**Signature** - -
    -loadSceneOrLibraryFromBlob(
    -  blob: Blob,
    -  localAppState: AppState | null,
    -  localElements: ExcalidrawElement[] | null,
    -  fileHandle?: FileSystemHandle | null
    -) => Promise<{ type: string, data: RestoredDataState | ImportedLibraryState}>
    -
    - -This function loads either scene or library data from the supplied blob. If the blob contains scene data, and you pass `localAppState`, `localAppState` value will be preferred over the `appState` derived from `blob`. Throws if blob doesn't contain neither valid scene data or library data. - -#### `getFreeDrawSvgPath` - -**How to use** - -```js -import { getFreeDrawSvgPath } from "@excalidraw/excalidraw"; -``` - -**Signature** - -
    -getFreeDrawSvgPath(element: ExcalidrawFreeDrawElement
    -
    - -This function returns the free draw svg path for the element. - -#### `isLinearElement` - -**How to use** - -```js -import { isLinearElement } from "@excalidraw/excalidraw"; -``` - -**Signature** - -
    -isLinearElement(elementType?: ExcalidrawElement): boolean
    -
    - -This function returns true if the element is linear type (`arrow` |`line`) else returns false. - -#### `getNonDeletedElements` - -**How to use** - -```js -import { getNonDeletedElements } from "@excalidraw/excalidraw"; -``` - -**Signature** - -
    -getNonDeletedElements(elements:  readonly ExcalidrawElement[]): as readonly NonDeletedExcalidrawElement[]
    -
    - -This function returns an array of deleted elements. - -#### `mergeLibraryItems` - -```js -import { mergeLibraryItems } from "@excalidraw/excalidraw"; -``` - -**_Signature_** - -
    -mergeLibraryItems(localItems: LibraryItems, otherItems: LibraryItems) => LibraryItems
    -
    - -This function merges two `LibraryItems` arrays, where unique items from `otherItems` are sorted first in the returned array. - -#### `parseLibraryTokensFromUrl` - -**How to use** - -```js -import { parseLibraryTokensFromUrl } from "@excalidraw/excalidraw"; -``` - -**Signature** - -
    -parseLibraryTokensFromUrl(): {
    -    libraryUrl: string;
    -    idToken: string | null;
    -} | null
    -
    - -Parses library parameters from URL if present (expects the `#addLibrary` hash key), and returns an object with the `libraryUrl` and `idToken`. Returns `null` if `#addLibrary` hash key not found. - -#### `useHandleLibrary` - -**How to use** - -```js -import { useHandleLibrary } from "@excalidraw/excalidraw"; - -export const App = () => { - // ... - useHandleLibrary({ excalidrawAPI }); -}; -``` - -**Signature** - -
    -useHandleLibrary(opts: {
    -  excalidrawAPI: ExcalidrawAPI,
    -  getInitialLibraryItems?: () => LibraryItemsSource
    -});
    -
    - -A hook that automatically imports library from url if `#addLibrary` hash key exists on initial load, or when it changes during the editing session (e.g. when a user installs a new library), and handles initial library load if `getInitialLibraryItems` getter is supplied. - -In the future, we will be adding support for handling library persistence to browser storage (or elsewhere). - -#### `sceneCoordsToViewportCoords` - -```js -import { sceneCoordsToViewportCoords } from "@excalidraw/excalidraw"; -``` - -**_Signature_** - -
    -sceneCoordsToViewportCoords({sceneX: number, sceneY: number}, appState: AppState): {x: number, y: number}
    -
    - -This function returns equivalent viewport coords for the provided scene coords in params. - -#### `viewportCoordsToSceneCoords` - -```js -import { viewportCoordsToSceneCoords } from "@excalidraw/excalidraw"; -``` - -**_Signature_** - -
    -viewportCoordsToSceneCoords({clientX: number, clientY: number}, appState: AppState): {x: number, y: number}
    -
    - -This function returns equivalent scene coords for the provided viewport coords in params. - -### Exported constants - -#### `FONT_FAMILY` - -**How to use** - -```js -import { FONT_FAMILY } from "@excalidraw/excalidraw"; -``` - -`FONT_FAMILY` contains all the font families used in `Excalidraw` as explained below - -| Font Family | Description | -| ----------- | -------------------- | -| Virgil | The handwritten font | -| Helvetica | The Normal Font | -| Cascadia | The Code Font | - -Defaults to `FONT_FAMILY.Virgil` unless passed in `initialData.appState.currentItemFontFamily`. - -#### `THEME` - -**How to use** - -```js -import { THEME } from "@excalidraw/excalidraw"; -``` - -`THEME` contains all the themes supported by `Excalidraw` as explained below - -| Theme | Description | -| ----- | --------------- | -| LIGHT | The light theme | -| DARK | The Dark theme | - -Defaults to `THEME.LIGHT` unless passed in `initialData.appState.theme` - -### `MIME_TYPES` - -**How to use ** - -```js -import { MIME_TYPES } from "@excalidraw/excalidraw"; -``` - -[`MIME_TYPES`](https://github.com/excalidraw/excalidraw/blob/master/src/constants.ts#L92) contains all the mime types supported by `Excalidraw`. - -## Need help? - -Check out the existing [Q&A](https://github.com/excalidraw/excalidraw/discussions?discussions_q=label%3Apackage%3Aexcalidraw). If you have any queries or need help, ask us [here](https://github.com/excalidraw/excalidraw/discussions?discussions_q=label%3Apackage%3Aexcalidraw). - -### Development - -#### Install the dependencies - -```bash -yarn -``` - -#### Start the server - -```bash -yarn start -``` - -[http://localhost:3001](http://localhost:3001) will open in your default browser. - -The example is same as the [codesandbox example](https://ehlz3.csb.app/) - -#### Create a test release - -You can create a test release by posting the below comment in your pull request - -``` -@excalibot trigger release -``` - -Once the version is released `@excalibot` will post a comment with the release version. - -#### Creating a production release - -To release the next stable version follow the below steps - -``` -yarn prerelease version -``` - -You need to pass the `version` for which you want to create the release. This will make the changes needed before making the release like updating `package.json`, `changelog` and more. - -The next step is to run the `release` script - -``` -yarn release -``` - -This will publish the package. - -Right now there are two steps to create a production release but once this works fine these scripts will be combined and more automation will be done. +Head over to the [docs](https://docs.excalidraw.com/docs/package/api) diff --git a/src/packages/excalidraw/example/App.scss b/src/packages/excalidraw/example/App.scss index 6115eef86..7f37540d8 100644 --- a/src/packages/excalidraw/example/App.scss +++ b/src/packages/excalidraw/example/App.scss @@ -66,10 +66,18 @@ button.custom-element { width: 2rem; height: 2rem; - margin: 0.4rem; - margin-left: -10px; } - .layer-ui__wrapper__footer-center { - display: flex; + + .custom-footer, + .custom-element { + padding: 0.1rem; + margin: 0 8px; + } + .layer-ui__wrapper__footer.App-menu_bottom { + align-items: stretch; + } + // till its merged in OSS + .App-toolbar-container .mobile-misc-tools-container { + position: absolute; } } diff --git a/src/packages/excalidraw/example/App.tsx b/src/packages/excalidraw/example/App.tsx index ee555f37d..1f4a6c7fd 100644 --- a/src/packages/excalidraw/example/App.tsx +++ b/src/packages/excalidraw/example/App.tsx @@ -13,7 +13,7 @@ import { withBatchedUpdates, withBatchedUpdatesThrottled, } from "../../../utils"; -import { EVENT } from "../../../constants"; +import { EVENT, ROUNDNESS } from "../../../constants"; import { distance2d } from "../../../math"; import { fileOpen } from "../../../data/filesystem"; import { loadSceneOrLibraryFromBlob } from "../../utils"; @@ -28,6 +28,8 @@ import { } from "../../../types"; import { NonDeletedExcalidrawElement } from "../../../element/types"; import { ImportedLibraryData } from "../../../data/types"; +import CustomFooter from "./CustomFooter"; +import MobileFooter from "./MobileFooter"; declare global { interface Window { @@ -68,41 +70,23 @@ const { viewportCoordsToSceneCoords, restoreElements, Sidebar, + Footer, + WelcomeScreen, + MainMenu, + LiveCollaborationTrigger, } = window.ExcalidrawLib; -const COMMENT_SVG = ( - - - -); const COMMENT_ICON_DIMENSION = 32; const COMMENT_INPUT_HEIGHT = 50; const COMMENT_INPUT_WIDTH = 150; -const renderTopRightUI = () => { - return ( - - ); -}; +export interface AppProps { + appTitle: string; + useCustom: (api: ExcalidrawImperativeAPI | null, customArgs?: any[]) => void; + customArgs?: any[]; +} -export default function App() { +export default function App({ appTitle, useCustom, customArgs }: AppProps) { const appRef = useRef(null); const [viewModeEnabled, setViewModeEnabled] = useState(false); const [zenModeEnabled, setZenModeEnabled] = useState(false); @@ -129,6 +113,8 @@ export default function App() { const [excalidrawAPI, setExcalidrawAPI] = useState(null); + useCustom(excalidrawAPI, customArgs); + useHandleLibrary({ excalidrawAPI }); useEffect(() => { @@ -136,7 +122,7 @@ export default function App() { return; } const fetchData = async () => { - const res = await fetch("/rocket.jpeg"); + const res = await fetch("/images/rocket.jpeg"); const imageData = await res.blob(); const reader = new FileReader(); reader.readAsDataURL(imageData); @@ -160,41 +146,23 @@ export default function App() { fetchData(); }, [excalidrawAPI]); - const renderFooter = () => { + const renderTopRightUI = (isMobile: boolean) => { return ( <> - {" "} + {!isMobile && ( + { + window.alert("Collab dialog clicked"); + }} + /> + )} - ); @@ -241,7 +209,10 @@ export default function App() { locked: false, link: null, updated: 1, - strokeSharpness: "round", + roundness: { + type: ROUNDNESS.ADAPTIVE_RADIUS, + value: 32, + }, }, ], null, @@ -379,6 +350,7 @@ export default function App() { } }); }; + const renderCommentIcons = () => { return Object.values(commentIcons).map((commentIcon) => { if (!excalidrawAPI) { @@ -433,7 +405,7 @@ export default function App() { }} >
    - doremon + doremon
    ); @@ -531,9 +503,37 @@ export default function App() { ); }; + const renderMenu = () => { + return ( + + + + + window.alert("You clicked on collab button")} + /> + + + + + + + + + + {excalidrawAPI && } + + ); + }; return (
    -

    Excalidraw Example

    +

    {appTitle}

    @@ -619,15 +619,15 @@ export default function App() { const collaborators = new Map(); collaborators.set("id1", { username: "Doremon", - avatarUrl: "doremon.png", + avatarUrl: "images/doremon.png", }); collaborators.set("id2", { username: "Excalibot", - avatarUrl: "excalibot.png", + avatarUrl: "images/excalibot.png", }); collaborators.set("id3", { username: "Pika", - avatarUrl: "pika.jpeg", + avatarUrl: "images/pika.jpeg", }); collaborators.set("id4", { username: "fallback", @@ -696,9 +696,6 @@ export default function App() { button: "down" | "up"; pointersMap: Gesture["pointers"]; }) => setPointerData(payload)} - onCollabButtonClick={() => - window.alert("You clicked on collab button") - } viewModeEnabled={viewModeEnabled} zenModeEnabled={zenModeEnabled} gridModeEnabled={gridModeEnabled} @@ -706,12 +703,19 @@ export default function App() { name="Custom name of drawing" UIOptions={{ canvasActions: { loadScene: false } }} renderTopRightUI={renderTopRightUI} - renderFooter={renderFooter} onLinkOpen={onLinkOpen} onPointerDown={onPointerDown} onScrollChange={rerenderCommentIcons} renderSidebar={renderSidebar} - /> + > + {excalidrawAPI && ( +
    + +
    + )} + + {renderMenu()} + {Object.keys(commentIcons || []).length > 0 && renderCommentIcons()} {comment && renderComment()}
    diff --git a/src/packages/excalidraw/example/CustomFooter.tsx b/src/packages/excalidraw/example/CustomFooter.tsx new file mode 100644 index 000000000..fbc2ea732 --- /dev/null +++ b/src/packages/excalidraw/example/CustomFooter.tsx @@ -0,0 +1,75 @@ +import { ExcalidrawImperativeAPI } from "../../../types"; +import { MIME_TYPES } from "../entry"; +import { Button } from "../../../components/Button"; + +const COMMENT_SVG = ( + + + +); +const CustomFooter = ({ + excalidrawAPI, +}: { + excalidrawAPI: ExcalidrawImperativeAPI; +}) => { + return ( + <> + + + + + ); +}; + +export default CustomFooter; diff --git a/src/packages/excalidraw/example/MobileFooter.tsx b/src/packages/excalidraw/example/MobileFooter.tsx new file mode 100644 index 000000000..004c78bbc --- /dev/null +++ b/src/packages/excalidraw/example/MobileFooter.tsx @@ -0,0 +1,20 @@ +import { ExcalidrawImperativeAPI } from "../../../types"; +import CustomFooter from "./CustomFooter"; +const { useDevice, Footer } = window.ExcalidrawLib; + +const MobileFooter = ({ + excalidrawAPI, +}: { + excalidrawAPI: ExcalidrawImperativeAPI; +}) => { + const device = useDevice(); + if (device.isMobile) { + return ( +
    + +
    + ); + } + return null; +}; +export default MobileFooter; diff --git a/src/packages/excalidraw/example/index.tsx b/src/packages/excalidraw/example/index.tsx index 825a1016e..0f3bad30f 100644 --- a/src/packages/excalidraw/example/index.tsx +++ b/src/packages/excalidraw/example/index.tsx @@ -8,6 +8,9 @@ const root = createRoot(rootElement); root.render( - + {}} + /> , ); diff --git a/src/packages/excalidraw/example/public/images/doremon.png b/src/packages/excalidraw/example/public/images/doremon.png new file mode 100644 index 0000000000000000000000000000000000000000..36208a4665fb89e44247292e92a1143a52cdf38c GIT binary patch literal 201946 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

    >rqP?iYp>X2@Ky7x^}8x-)S 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

    O1!W$4;+)P9SasnI-`V8^ZFleat5n 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­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�?qd(5Hh*uAIxK&qTYu3V< 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 PfG>3wZRJu$%i#Y78=43z literal 0 HcmV?d00001 diff --git a/src/packages/excalidraw/example/public/excalibot.png b/src/packages/excalidraw/example/public/images/excalibot.png similarity index 100% rename from src/packages/excalidraw/example/public/excalibot.png rename to src/packages/excalidraw/example/public/images/excalibot.png diff --git a/src/packages/excalidraw/example/public/images/pika.jpeg b/src/packages/excalidraw/example/public/images/pika.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..455ed52a638a0b060fba54892835e8923d671bfd GIT binary patch literal 6250 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 Vod0WA{QK4aPuTdMX5h>5{{x3Dqs0IK literal 0 HcmV?d00001 diff --git a/src/packages/excalidraw/example/public/rocket.jpeg b/src/packages/excalidraw/example/public/images/rocket.jpeg similarity index 100% rename from src/packages/excalidraw/example/public/rocket.jpeg rename to src/packages/excalidraw/example/public/images/rocket.jpeg diff --git a/src/packages/excalidraw/example/sidebar/ExampleSidebar.tsx b/src/packages/excalidraw/example/sidebar/ExampleSidebar.tsx index 0fa5bf4e0..793d17b05 100644 --- a/src/packages/excalidraw/example/sidebar/ExampleSidebar.tsx +++ b/src/packages/excalidraw/example/sidebar/ExampleSidebar.tsx @@ -10,8 +10,8 @@ export default function Sidebar({ children }: { children: React.ReactNode }) { x

    diff --git a/src/packages/excalidraw/index.tsx b/src/packages/excalidraw/index.tsx index 4ac071592..4f768c6d5 100644 --- a/src/packages/excalidraw/index.tsx +++ b/src/packages/excalidraw/index.tsx @@ -1,6 +1,7 @@ import React, { useEffect, forwardRef } from "react"; import { InitializeApp } from "../../components/InitializeApp"; import App from "../../components/App"; +import { isShallowEqual } from "../../utils"; import "../../css/app.scss"; import "../../css/styles.scss"; @@ -10,17 +11,19 @@ import { defaultLang } from "../../i18n"; import { DEFAULT_UI_OPTIONS } from "../../constants"; import { Provider } from "jotai"; import { jotaiScope, jotaiStore } from "../../jotai"; +import Footer from "../../components/footer/FooterCenter"; +import MainMenu from "../../components/main-menu/MainMenu"; +import WelcomeScreen from "../../components/welcome-screen/WelcomeScreen"; +import LiveCollaborationTrigger from "../../components/live-collaboration/LiveCollaborationTrigger"; const ExcalidrawBase = (props: ExcalidrawProps) => { const { onChange, initialData, excalidrawRef, - onCollabButtonClick, isCollaborating = false, onPointerUpdate, renderTopRightUI, - renderFooter, renderSidebar, langCode = defaultLang.code, viewModeEnabled, @@ -39,6 +42,7 @@ const ExcalidrawBase = (props: ExcalidrawProps) => { onLinkOpen, onPointerDown, onScrollChange, + children, } = props; const canvasActions = props.UIOptions?.canvasActions; @@ -83,17 +87,15 @@ const ExcalidrawBase = (props: ExcalidrawProps) => { }, []); return ( - - jotaiStore} scope={jotaiScope}> + jotaiStore} scope={jotaiScope}> + { onPointerDown={onPointerDown} onScrollChange={onScrollChange} renderSidebar={renderSidebar} - /> - - + > + {children} + + + ); }; @@ -125,6 +129,11 @@ const areEqual = ( prevProps: PublicExcalidrawProps, nextProps: PublicExcalidrawProps, ) => { + // short-circuit early + if (prevProps.children !== nextProps.children) { + return false; + } + const { initialData: prevInitialData, UIOptions: prevUIOptions = {}, @@ -153,7 +162,7 @@ const areEqual = ( const canvasOptionKeys = Object.keys( prevUIOptions.canvasActions!, ) as (keyof Partial)[]; - canvasOptionKeys.every((key) => { + return canvasOptionKeys.every((key) => { if ( key === "export" && prevUIOptions?.canvasActions?.export && @@ -170,16 +179,10 @@ const areEqual = ( ); }); } - return true; + return prevUIOptions[key] === nextUIOptions[key]; }); - const prevKeys = Object.keys(prevProps) as (keyof typeof prev)[]; - const nextKeys = Object.keys(nextProps) as (keyof typeof next)[]; - return ( - isUIOptionsSame && - prevKeys.length === nextKeys.length && - prevKeys.every((key) => prev[key] === next[key]) - ); + return isUIOptionsSame && isShallowEqual(prev, next); }; const forwardedRefComp = forwardRef< @@ -195,7 +198,7 @@ export { isInvisiblySmallElement, getNonDeletedElements, } from "../../element"; -export { defaultLang, languages } from "../../i18n"; +export { defaultLang, useI18n, languages } from "../../i18n"; export { restore, restoreAppState, @@ -236,3 +239,9 @@ export { } from "../../utils"; export { Sidebar } from "../../components/Sidebar/Sidebar"; +export { Button } from "../../components/Button"; +export { Footer }; +export { MainMenu }; +export { useDevice } from "../../components/App"; +export { WelcomeScreen }; +export { LiveCollaborationTrigger }; diff --git a/src/packages/excalidraw/package.json b/src/packages/excalidraw/package.json index b830dc619..a23a3b1e8 100644 --- a/src/packages/excalidraw/package.json +++ b/src/packages/excalidraw/package.json @@ -1,6 +1,6 @@ { "name": "@excalidraw/excalidraw", - "version": "0.13.0", + "version": "0.14.2", "main": "main.js", "types": "types/packages/excalidraw/index.d.ts", "files": [ diff --git a/src/packages/excalidraw/yarn.lock b/src/packages/excalidraw/yarn.lock index ecd10278f..09838174b 100644 --- a/src/packages/excalidraw/yarn.lock +++ b/src/packages/excalidraw/yarn.lock @@ -2672,9 +2672,9 @@ json-schema-traverse@^1.0.0: integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== json5@^2.1.2, json5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== kind-of@^6.0.2: version "6.0.3" @@ -2697,9 +2697,9 @@ loader-runner@^4.2.0: integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== loader-utils@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.3.tgz#d4b15b8504c63d1fc3f2ade52d41bc8459d6ede1" - integrity sha512-THWqIsn8QRnvLl0shHYVBN9syumU8pYWEHPTmkiVGd+7K5eFNVSY6AJhRvgGF70gg1Dz+l/k8WicvFCxdEs60A== + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" diff --git a/src/packages/utils/README.md b/src/packages/utils/README.md index e9d53a52f..a6e4eabc2 100644 --- a/src/packages/utils/README.md +++ b/src/packages/utils/README.md @@ -28,7 +28,7 @@ Export an Excalidraw diagram to a [SVGElement](https://developer.mozilla.org/en- ## Usage -Excalidraw utils is published as a UMD (Universal Module Definition). If you are using a Web bundler (for instance, Webpack), you can import it as an ES6 module: +Excalidraw utils is published as a UMD (Universal Module Definition). If you are using a module bundler (for instance, Webpack), you can import it as an ES6 module: ```js import { exportToSvg, exportToBlob } from "@excalidraw/utils"; @@ -68,7 +68,7 @@ const excalidrawDiagram = { roughness: 1, opacity: 100, groupIds: [], - strokeSharpness: "sharp", + roundness: null, seed: 1041657908, version: 120, versionNonce: 1188004276, diff --git a/src/packages/utils/yarn.lock b/src/packages/utils/yarn.lock index fd2043a0f..483399b2f 100644 --- a/src/packages/utils/yarn.lock +++ b/src/packages/utils/yarn.lock @@ -1895,9 +1895,9 @@ json-schema-traverse@^0.4.1: integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json5@^2.1.2, json5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== kind-of@^6.0.2: version "6.0.3" diff --git a/src/points.ts b/src/points.ts index 641a332de..84aea9277 100644 --- a/src/points.ts +++ b/src/points.ts @@ -51,6 +51,5 @@ export const rescalePoints = ( return currentDimension === dimension ? value + translation : value; }) as [number, number], ); - return nextPoints; }; diff --git a/src/renderer/renderElement.ts b/src/renderer/renderElement.ts index df88cdb70..755a45327 100644 --- a/src/renderer/renderElement.ts +++ b/src/renderer/renderElement.ts @@ -6,12 +6,14 @@ import { NonDeletedExcalidrawElement, ExcalidrawFreeDrawElement, ExcalidrawImageElement, + ExcalidrawTextElementWithContainer, } from "../element/types"; import { isTextElement, isLinearElement, isFreeDrawElement, isInitializedImageElement, + isArrowElement, } from "../element/typeChecks"; import { getDiamondPoints, @@ -25,7 +27,7 @@ import { RoughGenerator } from "roughjs/bin/generator"; import { RenderConfig } from "../scene/types"; import { distance, getFontString, getFontFamilyString, isRTL } from "../utils"; -import { isPathALoop } from "../math"; +import { getCornerRadius, isPathALoop, isRightAngle } from "../math"; import rough from "roughjs/bin/rough"; import { AppState, BinaryFiles, Zoom } from "../types"; import { getDefaultAppState } from "../appState"; @@ -34,10 +36,14 @@ import { MAX_DECIMALS_FOR_SVG_EXPORT, MIME_TYPES, SVG_NS, - VERTICAL_ALIGN, } from "../constants"; import { getStroke, StrokeOptions } from "perfect-freehand"; -import { getApproxLineHeight } from "../element/textElement"; +import { + getApproxLineHeight, + getBoundTextElement, + getContainerElement, +} from "../element/textElement"; +import { LinearElementEditor } from "../element/linearElementEditor"; // using a stronger invert (100% vs our regular 93%) and saturate // as a temp hack to make images in dark theme look closer to original @@ -80,6 +86,7 @@ export interface ExcalidrawElementWithCanvas { canvasZoom: Zoom["value"]; canvasOffsetX: number; canvasOffsetY: number; + boundTextElementVersion: number | null; } const generateElementCanvas = ( @@ -148,6 +155,7 @@ const generateElementCanvas = ( canvasZoom: zoom.value, canvasOffsetX, canvasOffsetY, + boundTextElementVersion: getBoundTextElement(element)?.version || null, }; }; @@ -270,22 +278,19 @@ const drawElementOnCanvas = ( const lineHeight = element.containerId ? getApproxLineHeight(getFontString(element)) : element.height / lines.length; - let verticalOffset = element.height - element.baseline; - if (element.verticalAlign === VERTICAL_ALIGN.BOTTOM) { - verticalOffset = BOUND_TEXT_PADDING; - } - const horizontalOffset = element.textAlign === "center" ? element.width / 2 : element.textAlign === "right" ? element.width : 0; + context.textBaseline = "bottom"; + for (let index = 0; index < lines.length; index++) { context.fillText( lines[index], horizontalOffset, - (index + 1) * lineHeight - verticalOffset, + (index + 1) * lineHeight, ); } context.restore(); @@ -414,10 +419,10 @@ const generateElementShape = ( switch (element.type) { case "rectangle": - if (element.strokeSharpness === "round") { + if (element.roundness) { const w = element.width; const h = element.height; - const r = Math.min(w, h) * 0.25; + const r = getCornerRadius(Math.min(w, h), element); shape = generator.path( `M ${r} 0 L ${w - r} 0 Q ${w} 0, ${w} ${r} L ${w} ${ h - r @@ -441,32 +446,36 @@ const generateElementShape = ( case "diamond": { const [topX, topY, rightX, rightY, bottomX, bottomY, leftX, leftY] = getDiamondPoints(element); - if (element.strokeSharpness === "round") { + if (element.roundness) { + const verticalRadius = getCornerRadius( + Math.abs(topX - leftX), + element, + ); + + const horizontalRadius = getCornerRadius( + Math.abs(rightY - topY), + element, + ); + shape = generator.path( - `M ${topX + (rightX - topX) * 0.25} ${ - topY + (rightY - topY) * 0.25 - } L ${rightX - (rightX - topX) * 0.25} ${ - rightY - (rightY - topY) * 0.25 - } + `M ${topX + verticalRadius} ${topY + horizontalRadius} L ${ + rightX - verticalRadius + } ${rightY - horizontalRadius} C ${rightX} ${rightY}, ${rightX} ${rightY}, ${ - rightX - (rightX - bottomX) * 0.25 - } ${rightY + (bottomY - rightY) * 0.25} - L ${bottomX + (rightX - bottomX) * 0.25} ${ - bottomY - (bottomY - rightY) * 0.25 - } + rightX - verticalRadius + } ${rightY + horizontalRadius} + L ${bottomX + verticalRadius} ${bottomY - horizontalRadius} C ${bottomX} ${bottomY}, ${bottomX} ${bottomY}, ${ - bottomX - (bottomX - leftX) * 0.25 - } ${bottomY - (bottomY - leftY) * 0.25} - L ${leftX + (bottomX - leftX) * 0.25} ${ - leftY + (bottomY - leftY) * 0.25 + bottomX - verticalRadius + } ${bottomY - horizontalRadius} + L ${leftX + verticalRadius} ${leftY + horizontalRadius} + C ${leftX} ${leftY}, ${leftX} ${leftY}, ${leftX + verticalRadius} ${ + leftY - horizontalRadius } - C ${leftX} ${leftY}, ${leftX} ${leftY}, ${ - leftX + (topX - leftX) * 0.25 - } ${leftY - (leftY - topY) * 0.25} - L ${topX - (topX - leftX) * 0.25} ${topY + (leftY - topY) * 0.25} - C ${topX} ${topY}, ${topX} ${topY}, ${ - topX + (rightX - topX) * 0.25 - } ${topY + (rightY - topY) * 0.25}`, + L ${topX - verticalRadius} ${topY + horizontalRadius} + C ${topX} ${topY}, ${topX} ${topY}, ${topX + verticalRadius} ${ + topY + horizontalRadius + }`, generateRoughOptions(element, true), ); } else { @@ -505,7 +514,7 @@ const generateElementShape = ( // curve is always the first element // this simplifies finding the curve for an element - if (element.strokeSharpness === "sharp") { + if (!element.roundness) { if (options.fill) { shape = [generator.polygon(points as [number, number][], options)]; } else { @@ -656,11 +665,13 @@ const generateElementWithCanvas = ( prevElementWithCanvas && prevElementWithCanvas.canvasZoom !== zoom.value && !renderConfig?.shouldCacheIgnoreZoom; + const boundTextElementVersion = getBoundTextElement(element)?.version || null; if ( !prevElementWithCanvas || shouldRegenerateBecauseZoom || - prevElementWithCanvas.theme !== renderConfig.theme + prevElementWithCanvas.theme !== renderConfig.theme || + prevElementWithCanvas.boundTextElementVersion !== boundTextElementVersion ) { const elementWithCanvas = generateElementCanvas( element, @@ -683,6 +694,7 @@ const drawElementFromCanvas = ( ) => { const element = elementWithCanvas.element; const padding = getCanvasPadding(element); + const zoom = elementWithCanvas.canvasZoom; let [x1, y1, x2, y2] = getElementAbsoluteCoords(element); // Free draw elements will otherwise "shuffle" as the min x and y change @@ -696,34 +708,110 @@ const drawElementFromCanvas = ( const cx = ((x1 + x2) / 2 + renderConfig.scrollX) * window.devicePixelRatio; const cy = ((y1 + y2) / 2 + renderConfig.scrollY) * window.devicePixelRatio; - const _isPendingImageElement = isPendingImageElement(element, renderConfig); - - const scaleXFactor = - "scale" in elementWithCanvas.element && !_isPendingImageElement - ? elementWithCanvas.element.scale[0] - : 1; - const scaleYFactor = - "scale" in elementWithCanvas.element && !_isPendingImageElement - ? elementWithCanvas.element.scale[1] - : 1; - context.save(); - context.scale( - (1 / window.devicePixelRatio) * scaleXFactor, - (1 / window.devicePixelRatio) * scaleYFactor, - ); - context.translate(cx * scaleXFactor, cy * scaleYFactor); - context.rotate(element.angle * scaleXFactor * scaleYFactor); + context.scale(1 / window.devicePixelRatio, 1 / window.devicePixelRatio); + const boundTextElement = getBoundTextElement(element); - context.drawImage( - elementWithCanvas.canvas!, - (-(x2 - x1) / 2) * window.devicePixelRatio - - (padding * elementWithCanvas.canvasZoom) / elementWithCanvas.canvasZoom, - (-(y2 - y1) / 2) * window.devicePixelRatio - - (padding * elementWithCanvas.canvasZoom) / elementWithCanvas.canvasZoom, - elementWithCanvas.canvas!.width / elementWithCanvas.canvasZoom, - elementWithCanvas.canvas!.height / elementWithCanvas.canvasZoom, - ); + if (isArrowElement(element) && boundTextElement) { + const tempCanvas = document.createElement("canvas"); + const tempCanvasContext = tempCanvas.getContext("2d")!; + + // Take max dimensions of arrow canvas so that when canvas is rotated + // the arrow doesn't get clipped + const maxDim = Math.max(distance(x1, x2), distance(y1, y2)); + tempCanvas.width = + maxDim * window.devicePixelRatio * zoom + + padding * elementWithCanvas.canvasZoom * 10; + tempCanvas.height = + maxDim * window.devicePixelRatio * zoom + + padding * elementWithCanvas.canvasZoom * 10; + const offsetX = (tempCanvas.width - elementWithCanvas.canvas!.width) / 2; + const offsetY = (tempCanvas.height - elementWithCanvas.canvas!.height) / 2; + + tempCanvasContext.translate(tempCanvas.width / 2, tempCanvas.height / 2); + tempCanvasContext.rotate(element.angle); + + tempCanvasContext.drawImage( + elementWithCanvas.canvas!, + -elementWithCanvas.canvas.width / 2, + -elementWithCanvas.canvas.height / 2, + elementWithCanvas.canvas.width, + elementWithCanvas.canvas.height, + ); + + const [, , , , boundTextCx, boundTextCy] = + getElementAbsoluteCoords(boundTextElement); + + tempCanvasContext.rotate(-element.angle); + + // Shift the canvas to the center of the bound text element + const shiftX = + tempCanvas.width / 2 - + (boundTextCx - x1) * window.devicePixelRatio * zoom - + offsetX - + padding * zoom; + + const shiftY = + tempCanvas.height / 2 - + (boundTextCy - y1) * window.devicePixelRatio * zoom - + offsetY - + padding * zoom; + tempCanvasContext.translate(-shiftX, -shiftY); + + // Clear the bound text area + tempCanvasContext.clearRect( + -(boundTextElement.width / 2 + BOUND_TEXT_PADDING) * + window.devicePixelRatio * + zoom, + -(boundTextElement.height / 2 + BOUND_TEXT_PADDING) * + window.devicePixelRatio * + zoom, + (boundTextElement.width + BOUND_TEXT_PADDING * 2) * + window.devicePixelRatio * + zoom, + (boundTextElement.height + BOUND_TEXT_PADDING * 2) * + window.devicePixelRatio * + zoom, + ); + + context.translate(cx, cy); + context.drawImage( + tempCanvas, + (-(x2 - x1) / 2) * window.devicePixelRatio - offsetX / zoom - padding, + (-(y2 - y1) / 2) * window.devicePixelRatio - offsetY / zoom - padding, + tempCanvas.width / zoom, + tempCanvas.height / zoom, + ); + } else { + // we translate context to element center so that rotation and scale + // originates from the element center + context.translate(cx, cy); + + context.rotate(element.angle); + + if ( + "scale" in elementWithCanvas.element && + !isPendingImageElement(element, renderConfig) + ) { + context.scale( + elementWithCanvas.element.scale[0], + elementWithCanvas.element.scale[1], + ); + } + + // revert afterwards we don't have account for it during drawing + context.translate(-cx, -cy); + + context.drawImage( + elementWithCanvas.canvas!, + (x1 + renderConfig.scrollX) * window.devicePixelRatio - + (padding * elementWithCanvas.canvasZoom) / elementWithCanvas.canvasZoom, + (y1 + renderConfig.scrollY) * window.devicePixelRatio - + (padding * elementWithCanvas.canvasZoom) / elementWithCanvas.canvasZoom, + elementWithCanvas.canvas!.width / elementWithCanvas.canvasZoom, + elementWithCanvas.canvas!.height / elementWithCanvas.canvasZoom, + ); + } context.restore(); // Clear the nested element we appended to the DOM @@ -734,6 +822,7 @@ export const renderElement = ( rc: RoughCanvas, context: CanvasRenderingContext2D, renderConfig: RenderConfig, + appState: AppState, ) => { const generator = rc.generator; switch (element.type) { @@ -796,21 +885,97 @@ export const renderElement = ( const [x1, y1, x2, y2] = getElementAbsoluteCoords(element); const cx = (x1 + x2) / 2 + renderConfig.scrollX; const cy = (y1 + y2) / 2 + renderConfig.scrollY; - const shiftX = (x2 - x1) / 2 - (element.x - x1); - const shiftY = (y2 - y1) / 2 - (element.y - y1); + let shiftX = (x2 - x1) / 2 - (element.x - x1); + let shiftY = (y2 - y1) / 2 - (element.y - y1); + if (isTextElement(element)) { + const container = getContainerElement(element); + if (isArrowElement(container)) { + const boundTextCoords = + LinearElementEditor.getBoundTextElementPosition( + container, + element as ExcalidrawTextElementWithContainer, + ); + shiftX = (x2 - x1) / 2 - (boundTextCoords.x - x1); + shiftY = (y2 - y1) / 2 - (boundTextCoords.y - y1); + } + } context.save(); context.translate(cx, cy); - context.rotate(element.angle); - if (element.type === "image") { - context.scale(element.scale[0], element.scale[1]); - } - context.translate(-shiftX, -shiftY); if (shouldResetImageFilter(element, renderConfig)) { context.filter = "none"; } + const boundTextElement = getBoundTextElement(element); + + if (isArrowElement(element) && boundTextElement) { + const tempCanvas = document.createElement("canvas"); + + const tempCanvasContext = tempCanvas.getContext("2d")!; + + // Take max dimensions of arrow canvas so that when canvas is rotated + // the arrow doesn't get clipped + const maxDim = Math.max(distance(x1, x2), distance(y1, y2)); + const padding = getCanvasPadding(element); + tempCanvas.width = + maxDim * appState.exportScale + padding * 10 * appState.exportScale; + tempCanvas.height = + maxDim * appState.exportScale + padding * 10 * appState.exportScale; + + tempCanvasContext.translate( + tempCanvas.width / 2, + tempCanvas.height / 2, + ); + tempCanvasContext.scale(appState.exportScale, appState.exportScale); + + // Shift the canvas to left most point of the arrow + shiftX = element.width / 2 - (element.x - x1); + shiftY = element.height / 2 - (element.y - y1); + + tempCanvasContext.rotate(element.angle); + const tempRc = rough.canvas(tempCanvas); + + tempCanvasContext.translate(-shiftX, -shiftY); + + drawElementOnCanvas(element, tempRc, tempCanvasContext, renderConfig); + + tempCanvasContext.translate(shiftX, shiftY); + + tempCanvasContext.rotate(-element.angle); + + // Shift the canvas to center of bound text + const [, , , , boundTextCx, boundTextCy] = + getElementAbsoluteCoords(boundTextElement); + const boundTextShiftX = (x1 + x2) / 2 - boundTextCx; + const boundTextShiftY = (y1 + y2) / 2 - boundTextCy; + tempCanvasContext.translate(-boundTextShiftX, -boundTextShiftY); + + // Clear the bound text area + tempCanvasContext.clearRect( + -boundTextElement.width / 2, + -boundTextElement.height / 2, + boundTextElement.width, + boundTextElement.height, + ); + context.scale(1 / appState.exportScale, 1 / appState.exportScale); + context.drawImage( + tempCanvas, + -tempCanvas.width / 2, + -tempCanvas.height / 2, + tempCanvas.width, + tempCanvas.height, + ); + } else { + context.rotate(element.angle); + + if (element.type === "image") { + // note: scale must be applied *after* rotating + context.scale(element.scale[0], element.scale[1]); + } + + context.translate(-shiftX, -shiftY); + drawElementOnCanvas(element, rc, context, renderConfig); + } - drawElementOnCanvas(element, rc, context, renderConfig); context.restore(); // not exporting → optimized rendering (cache & render from element // canvases) @@ -819,7 +984,33 @@ export const renderElement = ( element, renderConfig, ); + + const currentImageSmoothingStatus = context.imageSmoothingEnabled; + + if ( + // do not disable smoothing during zoom as blurry shapes look better + // on low resolution (while still zooming in) than sharp ones + !renderConfig?.shouldCacheIgnoreZoom && + // angle is 0 -> always disable smoothing + (!element.angle || + // or check if angle is a right angle in which case we can still + // disable smoothing without adversely affecting the result + isRightAngle(element.angle)) + ) { + // Disabling smoothing makes output much sharper, especially for + // text. Unless for non-right angles, where the aliasing is really + // terrible on Chromium. + // + // Note that `context.imageSmoothingQuality="high"` has almost + // zero effect. + // + context.imageSmoothingEnabled = false; + } + drawElementFromCanvas(elementWithCanvas, rc, context, renderConfig); + + // reset + context.imageSmoothingEnabled = currentImageSmoothingStatus; } break; } @@ -851,13 +1042,28 @@ export const renderElementToSvg = ( rsvg: RoughSVG, svgRoot: SVGElement, files: BinaryFiles, - offsetX?: number, - offsetY?: number, + offsetX: number, + offsetY: number, exportWithDarkMode?: boolean, ) => { const [x1, y1, x2, y2] = getElementAbsoluteCoords(element); - const cx = (x2 - x1) / 2 - (element.x - x1); - const cy = (y2 - y1) / 2 - (element.y - y1); + let cx = (x2 - x1) / 2 - (element.x - x1); + let cy = (y2 - y1) / 2 - (element.y - y1); + if (isTextElement(element)) { + const container = getContainerElement(element); + if (isArrowElement(container)) { + const [x1, y1, x2, y2] = getElementAbsoluteCoords(container); + + const boundTextCoords = LinearElementEditor.getBoundTextElementPosition( + container, + element as ExcalidrawTextElementWithContainer, + ); + cx = (x2 - x1) / 2 - (boundTextCoords.x - x1); + cy = (y2 - y1) / 2 - (boundTextCoords.y - y1); + offsetX = offsetX + boundTextCoords.x - element.x; + offsetY = offsetY + boundTextCoords.y - element.y; + } + } const degree = (180 * element.angle) / Math.PI; const generator = rsvg.generator; @@ -904,8 +1110,54 @@ export const renderElementToSvg = ( } case "line": case "arrow": { + const boundText = getBoundTextElement(element); + const maskPath = svgRoot.ownerDocument!.createElementNS(SVG_NS, "mask"); + if (boundText) { + maskPath.setAttribute("id", `mask-${element.id}`); + const maskRectVisible = svgRoot.ownerDocument!.createElementNS( + SVG_NS, + "rect", + ); + offsetX = offsetX || 0; + offsetY = offsetY || 0; + maskRectVisible.setAttribute("x", "0"); + maskRectVisible.setAttribute("y", "0"); + maskRectVisible.setAttribute("fill", "#fff"); + maskRectVisible.setAttribute( + "width", + `${element.width + 100 + offsetX}`, + ); + maskRectVisible.setAttribute( + "height", + `${element.height + 100 + offsetY}`, + ); + + maskPath.appendChild(maskRectVisible); + const maskRectInvisible = svgRoot.ownerDocument!.createElementNS( + SVG_NS, + "rect", + ); + const boundTextCoords = LinearElementEditor.getBoundTextElementPosition( + element, + boundText, + ); + + const maskX = offsetX + boundTextCoords.x - element.x; + const maskY = offsetY + boundTextCoords.y - element.y; + + maskRectInvisible.setAttribute("x", maskX.toString()); + maskRectInvisible.setAttribute("y", maskY.toString()); + maskRectInvisible.setAttribute("fill", "#000"); + maskRectInvisible.setAttribute("width", `${boundText.width}`); + maskRectInvisible.setAttribute("height", `${boundText.height}`); + maskRectInvisible.setAttribute("opacity", "1"); + maskPath.appendChild(maskRectInvisible); + } generateElementShape(element, generator); const group = svgRoot.ownerDocument!.createElementNS(SVG_NS, "g"); + if (boundText) { + group.setAttribute("mask", `url(#mask-${element.id})`); + } const opacity = element.opacity / 100; group.setAttribute("stroke-linecap", "round"); @@ -935,6 +1187,7 @@ export const renderElementToSvg = ( group.appendChild(node); }); root.appendChild(group); + root.append(maskPath); break; } case "freedraw": { @@ -1033,6 +1286,7 @@ export const renderElementToSvg = ( node.setAttribute("stroke-opacity", `${opacity}`); node.setAttribute("fill-opacity", `${opacity}`); } + node.setAttribute( "transform", `translate(${offsetX || 0} ${ @@ -1041,7 +1295,6 @@ export const renderElementToSvg = ( ); const lines = element.text.replace(/\r\n?/g, "\n").split("\n"); const lineHeight = element.height / lines.length; - const verticalOffset = element.height - element.baseline; const horizontalOffset = element.textAlign === "center" ? element.width / 2 @@ -1059,13 +1312,14 @@ export const renderElementToSvg = ( const text = svgRoot.ownerDocument!.createElementNS(SVG_NS, "text"); text.textContent = lines[i]; text.setAttribute("x", `${horizontalOffset}`); - text.setAttribute("y", `${(i + 1) * lineHeight - verticalOffset}`); + text.setAttribute("y", `${i * lineHeight}`); text.setAttribute("font-family", getFontFamilyString(element)); text.setAttribute("font-size", `${element.fontSize}px`); text.setAttribute("fill", element.strokeColor); text.setAttribute("text-anchor", textAnchor); text.setAttribute("style", "white-space: pre;"); text.setAttribute("direction", direction); + text.setAttribute("dominant-baseline", "text-before-edge"); node.appendChild(text); } root.appendChild(node); diff --git a/src/renderer/renderScene.ts b/src/renderer/renderScene.ts index 7c089ed53..c8b64b47b 100644 --- a/src/renderer/renderScene.ts +++ b/src/renderer/renderScene.ts @@ -348,7 +348,6 @@ export const _renderScene = ({ context.setTransform(1, 0, 0, 1, 0, 0); context.save(); context.scale(scale, scale); - // When doing calculations based on canvas width we should used normalized one const normalizedCanvasWidth = canvas.width / scale; const normalizedCanvasHeight = canvas.height / scale; @@ -410,7 +409,7 @@ export const _renderScene = ({ undefined; visibleElements.forEach((element) => { try { - renderElement(element, rc, context, renderConfig); + renderElement(element, rc, context, renderConfig, appState); // Getting the element using LinearElementEditor during collab mismatches version - being one head of visible elements due to // ShapeCache returns empty hence making sure that we get the // correct element from visible elements @@ -440,7 +439,13 @@ export const _renderScene = ({ // Paint selection element if (appState.selectionElement) { try { - renderElement(appState.selectionElement, rc, context, renderConfig); + renderElement( + appState.selectionElement, + rc, + context, + renderConfig, + appState, + ); } catch (error: any) { console.error(error); } @@ -453,6 +458,22 @@ export const _renderScene = ({ renderBindingHighlight(context, renderConfig, suggestedBinding!); }); } + const locallySelectedElements = getSelectedElements(elements, appState); + + // Getting the element using LinearElementEditor during collab mismatches version - being one head of visible elements due to + // ShapeCache returns empty hence making sure that we get the + // correct element from visible elements + if ( + locallySelectedElements.length === 1 && + appState.editingLinearElement?.elementId === locallySelectedElements[0].id + ) { + renderLinearPointHandles( + context, + appState, + renderConfig, + locallySelectedElements[0] as NonDeleted, + ); + } if ( appState.selectedLinearElement && @@ -466,7 +487,6 @@ export const _renderScene = ({ !appState.multiElement && !appState.editingLinearElement ) { - const locallySelectedElements = getSelectedElements(elements, appState); const showBoundingBox = shouldShowBoundingBox( locallySelectedElements, appState, @@ -515,8 +535,8 @@ export const _renderScene = ({ } if (selectionColors.length) { - const [elementX1, elementY1, elementX2, elementY2] = - getElementAbsoluteCoords(element); + const [elementX1, elementY1, elementX2, elementY2, cx, cy] = + getElementAbsoluteCoords(element, true); acc.push({ angle: element.angle, elementX1, @@ -525,10 +545,12 @@ export const _renderScene = ({ elementY2, selectionColors, dashed: !!renderConfig.remoteSelectedElementIds[element.id], + cx, + cy, }); } return acc; - }, [] as { angle: number; elementX1: number; elementY1: number; elementX2: number; elementY2: number; selectionColors: string[]; dashed?: boolean }[]); + }, [] as { angle: number; elementX1: number; elementY1: number; elementX2: number; elementY2: number; selectionColors: string[]; dashed?: boolean; cx: number; cy: number }[]); const addSelectionForGroupId = (groupId: GroupId) => { const groupElements = getElementsInGroup(elements, groupId); @@ -540,8 +562,10 @@ export const _renderScene = ({ elementX2, elementY1, elementY2, - selectionColors: [selectionColor], + selectionColors: [oc.black], dashed: true, + cx: elementX1 + (elementX2 - elementX1) / 2, + cy: elementY1 + (elementY2 - elementY1) / 2, }); }; @@ -600,7 +624,7 @@ export const _renderScene = ({ context.lineWidth = lineWidth; context.setLineDash(initialLineDash); const transformHandles = getTransformHandlesFromCoords( - [x1, y1, x2, y2], + [x1, y1, x2, y2, (x1 + x2) / 2, (y1 + y2) / 2], 0, renderConfig.zoom, "mouse", @@ -861,6 +885,8 @@ const renderSelectionBorder = ( elementY2: number; selectionColors: string[]; dashed?: boolean; + cx: number; + cy: number; }, padding = DEFAULT_SPACING * 2, ) => { @@ -871,6 +897,8 @@ const renderSelectionBorder = ( elementX2, elementY2, selectionColors, + cx, + cy, dashed, } = elementProperties; const elementWidth = elementX2 - elementX1; @@ -900,8 +928,8 @@ const renderSelectionBorder = ( elementY1 - linePadding, elementWidth + linePadding * 2, elementHeight + linePadding * 2, - elementX1 + elementWidth / 2, - elementY1 + elementHeight / 2, + cx, + cy, angle, ); } @@ -1117,7 +1145,7 @@ export const renderSceneToSvg = ( return; } // render elements - elements.forEach((element) => { + elements.forEach((element, index) => { if (!element.isDeleted) { try { renderElementToSvg( diff --git a/src/scene/Fonts.ts b/src/scene/Fonts.ts new file mode 100644 index 000000000..cc206c776 --- /dev/null +++ b/src/scene/Fonts.ts @@ -0,0 +1,93 @@ +import { isTextElement, refreshTextDimensions } from "../element"; +import { newElementWith } from "../element/mutateElement"; +import { ExcalidrawElement, ExcalidrawTextElement } from "../element/types"; +import { invalidateShapeForElement } from "../renderer/renderElement"; +import { getFontString } from "../utils"; +import type Scene from "./Scene"; + +export class Fonts { + private scene: Scene; + private onSceneUpdated: () => void; + + constructor({ + scene, + onSceneUpdated, + }: { + scene: Scene; + onSceneUpdated: () => void; + }) { + this.scene = scene; + this.onSceneUpdated = onSceneUpdated; + } + + // it's ok to track fonts across multiple instances only once, so let's use + // a static member to reduce memory footprint + private static loadedFontFaces = new Set(); + + /** + * if we load a (new) font, it's likely that text elements using it have + * already been rendered using a fallback font. Thus, we want invalidate + * their shapes and rerender. See #637. + * + * Invalidates text elements and rerenders scene, provided that at least one + * of the supplied fontFaces has not already been processed. + */ + public onFontsLoaded = (fontFaces: readonly FontFace[]) => { + if ( + // bail if all fonts with have been processed. We're checking just a + // subset of the font properties (though it should be enough), so it + // can technically bail on a false positive. + fontFaces.every((fontFace) => { + const sig = `${fontFace.family}-${fontFace.style}-${fontFace.weight}`; + if (Fonts.loadedFontFaces.has(sig)) { + return true; + } + Fonts.loadedFontFaces.add(sig); + return false; + }) + ) { + return false; + } + + let didUpdate = false; + + this.scene.mapElements((element) => { + if (isTextElement(element)) { + invalidateShapeForElement(element); + didUpdate = true; + return newElementWith(element, { + ...refreshTextDimensions(element), + }); + } + return element; + }); + + if (didUpdate) { + this.onSceneUpdated(); + } + }; + + public loadFontsForElements = async ( + elements: readonly ExcalidrawElement[], + ) => { + const fontFaces = await Promise.all( + [ + ...new Set( + elements + .filter((element) => isTextElement(element)) + .map((element) => (element as ExcalidrawTextElement).fontFamily), + ), + ].map((fontFamily) => { + const fontString = getFontString({ + fontFamily, + fontSize: 16, + }); + if (!document.fonts?.check?.(fontString)) { + return document.fonts?.load?.(fontString); + } + return undefined; + }), + ); + this.onFontsLoaded(fontFaces.flat().filter(Boolean) as FontFace[]); + }; +} diff --git a/src/scene/Scene.ts b/src/scene/Scene.ts index 8b5b84eb4..e9fc98f89 100644 --- a/src/scene/Scene.ts +++ b/src/scene/Scene.ts @@ -150,6 +150,24 @@ class Scene { // (I guess?) this.callbacks.clear(); } + + insertElementAtIndex(element: ExcalidrawElement, index: number) { + if (!Number.isFinite(index) || index < 0) { + throw new Error( + "insertElementAtIndex can only be called with index >= 0", + ); + } + const nextElements = [ + ...this.elements.slice(0, index), + element, + ...this.elements.slice(index), + ]; + this.replaceAllElements(nextElements); + } + + getElementIndex(elementId: string) { + return this.elements.findIndex((element) => element.id === elementId); + } } export default Scene; diff --git a/src/scene/comparisons.ts b/src/scene/comparisons.ts index d94be0a69..b88c8b1ea 100644 --- a/src/scene/comparisons.ts +++ b/src/scene/comparisons.ts @@ -1,11 +1,4 @@ -import { - ExcalidrawElement, - ExcalidrawTextContainer, - NonDeletedExcalidrawElement, -} from "../element/types"; - -import { getElementAbsoluteCoords } from "../element"; -import { isTextBindableContainer } from "../element/typeChecks"; +import { NonDeletedExcalidrawElement } from "../element/types"; export const hasBackground = (type: string) => type === "rectangle" || @@ -31,7 +24,7 @@ export const hasStrokeStyle = (type: string) => type === "arrow" || type === "line"; -export const canChangeSharpness = (type: string) => +export const canChangeRoundness = (type: string) => type === "rectangle" || type === "arrow" || type === "line" || @@ -73,23 +66,3 @@ export const getElementsAtPosition = ( (element) => !element.isDeleted && isAtPositionFn(element), ); }; - -export const getTextBindableContainerAtPosition = ( - elements: readonly ExcalidrawElement[], - x: number, - y: number, -): ExcalidrawTextContainer | null => { - let hitElement = null; - // We need to to hit testing from front (end of the array) to back (beginning of the array) - for (let index = elements.length - 1; index >= 0; --index) { - if (elements[index].isDeleted) { - continue; - } - const [x1, y1, x2, y2] = getElementAbsoluteCoords(elements[index]); - if (x1 < x && x < x2 && y1 < y && y < y2) { - hitElement = elements[index]; - break; - } - } - return isTextBindableContainer(hitElement, false) ? hitElement : null; -}; diff --git a/src/scene/index.ts b/src/scene/index.ts index 3e1d50b24..08568aa41 100644 --- a/src/scene/index.ts +++ b/src/scene/index.ts @@ -12,9 +12,8 @@ export { hasStrokeWidth, hasStrokeStyle, canHaveArrowheads, - canChangeSharpness, + canChangeRoundness, getElementAtPosition, - getTextBindableContainerAtPosition, hasText, getElementsAtPosition, } from "./comparisons"; diff --git a/src/scene/scroll.ts b/src/scene/scroll.ts index 4fce5e641..114d6db05 100644 --- a/src/scene/scroll.ts +++ b/src/scene/scroll.ts @@ -41,8 +41,8 @@ export const centerScrollOn = ({ zoom: Zoom; }) => { return { - scrollX: (viewportDimensions.width / 2) * (1 / zoom.value) - scenePoint.x, - scrollY: (viewportDimensions.height / 2) * (1 / zoom.value) - scenePoint.y, + scrollX: viewportDimensions.width / 2 / zoom.value - scenePoint.x, + scrollY: viewportDimensions.height / 2 / zoom.value - scenePoint.y, }; }; diff --git a/src/service-worker.ts b/src/service-worker.ts new file mode 100644 index 000000000..3e3a4355f --- /dev/null +++ b/src/service-worker.ts @@ -0,0 +1,147 @@ +/// +/* eslint-disable no-restricted-globals */ + +// This service worker can be customized! +// See https://developers.google.com/web/tools/workbox/modules +// for the list of available Workbox modules, or add any other +// code you'd like. +// You can also remove this file if you'd prefer not to use a +// service worker, and the Workbox build step will be skipped. + +import { clientsClaim } from "workbox-core"; +import { ExpirationPlugin } from "workbox-expiration"; +import { precacheAndRoute, createHandlerBoundToURL } from "workbox-precaching"; +import { registerRoute } from "workbox-routing"; +import { CacheFirst, StaleWhileRevalidate } from "workbox-strategies"; + +declare const self: ServiceWorkerGlobalScope; + +clientsClaim(); + +// Precache assets generated by your build process. +// +// Their URLs are injected into the __WB_MANIFEST during build (by workbox). +// +// This variable must be present somewhere in your service worker file, +// even if you decide not to use precaching. See https://cra.link/PWA. +// +// We don't want to precache i18n files so we filter them out +// (normally this should be configured in a webpack workbox plugin, but we don't +// have access to it in CRA) — this is because all users will use at most +// one or two languages, so there's no point fetching all of them. (They'll +// be cached as you load them.) +const manifest = self.__WB_MANIFEST.filter((entry) => { + return !/locales\/[\w-]+json/.test( + typeof entry === "string" ? entry : entry.url, + ); +}); + +precacheAndRoute(manifest); + +// Set up App Shell-style routing, so that all navigation requests +// are fulfilled with your index.html shell. Learn more at +// https://developer.chrome.com/docs/workbox/app-shell-model/ +// +// below is copied verbatim from CRA@5 +const fileExtensionRegexp = new RegExp("/[^/?]+\\.[^/]+$"); +registerRoute( + // Return false to exempt requests from being fulfilled by index.html. + ({ request, url }: { request: Request; url: URL }) => { + // If this isn't a navigation, skip. + if (request.mode !== "navigate") { + return false; + } + + // If this is a URL that starts with /_, skip. + if (url.pathname.startsWith("/_")) { + return false; + } + + // If this looks like a URL for a resource, because it contains + // a file extension, skip. + if (url.pathname.match(fileExtensionRegexp)) { + return false; + } + + // Return true to signal that we want to use the handler. + return true; + }, + createHandlerBoundToURL(`${process.env.PUBLIC_URL}/index.html`), +); + +// Cache resources that aren't being precached +// ----------------------------------------------------------------------------- + +registerRoute( + new RegExp("/fonts.css"), + new StaleWhileRevalidate({ + cacheName: "fonts", + plugins: [ + // Ensure that once this runtime cache reaches a maximum size the + // least-recently used images are removed. + new ExpirationPlugin({ maxEntries: 50 }), + ], + }), +); + +// since we serve fonts from, don't forget to append new ?v= param when +// updating fonts (glyphs) without changing the filename +registerRoute( + new RegExp("/.+.(ttf|woff2|otf)"), + new CacheFirst({ + cacheName: "fonts", + plugins: [ + // Ensure that once this runtime cache reaches a maximum size the + // least-recently used images are removed. + new ExpirationPlugin({ + maxEntries: 50, + // 90 days + maxAgeSeconds: 7776000000, + }), + ], + }), +); + +registerRoute( + new RegExp("/locales\\/[\\w-]+json"), + // Customize this strategy as needed, e.g., by changing to CacheFirst. + new CacheFirst({ + cacheName: "locales", + plugins: [ + // Ensure that once this runtime cache reaches a maximum size the + // least-recently used images are removed. + new ExpirationPlugin({ + maxEntries: 50, + // 30 days + maxAgeSeconds: 2592000000, + }), + ], + }), +); + +// ----------------------------------------------------------------------------- + +self.addEventListener("fetch", (event) => { + if ( + event.request.method === "POST" && + event.request.url.endsWith("/web-share-target") + ) { + return event.respondWith( + (async () => { + const formData = await event.request.formData(); + const file = formData.get("file"); + const webShareTargetCache = await caches.open("web-share-target"); + await webShareTargetCache.put("shared-file", new Response(file)); + return Response.redirect("/?web-share-target", 303); + })(), + ); + } +}); + +// This allows the web app to trigger skipWaiting via +// registration.waiting.postMessage({type: 'SKIP_WAITING'}) +self.addEventListener("message", (event) => { + if (event.data && event.data.type === "SKIP_WAITING") { + self.skipWaiting(); + } +}); diff --git a/src/serviceWorker.tsx b/src/serviceWorkerRegistration.ts similarity index 100% rename from src/serviceWorker.tsx rename to src/serviceWorkerRegistration.ts diff --git a/src/tests/MobileMenu.test.tsx b/src/tests/MobileMenu.test.tsx new file mode 100644 index 000000000..41d5d0169 --- /dev/null +++ b/src/tests/MobileMenu.test.tsx @@ -0,0 +1,45 @@ +import ExcalidrawApp from "../excalidraw-app"; +import { + mockBoundingClientRect, + render, + restoreOriginalGetBoundingClientRect, +} from "./test-utils"; + +import { UI } from "./helpers/ui"; + +describe("Test MobileMenu", () => { + const { h } = window; + const dimensions = { height: 400, width: 800 }; + + beforeEach(async () => { + await render(); + //@ts-ignore + h.app.refreshDeviceState(h.app.excalidrawContainerRef.current!); + }); + + beforeAll(() => { + mockBoundingClientRect(dimensions); + }); + + afterAll(() => { + restoreOriginalGetBoundingClientRect(); + }); + + it("should set device correctly", () => { + expect(h.app.device).toMatchInlineSnapshot(` + Object { + "canDeviceFitSidebar": false, + "isMobile": true, + "isSmScreen": false, + "isTouchScreen": false, + } + `); + }); + + it("should initialize with welcome screen and hide once user interacts", async () => { + expect(document.querySelector(".welcome-screen-center")).toMatchSnapshot(); + + UI.clickTool("rectangle"); + expect(document.querySelector(".welcome-screen-center")).toBeNull(); + }); +}); diff --git a/src/tests/__snapshots__/MobileMenu.test.tsx.snap b/src/tests/__snapshots__/MobileMenu.test.tsx.snap new file mode 100644 index 000000000..f3e55fd99 --- /dev/null +++ b/src/tests/__snapshots__/MobileMenu.test.tsx.snap @@ -0,0 +1,240 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Test MobileMenu should initialize with welcome screen and hide once user interacts 1`] = ` + +`; diff --git a/src/tests/__snapshots__/contextmenu.test.tsx.snap b/src/tests/__snapshots__/contextmenu.test.tsx.snap index c16a47c30..326cde0ed 100644 --- a/src/tests/__snapshots__/contextmenu.test.tsx.snap +++ b/src/tests/__snapshots__/contextmenu.test.tsx.snap @@ -4,23 +4,273 @@ exports[`contextMenu element right-clicking on a group should select whole group Object { "activeTool": Object { "customType": null, - "lastActiveToolBeforeEraser": null, + "lastActiveTool": null, "locked": false, "type": "selection", }, "collaborators": Map {}, + "contextMenu": Object { + "items": Array [ + Object { + "contextItemLabel": "labels.cut", + "keyTest": [Function], + "name": "cut", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.copy", + "keyTest": undefined, + "name": "copy", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.paste", + "keyTest": undefined, + "name": "paste", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "contextItemLabel": "labels.copyAsPng", + "keyTest": [Function], + "name": "copyAsPng", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.copyAsSvg", + "name": "copyAsSvg", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.copyText", + "name": "copyText", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "contextItemLabel": "labels.copyStyles", + "keyTest": [Function], + "name": "copyStyles", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.pasteStyles", + "keyTest": [Function], + "name": "pasteStyles", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.group", + "keyTest": [Function], + "name": "group", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.unbindText", + "name": "unbindText", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.bindText", + "name": "bindText", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.ungroup", + "keyTest": [Function], + "name": "ungroup", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "contextItemLabel": "labels.addToLibrary", + "name": "addToLibrary", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.sendBackward", + "keyPriority": 40, + "keyTest": [Function], + "name": "sendBackward", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.bringForward", + "keyPriority": 40, + "keyTest": [Function], + "name": "bringForward", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.sendToBack", + "keyTest": [Function], + "name": "sendToBack", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.bringToFront", + "keyTest": [Function], + "name": "bringToFront", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "contextItemLabel": "labels.flipHorizontal", + "keyTest": [Function], + "name": "flipHorizontal", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.flipVertical", + "keyTest": [Function], + "name": "flipVertical", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "contextItemLabel": [Function], + "name": "toggleLinearEditor", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "PanelComponent": [Function], + "contextItemLabel": [Function], + "keyTest": [Function], + "name": "hyperlink", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "action": "click", + "category": "hyperlink", + }, + }, + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.duplicateSelection", + "keyTest": [Function], + "name": "duplicateSelection", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": [Function], + "keyTest": [Function], + "name": "toggleLock", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.delete", + "keyTest": [Function], + "name": "deleteSelectedElements", + "perform": [Function], + "trackEvent": Object { + "action": "delete", + "category": "element", + }, + }, + ], + "left": 30, + "top": 40, + }, "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", "currentItemFontFamily": 1, "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", "currentItemOpacity": 100, "currentItemRoughness": 1, + "currentItemRoundness": "round", "currentItemStartArrowhead": null, "currentItemStrokeColor": "#000000", - "currentItemStrokeSharpness": "sharp", "currentItemStrokeStyle": "solid", "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", @@ -106,9 +356,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 337897, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -137,9 +389,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -174,29 +428,29 @@ Object { exports[`contextMenu element right-clicking on a group should select whole group: [end of test] number of elements 1`] = `2`; -exports[`contextMenu element right-clicking on a group should select whole group: [end of test] number of renders 1`] = `6`; +exports[`contextMenu element right-clicking on a group should select whole group: [end of test] number of renders 1`] = `7`; exports[`contextMenu element selecting 'Add to library' in context menu adds element to library: [end of test] appState 1`] = ` Object { "activeTool": Object { "customType": null, - "lastActiveToolBeforeEraser": null, + "lastActiveTool": null, "locked": false, "type": "selection", }, "collaborators": Map {}, + "contextMenu": null, "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", "currentItemFontFamily": 1, "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", "currentItemOpacity": 100, "currentItemRoughness": 1, + "currentItemRoundness": "round", "currentItemStartArrowhead": null, "currentItemStrokeColor": "#000000", - "currentItemStrokeSharpness": "sharp", "currentItemStrokeStyle": "solid", "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", @@ -279,9 +533,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -335,9 +591,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -356,29 +614,29 @@ Object { exports[`contextMenu element selecting 'Add to library' in context menu adds element to library: [end of test] number of elements 1`] = `1`; -exports[`contextMenu element selecting 'Add to library' in context menu adds element to library: [end of test] number of renders 1`] = `11`; +exports[`contextMenu element selecting 'Add to library' in context menu adds element to library: [end of test] number of renders 1`] = `14`; exports[`contextMenu element selecting 'Bring forward' in context menu brings element forward: [end of test] appState 1`] = ` Object { "activeTool": Object { "customType": null, - "lastActiveToolBeforeEraser": null, + "lastActiveTool": null, "locked": false, "type": "selection", }, "collaborators": Map {}, + "contextMenu": null, "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", "currentItemFontFamily": 1, "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", "currentItemOpacity": 100, "currentItemRoughness": 1, + "currentItemRoundness": "round", "currentItemStartArrowhead": null, "currentItemStrokeColor": "#000000", - "currentItemStrokeSharpness": "sharp", "currentItemStrokeStyle": "solid", "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", @@ -459,9 +717,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 453191, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -488,9 +748,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -544,9 +806,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -584,9 +848,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -610,9 +876,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 453191, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -650,9 +918,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 453191, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -676,9 +946,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -697,29 +969,29 @@ Object { exports[`contextMenu element selecting 'Bring forward' in context menu brings element forward: [end of test] number of elements 1`] = `2`; -exports[`contextMenu element selecting 'Bring forward' in context menu brings element forward: [end of test] number of renders 1`] = `16`; +exports[`contextMenu element selecting 'Bring forward' in context menu brings element forward: [end of test] number of renders 1`] = `18`; exports[`contextMenu element selecting 'Bring to front' in context menu brings element to front: [end of test] appState 1`] = ` Object { "activeTool": Object { "customType": null, - "lastActiveToolBeforeEraser": null, + "lastActiveTool": null, "locked": false, "type": "selection", }, "collaborators": Map {}, + "contextMenu": null, "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", "currentItemFontFamily": 1, "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", "currentItemOpacity": 100, "currentItemRoughness": 1, + "currentItemRoundness": "round", "currentItemStartArrowhead": null, "currentItemStrokeColor": "#000000", - "currentItemStrokeSharpness": "sharp", "currentItemStrokeStyle": "solid", "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", @@ -800,9 +1072,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 453191, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -829,9 +1103,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -885,9 +1161,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -925,9 +1203,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -951,9 +1231,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 453191, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -991,9 +1273,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 453191, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -1017,9 +1301,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -1038,29 +1324,29 @@ Object { exports[`contextMenu element selecting 'Bring to front' in context menu brings element to front: [end of test] number of elements 1`] = `2`; -exports[`contextMenu element selecting 'Bring to front' in context menu brings element to front: [end of test] number of renders 1`] = `16`; +exports[`contextMenu element selecting 'Bring to front' in context menu brings element to front: [end of test] number of renders 1`] = `18`; exports[`contextMenu element selecting 'Copy styles' in context menu copies styles: [end of test] appState 1`] = ` Object { "activeTool": Object { "customType": null, - "lastActiveToolBeforeEraser": null, + "lastActiveTool": null, "locked": false, "type": "selection", }, "collaborators": Map {}, + "contextMenu": null, "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", "currentItemFontFamily": 1, "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", "currentItemOpacity": 100, "currentItemRoughness": 1, + "currentItemRoundness": "round", "currentItemStartArrowhead": null, "currentItemStrokeColor": "#000000", - "currentItemStrokeSharpness": "sharp", "currentItemStrokeStyle": "solid", "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", @@ -1143,9 +1429,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 449462985, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -1199,9 +1487,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 449462985, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -1220,29 +1510,29 @@ Object { exports[`contextMenu element selecting 'Copy styles' in context menu copies styles: [end of test] number of elements 1`] = `1`; -exports[`contextMenu element selecting 'Copy styles' in context menu copies styles: [end of test] number of renders 1`] = `11`; +exports[`contextMenu element selecting 'Copy styles' in context menu copies styles: [end of test] number of renders 1`] = `14`; exports[`contextMenu element selecting 'Delete' in context menu deletes element: [end of test] appState 1`] = ` Object { "activeTool": Object { "customType": null, - "lastActiveToolBeforeEraser": null, + "lastActiveTool": null, "locked": false, "type": "selection", }, "collaborators": Map {}, + "contextMenu": null, "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", "currentItemFontFamily": 1, "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", "currentItemOpacity": 100, "currentItemRoughness": 1, + "currentItemRoundness": "round", "currentItemStartArrowhead": null, "currentItemStrokeColor": "#000000", - "currentItemStrokeSharpness": "sharp", "currentItemStrokeStyle": "solid", "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", @@ -1321,9 +1611,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 337897, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -1377,9 +1669,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 337897, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -1415,9 +1709,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 337897, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -1436,29 +1732,29 @@ Object { exports[`contextMenu element selecting 'Delete' in context menu deletes element: [end of test] number of elements 1`] = `1`; -exports[`contextMenu element selecting 'Delete' in context menu deletes element: [end of test] number of renders 1`] = `11`; +exports[`contextMenu element selecting 'Delete' in context menu deletes element: [end of test] number of renders 1`] = `14`; exports[`contextMenu element selecting 'Duplicate' in context menu duplicates element: [end of test] appState 1`] = ` Object { "activeTool": Object { "customType": null, - "lastActiveToolBeforeEraser": null, + "lastActiveTool": null, "locked": false, "type": "selection", }, "collaborators": Map {}, + "contextMenu": null, "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", "currentItemFontFamily": 1, "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", "currentItemOpacity": 100, "currentItemRoughness": 1, + "currentItemRoundness": "round", "currentItemStartArrowhead": null, "currentItemStrokeColor": "#000000", - "currentItemStrokeSharpness": "sharp", "currentItemStrokeStyle": "solid", "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", @@ -1539,9 +1835,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -1568,9 +1866,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 453191, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -1624,9 +1924,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -1664,9 +1966,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -1690,9 +1994,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 453191, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -1711,29 +2017,29 @@ Object { exports[`contextMenu element selecting 'Duplicate' in context menu duplicates element: [end of test] number of elements 1`] = `2`; -exports[`contextMenu element selecting 'Duplicate' in context menu duplicates element: [end of test] number of renders 1`] = `11`; +exports[`contextMenu element selecting 'Duplicate' in context menu duplicates element: [end of test] number of renders 1`] = `14`; exports[`contextMenu element selecting 'Group selection' in context menu groups selected elements: [end of test] appState 1`] = ` Object { "activeTool": Object { "customType": null, - "lastActiveToolBeforeEraser": null, + "lastActiveTool": null, "locked": false, "type": "selection", }, "collaborators": Map {}, + "contextMenu": null, "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", "currentItemFontFamily": 1, "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", "currentItemOpacity": 100, "currentItemRoughness": 1, + "currentItemRoundness": "round", "currentItemStartArrowhead": null, "currentItemStrokeColor": "#000000", - "currentItemStrokeSharpness": "sharp", "currentItemStrokeStyle": "solid", "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", @@ -1822,9 +2128,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -1853,9 +2161,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 453191, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -1909,9 +2219,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -1949,9 +2261,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -1975,9 +2289,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 453191, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -2021,9 +2337,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -2049,9 +2367,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 453191, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -2070,29 +2390,29 @@ Object { exports[`contextMenu element selecting 'Group selection' in context menu groups selected elements: [end of test] number of elements 1`] = `2`; -exports[`contextMenu element selecting 'Group selection' in context menu groups selected elements: [end of test] number of renders 1`] = `17`; +exports[`contextMenu element selecting 'Group selection' in context menu groups selected elements: [end of test] number of renders 1`] = `20`; exports[`contextMenu element selecting 'Paste styles' in context menu pastes styles: [end of test] appState 1`] = ` Object { "activeTool": Object { "customType": null, - "lastActiveToolBeforeEraser": null, + "lastActiveTool": null, "locked": false, "type": "selection", }, "collaborators": Map {}, + "contextMenu": null, "currentChartType": "bar", "currentItemBackgroundColor": "#e64980", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "cross-hatch", "currentItemFontFamily": 1, "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", "currentItemOpacity": 60, "currentItemRoughness": 2, + "currentItemRoundness": "round", "currentItemStartArrowhead": null, "currentItemStrokeColor": "#c92a2a", - "currentItemStrokeSharpness": "sharp", "currentItemStrokeStyle": "dotted", "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", @@ -2175,9 +2495,11 @@ Object { "locked": false, "opacity": 60, "roughness": 2, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#c92a2a", - "strokeSharpness": "sharp", "strokeStyle": "dotted", "strokeWidth": 2, "type": "rectangle", @@ -2204,9 +2526,11 @@ Object { "locked": false, "opacity": 60, "roughness": 2, + "roundness": Object { + "type": 3, + }, "seed": 400692809, "strokeColor": "#c92a2a", - "strokeSharpness": "sharp", "strokeStyle": "dotted", "strokeWidth": 2, "type": "rectangle", @@ -2260,9 +2584,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -2300,9 +2626,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -2326,9 +2654,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 453191, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -2366,9 +2696,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -2392,9 +2724,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 453191, "strokeColor": "#c92a2a", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -2432,9 +2766,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -2458,9 +2794,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 453191, "strokeColor": "#c92a2a", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -2498,9 +2836,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -2524,9 +2864,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 453191, "strokeColor": "#c92a2a", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -2564,9 +2906,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -2590,9 +2934,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 453191, "strokeColor": "#c92a2a", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 2, "type": "rectangle", @@ -2630,9 +2976,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -2656,9 +3004,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 453191, "strokeColor": "#c92a2a", - "strokeSharpness": "sharp", "strokeStyle": "dotted", "strokeWidth": 2, "type": "rectangle", @@ -2696,9 +3046,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -2722,9 +3074,11 @@ Object { "locked": false, "opacity": 100, "roughness": 2, + "roundness": Object { + "type": 3, + }, "seed": 400692809, "strokeColor": "#c92a2a", - "strokeSharpness": "sharp", "strokeStyle": "dotted", "strokeWidth": 2, "type": "rectangle", @@ -2762,9 +3116,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -2788,9 +3144,11 @@ Object { "locked": false, "opacity": 60, "roughness": 2, + "roundness": Object { + "type": 3, + }, "seed": 400692809, "strokeColor": "#c92a2a", - "strokeSharpness": "sharp", "strokeStyle": "dotted", "strokeWidth": 2, "type": "rectangle", @@ -2828,9 +3186,11 @@ Object { "locked": false, "opacity": 60, "roughness": 2, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#c92a2a", - "strokeSharpness": "sharp", "strokeStyle": "dotted", "strokeWidth": 2, "type": "rectangle", @@ -2854,9 +3214,11 @@ Object { "locked": false, "opacity": 60, "roughness": 2, + "roundness": Object { + "type": 3, + }, "seed": 400692809, "strokeColor": "#c92a2a", - "strokeSharpness": "sharp", "strokeStyle": "dotted", "strokeWidth": 2, "type": "rectangle", @@ -2875,29 +3237,29 @@ Object { exports[`contextMenu element selecting 'Paste styles' in context menu pastes styles: [end of test] number of elements 1`] = `2`; -exports[`contextMenu element selecting 'Paste styles' in context menu pastes styles: [end of test] number of renders 1`] = `28`; +exports[`contextMenu element selecting 'Paste styles' in context menu pastes styles: [end of test] number of renders 1`] = `33`; exports[`contextMenu element selecting 'Send backward' in context menu sends element backward: [end of test] appState 1`] = ` Object { "activeTool": Object { "customType": null, - "lastActiveToolBeforeEraser": null, + "lastActiveTool": null, "locked": false, "type": "selection", }, "collaborators": Map {}, + "contextMenu": null, "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", "currentItemFontFamily": 1, "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", "currentItemOpacity": 100, "currentItemRoughness": 1, + "currentItemRoundness": "round", "currentItemStartArrowhead": null, "currentItemStrokeColor": "#000000", - "currentItemStrokeSharpness": "sharp", "currentItemStrokeStyle": "solid", "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", @@ -2978,9 +3340,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 453191, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -3007,9 +3371,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -3063,9 +3429,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -3103,9 +3471,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -3129,9 +3499,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 453191, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -3169,9 +3541,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 453191, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -3195,9 +3569,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -3216,29 +3592,29 @@ Object { exports[`contextMenu element selecting 'Send backward' in context menu sends element backward: [end of test] number of elements 1`] = `2`; -exports[`contextMenu element selecting 'Send backward' in context menu sends element backward: [end of test] number of renders 1`] = `15`; +exports[`contextMenu element selecting 'Send backward' in context menu sends element backward: [end of test] number of renders 1`] = `18`; exports[`contextMenu element selecting 'Send to back' in context menu sends element to back: [end of test] appState 1`] = ` Object { "activeTool": Object { "customType": null, - "lastActiveToolBeforeEraser": null, + "lastActiveTool": null, "locked": false, "type": "selection", }, "collaborators": Map {}, + "contextMenu": null, "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", "currentItemFontFamily": 1, "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", "currentItemOpacity": 100, "currentItemRoughness": 1, + "currentItemRoundness": "round", "currentItemStartArrowhead": null, "currentItemStrokeColor": "#000000", - "currentItemStrokeSharpness": "sharp", "currentItemStrokeStyle": "solid", "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", @@ -3319,9 +3695,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 453191, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -3348,9 +3726,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -3404,9 +3784,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -3444,9 +3826,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -3470,9 +3854,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 453191, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -3510,9 +3896,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 453191, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -3536,9 +3924,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -3557,29 +3947,29 @@ Object { exports[`contextMenu element selecting 'Send to back' in context menu sends element to back: [end of test] number of elements 1`] = `2`; -exports[`contextMenu element selecting 'Send to back' in context menu sends element to back: [end of test] number of renders 1`] = `15`; +exports[`contextMenu element selecting 'Send to back' in context menu sends element to back: [end of test] number of renders 1`] = `18`; exports[`contextMenu element selecting 'Ungroup selection' in context menu ungroups selected group: [end of test] appState 1`] = ` Object { "activeTool": Object { "customType": null, - "lastActiveToolBeforeEraser": null, + "lastActiveTool": null, "locked": false, "type": "selection", }, "collaborators": Map {}, + "contextMenu": null, "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", "currentItemFontFamily": 1, "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", "currentItemOpacity": 100, "currentItemRoughness": 1, + "currentItemRoundness": "round", "currentItemStartArrowhead": null, "currentItemStrokeColor": "#000000", - "currentItemStrokeSharpness": "sharp", "currentItemStrokeStyle": "solid", "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", @@ -3664,9 +4054,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 449462985, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -3693,9 +4085,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 401146281, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -3749,9 +4143,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 449462985, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -3789,9 +4185,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 449462985, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -3815,9 +4213,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 401146281, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -3861,9 +4261,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 449462985, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -3889,9 +4291,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 401146281, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -3931,9 +4335,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 449462985, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -3957,9 +4363,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 401146281, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -3978,29 +4386,279 @@ Object { exports[`contextMenu element selecting 'Ungroup selection' in context menu ungroups selected group: [end of test] number of elements 1`] = `2`; -exports[`contextMenu element selecting 'Ungroup selection' in context menu ungroups selected group: [end of test] number of renders 1`] = `18`; +exports[`contextMenu element selecting 'Ungroup selection' in context menu ungroups selected group: [end of test] number of renders 1`] = `21`; exports[`contextMenu element shows 'Group selection' in context menu for multiple selected elements: [end of test] appState 1`] = ` Object { "activeTool": Object { "customType": null, - "lastActiveToolBeforeEraser": null, + "lastActiveTool": null, "locked": false, "type": "selection", }, "collaborators": Map {}, + "contextMenu": Object { + "items": Array [ + Object { + "contextItemLabel": "labels.cut", + "keyTest": [Function], + "name": "cut", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.copy", + "keyTest": undefined, + "name": "copy", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.paste", + "keyTest": undefined, + "name": "paste", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "contextItemLabel": "labels.copyAsPng", + "keyTest": [Function], + "name": "copyAsPng", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.copyAsSvg", + "name": "copyAsSvg", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.copyText", + "name": "copyText", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "contextItemLabel": "labels.copyStyles", + "keyTest": [Function], + "name": "copyStyles", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.pasteStyles", + "keyTest": [Function], + "name": "pasteStyles", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.group", + "keyTest": [Function], + "name": "group", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.unbindText", + "name": "unbindText", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.bindText", + "name": "bindText", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.ungroup", + "keyTest": [Function], + "name": "ungroup", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "contextItemLabel": "labels.addToLibrary", + "name": "addToLibrary", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.sendBackward", + "keyPriority": 40, + "keyTest": [Function], + "name": "sendBackward", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.bringForward", + "keyPriority": 40, + "keyTest": [Function], + "name": "bringForward", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.sendToBack", + "keyTest": [Function], + "name": "sendToBack", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.bringToFront", + "keyTest": [Function], + "name": "bringToFront", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "contextItemLabel": "labels.flipHorizontal", + "keyTest": [Function], + "name": "flipHorizontal", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.flipVertical", + "keyTest": [Function], + "name": "flipVertical", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "contextItemLabel": [Function], + "name": "toggleLinearEditor", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "PanelComponent": [Function], + "contextItemLabel": [Function], + "keyTest": [Function], + "name": "hyperlink", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "action": "click", + "category": "hyperlink", + }, + }, + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.duplicateSelection", + "keyTest": [Function], + "name": "duplicateSelection", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": [Function], + "keyTest": [Function], + "name": "toggleLock", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.delete", + "keyTest": [Function], + "name": "deleteSelectedElements", + "perform": [Function], + "trackEvent": Object { + "action": "delete", + "category": "element", + }, + }, + ], + "left": -19, + "top": -9, + }, "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", "currentItemFontFamily": 1, "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", "currentItemOpacity": 100, "currentItemRoughness": 1, + "currentItemRoundness": "round", "currentItemStartArrowhead": null, "currentItemStrokeColor": "#000000", - "currentItemStrokeSharpness": "sharp", "currentItemStrokeStyle": "solid", "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", @@ -4087,9 +4745,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -4116,9 +4776,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 453191, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -4172,9 +4834,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -4212,9 +4876,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -4238,9 +4904,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 453191, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -4259,29 +4927,279 @@ Object { exports[`contextMenu element shows 'Group selection' in context menu for multiple selected elements: [end of test] number of elements 1`] = `2`; -exports[`contextMenu element shows 'Group selection' in context menu for multiple selected elements: [end of test] number of renders 1`] = `18`; +exports[`contextMenu element shows 'Group selection' in context menu for multiple selected elements: [end of test] number of renders 1`] = `20`; exports[`contextMenu element shows 'Ungroup selection' in context menu for group inside selected elements: [end of test] appState 1`] = ` Object { "activeTool": Object { "customType": null, - "lastActiveToolBeforeEraser": null, + "lastActiveTool": null, "locked": false, "type": "selection", }, "collaborators": Map {}, + "contextMenu": Object { + "items": Array [ + Object { + "contextItemLabel": "labels.cut", + "keyTest": [Function], + "name": "cut", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.copy", + "keyTest": undefined, + "name": "copy", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.paste", + "keyTest": undefined, + "name": "paste", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "contextItemLabel": "labels.copyAsPng", + "keyTest": [Function], + "name": "copyAsPng", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.copyAsSvg", + "name": "copyAsSvg", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.copyText", + "name": "copyText", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "contextItemLabel": "labels.copyStyles", + "keyTest": [Function], + "name": "copyStyles", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.pasteStyles", + "keyTest": [Function], + "name": "pasteStyles", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.group", + "keyTest": [Function], + "name": "group", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.unbindText", + "name": "unbindText", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.bindText", + "name": "bindText", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.ungroup", + "keyTest": [Function], + "name": "ungroup", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "contextItemLabel": "labels.addToLibrary", + "name": "addToLibrary", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.sendBackward", + "keyPriority": 40, + "keyTest": [Function], + "name": "sendBackward", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.bringForward", + "keyPriority": 40, + "keyTest": [Function], + "name": "bringForward", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.sendToBack", + "keyTest": [Function], + "name": "sendToBack", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.bringToFront", + "keyTest": [Function], + "name": "bringToFront", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "contextItemLabel": "labels.flipHorizontal", + "keyTest": [Function], + "name": "flipHorizontal", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.flipVertical", + "keyTest": [Function], + "name": "flipVertical", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "contextItemLabel": [Function], + "name": "toggleLinearEditor", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "PanelComponent": [Function], + "contextItemLabel": [Function], + "keyTest": [Function], + "name": "hyperlink", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "action": "click", + "category": "hyperlink", + }, + }, + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.duplicateSelection", + "keyTest": [Function], + "name": "duplicateSelection", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": [Function], + "keyTest": [Function], + "name": "toggleLock", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.delete", + "keyTest": [Function], + "name": "deleteSelectedElements", + "perform": [Function], + "trackEvent": Object { + "action": "delete", + "category": "element", + }, + }, + ], + "left": -19, + "top": -9, + }, "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", "currentItemFontFamily": 1, "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", "currentItemOpacity": 100, "currentItemRoughness": 1, + "currentItemRoundness": "round", "currentItemStartArrowhead": null, "currentItemStrokeColor": "#000000", - "currentItemStrokeSharpness": "sharp", "currentItemStrokeStyle": "solid", "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", @@ -4372,9 +5290,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 449462985, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -4403,9 +5323,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 401146281, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -4459,9 +5381,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 449462985, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -4499,9 +5423,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 449462985, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -4525,9 +5451,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 401146281, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -4572,9 +5500,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 449462985, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -4600,9 +5530,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 401146281, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -4621,29 +5553,134 @@ Object { exports[`contextMenu element shows 'Ungroup selection' in context menu for group inside selected elements: [end of test] number of elements 1`] = `2`; -exports[`contextMenu element shows 'Ungroup selection' in context menu for group inside selected elements: [end of test] number of renders 1`] = `19`; +exports[`contextMenu element shows 'Ungroup selection' in context menu for group inside selected elements: [end of test] number of renders 1`] = `21`; exports[`contextMenu element shows context menu for canvas: [end of test] appState 1`] = ` Object { "activeTool": Object { "customType": null, - "lastActiveToolBeforeEraser": null, + "lastActiveTool": null, "locked": false, "type": "selection", }, "collaborators": Map {}, + "contextMenu": Object { + "items": Array [ + Object { + "contextItemLabel": "labels.paste", + "keyTest": undefined, + "name": "paste", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "contextItemLabel": "labels.copyAsPng", + "keyTest": [Function], + "name": "copyAsPng", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.copyAsSvg", + "name": "copyAsSvg", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.copyText", + "name": "copyText", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "contextItemLabel": "labels.selectAll", + "keyTest": [Function], + "name": "selectAll", + "perform": [Function], + "trackEvent": Object { + "category": "canvas", + }, + }, + "separator", + Object { + "checked": [Function], + "contextItemLabel": "labels.showGrid", + "keyTest": [Function], + "name": "gridMode", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "canvas", + "predicate": [Function], + }, + "viewMode": true, + }, + Object { + "checked": [Function], + "contextItemLabel": "buttons.zenMode", + "keyTest": [Function], + "name": "zenMode", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "canvas", + "predicate": [Function], + }, + "viewMode": true, + }, + Object { + "checked": [Function], + "contextItemLabel": "labels.viewMode", + "keyTest": [Function], + "name": "viewMode", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "canvas", + "predicate": [Function], + }, + "viewMode": true, + }, + Object { + "checked": [Function], + "contextItemLabel": "stats.title", + "keyTest": [Function], + "name": "stats", + "perform": [Function], + "trackEvent": Object { + "category": "menu", + }, + "viewMode": true, + }, + ], + "left": -19, + "top": -9, + }, "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", "currentItemFontFamily": 1, "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", "currentItemOpacity": 100, "currentItemRoughness": 1, + "currentItemRoundness": "round", "currentItemStartArrowhead": null, "currentItemStrokeColor": "#000000", - "currentItemStrokeSharpness": "sharp", "currentItemStrokeStyle": "solid", "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", @@ -4730,29 +5767,279 @@ Object { exports[`contextMenu element shows context menu for canvas: [end of test] number of elements 1`] = `0`; -exports[`contextMenu element shows context menu for canvas: [end of test] number of renders 1`] = `4`; +exports[`contextMenu element shows context menu for canvas: [end of test] number of renders 1`] = `6`; exports[`contextMenu element shows context menu for element: [end of test] appState 1`] = ` Object { "activeTool": Object { "customType": null, - "lastActiveToolBeforeEraser": null, + "lastActiveTool": null, "locked": false, "type": "selection", }, "collaborators": Map {}, + "contextMenu": Object { + "items": Array [ + Object { + "contextItemLabel": "labels.cut", + "keyTest": [Function], + "name": "cut", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.copy", + "keyTest": undefined, + "name": "copy", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.paste", + "keyTest": undefined, + "name": "paste", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "contextItemLabel": "labels.copyAsPng", + "keyTest": [Function], + "name": "copyAsPng", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.copyAsSvg", + "name": "copyAsSvg", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.copyText", + "name": "copyText", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "contextItemLabel": "labels.copyStyles", + "keyTest": [Function], + "name": "copyStyles", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.pasteStyles", + "keyTest": [Function], + "name": "pasteStyles", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.group", + "keyTest": [Function], + "name": "group", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.unbindText", + "name": "unbindText", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.bindText", + "name": "bindText", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.ungroup", + "keyTest": [Function], + "name": "ungroup", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "contextItemLabel": "labels.addToLibrary", + "name": "addToLibrary", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.sendBackward", + "keyPriority": 40, + "keyTest": [Function], + "name": "sendBackward", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.bringForward", + "keyPriority": 40, + "keyTest": [Function], + "name": "bringForward", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.sendToBack", + "keyTest": [Function], + "name": "sendToBack", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.bringToFront", + "keyTest": [Function], + "name": "bringToFront", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "contextItemLabel": "labels.flipHorizontal", + "keyTest": [Function], + "name": "flipHorizontal", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.flipVertical", + "keyTest": [Function], + "name": "flipVertical", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "contextItemLabel": [Function], + "name": "toggleLinearEditor", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "PanelComponent": [Function], + "contextItemLabel": [Function], + "keyTest": [Function], + "name": "hyperlink", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "action": "click", + "category": "hyperlink", + }, + }, + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.duplicateSelection", + "keyTest": [Function], + "name": "duplicateSelection", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": [Function], + "keyTest": [Function], + "name": "toggleLock", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.delete", + "keyTest": [Function], + "name": "deleteSelectedElements", + "perform": [Function], + "trackEvent": Object { + "action": "delete", + "category": "element", + }, + }, + ], + "left": -19, + "top": -9, + }, "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", "currentItemFontFamily": 1, "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", "currentItemOpacity": 100, "currentItemRoughness": 1, + "currentItemRoundness": "round", "currentItemStartArrowhead": null, "currentItemStrokeColor": "#000000", - "currentItemStrokeSharpness": "sharp", "currentItemStrokeStyle": "solid", "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", @@ -4823,23 +6110,273 @@ exports[`contextMenu element shows context menu for element: [end of test] appSt Object { "activeTool": Object { "customType": null, - "lastActiveToolBeforeEraser": null, + "lastActiveTool": null, "locked": false, "type": "selection", }, "collaborators": Map {}, + "contextMenu": Object { + "items": Array [ + Object { + "contextItemLabel": "labels.cut", + "keyTest": [Function], + "name": "cut", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.copy", + "keyTest": undefined, + "name": "copy", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.paste", + "keyTest": undefined, + "name": "paste", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "contextItemLabel": "labels.copyAsPng", + "keyTest": [Function], + "name": "copyAsPng", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.copyAsSvg", + "name": "copyAsSvg", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.copyText", + "name": "copyText", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "contextItemLabel": "labels.copyStyles", + "keyTest": [Function], + "name": "copyStyles", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.pasteStyles", + "keyTest": [Function], + "name": "pasteStyles", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.group", + "keyTest": [Function], + "name": "group", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.unbindText", + "name": "unbindText", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.bindText", + "name": "bindText", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.ungroup", + "keyTest": [Function], + "name": "ungroup", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "contextItemLabel": "labels.addToLibrary", + "name": "addToLibrary", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.sendBackward", + "keyPriority": 40, + "keyTest": [Function], + "name": "sendBackward", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.bringForward", + "keyPriority": 40, + "keyTest": [Function], + "name": "bringForward", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.sendToBack", + "keyTest": [Function], + "name": "sendToBack", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.bringToFront", + "keyTest": [Function], + "name": "bringToFront", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "contextItemLabel": "labels.flipHorizontal", + "keyTest": [Function], + "name": "flipHorizontal", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": "labels.flipVertical", + "keyTest": [Function], + "name": "flipVertical", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "contextItemLabel": [Function], + "name": "toggleLinearEditor", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "PanelComponent": [Function], + "contextItemLabel": [Function], + "keyTest": [Function], + "name": "hyperlink", + "perform": [Function], + "predicate": [Function], + "trackEvent": Object { + "action": "click", + "category": "hyperlink", + }, + }, + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.duplicateSelection", + "keyTest": [Function], + "name": "duplicateSelection", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + Object { + "contextItemLabel": [Function], + "keyTest": [Function], + "name": "toggleLock", + "perform": [Function], + "trackEvent": Object { + "category": "element", + }, + }, + "separator", + Object { + "PanelComponent": [Function], + "contextItemLabel": "labels.delete", + "keyTest": [Function], + "name": "deleteSelectedElements", + "perform": [Function], + "trackEvent": Object { + "action": "delete", + "category": "element", + }, + }, + ], + "left": 80, + "top": 90, + }, "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", "currentItemFontFamily": 1, "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", "currentItemOpacity": 100, "currentItemRoughness": 1, + "currentItemRoundness": "round", "currentItemStartArrowhead": null, "currentItemStrokeColor": "#000000", - "currentItemStrokeSharpness": "sharp", "currentItemStrokeStyle": "solid", "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", @@ -4920,9 +6457,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -4949,9 +6488,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 337897, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -4978,9 +6519,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -5034,9 +6577,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 1278240551, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", @@ -5077,6 +6622,6 @@ exports[`contextMenu element shows context menu for element: [end of test] numbe exports[`contextMenu element shows context menu for element: [end of test] number of elements 2`] = `2`; -exports[`contextMenu element shows context menu for element: [end of test] number of renders 1`] = `10`; +exports[`contextMenu element shows context menu for element: [end of test] number of renders 1`] = `12`; -exports[`contextMenu element shows context menu for element: [end of test] number of renders 2`] = `7`; +exports[`contextMenu element shows context menu for element: [end of test] number of renders 2`] = `11`; diff --git a/src/tests/__snapshots__/dragCreate.test.tsx.snap b/src/tests/__snapshots__/dragCreate.test.tsx.snap index ef7b8a685..ffcf57b0d 100644 --- a/src/tests/__snapshots__/dragCreate.test.tsx.snap +++ b/src/tests/__snapshots__/dragCreate.test.tsx.snap @@ -29,11 +29,13 @@ Object { ], ], "roughness": 1, + "roundness": Object { + "type": 2, + }, "seed": 337897, "startArrowhead": null, "startBinding": null, "strokeColor": "#000000", - "strokeSharpness": "round", "strokeStyle": "solid", "strokeWidth": 1, "type": "arrow", @@ -62,9 +64,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 2, + }, "seed": 337897, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "diamond", @@ -93,9 +97,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 2, + }, "seed": 337897, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "ellipse", @@ -135,11 +141,13 @@ Object { ], ], "roughness": 1, + "roundness": Object { + "type": 2, + }, "seed": 337897, "startArrowhead": null, "startBinding": null, "strokeColor": "#000000", - "strokeSharpness": "round", "strokeStyle": "solid", "strokeWidth": 1, "type": "line", @@ -168,9 +176,11 @@ Object { "locked": false, "opacity": 100, "roughness": 1, + "roundness": Object { + "type": 3, + }, "seed": 337897, "strokeColor": "#000000", - "strokeSharpness": "sharp", "strokeStyle": "solid", "strokeWidth": 1, "type": "rectangle", diff --git a/src/tests/__snapshots__/linearElementEditor.test.tsx.snap b/src/tests/__snapshots__/linearElementEditor.test.tsx.snap new file mode 100644 index 000000000..5ea0ab4b1 --- /dev/null +++ b/src/tests/__snapshots__/linearElementEditor.test.tsx.snap @@ -0,0 +1,12 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Test Linear Elements Test bound text element should match styles for text editor 1`] = ` +