{"version":3,"sources":["constants.ts","utils.ts","keys.ts","analytics.ts","data/encryption.ts","colors.ts","data/encode.ts","css/variables.module.scss","locales lazy /^/.*/.json$/ groupOptions: {} namespace object","i18n.ts","appState.ts","hooks/useCallbackRefState.ts","element/typeChecks.ts","math.ts","points.ts","element/bounds.ts","scene/Scene.ts","element/textElement.ts","renderer/renderElement.ts","random.ts","element/mutateElement.ts","element/sizeHelpers.ts","groups.ts","element/newElement.ts","element/transformHandles.ts","ga.ts","galines.ts","gapoints.ts","gadirections.ts","gatransforms.ts","element/collision.ts","element/resizeTest.ts","element/linearElementEditor.ts","element/binding.ts","element/resizeElements.ts","element/dragElements.ts","components/ButtonIconSelect.tsx","components/Popover.tsx","components/ColorPicker.tsx","components/IconPicker.tsx","components/icons.tsx","scene/comparisons.ts","actions/register.ts","actions/actionProperties.tsx","errors.ts","components/Spinner.tsx","components/ToolButton.tsx","components/DarkModeToggle.tsx","types.ts","scene/scroll.ts","scene/zoom.ts","components/Tooltip.tsx","components/ConfirmDialog.tsx","components/ClearCanvas.tsx","actions/actionCanvas.tsx","element/textWysiwyg.tsx","element/showSelectedShapeActions.ts","element/index.ts","scene/scrollbars.ts","scene/selection.ts","actions/actionDeleteSelected.tsx","zindex.ts","actions/actionZindex.tsx","actions/actionSelectAll.ts","actions/actionDuplicateSelection.tsx","actions/actionFinalize.tsx","components/ProjectName.tsx","clients.ts","element/Hyperlink.tsx","renderer/renderScene.ts","renderer/roundRect.ts","data/filesystem.ts","data/restore.ts","data/blob.ts","data/json.ts","element/image.ts","scene/export.ts","charts.ts","clipboard.ts","data/index.ts","data/resave.ts","components/CheckboxItem.tsx","components/Stack.tsx","components/ActiveFile.tsx","actions/actionExport.tsx","actions/actionStyles.ts","components/HelpIcon.tsx","actions/actionGroup.tsx","actions/actionMenu.tsx","components/Avatar.tsx","actions/actionAddToLibrary.ts","actions/actionNavigate.tsx","align.ts","actions/actionAlign.tsx","actions/actionDistribute.tsx","disitrubte.ts","actions/actionFlip.ts","actions/actionClipboard.tsx","actions/actionToggleGridMode.tsx","actions/actionToggleZenMode.tsx","actions/actionToggleStats.tsx","actions/actionUnbindText.tsx","actions/actionHistory.tsx","actions/manager.tsx","data/library.ts","gesture.ts","history.ts","shapes.tsx","actions/shortcuts.ts","components/ContextMenu.tsx","components/Actions.tsx","components/BackgroundPickerAndDarkModeToggle.tsx","components/CollabButton.tsx","components/ImageExportDialog.tsx","components/FixedSideContainer.tsx","components/HintViewer.tsx","components/Island.tsx","components/LoadingMessage.tsx","components/LockButton.tsx","components/Section.tsx","components/UserList.tsx","components/LibraryButton.tsx","components/PenModeButton.tsx","components/MobileMenu.tsx","components/PasteChartDialog.tsx","components/HelpDialog.tsx","excalidraw-app/app_constants.ts","components/Card.tsx","components/JSONExportDialog.tsx","packages/utils.ts","components/SingleLibraryItem.tsx","components/PublishLibrary.tsx","components/LibraryUnit.tsx","components/LibraryMenuItems.tsx","excalidraw-app/data/tabSync.ts","excalidraw-app/data/localStorage.ts","components/LibraryMenu.tsx","components/LayerUI.tsx","components/Stats.tsx","components/Toast.tsx","actions/actionToggleViewMode.tsx","components/App.tsx","components/Modal.tsx","components/Dialog.tsx","components/ErrorDialog.tsx","components/TopErrorBoundary.tsx","packages/excalidraw/publicPath.js","components/InitializeApp.tsx","excalidraw-app/data/firebase.ts","packages/excalidraw/index.tsx","excalidraw-app/data/FileManager.ts","excalidraw-app/data/index.ts","excalidraw-app/collab/Portal.tsx","excalidraw-app/collab/RoomDialog.tsx","excalidraw-app/collab/reconciliation.ts","createInverseContext.tsx","excalidraw-app/collab/CollabWrapper.tsx","excalidraw-app/components/LanguageList.tsx","excalidraw-app/CustomStats.tsx","excalidraw-app/components/icons.tsx","excalidraw-app/components/ExportToExcalidrawPlus.tsx","excalidraw-app/index.tsx","serviceWorker.tsx","excalidraw-app/pwa.ts","excalidraw-app/sentry.ts","index.tsx"],"names":["EVENT","APP_NAME","DRAGGING_THRESHOLD","LINE_CONFIRM_THRESHOLD","ELEMENT_SHIFT_TRANSLATE_AMOUNT","ELEMENT_TRANSLATE_AMOUNT","TEXT_TO_CENTER_SNAP_THRESHOLD","SHIFT_LOCKING_ANGLE","Math","PI","CURSOR_TYPE","TEXT","CROSSHAIR","GRABBING","GRAB","POINTER","MOVE","AUTO","POINTER_BUTTON","MAIN","WHEEL","SECONDARY","TOUCH","ENV","TEST","DEVELOPMENT","CLASSES","SHAPE_ACTIONS_MENU","FONT_FAMILY","Virgil","Helvetica","Cascadia","THEME","LIGHT","DARK","WINDOWS_EMOJI_FALLBACK_FONT","DEFAULT_FONT_SIZE","DEFAULT_FONT_FAMILY","DEFAULT_TEXT_ALIGN","DEFAULT_VERTICAL_ALIGN","DEFAULT_VERSION","GRID_SIZE","MIME_TYPES","wb","wblib","json","svg","png","jpg","gif","binary","EXPORT_DATA_TYPES","excalidraw","excalidrawClipboard","excalidrawLibrary","EXPORT_SOURCE","window","location","origin","IMAGE_RENDER_TIMEOUT","TAP_TWICE_TIMEOUT","TOUCH_CTX_MENU_TIMEOUT","TOAST_TIMEOUT","VERSION_TIMEOUT","SCROLL_TIMEOUT","ZOOM_STEP","HYPERLINK_TOOLTIP_DELAY","IDLE_THRESHOLD","ACTIVE_THRESHOLD","MODES","VIEW","ZEN","GRID","THEME_FILTER","cssVariables","themeFilter","URL_QUERY_KEYS","addLibrary","URL_HASH_KEYS","DEFAULT_UI_OPTIONS","canvasActions","changeViewBackgroundColor","clearCanvas","export","saveFileToDisk","loadScene","saveToActiveFile","theme","saveAsImage","MQ_MAX_WIDTH_PORTRAIT","MQ_MAX_WIDTH_LANDSCAPE","MQ_MAX_HEIGHT_LANDSCAPE","MAX_DECIMALS_FOR_SVG_EXPORT","EXPORT_SCALES","DEFAULT_EXPORT_PADDING","DEFAULT_MAX_IMAGE_WIDTH_OR_HEIGHT","ALLOWED_IMAGE_MIME_TYPES","MAX_ALLOWED_FILE_BYTES","SVG_NS","ENCRYPTION_KEY_BITS","VERSIONS","BOUND_TEXT_PADDING","VERTICAL_ALIGN","TOP","MIDDLE","BOTTOM","mockDateTime","getDateTime","date","Date","year","getFullYear","month","getMonth","padStart","day","getDate","hr","getHours","min","getMinutes","capitalizeString","str","charAt","toUpperCase","slice","isToolIcon","target","HTMLElement","className","includes","isInputLike","dataset","type","HTMLBRElement","HTMLInputElement","HTMLTextAreaElement","HTMLSelectElement","isWritableElement","getFontFamilyString","fontFamily","Object","entries","fontFamilyString","getFontString","fontSize","debounce","fn","timeout","handle","lastArgs","ret","args","clearTimeout","setTimeout","flush","_lastArgs","cancel","chunk","array","size","length","index","resIndex","result","Array","ceil","distance","x","y","abs","resetCursor","canvas","style","cursor","setCursor","setCursorForShape","shape","isFullScreen","document","fullscreenElement","nodeName","allowFullScreen","documentElement","requestFullscreen","exitFullScreen","exitFullscreen","getShortcutKey","shortcut","replace","isDarwin","viewportCoordsToSceneCoords","clientX","clientY","zoom","offsetLeft","offsetTop","scrollX","scrollY","invScale","value","sceneCoordsToViewportCoords","sceneX","sceneY","getGlobalCSSVariable","name","getComputedStyle","getPropertyValue","RE_RTL_CHECK","RegExp","isRTL","text","test","tupleToCoors","xyTuple","muteFSAbortError","error","console","warn","findIndex","cb","fromIndex","max","findLastIndex","isTransparent","color","isRGBTransparent","substr","isRRGGBBTransparent","colors","elementBackground","resolvablePromise","resolve","reject","promise","Promise","_resolve","_reject","withBatchedUpdates","func","event","unstable_batchedUpdates","withBatchedUpdatesThrottled","callback","requestAnimationFrame","cancelAnimationFrame","_callback","throttleRAF","nFormatter","num","digits","si","symbol","toFixed","getVersion","querySelector","content","supportsEmoji","ctx","createElement","getContext","fillStyle","textBaseline","font","fillText","getImageData","data","getNearestScrollableContainer","element","parent","parentElement","body","overflowY","scrollHeight","clientHeight","focusNearestParent","tabIndex","focus","preventUnload","preventDefault","returnValue","bytesToHexString","bytes","from","map","byte","toString","join","getUpdatedTimestamp","isTestEnv","now","arrayToMap","items","reduce","acc","set","id","Map","process","NODE_ENV","wrapEvent","nativeEvent","CustomEvent","detail","cancelable","navigator","platform","isWindows","isAndroid","userAgent","CODES","EQUAL","MINUS","NUM_ADD","NUM_SUBTRACT","NUM_ZERO","BRACKET_RIGHT","BRACKET_LEFT","ONE","TWO","NINE","QUOTE","ZERO","SLASH","C","D","G","F","H","V","X","Z","R","KEYS","ARROW_DOWN","ARROW_LEFT","ARROW_RIGHT","ARROW_UP","BACKSPACE","ALT","CTRL_OR_CMD","DELETE","ENTER","ESCAPE","QUESTION_MARK","SPACE","TAB","CHEVRON_LEFT","CHEVRON_RIGHT","PERIOD","COMMA","A","E","I","L","O","P","Q","S","T","Y","K","isArrowKey","key","shouldResizeFromCenter","altKey","shouldMaintainAspectRatio","shiftKey","shouldRotateWithDiscreteAngle","trackEvent","REACT_APP_GOOGLE_ANALYTICS_ID","gtag","category","action","label","event_category","event_label","JEST_WORKER_ID","IV_LENGTH_BYTES","createIV","arr","Uint8Array","crypto","getRandomValues","generateEncryptionKey","returnAs","a","subtle","generateKey","exportKey","k","getCryptoKey","usage","importKey","alg","ext","key_ops","kty","encryptData","importedKey","iv","TextEncoder","encode","Blob","arrayBuffer","buffer","encrypt","encryptedBuffer","decryptData","encrypted","privateKey","decrypt","shades","oc","red","pink","grape","violet","indigo","blue","cyan","teal","green","lime","yellow","orange","canvasBackground","white","gray","elementStroke","black","toByteString","blob","reader","FileReader","onload","Error","readAsBinaryString","byteStringToArrayBuffer","byteString","ArrayBuffer","bufferView","i","len","charCodeAt","byteStringToString","TextDecoder","decode","stringToBase64","btoa","base64ToString","base64","isByteString","atob","compress","deflate","deflated","version","encoding","compressed","encoded","decoded","inflate","to","DATA_VIEW_BITS_MAP","1","2","4","dataView","offset","pow","method","DataView","concatBuffers","buffers","byteLength","splitBuffers","concatenatedBuffer","chunkSize","push","_encryptAndCompress","encryptionKey","compressData","dataBuffer","options","fileInfo","compression","encryption","encodingMetadataBuffer","JSON","stringify","contentsMetadataBuffer","metadata","_decryptAndDecompress","decryptedBuffer","decryptionKey","isCompressed","decompressData","encodingMetadata","parse","contentsBuffer","module","exports","webpackAsyncContext","req","__webpack_require__","o","then","e","code","ids","all","t","keys","defaultLang","languages","rtl","concat","sort","left","right","filter","lang","percentages","TEST_LANG_CODE","unshift","currentLang","currentLangData","setLanguage","dir","startsWith","getLanguage","findPartsForData","parts","part","undefined","path","replacement","split","translation","fallbackLangData","String","defaultExportScale","devicePixelRatio","getDefaultAppState","collaborators","currentChartType","currentItemBackgroundColor","currentItemEndArrowhead","currentItemFillStyle","currentItemFontFamily","currentItemFontSize","currentItemLinearStrokeSharpness","currentItemOpacity","currentItemRoughness","currentItemStartArrowhead","currentItemStrokeColor","currentItemStrokeSharpness","currentItemStrokeStyle","currentItemStrokeWidth","currentItemTextAlign","cursorButton","draggingElement","editingElement","editingGroupId","editingLinearElement","elementLocked","elementType","penMode","penDetected","errorMessage","exportBackground","exportScale","exportEmbedScene","exportWithDarkMode","fileHandle","gridSize","isBindingEnabled","isLibraryOpen","isLoading","isResizing","isRotating","lastPointerDownWith","multiElement","openMenu","openPopup","pasteDialog","shown","previousSelectedElementIds","resizingElement","scrolledOutside","selectedElementIds","selectedGroupIds","selectionElement","shouldCacheIgnoreZoom","showHelpDialog","showStats","startBoundElement","suggestedBindings","toastMessage","viewBackgroundColor","zenModeEnabled","viewModeEnabled","pendingImageElement","showHyperlinkPopup","APP_STATE_STORAGE_CONF","browser","server","height","width","_clearAppStateForStorage","appState","exportType","stateForExport","propConfig","nextValue","clearAppStateForLocalStorage","cleanAppStateForExport","clearAppStateForDatabase","useCallbackRefState","useState","refValue","setRefValue","useCallback","isInitializedImageElement","fileId","isImageElement","isTextElement","isFreeDrawElement","isFreeDrawElementType","isLinearElement","isLinearElementType","isBindingElement","isBindingElementType","isBindableElement","containerId","isTextBindableContainer","hasBoundTextElement","boundElements","some","isBoundToContainer","rotate","x1","y1","x2","y2","angle","cos","sin","rotatePoint","point","center","adjustXYWithRotation","sides","deltaX1","deltaY1","deltaX2","deltaY2","w","n","s","distance2d","xd","yd","hypot","isPathALoop","points","zoomValue","first","last","isPointInPolygon","vertices","extreme","Number","MAX_SAFE_INTEGER","p","count","current","next","doSegmentsIntersect","orderedColinearOrientation","isPointWithinBounds","q","r","val","p1","q1","p2","q2","o1","o2","o3","o4","getGridPoint","round","getSizeFromPoints","xs","ys","rescalePoints","dimension","nextDimensionSize","prevPoints","prevDimValues","prevMaxDimension","prevMinDimension","prevDimensionSize","dimensionScaleFactor","nextMinDimension","Infinity","scaledPoints","prevPoint","currentDimension","scaledValue","scaledPoint","getElementAbsoluteCoords","getFreeDrawElementAbsoluteCoords","getLinearElementAbsoluteCoords","getCurvePathOps","sets","ops","getMinMaxXYFromCurvePathOps","transformXY","currentP","limits","op","p3","p0","equation","idx","minY","minX","maxX","maxY","getBoundsFromPoints","coords","getShapeForElement","getElementBounds","bounds","cx","cy","getLinearElementRotatedBounds","x11","y11","x12","y12","x22","y22","x21","y21","h","ww","hh","getCommonBounds","elements","forEach","getResizedElementAbsoluteCoords","nextWidth","nextHeight","gen","rough","generator","curve","strokeSharpness","linearPath","generateRoughOptions","getElementPointsCoords","sharpness","getCommonBoundingBox","midX","midY","isIdKey","elementKey","Scene","callbacks","Set","nonDeletedElements","elementsMap","this","get","getElement","isNonDeletedElement","getNonDeletedElement","nextElements","clear","mapElementToScene","getNonDeletedElements","informMutation","has","add","delete","sceneMapById","scene","sceneMapByElement","WeakMap","redrawTextBoundingBox","container","maxWidth","wrapText","originalText","metrics","measureText","coordY","verticalAlign","mutateElement","baseline","bindTextToShapeAfterDuplication","sceneElements","oldElements","oldIdToDuplicatedId","sceneElementMap","newElementId","boundTextElementId","getBoundTextElementId","newTextElementId","newContainer","newTextElement","handleBindTextResize","transformHandleType","textElement","getScene","updatedY","containerHeight","nextBaseLine","dimensions","diff","position","whiteSpace","minHeight","lineHeight","getApproxLineHeight","overflow","wordBreak","appendChild","innerText","span","display","offsetHeight","offsetWidth","removeChild","DUMMY_TEXT","toLocaleUpperCase","cacheApproxLineHeight","getTextWidth","canvas2dContext","containerWidth","lines","originalLines","spaceWidth","originalLine","words","currentLine","currentLineWidthTillNow","currentChar","charWidth","calculate","word","cachedCharWidth","char","ascii","getCache","getApproxMinLineWidth","maxCharWidth","getMaxCharWidth","getApproxMinLineHeight","cache","cacheWithOutEmpty","ele","getBoundTextElement","getContainerElement","IMAGE_INVERT_FILTER","defaultAppState","isPendingImageElement","renderConfig","imageCache","shouldResetImageFilter","mimeType","getDashArrayDashed","strokeWidth","getDashArrayDotted","getCanvasPadding","IMAGE_PLACEHOLDER_IMG","src","encodeURIComponent","IMAGE_ERROR_PLACEHOLDER_IMG","drawElementOnCanvas","rc","context","globalAlpha","opacity","lineJoin","lineCap","draw","save","strokeColor","pathsCache","getFreeDrawPath2D","fillShape","fill","restore","img","image","fillRect","imageMinWidthOrHeight","drawImage","status","drawImagePlaceholder","shouldTemporarilyAttach","isConnected","setAttribute","textAlign","verticalOffset","horizontalOffset","remove","elementWithCanvasCache","shapeCache","setShapeForElement","invalidateShapeForElement","continuousPath","seed","strokeLineDash","strokeStyle","disableMultiStroke","fillWeight","hachureGap","roughness","stroke","preserveVertices","backgroundColor","curveFitting","generateElementShape","rectangle","topX","floor","rightX","rightY","getDiamondPoints","topY","bottomX","bottomY","leftX","leftY","polygon","ellipse","startArrowhead","endArrowhead","getArrowheadShapes","arrowhead","arrowheadPoints","prevOp","nx","ny","arrow","bar","dot","triangle","px","py","minSize","x3","y3","getArrowheadPoints","circle","x4","y4","dash","line","shapes","generateFreeDrawShape","generateElementWithCanvas","prevElementWithCanvas","shouldRegenerateBecauseZoom","canvasZoom","elementWithCanvas","padding","canvasOffsetX","canvasOffsetY","translate","scale","generateElementCanvas","drawElementFromCanvas","_isPendingImageElement","scaleXFactor","scaleYFactor","renderElement","isExporting","shiftX","shiftY","roughSVGDrawWithPrecision","rsvg","drawable","precision","pshape","fixedDecimalPlaceDigits","renderElementToSvg","svgRoot","files","offsetX","offsetY","degree","root","link","anchorTag","ownerDocument","createElementNS","node","group","getFreeDrawSvgPath","fileData","symbolId","dataURL","prepend","use","direction","textAnchor","textContent","svgPathData","Path2D","inputPoints","simulatePressure","pressures","thinning","smoothing","streamline","easing","lastCommittedPoint","med","TO_FIXED_PRECISION","getSvgPathFromStroke","getStroke","B","random","Random","testIdBase","randomInteger","randomId","nanoid","updates","didChange","prevScale","nextScale","nextPoints","didChangePoints","nextPoint","versionNonce","updated","newElementWith","bumpVersion","isInvisiblySmallElement","getPerfectElementSize","absWidth","absHeight","lockedAngle","atan","tan","sign","getNormalizedDimensions","selectGroup","groupId","elementsInGroup","groupIds","fromEntries","isSelectedViaGroup","getSelectedGroupForElement","find","getSelectedGroupIds","selectGroupsForSelectedElements","nextAppState","selectedElements","getSelectedElements","indexOfEditingGroup","indexOf","isElementInGroup","getElementsInGroup","addToGroup","prevGroupIds","newGroupId","positionOfEditingGroupId","positionToInsert","splice","getMaximumGroups","groups","currentGroupMembers","boundTextElement","values","_newElementBase","rest","isDeleted","newElement","opts","getTextElementPositionOffsets","offsets","updateTextElement","nextText","nextBaseline","prevMetrics","isFinite","getAdjustedDimensions","newLinearElement","startBinding","endBinding","deepCopyElement","depth","prototype","call","tmp","constructor","create","getPrototypeOf","hasOwnProperty","isArray","duplicateElement","groupIdMapForOperation","overrides","copy","app","getSceneElementsIncludingDeleted","el","mapper","endIndex","getNewGroupIdsForDuplication","assign","transformHandleSizes","mouse","pen","touch","OMIT_SIDES_FOR_MULTIPLE_ELEMENTS","OMIT_SIDES_FOR_TEXT_ELEMENT","OMIT_SIDES_FOR_LINE_SLASH","nw","se","OMIT_SIDES_FOR_LINE_BACKSLASH","ne","sw","generateTransformHandle","getTransformHandlesFromCoords","pointerType","omitSides","handleWidth","handleHeight","handleMarginX","handleMarginY","dashedLineMargin","centeringOffset","transformHandles","rotation","minimumSizeForEightHandles","getTransformHandles","nvector","reverse","b","isNumber","sub","mul","mulScalar","meet","joinScalar","norm","sqrt","inorm","normalized","inormalized","c","GA","through","orthogonal","toTuple","intersect","line1","line2","point1","point2","distanceToLine","pivot","apply","motor","hitTest","threshold","isElementSelected","isPointHittingElementBoundingBox","isHittingElementNotConsideringBoundingBox","isHittingElementBoundingBoxWithoutHittingElement","check","isStrictlyInside","isDraggableFromInside","isElementDraggableFromInside","isInsideCheck","isNearCheck","hitTestPointAgainstElement","rotatedX","rotatedY","bindingBorderTest","maxBindingGap","isOutsideCheck","elementWidth","elementHeight","smallerDimension","distanceToBindableElement","distanceToRectangle","hitTestFreeDrawElement","hitTestLinear","distanceToDiamond","distanceToEllipse","pointRelativeToElement","pointRel","hwidth","hheight","GAPoint","GALine","side","ellipseParamsForTest","tangent","tx","ty","_","xx","yy","ex","ey","rx","ry","qx","qy","intersection","closestPoint","rotatedPoint","delta","U","d","da","db","hitTestRoughShape","pointAbs","side1","side2","relX","relY","subshape","hitTestCurveInside","pointTuple","elementCoords","coordsCenter","GATransform","pointRotated","pointRelToCenterAbs","GADirection","elementPos","pointRelToPos","ax","ay","relativizationToElementCenter","bx","by","determineFocusDistance","relateToCenter","aRel","bRel","m","mabs","nabs","getSortedElementLineIntersections","nearPoint","intersections","gap","corners","getCorners","flatMap","edge","intersectSegment","offsetSegment","getCircleIntersections","getEllipseIntersections","sortedIntersections","i1","i2","hx","hy","segment","squares","discr","discrRoot","xn","yn","radius","findFocusPointForEllipse","relativeDistance","relativeDistanceAbs","orientation","pyo","findFocusPointForRectangulars","maxDistance","tangentPoint","corner","odd","operation","polygonPoints","pointsOnBezierCurves","lineThreshold","mx","my","pointInBezierEquation","isInsideTransformHandle","transformHandle","getElementWithTransformHandleType","scenePointerX","scenePointerY","rotationTransformHandle","resizeTest","getTransformHandleTypeFromCoords","RESIZE_CURSORS","getCursorForResizingElement","shouldSwapCursors","rotateResizeCursor","LinearElementEditor","elementId","selectedPointsIndices","pointerDownState","isDragging","lastUncommittedPoint","pointerOffset","startBindingElement","endBindingElement","normalizePoints","prevSelectedPointsIndices","lastClickedPoint","setState","selectionX1","selectionY1","selectionX2","selectionY2","nextSelectedPoints","getPointsGlobalCoordinates","maybeSuggestBinding","draggingPoint","newDraggingPointPosition","createPointAt","deltaX","deltaY","movePoints","pointIndex","getPointGlobalCoordinates","lastSelectedIndex","bindings","selectedPoint","bindingElement","getHoveredElementForBinding","getPointAtIndexGlobalCoordinates","history","scenePointer","didAddPoint","hitElement","resumeRecording","clickedPointIndex","getPointIndexUnderCursor","bindOrUnbindLinearElement","targetPoint","nextSelectedPointsIndices","normalizeSelectedPoints","lastPoint","deletePoints","newPoint","addPoints","indexMaybeFromEnd","absoluteCoords","pointHandles","POINT_HANDLE_SIZE","pointerOnGrid","_idx","getNormalizedPoints","nextSelectedIndices","pointAddedToEnd","indexCursor","pointIndices","firstNonDeletedPoint","_updatePoints","targetPoints","otherUpdates","selectedOriginPoint","selectedPointData","nextCoords","prevCoords","nextCenterX","nextCenterY","prevCenterX","prevCenterY","rotated","linearElement","boundToElementIds","unboundFromElementIds","bindOrUnbindLinearElementEdge","onlyUnbound","bindableElement","otherEdgeBindableElement","startOrEnd","isLinearElementSimpleAndAlreadyBoundOnOppositeEdge","bindLinearElement","unbound","unbindLinearElement","bindOrUnbindSelectedElements","getElligibleElementForBindingElement","maybeBindBindableElement","getElligibleElementsForBindableElementAndWhere","where","maybeBindLinearElement","pointerCoords","hoveredElement","calculateFocusAndGap","otherBinding","isLinearElementSimpleAndAlreadyBound","alreadyBoundToId","unbindLinearElements","field","binding","getElementAtPosition","getElements","edgePointIndex","adjacentPointIndex","edgePoint","adjacentPoint","updateBoundElements","changedElement","boundLinearElements","newSize","simultaneouslyUpdated","simultaneouslyUpdatedElementIds","getSimultaneouslyUpdatedElementIds","doesNeedUpdate","maybeCalculateNewGapWhenScaling","updateBoundPoint","boundElement","newEdgePoint","focusPointAbsolute","adjecentPoint","adjecentPointRel","reverseRelateToCenter","determineFocusPoint","intersectElementWithLine","pointFromAbsoluteCoords","currentBinding","newWidth","newHeight","getElligibleElementsForBindingElement","getLinearElementEdgeCoors","canBindStart","isLinearElementEligibleForNewBindingByBindable","canBindEnd","maybeElement","fixBindingsAfterDuplication","duplicatesServeAsOld","allBoundElementIds","allBindableElementIds","shouldReverseRoles","oldElement","newBindingAfterDuplication","fixBindingsAfterDeletion","deletedElements","deletedElementIds","boundElementIds","deletedElement","newBindingAfterDeletion","normalizeAngle","rotateSingleElement","pointerX","pointerY","atan2","reshapeSingleTwoPointElement","resizeArrowDirection","getPerfectElementSizeWithRotation","nextElementX","nextElementY","rescalePointsInElement","measureFontSizeFromWH","nextFontSize","resizeSingleTextElement","nextFont","getSidesForTransformHandle","resizeSingleElement","originalElements","transformHandleDirection","stateAtResizeStart","startTopLeft","startBottomRight","startCenter","rotatedPointer","esx1","esy1","boundsCurrentWidth","boundsCurrentHeight","scaleX","scaleY","boundTextFont","eleInitialWidth","eleInitialHeight","eleNewWidth","eleNewHeight","widthRatio","heightRatio","ratio","stateOfBoundTextElementAtResize","minWidth","newBoundsX1","newBoundsY1","newBoundsWidth","newBoundsHeight","newTopLeft","bottomLeft","topRight","rotatedTopLeft","newCenter","rotatedNewCenter","rescaledPoints","newOrigin","resizedElement","resizeMultipleElements","getNextXY","origX1","origY1","finalX1","finalY1","origX2","origY2","finalX2","finalY2","prev","origCoords","finalCoords","rotateMultipleElements","centerX","centerY","centerAngle","origAngle","rotatedCX","rotatedCY","updateElementCoords","lockDirection","distanceX","distanceY","lockX","lockY","original","dragNewElement","originX","originY","widthAspectRatio","newX","newY","ButtonIconSelect","onChange","option","clsx","active","title","checked","data-testid","testId","icon","Popover","children","top","onCloseRequest","fitInViewport","viewportWidth","innerWidth","viewportHeight","innerHeight","popoverRef","useRef","useLayoutEffect","getBoundingClientRect","useEffect","handler","contains","addEventListener","removeEventListener","ref","isCustomColor","isValidColor","Option","keyBindings","flat","Picker","onClose","showInput","firstItem","React","activeItem","gallery","colorInput","customColors","updatedElements","ele1","ele2","colorType","getCustomColors","renderColors","custom","_color","_colorWithoutHash","keyBinding","onClick","currentTarget","aria-label","aria-keyshortcuts","onFocus","role","aria-modal","onKeyDown","activeElement","isCustom","parentSelector","nextIndex","toLowerCase","actualIndex","stopImmediatePropagation","stopPropagation","ColorInput","forwardRef","innerValue","setInnerValue","inputRef","useImperativeHandle","changeColor","inputValue","getColor","spellCheck","onBlur","ColorPicker","isActive","setActive","pickerButton","Suspense","fallback","changedColor","rFirstItem","rActiveItem","rGallery","pressedOption","metaKey","ctrlKey","IconPicker","rPickerButton","activeElementColor","handlerColor","createIcon","mirror","aria-hidden","focusable","viewBox","checkIcon","saveAs","load","clipboard","trash","palette","exportFile","exportToFileIcon","zoomIn","zoomOut","done","menu","undo","redo","questionCircle","share","shareIOS","shareWindows","BringForwardIcon","memo","SendBackwardIcon","BringToFrontIcon","SendToBackIcon","AlignTopIcon","strokeLinecap","AlignBottomIcon","AlignLeftIcon","AlignRightIcon","DistributeHorizontallyIcon","DistributeVerticallyIcon","CenterVerticallyIcon","strokeDasharray","CenterHorizontallyIcon","users","start","stop","close","back","marginLeft","clone","shield","file","GroupIcon","UngroupIcon","FillHachureIcon","fillRule","clipRule","FillCrossHatchIcon","FillSolidIcon","StrokeWidthIcon","StrokeStyleSolidIcon","StrokeStyleDashedIcon","StrokeStyleDottedIcon","SloppinessArchitectIcon","SloppinessArtistIcon","SloppinessCartoonistIcon","EdgeSharpIcon","EdgeRoundIcon","ArrowheadNoneIcon","ArrowheadArrowIcon","flip","transform","ArrowheadDotIcon","ArrowheadBarIcon","ArrowheadTriangleIcon","FontSizeSmallIcon","FontSizeMediumIcon","FontSizeLargeIcon","FontSizeExtraLargeIcon","FontFamilyHandDrawnIcon","FontFamilyNormalIcon","FontFamilyCodeIcon","TextAlignLeftIcon","TextAlignCenterIcon","TextAlignRightIcon","TextAlignTopIcon","TextAlignBottomIcon","TextAlignMiddleIcon","publishIcon","editIcon","hasBackground","hasStrokeColor","hasStrokeWidth","hasStrokeStyle","canChangeSharpness","hasText","canHaveArrowheads","isAtPositionFn","getElementsAtPosition","getTextBindableContainerAtPosition","actions","register","changeProperty","includeBoundText","getFormValue","getAttribute","defaultValue","isSomeElementSelected","getCommonAttributeOfSelectedElements","changeFontSize","getNewFontSize","fallbackValue","newFontSizes","newFontSize","prevElement","nextElement","commitToHistory","actionDecreaseFontSize","perform","PanelComponent","updateData","step","onWheel","keyTest","actionIncreaseFontSize","targetElements","getTargetElements","shouldUpdateForNonLinearElements","every","shouldUpdateForLinearElements","CanvasError","message","AbortError","DOMException","Spinner","circleWidth","strokeMiterlimit","ToolButton","props","excalId","useExcalidrawContainer","innerRef","sizeCn","setIsLoading","isMountedRef","lastPointerTypeRef","visible","hidden","ToolIcon","selected","disabled","keyBindingLabel","showAriaLabel","onPointerDown","onPointerUp","defaultProps","UserIdleState","DarkModeToggle","ICONS","MOON","SUN","centerScrollOn","scenePoint","viewportDimensions","calculateScrollCenter","getVisibleElements","cords","viewportX1","viewportY1","viewportX2","viewportY2","isOutsideViewPort","minDistance","closestElement","getClosestElementBounds","getNormalizedZoom","getStateForZoom","viewportX","viewportY","nextZoom","appLayerX","appLayerY","currentZoom","getTooltipDiv","existingDiv","div","classList","updateTooltipPosition","tooltip","item","tooltipRect","margin","Tooltip","long","onPointerEnter","itemRect","updateTooltip","onPointerLeave","ConfirmDialog","onConfirm","onCancel","confirmText","cancelText","small","ClearCanvas","showDialog","setShowDialog","toggleDialog","useIsMobile","actionZoomIn","_elements","actionZoomOut","zoomValueToFitBoundsOnViewport","commonBoundsWidth","zoomValueForWidth","commonBoundsHeight","zoomValueForHeight","smallestZoomValue","zoomAdjustedToSteps","zoomToFitElements","zoomToSelection","commonBounds","newZoom","getTransform","marginInlineStart","maxHeight","translateX","translateY","textWysiwyg","originalContainerHeight","onSubmit","getViewportCoords","excalidrawContainer","updateWysiwygStyle","state","updatedElement","approxLineHeight","coordX","propertiesUpdated","editable","currentFont","textPropertiesUpdated","editorHeight","initialSelectionStart","selectionStart","initialSelectionEnd","selectionEnd","initialLength","editorMaxHeight","wrap","backfaceVisibility","border","outline","resize","background","zIndex","overflowWrap","oninput","onkeydown","actionManager","executeAction","submittedViaKeyboard","handleSubmit","isComposing","keyCode","outdent","indent","dispatchEvent","Event","repeat","RE_LEADING_TAB","linesStartIndices","getSelectedLinesStartIndices","startIndex","startValue","endValue","removedTabs","tabMatch","match","startOffset","startIndices","stopEvent","cleanup","updateElement","viaKeyboard","isDestroyed","onblur","observer","disconnect","bindBlurEvent","unbindUpdate","isTargetColorPicker","closest","SVGElement","addCallback","select","ResizeObserver","observe","passive","capture","showSelectedShapeActions","Boolean","getSceneVersion","_clearElements","clearElementsForDatabase","clearElementsForExport","clearElementsForLocalStorage","isOverScrollBars","scrollBars","horizontal","vertical","scrollBar","isOverHorizontal","isOverVertical","isOverEither","attributes","includeBoundTextElement","handleGroupEditingState","siblingElements","actionDeleteSelected","deleteSelectedElements","contextItemLabel","getIndicesToMove","selectedIndices","deletedIndices","includeDeletedIndex","getTargetIndexAccountingForBinding","containerElement","boundElementId","getTargetElementsMap","indices","shiftElements","indicesToMove","targetElementsMap","groupedIndices","toContiguousGroups","leadingIndex","trailingIndex","boundaryIndex","targetIndex","sourceElement","indexFilter","candidateIndex","siblingGroupId","elementsInSiblingGroup","getTargetIndex","leadingElements","displacedElements","trailingElements","shiftElementsToEnd","groupElements","moveOneLeft","moveOneRight","moveAllLeft","moveAllRight","actionSendBackward","keyPriority","actionBringForward","actionSendToBack","actionBringToFront","actionSelectAll","actionDuplicateSelection","duplicateSelectedPoints","duplicateElements","groupIdMap","newElements","duplicateAndOffsetElement","finalElements","actionFinalize","focusContainer","multiPointElement","isLoop","linePoints","firstPoint","ProjectName","fileName","setFileName","htmlFor","isNameEditable","blur","getClientColors","clientId","currentUser","sum","backgrounds","strokes","EXTERNAL_LINK_IMG","linkCanvasCache","IS_HYPERLINK_TOOLTIP_VISIBLE","Hyperlink","setAppState","onLinkOpen","linkVal","inputVal","setInputVal","isEditing","normalizeLink","timeoutId","handlePointerMove","shouldHideLinkPopup","POINTER_MOVE","handleRemove","getCoordsForPopover","placeholder","autoFocus","href","isLocalLink","customEvent","EXCALIDRAW_LINK","defaultPrevented","rel","CONTAINER_WIDTH","trim","actionLink","source","getContextMenuLabel","contextItemPredicate","getLinkHandleFromCoords","linkWidth","linkHeight","linkMarginY","isPointHittingLinkIcon","isMobile","linkX","linkY","HYPERLINK_TOOLTIP_TIMEOUT_ID","renderTooltip","tooltipDiv","linkViewportCoords","popoverX","popoverY","CONTAINER_PADDING","hasEmojiSupport","strokeRectWithRotation","strokeRect","fillCircle","beginPath","arc","renderScene","atLeastOneVisibleElement","renderScrollbars","renderSelection","renderGrid","setTransform","normalizedCanvasWidth","normalizedCanvasHeight","clearRect","moveTo","lineTo","strokeGrid","visibleElements","isVisibleElement","renderLinkIcon","lineWidth","setLineDash","renderLinearPointHandles","suggestedBinding","renderBindingHighlight","selections","selectionColors","remoteSelectedElementIds","socketId","elementX1","elementY1","elementX2","elementY2","addSelectionForGroupId","selection","renderSelectionBorder","locallySelectedElements","renderTransformHandles","dashedLinePadding","initialLineDash","getLineDash","remotePointerViewportCoords","isOutOfBounds","userState","remotePointerUserStates","AWAY","remotePointerButton","closePath","username","remotePointerUsernames","idleState","IDLE","ACTIVE","usernameAndIdleState","measure","measureHeight","actualBoundingBoxDescent","actualBoundingBoxAscent","elementsMinX","elementsMinY","elementsMaxX","elementsMaxY","viewportWidthWithZoom","viewportHeightWithZoom","viewportWidthDiff","viewportHeightDiff","safeArea","parseInt","bottom","viewportMinX","viewportMinY","viewportMaxX","viewportMaxY","sceneMinX","sceneMinY","sceneMaxX","sceneMaxY","SCROLLBAR_MARGIN","getScrollBars","quadraticCurveTo","roundRect","SCROLLBAR_WIDTH","elementProperties","dashWidth","lineDashOffset","renderHighlight","renderBindingHighlightForSuggestedPointBinding","renderBindingHighlightForBindableElement","strokeOffset","strokeDiamondWithRotation","strokeEllipseWithRotation","linkCanvasCacheContext","canvasWidth","canvasHeight","viewTransformations","topLeftSceneCoords","bottomRightSceneCoords","renderSceneToSvg","fileOpen","mimeTypes","extensions","_fileOpen","description","multiple","legacySetup","input","scheduleRejection","focusHandler","checkForFile","KEYUP","POINTER_UP","FOCUS","interval","setInterval","rejectPromise","clearInterval","fileSave","_fileSave","extension","AllowedExcalidrawElementTypes","diamond","freedraw","restoreElementWithProperties","extra","base","restoreElement","fontFamilyName","fontPx","_fontFamily","restoreElements","localElements","localElementsMap","migratedElement","localElement","restoreAppState","localAppState","suppliedValue","localValue","restoreLibraryItems","libraryItems","defaultStatus","restoredItems","created","_item","parseFileContents","decodePngMetadata","contents","readAsText","onloadend","readyState","DONE","decodeSvgMetadata","getFileHandleType","isImageFileHandle","isSupportedImageFile","loadFromBlob","isValidExcalidrawData","loadLibraryFromBlob","canvasToBlob","toBlob","generateIdFromFile","digest","hashBuffer","getDataURL","onerror","readAsDataURL","dataURLToFile","filename","dataIndexStart","ab","ia","File","resizeImageFile","res","default","pica","imageBlobReduce","features","outputType","_create_blob","env","out_canvas","out_blob","maxWidthOrHeight","SVGStringToFile","SVGString","filterOutDeletedFiles","nextFiles","serializeAsJSON","saveAsJSON","serialized","loadFromJSON","isValidLibrary","saveLibraryAsJSON","importLibraryFromJSON","library","importLibrary","loadHTMLImageElement","Image","updateImageCache","fileIds","updatedFiles","erroredFiles","promises","imagePromise","getInitializedImageElements","normalizeSVG","doc","DOMParser","parseFromString","hasAttribute","outerHTML","SVG_EXPORT_TAG","exportToCanvas","exportPadding","createCanvas","getCanvasSize","exportToSvg","encodeSvgMetadata","innerHTML","rect","BAR_WIDTH","BAR_GAP","BAR_HEIGHT","NOT_SPREADSHEET","VALID_SPREADSHEET","tryParseNumber","exec","parseFloat","isNumericColumn","columnIndex","tryParseCells","cells","numCols","reason","hasHeader","spreadsheet","labels","valueColumnIndex","labelColumnIndex","rows","row","bgColors","commonProps","getChartDimentions","chartWidth","chartHeight","chartBaseElements","debug","debugRect","chartXLabels","minYLabel","toLocaleString","chartYLabels","chartLines","renderSpreadsheet","chartType","dots","chartTypeLine","bars","barHeight","chartTypeBar","CLIPBOARD","PREFER_APP_CLIPBOARD","probablySupportsClipboardReadText","probablySupportsClipboardWriteText","probablySupportsClipboardBlob","HTMLCanvasElement","copyToClipboard","copyTextToSystemClipboard","getAppClipboard","parsePotentialSpreadsheet","numColsFirstLine","transposedResults","nextCells","col","nextCellRow","transposeCells","tryParseSpreadsheet","getSystemClipboard","clipboardData","getData","readText","parseClipboard","systemClipboard","spreadsheetResult","appClipboardData","systemClipboardData","copyBlobToClipboardAsPng","write","ClipboardItem","copied","writeText","copyTextViaExecCommand","textarea","yPosition","pageYOffset","scrollTop","success","setSelectionRange","execCommand","exportCanvas","tempSvg","tempCanvas","encodePngMetadata","resaveAsImageWithScene","fileHandleType","CheckboxItem","aria-checked","align","justifyContent","alignItems","justifyItems","ActiveFile","onSave","actionSaveFileToDisk","appProps","allElements","exportedElements","trunc","getExportSize","scaleButtonTitle","fileHandleExists","nativeFileSystemSupported","copiedStyles","loadedElements","loadedAppState","marginTop","marginBottom","actionCopyStyles","actionPasteStyles","pastedElement","HelpIcon","enableActionGroup","allElementsInSameGroup","actionGroup","selectedGroupId","elementIdsInGroup","selectElementIds","lastElementInGroup","lastGroupElementIndex","lastIndexOf","elementsAfterGroup","elementsBeforeGroup","updatedElementsInOrder","actionUngroup","boundTextElementIds","nextGroupIds","removeFromSelectedGroups","updateAppState","Avatar","actionAddToLibrary","collaborator","shortName","names","substring","firstName","lastName","getClientInitials","pointer","loadLibrary","saveLibrary","catch","calculateTranslation","selectionBoundingBox","axis","groupBoundingBox","noTranslation","alignSelectedElements","alignment","alignElements","updatedElementsMap","distributeSelectedElements","distribution","mid","end","extent","index0","g","index1","pos","box","distributeElements","actionFlipHorizontal","space","flipSelectedElements","eligibleElements","enableActionFlipHorizontal","actionFlipVertical","enableActionFlipVertical","flipDirection","flipElements","flipElement","rotateElement","originalX","originalY","originalAngle","finalOffsetX","usingNWHandle","newNCoordsX","nHandle","rotationAngle","actionCopy","actionCut","actionCopyAsSvg","_data","actionCopyAsPng","exportSelection","exportColorScheme","actionToggleGridMode","actionToggleZenMode","actionToggleStats","actionUnbindText","writeData","prevElements","updater","prevElementMap","nextElementMap","syncHistory","trackAction","ActionManager","getAppState","getElementsIncludingDeleted","renderAction","UIOptions","formState","actionResult","registerAction","Library","libraryCache","resetLibrary","libArr","onLibraryChange","restoreLibraryItem","libraryItem","libraryItemsFromStorage","prevLibraryItems","serializedItems","libraryFile","isUniqueitem","existingLibraryItems","targetLibraryItem","libItemExcalidrawItem","restoredLibItems","filteredItems","restoredItem","getCenter","pointers","allCoords","getDistance","clearAppStatePropertiesForHistory","History","elementCache","recording","stateHistory","redoStack","lastEntry","generateEntry","dehydrateHistoryEntry","dehydratedExcalidrawElement","versions","dehydratedHistoryEntry","hydrateHistoryEntry","nextEntry","newEntryDehydrated","newEntry","shouldCreateEntry","clearRedoStack","entryToRestore","pop","currentEntry","pushEntry","SHAPES","shortcutMap","cut","paste","copyStyles","pasteStyles","selectAll","duplicateSelection","sendBackward","bringForward","sendToBack","bringToFront","copyAsPng","copyAsSvg","ungroup","gridMode","zenMode","stats","addToLibrary","flipHorizontal","flipVertical","viewMode","hyperlink","getShortcutFromShortcutName","shortcuts","ContextMenu","onContextMenu","actionName","dangerous","checkmark","contextMenuNodeByContainer","params","of","render","contextMenuNode","unmountComponentAtNode","handleClose","getContextMenuNode","SelectedShapeActions","isSingleElementBoundContainer","showFillIcons","showChangeBackgroundIcons","commonSelectedType","ShapesSwitcher","onImageAction","letter","ZoomActions","BackgroundPickerAndDarkModeToggle","showThemeBtn","CollabButton","isCollaborating","collaboratorCount","i18nextLng","localStorage","getItem","langFlag","langUrl","open","supportsContextFilters","ErrorCanvasPreview","renderPreview","previewNode","ExportButton","shade","OpenColor","ImageExportModal","onExportToPng","onExportToSvg","onExportToClipboard","someElementIsSelected","exportSelected","setExportSelected","previewRef","gridTemplateColumns","userSelect","ImageExportDialog","modalIsShown","setModalIsShown","FixedSideContainer","HintViewer","hint","multiMode","targetElement","getHints","Island","LoadingMessage","CHECKED","xmlns","UNCHECKED","LockButton","Section","heading","header","aria-labelledby","UserList","mobile","UserList_mobile","LIBRARY_ICON","LibraryButton","DEFAULT_SIZE","PenModeButton","MobileMenu","libraryMenu","renderJSONExportDialog","renderImageExportDialog","onCollabButtonClick","onLockToggle","onPenModeToggle","renderCustomFooter","renderTopRightUI","insertOnCanvasDirectly","marginRight","client","Fragment","ChartPreviewBtn","chartElements","setChartElements","parentNode","PasteChartDialog","onInsertChart","handleChartClick","autofocus","Header","Columns","flexDirection","flexWrap","Column","ShortcutIsland","caption","Shortcut","flex","isOr","SCENE","ShortcutKey","HelpDialog","Card","JSONExportModal","exportOpts","onExportToBackend","renderCustomUI","JSONExportDialog","getDimensions","restoredElements","restoredAppState","_exportToCanvas","_exportToSvg","SingleLibraryItem","libItem","onRemove","svgRef","bind","fontWeight","LOCAL_STORAGE_KEY_PUBLISH_LIBRARY","generatePreviewImage","MAX_ITEMS_PER_ROW","BOX_SIZE","BOX_PADDING","BORDER_WIDTH","itemCanvas","rowOffset","colOffset","PublishLibrary","onSuccess","onError","updateItemsInStorage","authorName","githubHandle","twitterHandle","website","libraryData","setLibraryData","isSubmitting","setIsSubmitting","importPublishLibDataFromStorage","clonedLibItems","setClonedLibItems","onInputChange","erroredLibItems","isError","previewImage","libContent","lib","formData","FormData","append","fetch","response","ok","url","removeItem","statusText","err","onDialogClose","setItem","savePublishLibDataToStorage","shouldRenderForm","renderLibraryItems","required","pattern","PLUS_ICON","LibraryUnit","isPending","onToggle","isHovered","setIsHovered","adder","onMouseEnter","onMouseLeave","draggable","onDragStart","dataTransfer","setData","LibraryMenuItems","onRemoveFromLibrary","onAddToLibrary","onInsertShape","pendingElements","libraryReturnUrl","selectedItems","onPublish","renderRemoveLibAlert","setShowRemoveLibAlert","showRemoveLibAlert","CELLS_PER_ROW","isPublished","pathname","createLibraryItemCompo","renderLibrarySection","_items","rowItems","publishedItems","unpublishedItems","templateUrl","itemsSelected","resetLabel","renderLibraryActions","FILE_UPLOAD_MAX_BYTES","BROADCAST","FIREBASE_STORAGE_PREFIXES","STORAGE_KEYS","LOCAL_STATE_VERSIONS","isBrowserStorageStateNewer","sessionStorage","updateBrowserStateVersion","timestamp","filesStore","createStore","importUsernameFromLocalStorage","saveToLocalStorage","common_disk_0","common_disk_1","common_disk_2","localFileId","initTxt","initTitle","filetb","getStrSize","txt","sizeUnit","localDB","indexedDB","webkitIndexedDB","mozIndexedDB","msIndexedDB","request","onsuccess","iodrawdb","transaction","objectStore","onupgradeneeded","objectStoreNames","createObjectStore","keyPath","createIndex","unique","saveFile","txtNoFiles","txtNoFilesStr","getOne","updateTime","syncCount","syncTime","requestQuery","getNewFileTitle","requestUpadate","updateDB","put","getElementById","showFileMsg","uploadBaiduPan","requestAdd","obj","getTime","syncTitle","addDB","baiduToken","baiduUinfo","syncBaiduPanTime","nowDate","request1","oldSyncTitle","xhr","XMLHttpRequest","setRequestHeader","send","onreadystatechange","responseText","request2","xhr2","fileSuffix","suffix","lastChild","insertBefore","nextSibling","insertAfter","showFileMsgDiv","loopStart","time","hour","minute","autoSaveFile","elementsVlue","fileTitleInput","j","jsonObj","importFromLocalStorage","savedElements","savedState","untitled","showFileName","firstElementChild","whiteboardUrl","requestDB","decodeURIComponent","getElementsStorageSize","getTotalStorageSize","collab","ioDrawLibItems","ioDrawLib","getLibraryItemsFromStorage","getSelectedItems","LibraryMenu","listener","Element","useOnClickOutside","handleKeyDown","KEYDOWN","setLibraryItems","loadingState","setSelectedItems","showPublishLibraryDialog","setShowPublishLibraryDialog","publishLibSuccess","setPublishLibSuccess","loadingTimerRef","race","removeFromLibrary","nextItems","renderPublishSuccess","onPublishLibSuccess","nextLibItems","lastSelectedItem","setLastSelectedItem","alert","_id","rangeStart","rangeEnd","selectedItemsMap","nextSelectedIds","LayerUI","onInsertElements","showExitZenModeBtn","toggleZenMode","createExporter","Separator","closeLibrary","deselectItems","dialogs","shouldRenderSelectedShapeActions","renderFixedSideContainer","areEqual","getNecessaryObj","prevAppState","langCode","Stats","boundingBox","selectedBoundingBox","colSpan","renderCustomStats","Toast","clearToast","timerRef","scheduleTimeout","actionToggleViewMode","IsMobileContext","createContext","useContext","ExcalidrawContainerContext","didTapTwice","tappedTwiceTimer","cursorX","cursorY","isHoldingSpace","isPanning","isDraggingScrollBar","currentScrollBars","touchTimeout","invalidateContextMenu","lastPointerUp","gesture","lastCenter","initialDistance","initialScale","App","unmounted","detachIsMobileMqHandler","excalidrawContainerRef","createRef","resizeObserver","nearestScrollableContainer","excalidrawContainerValue","hitLinkElement","lastPointerDown","contextMenuOpen","getSceneElements","syncActionResult","replaceAllElements","replaceFiles","addNewImagesToImageCache","gridModeEnabled","setCurrentState","onUnload","disableEvent","onFontLoaded","onSceneUpdated","importLibraryFromUrl","token","hash","URLSearchParams","replaceState","search","query","confirm","numShapes","resetHistory","resetScene","resetLoadingState","initializeScene","launchQueue","setConsumer","launchParams","getFile","initialData","scrollToContent","libraryUrl","onResize","onScroll","getCanvasOffsets","onCut","cutAll","onCopy","copyAll","onTapStart","resetTapTwice","touches","handleCanvasDoubleClick","onTapEnd","resetContextMenuTimer","pasteFromClipboard","elementUnderCursor","elementFromPoint","string","endsWith","imageElement","createImageElement","insertImageElement","initializeImageDimensions","onPaste","addElementsFromPasteOrLibrary","addTextFromPaste","selectShapeTool","elementsCenterX","elementsCenterY","dx","dy","gridX","gridY","removePointer","pointerId","toggleLock","prevState","togglePenMode","toggleStats","setToastMessage","restoreFileFromShare","caches","webShareTargetCache","loadFileToCanvas","addFiles","filesMap","updateScene","sceneData","updateCurrentCursorPosition","Proxy","ev","prop","maybeSuggestBindingForAll","selectedElement","startTextEditing","shouldBind","findShapeByKey","onKeyUp","onGestureStart","onGestureChange","onGestureEnd","insertAtParentCenter","parentCenterPosition","getTextWysiwygSnappedToCenterPosition","existingTextElement","getTextElementAtPosition","fontString","elementCenterX","elementCenterY","handleTextWysiwyg","isExistingElement","getSelectedGroupIdForElement","getElementLinkAtPosition","hitElementIndex","redirectToLink","isTouchScreen","draggedDistance","lastPointerDownCoords","lastPointerDownHittingLinkIcon","lastPointerUpCoords","lastPointerUpHittingLinkIcon","newWindow","opener","handleCanvasPointerMove","savePointer","scaleFactor","zoomState","resetShouldCacheIgnoreZoomDebounced","isOverScrollBar","maybeSuggestBindingAtCursor","maybeSuggestBindingsForLinearElementAtCoords","buttons","elementWithTransformHandleType","showHyperlinkTooltip","isHittingCommonBoundingBoxOfSelectedElements","handleTouchMove","handleCanvasPointerDown","getSelection","anchorNode","removeAllRanges","maybeOpenContextMenuAfterPointerDownOnTouchDevices","maybeCleanupAfterMissingPointerUp","handleCanvasPanUsingWheelOrSpaceDrag","button","updateGestureOnPointerDown","initialPointerDownState","handleDraggingScrollBar","clearSelectionIfNotUsingSelection","updateBindingEnabledOnPointerMove","handleSelectionOnPointerDown","handleLinearElementOnPointerDown","handleFreeDrawElementOnPointerDown","createGenericElementOnPointerDown","onPointerMove","onPointerMoveFromPointerDownHandler","onPointerUpFromPointerDownHandler","onKeyDownFromPointerDownHandler","onKeyUpFromPointerDownHandler","eventListeners","onMove","onUp","handleTextOnPointerDown","handleCanvasPointerUp","handleCanvasContextMenu","nextPastePrevented","isLinux","lastX","lastY","preventNextPaste","PASTE","enableNextPaste","teardown","BLUR","handleType","getResizeOffsetXY","arrowDirection","getResizeArrowDirection","handlePointerDown","hit","hasHitElementInside","allHitElements","someHitElementIsSelected","isASelectedElement","hasHitCommonBoundingBoxOfSelectedElements","clearSelection","wasAddedToSelection","pressure","initializeImage","imageFile","_imageElement","showCursorImagePreview","generateIdForFile","existingFileData","maxSize","resizedFile","setImagePreviewCursor","cachedImageData","cursorImageSizePx","imagePreview","previewDataURL","toDataURL","forceNaturalSize","placeholderSize","naturalHeight","naturalWidth","_updateImageCache","imageElements","uncachedImageElements","scheduleImageRefresh","throttle","shouldEnableBinding","shouldEnableBindingForPointerEvent","hoveredBindableElement","oppositeBindingBoundElement","handleCanvasRef","handleWheel","TOUCH_START","TOUCH_END","handleAppOnDrop","getAsFileSystemHandle","libraryShapes","preferSelected","_openContextMenu","maybeDragNewGenericElement","lastCoords","aspectRatio","originInGrid","maybeHandleResize","resizeX","resizeY","transformElements","maybeGroupAction","maybeUngroupAction","maybeFlipHorizontal","maybeFlipVertical","separator","viewModeOptions","appStates","elementsWithUnbindedText","log10","isNaN","onPointerUpdate","pointersMap","updateDOMRect","currentWidth","currentHeight","currentOffsetTop","currentOffsetLeft","refresh","excalidrawRef","readyPromise","api","ready","getFiles","registerAll","undoOnce","redoOnce","createRedoAction","canvasScale","canvasDOMWidth","canvasDOMHeight","onPointerCancel","onTouchMove","onDoubleClick","renderFooter","onDrop","handleKeyboardGlobally","Provider","renderCanvas","defineProperties","configurable","addEventListeners","matchMedia","mediaQuery","matches","addListener","removeListener","removeEventListeners","destroy","COPY","CUT","SCROLL","MOUSE_MOVE","RESIZE","UNLOAD","DRAG_OVER","DROP","GESTURE_START","GESTURE_CHANGE","GESTURE_END","fonts","detectScroll","prevProps","updateLanguage","deselectElements","toggle","pointerViewportCoords","pointerUsernames","pointerUserStates","user","renderingElements","record","_element","elementIdToSelect","elementWithHighestZIndex","withCmdOrCtrl","scrollbars","hasBeenDuplicated","drag","hasOccurred","boxSelection","handlePointerMoveOverScrollbars","getDragOffsetXY","handlePointDragging","pointsSceneCoords","dragX","dragY","dragDistanceX","dragDistanceY","dragSelectedElements","elementsToAppend","duplicatedElement","originDragX","originDragY","nextSceneElements","handleBoxSelection","elementsWithinSelection","getElementsWithinSelection","childEvent","handlePointerUp","idsOfSelectedElementsThatAreInGroups","prevId","_prevState","gId","includedElementIds","getEligibleElementsForBinding","elementClickedInside","Component","Modal","closeOnClickOutside","modalRoot","useBodyRoot","createPortal","labelledBy","setDiv","isMobileRef","isDarkTheme","Dialog","islandNode","setIslandNode","lastActiveElement","focusableElements","queryFocusableElements","currentIndex","querySelectorAll","ErrorDialog","TopErrorBoundary","hasError","sentryEventId","errorSplash","errorInfo","_localStorage","Sentry","scope","setExtras","eventId","templateStrFn","reload","createGithubIssue","selectTextArea","readOnly","__webpack_public_path__","EXCALIDRAW_ASSET_PATH","FIREBASE_CONFIG","InitializeApp","loading","setLoading","updateLang","Excalidraw","nextProps","prevUIOptions","nextUIOptions","prevUIOptionsKeys","nextUIOptionsKeys","isUIOptionsSame","prevKeys","nextKeys","forwardedRefComp","FileManager","saveFiles","fetchingFiles","savingFiles","savedFiles","_getFiles","_saveFiles","isFileHandled","isFileSaved","addedFiles","loadedFiles","shouldPreventUnload","shouldUpdateImageElementStatus","encodeFilesForUpload","maxBytes","processedFiles","encodedFile","updateStaleImageStatuses","excalidrawAPI","REACT_APP_FIREBASE_CONFIG","firebasePromise","firestorePromise","firebaseStoragePromise","isFirebaseInitialized","_loadFirebase","firebase","initializeApp","_getFirebase","loadFirestore","loadFirebaseStorage","encryptElements","ciphertext","decryptElements","decrypted","decodedData","firebaseSceneVersionCache","isSavedToFirebase","portal","socket","roomId","roomKey","sceneVersion","saveFilesToFirebase","prefix","storage","cacheControl","saveToFirebase","nextDocData","firestore","fromUint8Array","docRef","collection","runTransaction","exists","update","didUpdate","loadFromFirebase","storedScene","toUint8Array","loadFilesFromFirebase","filesIds","generateRoomId","getCollaborationLinkData","URL","generateCollaborationLinkData","legacy_decodeFromBackend","fixedIv","importFromBackend","decodedBuffer","localDataState","exportToBackend","payload","filesToUpload","urlString","prompt","error_class","Portal","socketInitialized","broadcastedElementVersions","queueFileUpload","fileManager","broadcastScene","sceneType","syncAll","INIT","syncableElements","isSyncableElement","syncableElement","broadcastPromise","_broadcastSocketData","saveCollabRoomToFirebase","broadcastIdleChange","broadcastMouseLocation","on","emit","_socketId","clients","setCollaborators","volatile","isOpen","getShareIcon","isAppleBrowser","vendor","isWindowsBrowser","appVersion","RoomDialog","activeRoomLink","onUsernameChange","onRoomCreate","onRoomDestroy","setErrorMessage","roomLinkInput","copyRoomLink","shareRoomLink","selectInput","onKeyPress","shouldDiscardRemoteElement","local","remote","initialValue","Context","InverseConsumer","_updateProviderValue","InverseProvider","Consumer","createInverseContext","CollabContext","CollabContextConsumer","CollabContextProvider","CollabWrapper","activeIntervalId","idleTimeoutId","socketInitializationTimer","lastBroadcastedOrReceivedSceneVersion","destroySocketClient","isUnload","beforeUnload","getSyncableElements","room","openPortal","initializeSocketClient","closePortal","queueBroadcastAllElements","loadImageFiles","resetBrowserStateVersions","pushState","onRoomClose","reset","fetchImageFilesFromFirebase","unfetchedImages","decryptPayload","encryptedData","existingRoomLinkData","scenePromise","socketIOClient","broadcastElements","initializeSocket","decryptedData","UPDATE","remoteElements","reconciledElements","reconcileElements","handleRemoteSceneUpdate","init","socketID","off","initializeIdleDetector","localElementsData","duplicates","remoteElementIdx","remoteElement","_reconcileElements","setLastBroadcastedOrReceivedSceneVersion","reportIdle","reportActive","onVisibilityChange","onIdleStateChange","VISIBILITY_CHANGE","getLastBroadcastedOrReceivedSceneVersion","currentVersion","newVersion","setUsername","saveUsernameToLocalStorage","contextValue","getContextValue","BEFORE_UNLOAD","sockets","PureComponent","LanguageList","i18n","currentLangCode","getStorageSizes","total","CustomStats","storageSizes","setStorageSizes","sizes","excalidrawPlusIcon","exportToExcalidrawPlus","customMetadata","ExportToExcalidrawPlus","clearObsoleteFilesFromIndexedDB","allIds","notInFileIds","currentFileIds","getMany","filesData","del","localFileStorage","languageDetector","LanguageDetector","languageUtils","formatLanguageCode","isWhitelisted","checkWhitelist","saveDebounced","onFilesSaved","searchParams","jsonBackendMatch","externalUrlMatch","siteUrlMatch","roomLinkData","isExternalScene","once","diskFileId","iodrawFileTB","txtJson","table","collabAPI","PlusLinkJSX","unicodeBidi","ExcalidrawWrapper","detect","setLangCode","initialStatePromiseRef","excalidrawRefCallback","loadImages","isInitialLoad","onHashChange","oldURL","syncData","currFiles","HASHCHANGE","unloadHandler","cacheUserLanguage","renderLanguageList","isTinyDevice","newEl","ExcalidrawApp","isLocalhost","hostname","registerValidSW","swUrl","config","serviceWorker","registration","onupdatefound","installingWorker","installing","onstatechange","controller","info","onUpdate","checkValidServiceWorker","headers","contentType","unregister","registerServiceWorker","waitingServiceWorker","waiting","STATE_CHANGE","postMessage","dsn","environment","release","REACT_APP_GIT_SHA","ignoreErrors","integrations","SentryIntegrations","levels","beforeSend","__EXCALIDRAW_SHA__","ReactDOM"],"mappings":"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","file":"static/js/main.5dc2cb84.chunk.js","sourcesContent":["import cssVariables from \"./css/variables.module.scss\";\nimport { AppProps } from \"./types\";\nimport { FontFamilyValues } from \"./element/types\";\n\nexport const APP_NAME = \"Whiteboard\";\n\nexport const DRAGGING_THRESHOLD = 10; // px\nexport const LINE_CONFIRM_THRESHOLD = 8; // px\nexport const ELEMENT_SHIFT_TRANSLATE_AMOUNT = 5;\nexport const ELEMENT_TRANSLATE_AMOUNT = 1;\nexport const TEXT_TO_CENTER_SNAP_THRESHOLD = 30;\nexport const SHIFT_LOCKING_ANGLE = Math.PI / 12;\nexport const CURSOR_TYPE = {\n TEXT: \"text\",\n CROSSHAIR: \"crosshair\",\n GRABBING: \"grabbing\",\n GRAB: \"grab\",\n POINTER: \"pointer\",\n MOVE: \"move\",\n AUTO: \"\",\n};\nexport const POINTER_BUTTON = {\n MAIN: 0,\n WHEEL: 1,\n SECONDARY: 2,\n TOUCH: -1,\n} as const;\n\nexport enum EVENT {\n COPY = \"copy\",\n PASTE = \"paste\",\n CUT = \"cut\",\n KEYDOWN = \"keydown\",\n KEYUP = \"keyup\",\n MOUSE_MOVE = \"mousemove\",\n RESIZE = \"resize\",\n UNLOAD = \"unload\",\n FOCUS = \"focus\",\n BLUR = \"blur\",\n DRAG_OVER = \"dragover\",\n DROP = \"drop\",\n GESTURE_END = \"gestureend\",\n BEFORE_UNLOAD = \"beforeunload\",\n GESTURE_START = \"gesturestart\",\n GESTURE_CHANGE = \"gesturechange\",\n POINTER_MOVE = \"pointermove\",\n POINTER_UP = \"pointerup\",\n STATE_CHANGE = \"statechange\",\n WHEEL = \"wheel\",\n TOUCH_START = \"touchstart\",\n TOUCH_END = \"touchend\",\n HASHCHANGE = \"hashchange\",\n VISIBILITY_CHANGE = \"visibilitychange\",\n SCROLL = \"scroll\",\n // custom events\n EXCALIDRAW_LINK = \"excalidraw-link\",\n}\n\nexport const ENV = {\n TEST: \"test\",\n DEVELOPMENT: \"development\",\n};\n\nexport const CLASSES = {\n SHAPE_ACTIONS_MENU: \"App-menu__left\",\n};\n\n// 1-based in case we ever do `if(element.fontFamily)`\nexport const FONT_FAMILY = {\n Virgil: 1,\n Helvetica: 2,\n Cascadia: 3,\n};\n\nexport const THEME = {\n LIGHT: \"light\",\n DARK: \"dark\",\n};\n\nexport const WINDOWS_EMOJI_FALLBACK_FONT = \"Segoe UI Emoji\";\n\nexport const DEFAULT_FONT_SIZE = 20;\nexport const DEFAULT_FONT_FAMILY: FontFamilyValues = FONT_FAMILY.Virgil;\nexport const DEFAULT_TEXT_ALIGN = \"left\";\nexport const DEFAULT_VERTICAL_ALIGN = \"top\";\nexport const DEFAULT_VERSION = \"{version}\";\n\nexport const CANVAS_ONLY_ACTIONS = [\"selectAll\"];\n\nexport const GRID_SIZE = 20; // TODO make it configurable?\n\nexport const MIME_TYPES = {\n wb: \"application/vnd.wb+json\",\n wblib: \"application/vnd.wblib+json\",\n json: \"application/json\",\n svg: \"image/svg+xml\",\n png: \"image/png\",\n jpg: \"image/jpeg\",\n gif: \"image/gif\",\n binary: \"application/octet-stream\",\n} as const;\n\nexport const EXPORT_DATA_TYPES = {\n excalidraw: \"wb\",\n excalidrawClipboard: \"wb/clipboard\",\n excalidrawLibrary: \"wblib\",\n} as const;\n\nexport const EXPORT_SOURCE = window.location.origin;\n\n// time in milliseconds\nexport const IMAGE_RENDER_TIMEOUT = 500;\nexport const TAP_TWICE_TIMEOUT = 300;\nexport const TOUCH_CTX_MENU_TIMEOUT = 500;\nexport const TITLE_TIMEOUT = 10000;\nexport const TOAST_TIMEOUT = 5000;\nexport const VERSION_TIMEOUT = 30000;\nexport const SCROLL_TIMEOUT = 100;\nexport const ZOOM_STEP = 0.1;\nexport const HYPERLINK_TOOLTIP_DELAY = 300;\n\n// Report a user inactive after IDLE_THRESHOLD milliseconds\nexport const IDLE_THRESHOLD = 60_000;\n// Report a user active each ACTIVE_THRESHOLD milliseconds\nexport const ACTIVE_THRESHOLD = 3_000;\n\nexport const MODES = {\n VIEW: \"viewMode\",\n ZEN: \"zenMode\",\n GRID: \"gridMode\",\n};\n\nexport const THEME_FILTER = cssVariables.themeFilter;\n\nexport const URL_QUERY_KEYS = {\n addLibrary: \"addLibrary\",\n} as const;\n\nexport const URL_HASH_KEYS = {\n addLibrary: \"addLibrary\",\n} as const;\n\nexport const DEFAULT_UI_OPTIONS: AppProps[\"UIOptions\"] = {\n canvasActions: {\n changeViewBackgroundColor: true,\n clearCanvas: true,\n export: { saveFileToDisk: true },\n loadScene: true,\n saveToActiveFile: true,\n theme: true,\n saveAsImage: true,\n },\n};\n\nexport const MQ_MAX_WIDTH_PORTRAIT = 730;\nexport const MQ_MAX_WIDTH_LANDSCAPE = 1000;\nexport const MQ_MAX_HEIGHT_LANDSCAPE = 500;\n\nexport const MAX_DECIMALS_FOR_SVG_EXPORT = 2;\n\nexport const EXPORT_SCALES = [1, 2, 3];\nexport const DEFAULT_EXPORT_PADDING = 10; // px\n\nexport const DEFAULT_MAX_IMAGE_WIDTH_OR_HEIGHT = 1440;\n\nexport const ALLOWED_IMAGE_MIME_TYPES = [\n MIME_TYPES.png,\n MIME_TYPES.jpg,\n MIME_TYPES.svg,\n MIME_TYPES.gif,\n] as const;\n\nexport const MAX_ALLOWED_FILE_BYTES = 2 * 1024 * 1024;\n\nexport const SVG_NS = \"http://www.w3.org/2000/svg\";\n\nexport const ENCRYPTION_KEY_BITS = 128;\n\nexport const VERSIONS = {\n excalidraw: 2,\n excalidrawLibrary: 2,\n} as const;\n\nexport const BOUND_TEXT_PADDING = 5;\n\nexport const VERTICAL_ALIGN = {\n TOP: \"top\",\n MIDDLE: \"middle\",\n BOTTOM: \"bottom\",\n};\n","import colors from \"./colors\";\nimport {\n CURSOR_TYPE,\n DEFAULT_VERSION,\n EVENT,\n FONT_FAMILY,\n WINDOWS_EMOJI_FALLBACK_FONT,\n} from \"./constants\";\nimport { FontFamilyValues, FontString } from \"./element/types\";\nimport { Zoom } from \"./types\";\nimport { unstable_batchedUpdates } from \"react-dom\";\nimport { isDarwin } from \"./keys\";\n\nlet mockDateTime: string | null = null;\n\nexport const setDateTimeForTests = (dateTime: string) => {\n mockDateTime = dateTime;\n};\n\nexport const getDateTime = () => {\n if (mockDateTime) {\n return mockDateTime;\n }\n\n const date = new Date();\n const year = date.getFullYear();\n const month = `${date.getMonth() + 1}`.padStart(2, \"0\");\n const day = `${date.getDate()}`.padStart(2, \"0\");\n const hr = `${date.getHours()}`.padStart(2, \"0\");\n const min = `${date.getMinutes()}`.padStart(2, \"0\");\n\n return `${year}-${month}-${day}-${hr}${min}`;\n};\n\nexport const capitalizeString = (str: string) =>\n str.charAt(0).toUpperCase() + str.slice(1);\n\nexport const isToolIcon = (\n target: Element | EventTarget | null,\n): target is HTMLElement =>\n target instanceof HTMLElement && target.className.includes(\"ToolIcon\");\n\nexport const isInputLike = (\n target: Element | EventTarget | null,\n): target is\n | HTMLInputElement\n | HTMLTextAreaElement\n | HTMLSelectElement\n | HTMLBRElement\n | HTMLDivElement =>\n (target instanceof HTMLElement && target.dataset.type === \"wysiwyg\") ||\n target instanceof HTMLBRElement || // newline in wysiwyg\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n target instanceof HTMLSelectElement;\n\nexport const isWritableElement = (\n target: Element | EventTarget | null,\n): target is\n | HTMLInputElement\n | HTMLTextAreaElement\n | HTMLBRElement\n | HTMLDivElement =>\n (target instanceof HTMLElement && target.dataset.type === \"wysiwyg\") ||\n target instanceof HTMLBRElement || // newline in wysiwyg\n target instanceof HTMLTextAreaElement ||\n (target instanceof HTMLInputElement &&\n (target.type === \"text\" || target.type === \"number\"));\n\nexport const getFontFamilyString = ({\n fontFamily,\n}: {\n fontFamily: FontFamilyValues;\n}) => {\n for (const [fontFamilyString, id] of Object.entries(FONT_FAMILY)) {\n if (id === fontFamily) {\n return `${fontFamilyString}, ${WINDOWS_EMOJI_FALLBACK_FONT}`;\n }\n }\n return WINDOWS_EMOJI_FALLBACK_FONT;\n};\n\n/** returns fontSize+fontFamily string for assignment to DOM elements */\nexport const getFontString = ({\n fontSize,\n fontFamily,\n}: {\n fontSize: number;\n fontFamily: FontFamilyValues;\n}) => {\n return `${fontSize}px ${getFontFamilyString({ fontFamily })}` as FontString;\n};\n\nexport const debounce = (\n fn: (...args: T) => void,\n timeout: number,\n) => {\n let handle = 0;\n let lastArgs: T | null = null;\n const ret = (...args: T) => {\n lastArgs = args;\n clearTimeout(handle);\n handle = window.setTimeout(() => {\n lastArgs = null;\n fn(...args);\n }, timeout);\n };\n ret.flush = () => {\n clearTimeout(handle);\n if (lastArgs) {\n const _lastArgs = lastArgs;\n lastArgs = null;\n fn(..._lastArgs);\n }\n };\n ret.cancel = () => {\n lastArgs = null;\n clearTimeout(handle);\n };\n return ret;\n};\n\n// throttle callback to execute once per animation frame\nexport const throttleRAF = (fn: (...args: T) => void) => {\n let handle: number | null = null;\n let lastArgs: T | null = null;\n let callback: ((...args: T) => void) | null = null;\n const ret = (...args: T) => {\n if (process.env.NODE_ENV === \"test\") {\n fn(...args);\n return;\n }\n lastArgs = args;\n callback = fn;\n if (handle === null) {\n handle = window.requestAnimationFrame(() => {\n handle = null;\n lastArgs = null;\n callback = null;\n fn(...args);\n });\n }\n };\n ret.flush = () => {\n if (handle !== null) {\n cancelAnimationFrame(handle);\n handle = null;\n }\n if (lastArgs) {\n const _lastArgs = lastArgs;\n const _callback = callback;\n lastArgs = null;\n callback = null;\n if (_callback !== null) {\n _callback(..._lastArgs);\n }\n }\n };\n ret.cancel = () => {\n lastArgs = null;\n callback = null;\n if (handle !== null) {\n cancelAnimationFrame(handle);\n handle = null;\n }\n };\n return ret;\n};\n\n// https://github.com/lodash/lodash/blob/es/chunk.js\nexport const chunk = (\n array: readonly T[],\n size: number,\n): T[][] => {\n if (!array.length || size < 1) {\n return [];\n }\n let index = 0;\n let resIndex = 0;\n const result = Array(Math.ceil(array.length / size));\n while (index < array.length) {\n result[resIndex++] = array.slice(index, (index += size));\n }\n return result;\n};\n\nexport const selectNode = (node: Element) => {\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.selectNodeContents(node);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n};\n\nexport const removeSelection = () => {\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n }\n};\n\nexport const distance = (x: number, y: number) => Math.abs(x - y);\n\nexport const resetCursor = (canvas: HTMLCanvasElement | null) => {\n if (canvas) {\n canvas.style.cursor = \"\";\n }\n};\n\nexport const setCursor = (canvas: HTMLCanvasElement | null, cursor: string) => {\n if (canvas) {\n canvas.style.cursor = cursor;\n }\n};\n\nexport const setCursorForShape = (\n canvas: HTMLCanvasElement | null,\n shape: string,\n) => {\n if (!canvas) {\n return;\n }\n if (shape === \"selection\") {\n resetCursor(canvas);\n // do nothing if image tool is selected which suggests there's\n // a image-preview set as the cursor\n } else if (shape !== \"image\") {\n canvas.style.cursor = CURSOR_TYPE.CROSSHAIR;\n }\n};\n\nexport const isFullScreen = () =>\n document.fullscreenElement?.nodeName === \"HTML\";\n\nexport const allowFullScreen = () =>\n document.documentElement.requestFullscreen();\n\nexport const exitFullScreen = () => document.exitFullscreen();\n\nexport const getShortcutKey = (shortcut: string): string => {\n shortcut = shortcut\n .replace(/\\bAlt\\b/i, \"Alt\")\n .replace(/\\bShift\\b/i, \"Shift\")\n .replace(/\\b(Enter|Return)\\b/i, \"Enter\")\n .replace(/\\bDel\\b/i, \"Delete\");\n\n if (isDarwin) {\n return shortcut\n .replace(/\\bCtrlOrCmd\\b/i, \"Cmd\")\n .replace(/\\bAlt\\b/i, \"Option\");\n }\n return shortcut.replace(/\\bCtrlOrCmd\\b/i, \"Ctrl\");\n};\n\nexport const viewportCoordsToSceneCoords = (\n { clientX, clientY }: { clientX: number; clientY: number },\n {\n zoom,\n offsetLeft,\n offsetTop,\n scrollX,\n scrollY,\n }: {\n zoom: Zoom;\n offsetLeft: number;\n offsetTop: number;\n scrollX: number;\n scrollY: number;\n },\n) => {\n const invScale = 1 / zoom.value;\n const x = (clientX - offsetLeft) * invScale - scrollX;\n const y = (clientY - offsetTop) * invScale - scrollY;\n\n return { x, y };\n};\n\nexport const sceneCoordsToViewportCoords = (\n { sceneX, sceneY }: { sceneX: number; sceneY: number },\n {\n zoom,\n offsetLeft,\n offsetTop,\n scrollX,\n scrollY,\n }: {\n zoom: Zoom;\n offsetLeft: number;\n offsetTop: number;\n scrollX: number;\n scrollY: number;\n },\n) => {\n const x = (sceneX + scrollX) * zoom.value + offsetLeft;\n const y = (sceneY + scrollY) * zoom.value + offsetTop;\n return { x, y };\n};\n\nexport const getGlobalCSSVariable = (name: string) =>\n getComputedStyle(document.documentElement).getPropertyValue(`--${name}`);\n\nconst RS_LTR_CHARS =\n \"A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF\" +\n \"\\u2C00-\\uFB1C\\uFDFE-\\uFE6F\\uFEFD-\\uFFFF\";\nconst RS_RTL_CHARS = \"\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC\";\nconst RE_RTL_CHECK = new RegExp(`^[^${RS_LTR_CHARS}]*[${RS_RTL_CHARS}]`);\n/**\n * Checks whether first directional character is RTL. Meaning whether it starts\n * with RTL characters, or indeterminate (numbers etc.) characters followed by\n * RTL.\n * See https://github.com/excalidraw/excalidraw/pull/1722#discussion_r436340171\n */\nexport const isRTL = (text: string) => RE_RTL_CHECK.test(text);\n\nexport const tupleToCoors = (\n xyTuple: readonly [number, number],\n): { x: number; y: number } => {\n const [x, y] = xyTuple;\n return { x, y };\n};\n\n/** use as a rejectionHandler to mute filesystem Abort errors */\nexport const muteFSAbortError = (error?: Error) => {\n if (error?.name === \"AbortError\") {\n console.warn(error);\n return;\n }\n throw error;\n};\n\nexport const findIndex = (\n array: readonly T[],\n cb: (element: T, index: number, array: readonly T[]) => boolean,\n fromIndex: number = 0,\n) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n fromIndex = Math.min(array.length, Math.max(fromIndex, 0));\n let index = fromIndex - 1;\n while (++index < array.length) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\n\nexport const findLastIndex = (\n array: readonly T[],\n cb: (element: T, index: number, array: readonly T[]) => boolean,\n fromIndex: number = array.length - 1,\n) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n fromIndex = Math.min(array.length - 1, Math.max(fromIndex, 0));\n let index = fromIndex + 1;\n while (--index > -1) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\n\nexport const isTransparent = (color: string) => {\n const isRGBTransparent = color.length === 5 && color.substr(4, 1) === \"0\";\n const isRRGGBBTransparent = color.length === 9 && color.substr(7, 2) === \"00\";\n return (\n isRGBTransparent ||\n isRRGGBBTransparent ||\n color === colors.elementBackground[0]\n );\n};\n\nexport type ResolvablePromise = Promise & {\n resolve: [T] extends [undefined] ? (value?: T) => void : (value: T) => void;\n reject: (error: Error) => void;\n};\nexport const resolvablePromise = () => {\n let resolve!: any;\n let reject!: any;\n const promise = new Promise((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n (promise as any).resolve = resolve;\n (promise as any).reject = reject;\n return promise as ResolvablePromise;\n};\n\n/**\n * @param func handler taking at most single parameter (event).\n */\nexport const withBatchedUpdates = <\n TFunction extends ((event: any) => void) | (() => void),\n>(\n func: Parameters[\"length\"] extends 0 | 1 ? TFunction : never,\n) =>\n ((event) => {\n unstable_batchedUpdates(func as TFunction, event);\n }) as TFunction;\n\n/**\n * barches React state updates and throttles the calls to a single call per\n * animation frame\n */\nexport const withBatchedUpdatesThrottled = <\n TFunction extends ((event: any) => void) | (() => void),\n>(\n func: Parameters[\"length\"] extends 0 | 1 ? TFunction : never,\n) => {\n // @ts-ignore\n return throttleRAF>(((event) => {\n unstable_batchedUpdates(func, event);\n }) as TFunction);\n};\n\n//https://stackoverflow.com/a/9462382/8418\nexport const nFormatter = (num: number, digits: number): string => {\n const si = [\n { value: 1, symbol: \"b\" },\n { value: 1e3, symbol: \"k\" },\n { value: 1e6, symbol: \"M\" },\n { value: 1e9, symbol: \"G\" },\n ];\n const rx = /\\.0+$|(\\.[0-9]*[1-9])0+$/;\n let index;\n for (index = si.length - 1; index > 0; index--) {\n if (num >= si[index].value) {\n break;\n }\n }\n return (\n (num / si[index].value).toFixed(digits).replace(rx, \"$1\") + si[index].symbol\n );\n};\n\nexport const getVersion = () => {\n return (\n document.querySelector('meta[name=\"version\"]')?.content ||\n DEFAULT_VERSION\n );\n};\n\n// Adapted from https://github.com/Modernizr/Modernizr/blob/master/feature-detects/emoji.js\nexport const supportsEmoji = () => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return false;\n }\n const offset = 12;\n ctx.fillStyle = \"#f00\";\n ctx.textBaseline = \"top\";\n ctx.font = \"32px Arial\";\n // Modernizr used 🐨, but it is sort of supported on Windows 7.\n // Luckily 😀 isn't supported.\n ctx.fillText(\"😀\", 0, 0);\n return ctx.getImageData(offset, offset, 1, 1).data[0] !== 0;\n};\n\nexport const getNearestScrollableContainer = (\n element: HTMLElement,\n): HTMLElement | Document => {\n let parent = element.parentElement;\n while (parent) {\n if (parent === document.body) {\n return document;\n }\n const { overflowY } = window.getComputedStyle(parent);\n const hasScrollableContent = parent.scrollHeight > parent.clientHeight;\n if (\n hasScrollableContent &&\n (overflowY === \"auto\" ||\n overflowY === \"scroll\" ||\n overflowY === \"overlay\")\n ) {\n return parent;\n }\n parent = parent.parentElement;\n }\n return document;\n};\n\nexport const focusNearestParent = (element: HTMLInputElement) => {\n let parent = element.parentElement;\n while (parent) {\n if (parent.tabIndex > -1) {\n parent.focus();\n return;\n }\n parent = parent.parentElement;\n }\n};\n\nexport const preventUnload = (event: BeforeUnloadEvent) => {\n event.preventDefault();\n // NOTE: modern browsers no longer allow showing a custom message here\n event.returnValue = \"\";\n};\n\nexport const bytesToHexString = (bytes: Uint8Array) => {\n return Array.from(bytes)\n .map((byte) => `0${byte.toString(16)}`.slice(-2))\n .join(\"\");\n};\n\nexport const getUpdatedTimestamp = () => (isTestEnv() ? 1 : Date.now());\n\n/**\n * Transforms array of objects containing `id` attribute,\n * or array of ids (strings), into a Map, keyd by `id`.\n */\nexport const arrayToMap = (\n items: readonly T[],\n) => {\n return items.reduce((acc: Map, element) => {\n acc.set(typeof element === \"string\" ? element : element.id, element);\n return acc;\n }, new Map());\n};\n\nexport const isTestEnv = () =>\n typeof process !== \"undefined\" && process.env?.NODE_ENV === \"test\";\n\nexport const wrapEvent = (name: EVENT, nativeEvent: T) => {\n return new CustomEvent(name, {\n detail: {\n nativeEvent,\n },\n cancelable: true,\n });\n};\n","export const isDarwin = /Mac|iPod|iPhone|iPad/.test(window.navigator.platform);\nexport const isWindows = /^Win/.test(window.navigator.platform);\nexport const isAndroid = /\\b(android)\\b/i.test(navigator.userAgent);\n\nexport const CODES = {\n EQUAL: \"Equal\",\n MINUS: \"Minus\",\n NUM_ADD: \"NumpadAdd\",\n NUM_SUBTRACT: \"NumpadSubtract\",\n NUM_ZERO: \"Numpad0\",\n BRACKET_RIGHT: \"BracketRight\",\n BRACKET_LEFT: \"BracketLeft\",\n ONE: \"Digit1\",\n TWO: \"Digit2\",\n NINE: \"Digit9\",\n QUOTE: \"Quote\",\n ZERO: \"Digit0\",\n SLASH: \"Slash\",\n C: \"KeyC\",\n D: \"KeyD\",\n G: \"KeyG\",\n F: \"KeyF\",\n H: \"KeyH\",\n V: \"KeyV\",\n X: \"KeyX\",\n Z: \"KeyZ\",\n R: \"KeyR\",\n} as const;\n\nexport const KEYS = {\n ARROW_DOWN: \"ArrowDown\",\n ARROW_LEFT: \"ArrowLeft\",\n ARROW_RIGHT: \"ArrowRight\",\n ARROW_UP: \"ArrowUp\",\n BACKSPACE: \"Backspace\",\n ALT: \"Alt\",\n CTRL_OR_CMD: isDarwin ? \"metaKey\" : \"ctrlKey\",\n DELETE: \"Delete\",\n ENTER: \"Enter\",\n ESCAPE: \"Escape\",\n QUESTION_MARK: \"?\",\n SPACE: \" \",\n TAB: \"Tab\",\n CHEVRON_LEFT: \"<\",\n CHEVRON_RIGHT: \">\",\n PERIOD: \".\",\n COMMA: \",\",\n\n A: \"a\",\n D: \"d\",\n E: \"e\",\n G: \"g\",\n I: \"i\",\n L: \"l\",\n O: \"o\",\n P: \"p\",\n Q: \"q\",\n R: \"r\",\n S: \"s\",\n T: \"t\",\n V: \"v\",\n X: \"x\",\n Y: \"y\",\n Z: \"z\",\n K: \"k\",\n} as const;\n\nexport type Key = keyof typeof KEYS;\n\nexport const isArrowKey = (key: string) =>\n key === KEYS.ARROW_LEFT ||\n key === KEYS.ARROW_RIGHT ||\n key === KEYS.ARROW_DOWN ||\n key === KEYS.ARROW_UP;\n\nexport const shouldResizeFromCenter = (event: MouseEvent | KeyboardEvent) =>\n event.altKey;\n\nexport const shouldMaintainAspectRatio = (event: MouseEvent | KeyboardEvent) =>\n event.shiftKey;\n\nexport const shouldRotateWithDiscreteAngle = (\n event: MouseEvent | KeyboardEvent,\n) => event.shiftKey;\n","export const trackEvent =\n typeof process !== \"undefined\" &&\n process.env?.REACT_APP_GOOGLE_ANALYTICS_ID &&\n typeof window !== \"undefined\" &&\n window.gtag\n ? (category: string, action: string, label?: string, value?: number) => {\n window.gtag(\"event\", action, {\n event_category: category,\n event_label: label,\n value,\n });\n }\n : typeof process !== \"undefined\" && process.env?.JEST_WORKER_ID\n ? (category: string, action: string, label?: string, value?: number) => {}\n : (category: string, action: string, label?: string, value?: number) => {\n // Uncomment the next line to track locally\n // console.info(\"Track Event\", category, action, label, value);\n };\n","import { ENCRYPTION_KEY_BITS } from \"../constants\";\n\nexport const IV_LENGTH_BYTES = 12;\n\nexport const createIV = () => {\n const arr = new Uint8Array(IV_LENGTH_BYTES);\n return window.crypto.getRandomValues(arr);\n};\n\nexport const generateEncryptionKey = async <\n T extends \"string\" | \"cryptoKey\" = \"string\",\n>(\n returnAs?: T,\n): Promise => {\n const key = await window.crypto.subtle.generateKey(\n {\n name: \"AES-GCM\",\n length: ENCRYPTION_KEY_BITS,\n },\n true, // extractable\n [\"encrypt\", \"decrypt\"],\n );\n return (\n returnAs === \"cryptoKey\"\n ? key\n : (await window.crypto.subtle.exportKey(\"jwk\", key)).k\n ) as T extends \"cryptoKey\" ? CryptoKey : string;\n};\n\nexport const getCryptoKey = (key: string, usage: KeyUsage) =>\n window.crypto.subtle.importKey(\n \"jwk\",\n {\n alg: \"A128GCM\",\n ext: true,\n k: key,\n key_ops: [\"encrypt\", \"decrypt\"],\n kty: \"oct\",\n },\n {\n name: \"AES-GCM\",\n length: ENCRYPTION_KEY_BITS,\n },\n false, // extractable\n [usage],\n );\n\nexport const encryptData = async (\n key: string | CryptoKey,\n data: Uint8Array | ArrayBuffer | Blob | File | string,\n): Promise<{ encryptedBuffer: ArrayBuffer; iv: Uint8Array }> => {\n const importedKey =\n typeof key === \"string\" ? await getCryptoKey(key, \"encrypt\") : key;\n const iv = createIV();\n const buffer: ArrayBuffer | Uint8Array =\n typeof data === \"string\"\n ? new TextEncoder().encode(data)\n : data instanceof Uint8Array\n ? data\n : data instanceof Blob\n ? await data.arrayBuffer()\n : data;\n\n // We use symmetric encryption. AES-GCM is the recommended algorithm and\n // includes checks that the ciphertext has not been modified by an attacker.\n const encryptedBuffer = await window.crypto.subtle.encrypt(\n {\n name: \"AES-GCM\",\n iv,\n },\n importedKey,\n buffer as ArrayBuffer | Uint8Array,\n );\n\n return { encryptedBuffer, iv };\n};\n\nexport const decryptData = async (\n iv: Uint8Array,\n encrypted: Uint8Array | ArrayBuffer,\n privateKey: string,\n): Promise => {\n const key = await getCryptoKey(privateKey, \"decrypt\");\n return window.crypto.subtle.decrypt(\n {\n name: \"AES-GCM\",\n iv,\n },\n key,\n encrypted,\n );\n};\n","import oc from \"open-color\";\n\nconst shades = (index: number) => [\n oc.red[index],\n oc.pink[index],\n oc.grape[index],\n oc.violet[index],\n oc.indigo[index],\n oc.blue[index],\n oc.cyan[index],\n oc.teal[index],\n oc.green[index],\n oc.lime[index],\n oc.yellow[index],\n oc.orange[index],\n];\n\nexport default {\n canvasBackground: [oc.white, oc.gray[0], oc.gray[1], ...shades(0)],\n elementBackground: [\"transparent\", oc.gray[4], oc.gray[6], ...shades(6)],\n elementStroke: [oc.black, oc.gray[8], oc.gray[7], ...shades(9)],\n};\n","import { deflate, inflate } from \"pako\";\nimport { encryptData, decryptData } from \"./encryption\";\n\n// -----------------------------------------------------------------------------\n// byte (binary) strings\n// -----------------------------------------------------------------------------\n\n// fast, Buffer-compatible implem\nexport const toByteString = (\n data: string | Uint8Array | ArrayBuffer,\n): Promise => {\n return new Promise((resolve, reject) => {\n const blob =\n typeof data === \"string\"\n ? new Blob([new TextEncoder().encode(data)])\n : new Blob([data instanceof Uint8Array ? data : new Uint8Array(data)]);\n const reader = new FileReader();\n reader.onload = (event) => {\n if (!event.target || typeof event.target.result !== \"string\") {\n return reject(new Error(\"couldn't convert to byte string\"));\n }\n resolve(event.target.result);\n };\n reader.readAsBinaryString(blob);\n });\n};\n\nconst byteStringToArrayBuffer = (byteString: string) => {\n const buffer = new ArrayBuffer(byteString.length);\n const bufferView = new Uint8Array(buffer);\n for (let i = 0, len = byteString.length; i < len; i++) {\n bufferView[i] = byteString.charCodeAt(i);\n }\n return buffer;\n};\n\nconst byteStringToString = (byteString: string) => {\n return new TextDecoder(\"utf-8\").decode(byteStringToArrayBuffer(byteString));\n};\n\n// -----------------------------------------------------------------------------\n// base64\n// -----------------------------------------------------------------------------\n\n/**\n * @param isByteString set to true if already byte string to prevent bloat\n * due to reencoding\n */\nexport const stringToBase64 = async (str: string, isByteString = false) => {\n return isByteString ? window.btoa(str) : window.btoa(await toByteString(str));\n};\n\n// async to align with stringToBase64\nexport const base64ToString = async (base64: string, isByteString = false) => {\n return isByteString\n ? window.atob(base64)\n : byteStringToString(window.atob(base64));\n};\n\n// -----------------------------------------------------------------------------\n// text encoding\n// -----------------------------------------------------------------------------\n\ntype EncodedData = {\n encoded: string;\n encoding: \"bstring\";\n /** whether text is compressed (zlib) */\n compressed: boolean;\n /** version for potential migration purposes */\n version?: string;\n};\n\n/**\n * Encodes (and potentially compresses via zlib) text to byte string\n */\nexport const encode = async ({\n text,\n compress,\n}: {\n text: string;\n /** defaults to `true`. If compression fails, falls back to bstring alone. */\n compress?: boolean;\n}): Promise => {\n let deflated!: string;\n if (compress !== false) {\n try {\n deflated = await toByteString(deflate(text));\n } catch (error: any) {\n console.error(\"encode: cannot deflate\", error);\n }\n }\n return {\n version: \"1\",\n encoding: \"bstring\",\n compressed: !!deflated,\n encoded: deflated || (await toByteString(text)),\n };\n};\n\nexport const decode = async (data: EncodedData): Promise => {\n let decoded: string;\n\n switch (data.encoding) {\n case \"bstring\":\n // if compressed, do not double decode the bstring\n decoded = data.compressed\n ? data.encoded\n : await byteStringToString(data.encoded);\n break;\n default:\n throw new Error(`decode: unknown encoding \"${data.encoding}\"`);\n }\n\n if (data.compressed) {\n return inflate(new Uint8Array(byteStringToArrayBuffer(decoded)), {\n to: \"string\",\n });\n }\n\n return decoded;\n};\n\n// -----------------------------------------------------------------------------\n// binary encoding\n// -----------------------------------------------------------------------------\n\ntype FileEncodingInfo = {\n /* version 2 is the version we're shipping the initial image support with.\n version 1 was a PR version that a lot of people were using anyway.\n Thus, if there are issues we can check whether they're not using the\n unoffic version */\n version: 1 | 2;\n compression: \"pako@1\" | null;\n encryption: \"AES-GCM\" | null;\n};\n\n// -----------------------------------------------------------------------------\nconst CONCAT_BUFFERS_VERSION = 1;\n/** how many bytes we use to encode how many bytes the next chunk has.\n * Corresponds to DataView setter methods (setUint32, setUint16, etc).\n *\n * NOTE ! values must not be changed, which would be backwards incompatible !\n */\nconst VERSION_DATAVIEW_BYTES = 4;\nconst NEXT_CHUNK_SIZE_DATAVIEW_BYTES = 4;\n// -----------------------------------------------------------------------------\n\nconst DATA_VIEW_BITS_MAP = { 1: 8, 2: 16, 4: 32 } as const;\n\n// getter\nfunction dataView(buffer: Uint8Array, bytes: 1 | 2 | 4, offset: number): number;\n// setter\nfunction dataView(\n buffer: Uint8Array,\n bytes: 1 | 2 | 4,\n offset: number,\n value: number,\n): Uint8Array;\n/**\n * abstraction over DataView that serves as a typed getter/setter in case\n * you're using constants for the byte size and want to ensure there's no\n * discrepenancy in the encoding across refactors.\n *\n * DataView serves for an endian-agnostic handling of numbers in ArrayBuffers.\n */\nfunction dataView(\n buffer: Uint8Array,\n bytes: 1 | 2 | 4,\n offset: number,\n value?: number,\n): Uint8Array | number {\n if (value != null) {\n if (value > Math.pow(2, DATA_VIEW_BITS_MAP[bytes]) - 1) {\n throw new Error(\n `attempting to set value higher than the allocated bytes (value: ${value}, bytes: ${bytes})`,\n );\n }\n const method = `setUint${DATA_VIEW_BITS_MAP[bytes]}` as const;\n new DataView(buffer.buffer)[method](offset, value);\n return buffer;\n }\n const method = `getUint${DATA_VIEW_BITS_MAP[bytes]}` as const;\n return new DataView(buffer.buffer)[method](offset);\n}\n\n// -----------------------------------------------------------------------------\n\n/**\n * Resulting concatenated buffer has this format:\n *\n * [\n * VERSION chunk (4 bytes)\n * LENGTH chunk 1 (4 bytes)\n * DATA chunk 1 (up to 2^32 bits)\n * LENGTH chunk 2 (4 bytes)\n * DATA chunk 2 (up to 2^32 bits)\n * ...\n * ]\n *\n * @param buffers each buffer (chunk) must be at most 2^32 bits large (~4GB)\n */\nconst concatBuffers = (...buffers: Uint8Array[]) => {\n const bufferView = new Uint8Array(\n VERSION_DATAVIEW_BYTES +\n NEXT_CHUNK_SIZE_DATAVIEW_BYTES * buffers.length +\n buffers.reduce((acc, buffer) => acc + buffer.byteLength, 0),\n );\n\n let cursor = 0;\n\n // as the first chunk we'll encode the version for backwards compatibility\n dataView(bufferView, VERSION_DATAVIEW_BYTES, cursor, CONCAT_BUFFERS_VERSION);\n cursor += VERSION_DATAVIEW_BYTES;\n\n for (const buffer of buffers) {\n dataView(\n bufferView,\n NEXT_CHUNK_SIZE_DATAVIEW_BYTES,\n cursor,\n buffer.byteLength,\n );\n cursor += NEXT_CHUNK_SIZE_DATAVIEW_BYTES;\n\n bufferView.set(buffer, cursor);\n cursor += buffer.byteLength;\n }\n\n return bufferView;\n};\n\n/** can only be used on buffers created via `concatBuffers()` */\nconst splitBuffers = (concatenatedBuffer: Uint8Array) => {\n const buffers = [];\n\n let cursor = 0;\n\n // first chunk is the version\n const version = dataView(\n concatenatedBuffer,\n NEXT_CHUNK_SIZE_DATAVIEW_BYTES,\n cursor,\n );\n // If version is outside of the supported versions, throw an error.\n // This usually means the buffer wasn't encoded using this API, so we'd only\n // waste compute.\n if (version > CONCAT_BUFFERS_VERSION) {\n throw new Error(`invalid version ${version}`);\n }\n\n cursor += VERSION_DATAVIEW_BYTES;\n\n while (true) {\n const chunkSize = dataView(\n concatenatedBuffer,\n NEXT_CHUNK_SIZE_DATAVIEW_BYTES,\n cursor,\n );\n cursor += NEXT_CHUNK_SIZE_DATAVIEW_BYTES;\n\n buffers.push(concatenatedBuffer.slice(cursor, cursor + chunkSize));\n cursor += chunkSize;\n if (cursor >= concatenatedBuffer.byteLength) {\n break;\n }\n }\n\n return buffers;\n};\n\n// helpers for (de)compressing data with JSON metadata including encryption\n// -----------------------------------------------------------------------------\n\n/** @private */\nconst _encryptAndCompress = async (\n data: Uint8Array | string,\n encryptionKey: string,\n) => {\n const { encryptedBuffer, iv } = await encryptData(\n encryptionKey,\n deflate(data),\n );\n\n return { iv, buffer: new Uint8Array(encryptedBuffer) };\n};\n\n/**\n * The returned buffer has following format:\n * `[]` refers to a buffers wrapper (see `concatBuffers`)\n *\n * [\n * encodingMetadataBuffer,\n * iv,\n * [\n * contentsMetadataBuffer\n * contentsBuffer\n * ]\n * ]\n */\nexport const compressData = async = never>(\n dataBuffer: Uint8Array,\n options: {\n encryptionKey: string;\n } & ([T] extends [never]\n ? {\n metadata?: T;\n }\n : {\n metadata: T;\n }),\n): Promise => {\n const fileInfo: FileEncodingInfo = {\n version: 2,\n compression: \"pako@1\",\n encryption: \"AES-GCM\",\n };\n\n const encodingMetadataBuffer = new TextEncoder().encode(\n JSON.stringify(fileInfo),\n );\n\n const contentsMetadataBuffer = new TextEncoder().encode(\n JSON.stringify(options.metadata || null),\n );\n\n const { iv, buffer } = await _encryptAndCompress(\n concatBuffers(contentsMetadataBuffer, dataBuffer),\n options.encryptionKey,\n );\n\n return concatBuffers(encodingMetadataBuffer, iv, buffer);\n};\n\n/** @private */\nconst _decryptAndDecompress = async (\n iv: Uint8Array,\n decryptedBuffer: Uint8Array,\n decryptionKey: string,\n isCompressed: boolean,\n) => {\n decryptedBuffer = new Uint8Array(\n await decryptData(iv, decryptedBuffer, decryptionKey),\n );\n\n if (isCompressed) {\n return inflate(decryptedBuffer);\n }\n\n return decryptedBuffer;\n};\n\nexport const decompressData = async >(\n bufferView: Uint8Array,\n options: { decryptionKey: string },\n) => {\n // first chunk is encoding metadata (ignored for now)\n const [encodingMetadataBuffer, iv, buffer] = splitBuffers(bufferView);\n\n const encodingMetadata: FileEncodingInfo = JSON.parse(\n new TextDecoder().decode(encodingMetadataBuffer),\n );\n\n try {\n const [contentsMetadataBuffer, contentsBuffer] = splitBuffers(\n await _decryptAndDecompress(\n iv,\n buffer,\n options.decryptionKey,\n !!encodingMetadata.compression,\n ),\n );\n\n const metadata = JSON.parse(\n new TextDecoder().decode(contentsMetadataBuffer),\n ) as T;\n\n return {\n /** metadata source is always JSON so we can decode it here */\n metadata,\n /** data can be anything so the caller must decode it */\n data: contentsBuffer,\n };\n } catch (error: any) {\n console.error(\n `Error during decompressing and decrypting the file.`,\n encodingMetadata,\n );\n throw error;\n }\n};\n\n// -----------------------------------------------------------------------------\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"themeFilter\":\"invert(93%) hue-rotate(180deg)\"};","var map = {\n\t\"./ar-SA.json\": [\n\t\t139,\n\t\t4\n\t],\n\t\"./bg-BG.json\": [\n\t\t140,\n\t\t5\n\t],\n\t\"./bn-BD.json\": [\n\t\t141,\n\t\t6\n\t],\n\t\"./ca-ES.json\": [\n\t\t142,\n\t\t7\n\t],\n\t\"./cs-CZ.json\": [\n\t\t143,\n\t\t8\n\t],\n\t\"./da-DK.json\": [\n\t\t144,\n\t\t9\n\t],\n\t\"./de-DE.json\": [\n\t\t145,\n\t\t10\n\t],\n\t\"./el-GR.json\": [\n\t\t146,\n\t\t11\n\t],\n\t\"./en.json\": [\n\t\t147,\n\t\t12\n\t],\n\t\"./es-ES.json\": [\n\t\t148,\n\t\t13\n\t],\n\t\"./eu-ES.json\": [\n\t\t149,\n\t\t14\n\t],\n\t\"./fa-IR.json\": [\n\t\t150,\n\t\t15\n\t],\n\t\"./fi-FI.json\": [\n\t\t151,\n\t\t16\n\t],\n\t\"./fr-FR.json\": [\n\t\t152,\n\t\t17\n\t],\n\t\"./he-IL.json\": [\n\t\t153,\n\t\t18\n\t],\n\t\"./hi-IN.json\": [\n\t\t154,\n\t\t19\n\t],\n\t\"./hu-HU.json\": [\n\t\t155,\n\t\t20\n\t],\n\t\"./id-ID.json\": [\n\t\t156,\n\t\t21\n\t],\n\t\"./it-IT.json\": [\n\t\t157,\n\t\t22\n\t],\n\t\"./ja-JP.json\": [\n\t\t158,\n\t\t23\n\t],\n\t\"./kab-KAB.json\": [\n\t\t159,\n\t\t24\n\t],\n\t\"./kk-KZ.json\": [\n\t\t160,\n\t\t25\n\t],\n\t\"./ko-KR.json\": [\n\t\t161,\n\t\t26\n\t],\n\t\"./lt-LT.json\": [\n\t\t162,\n\t\t27\n\t],\n\t\"./lv-LV.json\": [\n\t\t163,\n\t\t28\n\t],\n\t\"./my-MM.json\": [\n\t\t164,\n\t\t29\n\t],\n\t\"./nb-NO.json\": [\n\t\t165,\n\t\t30\n\t],\n\t\"./nl-NL.json\": [\n\t\t166,\n\t\t31\n\t],\n\t\"./nn-NO.json\": [\n\t\t167,\n\t\t32\n\t],\n\t\"./oc-FR.json\": [\n\t\t168,\n\t\t33\n\t],\n\t\"./pa-IN.json\": [\n\t\t169,\n\t\t34\n\t],\n\t\"./percentages.json\": [\n\t\t64\n\t],\n\t\"./pl-PL.json\": [\n\t\t170,\n\t\t35\n\t],\n\t\"./pt-BR.json\": [\n\t\t171,\n\t\t36\n\t],\n\t\"./pt-PT.json\": [\n\t\t172,\n\t\t37\n\t],\n\t\"./ro-RO.json\": [\n\t\t173,\n\t\t38\n\t],\n\t\"./ru-RU.json\": [\n\t\t174,\n\t\t39\n\t],\n\t\"./si-LK.json\": [\n\t\t175,\n\t\t40\n\t],\n\t\"./sk-SK.json\": [\n\t\t176,\n\t\t41\n\t],\n\t\"./sv-SE.json\": [\n\t\t177,\n\t\t42\n\t],\n\t\"./ta-IN.json\": [\n\t\t178,\n\t\t43\n\t],\n\t\"./tr-TR.json\": [\n\t\t179,\n\t\t44\n\t],\n\t\"./uk-UA.json\": [\n\t\t180,\n\t\t45\n\t],\n\t\"./zh-CN.json\": [\n\t\t63\n\t],\n\t\"./zh-HK.json\": [\n\t\t181,\n\t\t46\n\t],\n\t\"./zh-TW.json\": [\n\t\t182,\n\t\t47\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn Promise.all(ids.slice(1).map(__webpack_require__.e)).then(function() {\n\t\treturn __webpack_require__.t(id, 3);\n\t});\n}\nwebpackAsyncContext.keys = function webpackAsyncContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackAsyncContext.id = 86;\nmodule.exports = webpackAsyncContext;","//import fallbackLangData from \"./locales/en.json\";\nimport fallbackLangData from \"./locales/zh-CN.json\";\nimport percentages from \"./locales/percentages.json\";\nimport { ENV } from \"./constants\";\n\nconst COMPLETION_THRESHOLD = 85;\n\nexport interface Language {\n code: string;\n label: string;\n rtl?: boolean;\n}\n\nexport const defaultLang = { code: \"zh-CN\", label: \"简体中文\" };\n\nconst allLanguages: Language[] = [\n { code: \"ar-SA\", label: \"العربية\", rtl: true },\n { code: \"bg-BG\", label: \"Български\" },\n { code: \"ca-ES\", label: \"Català\" },\n { code: \"cs-CZ\", label: \"Česky\" },\n { code: \"de-DE\", label: \"Deutsch\" },\n { code: \"el-GR\", label: \"Ελληνικά\" },\n { code: \"es-ES\", label: \"Español\" },\n { code: \"eu-ES\", label: \"Euskara\" },\n { code: \"fa-IR\", label: \"فارسی\", rtl: true },\n { code: \"fi-FI\", label: \"Suomi\" },\n { code: \"fr-FR\", label: \"Français\" },\n { code: \"he-IL\", label: \"עברית\", rtl: true },\n { code: \"hi-IN\", label: \"हिन्दी\" },\n { code: \"hu-HU\", label: \"Magyar\" },\n { code: \"id-ID\", label: \"Bahasa Indonesia\" },\n { code: \"it-IT\", label: \"Italiano\" },\n { code: \"ja-JP\", label: \"日本語\" },\n { code: \"kab-KAB\", label: \"Taqbaylit\" },\n { code: \"kk-KZ\", label: \"Қазақ тілі\" },\n { code: \"ko-KR\", label: \"한국어\" },\n { code: \"lt-LT\", label: \"Lietuvių\" },\n { code: \"lv-LV\", label: \"Latviešu\" },\n { code: \"my-MM\", label: \"Burmese\" },\n { code: \"nb-NO\", label: \"Norsk bokmål\" },\n { code: \"nl-NL\", label: \"Nederlands\" },\n { code: \"nn-NO\", label: \"Norsk nynorsk\" },\n { code: \"oc-FR\", label: \"Occitan\" },\n { code: \"pa-IN\", label: \"ਪੰਜਾਬੀ\" },\n { code: \"pl-PL\", label: \"Polski\" },\n { code: \"pt-BR\", label: \"Português Brasileiro\" },\n { code: \"pt-PT\", label: \"Português\" },\n { code: \"ro-RO\", label: \"Română\" },\n { code: \"ru-RU\", label: \"Русский\" },\n { code: \"sk-SK\", label: \"Slovenčina\" },\n { code: \"sv-SE\", label: \"Svenska\" },\n { code: \"tr-TR\", label: \"Türkçe\" },\n { code: \"uk-UA\", label: \"Українська\" },\n { code: \"zh-TW\", label: \"繁體中文\" },\n { code: \"en\", label: \"English\" }\n].concat([defaultLang]);\n\nexport const languages: Language[] = allLanguages\n .sort((left, right) => (left.label > right.label ? 1 : -1))\n .filter(\n (lang) =>\n (percentages as Record)[lang.code] >=\n COMPLETION_THRESHOLD,\n );\n\nconst TEST_LANG_CODE = \"__test__\";\nif (process.env.NODE_ENV === ENV.DEVELOPMENT) {\n languages.unshift(\n { code: TEST_LANG_CODE, label: \"test language\" },\n {\n code: `${TEST_LANG_CODE}.rtl`,\n label: \"\\u{202a}test language (rtl)\\u{202c}\",\n rtl: true,\n },\n );\n}\n\nlet currentLang: Language = defaultLang;\nlet currentLangData = {};\n\nexport const setLanguage = async (lang: Language) => {\n currentLang = lang;\n document.documentElement.dir = currentLang.rtl ? \"rtl\" : \"ltr\";\n document.documentElement.lang = currentLang.code;\n\n if (lang.code.startsWith(TEST_LANG_CODE)) {\n currentLangData = {};\n } else {\n currentLangData = await import(\n /* webpackChunkName: \"i18n-[request]\" */ `./locales/${currentLang.code}.json`\n );\n }\n};\n\nexport const getLanguage = () => currentLang;\n\nconst findPartsForData = (data: any, parts: string[]) => {\n for (let index = 0; index < parts.length; ++index) {\n const part = parts[index];\n if (data[part] === undefined) {\n return undefined;\n }\n data = data[part];\n }\n if (typeof data !== \"string\") {\n return undefined;\n }\n return data;\n};\n\nexport const t = (\n path: string,\n replacement?: { [key: string]: string | number },\n) => {\n if (currentLang.code.startsWith(TEST_LANG_CODE)) {\n const name = replacement\n ? `${path}(${JSON.stringify(replacement).slice(1, -1)})`\n : path;\n return `\\u{202a}[[${name}]]\\u{202c}`;\n }\n\n const parts = path.split(\".\");\n let translation =\n findPartsForData(currentLangData, parts) ||\n findPartsForData(fallbackLangData, parts);\n if (translation === undefined) {\n throw new Error(`Can't find translation for ${path}`);\n }\n\n if (replacement) {\n for (const key in replacement) {\n translation = translation.replace(`{{${key}}}`, String(replacement[key]));\n }\n }\n return translation;\n};\n","import oc from \"open-color\";\nimport {\n DEFAULT_FONT_FAMILY,\n DEFAULT_FONT_SIZE,\n DEFAULT_TEXT_ALIGN,\n EXPORT_SCALES,\n THEME,\n} from \"./constants\";\nimport { t } from \"./i18n\";\nimport { AppState, NormalizedZoomValue } from \"./types\";\nimport { getDateTime } from \"./utils\";\n\nconst defaultExportScale = EXPORT_SCALES.includes(devicePixelRatio)\n ? devicePixelRatio\n : 1;\n\nexport const getDefaultAppState = (): Omit<\n AppState,\n \"offsetTop\" | \"offsetLeft\" | \"width\" | \"height\"\n> => {\n return {\n theme: THEME.LIGHT,\n collaborators: new Map(),\n currentChartType: \"bar\",\n currentItemBackgroundColor: \"transparent\",\n currentItemEndArrowhead: \"arrow\",\n currentItemFillStyle: \"hachure\",\n currentItemFontFamily: DEFAULT_FONT_FAMILY,\n currentItemFontSize: DEFAULT_FONT_SIZE,\n currentItemLinearStrokeSharpness: \"round\",\n currentItemOpacity: 100,\n currentItemRoughness: 1,\n currentItemStartArrowhead: null,\n currentItemStrokeColor: oc.black,\n currentItemStrokeSharpness: \"sharp\",\n currentItemStrokeStyle: \"solid\",\n currentItemStrokeWidth: 1,\n currentItemTextAlign: DEFAULT_TEXT_ALIGN,\n cursorButton: \"up\",\n draggingElement: null,\n editingElement: null,\n editingGroupId: null,\n editingLinearElement: null,\n elementLocked: false,\n elementType: \"selection\",\n penMode: false,\n penDetected: false,\n errorMessage: null,\n exportBackground: true,\n exportScale: defaultExportScale,\n exportEmbedScene: false,\n exportWithDarkMode: false,\n fileHandle: null,\n gridSize: null,\n isBindingEnabled: true,\n isLibraryOpen: false,\n isLoading: false,\n isResizing: false,\n isRotating: false,\n lastPointerDownWith: \"mouse\",\n multiElement: null,\n name: `${t(\"labels.untitled\")}-${getDateTime()}`,\n openMenu: null,\n openPopup: null,\n pasteDialog: { shown: false, data: null },\n previousSelectedElementIds: {},\n resizingElement: null,\n scrolledOutside: false,\n scrollX: 0,\n scrollY: 0,\n selectedElementIds: {},\n selectedGroupIds: {},\n selectionElement: null,\n shouldCacheIgnoreZoom: false,\n showHelpDialog: false,\n showStats: false,\n startBoundElement: null,\n suggestedBindings: [],\n toastMessage: null,\n viewBackgroundColor: oc.white,\n zenModeEnabled: false,\n zoom: {\n value: 1 as NormalizedZoomValue,\n },\n viewModeEnabled: false,\n pendingImageElement: null,\n showHyperlinkPopup: false,\n };\n};\n\n/**\n * Config containing all AppState keys. Used to determine whether given state\n * prop should be stripped when exporting to given storage type.\n */\nconst APP_STATE_STORAGE_CONF = (<\n Values extends {\n /** whether to keep when storing to browser storage (localStorage/IDB) */\n browser: boolean;\n /** whether to keep when exporting to file/database */\n export: boolean;\n /** server (shareLink/collab/...) */\n server: boolean;\n },\n T extends Record,\n>(config: { [K in keyof T]: K extends keyof AppState ? T[K] : never }) =>\n config)({\n theme: { browser: true, export: false, server: false },\n collaborators: { browser: false, export: false, server: false },\n currentChartType: { browser: true, export: false, server: false },\n currentItemBackgroundColor: { browser: true, export: false, server: false },\n currentItemEndArrowhead: { browser: true, export: false, server: false },\n currentItemFillStyle: { browser: true, export: false, server: false },\n currentItemFontFamily: { browser: true, export: false, server: false },\n currentItemFontSize: { browser: true, export: false, server: false },\n currentItemLinearStrokeSharpness: {\n browser: true,\n export: false,\n server: false,\n },\n currentItemOpacity: { browser: true, export: false, server: false },\n currentItemRoughness: { browser: true, export: false, server: false },\n currentItemStartArrowhead: { browser: true, export: false, server: false },\n currentItemStrokeColor: { browser: true, export: false, server: false },\n currentItemStrokeSharpness: { browser: true, export: false, server: false },\n currentItemStrokeStyle: { browser: true, export: false, server: false },\n currentItemStrokeWidth: { browser: true, export: false, server: false },\n currentItemTextAlign: { browser: true, export: false, server: false },\n cursorButton: { browser: true, export: false, server: false },\n draggingElement: { browser: false, export: false, server: false },\n editingElement: { browser: false, export: false, server: false },\n editingGroupId: { browser: true, export: false, server: false },\n editingLinearElement: { browser: false, export: false, server: false },\n elementLocked: { browser: true, export: false, server: false },\n elementType: { browser: true, export: false, server: false },\n penMode: { browser: false, export: false, server: false },\n penDetected: { browser: false, export: false, server: false },\n errorMessage: { browser: false, export: false, server: false },\n exportBackground: { browser: true, export: false, server: false },\n exportEmbedScene: { browser: true, export: false, server: false },\n exportScale: { browser: true, export: false, server: false },\n exportWithDarkMode: { browser: true, export: false, server: false },\n fileHandle: { browser: false, export: false, server: false },\n gridSize: { browser: true, export: true, server: true },\n height: { browser: false, export: false, server: false },\n isBindingEnabled: { browser: false, export: false, server: false },\n isLibraryOpen: { browser: false, export: false, server: false },\n isLoading: { browser: false, export: false, server: false },\n isResizing: { browser: false, export: false, server: false },\n isRotating: { browser: false, export: false, server: false },\n lastPointerDownWith: { browser: true, export: false, server: false },\n multiElement: { browser: false, export: false, server: false },\n name: { browser: true, export: false, server: false },\n offsetLeft: { browser: false, export: false, server: false },\n offsetTop: { browser: false, export: false, server: false },\n openMenu: { browser: true, export: false, server: false },\n openPopup: { browser: false, export: false, server: false },\n pasteDialog: { browser: false, export: false, server: false },\n previousSelectedElementIds: { browser: true, export: false, server: false },\n resizingElement: { browser: false, export: false, server: false },\n scrolledOutside: { browser: true, export: false, server: false },\n scrollX: { browser: true, export: false, server: false },\n scrollY: { browser: true, export: false, server: false },\n selectedElementIds: { browser: true, export: false, server: false },\n selectedGroupIds: { browser: true, export: false, server: false },\n selectionElement: { browser: false, export: false, server: false },\n shouldCacheIgnoreZoom: { browser: true, export: false, server: false },\n showHelpDialog: { browser: false, export: false, server: false },\n showStats: { browser: true, export: false, server: false },\n startBoundElement: { browser: false, export: false, server: false },\n suggestedBindings: { browser: false, export: false, server: false },\n toastMessage: { browser: false, export: false, server: false },\n viewBackgroundColor: { browser: true, export: true, server: true },\n width: { browser: false, export: false, server: false },\n zenModeEnabled: { browser: true, export: false, server: false },\n zoom: { browser: true, export: false, server: false },\n viewModeEnabled: { browser: false, export: false, server: false },\n pendingImageElement: { browser: false, export: false, server: false },\n showHyperlinkPopup: { browser: false, export: false, server: false },\n});\n\nconst _clearAppStateForStorage = <\n ExportType extends \"export\" | \"browser\" | \"server\",\n>(\n appState: Partial,\n exportType: ExportType,\n) => {\n type ExportableKeys = {\n [K in keyof typeof APP_STATE_STORAGE_CONF]: typeof APP_STATE_STORAGE_CONF[K][ExportType] extends true\n ? K\n : never;\n }[keyof typeof APP_STATE_STORAGE_CONF];\n const stateForExport = {} as { [K in ExportableKeys]?: typeof appState[K] };\n for (const key of Object.keys(appState) as (keyof typeof appState)[]) {\n const propConfig = APP_STATE_STORAGE_CONF[key];\n if (propConfig?.[exportType]) {\n const nextValue = appState[key];\n\n // https://github.com/microsoft/TypeScript/issues/31445\n (stateForExport as any)[key] = nextValue;\n }\n }\n return stateForExport;\n};\n\nexport const clearAppStateForLocalStorage = (appState: Partial) => {\n return _clearAppStateForStorage(appState, \"browser\");\n};\n\nexport const cleanAppStateForExport = (appState: Partial) => {\n return _clearAppStateForStorage(appState, \"export\");\n};\n\nexport const clearAppStateForDatabase = (appState: Partial) => {\n return _clearAppStateForStorage(appState, \"server\");\n};\n","import { useCallback, useState } from \"react\";\n\nexport const useCallbackRefState = () => {\n const [refValue, setRefValue] = useState(null);\n const refCallback = useCallback((value: T | null) => setRefValue(value), []);\n return [refValue, refCallback] as const;\n};\n","import {\n ExcalidrawElement,\n ExcalidrawTextElement,\n ExcalidrawLinearElement,\n ExcalidrawBindableElement,\n ExcalidrawGenericElement,\n ExcalidrawFreeDrawElement,\n InitializedExcalidrawImageElement,\n ExcalidrawImageElement,\n ExcalidrawTextElementWithContainer,\n ExcalidrawTextContainer,\n} from \"./types\";\n\nexport const isGenericElement = (\n element: ExcalidrawElement | null,\n): element is ExcalidrawGenericElement => {\n return (\n element != null &&\n (element.type === \"selection\" ||\n element.type === \"rectangle\" ||\n element.type === \"diamond\" ||\n element.type === \"ellipse\")\n );\n};\n\nexport const isInitializedImageElement = (\n element: ExcalidrawElement | null,\n): element is InitializedExcalidrawImageElement => {\n return !!element && element.type === \"image\" && !!element.fileId;\n};\n\nexport const isImageElement = (\n element: ExcalidrawElement | null,\n): element is ExcalidrawImageElement => {\n return !!element && element.type === \"image\";\n};\n\nexport const isTextElement = (\n element: ExcalidrawElement | null,\n): element is ExcalidrawTextElement => {\n return element != null && element.type === \"text\";\n};\n\nexport const isFreeDrawElement = (\n element?: ExcalidrawElement | null,\n): element is ExcalidrawFreeDrawElement => {\n return element != null && isFreeDrawElementType(element.type);\n};\n\nexport const isFreeDrawElementType = (\n elementType: ExcalidrawElement[\"type\"],\n): boolean => {\n return elementType === \"freedraw\";\n};\n\nexport const isLinearElement = (\n element?: ExcalidrawElement | null,\n): element is ExcalidrawLinearElement => {\n return element != null && isLinearElementType(element.type);\n};\n\nexport const isLinearElementType = (\n elementType: ExcalidrawElement[\"type\"],\n): boolean => {\n return (\n elementType === \"arrow\" || elementType === \"line\" // || elementType === \"freedraw\"\n );\n};\n\nexport const isBindingElement = (\n element?: ExcalidrawElement | null,\n): element is ExcalidrawLinearElement => {\n return element != null && isBindingElementType(element.type);\n};\n\nexport const isBindingElementType = (\n elementType: ExcalidrawElement[\"type\"],\n): boolean => {\n return elementType === \"arrow\";\n};\n\nexport const isBindableElement = (\n element: ExcalidrawElement | null,\n): element is ExcalidrawBindableElement => {\n return (\n element != null &&\n (element.type === \"rectangle\" ||\n element.type === \"diamond\" ||\n element.type === \"ellipse\" ||\n element.type === \"image\" ||\n (element.type === \"text\" && !element.containerId))\n );\n};\n\nexport const isTextBindableContainer = (\n element: ExcalidrawElement | null,\n): element is ExcalidrawTextContainer => {\n return (\n element != null &&\n (element.type === \"rectangle\" ||\n element.type === \"diamond\" ||\n element.type === \"ellipse\" ||\n element.type === \"image\")\n );\n};\n\nexport const isExcalidrawElement = (element: any): boolean => {\n return (\n element?.type === \"text\" ||\n element?.type === \"diamond\" ||\n element?.type === \"rectangle\" ||\n element?.type === \"ellipse\" ||\n element?.type === \"arrow\" ||\n element?.type === \"freedraw\" ||\n element?.type === \"line\"\n );\n};\n\nexport const hasBoundTextElement = (\n element: ExcalidrawElement | null,\n): element is ExcalidrawBindableElement => {\n return (\n isBindableElement(element) &&\n !!element.boundElements?.some(({ type }) => type === \"text\")\n );\n};\n\nexport const isBoundToContainer = (\n element: ExcalidrawElement | null,\n): element is ExcalidrawTextElementWithContainer => {\n return (\n element !== null && isTextElement(element) && element.containerId !== null\n );\n};\n","import { NormalizedZoomValue, Point, Zoom } from \"./types\";\nimport { LINE_CONFIRM_THRESHOLD } from \"./constants\";\nimport { ExcalidrawLinearElement } from \"./element/types\";\n\nexport const rotate = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n angle: number,\n): [number, number] =>\n // 𝑎′𝑥=(𝑎𝑥−𝑐𝑥)cos𝜃−(𝑎𝑦−𝑐𝑦)sin𝜃+𝑐𝑥\n // 𝑎′𝑦=(𝑎𝑥−𝑐𝑥)sin𝜃+(𝑎𝑦−𝑐𝑦)cos𝜃+𝑐𝑦.\n // https://math.stackexchange.com/questions/2204520/how-do-i-rotate-a-line-segment-in-a-specific-point-on-the-line\n [\n (x1 - x2) * Math.cos(angle) - (y1 - y2) * Math.sin(angle) + x2,\n (x1 - x2) * Math.sin(angle) + (y1 - y2) * Math.cos(angle) + y2,\n ];\n\nexport const rotatePoint = (\n point: Point,\n center: Point,\n angle: number,\n): [number, number] => rotate(point[0], point[1], center[0], center[1], angle);\n\nexport const adjustXYWithRotation = (\n sides: {\n n?: boolean;\n e?: boolean;\n s?: boolean;\n w?: boolean;\n },\n x: number,\n y: number,\n angle: number,\n deltaX1: number,\n deltaY1: number,\n deltaX2: number,\n deltaY2: number,\n): [number, number] => {\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n if (sides.e && sides.w) {\n x += deltaX1 + deltaX2;\n } else if (sides.e) {\n x += deltaX1 * (1 + cos);\n y += deltaX1 * sin;\n x += deltaX2 * (1 - cos);\n y += deltaX2 * -sin;\n } else if (sides.w) {\n x += deltaX1 * (1 - cos);\n y += deltaX1 * -sin;\n x += deltaX2 * (1 + cos);\n y += deltaX2 * sin;\n }\n\n if (sides.n && sides.s) {\n y += deltaY1 + deltaY2;\n } else if (sides.n) {\n x += deltaY1 * sin;\n y += deltaY1 * (1 - cos);\n x += deltaY2 * -sin;\n y += deltaY2 * (1 + cos);\n } else if (sides.s) {\n x += deltaY1 * -sin;\n y += deltaY1 * (1 + cos);\n x += deltaY2 * sin;\n y += deltaY2 * (1 - cos);\n }\n return [x, y];\n};\n\nexport const getPointOnAPath = (point: Point, path: Point[]) => {\n const [px, py] = point;\n const [start, ...other] = path;\n let [lastX, lastY] = start;\n let kLine: number = 0;\n let idx: number = 0;\n\n // if any item in the array is true, it means that a point is\n // on some segment of a line based path\n const retVal = other.some(([x2, y2], i) => {\n // we always take a line when dealing with line segments\n const x1 = lastX;\n const y1 = lastY;\n\n lastX = x2;\n lastY = y2;\n\n // if a point is not within the domain of the line segment\n // it is not on the line segment\n if (px < x1 || px > x2) {\n return false;\n }\n\n // check if all points lie on the same line\n // y1 = kx1 + b, y2 = kx2 + b\n // y2 - y1 = k(x2 - x2) -> k = (y2 - y1) / (x2 - x1)\n\n // coefficient for the line (p0, p1)\n const kL = (y2 - y1) / (x2 - x1);\n\n // coefficient for the line segment (p0, point)\n const kP1 = (py - y1) / (px - x1);\n\n // coefficient for the line segment (point, p1)\n const kP2 = (py - y2) / (px - x2);\n\n // because we are basing both lines from the same starting point\n // the only option for collinearity is having same coefficients\n\n // using it for floating point comparisons\n const epsilon = 0.3;\n\n // if coefficient is more than an arbitrary epsilon,\n // these lines are nor collinear\n if (Math.abs(kP1 - kL) > epsilon && Math.abs(kP2 - kL) > epsilon) {\n return false;\n }\n\n // store the coefficient because we are goint to need it\n kLine = kL;\n idx = i;\n\n return true;\n });\n\n // Return a coordinate that is always on the line segment\n if (retVal === true) {\n return { x: point[0], y: kLine * point[0], segment: idx };\n }\n\n return null;\n};\n\nexport const distance2d = (x1: number, y1: number, x2: number, y2: number) => {\n const xd = x2 - x1;\n const yd = y2 - y1;\n return Math.hypot(xd, yd);\n};\n\nexport const centerPoint = (a: Point, b: Point): Point => {\n return [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2];\n};\n\n// Checks if the first and last point are close enough\n// to be considered a loop\nexport const isPathALoop = (\n points: ExcalidrawLinearElement[\"points\"],\n /** supply if you want the loop detection to account for current zoom */\n zoomValue: Zoom[\"value\"] = 1 as NormalizedZoomValue,\n): boolean => {\n if (points.length >= 3) {\n const [first, last] = [points[0], points[points.length - 1]];\n const distance = distance2d(first[0], first[1], last[0], last[1]);\n\n // Adjusting LINE_CONFIRM_THRESHOLD to current zoom so that when zoomed in\n // really close we make the threshold smaller, and vice versa.\n return distance <= LINE_CONFIRM_THRESHOLD / zoomValue;\n }\n return false;\n};\n\n// Draw a line from the point to the right till infiinty\n// Check how many lines of the polygon does this infinite line intersects with\n// If the number of intersections is odd, point is in the polygon\nexport const isPointInPolygon = (\n points: Point[],\n x: number,\n y: number,\n): boolean => {\n const vertices = points.length;\n\n // There must be at least 3 vertices in polygon\n if (vertices < 3) {\n return false;\n }\n const extreme: Point = [Number.MAX_SAFE_INTEGER, y];\n const p: Point = [x, y];\n let count = 0;\n for (let i = 0; i < vertices; i++) {\n const current = points[i];\n const next = points[(i + 1) % vertices];\n if (doSegmentsIntersect(current, next, p, extreme)) {\n if (orderedColinearOrientation(current, p, next) === 0) {\n return isPointWithinBounds(current, p, next);\n }\n count++;\n }\n }\n // true if count is off\n return count % 2 === 1;\n};\n\n// Returns whether `q` lies inside the segment/rectangle defined by `p` and `r`.\n// This is an approximation to \"does `q` lie on a segment `pr`\" check.\nconst isPointWithinBounds = (p: Point, q: Point, r: Point) => {\n return (\n q[0] <= Math.max(p[0], r[0]) &&\n q[0] >= Math.min(p[0], r[0]) &&\n q[1] <= Math.max(p[1], r[1]) &&\n q[1] >= Math.min(p[1], r[1])\n );\n};\n\n// For the ordered points p, q, r, return\n// 0 if p, q, r are colinear\n// 1 if Clockwise\n// 2 if counterclickwise\nconst orderedColinearOrientation = (p: Point, q: Point, r: Point) => {\n const val = (q[1] - p[1]) * (r[0] - q[0]) - (q[0] - p[0]) * (r[1] - q[1]);\n if (val === 0) {\n return 0;\n }\n return val > 0 ? 1 : 2;\n};\n\n// Check is p1q1 intersects with p2q2\nconst doSegmentsIntersect = (p1: Point, q1: Point, p2: Point, q2: Point) => {\n const o1 = orderedColinearOrientation(p1, q1, p2);\n const o2 = orderedColinearOrientation(p1, q1, q2);\n const o3 = orderedColinearOrientation(p2, q2, p1);\n const o4 = orderedColinearOrientation(p2, q2, q1);\n\n if (o1 !== o2 && o3 !== o4) {\n return true;\n }\n\n // p1, q1 and p2 are colinear and p2 lies on segment p1q1\n if (o1 === 0 && isPointWithinBounds(p1, p2, q1)) {\n return true;\n }\n\n // p1, q1 and p2 are colinear and q2 lies on segment p1q1\n if (o2 === 0 && isPointWithinBounds(p1, q2, q1)) {\n return true;\n }\n\n // p2, q2 and p1 are colinear and p1 lies on segment p2q2\n if (o3 === 0 && isPointWithinBounds(p2, p1, q2)) {\n return true;\n }\n\n // p2, q2 and q1 are colinear and q1 lies on segment p2q2\n if (o4 === 0 && isPointWithinBounds(p2, q1, q2)) {\n return true;\n }\n\n return false;\n};\n\n// TODO: Rounding this point causes some shake when free drawing\nexport const getGridPoint = (\n x: number,\n y: number,\n gridSize: number | null,\n): [number, number] => {\n if (gridSize) {\n return [\n Math.round(x / gridSize) * gridSize,\n Math.round(y / gridSize) * gridSize,\n ];\n }\n return [x, y];\n};\n","import { Point } from \"./types\";\n\nexport const getSizeFromPoints = (points: readonly Point[]) => {\n const xs = points.map((point) => point[0]);\n const ys = points.map((point) => point[1]);\n return {\n width: Math.max(...xs) - Math.min(...xs),\n height: Math.max(...ys) - Math.min(...ys),\n };\n};\n\nexport const rescalePoints = (\n dimension: 0 | 1,\n nextDimensionSize: number,\n prevPoints: readonly Point[],\n): Point[] => {\n const prevDimValues = prevPoints.map((point) => point[dimension]);\n const prevMaxDimension = Math.max(...prevDimValues);\n const prevMinDimension = Math.min(...prevDimValues);\n const prevDimensionSize = prevMaxDimension - prevMinDimension;\n\n const dimensionScaleFactor =\n prevDimensionSize === 0 ? 1 : nextDimensionSize / prevDimensionSize;\n\n let nextMinDimension = Infinity;\n\n const scaledPoints = prevPoints.map(\n (prevPoint) =>\n prevPoint.map((value, currentDimension) => {\n if (currentDimension !== dimension) {\n return value;\n }\n const scaledValue = value * dimensionScaleFactor;\n nextMinDimension = Math.min(scaledValue, nextMinDimension);\n return scaledValue;\n }) as [number, number],\n );\n\n if (scaledPoints.length === 2) {\n // we don't translate two-point lines\n return scaledPoints;\n }\n\n const translation = prevMinDimension - nextMinDimension;\n\n const nextPoints = scaledPoints.map(\n (scaledPoint) =>\n scaledPoint.map((value, currentDimension) => {\n return currentDimension === dimension ? value + translation : value;\n }) as [number, number],\n );\n\n return nextPoints;\n};\n","import {\n ExcalidrawElement,\n ExcalidrawLinearElement,\n Arrowhead,\n ExcalidrawFreeDrawElement,\n NonDeleted,\n} from \"./types\";\nimport { distance2d, rotate } from \"../math\";\nimport rough from \"roughjs/bin/rough\";\nimport { Drawable, Op } from \"roughjs/bin/core\";\nimport { Point } from \"../types\";\nimport {\n getShapeForElement,\n generateRoughOptions,\n} from \"../renderer/renderElement\";\nimport { isFreeDrawElement, isLinearElement } from \"./typeChecks\";\nimport { rescalePoints } from \"../points\";\n\n// x and y position of top left corner, x and y position of bottom right corner\nexport type Bounds = readonly [number, number, number, number];\n\n// If the element is created from right to left, the width is going to be negative\n// This set of functions retrieves the absolute position of the 4 points.\nexport const getElementAbsoluteCoords = (\n element: ExcalidrawElement,\n): Bounds => {\n if (isFreeDrawElement(element)) {\n return getFreeDrawElementAbsoluteCoords(element);\n } else if (isLinearElement(element)) {\n return getLinearElementAbsoluteCoords(element);\n }\n return [\n element.x,\n element.y,\n element.x + element.width,\n element.y + element.height,\n ];\n};\n\nexport const pointRelativeTo = (\n element: ExcalidrawElement,\n absoluteCoords: Point,\n): Point => {\n return [absoluteCoords[0] - element.x, absoluteCoords[1] - element.y];\n};\n\nexport const getDiamondPoints = (element: ExcalidrawElement) => {\n // Here we add +1 to avoid these numbers to be 0\n // otherwise rough.js will throw an error complaining about it\n const topX = Math.floor(element.width / 2) + 1;\n const topY = 0;\n const rightX = element.width;\n const rightY = Math.floor(element.height / 2) + 1;\n const bottomX = topX;\n const bottomY = element.height;\n const leftX = 0;\n const leftY = rightY;\n\n return [topX, topY, rightX, rightY, bottomX, bottomY, leftX, leftY];\n};\n\nexport const getCurvePathOps = (shape: Drawable): Op[] => {\n for (const set of shape.sets) {\n if (set.type === \"path\") {\n return set.ops;\n }\n }\n return shape.sets[0].ops;\n};\n\nconst getMinMaxXYFromCurvePathOps = (\n ops: Op[],\n transformXY?: (x: number, y: number) => [number, number],\n): [number, number, number, number] => {\n let currentP: Point = [0, 0];\n const { minX, minY, maxX, maxY } = ops.reduce(\n (limits, { op, data }) => {\n // There are only four operation types:\n // move, bcurveTo, lineTo, and curveTo\n if (op === \"move\") {\n // change starting point\n currentP = data as unknown as Point;\n // move operation does not draw anything; so, it always\n // returns false\n } else if (op === \"bcurveTo\") {\n // create points from bezier curve\n // bezier curve stores data as a flattened array of three positions\n // [x1, y1, x2, y2, x3, y3]\n const p1 = [data[0], data[1]] as Point;\n const p2 = [data[2], data[3]] as Point;\n const p3 = [data[4], data[5]] as Point;\n\n const p0 = currentP;\n currentP = p3;\n\n const equation = (t: number, idx: number) =>\n Math.pow(1 - t, 3) * p3[idx] +\n 3 * t * Math.pow(1 - t, 2) * p2[idx] +\n 3 * Math.pow(t, 2) * (1 - t) * p1[idx] +\n p0[idx] * Math.pow(t, 3);\n\n let t = 0;\n while (t <= 1.0) {\n let x = equation(t, 0);\n let y = equation(t, 1);\n if (transformXY) {\n [x, y] = transformXY(x, y);\n }\n\n limits.minY = Math.min(limits.minY, y);\n limits.minX = Math.min(limits.minX, x);\n\n limits.maxX = Math.max(limits.maxX, x);\n limits.maxY = Math.max(limits.maxY, y);\n\n t += 0.1;\n }\n } else if (op === \"lineTo\") {\n // TODO: Implement this\n } else if (op === \"qcurveTo\") {\n // TODO: Implement this\n }\n return limits;\n },\n { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity },\n );\n\n return [minX, minY, maxX, maxY];\n};\n\nconst getBoundsFromPoints = (\n points: ExcalidrawFreeDrawElement[\"points\"],\n): [number, number, number, number] => {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for (const [x, y] of points) {\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x);\n maxY = Math.max(maxY, y);\n }\n\n return [minX, minY, maxX, maxY];\n};\n\nconst getFreeDrawElementAbsoluteCoords = (\n element: ExcalidrawFreeDrawElement,\n): [number, number, number, number] => {\n const [minX, minY, maxX, maxY] = getBoundsFromPoints(element.points);\n\n return [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n};\n\nconst getLinearElementAbsoluteCoords = (\n element: ExcalidrawLinearElement,\n): [number, number, number, number] => {\n let coords: [number, number, number, number];\n\n if (element.points.length < 2 || !getShapeForElement(element)) {\n // XXX this is just a poor estimate and not very useful\n const { minX, minY, maxX, maxY } = element.points.reduce(\n (limits, [x, y]) => {\n limits.minY = Math.min(limits.minY, y);\n limits.minX = Math.min(limits.minX, x);\n\n limits.maxX = Math.max(limits.maxX, x);\n limits.maxY = Math.max(limits.maxY, y);\n\n return limits;\n },\n { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity },\n );\n coords = [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n } else {\n const shape = getShapeForElement(element)!;\n\n // first element is always the curve\n const ops = getCurvePathOps(shape[0]);\n\n const [minX, minY, maxX, maxY] = getMinMaxXYFromCurvePathOps(ops);\n\n coords = [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n }\n\n return coords;\n};\n\nexport const getArrowheadPoints = (\n element: ExcalidrawLinearElement,\n shape: Drawable[],\n position: \"start\" | \"end\",\n arrowhead: Arrowhead,\n) => {\n const ops = getCurvePathOps(shape[0]);\n if (ops.length < 1) {\n return null;\n }\n\n // The index of the bCurve operation to examine.\n const index = position === \"start\" ? 1 : ops.length - 1;\n\n const data = ops[index].data;\n const p3 = [data[4], data[5]] as Point;\n const p2 = [data[2], data[3]] as Point;\n const p1 = [data[0], data[1]] as Point;\n\n // We need to find p0 of the bezier curve.\n // It is typically the last point of the previous\n // curve; it can also be the position of moveTo operation.\n const prevOp = ops[index - 1];\n let p0: Point = [0, 0];\n if (prevOp.op === \"move\") {\n p0 = prevOp.data as unknown as Point;\n } else if (prevOp.op === \"bcurveTo\") {\n p0 = [prevOp.data[4], prevOp.data[5]];\n }\n\n // B(t) = p0 * (1-t)^3 + 3p1 * t * (1-t)^2 + 3p2 * t^2 * (1-t) + p3 * t^3\n const equation = (t: number, idx: number) =>\n Math.pow(1 - t, 3) * p3[idx] +\n 3 * t * Math.pow(1 - t, 2) * p2[idx] +\n 3 * Math.pow(t, 2) * (1 - t) * p1[idx] +\n p0[idx] * Math.pow(t, 3);\n\n // Ee know the last point of the arrow (or the first, if start arrowhead).\n const [x2, y2] = position === \"start\" ? p0 : p3;\n\n // By using cubic bezier equation (B(t)) and the given parameters,\n // we calculate a point that is closer to the last point.\n // The value 0.3 is chosen arbitrarily and it works best for all\n // the tested cases.\n const [x1, y1] = [equation(0.3, 0), equation(0.3, 1)];\n\n // Find the normalized direction vector based on the\n // previously calculated points.\n const distance = Math.hypot(x2 - x1, y2 - y1);\n const nx = (x2 - x1) / distance;\n const ny = (y2 - y1) / distance;\n\n const size = {\n arrow: 30,\n bar: 15,\n dot: 15,\n triangle: 15,\n }[arrowhead]; // pixels (will differ for each arrowhead)\n\n let length = 0;\n\n if (arrowhead === \"arrow\") {\n // Length for -> arrows is based on the length of the last section\n const [cx, cy] = element.points[element.points.length - 1];\n const [px, py] =\n element.points.length > 1\n ? element.points[element.points.length - 2]\n : [0, 0];\n\n length = Math.hypot(cx - px, cy - py);\n } else {\n // Length for other arrowhead types is based on the total length of the line\n for (let i = 0; i < element.points.length; i++) {\n const [px, py] = element.points[i - 1] || [0, 0];\n const [cx, cy] = element.points[i];\n length += Math.hypot(cx - px, cy - py);\n }\n }\n\n // Scale down the arrowhead until we hit a certain size so that it doesn't look weird.\n // This value is selected by minimizing a minimum size with the last segment of the arrowhead\n const minSize = Math.min(size, length / 2);\n const xs = x2 - nx * minSize;\n const ys = y2 - ny * minSize;\n\n if (arrowhead === \"dot\") {\n const r = Math.hypot(ys - y2, xs - x2) + element.strokeWidth;\n return [x2, y2, r];\n }\n\n const angle = {\n arrow: 20,\n bar: 90,\n triangle: 25,\n }[arrowhead]; // degrees\n\n // Return points\n const [x3, y3] = rotate(xs, ys, x2, y2, (-angle * Math.PI) / 180);\n const [x4, y4] = rotate(xs, ys, x2, y2, (angle * Math.PI) / 180);\n return [x2, y2, x3, y3, x4, y4];\n};\n\nconst getLinearElementRotatedBounds = (\n element: ExcalidrawLinearElement,\n cx: number,\n cy: number,\n): [number, number, number, number] => {\n if (element.points.length < 2 || !getShapeForElement(element)) {\n // XXX this is just a poor estimate and not very useful\n const { minX, minY, maxX, maxY } = element.points.reduce(\n (limits, [x, y]) => {\n [x, y] = rotate(element.x + x, element.y + y, cx, cy, element.angle);\n limits.minY = Math.min(limits.minY, y);\n limits.minX = Math.min(limits.minX, x);\n limits.maxX = Math.max(limits.maxX, x);\n limits.maxY = Math.max(limits.maxY, y);\n return limits;\n },\n { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity },\n );\n return [minX, minY, maxX, maxY];\n }\n\n const shape = getShapeForElement(element)!;\n\n // first element is always the curve\n const ops = getCurvePathOps(shape[0]);\n\n const transformXY = (x: number, y: number) =>\n rotate(element.x + x, element.y + y, cx, cy, element.angle);\n return getMinMaxXYFromCurvePathOps(ops, transformXY);\n};\n\n// We could cache this stuff\nexport const getElementBounds = (\n element: ExcalidrawElement,\n): [number, number, number, number] => {\n let bounds: [number, number, number, number];\n\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n if (isFreeDrawElement(element)) {\n const [minX, minY, maxX, maxY] = getBoundsFromPoints(\n element.points.map(([x, y]) =>\n rotate(x, y, cx - element.x, cy - element.y, element.angle),\n ),\n );\n\n return [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n } else if (isLinearElement(element)) {\n bounds = getLinearElementRotatedBounds(element, cx, cy);\n } else if (element.type === \"diamond\") {\n const [x11, y11] = rotate(cx, y1, cx, cy, element.angle);\n const [x12, y12] = rotate(cx, y2, cx, cy, element.angle);\n const [x22, y22] = rotate(x1, cy, cx, cy, element.angle);\n const [x21, y21] = rotate(x2, cy, cx, cy, element.angle);\n const minX = Math.min(x11, x12, x22, x21);\n const minY = Math.min(y11, y12, y22, y21);\n const maxX = Math.max(x11, x12, x22, x21);\n const maxY = Math.max(y11, y12, y22, y21);\n bounds = [minX, minY, maxX, maxY];\n } else if (element.type === \"ellipse\") {\n const w = (x2 - x1) / 2;\n const h = (y2 - y1) / 2;\n const cos = Math.cos(element.angle);\n const sin = Math.sin(element.angle);\n const ww = Math.hypot(w * cos, h * sin);\n const hh = Math.hypot(h * cos, w * sin);\n bounds = [cx - ww, cy - hh, cx + ww, cy + hh];\n } else {\n const [x11, y11] = rotate(x1, y1, cx, cy, element.angle);\n const [x12, y12] = rotate(x1, y2, cx, cy, element.angle);\n const [x22, y22] = rotate(x2, y2, cx, cy, element.angle);\n const [x21, y21] = rotate(x2, y1, cx, cy, element.angle);\n const minX = Math.min(x11, x12, x22, x21);\n const minY = Math.min(y11, y12, y22, y21);\n const maxX = Math.max(x11, x12, x22, x21);\n const maxY = Math.max(y11, y12, y22, y21);\n bounds = [minX, minY, maxX, maxY];\n }\n\n return bounds;\n};\n\nexport const getCommonBounds = (\n elements: readonly ExcalidrawElement[],\n): [number, number, number, number] => {\n if (!elements.length) {\n return [0, 0, 0, 0];\n }\n\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n\n elements.forEach((element) => {\n const [x1, y1, x2, y2] = getElementBounds(element);\n minX = Math.min(minX, x1);\n minY = Math.min(minY, y1);\n maxX = Math.max(maxX, x2);\n maxY = Math.max(maxY, y2);\n });\n\n return [minX, minY, maxX, maxY];\n};\n\nexport const getResizedElementAbsoluteCoords = (\n element: ExcalidrawElement,\n nextWidth: number,\n nextHeight: number,\n): [number, number, number, number] => {\n if (!(isLinearElement(element) || isFreeDrawElement(element))) {\n return [\n element.x,\n element.y,\n element.x + nextWidth,\n element.y + nextHeight,\n ];\n }\n\n const points = rescalePoints(\n 0,\n nextWidth,\n rescalePoints(1, nextHeight, element.points),\n );\n\n let bounds: [number, number, number, number];\n\n if (isFreeDrawElement(element)) {\n // Free Draw\n bounds = getBoundsFromPoints(points);\n } else {\n // Line\n const gen = rough.generator();\n const curve =\n element.strokeSharpness === \"sharp\"\n ? gen.linearPath(\n points as [number, number][],\n generateRoughOptions(element),\n )\n : gen.curve(\n points as [number, number][],\n generateRoughOptions(element),\n );\n const ops = getCurvePathOps(curve);\n bounds = getMinMaxXYFromCurvePathOps(ops);\n }\n\n const [minX, minY, maxX, maxY] = bounds;\n return [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n};\n\nexport const getElementPointsCoords = (\n element: ExcalidrawLinearElement,\n points: readonly (readonly [number, number])[],\n sharpness: ExcalidrawElement[\"strokeSharpness\"],\n): [number, number, number, number] => {\n // This might be computationally heavey\n const gen = rough.generator();\n const curve =\n sharpness === \"sharp\"\n ? gen.linearPath(\n points as [number, number][],\n generateRoughOptions(element),\n )\n : gen.curve(points as [number, number][], generateRoughOptions(element));\n const ops = getCurvePathOps(curve);\n const [minX, minY, maxX, maxY] = getMinMaxXYFromCurvePathOps(ops);\n return [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n};\n\nexport const getClosestElementBounds = (\n elements: readonly ExcalidrawElement[],\n from: { x: number; y: number },\n): [number, number, number, number] => {\n if (!elements.length) {\n return [0, 0, 0, 0];\n }\n\n let minDistance = Infinity;\n let closestElement = elements[0];\n\n elements.forEach((element) => {\n const [x1, y1, x2, y2] = getElementBounds(element);\n const distance = distance2d((x1 + x2) / 2, (y1 + y2) / 2, from.x, from.y);\n\n if (distance < minDistance) {\n minDistance = distance;\n closestElement = element;\n }\n });\n\n return getElementBounds(closestElement);\n};\n\nexport interface Box {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n midX: number;\n midY: number;\n width: number;\n height: number;\n}\n\nexport const getCommonBoundingBox = (\n elements: ExcalidrawElement[] | readonly NonDeleted[],\n): Box => {\n const [minX, minY, maxX, maxY] = getCommonBounds(elements);\n return {\n minX,\n minY,\n maxX,\n maxY,\n width: maxX - minX,\n height: maxY - minY,\n midX: (minX + maxX) / 2,\n midY: (minY + maxY) / 2,\n };\n};\n","import {\n ExcalidrawElement,\n NonDeletedExcalidrawElement,\n NonDeleted,\n} from \"../element/types\";\nimport { getNonDeletedElements, isNonDeletedElement } from \"../element\";\nimport { LinearElementEditor } from \"../element/linearElementEditor\";\n\ntype ElementIdKey = InstanceType[\"elementId\"];\ntype ElementKey = ExcalidrawElement | ElementIdKey;\n\ntype SceneStateCallback = () => void;\ntype SceneStateCallbackRemover = () => void;\n\nconst isIdKey = (elementKey: ElementKey): elementKey is ElementIdKey => {\n if (typeof elementKey === \"string\") {\n return true;\n }\n return false;\n};\n\nclass Scene {\n // ---------------------------------------------------------------------------\n // static methods/props\n // ---------------------------------------------------------------------------\n\n private static sceneMapByElement = new WeakMap();\n private static sceneMapById = new Map();\n\n static mapElementToScene(elementKey: ElementKey, scene: Scene) {\n if (isIdKey(elementKey)) {\n this.sceneMapById.set(elementKey, scene);\n } else {\n this.sceneMapByElement.set(elementKey, scene);\n }\n }\n\n static getScene(elementKey: ElementKey): Scene | null {\n if (isIdKey(elementKey)) {\n return this.sceneMapById.get(elementKey) || null;\n }\n return this.sceneMapByElement.get(elementKey) || null;\n }\n\n // ---------------------------------------------------------------------------\n // instance methods/props\n // ---------------------------------------------------------------------------\n\n private callbacks: Set = new Set();\n\n private nonDeletedElements: readonly NonDeletedExcalidrawElement[] = [];\n private elements: readonly ExcalidrawElement[] = [];\n private elementsMap = new Map();\n\n // TODO: getAllElementsIncludingDeleted\n getElementsIncludingDeleted() {\n return this.elements;\n }\n\n // TODO: getAllNonDeletedElements\n getElements(): readonly NonDeletedExcalidrawElement[] {\n return this.nonDeletedElements;\n }\n\n getElement(id: ExcalidrawElement[\"id\"]): ExcalidrawElement | null {\n return this.elementsMap.get(id) || null;\n }\n\n getNonDeletedElement(\n id: ExcalidrawElement[\"id\"],\n ): NonDeleted | null {\n const element = this.getElement(id);\n if (element && isNonDeletedElement(element)) {\n return element;\n }\n return null;\n }\n\n // TODO: Rename methods here, this is confusing\n getNonDeletedElements(\n ids: readonly ExcalidrawElement[\"id\"][],\n ): NonDeleted[] {\n const result: NonDeleted[] = [];\n ids.forEach((id) => {\n const element = this.getNonDeletedElement(id);\n if (element != null) {\n result.push(element);\n }\n });\n return result;\n }\n\n replaceAllElements(nextElements: readonly ExcalidrawElement[]) {\n this.elements = nextElements;\n this.elementsMap.clear();\n nextElements.forEach((element) => {\n this.elementsMap.set(element.id, element);\n Scene.mapElementToScene(element, this);\n });\n this.nonDeletedElements = getNonDeletedElements(this.elements);\n this.informMutation();\n }\n\n informMutation() {\n for (const callback of Array.from(this.callbacks)) {\n callback();\n }\n }\n\n addCallback(cb: SceneStateCallback): SceneStateCallbackRemover {\n if (this.callbacks.has(cb)) {\n throw new Error();\n }\n\n this.callbacks.add(cb);\n\n return () => {\n if (!this.callbacks.has(cb)) {\n throw new Error();\n }\n this.callbacks.delete(cb);\n };\n }\n\n destroy() {\n Scene.sceneMapById.forEach((scene, elementKey) => {\n if (scene === this) {\n Scene.sceneMapById.delete(elementKey);\n }\n });\n // done not for memory leaks, but to guard against possible late fires\n // (I guess?)\n this.callbacks.clear();\n }\n}\n\nexport default Scene;\n","import { getFontString, arrayToMap, isTestEnv } from \"../utils\";\nimport {\n ExcalidrawElement,\n ExcalidrawTextElement,\n ExcalidrawTextElementWithContainer,\n FontString,\n NonDeletedExcalidrawElement,\n} from \"./types\";\nimport { mutateElement } from \"./mutateElement\";\nimport { BOUND_TEXT_PADDING, VERTICAL_ALIGN } from \"../constants\";\nimport { MaybeTransformHandleType } from \"./transformHandles\";\nimport Scene from \"../scene/Scene\";\nimport { AppState } from \"../types\";\nimport { isTextElement } from \".\";\n\nexport const redrawTextBoundingBox = (\n element: ExcalidrawTextElement,\n container: ExcalidrawElement | null,\n appState: AppState,\n) => {\n const maxWidth = container\n ? container.width - BOUND_TEXT_PADDING * 2\n : undefined;\n let text = element.text;\n\n if (container) {\n text = wrapText(\n element.originalText,\n getFontString(element),\n container.width,\n );\n }\n const metrics = measureText(\n element.originalText,\n getFontString(element),\n maxWidth,\n );\n\n let coordY = element.y;\n // Resize container and vertically center align the text\n if (container) {\n let nextHeight = container.height;\n\n if (element.verticalAlign === VERTICAL_ALIGN.TOP) {\n coordY = container.y + BOUND_TEXT_PADDING;\n } else if (element.verticalAlign === VERTICAL_ALIGN.BOTTOM) {\n coordY =\n container.y + container.height - metrics.height - BOUND_TEXT_PADDING;\n } else {\n coordY = container.y + container.height / 2 - metrics.height / 2;\n if (metrics.height > container.height - BOUND_TEXT_PADDING * 2) {\n nextHeight = metrics.height + BOUND_TEXT_PADDING * 2;\n coordY = container.y + nextHeight / 2 - metrics.height / 2;\n }\n }\n mutateElement(container, { height: nextHeight });\n }\n\n mutateElement(element, {\n width: metrics.width,\n height: metrics.height,\n baseline: metrics.baseline,\n y: coordY,\n text,\n });\n};\n\nexport const bindTextToShapeAfterDuplication = (\n sceneElements: ExcalidrawElement[],\n oldElements: ExcalidrawElement[],\n oldIdToDuplicatedId: Map,\n): void => {\n const sceneElementMap = arrayToMap(sceneElements) as Map<\n ExcalidrawElement[\"id\"],\n ExcalidrawElement\n >;\n oldElements.forEach((element) => {\n const newElementId = oldIdToDuplicatedId.get(element.id) as string;\n const boundTextElementId = getBoundTextElementId(element);\n\n if (boundTextElementId) {\n const newTextElementId = oldIdToDuplicatedId.get(boundTextElementId);\n if (newTextElementId) {\n const newContainer = sceneElementMap.get(newElementId);\n if (newContainer) {\n mutateElement(newContainer, {\n boundElements: element.boundElements?.concat({\n type: \"text\",\n id: newTextElementId,\n }),\n });\n }\n const newTextElement = sceneElementMap.get(newTextElementId);\n if (newTextElement && isTextElement(newTextElement)) {\n mutateElement(newTextElement, {\n containerId: newContainer ? newElementId : null,\n });\n }\n }\n }\n });\n};\n\nexport const handleBindTextResize = (\n element: NonDeletedExcalidrawElement,\n transformHandleType: MaybeTransformHandleType,\n) => {\n const boundTextElementId = getBoundTextElementId(element);\n if (boundTextElementId) {\n const textElement = Scene.getScene(element)!.getElement(\n boundTextElementId,\n ) as ExcalidrawTextElement;\n if (textElement && textElement.text) {\n if (!element) {\n return;\n }\n let text = textElement.text;\n let nextHeight = textElement.height;\n let containerHeight = element.height;\n let nextBaseLine = textElement.baseline;\n if (transformHandleType !== \"n\" && transformHandleType !== \"s\") {\n if (text) {\n text = wrapText(\n textElement.originalText,\n getFontString(textElement),\n element.width,\n );\n }\n\n const dimensions = measureText(\n text,\n getFontString(textElement),\n element.width,\n );\n nextHeight = dimensions.height;\n nextBaseLine = dimensions.baseline;\n }\n // increase height in case text element height exceeds\n if (nextHeight > element.height - BOUND_TEXT_PADDING * 2) {\n containerHeight = nextHeight + BOUND_TEXT_PADDING * 2;\n const diff = containerHeight - element.height;\n // fix the y coord when resizing from ne/nw/n\n const updatedY =\n transformHandleType === \"ne\" ||\n transformHandleType === \"nw\" ||\n transformHandleType === \"n\"\n ? element.y - diff\n : element.y;\n mutateElement(element, {\n height: containerHeight,\n y: updatedY,\n });\n }\n\n let updatedY;\n if (textElement.verticalAlign === VERTICAL_ALIGN.TOP) {\n updatedY = element.y + BOUND_TEXT_PADDING;\n } else if (textElement.verticalAlign === VERTICAL_ALIGN.BOTTOM) {\n updatedY = element.y + element.height - nextHeight - BOUND_TEXT_PADDING;\n } else {\n updatedY = element.y + element.height / 2 - nextHeight / 2;\n }\n\n mutateElement(textElement, {\n text,\n // preserve padding and set width correctly\n width: element.width - BOUND_TEXT_PADDING * 2,\n height: nextHeight,\n x: element.x + BOUND_TEXT_PADDING,\n y: updatedY,\n baseline: nextBaseLine,\n });\n }\n }\n};\n\n// https://github.com/grassator/canvas-text-editor/blob/master/lib/FontMetrics.js\nexport const measureText = (\n text: string,\n font: FontString,\n maxWidth?: number | null,\n) => {\n text = text\n .split(\"\\n\")\n // replace empty lines with single space because leading/trailing empty\n // lines would be stripped from computation\n .map((x) => x || \" \")\n .join(\"\\n\");\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.whiteSpace = \"pre\";\n container.style.font = font;\n container.style.minHeight = \"1em\";\n if (maxWidth) {\n const lineHeight = getApproxLineHeight(font);\n container.style.width = `${String(maxWidth)}px`;\n container.style.maxWidth = `${String(maxWidth)}px`;\n container.style.overflow = \"hidden\";\n container.style.wordBreak = \"break-word\";\n container.style.lineHeight = `${String(lineHeight)}px`;\n container.style.whiteSpace = \"pre-wrap\";\n }\n document.body.appendChild(container);\n container.innerText = text;\n\n const span = document.createElement(\"span\");\n span.style.display = \"inline-block\";\n span.style.overflow = \"hidden\";\n span.style.width = \"1px\";\n span.style.height = \"1px\";\n container.appendChild(span);\n // Baseline is important for positioning text on canvas\n const baseline = span.offsetTop + span.offsetHeight;\n const width = container.offsetWidth;\n\n const height = container.offsetHeight;\n document.body.removeChild(container);\n\n return { width, height, baseline };\n};\n\nconst DUMMY_TEXT = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\".toLocaleUpperCase();\nconst cacheApproxLineHeight: { [key: FontString]: number } = {};\n\nexport const getApproxLineHeight = (font: FontString) => {\n if (cacheApproxLineHeight[font]) {\n return cacheApproxLineHeight[font];\n }\n cacheApproxLineHeight[font] = measureText(DUMMY_TEXT, font, null).height;\n return cacheApproxLineHeight[font];\n};\n\nlet canvas: HTMLCanvasElement | undefined;\nconst getTextWidth = (text: string, font: FontString) => {\n if (!canvas) {\n canvas = document.createElement(\"canvas\");\n }\n const canvas2dContext = canvas.getContext(\"2d\")!;\n canvas2dContext.font = font;\n\n const metrics = canvas2dContext.measureText(text);\n // since in test env the canvas measureText algo\n // doesn't measure text and instead just returns number of\n // characters hence we assume that each letteris 10px\n if (isTestEnv()) {\n return metrics.width * 10;\n }\n\n return metrics.width;\n};\n\nexport const wrapText = (\n text: string,\n font: FontString,\n containerWidth: number,\n) => {\n const maxWidth = containerWidth - BOUND_TEXT_PADDING * 2;\n\n const lines: Array = [];\n const originalLines = text.split(\"\\n\");\n const spaceWidth = getTextWidth(\" \", font);\n originalLines.forEach((originalLine) => {\n const words = originalLine.split(\" \");\n // This means its newline so push it\n if (words.length === 1 && words[0] === \"\") {\n lines.push(words[0]);\n } else {\n let currentLine = \"\";\n let currentLineWidthTillNow = 0;\n\n let index = 0;\n while (index < words.length) {\n const currentWordWidth = getTextWidth(words[index], font);\n\n // Start breaking longer words exceeding max width\n if (currentWordWidth >= maxWidth) {\n // push current line since the current word exceeds the max width\n // so will be appended in next line\n if (currentLine) {\n lines.push(currentLine);\n }\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n while (words[index].length > 0) {\n const currentChar = words[index][0];\n const width = charWidth.calculate(currentChar, font);\n currentLineWidthTillNow += width;\n words[index] = words[index].slice(1);\n\n if (currentLineWidthTillNow >= maxWidth) {\n // only remove last trailing space which we have added when joining words\n if (currentLine.slice(-1) === \" \") {\n currentLine = currentLine.slice(0, -1);\n }\n lines.push(currentLine);\n currentLine = currentChar;\n currentLineWidthTillNow = width;\n if (currentLineWidthTillNow === maxWidth) {\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n }\n } else {\n currentLine += currentChar;\n }\n }\n // push current line if appending space exceeds max width\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\n lines.push(currentLine);\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n } else {\n // space needs to be appended before next word\n // as currentLine contains chars which couldn't be appended\n // to previous line\n currentLine += \" \";\n currentLineWidthTillNow += spaceWidth;\n }\n\n index++;\n } else {\n // Start appending words in a line till max width reached\n while (currentLineWidthTillNow < maxWidth && index < words.length) {\n const word = words[index];\n currentLineWidthTillNow = getTextWidth(currentLine + word, font);\n\n if (currentLineWidthTillNow >= maxWidth) {\n lines.push(currentLine);\n currentLineWidthTillNow = 0;\n currentLine = \"\";\n\n break;\n }\n index++;\n currentLine += `${word} `;\n\n // Push the word if appending space exceeds max width\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\n lines.push(currentLine.slice(0, -1));\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n break;\n }\n }\n if (currentLineWidthTillNow === maxWidth) {\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n }\n }\n }\n if (currentLine) {\n // only remove last trailing space which we have added when joining words\n if (currentLine.slice(-1) === \" \") {\n currentLine = currentLine.slice(0, -1);\n }\n lines.push(currentLine);\n }\n }\n });\n return lines.join(\"\\n\");\n};\n\nexport const charWidth = (() => {\n const cachedCharWidth: { [key: FontString]: Array } = {};\n\n const calculate = (char: string, font: FontString) => {\n const ascii = char.charCodeAt(0);\n if (!cachedCharWidth[font]) {\n cachedCharWidth[font] = [];\n }\n if (!cachedCharWidth[font][ascii]) {\n const width = getTextWidth(char, font);\n cachedCharWidth[font][ascii] = width;\n }\n\n return cachedCharWidth[font][ascii];\n };\n\n const getCache = (font: FontString) => {\n return cachedCharWidth[font];\n };\n return {\n calculate,\n getCache,\n };\n})();\nexport const getApproxMinLineWidth = (font: FontString) => {\n const maxCharWidth = getMaxCharWidth(font);\n if (maxCharWidth === 0) {\n return (\n measureText(DUMMY_TEXT.split(\"\").join(\"\\n\"), font).width +\n BOUND_TEXT_PADDING * 2\n );\n }\n return maxCharWidth + BOUND_TEXT_PADDING * 2;\n};\n\nexport const getApproxMinLineHeight = (font: FontString) => {\n return getApproxLineHeight(font) + BOUND_TEXT_PADDING * 2;\n};\n\nexport const getMinCharWidth = (font: FontString) => {\n const cache = charWidth.getCache(font);\n if (!cache) {\n return 0;\n }\n const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\n\n return Math.min(...cacheWithOutEmpty);\n};\n\nexport const getMaxCharWidth = (font: FontString) => {\n const cache = charWidth.getCache(font);\n if (!cache) {\n return 0;\n }\n const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\n return Math.max(...cacheWithOutEmpty);\n};\n\nexport const getApproxCharsToFitInWidth = (font: FontString, width: number) => {\n // Generally lower case is used so converting to lower case\n const dummyText = DUMMY_TEXT.toLocaleLowerCase();\n const batchLength = 6;\n let index = 0;\n let widthTillNow = 0;\n let str = \"\";\n while (widthTillNow <= width) {\n const batch = dummyText.substr(index, index + batchLength);\n str += batch;\n widthTillNow += getTextWidth(str, font);\n if (index === dummyText.length - 1) {\n index = 0;\n }\n index = index + batchLength;\n }\n\n while (widthTillNow > width) {\n str = str.substr(0, str.length - 1);\n widthTillNow = getTextWidth(str, font);\n }\n return str.length;\n};\n\nexport const getBoundTextElementId = (container: ExcalidrawElement | null) => {\n return container?.boundElements?.length\n ? container?.boundElements?.filter((ele) => ele.type === \"text\")[0]?.id ||\n null\n : null;\n};\n\nexport const getBoundTextElement = (element: ExcalidrawElement | null) => {\n if (!element) {\n return null;\n }\n const boundTextElementId = getBoundTextElementId(element);\n if (boundTextElementId) {\n return (\n (Scene.getScene(element)?.getElement(\n boundTextElementId,\n ) as ExcalidrawTextElementWithContainer) || null\n );\n }\n return null;\n};\n\nexport const getContainerElement = (\n element:\n | (ExcalidrawElement & { containerId: ExcalidrawElement[\"id\"] | null })\n | null,\n) => {\n if (!element) {\n return null;\n }\n if (element.containerId) {\n return Scene.getScene(element)?.getElement(element.containerId) || null;\n }\n return null;\n};\n","import {\n ExcalidrawElement,\n ExcalidrawLinearElement,\n ExcalidrawTextElement,\n Arrowhead,\n NonDeletedExcalidrawElement,\n ExcalidrawFreeDrawElement,\n ExcalidrawImageElement,\n} from \"../element/types\";\nimport {\n isTextElement,\n isLinearElement,\n isFreeDrawElement,\n isInitializedImageElement,\n} from \"../element/typeChecks\";\nimport {\n getDiamondPoints,\n getElementAbsoluteCoords,\n getArrowheadPoints,\n} from \"../element/bounds\";\nimport { RoughCanvas } from \"roughjs/bin/canvas\";\nimport { Drawable, Options } from \"roughjs/bin/core\";\nimport { RoughSVG } from \"roughjs/bin/svg\";\nimport { RoughGenerator } from \"roughjs/bin/generator\";\n\nimport { RenderConfig } from \"../scene/types\";\nimport { distance, getFontString, getFontFamilyString, isRTL } from \"../utils\";\nimport { isPathALoop } from \"../math\";\nimport rough from \"roughjs/bin/rough\";\nimport { AppState, BinaryFiles, Zoom } from \"../types\";\nimport { getDefaultAppState } from \"../appState\";\nimport {\n BOUND_TEXT_PADDING,\n MAX_DECIMALS_FOR_SVG_EXPORT,\n MIME_TYPES,\n SVG_NS,\n VERTICAL_ALIGN,\n} from \"../constants\";\nimport { getStroke, StrokeOptions } from \"perfect-freehand\";\nimport { getApproxLineHeight } from \"../element/textElement\";\n\n// using a stronger invert (100% vs our regular 93%) and saturate\n// as a temp hack to make images in dark theme look closer to original\n// color scheme (it's still not quite there and the colors look slightly\n// desatured, alas...)\nconst IMAGE_INVERT_FILTER = \"invert(100%) hue-rotate(180deg) saturate(1.25)\";\n\nconst defaultAppState = getDefaultAppState();\n\nconst isPendingImageElement = (\n element: ExcalidrawElement,\n renderConfig: RenderConfig,\n) =>\n isInitializedImageElement(element) &&\n !renderConfig.imageCache.has(element.fileId);\n\nconst shouldResetImageFilter = (\n element: ExcalidrawElement,\n renderConfig: RenderConfig,\n) => {\n return (\n renderConfig.theme === \"dark\" &&\n isInitializedImageElement(element) &&\n !isPendingImageElement(element, renderConfig) &&\n renderConfig.imageCache.get(element.fileId)?.mimeType !== MIME_TYPES.svg\n );\n};\n\nconst getDashArrayDashed = (strokeWidth: number) => [8, 8 + strokeWidth];\n\nconst getDashArrayDotted = (strokeWidth: number) => [1.5, 6 + strokeWidth];\n\nconst getCanvasPadding = (element: ExcalidrawElement) =>\n element.type === \"freedraw\" ? element.strokeWidth * 12 : 20;\n\nexport interface ExcalidrawElementWithCanvas {\n element: ExcalidrawElement | ExcalidrawTextElement;\n canvas: HTMLCanvasElement;\n theme: RenderConfig[\"theme\"];\n canvasZoom: Zoom[\"value\"];\n canvasOffsetX: number;\n canvasOffsetY: number;\n}\n\nconst generateElementCanvas = (\n element: NonDeletedExcalidrawElement,\n zoom: Zoom,\n renderConfig: RenderConfig,\n): ExcalidrawElementWithCanvas => {\n const canvas = document.createElement(\"canvas\");\n const context = canvas.getContext(\"2d\")!;\n const padding = getCanvasPadding(element);\n\n let canvasOffsetX = 0;\n let canvasOffsetY = 0;\n\n if (isLinearElement(element) || isFreeDrawElement(element)) {\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n\n canvas.width =\n distance(x1, x2) * window.devicePixelRatio * zoom.value +\n padding * zoom.value * 2;\n canvas.height =\n distance(y1, y2) * window.devicePixelRatio * zoom.value +\n padding * zoom.value * 2;\n\n canvasOffsetX =\n element.x > x1\n ? distance(element.x, x1) * window.devicePixelRatio * zoom.value\n : 0;\n\n canvasOffsetY =\n element.y > y1\n ? distance(element.y, y1) * window.devicePixelRatio * zoom.value\n : 0;\n\n context.translate(canvasOffsetX, canvasOffsetY);\n } else {\n canvas.width =\n element.width * window.devicePixelRatio * zoom.value +\n padding * zoom.value * 2;\n canvas.height =\n element.height * window.devicePixelRatio * zoom.value +\n padding * zoom.value * 2;\n }\n\n context.save();\n context.translate(padding * zoom.value, padding * zoom.value);\n context.scale(\n window.devicePixelRatio * zoom.value,\n window.devicePixelRatio * zoom.value,\n );\n\n const rc = rough.canvas(canvas);\n\n // in dark theme, revert the image color filter\n if (shouldResetImageFilter(element, renderConfig)) {\n context.filter = IMAGE_INVERT_FILTER;\n }\n\n drawElementOnCanvas(element, rc, context, renderConfig);\n context.restore();\n\n return {\n element,\n canvas,\n theme: renderConfig.theme,\n canvasZoom: zoom.value,\n canvasOffsetX,\n canvasOffsetY,\n };\n};\n\nexport const DEFAULT_LINK_SIZE = 14;\n\nconst IMAGE_PLACEHOLDER_IMG = document.createElement(\"img\");\nIMAGE_PLACEHOLDER_IMG.src = `data:${MIME_TYPES.svg},${encodeURIComponent(\n ``,\n)}`;\n\nconst IMAGE_ERROR_PLACEHOLDER_IMG = document.createElement(\"img\");\nIMAGE_ERROR_PLACEHOLDER_IMG.src = `data:${MIME_TYPES.svg},${encodeURIComponent(\n ``,\n)}`;\n\nconst drawImagePlaceholder = (\n element: ExcalidrawImageElement,\n context: CanvasRenderingContext2D,\n zoomValue: AppState[\"zoom\"][\"value\"],\n) => {\n context.fillStyle = \"#E7E7E7\";\n context.fillRect(0, 0, element.width, element.height);\n\n const imageMinWidthOrHeight = Math.min(element.width, element.height);\n\n const size = Math.min(\n imageMinWidthOrHeight,\n Math.min(imageMinWidthOrHeight * 0.4, 100),\n );\n\n context.drawImage(\n element.status === \"error\"\n ? IMAGE_ERROR_PLACEHOLDER_IMG\n : IMAGE_PLACEHOLDER_IMG,\n element.width / 2 - size / 2,\n element.height / 2 - size / 2,\n size,\n size,\n );\n};\n\nconst drawElementOnCanvas = (\n element: NonDeletedExcalidrawElement,\n rc: RoughCanvas,\n context: CanvasRenderingContext2D,\n renderConfig: RenderConfig,\n) => {\n context.globalAlpha = element.opacity / 100;\n switch (element.type) {\n case \"rectangle\":\n case \"diamond\":\n case \"ellipse\": {\n context.lineJoin = \"round\";\n context.lineCap = \"round\";\n rc.draw(getShapeForElement(element)!);\n break;\n }\n case \"arrow\":\n case \"line\": {\n context.lineJoin = \"round\";\n context.lineCap = \"round\";\n\n getShapeForElement(element)!.forEach((shape) => {\n rc.draw(shape);\n });\n break;\n }\n case \"freedraw\": {\n // Draw directly to canvas\n context.save();\n context.fillStyle = element.strokeColor;\n\n const path = getFreeDrawPath2D(element) as Path2D;\n const fillShape = getShapeForElement(element);\n\n if (fillShape) {\n rc.draw(fillShape);\n }\n\n context.fillStyle = element.strokeColor;\n context.fill(path);\n\n context.restore();\n break;\n }\n case \"image\": {\n const img = isInitializedImageElement(element)\n ? renderConfig.imageCache.get(element.fileId)?.image\n : undefined;\n if (img != null && !(img instanceof Promise)) {\n context.drawImage(\n img,\n 0 /* hardcoded for the selection box*/,\n 0,\n element.width,\n element.height,\n );\n } else {\n drawImagePlaceholder(element, context, renderConfig.zoom.value);\n }\n break;\n }\n default: {\n if (isTextElement(element)) {\n const rtl = isRTL(element.text);\n const shouldTemporarilyAttach = rtl && !context.canvas.isConnected;\n if (shouldTemporarilyAttach) {\n // to correctly render RTL text mixed with LTR, we have to append it\n // to the DOM\n document.body.appendChild(context.canvas);\n }\n context.canvas.setAttribute(\"dir\", rtl ? \"rtl\" : \"ltr\");\n context.save();\n context.font = getFontString(element);\n context.fillStyle = element.strokeColor;\n context.textAlign = element.textAlign as CanvasTextAlign;\n\n // Canvas does not support multiline text by default\n const lines = element.text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n const lineHeight = element.containerId\n ? getApproxLineHeight(getFontString(element))\n : element.height / lines.length;\n let verticalOffset = element.height - element.baseline;\n if (element.verticalAlign === VERTICAL_ALIGN.BOTTOM) {\n verticalOffset = BOUND_TEXT_PADDING;\n }\n\n const horizontalOffset =\n element.textAlign === \"center\"\n ? element.width / 2\n : element.textAlign === \"right\"\n ? element.width\n : 0;\n for (let index = 0; index < lines.length; index++) {\n context.fillText(\n lines[index],\n horizontalOffset,\n (index + 1) * lineHeight - verticalOffset,\n );\n }\n context.restore();\n if (shouldTemporarilyAttach) {\n context.canvas.remove();\n }\n } else {\n throw new Error(`Unimplemented type ${element.type}`);\n }\n }\n }\n context.globalAlpha = 1;\n};\n\nconst elementWithCanvasCache = new WeakMap<\n ExcalidrawElement,\n ExcalidrawElementWithCanvas\n>();\n\nconst shapeCache = new WeakMap();\n\ntype ElementShape = Drawable | Drawable[] | null;\n\ntype ElementShapes = {\n freedraw: Drawable | null;\n arrow: Drawable[];\n line: Drawable[];\n text: null;\n image: null;\n};\n\nexport const getShapeForElement = (element: T) =>\n shapeCache.get(element) as T[\"type\"] extends keyof ElementShapes\n ? ElementShapes[T[\"type\"]] | undefined\n : Drawable | null | undefined;\n\nexport const setShapeForElement = (\n element: T,\n shape: T[\"type\"] extends keyof ElementShapes\n ? ElementShapes[T[\"type\"]]\n : Drawable,\n) => shapeCache.set(element, shape);\n\nexport const invalidateShapeForElement = (element: ExcalidrawElement) =>\n shapeCache.delete(element);\n\nexport const generateRoughOptions = (\n element: ExcalidrawElement,\n continuousPath = false,\n): Options => {\n const options: Options = {\n seed: element.seed,\n strokeLineDash:\n element.strokeStyle === \"dashed\"\n ? getDashArrayDashed(element.strokeWidth)\n : element.strokeStyle === \"dotted\"\n ? getDashArrayDotted(element.strokeWidth)\n : undefined,\n // for non-solid strokes, disable multiStroke because it tends to make\n // dashes/dots overlay each other\n disableMultiStroke: element.strokeStyle !== \"solid\",\n // for non-solid strokes, increase the width a bit to make it visually\n // similar to solid strokes, because we're also disabling multiStroke\n strokeWidth:\n element.strokeStyle !== \"solid\"\n ? element.strokeWidth + 0.5\n : element.strokeWidth,\n // when increasing strokeWidth, we must explicitly set fillWeight and\n // hachureGap because if not specified, roughjs uses strokeWidth to\n // calculate them (and we don't want the fills to be modified)\n fillWeight: element.strokeWidth / 2,\n hachureGap: element.strokeWidth * 4,\n roughness: element.roughness,\n stroke: element.strokeColor,\n preserveVertices: continuousPath,\n };\n\n switch (element.type) {\n case \"rectangle\":\n case \"diamond\":\n case \"ellipse\": {\n options.fillStyle = element.fillStyle;\n options.fill =\n element.backgroundColor === \"transparent\"\n ? undefined\n : element.backgroundColor;\n if (element.type === \"ellipse\") {\n options.curveFitting = 1;\n }\n return options;\n }\n case \"line\":\n case \"freedraw\": {\n if (isPathALoop(element.points)) {\n options.fillStyle = element.fillStyle;\n options.fill =\n element.backgroundColor === \"transparent\"\n ? undefined\n : element.backgroundColor;\n }\n return options;\n }\n case \"arrow\":\n return options;\n default: {\n throw new Error(`Unimplemented type ${element.type}`);\n }\n }\n};\n\n/**\n * Generates the element's shape and puts it into the cache.\n * @param element\n * @param generator\n */\nconst generateElementShape = (\n element: NonDeletedExcalidrawElement,\n generator: RoughGenerator,\n) => {\n let shape = shapeCache.get(element);\n\n // `null` indicates no rc shape applicable for this element type\n // (= do not generate anything)\n if (shape === undefined) {\n elementWithCanvasCache.delete(element);\n\n switch (element.type) {\n case \"rectangle\":\n if (element.strokeSharpness === \"round\") {\n const w = element.width;\n const h = element.height;\n const r = Math.min(w, h) * 0.25;\n shape = generator.path(\n `M ${r} 0 L ${w - r} 0 Q ${w} 0, ${w} ${r} L ${w} ${\n h - r\n } Q ${w} ${h}, ${w - r} ${h} L ${r} ${h} Q 0 ${h}, 0 ${\n h - r\n } L 0 ${r} Q 0 0, ${r} 0`,\n generateRoughOptions(element, true),\n );\n } else {\n shape = generator.rectangle(\n 0,\n 0,\n element.width,\n element.height,\n generateRoughOptions(element),\n );\n }\n setShapeForElement(element, shape);\n\n break;\n case \"diamond\": {\n const [topX, topY, rightX, rightY, bottomX, bottomY, leftX, leftY] =\n getDiamondPoints(element);\n if (element.strokeSharpness === \"round\") {\n shape = generator.path(\n `M ${topX + (rightX - topX) * 0.25} ${\n topY + (rightY - topY) * 0.25\n } L ${rightX - (rightX - topX) * 0.25} ${\n rightY - (rightY - topY) * 0.25\n }\n C ${rightX} ${rightY}, ${rightX} ${rightY}, ${\n rightX - (rightX - bottomX) * 0.25\n } ${rightY + (bottomY - rightY) * 0.25}\n L ${bottomX + (rightX - bottomX) * 0.25} ${\n bottomY - (bottomY - rightY) * 0.25\n }\n C ${bottomX} ${bottomY}, ${bottomX} ${bottomY}, ${\n bottomX - (bottomX - leftX) * 0.25\n } ${bottomY - (bottomY - leftY) * 0.25}\n L ${leftX + (bottomX - leftX) * 0.25} ${\n leftY + (bottomY - leftY) * 0.25\n }\n C ${leftX} ${leftY}, ${leftX} ${leftY}, ${\n leftX + (topX - leftX) * 0.25\n } ${leftY - (leftY - topY) * 0.25}\n L ${topX - (topX - leftX) * 0.25} ${topY + (leftY - topY) * 0.25}\n C ${topX} ${topY}, ${topX} ${topY}, ${\n topX + (rightX - topX) * 0.25\n } ${topY + (rightY - topY) * 0.25}`,\n generateRoughOptions(element, true),\n );\n } else {\n shape = generator.polygon(\n [\n [topX, topY],\n [rightX, rightY],\n [bottomX, bottomY],\n [leftX, leftY],\n ],\n generateRoughOptions(element),\n );\n }\n setShapeForElement(element, shape);\n\n break;\n }\n case \"ellipse\":\n shape = generator.ellipse(\n element.width / 2,\n element.height / 2,\n element.width,\n element.height,\n generateRoughOptions(element),\n );\n setShapeForElement(element, shape);\n\n break;\n case \"line\":\n case \"arrow\": {\n const options = generateRoughOptions(element);\n\n // points array can be empty in the beginning, so it is important to add\n // initial position to it\n const points = element.points.length ? element.points : [[0, 0]];\n\n // curve is always the first element\n // this simplifies finding the curve for an element\n if (element.strokeSharpness === \"sharp\") {\n if (options.fill) {\n shape = [generator.polygon(points as [number, number][], options)];\n } else {\n shape = [\n generator.linearPath(points as [number, number][], options),\n ];\n }\n } else {\n shape = [generator.curve(points as [number, number][], options)];\n }\n\n // add lines only in arrow\n if (element.type === \"arrow\") {\n const { startArrowhead = null, endArrowhead = \"arrow\" } = element;\n\n const getArrowheadShapes = (\n element: ExcalidrawLinearElement,\n shape: Drawable[],\n position: \"start\" | \"end\",\n arrowhead: Arrowhead,\n ) => {\n const arrowheadPoints = getArrowheadPoints(\n element,\n shape,\n position,\n arrowhead,\n );\n\n if (arrowheadPoints === null) {\n return [];\n }\n\n // Other arrowheads here...\n if (arrowhead === \"dot\") {\n const [x, y, r] = arrowheadPoints;\n\n return [\n generator.circle(x, y, r, {\n ...options,\n fill: element.strokeColor,\n fillStyle: \"solid\",\n stroke: \"none\",\n }),\n ];\n }\n\n if (arrowhead === \"triangle\") {\n const [x, y, x2, y2, x3, y3] = arrowheadPoints;\n\n // always use solid stroke for triangle arrowhead\n delete options.strokeLineDash;\n\n return [\n generator.polygon(\n [\n [x, y],\n [x2, y2],\n [x3, y3],\n [x, y],\n ],\n {\n ...options,\n fill: element.strokeColor,\n fillStyle: \"solid\",\n },\n ),\n ];\n }\n\n // Arrow arrowheads\n const [x2, y2, x3, y3, x4, y4] = arrowheadPoints;\n\n if (element.strokeStyle === \"dotted\") {\n // for dotted arrows caps, reduce gap to make it more legible\n const dash = getDashArrayDotted(element.strokeWidth - 1);\n options.strokeLineDash = [dash[0], dash[1] - 1];\n } else {\n // for solid/dashed, keep solid arrow cap\n delete options.strokeLineDash;\n }\n return [\n generator.line(x3, y3, x2, y2, options),\n generator.line(x4, y4, x2, y2, options),\n ];\n };\n\n if (startArrowhead !== null) {\n const shapes = getArrowheadShapes(\n element,\n shape,\n \"start\",\n startArrowhead,\n );\n shape.push(...shapes);\n }\n\n if (endArrowhead !== null) {\n if (endArrowhead === undefined) {\n // Hey, we have an old arrow here!\n }\n\n const shapes = getArrowheadShapes(\n element,\n shape,\n \"end\",\n endArrowhead,\n );\n shape.push(...shapes);\n }\n }\n\n setShapeForElement(element, shape);\n\n break;\n }\n case \"freedraw\": {\n generateFreeDrawShape(element);\n\n if (isPathALoop(element.points)) {\n // generate rough polygon to fill freedraw shape\n shape = generator.polygon(element.points as [number, number][], {\n ...generateRoughOptions(element),\n stroke: \"none\",\n });\n } else {\n shape = null;\n }\n setShapeForElement(element, shape);\n break;\n }\n case \"text\":\n case \"image\": {\n // just to ensure we don't regenerate element.canvas on rerenders\n setShapeForElement(element, null);\n break;\n }\n }\n }\n};\n\nconst generateElementWithCanvas = (\n element: NonDeletedExcalidrawElement,\n renderConfig: RenderConfig,\n) => {\n const zoom: Zoom = renderConfig ? renderConfig.zoom : defaultAppState.zoom;\n const prevElementWithCanvas = elementWithCanvasCache.get(element);\n const shouldRegenerateBecauseZoom =\n prevElementWithCanvas &&\n prevElementWithCanvas.canvasZoom !== zoom.value &&\n !renderConfig?.shouldCacheIgnoreZoom;\n\n if (\n !prevElementWithCanvas ||\n shouldRegenerateBecauseZoom ||\n prevElementWithCanvas.theme !== renderConfig.theme\n ) {\n const elementWithCanvas = generateElementCanvas(\n element,\n zoom,\n renderConfig,\n );\n\n elementWithCanvasCache.set(element, elementWithCanvas);\n\n return elementWithCanvas;\n }\n return prevElementWithCanvas;\n};\n\nconst drawElementFromCanvas = (\n elementWithCanvas: ExcalidrawElementWithCanvas,\n rc: RoughCanvas,\n context: CanvasRenderingContext2D,\n renderConfig: RenderConfig,\n) => {\n const element = elementWithCanvas.element;\n const padding = getCanvasPadding(element);\n let [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n\n // Free draw elements will otherwise \"shuffle\" as the min x and y change\n if (isFreeDrawElement(element)) {\n x1 = Math.floor(x1);\n x2 = Math.ceil(x2);\n y1 = Math.floor(y1);\n y2 = Math.ceil(y2);\n }\n\n const cx = ((x1 + x2) / 2 + renderConfig.scrollX) * window.devicePixelRatio;\n const cy = ((y1 + y2) / 2 + renderConfig.scrollY) * window.devicePixelRatio;\n\n const _isPendingImageElement = isPendingImageElement(element, renderConfig);\n\n const scaleXFactor =\n \"scale\" in elementWithCanvas.element && !_isPendingImageElement\n ? elementWithCanvas.element.scale[0]\n : 1;\n const scaleYFactor =\n \"scale\" in elementWithCanvas.element && !_isPendingImageElement\n ? elementWithCanvas.element.scale[1]\n : 1;\n\n context.save();\n context.scale(\n (1 / window.devicePixelRatio) * scaleXFactor,\n (1 / window.devicePixelRatio) * scaleYFactor,\n );\n context.translate(cx * scaleXFactor, cy * scaleYFactor);\n context.rotate(element.angle * scaleXFactor * scaleYFactor);\n\n context.drawImage(\n elementWithCanvas.canvas!,\n (-(x2 - x1) / 2) * window.devicePixelRatio -\n (padding * elementWithCanvas.canvasZoom) / elementWithCanvas.canvasZoom,\n (-(y2 - y1) / 2) * window.devicePixelRatio -\n (padding * elementWithCanvas.canvasZoom) / elementWithCanvas.canvasZoom,\n elementWithCanvas.canvas!.width / elementWithCanvas.canvasZoom,\n elementWithCanvas.canvas!.height / elementWithCanvas.canvasZoom,\n );\n context.restore();\n\n // Clear the nested element we appended to the DOM\n};\n\nexport const renderElement = (\n element: NonDeletedExcalidrawElement,\n rc: RoughCanvas,\n context: CanvasRenderingContext2D,\n renderConfig: RenderConfig,\n) => {\n const generator = rc.generator;\n switch (element.type) {\n case \"selection\": {\n context.save();\n context.translate(\n element.x + renderConfig.scrollX,\n element.y + renderConfig.scrollY,\n );\n context.fillStyle = \"rgba(0, 0, 255, 0.10)\";\n context.fillRect(0, 0, element.width, element.height);\n context.restore();\n break;\n }\n case \"freedraw\": {\n generateElementShape(element, generator);\n\n if (renderConfig.isExporting) {\n const elementWithCanvas = generateElementWithCanvas(\n element,\n renderConfig,\n );\n drawElementFromCanvas(elementWithCanvas, rc, context, renderConfig);\n } else {\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n const cx = (x1 + x2) / 2 + renderConfig.scrollX;\n const cy = (y1 + y2) / 2 + renderConfig.scrollY;\n const shiftX = (x2 - x1) / 2 - (element.x - x1);\n const shiftY = (y2 - y1) / 2 - (element.y - y1);\n context.save();\n context.translate(cx, cy);\n context.rotate(element.angle);\n context.translate(-shiftX, -shiftY);\n drawElementOnCanvas(element, rc, context, renderConfig);\n context.restore();\n }\n\n break;\n }\n case \"rectangle\":\n case \"diamond\":\n case \"ellipse\":\n case \"line\":\n case \"arrow\":\n case \"image\":\n case \"text\": {\n generateElementShape(element, generator);\n if (renderConfig.isExporting) {\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n const cx = (x1 + x2) / 2 + renderConfig.scrollX;\n const cy = (y1 + y2) / 2 + renderConfig.scrollY;\n const shiftX = (x2 - x1) / 2 - (element.x - x1);\n const shiftY = (y2 - y1) / 2 - (element.y - y1);\n context.save();\n context.translate(cx, cy);\n context.rotate(element.angle);\n context.translate(-shiftX, -shiftY);\n\n if (shouldResetImageFilter(element, renderConfig)) {\n context.filter = \"none\";\n }\n\n drawElementOnCanvas(element, rc, context, renderConfig);\n context.restore();\n // not exporting → optimized rendering (cache & render from element\n // canvases)\n } else {\n const elementWithCanvas = generateElementWithCanvas(\n element,\n renderConfig,\n );\n drawElementFromCanvas(elementWithCanvas, rc, context, renderConfig);\n }\n break;\n }\n default: {\n // @ts-ignore\n throw new Error(`Unimplemented type ${element.type}`);\n }\n }\n};\n\nconst roughSVGDrawWithPrecision = (\n rsvg: RoughSVG,\n drawable: Drawable,\n precision?: number,\n) => {\n if (typeof precision === \"undefined\") {\n return rsvg.draw(drawable);\n }\n const pshape: Drawable = {\n sets: drawable.sets,\n shape: drawable.shape,\n options: { ...drawable.options, fixedDecimalPlaceDigits: precision },\n };\n return rsvg.draw(pshape);\n};\n\nexport const renderElementToSvg = (\n element: NonDeletedExcalidrawElement,\n rsvg: RoughSVG,\n svgRoot: SVGElement,\n files: BinaryFiles,\n offsetX?: number,\n offsetY?: number,\n exportWithDarkMode?: boolean,\n) => {\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n const cx = (x2 - x1) / 2 - (element.x - x1);\n const cy = (y2 - y1) / 2 - (element.y - y1);\n const degree = (180 * element.angle) / Math.PI;\n const generator = rsvg.generator;\n\n // element to append node to, most of the time svgRoot\n let root = svgRoot;\n\n // if the element has a link, create an anchor tag and make that the new root\n if (element.link) {\n const anchorTag = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"a\");\n anchorTag.setAttribute(\"href\", element.link);\n root.appendChild(anchorTag);\n root = anchorTag;\n }\n\n switch (element.type) {\n case \"selection\": {\n // Since this is used only during editing experience, which is canvas based,\n // this should not happen\n throw new Error(\"Selection rendering is not supported for SVG\");\n }\n case \"rectangle\":\n case \"diamond\":\n case \"ellipse\": {\n generateElementShape(element, generator);\n const node = roughSVGDrawWithPrecision(\n rsvg,\n getShapeForElement(element)!,\n MAX_DECIMALS_FOR_SVG_EXPORT,\n );\n const opacity = element.opacity / 100;\n if (opacity !== 1) {\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\n node.setAttribute(\"fill-opacity\", `${opacity}`);\n }\n node.setAttribute(\"stroke-linecap\", \"round\");\n node.setAttribute(\n \"transform\",\n `translate(${offsetX || 0} ${\n offsetY || 0\n }) rotate(${degree} ${cx} ${cy})`,\n );\n root.appendChild(node);\n break;\n }\n case \"line\":\n case \"arrow\": {\n generateElementShape(element, generator);\n const group = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"g\");\n const opacity = element.opacity / 100;\n group.setAttribute(\"stroke-linecap\", \"round\");\n\n getShapeForElement(element)!.forEach((shape) => {\n const node = roughSVGDrawWithPrecision(\n rsvg,\n shape,\n MAX_DECIMALS_FOR_SVG_EXPORT,\n );\n if (opacity !== 1) {\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\n node.setAttribute(\"fill-opacity\", `${opacity}`);\n }\n node.setAttribute(\n \"transform\",\n `translate(${offsetX || 0} ${\n offsetY || 0\n }) rotate(${degree} ${cx} ${cy})`,\n );\n if (\n element.type === \"line\" &&\n isPathALoop(element.points) &&\n element.backgroundColor !== \"transparent\"\n ) {\n node.setAttribute(\"fill-rule\", \"evenodd\");\n }\n group.appendChild(node);\n });\n root.appendChild(group);\n break;\n }\n case \"freedraw\": {\n generateFreeDrawShape(element);\n const opacity = element.opacity / 100;\n const shape = getShapeForElement(element);\n const node = shape\n ? roughSVGDrawWithPrecision(rsvg, shape, MAX_DECIMALS_FOR_SVG_EXPORT)\n : svgRoot.ownerDocument!.createElementNS(SVG_NS, \"g\");\n if (opacity !== 1) {\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\n node.setAttribute(\"fill-opacity\", `${opacity}`);\n }\n node.setAttribute(\n \"transform\",\n `translate(${offsetX || 0} ${\n offsetY || 0\n }) rotate(${degree} ${cx} ${cy})`,\n );\n node.setAttribute(\"stroke\", \"none\");\n const path = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"path\");\n path.setAttribute(\"fill\", element.strokeColor);\n path.setAttribute(\"d\", getFreeDrawSvgPath(element));\n node.appendChild(path);\n root.appendChild(node);\n break;\n }\n case \"image\": {\n const fileData =\n isInitializedImageElement(element) && files[element.fileId];\n if (fileData) {\n const symbolId = `image-${fileData.id}`;\n let symbol = svgRoot.querySelector(`#${symbolId}`);\n if (!symbol) {\n symbol = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"symbol\");\n symbol.id = symbolId;\n\n const image = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"image\");\n\n image.setAttribute(\"width\", \"100%\");\n image.setAttribute(\"height\", \"100%\");\n image.setAttribute(\"href\", fileData.dataURL);\n\n symbol.appendChild(image);\n\n root.prepend(symbol);\n }\n\n const use = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"use\");\n use.setAttribute(\"href\", `#${symbolId}`);\n\n // in dark theme, revert the image color filter\n if (exportWithDarkMode && fileData.mimeType !== MIME_TYPES.svg) {\n use.setAttribute(\"filter\", IMAGE_INVERT_FILTER);\n }\n\n use.setAttribute(\"width\", `${Math.round(element.width)}`);\n use.setAttribute(\"height\", `${Math.round(element.height)}`);\n\n use.setAttribute(\n \"transform\",\n `translate(${offsetX || 0} ${\n offsetY || 0\n }) rotate(${degree} ${cx} ${cy})`,\n );\n\n root.appendChild(use);\n }\n break;\n }\n default: {\n if (isTextElement(element)) {\n const opacity = element.opacity / 100;\n const node = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"g\");\n if (opacity !== 1) {\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\n node.setAttribute(\"fill-opacity\", `${opacity}`);\n }\n node.setAttribute(\n \"transform\",\n `translate(${offsetX || 0} ${\n offsetY || 0\n }) rotate(${degree} ${cx} ${cy})`,\n );\n const lines = element.text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n const lineHeight = element.height / lines.length;\n const verticalOffset = element.height - element.baseline;\n const horizontalOffset =\n element.textAlign === \"center\"\n ? element.width / 2\n : element.textAlign === \"right\"\n ? element.width\n : 0;\n const direction = isRTL(element.text) ? \"rtl\" : \"ltr\";\n const textAnchor =\n element.textAlign === \"center\"\n ? \"middle\"\n : element.textAlign === \"right\" || direction === \"rtl\"\n ? \"end\"\n : \"start\";\n for (let i = 0; i < lines.length; i++) {\n const text = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"text\");\n text.textContent = lines[i];\n text.setAttribute(\"x\", `${horizontalOffset}`);\n text.setAttribute(\"y\", `${(i + 1) * lineHeight - verticalOffset}`);\n text.setAttribute(\"font-family\", getFontFamilyString(element));\n text.setAttribute(\"font-size\", `${element.fontSize}px`);\n text.setAttribute(\"fill\", element.strokeColor);\n text.setAttribute(\"text-anchor\", textAnchor);\n text.setAttribute(\"style\", \"white-space: pre;\");\n text.setAttribute(\"direction\", direction);\n node.appendChild(text);\n }\n root.appendChild(node);\n } else {\n // @ts-ignore\n throw new Error(`Unimplemented type ${element.type}`);\n }\n }\n }\n};\n\nexport const pathsCache = new WeakMap([]);\n\nexport function generateFreeDrawShape(element: ExcalidrawFreeDrawElement) {\n const svgPathData = getFreeDrawSvgPath(element);\n const path = new Path2D(svgPathData);\n pathsCache.set(element, path);\n return path;\n}\n\nexport function getFreeDrawPath2D(element: ExcalidrawFreeDrawElement) {\n return pathsCache.get(element);\n}\n\nexport function getFreeDrawSvgPath(element: ExcalidrawFreeDrawElement) {\n // If input points are empty (should they ever be?) return a dot\n const inputPoints = element.simulatePressure\n ? element.points\n : element.points.length\n ? element.points.map(([x, y], i) => [x, y, element.pressures[i]])\n : [[0, 0, 0.5]];\n\n // Consider changing the options for simulated pressure vs real pressure\n const options: StrokeOptions = {\n simulatePressure: element.simulatePressure,\n size: element.strokeWidth * 4.25,\n thinning: 0.6,\n smoothing: 0.5,\n streamline: 0.5,\n easing: (t) => Math.sin((t * Math.PI) / 2), // https://easings.net/#easeOutSine\n last: !!element.lastCommittedPoint, // LastCommittedPoint is added on pointerup\n };\n\n return getSvgPathFromStroke(getStroke(inputPoints as number[][], options));\n}\n\nfunction med(A: number[], B: number[]) {\n return [(A[0] + B[0]) / 2, (A[1] + B[1]) / 2];\n}\n\n// Trim SVG path data so number are each two decimal points. This\n// improves SVG exports, and prevents rendering errors on points\n// with long decimals.\nconst TO_FIXED_PRECISION = /(\\s?[A-Z]?,?-?[0-9]*\\.[0-9]{0,2})(([0-9]|e|-)*)/g;\n\nfunction getSvgPathFromStroke(points: number[][]): string {\n if (!points.length) {\n return \"\";\n }\n\n const max = points.length - 1;\n\n return points\n .reduce(\n (acc, point, i, arr) => {\n if (i === max) {\n acc.push(point, med(point, arr[0]), \"L\", arr[0], \"Z\");\n } else {\n acc.push(point, med(point, arr[i + 1]));\n }\n return acc;\n },\n [\"M\", points[0], \"Q\"],\n )\n .join(\" \")\n .replace(TO_FIXED_PRECISION, \"$1\");\n}\n","import { Random } from \"roughjs/bin/math\";\nimport { nanoid } from \"nanoid\";\nimport { isTestEnv } from \"./utils\";\n\nlet random = new Random(Date.now());\nlet testIdBase = 0;\n\nexport const randomInteger = () => Math.floor(random.next() * 2 ** 31);\n\nexport const reseed = (seed: number) => {\n random = new Random(seed);\n testIdBase = 0;\n};\n\nexport const randomId = () => (isTestEnv() ? `id${testIdBase++}` : nanoid());\n","import { ExcalidrawElement } from \"./types\";\nimport { invalidateShapeForElement } from \"../renderer/renderElement\";\nimport Scene from \"../scene/Scene\";\nimport { getSizeFromPoints } from \"../points\";\nimport { randomInteger } from \"../random\";\nimport { Point } from \"../types\";\nimport { getUpdatedTimestamp } from \"../utils\";\n\ntype ElementUpdate = Omit<\n Partial,\n \"id\" | \"version\" | \"versionNonce\"\n>;\n\n// This function tracks updates of text elements for the purposes for collaboration.\n// The version is used to compare updates when more than one user is working in\n// the same drawing. Note: this will trigger the component to update. Make sure you\n// are calling it either from a React event handler or within unstable_batchedUpdates().\nexport const mutateElement = >(\n element: TElement,\n updates: ElementUpdate,\n informMutation = true,\n): TElement => {\n let didChange = false;\n\n // casting to any because can't use `in` operator\n // (see https://github.com/microsoft/TypeScript/issues/21732)\n const { points, fileId } = updates as any;\n\n if (typeof points !== \"undefined\") {\n updates = { ...getSizeFromPoints(points), ...updates };\n }\n\n for (const key in updates) {\n const value = (updates as any)[key];\n if (typeof value !== \"undefined\") {\n if (\n (element as any)[key] === value &&\n // if object, always update because its attrs could have changed\n // (except for specific keys we handle below)\n (typeof value !== \"object\" ||\n value === null ||\n key === \"groupIds\" ||\n key === \"scale\")\n ) {\n continue;\n }\n\n if (key === \"scale\") {\n const prevScale = (element as any)[key];\n const nextScale = value;\n if (prevScale[0] === nextScale[0] && prevScale[1] === nextScale[1]) {\n continue;\n }\n } else if (key === \"points\") {\n const prevPoints = (element as any)[key];\n const nextPoints = value;\n if (prevPoints.length === nextPoints.length) {\n let didChangePoints = false;\n let index = prevPoints.length;\n while (--index) {\n const prevPoint: Point = prevPoints[index];\n const nextPoint: Point = nextPoints[index];\n if (\n prevPoint[0] !== nextPoint[0] ||\n prevPoint[1] !== nextPoint[1]\n ) {\n didChangePoints = true;\n break;\n }\n }\n if (!didChangePoints) {\n continue;\n }\n }\n }\n\n (element as any)[key] = value;\n didChange = true;\n }\n }\n if (!didChange) {\n return element;\n }\n\n if (\n typeof updates.height !== \"undefined\" ||\n typeof updates.width !== \"undefined\" ||\n typeof fileId != \"undefined\" ||\n typeof points !== \"undefined\"\n ) {\n invalidateShapeForElement(element);\n }\n\n element.version++;\n element.versionNonce = randomInteger();\n element.updated = getUpdatedTimestamp();\n\n if (informMutation) {\n Scene.getScene(element)?.informMutation();\n }\n\n return element;\n};\n\nexport const newElementWith = (\n element: TElement,\n updates: ElementUpdate,\n): TElement => {\n let didChange = false;\n for (const key in updates) {\n const value = (updates as any)[key];\n if (typeof value !== \"undefined\") {\n if (\n (element as any)[key] === value &&\n // if object, always update because its attrs could have changed\n (typeof value !== \"object\" || value === null)\n ) {\n continue;\n }\n didChange = true;\n }\n }\n\n if (!didChange) {\n return element;\n }\n\n return {\n ...element,\n ...updates,\n updated: getUpdatedTimestamp(),\n version: element.version + 1,\n versionNonce: randomInteger(),\n };\n};\n\n/**\n * Mutates element, bumping `version`, `versionNonce`, and `updated`.\n *\n * NOTE: does not trigger re-render.\n */\nexport const bumpVersion = (\n element: Mutable,\n version?: ExcalidrawElement[\"version\"],\n) => {\n element.version = (version ?? element.version) + 1;\n element.versionNonce = randomInteger();\n element.updated = getUpdatedTimestamp();\n return element;\n};\n","import { ExcalidrawElement } from \"./types\";\nimport { mutateElement } from \"./mutateElement\";\nimport { isFreeDrawElement, isLinearElement } from \"./typeChecks\";\nimport { SHIFT_LOCKING_ANGLE } from \"../constants\";\n\nexport const isInvisiblySmallElement = (\n element: ExcalidrawElement,\n): boolean => {\n if (isLinearElement(element) || isFreeDrawElement(element)) {\n return element.points.length < 2;\n }\n return element.width === 0 && element.height === 0;\n};\n\n/**\n * Makes a perfect shape or diagonal/horizontal/vertical line\n */\nexport const getPerfectElementSize = (\n elementType: string,\n width: number,\n height: number,\n): { width: number; height: number } => {\n const absWidth = Math.abs(width);\n const absHeight = Math.abs(height);\n\n if (\n elementType === \"line\" ||\n elementType === \"arrow\" ||\n elementType === \"freedraw\"\n ) {\n const lockedAngle =\n Math.round(Math.atan(absHeight / absWidth) / SHIFT_LOCKING_ANGLE) *\n SHIFT_LOCKING_ANGLE;\n if (lockedAngle === 0) {\n height = 0;\n } else if (lockedAngle === Math.PI / 2) {\n width = 0;\n } else {\n height =\n Math.round(absWidth * Math.tan(lockedAngle)) * Math.sign(height) ||\n height;\n }\n } else if (elementType !== \"selection\") {\n height = absWidth * Math.sign(height);\n }\n return { width, height };\n};\n\nexport const resizePerfectLineForNWHandler = (\n element: ExcalidrawElement,\n x: number,\n y: number,\n) => {\n const anchorX = element.x + element.width;\n const anchorY = element.y + element.height;\n const distanceToAnchorX = x - anchorX;\n const distanceToAnchorY = y - anchorY;\n if (Math.abs(distanceToAnchorX) < Math.abs(distanceToAnchorY) / 2) {\n mutateElement(element, {\n x: anchorX,\n width: 0,\n y,\n height: -distanceToAnchorY,\n });\n } else if (Math.abs(distanceToAnchorY) < Math.abs(element.width) / 2) {\n mutateElement(element, {\n y: anchorY,\n height: 0,\n });\n } else {\n const nextHeight =\n Math.sign(distanceToAnchorY) *\n Math.sign(distanceToAnchorX) *\n element.width;\n mutateElement(element, {\n x,\n y: anchorY - nextHeight,\n width: -distanceToAnchorX,\n height: nextHeight,\n });\n }\n};\n\nexport const getNormalizedDimensions = (\n element: Pick,\n): {\n width: ExcalidrawElement[\"width\"];\n height: ExcalidrawElement[\"height\"];\n x: ExcalidrawElement[\"x\"];\n y: ExcalidrawElement[\"y\"];\n} => {\n const ret = {\n width: element.width,\n height: element.height,\n x: element.x,\n y: element.y,\n };\n\n if (element.width < 0) {\n const nextWidth = Math.abs(element.width);\n ret.width = nextWidth;\n ret.x = element.x - nextWidth;\n }\n\n if (element.height < 0) {\n const nextHeight = Math.abs(element.height);\n ret.height = nextHeight;\n ret.y = element.y - nextHeight;\n }\n\n return ret;\n};\n","import { GroupId, ExcalidrawElement, NonDeleted } from \"./element/types\";\nimport { AppState } from \"./types\";\nimport { getSelectedElements } from \"./scene\";\nimport { getBoundTextElement } from \"./element/textElement\";\n\nexport const selectGroup = (\n groupId: GroupId,\n appState: AppState,\n elements: readonly NonDeleted[],\n): AppState => {\n const elementsInGroup = elements.filter((element) =>\n element.groupIds.includes(groupId),\n );\n\n if (elementsInGroup.length < 2) {\n if (\n appState.selectedGroupIds[groupId] ||\n appState.editingGroupId === groupId\n ) {\n return {\n ...appState,\n selectedGroupIds: { ...appState.selectedGroupIds, [groupId]: false },\n editingGroupId: null,\n };\n }\n return appState;\n }\n\n return {\n ...appState,\n selectedGroupIds: { ...appState.selectedGroupIds, [groupId]: true },\n selectedElementIds: {\n ...appState.selectedElementIds,\n ...Object.fromEntries(\n elementsInGroup.map((element) => [element.id, true]),\n ),\n },\n };\n};\n\n/**\n * If the element's group is selected, don't render an individual\n * selection border around it.\n */\nexport const isSelectedViaGroup = (\n appState: AppState,\n element: ExcalidrawElement,\n) => getSelectedGroupForElement(appState, element) != null;\n\nexport const getSelectedGroupForElement = (\n appState: AppState,\n element: ExcalidrawElement,\n) =>\n element.groupIds\n .filter((groupId) => groupId !== appState.editingGroupId)\n .find((groupId) => appState.selectedGroupIds[groupId]);\n\nexport const getSelectedGroupIds = (appState: AppState): GroupId[] =>\n Object.entries(appState.selectedGroupIds)\n .filter(([groupId, isSelected]) => isSelected)\n .map(([groupId, isSelected]) => groupId);\n\n/**\n * When you select an element, you often want to actually select the whole group it's in, unless\n * you're currently editing that group.\n */\nexport const selectGroupsForSelectedElements = (\n appState: AppState,\n elements: readonly NonDeleted[],\n): AppState => {\n let nextAppState: AppState = { ...appState, selectedGroupIds: {} };\n\n const selectedElements = getSelectedElements(elements, appState);\n\n if (!selectedElements.length) {\n return { ...nextAppState, editingGroupId: null };\n }\n\n for (const selectedElement of selectedElements) {\n let groupIds = selectedElement.groupIds;\n if (appState.editingGroupId) {\n // handle the case where a group is nested within a group\n const indexOfEditingGroup = groupIds.indexOf(appState.editingGroupId);\n if (indexOfEditingGroup > -1) {\n groupIds = groupIds.slice(0, indexOfEditingGroup);\n }\n }\n if (groupIds.length > 0) {\n const groupId = groupIds[groupIds.length - 1];\n nextAppState = selectGroup(groupId, nextAppState, elements);\n }\n }\n\n return nextAppState;\n};\n\nexport const editGroupForSelectedElement = (\n appState: AppState,\n element: NonDeleted,\n): AppState => {\n return {\n ...appState,\n editingGroupId: element.groupIds.length ? element.groupIds[0] : null,\n selectedGroupIds: {},\n selectedElementIds: {\n [element.id]: true,\n },\n };\n};\n\nexport const isElementInGroup = (element: ExcalidrawElement, groupId: string) =>\n element.groupIds.includes(groupId);\n\nexport const getElementsInGroup = (\n elements: readonly ExcalidrawElement[],\n groupId: string,\n) => elements.filter((element) => isElementInGroup(element, groupId));\n\nexport const getSelectedGroupIdForElement = (\n element: ExcalidrawElement,\n selectedGroupIds: { [groupId: string]: boolean },\n) => element.groupIds.find((groupId) => selectedGroupIds[groupId]);\n\nexport const getNewGroupIdsForDuplication = (\n groupIds: ExcalidrawElement[\"groupIds\"],\n editingGroupId: AppState[\"editingGroupId\"],\n mapper: (groupId: GroupId) => GroupId,\n) => {\n const copy = [...groupIds];\n const positionOfEditingGroupId = editingGroupId\n ? groupIds.indexOf(editingGroupId)\n : -1;\n const endIndex =\n positionOfEditingGroupId > -1 ? positionOfEditingGroupId : groupIds.length;\n for (let index = 0; index < endIndex; index++) {\n copy[index] = mapper(copy[index]);\n }\n\n return copy;\n};\n\nexport const addToGroup = (\n prevGroupIds: ExcalidrawElement[\"groupIds\"],\n newGroupId: GroupId,\n editingGroupId: AppState[\"editingGroupId\"],\n) => {\n // insert before the editingGroupId, or push to the end.\n const groupIds = [...prevGroupIds];\n const positionOfEditingGroupId = editingGroupId\n ? groupIds.indexOf(editingGroupId)\n : -1;\n const positionToInsert =\n positionOfEditingGroupId > -1 ? positionOfEditingGroupId : groupIds.length;\n groupIds.splice(positionToInsert, 0, newGroupId);\n return groupIds;\n};\n\nexport const removeFromSelectedGroups = (\n groupIds: ExcalidrawElement[\"groupIds\"],\n selectedGroupIds: { [groupId: string]: boolean },\n) => groupIds.filter((groupId) => !selectedGroupIds[groupId]);\n\nexport const getMaximumGroups = (\n elements: ExcalidrawElement[],\n): ExcalidrawElement[][] => {\n const groups: Map = new Map<\n String,\n ExcalidrawElement[]\n >();\n\n elements.forEach((element: ExcalidrawElement) => {\n const groupId =\n element.groupIds.length === 0\n ? element.id\n : element.groupIds[element.groupIds.length - 1];\n\n const currentGroupMembers = groups.get(groupId) || [];\n\n // Include bound text if present when grouping\n const boundTextElement = getBoundTextElement(element);\n if (boundTextElement) {\n currentGroupMembers.push(boundTextElement);\n }\n groups.set(groupId, [...currentGroupMembers, element]);\n });\n\n return Array.from(groups.values());\n};\n","import {\n ExcalidrawElement,\n ExcalidrawImageElement,\n ExcalidrawTextElement,\n ExcalidrawLinearElement,\n ExcalidrawGenericElement,\n NonDeleted,\n TextAlign,\n GroupId,\n VerticalAlign,\n Arrowhead,\n ExcalidrawFreeDrawElement,\n FontFamilyValues,\n ExcalidrawRectangleElement,\n} from \"../element/types\";\nimport { getFontString, getUpdatedTimestamp, isTestEnv } from \"../utils\";\nimport { randomInteger, randomId } from \"../random\";\nimport { mutateElement, newElementWith } from \"./mutateElement\";\nimport { getNewGroupIdsForDuplication } from \"../groups\";\nimport { AppState } from \"../types\";\nimport { getElementAbsoluteCoords } from \".\";\nimport { adjustXYWithRotation } from \"../math\";\nimport { getResizedElementAbsoluteCoords } from \"./bounds\";\nimport { getContainerElement, measureText, wrapText } from \"./textElement\";\nimport { BOUND_TEXT_PADDING, VERTICAL_ALIGN } from \"../constants\";\n\ntype ElementConstructorOpts = MarkOptional<\n Omit,\n | \"width\"\n | \"height\"\n | \"angle\"\n | \"groupIds\"\n | \"boundElements\"\n | \"seed\"\n | \"version\"\n | \"versionNonce\"\n | \"link\"\n>;\n\nconst _newElementBase = (\n type: T[\"type\"],\n {\n x,\n y,\n strokeColor,\n backgroundColor,\n fillStyle,\n strokeWidth,\n strokeStyle,\n roughness,\n opacity,\n width = 0,\n height = 0,\n angle = 0,\n groupIds = [],\n strokeSharpness,\n boundElements = null,\n link = null,\n ...rest\n }: ElementConstructorOpts & Omit, \"type\">,\n) => {\n const element = {\n id: rest.id || randomId(),\n type,\n x,\n y,\n width,\n height,\n angle,\n strokeColor,\n backgroundColor,\n fillStyle,\n strokeWidth,\n strokeStyle,\n roughness,\n opacity,\n groupIds,\n strokeSharpness,\n seed: rest.seed ?? randomInteger(),\n version: rest.version || 1,\n versionNonce: rest.versionNonce ?? 0,\n isDeleted: false as false,\n boundElements,\n updated: getUpdatedTimestamp(),\n link,\n };\n return element;\n};\n\nexport const newElement = (\n opts: {\n type: ExcalidrawGenericElement[\"type\"];\n } & ElementConstructorOpts,\n): NonDeleted =>\n _newElementBase(opts.type, opts);\n\n/** computes element x/y offset based on textAlign/verticalAlign */\nconst getTextElementPositionOffsets = (\n opts: {\n textAlign: ExcalidrawTextElement[\"textAlign\"];\n verticalAlign: ExcalidrawTextElement[\"verticalAlign\"];\n },\n metrics: {\n width: number;\n height: number;\n },\n) => {\n return {\n x:\n opts.textAlign === \"center\"\n ? metrics.width / 2\n : opts.textAlign === \"right\"\n ? metrics.width\n : 0,\n y: opts.verticalAlign === \"middle\" ? metrics.height / 2 : 0,\n };\n};\n\nexport const newTextElement = (\n opts: {\n text: string;\n fontSize: number;\n fontFamily: FontFamilyValues;\n textAlign: TextAlign;\n verticalAlign: VerticalAlign;\n containerId?: ExcalidrawRectangleElement[\"id\"];\n } & ElementConstructorOpts,\n): NonDeleted => {\n const metrics = measureText(opts.text, getFontString(opts));\n const offsets = getTextElementPositionOffsets(opts, metrics);\n const textElement = newElementWith(\n {\n ..._newElementBase(\"text\", opts),\n text: opts.text,\n fontSize: opts.fontSize,\n fontFamily: opts.fontFamily,\n textAlign: opts.textAlign,\n verticalAlign: opts.verticalAlign,\n x: opts.x - offsets.x,\n y: opts.y - offsets.y,\n width: metrics.width,\n height: metrics.height,\n baseline: metrics.baseline,\n containerId: opts.containerId || null,\n originalText: opts.text,\n },\n {},\n );\n return textElement;\n};\n\nconst getAdjustedDimensions = (\n element: ExcalidrawTextElement,\n nextText: string,\n): {\n x: number;\n y: number;\n width: number;\n height: number;\n baseline: number;\n} => {\n let maxWidth = null;\n const container = getContainerElement(element);\n if (container) {\n maxWidth = container.width - BOUND_TEXT_PADDING * 2;\n }\n const {\n width: nextWidth,\n height: nextHeight,\n baseline: nextBaseline,\n } = measureText(nextText, getFontString(element), maxWidth);\n const { textAlign, verticalAlign } = element;\n let x: number;\n let y: number;\n if (\n textAlign === \"center\" &&\n verticalAlign === VERTICAL_ALIGN.MIDDLE &&\n !element.containerId\n ) {\n const prevMetrics = measureText(\n element.text,\n getFontString(element),\n maxWidth,\n );\n const offsets = getTextElementPositionOffsets(element, {\n width: nextWidth - prevMetrics.width,\n height: nextHeight - prevMetrics.height,\n });\n\n x = element.x - offsets.x;\n y = element.y - offsets.y;\n } else {\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n\n const [nextX1, nextY1, nextX2, nextY2] = getResizedElementAbsoluteCoords(\n element,\n nextWidth,\n nextHeight,\n );\n const deltaX1 = (x1 - nextX1) / 2;\n const deltaY1 = (y1 - nextY1) / 2;\n const deltaX2 = (x2 - nextX2) / 2;\n const deltaY2 = (y2 - nextY2) / 2;\n\n [x, y] = adjustXYWithRotation(\n {\n s: true,\n e: textAlign === \"center\" || textAlign === \"left\",\n w: textAlign === \"center\" || textAlign === \"right\",\n },\n element.x,\n element.y,\n element.angle,\n deltaX1,\n deltaY1,\n deltaX2,\n deltaY2,\n );\n }\n\n // make sure container dimensions are set properly when\n // text editor overflows beyond viewport dimensions\n if (container) {\n let height = container.height;\n let width = container.width;\n if (nextHeight > height - BOUND_TEXT_PADDING * 2) {\n height = nextHeight + BOUND_TEXT_PADDING * 2;\n }\n if (nextWidth > width - BOUND_TEXT_PADDING * 2) {\n width = nextWidth + BOUND_TEXT_PADDING * 2;\n }\n if (height !== container.height || width !== container.width) {\n mutateElement(container, { height, width });\n }\n }\n return {\n width: nextWidth,\n height: nextHeight,\n x: Number.isFinite(x) ? x : element.x,\n y: Number.isFinite(y) ? y : element.y,\n baseline: nextBaseline,\n };\n};\n\nexport const updateTextElement = (\n element: ExcalidrawTextElement,\n {\n text,\n isDeleted,\n originalText,\n }: {\n text: string;\n isDeleted?: boolean;\n originalText: string;\n },\n): ExcalidrawTextElement => {\n const container = getContainerElement(element);\n if (container) {\n text = wrapText(text, getFontString(element), container.width);\n }\n const dimensions = getAdjustedDimensions(element, text);\n return newElementWith(element, {\n text,\n originalText,\n isDeleted: isDeleted ?? element.isDeleted,\n ...dimensions,\n });\n};\n\nexport const newFreeDrawElement = (\n opts: {\n type: \"freedraw\";\n points?: ExcalidrawFreeDrawElement[\"points\"];\n simulatePressure: boolean;\n } & ElementConstructorOpts,\n): NonDeleted => {\n return {\n ..._newElementBase(opts.type, opts),\n points: opts.points || [],\n pressures: [],\n simulatePressure: opts.simulatePressure,\n lastCommittedPoint: null,\n };\n};\n\nexport const newLinearElement = (\n opts: {\n type: ExcalidrawLinearElement[\"type\"];\n startArrowhead: Arrowhead | null;\n endArrowhead: Arrowhead | null;\n points?: ExcalidrawLinearElement[\"points\"];\n } & ElementConstructorOpts,\n): NonDeleted => {\n return {\n ..._newElementBase(opts.type, opts),\n points: opts.points || [],\n lastCommittedPoint: null,\n startBinding: null,\n endBinding: null,\n startArrowhead: opts.startArrowhead,\n endArrowhead: opts.endArrowhead,\n };\n};\n\nexport const newImageElement = (\n opts: {\n type: ExcalidrawImageElement[\"type\"];\n } & ElementConstructorOpts,\n): NonDeleted => {\n return {\n ..._newElementBase(\"image\", opts),\n // in the future we'll support changing stroke color for some SVG elements,\n // and `transparent` will likely mean \"use original colors of the image\"\n strokeColor: \"transparent\",\n status: \"pending\",\n fileId: null,\n scale: [1, 1],\n };\n};\n\n// Simplified deep clone for the purpose of cloning ExcalidrawElement only\n// (doesn't clone Date, RegExp, Map, Set, Typed arrays etc.)\n//\n// Adapted from https://github.com/lukeed/klona\nexport const deepCopyElement = (val: any, depth: number = 0) => {\n if (val == null || typeof val !== \"object\") {\n return val;\n }\n\n if (Object.prototype.toString.call(val) === \"[object Object]\") {\n const tmp =\n typeof val.constructor === \"function\"\n ? Object.create(Object.getPrototypeOf(val))\n : {};\n for (const key in val) {\n if (val.hasOwnProperty(key)) {\n // don't copy top-level shape property, which we want to regenerate\n if (depth === 0 && (key === \"shape\" || key === \"canvas\")) {\n continue;\n }\n tmp[key] = deepCopyElement(val[key], depth + 1);\n }\n }\n return tmp;\n }\n\n if (Array.isArray(val)) {\n let k = val.length;\n const arr = new Array(k);\n while (k--) {\n arr[k] = deepCopyElement(val[k], depth + 1);\n }\n return arr;\n }\n\n return val;\n};\n\n/**\n * Duplicate an element, often used in the alt-drag operation.\n * Note that this method has gotten a bit complicated since the\n * introduction of gruoping/ungrouping elements.\n * @param editingGroupId The current group being edited. The new\n * element will inherit this group and its\n * parents.\n * @param groupIdMapForOperation A Map that maps old group IDs to\n * duplicated ones. If you are duplicating\n * multiple elements at once, share this map\n * amongst all of them\n * @param element Element to duplicate\n * @param overrides Any element properties to override\n */\nexport const duplicateElement = >(\n editingGroupId: AppState[\"editingGroupId\"],\n groupIdMapForOperation: Map,\n element: TElement,\n overrides?: Partial,\n): TElement => {\n let copy: TElement = deepCopyElement(element);\n if (isTestEnv()) {\n copy.id = `${copy.id}_copy`;\n // `window.h` may not be defined in some unit tests\n if (\n window.h?.app\n ?.getSceneElementsIncludingDeleted()\n .find((el) => el.id === copy.id)\n ) {\n copy.id += \"_copy\";\n }\n } else {\n copy.id = randomId();\n }\n copy.updated = getUpdatedTimestamp();\n copy.seed = randomInteger();\n copy.groupIds = getNewGroupIdsForDuplication(\n copy.groupIds,\n editingGroupId,\n (groupId) => {\n if (!groupIdMapForOperation.has(groupId)) {\n groupIdMapForOperation.set(groupId, randomId());\n }\n return groupIdMapForOperation.get(groupId)!;\n },\n );\n if (overrides) {\n copy = Object.assign(copy, overrides);\n }\n return copy;\n};\n","import { ExcalidrawElement, PointerType } from \"./types\";\n\nimport { getElementAbsoluteCoords, Bounds } from \"./bounds\";\nimport { rotate } from \"../math\";\nimport { Zoom } from \"../types\";\nimport { isTextElement } from \".\";\n\nexport type TransformHandleDirection =\n | \"n\"\n | \"s\"\n | \"w\"\n | \"e\"\n | \"nw\"\n | \"ne\"\n | \"sw\"\n | \"se\";\n\nexport type TransformHandleType = TransformHandleDirection | \"rotation\";\n\nexport type TransformHandle = [number, number, number, number];\nexport type TransformHandles = Partial<{\n [T in TransformHandleType]: TransformHandle;\n}>;\nexport type MaybeTransformHandleType = TransformHandleType | false;\n\nconst transformHandleSizes: { [k in PointerType]: number } = {\n mouse: 8,\n pen: 16,\n touch: 28,\n};\n\nconst ROTATION_RESIZE_HANDLE_GAP = 16;\n\nexport const OMIT_SIDES_FOR_MULTIPLE_ELEMENTS = {\n e: true,\n s: true,\n n: true,\n w: true,\n};\n\nconst OMIT_SIDES_FOR_TEXT_ELEMENT = {\n e: true,\n s: true,\n n: true,\n w: true,\n};\n\nconst OMIT_SIDES_FOR_LINE_SLASH = {\n e: true,\n s: true,\n n: true,\n w: true,\n nw: true,\n se: true,\n};\n\nconst OMIT_SIDES_FOR_LINE_BACKSLASH = {\n e: true,\n s: true,\n n: true,\n w: true,\n ne: true,\n sw: true,\n};\n\nconst generateTransformHandle = (\n x: number,\n y: number,\n width: number,\n height: number,\n cx: number,\n cy: number,\n angle: number,\n): TransformHandle => {\n const [xx, yy] = rotate(x + width / 2, y + height / 2, cx, cy, angle);\n return [xx - width / 2, yy - height / 2, width, height];\n};\n\nexport const getTransformHandlesFromCoords = (\n [x1, y1, x2, y2]: Bounds,\n angle: number,\n zoom: Zoom,\n pointerType: PointerType,\n omitSides: { [T in TransformHandleType]?: boolean } = {},\n): TransformHandles => {\n const size = transformHandleSizes[pointerType];\n const handleWidth = size / zoom.value;\n const handleHeight = size / zoom.value;\n\n const handleMarginX = size / zoom.value;\n const handleMarginY = size / zoom.value;\n\n const width = x2 - x1;\n const height = y2 - y1;\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n\n const dashedLineMargin = 4 / zoom.value;\n\n const centeringOffset = (size - 8) / (2 * zoom.value);\n\n const transformHandles: TransformHandles = {\n nw: omitSides.nw\n ? undefined\n : generateTransformHandle(\n x1 - dashedLineMargin - handleMarginX + centeringOffset,\n y1 - dashedLineMargin - handleMarginY + centeringOffset,\n handleWidth,\n handleHeight,\n cx,\n cy,\n angle,\n ),\n ne: omitSides.ne\n ? undefined\n : generateTransformHandle(\n x2 + dashedLineMargin - centeringOffset,\n y1 - dashedLineMargin - handleMarginY + centeringOffset,\n handleWidth,\n handleHeight,\n cx,\n cy,\n angle,\n ),\n sw: omitSides.sw\n ? undefined\n : generateTransformHandle(\n x1 - dashedLineMargin - handleMarginX + centeringOffset,\n y2 + dashedLineMargin - centeringOffset,\n handleWidth,\n handleHeight,\n cx,\n cy,\n angle,\n ),\n se: omitSides.se\n ? undefined\n : generateTransformHandle(\n x2 + dashedLineMargin - centeringOffset,\n y2 + dashedLineMargin - centeringOffset,\n handleWidth,\n handleHeight,\n cx,\n cy,\n angle,\n ),\n rotation: omitSides.rotation\n ? undefined\n : generateTransformHandle(\n x1 + width / 2 - handleWidth / 2,\n y1 -\n dashedLineMargin -\n handleMarginY +\n centeringOffset -\n ROTATION_RESIZE_HANDLE_GAP / zoom.value,\n handleWidth,\n handleHeight,\n cx,\n cy,\n angle,\n ),\n };\n\n // We only want to show height handles (all cardinal directions) above a certain size\n // Note: we render using \"mouse\" size so we should also use \"mouse\" size for this check\n const minimumSizeForEightHandles =\n (5 * transformHandleSizes.mouse) / zoom.value;\n if (Math.abs(width) > minimumSizeForEightHandles) {\n if (!omitSides.n) {\n transformHandles.n = generateTransformHandle(\n x1 + width / 2 - handleWidth / 2,\n y1 - dashedLineMargin - handleMarginY + centeringOffset,\n handleWidth,\n handleHeight,\n cx,\n cy,\n angle,\n );\n }\n if (!omitSides.s) {\n transformHandles.s = generateTransformHandle(\n x1 + width / 2 - handleWidth / 2,\n y2 + dashedLineMargin - centeringOffset,\n handleWidth,\n handleHeight,\n cx,\n cy,\n angle,\n );\n }\n }\n if (Math.abs(height) > minimumSizeForEightHandles) {\n if (!omitSides.w) {\n transformHandles.w = generateTransformHandle(\n x1 - dashedLineMargin - handleMarginX + centeringOffset,\n y1 + height / 2 - handleHeight / 2,\n handleWidth,\n handleHeight,\n cx,\n cy,\n angle,\n );\n }\n if (!omitSides.e) {\n transformHandles.e = generateTransformHandle(\n x2 + dashedLineMargin - centeringOffset,\n y1 + height / 2 - handleHeight / 2,\n handleWidth,\n handleHeight,\n cx,\n cy,\n angle,\n );\n }\n }\n\n return transformHandles;\n};\n\nexport const getTransformHandles = (\n element: ExcalidrawElement,\n zoom: Zoom,\n pointerType: PointerType = \"mouse\",\n): TransformHandles => {\n let omitSides: { [T in TransformHandleType]?: boolean } = {};\n if (\n element.type === \"arrow\" ||\n element.type === \"line\" ||\n element.type === \"freedraw\"\n ) {\n if (element.points.length === 2) {\n // only check the last point because starting point is always (0,0)\n const [, p1] = element.points;\n if (p1[0] === 0 || p1[1] === 0) {\n omitSides = OMIT_SIDES_FOR_LINE_BACKSLASH;\n } else if (p1[0] > 0 && p1[1] < 0) {\n omitSides = OMIT_SIDES_FOR_LINE_SLASH;\n } else if (p1[0] > 0 && p1[1] > 0) {\n omitSides = OMIT_SIDES_FOR_LINE_BACKSLASH;\n } else if (p1[0] < 0 && p1[1] > 0) {\n omitSides = OMIT_SIDES_FOR_LINE_SLASH;\n } else if (p1[0] < 0 && p1[1] < 0) {\n omitSides = OMIT_SIDES_FOR_LINE_BACKSLASH;\n }\n }\n } else if (isTextElement(element)) {\n omitSides = OMIT_SIDES_FOR_TEXT_ELEMENT;\n }\n\n return getTransformHandlesFromCoords(\n getElementAbsoluteCoords(element),\n element.angle,\n zoom,\n pointerType,\n omitSides,\n );\n};\n","/**\n * This is a 2D Projective Geometric Algebra implementation.\n *\n * For wider context on geometric algebra visit see https://bivector.net.\n *\n * For this specific algebra see cheatsheet https://bivector.net/2DPGA.pdf.\n *\n * Converted from generator written by enki, with a ton of added on top.\n *\n * This library uses 8-vectors to represent points, directions and lines\n * in 2D space.\n *\n * An array `[a, b, c, d, e, f, g, h]` represents a n(8)vector:\n * a + b*e0 + c*e1 + d*e2 + e*e01 + f*e20 + g*e12 + h*e012\n *\n * See GAPoint, GALine, GADirection and GATransform modules for common\n * operations.\n */\n\nexport type Point = NVector;\nexport type Direction = NVector;\nexport type Line = NVector;\nexport type Transform = NVector;\n\nexport const point = (x: number, y: number): Point => [0, 0, 0, 0, y, x, 1, 0];\n\nexport const origin = (): Point => [0, 0, 0, 0, 0, 0, 1, 0];\n\nexport const direction = (x: number, y: number): Direction => {\n const norm = Math.hypot(x, y); // same as `inorm(direction(x, y))`\n return [0, 0, 0, 0, y / norm, x / norm, 0, 0];\n};\n\nexport const offset = (x: number, y: number): Direction => [\n 0,\n 0,\n 0,\n 0,\n y,\n x,\n 0,\n 0,\n];\n\n/// This is the \"implementation\" part of the library\n\ntype NVector = readonly [\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n];\n\n// These are labels for what each number in an nvector represents\nconst NVECTOR_BASE = [\"1\", \"e0\", \"e1\", \"e2\", \"e01\", \"e20\", \"e12\", \"e012\"];\n\n// Used to represent points, lines and transformations\nexport const nvector = (value: number = 0, index: number = 0): NVector => {\n const result = [0, 0, 0, 0, 0, 0, 0, 0];\n if (index < 0 || index > 7) {\n throw new Error(`Expected \\`index\\` between 0 and 7, got \\`${index}\\``);\n }\n if (value !== 0) {\n result[index] = value;\n }\n return result as unknown as NVector;\n};\n\nconst STRING_EPSILON = 0.000001;\nexport const toString = (nvector: NVector): string => {\n const result = nvector\n .map((value, index) =>\n Math.abs(value) > STRING_EPSILON\n ? value.toFixed(7).replace(/(\\.|0+)$/, \"\") +\n (index > 0 ? NVECTOR_BASE[index] : \"\")\n : null,\n )\n .filter((representation) => representation != null)\n .join(\" + \");\n return result === \"\" ? \"0\" : result;\n};\n\n// Reverse the order of the basis blades.\nexport const reverse = (nvector: NVector): NVector => [\n nvector[0],\n nvector[1],\n nvector[2],\n nvector[3],\n -nvector[4],\n -nvector[5],\n -nvector[6],\n -nvector[7],\n];\n\n// Poincare duality operator.\nexport const dual = (nvector: NVector): NVector => [\n nvector[7],\n nvector[6],\n nvector[5],\n nvector[4],\n nvector[3],\n nvector[2],\n nvector[1],\n nvector[0],\n];\n\n// Clifford Conjugation\nexport const conjugate = (nvector: NVector): NVector => [\n nvector[0],\n -nvector[1],\n -nvector[2],\n -nvector[3],\n -nvector[4],\n -nvector[5],\n -nvector[6],\n nvector[7],\n];\n\n// Main involution\nexport const involute = (nvector: NVector): NVector => [\n nvector[0],\n -nvector[1],\n -nvector[2],\n -nvector[3],\n nvector[4],\n nvector[5],\n nvector[6],\n -nvector[7],\n];\n\n// Multivector addition\nexport const add = (a: NVector, b: NVector | number): NVector => {\n if (isNumber(b)) {\n return [a[0] + b, a[1], a[2], a[3], a[4], a[5], a[6], a[7]];\n }\n return [\n a[0] + b[0],\n a[1] + b[1],\n a[2] + b[2],\n a[3] + b[3],\n a[4] + b[4],\n a[5] + b[5],\n a[6] + b[6],\n a[7] + b[7],\n ];\n};\n\n// Multivector subtraction\nexport const sub = (a: NVector, b: NVector | number): NVector => {\n if (isNumber(b)) {\n return [a[0] - b, a[1], a[2], a[3], a[4], a[5], a[6], a[7]];\n }\n return [\n a[0] - b[0],\n a[1] - b[1],\n a[2] - b[2],\n a[3] - b[3],\n a[4] - b[4],\n a[5] - b[5],\n a[6] - b[6],\n a[7] - b[7],\n ];\n};\n\n// The geometric product.\nexport const mul = (a: NVector, b: NVector | number): NVector => {\n if (isNumber(b)) {\n return [\n a[0] * b,\n a[1] * b,\n a[2] * b,\n a[3] * b,\n a[4] * b,\n a[5] * b,\n a[6] * b,\n a[7] * b,\n ];\n }\n return [\n mulScalar(a, b),\n b[1] * a[0] +\n b[0] * a[1] -\n b[4] * a[2] +\n b[5] * a[3] +\n b[2] * a[4] -\n b[3] * a[5] -\n b[7] * a[6] -\n b[6] * a[7],\n b[2] * a[0] + b[0] * a[2] - b[6] * a[3] + b[3] * a[6],\n b[3] * a[0] + b[6] * a[2] + b[0] * a[3] - b[2] * a[6],\n b[4] * a[0] +\n b[2] * a[1] -\n b[1] * a[2] +\n b[7] * a[3] +\n b[0] * a[4] +\n b[6] * a[5] -\n b[5] * a[6] +\n b[3] * a[7],\n b[5] * a[0] -\n b[3] * a[1] +\n b[7] * a[2] +\n b[1] * a[3] -\n b[6] * a[4] +\n b[0] * a[5] +\n b[4] * a[6] +\n b[2] * a[7],\n b[6] * a[0] + b[3] * a[2] - b[2] * a[3] + b[0] * a[6],\n b[7] * a[0] +\n b[6] * a[1] +\n b[5] * a[2] +\n b[4] * a[3] +\n b[3] * a[4] +\n b[2] * a[5] +\n b[1] * a[6] +\n b[0] * a[7],\n ];\n};\n\nexport const mulScalar = (a: NVector, b: NVector): number =>\n b[0] * a[0] + b[2] * a[2] + b[3] * a[3] - b[6] * a[6];\n\n// The outer/exterior/wedge product.\nexport const meet = (a: NVector, b: NVector): NVector => [\n b[0] * a[0],\n b[1] * a[0] + b[0] * a[1],\n b[2] * a[0] + b[0] * a[2],\n b[3] * a[0] + b[0] * a[3],\n b[4] * a[0] + b[2] * a[1] - b[1] * a[2] + b[0] * a[4],\n b[5] * a[0] - b[3] * a[1] + b[1] * a[3] + b[0] * a[5],\n b[6] * a[0] + b[3] * a[2] - b[2] * a[3] + b[0] * a[6],\n b[7] * a[0] +\n b[6] * a[1] +\n b[5] * a[2] +\n b[4] * a[3] +\n b[3] * a[4] +\n b[2] * a[5] +\n b[1] * a[6],\n];\n\n// The regressive product.\nexport const join = (a: NVector, b: NVector): NVector => [\n joinScalar(a, b),\n a[1] * b[7] + a[4] * b[5] - a[5] * b[4] + a[7] * b[1],\n a[2] * b[7] - a[4] * b[6] + a[6] * b[4] + a[7] * b[2],\n a[3] * b[7] + a[5] * b[6] - a[6] * b[5] + a[7] * b[3],\n a[4] * b[7] + a[7] * b[4],\n a[5] * b[7] + a[7] * b[5],\n a[6] * b[7] + a[7] * b[6],\n a[7] * b[7],\n];\n\nexport const joinScalar = (a: NVector, b: NVector): number =>\n a[0] * b[7] +\n a[1] * b[6] +\n a[2] * b[5] +\n a[3] * b[4] +\n a[4] * b[3] +\n a[5] * b[2] +\n a[6] * b[1] +\n a[7] * b[0];\n\n// The inner product.\nexport const dot = (a: NVector, b: NVector): NVector => [\n b[0] * a[0] + b[2] * a[2] + b[3] * a[3] - b[6] * a[6],\n b[1] * a[0] +\n b[0] * a[1] -\n b[4] * a[2] +\n b[5] * a[3] +\n b[2] * a[4] -\n b[3] * a[5] -\n b[7] * a[6] -\n b[6] * a[7],\n b[2] * a[0] + b[0] * a[2] - b[6] * a[3] + b[3] * a[6],\n b[3] * a[0] + b[6] * a[2] + b[0] * a[3] - b[2] * a[6],\n b[4] * a[0] + b[7] * a[3] + b[0] * a[4] + b[3] * a[7],\n b[5] * a[0] + b[7] * a[2] + b[0] * a[5] + b[2] * a[7],\n b[6] * a[0] + b[0] * a[6],\n b[7] * a[0] + b[0] * a[7],\n];\n\nexport const norm = (a: NVector): number =>\n Math.sqrt(Math.abs(a[0] * a[0] - a[2] * a[2] - a[3] * a[3] + a[6] * a[6]));\n\nexport const inorm = (a: NVector): number =>\n Math.sqrt(Math.abs(a[7] * a[7] - a[5] * a[5] - a[4] * a[4] + a[1] * a[1]));\n\nexport const normalized = (a: NVector): NVector => {\n const n = norm(a);\n if (n === 0 || n === 1) {\n return a;\n }\n const sign = a[6] < 0 ? -1 : 1;\n return mul(a, sign / n);\n};\n\nexport const inormalized = (a: NVector): NVector => {\n const n = inorm(a);\n if (n === 0 || n === 1) {\n return a;\n }\n return mul(a, 1 / n);\n};\n\nconst isNumber = (a: any): a is number => typeof a === \"number\";\n\nexport const E0: NVector = nvector(1, 1);\nexport const E1: NVector = nvector(1, 2);\nexport const E2: NVector = nvector(1, 3);\nexport const E01: NVector = nvector(1, 4);\nexport const E20: NVector = nvector(1, 5);\nexport const E12: NVector = nvector(1, 6);\nexport const E012: NVector = nvector(1, 7);\nexport const I = E012;\n","import * as GA from \"./ga\";\nimport { Line, Point } from \"./ga\";\n\n/**\n * A line is stored as an array `[0, c, a, b, 0, 0, 0, 0]` representing:\n * c * e0 + a * e1 + b*e2\n *\n * This maps to a standard formula `a * x + b * y + c`.\n *\n * `(-b, a)` corresponds to a 2D vector parallel to the line. The lines\n * have a natural orientation, corresponding to that vector.\n *\n * The magnitude (\"norm\") of the line is `sqrt(a ^ 2 + b ^ 2)`.\n * `c / norm(line)` is the oriented distance from line to origin.\n */\n\n// Returns line with direction (x, y) through origin\nexport const vector = (x: number, y: number): Line =>\n GA.normalized([0, 0, -y, x, 0, 0, 0, 0]);\n\n// For equation ax + by + c = 0.\nexport const equation = (a: number, b: number, c: number): Line =>\n GA.normalized([0, c, a, b, 0, 0, 0, 0]);\n\nexport const through = (from: Point, to: Point): Line =>\n GA.normalized(GA.join(to, from));\n\nexport const orthogonal = (line: Line, point: Point): Line =>\n GA.dot(line, point);\n\n// Returns a line perpendicular to the line through `against` and `intersection`\n// going through `intersection`.\nexport const orthogonalThrough = (against: Point, intersection: Point): Line =>\n orthogonal(through(against, intersection), intersection);\n\nexport const parallel = (line: Line, distance: number): Line => {\n const result = line.slice();\n result[1] -= distance;\n return result as unknown as Line;\n};\n\nexport const parallelThrough = (line: Line, point: Point): Line =>\n orthogonal(orthogonal(point, line), point);\n\nexport const distance = (line1: Line, line2: Line): number =>\n GA.inorm(GA.meet(line1, line2));\n\nexport const angle = (line1: Line, line2: Line): number =>\n Math.acos(GA.dot(line1, line2)[0]);\n\n// The orientation of the line\nexport const sign = (line: Line): number => Math.sign(line[1]);\n","import * as GA from \"./ga\";\nimport * as GALine from \"./galines\";\nimport { Point, Line, join } from \"./ga\";\n\nexport const from = ([x, y]: readonly [number, number]): Point => [\n 0,\n 0,\n 0,\n 0,\n y,\n x,\n 1,\n 0,\n];\n\nexport const toTuple = (point: Point): [number, number] => [point[5], point[4]];\n\nexport const abs = (point: Point): Point => [\n 0,\n 0,\n 0,\n 0,\n Math.abs(point[4]),\n Math.abs(point[5]),\n 1,\n 0,\n];\n\nexport const intersect = (line1: Line, line2: Line): Point =>\n GA.normalized(GA.meet(line1, line2));\n\n// Projects `point` onto the `line`.\n// The returned point is the closest point on the `line` to the `point`.\nexport const project = (point: Point, line: Line): Point =>\n intersect(GALine.orthogonal(line, point), line);\n\nexport const distance = (point1: Point, point2: Point): number =>\n GA.norm(join(point1, point2));\n\nexport const distanceToLine = (point: Point, line: Line): number =>\n GA.joinScalar(point, line);\n","import * as GA from \"./ga\";\nimport { Line, Direction, Point } from \"./ga\";\n\n/**\n * A direction is stored as an array `[0, 0, 0, 0, y, x, 0, 0]` representing\n * vector `(x, y)`.\n */\n\nexport const from = (point: Point): Point => [\n 0,\n 0,\n 0,\n 0,\n point[4],\n point[5],\n 0,\n 0,\n];\n\nexport const fromTo = (from: Point, to: Point): Direction =>\n GA.inormalized([0, 0, 0, 0, to[4] - from[4], to[5] - from[5], 0, 0]);\n\nexport const orthogonal = (direction: Direction): Direction =>\n GA.inormalized([0, 0, 0, 0, -direction[5], direction[4], 0, 0]);\n\nexport const orthogonalToLine = (line: Line): Direction => GA.mul(line, GA.I);\n","import * as GA from \"./ga\";\nimport { Line, Direction, Point, Transform } from \"./ga\";\nimport * as GADirection from \"./gadirections\";\n\n/**\n * TODO: docs\n */\n\nexport const rotation = (pivot: Point, angle: number): Transform =>\n GA.add(GA.mul(pivot, Math.sin(angle / 2)), Math.cos(angle / 2));\n\nexport const translation = (direction: Direction): Transform => [\n 1,\n 0,\n 0,\n 0,\n -(0.5 * direction[5]),\n 0.5 * direction[4],\n 0,\n 0,\n];\n\nexport const translationOrthogonal = (\n direction: Direction,\n distance: number,\n): Transform => {\n const scale = 0.5 * distance;\n return [1, 0, 0, 0, scale * direction[4], scale * direction[5], 0, 0];\n};\n\nexport const translationAlong = (line: Line, distance: number): Transform =>\n GA.add(GA.mul(GADirection.orthogonalToLine(line), 0.5 * distance), 1);\n\nexport const compose = (motor1: Transform, motor2: Transform): Transform =>\n GA.mul(motor2, motor1);\n\nexport const apply = (\n motor: Transform,\n nvector: Point | Direction | Line,\n): Point | Direction | Line =>\n GA.normalized(GA.mul(GA.mul(motor, nvector), GA.reverse(motor)));\n","import * as GA from \"../ga\";\nimport * as GAPoint from \"../gapoints\";\nimport * as GADirection from \"../gadirections\";\nimport * as GALine from \"../galines\";\nimport * as GATransform from \"../gatransforms\";\n\nimport {\n distance2d,\n rotatePoint,\n isPathALoop,\n isPointInPolygon,\n rotate,\n} from \"../math\";\nimport { pointsOnBezierCurves } from \"points-on-curve\";\n\nimport {\n NonDeletedExcalidrawElement,\n ExcalidrawBindableElement,\n ExcalidrawElement,\n ExcalidrawRectangleElement,\n ExcalidrawDiamondElement,\n ExcalidrawTextElement,\n ExcalidrawEllipseElement,\n NonDeleted,\n ExcalidrawFreeDrawElement,\n ExcalidrawImageElement,\n ExcalidrawLinearElement,\n} from \"./types\";\n\nimport { getElementAbsoluteCoords, getCurvePathOps, Bounds } from \"./bounds\";\nimport { Point } from \"../types\";\nimport { Drawable } from \"roughjs/bin/core\";\nimport { AppState } from \"../types\";\nimport { getShapeForElement } from \"../renderer/renderElement\";\nimport { hasBoundTextElement, isImageElement } from \"./typeChecks\";\nimport { isTextElement } from \".\";\nimport { isTransparent } from \"../utils\";\n\nconst isElementDraggableFromInside = (\n element: NonDeletedExcalidrawElement,\n): boolean => {\n if (element.type === \"arrow\") {\n return false;\n }\n\n if (element.type === \"freedraw\") {\n return true;\n }\n const isDraggableFromInside =\n !isTransparent(element.backgroundColor) || hasBoundTextElement(element);\n if (element.type === \"line\") {\n return isDraggableFromInside && isPathALoop(element.points);\n }\n return isDraggableFromInside || isImageElement(element);\n};\n\nexport const hitTest = (\n element: NonDeletedExcalidrawElement,\n appState: AppState,\n x: number,\n y: number,\n): boolean => {\n // How many pixels off the shape boundary we still consider a hit\n const threshold = 10 / appState.zoom.value;\n const point: Point = [x, y];\n\n if (isElementSelected(appState, element)) {\n return isPointHittingElementBoundingBox(element, point, threshold);\n }\n\n return isHittingElementNotConsideringBoundingBox(element, appState, point);\n};\n\nexport const isHittingElementBoundingBoxWithoutHittingElement = (\n element: NonDeletedExcalidrawElement,\n appState: AppState,\n x: number,\n y: number,\n): boolean => {\n const threshold = 10 / appState.zoom.value;\n\n return (\n !isHittingElementNotConsideringBoundingBox(element, appState, [x, y]) &&\n isPointHittingElementBoundingBox(element, [x, y], threshold)\n );\n};\n\nexport const isHittingElementNotConsideringBoundingBox = (\n element: NonDeletedExcalidrawElement,\n appState: AppState,\n point: Point,\n): boolean => {\n const threshold = 10 / appState.zoom.value;\n\n const check = isTextElement(element)\n ? isStrictlyInside\n : isElementDraggableFromInside(element)\n ? isInsideCheck\n : isNearCheck;\n return hitTestPointAgainstElement({ element, point, threshold, check });\n};\n\nconst isElementSelected = (\n appState: AppState,\n element: NonDeleted,\n) => appState.selectedElementIds[element.id];\n\nexport const isPointHittingElementBoundingBox = (\n element: NonDeleted,\n [x, y]: Point,\n threshold: number,\n) => {\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n const elementCenterX = (x1 + x2) / 2;\n const elementCenterY = (y1 + y2) / 2;\n // reverse rotate to take element's angle into account.\n const [rotatedX, rotatedY] = rotate(\n x,\n y,\n elementCenterX,\n elementCenterY,\n -element.angle,\n );\n\n return (\n rotatedX > x1 - threshold &&\n rotatedX < x2 + threshold &&\n rotatedY > y1 - threshold &&\n rotatedY < y2 + threshold\n );\n};\n\nexport const bindingBorderTest = (\n element: NonDeleted,\n { x, y }: { x: number; y: number },\n): boolean => {\n const threshold = maxBindingGap(element, element.width, element.height);\n const check = isOutsideCheck;\n const point: Point = [x, y];\n return hitTestPointAgainstElement({ element, point, threshold, check });\n};\n\nexport const maxBindingGap = (\n element: ExcalidrawElement,\n elementWidth: number,\n elementHeight: number,\n): number => {\n // Aligns diamonds with rectangles\n const shapeRatio = element.type === \"diamond\" ? 1 / Math.sqrt(2) : 1;\n const smallerDimension = shapeRatio * Math.min(elementWidth, elementHeight);\n // We make the bindable boundary bigger for bigger elements\n return Math.max(16, Math.min(0.25 * smallerDimension, 32));\n};\n\ntype HitTestArgs = {\n element: NonDeletedExcalidrawElement;\n point: Point;\n threshold: number;\n check: (distance: number, threshold: number) => boolean;\n};\n\nconst hitTestPointAgainstElement = (args: HitTestArgs): boolean => {\n switch (args.element.type) {\n case \"rectangle\":\n case \"image\":\n case \"text\":\n case \"diamond\":\n case \"ellipse\":\n const distance = distanceToBindableElement(args.element, args.point);\n return args.check(distance, args.threshold);\n case \"freedraw\": {\n if (\n !args.check(\n distanceToRectangle(args.element, args.point),\n args.threshold,\n )\n ) {\n return false;\n }\n\n return hitTestFreeDrawElement(args.element, args.point, args.threshold);\n }\n case \"arrow\":\n case \"line\":\n return hitTestLinear(args);\n case \"selection\":\n console.warn(\n \"This should not happen, we need to investigate why it does.\",\n );\n return false;\n }\n};\n\nexport const distanceToBindableElement = (\n element: ExcalidrawBindableElement,\n point: Point,\n): number => {\n switch (element.type) {\n case \"rectangle\":\n case \"image\":\n case \"text\":\n return distanceToRectangle(element, point);\n case \"diamond\":\n return distanceToDiamond(element, point);\n case \"ellipse\":\n return distanceToEllipse(element, point);\n }\n};\n\nconst isStrictlyInside = (distance: number, threshold: number): boolean => {\n return distance < 0;\n};\n\nconst isInsideCheck = (distance: number, threshold: number): boolean => {\n return distance < threshold;\n};\n\nconst isNearCheck = (distance: number, threshold: number): boolean => {\n return Math.abs(distance) < threshold;\n};\n\nconst isOutsideCheck = (distance: number, threshold: number): boolean => {\n return 0 <= distance && distance < threshold;\n};\n\nconst distanceToRectangle = (\n element:\n | ExcalidrawRectangleElement\n | ExcalidrawTextElement\n | ExcalidrawFreeDrawElement\n | ExcalidrawImageElement,\n point: Point,\n): number => {\n const [, pointRel, hwidth, hheight] = pointRelativeToElement(element, point);\n return Math.max(\n GAPoint.distanceToLine(pointRel, GALine.equation(0, 1, -hheight)),\n GAPoint.distanceToLine(pointRel, GALine.equation(1, 0, -hwidth)),\n );\n};\n\nconst distanceToDiamond = (\n element: ExcalidrawDiamondElement,\n point: Point,\n): number => {\n const [, pointRel, hwidth, hheight] = pointRelativeToElement(element, point);\n const side = GALine.equation(hheight, hwidth, -hheight * hwidth);\n return GAPoint.distanceToLine(pointRel, side);\n};\n\nconst distanceToEllipse = (\n element: ExcalidrawEllipseElement,\n point: Point,\n): number => {\n const [pointRel, tangent] = ellipseParamsForTest(element, point);\n return -GALine.sign(tangent) * GAPoint.distanceToLine(pointRel, tangent);\n};\n\nconst ellipseParamsForTest = (\n element: ExcalidrawEllipseElement,\n point: Point,\n): [GA.Point, GA.Line] => {\n const [, pointRel, hwidth, hheight] = pointRelativeToElement(element, point);\n const [px, py] = GAPoint.toTuple(pointRel);\n\n // We're working in positive quadrant, so start with `t = 45deg`, `tx=cos(t)`\n let tx = 0.707;\n let ty = 0.707;\n\n const a = hwidth;\n const b = hheight;\n\n // This is a numerical method to find the params tx, ty at which\n // the ellipse has the closest point to the given point\n [0, 1, 2, 3].forEach((_) => {\n const xx = a * tx;\n const yy = b * ty;\n\n const ex = ((a * a - b * b) * tx ** 3) / a;\n const ey = ((b * b - a * a) * ty ** 3) / b;\n\n const rx = xx - ex;\n const ry = yy - ey;\n\n const qx = px - ex;\n const qy = py - ey;\n\n const r = Math.hypot(ry, rx);\n const q = Math.hypot(qy, qx);\n\n tx = Math.min(1, Math.max(0, ((qx * r) / q + ex) / a));\n ty = Math.min(1, Math.max(0, ((qy * r) / q + ey) / b));\n const t = Math.hypot(ty, tx);\n tx /= t;\n ty /= t;\n });\n\n const closestPoint = GA.point(a * tx, b * ty);\n\n const tangent = GALine.orthogonalThrough(pointRel, closestPoint);\n return [pointRel, tangent];\n};\n\nconst hitTestFreeDrawElement = (\n element: ExcalidrawFreeDrawElement,\n point: Point,\n threshold: number,\n): boolean => {\n // Check point-distance-to-line-segment for every segment in the\n // element's points (its input points, not its outline points).\n // This is... okay? It's plenty fast, but the GA library may\n // have a faster option.\n\n let x: number;\n let y: number;\n\n if (element.angle === 0) {\n x = point[0] - element.x;\n y = point[1] - element.y;\n } else {\n // Counter-rotate the point around center before testing\n const [minX, minY, maxX, maxY] = getElementAbsoluteCoords(element);\n const rotatedPoint = rotatePoint(\n point,\n [minX + (maxX - minX) / 2, minY + (maxY - minY) / 2],\n -element.angle,\n );\n x = rotatedPoint[0] - element.x;\n y = rotatedPoint[1] - element.y;\n }\n\n let [A, B] = element.points;\n let P: readonly [number, number];\n\n // For freedraw dots\n if (\n distance2d(A[0], A[1], x, y) < threshold ||\n distance2d(B[0], B[1], x, y) < threshold\n ) {\n return true;\n }\n\n // For freedraw lines\n for (let i = 0; i < element.points.length; i++) {\n const delta = [B[0] - A[0], B[1] - A[1]];\n const length = Math.hypot(delta[1], delta[0]);\n\n const U = [delta[0] / length, delta[1] / length];\n const C = [x - A[0], y - A[1]];\n const d = (C[0] * U[0] + C[1] * U[1]) / Math.hypot(U[1], U[0]);\n P = [A[0] + U[0] * d, A[1] + U[1] * d];\n\n const da = distance2d(P[0], P[1], A[0], A[1]);\n const db = distance2d(P[0], P[1], B[0], B[1]);\n\n P = db < da && da > length ? B : da < db && db > length ? A : P;\n\n if (Math.hypot(y - P[1], x - P[0]) < threshold) {\n return true;\n }\n\n A = B;\n B = element.points[i + 1];\n }\n\n const shape = getShapeForElement(element);\n\n // for filled freedraw shapes, support\n // selecting from inside\n if (shape && shape.sets.length) {\n return hitTestRoughShape(shape, x, y, threshold);\n }\n\n return false;\n};\n\nconst hitTestLinear = (args: HitTestArgs): boolean => {\n const { element, threshold } = args;\n if (!getShapeForElement(element)) {\n return false;\n }\n const [point, pointAbs, hwidth, hheight] = pointRelativeToElement(\n args.element,\n args.point,\n );\n const side1 = GALine.equation(0, 1, -hheight);\n const side2 = GALine.equation(1, 0, -hwidth);\n if (\n !isInsideCheck(GAPoint.distanceToLine(pointAbs, side1), threshold) ||\n !isInsideCheck(GAPoint.distanceToLine(pointAbs, side2), threshold)\n ) {\n return false;\n }\n const [relX, relY] = GAPoint.toTuple(point);\n\n const shape = getShapeForElement(element as ExcalidrawLinearElement);\n\n if (!shape) {\n return false;\n }\n\n if (args.check === isInsideCheck) {\n const hit = shape.some((subshape) =>\n hitTestCurveInside(subshape, relX, relY, element.strokeSharpness),\n );\n if (hit) {\n return true;\n }\n }\n\n // hit test all \"subshapes\" of the linear element\n return shape.some((subshape) =>\n hitTestRoughShape(subshape, relX, relY, threshold),\n );\n};\n\n// Returns:\n// 1. the point relative to the elements (x, y) position\n// 2. the point relative to the element's center with positive (x, y)\n// 3. half element width\n// 4. half element height\n//\n// Note that for linear elements the (x, y) position is not at the\n// top right corner of their boundary.\n//\n// Rectangles, diamonds and ellipses are symmetrical over axes,\n// and other elements have a rectangular boundary,\n// so we only need to perform hit tests for the positive quadrant.\nconst pointRelativeToElement = (\n element: ExcalidrawElement,\n pointTuple: Point,\n): [GA.Point, GA.Point, number, number] => {\n const point = GAPoint.from(pointTuple);\n const elementCoords = getElementAbsoluteCoords(element);\n const center = coordsCenter(elementCoords);\n // GA has angle orientation opposite to `rotate`\n const rotate = GATransform.rotation(center, element.angle);\n const pointRotated = GATransform.apply(rotate, point);\n const pointRelToCenter = GA.sub(pointRotated, GADirection.from(center));\n const pointRelToCenterAbs = GAPoint.abs(pointRelToCenter);\n const elementPos = GA.offset(element.x, element.y);\n const pointRelToPos = GA.sub(pointRotated, elementPos);\n const [ax, ay, bx, by] = elementCoords;\n const halfWidth = (bx - ax) / 2;\n const halfHeight = (by - ay) / 2;\n return [pointRelToPos, pointRelToCenterAbs, halfWidth, halfHeight];\n};\n\n// Returns point in absolute coordinates\nexport const pointInAbsoluteCoords = (\n element: ExcalidrawElement,\n // Point relative to the element position\n point: Point,\n): Point => {\n const [x, y] = point;\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n const cx = (x2 - x1) / 2;\n const cy = (y2 - y1) / 2;\n const [rotatedX, rotatedY] = rotate(x, y, cx, cy, element.angle);\n return [element.x + rotatedX, element.y + rotatedY];\n};\n\nconst relativizationToElementCenter = (\n element: ExcalidrawElement,\n): GA.Transform => {\n const elementCoords = getElementAbsoluteCoords(element);\n const center = coordsCenter(elementCoords);\n // GA has angle orientation opposite to `rotate`\n const rotate = GATransform.rotation(center, element.angle);\n const translate = GA.reverse(\n GATransform.translation(GADirection.from(center)),\n );\n return GATransform.compose(rotate, translate);\n};\n\nconst coordsCenter = ([ax, ay, bx, by]: Bounds): GA.Point => {\n return GA.point((ax + bx) / 2, (ay + by) / 2);\n};\n\n// The focus distance is the oriented ratio between the size of\n// the `element` and the \"focus image\" of the element on which\n// all focus points lie, so it's a number between -1 and 1.\n// The line going through `a` and `b` is a tangent to the \"focus image\"\n// of the element.\nexport const determineFocusDistance = (\n element: ExcalidrawBindableElement,\n // Point on the line, in absolute coordinates\n a: Point,\n // Another point on the line, in absolute coordinates (closer to element)\n b: Point,\n): number => {\n const relateToCenter = relativizationToElementCenter(element);\n const aRel = GATransform.apply(relateToCenter, GAPoint.from(a));\n const bRel = GATransform.apply(relateToCenter, GAPoint.from(b));\n const line = GALine.through(aRel, bRel);\n const q = element.height / element.width;\n const hwidth = element.width / 2;\n const hheight = element.height / 2;\n const n = line[2];\n const m = line[3];\n const c = line[1];\n const mabs = Math.abs(m);\n const nabs = Math.abs(n);\n switch (element.type) {\n case \"rectangle\":\n case \"image\":\n case \"text\":\n return c / (hwidth * (nabs + q * mabs));\n case \"diamond\":\n return mabs < nabs ? c / (nabs * hwidth) : c / (mabs * hheight);\n case \"ellipse\":\n return c / (hwidth * Math.sqrt(n ** 2 + q ** 2 * m ** 2));\n }\n};\n\nexport const determineFocusPoint = (\n element: ExcalidrawBindableElement,\n // The oriented, relative distance from the center of `element` of the\n // returned focusPoint\n focus: number,\n adjecentPoint: Point,\n): Point => {\n if (focus === 0) {\n const elementCoords = getElementAbsoluteCoords(element);\n const center = coordsCenter(elementCoords);\n return GAPoint.toTuple(center);\n }\n const relateToCenter = relativizationToElementCenter(element);\n const adjecentPointRel = GATransform.apply(\n relateToCenter,\n GAPoint.from(adjecentPoint),\n );\n const reverseRelateToCenter = GA.reverse(relateToCenter);\n let point;\n switch (element.type) {\n case \"rectangle\":\n case \"image\":\n case \"text\":\n case \"diamond\":\n point = findFocusPointForRectangulars(element, focus, adjecentPointRel);\n break;\n case \"ellipse\":\n point = findFocusPointForEllipse(element, focus, adjecentPointRel);\n break;\n }\n return GAPoint.toTuple(GATransform.apply(reverseRelateToCenter, point));\n};\n\n// Returns 2 or 0 intersection points between line going through `a` and `b`\n// and the `element`, in ascending order of distance from `a`.\nexport const intersectElementWithLine = (\n element: ExcalidrawBindableElement,\n // Point on the line, in absolute coordinates\n a: Point,\n // Another point on the line, in absolute coordinates\n b: Point,\n // If given, the element is inflated by this value\n gap: number = 0,\n): Point[] => {\n const relateToCenter = relativizationToElementCenter(element);\n const aRel = GATransform.apply(relateToCenter, GAPoint.from(a));\n const bRel = GATransform.apply(relateToCenter, GAPoint.from(b));\n const line = GALine.through(aRel, bRel);\n const reverseRelateToCenter = GA.reverse(relateToCenter);\n const intersections = getSortedElementLineIntersections(\n element,\n line,\n aRel,\n gap,\n );\n return intersections.map((point) =>\n GAPoint.toTuple(GATransform.apply(reverseRelateToCenter, point)),\n );\n};\n\nconst getSortedElementLineIntersections = (\n element: ExcalidrawBindableElement,\n // Relative to element center\n line: GA.Line,\n // Relative to element center\n nearPoint: GA.Point,\n gap: number = 0,\n): GA.Point[] => {\n let intersections: GA.Point[];\n switch (element.type) {\n case \"rectangle\":\n case \"image\":\n case \"text\":\n case \"diamond\":\n const corners = getCorners(element);\n intersections = corners\n .flatMap((point, i) => {\n const edge: [GA.Point, GA.Point] = [point, corners[(i + 1) % 4]];\n return intersectSegment(line, offsetSegment(edge, gap));\n })\n .concat(\n corners.flatMap((point) => getCircleIntersections(point, gap, line)),\n );\n break;\n case \"ellipse\":\n intersections = getEllipseIntersections(element, gap, line);\n break;\n }\n if (intersections.length < 2) {\n // Ignore the \"edge\" case of only intersecting with a single corner\n return [];\n }\n const sortedIntersections = intersections.sort(\n (i1, i2) =>\n GAPoint.distance(i1, nearPoint) - GAPoint.distance(i2, nearPoint),\n );\n return [\n sortedIntersections[0],\n sortedIntersections[sortedIntersections.length - 1],\n ];\n};\n\nconst getCorners = (\n element:\n | ExcalidrawRectangleElement\n | ExcalidrawImageElement\n | ExcalidrawDiamondElement\n | ExcalidrawTextElement,\n scale: number = 1,\n): GA.Point[] => {\n const hx = (scale * element.width) / 2;\n const hy = (scale * element.height) / 2;\n switch (element.type) {\n case \"rectangle\":\n case \"image\":\n case \"text\":\n return [\n GA.point(hx, hy),\n GA.point(hx, -hy),\n GA.point(-hx, -hy),\n GA.point(-hx, hy),\n ];\n case \"diamond\":\n return [\n GA.point(0, hy),\n GA.point(hx, 0),\n GA.point(0, -hy),\n GA.point(-hx, 0),\n ];\n }\n};\n\n// Returns intersection of `line` with `segment`, with `segment` moved by\n// `gap` in its polar direction.\n// If intersection coincides with second segment point returns empty array.\nconst intersectSegment = (\n line: GA.Line,\n segment: [GA.Point, GA.Point],\n): GA.Point[] => {\n const [a, b] = segment;\n const aDist = GAPoint.distanceToLine(a, line);\n const bDist = GAPoint.distanceToLine(b, line);\n if (aDist * bDist >= 0) {\n // The intersection is outside segment `(a, b)`\n return [];\n }\n return [GAPoint.intersect(line, GALine.through(a, b))];\n};\n\nconst offsetSegment = (\n segment: [GA.Point, GA.Point],\n distance: number,\n): [GA.Point, GA.Point] => {\n const [a, b] = segment;\n const offset = GATransform.translationOrthogonal(\n GADirection.fromTo(a, b),\n distance,\n );\n return [GATransform.apply(offset, a), GATransform.apply(offset, b)];\n};\n\nconst getEllipseIntersections = (\n element: ExcalidrawEllipseElement,\n gap: number,\n line: GA.Line,\n): GA.Point[] => {\n const a = element.width / 2 + gap;\n const b = element.height / 2 + gap;\n const m = line[2];\n const n = line[3];\n const c = line[1];\n const squares = a * a * m * m + b * b * n * n;\n const discr = squares - c * c;\n if (squares === 0 || discr <= 0) {\n return [];\n }\n const discrRoot = Math.sqrt(discr);\n const xn = -a * a * m * c;\n const yn = -b * b * n * c;\n return [\n GA.point(\n (xn + a * b * n * discrRoot) / squares,\n (yn - a * b * m * discrRoot) / squares,\n ),\n GA.point(\n (xn - a * b * n * discrRoot) / squares,\n (yn + a * b * m * discrRoot) / squares,\n ),\n ];\n};\n\nexport const getCircleIntersections = (\n center: GA.Point,\n radius: number,\n line: GA.Line,\n): GA.Point[] => {\n if (radius === 0) {\n return GAPoint.distanceToLine(line, center) === 0 ? [center] : [];\n }\n const m = line[2];\n const n = line[3];\n const c = line[1];\n const [a, b] = GAPoint.toTuple(center);\n const r = radius;\n const squares = m * m + n * n;\n const discr = r * r * squares - (m * a + n * b + c) ** 2;\n if (squares === 0 || discr <= 0) {\n return [];\n }\n const discrRoot = Math.sqrt(discr);\n const xn = a * n * n - b * m * n - m * c;\n const yn = b * m * m - a * m * n - n * c;\n\n return [\n GA.point((xn + n * discrRoot) / squares, (yn - m * discrRoot) / squares),\n GA.point((xn - n * discrRoot) / squares, (yn + m * discrRoot) / squares),\n ];\n};\n\n// The focus point is the tangent point of the \"focus image\" of the\n// `element`, where the tangent goes through `point`.\nexport const findFocusPointForEllipse = (\n ellipse: ExcalidrawEllipseElement,\n // Between -1 and 1 (not 0) the relative size of the \"focus image\" of\n // the element on which the focus point lies\n relativeDistance: number,\n // The point for which we're trying to find the focus point, relative\n // to the ellipse center.\n point: GA.Point,\n): GA.Point => {\n const relativeDistanceAbs = Math.abs(relativeDistance);\n const a = (ellipse.width * relativeDistanceAbs) / 2;\n const b = (ellipse.height * relativeDistanceAbs) / 2;\n\n const orientation = Math.sign(relativeDistance);\n const [px, pyo] = GAPoint.toTuple(point);\n\n // The calculation below can't handle py = 0\n const py = pyo === 0 ? 0.0001 : pyo;\n\n const squares = px ** 2 * b ** 2 + py ** 2 * a ** 2;\n // Tangent mx + ny + 1 = 0\n const m =\n (-px * b ** 2 +\n orientation * py * Math.sqrt(Math.max(0, squares - a ** 2 * b ** 2))) /\n squares;\n\n const n = (-m * px - 1) / py;\n\n const x = -(a ** 2 * m) / (n ** 2 * b ** 2 + m ** 2 * a ** 2);\n return GA.point(x, (-m * x - 1) / n);\n};\n\nexport const findFocusPointForRectangulars = (\n element:\n | ExcalidrawRectangleElement\n | ExcalidrawImageElement\n | ExcalidrawDiamondElement\n | ExcalidrawTextElement,\n // Between -1 and 1 for how far away should the focus point be relative\n // to the size of the element. Sign determines orientation.\n relativeDistance: number,\n // The point for which we're trying to find the focus point, relative\n // to the element center.\n point: GA.Point,\n): GA.Point => {\n const relativeDistanceAbs = Math.abs(relativeDistance);\n const orientation = Math.sign(relativeDistance);\n const corners = getCorners(element, relativeDistanceAbs);\n\n let maxDistance = 0;\n let tangentPoint: null | GA.Point = null;\n corners.forEach((corner) => {\n const distance = orientation * GALine.through(point, corner)[1];\n if (distance > maxDistance) {\n maxDistance = distance;\n tangentPoint = corner;\n }\n });\n return tangentPoint!;\n};\n\nconst pointInBezierEquation = (\n p0: Point,\n p1: Point,\n p2: Point,\n p3: Point,\n [mx, my]: Point,\n lineThreshold: number,\n) => {\n // B(t) = p0 * (1-t)^3 + 3p1 * t * (1-t)^2 + 3p2 * t^2 * (1-t) + p3 * t^3\n const equation = (t: number, idx: number) =>\n Math.pow(1 - t, 3) * p3[idx] +\n 3 * t * Math.pow(1 - t, 2) * p2[idx] +\n 3 * Math.pow(t, 2) * (1 - t) * p1[idx] +\n p0[idx] * Math.pow(t, 3);\n\n // go through t in increments of 0.01\n let t = 0;\n while (t <= 1.0) {\n const tx = equation(t, 0);\n const ty = equation(t, 1);\n\n const diff = Math.sqrt(Math.pow(tx - mx, 2) + Math.pow(ty - my, 2));\n\n if (diff < lineThreshold) {\n return true;\n }\n\n t += 0.01;\n }\n\n return false;\n};\n\nconst hitTestCurveInside = (\n drawable: Drawable,\n x: number,\n y: number,\n sharpness: ExcalidrawElement[\"strokeSharpness\"],\n) => {\n const ops = getCurvePathOps(drawable);\n const points: Mutable[] = [];\n let odd = false; // select one line out of double lines\n for (const operation of ops) {\n if (operation.op === \"move\") {\n odd = !odd;\n if (odd) {\n points.push([operation.data[0], operation.data[1]]);\n }\n } else if (operation.op === \"bcurveTo\") {\n if (odd) {\n points.push([operation.data[0], operation.data[1]]);\n points.push([operation.data[2], operation.data[3]]);\n points.push([operation.data[4], operation.data[5]]);\n }\n } else if (operation.op === \"lineTo\") {\n if (odd) {\n points.push([operation.data[0], operation.data[1]]);\n }\n }\n }\n if (points.length >= 4) {\n if (sharpness === \"sharp\") {\n return isPointInPolygon(points, x, y);\n }\n const polygonPoints = pointsOnBezierCurves(points, 10, 5);\n return isPointInPolygon(polygonPoints, x, y);\n }\n return false;\n};\n\nconst hitTestRoughShape = (\n drawable: Drawable,\n x: number,\n y: number,\n lineThreshold: number,\n) => {\n // read operations from first opSet\n const ops = getCurvePathOps(drawable);\n\n // set start position as (0,0) just in case\n // move operation does not exist (unlikely but it is worth safekeeping it)\n let currentP: Point = [0, 0];\n\n return ops.some(({ op, data }, idx) => {\n // There are only four operation types:\n // move, bcurveTo, lineTo, and curveTo\n if (op === \"move\") {\n // change starting point\n currentP = data as unknown as Point;\n // move operation does not draw anything; so, it always\n // returns false\n } else if (op === \"bcurveTo\") {\n // create points from bezier curve\n // bezier curve stores data as a flattened array of three positions\n // [x1, y1, x2, y2, x3, y3]\n const p1 = [data[0], data[1]] as Point;\n const p2 = [data[2], data[3]] as Point;\n const p3 = [data[4], data[5]] as Point;\n\n const p0 = currentP;\n currentP = p3;\n\n // check if points are on the curve\n // cubic bezier curves require four parameters\n // the first parameter is the last stored position (p0)\n const retVal = pointInBezierEquation(\n p0,\n p1,\n p2,\n p3,\n [x, y],\n lineThreshold,\n );\n\n // set end point of bezier curve as the new starting point for\n // upcoming operations as each operation is based on the last drawn\n // position of the previous operation\n return retVal;\n } else if (op === \"lineTo\") {\n return hitTestCurveInside(drawable, x, y, \"sharp\");\n } else if (op === \"qcurveTo\") {\n // TODO: Implement this\n console.warn(\"qcurveTo is not implemented yet\");\n }\n\n return false;\n });\n};\n","import {\n ExcalidrawElement,\n PointerType,\n NonDeletedExcalidrawElement,\n} from \"./types\";\n\nimport {\n OMIT_SIDES_FOR_MULTIPLE_ELEMENTS,\n getTransformHandlesFromCoords,\n getTransformHandles,\n TransformHandleType,\n TransformHandle,\n MaybeTransformHandleType,\n} from \"./transformHandles\";\nimport { AppState, Zoom } from \"../types\";\n\nconst isInsideTransformHandle = (\n transformHandle: TransformHandle,\n x: number,\n y: number,\n) =>\n x >= transformHandle[0] &&\n x <= transformHandle[0] + transformHandle[2] &&\n y >= transformHandle[1] &&\n y <= transformHandle[1] + transformHandle[3];\n\nexport const resizeTest = (\n element: NonDeletedExcalidrawElement,\n appState: AppState,\n x: number,\n y: number,\n zoom: Zoom,\n pointerType: PointerType,\n): MaybeTransformHandleType => {\n if (!appState.selectedElementIds[element.id]) {\n return false;\n }\n\n const { rotation: rotationTransformHandle, ...transformHandles } =\n getTransformHandles(element, zoom, pointerType);\n\n if (\n rotationTransformHandle &&\n isInsideTransformHandle(rotationTransformHandle, x, y)\n ) {\n return \"rotation\" as TransformHandleType;\n }\n\n const filter = Object.keys(transformHandles).filter((key) => {\n const transformHandle =\n transformHandles[key as Exclude]!;\n if (!transformHandle) {\n return false;\n }\n return isInsideTransformHandle(transformHandle, x, y);\n });\n\n if (filter.length > 0) {\n return filter[0] as TransformHandleType;\n }\n\n return false;\n};\n\nexport const getElementWithTransformHandleType = (\n elements: readonly NonDeletedExcalidrawElement[],\n appState: AppState,\n scenePointerX: number,\n scenePointerY: number,\n zoom: Zoom,\n pointerType: PointerType,\n) => {\n return elements.reduce((result, element) => {\n if (result) {\n return result;\n }\n const transformHandleType = resizeTest(\n element,\n appState,\n scenePointerX,\n scenePointerY,\n zoom,\n pointerType,\n );\n return transformHandleType ? { element, transformHandleType } : null;\n }, null as { element: NonDeletedExcalidrawElement; transformHandleType: MaybeTransformHandleType } | null);\n};\n\nexport const getTransformHandleTypeFromCoords = (\n [x1, y1, x2, y2]: readonly [number, number, number, number],\n scenePointerX: number,\n scenePointerY: number,\n zoom: Zoom,\n pointerType: PointerType,\n): MaybeTransformHandleType => {\n const transformHandles = getTransformHandlesFromCoords(\n [x1, y1, x2, y2],\n 0,\n zoom,\n pointerType,\n OMIT_SIDES_FOR_MULTIPLE_ELEMENTS,\n );\n\n const found = Object.keys(transformHandles).find((key) => {\n const transformHandle =\n transformHandles[key as Exclude]!;\n return (\n transformHandle &&\n isInsideTransformHandle(transformHandle, scenePointerX, scenePointerY)\n );\n });\n return (found || false) as MaybeTransformHandleType;\n};\n\nconst RESIZE_CURSORS = [\"ns\", \"nesw\", \"ew\", \"nwse\"];\nconst rotateResizeCursor = (cursor: string, angle: number) => {\n const index = RESIZE_CURSORS.indexOf(cursor);\n if (index >= 0) {\n const a = Math.round(angle / (Math.PI / 4));\n cursor = RESIZE_CURSORS[(index + a) % RESIZE_CURSORS.length];\n }\n return cursor;\n};\n\n/*\n * Returns bi-directional cursor for the element being resized\n */\nexport const getCursorForResizingElement = (resizingElement: {\n element?: ExcalidrawElement;\n transformHandleType: MaybeTransformHandleType;\n}): string => {\n const { element, transformHandleType } = resizingElement;\n const shouldSwapCursors =\n element && Math.sign(element.height) * Math.sign(element.width) === -1;\n let cursor = null;\n\n switch (transformHandleType) {\n case \"n\":\n case \"s\":\n cursor = \"ns\";\n break;\n case \"w\":\n case \"e\":\n cursor = \"ew\";\n break;\n case \"nw\":\n case \"se\":\n if (shouldSwapCursors) {\n cursor = \"nesw\";\n } else {\n cursor = \"nwse\";\n }\n break;\n case \"ne\":\n case \"sw\":\n if (shouldSwapCursors) {\n cursor = \"nwse\";\n } else {\n cursor = \"nesw\";\n }\n break;\n case \"rotation\":\n return \"grab\";\n }\n\n if (cursor && element) {\n cursor = rotateResizeCursor(cursor, element.angle);\n }\n\n return cursor ? `${cursor}-resize` : \"\";\n};\n","import {\n NonDeleted,\n ExcalidrawLinearElement,\n ExcalidrawElement,\n PointBinding,\n ExcalidrawBindableElement,\n} from \"./types\";\nimport { distance2d, rotate, isPathALoop, getGridPoint } from \"../math\";\nimport { getElementAbsoluteCoords } from \".\";\nimport { getElementPointsCoords } from \"./bounds\";\nimport { Point, AppState } from \"../types\";\nimport { mutateElement } from \"./mutateElement\";\nimport History from \"../history\";\n\nimport Scene from \"../scene/Scene\";\nimport {\n bindOrUnbindLinearElement,\n getHoveredElementForBinding,\n isBindingEnabled,\n} from \"./binding\";\nimport { tupleToCoors } from \"../utils\";\nimport { isBindingElement } from \"./typeChecks\";\n\nexport class LinearElementEditor {\n public elementId: ExcalidrawElement[\"id\"] & {\n _brand: \"excalidrawLinearElementId\";\n };\n /** indices */\n public selectedPointsIndices: readonly number[] | null;\n\n public pointerDownState: Readonly<{\n prevSelectedPointsIndices: readonly number[] | null;\n /** index */\n lastClickedPoint: number;\n }>;\n\n /** whether you're dragging a point */\n public isDragging: boolean;\n public lastUncommittedPoint: Point | null;\n public pointerOffset: Readonly<{ x: number; y: number }>;\n public startBindingElement: ExcalidrawBindableElement | null | \"keep\";\n public endBindingElement: ExcalidrawBindableElement | null | \"keep\";\n\n constructor(element: NonDeleted, scene: Scene) {\n this.elementId = element.id as string & {\n _brand: \"excalidrawLinearElementId\";\n };\n Scene.mapElementToScene(this.elementId, scene);\n LinearElementEditor.normalizePoints(element);\n\n this.selectedPointsIndices = null;\n this.lastUncommittedPoint = null;\n this.isDragging = false;\n this.pointerOffset = { x: 0, y: 0 };\n this.startBindingElement = \"keep\";\n this.endBindingElement = \"keep\";\n this.pointerDownState = {\n prevSelectedPointsIndices: null,\n lastClickedPoint: -1,\n };\n }\n\n // ---------------------------------------------------------------------------\n // static methods\n // ---------------------------------------------------------------------------\n\n static POINT_HANDLE_SIZE = 20;\n\n /**\n * @param id the `elementId` from the instance of this class (so that we can\n * statically guarantee this method returns an ExcalidrawLinearElement)\n */\n static getElement(id: InstanceType[\"elementId\"]) {\n const element = Scene.getScene(id)?.getNonDeletedElement(id);\n if (element) {\n return element as NonDeleted;\n }\n return null;\n }\n\n static handleBoxSelection(\n event: PointerEvent,\n appState: AppState,\n setState: React.Component[\"setState\"],\n ) {\n if (\n !appState.editingLinearElement ||\n appState.draggingElement?.type !== \"selection\"\n ) {\n return false;\n }\n const { editingLinearElement } = appState;\n const { selectedPointsIndices, elementId } = editingLinearElement;\n\n const element = LinearElementEditor.getElement(elementId);\n if (!element) {\n return false;\n }\n\n const [selectionX1, selectionY1, selectionX2, selectionY2] =\n getElementAbsoluteCoords(appState.draggingElement);\n\n const pointsSceneCoords =\n LinearElementEditor.getPointsGlobalCoordinates(element);\n\n const nextSelectedPoints = pointsSceneCoords.reduce(\n (acc: number[], point, index) => {\n if (\n (point[0] >= selectionX1 &&\n point[0] <= selectionX2 &&\n point[1] >= selectionY1 &&\n point[1] <= selectionY2) ||\n (event.shiftKey && selectedPointsIndices?.includes(index))\n ) {\n acc.push(index);\n }\n\n return acc;\n },\n [],\n );\n\n setState({\n editingLinearElement: {\n ...editingLinearElement,\n selectedPointsIndices: nextSelectedPoints.length\n ? nextSelectedPoints\n : null,\n },\n });\n }\n\n /** @returns whether point was dragged */\n static handlePointDragging(\n appState: AppState,\n setState: React.Component[\"setState\"],\n scenePointerX: number,\n scenePointerY: number,\n maybeSuggestBinding: (\n element: NonDeleted,\n pointSceneCoords: { x: number; y: number }[],\n ) => void,\n ): boolean {\n if (!appState.editingLinearElement) {\n return false;\n }\n const { editingLinearElement } = appState;\n const { selectedPointsIndices, elementId, isDragging } =\n editingLinearElement;\n\n const element = LinearElementEditor.getElement(elementId);\n if (!element) {\n return false;\n }\n\n // point that's being dragged (out of all selected points)\n const draggingPoint = element.points[\n editingLinearElement.pointerDownState.lastClickedPoint\n ] as [number, number] | undefined;\n\n if (selectedPointsIndices && draggingPoint) {\n if (isDragging === false) {\n setState({\n editingLinearElement: {\n ...editingLinearElement,\n isDragging: true,\n },\n });\n }\n\n const newDraggingPointPosition = LinearElementEditor.createPointAt(\n element,\n scenePointerX - editingLinearElement.pointerOffset.x,\n scenePointerY - editingLinearElement.pointerOffset.y,\n appState.gridSize,\n );\n\n const deltaX = newDraggingPointPosition[0] - draggingPoint[0];\n const deltaY = newDraggingPointPosition[1] - draggingPoint[1];\n\n LinearElementEditor.movePoints(\n element,\n selectedPointsIndices.map((pointIndex) => {\n const newPointPosition =\n pointIndex ===\n editingLinearElement.pointerDownState.lastClickedPoint\n ? LinearElementEditor.createPointAt(\n element,\n scenePointerX - editingLinearElement.pointerOffset.x,\n scenePointerY - editingLinearElement.pointerOffset.y,\n appState.gridSize,\n )\n : ([\n element.points[pointIndex][0] + deltaX,\n element.points[pointIndex][1] + deltaY,\n ] as const);\n return {\n index: pointIndex,\n point: newPointPosition,\n isDragging:\n pointIndex ===\n editingLinearElement.pointerDownState.lastClickedPoint,\n };\n }),\n );\n\n // suggest bindings for first and last point if selected\n if (isBindingElement(element)) {\n const coords: { x: number; y: number }[] = [];\n\n const firstSelectedIndex = selectedPointsIndices[0];\n if (firstSelectedIndex === 0) {\n coords.push(\n tupleToCoors(\n LinearElementEditor.getPointGlobalCoordinates(\n element,\n element.points[0],\n ),\n ),\n );\n }\n\n const lastSelectedIndex =\n selectedPointsIndices[selectedPointsIndices.length - 1];\n if (lastSelectedIndex === element.points.length - 1) {\n coords.push(\n tupleToCoors(\n LinearElementEditor.getPointGlobalCoordinates(\n element,\n element.points[lastSelectedIndex],\n ),\n ),\n );\n }\n\n if (coords.length) {\n maybeSuggestBinding(element, coords);\n }\n }\n\n return true;\n }\n\n return false;\n }\n\n static handlePointerUp(\n event: PointerEvent,\n editingLinearElement: LinearElementEditor,\n appState: AppState,\n ): LinearElementEditor {\n const { elementId, selectedPointsIndices, isDragging, pointerDownState } =\n editingLinearElement;\n const element = LinearElementEditor.getElement(elementId);\n if (!element) {\n return editingLinearElement;\n }\n\n const bindings: Partial<\n Pick<\n InstanceType,\n \"startBindingElement\" | \"endBindingElement\"\n >\n > = {};\n\n if (isDragging && selectedPointsIndices) {\n for (const selectedPoint of selectedPointsIndices) {\n if (\n selectedPoint === 0 ||\n selectedPoint === element.points.length - 1\n ) {\n if (isPathALoop(element.points, appState.zoom.value)) {\n LinearElementEditor.movePoints(element, [\n {\n index: selectedPoint,\n point:\n selectedPoint === 0\n ? element.points[element.points.length - 1]\n : element.points[0],\n },\n ]);\n }\n\n const bindingElement = isBindingEnabled(appState)\n ? getHoveredElementForBinding(\n tupleToCoors(\n LinearElementEditor.getPointAtIndexGlobalCoordinates(\n element,\n selectedPoint!,\n ),\n ),\n Scene.getScene(element)!,\n )\n : null;\n\n bindings[\n selectedPoint === 0 ? \"startBindingElement\" : \"endBindingElement\"\n ] = bindingElement;\n }\n }\n }\n\n return {\n ...editingLinearElement,\n ...bindings,\n // if clicking without previously dragging a point(s), and not holding\n // shift, deselect all points except the one clicked. If holding shift,\n // toggle the point.\n selectedPointsIndices:\n isDragging || event.shiftKey\n ? !isDragging &&\n event.shiftKey &&\n pointerDownState.prevSelectedPointsIndices?.includes(\n pointerDownState.lastClickedPoint,\n )\n ? selectedPointsIndices &&\n selectedPointsIndices.filter(\n (pointIndex) =>\n pointIndex !== pointerDownState.lastClickedPoint,\n )\n : selectedPointsIndices\n : selectedPointsIndices?.includes(pointerDownState.lastClickedPoint)\n ? [pointerDownState.lastClickedPoint]\n : selectedPointsIndices,\n isDragging: false,\n pointerOffset: { x: 0, y: 0 },\n };\n }\n\n static handlePointerDown(\n event: React.PointerEvent,\n appState: AppState,\n setState: React.Component[\"setState\"],\n history: History,\n scenePointer: { x: number; y: number },\n ): {\n didAddPoint: boolean;\n hitElement: NonDeleted | null;\n } {\n const ret: ReturnType = {\n didAddPoint: false,\n hitElement: null,\n };\n\n if (!appState.editingLinearElement) {\n return ret;\n }\n\n const { elementId } = appState.editingLinearElement;\n const element = LinearElementEditor.getElement(elementId);\n\n if (!element) {\n return ret;\n }\n\n if (event.altKey) {\n if (appState.editingLinearElement.lastUncommittedPoint == null) {\n mutateElement(element, {\n points: [\n ...element.points,\n LinearElementEditor.createPointAt(\n element,\n scenePointer.x,\n scenePointer.y,\n appState.gridSize,\n ),\n ],\n });\n }\n history.resumeRecording();\n setState({\n editingLinearElement: {\n ...appState.editingLinearElement,\n pointerDownState: {\n prevSelectedPointsIndices:\n appState.editingLinearElement.selectedPointsIndices,\n lastClickedPoint: -1,\n },\n selectedPointsIndices: [element.points.length - 1],\n lastUncommittedPoint: null,\n endBindingElement: getHoveredElementForBinding(\n scenePointer,\n Scene.getScene(element)!,\n ),\n },\n });\n ret.didAddPoint = true;\n return ret;\n }\n\n const clickedPointIndex = LinearElementEditor.getPointIndexUnderCursor(\n element,\n appState.zoom,\n scenePointer.x,\n scenePointer.y,\n );\n\n // if we clicked on a point, set the element as hitElement otherwise\n // it would get deselected if the point is outside the hitbox area\n if (clickedPointIndex > -1) {\n ret.hitElement = element;\n } else {\n // You might be wandering why we are storing the binding elements on\n // LinearElementEditor and passing them in, instead of calculating them\n // from the end points of the `linearElement` - this is to allow disabling\n // binding (which needs to happen at the point the user finishes moving\n // the point).\n const { startBindingElement, endBindingElement } =\n appState.editingLinearElement;\n if (isBindingEnabled(appState) && isBindingElement(element)) {\n bindOrUnbindLinearElement(\n element,\n startBindingElement,\n endBindingElement,\n );\n }\n }\n\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const targetPoint =\n clickedPointIndex > -1 &&\n rotate(\n element.x + element.points[clickedPointIndex][0],\n element.y + element.points[clickedPointIndex][1],\n cx,\n cy,\n element.angle,\n );\n\n const nextSelectedPointsIndices =\n clickedPointIndex > -1 || event.shiftKey\n ? event.shiftKey ||\n appState.editingLinearElement.selectedPointsIndices?.includes(\n clickedPointIndex,\n )\n ? normalizeSelectedPoints([\n ...(appState.editingLinearElement.selectedPointsIndices || []),\n clickedPointIndex,\n ])\n : [clickedPointIndex]\n : null;\n\n setState({\n editingLinearElement: {\n ...appState.editingLinearElement,\n pointerDownState: {\n prevSelectedPointsIndices:\n appState.editingLinearElement.selectedPointsIndices,\n lastClickedPoint: clickedPointIndex,\n },\n selectedPointsIndices: nextSelectedPointsIndices,\n pointerOffset: targetPoint\n ? {\n x: scenePointer.x - targetPoint[0],\n y: scenePointer.y - targetPoint[1],\n }\n : { x: 0, y: 0 },\n },\n });\n return ret;\n }\n\n static handlePointerMove(\n event: React.PointerEvent,\n scenePointerX: number,\n scenePointerY: number,\n editingLinearElement: LinearElementEditor,\n gridSize: number | null,\n ): LinearElementEditor {\n const { elementId, lastUncommittedPoint } = editingLinearElement;\n const element = LinearElementEditor.getElement(elementId);\n if (!element) {\n return editingLinearElement;\n }\n\n const { points } = element;\n const lastPoint = points[points.length - 1];\n\n if (!event.altKey) {\n if (lastPoint === lastUncommittedPoint) {\n LinearElementEditor.deletePoints(element, [points.length - 1]);\n }\n return { ...editingLinearElement, lastUncommittedPoint: null };\n }\n\n const newPoint = LinearElementEditor.createPointAt(\n element,\n scenePointerX - editingLinearElement.pointerOffset.x,\n scenePointerY - editingLinearElement.pointerOffset.y,\n gridSize,\n );\n\n if (lastPoint === lastUncommittedPoint) {\n LinearElementEditor.movePoints(element, [\n {\n index: element.points.length - 1,\n point: newPoint,\n },\n ]);\n } else {\n LinearElementEditor.addPoints(element, [{ point: newPoint }]);\n }\n\n return {\n ...editingLinearElement,\n lastUncommittedPoint: element.points[element.points.length - 1],\n };\n }\n\n /** scene coords */\n static getPointGlobalCoordinates(\n element: NonDeleted,\n point: Point,\n ) {\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n\n let { x, y } = element;\n [x, y] = rotate(x + point[0], y + point[1], cx, cy, element.angle);\n return [x, y] as const;\n }\n\n /** scene coords */\n static getPointsGlobalCoordinates(\n element: NonDeleted,\n ) {\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n return element.points.map((point) => {\n let { x, y } = element;\n [x, y] = rotate(x + point[0], y + point[1], cx, cy, element.angle);\n return [x, y];\n });\n }\n\n static getPointAtIndexGlobalCoordinates(\n element: NonDeleted,\n indexMaybeFromEnd: number, // -1 for last element\n ): Point {\n const index =\n indexMaybeFromEnd < 0\n ? element.points.length + indexMaybeFromEnd\n : indexMaybeFromEnd;\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n\n const point = element.points[index];\n const { x, y } = element;\n return rotate(x + point[0], y + point[1], cx, cy, element.angle);\n }\n\n static pointFromAbsoluteCoords(\n element: NonDeleted,\n absoluteCoords: Point,\n ): Point {\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const [x, y] = rotate(\n absoluteCoords[0],\n absoluteCoords[1],\n cx,\n cy,\n -element.angle,\n );\n return [x - element.x, y - element.y];\n }\n\n static getPointIndexUnderCursor(\n element: NonDeleted,\n zoom: AppState[\"zoom\"],\n x: number,\n y: number,\n ) {\n const pointHandles = this.getPointsGlobalCoordinates(element);\n let idx = pointHandles.length;\n // loop from right to left because points on the right are rendered over\n // points on the left, thus should take precedence when clicking, if they\n // overlap\n while (--idx > -1) {\n const point = pointHandles[idx];\n if (\n distance2d(x, y, point[0], point[1]) * zoom.value <\n // +1px to account for outline stroke\n this.POINT_HANDLE_SIZE / 2 + 1\n ) {\n return idx;\n }\n }\n return -1;\n }\n\n static createPointAt(\n element: NonDeleted,\n scenePointerX: number,\n scenePointerY: number,\n gridSize: number | null,\n ): Point {\n const pointerOnGrid = getGridPoint(scenePointerX, scenePointerY, gridSize);\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const [rotatedX, rotatedY] = rotate(\n pointerOnGrid[0],\n pointerOnGrid[1],\n cx,\n cy,\n -element.angle,\n );\n\n return [rotatedX - element.x, rotatedY - element.y];\n }\n\n /**\n * Normalizes line points so that the start point is at [0,0]. This is\n * expected in various parts of the codebase. Also returns new x/y to account\n * for the potential normalization.\n */\n static getNormalizedPoints(element: ExcalidrawLinearElement) {\n const { points } = element;\n\n const offsetX = points[0][0];\n const offsetY = points[0][1];\n\n return {\n points: points.map((point, _idx) => {\n return [point[0] - offsetX, point[1] - offsetY] as const;\n }),\n x: element.x + offsetX,\n y: element.y + offsetY,\n };\n }\n\n // element-mutating methods\n // ---------------------------------------------------------------------------\n\n static normalizePoints(element: NonDeleted) {\n mutateElement(element, LinearElementEditor.getNormalizedPoints(element));\n }\n\n static duplicateSelectedPoints(appState: AppState) {\n if (!appState.editingLinearElement) {\n return false;\n }\n\n const { selectedPointsIndices, elementId } = appState.editingLinearElement;\n\n const element = LinearElementEditor.getElement(elementId);\n\n if (!element || selectedPointsIndices === null) {\n return false;\n }\n\n const { points } = element;\n\n const nextSelectedIndices: number[] = [];\n\n let pointAddedToEnd = false;\n let indexCursor = -1;\n const nextPoints = points.reduce((acc: Point[], point, index) => {\n ++indexCursor;\n acc.push(point);\n\n const isSelected = selectedPointsIndices.includes(index);\n if (isSelected) {\n const nextPoint = points[index + 1];\n\n if (!nextPoint) {\n pointAddedToEnd = true;\n }\n acc.push(\n nextPoint\n ? [(point[0] + nextPoint[0]) / 2, (point[1] + nextPoint[1]) / 2]\n : [point[0], point[1]],\n );\n\n nextSelectedIndices.push(indexCursor + 1);\n ++indexCursor;\n }\n\n return acc;\n }, []);\n\n mutateElement(element, { points: nextPoints });\n\n // temp hack to ensure the line doesn't move when adding point to the end,\n // potentially expanding the bounding box\n if (pointAddedToEnd) {\n const lastPoint = element.points[element.points.length - 1];\n LinearElementEditor.movePoints(element, [\n {\n index: element.points.length - 1,\n point: [lastPoint[0] + 30, lastPoint[1] + 30],\n },\n ]);\n }\n\n return {\n appState: {\n ...appState,\n editingLinearElement: {\n ...appState.editingLinearElement,\n selectedPointsIndices: nextSelectedIndices,\n },\n },\n };\n }\n\n static deletePoints(\n element: NonDeleted,\n pointIndices: readonly number[],\n ) {\n let offsetX = 0;\n let offsetY = 0;\n\n const isDeletingOriginPoint = pointIndices.includes(0);\n\n // if deleting first point, make the next to be [0,0] and recalculate\n // positions of the rest with respect to it\n if (isDeletingOriginPoint) {\n const firstNonDeletedPoint = element.points.find((point, idx) => {\n return !pointIndices.includes(idx);\n });\n if (firstNonDeletedPoint) {\n offsetX = firstNonDeletedPoint[0];\n offsetY = firstNonDeletedPoint[1];\n }\n }\n\n const nextPoints = element.points.reduce((acc: Point[], point, idx) => {\n if (!pointIndices.includes(idx)) {\n acc.push(\n !acc.length ? [0, 0] : [point[0] - offsetX, point[1] - offsetY],\n );\n }\n return acc;\n }, []);\n\n LinearElementEditor._updatePoints(element, nextPoints, offsetX, offsetY);\n }\n\n static addPoints(\n element: NonDeleted,\n targetPoints: { point: Point }[],\n ) {\n const offsetX = 0;\n const offsetY = 0;\n\n const nextPoints = [...element.points, ...targetPoints.map((x) => x.point)];\n\n LinearElementEditor._updatePoints(element, nextPoints, offsetX, offsetY);\n }\n\n static movePoints(\n element: NonDeleted,\n targetPoints: { index: number; point: Point; isDragging?: boolean }[],\n otherUpdates?: { startBinding?: PointBinding; endBinding?: PointBinding },\n ) {\n const { points } = element;\n\n // in case we're moving start point, instead of modifying its position\n // which would break the invariant of it being at [0,0], we move\n // all the other points in the opposite direction by delta to\n // offset it. We do the same with actual element.x/y position, so\n // this hacks are completely transparent to the user.\n let offsetX = 0;\n let offsetY = 0;\n\n const selectedOriginPoint = targetPoints.find(({ index }) => index === 0);\n\n if (selectedOriginPoint) {\n offsetX =\n selectedOriginPoint.point[0] - points[selectedOriginPoint.index][0];\n offsetY =\n selectedOriginPoint.point[1] - points[selectedOriginPoint.index][1];\n }\n\n const nextPoints = points.map((point, idx) => {\n const selectedPointData = targetPoints.find((p) => p.index === idx);\n if (selectedPointData) {\n if (selectedOriginPoint) {\n return point;\n }\n\n const deltaX =\n selectedPointData.point[0] - points[selectedPointData.index][0];\n const deltaY =\n selectedPointData.point[1] - points[selectedPointData.index][1];\n\n return [point[0] + deltaX, point[1] + deltaY] as const;\n }\n return offsetX || offsetY\n ? ([point[0] - offsetX, point[1] - offsetY] as const)\n : point;\n });\n\n LinearElementEditor._updatePoints(\n element,\n nextPoints,\n offsetX,\n offsetY,\n otherUpdates,\n );\n }\n\n private static _updatePoints(\n element: NonDeleted,\n nextPoints: readonly Point[],\n offsetX: number,\n offsetY: number,\n otherUpdates?: { startBinding?: PointBinding; endBinding?: PointBinding },\n ) {\n const nextCoords = getElementPointsCoords(\n element,\n nextPoints,\n element.strokeSharpness || \"round\",\n );\n const prevCoords = getElementPointsCoords(\n element,\n element.points,\n element.strokeSharpness || \"round\",\n );\n const nextCenterX = (nextCoords[0] + nextCoords[2]) / 2;\n const nextCenterY = (nextCoords[1] + nextCoords[3]) / 2;\n const prevCenterX = (prevCoords[0] + prevCoords[2]) / 2;\n const prevCenterY = (prevCoords[1] + prevCoords[3]) / 2;\n const dX = prevCenterX - nextCenterX;\n const dY = prevCenterY - nextCenterY;\n const rotated = rotate(offsetX, offsetY, dX, dY, element.angle);\n\n mutateElement(element, {\n ...otherUpdates,\n points: nextPoints,\n x: element.x + rotated[0],\n y: element.y + rotated[1],\n });\n }\n}\n\nconst normalizeSelectedPoints = (\n points: (number | null)[],\n): number[] | null => {\n let nextPoints = [\n ...new Set(points.filter((p) => p !== null && p !== -1)),\n ] as number[];\n nextPoints = nextPoints.sort((a, b) => a - b);\n return nextPoints.length ? nextPoints : null;\n};\n","import {\n ExcalidrawLinearElement,\n ExcalidrawBindableElement,\n NonDeleted,\n NonDeletedExcalidrawElement,\n PointBinding,\n ExcalidrawElement,\n} from \"./types\";\nimport { getElementAtPosition } from \"../scene\";\nimport { AppState } from \"../types\";\nimport {\n isBindableElement,\n isBindingElement,\n isLinearElement,\n} from \"./typeChecks\";\nimport {\n bindingBorderTest,\n distanceToBindableElement,\n maxBindingGap,\n determineFocusDistance,\n intersectElementWithLine,\n determineFocusPoint,\n} from \"./collision\";\nimport { mutateElement } from \"./mutateElement\";\nimport Scene from \"../scene/Scene\";\nimport { LinearElementEditor } from \"./linearElementEditor\";\nimport { arrayToMap, tupleToCoors } from \"../utils\";\nimport { KEYS } from \"../keys\";\n\nexport type SuggestedBinding =\n | NonDeleted\n | SuggestedPointBinding;\n\nexport type SuggestedPointBinding = [\n NonDeleted,\n \"start\" | \"end\" | \"both\",\n NonDeleted,\n];\n\nexport const shouldEnableBindingForPointerEvent = (\n event: React.PointerEvent,\n) => {\n return !event[KEYS.CTRL_OR_CMD];\n};\n\nexport const isBindingEnabled = (appState: AppState): boolean => {\n return appState.isBindingEnabled;\n};\n\nexport const bindOrUnbindLinearElement = (\n linearElement: NonDeleted,\n startBindingElement: ExcalidrawBindableElement | null | \"keep\",\n endBindingElement: ExcalidrawBindableElement | null | \"keep\",\n): void => {\n const boundToElementIds: Set = new Set();\n const unboundFromElementIds: Set = new Set();\n bindOrUnbindLinearElementEdge(\n linearElement,\n startBindingElement,\n endBindingElement,\n \"start\",\n boundToElementIds,\n unboundFromElementIds,\n );\n bindOrUnbindLinearElementEdge(\n linearElement,\n endBindingElement,\n startBindingElement,\n \"end\",\n boundToElementIds,\n unboundFromElementIds,\n );\n\n const onlyUnbound = Array.from(unboundFromElementIds).filter(\n (id) => !boundToElementIds.has(id),\n );\n Scene.getScene(linearElement)!\n .getNonDeletedElements(onlyUnbound)\n .forEach((element) => {\n mutateElement(element, {\n boundElements: element.boundElements?.filter(\n (element) =>\n element.type !== \"arrow\" || element.id !== linearElement.id,\n ),\n });\n });\n};\n\nconst bindOrUnbindLinearElementEdge = (\n linearElement: NonDeleted,\n bindableElement: ExcalidrawBindableElement | null | \"keep\",\n otherEdgeBindableElement: ExcalidrawBindableElement | null | \"keep\",\n startOrEnd: \"start\" | \"end\",\n // Is mutated\n boundToElementIds: Set,\n // Is mutated\n unboundFromElementIds: Set,\n): void => {\n if (bindableElement !== \"keep\") {\n if (bindableElement != null) {\n // Don't bind if we're trying to bind or are already bound to the same\n // element on the other edge already (\"start\" edge takes precedence).\n if (\n otherEdgeBindableElement == null ||\n (otherEdgeBindableElement === \"keep\"\n ? !isLinearElementSimpleAndAlreadyBoundOnOppositeEdge(\n linearElement,\n bindableElement,\n startOrEnd,\n )\n : startOrEnd === \"start\" ||\n otherEdgeBindableElement.id !== bindableElement.id)\n ) {\n bindLinearElement(linearElement, bindableElement, startOrEnd);\n boundToElementIds.add(bindableElement.id);\n }\n } else {\n const unbound = unbindLinearElement(linearElement, startOrEnd);\n if (unbound != null) {\n unboundFromElementIds.add(unbound);\n }\n }\n }\n};\n\nexport const bindOrUnbindSelectedElements = (\n elements: NonDeleted[],\n): void => {\n elements.forEach((element) => {\n if (isBindingElement(element)) {\n bindOrUnbindLinearElement(\n element,\n getElligibleElementForBindingElement(element, \"start\"),\n getElligibleElementForBindingElement(element, \"end\"),\n );\n } else if (isBindableElement(element)) {\n maybeBindBindableElement(element);\n }\n });\n};\n\nconst maybeBindBindableElement = (\n bindableElement: NonDeleted,\n): void => {\n getElligibleElementsForBindableElementAndWhere(bindableElement).forEach(\n ([linearElement, where]) =>\n bindOrUnbindLinearElement(\n linearElement,\n where === \"end\" ? \"keep\" : bindableElement,\n where === \"start\" ? \"keep\" : bindableElement,\n ),\n );\n};\n\nexport const maybeBindLinearElement = (\n linearElement: NonDeleted,\n appState: AppState,\n scene: Scene,\n pointerCoords: { x: number; y: number },\n): void => {\n if (appState.startBoundElement != null) {\n bindLinearElement(linearElement, appState.startBoundElement, \"start\");\n }\n const hoveredElement = getHoveredElementForBinding(pointerCoords, scene);\n if (\n hoveredElement != null &&\n !isLinearElementSimpleAndAlreadyBoundOnOppositeEdge(\n linearElement,\n hoveredElement,\n \"end\",\n )\n ) {\n bindLinearElement(linearElement, hoveredElement, \"end\");\n }\n};\n\nconst bindLinearElement = (\n linearElement: NonDeleted,\n hoveredElement: ExcalidrawBindableElement,\n startOrEnd: \"start\" | \"end\",\n): void => {\n mutateElement(linearElement, {\n [startOrEnd === \"start\" ? \"startBinding\" : \"endBinding\"]: {\n elementId: hoveredElement.id,\n ...calculateFocusAndGap(linearElement, hoveredElement, startOrEnd),\n } as PointBinding,\n });\n\n const boundElementsMap = arrayToMap(hoveredElement.boundElements || []);\n if (!boundElementsMap.has(linearElement.id)) {\n mutateElement(hoveredElement, {\n boundElements: (hoveredElement.boundElements || []).concat({\n id: linearElement.id,\n type: \"arrow\",\n }),\n });\n }\n};\n\n// Don't bind both ends of a simple segment\nconst isLinearElementSimpleAndAlreadyBoundOnOppositeEdge = (\n linearElement: NonDeleted,\n bindableElement: ExcalidrawBindableElement,\n startOrEnd: \"start\" | \"end\",\n): boolean => {\n const otherBinding =\n linearElement[startOrEnd === \"start\" ? \"endBinding\" : \"startBinding\"];\n return isLinearElementSimpleAndAlreadyBound(\n linearElement,\n otherBinding?.elementId,\n bindableElement,\n );\n};\n\nexport const isLinearElementSimpleAndAlreadyBound = (\n linearElement: NonDeleted,\n alreadyBoundToId: ExcalidrawBindableElement[\"id\"] | undefined,\n bindableElement: ExcalidrawBindableElement,\n): boolean => {\n return (\n alreadyBoundToId === bindableElement.id && linearElement.points.length < 3\n );\n};\n\nexport const unbindLinearElements = (\n elements: NonDeleted[],\n): void => {\n elements.forEach((element) => {\n if (isBindingElement(element)) {\n bindOrUnbindLinearElement(element, null, null);\n }\n });\n};\n\nconst unbindLinearElement = (\n linearElement: NonDeleted,\n startOrEnd: \"start\" | \"end\",\n): ExcalidrawBindableElement[\"id\"] | null => {\n const field = startOrEnd === \"start\" ? \"startBinding\" : \"endBinding\";\n const binding = linearElement[field];\n if (binding == null) {\n return null;\n }\n mutateElement(linearElement, { [field]: null });\n return binding.elementId;\n};\n\nexport const getHoveredElementForBinding = (\n pointerCoords: {\n x: number;\n y: number;\n },\n scene: Scene,\n): NonDeleted | null => {\n const hoveredElement = getElementAtPosition(\n scene.getElements(),\n (element) =>\n isBindableElement(element) && bindingBorderTest(element, pointerCoords),\n );\n return hoveredElement as NonDeleted | null;\n};\n\nconst calculateFocusAndGap = (\n linearElement: NonDeleted,\n hoveredElement: ExcalidrawBindableElement,\n startOrEnd: \"start\" | \"end\",\n): { focus: number; gap: number } => {\n const direction = startOrEnd === \"start\" ? -1 : 1;\n const edgePointIndex = direction === -1 ? 0 : linearElement.points.length - 1;\n const adjacentPointIndex = edgePointIndex - direction;\n const edgePoint = LinearElementEditor.getPointAtIndexGlobalCoordinates(\n linearElement,\n edgePointIndex,\n );\n const adjacentPoint = LinearElementEditor.getPointAtIndexGlobalCoordinates(\n linearElement,\n adjacentPointIndex,\n );\n return {\n focus: determineFocusDistance(hoveredElement, adjacentPoint, edgePoint),\n gap: Math.max(1, distanceToBindableElement(hoveredElement, edgePoint)),\n };\n};\n\n// Supports translating, rotating and scaling `changedElement` with bound\n// linear elements.\n// Because scaling involves moving the focus points as well, it is\n// done before the `changedElement` is updated, and the `newSize` is passed\n// in explicitly.\nexport const updateBoundElements = (\n changedElement: NonDeletedExcalidrawElement,\n options?: {\n simultaneouslyUpdated?: readonly ExcalidrawElement[];\n newSize?: { width: number; height: number };\n },\n) => {\n const boundLinearElements = (changedElement.boundElements ?? []).filter(\n (el) => el.type === \"arrow\",\n );\n if (boundLinearElements.length === 0) {\n return;\n }\n const { newSize, simultaneouslyUpdated } = options ?? {};\n const simultaneouslyUpdatedElementIds = getSimultaneouslyUpdatedElementIds(\n simultaneouslyUpdated,\n );\n Scene.getScene(changedElement)!\n .getNonDeletedElements(boundLinearElements.map((el) => el.id))\n .forEach((element) => {\n if (!isLinearElement(element)) {\n return;\n }\n\n const bindableElement = changedElement as ExcalidrawBindableElement;\n // In case the boundElements are stale\n if (!doesNeedUpdate(element, bindableElement)) {\n return;\n }\n const startBinding = maybeCalculateNewGapWhenScaling(\n bindableElement,\n element.startBinding,\n newSize,\n );\n const endBinding = maybeCalculateNewGapWhenScaling(\n bindableElement,\n element.endBinding,\n newSize,\n );\n // `linearElement` is being moved/scaled already, just update the binding\n if (simultaneouslyUpdatedElementIds.has(element.id)) {\n mutateElement(element, { startBinding, endBinding });\n return;\n }\n updateBoundPoint(\n element,\n \"start\",\n startBinding,\n changedElement as ExcalidrawBindableElement,\n );\n updateBoundPoint(\n element,\n \"end\",\n endBinding,\n changedElement as ExcalidrawBindableElement,\n );\n });\n};\n\nconst doesNeedUpdate = (\n boundElement: NonDeleted,\n changedElement: ExcalidrawBindableElement,\n) => {\n return (\n boundElement.startBinding?.elementId === changedElement.id ||\n boundElement.endBinding?.elementId === changedElement.id\n );\n};\n\nconst getSimultaneouslyUpdatedElementIds = (\n simultaneouslyUpdated: readonly ExcalidrawElement[] | undefined,\n): Set => {\n return new Set((simultaneouslyUpdated || []).map((element) => element.id));\n};\n\nconst updateBoundPoint = (\n linearElement: NonDeleted,\n startOrEnd: \"start\" | \"end\",\n binding: PointBinding | null | undefined,\n changedElement: ExcalidrawBindableElement,\n): void => {\n if (\n binding == null ||\n // We only need to update the other end if this is a 2 point line element\n (binding.elementId !== changedElement.id && linearElement.points.length > 2)\n ) {\n return;\n }\n const bindingElement = Scene.getScene(linearElement)!.getElement(\n binding.elementId,\n ) as ExcalidrawBindableElement | null;\n if (bindingElement == null) {\n // We're not cleaning up after deleted elements atm., so handle this case\n return;\n }\n const direction = startOrEnd === \"start\" ? -1 : 1;\n const edgePointIndex = direction === -1 ? 0 : linearElement.points.length - 1;\n const adjacentPointIndex = edgePointIndex - direction;\n const adjacentPoint = LinearElementEditor.getPointAtIndexGlobalCoordinates(\n linearElement,\n adjacentPointIndex,\n );\n const focusPointAbsolute = determineFocusPoint(\n bindingElement,\n binding.focus,\n adjacentPoint,\n );\n let newEdgePoint;\n // The linear element was not originally pointing inside the bound shape,\n // we can point directly at the focus point\n if (binding.gap === 0) {\n newEdgePoint = focusPointAbsolute;\n } else {\n const intersections = intersectElementWithLine(\n bindingElement,\n adjacentPoint,\n focusPointAbsolute,\n binding.gap,\n );\n if (intersections.length === 0) {\n // This should never happen, since focusPoint should always be\n // inside the element, but just in case, bail out\n newEdgePoint = focusPointAbsolute;\n } else {\n // Guaranteed to intersect because focusPoint is always inside the shape\n newEdgePoint = intersections[0];\n }\n }\n LinearElementEditor.movePoints(\n linearElement,\n [\n {\n index: edgePointIndex,\n point: LinearElementEditor.pointFromAbsoluteCoords(\n linearElement,\n newEdgePoint,\n ),\n },\n ],\n { [startOrEnd === \"start\" ? \"startBinding\" : \"endBinding\"]: binding },\n );\n};\n\nconst maybeCalculateNewGapWhenScaling = (\n changedElement: ExcalidrawBindableElement,\n currentBinding: PointBinding | null | undefined,\n newSize: { width: number; height: number } | undefined,\n): PointBinding | null | undefined => {\n if (currentBinding == null || newSize == null) {\n return currentBinding;\n }\n const { gap, focus, elementId } = currentBinding;\n const { width: newWidth, height: newHeight } = newSize;\n const { width, height } = changedElement;\n const newGap = Math.max(\n 1,\n Math.min(\n maxBindingGap(changedElement, newWidth, newHeight),\n gap * (newWidth < newHeight ? newWidth / width : newHeight / height),\n ),\n );\n return { elementId, gap: newGap, focus };\n};\n\nexport const getEligibleElementsForBinding = (\n elements: NonDeleted[],\n): SuggestedBinding[] => {\n const includedElementIds = new Set(elements.map(({ id }) => id));\n return elements.flatMap((element) =>\n isBindingElement(element)\n ? (getElligibleElementsForBindingElement(\n element as NonDeleted,\n ).filter(\n (element) => !includedElementIds.has(element.id),\n ) as SuggestedBinding[])\n : isBindableElement(element)\n ? getElligibleElementsForBindableElementAndWhere(element).filter(\n (binding) => !includedElementIds.has(binding[0].id),\n )\n : [],\n );\n};\n\nconst getElligibleElementsForBindingElement = (\n linearElement: NonDeleted,\n): NonDeleted[] => {\n return [\n getElligibleElementForBindingElement(linearElement, \"start\"),\n getElligibleElementForBindingElement(linearElement, \"end\"),\n ].filter(\n (element): element is NonDeleted =>\n element != null,\n );\n};\n\nconst getElligibleElementForBindingElement = (\n linearElement: NonDeleted,\n startOrEnd: \"start\" | \"end\",\n): NonDeleted | null => {\n return getHoveredElementForBinding(\n getLinearElementEdgeCoors(linearElement, startOrEnd),\n Scene.getScene(linearElement)!,\n );\n};\n\nconst getLinearElementEdgeCoors = (\n linearElement: NonDeleted,\n startOrEnd: \"start\" | \"end\",\n): { x: number; y: number } => {\n const index = startOrEnd === \"start\" ? 0 : -1;\n return tupleToCoors(\n LinearElementEditor.getPointAtIndexGlobalCoordinates(linearElement, index),\n );\n};\n\nconst getElligibleElementsForBindableElementAndWhere = (\n bindableElement: NonDeleted,\n): SuggestedPointBinding[] => {\n return Scene.getScene(bindableElement)!\n .getElements()\n .map((element) => {\n if (!isBindingElement(element)) {\n return null;\n }\n const canBindStart = isLinearElementEligibleForNewBindingByBindable(\n element,\n \"start\",\n bindableElement,\n );\n const canBindEnd = isLinearElementEligibleForNewBindingByBindable(\n element,\n \"end\",\n bindableElement,\n );\n if (!canBindStart && !canBindEnd) {\n return null;\n }\n return [\n element,\n canBindStart && canBindEnd ? \"both\" : canBindStart ? \"start\" : \"end\",\n bindableElement,\n ];\n })\n .filter((maybeElement) => maybeElement != null) as SuggestedPointBinding[];\n};\n\nconst isLinearElementEligibleForNewBindingByBindable = (\n linearElement: NonDeleted,\n startOrEnd: \"start\" | \"end\",\n bindableElement: NonDeleted,\n): boolean => {\n const existingBinding =\n linearElement[startOrEnd === \"start\" ? \"startBinding\" : \"endBinding\"];\n return (\n existingBinding == null &&\n !isLinearElementSimpleAndAlreadyBoundOnOppositeEdge(\n linearElement,\n bindableElement,\n startOrEnd,\n ) &&\n bindingBorderTest(\n bindableElement,\n getLinearElementEdgeCoors(linearElement, startOrEnd),\n )\n );\n};\n\n// We need to:\n// 1: Update elements not selected to point to duplicated elements\n// 2: Update duplicated elements to point to other duplicated elements\nexport const fixBindingsAfterDuplication = (\n sceneElements: readonly ExcalidrawElement[],\n oldElements: readonly ExcalidrawElement[],\n oldIdToDuplicatedId: Map,\n // There are three copying mechanisms: Copy-paste, duplication and alt-drag.\n // Only when alt-dragging the new \"duplicates\" act as the \"old\", while\n // the \"old\" elements act as the \"new copy\" - essentially working reverse\n // to the other two.\n duplicatesServeAsOld?: \"duplicatesServeAsOld\" | undefined,\n): void => {\n // First collect all the binding/bindable elements, so we only update\n // each once, regardless of whether they were duplicated or not.\n const allBoundElementIds: Set = new Set();\n const allBindableElementIds: Set = new Set();\n const shouldReverseRoles = duplicatesServeAsOld === \"duplicatesServeAsOld\";\n oldElements.forEach((oldElement) => {\n const { boundElements } = oldElement;\n if (boundElements != null && boundElements.length > 0) {\n boundElements.forEach((boundElement) => {\n if (shouldReverseRoles && !oldIdToDuplicatedId.has(boundElement.id)) {\n allBoundElementIds.add(boundElement.id);\n }\n });\n allBindableElementIds.add(oldIdToDuplicatedId.get(oldElement.id)!);\n }\n if (isBindingElement(oldElement)) {\n if (oldElement.startBinding != null) {\n const { elementId } = oldElement.startBinding;\n if (shouldReverseRoles && !oldIdToDuplicatedId.has(elementId)) {\n allBindableElementIds.add(elementId);\n }\n }\n if (oldElement.endBinding != null) {\n const { elementId } = oldElement.endBinding;\n if (shouldReverseRoles && !oldIdToDuplicatedId.has(elementId)) {\n allBindableElementIds.add(elementId);\n }\n }\n if (oldElement.startBinding != null || oldElement.endBinding != null) {\n allBoundElementIds.add(oldIdToDuplicatedId.get(oldElement.id)!);\n }\n }\n });\n\n // Update the linear elements\n (\n sceneElements.filter(({ id }) =>\n allBoundElementIds.has(id),\n ) as ExcalidrawLinearElement[]\n ).forEach((element) => {\n const { startBinding, endBinding } = element;\n mutateElement(element, {\n startBinding: newBindingAfterDuplication(\n startBinding,\n oldIdToDuplicatedId,\n ),\n endBinding: newBindingAfterDuplication(endBinding, oldIdToDuplicatedId),\n });\n });\n\n // Update the bindable shapes\n sceneElements\n .filter(({ id }) => allBindableElementIds.has(id))\n .forEach((bindableElement) => {\n const { boundElements } = bindableElement;\n if (boundElements != null && boundElements.length > 0) {\n mutateElement(bindableElement, {\n boundElements: boundElements.map((boundElement) =>\n oldIdToDuplicatedId.has(boundElement.id)\n ? {\n id: oldIdToDuplicatedId.get(boundElement.id)!,\n type: boundElement.type,\n }\n : boundElement,\n ),\n });\n }\n });\n};\n\nconst newBindingAfterDuplication = (\n binding: PointBinding | null,\n oldIdToDuplicatedId: Map,\n): PointBinding | null => {\n if (binding == null) {\n return null;\n }\n const { elementId, focus, gap } = binding;\n return {\n focus,\n gap,\n elementId: oldIdToDuplicatedId.get(elementId) ?? elementId,\n };\n};\n\nexport const fixBindingsAfterDeletion = (\n sceneElements: readonly ExcalidrawElement[],\n deletedElements: readonly ExcalidrawElement[],\n): void => {\n const deletedElementIds = new Set(\n deletedElements.map((element) => element.id),\n );\n // Non deleted and need an update\n const boundElementIds: Set = new Set();\n deletedElements.forEach((deletedElement) => {\n if (isBindableElement(deletedElement)) {\n deletedElement.boundElements?.forEach((element) => {\n if (!deletedElementIds.has(element.id)) {\n boundElementIds.add(element.id);\n }\n });\n }\n });\n (\n sceneElements.filter(({ id }) =>\n boundElementIds.has(id),\n ) as ExcalidrawLinearElement[]\n ).forEach((element: ExcalidrawLinearElement) => {\n const { startBinding, endBinding } = element;\n mutateElement(element, {\n startBinding: newBindingAfterDeletion(startBinding, deletedElementIds),\n endBinding: newBindingAfterDeletion(endBinding, deletedElementIds),\n });\n });\n};\n\nconst newBindingAfterDeletion = (\n binding: PointBinding | null,\n deletedElementIds: Set,\n): PointBinding | null => {\n if (binding == null || deletedElementIds.has(binding.elementId)) {\n return null;\n }\n return binding;\n};\n","import { BOUND_TEXT_PADDING, SHIFT_LOCKING_ANGLE } from \"../constants\";\nimport { rescalePoints } from \"../points\";\n\nimport {\n rotate,\n adjustXYWithRotation,\n centerPoint,\n rotatePoint,\n} from \"../math\";\nimport {\n ExcalidrawLinearElement,\n ExcalidrawTextElement,\n NonDeletedExcalidrawElement,\n NonDeleted,\n} from \"./types\";\nimport {\n getElementAbsoluteCoords,\n getCommonBounds,\n getResizedElementAbsoluteCoords,\n} from \"./bounds\";\nimport {\n isFreeDrawElement,\n isLinearElement,\n isTextElement,\n} from \"./typeChecks\";\nimport { mutateElement } from \"./mutateElement\";\nimport { getPerfectElementSize } from \"./sizeHelpers\";\nimport { getFontString } from \"../utils\";\nimport { updateBoundElements } from \"./binding\";\nimport {\n TransformHandleType,\n MaybeTransformHandleType,\n TransformHandleDirection,\n} from \"./transformHandles\";\nimport { Point, PointerDownState } from \"../types\";\nimport Scene from \"../scene/Scene\";\nimport {\n getApproxMinLineHeight,\n getApproxMinLineWidth,\n getBoundTextElement,\n getBoundTextElementId,\n handleBindTextResize,\n measureText,\n} from \"./textElement\";\n\nexport const normalizeAngle = (angle: number): number => {\n if (angle >= 2 * Math.PI) {\n return angle - 2 * Math.PI;\n }\n return angle;\n};\n\n// Returns true when transform (resizing/rotation) happened\nexport const transformElements = (\n pointerDownState: PointerDownState,\n transformHandleType: MaybeTransformHandleType,\n selectedElements: readonly NonDeletedExcalidrawElement[],\n resizeArrowDirection: \"origin\" | \"end\",\n shouldRotateWithDiscreteAngle: boolean,\n shouldResizeFromCenter: boolean,\n shouldMaintainAspectRatio: boolean,\n pointerX: number,\n pointerY: number,\n centerX: number,\n centerY: number,\n) => {\n if (selectedElements.length === 1) {\n const [element] = selectedElements;\n if (transformHandleType === \"rotation\") {\n rotateSingleElement(\n element,\n pointerX,\n pointerY,\n shouldRotateWithDiscreteAngle,\n );\n updateBoundElements(element);\n } else if (\n isLinearElement(element) &&\n element.points.length === 2 &&\n (transformHandleType === \"nw\" ||\n transformHandleType === \"ne\" ||\n transformHandleType === \"sw\" ||\n transformHandleType === \"se\")\n ) {\n reshapeSingleTwoPointElement(\n element,\n resizeArrowDirection,\n shouldRotateWithDiscreteAngle,\n pointerX,\n pointerY,\n );\n } else if (\n isTextElement(element) &&\n (transformHandleType === \"nw\" ||\n transformHandleType === \"ne\" ||\n transformHandleType === \"sw\" ||\n transformHandleType === \"se\")\n ) {\n resizeSingleTextElement(\n element,\n transformHandleType,\n shouldResizeFromCenter,\n pointerX,\n pointerY,\n );\n updateBoundElements(element);\n } else if (transformHandleType) {\n resizeSingleElement(\n pointerDownState.originalElements,\n shouldMaintainAspectRatio,\n element,\n transformHandleType,\n shouldResizeFromCenter,\n pointerX,\n pointerY,\n );\n }\n\n return true;\n } else if (selectedElements.length > 1) {\n if (transformHandleType === \"rotation\") {\n rotateMultipleElements(\n pointerDownState,\n selectedElements,\n pointerX,\n pointerY,\n shouldRotateWithDiscreteAngle,\n centerX,\n centerY,\n );\n return true;\n } else if (\n transformHandleType === \"nw\" ||\n transformHandleType === \"ne\" ||\n transformHandleType === \"sw\" ||\n transformHandleType === \"se\"\n ) {\n resizeMultipleElements(\n selectedElements,\n transformHandleType,\n pointerX,\n pointerY,\n );\n return true;\n }\n }\n return false;\n};\n\nconst rotateSingleElement = (\n element: NonDeletedExcalidrawElement,\n pointerX: number,\n pointerY: number,\n shouldRotateWithDiscreteAngle: boolean,\n) => {\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n let angle = (5 * Math.PI) / 2 + Math.atan2(pointerY - cy, pointerX - cx);\n if (shouldRotateWithDiscreteAngle) {\n angle += SHIFT_LOCKING_ANGLE / 2;\n angle -= angle % SHIFT_LOCKING_ANGLE;\n }\n angle = normalizeAngle(angle);\n mutateElement(element, { angle });\n const boundTextElementId = getBoundTextElementId(element);\n if (boundTextElementId) {\n const textElement = Scene.getScene(element)!.getElement(boundTextElementId);\n mutateElement(textElement!, { angle });\n }\n};\n\n// used in DEV only\nconst validateTwoPointElementNormalized = (\n element: NonDeleted,\n) => {\n if (\n element.points.length !== 2 ||\n element.points[0][0] !== 0 ||\n element.points[0][1] !== 0 ||\n Math.abs(element.points[1][0]) !== element.width ||\n Math.abs(element.points[1][1]) !== element.height\n ) {\n throw new Error(\"Two-point element is not normalized\");\n }\n};\n\nconst getPerfectElementSizeWithRotation = (\n elementType: string,\n width: number,\n height: number,\n angle: number,\n): [number, number] => {\n const size = getPerfectElementSize(\n elementType,\n ...rotate(width, height, 0, 0, angle),\n );\n return rotate(size.width, size.height, 0, 0, -angle);\n};\n\nexport const reshapeSingleTwoPointElement = (\n element: NonDeleted,\n resizeArrowDirection: \"origin\" | \"end\",\n shouldRotateWithDiscreteAngle: boolean,\n pointerX: number,\n pointerY: number,\n) => {\n if (process.env.NODE_ENV !== \"production\") {\n validateTwoPointElementNormalized(element);\n }\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n // rotation pointer with reverse angle\n const [rotatedX, rotatedY] = rotate(\n pointerX,\n pointerY,\n cx,\n cy,\n -element.angle,\n );\n let [width, height] =\n resizeArrowDirection === \"end\"\n ? [rotatedX - element.x, rotatedY - element.y]\n : [\n element.x + element.points[1][0] - rotatedX,\n element.y + element.points[1][1] - rotatedY,\n ];\n if (shouldRotateWithDiscreteAngle) {\n [width, height] = getPerfectElementSizeWithRotation(\n element.type,\n width,\n height,\n element.angle,\n );\n }\n const [nextElementX, nextElementY] = adjustXYWithRotation(\n resizeArrowDirection === \"end\"\n ? { s: true, e: true }\n : { n: true, w: true },\n element.x,\n element.y,\n element.angle,\n 0,\n 0,\n (element.points[1][0] - width) / 2,\n (element.points[1][1] - height) / 2,\n );\n mutateElement(element, {\n x: nextElementX,\n y: nextElementY,\n points: [\n [0, 0],\n [width, height],\n ],\n });\n};\n\nconst rescalePointsInElement = (\n element: NonDeletedExcalidrawElement,\n width: number,\n height: number,\n) =>\n isLinearElement(element) || isFreeDrawElement(element)\n ? {\n points: rescalePoints(\n 0,\n width,\n rescalePoints(1, height, element.points),\n ),\n }\n : {};\n\nconst MIN_FONT_SIZE = 1;\n\nconst measureFontSizeFromWH = (\n element: NonDeleted,\n nextWidth: number,\n nextHeight: number,\n): { size: number; baseline: number } | null => {\n // We only use width to scale font on resize\n const nextFontSize = element.fontSize * (nextWidth / element.width);\n if (nextFontSize < MIN_FONT_SIZE) {\n return null;\n }\n const metrics = measureText(\n element.text,\n getFontString({ fontSize: nextFontSize, fontFamily: element.fontFamily }),\n element.containerId ? element.width : null,\n );\n return {\n size: nextFontSize,\n baseline: metrics.baseline + (nextHeight - metrics.height),\n };\n};\n\nconst getSidesForTransformHandle = (\n transformHandleType: TransformHandleType,\n shouldResizeFromCenter: boolean,\n) => {\n return {\n n:\n /^(n|ne|nw)$/.test(transformHandleType) ||\n (shouldResizeFromCenter && /^(s|se|sw)$/.test(transformHandleType)),\n s:\n /^(s|se|sw)$/.test(transformHandleType) ||\n (shouldResizeFromCenter && /^(n|ne|nw)$/.test(transformHandleType)),\n w:\n /^(w|nw|sw)$/.test(transformHandleType) ||\n (shouldResizeFromCenter && /^(e|ne|se)$/.test(transformHandleType)),\n e:\n /^(e|ne|se)$/.test(transformHandleType) ||\n (shouldResizeFromCenter && /^(w|nw|sw)$/.test(transformHandleType)),\n };\n};\n\nconst resizeSingleTextElement = (\n element: NonDeleted,\n transformHandleType: \"nw\" | \"ne\" | \"sw\" | \"se\",\n shouldResizeFromCenter: boolean,\n pointerX: number,\n pointerY: number,\n) => {\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n // rotation pointer with reverse angle\n const [rotatedX, rotatedY] = rotate(\n pointerX,\n pointerY,\n cx,\n cy,\n -element.angle,\n );\n let scale: number;\n switch (transformHandleType) {\n case \"se\":\n scale = Math.max(\n (rotatedX - x1) / (x2 - x1),\n (rotatedY - y1) / (y2 - y1),\n );\n break;\n case \"nw\":\n scale = Math.max(\n (x2 - rotatedX) / (x2 - x1),\n (y2 - rotatedY) / (y2 - y1),\n );\n break;\n case \"ne\":\n scale = Math.max(\n (rotatedX - x1) / (x2 - x1),\n (y2 - rotatedY) / (y2 - y1),\n );\n break;\n case \"sw\":\n scale = Math.max(\n (x2 - rotatedX) / (x2 - x1),\n (rotatedY - y1) / (y2 - y1),\n );\n break;\n }\n if (scale > 0) {\n const nextWidth = element.width * scale;\n const nextHeight = element.height * scale;\n const nextFont = measureFontSizeFromWH(element, nextWidth, nextHeight);\n if (nextFont === null) {\n return;\n }\n const [nextX1, nextY1, nextX2, nextY2] = getResizedElementAbsoluteCoords(\n element,\n nextWidth,\n nextHeight,\n );\n const deltaX1 = (x1 - nextX1) / 2;\n const deltaY1 = (y1 - nextY1) / 2;\n const deltaX2 = (x2 - nextX2) / 2;\n const deltaY2 = (y2 - nextY2) / 2;\n const [nextElementX, nextElementY] = adjustXYWithRotation(\n getSidesForTransformHandle(transformHandleType, shouldResizeFromCenter),\n element.x,\n element.y,\n element.angle,\n deltaX1,\n deltaY1,\n deltaX2,\n deltaY2,\n );\n mutateElement(element, {\n fontSize: nextFont.size,\n width: nextWidth,\n height: nextHeight,\n baseline: nextFont.baseline,\n x: nextElementX,\n y: nextElementY,\n });\n }\n};\n\nexport const resizeSingleElement = (\n originalElements: PointerDownState[\"originalElements\"],\n shouldMaintainAspectRatio: boolean,\n element: NonDeletedExcalidrawElement,\n transformHandleDirection: TransformHandleDirection,\n shouldResizeFromCenter: boolean,\n pointerX: number,\n pointerY: number,\n) => {\n const stateAtResizeStart = originalElements.get(element.id)!;\n // Gets bounds corners\n const [x1, y1, x2, y2] = getResizedElementAbsoluteCoords(\n stateAtResizeStart,\n stateAtResizeStart.width,\n stateAtResizeStart.height,\n );\n const startTopLeft: Point = [x1, y1];\n const startBottomRight: Point = [x2, y2];\n const startCenter: Point = centerPoint(startTopLeft, startBottomRight);\n\n // Calculate new dimensions based on cursor position\n const rotatedPointer = rotatePoint(\n [pointerX, pointerY],\n startCenter,\n -stateAtResizeStart.angle,\n );\n\n // Get bounds corners rendered on screen\n const [esx1, esy1, esx2, esy2] = getResizedElementAbsoluteCoords(\n element,\n element.width,\n element.height,\n );\n\n const boundsCurrentWidth = esx2 - esx1;\n const boundsCurrentHeight = esy2 - esy1;\n\n // It's important we set the initial scale value based on the width and height at resize start,\n // otherwise previous dimensions affected by modifiers will be taken into account.\n const atStartBoundsWidth = startBottomRight[0] - startTopLeft[0];\n const atStartBoundsHeight = startBottomRight[1] - startTopLeft[1];\n let scaleX = atStartBoundsWidth / boundsCurrentWidth;\n let scaleY = atStartBoundsHeight / boundsCurrentHeight;\n\n let boundTextFont: { fontSize?: number; baseline?: number } = {};\n const boundTextElement = getBoundTextElement(element);\n\n if (transformHandleDirection.includes(\"e\")) {\n scaleX = (rotatedPointer[0] - startTopLeft[0]) / boundsCurrentWidth;\n }\n if (transformHandleDirection.includes(\"s\")) {\n scaleY = (rotatedPointer[1] - startTopLeft[1]) / boundsCurrentHeight;\n }\n if (transformHandleDirection.includes(\"w\")) {\n scaleX = (startBottomRight[0] - rotatedPointer[0]) / boundsCurrentWidth;\n }\n if (transformHandleDirection.includes(\"n\")) {\n scaleY = (startBottomRight[1] - rotatedPointer[1]) / boundsCurrentHeight;\n }\n\n // Linear elements dimensions differ from bounds dimensions\n const eleInitialWidth = stateAtResizeStart.width;\n const eleInitialHeight = stateAtResizeStart.height;\n // We have to use dimensions of element on screen, otherwise the scaling of the\n // dimensions won't match the cursor for linear elements.\n let eleNewWidth = element.width * scaleX;\n let eleNewHeight = element.height * scaleY;\n\n // adjust dimensions for resizing from center\n if (shouldResizeFromCenter) {\n eleNewWidth = 2 * eleNewWidth - eleInitialWidth;\n eleNewHeight = 2 * eleNewHeight - eleInitialHeight;\n }\n\n // adjust dimensions to keep sides ratio\n if (shouldMaintainAspectRatio) {\n const widthRatio = Math.abs(eleNewWidth) / eleInitialWidth;\n const heightRatio = Math.abs(eleNewHeight) / eleInitialHeight;\n if (transformHandleDirection.length === 1) {\n eleNewHeight *= widthRatio;\n eleNewWidth *= heightRatio;\n }\n if (transformHandleDirection.length === 2) {\n const ratio = Math.max(widthRatio, heightRatio);\n eleNewWidth = eleInitialWidth * ratio * Math.sign(eleNewWidth);\n eleNewHeight = eleInitialHeight * ratio * Math.sign(eleNewHeight);\n }\n }\n\n if (boundTextElement) {\n const stateOfBoundTextElementAtResize = originalElements.get(\n boundTextElement.id,\n ) as typeof boundTextElement | undefined;\n if (stateOfBoundTextElementAtResize) {\n boundTextFont = {\n fontSize: stateOfBoundTextElementAtResize.fontSize,\n baseline: stateOfBoundTextElementAtResize.baseline,\n };\n }\n if (shouldMaintainAspectRatio) {\n const nextFont = measureFontSizeFromWH(\n boundTextElement,\n eleNewWidth - BOUND_TEXT_PADDING * 2,\n eleNewHeight - BOUND_TEXT_PADDING * 2,\n );\n if (nextFont === null) {\n return;\n }\n boundTextFont = {\n fontSize: nextFont.size,\n baseline: nextFont.baseline,\n };\n } else {\n const minWidth = getApproxMinLineWidth(getFontString(boundTextElement));\n const minHeight = getApproxMinLineHeight(getFontString(boundTextElement));\n eleNewWidth = Math.ceil(Math.max(eleNewWidth, minWidth));\n eleNewHeight = Math.ceil(Math.max(eleNewHeight, minHeight));\n }\n }\n\n const [newBoundsX1, newBoundsY1, newBoundsX2, newBoundsY2] =\n getResizedElementAbsoluteCoords(\n stateAtResizeStart,\n eleNewWidth,\n eleNewHeight,\n );\n const newBoundsWidth = newBoundsX2 - newBoundsX1;\n const newBoundsHeight = newBoundsY2 - newBoundsY1;\n\n // Calculate new topLeft based on fixed corner during resize\n let newTopLeft = [...startTopLeft] as [number, number];\n if ([\"n\", \"w\", \"nw\"].includes(transformHandleDirection)) {\n newTopLeft = [\n startBottomRight[0] - Math.abs(newBoundsWidth),\n startBottomRight[1] - Math.abs(newBoundsHeight),\n ];\n }\n if (transformHandleDirection === \"ne\") {\n const bottomLeft = [startTopLeft[0], startBottomRight[1]];\n newTopLeft = [bottomLeft[0], bottomLeft[1] - Math.abs(newBoundsHeight)];\n }\n if (transformHandleDirection === \"sw\") {\n const topRight = [startBottomRight[0], startTopLeft[1]];\n newTopLeft = [topRight[0] - Math.abs(newBoundsWidth), topRight[1]];\n }\n\n // Keeps opposite handle fixed during resize\n if (shouldMaintainAspectRatio) {\n if ([\"s\", \"n\"].includes(transformHandleDirection)) {\n newTopLeft[0] = startCenter[0] - newBoundsWidth / 2;\n }\n if ([\"e\", \"w\"].includes(transformHandleDirection)) {\n newTopLeft[1] = startCenter[1] - newBoundsHeight / 2;\n }\n }\n\n // Flip horizontally\n if (eleNewWidth < 0) {\n if (transformHandleDirection.includes(\"e\")) {\n newTopLeft[0] -= Math.abs(newBoundsWidth);\n }\n if (transformHandleDirection.includes(\"w\")) {\n newTopLeft[0] += Math.abs(newBoundsWidth);\n }\n }\n // Flip vertically\n if (eleNewHeight < 0) {\n if (transformHandleDirection.includes(\"s\")) {\n newTopLeft[1] -= Math.abs(newBoundsHeight);\n }\n if (transformHandleDirection.includes(\"n\")) {\n newTopLeft[1] += Math.abs(newBoundsHeight);\n }\n }\n\n if (shouldResizeFromCenter) {\n newTopLeft[0] = startCenter[0] - Math.abs(newBoundsWidth) / 2;\n newTopLeft[1] = startCenter[1] - Math.abs(newBoundsHeight) / 2;\n }\n\n // adjust topLeft to new rotation point\n const angle = stateAtResizeStart.angle;\n const rotatedTopLeft = rotatePoint(newTopLeft, startCenter, angle);\n const newCenter: Point = [\n newTopLeft[0] + Math.abs(newBoundsWidth) / 2,\n newTopLeft[1] + Math.abs(newBoundsHeight) / 2,\n ];\n const rotatedNewCenter = rotatePoint(newCenter, startCenter, angle);\n newTopLeft = rotatePoint(rotatedTopLeft, rotatedNewCenter, -angle);\n\n // Readjust points for linear elements\n const rescaledPoints = rescalePointsInElement(\n stateAtResizeStart,\n eleNewWidth,\n eleNewHeight,\n );\n // For linear elements (x,y) are the coordinates of the first drawn point not the top-left corner\n // So we need to readjust (x,y) to be where the first point should be\n const newOrigin = [...newTopLeft];\n newOrigin[0] += stateAtResizeStart.x - newBoundsX1;\n newOrigin[1] += stateAtResizeStart.y - newBoundsY1;\n\n const resizedElement = {\n width: Math.abs(eleNewWidth),\n height: Math.abs(eleNewHeight),\n x: newOrigin[0],\n y: newOrigin[1],\n ...rescaledPoints,\n };\n\n if (\"scale\" in element && \"scale\" in stateAtResizeStart) {\n mutateElement(element, {\n scale: [\n // defaulting because scaleX/Y can be 0/-0\n (Math.sign(scaleX) || stateAtResizeStart.scale[0]) *\n stateAtResizeStart.scale[0],\n (Math.sign(scaleY) || stateAtResizeStart.scale[1]) *\n stateAtResizeStart.scale[1],\n ],\n });\n }\n\n if (\n resizedElement.width !== 0 &&\n resizedElement.height !== 0 &&\n Number.isFinite(resizedElement.x) &&\n Number.isFinite(resizedElement.y)\n ) {\n updateBoundElements(element, {\n newSize: { width: resizedElement.width, height: resizedElement.height },\n });\n mutateElement(element, resizedElement);\n if (boundTextElement && boundTextFont) {\n mutateElement(boundTextElement, { fontSize: boundTextFont.fontSize });\n }\n handleBindTextResize(element, transformHandleDirection);\n }\n};\n\nconst resizeMultipleElements = (\n elements: readonly NonDeletedExcalidrawElement[],\n transformHandleType: \"nw\" | \"ne\" | \"sw\" | \"se\",\n pointerX: number,\n pointerY: number,\n) => {\n const [x1, y1, x2, y2] = getCommonBounds(elements);\n let scale: number;\n let getNextXY: (\n element: NonDeletedExcalidrawElement,\n origCoords: readonly [number, number, number, number],\n finalCoords: readonly [number, number, number, number],\n ) => { x: number; y: number };\n switch (transformHandleType) {\n case \"se\":\n scale = Math.max(\n (pointerX - x1) / (x2 - x1),\n (pointerY - y1) / (y2 - y1),\n );\n getNextXY = (element, [origX1, origY1], [finalX1, finalY1]) => {\n const x = element.x + (origX1 - x1) * (scale - 1) + origX1 - finalX1;\n const y = element.y + (origY1 - y1) * (scale - 1) + origY1 - finalY1;\n return { x, y };\n };\n break;\n case \"nw\":\n scale = Math.max(\n (x2 - pointerX) / (x2 - x1),\n (y2 - pointerY) / (y2 - y1),\n );\n getNextXY = (element, [, , origX2, origY2], [, , finalX2, finalY2]) => {\n const x = element.x - (x2 - origX2) * (scale - 1) + origX2 - finalX2;\n const y = element.y - (y2 - origY2) * (scale - 1) + origY2 - finalY2;\n return { x, y };\n };\n break;\n case \"ne\":\n scale = Math.max(\n (pointerX - x1) / (x2 - x1),\n (y2 - pointerY) / (y2 - y1),\n );\n getNextXY = (element, [origX1, , , origY2], [finalX1, , , finalY2]) => {\n const x = element.x + (origX1 - x1) * (scale - 1) + origX1 - finalX1;\n const y = element.y - (y2 - origY2) * (scale - 1) + origY2 - finalY2;\n return { x, y };\n };\n break;\n case \"sw\":\n scale = Math.max(\n (x2 - pointerX) / (x2 - x1),\n (pointerY - y1) / (y2 - y1),\n );\n getNextXY = (element, [, origY1, origX2], [, finalY1, finalX2]) => {\n const x = element.x - (x2 - origX2) * (scale - 1) + origX2 - finalX2;\n const y = element.y + (origY1 - y1) * (scale - 1) + origY1 - finalY1;\n return { x, y };\n };\n break;\n }\n if (scale > 0) {\n const updates = elements.reduce(\n (prev, element) => {\n if (!prev) {\n return prev;\n }\n const width = element.width * scale;\n const height = element.height * scale;\n const boundTextElement = getBoundTextElement(element);\n let font: { fontSize?: number; baseline?: number } = {};\n\n if (boundTextElement) {\n const nextFont = measureFontSizeFromWH(\n boundTextElement,\n width - BOUND_TEXT_PADDING * 2,\n height - BOUND_TEXT_PADDING * 2,\n );\n\n if (nextFont === null) {\n return null;\n }\n font = {\n fontSize: nextFont.size,\n baseline: nextFont.baseline,\n };\n }\n\n if (isTextElement(element)) {\n const nextFont = measureFontSizeFromWH(element, width, height);\n if (nextFont === null) {\n return null;\n }\n font = { fontSize: nextFont.size, baseline: nextFont.baseline };\n }\n const origCoords = getElementAbsoluteCoords(element);\n\n const rescaledPoints = rescalePointsInElement(element, width, height);\n\n updateBoundElements(element, {\n newSize: { width, height },\n simultaneouslyUpdated: elements,\n });\n\n const finalCoords = getResizedElementAbsoluteCoords(\n {\n ...element,\n ...rescaledPoints,\n },\n width,\n height,\n );\n\n const { x, y } = getNextXY(element, origCoords, finalCoords);\n return [...prev, { width, height, x, y, ...rescaledPoints, ...font }];\n },\n [] as\n | {\n width: number;\n height: number;\n x: number;\n y: number;\n points?: (readonly [number, number])[];\n fontSize?: number;\n baseline?: number;\n }[]\n | null,\n );\n if (updates) {\n elements.forEach((element, index) => {\n mutateElement(element, updates[index]);\n const boundTextElement = getBoundTextElement(element);\n\n if (boundTextElement) {\n mutateElement(boundTextElement, {\n fontSize: updates[index].fontSize,\n baseline: updates[index].baseline,\n });\n handleBindTextResize(element, transformHandleType);\n }\n });\n }\n }\n};\n\nconst rotateMultipleElements = (\n pointerDownState: PointerDownState,\n elements: readonly NonDeletedExcalidrawElement[],\n pointerX: number,\n pointerY: number,\n shouldRotateWithDiscreteAngle: boolean,\n centerX: number,\n centerY: number,\n) => {\n let centerAngle =\n (5 * Math.PI) / 2 + Math.atan2(pointerY - centerY, pointerX - centerX);\n if (shouldRotateWithDiscreteAngle) {\n centerAngle += SHIFT_LOCKING_ANGLE / 2;\n centerAngle -= centerAngle % SHIFT_LOCKING_ANGLE;\n }\n elements.forEach((element, index) => {\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const origAngle =\n pointerDownState.originalElements.get(element.id)?.angle ?? element.angle;\n const [rotatedCX, rotatedCY] = rotate(\n cx,\n cy,\n centerX,\n centerY,\n centerAngle + origAngle - element.angle,\n );\n mutateElement(element, {\n x: element.x + (rotatedCX - cx),\n y: element.y + (rotatedCY - cy),\n angle: normalizeAngle(centerAngle + origAngle),\n });\n const boundTextElementId = getBoundTextElementId(element);\n if (boundTextElementId) {\n const textElement =\n Scene.getScene(element)!.getElement(boundTextElementId)!;\n mutateElement(textElement, {\n x: textElement.x + (rotatedCX - cx),\n y: textElement.y + (rotatedCY - cy),\n angle: normalizeAngle(centerAngle + origAngle),\n });\n }\n });\n};\n\nexport const getResizeOffsetXY = (\n transformHandleType: MaybeTransformHandleType,\n selectedElements: NonDeletedExcalidrawElement[],\n x: number,\n y: number,\n): [number, number] => {\n const [x1, y1, x2, y2] =\n selectedElements.length === 1\n ? getElementAbsoluteCoords(selectedElements[0])\n : getCommonBounds(selectedElements);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const angle = selectedElements.length === 1 ? selectedElements[0].angle : 0;\n [x, y] = rotate(x, y, cx, cy, -angle);\n switch (transformHandleType) {\n case \"n\":\n return rotate(x - (x1 + x2) / 2, y - y1, 0, 0, angle);\n case \"s\":\n return rotate(x - (x1 + x2) / 2, y - y2, 0, 0, angle);\n case \"w\":\n return rotate(x - x1, y - (y1 + y2) / 2, 0, 0, angle);\n case \"e\":\n return rotate(x - x2, y - (y1 + y2) / 2, 0, 0, angle);\n case \"nw\":\n return rotate(x - x1, y - y1, 0, 0, angle);\n case \"ne\":\n return rotate(x - x2, y - y1, 0, 0, angle);\n case \"sw\":\n return rotate(x - x1, y - y2, 0, 0, angle);\n case \"se\":\n return rotate(x - x2, y - y2, 0, 0, angle);\n default:\n return [0, 0];\n }\n};\n\nexport const getResizeArrowDirection = (\n transformHandleType: MaybeTransformHandleType,\n element: NonDeleted,\n): \"origin\" | \"end\" => {\n const [, [px, py]] = element.points;\n const isResizeEnd =\n (transformHandleType === \"nw\" && (px < 0 || py < 0)) ||\n (transformHandleType === \"ne\" && px >= 0) ||\n (transformHandleType === \"sw\" && px <= 0) ||\n (transformHandleType === \"se\" && (px > 0 || py > 0));\n return isResizeEnd ? \"end\" : \"origin\";\n};\n","import { SHAPES } from \"../shapes\";\nimport { updateBoundElements } from \"./binding\";\nimport { getCommonBounds } from \"./bounds\";\nimport { mutateElement } from \"./mutateElement\";\nimport { getPerfectElementSize } from \"./sizeHelpers\";\nimport { NonDeletedExcalidrawElement } from \"./types\";\nimport { AppState, PointerDownState } from \"../types\";\nimport { getBoundTextElement } from \"./textElement\";\nimport { isSelectedViaGroup } from \"../groups\";\n\nexport const dragSelectedElements = (\n pointerDownState: PointerDownState,\n selectedElements: NonDeletedExcalidrawElement[],\n pointerX: number,\n pointerY: number,\n lockDirection: boolean = false,\n distanceX: number = 0,\n distanceY: number = 0,\n appState: AppState,\n) => {\n const [x1, y1] = getCommonBounds(selectedElements);\n const offset = { x: pointerX - x1, y: pointerY - y1 };\n selectedElements.forEach((element) => {\n updateElementCoords(\n lockDirection,\n distanceX,\n distanceY,\n pointerDownState,\n element,\n offset,\n );\n // update coords of bound text only if we're dragging the container directly\n // (we don't drag the group that it's part of)\n if (\n // container isn't part of any group\n // (perf optim so we don't check `isSelectedViaGroup()` in every case)\n !element.groupIds.length ||\n // container is part of a group, but we're dragging the container directly\n (appState.editingGroupId && !isSelectedViaGroup(appState, element))\n ) {\n const textElement = getBoundTextElement(element);\n if (textElement) {\n updateElementCoords(\n lockDirection,\n distanceX,\n distanceY,\n pointerDownState,\n textElement,\n offset,\n );\n }\n }\n updateBoundElements(element, {\n simultaneouslyUpdated: selectedElements,\n });\n });\n};\n\nconst updateElementCoords = (\n lockDirection: boolean,\n distanceX: number,\n distanceY: number,\n pointerDownState: PointerDownState,\n element: NonDeletedExcalidrawElement,\n offset: { x: number; y: number },\n) => {\n let x: number;\n let y: number;\n if (lockDirection) {\n const lockX = lockDirection && distanceX < distanceY;\n const lockY = lockDirection && distanceX > distanceY;\n const original = pointerDownState.originalElements.get(element.id);\n x = lockX && original ? original.x : element.x + offset.x;\n y = lockY && original ? original.y : element.y + offset.y;\n } else {\n x = element.x + offset.x;\n y = element.y + offset.y;\n }\n\n mutateElement(element, {\n x,\n y,\n });\n};\nexport const getDragOffsetXY = (\n selectedElements: NonDeletedExcalidrawElement[],\n x: number,\n y: number,\n): [number, number] => {\n const [x1, y1] = getCommonBounds(selectedElements);\n return [x - x1, y - y1];\n};\n\nexport const dragNewElement = (\n draggingElement: NonDeletedExcalidrawElement,\n elementType: typeof SHAPES[number][\"value\"],\n originX: number,\n originY: number,\n x: number,\n y: number,\n width: number,\n height: number,\n shouldMaintainAspectRatio: boolean,\n shouldResizeFromCenter: boolean,\n /** whether to keep given aspect ratio when `isResizeWithSidesSameLength` is\n true */\n widthAspectRatio?: number | null,\n) => {\n if (shouldMaintainAspectRatio) {\n if (widthAspectRatio) {\n height = width / widthAspectRatio;\n } else {\n ({ width, height } = getPerfectElementSize(\n elementType,\n width,\n y < originY ? -height : height,\n ));\n\n if (height < 0) {\n height = -height;\n }\n }\n }\n\n let newX = x < originX ? originX - width : originX;\n let newY = y < originY ? originY - height : originY;\n\n if (shouldResizeFromCenter) {\n width += width;\n height += height;\n newX = originX - width / 2;\n newY = originY - height / 2;\n }\n\n if (width !== 0 && height !== 0) {\n mutateElement(draggingElement, {\n x: newX,\n y: newY,\n width,\n height,\n });\n }\n};\n","import clsx from \"clsx\";\n\n// TODO: It might be \"clever\" to add option.icon to the existing component \nexport const ButtonIconSelect = ({\n options,\n value,\n onChange,\n group,\n}: {\n options: { value: T; text: string; icon: JSX.Element; testId?: string }[];\n value: T | null;\n onChange: (value: T) => void;\n group: string;\n}) => (\n
\n {options.map((option) => (\n \n onChange(option.value)}\n checked={value === option.value}\n data-testid={option.testId}\n />\n {option.icon}\n \n ))}\n
\n);\n","import React, { useLayoutEffect, useRef, useEffect } from \"react\";\nimport \"./Popover.scss\";\nimport { unstable_batchedUpdates } from \"react-dom\";\n\ntype Props = {\n top?: number;\n left?: number;\n children?: React.ReactNode;\n onCloseRequest?(event: PointerEvent): void;\n fitInViewport?: boolean;\n offsetLeft?: number;\n offsetTop?: number;\n viewportWidth?: number;\n viewportHeight?: number;\n};\n\nexport const Popover = ({\n children,\n left,\n top,\n onCloseRequest,\n fitInViewport = false,\n offsetLeft = 0,\n offsetTop = 0,\n viewportWidth = window.innerWidth,\n viewportHeight = window.innerHeight,\n}: Props) => {\n const popoverRef = useRef(null);\n\n // ensure the popover doesn't overflow the viewport\n useLayoutEffect(() => {\n if (fitInViewport && popoverRef.current) {\n const element = popoverRef.current;\n const { x, y, width, height } = element.getBoundingClientRect();\n if (x + width - offsetLeft > viewportWidth) {\n element.style.left = `${viewportWidth - width}px`;\n }\n if (y + height - offsetTop > viewportHeight) {\n element.style.top = `${viewportHeight - height}px`;\n }\n }\n }, [fitInViewport, viewportWidth, viewportHeight, offsetLeft, offsetTop]);\n\n useEffect(() => {\n if (onCloseRequest) {\n const handler = (event: PointerEvent) => {\n if (!popoverRef.current?.contains(event.target as Node)) {\n unstable_batchedUpdates(() => onCloseRequest(event));\n }\n };\n document.addEventListener(\"pointerdown\", handler, false);\n return () => document.removeEventListener(\"pointerdown\", handler, false);\n }\n }, [onCloseRequest]);\n\n return (\n
\n {children}\n
\n );\n};\n","import React from \"react\";\nimport { Popover } from \"./Popover\";\nimport { isTransparent } from \"../utils\";\n\nimport \"./ColorPicker.scss\";\nimport { isArrowKey, KEYS } from \"../keys\";\nimport { t, getLanguage } from \"../i18n\";\nimport { isWritableElement } from \"../utils\";\nimport colors from \"../colors\";\nimport { ExcalidrawElement } from \"../element/types\";\nimport { AppState } from \"../types\";\n\nconst MAX_CUSTOM_COLORS = 5;\nconst MAX_DEFAULT_COLORS = 15;\n\nexport const getCustomColors = (\n elements: readonly ExcalidrawElement[],\n type: \"elementBackground\" | \"elementStroke\",\n) => {\n const customColors: string[] = [];\n const updatedElements = elements\n .filter((element) => !element.isDeleted)\n .sort((ele1, ele2) => ele2.updated - ele1.updated);\n\n let index = 0;\n const elementColorTypeMap = {\n elementBackground: \"backgroundColor\",\n elementStroke: \"strokeColor\",\n };\n const colorType = elementColorTypeMap[type] as\n | \"backgroundColor\"\n | \"strokeColor\";\n while (\n index < updatedElements.length &&\n customColors.length < MAX_CUSTOM_COLORS\n ) {\n const element = updatedElements[index];\n\n if (\n customColors.length < MAX_CUSTOM_COLORS &&\n isCustomColor(element[colorType], type) &&\n !customColors.includes(element[colorType])\n ) {\n customColors.push(element[colorType]);\n }\n index++;\n }\n return customColors;\n};\n\nconst isCustomColor = (\n color: string,\n type: \"elementBackground\" | \"elementStroke\",\n) => {\n return !colors[type].includes(color);\n};\n\nconst isValidColor = (color: string) => {\n const style = new Option().style;\n style.color = color;\n return !!style.color;\n};\n\nconst getColor = (color: string): string | null => {\n if (isTransparent(color)) {\n return color;\n }\n\n return isValidColor(color)\n ? color\n : isValidColor(`#${color}`)\n ? `#${color}`\n : null;\n};\n\n// This is a narrow reimplementation of the awesome react-color Twitter component\n// https://github.com/casesandberg/react-color/blob/master/src/components/twitter/Twitter.js\n\n// Unfortunately, we can't detect keyboard layout in the browser. So this will\n// only work well for QWERTY but not AZERTY or others...\nconst keyBindings = [\n [\"1\", \"2\", \"3\", \"4\", \"5\"],\n [\"q\", \"w\", \"e\", \"r\", \"t\"],\n [\"a\", \"s\", \"d\", \"f\", \"g\"],\n [\"z\", \"x\", \"c\", \"v\", \"b\"],\n].flat();\n\nconst Picker = ({\n colors,\n color,\n onChange,\n onClose,\n label,\n showInput = true,\n type,\n elements,\n}: {\n colors: string[];\n color: string | null;\n onChange: (color: string) => void;\n onClose: () => void;\n label: string;\n showInput: boolean;\n type: \"canvasBackground\" | \"elementBackground\" | \"elementStroke\";\n elements: readonly ExcalidrawElement[];\n}) => {\n const firstItem = React.useRef();\n const activeItem = React.useRef();\n const gallery = React.useRef();\n const colorInput = React.useRef();\n\n const [customColors] = React.useState(() => {\n if (type === \"canvasBackground\") {\n return [];\n }\n return getCustomColors(elements, type);\n });\n\n React.useEffect(() => {\n // After the component is first mounted focus on first input\n if (activeItem.current) {\n activeItem.current.focus();\n } else if (colorInput.current) {\n colorInput.current.focus();\n } else if (gallery.current) {\n gallery.current.focus();\n }\n }, []);\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === KEYS.TAB) {\n const { activeElement } = document;\n if (event.shiftKey) {\n if (activeElement === firstItem.current) {\n colorInput.current?.focus();\n event.preventDefault();\n }\n } else if (activeElement === colorInput.current) {\n firstItem.current?.focus();\n event.preventDefault();\n }\n } else if (isArrowKey(event.key)) {\n const { activeElement } = document;\n const isRTL = getLanguage().rtl;\n let isCustom = false;\n let index = Array.prototype.indexOf.call(\n gallery!.current!.querySelector(\".color-picker-content--default\")!\n .children,\n activeElement,\n );\n if (index === -1) {\n index = Array.prototype.indexOf.call(\n gallery!.current!.querySelector(\n \".color-picker-content--canvas-colors\",\n )!.children,\n activeElement,\n );\n if (index !== -1) {\n isCustom = true;\n }\n }\n const parentSelector = isCustom\n ? gallery!.current!.querySelector(\n \".color-picker-content--canvas-colors\",\n )!\n : gallery!.current!.querySelector(\".color-picker-content--default\")!;\n\n if (index !== -1) {\n const length = parentSelector!.children.length - (showInput ? 1 : 0);\n const nextIndex =\n event.key === (isRTL ? KEYS.ARROW_LEFT : KEYS.ARROW_RIGHT)\n ? (index + 1) % length\n : event.key === (isRTL ? KEYS.ARROW_RIGHT : KEYS.ARROW_LEFT)\n ? (length + index - 1) % length\n : !isCustom && event.key === KEYS.ARROW_DOWN\n ? (index + 5) % length\n : !isCustom && event.key === KEYS.ARROW_UP\n ? (length + index - 5) % length\n : index;\n (parentSelector!.children![nextIndex] as HTMLElement)?.focus();\n }\n event.preventDefault();\n } else if (\n keyBindings.includes(event.key.toLowerCase()) &&\n !isWritableElement(event.target)\n ) {\n const index = keyBindings.indexOf(event.key.toLowerCase());\n const isCustom = index >= MAX_DEFAULT_COLORS;\n const parentSelector = isCustom\n ? gallery!.current!.querySelector(\n \".color-picker-content--canvas-colors\",\n )!\n : gallery!.current!.querySelector(\".color-picker-content--default\")!;\n const actualIndex = isCustom ? index - MAX_DEFAULT_COLORS : index;\n (parentSelector!.children![actualIndex] as HTMLElement)?.focus();\n\n event.preventDefault();\n } else if (event.key === KEYS.ESCAPE || event.key === KEYS.ENTER) {\n event.preventDefault();\n onClose();\n }\n event.nativeEvent.stopImmediatePropagation();\n event.stopPropagation();\n };\n\n const renderColors = (colors: Array, custom: boolean = false) => {\n return colors.map((_color, i) => {\n const _colorWithoutHash = _color.replace(\"#\", \"\");\n const keyBinding = custom\n ? keyBindings[i + MAX_DEFAULT_COLORS]\n : keyBindings[i];\n const label = custom\n ? _colorWithoutHash\n : t(`colors.${_colorWithoutHash}`);\n return (\n {\n (event.currentTarget as HTMLButtonElement).focus();\n onChange(_color);\n }}\n title={`${label}${\n !isTransparent(_color) ? ` (${_color})` : \"\"\n } — ${keyBinding.toUpperCase()}`}\n aria-label={label}\n aria-keyshortcuts={keyBindings[i]}\n style={{ color: _color }}\n key={_color}\n ref={(el) => {\n if (!custom && el && i === 0) {\n firstItem.current = el;\n }\n if (el && _color === color) {\n activeItem.current = el;\n }\n }}\n onFocus={() => {\n onChange(_color);\n }}\n >\n {isTransparent(_color) ? (\n
\n ) : undefined}\n {keyBinding}\n \n );\n });\n };\n\n return (\n \n
\n
\n {\n if (el) {\n gallery.current = el;\n }\n }}\n tabIndex={0}\n >\n
\n {renderColors(colors)}\n
\n {!!customColors.length && (\n
\n \n {t(\"labels.canvasColors\")}\n \n
\n {renderColors(customColors, true)}\n
\n
\n )}\n\n {showInput && (\n {\n onChange(color);\n }}\n ref={colorInput}\n />\n )}\n \n \n );\n};\n\nconst ColorInput = React.forwardRef(\n (\n {\n color,\n onChange,\n label,\n }: {\n color: string | null;\n onChange: (color: string) => void;\n label: string;\n },\n ref,\n ) => {\n const [innerValue, setInnerValue] = React.useState(color);\n const inputRef = React.useRef(null);\n\n React.useEffect(() => {\n setInnerValue(color);\n }, [color]);\n\n React.useImperativeHandle(ref, () => inputRef.current);\n\n const changeColor = React.useCallback(\n (inputValue: string) => {\n const value = inputValue.toLowerCase();\n const color = getColor(value);\n if (color) {\n onChange(color);\n }\n setInnerValue(value);\n },\n [onChange],\n );\n\n return (\n \n );\n },\n);\n\nexport const ColorPicker = ({\n type,\n color,\n onChange,\n label,\n isActive,\n setActive,\n elements,\n appState,\n}: {\n type: \"canvasBackground\" | \"elementBackground\" | \"elementStroke\";\n color: string | null;\n onChange: (color: string) => void;\n label: string;\n isActive: boolean;\n setActive: (active: boolean) => void;\n elements: readonly ExcalidrawElement[];\n appState: AppState;\n}) => {\n const pickerButton = React.useRef(null);\n\n return (\n
\n
\n setActive(!isActive)}\n ref={pickerButton}\n />\n {\n onChange(color);\n }}\n />\n
\n \n {isActive ? (\n \n event.target !== pickerButton.current && setActive(false)\n }\n >\n {\n onChange(changedColor);\n }}\n onClose={() => {\n setActive(false);\n pickerButton.current?.focus();\n }}\n label={label}\n showInput={false}\n type={type}\n elements={elements}\n />\n \n ) : null}\n \n
\n );\n};\n","import React from \"react\";\nimport { Popover } from \"./Popover\";\n\nimport \"./IconPicker.scss\";\nimport { isArrowKey, KEYS } from \"../keys\";\nimport { getLanguage } from \"../i18n\";\n\nfunction Picker({\n options,\n value,\n label,\n onChange,\n onClose,\n}: {\n label: string;\n value: T;\n options: { value: T; text: string; icon: JSX.Element; keyBinding: string }[];\n onChange: (value: T) => void;\n onClose: () => void;\n}) {\n const rFirstItem = React.useRef();\n const rActiveItem = React.useRef();\n const rGallery = React.useRef(null);\n\n React.useEffect(() => {\n // After the component is first mounted focus on first input\n if (rActiveItem.current) {\n rActiveItem.current.focus();\n } else if (rGallery.current) {\n rGallery.current.focus();\n }\n }, []);\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n const pressedOption = options.find(\n (option) => option.keyBinding === event.key.toLowerCase(),\n )!;\n\n if (!(event.metaKey || event.altKey || event.ctrlKey) && pressedOption) {\n // Keybinding navigation\n const index = options.indexOf(pressedOption);\n (rGallery!.current!.children![index] as any).focus();\n event.preventDefault();\n } else if (event.key === KEYS.TAB) {\n // Tab navigation cycle through options. If the user tabs\n // away from the picker, close the picker. We need to use\n // a timeout here to let the stack clear before checking.\n setTimeout(() => {\n const active = rActiveItem.current;\n const docActive = document.activeElement;\n if (active !== docActive) {\n onClose();\n }\n }, 0);\n } else if (isArrowKey(event.key)) {\n // Arrow navigation\n const { activeElement } = document;\n const isRTL = getLanguage().rtl;\n const index = Array.prototype.indexOf.call(\n rGallery!.current!.children,\n activeElement,\n );\n if (index !== -1) {\n const length = options.length;\n let nextIndex = index;\n\n switch (event.key) {\n // Select the next option\n case isRTL ? KEYS.ARROW_LEFT : KEYS.ARROW_RIGHT:\n case KEYS.ARROW_DOWN: {\n nextIndex = (index + 1) % length;\n break;\n }\n // Select the previous option\n case isRTL ? KEYS.ARROW_RIGHT : KEYS.ARROW_LEFT:\n case KEYS.ARROW_UP: {\n nextIndex = (length + index - 1) % length;\n break;\n }\n }\n\n (rGallery.current!.children![nextIndex] as any).focus();\n }\n event.preventDefault();\n } else if (event.key === KEYS.ESCAPE || event.key === KEYS.ENTER) {\n // Close on escape or enter\n event.preventDefault();\n onClose();\n }\n event.nativeEvent.stopImmediatePropagation();\n event.stopPropagation();\n };\n\n return (\n \n
\n {options.map((option, i) => (\n {\n (event.currentTarget as HTMLButtonElement).focus();\n onChange(option.value);\n }}\n title={`${option.text} — ${option.keyBinding.toUpperCase()}`}\n aria-label={option.text || \"none\"}\n aria-keyshortcuts={option.keyBinding}\n key={option.text}\n ref={(el) => {\n if (el && i === 0) {\n rFirstItem.current = el;\n }\n if (el && option.value === value) {\n rActiveItem.current = el;\n }\n }}\n onFocus={() => {\n onChange(option.value);\n }}\n >\n {option.icon}\n {option.keyBinding}\n \n ))}\n
\n \n );\n}\n\nexport function IconPicker({\n value,\n label,\n options,\n onChange,\n group = \"\",\n}: {\n label: string;\n value: T;\n options: { value: T; text: string; icon: JSX.Element; keyBinding: string }[];\n onChange: (value: T) => void;\n group?: string;\n}) {\n const [isActive, setActive] = React.useState(false);\n const rPickerButton = React.useRef(null);\n const isRTL = getLanguage().rtl;\n\n return (\n \n );\n};\n","import React from \"react\";\nimport { t } from \"../i18n\";\nimport { useExcalidrawContainer } from \"./App\";\n\ninterface SectionProps extends React.HTMLProps {\n heading: string;\n children: React.ReactNode | ((header: React.ReactNode) => React.ReactNode);\n}\n\nexport const Section = ({ heading, children, ...props }: SectionProps) => {\n const { id } = useExcalidrawContainer();\n const header = (\n

\n {t(`headings.${heading}`)}\n

\n );\n return (\n
\n {typeof children === \"function\" ? (\n children(header)\n ) : (\n <>\n {header}\n {children}\n \n )}\n
\n );\n};\n","import \"./UserList.scss\";\n\nimport React from \"react\";\nimport clsx from \"clsx\";\n\ntype UserListProps = {\n children: React.ReactNode;\n className?: string;\n mobile?: boolean;\n};\n\nexport const UserList = ({ children, className, mobile }: UserListProps) => {\n return (\n
\n {children}\n
\n );\n};\n","import React from \"react\";\nimport clsx from \"clsx\";\nimport { t } from \"../i18n\";\nimport { AppState } from \"../types\";\nimport { capitalizeString } from \"../utils\";\n\nconst LIBRARY_ICON = (\n \n \n \n);\n\nexport const LibraryButton: React.FC<{\n appState: AppState;\n setAppState: React.Component[\"setState\"];\n isMobile?: boolean;\n}> = ({ appState, setAppState, isMobile }) => {\n return (\n \n {\n setAppState({ isLibraryOpen: event.target.checked });\n }}\n checked={appState.isLibraryOpen}\n aria-label={capitalizeString(t(\"toolBar.library\"))}\n aria-keyshortcuts=\"0\"\n />\n
{LIBRARY_ICON}
\n \n );\n};\n","import \"./ToolIcon.scss\";\n\nimport clsx from \"clsx\";\nimport { ToolButtonSize } from \"./ToolButton\";\n\ntype PenModeIconProps = {\n title?: string;\n name?: string;\n checked: boolean;\n onChange?(): void;\n zenModeEnabled?: boolean;\n isMobile?: boolean;\n penDetected: boolean;\n};\n\nconst DEFAULT_SIZE: ToolButtonSize = \"medium\";\n\nconst ICONS = {\n CHECKED: (\n \n \n \n \n \n \n ),\n UNCHECKED: (\n \n \n \n \n \n \n ),\n};\n\nexport const PenModeButton = (props: PenModeIconProps) => {\n if (!props.penDetected) {\n if (props.isMobile) {\n return null;\n }\n return (\n \n
\n \n );\n }\n return (\n \n \n
\n {props.checked ? ICONS.CHECKED : ICONS.UNCHECKED}\n
\n \n );\n};\n","import React from \"react\";\nimport { AppState } from \"../types\";\nimport { ActionManager } from \"../actions/manager\";\nimport { t } from \"../i18n\";\nimport Stack from \"./Stack\";\nimport { showSelectedShapeActions } from \"../element\";\nimport { NonDeletedExcalidrawElement } from \"../element/types\";\nimport { FixedSideContainer } from \"./FixedSideContainer\";\nimport { Island } from \"./Island\";\nimport { HintViewer } from \"./HintViewer\";\nimport { calculateScrollCenter } from \"../scene\";\nimport { SelectedShapeActions, ShapesSwitcher } from \"./Actions\";\nimport { Section } from \"./Section\";\nimport CollabButton from \"./CollabButton\";\nimport { SCROLLBAR_WIDTH, SCROLLBAR_MARGIN } from \"../scene/scrollbars\";\nimport { LockButton } from \"./LockButton\";\nimport { UserList } from \"./UserList\";\nimport { BackgroundPickerAndDarkModeToggle } from \"./BackgroundPickerAndDarkModeToggle\";\nimport { LibraryButton } from \"./LibraryButton\";\nimport { PenModeButton } from \"./PenModeButton\";\n\ntype MobileMenuProps = {\n appState: AppState;\n actionManager: ActionManager;\n renderJSONExportDialog: () => React.ReactNode;\n renderImageExportDialog: () => React.ReactNode;\n setAppState: React.Component[\"setState\"];\n elements: readonly NonDeletedExcalidrawElement[];\n libraryMenu: JSX.Element | null;\n onCollabButtonClick?: () => void;\n onLockToggle: () => void;\n onPenModeToggle: () => void;\n canvas: HTMLCanvasElement | null;\n isCollaborating: boolean;\n renderCustomFooter?: (isMobile: boolean, appState: AppState) => JSX.Element;\n viewModeEnabled: boolean;\n showThemeBtn: boolean;\n onImageAction: (data: { insertOnCanvasDirectly: boolean }) => void;\n renderTopRightUI?: (\n isMobile: boolean,\n appState: AppState,\n ) => JSX.Element | null;\n};\n\nexport const MobileMenu = ({\n appState,\n elements,\n libraryMenu,\n actionManager,\n renderJSONExportDialog,\n renderImageExportDialog,\n setAppState,\n onCollabButtonClick,\n onLockToggle,\n onPenModeToggle,\n canvas,\n isCollaborating,\n renderCustomFooter,\n viewModeEnabled,\n showThemeBtn,\n onImageAction,\n renderTopRightUI,\n}: MobileMenuProps) => {\n const renderToolbar = () => {\n return (\n \n
\n {(heading) => (\n \n \n \n {heading}\n \n {\n onImageAction({\n insertOnCanvasDirectly: pointerType !== \"mouse\",\n });\n }}\n />\n \n \n {renderTopRightUI && renderTopRightUI(true, appState)}\n \n \n \n \n {libraryMenu}\n \n )}\n
\n \n
\n );\n };\n\n const renderAppToolbar = () => {\n if (viewModeEnabled) {\n return (\n
\n {actionManager.renderAction(\"toggleCanvasMenu\")}\n
\n );\n }\n return (\n
\n {actionManager.renderAction(\"toggleCanvasMenu\")}\n {actionManager.renderAction(\"toggleEditMenu\")}\n {actionManager.renderAction(\"undo\")}\n {actionManager.renderAction(\"redo\")}\n {actionManager.renderAction(\n appState.multiElement ? \"finalize\" : \"duplicateSelection\",\n )}\n {actionManager.renderAction(\"deleteSelectedElements\")}\n
\n );\n };\n\n const renderCanvasActions = () => {\n if (viewModeEnabled) {\n return (\n <>\n {renderJSONExportDialog()}\n {renderImageExportDialog()}\n \n );\n }\n return (\n <>\n {actionManager.renderAction(\"clearCanvas\")}\n {actionManager.renderAction(\"loadScene\")}\n {renderJSONExportDialog()}\n {renderImageExportDialog()}\n {onCollabButtonClick && (\n \n )}\n {\n \n }\n \n );\n };\n return (\n <>\n {!viewModeEnabled && renderToolbar()}\n \n \n {appState.openMenu === \"canvas\" ? (\n
\n
\n \n {renderCanvasActions()}\n {renderCustomFooter?.(true, appState)}\n {appState.collaborators.size > 0 && (\n
\n {t(\"labels.collaborators\")}\n \n {Array.from(appState.collaborators)\n // Collaborator is either not initialized or is actually the current user.\n .filter(\n ([_, client]) => Object.keys(client).length !== 0,\n )\n .map(([clientId, client]) => (\n \n {actionManager.renderAction(\"goToCollaborator\", {\n id: clientId,\n })}\n \n ))}\n \n
\n )}\n
\n
\n
\n ) : appState.openMenu === \"shape\" &&\n !viewModeEnabled &&\n showSelectedShapeActions(appState, elements) ? (\n
\n \n
\n ) : null}\n
\n {renderAppToolbar()}\n {appState.scrolledOutside && !appState.openMenu && (\n {\n setAppState({\n ...calculateScrollCenter(elements, appState, canvas),\n });\n }}\n >\n {t(\"buttons.scrollBackToContent\")}\n \n )}\n
\n
\n
\n \n );\n};\n","import oc from \"open-color\";\nimport React, { useLayoutEffect, useRef, useState } from \"react\";\nimport { trackEvent } from \"../analytics\";\nimport { ChartElements, renderSpreadsheet, Spreadsheet } from \"../charts\";\nimport { ChartType } from \"../element/types\";\nimport { t } from \"../i18n\";\nimport { exportToSvg } from \"../scene/export\";\nimport { AppState, LibraryItem } from \"../types\";\nimport { Dialog } from \"./Dialog\";\nimport \"./PasteChartDialog.scss\";\n\ntype OnInsertChart = (chartType: ChartType, elements: ChartElements) => void;\n\nconst ChartPreviewBtn = (props: {\n spreadsheet: Spreadsheet | null;\n chartType: ChartType;\n selected: boolean;\n onClick: OnInsertChart;\n}) => {\n const previewRef = useRef(null);\n const [chartElements, setChartElements] = useState(\n null,\n );\n\n useLayoutEffect(() => {\n if (!props.spreadsheet) {\n return;\n }\n\n const elements = renderSpreadsheet(\n props.chartType,\n props.spreadsheet,\n 0,\n 0,\n );\n setChartElements(elements);\n let svg: SVGSVGElement;\n const previewNode = previewRef.current!;\n\n (async () => {\n svg = await exportToSvg(\n elements,\n {\n exportBackground: false,\n viewBackgroundColor: oc.white,\n },\n null, // files\n );\n\n previewNode.appendChild(svg);\n\n if (props.selected) {\n (previewNode.parentNode as HTMLDivElement).focus();\n }\n })();\n\n return () => {\n previewNode.removeChild(svg);\n };\n }, [props.spreadsheet, props.chartType, props.selected]);\n\n return (\n {\n if (chartElements) {\n props.onClick(props.chartType, chartElements);\n }\n }}\n >\n
\n \n );\n};\n\nexport const PasteChartDialog = ({\n setAppState,\n appState,\n onClose,\n onInsertChart,\n}: {\n appState: AppState;\n onClose: () => void;\n setAppState: React.Component[\"setState\"];\n onInsertChart: (elements: LibraryItem[\"elements\"]) => void;\n}) => {\n const handleClose = React.useCallback(() => {\n if (onClose) {\n onClose();\n }\n }, [onClose]);\n\n const handleChartClick = (chartType: ChartType, elements: ChartElements) => {\n onInsertChart(elements);\n trackEvent(\"magic\", \"chart\", chartType);\n setAppState({\n currentChartType: chartType,\n pasteDialog: {\n shown: false,\n data: null,\n },\n });\n };\n\n return (\n \n
\n \n \n
\n \n );\n};\n","import React from \"react\";\nimport { t } from \"../i18n\";\nimport { isDarwin, isWindows } from \"../keys\";\nimport { Dialog } from \"./Dialog\";\nimport { getShortcutKey } from \"../utils\";\nimport \"./HelpDialog.scss\";\n\nconst Header = () => (\n
\n \n {t(\"helpDialog.documentation\")}\n \n \n {t(\"helpDialog.blog\")}\n \n \n {t(\"helpDialog.github\")}\n \n
\n);\n\nconst Section = (props: { title: string; children: React.ReactNode }) => (\n <>\n

{props.title}

\n {props.children}\n \n);\n\nconst Columns = (props: { children: React.ReactNode }) => (\n \n {props.children}\n
\n);\n\nconst Column = (props: { children: React.ReactNode }) => (\n
{props.children}
\n);\n\nconst ShortcutIsland = (props: {\n caption: string;\n children: React.ReactNode;\n}) => (\n
\n

{props.caption}

\n {props.children}\n
\n);\n\nconst Shortcut = (props: {\n label: string;\n shortcuts: string[];\n isOr: boolean;\n}) => {\n return (\n
\n \n \n {props.label}\n
\n \n {props.shortcuts.map((shortcut, index) => (\n \n {shortcut}\n {props.isOr &&\n index !== props.shortcuts.length - 1 &&\n t(\"helpDialog.or\")}\n \n ))}\n \n \n \n );\n};\n\nShortcut.defaultProps = {\n isOr: true,\n};\n\nconst ShortcutKey = (props: { children: React.ReactNode }) => (\n \n);\n\nexport const HelpDialog = ({ onClose }: { onClose?: () => void }) => {\n const handleClose = React.useCallback(() => {\n if (onClose) {\n onClose();\n }\n }, [onClose]);\n\n return (\n <>\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \")]}\n />\n \n \n \n
\n \n \n );\n};\n","// time constants (ms)\nexport const SAVE_TO_LOCAL_STORAGE_TIMEOUT = 300;\nexport const INITIAL_SCENE_UPDATE_TIMEOUT = 5000;\nexport const FILE_UPLOAD_TIMEOUT = 300;\nexport const LOAD_IMAGES_TIMEOUT = 500;\nexport const SYNC_FULL_SCENE_INTERVAL_MS = 20000;\nexport const SYNC_BROWSER_TABS_TIMEOUT = 50;\n\nexport const FILE_UPLOAD_MAX_BYTES = 3 * 1024 * 1024; // 3 MiB\n// 1 year (https://stackoverflow.com/a/25201898/927631)\nexport const FILE_CACHE_MAX_AGE_SEC = 31536000;\n\nexport const BROADCAST = {\n SERVER_VOLATILE: \"server-volatile-broadcast\",\n SERVER: \"server-broadcast\",\n};\n\nexport enum SCENE {\n INIT = \"SCENE_INIT\",\n UPDATE = \"SCENE_UPDATE\",\n}\n\nexport const FIREBASE_STORAGE_PREFIXES = {\n shareLinkFiles: `/files/shareLinks`,\n collabFiles: `/files/rooms`,\n};\n\nexport const ROOM_ID_BYTES = 10;\n\nexport const STORAGE_KEYS = {\n LOCAL_STORAGE_ELEMENTS: \"excalidraw\",\n LOCAL_STORAGE_APP_STATE: \"excalidraw-state\",\n LOCAL_STORAGE_COLLAB: \"excalidraw-collab\",\n LOCAL_STORAGE_KEY_COLLAB_FORCE_FLAG: \"collabLinkForceLoadFlag\",\n LOCAL_STORAGE_LIBRARY: \"excalidraw-library\",\n VERSION_DATA_STATE: \"version-dataState\",\n VERSION_FILES: \"version-files\",\n} as const;\n","import OpenColor from \"open-color\";\n\nimport \"./Card.scss\";\n\nexport const Card: React.FC<{\n color: keyof OpenColor | \"primary\";\n}> = ({ children, color }) => {\n return (\n \n {children}\n \n );\n};\n","import React, { useState } from \"react\";\nimport { ActionsManagerInterface } from \"../actions/types\";\nimport { NonDeletedExcalidrawElement } from \"../element/types\";\nimport { t } from \"../i18n\";\nimport { useIsMobile } from \"./App\";\nimport { AppState, ExportOpts, BinaryFiles } from \"../types\";\nimport { Dialog } from \"./Dialog\";\nimport { exportFile, exportToFileIcon, link } from \"./icons\";\nimport { ToolButton } from \"./ToolButton\";\nimport { actionSaveFileToDisk } from \"../actions/actionExport\";\nimport { Card } from \"./Card\";\n\nimport \"./ExportDialog.scss\";\nimport { nativeFileSystemSupported } from \"../data/filesystem\";\n\nexport type ExportCB = (\n elements: readonly NonDeletedExcalidrawElement[],\n scale?: number,\n) => void;\n\nconst JSONExportModal = ({\n elements,\n appState,\n files,\n actionManager,\n exportOpts,\n canvas,\n}: {\n appState: AppState;\n files: BinaryFiles;\n elements: readonly NonDeletedExcalidrawElement[];\n actionManager: ActionsManagerInterface;\n onCloseRequest: () => void;\n exportOpts: ExportOpts;\n canvas: HTMLCanvasElement | null;\n}) => {\n const { onExportToBackend } = exportOpts;\n return (\n
\n
\n {exportOpts.saveFileToDisk && (\n \n
{exportToFileIcon}
\n

{t(\"exportDialog.disk_title\")}

\n
\n {t(\"exportDialog.disk_details\")}\n {!nativeFileSystemSupported &&\n actionManager.renderAction(\"changeProjectName\")}\n
\n {\n actionManager.executeAction(actionSaveFileToDisk);\n }}\n />\n
\n )}\n {onExportToBackend && (\n \n
{link}
\n

{t(\"exportDialog.link_title\")}

\n
{t(\"exportDialog.link_details\")}
\n \n onExportToBackend(elements, appState, files, canvas)\n }\n />\n
\n )}\n {exportOpts.renderCustomUI &&\n exportOpts.renderCustomUI(elements, appState, files, canvas)}\n
\n
\n );\n};\n\nexport const JSONExportDialog = ({\n elements,\n appState,\n files,\n actionManager,\n exportOpts,\n canvas,\n}: {\n elements: readonly NonDeletedExcalidrawElement[];\n appState: AppState;\n files: BinaryFiles;\n actionManager: ActionsManagerInterface;\n exportOpts: ExportOpts;\n canvas: HTMLCanvasElement | null;\n}) => {\n const [modalIsShown, setModalIsShown] = useState(false);\n\n const handleClose = React.useCallback(() => {\n setModalIsShown(false);\n }, []);\n\n return (\n <>\n {\n setModalIsShown(true);\n }}\n data-testid=\"json-export-button\"\n icon={exportFile}\n type=\"button\"\n aria-label={t(\"buttons.export\")}\n showAriaLabel={useIsMobile()}\n title={t(\"buttons.export\")}\n />\n {modalIsShown && (\n \n \n \n )}\n \n );\n};\n","import {\n exportToCanvas as _exportToCanvas,\n exportToSvg as _exportToSvg,\n} from \"../scene/export\";\nimport { getDefaultAppState } from \"../appState\";\nimport { AppState, BinaryFiles } from \"../types\";\nimport { ExcalidrawElement, NonDeleted } from \"../element/types\";\nimport { getNonDeletedElements } from \"../element\";\nimport { restore } from \"../data/restore\";\nimport { MIME_TYPES } from \"../constants\";\n\ntype ExportOpts = {\n elements: readonly NonDeleted[];\n appState?: Partial>;\n files: BinaryFiles | null;\n maxWidthOrHeight?: number;\n getDimensions?: (\n width: number,\n height: number,\n ) => { width: number; height: number; scale?: number };\n};\n\nexport const exportToCanvas = ({\n elements,\n appState,\n files,\n maxWidthOrHeight,\n getDimensions,\n}: ExportOpts) => {\n const { elements: restoredElements, appState: restoredAppState } = restore(\n { elements, appState },\n null,\n null,\n );\n const { exportBackground, viewBackgroundColor } = restoredAppState;\n return _exportToCanvas(\n getNonDeletedElements(restoredElements),\n { ...restoredAppState, offsetTop: 0, offsetLeft: 0, width: 0, height: 0 },\n files || {},\n { exportBackground, viewBackgroundColor },\n (width: number, height: number) => {\n const canvas = document.createElement(\"canvas\");\n\n if (maxWidthOrHeight) {\n if (typeof getDimensions === \"function\") {\n console.warn(\n \"`getDimensions()` is ignored when `maxWidthOrHeight` is supplied.\",\n );\n }\n\n const max = Math.max(width, height);\n\n const scale = maxWidthOrHeight / max;\n\n canvas.width = width * scale;\n canvas.height = height * scale;\n\n return {\n canvas,\n scale,\n };\n }\n\n const ret = getDimensions?.(width, height) || { width, height };\n\n canvas.width = ret.width;\n canvas.height = ret.height;\n\n return {\n canvas,\n scale: ret.scale ?? 1,\n };\n },\n );\n};\n\nexport const exportToBlob = async (\n opts: ExportOpts & {\n mimeType?: string;\n quality?: number;\n },\n): Promise => {\n let { mimeType = MIME_TYPES.png, quality } = opts;\n\n if (mimeType === MIME_TYPES.png && typeof quality === \"number\") {\n console.warn(`\"quality\" will be ignored for \"${MIME_TYPES.png}\" mimeType`);\n }\n\n // typo in MIME type (should be \"jpeg\")\n if (mimeType === \"image/jpg\") {\n mimeType = MIME_TYPES.jpg;\n }\n\n if (mimeType === MIME_TYPES.jpg && !opts.appState?.exportBackground) {\n console.warn(\n `Defaulting \"exportBackground\" to \"true\" for \"${MIME_TYPES.jpg}\" mimeType`,\n );\n opts = {\n ...opts,\n appState: { ...opts.appState, exportBackground: true },\n };\n }\n\n const canvas = await exportToCanvas(opts);\n\n quality = quality ? quality : /image\\/jpe?g/.test(mimeType) ? 0.92 : 0.8;\n\n return new Promise((resolve) => {\n canvas.toBlob(\n (blob: Blob | null) => {\n resolve(blob);\n },\n mimeType,\n quality,\n );\n });\n};\n\nexport const exportToSvg = async ({\n elements,\n appState = getDefaultAppState(),\n files = {},\n exportPadding,\n}: Omit & {\n exportPadding?: number;\n}): Promise => {\n const { elements: restoredElements, appState: restoredAppState } = restore(\n { elements, appState },\n null,\n null,\n );\n return _exportToSvg(\n getNonDeletedElements(restoredElements),\n {\n ...restoredAppState,\n exportPadding,\n },\n files,\n );\n};\n\nexport { serializeAsJSON } from \"../data/json\";\nexport { loadFromBlob, loadLibraryFromBlob } from \"../data/blob\";\nexport { getFreeDrawSvgPath } from \"../renderer/renderElement\";\n","import oc from \"open-color\";\nimport { useEffect, useRef } from \"react\";\nimport { t } from \"../i18n\";\nimport { exportToSvg } from \"../packages/utils\";\nimport { AppState, LibraryItem } from \"../types\";\nimport { close } from \"./icons\";\n\nimport \"./SingleLibraryItem.scss\";\nimport { ToolButton } from \"./ToolButton\";\n\nconst SingleLibraryItem = ({\n libItem,\n appState,\n index,\n onChange,\n onRemove,\n}: {\n libItem: LibraryItem;\n appState: AppState;\n index: number;\n onChange: (val: string, index: number) => void;\n onRemove: (id: string) => void;\n}) => {\n const svgRef = useRef(null);\n const inputRef = useRef(null);\n\n useEffect(() => {\n const node = svgRef.current;\n if (!node) {\n return;\n }\n (async () => {\n const svg = await exportToSvg({\n elements: libItem.elements,\n appState: {\n ...appState,\n viewBackgroundColor: oc.white,\n exportBackground: true,\n },\n files: null,\n });\n node.innerHTML = svg.outerHTML;\n })();\n }, [libItem.elements, appState]);\n\n return (\n
\n
\n \n \n \n
\n \n {t(\"publishDialog.itemName\")}\n \n \n *\n \n
\n {\n onChange(event.target.value, index);\n }}\n />\n \n {libItem.error}\n
\n
\n );\n};\n\nexport default SingleLibraryItem;\n","import { ReactNode, useCallback, useEffect, useState } from \"react\";\nimport OpenColor from \"open-color\";\n\nimport { Dialog } from \"./Dialog\";\nimport { t } from \"../i18n\";\n\nimport { ToolButton } from \"./ToolButton\";\n\nimport { AppState, LibraryItems, LibraryItem } from \"../types\";\nimport { exportToCanvas } from \"../packages/utils\";\nimport {\n EXPORT_DATA_TYPES,\n EXPORT_SOURCE,\n MIME_TYPES,\n VERSIONS,\n} from \"../constants\";\nimport { ExportedLibraryData } from \"../data/types\";\n\nimport \"./PublishLibrary.scss\";\nimport SingleLibraryItem from \"./SingleLibraryItem\";\nimport { canvasToBlob, resizeImageFile } from \"../data/blob\";\nimport { chunk } from \"../utils\";\n\ninterface PublishLibraryDataParams {\n authorName: string;\n githubHandle: string;\n name: string;\n description: string;\n twitterHandle: string;\n website: string;\n}\n\nconst LOCAL_STORAGE_KEY_PUBLISH_LIBRARY = \"publish-library-data\";\n\nconst savePublishLibDataToStorage = (data: PublishLibraryDataParams) => {\n try {\n localStorage.setItem(\n LOCAL_STORAGE_KEY_PUBLISH_LIBRARY,\n JSON.stringify(data),\n );\n } catch (error: any) {\n // Unable to access window.localStorage\n console.error(error);\n }\n};\n\nconst importPublishLibDataFromStorage = () => {\n try {\n const data = localStorage.getItem(LOCAL_STORAGE_KEY_PUBLISH_LIBRARY);\n if (data) {\n return JSON.parse(data);\n }\n } catch (error: any) {\n // Unable to access localStorage\n console.error(error);\n }\n\n return null;\n};\n\nconst generatePreviewImage = async (libraryItems: LibraryItems) => {\n const MAX_ITEMS_PER_ROW = 6;\n const BOX_SIZE = 128;\n const BOX_PADDING = Math.round(BOX_SIZE / 16);\n const BORDER_WIDTH = Math.max(Math.round(BOX_SIZE / 64), 2);\n\n const rows = chunk(libraryItems, MAX_ITEMS_PER_ROW);\n\n const canvas = document.createElement(\"canvas\");\n\n canvas.width =\n rows[0].length * BOX_SIZE +\n (rows[0].length + 1) * (BOX_PADDING * 2) -\n BOX_PADDING * 2;\n canvas.height =\n rows.length * BOX_SIZE +\n (rows.length + 1) * (BOX_PADDING * 2) -\n BOX_PADDING * 2;\n\n const ctx = canvas.getContext(\"2d\")!;\n\n ctx.fillStyle = OpenColor.white;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n // draw items\n // ---------------------------------------------------------------------------\n for (const [index, item] of libraryItems.entries()) {\n const itemCanvas = await exportToCanvas({\n elements: item.elements,\n files: null,\n maxWidthOrHeight: BOX_SIZE,\n });\n\n const { width, height } = itemCanvas;\n\n // draw item\n // -------------------------------------------------------------------------\n const rowOffset =\n Math.floor(index / MAX_ITEMS_PER_ROW) * (BOX_SIZE + BOX_PADDING * 2);\n const colOffset =\n (index % MAX_ITEMS_PER_ROW) * (BOX_SIZE + BOX_PADDING * 2);\n\n ctx.drawImage(\n itemCanvas,\n colOffset + (BOX_SIZE - width) / 2 + BOX_PADDING,\n rowOffset + (BOX_SIZE - height) / 2 + BOX_PADDING,\n );\n\n // draw item border\n // -------------------------------------------------------------------------\n ctx.lineWidth = BORDER_WIDTH;\n ctx.strokeStyle = OpenColor.gray[4];\n ctx.strokeRect(\n colOffset + BOX_PADDING / 2,\n rowOffset + BOX_PADDING / 2,\n BOX_SIZE + BOX_PADDING,\n BOX_SIZE + BOX_PADDING,\n );\n }\n\n return await resizeImageFile(\n new File([await canvasToBlob(canvas)], \"preview\", { type: MIME_TYPES.png }),\n {\n outputType: MIME_TYPES.jpg,\n maxWidthOrHeight: 5000,\n },\n );\n};\n\nconst PublishLibrary = ({\n onClose,\n libraryItems,\n appState,\n onSuccess,\n onError,\n updateItemsInStorage,\n onRemove,\n}: {\n onClose: () => void;\n libraryItems: LibraryItems;\n appState: AppState;\n onSuccess: (data: {\n url: string;\n authorName: string;\n items: LibraryItems;\n }) => void;\n\n onError: (error: Error) => void;\n updateItemsInStorage: (items: LibraryItems) => void;\n onRemove: (id: string) => void;\n}) => {\n const [libraryData, setLibraryData] = useState({\n authorName: \"\",\n githubHandle: \"\",\n name: \"\",\n description: \"\",\n twitterHandle: \"\",\n website: \"\",\n });\n\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n useEffect(() => {\n const data = importPublishLibDataFromStorage();\n if (data) {\n setLibraryData(data);\n }\n }, []);\n\n const [clonedLibItems, setClonedLibItems] = useState(\n libraryItems.slice(),\n );\n\n useEffect(() => {\n setClonedLibItems(libraryItems.slice());\n }, [libraryItems]);\n\n const onInputChange = (event: any) => {\n setLibraryData({\n ...libraryData,\n [event.target.name]: event.target.value,\n });\n };\n\n const onSubmit = async (event: React.FormEvent) => {\n event.preventDefault();\n setIsSubmitting(true);\n const erroredLibItems: LibraryItem[] = [];\n let isError = false;\n clonedLibItems.forEach((libItem) => {\n let error = \"\";\n if (!libItem.name) {\n error = t(\"publishDialog.errors.required\");\n isError = true;\n }\n erroredLibItems.push({ ...libItem, error });\n });\n\n if (isError) {\n setClonedLibItems(erroredLibItems);\n setIsSubmitting(false);\n return;\n }\n\n const previewImage = await generatePreviewImage(clonedLibItems);\n\n const libContent: ExportedLibraryData = {\n type: EXPORT_DATA_TYPES.excalidrawLibrary,\n version: VERSIONS.excalidrawLibrary,\n source: EXPORT_SOURCE,\n libraryItems: clonedLibItems,\n };\n const content = JSON.stringify(libContent, null, 2);\n const lib = new Blob([content], { type: \"application/json\" });\n\n const formData = new FormData();\n formData.append(\"excalidrawLib\", lib);\n formData.append(\"previewImage\", previewImage);\n formData.append(\"previewImageType\", previewImage.type);\n formData.append(\"title\", libraryData.name);\n formData.append(\"authorName\", libraryData.authorName);\n formData.append(\"githubHandle\", libraryData.githubHandle);\n formData.append(\"name\", libraryData.name);\n formData.append(\"description\", libraryData.description);\n formData.append(\"twitterHandle\", libraryData.twitterHandle);\n formData.append(\"website\", libraryData.website);\n\n fetch(`${process.env.REACT_APP_LIBRARY_BACKEND}/submit`, {\n method: \"post\",\n body: formData,\n })\n .then(\n (response) => {\n if (response.ok) {\n return response.json().then(({ url }) => {\n // flush data from local storage\n localStorage.removeItem(LOCAL_STORAGE_KEY_PUBLISH_LIBRARY);\n onSuccess({\n url,\n authorName: libraryData.authorName,\n items: clonedLibItems,\n });\n });\n }\n return response\n .json()\n .catch(() => {\n throw new Error(response.statusText || \"something went wrong\");\n })\n .then((error) => {\n throw new Error(\n error.message || response.statusText || \"something went wrong\",\n );\n });\n },\n (err) => {\n console.error(err);\n onError(err);\n setIsSubmitting(false);\n },\n )\n .catch((err) => {\n console.error(err);\n onError(err);\n setIsSubmitting(false);\n });\n };\n\n const renderLibraryItems = () => {\n const items: ReactNode[] = [];\n clonedLibItems.forEach((libItem, index) => {\n items.push(\n
\n {\n const items = clonedLibItems.slice();\n items[index].name = val;\n setClonedLibItems(items);\n }}\n onRemove={onRemove}\n />\n
,\n );\n });\n return
{items}
;\n };\n\n const onDialogClose = useCallback(() => {\n updateItemsInStorage(clonedLibItems);\n savePublishLibDataToStorage(libraryData);\n onClose();\n }, [clonedLibItems, onClose, updateItemsInStorage, libraryData]);\n\n const shouldRenderForm = !!libraryItems.length;\n return (\n \n {shouldRenderForm ? (\n
\n
\n {t(\"publishDialog.noteDescription.pre\")}\n \n {t(\"publishDialog.noteDescription.link\")}\n {\" \"}\n {t(\"publishDialog.noteDescription.post\")}\n
\n \n {t(\"publishDialog.noteGuidelines.pre\")}\n \n {t(\"publishDialog.noteGuidelines.link\")}\n \n {t(\"publishDialog.noteGuidelines.post\")}\n \n\n
\n {t(\"publishDialog.noteItems\")}\n
\n {renderLibraryItems()}\n
\n \n \n \n \n \n \n \n {t(\"publishDialog.noteLicense.pre\")}\n \n {t(\"publishDialog.noteLicense.link\")}\n \n {t(\"publishDialog.noteLicense.post\")}\n \n
\n
\n \n \n
\n
\n ) : (\n

\n {t(\"publishDialog.atleastOneLibItem\")}\n

\n )}\n \n );\n};\n\nexport default PublishLibrary;\n","import clsx from \"clsx\";\nimport oc from \"open-color\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { MIME_TYPES } from \"../constants\";\nimport { useIsMobile } from \"../components/App\";\nimport { exportToSvg } from \"../scene/export\";\nimport { BinaryFiles, LibraryItem } from \"../types\";\nimport \"./LibraryUnit.scss\";\nimport { CheckboxItem } from \"./CheckboxItem\";\n\nconst PLUS_ICON = (\n \n \n \n);\n\nexport const LibraryUnit = ({\n id,\n elements,\n status,\n files,\n isPending,\n onClick,\n selected,\n onToggle,\n}: {\n id: LibraryItem[\"id\"] | /** for pending item */ null;\n elements?: LibraryItem[\"elements\"];\n status: LibraryItem[\"status\"];\n files: BinaryFiles;\n isPending?: boolean;\n onClick: () => void;\n selected: boolean;\n onToggle: (id: string, event: React.MouseEvent) => void;\n}) => {\n const ref = useRef(null);\n useEffect(() => {\n const node = ref.current;\n if (!node) {\n return;\n }\n\n (async () => {\n if (!elements) {\n return;\n }\n const svg = await exportToSvg(\n elements,\n {\n exportBackground: false,\n viewBackgroundColor: oc.white,\n },\n files,\n );\n node.innerHTML = svg.outerHTML;\n })();\n\n return () => {\n node.innerHTML = \"\";\n };\n }, [elements, files]);\n\n const [isHovered, setIsHovered] = useState(false);\n const isMobile = useIsMobile();\n const adder = isPending && (\n
{PLUS_ICON}
\n );\n\n return (\n setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n {\n if (id && event.shiftKey) {\n onToggle(id, event);\n } else {\n onClick();\n }\n }\n : undefined\n }\n onDragStart={(event) => {\n setIsHovered(false);\n event.dataTransfer.setData(\n MIME_TYPES.wblib,\n JSON.stringify(elements),\n );\n }}\n />\n {adder}\n\t \n {\n\t\t//ioDraw素材不显示复选框\n\t\tid && elements && status==\"unpublished\" && (isHovered || isMobile || selected) && (\n onToggle(id, event)}\n className=\"library-unit__checkbox\"\n />\n )}\n \n );\n};\n","import { chunk } from \"lodash\";\nimport { useCallback, useState } from \"react\";\nimport { importLibraryFromJSON, saveLibraryAsJSON } from \"../data/json\";\nimport Library from \"../data/library\";\nimport { ExcalidrawElement, NonDeleted } from \"../element/types\";\nimport { t } from \"../i18n\";\nimport {\n AppState,\n BinaryFiles,\n ExcalidrawProps,\n LibraryItem,\n LibraryItems,\n} from \"../types\";\nimport { muteFSAbortError } from \"../utils\";\nimport { useIsMobile } from \"./App\";\nimport ConfirmDialog from \"./ConfirmDialog\";\nimport { exportToFileIcon, load, publishIcon, trash } from \"./icons\";\nimport { LibraryUnit } from \"./LibraryUnit\";\nimport Stack from \"./Stack\";\nimport { ToolButton } from \"./ToolButton\";\nimport { Tooltip } from \"./Tooltip\";\n\nimport \"./LibraryMenuItems.scss\";\nimport { VERSIONS } from \"../constants\";\n\nconst LibraryMenuItems = ({\n libraryItems,\n onRemoveFromLibrary,\n onAddToLibrary,\n onInsertShape,\n pendingElements,\n theme,\n setAppState,\n libraryReturnUrl,\n library,\n files,\n id,\n selectedItems,\n onToggle,\n onPublish,\n resetLibrary,\n}: {\n libraryItems: LibraryItems;\n pendingElements: LibraryItem[\"elements\"];\n onRemoveFromLibrary: () => void;\n onInsertShape: (elements: LibraryItem[\"elements\"]) => void;\n onAddToLibrary: (elements: LibraryItem[\"elements\"]) => void;\n theme: AppState[\"theme\"];\n files: BinaryFiles;\n setAppState: React.Component[\"setState\"];\n libraryReturnUrl: ExcalidrawProps[\"libraryReturnUrl\"];\n library: Library;\n id: string;\n selectedItems: LibraryItem[\"id\"][];\n onToggle: (id: LibraryItem[\"id\"], event: React.MouseEvent) => void;\n onPublish: () => void;\n resetLibrary: () => void;\n}) => {\n const renderRemoveLibAlert = useCallback(() => {\n const content = selectedItems.length\n ? t(\"alerts.removeItemsFromsLibrary\", { count: selectedItems.length })\n : t(\"alerts.resetLibrary\");\n const title = selectedItems.length\n ? t(\"confirmDialog.removeItemsFromLib\")\n : t(\"confirmDialog.resetLibrary\");\n return (\n {\n if (selectedItems.length) {\n onRemoveFromLibrary();\n } else {\n resetLibrary();\n }\n setShowRemoveLibAlert(false);\n }}\n onCancel={() => {\n setShowRemoveLibAlert(false);\n }}\n title={title}\n >\n

{content}

\n \n );\n }, [selectedItems, onRemoveFromLibrary, resetLibrary]);\n\n const [showRemoveLibAlert, setShowRemoveLibAlert] = useState(false);\n\n const isMobile = useIsMobile();\n\n const renderLibraryActions = () => {\n const itemsSelected = !!selectedItems.length;\n const items = itemsSelected\n ? libraryItems.filter((item) => item.status==\"unpublished\" && selectedItems.includes(item.id))\n : libraryItems.filter((item) => item.status==\"unpublished\");\n const resetLabel = itemsSelected\n ? t(\"buttons.remove\")\n : t(\"buttons.resetLibrary\");\n return (\n
\n {(!itemsSelected || !isMobile) && (\n {\n importLibraryFromJSON(library)\n .then(() => {\n // Close and then open to get the libraries updated\n setAppState({ isLibraryOpen: false });\n setAppState({ isLibraryOpen: true });\n })\n .catch(muteFSAbortError)\n .catch((error) => {\n setAppState({ errorMessage: error.message });\n });\n }}\n className=\"library-actions--load\"\n />\n )}\n {!!items.length && (\n <>\n {\n const libraryItems = itemsSelected\n ? items\n : await library.loadLibrary();\n saveLibraryAsJSON(libraryItems)\n .catch(muteFSAbortError)\n .catch((error) => {\n setAppState({ errorMessage: error.message });\n });\n }}\n className=\"library-actions--export\"\n >\n {selectedItems.length > 0 && (\n \n {selectedItems.length}\n \n )}\n \n setShowRemoveLibAlert(true)}\n className=\"library-actions--remove\"\n >\n {selectedItems.length > 0 && (\n \n {selectedItems.length}\n \n )}\n \n \n )}\n {itemsSelected && !isPublished && (\n \n \n {!isMobile && }\n {selectedItems.length > 0 && (\n \n {selectedItems.length}\n \n )}\n \n \n )}\n
\n );\n };\n\n const CELLS_PER_ROW = isMobile ? 4 : 6;\n\n const referrer =\n libraryReturnUrl || window.location.origin + window.location.pathname;\n const isPublished = selectedItems.some(\n (id) => libraryItems.find((item) => item.id === id)?.status === \"published\",\n );\n\n const createLibraryItemCompo = (params: {\n item:\n | LibraryItem\n | /* pending library item */ {\n id: null;\n\t\t status: null;\n elements: readonly NonDeleted[];\n }\n | null;\n onClick?: () => void;\n key: string;\n }) => {\n return (\n \n {})}\n id={params.item?.id || null}\n\t\t status={params.item?.status || \"unpublished\"}\n selected={!!params.item?.id && selectedItems.includes(params.item.id)}\n onToggle={(id, event) => {\n onToggle(id, event);\n }}\n />\n \n );\n };\n\n const renderLibrarySection = (\n items: (\n | LibraryItem\n | /* pending library item */ {\n id: null;\n\t\t status: null;\n elements: readonly NonDeleted[];\n }\n )[],\n ) => {\n const _items = items.map((item) => {\n if (item.id) {\n return createLibraryItemCompo({\n item,\n onClick: () => onInsertShape(item.elements),\n key: item.id,\n });\n }\n return createLibraryItemCompo({\n key: \"__pending__item__\",\n item,\n onClick: () => onAddToLibrary(pendingElements),\n });\n });\n\n // ensure we render all empty cells if no items are present\n let rows = chunk(_items, CELLS_PER_ROW);\n if (!rows.length) {\n rows = [[]];\n }\n\n return rows.map((rowItems, index, rows) => {\n if (index === rows.length - 1) {\n // pad row with empty cells\n rowItems = rowItems.concat(\n new Array(CELLS_PER_ROW - rowItems.length)\n .fill(null)\n .map((_, index) => {\n return createLibraryItemCompo({\n key: `empty_${index}`,\n item: null,\n });\n }),\n );\n }\n return (\n \n {rowItems}\n \n );\n });\n };\n\n const publishedItems = libraryItems.filter(\n (item) => item.status === \"published\",\n );\n const unpublishedItems = [\n // append pending library item\n ...(pendingElements.length\n ? [{ id: null,status: null, elements: pendingElements }]\n : []),\n ...libraryItems.filter((item) => item.status !== \"published\"),\n ];\n var templateUrl=(localStorage.getItem(\"iodrawLang\")==null?\"\":localStorage.getItem(\"iodrawLang\"))+\"/template\";\n return (\n
\n {showRemoveLibAlert && renderRemoveLibAlert()}\n
\n {renderLibraryActions()}\n \n {t(\"labels.libraries\")}\n \n
\n \n <>\n
{t(\"labels.personalLib\")}
\n {renderLibrarySection(unpublishedItems)}\n \n\n <>\n
{t(\"labels.excalidrawLib\")}
\n\n {renderLibrarySection(publishedItems)}\n \n \n
\n );\n};\n\nexport default LibraryMenuItems;\n","import { STORAGE_KEYS } from \"../app_constants\";\n\n// in-memory state (this tab's current state) versions. Currently just\n// timestamps of the last time the state was saved to browser storage.\nconst LOCAL_STATE_VERSIONS = {\n [STORAGE_KEYS.VERSION_DATA_STATE]: -1,\n [STORAGE_KEYS.VERSION_FILES]: -1,\n};\n\ntype BrowserStateTypes = keyof typeof LOCAL_STATE_VERSIONS;\n\nexport const isBrowserStorageStateNewer = (type: BrowserStateTypes) => {\n const storageTimestamp = JSON.parse(sessionStorage.getItem(type) || \"-1\");\n return storageTimestamp > LOCAL_STATE_VERSIONS[type];\n};\n\nexport const updateBrowserStateVersion = (type: BrowserStateTypes) => {\n const timestamp = Date.now();\n sessionStorage.setItem(type, JSON.stringify(timestamp));\n LOCAL_STATE_VERSIONS[type] = timestamp;\n};\n\nexport const resetBrowserStateVersions = () => {\n for (const key of Object.keys(LOCAL_STATE_VERSIONS) as BrowserStateTypes[]) {\n const timestamp = -1;\n sessionStorage.setItem(key, JSON.stringify(timestamp));\n LOCAL_STATE_VERSIONS[key] = timestamp;\n }\n};\n","import { ExcalidrawElement } from \"../../element/types\";\nimport { AppState } from \"../../types\";\nimport {\n clearAppStateForLocalStorage,\n getDefaultAppState,\n} from \"../../appState\";\nimport { clearElementsForLocalStorage } from \"../../element\";\nimport { updateBrowserStateVersion } from \"./tabSync\";\nimport { STORAGE_KEYS } from \"../app_constants\";\nimport { t } from \"../../i18n\";\nimport ioDrawLib from \"../../data/ioDrawLib.json\";\nimport { get, set, createStore } from \"idb-keyval\";\n\nconst filesStore = createStore(\"files-db\", \"files-store\");\n\nexport const saveUsernameToLocalStorage = (username: string) => {\n try {\n localStorage.setItem(\n STORAGE_KEYS.LOCAL_STORAGE_COLLAB,\n JSON.stringify({ username }),\n );\n } catch (error: any) {\n // Unable to access window.localStorage\n console.error(error);\n }\n};\n\nexport const importUsernameFromLocalStorage = (): string | null => {\n try {\n const data = localStorage.getItem(STORAGE_KEYS.LOCAL_STORAGE_COLLAB);\n if (data) {\n return JSON.parse(data).username;\n }\n } catch (error: any) {\n // Unable to access localStorage\n console.error(error);\n }\n\n return null;\n};\n\nexport const saveToLocalStorage = (\n elements: readonly ExcalidrawElement[],\n appState: AppState,\n) => {\n try {\n sessionStorage.setItem(\n STORAGE_KEYS.LOCAL_STORAGE_ELEMENTS,\n JSON.stringify(clearElementsForLocalStorage(elements)),\n );\n\t\n sessionStorage.setItem(\n STORAGE_KEYS.LOCAL_STORAGE_APP_STATE,\n JSON.stringify(clearAppStateForLocalStorage(appState)),\n );\n updateBrowserStateVersion(STORAGE_KEYS.VERSION_DATA_STATE);\n } catch (error: any) {\n // Unable to access window.localStorage\n console.error(error);\n }\n};\n\n\n\n \nvar i18nextLng = localStorage.getItem(\"i18nextLng\");\nvar langFlag=\"\";//默认中文\nif(i18nextLng==\"zh-CN\"||i18nextLng==\"zh-TW\"){\n\tlangFlag=\"\";\n}else if(i18nextLng==\"eu-ES\"){\n\tlangFlag=\"es\";\n}else if(i18nextLng==\"ar-SA\"){\n\tlangFlag=\"ar\";\n}else if(i18nextLng==\"fr-FR\"){\n\tlangFlag=\"fr\";\n}else if(i18nextLng==\"pt-BR\"){\n\tlangFlag=\"pt\";\n}else if(i18nextLng==\"ru-RU\"){\n\tlangFlag=\"ru\";\n}else if(i18nextLng==\"ja-JP\"){\n\tlangFlag=\"ja\";\n}else if(i18nextLng==\"de-DE\"){\n\tlangFlag=\"de\";\n}else if(i18nextLng==\"it-IT\"){\n\tlangFlag=\"it\";\n}\nlocalStorage.setItem(\"iodrawLang\",langFlag);\nif(langFlag==''){\n\tvar common_disk_0='所有修订自动保存',common_disk_1='保存成功',common_disk_2='最近保存',common_disk_3='我的文件';\n} else if(langFlag=='es'){\n\tvar common_disk_0='Guardar automáticamente',common_disk_1='Guardar con éxito',common_disk_2='Guardar recientemente',common_disk_3='Mis archivos';\n} else if(langFlag=='ar'){\n\tvar common_disk_0='حفظ السيارات',common_disk_1='حفظ بنجاح',common_disk_2='حفظ مؤخرا',common_disk_3='ملفي';\n} else if(langFlag=='fr'){\n\tvar common_disk_0='Enregistrer automatiquement',common_disk_1='Enregistrer avec succès',common_disk_2='Récemment sauvegardé',common_disk_3='Mes dossiers';\n} else if(langFlag=='pt'){\n\tvar common_disk_0='Gravação automática',common_disk_1='Gravado com SUCESSO',common_disk_2='Gravado recentemente',common_disk_3='Meus arquivos.';\n} else if(langFlag=='ru'){\n\tvar common_disk_0='Автосохранение',common_disk_1='сохранить успешно',common_disk_2='Последнее сохранение',common_disk_3='мои файлы';\n} else if(langFlag=='ja'){\n\tvar common_disk_0='自動保存',common_disk_1='保存に成功しました',common_disk_2='最近の保存',common_disk_3='私のファイル';\n} else if(langFlag=='de'){\n\tvar common_disk_0='Automatisches Speichern',common_disk_1='Speichern erfolgreich',common_disk_2='Kürzlich gespeichert',common_disk_3='Meine Akten';\n} else if(langFlag=='ko'){\n\tvar common_disk_0='자동 저장',common_disk_1='저장 성공',common_disk_2='최근 저장',common_disk_3='내 서류';\n} else if(langFlag=='it'){\n\tvar common_disk_0='Salvataggio automatico',common_disk_1='Salvato con successo',common_disk_2='Recentemente salvato',common_disk_3='I miei file';\n} else {\n\tvar common_disk_0='Auto save',common_disk_1='Saved successfully',common_disk_2='Recently saved',common_disk_3='My files';\n} \nvar langUrl = (langFlag==null||langFlag==\"\")?\"\":\"/\"+langFlag;\n//自动保存文件\nvar localFileId: any | null=null;\nvar initTxt: any | null=null;\nvar initTitle: any | null=null;\nvar filetb: any | null=null;\nfunction getStrSize(txt: any){let size=txt.replace(/[^\\u0000-\\u00ff]/g,\"aa\").length;const arr=['B','KB','MB','GB','TB'];let sizeUnit=0;while(size>1024){size/=1024;++sizeUnit;}return size.toFixed(0)+arr[sizeUnit];}\nfunction insertAfter(a: any,b: any){var parent=b.parentNode;if(parent.lastChild==b){parent.appendChild(a,b)}else{parent.insertBefore(a,b.nextSibling)}};\nfunction localDB(callback: any,params: any) {\n\tvar indexedDB = window.indexedDB || (window as any).webkitIndexedDB || (window as any).mozIndexedDB || (window as any).msIndexedDB;\n\tif(!indexedDB){return false;} \n\tvar request = window.indexedDB.open('iodrawdb',1);\n\trequest.onsuccess = function (event) {\n\t\tvar iodrawdb = request.result;\n\t\tfiletb = iodrawdb.transaction(['file'], 'readwrite').objectStore('file');\n\t\treturn callback(params);\n\t};\n\trequest.onupgradeneeded = function (event) {\n\t\tvar iodrawdb = (event as any).target.result;\n\t\tif (!iodrawdb.objectStoreNames.contains('file')) {\n\t\t\tfiletb = iodrawdb.createObjectStore('file', { keyPath: 'id' });\n\t\t\tfiletb.createIndex('title', 'title', { unique: true });\n\t\t\treturn callback(params);\n\t\t}\n\t}\n}\nfunction saveFile(params: any) {\n\tvar type=params.type;\n\tvar title=params.title;\n\tvar txt=params.txt;\n\tvar txtNoFiles = JSON.parse(txt);\n\ttxtNoFiles.files={};//去file\n\tvar txtNoFilesStr=JSON.stringify(txtNoFiles);\n\t\n\tif(initTxt==null||initTitle==null){\n\t\tinitTxt=txtNoFilesStr;\n\t\tinitTitle=title;\n\t\treturn false\n\t}\n\tif(initTxt==txtNoFilesStr && initTitle==title){\n\t\treturn false\n\t}\n\tif(params.id!=null){\n\t\tvar getOne=filetb.get(params.id);getOne.onsuccess=function(event: any){if(getOne.result){\n\t\tvar db=getOne.result;\n\t\tif(txt==db.txt&&title==db.title){return false}\n\t\tdb.txt=txt;db.size=getStrSize(txt);db.updateTime=new Date();db.syncCount=0;db.syncTime=null;\n\t\tif(title!=db.title){db.title=title;var requestQuery=window.indexedDB.open('iodrawdb',1);requestQuery.onsuccess=function(event){filetb=requestQuery.result.transaction(['file'],'readwrite').objectStore('file');\n\t\t\tvar queryTitle=filetb.index('title').get(title);\n\t\t\tqueryTitle.onsuccess=function(e: any){var result=e.target.result;\n\t\t\t\tif (result!=null && result.id!=db.id){\n\t\t\t\t\tparams.title=getNewFileTitle(title);\n\t\t\t\t\tlocalDB(saveFile,params);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}}\t\n\t\t}\n\t\tvar requestUpadate=window.indexedDB.open('iodrawdb',1);requestUpadate.onsuccess=function(event){filetb=requestUpadate.result.transaction(['file'],'readwrite').objectStore('file');\n\t\t\tvar updateDB=filetb.put(db);\n\t\t\tupdateDB.onsuccess=function(event: any){\n\t\t\t\tinitTitle=db.title;\n\t\t\t\tvar txtNoFilesStr = JSON.parse(db.txt);\n\t\t\t\ttxtNoFilesStr.files={};//去file\n\t\t\t\tinitTxt=JSON.stringify(txtNoFilesStr);\n\t\t\t\t(document as any).getElementById(\"fileTitleInput\").value=db.title.substring(0,db.title.lastIndexOf(\".\"));\n\t\t\t\tshowFileMsg();\n\t\t\t\tuploadBaiduPan(db);\n\t\t\t}\n\t\t\tupdateDB.onerror=function(event: any){}\n\t\t}}}\n\t}else{\n\t\tvar queryTitle=filetb.index('title').get(title);\n\t\tqueryTitle.onsuccess=function(e: any){\n\t\t\tvar result = e.target.result;\n\t\t\tif (result!=null) {\n\t\t\t\tparams.title=getNewFileTitle(title);\n\t\t\t\tlocalDB(saveFile,params);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tvar requestAdd = window.indexedDB.open('iodrawdb',1);\n\t\trequestAdd.onsuccess=function(event: any){filetb=requestAdd.result.transaction(['file'],'readwrite').objectStore('file');\n\t\t\tvar now=new Date();\n\t\t\tvar obj={id:now.getTime(),title:title,type:type,size:getStrSize(txt),updateTime:now,txt:txt,status:1,syncTime:null,syncCount:0,syncTitle:null};\n\t\t\tvar addDB = filetb.add(obj);\n\t\t\taddDB.onsuccess=function(event: any){\n\t\t\t\tlocalFileId=obj.id;\n\t\t\t\tsessionStorage.setItem(\"localFileId4\",localFileId);\n\t\t\t\tinitTitle=title;\n\t\t\t\tvar txtNoFilesStr = JSON.parse(txt);\n\t\t\t\ttxtNoFilesStr.files={};//去file\n\t\t\t\tinitTxt=JSON.stringify(txtNoFilesStr);\n\t\t\t\t(document as any).getElementById(\"fileTitleInput\").value=title.substring(0,title.lastIndexOf(\".\"));\n\t\t\t\tshowFileMsg();\n\t\t\t\tuploadBaiduPan(obj);\n\t\t\t}\n\t\t\taddDB.onerror=function(event: any){}\n\t\t}\t\n\t}\n}\nfunction uploadBaiduPan(obj: any){\n\tvar baiduToken=localStorage.getItem(\"baiduToken\");\n\tvar baiduUinfo=localStorage.getItem(\"baiduUinfo\");\n\tvar syncBaiduPanTime=localStorage.getItem(\"syncBaiduPanTime\");\n\tif(baiduToken==null){return false}\n\tif(baiduUinfo==null||baiduUinfo==\"\"){return false}\n\tif(syncBaiduPanTime!=null&&(new Date().getTime()-(syncBaiduPanTime as any))<60*1000){return false}\n\tif(obj.syncCount>3){return false}\n\tif(obj.txt.replace(/[^\\u0000-\\u00ff]/g,\"aa\").length>1*1024*1024){return false}\n\tvar nowDate=new Date();\n\tlocalStorage.setItem(\"syncBaiduPanTime\",(nowDate as any).getTime());\n\tobj.syncCount=obj.syncCount+1;\n\tvar request1=window.indexedDB.open('iodrawdb',1);request1.onsuccess=function(event){filetb=request1.result.transaction(['file'],'readwrite').objectStore('file');\n\tvar update1=filetb.put(obj);\n\tupdate1.onsuccess=function(event: any){\n\t\tvar oldSyncTitle=obj.syncTitle;\n\t\tvar xhr=new XMLHttpRequest();\n\t\txhr.open('POST',\"/member/fileSave.json\",true);\n\t\txhr.setRequestHeader('content-type','application/json;charset=utf-8;');\n\t\txhr.send(JSON.stringify({\"title\":(oldSyncTitle==null?obj.title:oldSyncTitle),\"token\":baiduToken,\"txt\":obj.txt}));\n\t\txhr.onreadystatechange=function(){\n\t\t\tif (xhr.readyState==4&&xhr.status==200) {\n\t\t\t\tif(xhr.responseText==\"0\"){\n\t\t\t\t\tobj.syncCount=0;\n\t\t\t\t\tobj.syncTime=new Date();\n\t\t\t\t\tobj.syncTitle=obj.title;\n\t\t\t\t\tvar request2=window.indexedDB.open('iodrawdb',1);request2.onsuccess=function(event){filetb=request2.result.transaction(['file'],'readwrite').objectStore('file');\n\t\t\t\t\tvar update2=filetb.put(obj);\n\t\t\t\t\tupdate2.onsuccess=function(event: any){\n\t\t\t\t\t\tif(oldSyncTitle!=null && oldSyncTitle!=obj.title){\n\t\t\t\t\t\t\tvar xhr2=new XMLHttpRequest();\n\t\t\t\t\t\t\txhr2.open('POST',\"/member/fileRename.json?oldName=\"+oldSyncTitle+\"&newName=\"+obj.title+\"&token=\"+baiduToken,true);\n\t\t\t\t\t\t\txhr2.send();\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t}else if(xhr.responseText==\"-6\"){\n\t\t\t\t\tlocalStorage.removeItem(\"baiduUinfo\");\n\t\t\t\t\tlocalStorage.removeItem(\"baiduToken\");\n\t\t\t\t\tlocalStorage.removeItem(\"baiduFiles\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}}\n}\nfunction getNewFileTitle(title: any){\n\tvar fileName=title.substring(0,title.lastIndexOf(\".\"));\n\tvar fileSuffix=title.substring(title.lastIndexOf(\".\"));\n\tvar suffix=fileName.lastIndexOf(\"-\")<0?0:fileName.substring(fileName.lastIndexOf(\"-\")+1);\n\tvar prefix=fileName.lastIndexOf(\"-\")<0?fileName:fileName.substring(0,fileName.lastIndexOf(\"-\"));\n\tvar newSuffix=(/^\\d+$/.test(suffix)==true)?(parseInt(suffix)+1):1;\n\treturn prefix+\"-\"+newSuffix+fileSuffix;\n}\nexport const showFileMsg = () => {\n\tvar showFileMsg=document.getElementById(\"showFileMsg\");\n\tvar size=12;\n\tvar r=size/20;\n\tvar color=\"rgb(129,134,143)\";\n\tif(showFileMsg==null){\n\t\tshowFileMsg=document.createElement(\"div\");\n\t\tshowFileMsg.setAttribute(\"id\",\"showFileMsg\");\n\t\tshowFileMsg.style.margin=\"5px\";\n\t\tshowFileMsg.style.verticalAlign=\"bottom\";\n\t\tinsertAfter(showFileMsg,document.getElementById(\"fileTitleInput\"));\n\t\tvar style='';\n\t\tvar svg='';\n\t\tvar div='';\n\t\tshowFileMsg.innerHTML=style+svg+div;\n\t\tvar showFileMsgDiv=document.getElementById(\"showFileMsgDiv\");\n\t\t(showFileMsgDiv as any).innerText=common_disk_0;\n\t\treturn false;\n\t}\n\tif(loopStart==false){\n\t\treturn false;\n\t}\n\tloopStart=false;\n\t\n\tshowFileMsg.innerHTML='';\n\n\tvar style='';\n\tvar svg='';\n\tvar div='';\n\tshowFileMsg.innerHTML=style+svg+div;\n\tvar showFileMsgDiv=document.getElementById(\"showFileMsgDiv\");\n\t(showFileMsgDiv as any).innerText=common_disk_1;\n\tvar time=new Date();\n\tvar hour = time.getHours() > 9 && time.getHours() || ('0' + time.getHours())\n\tvar minute = time.getMinutes() > 9 && time.getMinutes() || ('0' + time.getMinutes())\n\tsetTimeout(function(){(showFileMsgDiv as any).innerText=common_disk_2+\" \"+hour+':'+minute},3000);\n}\nvar loopStart=false;\nconst autoSaveFile = async () => {\n\tloopStart=true;\n\tvar elementsVlue = sessionStorage.getItem(STORAGE_KEYS.LOCAL_STORAGE_ELEMENTS);\n\tif(elementsVlue==null || elementsVlue==\"\"){\n\t\treturn false;\n\t}\n\tvar fileTitleInput=document.getElementById(\"fileTitleInput\");\n\tif(fileTitleInput==null||(fileTitleInput as any).value==\"\"){return false}\n\tvar j='{\"type\":\"wb\",\"version\":2,\"source\":\"http://www.guanfu.org\",\"elements\":'\n\t+elementsVlue\n\t+',\"appState\":'\n\t+sessionStorage.getItem(STORAGE_KEYS.LOCAL_STORAGE_APP_STATE)\n\t+',\"files\":{}}';\n\tvar jsonObj=JSON.parse(j);\n\tlet files: any = {};\n\tfor(let i=0;i {\n let savedElements = null;\n let savedState = null;\n\n try {\n savedElements = sessionStorage.getItem(STORAGE_KEYS.LOCAL_STORAGE_ELEMENTS);\n\tsavedState = sessionStorage.getItem(STORAGE_KEYS.LOCAL_STORAGE_APP_STATE);\n } catch (error: any) {\n // Unable to access localStorage\n console.error(error);\n }\n\n let elements: ExcalidrawElement[] = [];\n if (savedElements) {\n try {\n elements = clearElementsForLocalStorage(JSON.parse(savedElements));\n } catch (error: any) {\n console.error(error);\n // Do nothing because elements array is already empty\n }\n }\n\n let appState = null;\n if (savedState) {\n try {\n appState = {\n ...getDefaultAppState(),\n ...clearAppStateForLocalStorage(\n JSON.parse(savedState) as Partial,\n ),\n };\n } catch (error: any) {\n console.error(error);\n // Do nothing because appState is already null\n }\n }\n\n return { elements, appState };\n};\n\n\n//显示文件名\nwindow.onload=function (){//图片加载完后执行\n var untitled = `${t(\"labels.untitled\")}`;\n var showFileName=document.createElement(\"div\");\n showFileName.id=\"fileTitleDiv\";\n \n showFileName.innerHTML=''\n +'';\n (document as any).querySelector(\".leftTopIslandCol\").insertBefore(showFileName, (document as any).querySelector(\".leftTopIslandCol\").firstElementChild);\n showFileMsg();\n (document as any).getElementById(\"fileTitleInput\").onblur=function(){autoSaveFile()}\n \n var whiteboardUrl=window.location.href.split(\"#U\")[1];\n if(typeof whiteboardUrl!=\"undefined\"&&whiteboardUrl!=\"\"){\n\tif(whiteboardUrl.indexOf(\"disk\")==0){var requestDB=window.indexedDB.open('iodrawdb',1);requestDB.onsuccess=function(event){var filetb=requestDB.result.transaction(['file'],'readwrite').objectStore('file');\n\t\tvar getOne=filetb.get(parseInt(whiteboardUrl.substring(4)));\n\t\tgetOne.onsuccess=function(event){if(getOne.result){\n\t\t\tvar db=getOne.result;\n\t\t\tvar txtJSON = JSON.parse(db.txt);\n\t\t\t(document as any).getElementById(\"fileTitleInput\").value=db.title.substring(0,db.title.lastIndexOf(\".\"));\n\t\t\tlocalFileId=db.id;\n\t\t}}}\n\t}else if(whiteboardUrl.indexOf(\"?title=\")>-1){\n\t\tvar title=whiteboardUrl.split(\"?title=\")[1];\n\t\tif(typeof title!=\"undefined\" && title!=\"\"){\n\t\t\t(document as any).getElementById(\"fileTitleInput\").value=decodeURIComponent(title);\n\t\t}\n\t}\n }\n autoSaveFile();\n}\n \nexport const getElementsStorageSize = () => {\n try {\n const elements = sessionStorage.getItem(STORAGE_KEYS.LOCAL_STORAGE_ELEMENTS);\n const elementsSize = elements?.length || 0;\n return elementsSize;\n } catch (error: any) {\n console.error(error);\n return 0;\n }\n};\n\nexport const getTotalStorageSize = () => {\n try {\n const appState = sessionStorage.getItem(STORAGE_KEYS.LOCAL_STORAGE_APP_STATE);\n const collab = localStorage.getItem(STORAGE_KEYS.LOCAL_STORAGE_COLLAB);\n const library = localStorage.getItem(STORAGE_KEYS.LOCAL_STORAGE_LIBRARY);\n\n const appStateSize = appState?.length || 0;\n const collabSize = collab?.length || 0;\n const librarySize = library?.length || 0;\n\n return appStateSize + collabSize + librarySize + getElementsStorageSize();\n } catch (error: any) {\n console.error(error);\n return 0;\n }\n};\n\nexport const ioDrawLibItems=JSON.stringify(ioDrawLib);\nexport const getLibraryItemsFromStorage = () => {\n try {\n\t //拼接ioDraw模板\n\t //var jsonObj=JSON.parse(libStr);\n const libraryItems =\n JSON.parse(\n localStorage.getItem(STORAGE_KEYS.LOCAL_STORAGE_LIBRARY) as string,\n ) || [];\n\tconst newLibraryItems=libraryItems.concat(ioDrawLib);\n\treturn newLibraryItems;\n } catch (e) {\n console.error(e);\n return [];\n }\n};\n","import { useRef, useState, useEffect, useCallback, RefObject } from \"react\";\nimport Library from \"../data/library\";\nimport { t } from \"../i18n\";\nimport { randomId } from \"../random\";\nimport {\n LibraryItems,\n LibraryItem,\n AppState,\n BinaryFiles,\n ExcalidrawProps,\n} from \"../types\";\nimport { Dialog } from \"./Dialog\";\nimport { Island } from \"./Island\";\nimport PublishLibrary from \"./PublishLibrary\";\nimport { ToolButton } from \"./ToolButton\";\n\nimport \"./LibraryMenu.scss\";\nimport LibraryMenuItems from \"./LibraryMenuItems\";\nimport { EVENT } from \"../constants\";\nimport { KEYS } from \"../keys\";\nimport { arrayToMap } from \"../utils\";\nimport { ioDrawLibItems } from \"../excalidraw-app/data/localStorage\";\n\n\nconst useOnClickOutside = (\n ref: RefObject,\n cb: (event: MouseEvent) => void,\n) => {\n useEffect(() => {\n const listener = (event: MouseEvent) => {\n if (!ref.current) {\n return;\n }\n\n if (\n event.target instanceof Element &&\n (ref.current.contains(event.target) ||\n !document.body.contains(event.target))\n ) {\n return;\n }\n\n cb(event);\n };\n document.addEventListener(\"pointerdown\", listener, false);\n\n return () => {\n document.removeEventListener(\"pointerdown\", listener);\n };\n }, [ref, cb]);\n};\n\nconst getSelectedItems = (\n libraryItems: LibraryItems,\n selectedItems: LibraryItem[\"id\"][],\n) => libraryItems.filter((item) => selectedItems.includes(item.id));\n\nexport const LibraryMenu = ({\n onClose,\n onInsertShape,\n pendingElements,\n onAddToLibrary,\n theme,\n setAppState,\n files,\n libraryReturnUrl,\n focusContainer,\n library,\n id,\n appState,\n}: {\n pendingElements: LibraryItem[\"elements\"];\n onClose: () => void;\n onInsertShape: (elements: LibraryItem[\"elements\"]) => void;\n onAddToLibrary: () => void;\n theme: AppState[\"theme\"];\n files: BinaryFiles;\n setAppState: React.Component[\"setState\"];\n libraryReturnUrl: ExcalidrawProps[\"libraryReturnUrl\"];\n focusContainer: () => void;\n library: Library;\n id: string;\n appState: AppState;\n}) => {\n const ref = useRef(null);\n\n useOnClickOutside(ref, (event) => {\n // If click on the library icon, do nothing.\n if ((event.target as Element).closest(\".ToolIcon__library\")) {\n return;\n }\n onClose();\n });\n\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === KEYS.ESCAPE) {\n onClose();\n }\n };\n document.addEventListener(EVENT.KEYDOWN, handleKeyDown);\n return () => {\n document.removeEventListener(EVENT.KEYDOWN, handleKeyDown);\n };\n }, [onClose]);\n\n const [libraryItems, setLibraryItems] = useState([]);\n\n const [loadingState, setIsLoading] = useState<\n \"preloading\" | \"loading\" | \"ready\"\n >(\"preloading\");\n const [selectedItems, setSelectedItems] = useState([]);\n const [showPublishLibraryDialog, setShowPublishLibraryDialog] =\n useState(false);\n const [publishLibSuccess, setPublishLibSuccess] = useState(null);\n const loadingTimerRef = useRef(null);\n\n useEffect(() => {\n Promise.race([\n new Promise((resolve) => {\n loadingTimerRef.current = window.setTimeout(() => {\n resolve(\"loading\");\n }, 100);\n }),\n library.loadLibrary().then((items) => {\n setLibraryItems(items);\n setIsLoading(\"ready\");\n }),\n ]).then((data) => {\n if (data === \"loading\") {\n setIsLoading(\"loading\");\n }\n });\n return () => {\n clearTimeout(loadingTimerRef.current!);\n };\n }, [library]);\n\n const removeFromLibrary = useCallback(async () => {\n const items = await library.loadLibrary();\n\n const nextItems = items.filter((item) => !selectedItems.includes(item.id));\n library.saveLibrary(nextItems).catch((error) => {\n setLibraryItems(items);\n setAppState({ errorMessage: t(\"alerts.errorRemovingFromLibrary\") });\n });\n setSelectedItems([]);\n setLibraryItems(nextItems);\n }, [library, setAppState, selectedItems, setSelectedItems]);\n\n\t/**重置素材库**/\n const resetLibrary = useCallback(() => {\n var jsonObj=JSON.parse(ioDrawLibItems);\n\tlibrary.resetLibrary(jsonObj);\n\tsetLibraryItems(jsonObj);\n focusContainer();\n }, [library, focusContainer]);\n\n\n const addToLibrary = useCallback(\n async (elements: LibraryItem[\"elements\"]) => {\n if (elements.some((element) => element.type === \"image\")) {\n return setAppState({\n errorMessage: \"Support for adding images to the library coming soon!\",\n });\n }\n const items = await library.loadLibrary();\n const nextItems: LibraryItems = [\n {\n status: \"unpublished\",\n elements,\n id: randomId(),\n created: Date.now(),\n },\n ...items,\n ];\n onAddToLibrary();\n library.saveLibrary(nextItems).catch((error) => {\n setLibraryItems(items);\n setAppState({ errorMessage: t(\"alerts.errorAddingToLibrary\") });\n });\n setLibraryItems(nextItems);\n },\n [onAddToLibrary, library, setAppState],\n );\n\n const renderPublishSuccess = useCallback(() => {\n return (\n setPublishLibSuccess(null)}\n title={t(\"publishSuccessDialog.title\")}\n className=\"publish-library-success\"\n small={true}\n >\n

\n {t(\"publishSuccessDialog.content\", {\n authorName: publishLibSuccess!.authorName,\n })}{\" \"}\n \n {t(\"publishSuccessDialog.link\")}\n \n

\n setPublishLibSuccess(null)}\n data-testid=\"publish-library-success-close\"\n className=\"publish-library-success-close\"\n />\n \n );\n }, [setPublishLibSuccess, publishLibSuccess]);\n\n const onPublishLibSuccess = useCallback(\n (data) => {\n setShowPublishLibraryDialog(false);\n setPublishLibSuccess({ url: data.url, authorName: data.authorName });\n const nextLibItems = libraryItems.slice();\n nextLibItems.forEach((libItem) => {\n if (selectedItems.includes(libItem.id)) {\n libItem.status = \"published\";\n }\n });\n library.saveLibrary(nextLibItems);\n setLibraryItems(nextLibItems);\n },\n [\n setShowPublishLibraryDialog,\n setPublishLibSuccess,\n libraryItems,\n selectedItems,\n library,\n ],\n );\n\n const [lastSelectedItem, setLastSelectedItem] = useState<\n LibraryItem[\"id\"] | null\n >(null);\n\n return loadingState === \"preloading\" ? null : (\n \n {showPublishLibraryDialog && (\n setShowPublishLibraryDialog(false)}\n libraryItems={getSelectedItems(libraryItems, selectedItems)}\n appState={appState}\n onSuccess={onPublishLibSuccess}\n onError={(error) => window.alert(error)}\n updateItemsInStorage={() => library.saveLibrary(libraryItems)}\n onRemove={(id: string) =>\n setSelectedItems(selectedItems.filter((_id) => _id !== id))\n }\n />\n )}\n {publishLibSuccess && renderPublishSuccess()}\n\n {loadingState === \"loading\" ? (\n
\n {t(\"labels.libraryLoadingMessage\")}\n
\n ) : (\n {\n const shouldSelect = !selectedItems.includes(id);\n\n if (shouldSelect) {\n if (event.shiftKey && lastSelectedItem) {\n const rangeStart = libraryItems.findIndex(\n (item) => item.id === lastSelectedItem,\n );\n const rangeEnd = libraryItems.findIndex(\n (item) => item.id === id,\n );\n\n if (rangeStart === -1 || rangeEnd === -1) {\n setSelectedItems([...selectedItems, id]);\n return;\n }\n\n const selectedItemsMap = arrayToMap(selectedItems);\n const nextSelectedIds = libraryItems.reduce(\n (acc: LibraryItem[\"id\"][], item, idx) => {\n if (\n (idx >= rangeStart && idx <= rangeEnd) ||\n selectedItemsMap.has(item.id)\n ) {\n acc.push(item.id);\n }\n return acc;\n },\n [],\n );\n\n setSelectedItems(nextSelectedIds);\n } else {\n setSelectedItems([...selectedItems, id]);\n }\n setLastSelectedItem(id);\n } else {\n setLastSelectedItem(null);\n setSelectedItems(selectedItems.filter((_id) => _id !== id));\n }\n }}\n onPublish={() => setShowPublishLibraryDialog(true)}\n resetLibrary={resetLibrary}\n />\n )}\n
\n );\n};\n","import clsx from \"clsx\";\nimport React, { useCallback } from \"react\";\nimport { ActionManager } from \"../actions/manager\";\nimport { CLASSES } from \"../constants\";\nimport { exportCanvas } from \"../data\";\nimport { isTextElement, showSelectedShapeActions } from \"../element\";\nimport { NonDeletedExcalidrawElement } from \"../element/types\";\nimport { Language, t } from \"../i18n\";\nimport { useIsMobile } from \"../components/App\";\nimport { calculateScrollCenter, getSelectedElements } from \"../scene\";\nimport { ExportType } from \"../scene/types\";\nimport { AppProps, AppState, ExcalidrawProps, BinaryFiles } from \"../types\";\nimport { muteFSAbortError } from \"../utils\";\nimport { SelectedShapeActions, ShapesSwitcher, ZoomActions } from \"./Actions\";\nimport { BackgroundPickerAndDarkModeToggle } from \"./BackgroundPickerAndDarkModeToggle\";\nimport CollabButton from \"./CollabButton\";\nimport { ErrorDialog } from \"./ErrorDialog\";\nimport { ExportCB, ImageExportDialog } from \"./ImageExportDialog\";\nimport { FixedSideContainer } from \"./FixedSideContainer\";\nimport { HintViewer } from \"./HintViewer\";\nimport { Island } from \"./Island\";\nimport { LoadingMessage } from \"./LoadingMessage\";\nimport { LockButton } from \"./LockButton\";\nimport { MobileMenu } from \"./MobileMenu\";\nimport { PasteChartDialog } from \"./PasteChartDialog\";\nimport { Section } from \"./Section\";\nimport { HelpDialog } from \"./HelpDialog\";\nimport Stack from \"./Stack\";\nimport { Tooltip } from \"./Tooltip\";\nimport { UserList } from \"./UserList\";\nimport Library from \"../data/library\";\nimport { JSONExportDialog } from \"./JSONExportDialog\";\nimport { LibraryButton } from \"./LibraryButton\";\nimport { isImageFileHandle } from \"../data/blob\";\nimport { LibraryMenu } from \"./LibraryMenu\";\n\nimport \"./LayerUI.scss\";\nimport \"./Toolbar.scss\";\nimport { PenModeButton } from \"./PenModeButton\";\n\ninterface LayerUIProps {\n actionManager: ActionManager;\n appState: AppState;\n files: BinaryFiles;\n canvas: HTMLCanvasElement | null;\n setAppState: React.Component[\"setState\"];\n elements: readonly NonDeletedExcalidrawElement[];\n onCollabButtonClick?: () => void;\n onLockToggle: () => void;\n onPenModeToggle: () => void;\n onInsertElements: (elements: readonly NonDeletedExcalidrawElement[]) => void;\n zenModeEnabled: boolean;\n showExitZenModeBtn: boolean;\n showThemeBtn: boolean;\n toggleZenMode: () => void;\n langCode: Language[\"code\"];\n isCollaborating: boolean;\n renderTopRightUI?: (\n isMobile: boolean,\n appState: AppState,\n ) => JSX.Element | null;\n renderCustomFooter?: (isMobile: boolean, appState: AppState) => JSX.Element;\n viewModeEnabled: boolean;\n libraryReturnUrl: ExcalidrawProps[\"libraryReturnUrl\"];\n UIOptions: AppProps[\"UIOptions\"];\n focusContainer: () => void;\n library: Library;\n id: string;\n onImageAction: (data: { insertOnCanvasDirectly: boolean }) => void;\n}\n\nconst LayerUI = ({\n actionManager,\n appState,\n files,\n setAppState,\n canvas,\n elements,\n onCollabButtonClick,\n onLockToggle,\n onPenModeToggle,\n onInsertElements,\n zenModeEnabled,\n showExitZenModeBtn,\n showThemeBtn,\n toggleZenMode,\n isCollaborating,\n renderTopRightUI,\n renderCustomFooter,\n viewModeEnabled,\n libraryReturnUrl,\n UIOptions,\n focusContainer,\n library,\n id,\n onImageAction,\n}: LayerUIProps) => {\n const isMobile = useIsMobile();\n\n const renderJSONExportDialog = () => {\n if (!UIOptions.canvasActions.export) {\n return null;\n }\n\n return (\n \n );\n };\n\n const renderImageExportDialog = () => {\n if (!UIOptions.canvasActions.saveAsImage) {\n return null;\n }\n\n const createExporter =\n (type: ExportType): ExportCB =>\n async (exportedElements) => {\n const fileHandle = await exportCanvas(\n type,\n exportedElements,\n appState,\n files,\n {\n exportBackground: appState.exportBackground,\n name: appState.name,\n viewBackgroundColor: appState.viewBackgroundColor,\n },\n )\n .catch(muteFSAbortError)\n .catch((error) => {\n console.error(error);\n setAppState({ errorMessage: error.message });\n });\n\n if (\n appState.exportEmbedScene &&\n fileHandle &&\n isImageFileHandle(fileHandle)\n ) {\n setAppState({ fileHandle });\n }\n };\n\n return (\n \n );\n };\n\n const Separator = () => {\n return
;\n };\n\n const renderViewModeCanvasActions = () => {\n return (\n \n {/* the zIndex ensures this menu has higher stacking order,\n see https://github.com/excalidraw/excalidraw/pull/1445 */}\n \n \n \n {renderJSONExportDialog()}\n {renderImageExportDialog()}\n \n \n \n \n );\n };\n\n const renderCanvasActions = () => (\n \n {/* the zIndex ensures this menu has higher stacking order,\n see https://github.com/excalidraw/excalidraw/pull/1445 */}\n \n \n \n {actionManager.renderAction(\"clearCanvas\")}\n \n {actionManager.renderAction(\"loadScene\")}\n {renderJSONExportDialog()}\n {renderImageExportDialog()}\n \n {onCollabButtonClick && (\n \n )}\n \n \n {appState.fileHandle && (\n <>{actionManager.renderAction(\"saveToActiveFile\")}\n )}\n \n \n \n );\n\n const renderSelectedShapeActions = () => (\n \n \n \n \n \n );\n\n const closeLibrary = useCallback(() => {\n const isDialogOpen = !!document.querySelector(\".Dialog\");\n\n // Prevent closing if any dialog is open\n if (isDialogOpen) {\n return;\n }\n setAppState({ isLibraryOpen: false });\n }, [setAppState]);\n\n const deselectItems = useCallback(() => {\n setAppState({\n selectedElementIds: {},\n selectedGroupIds: {},\n });\n }, [setAppState]);\n\n const libraryMenu = appState.isLibraryOpen ? (\n \n ) : null;\n\n const renderFixedSideContainer = () => {\n const shouldRenderSelectedShapeActions = showSelectedShapeActions(\n appState,\n elements,\n );\n\n return (\n \n
\n \n {viewModeEnabled\n ? renderViewModeCanvasActions()\n : renderCanvasActions()}\n {shouldRenderSelectedShapeActions && renderSelectedShapeActions()}\n \n {!viewModeEnabled && (\n
\n {(heading) => (\n \n \n \n \n \n \n {heading}\n \n {\n onImageAction({\n insertOnCanvasDirectly: pointerType !== \"mouse\",\n });\n }}\n />\n \n \n \n \n {libraryMenu}\n \n )}\n
\n )}\n \n \n {appState.collaborators.size > 0 &&\n Array.from(appState.collaborators)\n // Collaborator is either not initialized or is actually the current user.\n .filter(([_, client]) => Object.keys(client).length !== 0)\n .map(([clientId, client]) => (\n \n {actionManager.renderAction(\"goToCollaborator\", {\n id: clientId,\n })}\n \n ))}\n \n {renderTopRightUI?.(isMobile, appState)}\n
\n
\n \n );\n };\n\n const renderBottomAppMenu = () => {\n return (\n \n \n \n
\n \n \n \n {!viewModeEnabled && (\n \n {actionManager.renderAction(\"undo\", { size: \"small\" })}\n {actionManager.renderAction(\"redo\", { size: \"small\" })}\n \n )}\n
\n
\n \n \n {renderCustomFooter?.(false, appState)}\n \n \n {actionManager.renderAction(\"toggleShortcuts\")}\n \n \n {t(\"buttons.exitZenMode\")}\n \n \n );\n };\n\n const dialogs = (\n <>\n {appState.isLoading && }\n {appState.errorMessage && (\n setAppState({ errorMessage: null })}\n />\n )}\n {appState.showHelpDialog && (\n {\n setAppState({ showHelpDialog: false });\n }}\n />\n )}\n {appState.pasteDialog.shown && (\n \n setAppState({\n pasteDialog: { shown: false, data: null },\n })\n }\n />\n )}\n \n );\n\n return isMobile ? (\n <>\n {dialogs}\n \n \n ) : (\n \n {dialogs}\n {renderFixedSideContainer()}\n {renderBottomAppMenu()}\n {appState.scrolledOutside && (\n {\n setAppState({\n ...calculateScrollCenter(elements, appState, canvas),\n });\n }}\n >\n {t(\"buttons.scrollBackToContent\")}\n \n )}\n \n );\n};\n\nconst areEqual = (prev: LayerUIProps, next: LayerUIProps) => {\n const getNecessaryObj = (appState: AppState): Partial => {\n const {\n suggestedBindings,\n startBoundElement: boundElement,\n ...ret\n } = appState;\n return ret;\n };\n const prevAppState = getNecessaryObj(prev.appState);\n const nextAppState = getNecessaryObj(next.appState);\n\n const keys = Object.keys(prevAppState) as (keyof Partial)[];\n return (\n prev.renderCustomFooter === next.renderCustomFooter &&\n prev.langCode === next.langCode &&\n prev.elements === next.elements &&\n prev.files === next.files &&\n keys.every((key) => prevAppState[key] === nextAppState[key])\n );\n};\n\nexport default React.memo(LayerUI, areEqual);\n","import React from \"react\";\nimport { getCommonBounds } from \"../element/bounds\";\nimport { NonDeletedExcalidrawElement } from \"../element/types\";\nimport { t } from \"../i18n\";\nimport { useIsMobile } from \"../components/App\";\nimport { getTargetElements } from \"../scene\";\nimport { AppState, ExcalidrawProps } from \"../types\";\nimport { close } from \"./icons\";\nimport { Island } from \"./Island\";\nimport \"./Stats.scss\";\n\nexport const Stats = (props: {\n appState: AppState;\n setAppState: React.Component[\"setState\"];\n elements: readonly NonDeletedExcalidrawElement[];\n onClose: () => void;\n renderCustomStats: ExcalidrawProps[\"renderCustomStats\"];\n}) => {\n const isMobile = useIsMobile();\n\n const boundingBox = getCommonBounds(props.elements);\n const selectedElements = getTargetElements(props.elements, props.appState);\n const selectedBoundingBox = getCommonBounds(selectedElements);\n\n if (isMobile && props.appState.openMenu) {\n return null;\n }\n\n return (\n
\n \n
\n {close}\n
\n

{t(\"stats.title\")}

\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n {selectedElements.length === 1 && (\n \n \n \n )}\n\n {selectedElements.length > 1 && (\n <>\n \n \n \n \n \n \n \n \n )}\n {selectedElements.length > 0 && (\n <>\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )}\n {selectedElements.length === 1 && (\n \n \n \n \n )}\n {props.renderCustomStats?.(props.elements, props.appState)}\n \n
{t(\"stats.scene\")}
{t(\"stats.elements\")}{props.elements.length}
{t(\"stats.width\")}{Math.round(boundingBox[2]) - Math.round(boundingBox[0])}
{t(\"stats.height\")}{Math.round(boundingBox[3]) - Math.round(boundingBox[1])}
{t(\"stats.element\")}
{t(\"stats.selected\")}
{t(\"stats.elements\")}{selectedElements.length}
{\"x\"}{Math.round(selectedBoundingBox[0])}
{\"y\"}{Math.round(selectedBoundingBox[1])}
{t(\"stats.width\")}\n {Math.round(\n selectedBoundingBox[2] - selectedBoundingBox[0],\n )}\n
{t(\"stats.height\")}\n {Math.round(\n selectedBoundingBox[3] - selectedBoundingBox[1],\n )}\n
{t(\"stats.angle\")}\n {`${Math.round(\n (selectedElements[0].angle * 180) / Math.PI,\n )}°`}\n
\n
\n
\n );\n};\n","import { useCallback, useEffect, useRef } from \"react\";\nimport { TOAST_TIMEOUT } from \"../constants\";\nimport \"./Toast.scss\";\n\nexport const Toast = ({\n message,\n clearToast,\n}: {\n message: string;\n clearToast: () => void;\n}) => {\n const timerRef = useRef(0);\n\n const scheduleTimeout = useCallback(\n () =>\n (timerRef.current = window.setTimeout(() => clearToast(), TOAST_TIMEOUT)),\n [clearToast],\n );\n\n useEffect(() => {\n scheduleTimeout();\n return () => clearTimeout(timerRef.current);\n }, [scheduleTimeout, message]);\n\n return (\n clearTimeout(timerRef?.current)}\n onMouseLeave={scheduleTimeout}\n >\n

{message}

\n \n );\n};\n","import { CODES, KEYS } from \"../keys\";\nimport { register } from \"./register\";\nimport { trackEvent } from \"../analytics\";\n\nexport const actionToggleViewMode = register({\n name: \"viewMode\",\n perform(elements, appState) {\n trackEvent(\"view\", \"mode\", \"view\");\n return {\n appState: {\n ...appState,\n viewModeEnabled: !this.checked!(appState),\n },\n commitToHistory: false,\n };\n },\n checked: (appState) => appState.viewModeEnabled,\n contextItemLabel: \"labels.viewMode\",\n keyTest: (event) =>\n !event[KEYS.CTRL_OR_CMD] && event.altKey && event.code === CODES.R,\n});\n","import React, { useContext } from \"react\";\nimport { RoughCanvas } from \"roughjs/bin/canvas\";\nimport rough from \"roughjs/bin/rough\";\nimport clsx from \"clsx\";\nimport { nanoid } from \"nanoid\";\n\nimport {\n actionAddToLibrary,\n actionBringForward,\n actionBringToFront,\n actionCopy,\n actionCopyAsPng,\n actionCopyAsSvg,\n actionCopyStyles,\n actionCut,\n actionDeleteSelected,\n actionDuplicateSelection,\n actionFinalize,\n actionFlipHorizontal,\n actionFlipVertical,\n actionGroup,\n actionPasteStyles,\n actionSelectAll,\n actionSendBackward,\n actionSendToBack,\n actionToggleGridMode,\n actionToggleStats,\n actionToggleZenMode,\n actionUnbindText,\n actionUngroup,\n actionLink,\n} from \"../actions\";\nimport { createRedoAction, createUndoAction } from \"../actions/actionHistory\";\nimport { ActionManager } from \"../actions/manager\";\nimport { actions } from \"../actions/register\";\nimport { ActionResult } from \"../actions/types\";\nimport { trackEvent } from \"../analytics\";\nimport { getDefaultAppState } from \"../appState\";\nimport {\n copyToClipboard,\n parseClipboard,\n probablySupportsClipboardBlob,\n probablySupportsClipboardWriteText,\n} from \"../clipboard\";\nimport {\n APP_NAME,\n CURSOR_TYPE,\n DEFAULT_MAX_IMAGE_WIDTH_OR_HEIGHT,\n DEFAULT_UI_OPTIONS,\n DEFAULT_VERTICAL_ALIGN,\n DRAGGING_THRESHOLD,\n ELEMENT_SHIFT_TRANSLATE_AMOUNT,\n ELEMENT_TRANSLATE_AMOUNT,\n ENV,\n EVENT,\n GRID_SIZE,\n IMAGE_RENDER_TIMEOUT,\n LINE_CONFIRM_THRESHOLD,\n MAX_ALLOWED_FILE_BYTES,\n MIME_TYPES,\n MQ_MAX_HEIGHT_LANDSCAPE,\n MQ_MAX_WIDTH_LANDSCAPE,\n MQ_MAX_WIDTH_PORTRAIT,\n POINTER_BUTTON,\n SCROLL_TIMEOUT,\n TAP_TWICE_TIMEOUT,\n TEXT_TO_CENTER_SNAP_THRESHOLD,\n THEME,\n TOUCH_CTX_MENU_TIMEOUT,\n URL_HASH_KEYS,\n URL_QUERY_KEYS,\n VERTICAL_ALIGN,\n ZOOM_STEP,\n} from \"../constants\";\nimport { loadFromBlob } from \"../data\";\nimport { isValidLibrary } from \"../data/json\";\nimport Library from \"../data/library\";\nimport { restore, restoreElements, restoreLibraryItems } from \"../data/restore\";\nimport {\n dragNewElement,\n dragSelectedElements,\n duplicateElement,\n getCommonBounds,\n getCursorForResizingElement,\n getDragOffsetXY,\n getElementWithTransformHandleType,\n getNormalizedDimensions,\n getPerfectElementSize,\n getResizeArrowDirection,\n getResizeOffsetXY,\n getTransformHandleTypeFromCoords,\n hitTest,\n isHittingElementBoundingBoxWithoutHittingElement,\n isInvisiblySmallElement,\n isNonDeletedElement,\n isTextElement,\n newElement,\n newLinearElement,\n newTextElement,\n newImageElement,\n textWysiwyg,\n transformElements,\n updateTextElement,\n} from \"../element\";\nimport {\n bindOrUnbindSelectedElements,\n fixBindingsAfterDeletion,\n fixBindingsAfterDuplication,\n getEligibleElementsForBinding,\n getHoveredElementForBinding,\n isBindingEnabled,\n isLinearElementSimpleAndAlreadyBound,\n maybeBindLinearElement,\n shouldEnableBindingForPointerEvent,\n unbindLinearElements,\n updateBoundElements,\n} from \"../element/binding\";\nimport { LinearElementEditor } from \"../element/linearElementEditor\";\nimport { mutateElement, newElementWith } from \"../element/mutateElement\";\nimport { deepCopyElement, newFreeDrawElement } from \"../element/newElement\";\nimport {\n hasBoundTextElement,\n isBindingElement,\n isBindingElementType,\n isBoundToContainer,\n isImageElement,\n isInitializedImageElement,\n isLinearElement,\n isLinearElementType,\n isTextBindableContainer,\n} from \"../element/typeChecks\";\nimport {\n ExcalidrawBindableElement,\n ExcalidrawElement,\n ExcalidrawFreeDrawElement,\n ExcalidrawGenericElement,\n ExcalidrawLinearElement,\n ExcalidrawTextElement,\n NonDeleted,\n InitializedExcalidrawImageElement,\n ExcalidrawImageElement,\n FileId,\n NonDeletedExcalidrawElement,\n ExcalidrawTextContainer,\n} from \"../element/types\";\nimport { getCenter, getDistance } from \"../gesture\";\nimport {\n editGroupForSelectedElement,\n getElementsInGroup,\n getSelectedGroupIdForElement,\n getSelectedGroupIds,\n isElementInGroup,\n isSelectedViaGroup,\n selectGroupsForSelectedElements,\n} from \"../groups\";\nimport History from \"../history\";\nimport { defaultLang, getLanguage, languages, setLanguage, t } from \"../i18n\";\nimport {\n CODES,\n shouldResizeFromCenter,\n shouldMaintainAspectRatio,\n shouldRotateWithDiscreteAngle,\n isArrowKey,\n KEYS,\n isAndroid,\n} from \"../keys\";\nimport { distance2d, getGridPoint, isPathALoop } from \"../math\";\nimport { renderScene } from \"../renderer\";\nimport { invalidateShapeForElement } from \"../renderer/renderElement\";\nimport {\n calculateScrollCenter,\n getTextBindableContainerAtPosition,\n getElementsAtPosition,\n getElementsWithinSelection,\n getNormalizedZoom,\n getSelectedElements,\n hasBackground,\n isOverScrollBars,\n isSomeElementSelected,\n} from \"../scene\";\nimport Scene from \"../scene/Scene\";\nimport { RenderConfig, ScrollBars } from \"../scene/types\";\nimport { getStateForZoom } from \"../scene/zoom\";\nimport { findShapeByKey } from \"../shapes\";\nimport {\n AppClassProperties,\n AppProps,\n AppState,\n BinaryFileData,\n DataURL,\n ExcalidrawImperativeAPI,\n BinaryFiles,\n Gesture,\n GestureEvent,\n LibraryItems,\n PointerDownState,\n SceneData,\n} from \"../types\";\nimport {\n debounce,\n distance,\n getFontString,\n getNearestScrollableContainer,\n isInputLike,\n isToolIcon,\n isWritableElement,\n resetCursor,\n resolvablePromise,\n sceneCoordsToViewportCoords,\n setCursor,\n setCursorForShape,\n tupleToCoors,\n viewportCoordsToSceneCoords,\n withBatchedUpdates,\n wrapEvent,\n withBatchedUpdatesThrottled,\n} from \"../utils\";\nimport ContextMenu, { ContextMenuOption } from \"./ContextMenu\";\nimport LayerUI from \"./LayerUI\";\nimport { Stats } from \"./Stats\";\nimport { Toast } from \"./Toast\";\nimport { actionToggleViewMode } from \"../actions/actionToggleViewMode\";\nimport {\n dataURLToFile,\n generateIdFromFile,\n getDataURL,\n isSupportedImageFile,\n resizeImageFile,\n SVGStringToFile,\n} from \"../data/blob\";\nimport {\n getInitializedImageElements,\n loadHTMLImageElement,\n normalizeSVG,\n updateImageCache as _updateImageCache,\n} from \"../element/image\";\nimport throttle from \"lodash.throttle\";\nimport { fileOpen, nativeFileSystemSupported } from \"../data/filesystem\";\nimport {\n bindTextToShapeAfterDuplication,\n getApproxMinLineHeight,\n getApproxMinLineWidth,\n getBoundTextElement,\n} from \"../element/textElement\";\nimport { isHittingElementNotConsideringBoundingBox } from \"../element/collision\";\nimport {\n normalizeLink,\n showHyperlinkTooltip,\n hideHyperlinkToolip,\n Hyperlink,\n isPointHittingLinkIcon,\n isLocalLink,\n} from \"../element/Hyperlink\";\n\n\n\nconst IsMobileContext = React.createContext(false);\nexport const useIsMobile = () => useContext(IsMobileContext);\nconst ExcalidrawContainerContext = React.createContext<{\n container: HTMLDivElement | null;\n id: string | null;\n}>({ container: null, id: null });\nexport const useExcalidrawContainer = () =>\n useContext(ExcalidrawContainerContext);\n\nlet didTapTwice: boolean = false;\nlet tappedTwiceTimer = 0;\nlet cursorX = 0;\nlet cursorY = 0;\nlet isHoldingSpace: boolean = false;\nlet isPanning: boolean = false;\nlet isDraggingScrollBar: boolean = false;\nlet currentScrollBars: ScrollBars = { horizontal: null, vertical: null };\nlet touchTimeout = 0;\nlet invalidateContextMenu = false;\n\nlet lastPointerUp: ((event: any) => void) | null = null;\nconst gesture: Gesture = {\n pointers: new Map(),\n lastCenter: null,\n initialDistance: null,\n initialScale: null,\n};\n\nclass App extends React.Component {\n canvas: AppClassProperties[\"canvas\"] = null;\n rc: RoughCanvas | null = null;\n unmounted: boolean = false;\n actionManager: ActionManager;\n isMobile = false;\n detachIsMobileMqHandler?: () => void;\n\n private excalidrawContainerRef = React.createRef();\n\n public static defaultProps: Partial = {\n // needed for tests to pass since we directly render App in many tests\n UIOptions: DEFAULT_UI_OPTIONS,\n };\n\n private scene: Scene;\n private resizeObserver: ResizeObserver | undefined;\n private nearestScrollableContainer: HTMLElement | Document | undefined;\n public library: AppClassProperties[\"library\"];\n public libraryItemsFromStorage: LibraryItems | undefined;\n private id: string;\n private history: History;\n private excalidrawContainerValue: {\n container: HTMLDivElement | null;\n id: string;\n };\n\n public files: BinaryFiles = {};\n public imageCache: AppClassProperties[\"imageCache\"] = new Map();\n\n hitLinkElement?: NonDeletedExcalidrawElement;\n lastPointerDown: React.PointerEvent | null = null;\n lastPointerUp: React.PointerEvent | PointerEvent | null = null;\n contextMenuOpen: boolean = false;\n\n constructor(props: AppProps) {\n super(props);\n const defaultAppState = getDefaultAppState();\n const {\n excalidrawRef,\n viewModeEnabled = false,\n zenModeEnabled = false,\n gridModeEnabled = false,\n theme = defaultAppState.theme,\n name = defaultAppState.name,\n } = props;\n this.state = {\n ...defaultAppState,\n theme,\n isLoading: true,\n ...this.getCanvasOffsets(),\n viewModeEnabled,\n zenModeEnabled,\n gridSize: gridModeEnabled ? GRID_SIZE : null,\n name,\n width: window.innerWidth,\n height: window.innerHeight,\n showHyperlinkPopup: false,\n };\n\n this.id = nanoid();\n\n if (excalidrawRef) {\n const readyPromise =\n (\"current\" in excalidrawRef && excalidrawRef.current?.readyPromise) ||\n resolvablePromise();\n\n const api: ExcalidrawImperativeAPI = {\n ready: true,\n readyPromise,\n updateScene: this.updateScene,\n addFiles: this.addFiles,\n resetScene: this.resetScene,\n getSceneElementsIncludingDeleted: this.getSceneElementsIncludingDeleted,\n history: {\n clear: this.resetHistory,\n },\n scrollToContent: this.scrollToContent,\n getSceneElements: this.getSceneElements,\n getAppState: () => this.state,\n getFiles: () => this.files,\n refresh: this.refresh,\n importLibrary: this.importLibraryFromUrl,\n setToastMessage: this.setToastMessage,\n id: this.id,\n } as const;\n if (typeof excalidrawRef === \"function\") {\n excalidrawRef(api);\n } else {\n excalidrawRef.current = api;\n }\n readyPromise.resolve(api);\n }\n\n this.excalidrawContainerValue = {\n container: this.excalidrawContainerRef.current,\n id: this.id,\n };\n\n this.scene = new Scene();\n this.library = new Library(this);\n this.history = new History();\n this.actionManager = new ActionManager(\n this.syncActionResult,\n () => this.state,\n () => this.scene.getElementsIncludingDeleted(),\n this,\n );\n this.actionManager.registerAll(actions);\n\n this.actionManager.registerAction(createUndoAction(this.history));\n this.actionManager.registerAction(createRedoAction(this.history));\n }\n\n private renderCanvas() {\n const canvasScale = window.devicePixelRatio;\n const {\n width: canvasDOMWidth,\n height: canvasDOMHeight,\n viewModeEnabled,\n } = this.state;\n const canvasWidth = canvasDOMWidth * canvasScale;\n const canvasHeight = canvasDOMHeight * canvasScale;\n if (viewModeEnabled) {\n return (\n \n {t(\"labels.drawingCanvas\")}\n \n );\n }\n return (\n \n {t(\"labels.drawingCanvas\")}\n \n );\n }\n\n public render() {\n const { zenModeEnabled, viewModeEnabled } = this.state;\n const selectedElement = getSelectedElements(\n this.scene.getElements(),\n this.state,\n );\n const {\n onCollabButtonClick,\n renderTopRightUI,\n renderFooter,\n renderCustomStats,\n } = this.props;\n\n return (\n \n \n \n \n this.addElementsFromPasteOrLibrary({\n elements,\n position: \"center\",\n files: null,\n })\n }\n zenModeEnabled={zenModeEnabled}\n toggleZenMode={this.toggleZenMode}\n langCode={getLanguage().code}\n isCollaborating={this.props.isCollaborating}\n renderTopRightUI={renderTopRightUI}\n renderCustomFooter={renderFooter}\n viewModeEnabled={viewModeEnabled}\n showExitZenModeBtn={\n typeof this.props?.zenModeEnabled === \"undefined\" &&\n zenModeEnabled\n }\n showThemeBtn={\n typeof this.props?.theme === \"undefined\" &&\n this.props.UIOptions.canvasActions.theme\n }\n libraryReturnUrl={this.props.libraryReturnUrl}\n UIOptions={this.props.UIOptions}\n focusContainer={this.focusContainer}\n library={this.library}\n id={this.id}\n onImageAction={this.onImageAction}\n />\n
\n
\n {selectedElement.length === 1 && this.state.showHyperlinkPopup && (\n \n )}\n {this.state.showStats && (\n \n )}\n {this.state.toastMessage !== null && (\n \n )}\n
{this.renderCanvas()}
\n \n \n
\n );\n }\n\n public focusContainer: AppClassProperties[\"focusContainer\"] = () => {\n if (this.props.autoFocus) {\n this.excalidrawContainerRef.current?.focus();\n }\n };\n\n public getSceneElementsIncludingDeleted = () => {\n return this.scene.getElementsIncludingDeleted();\n };\n\n public getSceneElements = () => {\n return this.scene.getElements();\n };\n\n private syncActionResult = withBatchedUpdates(\n (actionResult: ActionResult) => {\n // Since context menu closes when action triggered so setting to false\n this.contextMenuOpen = false;\n if (this.unmounted || actionResult === false) {\n return;\n }\n\n let editingElement: AppState[\"editingElement\"] | null = null;\n if (actionResult.elements) {\n actionResult.elements.forEach((element) => {\n if (\n this.state.editingElement?.id === element.id &&\n this.state.editingElement !== element &&\n isNonDeletedElement(element)\n ) {\n editingElement = element;\n }\n });\n this.scene.replaceAllElements(actionResult.elements);\n if (actionResult.commitToHistory) {\n this.history.resumeRecording();\n }\n }\n\n if (actionResult.files) {\n this.files = actionResult.replaceFiles\n ? actionResult.files\n : { ...this.files, ...actionResult.files };\n this.addNewImagesToImageCache();\n }\n\n if (actionResult.appState || editingElement) {\n if (actionResult.commitToHistory) {\n this.history.resumeRecording();\n }\n\n let viewModeEnabled = actionResult?.appState?.viewModeEnabled || false;\n let zenModeEnabled = actionResult?.appState?.zenModeEnabled || false;\n let gridSize = actionResult?.appState?.gridSize || null;\n let theme = actionResult?.appState?.theme || THEME.LIGHT;\n let name = actionResult?.appState?.name ?? this.state.name;\n if (typeof this.props.viewModeEnabled !== \"undefined\") {\n viewModeEnabled = this.props.viewModeEnabled;\n }\n\n if (typeof this.props.zenModeEnabled !== \"undefined\") {\n zenModeEnabled = this.props.zenModeEnabled;\n }\n\n if (typeof this.props.gridModeEnabled !== \"undefined\") {\n gridSize = this.props.gridModeEnabled ? GRID_SIZE : null;\n }\n\n if (typeof this.props.theme !== \"undefined\") {\n theme = this.props.theme;\n }\n\n if (typeof this.props.name !== \"undefined\") {\n name = this.props.name;\n }\n this.setState(\n (state) => {\n // using Object.assign instead of spread to fool TS 4.2.2+ into\n // regarding the resulting type as not containing undefined\n // (which the following expression will never contain)\n return Object.assign(actionResult.appState || {}, {\n editingElement:\n editingElement || actionResult.appState?.editingElement || null,\n viewModeEnabled,\n zenModeEnabled,\n gridSize,\n theme,\n name,\n });\n },\n () => {\n if (actionResult.syncHistory) {\n this.history.setCurrentState(\n this.state,\n this.scene.getElementsIncludingDeleted(),\n );\n }\n },\n );\n }\n },\n );\n\n // Lifecycle\n\n private onBlur = withBatchedUpdates(() => {\n isHoldingSpace = false;\n this.setState({ isBindingEnabled: true });\n });\n\n private onUnload = () => {\n this.onBlur();\n };\n\n private disableEvent: EventListener = (event) => {\n event.preventDefault();\n };\n\n private onFontLoaded = () => {\n this.scene.getElementsIncludingDeleted().forEach((element) => {\n if (isTextElement(element)) {\n invalidateShapeForElement(element);\n }\n });\n this.onSceneUpdated();\n };\n\n private importLibraryFromUrl = async (url: string, token?: string | null) => {\n if (window.location.hash.includes(URL_HASH_KEYS.addLibrary)) {\n const hash = new URLSearchParams(window.location.hash.slice(1));\n hash.delete(URL_HASH_KEYS.addLibrary);\n window.history.replaceState({}, APP_NAME, `#${hash.toString()}`);\n } else if (window.location.search.includes(URL_QUERY_KEYS.addLibrary)) {\n const query = new URLSearchParams(window.location.search);\n query.delete(URL_QUERY_KEYS.addLibrary);\n window.history.replaceState({}, APP_NAME, `?${query.toString()}`);\n }\n\n try {\n const request = await fetch(decodeURIComponent(url));\n const blob = await request.blob();\n const json = JSON.parse(await blob.text());\n if (!isValidLibrary(json)) {\n throw new Error();\n }\n if (\n token === this.id ||\n window.confirm(\n t(\"alerts.confirmAddLibrary\", {\n numShapes: (json.libraryItems || json.library || []).length,\n }),\n )\n ) {\n await this.library.importLibrary(blob, \"published\");\n // hack to rerender the library items after import\n if (this.state.isLibraryOpen) {\n this.setState({ isLibraryOpen: false });\n }\n this.setState({ isLibraryOpen: true });\n }\n } catch (error: any) {\n window.alert(t(\"alerts.errorLoadingLibrary\"));\n console.error(error);\n } finally {\n this.focusContainer();\n }\n };\n\n private resetHistory = () => {\n this.history.clear();\n };\n\n /**\n * Resets scene & history.\n * ! Do not use to clear scene user action !\n */\n private resetScene = withBatchedUpdates(\n (opts?: { resetLoadingState: boolean }) => {\n this.scene.replaceAllElements([]);\n this.setState((state) => ({\n ...getDefaultAppState(),\n isLoading: opts?.resetLoadingState ? false : state.isLoading,\n theme: this.state.theme,\n }));\n this.resetHistory();\n },\n );\n\n private initializeScene = async () => {\n if (\"launchQueue\" in window && \"LaunchParams\" in window) {\n (window as any).launchQueue.setConsumer(\n async (launchParams: { files: any[] }) => {\n if (!launchParams.files.length) {\n return;\n }\n const fileHandle = launchParams.files[0];\n const blob: Blob = await fileHandle.getFile();\n blob.handle = fileHandle;\n loadFromBlob(\n blob,\n this.state,\n this.scene.getElementsIncludingDeleted(),\n )\n .then((scene) => {\n this.syncActionResult({\n ...scene,\n appState: {\n ...(scene.appState || this.state),\n isLoading: false,\n },\n commitToHistory: true,\n });\n })\n .catch((error) => {\n this.setState({ isLoading: false, errorMessage: error.message });\n });\n },\n );\n }\n\n if (!this.state.isLoading) {\n this.setState({ isLoading: true });\n }\n let initialData = null;\n try {\n initialData = (await this.props.initialData) || null;\n if (initialData?.libraryItems) {\n this.libraryItemsFromStorage = restoreLibraryItems(\n initialData.libraryItems,\n \"unpublished\",\n ) as LibraryItems;\n }\n } catch (error: any) {\n console.error(error);\n initialData = {\n appState: {\n errorMessage:\n error.message ||\n \"Encountered an error during importing or restoring scene data\",\n },\n };\n }\n\n const scene = restore(initialData, null, null);\n\n scene.appState = {\n ...scene.appState,\n elementType:\n scene.appState.elementType === \"image\"\n ? \"selection\"\n : scene.appState.elementType,\n isLoading: false,\n };\n if (initialData?.scrollToContent) {\n scene.appState = {\n ...scene.appState,\n ...calculateScrollCenter(\n scene.elements,\n {\n ...scene.appState,\n width: this.state.width,\n height: this.state.height,\n offsetTop: this.state.offsetTop,\n offsetLeft: this.state.offsetLeft,\n },\n null,\n ),\n };\n }\n\n this.resetHistory();\n this.syncActionResult({\n ...scene,\n commitToHistory: true,\n });\n\n const libraryUrl =\n // current\n new URLSearchParams(window.location.hash.slice(1)).get(\n URL_HASH_KEYS.addLibrary,\n ) ||\n // legacy, kept for compat reasons\n new URLSearchParams(window.location.search).get(\n URL_QUERY_KEYS.addLibrary,\n );\n\n if (libraryUrl) {\n await this.importLibraryFromUrl(libraryUrl);\n }\n };\n\n public async componentDidMount() {\n this.unmounted = false;\n this.excalidrawContainerValue.container =\n this.excalidrawContainerRef.current;\n\n if (\n process.env.NODE_ENV === ENV.TEST ||\n process.env.NODE_ENV === ENV.DEVELOPMENT\n ) {\n const setState = this.setState.bind(this);\n Object.defineProperties(window.h, {\n state: {\n configurable: true,\n get: () => {\n return this.state;\n },\n },\n setState: {\n configurable: true,\n value: (...args: Parameters) => {\n return this.setState(...args);\n },\n },\n app: {\n configurable: true,\n value: this,\n },\n history: {\n configurable: true,\n value: this.history,\n },\n });\n }\n\n this.scene.addCallback(this.onSceneUpdated);\n this.addEventListeners();\n\n if (this.excalidrawContainerRef.current) {\n this.focusContainer();\n }\n\n if (\"ResizeObserver\" in window && this.excalidrawContainerRef?.current) {\n this.resizeObserver = new ResizeObserver(() => {\n // compute isMobile state\n // ---------------------------------------------------------------------\n const { width, height } =\n this.excalidrawContainerRef.current!.getBoundingClientRect();\n this.isMobile =\n width < MQ_MAX_WIDTH_PORTRAIT ||\n (height < MQ_MAX_HEIGHT_LANDSCAPE && width < MQ_MAX_WIDTH_LANDSCAPE);\n // refresh offsets\n // ---------------------------------------------------------------------\n this.updateDOMRect();\n });\n this.resizeObserver?.observe(this.excalidrawContainerRef.current);\n } else if (window.matchMedia) {\n const mediaQuery = window.matchMedia(\n `(max-width: ${MQ_MAX_WIDTH_PORTRAIT}px), (max-height: ${MQ_MAX_HEIGHT_LANDSCAPE}px) and (max-width: ${MQ_MAX_WIDTH_LANDSCAPE}px)`,\n );\n const handler = () => (this.isMobile = mediaQuery.matches);\n mediaQuery.addListener(handler);\n this.detachIsMobileMqHandler = () => mediaQuery.removeListener(handler);\n }\n\n const searchParams = new URLSearchParams(window.location.search.slice(1));\n\n if (searchParams.has(\"web-share-target\")) {\n // Obtain a file that was shared via the Web Share Target API.\n this.restoreFileFromShare();\n } else {\n this.updateDOMRect(this.initializeScene);\n }\n }\n\n public componentWillUnmount() {\n this.files = {};\n this.imageCache.clear();\n this.resizeObserver?.disconnect();\n this.unmounted = true;\n this.removeEventListeners();\n this.scene.destroy();\n clearTimeout(touchTimeout);\n touchTimeout = 0;\n }\n\n private onResize = withBatchedUpdates(() => {\n this.scene\n .getElementsIncludingDeleted()\n .forEach((element) => invalidateShapeForElement(element));\n this.setState({});\n });\n\n private removeEventListeners() {\n document.removeEventListener(EVENT.POINTER_UP, this.removePointer);\n document.removeEventListener(EVENT.COPY, this.onCopy);\n document.removeEventListener(EVENT.PASTE, this.pasteFromClipboard);\n document.removeEventListener(EVENT.CUT, this.onCut);\n this.nearestScrollableContainer?.removeEventListener(\n EVENT.SCROLL,\n this.onScroll,\n );\n document.removeEventListener(EVENT.KEYDOWN, this.onKeyDown, false);\n document.removeEventListener(\n EVENT.MOUSE_MOVE,\n this.updateCurrentCursorPosition,\n false,\n );\n document.removeEventListener(EVENT.KEYUP, this.onKeyUp);\n window.removeEventListener(EVENT.RESIZE, this.onResize, false);\n window.removeEventListener(EVENT.UNLOAD, this.onUnload, false);\n window.removeEventListener(EVENT.BLUR, this.onBlur, false);\n this.excalidrawContainerRef.current?.removeEventListener(\n EVENT.DRAG_OVER,\n this.disableEvent,\n false,\n );\n this.excalidrawContainerRef.current?.removeEventListener(\n EVENT.DROP,\n this.disableEvent,\n false,\n );\n\n document.removeEventListener(\n EVENT.GESTURE_START,\n this.onGestureStart as any,\n false,\n );\n document.removeEventListener(\n EVENT.GESTURE_CHANGE,\n this.onGestureChange as any,\n false,\n );\n document.removeEventListener(\n EVENT.GESTURE_END,\n this.onGestureEnd as any,\n false,\n );\n\n this.detachIsMobileMqHandler?.();\n }\n\n private addEventListeners() {\n this.removeEventListeners();\n document.addEventListener(EVENT.POINTER_UP, this.removePointer); // #3553\n document.addEventListener(EVENT.COPY, this.onCopy);\n if (this.props.handleKeyboardGlobally) {\n document.addEventListener(EVENT.KEYDOWN, this.onKeyDown, false);\n }\n document.addEventListener(EVENT.KEYUP, this.onKeyUp, { passive: true });\n document.addEventListener(\n EVENT.MOUSE_MOVE,\n this.updateCurrentCursorPosition,\n );\n // rerender text elements on font load to fix #637 && #1553\n document.fonts?.addEventListener?.(\"loadingdone\", this.onFontLoaded);\n // Safari-only desktop pinch zoom\n document.addEventListener(\n EVENT.GESTURE_START,\n this.onGestureStart as any,\n false,\n );\n document.addEventListener(\n EVENT.GESTURE_CHANGE,\n this.onGestureChange as any,\n false,\n );\n document.addEventListener(\n EVENT.GESTURE_END,\n this.onGestureEnd as any,\n false,\n );\n if (this.state.viewModeEnabled) {\n return;\n }\n\n document.addEventListener(EVENT.PASTE, this.pasteFromClipboard);\n document.addEventListener(EVENT.CUT, this.onCut);\n if (this.props.detectScroll) {\n this.nearestScrollableContainer = getNearestScrollableContainer(\n this.excalidrawContainerRef.current!,\n );\n this.nearestScrollableContainer.addEventListener(\n EVENT.SCROLL,\n this.onScroll,\n );\n }\n window.addEventListener(EVENT.RESIZE, this.onResize, false);\n window.addEventListener(EVENT.UNLOAD, this.onUnload, false);\n window.addEventListener(EVENT.BLUR, this.onBlur, false);\n this.excalidrawContainerRef.current?.addEventListener(\n EVENT.DRAG_OVER,\n this.disableEvent,\n false,\n );\n this.excalidrawContainerRef.current?.addEventListener(\n EVENT.DROP,\n this.disableEvent,\n false,\n );\n }\n\n componentDidUpdate(prevProps: AppProps, prevState: AppState) {\n // Hide hyperlink popup if shown when element type is not selection\n if (\n prevState.elementType === \"selection\" &&\n this.state.elementType !== \"selection\" &&\n this.state.showHyperlinkPopup\n ) {\n this.setState({ showHyperlinkPopup: false });\n }\n if (prevProps.langCode !== this.props.langCode) {\n this.updateLanguage();\n }\n\n if (prevProps.viewModeEnabled !== this.props.viewModeEnabled) {\n this.setState({ viewModeEnabled: !!this.props.viewModeEnabled });\n }\n\n if (prevState.viewModeEnabled !== this.state.viewModeEnabled) {\n this.addEventListeners();\n this.deselectElements();\n }\n\n if (prevProps.zenModeEnabled !== this.props.zenModeEnabled) {\n this.setState({ zenModeEnabled: !!this.props.zenModeEnabled });\n }\n\n if (prevProps.theme !== this.props.theme && this.props.theme) {\n this.setState({ theme: this.props.theme });\n }\n\n if (prevProps.gridModeEnabled !== this.props.gridModeEnabled) {\n this.setState({\n gridSize: this.props.gridModeEnabled ? GRID_SIZE : null,\n });\n }\n\n if (this.props.name && prevProps.name !== this.props.name) {\n this.setState({\n name: this.props.name,\n });\n }\n\n this.excalidrawContainerRef.current?.classList.toggle(\n \"theme--dark\",\n this.state.theme === \"dark\",\n );\n\n if (\n this.state.editingLinearElement &&\n !this.state.selectedElementIds[this.state.editingLinearElement.elementId]\n ) {\n // defer so that the commitToHistory flag isn't reset via current update\n setTimeout(() => {\n this.actionManager.executeAction(actionFinalize);\n });\n }\n const { multiElement } = prevState;\n if (\n prevState.elementType !== this.state.elementType &&\n multiElement != null &&\n isBindingEnabled(this.state) &&\n isBindingElement(multiElement)\n ) {\n maybeBindLinearElement(\n multiElement,\n this.state,\n this.scene,\n tupleToCoors(\n LinearElementEditor.getPointAtIndexGlobalCoordinates(\n multiElement,\n -1,\n ),\n ),\n );\n }\n\n const cursorButton: {\n [id: string]: string | undefined;\n } = {};\n const pointerViewportCoords: RenderConfig[\"remotePointerViewportCoords\"] =\n {};\n const remoteSelectedElementIds: RenderConfig[\"remoteSelectedElementIds\"] =\n {};\n const pointerUsernames: { [id: string]: string } = {};\n const pointerUserStates: { [id: string]: string } = {};\n this.state.collaborators.forEach((user, socketId) => {\n if (user.selectedElementIds) {\n for (const id of Object.keys(user.selectedElementIds)) {\n if (!(id in remoteSelectedElementIds)) {\n remoteSelectedElementIds[id] = [];\n }\n remoteSelectedElementIds[id].push(socketId);\n }\n }\n if (!user.pointer) {\n return;\n }\n if (user.username) {\n pointerUsernames[socketId] = user.username;\n }\n if (user.userState) {\n pointerUserStates[socketId] = user.userState;\n }\n pointerViewportCoords[socketId] = sceneCoordsToViewportCoords(\n {\n sceneX: user.pointer.x,\n sceneY: user.pointer.y,\n },\n this.state,\n );\n cursorButton[socketId] = user.button;\n });\n const renderingElements = this.scene.getElements().filter((element) => {\n if (isImageElement(element)) {\n if (\n // not placed on canvas yet (but in elements array)\n this.state.pendingImageElement &&\n element.id === this.state.pendingImageElement.id\n ) {\n return false;\n }\n }\n // don't render text element that's being currently edited (it's\n // rendered on remote only)\n return (\n !this.state.editingElement ||\n this.state.editingElement.type !== \"text\" ||\n element.id !== this.state.editingElement.id\n );\n });\n const { atLeastOneVisibleElement, scrollBars } = renderScene(\n renderingElements,\n this.state,\n this.state.selectionElement,\n window.devicePixelRatio,\n this.rc!,\n this.canvas!,\n {\n scrollX: this.state.scrollX,\n scrollY: this.state.scrollY,\n viewBackgroundColor: this.state.viewBackgroundColor,\n zoom: this.state.zoom,\n remotePointerViewportCoords: pointerViewportCoords,\n remotePointerButton: cursorButton,\n remoteSelectedElementIds,\n remotePointerUsernames: pointerUsernames,\n remotePointerUserStates: pointerUserStates,\n shouldCacheIgnoreZoom: this.state.shouldCacheIgnoreZoom,\n theme: this.state.theme,\n imageCache: this.imageCache,\n isExporting: false,\n renderScrollbars: !this.isMobile,\n },\n );\n\n if (scrollBars) {\n currentScrollBars = scrollBars;\n }\n const scrolledOutside =\n // hide when editing text\n isTextElement(this.state.editingElement)\n ? false\n : !atLeastOneVisibleElement && renderingElements.length > 0;\n if (this.state.scrolledOutside !== scrolledOutside) {\n this.setState({ scrolledOutside });\n }\n\n this.history.record(this.state, this.scene.getElementsIncludingDeleted());\n\n this.scheduleImageRefresh();\n\n // Do not notify consumers if we're still loading the scene. Among other\n // potential issues, this fixes a case where the tab isn't focused during\n // init, which would trigger onChange with empty elements, which would then\n // override whatever is in localStorage currently.\n if (!this.state.isLoading) {\n this.props.onChange?.(\n this.scene.getElementsIncludingDeleted(),\n this.state,\n this.files,\n );\n }\n }\n\n private onScroll = debounce(() => {\n const { offsetTop, offsetLeft } = this.getCanvasOffsets();\n this.setState((state) => {\n if (state.offsetLeft === offsetLeft && state.offsetTop === offsetTop) {\n return null;\n }\n return { offsetTop, offsetLeft };\n });\n }, SCROLL_TIMEOUT);\n\n // Copy/paste\n\n private onCut = withBatchedUpdates((event: ClipboardEvent) => {\n const isExcalidrawActive = this.excalidrawContainerRef.current?.contains(\n document.activeElement,\n );\n if (!isExcalidrawActive || isWritableElement(event.target)) {\n return;\n }\n this.cutAll();\n event.preventDefault();\n });\n\n private onCopy = withBatchedUpdates((event: ClipboardEvent) => {\n const isExcalidrawActive = this.excalidrawContainerRef.current?.contains(\n document.activeElement,\n );\n if (!isExcalidrawActive || isWritableElement(event.target)) {\n return;\n }\n this.copyAll();\n event.preventDefault();\n });\n\n private cutAll = () => {\n this.copyAll();\n this.actionManager.executeAction(actionDeleteSelected);\n };\n\n private copyAll = () => {\n copyToClipboard(this.scene.getElements(), this.state, this.files);\n };\n\n private static resetTapTwice() {\n didTapTwice = false;\n }\n\n private onTapStart = (event: TouchEvent) => {\n // fix for Apple Pencil Scribble\n // On Android, preventing the event would disable contextMenu on tap-hold\n if (!isAndroid) {\n event.preventDefault();\n }\n\n if (!didTapTwice) {\n didTapTwice = true;\n clearTimeout(tappedTwiceTimer);\n tappedTwiceTimer = window.setTimeout(\n App.resetTapTwice,\n TAP_TWICE_TIMEOUT,\n );\n return;\n }\n // insert text only if we tapped twice with a single finger\n // event.touches.length === 1 will also prevent inserting text when user's zooming\n if (didTapTwice && event.touches.length === 1) {\n const [touch] = event.touches;\n // @ts-ignore\n this.handleCanvasDoubleClick({\n clientX: touch.clientX,\n clientY: touch.clientY,\n });\n didTapTwice = false;\n clearTimeout(tappedTwiceTimer);\n }\n if (isAndroid) {\n event.preventDefault();\n }\n\n if (event.touches.length === 2) {\n this.setState({\n selectedElementIds: {},\n });\n }\n };\n\n private onTapEnd = (event: TouchEvent) => {\n this.resetContextMenuTimer();\n if (event.touches.length > 0) {\n this.setState({\n previousSelectedElementIds: {},\n selectedElementIds: this.state.previousSelectedElementIds,\n });\n } else {\n gesture.pointers.clear();\n }\n };\n\n private pasteFromClipboard = withBatchedUpdates(\n async (event: ClipboardEvent | null) => {\n // #686\n const target = document.activeElement;\n const isExcalidrawActive =\n this.excalidrawContainerRef.current?.contains(target);\n if (!isExcalidrawActive) {\n return;\n }\n\n const elementUnderCursor = document.elementFromPoint(cursorX, cursorY);\n if (\n // if no ClipboardEvent supplied, assume we're pasting via contextMenu\n // thus these checks don't make sense\n event &&\n (!(elementUnderCursor instanceof HTMLCanvasElement) ||\n isWritableElement(target))\n ) {\n return;\n }\n\n // must be called in the same frame (thus before any awaits) as the paste\n // event else some browsers (FF...) will clear the clipboardData\n // (something something security)\n let file = event?.clipboardData?.files[0];\n\n const data = await parseClipboard(event);\n\n if (!file && data.text) {\n const string = data.text.trim();\n if (string.startsWith(\"\")) {\n // ignore SVG validation/normalization which will be done during image\n // initialization\n file = SVGStringToFile(string);\n }\n }\n\n // prefer spreadsheet data over image file (MS Office/Libre Office)\n if (isSupportedImageFile(file) && !data.spreadsheet) {\n const { x: sceneX, y: sceneY } = viewportCoordsToSceneCoords(\n { clientX: cursorX, clientY: cursorY },\n this.state,\n );\n\n const imageElement = this.createImageElement({ sceneX, sceneY });\n this.insertImageElement(imageElement, file);\n this.initializeImageDimensions(imageElement);\n this.setState({ selectedElementIds: { [imageElement.id]: true } });\n\n return;\n }\n\n if (this.props.onPaste) {\n try {\n if ((await this.props.onPaste(data, event)) === false) {\n return;\n }\n } catch (error: any) {\n console.error(error);\n }\n }\n if (data.errorMessage) {\n this.setState({ errorMessage: data.errorMessage });\n } else if (data.spreadsheet) {\n this.setState({\n pasteDialog: {\n data: data.spreadsheet,\n shown: true,\n },\n });\n } else if (data.elements) {\n this.addElementsFromPasteOrLibrary({\n elements: data.elements,\n files: data.files || null,\n position: \"cursor\",\n });\n } else if (data.text) {\n this.addTextFromPaste(data.text);\n }\n this.selectShapeTool(\"selection\");\n event?.preventDefault();\n },\n );\n\n private addElementsFromPasteOrLibrary = (opts: {\n elements: readonly ExcalidrawElement[];\n files: BinaryFiles | null;\n position: { clientX: number; clientY: number } | \"cursor\" | \"center\";\n }) => {\n const elements = restoreElements(opts.elements, null);\n const [minX, minY, maxX, maxY] = getCommonBounds(elements);\n\n const elementsCenterX = distance(minX, maxX) / 2;\n const elementsCenterY = distance(minY, maxY) / 2;\n\n const clientX =\n typeof opts.position === \"object\"\n ? opts.position.clientX\n : opts.position === \"cursor\"\n ? cursorX\n : this.state.width / 2 + this.state.offsetLeft;\n const clientY =\n typeof opts.position === \"object\"\n ? opts.position.clientY\n : opts.position === \"cursor\"\n ? cursorY\n : this.state.height / 2 + this.state.offsetTop;\n\n const { x, y } = viewportCoordsToSceneCoords(\n { clientX, clientY },\n this.state,\n );\n\n const dx = x - elementsCenterX;\n const dy = y - elementsCenterY;\n const groupIdMap = new Map();\n\n const [gridX, gridY] = getGridPoint(dx, dy, this.state.gridSize);\n\n const oldIdToDuplicatedId = new Map();\n const newElements = elements.map((element) => {\n const newElement = duplicateElement(\n this.state.editingGroupId,\n groupIdMap,\n element,\n {\n x: element.x + gridX - minX,\n y: element.y + gridY - minY,\n },\n );\n oldIdToDuplicatedId.set(element.id, newElement.id);\n return newElement;\n });\n bindTextToShapeAfterDuplication(newElements, elements, oldIdToDuplicatedId);\n const nextElements = [\n ...this.scene.getElementsIncludingDeleted(),\n ...newElements,\n ];\n fixBindingsAfterDuplication(nextElements, elements, oldIdToDuplicatedId);\n\n if (opts.files) {\n this.files = { ...this.files, ...opts.files };\n }\n\n this.scene.replaceAllElements(nextElements);\n this.history.resumeRecording();\n this.setState(\n selectGroupsForSelectedElements(\n {\n ...this.state,\n isLibraryOpen: false,\n selectedElementIds: newElements.reduce((map, element) => {\n if (!isBoundToContainer(element)) {\n map[element.id] = true;\n }\n return map;\n }, {} as any),\n selectedGroupIds: {},\n },\n this.scene.getElements(),\n ),\n () => {\n if (opts.files) {\n this.addNewImagesToImageCache();\n }\n },\n );\n this.selectShapeTool(\"selection\");\n };\n\n private addTextFromPaste(text: any) {\n const { x, y } = viewportCoordsToSceneCoords(\n { clientX: cursorX, clientY: cursorY },\n this.state,\n );\n\n const element = newTextElement({\n x,\n y,\n strokeColor: this.state.currentItemStrokeColor,\n backgroundColor: this.state.currentItemBackgroundColor,\n fillStyle: this.state.currentItemFillStyle,\n strokeWidth: this.state.currentItemStrokeWidth,\n strokeStyle: this.state.currentItemStrokeStyle,\n roughness: this.state.currentItemRoughness,\n opacity: this.state.currentItemOpacity,\n strokeSharpness: this.state.currentItemStrokeSharpness,\n text,\n fontSize: this.state.currentItemFontSize,\n fontFamily: this.state.currentItemFontFamily,\n textAlign: this.state.currentItemTextAlign,\n verticalAlign: DEFAULT_VERTICAL_ALIGN,\n });\n\n this.scene.replaceAllElements([\n ...this.scene.getElementsIncludingDeleted(),\n element,\n ]);\n this.setState({ selectedElementIds: { [element.id]: true } });\n this.history.resumeRecording();\n }\n\n // Collaboration\n\n setAppState = (obj: any) => {\n this.setState(obj);\n };\n\n removePointer = (event: React.PointerEvent | PointerEvent) => {\n if (touchTimeout) {\n this.resetContextMenuTimer();\n }\n\n gesture.pointers.delete(event.pointerId);\n };\n\n toggleLock = () => {\n this.setState((prevState) => {\n return {\n elementLocked: !prevState.elementLocked,\n elementType: prevState.elementLocked\n ? \"selection\"\n : prevState.elementType,\n };\n });\n };\n\n togglePenMode = () => {\n this.setState((prevState) => {\n return {\n penMode: !prevState.penMode,\n };\n });\n };\n\n toggleZenMode = () => {\n this.actionManager.executeAction(actionToggleZenMode);\n };\n\n toggleStats = () => {\n if (!this.state.showStats) {\n trackEvent(\"dialog\", \"stats\");\n }\n this.actionManager.executeAction(actionToggleStats);\n };\n\n scrollToContent = (\n target:\n | ExcalidrawElement\n | readonly ExcalidrawElement[] = this.scene.getElements(),\n ) => {\n this.setState({\n ...calculateScrollCenter(\n Array.isArray(target) ? target : [target],\n this.state,\n this.canvas,\n ),\n });\n };\n\n clearToast = () => {\n this.setState({ toastMessage: null });\n };\n\n setToastMessage = (toastMessage: string) => {\n this.setState({ toastMessage });\n };\n\n restoreFileFromShare = async () => {\n try {\n const webShareTargetCache = await caches.open(\"web-share-target\");\n\n const file = await webShareTargetCache.match(\"shared-file\");\n if (file) {\n const blob = await file.blob();\n this.loadFileToCanvas(blob);\n await webShareTargetCache.delete(\"shared-file\");\n window.history.replaceState(null, APP_NAME, window.location.pathname);\n }\n } catch (error: any) {\n this.setState({ errorMessage: error.message });\n }\n };\n\n /** adds supplied files to existing files in the appState */\n public addFiles: ExcalidrawImperativeAPI[\"addFiles\"] = withBatchedUpdates(\n (files) => {\n const filesMap = files.reduce((acc, fileData) => {\n acc.set(fileData.id, fileData);\n return acc;\n }, new Map());\n\n this.files = { ...this.files, ...Object.fromEntries(filesMap) };\n\n this.scene.getElements().forEach((element) => {\n if (\n isInitializedImageElement(element) &&\n filesMap.has(element.fileId)\n ) {\n this.imageCache.delete(element.fileId);\n invalidateShapeForElement(element);\n }\n });\n this.scene.informMutation();\n\n this.addNewImagesToImageCache();\n },\n );\n\n public updateScene = withBatchedUpdates(\n (sceneData: {\n elements?: SceneData[\"elements\"];\n appState?: Pick | null;\n collaborators?: SceneData[\"collaborators\"];\n commitToHistory?: SceneData[\"commitToHistory\"];\n libraryItems?: SceneData[\"libraryItems\"];\n }) => {\n if (sceneData.commitToHistory) {\n this.history.resumeRecording();\n }\n\n if (sceneData.appState) {\n this.setState(sceneData.appState);\n }\n\n if (sceneData.elements) {\n this.scene.replaceAllElements(sceneData.elements);\n }\n\n if (sceneData.collaborators) {\n this.setState({ collaborators: sceneData.collaborators });\n }\n\n if (sceneData.libraryItems) {\n this.library.saveLibrary(\n restoreLibraryItems(sceneData.libraryItems, \"unpublished\"),\n );\n }\n },\n );\n\n private onSceneUpdated = () => {\n this.setState({});\n };\n\n private updateCurrentCursorPosition = withBatchedUpdates(\n (event: MouseEvent) => {\n cursorX = event.clientX;\n cursorY = event.clientY;\n },\n );\n\n // Input handling\n\n private onKeyDown = withBatchedUpdates(\n (event: React.KeyboardEvent | KeyboardEvent) => {\n // normalize `event.key` when CapsLock is pressed #2372\n if (\n \"Proxy\" in window &&\n ((!event.shiftKey && /^[A-Z]$/.test(event.key)) ||\n (event.shiftKey && /^[a-z]$/.test(event.key)))\n ) {\n event = new Proxy(event, {\n get(ev: any, prop) {\n const value = ev[prop];\n if (typeof value === \"function\") {\n // fix for Proxies hijacking `this`\n return value.bind(ev);\n }\n return prop === \"key\"\n ? // CapsLock inverts capitalization based on ShiftKey, so invert\n // it back\n event.shiftKey\n ? ev.key.toUpperCase()\n : ev.key.toLowerCase()\n : value;\n },\n });\n }\n\n if (\n (isWritableElement(event.target) && event.key !== KEYS.ESCAPE) ||\n // case: using arrows to move between buttons\n (isArrowKey(event.key) && isInputLike(event.target))\n ) {\n return;\n }\n\n if (event.key === KEYS.QUESTION_MARK) {\n this.setState({\n showHelpDialog: true,\n });\n }\n\n if (this.actionManager.handleKeyDown(event)) {\n return;\n }\n\n if (this.state.viewModeEnabled) {\n return;\n }\n\n if (event[KEYS.CTRL_OR_CMD] && this.state.isBindingEnabled) {\n this.setState({ isBindingEnabled: false });\n }\n\n if (event.code === CODES.ZERO) {\n this.setState({ isLibraryOpen: !this.state.isLibraryOpen });\n }\n\n if (isArrowKey(event.key)) {\n const step =\n (this.state.gridSize &&\n (event.shiftKey\n ? ELEMENT_TRANSLATE_AMOUNT\n : this.state.gridSize)) ||\n (event.shiftKey\n ? ELEMENT_SHIFT_TRANSLATE_AMOUNT\n : ELEMENT_TRANSLATE_AMOUNT);\n\n const selectedElements = getSelectedElements(\n this.scene.getElements(),\n this.state,\n true,\n );\n\n let offsetX = 0;\n let offsetY = 0;\n\n if (event.key === KEYS.ARROW_LEFT) {\n offsetX = -step;\n } else if (event.key === KEYS.ARROW_RIGHT) {\n offsetX = step;\n } else if (event.key === KEYS.ARROW_UP) {\n offsetY = -step;\n } else if (event.key === KEYS.ARROW_DOWN) {\n offsetY = step;\n }\n\n selectedElements.forEach((element) => {\n mutateElement(element, {\n x: element.x + offsetX,\n y: element.y + offsetY,\n });\n\n updateBoundElements(element, {\n simultaneouslyUpdated: selectedElements,\n });\n });\n\n this.maybeSuggestBindingForAll(selectedElements);\n\n event.preventDefault();\n } else if (event.key === KEYS.ENTER) {\n const selectedElements = getSelectedElements(\n this.scene.getElements(),\n this.state,\n );\n\n if (\n selectedElements.length === 1 &&\n isLinearElement(selectedElements[0])\n ) {\n if (\n !this.state.editingLinearElement ||\n this.state.editingLinearElement.elementId !== selectedElements[0].id\n ) {\n this.history.resumeRecording();\n this.setState({\n editingLinearElement: new LinearElementEditor(\n selectedElements[0],\n this.scene,\n ),\n });\n }\n } else if (\n selectedElements.length === 1 &&\n !isLinearElement(selectedElements[0])\n ) {\n const selectedElement = selectedElements[0];\n\n this.startTextEditing({\n sceneX: selectedElement.x + selectedElement.width / 2,\n sceneY: selectedElement.y + selectedElement.height / 2,\n shouldBind: true,\n });\n event.preventDefault();\n return;\n }\n } else if (\n !event.ctrlKey &&\n !event.altKey &&\n !event.metaKey &&\n this.state.draggingElement === null\n ) {\n const shape = findShapeByKey(event.key);\n if (shape) {\n this.selectShapeTool(shape);\n } else if (event.key === KEYS.Q) {\n this.toggleLock();\n }\n }\n if (event.key === KEYS.SPACE && gesture.pointers.size === 0) {\n isHoldingSpace = true;\n setCursor(this.canvas, CURSOR_TYPE.GRABBING);\n event.preventDefault();\n }\n\n if (event.key === KEYS.G || event.key === KEYS.S) {\n const selectedElements = getSelectedElements(\n this.scene.getElements(),\n this.state,\n );\n if (\n this.state.elementType === \"selection\" &&\n !selectedElements.length\n ) {\n return;\n }\n\n if (\n event.key === KEYS.G &&\n (hasBackground(this.state.elementType) ||\n selectedElements.some((element) => hasBackground(element.type)))\n ) {\n this.setState({ openPopup: \"backgroundColorPicker\" });\n }\n if (event.key === KEYS.S) {\n this.setState({ openPopup: \"strokeColorPicker\" });\n }\n }\n },\n );\n\n private onKeyUp = withBatchedUpdates((event: KeyboardEvent) => {\n if (event.key === KEYS.SPACE) {\n if (this.state.viewModeEnabled) {\n setCursor(this.canvas, CURSOR_TYPE.GRAB);\n } else if (this.state.elementType === \"selection\") {\n resetCursor(this.canvas);\n } else {\n setCursorForShape(this.canvas, this.state.elementType);\n this.setState({\n selectedElementIds: {},\n selectedGroupIds: {},\n editingGroupId: null,\n });\n }\n isHoldingSpace = false;\n }\n if (!event[KEYS.CTRL_OR_CMD] && !this.state.isBindingEnabled) {\n this.setState({ isBindingEnabled: true });\n }\n if (isArrowKey(event.key)) {\n const selectedElements = getSelectedElements(\n this.scene.getElements(),\n this.state,\n );\n isBindingEnabled(this.state)\n ? bindOrUnbindSelectedElements(selectedElements)\n : unbindLinearElements(selectedElements);\n this.setState({ suggestedBindings: [] });\n }\n });\n\n private selectShapeTool(elementType: AppState[\"elementType\"]) {\n if (!isHoldingSpace) {\n setCursorForShape(this.canvas, elementType);\n }\n if (isToolIcon(document.activeElement)) {\n this.focusContainer();\n }\n if (!isLinearElementType(elementType)) {\n this.setState({ suggestedBindings: [] });\n }\n if (elementType === \"image\") {\n this.onImageAction();\n }\n if (elementType !== \"selection\") {\n this.setState({\n elementType,\n selectedElementIds: {},\n selectedGroupIds: {},\n editingGroupId: null,\n });\n } else {\n this.setState({ elementType });\n }\n }\n\n private onGestureStart = withBatchedUpdates((event: GestureEvent) => {\n event.preventDefault();\n this.setState({\n selectedElementIds: {},\n });\n gesture.initialScale = this.state.zoom.value;\n });\n\n private onGestureChange = withBatchedUpdates((event: GestureEvent) => {\n event.preventDefault();\n\n // onGestureChange only has zoom factor but not the center.\n // If we're on iPad or iPhone, then we recognize multi-touch and will\n // zoom in at the right location on the touchMove handler already.\n // On Macbook, we don't have those events so will zoom in at the\n // current location instead.\n if (gesture.pointers.size >= 2) {\n return;\n }\n\n const initialScale = gesture.initialScale;\n if (initialScale) {\n this.setState((state) => ({\n ...getStateForZoom(\n {\n viewportX: cursorX,\n viewportY: cursorY,\n nextZoom: getNormalizedZoom(initialScale * event.scale),\n },\n state,\n ),\n }));\n }\n });\n\n private onGestureEnd = withBatchedUpdates((event: GestureEvent) => {\n event.preventDefault();\n this.setState({\n previousSelectedElementIds: {},\n selectedElementIds: this.state.previousSelectedElementIds,\n });\n gesture.initialScale = null;\n });\n\n private handleTextWysiwyg(\n element: ExcalidrawTextElement,\n {\n isExistingElement = false,\n }: {\n isExistingElement?: boolean;\n },\n ) {\n const updateElement = (\n text: string,\n originalText: string,\n isDeleted: boolean,\n ) => {\n this.scene.replaceAllElements([\n ...this.scene.getElementsIncludingDeleted().map((_element) => {\n if (_element.id === element.id && isTextElement(_element)) {\n return updateTextElement(_element, {\n text,\n isDeleted,\n originalText,\n });\n }\n return _element;\n }),\n ]);\n };\n\n textWysiwyg({\n id: element.id,\n canvas: this.canvas,\n getViewportCoords: (x, y) => {\n const { x: viewportX, y: viewportY } = sceneCoordsToViewportCoords(\n {\n sceneX: x,\n sceneY: y,\n },\n this.state,\n );\n return [\n viewportX - this.state.offsetLeft,\n viewportY - this.state.offsetTop,\n ];\n },\n onChange: withBatchedUpdates((text) => {\n updateElement(text, text, false);\n if (isNonDeletedElement(element)) {\n updateBoundElements(element);\n }\n }),\n onSubmit: withBatchedUpdates(({ text, viaKeyboard, originalText }) => {\n const isDeleted = !text.trim();\n updateElement(text, originalText, isDeleted);\n // select the created text element only if submitting via keyboard\n // (when submitting via click it should act as signal to deselect)\n if (!isDeleted && viaKeyboard) {\n const elementIdToSelect = element.containerId\n ? element.containerId\n : element.id;\n this.setState((prevState) => ({\n selectedElementIds: {\n ...prevState.selectedElementIds,\n [elementIdToSelect]: true,\n },\n }));\n }\n if (isDeleted) {\n fixBindingsAfterDeletion(this.scene.getElements(), [element]);\n }\n if (!isDeleted || isExistingElement) {\n this.history.resumeRecording();\n }\n\n this.setState({\n draggingElement: null,\n editingElement: null,\n });\n if (this.state.elementLocked) {\n setCursorForShape(this.canvas, this.state.elementType);\n }\n\n this.focusContainer();\n }),\n element,\n excalidrawContainer: this.excalidrawContainerRef.current,\n app: this,\n });\n // deselect all other elements when inserting text\n this.deselectElements();\n\n // do an initial update to re-initialize element position since we were\n // modifying element's x/y for sake of editor (case: syncing to remote)\n updateElement(element.text, element.originalText, false);\n }\n\n private deselectElements() {\n this.setState({\n selectedElementIds: {},\n selectedGroupIds: {},\n editingGroupId: null,\n });\n }\n\n private getTextElementAtPosition(\n x: number,\n y: number,\n ): NonDeleted | null {\n const element = this.getElementAtPosition(x, y, {\n includeBoundTextElement: true,\n });\n\n if (element && isTextElement(element) && !element.isDeleted) {\n return element;\n }\n return null;\n }\n\n private getElementAtPosition(\n x: number,\n y: number,\n opts?: {\n /** if true, returns the first selected element (with highest z-index)\n of all hit elements */\n preferSelected?: boolean;\n includeBoundTextElement?: boolean;\n },\n ): NonDeleted | null {\n const allHitElements = this.getElementsAtPosition(\n x,\n y,\n opts?.includeBoundTextElement,\n );\n if (allHitElements.length > 1) {\n if (opts?.preferSelected) {\n for (let index = allHitElements.length - 1; index > -1; index--) {\n if (this.state.selectedElementIds[allHitElements[index].id]) {\n return allHitElements[index];\n }\n }\n }\n const elementWithHighestZIndex =\n allHitElements[allHitElements.length - 1];\n // If we're hitting element with highest z-index only on its bounding box\n // while also hitting other element figure, the latter should be considered.\n return isHittingElementBoundingBoxWithoutHittingElement(\n elementWithHighestZIndex,\n this.state,\n x,\n y,\n )\n ? allHitElements[allHitElements.length - 2]\n : elementWithHighestZIndex;\n }\n if (allHitElements.length === 1) {\n return allHitElements[0];\n }\n return null;\n }\n\n private getElementsAtPosition(\n x: number,\n y: number,\n includeBoundTextElement: boolean = false,\n ): NonDeleted[] {\n const elements = includeBoundTextElement\n ? this.scene.getElements()\n : this.scene\n .getElements()\n .filter(\n (element) => !(isTextElement(element) && element.containerId),\n );\n\n return getElementsAtPosition(elements, (element) =>\n hitTest(element, this.state, x, y),\n );\n }\n\n private startTextEditing = ({\n sceneX,\n sceneY,\n shouldBind,\n insertAtParentCenter = true,\n }: {\n /** X position to insert text at */\n sceneX: number;\n /** Y position to insert text at */\n sceneY: number;\n shouldBind: boolean;\n /** whether to attempt to insert at element center if applicable */\n insertAtParentCenter?: boolean;\n }) => {\n let parentCenterPosition =\n insertAtParentCenter &&\n this.getTextWysiwygSnappedToCenterPosition(\n sceneX,\n sceneY,\n this.state,\n this.canvas,\n window.devicePixelRatio,\n );\n\n let existingTextElement: NonDeleted | null = null;\n let container: ExcalidrawTextContainer | null = null;\n\n const selectedElements = getSelectedElements(\n this.scene.getElements(),\n this.state,\n );\n\n if (selectedElements.length === 1) {\n if (isTextElement(selectedElements[0])) {\n existingTextElement = selectedElements[0];\n } else if (isTextBindableContainer(selectedElements[0])) {\n container = selectedElements[0];\n existingTextElement = getBoundTextElement(container);\n }\n }\n\n existingTextElement =\n existingTextElement ?? this.getTextElementAtPosition(sceneX, sceneY);\n\n // bind to container when shouldBind is true or\n // clicked on center of container\n if (\n !container &&\n !existingTextElement &&\n (shouldBind || parentCenterPosition)\n ) {\n container = getTextBindableContainerAtPosition(\n this.scene.getElements().filter((ele) => !isTextElement(ele)),\n sceneX,\n sceneY,\n );\n }\n\n if (!existingTextElement && container) {\n const fontString = {\n fontSize: this.state.currentItemFontSize,\n fontFamily: this.state.currentItemFontFamily,\n };\n const minWidth = getApproxMinLineWidth(getFontString(fontString));\n const minHeight = getApproxMinLineHeight(getFontString(fontString));\n const newHeight = Math.max(container.height, minHeight);\n const newWidth = Math.max(container.width, minWidth);\n mutateElement(container, { height: newHeight, width: newWidth });\n sceneX = container.x + newWidth / 2;\n sceneY = container.y + newHeight / 2;\n if (parentCenterPosition) {\n parentCenterPosition = this.getTextWysiwygSnappedToCenterPosition(\n sceneX,\n sceneY,\n this.state,\n this.canvas,\n window.devicePixelRatio,\n );\n }\n }\n\n const element = existingTextElement\n ? existingTextElement\n : newTextElement({\n x: parentCenterPosition\n ? parentCenterPosition.elementCenterX\n : sceneX,\n y: parentCenterPosition\n ? parentCenterPosition.elementCenterY\n : sceneY,\n strokeColor: this.state.currentItemStrokeColor,\n backgroundColor: this.state.currentItemBackgroundColor,\n fillStyle: this.state.currentItemFillStyle,\n strokeWidth: this.state.currentItemStrokeWidth,\n strokeStyle: this.state.currentItemStrokeStyle,\n roughness: this.state.currentItemRoughness,\n opacity: this.state.currentItemOpacity,\n strokeSharpness: this.state.currentItemStrokeSharpness,\n text: \"\",\n fontSize: this.state.currentItemFontSize,\n fontFamily: this.state.currentItemFontFamily,\n textAlign: parentCenterPosition\n ? \"center\"\n : this.state.currentItemTextAlign,\n verticalAlign: parentCenterPosition\n ? VERTICAL_ALIGN.MIDDLE\n : DEFAULT_VERTICAL_ALIGN,\n containerId: container?.id ?? undefined,\n groupIds: container?.groupIds ?? [],\n });\n\n this.setState({ editingElement: element });\n\n if (!existingTextElement) {\n this.scene.replaceAllElements([\n ...this.scene.getElementsIncludingDeleted(),\n element,\n ]);\n\n // case: creating new text not centered to parent element → offset Y\n // so that the text is centered to cursor position\n if (!parentCenterPosition) {\n mutateElement(element, {\n y: element.y - element.baseline / 2,\n });\n }\n }\n\n this.setState({\n editingElement: element,\n });\n\n this.handleTextWysiwyg(element, {\n isExistingElement: !!existingTextElement,\n });\n };\n\n private handleCanvasDoubleClick = (\n event: React.MouseEvent,\n ) => {\n // case: double-clicking with arrow/line tool selected would both create\n // text and enter multiElement mode\n if (this.state.multiElement) {\n return;\n }\n // we should only be able to double click when mode is selection\n if (this.state.elementType !== \"selection\") {\n return;\n }\n\n const selectedElements = getSelectedElements(\n this.scene.getElements(),\n this.state,\n );\n\n if (selectedElements.length === 1 && isLinearElement(selectedElements[0])) {\n if (\n !this.state.editingLinearElement ||\n this.state.editingLinearElement.elementId !== selectedElements[0].id\n ) {\n this.history.resumeRecording();\n this.setState({\n editingLinearElement: new LinearElementEditor(\n selectedElements[0],\n this.scene,\n ),\n });\n }\n return;\n }\n\n resetCursor(this.canvas);\n\n let { x: sceneX, y: sceneY } = viewportCoordsToSceneCoords(\n event,\n this.state,\n );\n\n const selectedGroupIds = getSelectedGroupIds(this.state);\n\n if (selectedGroupIds.length > 0) {\n const hitElement = this.getElementAtPosition(sceneX, sceneY);\n\n const selectedGroupId =\n hitElement &&\n getSelectedGroupIdForElement(hitElement, this.state.selectedGroupIds);\n\n if (selectedGroupId) {\n this.setState((prevState) =>\n selectGroupsForSelectedElements(\n {\n ...prevState,\n editingGroupId: selectedGroupId,\n selectedElementIds: { [hitElement!.id]: true },\n selectedGroupIds: {},\n },\n this.scene.getElements(),\n ),\n );\n return;\n }\n }\n\n resetCursor(this.canvas);\n if (!event[KEYS.CTRL_OR_CMD] && !this.state.viewModeEnabled) {\n const selectedElements = getSelectedElements(\n this.scene.getElements(),\n this.state,\n );\n if (selectedElements.length === 1) {\n const selectedElement = selectedElements[0];\n const canBindText = hasBoundTextElement(selectedElement);\n if (canBindText) {\n sceneX = selectedElement.x + selectedElement.width / 2;\n sceneY = selectedElement.y + selectedElement.height / 2;\n }\n }\n this.startTextEditing({\n sceneX,\n sceneY,\n shouldBind: false,\n insertAtParentCenter: !event.altKey,\n });\n }\n };\n\n private getElementLinkAtPosition = (\n scenePointer: Readonly<{ x: number; y: number }>,\n hitElement: NonDeletedExcalidrawElement | null,\n ): ExcalidrawElement | undefined => {\n // Reversing so we traverse the elements in decreasing order\n // of z-index\n const elements = this.scene.getElements().slice().reverse();\n let hitElementIndex = Infinity;\n\n return elements.find((element, index) => {\n if (hitElement && element.id === hitElement.id) {\n hitElementIndex = index;\n }\n return (\n element.link &&\n isPointHittingLinkIcon(\n element,\n this.state,\n [scenePointer.x, scenePointer.y],\n this.isMobile,\n ) &&\n index <= hitElementIndex\n );\n });\n };\n\n private redirectToLink = (\n event: React.PointerEvent,\n isTouchScreen: boolean,\n ) => {\n const draggedDistance = distance2d(\n this.lastPointerDown!.clientX,\n this.lastPointerDown!.clientY,\n this.lastPointerUp!.clientX,\n this.lastPointerUp!.clientY,\n );\n if (\n !this.hitLinkElement ||\n // For touch screen allow dragging threshold else strict check\n (isTouchScreen && draggedDistance > DRAGGING_THRESHOLD) ||\n (!isTouchScreen && draggedDistance !== 0)\n ) {\n return;\n }\n const lastPointerDownCoords = viewportCoordsToSceneCoords(\n this.lastPointerDown!,\n this.state,\n );\n const lastPointerDownHittingLinkIcon = isPointHittingLinkIcon(\n this.hitLinkElement!,\n this.state,\n [lastPointerDownCoords.x, lastPointerDownCoords.y],\n this.isMobile,\n );\n const lastPointerUpCoords = viewportCoordsToSceneCoords(\n this.lastPointerUp!,\n this.state,\n );\n const lastPointerUpHittingLinkIcon = isPointHittingLinkIcon(\n this.hitLinkElement!,\n this.state,\n [lastPointerUpCoords.x, lastPointerUpCoords.y],\n this.isMobile,\n );\n if (lastPointerDownHittingLinkIcon && lastPointerUpHittingLinkIcon) {\n const url = this.hitLinkElement.link;\n if (url) {\n let customEvent;\n if (this.props.onLinkOpen) {\n customEvent = wrapEvent(EVENT.EXCALIDRAW_LINK, event.nativeEvent);\n this.props.onLinkOpen(this.hitLinkElement, customEvent);\n }\n if (!customEvent?.defaultPrevented) {\n const target = isLocalLink(url) ? \"_self\" : \"_blank\";\n const newWindow = window.open(undefined, target);\n // https://mathiasbynens.github.io/rel-noopener/\n if (newWindow) {\n newWindow.opener = null;\n newWindow.location = normalizeLink(url);\n }\n }\n }\n }\n };\n\n private handleCanvasPointerMove = (\n event: React.PointerEvent,\n ) => {\n this.savePointer(event.clientX, event.clientY, this.state.cursorButton);\n\n if (gesture.pointers.has(event.pointerId)) {\n gesture.pointers.set(event.pointerId, {\n x: event.clientX,\n y: event.clientY,\n });\n }\n\n const initialScale = gesture.initialScale;\n if (\n gesture.pointers.size === 2 &&\n gesture.lastCenter &&\n initialScale &&\n gesture.initialDistance\n ) {\n const center = getCenter(gesture.pointers);\n const deltaX = center.x - gesture.lastCenter.x;\n const deltaY = center.y - gesture.lastCenter.y;\n gesture.lastCenter = center;\n\n const distance = getDistance(Array.from(gesture.pointers.values()));\n const scaleFactor =\n this.state.elementType === \"freedraw\" && this.state.penMode\n ? 1\n : distance / gesture.initialDistance;\n\n const nextZoom = scaleFactor\n ? getNormalizedZoom(initialScale * scaleFactor)\n : this.state.zoom.value;\n\n this.setState((state) => {\n const zoomState = getStateForZoom(\n {\n viewportX: center.x,\n viewportY: center.y,\n nextZoom,\n },\n state,\n );\n\n return {\n zoom: zoomState.zoom,\n scrollX: zoomState.scrollX + deltaX / nextZoom,\n scrollY: zoomState.scrollY + deltaY / nextZoom,\n shouldCacheIgnoreZoom: true,\n };\n });\n this.resetShouldCacheIgnoreZoomDebounced();\n } else {\n gesture.lastCenter =\n gesture.initialDistance =\n gesture.initialScale =\n null;\n }\n\n if (isHoldingSpace || isPanning || isDraggingScrollBar) {\n return;\n }\n\n const isPointerOverScrollBars = isOverScrollBars(\n currentScrollBars,\n event.clientX - this.state.offsetLeft,\n event.clientY - this.state.offsetTop,\n );\n const isOverScrollBar = isPointerOverScrollBars.isOverEither;\n if (!this.state.draggingElement && !this.state.multiElement) {\n if (isOverScrollBar) {\n resetCursor(this.canvas);\n } else {\n setCursorForShape(this.canvas, this.state.elementType);\n }\n }\n\n const scenePointer = viewportCoordsToSceneCoords(event, this.state);\n const { x: scenePointerX, y: scenePointerY } = scenePointer;\n\n if (\n this.state.editingLinearElement &&\n !this.state.editingLinearElement.isDragging\n ) {\n const editingLinearElement = LinearElementEditor.handlePointerMove(\n event,\n scenePointerX,\n scenePointerY,\n this.state.editingLinearElement,\n this.state.gridSize,\n );\n if (editingLinearElement !== this.state.editingLinearElement) {\n this.setState({ editingLinearElement });\n }\n if (editingLinearElement.lastUncommittedPoint != null) {\n this.maybeSuggestBindingAtCursor(scenePointer);\n } else {\n this.setState({ suggestedBindings: [] });\n }\n }\n\n if (isBindingElementType(this.state.elementType)) {\n // Hovering with a selected tool or creating new linear element via click\n // and point\n const { draggingElement } = this.state;\n if (isBindingElement(draggingElement)) {\n this.maybeSuggestBindingsForLinearElementAtCoords(\n draggingElement,\n [scenePointer],\n this.state.startBoundElement,\n );\n } else {\n this.maybeSuggestBindingAtCursor(scenePointer);\n }\n }\n\n if (this.state.multiElement) {\n const { multiElement } = this.state;\n const { x: rx, y: ry } = multiElement;\n\n const { points, lastCommittedPoint } = multiElement;\n const lastPoint = points[points.length - 1];\n\n setCursorForShape(this.canvas, this.state.elementType);\n\n if (lastPoint === lastCommittedPoint) {\n // if we haven't yet created a temp point and we're beyond commit-zone\n // threshold, add a point\n if (\n distance2d(\n scenePointerX - rx,\n scenePointerY - ry,\n lastPoint[0],\n lastPoint[1],\n ) >= LINE_CONFIRM_THRESHOLD\n ) {\n mutateElement(multiElement, {\n points: [...points, [scenePointerX - rx, scenePointerY - ry]],\n });\n } else {\n setCursor(this.canvas, CURSOR_TYPE.POINTER);\n // in this branch, we're inside the commit zone, and no uncommitted\n // point exists. Thus do nothing (don't add/remove points).\n }\n } else if (\n points.length > 2 &&\n lastCommittedPoint &&\n distance2d(\n scenePointerX - rx,\n scenePointerY - ry,\n lastCommittedPoint[0],\n lastCommittedPoint[1],\n ) < LINE_CONFIRM_THRESHOLD\n ) {\n setCursor(this.canvas, CURSOR_TYPE.POINTER);\n mutateElement(multiElement, {\n points: points.slice(0, -1),\n });\n } else {\n if (isPathALoop(points, this.state.zoom.value)) {\n setCursor(this.canvas, CURSOR_TYPE.POINTER);\n }\n // update last uncommitted point\n mutateElement(multiElement, {\n points: [\n ...points.slice(0, -1),\n [scenePointerX - rx, scenePointerY - ry],\n ],\n });\n }\n\n return;\n }\n\n const hasDeselectedButton = Boolean(event.buttons);\n if (\n hasDeselectedButton ||\n (this.state.elementType !== \"selection\" &&\n this.state.elementType !== \"text\")\n ) {\n return;\n }\n\n const elements = this.scene.getElements();\n\n const selectedElements = getSelectedElements(elements, this.state);\n if (\n selectedElements.length === 1 &&\n !isOverScrollBar &&\n !this.state.editingLinearElement\n ) {\n const elementWithTransformHandleType = getElementWithTransformHandleType(\n elements,\n this.state,\n scenePointerX,\n scenePointerY,\n this.state.zoom,\n event.pointerType,\n );\n if (\n elementWithTransformHandleType &&\n elementWithTransformHandleType.transformHandleType\n ) {\n setCursor(\n this.canvas,\n getCursorForResizingElement(elementWithTransformHandleType),\n );\n return;\n }\n } else if (selectedElements.length > 1 && !isOverScrollBar) {\n const transformHandleType = getTransformHandleTypeFromCoords(\n getCommonBounds(selectedElements),\n scenePointerX,\n scenePointerY,\n this.state.zoom,\n event.pointerType,\n );\n if (transformHandleType) {\n setCursor(\n this.canvas,\n getCursorForResizingElement({\n transformHandleType,\n }),\n );\n return;\n }\n }\n\n const hitElement = this.getElementAtPosition(\n scenePointer.x,\n scenePointer.y,\n );\n this.hitLinkElement = this.getElementLinkAtPosition(\n scenePointer,\n hitElement,\n );\n\n if (\n this.hitLinkElement &&\n !this.state.selectedElementIds[this.hitLinkElement.id]\n ) {\n setCursor(this.canvas, CURSOR_TYPE.POINTER);\n showHyperlinkTooltip(this.hitLinkElement, this.state);\n } else {\n hideHyperlinkToolip();\n if (\n hitElement &&\n hitElement.link &&\n this.state.selectedElementIds[hitElement.id] &&\n !this.contextMenuOpen &&\n !this.state.showHyperlinkPopup\n ) {\n this.setState({ showHyperlinkPopup: \"info\" });\n }\n if (this.state.elementType === \"text\") {\n setCursor(\n this.canvas,\n isTextElement(hitElement) ? CURSOR_TYPE.TEXT : CURSOR_TYPE.CROSSHAIR,\n );\n } else if (this.state.viewModeEnabled) {\n setCursor(this.canvas, CURSOR_TYPE.GRAB);\n } else if (isOverScrollBar) {\n setCursor(this.canvas, CURSOR_TYPE.AUTO);\n } else if (this.state.editingLinearElement) {\n const element = LinearElementEditor.getElement(\n this.state.editingLinearElement.elementId,\n );\n\n if (\n element &&\n isHittingElementNotConsideringBoundingBox(element, this.state, [\n scenePointer.x,\n scenePointer.y,\n ])\n ) {\n setCursor(this.canvas, CURSOR_TYPE.MOVE);\n } else {\n setCursor(this.canvas, CURSOR_TYPE.AUTO);\n }\n } else if (\n // if using cmd/ctrl, we're not dragging\n !event[KEYS.CTRL_OR_CMD] &&\n (hitElement ||\n this.isHittingCommonBoundingBoxOfSelectedElements(\n scenePointer,\n selectedElements,\n ))\n ) {\n setCursor(this.canvas, CURSOR_TYPE.MOVE);\n } else {\n setCursor(this.canvas, CURSOR_TYPE.AUTO);\n }\n }\n };\n\n // set touch moving for mobile context menu\n private handleTouchMove = (event: React.TouchEvent) => {\n invalidateContextMenu = true;\n };\n\n private handleCanvasPointerDown = (\n event: React.PointerEvent,\n ) => {\n // remove any active selection when we start to interact with canvas\n // (mainly, we care about removing selection outside the component which\n // would prevent our copy handling otherwise)\n const selection = document.getSelection();\n if (selection?.anchorNode) {\n selection.removeAllRanges();\n }\n this.maybeOpenContextMenuAfterPointerDownOnTouchDevices(event);\n this.maybeCleanupAfterMissingPointerUp(event);\n\n //fires only once, if pen is detected, penMode is enabled\n //the user can disable this by toggling the penMode button\n if (!this.state.penDetected && event.pointerType === \"pen\") {\n this.setState((prevState) => {\n return {\n penMode: true,\n penDetected: true,\n };\n });\n }\n\n if (isPanning) {\n return;\n }\n this.lastPointerDown = event;\n this.setState({\n lastPointerDownWith: event.pointerType,\n cursorButton: \"down\",\n });\n this.savePointer(event.clientX, event.clientY, \"down\");\n\n if (this.handleCanvasPanUsingWheelOrSpaceDrag(event)) {\n return;\n }\n\n // only handle left mouse button or touch\n if (\n event.button !== POINTER_BUTTON.MAIN &&\n event.button !== POINTER_BUTTON.TOUCH\n ) {\n return;\n }\n\n this.updateGestureOnPointerDown(event);\n\n // don't select while panning\n if (gesture.pointers.size > 1) {\n return;\n }\n\n // State for the duration of a pointer interaction, which starts with a\n // pointerDown event, ends with a pointerUp event (or another pointerDown)\n const pointerDownState = this.initialPointerDownState(event);\n\n if (this.handleDraggingScrollBar(event, pointerDownState)) {\n return;\n }\n\n // Since context menu closes on pointer down so setting to false\n this.contextMenuOpen = false;\n this.clearSelectionIfNotUsingSelection();\n this.updateBindingEnabledOnPointerMove(event);\n\n if (this.handleSelectionOnPointerDown(event, pointerDownState)) {\n return;\n }\n\n const allowOnPointerDown =\n !this.state.penMode ||\n event.pointerType !== \"touch\" ||\n this.state.elementType === \"selection\" ||\n this.state.elementType === \"text\" ||\n this.state.elementType === \"image\";\n\n if (!allowOnPointerDown) {\n return;\n }\n\n if (this.state.elementType === \"text\") {\n this.handleTextOnPointerDown(event, pointerDownState);\n return;\n } else if (\n this.state.elementType === \"arrow\" ||\n this.state.elementType === \"line\"\n ) {\n this.handleLinearElementOnPointerDown(\n event,\n this.state.elementType,\n pointerDownState,\n );\n } else if (this.state.elementType === \"image\") {\n // reset image preview on pointerdown\n setCursor(this.canvas, CURSOR_TYPE.CROSSHAIR);\n\n if (!this.state.pendingImageElement) {\n return;\n }\n\n this.setState({\n draggingElement: this.state.pendingImageElement,\n editingElement: this.state.pendingImageElement,\n pendingImageElement: null,\n multiElement: null,\n });\n\n const { x, y } = viewportCoordsToSceneCoords(event, this.state);\n mutateElement(this.state.pendingImageElement, {\n x,\n y,\n });\n } else if (this.state.elementType === \"freedraw\") {\n this.handleFreeDrawElementOnPointerDown(\n event,\n this.state.elementType,\n pointerDownState,\n );\n } else {\n this.createGenericElementOnPointerDown(\n this.state.elementType,\n pointerDownState,\n );\n }\n\n const onPointerMove =\n this.onPointerMoveFromPointerDownHandler(pointerDownState);\n\n const onPointerUp =\n this.onPointerUpFromPointerDownHandler(pointerDownState);\n\n const onKeyDown = this.onKeyDownFromPointerDownHandler(pointerDownState);\n const onKeyUp = this.onKeyUpFromPointerDownHandler(pointerDownState);\n\n lastPointerUp = onPointerUp;\n\n if (!this.state.viewModeEnabled) {\n window.addEventListener(EVENT.POINTER_MOVE, onPointerMove);\n window.addEventListener(EVENT.POINTER_UP, onPointerUp);\n window.addEventListener(EVENT.KEYDOWN, onKeyDown);\n window.addEventListener(EVENT.KEYUP, onKeyUp);\n pointerDownState.eventListeners.onMove = onPointerMove;\n pointerDownState.eventListeners.onUp = onPointerUp;\n pointerDownState.eventListeners.onKeyUp = onKeyUp;\n pointerDownState.eventListeners.onKeyDown = onKeyDown;\n }\n };\n\n private handleCanvasPointerUp = (\n event: React.PointerEvent,\n ) => {\n this.lastPointerUp = event;\n const isTouchScreen = [\"pen\", \"touch\"].includes(event.pointerType);\n if (isTouchScreen) {\n const scenePointer = viewportCoordsToSceneCoords(\n { clientX: event.clientX, clientY: event.clientY },\n this.state,\n );\n const hitElement = this.getElementAtPosition(\n scenePointer.x,\n scenePointer.y,\n );\n this.hitLinkElement = this.getElementLinkAtPosition(\n scenePointer,\n hitElement,\n );\n }\n if (\n this.hitLinkElement &&\n !this.state.selectedElementIds[this.hitLinkElement.id]\n ) {\n this.redirectToLink(event, isTouchScreen);\n }\n\n this.removePointer(event);\n };\n\n private maybeOpenContextMenuAfterPointerDownOnTouchDevices = (\n event: React.PointerEvent,\n ): void => {\n // deal with opening context menu on touch devices\n if (event.pointerType === \"touch\") {\n invalidateContextMenu = false;\n\n if (touchTimeout) {\n // If there's already a touchTimeout, this means that there's another\n // touch down and we are doing another touch, so we shouldn't open the\n // context menu.\n invalidateContextMenu = true;\n } else {\n // open the context menu with the first touch's clientX and clientY\n // if the touch is not moving\n touchTimeout = window.setTimeout(() => {\n touchTimeout = 0;\n if (!invalidateContextMenu) {\n this.handleCanvasContextMenu(event);\n }\n }, TOUCH_CTX_MENU_TIMEOUT);\n }\n }\n };\n\n private resetContextMenuTimer = () => {\n clearTimeout(touchTimeout);\n touchTimeout = 0;\n invalidateContextMenu = false;\n };\n\n private maybeCleanupAfterMissingPointerUp(\n event: React.PointerEvent,\n ): void {\n if (lastPointerUp !== null) {\n // Unfortunately, sometimes we don't get a pointerup after a pointerdown,\n // this can happen when a contextual menu or alert is triggered. In order to avoid\n // being in a weird state, we clean up on the next pointerdown\n lastPointerUp(event);\n }\n }\n\n // Returns whether the event is a panning\n private handleCanvasPanUsingWheelOrSpaceDrag = (\n event: React.PointerEvent,\n ): boolean => {\n if (\n !(\n gesture.pointers.size === 0 &&\n (event.button === POINTER_BUTTON.WHEEL ||\n (event.button === POINTER_BUTTON.MAIN && isHoldingSpace) ||\n this.state.viewModeEnabled)\n ) ||\n isTextElement(this.state.editingElement)\n ) {\n return false;\n }\n isPanning = true;\n event.preventDefault();\n\n let nextPastePrevented = false;\n const isLinux = /Linux/.test(window.navigator.platform);\n\n setCursor(this.canvas, CURSOR_TYPE.GRABBING);\n let { clientX: lastX, clientY: lastY } = event;\n const onPointerMove = withBatchedUpdatesThrottled((event: PointerEvent) => {\n const deltaX = lastX - event.clientX;\n const deltaY = lastY - event.clientY;\n lastX = event.clientX;\n lastY = event.clientY;\n\n /*\n * Prevent paste event if we move while middle clicking on Linux.\n * See issue #1383.\n */\n if (\n isLinux &&\n !nextPastePrevented &&\n (Math.abs(deltaX) > 1 || Math.abs(deltaY) > 1)\n ) {\n nextPastePrevented = true;\n\n /* Prevent the next paste event */\n const preventNextPaste = (event: ClipboardEvent) => {\n document.body.removeEventListener(EVENT.PASTE, preventNextPaste);\n event.stopPropagation();\n };\n\n /*\n * Reenable next paste in case of disabled middle click paste for\n * any reason:\n * - right click paste\n * - empty clipboard\n */\n const enableNextPaste = () => {\n setTimeout(() => {\n document.body.removeEventListener(EVENT.PASTE, preventNextPaste);\n window.removeEventListener(EVENT.POINTER_UP, enableNextPaste);\n }, 100);\n };\n\n document.body.addEventListener(EVENT.PASTE, preventNextPaste);\n window.addEventListener(EVENT.POINTER_UP, enableNextPaste);\n }\n\n this.setState({\n scrollX: this.state.scrollX - deltaX / this.state.zoom.value,\n scrollY: this.state.scrollY - deltaY / this.state.zoom.value,\n });\n });\n const teardown = withBatchedUpdates(\n (lastPointerUp = () => {\n lastPointerUp = null;\n isPanning = false;\n if (!isHoldingSpace) {\n if (this.state.viewModeEnabled) {\n setCursor(this.canvas, CURSOR_TYPE.GRAB);\n } else {\n setCursorForShape(this.canvas, this.state.elementType);\n }\n }\n this.setState({\n cursorButton: \"up\",\n });\n this.savePointer(event.clientX, event.clientY, \"up\");\n window.removeEventListener(EVENT.POINTER_MOVE, onPointerMove);\n window.removeEventListener(EVENT.POINTER_UP, teardown);\n window.removeEventListener(EVENT.BLUR, teardown);\n onPointerMove.flush();\n }),\n );\n window.addEventListener(EVENT.BLUR, teardown);\n window.addEventListener(EVENT.POINTER_MOVE, onPointerMove, {\n passive: true,\n });\n window.addEventListener(EVENT.POINTER_UP, teardown);\n return true;\n };\n\n private updateGestureOnPointerDown(\n event: React.PointerEvent,\n ): void {\n gesture.pointers.set(event.pointerId, {\n x: event.clientX,\n y: event.clientY,\n });\n\n if (gesture.pointers.size === 2) {\n gesture.lastCenter = getCenter(gesture.pointers);\n gesture.initialScale = this.state.zoom.value;\n gesture.initialDistance = getDistance(\n Array.from(gesture.pointers.values()),\n );\n }\n }\n\n private initialPointerDownState(\n event: React.PointerEvent,\n ): PointerDownState {\n const origin = viewportCoordsToSceneCoords(event, this.state);\n const selectedElements = getSelectedElements(\n this.scene.getElements(),\n this.state,\n );\n const [minX, minY, maxX, maxY] = getCommonBounds(selectedElements);\n\n return {\n origin,\n withCmdOrCtrl: event[KEYS.CTRL_OR_CMD],\n originInGrid: tupleToCoors(\n getGridPoint(origin.x, origin.y, this.state.gridSize),\n ),\n scrollbars: isOverScrollBars(\n currentScrollBars,\n event.clientX - this.state.offsetLeft,\n event.clientY - this.state.offsetTop,\n ),\n // we need to duplicate because we'll be updating this state\n lastCoords: { ...origin },\n originalElements: this.scene.getElements().reduce((acc, element) => {\n acc.set(element.id, deepCopyElement(element));\n return acc;\n }, new Map() as PointerDownState[\"originalElements\"]),\n resize: {\n handleType: false,\n isResizing: false,\n offset: { x: 0, y: 0 },\n arrowDirection: \"origin\",\n center: { x: (maxX + minX) / 2, y: (maxY + minY) / 2 },\n },\n hit: {\n element: null,\n allHitElements: [],\n wasAddedToSelection: false,\n hasBeenDuplicated: false,\n hasHitCommonBoundingBoxOfSelectedElements:\n this.isHittingCommonBoundingBoxOfSelectedElements(\n origin,\n selectedElements,\n ),\n hasHitElementInside: false,\n },\n drag: {\n hasOccurred: false,\n offset: null,\n },\n eventListeners: {\n onMove: null,\n onUp: null,\n onKeyUp: null,\n onKeyDown: null,\n },\n boxSelection: {\n hasOccurred: false,\n },\n };\n }\n\n // Returns whether the event is a dragging a scrollbar\n private handleDraggingScrollBar(\n event: React.PointerEvent,\n pointerDownState: PointerDownState,\n ): boolean {\n if (\n !(pointerDownState.scrollbars.isOverEither && !this.state.multiElement)\n ) {\n return false;\n }\n isDraggingScrollBar = true;\n pointerDownState.lastCoords.x = event.clientX;\n pointerDownState.lastCoords.y = event.clientY;\n const onPointerMove = withBatchedUpdatesThrottled((event: PointerEvent) => {\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n\n this.handlePointerMoveOverScrollbars(event, pointerDownState);\n });\n\n const onPointerUp = withBatchedUpdates(() => {\n isDraggingScrollBar = false;\n setCursorForShape(this.canvas, this.state.elementType);\n lastPointerUp = null;\n this.setState({\n cursorButton: \"up\",\n });\n this.savePointer(event.clientX, event.clientY, \"up\");\n window.removeEventListener(EVENT.POINTER_MOVE, onPointerMove);\n window.removeEventListener(EVENT.POINTER_UP, onPointerUp);\n onPointerMove.flush();\n });\n\n lastPointerUp = onPointerUp;\n\n window.addEventListener(EVENT.POINTER_MOVE, onPointerMove);\n window.addEventListener(EVENT.POINTER_UP, onPointerUp);\n return true;\n }\n\n private clearSelectionIfNotUsingSelection = (): void => {\n if (this.state.elementType !== \"selection\") {\n this.setState({\n selectedElementIds: {},\n selectedGroupIds: {},\n editingGroupId: null,\n });\n }\n };\n\n /**\n * @returns whether the pointer event has been completely handled\n */\n private handleSelectionOnPointerDown = (\n event: React.PointerEvent,\n pointerDownState: PointerDownState,\n ): boolean => {\n if (this.state.elementType === \"selection\") {\n const elements = this.scene.getElements();\n const selectedElements = getSelectedElements(elements, this.state);\n if (selectedElements.length === 1 && !this.state.editingLinearElement) {\n const elementWithTransformHandleType =\n getElementWithTransformHandleType(\n elements,\n this.state,\n pointerDownState.origin.x,\n pointerDownState.origin.y,\n this.state.zoom,\n event.pointerType,\n );\n if (elementWithTransformHandleType != null) {\n this.setState({\n resizingElement: elementWithTransformHandleType.element,\n });\n pointerDownState.resize.handleType =\n elementWithTransformHandleType.transformHandleType;\n }\n } else if (selectedElements.length > 1) {\n pointerDownState.resize.handleType = getTransformHandleTypeFromCoords(\n getCommonBounds(selectedElements),\n pointerDownState.origin.x,\n pointerDownState.origin.y,\n this.state.zoom,\n event.pointerType,\n );\n }\n if (pointerDownState.resize.handleType) {\n setCursor(\n this.canvas,\n getCursorForResizingElement({\n transformHandleType: pointerDownState.resize.handleType,\n }),\n );\n pointerDownState.resize.isResizing = true;\n pointerDownState.resize.offset = tupleToCoors(\n getResizeOffsetXY(\n pointerDownState.resize.handleType,\n selectedElements,\n pointerDownState.origin.x,\n pointerDownState.origin.y,\n ),\n );\n if (\n selectedElements.length === 1 &&\n isLinearElement(selectedElements[0]) &&\n selectedElements[0].points.length === 2\n ) {\n pointerDownState.resize.arrowDirection = getResizeArrowDirection(\n pointerDownState.resize.handleType,\n selectedElements[0],\n );\n }\n } else {\n if (this.state.editingLinearElement) {\n const ret = LinearElementEditor.handlePointerDown(\n event,\n this.state,\n (appState) => this.setState(appState),\n this.history,\n pointerDownState.origin,\n );\n if (ret.hitElement) {\n pointerDownState.hit.element = ret.hitElement;\n }\n if (ret.didAddPoint) {\n return true;\n }\n }\n // hitElement may already be set above, so check first\n pointerDownState.hit.element =\n pointerDownState.hit.element ??\n this.getElementAtPosition(\n pointerDownState.origin.x,\n pointerDownState.origin.y,\n );\n\n if (pointerDownState.hit.element) {\n // Early return if pointer is hitting link icon\n if (\n isPointHittingLinkIcon(\n pointerDownState.hit.element,\n this.state,\n [pointerDownState.origin.x, pointerDownState.origin.y],\n this.isMobile,\n )\n ) {\n return false;\n }\n pointerDownState.hit.hasHitElementInside =\n isHittingElementNotConsideringBoundingBox(\n pointerDownState.hit.element,\n this.state,\n [pointerDownState.origin.x, pointerDownState.origin.y],\n );\n }\n\n // For overlapped elements one position may hit\n // multiple elements\n pointerDownState.hit.allHitElements = this.getElementsAtPosition(\n pointerDownState.origin.x,\n pointerDownState.origin.y,\n );\n\n const hitElement = pointerDownState.hit.element;\n const someHitElementIsSelected =\n pointerDownState.hit.allHitElements.some((element) =>\n this.isASelectedElement(element),\n );\n if (\n (hitElement === null || !someHitElementIsSelected) &&\n !event.shiftKey &&\n !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements\n ) {\n this.clearSelection(hitElement);\n }\n\n if (this.state.editingLinearElement) {\n this.setState({\n selectedElementIds: {\n [this.state.editingLinearElement.elementId]: true,\n },\n });\n // If we click on something\n } else if (hitElement != null) {\n // on CMD/CTRL, drill down to hit element regardless of groups etc.\n if (event[KEYS.CTRL_OR_CMD]) {\n if (!this.state.selectedElementIds[hitElement.id]) {\n pointerDownState.hit.wasAddedToSelection = true;\n }\n this.setState((prevState) => ({\n ...editGroupForSelectedElement(prevState, hitElement),\n previousSelectedElementIds: this.state.selectedElementIds,\n }));\n // mark as not completely handled so as to allow dragging etc.\n return false;\n }\n\n // deselect if item is selected\n // if shift is not clicked, this will always return true\n // otherwise, it will trigger selection based on current\n // state of the box\n if (!this.state.selectedElementIds[hitElement.id]) {\n // if we are currently editing a group, exiting editing mode and deselect the group.\n if (\n this.state.editingGroupId &&\n !isElementInGroup(hitElement, this.state.editingGroupId)\n ) {\n this.setState({\n selectedElementIds: {},\n selectedGroupIds: {},\n editingGroupId: null,\n });\n }\n\n // Add hit element to selection. At this point if we're not holding\n // SHIFT the previously selected element(s) were deselected above\n // (make sure you use setState updater to use latest state)\n if (\n !someHitElementIsSelected &&\n !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements\n ) {\n this.setState((prevState) => {\n return selectGroupsForSelectedElements(\n {\n ...prevState,\n selectedElementIds: {\n ...prevState.selectedElementIds,\n [hitElement.id]: true,\n },\n showHyperlinkPopup: hitElement.link ? \"info\" : false,\n },\n this.scene.getElements(),\n );\n });\n pointerDownState.hit.wasAddedToSelection = true;\n }\n }\n }\n\n this.setState({\n previousSelectedElementIds: this.state.selectedElementIds,\n });\n }\n }\n return false;\n };\n\n private isASelectedElement(hitElement: ExcalidrawElement | null): boolean {\n return hitElement != null && this.state.selectedElementIds[hitElement.id];\n }\n\n private isHittingCommonBoundingBoxOfSelectedElements(\n point: Readonly<{ x: number; y: number }>,\n selectedElements: readonly ExcalidrawElement[],\n ): boolean {\n if (selectedElements.length < 2) {\n return false;\n }\n\n // How many pixels off the shape boundary we still consider a hit\n const threshold = 10 / this.state.zoom.value;\n const [x1, y1, x2, y2] = getCommonBounds(selectedElements);\n return (\n point.x > x1 - threshold &&\n point.x < x2 + threshold &&\n point.y > y1 - threshold &&\n point.y < y2 + threshold\n );\n }\n\n private handleTextOnPointerDown = (\n event: React.PointerEvent,\n pointerDownState: PointerDownState,\n ): void => {\n // if we're currently still editing text, clicking outside\n // should only finalize it, not create another (irrespective\n // of state.elementLocked)\n if (isTextElement(this.state.editingElement)) {\n return;\n }\n let sceneX = pointerDownState.origin.x;\n let sceneY = pointerDownState.origin.y;\n\n const element = this.getElementAtPosition(sceneX, sceneY, {\n includeBoundTextElement: true,\n });\n\n const canBindText = hasBoundTextElement(element);\n if (canBindText) {\n sceneX = element.x + element.width / 2;\n sceneY = element.y + element.height / 2;\n }\n this.startTextEditing({\n sceneX,\n sceneY,\n shouldBind: false,\n insertAtParentCenter: !event.altKey,\n });\n\n resetCursor(this.canvas);\n if (!this.state.elementLocked) {\n this.setState({\n elementType: \"selection\",\n });\n }\n };\n\n private handleFreeDrawElementOnPointerDown = (\n event: React.PointerEvent,\n elementType: ExcalidrawFreeDrawElement[\"type\"],\n pointerDownState: PointerDownState,\n ) => {\n // Begin a mark capture. This does not have to update state yet.\n const [gridX, gridY] = getGridPoint(\n pointerDownState.origin.x,\n pointerDownState.origin.y,\n null,\n );\n\n const element = newFreeDrawElement({\n type: elementType,\n x: gridX,\n y: gridY,\n strokeColor: this.state.currentItemStrokeColor,\n backgroundColor: this.state.currentItemBackgroundColor,\n fillStyle: this.state.currentItemFillStyle,\n strokeWidth: this.state.currentItemStrokeWidth,\n strokeStyle: this.state.currentItemStrokeStyle,\n roughness: this.state.currentItemRoughness,\n opacity: this.state.currentItemOpacity,\n strokeSharpness: this.state.currentItemLinearStrokeSharpness,\n simulatePressure: event.pressure === 0.5,\n });\n\n this.setState((prevState) => ({\n selectedElementIds: {\n ...prevState.selectedElementIds,\n [element.id]: false,\n },\n }));\n\n const pressures = element.simulatePressure\n ? element.pressures\n : [...element.pressures, event.pressure];\n\n mutateElement(element, {\n points: [[0, 0]],\n pressures,\n });\n\n const boundElement = getHoveredElementForBinding(\n pointerDownState.origin,\n this.scene,\n );\n this.scene.replaceAllElements([\n ...this.scene.getElementsIncludingDeleted(),\n element,\n ]);\n this.setState({\n draggingElement: element,\n editingElement: element,\n startBoundElement: boundElement,\n suggestedBindings: [],\n });\n };\n\n private createImageElement = ({\n sceneX,\n sceneY,\n }: {\n sceneX: number;\n sceneY: number;\n }) => {\n const [gridX, gridY] = getGridPoint(sceneX, sceneY, this.state.gridSize);\n\n const element = newImageElement({\n type: \"image\",\n x: gridX,\n y: gridY,\n strokeColor: this.state.currentItemStrokeColor,\n backgroundColor: this.state.currentItemBackgroundColor,\n fillStyle: this.state.currentItemFillStyle,\n strokeWidth: this.state.currentItemStrokeWidth,\n strokeStyle: this.state.currentItemStrokeStyle,\n roughness: this.state.currentItemRoughness,\n opacity: this.state.currentItemOpacity,\n strokeSharpness: this.state.currentItemLinearStrokeSharpness,\n });\n\n return element;\n };\n\n private handleLinearElementOnPointerDown = (\n event: React.PointerEvent,\n elementType: ExcalidrawLinearElement[\"type\"],\n pointerDownState: PointerDownState,\n ): void => {\n if (this.state.multiElement) {\n const { multiElement } = this.state;\n\n // finalize if completing a loop\n if (\n multiElement.type === \"line\" &&\n isPathALoop(multiElement.points, this.state.zoom.value)\n ) {\n mutateElement(multiElement, {\n lastCommittedPoint:\n multiElement.points[multiElement.points.length - 1],\n });\n this.actionManager.executeAction(actionFinalize);\n return;\n }\n\n const { x: rx, y: ry, lastCommittedPoint } = multiElement;\n\n // clicking inside commit zone → finalize arrow\n if (\n multiElement.points.length > 1 &&\n lastCommittedPoint &&\n distance2d(\n pointerDownState.origin.x - rx,\n pointerDownState.origin.y - ry,\n lastCommittedPoint[0],\n lastCommittedPoint[1],\n ) < LINE_CONFIRM_THRESHOLD\n ) {\n this.actionManager.executeAction(actionFinalize);\n return;\n }\n\n this.setState((prevState) => ({\n selectedElementIds: {\n ...prevState.selectedElementIds,\n [multiElement.id]: true,\n },\n }));\n // clicking outside commit zone → update reference for last committed\n // point\n mutateElement(multiElement, {\n lastCommittedPoint: multiElement.points[multiElement.points.length - 1],\n });\n setCursor(this.canvas, CURSOR_TYPE.POINTER);\n } else {\n const [gridX, gridY] = getGridPoint(\n pointerDownState.origin.x,\n pointerDownState.origin.y,\n this.state.gridSize,\n );\n\n /* If arrow is pre-arrowheads, it will have undefined for both start and end arrowheads.\n If so, we want it to be null for start and \"arrow\" for end. If the linear item is not\n an arrow, we want it to be null for both. Otherwise, we want it to use the\n values from appState. */\n\n const { currentItemStartArrowhead, currentItemEndArrowhead } = this.state;\n const [startArrowhead, endArrowhead] =\n elementType === \"arrow\"\n ? [currentItemStartArrowhead, currentItemEndArrowhead]\n : [null, null];\n\n const element = newLinearElement({\n type: elementType,\n x: gridX,\n y: gridY,\n strokeColor: this.state.currentItemStrokeColor,\n backgroundColor: this.state.currentItemBackgroundColor,\n fillStyle: this.state.currentItemFillStyle,\n strokeWidth: this.state.currentItemStrokeWidth,\n strokeStyle: this.state.currentItemStrokeStyle,\n roughness: this.state.currentItemRoughness,\n opacity: this.state.currentItemOpacity,\n strokeSharpness: this.state.currentItemLinearStrokeSharpness,\n startArrowhead,\n endArrowhead,\n });\n this.setState((prevState) => ({\n selectedElementIds: {\n ...prevState.selectedElementIds,\n [element.id]: false,\n },\n }));\n mutateElement(element, {\n points: [...element.points, [0, 0]],\n });\n const boundElement = getHoveredElementForBinding(\n pointerDownState.origin,\n this.scene,\n );\n this.scene.replaceAllElements([\n ...this.scene.getElementsIncludingDeleted(),\n element,\n ]);\n this.setState({\n draggingElement: element,\n editingElement: element,\n startBoundElement: boundElement,\n suggestedBindings: [],\n });\n }\n };\n\n private createGenericElementOnPointerDown = (\n elementType: ExcalidrawGenericElement[\"type\"],\n pointerDownState: PointerDownState,\n ): void => {\n const [gridX, gridY] = getGridPoint(\n pointerDownState.origin.x,\n pointerDownState.origin.y,\n this.state.gridSize,\n );\n const element = newElement({\n type: elementType,\n x: gridX,\n y: gridY,\n strokeColor: this.state.currentItemStrokeColor,\n backgroundColor: this.state.currentItemBackgroundColor,\n fillStyle: this.state.currentItemFillStyle,\n strokeWidth: this.state.currentItemStrokeWidth,\n strokeStyle: this.state.currentItemStrokeStyle,\n roughness: this.state.currentItemRoughness,\n opacity: this.state.currentItemOpacity,\n strokeSharpness: this.state.currentItemStrokeSharpness,\n });\n\n if (element.type === \"selection\") {\n this.setState({\n selectionElement: element,\n draggingElement: element,\n });\n } else {\n this.scene.replaceAllElements([\n ...this.scene.getElementsIncludingDeleted(),\n element,\n ]);\n this.setState({\n multiElement: null,\n draggingElement: element,\n editingElement: element,\n });\n }\n };\n\n private onKeyDownFromPointerDownHandler(\n pointerDownState: PointerDownState,\n ): (event: KeyboardEvent) => void {\n return withBatchedUpdates((event: KeyboardEvent) => {\n if (this.maybeHandleResize(pointerDownState, event)) {\n return;\n }\n this.maybeDragNewGenericElement(pointerDownState, event);\n });\n }\n\n private onKeyUpFromPointerDownHandler(\n pointerDownState: PointerDownState,\n ): (event: KeyboardEvent) => void {\n return withBatchedUpdates((event: KeyboardEvent) => {\n // Prevents focus from escaping excalidraw tab\n event.key === KEYS.ALT && event.preventDefault();\n if (this.maybeHandleResize(pointerDownState, event)) {\n return;\n }\n this.maybeDragNewGenericElement(pointerDownState, event);\n });\n }\n\n private onPointerMoveFromPointerDownHandler(\n pointerDownState: PointerDownState,\n ) {\n return withBatchedUpdatesThrottled((event: PointerEvent) => {\n // We need to initialize dragOffsetXY only after we've updated\n // `state.selectedElementIds` on pointerDown. Doing it here in pointerMove\n // event handler should hopefully ensure we're already working with\n // the updated state.\n if (pointerDownState.drag.offset === null) {\n pointerDownState.drag.offset = tupleToCoors(\n getDragOffsetXY(\n getSelectedElements(this.scene.getElements(), this.state),\n pointerDownState.origin.x,\n pointerDownState.origin.y,\n ),\n );\n }\n\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n\n if (this.handlePointerMoveOverScrollbars(event, pointerDownState)) {\n return;\n }\n\n const pointerCoords = viewportCoordsToSceneCoords(event, this.state);\n const [gridX, gridY] = getGridPoint(\n pointerCoords.x,\n pointerCoords.y,\n this.state.gridSize,\n );\n\n // for arrows/lines, don't start dragging until a given threshold\n // to ensure we don't create a 2-point arrow by mistake when\n // user clicks mouse in a way that it moves a tiny bit (thus\n // triggering pointermove)\n if (\n !pointerDownState.drag.hasOccurred &&\n (this.state.elementType === \"arrow\" ||\n this.state.elementType === \"line\")\n ) {\n if (\n distance2d(\n pointerCoords.x,\n pointerCoords.y,\n pointerDownState.origin.x,\n pointerDownState.origin.y,\n ) < DRAGGING_THRESHOLD\n ) {\n return;\n }\n }\n\n if (pointerDownState.resize.isResizing) {\n pointerDownState.lastCoords.x = pointerCoords.x;\n pointerDownState.lastCoords.y = pointerCoords.y;\n if (this.maybeHandleResize(pointerDownState, event)) {\n return true;\n }\n }\n\n if (this.state.editingLinearElement) {\n const didDrag = LinearElementEditor.handlePointDragging(\n this.state,\n (appState) => this.setState(appState),\n pointerCoords.x,\n pointerCoords.y,\n (element, pointsSceneCoords) => {\n this.maybeSuggestBindingsForLinearElementAtCoords(\n element,\n pointsSceneCoords,\n );\n },\n );\n\n if (didDrag) {\n pointerDownState.lastCoords.x = pointerCoords.x;\n pointerDownState.lastCoords.y = pointerCoords.y;\n return;\n }\n }\n\n const hasHitASelectedElement = pointerDownState.hit.allHitElements.some(\n (element) => this.isASelectedElement(element),\n );\n\n if (\n (hasHitASelectedElement ||\n pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) &&\n // this allows for box-selecting points when clicking inside the\n // line's bounding box\n (!this.state.editingLinearElement || !event.shiftKey) &&\n // box-selecting without shift when editing line, not clicking on a line\n (!this.state.editingLinearElement ||\n this.state.editingLinearElement?.elementId !==\n pointerDownState.hit.element?.id ||\n pointerDownState.hit.hasHitElementInside)\n ) {\n // Marking that click was used for dragging to check\n // if elements should be deselected on pointerup\n pointerDownState.drag.hasOccurred = true;\n const selectedElements = getSelectedElements(\n this.scene.getElements(),\n this.state,\n );\n // prevent dragging even if we're no longer holding cmd/ctrl otherwise\n // it would have weird results (stuff jumping all over the screen)\n if (selectedElements.length > 0 && !pointerDownState.withCmdOrCtrl) {\n const [dragX, dragY] = getGridPoint(\n pointerCoords.x - pointerDownState.drag.offset.x,\n pointerCoords.y - pointerDownState.drag.offset.y,\n this.state.gridSize,\n );\n\n const [dragDistanceX, dragDistanceY] = [\n Math.abs(pointerCoords.x - pointerDownState.origin.x),\n Math.abs(pointerCoords.y - pointerDownState.origin.y),\n ];\n\n // We only drag in one direction if shift is pressed\n const lockDirection = event.shiftKey;\n\n dragSelectedElements(\n pointerDownState,\n selectedElements,\n dragX,\n dragY,\n lockDirection,\n dragDistanceX,\n dragDistanceY,\n this.state,\n );\n this.maybeSuggestBindingForAll(selectedElements);\n\n // We duplicate the selected element if alt is pressed on pointer move\n if (event.altKey && !pointerDownState.hit.hasBeenDuplicated) {\n // Move the currently selected elements to the top of the z index stack, and\n // put the duplicates where the selected elements used to be.\n // (the origin point where the dragging started)\n\n pointerDownState.hit.hasBeenDuplicated = true;\n\n const nextElements = [];\n const elementsToAppend = [];\n const groupIdMap = new Map();\n const oldIdToDuplicatedId = new Map();\n const hitElement = pointerDownState.hit.element;\n const elements = this.scene.getElementsIncludingDeleted();\n const selectedElementIds: Array =\n getSelectedElements(elements, this.state, true).map(\n (element) => element.id,\n );\n\n for (const element of elements) {\n if (\n selectedElementIds.includes(element.id) ||\n // case: the state.selectedElementIds might not have been\n // updated yet by the time this mousemove event is fired\n (element.id === hitElement?.id &&\n pointerDownState.hit.wasAddedToSelection)\n ) {\n const duplicatedElement = duplicateElement(\n this.state.editingGroupId,\n groupIdMap,\n element,\n );\n const [originDragX, originDragY] = getGridPoint(\n pointerDownState.origin.x - pointerDownState.drag.offset.x,\n pointerDownState.origin.y - pointerDownState.drag.offset.y,\n this.state.gridSize,\n );\n mutateElement(duplicatedElement, {\n x: duplicatedElement.x + (originDragX - dragX),\n y: duplicatedElement.y + (originDragY - dragY),\n });\n nextElements.push(duplicatedElement);\n elementsToAppend.push(element);\n oldIdToDuplicatedId.set(element.id, duplicatedElement.id);\n } else {\n nextElements.push(element);\n }\n }\n const nextSceneElements = [...nextElements, ...elementsToAppend];\n bindTextToShapeAfterDuplication(\n nextElements,\n elementsToAppend,\n oldIdToDuplicatedId,\n );\n fixBindingsAfterDuplication(\n nextSceneElements,\n elementsToAppend,\n oldIdToDuplicatedId,\n \"duplicatesServeAsOld\",\n );\n this.scene.replaceAllElements(nextSceneElements);\n }\n return;\n }\n }\n\n // It is very important to read this.state within each move event,\n // otherwise we would read a stale one!\n const draggingElement = this.state.draggingElement;\n if (!draggingElement) {\n return;\n }\n\n if (draggingElement.type === \"freedraw\") {\n const points = draggingElement.points;\n const dx = pointerCoords.x - draggingElement.x;\n const dy = pointerCoords.y - draggingElement.y;\n\n const lastPoint = points.length > 0 && points[points.length - 1];\n const discardPoint =\n lastPoint && lastPoint[0] === dx && lastPoint[1] === dy;\n\n if (!discardPoint) {\n const pressures = draggingElement.simulatePressure\n ? draggingElement.pressures\n : [...draggingElement.pressures, event.pressure];\n\n mutateElement(draggingElement, {\n points: [...points, [dx, dy]],\n pressures,\n });\n }\n } else if (isLinearElement(draggingElement)) {\n pointerDownState.drag.hasOccurred = true;\n const points = draggingElement.points;\n let dx = gridX - draggingElement.x;\n let dy = gridY - draggingElement.y;\n\n if (shouldRotateWithDiscreteAngle(event) && points.length === 2) {\n ({ width: dx, height: dy } = getPerfectElementSize(\n this.state.elementType,\n dx,\n dy,\n ));\n }\n\n if (points.length === 1) {\n mutateElement(draggingElement, { points: [...points, [dx, dy]] });\n } else if (points.length > 1) {\n mutateElement(draggingElement, {\n points: [...points.slice(0, -1), [dx, dy]],\n });\n }\n\n if (isBindingElement(draggingElement)) {\n // When creating a linear element by dragging\n this.maybeSuggestBindingsForLinearElementAtCoords(\n draggingElement,\n [pointerCoords],\n this.state.startBoundElement,\n );\n }\n } else {\n pointerDownState.lastCoords.x = pointerCoords.x;\n pointerDownState.lastCoords.y = pointerCoords.y;\n this.maybeDragNewGenericElement(pointerDownState, event);\n }\n\n if (this.state.elementType === \"selection\") {\n pointerDownState.boxSelection.hasOccurred = true;\n\n const elements = this.scene.getElements();\n if (\n !event.shiftKey &&\n // allows for box-selecting points (without shift)\n !this.state.editingLinearElement &&\n isSomeElementSelected(elements, this.state)\n ) {\n if (pointerDownState.withCmdOrCtrl && pointerDownState.hit.element) {\n this.setState((prevState) =>\n selectGroupsForSelectedElements(\n {\n ...prevState,\n selectedElementIds: {\n [pointerDownState.hit.element!.id]: true,\n },\n },\n this.scene.getElements(),\n ),\n );\n } else {\n this.setState({\n selectedElementIds: {},\n selectedGroupIds: {},\n editingGroupId: null,\n });\n }\n }\n // box-select line editor points\n if (this.state.editingLinearElement) {\n LinearElementEditor.handleBoxSelection(\n event,\n this.state,\n this.setState.bind(this),\n );\n // regular box-select\n } else {\n const elementsWithinSelection = getElementsWithinSelection(\n elements,\n draggingElement,\n );\n this.setState((prevState) =>\n selectGroupsForSelectedElements(\n {\n ...prevState,\n selectedElementIds: {\n ...prevState.selectedElementIds,\n ...elementsWithinSelection.reduce((map, element) => {\n map[element.id] = true;\n return map;\n }, {} as any),\n ...(pointerDownState.hit.element\n ? {\n // if using ctrl/cmd, select the hitElement only if we\n // haven't box-selected anything else\n [pointerDownState.hit.element.id]:\n !elementsWithinSelection.length,\n }\n : null),\n },\n showHyperlinkPopup:\n elementsWithinSelection.length === 1 &&\n elementsWithinSelection[0].link\n ? \"info\"\n : false,\n },\n this.scene.getElements(),\n ),\n );\n }\n }\n });\n }\n\n // Returns whether the pointer move happened over either scrollbar\n private handlePointerMoveOverScrollbars(\n event: PointerEvent,\n pointerDownState: PointerDownState,\n ): boolean {\n if (pointerDownState.scrollbars.isOverHorizontal) {\n const x = event.clientX;\n const dx = x - pointerDownState.lastCoords.x;\n this.setState({\n scrollX: this.state.scrollX - dx / this.state.zoom.value,\n });\n pointerDownState.lastCoords.x = x;\n return true;\n }\n\n if (pointerDownState.scrollbars.isOverVertical) {\n const y = event.clientY;\n const dy = y - pointerDownState.lastCoords.y;\n this.setState({\n scrollY: this.state.scrollY - dy / this.state.zoom.value,\n });\n pointerDownState.lastCoords.y = y;\n return true;\n }\n return false;\n }\n\n private onPointerUpFromPointerDownHandler(\n pointerDownState: PointerDownState,\n ): (event: PointerEvent) => void {\n return withBatchedUpdates((childEvent: PointerEvent) => {\n const {\n draggingElement,\n resizingElement,\n multiElement,\n elementType,\n elementLocked,\n isResizing,\n isRotating,\n } = this.state;\n\n this.setState({\n isResizing: false,\n isRotating: false,\n resizingElement: null,\n selectionElement: null,\n cursorButton: \"up\",\n // text elements are reset on finalize, and resetting on pointerup\n // may cause issues with double taps\n editingElement:\n multiElement || isTextElement(this.state.editingElement)\n ? this.state.editingElement\n : null,\n });\n\n this.savePointer(childEvent.clientX, childEvent.clientY, \"up\");\n\n // Handle end of dragging a point of a linear element, might close a loop\n // and sets binding element\n if (this.state.editingLinearElement) {\n if (\n !pointerDownState.boxSelection.hasOccurred &&\n (pointerDownState.hit?.element?.id !==\n this.state.editingLinearElement.elementId ||\n !pointerDownState.hit.hasHitElementInside)\n ) {\n this.actionManager.executeAction(actionFinalize);\n } else {\n const editingLinearElement = LinearElementEditor.handlePointerUp(\n childEvent,\n this.state.editingLinearElement,\n this.state,\n );\n if (editingLinearElement !== this.state.editingLinearElement) {\n this.setState({\n editingLinearElement,\n suggestedBindings: [],\n });\n }\n }\n }\n\n lastPointerUp = null;\n\n if (pointerDownState.eventListeners.onMove) {\n pointerDownState.eventListeners.onMove.flush();\n }\n\n window.removeEventListener(\n EVENT.POINTER_MOVE,\n pointerDownState.eventListeners.onMove!,\n );\n window.removeEventListener(\n EVENT.POINTER_UP,\n pointerDownState.eventListeners.onUp!,\n );\n window.removeEventListener(\n EVENT.KEYDOWN,\n pointerDownState.eventListeners.onKeyDown!,\n );\n window.removeEventListener(\n EVENT.KEYUP,\n pointerDownState.eventListeners.onKeyUp!,\n );\n\n if (this.state.pendingImageElement) {\n this.setState({ pendingImageElement: null });\n }\n\n if (draggingElement?.type === \"freedraw\") {\n const pointerCoords = viewportCoordsToSceneCoords(\n childEvent,\n this.state,\n );\n\n const points = draggingElement.points;\n let dx = pointerCoords.x - draggingElement.x;\n let dy = pointerCoords.y - draggingElement.y;\n\n // Allows dots to avoid being flagged as infinitely small\n if (dx === points[0][0] && dy === points[0][1]) {\n dy += 0.0001;\n dx += 0.0001;\n }\n\n const pressures = draggingElement.simulatePressure\n ? []\n : [...draggingElement.pressures, childEvent.pressure];\n\n mutateElement(draggingElement, {\n points: [...points, [dx, dy]],\n pressures,\n lastCommittedPoint: [dx, dy],\n });\n\n this.actionManager.executeAction(actionFinalize);\n\n return;\n }\n if (isImageElement(draggingElement)) {\n const imageElement = draggingElement;\n try {\n this.initializeImageDimensions(imageElement);\n this.setState(\n { selectedElementIds: { [imageElement.id]: true } },\n () => {\n this.actionManager.executeAction(actionFinalize);\n },\n );\n } catch (error: any) {\n console.error(error);\n this.scene.replaceAllElements(\n this.scene\n .getElementsIncludingDeleted()\n .filter((el) => el.id !== imageElement.id),\n );\n this.actionManager.executeAction(actionFinalize);\n }\n return;\n }\n\n if (isLinearElement(draggingElement)) {\n if (draggingElement!.points.length > 1) {\n this.history.resumeRecording();\n }\n const pointerCoords = viewportCoordsToSceneCoords(\n childEvent,\n this.state,\n );\n\n if (\n !pointerDownState.drag.hasOccurred &&\n draggingElement &&\n !multiElement\n ) {\n mutateElement(draggingElement, {\n points: [\n ...draggingElement.points,\n [\n pointerCoords.x - draggingElement.x,\n pointerCoords.y - draggingElement.y,\n ],\n ],\n });\n this.setState({\n multiElement: draggingElement,\n editingElement: this.state.draggingElement,\n });\n } else if (pointerDownState.drag.hasOccurred && !multiElement) {\n if (\n isBindingEnabled(this.state) &&\n isBindingElement(draggingElement)\n ) {\n maybeBindLinearElement(\n draggingElement,\n this.state,\n this.scene,\n pointerCoords,\n );\n }\n this.setState({ suggestedBindings: [], startBoundElement: null });\n if (!elementLocked) {\n resetCursor(this.canvas);\n this.setState((prevState) => ({\n draggingElement: null,\n elementType: \"selection\",\n selectedElementIds: {\n ...prevState.selectedElementIds,\n [this.state.draggingElement!.id]: true,\n },\n }));\n } else {\n this.setState((prevState) => ({\n draggingElement: null,\n selectedElementIds: {\n ...prevState.selectedElementIds,\n [this.state.draggingElement!.id]: true,\n },\n }));\n }\n }\n return;\n }\n\n if (\n elementType !== \"selection\" &&\n draggingElement &&\n isInvisiblySmallElement(draggingElement)\n ) {\n // remove invisible element which was added in onPointerDown\n this.scene.replaceAllElements(\n this.scene.getElementsIncludingDeleted().slice(0, -1),\n );\n this.setState({\n draggingElement: null,\n });\n return;\n }\n\n if (draggingElement) {\n mutateElement(\n draggingElement,\n getNormalizedDimensions(draggingElement),\n );\n }\n\n if (resizingElement) {\n this.history.resumeRecording();\n }\n\n if (resizingElement && isInvisiblySmallElement(resizingElement)) {\n this.scene.replaceAllElements(\n this.scene\n .getElementsIncludingDeleted()\n .filter((el) => el.id !== resizingElement.id),\n );\n }\n\n // Code below handles selection when element(s) weren't\n // drag or added to selection on pointer down phase.\n const hitElement = pointerDownState.hit.element;\n if (\n hitElement &&\n !pointerDownState.drag.hasOccurred &&\n !pointerDownState.hit.wasAddedToSelection &&\n // if we're editing a line, pointerup shouldn't switch selection if\n // box selected\n (!this.state.editingLinearElement ||\n !pointerDownState.boxSelection.hasOccurred)\n ) {\n // when inside line editor, shift selects points instead\n if (childEvent.shiftKey && !this.state.editingLinearElement) {\n if (this.state.selectedElementIds[hitElement.id]) {\n if (isSelectedViaGroup(this.state, hitElement)) {\n // We want to unselect all groups hitElement is part of\n // as well as all elements that are part of the groups\n // hitElement is part of\n const idsOfSelectedElementsThatAreInGroups = hitElement.groupIds\n .flatMap((groupId) =>\n getElementsInGroup(this.scene.getElements(), groupId),\n )\n .map((element) => ({ [element.id]: false }))\n .reduce((prevId, acc) => ({ ...prevId, ...acc }), {});\n\n this.setState((_prevState) => ({\n selectedGroupIds: {\n ..._prevState.selectedElementIds,\n ...hitElement.groupIds\n .map((gId) => ({ [gId]: false }))\n .reduce((prev, acc) => ({ ...prev, ...acc }), {}),\n },\n selectedElementIds: {\n ..._prevState.selectedElementIds,\n ...idsOfSelectedElementsThatAreInGroups,\n },\n }));\n } else {\n // remove element from selection while\n // keeping prev elements selected\n this.setState((prevState) =>\n selectGroupsForSelectedElements(\n {\n ...prevState,\n selectedElementIds: {\n ...prevState.selectedElementIds,\n [hitElement!.id]: false,\n },\n },\n this.scene.getElements(),\n ),\n );\n }\n } else {\n // add element to selection while\n // keeping prev elements selected\n\n this.setState((_prevState) => ({\n selectedElementIds: {\n ..._prevState.selectedElementIds,\n [hitElement!.id]: true,\n },\n }));\n }\n } else {\n this.setState((prevState) => ({\n ...selectGroupsForSelectedElements(\n {\n ...prevState,\n selectedElementIds: { [hitElement.id]: true },\n },\n this.scene.getElements(),\n ),\n }));\n }\n }\n\n if (\n !this.state.editingLinearElement &&\n !pointerDownState.drag.hasOccurred &&\n !this.state.isResizing &&\n ((hitElement &&\n isHittingElementBoundingBoxWithoutHittingElement(\n hitElement,\n this.state,\n pointerDownState.origin.x,\n pointerDownState.origin.y,\n )) ||\n (!hitElement &&\n pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements))\n ) {\n // Deselect selected elements\n this.setState({\n selectedElementIds: {},\n selectedGroupIds: {},\n editingGroupId: null,\n });\n\n return;\n }\n\n if (!elementLocked && elementType !== \"freedraw\" && draggingElement) {\n this.setState((prevState) => ({\n selectedElementIds: {\n ...prevState.selectedElementIds,\n [draggingElement.id]: true,\n },\n }));\n }\n\n if (\n elementType !== \"selection\" ||\n isSomeElementSelected(this.scene.getElements(), this.state)\n ) {\n this.history.resumeRecording();\n }\n\n if (pointerDownState.drag.hasOccurred || isResizing || isRotating) {\n (isBindingEnabled(this.state)\n ? bindOrUnbindSelectedElements\n : unbindLinearElements)(\n getSelectedElements(this.scene.getElements(), this.state),\n );\n }\n\n if (!elementLocked && elementType !== \"freedraw\") {\n resetCursor(this.canvas);\n this.setState({\n draggingElement: null,\n suggestedBindings: [],\n elementType: \"selection\",\n });\n } else {\n this.setState({\n draggingElement: null,\n suggestedBindings: [],\n });\n }\n });\n }\n\n private initializeImage = async ({\n imageFile,\n imageElement: _imageElement,\n showCursorImagePreview = false,\n }: {\n imageFile: File;\n imageElement: ExcalidrawImageElement;\n showCursorImagePreview?: boolean;\n }) => {\n // at this point this should be guaranteed image file, but we do this check\n // to satisfy TS down the line\n if (!isSupportedImageFile(imageFile)) {\n throw new Error(t(\"errors.unsupportedFileType\"));\n }\n const mimeType = imageFile.type;\n\n setCursor(this.canvas, \"wait\");\n\n if (mimeType === MIME_TYPES.svg) {\n try {\n imageFile = SVGStringToFile(\n await normalizeSVG(await imageFile.text()),\n imageFile.name,\n );\n } catch (error: any) {\n console.warn(error);\n throw new Error(t(\"errors.svgImageInsertError\"));\n }\n }\n\n // generate image id (by default the file digest) before any\n // resizing/compression takes place to keep it more portable\n const fileId = await ((this.props.generateIdForFile?.(\n imageFile,\n ) as Promise) || generateIdFromFile(imageFile));\n\n if (!fileId) {\n console.warn(\n \"Couldn't generate file id or the supplied `generateIdForFile` didn't resolve to one.\",\n );\n throw new Error(t(\"errors.imageInsertError\"));\n }\n\n const existingFileData = this.files[fileId];\n if (!existingFileData?.dataURL) {\n try {\n imageFile = await resizeImageFile(imageFile, {\n maxWidthOrHeight: DEFAULT_MAX_IMAGE_WIDTH_OR_HEIGHT,\n });\n } catch (error: any) {\n console.error(\"error trying to resing image file on insertion\", error);\n }\n\n if (imageFile.size > MAX_ALLOWED_FILE_BYTES) {\n throw new Error(\n t(\"errors.fileTooBig\", {\n maxSize: `${Math.trunc(MAX_ALLOWED_FILE_BYTES / 1024 / 1024)}MB`,\n }),\n );\n }\n }\n\n if (showCursorImagePreview) {\n const dataURL = this.files[fileId]?.dataURL;\n // optimization so that we don't unnecessarily resize the original\n // full-size file for cursor preview\n // (it's much faster to convert the resized dataURL to File)\n const resizedFile = dataURL && dataURLToFile(dataURL);\n\n this.setImagePreviewCursor(resizedFile || imageFile);\n }\n\n const dataURL =\n this.files[fileId]?.dataURL || (await getDataURL(imageFile));\n\n const imageElement = mutateElement(\n _imageElement,\n {\n fileId,\n },\n false,\n ) as NonDeleted;\n\n return new Promise>(\n async (resolve, reject) => {\n try {\n this.files = {\n ...this.files,\n [fileId]: {\n mimeType,\n id: fileId,\n dataURL,\n created: Date.now(),\n },\n };\n const cachedImageData = this.imageCache.get(fileId);\n if (!cachedImageData) {\n this.addNewImagesToImageCache();\n await this.updateImageCache([imageElement]);\n }\n if (cachedImageData?.image instanceof Promise) {\n await cachedImageData.image;\n }\n if (\n this.state.pendingImageElement?.id !== imageElement.id &&\n this.state.draggingElement?.id !== imageElement.id\n ) {\n this.initializeImageDimensions(imageElement, true);\n }\n resolve(imageElement);\n } catch (error: any) {\n console.error(error);\n reject(new Error(t(\"errors.imageInsertError\")));\n } finally {\n if (!showCursorImagePreview) {\n resetCursor(this.canvas);\n }\n }\n },\n );\n };\n\n /**\n * inserts image into elements array and rerenders\n */\n private insertImageElement = async (\n imageElement: ExcalidrawImageElement,\n imageFile: File,\n showCursorImagePreview?: boolean,\n ) => {\n this.scene.replaceAllElements([\n ...this.scene.getElementsIncludingDeleted(),\n imageElement,\n ]);\n\n try {\n await this.initializeImage({\n imageFile,\n imageElement,\n showCursorImagePreview,\n });\n } catch (error: any) {\n mutateElement(imageElement, {\n isDeleted: true,\n });\n this.actionManager.executeAction(actionFinalize);\n this.setState({\n errorMessage: error.message || t(\"errors.imageInsertError\"),\n });\n }\n };\n\n private setImagePreviewCursor = async (imageFile: File) => {\n // mustn't be larger than 128 px\n // https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Basic_User_Interface/Using_URL_values_for_the_cursor_property\n const cursorImageSizePx = 96;\n\n const imagePreview = await resizeImageFile(imageFile, {\n maxWidthOrHeight: cursorImageSizePx,\n });\n\n let previewDataURL = await getDataURL(imagePreview);\n\n // SVG cannot be resized via `resizeImageFile` so we resize by rendering to\n // a small canvas\n if (imageFile.type === MIME_TYPES.svg) {\n const img = await loadHTMLImageElement(previewDataURL);\n\n let height = Math.min(img.height, cursorImageSizePx);\n let width = height * (img.width / img.height);\n\n if (width > cursorImageSizePx) {\n width = cursorImageSizePx;\n height = width * (img.height / img.width);\n }\n\n const canvas = document.createElement(\"canvas\");\n canvas.height = height;\n canvas.width = width;\n const context = canvas.getContext(\"2d\")!;\n\n context.drawImage(img, 0, 0, width, height);\n\n previewDataURL = canvas.toDataURL(MIME_TYPES.svg) as DataURL;\n }\n\n if (this.state.pendingImageElement) {\n setCursor(this.canvas, `url(${previewDataURL}) 4 4, auto`);\n }\n };\n\n private onImageAction = async (\n { insertOnCanvasDirectly } = { insertOnCanvasDirectly: false },\n ) => {\n try {\n const clientX = this.state.width / 2 + this.state.offsetLeft;\n const clientY = this.state.height / 2 + this.state.offsetTop;\n\n const { x, y } = viewportCoordsToSceneCoords(\n { clientX, clientY },\n this.state,\n );\n\n const imageFile = await fileOpen({\n description: \"Image\",\n extensions: [\"jpg\", \"png\", \"svg\", \"gif\"],\n });\n\n const imageElement = this.createImageElement({\n sceneX: x,\n sceneY: y,\n });\n\n if (insertOnCanvasDirectly) {\n this.insertImageElement(imageElement, imageFile);\n this.initializeImageDimensions(imageElement);\n this.setState(\n {\n selectedElementIds: { [imageElement.id]: true },\n },\n () => {\n this.actionManager.executeAction(actionFinalize);\n },\n );\n } else {\n this.setState(\n {\n pendingImageElement: imageElement,\n },\n () => {\n this.insertImageElement(\n imageElement,\n imageFile,\n /* showCursorImagePreview */ true,\n );\n },\n );\n }\n } catch (error: any) {\n if (error.name !== \"AbortError\") {\n console.error(error);\n } else {\n console.warn(error);\n }\n this.setState(\n {\n pendingImageElement: null,\n editingElement: null,\n elementType: \"selection\",\n },\n () => {\n this.actionManager.executeAction(actionFinalize);\n },\n );\n }\n };\n\n private initializeImageDimensions = (\n imageElement: ExcalidrawImageElement,\n forceNaturalSize = false,\n ) => {\n const image =\n isInitializedImageElement(imageElement) &&\n this.imageCache.get(imageElement.fileId)?.image;\n\n if (!image || image instanceof Promise) {\n if (\n imageElement.width < DRAGGING_THRESHOLD / this.state.zoom.value &&\n imageElement.height < DRAGGING_THRESHOLD / this.state.zoom.value\n ) {\n const placeholderSize = 100 / this.state.zoom.value;\n mutateElement(imageElement, {\n x: imageElement.x - placeholderSize / 2,\n y: imageElement.y - placeholderSize / 2,\n width: placeholderSize,\n height: placeholderSize,\n });\n }\n\n return;\n }\n\n if (\n forceNaturalSize ||\n // if user-created bounding box is below threshold, assume the\n // intention was to click instead of drag, and use the image's\n // intrinsic size\n (imageElement.width < DRAGGING_THRESHOLD / this.state.zoom.value &&\n imageElement.height < DRAGGING_THRESHOLD / this.state.zoom.value)\n ) {\n const minHeight = Math.max(this.state.height - 120, 160);\n // max 65% of canvas height, clamped to <300px, vh - 120px>\n const maxHeight = Math.min(\n minHeight,\n Math.floor(this.state.height * 0.5) / this.state.zoom.value,\n );\n\n const height = Math.min(image.naturalHeight, maxHeight);\n const width = height * (image.naturalWidth / image.naturalHeight);\n\n // add current imageElement width/height to account for previous centering\n // of the placeholder image\n const x = imageElement.x + imageElement.width / 2 - width / 2;\n const y = imageElement.y + imageElement.height / 2 - height / 2;\n\n mutateElement(imageElement, { x, y, width, height });\n }\n };\n\n /** updates image cache, refreshing updated elements and/or setting status\n to error for images that fail during element creation */\n private updateImageCache = async (\n elements: readonly InitializedExcalidrawImageElement[],\n files = this.files,\n ) => {\n const { updatedFiles, erroredFiles } = await _updateImageCache({\n imageCache: this.imageCache,\n fileIds: elements.map((element) => element.fileId),\n files,\n });\n if (updatedFiles.size || erroredFiles.size) {\n for (const element of elements) {\n if (updatedFiles.has(element.fileId)) {\n invalidateShapeForElement(element);\n }\n }\n }\n if (erroredFiles.size) {\n this.scene.replaceAllElements(\n this.scene.getElementsIncludingDeleted().map((element) => {\n if (\n isInitializedImageElement(element) &&\n erroredFiles.has(element.fileId)\n ) {\n return newElementWith(element, {\n status: \"error\",\n });\n }\n return element;\n }),\n );\n }\n\n return { updatedFiles, erroredFiles };\n };\n\n /** adds new images to imageCache and re-renders if needed */\n private addNewImagesToImageCache = async (\n imageElements: InitializedExcalidrawImageElement[] = getInitializedImageElements(\n this.scene.getElements(),\n ),\n files: BinaryFiles = this.files,\n ) => {\n const uncachedImageElements = imageElements.filter(\n (element) => !element.isDeleted && !this.imageCache.has(element.fileId),\n );\n\n if (uncachedImageElements.length) {\n const { updatedFiles } = await this.updateImageCache(\n uncachedImageElements,\n files,\n );\n if (updatedFiles.size) {\n this.scene.informMutation();\n }\n }\n };\n\n /** generally you should use `addNewImagesToImageCache()` directly if you need\n * to render new images. This is just a failsafe */\n private scheduleImageRefresh = throttle(() => {\n this.addNewImagesToImageCache();\n }, IMAGE_RENDER_TIMEOUT);\n\n private updateBindingEnabledOnPointerMove = (\n event: React.PointerEvent,\n ) => {\n const shouldEnableBinding = shouldEnableBindingForPointerEvent(event);\n if (this.state.isBindingEnabled !== shouldEnableBinding) {\n this.setState({ isBindingEnabled: shouldEnableBinding });\n }\n };\n\n private maybeSuggestBindingAtCursor = (pointerCoords: {\n x: number;\n y: number;\n }): void => {\n const hoveredBindableElement = getHoveredElementForBinding(\n pointerCoords,\n this.scene,\n );\n this.setState({\n suggestedBindings:\n hoveredBindableElement != null ? [hoveredBindableElement] : [],\n });\n };\n\n private maybeSuggestBindingsForLinearElementAtCoords = (\n linearElement: NonDeleted,\n /** scene coords */\n pointerCoords: {\n x: number;\n y: number;\n }[],\n // During line creation the start binding hasn't been written yet\n // into `linearElement`\n oppositeBindingBoundElement?: ExcalidrawBindableElement | null,\n ): void => {\n if (!pointerCoords.length) {\n return;\n }\n\n const suggestedBindings = pointerCoords.reduce(\n (acc: NonDeleted[], coords) => {\n const hoveredBindableElement = getHoveredElementForBinding(\n coords,\n this.scene,\n );\n if (\n hoveredBindableElement != null &&\n !isLinearElementSimpleAndAlreadyBound(\n linearElement,\n oppositeBindingBoundElement?.id,\n hoveredBindableElement,\n )\n ) {\n acc.push(hoveredBindableElement);\n }\n return acc;\n },\n [],\n );\n\n this.setState({ suggestedBindings });\n };\n\n private maybeSuggestBindingForAll(\n selectedElements: NonDeleted[],\n ): void {\n const suggestedBindings = getEligibleElementsForBinding(selectedElements);\n this.setState({ suggestedBindings });\n }\n\n private clearSelection(hitElement: ExcalidrawElement | null): void {\n this.setState((prevState) => ({\n selectedElementIds: {},\n selectedGroupIds: {},\n // Continue editing the same group if the user selected a different\n // element from it\n editingGroupId:\n prevState.editingGroupId &&\n hitElement != null &&\n isElementInGroup(hitElement, prevState.editingGroupId)\n ? prevState.editingGroupId\n : null,\n }));\n this.setState({\n selectedElementIds: {},\n previousSelectedElementIds: this.state.selectedElementIds,\n });\n }\n\n private handleCanvasRef = (canvas: HTMLCanvasElement) => {\n // canvas is null when unmounting\n if (canvas !== null) {\n this.canvas = canvas;\n this.rc = rough.canvas(this.canvas);\n\n this.canvas.addEventListener(EVENT.WHEEL, this.handleWheel, {\n passive: false,\n });\n this.canvas.addEventListener(EVENT.TOUCH_START, this.onTapStart);\n this.canvas.addEventListener(EVENT.TOUCH_END, this.onTapEnd);\n } else {\n this.canvas?.removeEventListener(EVENT.WHEEL, this.handleWheel);\n this.canvas?.removeEventListener(EVENT.TOUCH_START, this.onTapStart);\n this.canvas?.removeEventListener(EVENT.TOUCH_END, this.onTapEnd);\n }\n };\n\n private handleAppOnDrop = async (event: React.DragEvent) => {\n try {\n const file = event.dataTransfer.files[0];\n\n if (isSupportedImageFile(file)) {\n // first attempt to decode scene from the image if it's embedded\n // ---------------------------------------------------------------------\n\n if (file?.type === MIME_TYPES.png || file?.type === MIME_TYPES.svg) {\n try {\n if (nativeFileSystemSupported) {\n try {\n // This will only work as of Chrome 86,\n // but can be safely ignored on older releases.\n const item = event.dataTransfer.items[0];\n (file as any).handle = await (\n item as any\n ).getAsFileSystemHandle();\n } catch (error: any) {\n console.warn(error.name, error.message);\n }\n }\n\n const scene = await loadFromBlob(\n file,\n this.state,\n this.scene.getElementsIncludingDeleted(),\n );\n this.syncActionResult({\n ...scene,\n appState: {\n ...(scene.appState || this.state),\n isLoading: false,\n },\n replaceFiles: true,\n commitToHistory: true,\n });\n return;\n } catch (error: any) {\n if (error.name !== \"EncodingError\") {\n throw error;\n }\n }\n }\n\n // if no scene is embedded or we fail for whatever reason, fall back\n // to importing as regular image\n // ---------------------------------------------------------------------\n\n const { x: sceneX, y: sceneY } = viewportCoordsToSceneCoords(\n event,\n this.state,\n );\n\n const imageElement = this.createImageElement({ sceneX, sceneY });\n this.insertImageElement(imageElement, file);\n this.initializeImageDimensions(imageElement);\n this.setState({ selectedElementIds: { [imageElement.id]: true } });\n\n return;\n }\n } catch (error: any) {\n return this.setState({\n isLoading: false,\n errorMessage: error.message,\n });\n }\n\n const libraryShapes = event.dataTransfer.getData(MIME_TYPES.wblib);\n if (libraryShapes !== \"\") {\n this.addElementsFromPasteOrLibrary({\n elements: JSON.parse(libraryShapes),\n position: event,\n files: null,\n });\n return;\n }\n\n const file = event.dataTransfer?.files[0];\n if (\n file?.type === MIME_TYPES.wblib ||\n file?.name?.endsWith(\".wblib\")\n ) {\n this.library\n .importLibrary(file)\n .then(() => {\n // Close and then open to get the libraries updated\n this.setState({ isLibraryOpen: false });\n this.setState({ isLibraryOpen: true });\n })\n .catch((error) =>\n this.setState({ isLoading: false, errorMessage: error.message }),\n );\n // default: assume an Excalidraw file regardless of extension/MimeType\n } else {\n this.setState({ isLoading: true });\n if (nativeFileSystemSupported) {\n try {\n // This will only work as of Chrome 86,\n // but can be safely ignored on older releases.\n const item = event.dataTransfer.items[0];\n (file as any).handle = await (item as any).getAsFileSystemHandle();\n } catch (error: any) {\n console.warn(error.name, error.message);\n }\n }\n await this.loadFileToCanvas(file);\n }\n };\n\n loadFileToCanvas = (file: Blob) => {\n loadFromBlob(file, this.state, this.scene.getElementsIncludingDeleted())\n .then((scene) => {\n this.syncActionResult({\n ...scene,\n appState: {\n ...(scene.appState || this.state),\n isLoading: false,\n },\n replaceFiles: true,\n commitToHistory: true,\n });\n })\n .catch((error) => {\n this.setState({ isLoading: false, errorMessage: error.message });\n });\n };\n\n private handleCanvasContextMenu = (\n event: React.PointerEvent,\n ) => {\n event.preventDefault();\n\n if (\n (event.nativeEvent.pointerType === \"touch\" ||\n (event.nativeEvent.pointerType === \"pen\" &&\n // always allow if user uses a pen secondary button\n event.button !== POINTER_BUTTON.SECONDARY)) &&\n this.state.elementType !== \"selection\"\n ) {\n return;\n }\n\n const { x, y } = viewportCoordsToSceneCoords(event, this.state);\n const element = this.getElementAtPosition(x, y, { preferSelected: true });\n\n const type = element ? \"element\" : \"canvas\";\n\n const container = this.excalidrawContainerRef.current!;\n const { top: offsetTop, left: offsetLeft } =\n container.getBoundingClientRect();\n const left = event.clientX - offsetLeft;\n const top = event.clientY - offsetTop;\n\n if (element && !this.state.selectedElementIds[element.id]) {\n this.setState({ selectedElementIds: { [element.id]: true } }, () => {\n this._openContextMenu({ top, left }, type);\n });\n } else {\n this._openContextMenu({ top, left }, type);\n }\n };\n\n private maybeDragNewGenericElement = (\n pointerDownState: PointerDownState,\n event: MouseEvent | KeyboardEvent,\n ): void => {\n const draggingElement = this.state.draggingElement;\n const pointerCoords = pointerDownState.lastCoords;\n if (!draggingElement) {\n return;\n }\n if (draggingElement.type === \"selection\") {\n dragNewElement(\n draggingElement,\n this.state.elementType,\n pointerDownState.origin.x,\n pointerDownState.origin.y,\n pointerCoords.x,\n pointerCoords.y,\n distance(pointerDownState.origin.x, pointerCoords.x),\n distance(pointerDownState.origin.y, pointerCoords.y),\n shouldMaintainAspectRatio(event),\n shouldResizeFromCenter(event),\n );\n } else {\n const [gridX, gridY] = getGridPoint(\n pointerCoords.x,\n pointerCoords.y,\n this.state.gridSize,\n );\n\n const image =\n isInitializedImageElement(draggingElement) &&\n this.imageCache.get(draggingElement.fileId)?.image;\n const aspectRatio =\n image && !(image instanceof Promise)\n ? image.width / image.height\n : null;\n\n dragNewElement(\n draggingElement,\n this.state.elementType,\n pointerDownState.originInGrid.x,\n pointerDownState.originInGrid.y,\n gridX,\n gridY,\n distance(pointerDownState.originInGrid.x, gridX),\n distance(pointerDownState.originInGrid.y, gridY),\n isImageElement(draggingElement)\n ? !shouldMaintainAspectRatio(event)\n : shouldMaintainAspectRatio(event),\n shouldResizeFromCenter(event),\n aspectRatio,\n );\n\n this.maybeSuggestBindingForAll([draggingElement]);\n }\n };\n\n private maybeHandleResize = (\n pointerDownState: PointerDownState,\n event: MouseEvent | KeyboardEvent,\n ): boolean => {\n const selectedElements = getSelectedElements(\n this.scene.getElements(),\n this.state,\n );\n const transformHandleType = pointerDownState.resize.handleType;\n this.setState({\n // TODO: rename this state field to \"isScaling\" to distinguish\n // it from the generic \"isResizing\" which includes scaling and\n // rotating\n isResizing: transformHandleType && transformHandleType !== \"rotation\",\n isRotating: transformHandleType === \"rotation\",\n });\n const pointerCoords = pointerDownState.lastCoords;\n const [resizeX, resizeY] = getGridPoint(\n pointerCoords.x - pointerDownState.resize.offset.x,\n pointerCoords.y - pointerDownState.resize.offset.y,\n this.state.gridSize,\n );\n if (\n transformElements(\n pointerDownState,\n transformHandleType,\n selectedElements,\n pointerDownState.resize.arrowDirection,\n shouldRotateWithDiscreteAngle(event),\n shouldResizeFromCenter(event),\n selectedElements.length === 1 && isImageElement(selectedElements[0])\n ? !shouldMaintainAspectRatio(event)\n : shouldMaintainAspectRatio(event),\n resizeX,\n resizeY,\n pointerDownState.resize.center.x,\n pointerDownState.resize.center.y,\n )\n ) {\n this.maybeSuggestBindingForAll(selectedElements);\n return true;\n }\n return false;\n };\n\n /** @private use this.handleCanvasContextMenu */\n private _openContextMenu = (\n {\n left,\n top,\n }: {\n left: number;\n top: number;\n },\n type: \"canvas\" | \"element\",\n ) => {\n if (this.state.showHyperlinkPopup) {\n this.setState({ showHyperlinkPopup: false });\n }\n this.contextMenuOpen = true;\n const maybeGroupAction = actionGroup.contextItemPredicate!(\n this.actionManager.getElementsIncludingDeleted(),\n this.actionManager.getAppState(),\n );\n\n const maybeUngroupAction = actionUngroup.contextItemPredicate!(\n this.actionManager.getElementsIncludingDeleted(),\n this.actionManager.getAppState(),\n );\n\n const maybeFlipHorizontal = actionFlipHorizontal.contextItemPredicate!(\n this.actionManager.getElementsIncludingDeleted(),\n this.actionManager.getAppState(),\n );\n\n const maybeFlipVertical = actionFlipVertical.contextItemPredicate!(\n this.actionManager.getElementsIncludingDeleted(),\n this.actionManager.getAppState(),\n );\n\n const separator = \"separator\";\n\n const elements = this.scene.getElements();\n\n const options: ContextMenuOption[] = [];\n if (probablySupportsClipboardBlob && elements.length > 0) {\n options.push(actionCopyAsPng);\n }\n\n if (probablySupportsClipboardWriteText && elements.length > 0) {\n options.push(actionCopyAsSvg);\n }\n if (type === \"canvas\") {\n const viewModeOptions = [\n ...options,\n typeof this.props.gridModeEnabled === \"undefined\" &&\n actionToggleGridMode,\n typeof this.props.zenModeEnabled === \"undefined\" && actionToggleZenMode,\n typeof this.props.viewModeEnabled === \"undefined\" &&\n actionToggleViewMode,\n actionToggleStats,\n ];\n\n if (this.state.viewModeEnabled) {\n ContextMenu.push({\n options: viewModeOptions,\n top,\n left,\n actionManager: this.actionManager,\n appState: this.state,\n container: this.excalidrawContainerRef.current!,\n elements,\n });\n } else {\n ContextMenu.push({\n options: [\n this.isMobile &&\n navigator.clipboard && {\n name: \"paste\",\n perform: (elements, appStates) => {\n this.pasteFromClipboard(null);\n return {\n commitToHistory: false,\n };\n },\n contextItemLabel: \"labels.paste\",\n },\n this.isMobile && navigator.clipboard && separator,\n probablySupportsClipboardBlob &&\n elements.length > 0 &&\n actionCopyAsPng,\n probablySupportsClipboardWriteText &&\n elements.length > 0 &&\n actionCopyAsSvg,\n ((probablySupportsClipboardBlob && elements.length > 0) ||\n (probablySupportsClipboardWriteText && elements.length > 0)) &&\n separator,\n actionSelectAll,\n separator,\n typeof this.props.gridModeEnabled === \"undefined\" &&\n actionToggleGridMode,\n typeof this.props.zenModeEnabled === \"undefined\" &&\n actionToggleZenMode,\n typeof this.props.viewModeEnabled === \"undefined\" &&\n actionToggleViewMode,\n actionToggleStats,\n ],\n top,\n left,\n actionManager: this.actionManager,\n appState: this.state,\n container: this.excalidrawContainerRef.current!,\n elements,\n });\n }\n } else if (type === \"element\") {\n const elementsWithUnbindedText = getSelectedElements(\n elements,\n this.state,\n ).some((element) => !hasBoundTextElement(element));\n if (this.state.viewModeEnabled) {\n ContextMenu.push({\n options: [navigator.clipboard && actionCopy, ...options],\n top,\n left,\n actionManager: this.actionManager,\n appState: this.state,\n container: this.excalidrawContainerRef.current!,\n elements,\n });\n } else {\n ContextMenu.push({\n options: [\n this.isMobile && actionCut,\n this.isMobile && navigator.clipboard && actionCopy,\n this.isMobile &&\n navigator.clipboard && {\n name: \"paste\",\n perform: (elements, appStates) => {\n this.pasteFromClipboard(null);\n return {\n commitToHistory: false,\n };\n },\n contextItemLabel: \"labels.paste\",\n },\n this.isMobile && separator,\n ...options,\n separator,\n actionCopyStyles,\n actionPasteStyles,\n separator,\n maybeGroupAction && actionGroup,\n !elementsWithUnbindedText && actionUnbindText,\n maybeUngroupAction && actionUngroup,\n (maybeGroupAction || maybeUngroupAction) && separator,\n actionAddToLibrary,\n separator,\n actionSendBackward,\n actionBringForward,\n actionSendToBack,\n actionBringToFront,\n separator,\n maybeFlipHorizontal && actionFlipHorizontal,\n maybeFlipVertical && actionFlipVertical,\n (maybeFlipHorizontal || maybeFlipVertical) && separator,\n actionLink.contextItemPredicate(elements, this.state) && actionLink,\n actionDuplicateSelection,\n actionDeleteSelected,\n ],\n top,\n left,\n actionManager: this.actionManager,\n appState: this.state,\n container: this.excalidrawContainerRef.current!,\n elements,\n });\n }\n }\n };\n\n private handleWheel = withBatchedUpdates((event: WheelEvent) => {\n event.preventDefault();\n\n if (isPanning) {\n return;\n }\n\n const { deltaX, deltaY } = event;\n const { selectedElementIds, previousSelectedElementIds } = this.state;\n // note that event.ctrlKey is necessary to handle pinch zooming\n if (event.metaKey || event.ctrlKey) {\n const sign = Math.sign(deltaY);\n const MAX_STEP = 10;\n let delta = Math.abs(deltaY);\n if (delta > MAX_STEP) {\n delta = MAX_STEP;\n }\n delta *= sign;\n if (Object.keys(previousSelectedElementIds).length !== 0) {\n setTimeout(() => {\n this.setState({\n selectedElementIds: previousSelectedElementIds,\n previousSelectedElementIds: {},\n });\n }, 1000);\n }\n\n let newZoom = this.state.zoom.value - delta / 100;\n // increase zoom steps the more zoomed-in we are (applies to >100% only)\n newZoom += Math.log10(Math.max(1, this.state.zoom.value)) * -sign;\n // round to nearest step\n newZoom = Math.round(newZoom * ZOOM_STEP * 100) / (ZOOM_STEP * 100);\n\n this.setState((state) => ({\n ...getStateForZoom(\n {\n viewportX: cursorX,\n viewportY: cursorY,\n nextZoom: getNormalizedZoom(newZoom),\n },\n state,\n ),\n selectedElementIds: {},\n previousSelectedElementIds:\n Object.keys(selectedElementIds).length !== 0\n ? selectedElementIds\n : previousSelectedElementIds,\n shouldCacheIgnoreZoom: true,\n }));\n this.resetShouldCacheIgnoreZoomDebounced();\n return;\n }\n\n // scroll horizontally when shift pressed\n if (event.shiftKey) {\n this.setState(({ zoom, scrollX }) => ({\n // on Mac, shift+wheel tends to result in deltaX\n scrollX: scrollX - (deltaY || deltaX) / zoom.value,\n }));\n return;\n }\n\n this.setState(({ zoom, scrollX, scrollY }) => ({\n scrollX: scrollX - deltaX / zoom.value,\n scrollY: scrollY - deltaY / zoom.value,\n }));\n });\n\n private getTextWysiwygSnappedToCenterPosition(\n x: number,\n y: number,\n appState: AppState,\n canvas: HTMLCanvasElement | null,\n scale: number,\n ) {\n const elementClickedInside = getTextBindableContainerAtPosition(\n this.scene\n .getElementsIncludingDeleted()\n .filter((element) => !isTextElement(element)),\n x,\n y,\n );\n if (elementClickedInside) {\n const elementCenterX =\n elementClickedInside.x + elementClickedInside.width / 2;\n const elementCenterY =\n elementClickedInside.y + elementClickedInside.height / 2;\n const distanceToCenter = Math.hypot(\n x - elementCenterX,\n y - elementCenterY,\n );\n const isSnappedToCenter =\n distanceToCenter < TEXT_TO_CENTER_SNAP_THRESHOLD;\n if (isSnappedToCenter) {\n const { x: viewportX, y: viewportY } = sceneCoordsToViewportCoords(\n { sceneX: elementCenterX, sceneY: elementCenterY },\n appState,\n );\n return { viewportX, viewportY, elementCenterX, elementCenterY };\n }\n }\n }\n\n private savePointer = (x: number, y: number, button: \"up\" | \"down\") => {\n if (!x || !y) {\n return;\n }\n const pointer = viewportCoordsToSceneCoords(\n { clientX: x, clientY: y },\n this.state,\n );\n\n if (isNaN(pointer.x) || isNaN(pointer.y)) {\n // sometimes the pointer goes off screen\n }\n\n this.props.onPointerUpdate?.({\n pointer,\n button,\n pointersMap: gesture.pointers,\n });\n };\n\n private resetShouldCacheIgnoreZoomDebounced = debounce(() => {\n if (!this.unmounted) {\n this.setState({ shouldCacheIgnoreZoom: false });\n }\n }, 300);\n\n private updateDOMRect = (cb?: () => void) => {\n if (this.excalidrawContainerRef?.current) {\n const excalidrawContainer = this.excalidrawContainerRef.current;\n const {\n width,\n height,\n left: offsetLeft,\n top: offsetTop,\n } = excalidrawContainer.getBoundingClientRect();\n const {\n width: currentWidth,\n height: currentHeight,\n offsetTop: currentOffsetTop,\n offsetLeft: currentOffsetLeft,\n } = this.state;\n\n if (\n width === currentWidth &&\n height === currentHeight &&\n offsetLeft === currentOffsetLeft &&\n offsetTop === currentOffsetTop\n ) {\n if (cb) {\n cb();\n }\n return;\n }\n\n this.setState(\n {\n width,\n height,\n offsetLeft,\n offsetTop,\n },\n () => {\n cb && cb();\n },\n );\n }\n };\n\n public refresh = () => {\n this.setState({ ...this.getCanvasOffsets() });\n };\n\n private getCanvasOffsets(): Pick {\n if (this.excalidrawContainerRef?.current) {\n const excalidrawContainer = this.excalidrawContainerRef.current;\n const { left, top } = excalidrawContainer.getBoundingClientRect();\n return {\n offsetLeft: left,\n offsetTop: top,\n };\n }\n return {\n offsetLeft: 0,\n offsetTop: 0,\n };\n }\n\n private async updateLanguage() {\n const currentLang =\n languages.find((lang) => lang.code === this.props.langCode) ||\n defaultLang;\n await setLanguage(currentLang);\n this.setAppState({});\n }\n}\n\n// -----------------------------------------------------------------------------\n// TEST HOOKS\n// -----------------------------------------------------------------------------\n\ndeclare global {\n interface Window {\n h: {\n elements: readonly ExcalidrawElement[];\n state: AppState;\n setState: React.Component[\"setState\"];\n app: InstanceType;\n history: History;\n };\n }\n}\n\nif (\n process.env.NODE_ENV === ENV.TEST ||\n process.env.NODE_ENV === ENV.DEVELOPMENT\n) {\n window.h = window.h || ({} as Window[\"h\"]);\n\n Object.defineProperties(window.h, {\n elements: {\n configurable: true,\n get() {\n return this.app.scene.getElementsIncludingDeleted();\n },\n set(elements: ExcalidrawElement[]) {\n return this.app.scene.replaceAllElements(elements);\n },\n },\n });\n}\nexport default App;\n","import \"./Modal.scss\";\n\nimport React, { useState, useLayoutEffect, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport clsx from \"clsx\";\nimport { KEYS } from \"../keys\";\nimport { useExcalidrawContainer, useIsMobile } from \"./App\";\nimport { AppState } from \"../types\";\nimport { THEME } from \"../constants\";\n\nexport const Modal = (props: {\n className?: string;\n children: React.ReactNode;\n maxWidth?: number;\n onCloseRequest(): void;\n labelledBy: string;\n theme?: AppState[\"theme\"];\n closeOnClickOutside?: boolean;\n}) => {\n const { theme = THEME.LIGHT, closeOnClickOutside = true } = props;\n const modalRoot = useBodyRoot(theme);\n\n if (!modalRoot) {\n return null;\n }\n\n const handleKeydown = (event: React.KeyboardEvent) => {\n if (event.key === KEYS.ESCAPE) {\n event.nativeEvent.stopImmediatePropagation();\n event.stopPropagation();\n props.onCloseRequest();\n }\n };\n\n return createPortal(\n \n
\n \n {props.children}\n \n ,\n modalRoot,\n );\n};\n\nconst useBodyRoot = (theme: AppState[\"theme\"]) => {\n const [div, setDiv] = useState(null);\n\n const isMobile = useIsMobile();\n const isMobileRef = useRef(isMobile);\n isMobileRef.current = isMobile;\n\n const { container: excalidrawContainer } = useExcalidrawContainer();\n\n useLayoutEffect(() => {\n if (div) {\n div.classList.toggle(\"excalidraw--mobile\", isMobile);\n }\n }, [div, isMobile]);\n\n useLayoutEffect(() => {\n const isDarkTheme =\n !!excalidrawContainer?.classList.contains(\"theme--dark\") ||\n theme === \"dark\";\n const div = document.createElement(\"div\");\n\n div.classList.add(\"excalidraw\", \"excalidraw-modal-container\");\n div.classList.toggle(\"excalidraw--mobile\", isMobileRef.current);\n\n if (isDarkTheme) {\n div.classList.add(\"theme--dark\");\n div.classList.add(\"theme--dark-background-none\");\n }\n document.body.appendChild(div);\n\n setDiv(div);\n\n return () => {\n document.body.removeChild(div);\n };\n }, [excalidrawContainer, theme]);\n\n return div;\n};\n","import clsx from \"clsx\";\nimport React, { useEffect, useState } from \"react\";\nimport { useCallbackRefState } from \"../hooks/useCallbackRefState\";\nimport { t } from \"../i18n\";\nimport { useExcalidrawContainer, useIsMobile } from \"../components/App\";\nimport { KEYS } from \"../keys\";\nimport \"./Dialog.scss\";\nimport { back, close } from \"./icons\";\nimport { Island } from \"./Island\";\nimport { Modal } from \"./Modal\";\nimport { AppState } from \"../types\";\n\nexport interface DialogProps {\n children: React.ReactNode;\n className?: string;\n small?: boolean;\n onCloseRequest(): void;\n title: React.ReactNode;\n autofocus?: boolean;\n theme?: AppState[\"theme\"];\n closeOnClickOutside?: boolean;\n}\n\nexport const Dialog = (props: DialogProps) => {\n const [islandNode, setIslandNode] = useCallbackRefState();\n const [lastActiveElement] = useState(document.activeElement);\n const { id } = useExcalidrawContainer();\n\n useEffect(() => {\n if (!islandNode) {\n return;\n }\n\n const focusableElements = queryFocusableElements(islandNode);\n\n if (focusableElements.length > 0 && props.autofocus !== false) {\n // If there's an element other than close, focus it.\n (focusableElements[1] || focusableElements[0]).focus();\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === KEYS.TAB) {\n const focusableElements = queryFocusableElements(islandNode);\n const { activeElement } = document;\n const currentIndex = focusableElements.findIndex(\n (element) => element === activeElement,\n );\n\n if (currentIndex === 0 && event.shiftKey) {\n focusableElements[focusableElements.length - 1].focus();\n event.preventDefault();\n } else if (\n currentIndex === focusableElements.length - 1 &&\n !event.shiftKey\n ) {\n focusableElements[0].focus();\n event.preventDefault();\n }\n }\n };\n\n islandNode.addEventListener(\"keydown\", handleKeyDown);\n\n return () => islandNode.removeEventListener(\"keydown\", handleKeyDown);\n }, [islandNode, props.autofocus]);\n\n const queryFocusableElements = (node: HTMLElement) => {\n const focusableElements = node.querySelectorAll(\n \"button, a, input, select, textarea, div[tabindex]\",\n );\n\n return focusableElements ? Array.from(focusableElements) : [];\n };\n\n const onClose = () => {\n (lastActiveElement as HTMLElement).focus();\n props.onCloseRequest();\n };\n\n return (\n \n \n

\n {props.title}\n \n {useIsMobile() ? back : close}\n \n

\n
{props.children}
\n
\n \n );\n};\n","import React, { useState } from \"react\";\nimport { t } from \"../i18n\";\n\nimport { Dialog } from \"./Dialog\";\nimport { useExcalidrawContainer } from \"./App\";\n\nexport const ErrorDialog = ({\n message,\n onClose,\n}: {\n message: string;\n onClose?: () => void;\n}) => {\n const [modalIsShown, setModalIsShown] = useState(!!message);\n const { container: excalidrawContainer } = useExcalidrawContainer();\n\n const handleClose = React.useCallback(() => {\n setModalIsShown(false);\n\n if (onClose) {\n onClose();\n }\n // TODO: Fix the A11y issues so this is never needed since we should always focus on last active element\n excalidrawContainer?.focus();\n }, [onClose, excalidrawContainer]);\n\n return (\n <>\n {modalIsShown && (\n \n
{message}
\n \n )}\n \n );\n};\n","import React from \"react\";\nimport * as Sentry from \"@sentry/browser\";\nimport { t } from \"../i18n\";\n\ninterface TopErrorBoundaryState {\n hasError: boolean;\n sentryEventId: string;\n localStorage: string;\n}\n\nexport class TopErrorBoundary extends React.Component<\n any,\n TopErrorBoundaryState\n> {\n state: TopErrorBoundaryState = {\n hasError: false,\n sentryEventId: \"\",\n localStorage: \"\",\n };\n\n render() {\n return this.state.hasError ? this.errorSplash() : this.props.children;\n }\n\n componentDidCatch(error: Error, errorInfo: any) {\n const _localStorage: any = {};\n for (const [key, value] of Object.entries({ ...localStorage })) {\n try {\n _localStorage[key] = JSON.parse(value);\n } catch (error: any) {\n _localStorage[key] = value;\n }\n }\n\n Sentry.withScope((scope) => {\n scope.setExtras(errorInfo);\n const eventId = Sentry.captureException(error);\n\n this.setState((state) => ({\n hasError: true,\n sentryEventId: eventId,\n localStorage: JSON.stringify(_localStorage),\n }));\n });\n }\n\n private selectTextArea(event: React.MouseEvent) {\n if (event.target !== document.activeElement) {\n event.preventDefault();\n (event.target as HTMLTextAreaElement).select();\n }\n }\n\n private async createGithubIssue() {\n let body = \"\";\n try {\n const templateStrFn = (\n await import(\n /* webpackChunkName: \"bug-issue-template\" */ \"../bug-issue-template\"\n )\n ).default;\n body = encodeURIComponent(templateStrFn(this.state.sentryEventId));\n } catch (error: any) {\n console.error(error);\n }\n\n window.open(\n `https://github.com/ixiaoyang8/iodraw/issues/new?body=${body}`,\n );\n }\n\n private errorSplash() {\n return (\n
\n
\n
\n {t(\"errorSplash.headingMain_pre\")}\n \n
\n
\n {t(\"errorSplash.clearCanvasMessage\")}\n {\n try {\n localStorage.clear();\n window.location.reload();\n } catch (error: any) {\n console.error(error);\n }\n }}\n >\n {t(\"errorSplash.clearCanvasMessage_button\")}\n \n
\n
\n \n ⚠️\n \n {t(\"errorSplash.clearCanvasCaveat\")}\n \n ⚠️\n \n
\n
\n
\n
\n {t(\"errorSplash.trackedToSentry_pre\")}\n {this.state.sentryEventId}\n {t(\"errorSplash.trackedToSentry_post\")}\n
\n
\n {t(\"errorSplash.openIssueMessage_pre\")}\n \n {t(\"errorSplash.openIssueMessage_post\")}\n
\n
\n
\n \n \n
\n
\n
\n
\n
\n );\n }\n}\n","import { ENV } from \"../../constants\";\nimport pkg from \"./package.json\";\nif (process.env.NODE_ENV !== ENV.TEST) {\n /* eslint-disable */\n /* global __webpack_public_path__:writable */\n __webpack_public_path__ = window.EXCALIDRAW_ASSET_PATH;\n //__webpack_public_path__ = window.EXCALIDRAW_ASSET_PATH || `https://unpkg.com/${pkg.name}@${pkg.version}/dist/`;\n}\n","import React, { useEffect, useState } from \"react\";\n\nimport { LoadingMessage } from \"./LoadingMessage\";\nimport { defaultLang, Language, languages, setLanguage } from \"../i18n\";\n\ninterface Props {\n langCode: Language[\"code\"];\n children: React.ReactElement;\n}\n\nexport const InitializeApp = (props: Props) => {\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n const updateLang = async () => {\n await setLanguage(currentLang);\n };\n const currentLang =\n languages.find((lang) => lang.code === props.langCode) || defaultLang;\n updateLang();\n setLoading(false);\n }, [props.langCode]);\n\n return loading ? : props.children;\n};\n","import { ExcalidrawElement, FileId } from \"../../element/types\";\nimport { getSceneVersion } from \"../../element\";\nimport Portal from \"../collab/Portal\";\nimport { restoreElements } from \"../../data/restore\";\nimport { BinaryFileData, BinaryFileMetadata, DataURL } from \"../../types\";\nimport { FILE_CACHE_MAX_AGE_SEC } from \"../app_constants\";\nimport { decompressData } from \"../../data/encode\";\nimport { encryptData, decryptData } from \"../../data/encryption\";\nimport { MIME_TYPES } from \"../../constants\";\n\n// private\n// -----------------------------------------------------------------------------\n\nlet FIREBASE_CONFIG: Record;\ntry {\n FIREBASE_CONFIG = JSON.parse(process.env.REACT_APP_FIREBASE_CONFIG);\n} catch (error: any) {\n console.warn(\n `Error JSON parsing firebase config. Supplied value: ${process.env.REACT_APP_FIREBASE_CONFIG}`,\n );\n FIREBASE_CONFIG = {};\n}\n\nlet firebasePromise: Promise | null =\n null;\nlet firestorePromise: Promise | null | true = null;\nlet firebaseStoragePromise: Promise | null | true = null;\n\nlet isFirebaseInitialized = false;\n\nconst _loadFirebase = async () => {\n const firebase = (\n await import(/* webpackChunkName: \"firebase\" */ \"firebase/app\")\n ).default;\n\n if (!isFirebaseInitialized) {\n try {\n firebase.initializeApp(FIREBASE_CONFIG);\n } catch (error: any) {\n // trying initialize again throws. Usually this is harmless, and happens\n // mainly in dev (HMR)\n if (error.code === \"app/duplicate-app\") {\n console.warn(error.name, error.code);\n } else {\n throw error;\n }\n }\n isFirebaseInitialized = true;\n }\n\n return firebase;\n};\n\nconst _getFirebase = async (): Promise<\n typeof import(\"firebase/app\").default\n> => {\n if (!firebasePromise) {\n firebasePromise = _loadFirebase();\n }\n return firebasePromise;\n};\n\n// -----------------------------------------------------------------------------\n\nconst loadFirestore = async () => {\n const firebase = await _getFirebase();\n if (!firestorePromise) {\n firestorePromise = import(\n /* webpackChunkName: \"firestore\" */ \"firebase/firestore\"\n );\n }\n if (firestorePromise !== true) {\n await firestorePromise;\n firestorePromise = true;\n }\n return firebase;\n};\n\nexport const loadFirebaseStorage = async () => {\n const firebase = await _getFirebase();\n if (!firebaseStoragePromise) {\n firebaseStoragePromise = import(\n /* webpackChunkName: \"storage\" */ \"firebase/storage\"\n );\n }\n if (firebaseStoragePromise !== true) {\n await firebaseStoragePromise;\n firebaseStoragePromise = true;\n }\n return firebase;\n};\n\ninterface FirebaseStoredScene {\n sceneVersion: number;\n iv: firebase.default.firestore.Blob;\n ciphertext: firebase.default.firestore.Blob;\n}\n\nconst encryptElements = async (\n key: string,\n elements: readonly ExcalidrawElement[],\n): Promise<{ ciphertext: ArrayBuffer; iv: Uint8Array }> => {\n const json = JSON.stringify(elements);\n const encoded = new TextEncoder().encode(json);\n const { encryptedBuffer, iv } = await encryptData(key, encoded);\n\n return { ciphertext: encryptedBuffer, iv };\n};\n\nconst decryptElements = async (\n key: string,\n iv: Uint8Array,\n ciphertext: ArrayBuffer | Uint8Array,\n): Promise => {\n const decrypted = await decryptData(iv, ciphertext, key);\n const decodedData = new TextDecoder(\"utf-8\").decode(\n new Uint8Array(decrypted),\n );\n return JSON.parse(decodedData);\n};\n\nconst firebaseSceneVersionCache = new WeakMap();\n\nexport const isSavedToFirebase = (\n portal: Portal,\n elements: readonly ExcalidrawElement[],\n): boolean => {\n if (portal.socket && portal.roomId && portal.roomKey) {\n const sceneVersion = getSceneVersion(elements);\n\n return firebaseSceneVersionCache.get(portal.socket) === sceneVersion;\n }\n // if no room exists, consider the room saved so that we don't unnecessarily\n // prevent unload (there's nothing we could do at that point anyway)\n return true;\n};\n\nexport const saveFilesToFirebase = async ({\n prefix,\n files,\n}: {\n prefix: string;\n files: { id: FileId; buffer: Uint8Array }[];\n}) => {\n const firebase = await loadFirebaseStorage();\n\n const erroredFiles = new Map();\n const savedFiles = new Map();\n\n await Promise.all(\n files.map(async ({ id, buffer }) => {\n try {\n await firebase\n .storage()\n .ref(`${prefix}/${id}`)\n .put(\n new Blob([buffer], {\n type: MIME_TYPES.binary,\n }),\n {\n cacheControl: `public, max-age=${FILE_CACHE_MAX_AGE_SEC}`,\n },\n );\n savedFiles.set(id, true);\n } catch (error: any) {\n erroredFiles.set(id, true);\n }\n }),\n );\n\n return { savedFiles, erroredFiles };\n};\n\nexport const saveToFirebase = async (\n portal: Portal,\n elements: readonly ExcalidrawElement[],\n) => {\n const { roomId, roomKey, socket } = portal;\n if (\n // if no room exists, consider the room saved because there's nothing we can\n // do at this point\n !roomId ||\n !roomKey ||\n !socket ||\n isSavedToFirebase(portal, elements)\n ) {\n return true;\n }\n\n const firebase = await loadFirestore();\n const sceneVersion = getSceneVersion(elements);\n const { ciphertext, iv } = await encryptElements(roomKey, elements);\n\n const nextDocData = {\n sceneVersion,\n ciphertext: firebase.firestore.Blob.fromUint8Array(\n new Uint8Array(ciphertext),\n ),\n iv: firebase.firestore.Blob.fromUint8Array(iv),\n } as FirebaseStoredScene;\n\n const db = firebase.firestore();\n const docRef = db.collection(\"scenes\").doc(roomId);\n const didUpdate = await db.runTransaction(async (transaction) => {\n const doc = await transaction.get(docRef);\n if (!doc.exists) {\n transaction.set(docRef, nextDocData);\n return true;\n }\n\n const prevDocData = doc.data() as FirebaseStoredScene;\n if (prevDocData.sceneVersion >= nextDocData.sceneVersion) {\n return false;\n }\n\n transaction.update(docRef, nextDocData);\n return true;\n });\n\n if (didUpdate) {\n firebaseSceneVersionCache.set(socket, sceneVersion);\n }\n\n return didUpdate;\n};\n\nexport const loadFromFirebase = async (\n roomId: string,\n roomKey: string,\n socket: SocketIOClient.Socket | null,\n): Promise => {\n const firebase = await loadFirestore();\n const db = firebase.firestore();\n\n const docRef = db.collection(\"scenes\").doc(roomId);\n const doc = await docRef.get();\n if (!doc.exists) {\n return null;\n }\n const storedScene = doc.data() as FirebaseStoredScene;\n const ciphertext = storedScene.ciphertext.toUint8Array();\n const iv = storedScene.iv.toUint8Array();\n\n const elements = await decryptElements(roomKey, iv, ciphertext);\n\n if (socket) {\n firebaseSceneVersionCache.set(socket, getSceneVersion(elements));\n }\n\n return restoreElements(elements, null);\n};\n\nexport const loadFilesFromFirebase = async (\n prefix: string,\n decryptionKey: string,\n filesIds: readonly FileId[],\n) => {\n const loadedFiles: BinaryFileData[] = [];\n const erroredFiles = new Map();\n\n /*await Promise.all(\n [...new Set(filesIds)].map(async (id) => {\n try {\n const url = `https://firebasestorage.googleapis.com/v0/b/${\n FIREBASE_CONFIG.storageBucket\n }/o/${encodeURIComponent(prefix.replace(/^\\//, \"\"))}%2F${id}`;\n const response = await fetch(`${url}?alt=media`);\n if (response.status < 400) {\n const arrayBuffer = await response.arrayBuffer();\n\n const { data, metadata } = await decompressData(\n new Uint8Array(arrayBuffer),\n {\n decryptionKey,\n },\n );\n\n const dataURL = new TextDecoder().decode(data) as DataURL;\n\n loadedFiles.push({\n mimeType: metadata.mimeType || MIME_TYPES.binary,\n id,\n dataURL,\n created: metadata?.created || Date.now(),\n });\n } else {\n erroredFiles.set(id, true);\n }\n } catch (error: any) {\n erroredFiles.set(id, true);\n console.error(error);\n }\n }),\n );*/\n\n return { loadedFiles, erroredFiles };\n};\n","import React, { useEffect, forwardRef } from \"react\";\nimport \"./publicPath\";\n\nimport { InitializeApp } from \"../../components/InitializeApp\";\nimport App from \"../../components/App\";\n\nimport \"../../css/app.scss\";\nimport \"../../css/styles.scss\";\n\nimport { AppProps, ExcalidrawAPIRefValue, ExcalidrawProps } from \"../../types\";\nimport { defaultLang } from \"../../i18n\";\nimport { DEFAULT_UI_OPTIONS } from \"../../constants\";\n\nconst Excalidraw = (props: ExcalidrawProps) => {\n const {\n onChange,\n initialData,\n excalidrawRef,\n onCollabButtonClick,\n isCollaborating = false,\n onPointerUpdate,\n renderTopRightUI,\n renderFooter,\n langCode = defaultLang.code,\n viewModeEnabled,\n zenModeEnabled,\n gridModeEnabled,\n libraryReturnUrl,\n theme,\n name,\n renderCustomStats,\n onPaste,\n detectScroll = true,\n handleKeyboardGlobally = false,\n onLibraryChange,\n autoFocus = false,\n generateIdForFile,\n onLinkOpen,\n } = props;\n\n const canvasActions = props.UIOptions?.canvasActions;\n\n const UIOptions: AppProps[\"UIOptions\"] = {\n canvasActions: {\n ...DEFAULT_UI_OPTIONS.canvasActions,\n ...canvasActions,\n },\n };\n\n if (canvasActions?.export) {\n UIOptions.canvasActions.export.saveFileToDisk =\n canvasActions.export?.saveFileToDisk ??\n DEFAULT_UI_OPTIONS.canvasActions.export.saveFileToDisk;\n }\n\n useEffect(() => {\n // Block pinch-zooming on iOS outside of the content area\n const handleTouchMove = (event: TouchEvent) => {\n // @ts-ignore\n if (typeof event.scale === \"number\" && event.scale !== 1) {\n event.preventDefault();\n }\n };\n\n document.addEventListener(\"touchmove\", handleTouchMove, {\n passive: false,\n });\n\n return () => {\n document.removeEventListener(\"touchmove\", handleTouchMove);\n };\n }, []);\n\n return (\n \n \n \n );\n};\n\ntype PublicExcalidrawProps = Omit;\n\nconst areEqual = (\n prevProps: PublicExcalidrawProps,\n nextProps: PublicExcalidrawProps,\n) => {\n const {\n initialData: prevInitialData,\n UIOptions: prevUIOptions = {},\n ...prev\n } = prevProps;\n const {\n initialData: nextInitialData,\n UIOptions: nextUIOptions = {},\n ...next\n } = nextProps;\n\n // comparing UIOptions\n const prevUIOptionsKeys = Object.keys(prevUIOptions) as (keyof Partial<\n typeof DEFAULT_UI_OPTIONS\n >)[];\n const nextUIOptionsKeys = Object.keys(nextUIOptions) as (keyof Partial<\n typeof DEFAULT_UI_OPTIONS\n >)[];\n\n if (prevUIOptionsKeys.length !== nextUIOptionsKeys.length) {\n return false;\n }\n\n const isUIOptionsSame = prevUIOptionsKeys.every((key) => {\n if (key === \"canvasActions\") {\n const canvasOptionKeys = Object.keys(\n prevUIOptions.canvasActions!,\n ) as (keyof Partial)[];\n canvasOptionKeys.every((key) => {\n if (\n key === \"export\" &&\n prevUIOptions?.canvasActions?.export &&\n nextUIOptions?.canvasActions?.export\n ) {\n return (\n prevUIOptions.canvasActions.export.saveFileToDisk ===\n nextUIOptions.canvasActions.export.saveFileToDisk\n );\n }\n return (\n prevUIOptions?.canvasActions?.[key] ===\n nextUIOptions?.canvasActions?.[key]\n );\n });\n }\n return true;\n });\n\n const prevKeys = Object.keys(prevProps) as (keyof typeof prev)[];\n const nextKeys = Object.keys(nextProps) as (keyof typeof next)[];\n return (\n isUIOptionsSame &&\n prevKeys.length === nextKeys.length &&\n prevKeys.every((key) => prev[key] === next[key])\n );\n};\n\nconst forwardedRefComp = forwardRef<\n ExcalidrawAPIRefValue,\n PublicExcalidrawProps\n>((props, ref) => );\nexport default React.memo(forwardedRefComp, areEqual);\nexport {\n getSceneVersion,\n isInvisiblySmallElement,\n getNonDeletedElements,\n} from \"../../element\";\nexport { defaultLang, languages } from \"../../i18n\";\nexport { restore, restoreAppState, restoreElements } from \"../../data/restore\";\nexport {\n exportToCanvas,\n exportToBlob,\n exportToSvg,\n serializeAsJSON,\n loadLibraryFromBlob,\n loadFromBlob,\n getFreeDrawSvgPath,\n} from \"../../packages/utils\";\nexport { isLinearElement } from \"../../element/typeChecks\";\n\nexport { FONT_FAMILY, THEME } from \"../../constants\";\n\nexport {\n mutateElement,\n newElementWith,\n bumpVersion,\n} from \"../../element/mutateElement\";\n","import { compressData } from \"../../data/encode\";\nimport { newElementWith } from \"../../element/mutateElement\";\nimport { isInitializedImageElement } from \"../../element/typeChecks\";\nimport {\n ExcalidrawElement,\n ExcalidrawImageElement,\n FileId,\n InitializedExcalidrawImageElement,\n} from \"../../element/types\";\nimport { t } from \"../../i18n\";\nimport {\n BinaryFileData,\n BinaryFileMetadata,\n ExcalidrawImperativeAPI,\n BinaryFiles,\n} from \"../../types\";\n\nexport class FileManager {\n /** files being fetched */\n private fetchingFiles = new Map();\n /** files being saved */\n private savingFiles = new Map();\n /* files already saved to persistent storage */\n private savedFiles = new Map();\n private erroredFiles = new Map();\n\n private _getFiles;\n private _saveFiles;\n\n constructor({\n getFiles,\n saveFiles,\n }: {\n getFiles: (fileIds: FileId[]) => Promise<{\n loadedFiles: BinaryFileData[];\n erroredFiles: Map;\n }>;\n saveFiles: (data: { addedFiles: Map }) => Promise<{\n savedFiles: Map;\n erroredFiles: Map;\n }>;\n }) {\n this._getFiles = getFiles;\n this._saveFiles = saveFiles;\n }\n\n /**\n * returns whether file is already saved or being processed\n */\n isFileHandled = (id: FileId) => {\n return (\n this.savedFiles.has(id) ||\n this.fetchingFiles.has(id) ||\n this.savingFiles.has(id) ||\n this.erroredFiles.has(id)\n );\n };\n\n isFileSaved = (id: FileId) => {\n return this.savedFiles.has(id);\n };\n\n saveFiles = async ({\n elements,\n files,\n }: {\n elements: readonly ExcalidrawElement[];\n files: BinaryFiles;\n }) => {\n const addedFiles: Map = new Map();\n\n for (const element of elements) {\n if (\n isInitializedImageElement(element) &&\n files[element.fileId] &&\n !this.isFileHandled(element.fileId)\n ) {\n addedFiles.set(element.fileId, files[element.fileId]);\n this.savingFiles.set(element.fileId, true);\n }\n }\n\n try {\n const { savedFiles, erroredFiles } = await this._saveFiles({\n addedFiles,\n });\n\n for (const [fileId] of savedFiles) {\n this.savedFiles.set(fileId, true);\n }\n\n return {\n savedFiles,\n erroredFiles,\n };\n } finally {\n for (const [fileId] of addedFiles) {\n this.savingFiles.delete(fileId);\n }\n }\n };\n\n getFiles = async (\n ids: FileId[],\n ): Promise<{\n loadedFiles: BinaryFileData[];\n erroredFiles: Map;\n }> => {\n if (!ids.length) {\n return {\n loadedFiles: [],\n erroredFiles: new Map(),\n };\n }\n for (const id of ids) {\n this.fetchingFiles.set(id, true);\n }\n\n try {\n const { loadedFiles, erroredFiles } = await this._getFiles(ids);\n\n for (const file of loadedFiles) {\n this.savedFiles.set(file.id, true);\n }\n for (const [fileId] of erroredFiles) {\n this.erroredFiles.set(fileId, true);\n }\n\n return { loadedFiles, erroredFiles };\n } finally {\n for (const id of ids) {\n this.fetchingFiles.delete(id);\n }\n }\n };\n\n /** a file element prevents unload only if it's being saved regardless of\n * its `status`. This ensures that elements who for any reason haven't\n * beed set to `saved` status don't prevent unload in future sessions.\n * Technically we should prevent unload when the origin client haven't\n * yet saved the `status` update to storage, but that should be taken care\n * of during regular beforeUnload unsaved files check.\n */\n shouldPreventUnload = (elements: readonly ExcalidrawElement[]) => {\n return elements.some((element) => {\n return (\n isInitializedImageElement(element) &&\n !element.isDeleted &&\n this.savingFiles.has(element.fileId)\n );\n });\n };\n\n /**\n * helper to determine if image element status needs updating\n */\n shouldUpdateImageElementStatus = (\n element: ExcalidrawElement,\n ): element is InitializedExcalidrawImageElement => {\n return (\n isInitializedImageElement(element) &&\n this.isFileSaved(element.fileId) &&\n element.status === \"pending\"\n );\n };\n\n reset() {\n this.fetchingFiles.clear();\n this.savingFiles.clear();\n this.savedFiles.clear();\n this.erroredFiles.clear();\n }\n}\n\nexport const encodeFilesForUpload = async ({\n files,\n maxBytes,\n encryptionKey,\n}: {\n files: Map;\n maxBytes: number;\n encryptionKey: string;\n}) => {\n const processedFiles: {\n id: FileId;\n buffer: Uint8Array;\n }[] = [];\n\n for (const [id, fileData] of files) {\n const buffer = new TextEncoder().encode(fileData.dataURL);\n\n const encodedFile = await compressData(buffer, {\n encryptionKey,\n metadata: {\n id,\n mimeType: fileData.mimeType,\n created: Date.now(),\n },\n });\n\n if (buffer.byteLength > maxBytes) {\n throw new Error(\n t(\"errors.fileTooBig\", {\n maxSize: `${Math.trunc(maxBytes / 1024 / 1024)}MB`,\n }),\n );\n }\n\n processedFiles.push({\n id,\n buffer: encodedFile,\n });\n }\n\n return processedFiles;\n};\n\nexport const updateStaleImageStatuses = (params: {\n excalidrawAPI: ExcalidrawImperativeAPI;\n erroredFiles: Map;\n elements: readonly ExcalidrawElement[];\n}) => {\n if (!params.erroredFiles.size) {\n return;\n }\n params.excalidrawAPI.updateScene({\n elements: params.excalidrawAPI\n .getSceneElementsIncludingDeleted()\n .map((element) => {\n if (\n isInitializedImageElement(element) &&\n params.erroredFiles.has(element.fileId)\n ) {\n return newElementWith(element, {\n status: \"error\",\n });\n }\n return element;\n }),\n });\n};\n","import { compressData, decompressData } from \"../../data/encode\";\nimport {\n decryptData,\n generateEncryptionKey,\n IV_LENGTH_BYTES,\n} from \"../../data/encryption\";\nimport { serializeAsJSON } from \"../../data/json\";\nimport { restore } from \"../../data/restore\";\nimport { ImportedDataState } from \"../../data/types\";\nimport { isInitializedImageElement } from \"../../element/typeChecks\";\nimport { ExcalidrawElement, FileId } from \"../../element/types\";\nimport { t } from \"../../i18n\";\nimport {\n AppState,\n BinaryFileData,\n BinaryFiles,\n UserIdleState,\n} from \"../../types\";\nimport { bytesToHexString } from \"../../utils\";\nimport { FILE_UPLOAD_MAX_BYTES, ROOM_ID_BYTES } from \"../app_constants\";\nimport { encodeFilesForUpload } from \"./FileManager\";\nimport { saveFilesToFirebase } from \"./firebase\";\n\n\n\n\n\nconst BACKEND_V2_GET = process.env.REACT_APP_BACKEND_V2_GET_URL;\nconst BACKEND_V2_POST = process.env.REACT_APP_BACKEND_V2_POST_URL;\n\nconst generateRoomId = async () => {\n const buffer = new Uint8Array(ROOM_ID_BYTES);\n window.crypto.getRandomValues(buffer);\n return bytesToHexString(buffer);\n};\n\nexport const SOCKET_SERVER = process.env.REACT_APP_SOCKET_SERVER_URL;\n\nexport type EncryptedData = {\n data: ArrayBuffer;\n iv: Uint8Array;\n};\n\nexport type SocketUpdateDataSource = {\n SCENE_INIT: {\n type: \"SCENE_INIT\";\n payload: {\n elements: readonly ExcalidrawElement[];\n };\n };\n SCENE_UPDATE: {\n type: \"SCENE_UPDATE\";\n payload: {\n elements: readonly ExcalidrawElement[];\n };\n };\n MOUSE_LOCATION: {\n type: \"MOUSE_LOCATION\";\n payload: {\n socketId: string;\n pointer: { x: number; y: number };\n button: \"down\" | \"up\";\n selectedElementIds: AppState[\"selectedElementIds\"];\n username: string;\n };\n };\n IDLE_STATUS: {\n type: \"IDLE_STATUS\";\n payload: {\n socketId: string;\n userState: UserIdleState;\n username: string;\n };\n };\n};\n\nexport type SocketUpdateDataIncoming =\n | SocketUpdateDataSource[keyof SocketUpdateDataSource]\n | {\n type: \"INVALID_RESPONSE\";\n };\n\nexport type SocketUpdateData =\n SocketUpdateDataSource[keyof SocketUpdateDataSource] & {\n _brand: \"socketUpdateData\";\n };\n\nexport const getCollaborationLinkData = (link: string) => {\n const hash = new URL(link).hash;\n const match = hash.match(/^#room=([a-zA-Z0-9_-]+),([a-zA-Z0-9_-]+)$/);\n if (match && match[2].length !== 22) {\n window.alert(t(\"alerts.invalidEncryptionKey\"));\n return null;\n }\n return match ? { roomId: match[1], roomKey: match[2] } : null;\n};\n\nexport const generateCollaborationLinkData = async () => {\n const roomId = await generateRoomId();\n const roomKey = await generateEncryptionKey();\n\n if (!roomKey) {\n throw new Error(\"Couldn't generate room key\");\n }\n\n return { roomId, roomKey };\n};\n\nexport const getCollaborationLink = (data: {\n roomId: string;\n roomKey: string;\n}) => {\n return `${window.location.origin}${window.location.pathname}#room=${data.roomId},${data.roomKey}`;\n};\n\n/**\n * Decodes shareLink data using the legacy buffer format.\n * @deprecated\n */\nconst legacy_decodeFromBackend = async ({\n buffer,\n decryptionKey,\n}: {\n buffer: ArrayBuffer;\n decryptionKey: string;\n}) => {\n let decrypted: ArrayBuffer;\n\n try {\n // Buffer should contain both the IV (fixed length) and encrypted data\n const iv = buffer.slice(0, IV_LENGTH_BYTES);\n const encrypted = buffer.slice(IV_LENGTH_BYTES, buffer.byteLength);\n decrypted = await decryptData(new Uint8Array(iv), encrypted, decryptionKey);\n } catch (error: any) {\n // Fixed IV (old format, backward compatibility)\n const fixedIv = new Uint8Array(IV_LENGTH_BYTES);\n decrypted = await decryptData(fixedIv, buffer, decryptionKey);\n }\n\n // We need to convert the decrypted array buffer to a string\n const string = new window.TextDecoder(\"utf-8\").decode(\n new Uint8Array(decrypted),\n );\n const data: ImportedDataState = JSON.parse(string);\n\n return {\n elements: data.elements || null,\n appState: data.appState || null,\n };\n};\n\nconst importFromBackend = async (\n id: string,\n decryptionKey: string,\n): Promise => {\n try {\n const response = await fetch(`${BACKEND_V2_GET}${id}`);\n\t\n\tif (!response.ok) {\n window.alert(t(\"alerts.importBackendFailed\"));\n return {};\n }\n const buffer = await response.arrayBuffer();\n\n try {\n const { data: decodedBuffer } = await decompressData(\n new Uint8Array(buffer),\n {\n decryptionKey,\n },\n );\n const data: ImportedDataState = JSON.parse(\n new TextDecoder().decode(decodedBuffer),\n );\n\n return {\n elements: data.elements || null,\n appState: data.appState || null,\n };\n } catch (error: any) {\n console.warn(\n \"error when decoding shareLink data using the new format:\",\n error,\n );\n return legacy_decodeFromBackend({ buffer, decryptionKey });\n }\n } catch (error: any) {\n window.alert(t(\"alerts.importBackendFailed\"));\n console.error(error);\n return {};\n }\n};\n\nexport const loadScene = async (\n id: string | null,\n privateKey: string | null,\n // Supply local state even if importing from backend to ensure we restore\n // localStorage user settings which we do not persist on server.\n // Non-optional so we don't forget to pass it even if `undefined`.\n localDataState: ImportedDataState | undefined | null,\n) => {\n let data;\n if (id != null && privateKey != null) {\n // the private key is used to decrypt the content from the server, take\n // extra care not to leak it\n\t //解密加载\n data = restore(\n await importFromBackend(id, privateKey),\n localDataState?.appState,\n localDataState?.elements,\n );\n \n } else {\n data = restore(localDataState || null, null, null);\n }\n\n return {\n elements: data.elements,\n appState: data.appState,\n // note: this will always be empty because we're not storing files\n // in the scene database/localStorage, and instead fetch them async\n // from a different database\n files: data.files,\n commitToHistory: false,\n };\n};\n\nexport const exportToBackend = async (\n elements: readonly ExcalidrawElement[],\n appState: AppState,\n files: BinaryFiles,\n) => {\n const encryptionKey = await generateEncryptionKey(\"string\");\n\n const payload = await compressData(\n new TextEncoder().encode(\n serializeAsJSON(elements, appState, files, \"database\"),\n ),\n { encryptionKey },\n );\n\n try {\n const filesMap = new Map();\n for (const element of elements) {\n if (isInitializedImageElement(element) && files[element.fileId]) {\n filesMap.set(element.fileId, files[element.fileId]);\n }\n }\n\n const filesToUpload = await encodeFilesForUpload({\n files: filesMap,\n encryptionKey,\n maxBytes: FILE_UPLOAD_MAX_BYTES,\n });\n\n const response = await fetch(BACKEND_V2_POST, {\n method: \"POST\",\n body: payload.buffer,\n });\n const json = await response.json();\n if (json.id) {\n const url = new URL(window.location.href);\n // We need to store the key (and less importantly the id) as hash instead\n // of queryParam in order to never send it to the server\n url.hash = `json=${json.id},${encryptionKey}`;\n const urlString = url.toString();\n\n await saveFilesToFirebase({\n prefix: `/files/shareLinks/${json.id}`,\n files: filesToUpload,\n });\n\n window.prompt(`🔒${t(\"alerts.uploadedSecurly\")}`, urlString);\n } else if (json.error_class === \"RequestTooLargeError\") {\n window.alert(t(\"alerts.couldNotCreateShareableLinkTooBig\"));\n } else {\n window.alert(t(\"alerts.couldNotCreateShareableLink\"));\n }\n } catch (error: any) {\n console.error(error);\n window.alert(t(\"alerts.couldNotCreateShareableLink\"));\n }\n};\n","import { SocketUpdateData, SocketUpdateDataSource } from \"../data\";\n\nimport CollabWrapper from \"./CollabWrapper\";\n\nimport { ExcalidrawElement } from \"../../element/types\";\nimport { BROADCAST, FILE_UPLOAD_TIMEOUT, SCENE } from \"../app_constants\";\nimport { UserIdleState } from \"../../types\";\nimport { trackEvent } from \"../../analytics\";\nimport { throttle } from \"lodash\";\nimport { newElementWith } from \"../../element/mutateElement\";\nimport { BroadcastedExcalidrawElement } from \"./reconciliation\";\nimport { encryptData } from \"../../data/encryption\";\n\nclass Portal {\n collab: CollabWrapper;\n socket: SocketIOClient.Socket | null = null;\n socketInitialized: boolean = false; // we don't want the socket to emit any updates until it is fully initialized\n roomId: string | null = null;\n roomKey: string | null = null;\n broadcastedElementVersions: Map = new Map();\n\n constructor(collab: CollabWrapper) {\n this.collab = collab;\n }\n\n open(socket: SocketIOClient.Socket, id: string, key: string) {\n this.socket = socket;\n this.roomId = id;\n this.roomKey = key;\n\n // Initialize socket listeners\n this.socket.on(\"init-room\", () => {\n if (this.socket) {\n this.socket.emit(\"join-room\", this.roomId);\n trackEvent(\"share\", \"room joined\");\n }\n });\n this.socket.on(\"new-user\", async (_socketId: string) => {\n this.broadcastScene(\n SCENE.INIT,\n this.collab.getSceneElementsIncludingDeleted(),\n /* syncAll */ true,\n );\n });\n this.socket.on(\"room-user-change\", (clients: string[]) => {\n this.collab.setCollaborators(clients);\n });\n }\n\n close() {\n if (!this.socket) {\n return;\n }\n this.queueFileUpload.flush();\n this.socket.close();\n this.socket = null;\n this.roomId = null;\n this.roomKey = null;\n this.socketInitialized = false;\n this.broadcastedElementVersions = new Map();\n }\n\n isOpen() {\n return !!(\n this.socketInitialized &&\n this.socket &&\n this.roomId &&\n this.roomKey\n );\n }\n\n async _broadcastSocketData(\n data: SocketUpdateData,\n volatile: boolean = false,\n ) {\n if (this.isOpen()) {\n const json = JSON.stringify(data);\n const encoded = new TextEncoder().encode(json);\n const { encryptedBuffer, iv } = await encryptData(this.roomKey!, encoded);\n\n this.socket?.emit(\n volatile ? BROADCAST.SERVER_VOLATILE : BROADCAST.SERVER,\n this.roomId,\n encryptedBuffer,\n iv,\n );\n }\n }\n\n queueFileUpload = throttle(async () => {\n try {\n await this.collab.fileManager.saveFiles({\n elements: this.collab.excalidrawAPI.getSceneElementsIncludingDeleted(),\n files: this.collab.excalidrawAPI.getFiles(),\n });\n } catch (error: any) {\n if (error.name !== \"AbortError\") {\n this.collab.excalidrawAPI.updateScene({\n appState: {\n errorMessage: error.message,\n },\n });\n }\n }\n\n this.collab.excalidrawAPI.updateScene({\n elements: this.collab.excalidrawAPI\n .getSceneElementsIncludingDeleted()\n .map((element) => {\n if (this.collab.fileManager.shouldUpdateImageElementStatus(element)) {\n // this will signal collaborators to pull image data from server\n // (using mutation instead of newElementWith otherwise it'd break\n // in-progress dragging)\n return newElementWith(element, { status: \"saved\" });\n }\n return element;\n }),\n });\n }, FILE_UPLOAD_TIMEOUT);\n\n broadcastScene = async (\n sceneType: SCENE.INIT | SCENE.UPDATE,\n allElements: readonly ExcalidrawElement[],\n syncAll: boolean,\n ) => {\n if (sceneType === SCENE.INIT && !syncAll) {\n throw new Error(\"syncAll must be true when sending SCENE.INIT\");\n }\n\n // sync out only the elements we think we need to to save bandwidth.\n // periodically we'll resync the whole thing to make sure no one diverges\n // due to a dropped message (server goes down etc).\n const syncableElements = allElements.reduce(\n (acc, element: BroadcastedExcalidrawElement, idx, elements) => {\n if (\n (syncAll ||\n !this.broadcastedElementVersions.has(element.id) ||\n element.version >\n this.broadcastedElementVersions.get(element.id)!) &&\n this.collab.isSyncableElement(element)\n ) {\n acc.push({\n ...element,\n // z-index info for the reconciler\n parent: idx === 0 ? \"^\" : elements[idx - 1]?.id,\n });\n }\n return acc;\n },\n [] as BroadcastedExcalidrawElement[],\n );\n\n const data: SocketUpdateDataSource[typeof sceneType] = {\n type: sceneType,\n payload: {\n elements: syncableElements,\n },\n };\n\n for (const syncableElement of syncableElements) {\n this.broadcastedElementVersions.set(\n syncableElement.id,\n syncableElement.version,\n );\n }\n\n const broadcastPromise = this._broadcastSocketData(\n data as SocketUpdateData,\n );\n\n this.queueFileUpload();\n\n if (syncAll && this.collab.isCollaborating) {\n await Promise.all([\n broadcastPromise,\n this.collab.saveCollabRoomToFirebase(syncableElements),\n ]);\n } else {\n await broadcastPromise;\n }\n };\n\n broadcastIdleChange = (userState: UserIdleState) => {\n if (this.socket?.id) {\n const data: SocketUpdateDataSource[\"IDLE_STATUS\"] = {\n type: \"IDLE_STATUS\",\n payload: {\n socketId: this.socket.id,\n userState,\n username: this.collab.state.username,\n },\n };\n return this._broadcastSocketData(\n data as SocketUpdateData,\n true, // volatile\n );\n }\n };\n\n broadcastMouseLocation = (payload: {\n pointer: SocketUpdateDataSource[\"MOUSE_LOCATION\"][\"payload\"][\"pointer\"];\n button: SocketUpdateDataSource[\"MOUSE_LOCATION\"][\"payload\"][\"button\"];\n }) => {\n if (this.socket?.id) {\n const data: SocketUpdateDataSource[\"MOUSE_LOCATION\"] = {\n type: \"MOUSE_LOCATION\",\n payload: {\n socketId: this.socket.id,\n pointer: payload.pointer,\n button: payload.button || \"up\",\n selectedElementIds:\n this.collab.excalidrawAPI.getAppState().selectedElementIds,\n username: this.collab.state.username,\n },\n };\n return this._broadcastSocketData(\n data as SocketUpdateData,\n true, // volatile\n );\n }\n };\n}\n\nexport default Portal;\n","import React, { useRef } from \"react\";\nimport { copyTextToSystemClipboard } from \"../../clipboard\";\nimport { Dialog } from \"../../components/Dialog\";\nimport {\n clipboard,\n start,\n stop,\n share,\n shareIOS,\n shareWindows,\n} from \"../../components/icons\";\nimport { ToolButton } from \"../../components/ToolButton\";\nimport { t } from \"../../i18n\";\nimport \"./RoomDialog.scss\";\nimport Stack from \"../../components/Stack\";\nimport { AppState } from \"../../types\";\n\nconst getShareIcon = () => {\n const navigator = window.navigator as any;\n const isAppleBrowser = /Apple/.test(navigator.vendor);\n const isWindowsBrowser = navigator.appVersion.indexOf(\"Win\") !== -1;\n\n if (isAppleBrowser) {\n return shareIOS;\n } else if (isWindowsBrowser) {\n return shareWindows;\n }\n\n return share;\n};\n\nconst RoomDialog = ({\n handleClose,\n activeRoomLink,\n username,\n onUsernameChange,\n onRoomCreate,\n onRoomDestroy,\n setErrorMessage,\n theme,\n}: {\n handleClose: () => void;\n activeRoomLink: string;\n username: string;\n onUsernameChange: (username: string) => void;\n onRoomCreate: () => void;\n onRoomDestroy: () => void;\n setErrorMessage: (message: string) => void;\n theme: AppState[\"theme\"];\n}) => {\n \n const roomLinkInput = useRef(null);\n\n const copyRoomLink = async () => {\n try {\n await copyTextToSystemClipboard(activeRoomLink);\n } catch (error: any) {\n setErrorMessage(error.message);\n }\n if (roomLinkInput.current) {\n roomLinkInput.current.select();\n }\n };\n\n const shareRoomLink = async () => {\n try {\n await navigator.share({\n title: t(\"roomDialog.shareTitle\"),\n text: t(\"roomDialog.shareTitle\"),\n url: activeRoomLink,\n });\n } catch (error: any) {\n // Just ignore.\n }\n };\n\n const selectInput = (event: React.MouseEvent) => {\n if (event.target !== document.activeElement) {\n event.preventDefault();\n (event.target as HTMLInputElement).select();\n }\n };\n\n const renderRoomDialog = () => {\n \n\treturn (\n
\n {!activeRoomLink && (\n <>\n

{t(\"roomDialog.desc_intro\")}

\n

{`🔒 ${t(\"roomDialog.desc_privacy\")}`}

\n
\n \n
\n \n )}\n {activeRoomLink && (\n <>\n

{t(\"roomDialog.desc_inProgressIntro\")}

\n

{t(\"roomDialog.desc_shareLink\")}

\n
\n \n {\"share\" in navigator ? (\n \n ) : null}\n \n \n \n
\n
\n \n onUsernameChange(event.target.value)}\n onKeyPress={(event) => event.key === \"Enter\" && handleClose()}\n />\n
\n

\n \n {\"🔒\"}\n {\" \"}\n {t(\"roomDialog.desc_privacy\")}\n

\n

{t(\"roomDialog.desc_exitSession\")}

\n
\n \n
\n \n )}\n
\n );\n\t\n };\n return (\n \n {renderRoomDialog()}\n \n );\n};\n\nexport default RoomDialog;\n","import { ExcalidrawElement } from \"../../element/types\";\nimport { AppState } from \"../../types\";\n\nexport type ReconciledElements = readonly ExcalidrawElement[] & {\n _brand: \"reconciledElements\";\n};\n\nexport type BroadcastedExcalidrawElement = ExcalidrawElement & {\n parent?: string;\n};\n\nconst shouldDiscardRemoteElement = (\n localAppState: AppState,\n local: ExcalidrawElement | undefined,\n remote: BroadcastedExcalidrawElement,\n): boolean => {\n if (\n local &&\n // local element is being edited\n (local.id === localAppState.editingElement?.id ||\n local.id === localAppState.resizingElement?.id ||\n local.id === localAppState.draggingElement?.id ||\n // local element is newer\n local.version > remote.version ||\n // resolve conflicting edits deterministically by taking the one with\n // the lowest versionNonce\n (local.version === remote.version &&\n local.versionNonce < remote.versionNonce))\n ) {\n return true;\n }\n return false;\n};\n\nconst getElementsMapWithIndex = (\n elements: readonly T[],\n) =>\n elements.reduce(\n (\n acc: {\n [key: string]: [element: T, index: number] | undefined;\n },\n element: T,\n idx,\n ) => {\n acc[element.id] = [element, idx];\n return acc;\n },\n {},\n );\n\nexport const reconcileElements = (\n localElements: readonly ExcalidrawElement[],\n remoteElements: readonly BroadcastedExcalidrawElement[],\n localAppState: AppState,\n): ReconciledElements => {\n const localElementsData =\n getElementsMapWithIndex(localElements);\n\n const reconciledElements: ExcalidrawElement[] = localElements.slice();\n\n const duplicates = new WeakMap();\n\n let cursor = 0;\n let offset = 0;\n\n let remoteElementIdx = -1;\n for (const remoteElement of remoteElements) {\n remoteElementIdx++;\n\n const local = localElementsData[remoteElement.id];\n\n if (shouldDiscardRemoteElement(localAppState, local?.[0], remoteElement)) {\n if (remoteElement.parent) {\n delete remoteElement.parent;\n }\n\n continue;\n }\n\n if (local) {\n // mark for removal since it'll be replaced with the remote element\n duplicates.set(local[0], true);\n }\n\n // parent may not be defined in case the remote client is running an older\n // excalidraw version\n const parent =\n remoteElement.parent || remoteElements[remoteElementIdx - 1]?.id || null;\n\n if (parent != null) {\n delete remoteElement.parent;\n\n // ^ indicates the element is the first in elements array\n if (parent === \"^\") {\n offset++;\n if (cursor === 0) {\n reconciledElements.unshift(remoteElement);\n localElementsData[remoteElement.id] = [\n remoteElement,\n cursor - offset,\n ];\n } else {\n reconciledElements.splice(cursor + 1, 0, remoteElement);\n localElementsData[remoteElement.id] = [\n remoteElement,\n cursor + 1 - offset,\n ];\n cursor++;\n }\n } else {\n let idx = localElementsData[parent]\n ? localElementsData[parent]![1]\n : null;\n if (idx != null) {\n idx += offset;\n }\n if (idx != null && idx >= cursor) {\n reconciledElements.splice(idx + 1, 0, remoteElement);\n offset++;\n localElementsData[remoteElement.id] = [\n remoteElement,\n idx + 1 - offset,\n ];\n cursor = idx + 1;\n } else if (idx != null) {\n reconciledElements.splice(cursor + 1, 0, remoteElement);\n offset++;\n localElementsData[remoteElement.id] = [\n remoteElement,\n cursor + 1 - offset,\n ];\n cursor++;\n } else {\n reconciledElements.push(remoteElement);\n localElementsData[remoteElement.id] = [\n remoteElement,\n reconciledElements.length - 1 - offset,\n ];\n }\n }\n // no parent z-index information, local element exists → replace in place\n } else if (local) {\n reconciledElements[local[1]] = remoteElement;\n localElementsData[remoteElement.id] = [remoteElement, local[1]];\n // otherwise push to the end\n } else {\n reconciledElements.push(remoteElement);\n localElementsData[remoteElement.id] = [\n remoteElement,\n reconciledElements.length - 1 - offset,\n ];\n }\n }\n\n const ret: readonly ExcalidrawElement[] = reconciledElements.filter(\n (element) => !duplicates.has(element),\n );\n\n return ret as ReconciledElements;\n};\n","import React from \"react\";\n\nexport const createInverseContext = (\n initialValue: T,\n) => {\n const Context = React.createContext(initialValue) as React.Context & {\n _updateProviderValue?: (value: T) => void;\n };\n\n class InverseConsumer extends React.Component {\n state = { value: initialValue };\n constructor(props: any) {\n super(props);\n Context._updateProviderValue = (value: T) => this.setState({ value });\n }\n render() {\n return (\n \n {this.props.children}\n \n );\n }\n }\n\n class InverseProvider extends React.Component<{ value: T }> {\n componentDidMount() {\n Context._updateProviderValue?.(this.props.value);\n }\n componentDidUpdate() {\n Context._updateProviderValue?.(this.props.value);\n }\n render() {\n return {() => this.props.children};\n }\n }\n\n return {\n Context,\n Consumer: InverseConsumer,\n Provider: InverseProvider,\n };\n};\n","import throttle from \"lodash.throttle\";\nimport { PureComponent } from \"react\";\nimport { ExcalidrawImperativeAPI } from \"../../types\";\nimport { ErrorDialog } from \"../../components/ErrorDialog\";\nimport { APP_NAME, ENV, EVENT } from \"../../constants\";\nimport { ImportedDataState } from \"../../data/types\";\nimport {\n ExcalidrawElement,\n InitializedExcalidrawImageElement,\n} from \"../../element/types\";\nimport { getSceneVersion } from \"../../packages/excalidraw/index\";\nimport { Collaborator, Gesture } from \"../../types\";\nimport {\n preventUnload,\n resolvablePromise,\n withBatchedUpdates,\n} from \"../../utils\";\nimport {\n FILE_UPLOAD_MAX_BYTES,\n FIREBASE_STORAGE_PREFIXES,\n INITIAL_SCENE_UPDATE_TIMEOUT,\n LOAD_IMAGES_TIMEOUT,\n SCENE,\n STORAGE_KEYS,\n SYNC_FULL_SCENE_INTERVAL_MS,\n} from \"../app_constants\";\nimport {\n generateCollaborationLinkData,\n getCollaborationLink,\n SocketUpdateDataSource,\n SOCKET_SERVER,\n} from \"../data\";\nimport {\n isSavedToFirebase,\n loadFilesFromFirebase,\n loadFromFirebase,\n saveFilesToFirebase,\n saveToFirebase,\n} from \"../data/firebase\";\nimport {\n importUsernameFromLocalStorage,\n saveUsernameToLocalStorage,\n} from \"../data/localStorage\";\nimport Portal from \"./Portal\";\nimport RoomDialog from \"./RoomDialog\";\nimport { createInverseContext } from \"../../createInverseContext\";\nimport { t } from \"../../i18n\";\nimport { UserIdleState } from \"../../types\";\nimport { IDLE_THRESHOLD, ACTIVE_THRESHOLD } from \"../../constants\";\nimport { trackEvent } from \"../../analytics\";\nimport { isInvisiblySmallElement } from \"../../element\";\nimport {\n encodeFilesForUpload,\n FileManager,\n updateStaleImageStatuses,\n} from \"../data/FileManager\";\nimport { AbortError } from \"../../errors\";\nimport {\n isImageElement,\n isInitializedImageElement,\n} from \"../../element/typeChecks\";\nimport { newElementWith } from \"../../element/mutateElement\";\nimport {\n ReconciledElements,\n reconcileElements as _reconcileElements,\n} from \"./reconciliation\";\nimport { decryptData } from \"../../data/encryption\";\nimport { resetBrowserStateVersions } from \"../data/tabSync\";\n\ninterface CollabState {\n modalIsShown: boolean;\n errorMessage: string;\n username: string;\n userState: UserIdleState;\n activeRoomLink: string;\n}\n\ntype CollabInstance = InstanceType;\n\nexport interface CollabAPI {\n /** function so that we can access the latest value from stale callbacks */\n isCollaborating: () => boolean;\n username: CollabState[\"username\"];\n userState: CollabState[\"userState\"];\n onPointerUpdate: CollabInstance[\"onPointerUpdate\"];\n initializeSocketClient: CollabInstance[\"initializeSocketClient\"];\n onCollabButtonClick: CollabInstance[\"onCollabButtonClick\"];\n broadcastElements: CollabInstance[\"broadcastElements\"];\n fetchImageFilesFromFirebase: CollabInstance[\"fetchImageFilesFromFirebase\"];\n setUsername: (username: string) => void;\n}\n\ninterface Props {\n excalidrawAPI: ExcalidrawImperativeAPI;\n onRoomClose?: () => void;\n}\n\nconst {\n Context: CollabContext,\n Consumer: CollabContextConsumer,\n Provider: CollabContextProvider,\n} = createInverseContext<{ api: CollabAPI | null }>({ api: null });\n\nexport { CollabContext, CollabContextConsumer };\n\nclass CollabWrapper extends PureComponent {\n portal: Portal;\n fileManager: FileManager;\n excalidrawAPI: Props[\"excalidrawAPI\"];\n isCollaborating: boolean = false;\n activeIntervalId: number | null;\n idleTimeoutId: number | null;\n\n private socketInitializationTimer?: number;\n private lastBroadcastedOrReceivedSceneVersion: number = -1;\n private collaborators = new Map();\n\n constructor(props: Props) {\n super(props);\n this.state = {\n modalIsShown: false,\n errorMessage: \"\",\n username: importUsernameFromLocalStorage() || \"\",\n userState: UserIdleState.ACTIVE,\n activeRoomLink: \"\",\n };\n this.portal = new Portal(this);\n this.fileManager = new FileManager({\n getFiles: async (fileIds) => {\n const { roomId, roomKey } = this.portal;\n if (!roomId || !roomKey) {\n throw new AbortError();\n }\n\n return loadFilesFromFirebase(`files/rooms/${roomId}`, roomKey, fileIds);\n },\n saveFiles: async ({ addedFiles }) => {\n const { roomId, roomKey } = this.portal;\n if (!roomId || !roomKey) {\n throw new AbortError();\n }\n\n return saveFilesToFirebase({\n prefix: `${FIREBASE_STORAGE_PREFIXES.collabFiles}/${roomId}`,\n files: await encodeFilesForUpload({\n files: addedFiles,\n encryptionKey: roomKey,\n maxBytes: FILE_UPLOAD_MAX_BYTES,\n }),\n });\n },\n });\n this.excalidrawAPI = props.excalidrawAPI;\n this.activeIntervalId = null;\n this.idleTimeoutId = null;\n }\n\n componentDidMount() {\n window.addEventListener(EVENT.BEFORE_UNLOAD, this.beforeUnload);\n window.addEventListener(EVENT.UNLOAD, this.onUnload);\n\n if (\n process.env.NODE_ENV === ENV.TEST ||\n process.env.NODE_ENV === ENV.DEVELOPMENT\n ) {\n window.collab = window.collab || ({} as Window[\"collab\"]);\n Object.defineProperties(window, {\n collab: {\n configurable: true,\n value: this,\n },\n });\n }\n }\n\n componentWillUnmount() {\n window.removeEventListener(EVENT.BEFORE_UNLOAD, this.beforeUnload);\n window.removeEventListener(EVENT.UNLOAD, this.onUnload);\n window.removeEventListener(EVENT.POINTER_MOVE, this.onPointerMove);\n window.removeEventListener(\n EVENT.VISIBILITY_CHANGE,\n this.onVisibilityChange,\n );\n if (this.activeIntervalId) {\n window.clearInterval(this.activeIntervalId);\n this.activeIntervalId = null;\n }\n if (this.idleTimeoutId) {\n window.clearTimeout(this.idleTimeoutId);\n this.idleTimeoutId = null;\n }\n }\n\n private onUnload = () => {\n this.destroySocketClient({ isUnload: true });\n };\n\n private beforeUnload = withBatchedUpdates((event: BeforeUnloadEvent) => {\n const syncableElements = this.getSyncableElements(\n this.getSceneElementsIncludingDeleted(),\n );\n\n if (\n this.isCollaborating &&\n (this.fileManager.shouldPreventUnload(syncableElements) ||\n !isSavedToFirebase(this.portal, syncableElements))\n ) {\n // this won't run in time if user decides to leave the site, but\n // the purpose is to run in immediately after user decides to stay\n this.saveCollabRoomToFirebase(syncableElements);\n\n preventUnload(event);\n }\n\n if (this.isCollaborating || this.portal.roomId) {\n try {\n localStorage?.setItem(\n STORAGE_KEYS.LOCAL_STORAGE_KEY_COLLAB_FORCE_FLAG,\n JSON.stringify({\n timestamp: Date.now(),\n room: this.portal.roomId,\n }),\n );\n } catch {}\n }\n });\n\n saveCollabRoomToFirebase = async (\n syncableElements: readonly ExcalidrawElement[] = this.getSyncableElements(\n this.excalidrawAPI.getSceneElementsIncludingDeleted(),\n ),\n ) => {\n try {\n await saveToFirebase(this.portal, syncableElements);\n } catch (error: any) {\n console.error(error);\n }\n };\n\n openPortal = async () => {\n trackEvent(\"share\", \"room creation\");\n return this.initializeSocketClient(null);\n };\n\n closePortal = () => {\n this.queueBroadcastAllElements.cancel();\n this.loadImageFiles.cancel();\n\n this.saveCollabRoomToFirebase();\n if (window.confirm(t(\"alerts.collabStopOverridePrompt\"))) {\n // hack to ensure that we prefer we disregard any new browser state\n // that could have been saved in other tabs while we were collaborating\n resetBrowserStateVersions();\n\n window.history.pushState({}, APP_NAME, window.location.origin);\n this.destroySocketClient();\n trackEvent(\"share\", \"room closed\");\n\n this.props.onRoomClose?.();\n\n const elements = this.excalidrawAPI\n .getSceneElementsIncludingDeleted()\n .map((element) => {\n if (isImageElement(element) && element.status === \"saved\") {\n return newElementWith(element, { status: \"pending\" });\n }\n return element;\n });\n\n this.excalidrawAPI.updateScene({\n elements,\n commitToHistory: false,\n });\n }\n };\n\n private destroySocketClient = (opts?: { isUnload: boolean }) => {\n if (!opts?.isUnload) {\n this.collaborators = new Map();\n this.excalidrawAPI.updateScene({\n collaborators: this.collaborators,\n });\n this.setState({\n activeRoomLink: \"\",\n });\n this.isCollaborating = false;\n }\n this.lastBroadcastedOrReceivedSceneVersion = -1;\n this.portal.close();\n this.fileManager.reset();\n };\n\n private fetchImageFilesFromFirebase = async (scene: {\n elements: readonly ExcalidrawElement[];\n }) => {\n const unfetchedImages = scene.elements\n .filter((element) => {\n return (\n isInitializedImageElement(element) &&\n !this.fileManager.isFileHandled(element.fileId) &&\n !element.isDeleted &&\n element.status === \"saved\"\n );\n })\n .map((element) => (element as InitializedExcalidrawImageElement).fileId);\n\n return await this.fileManager.getFiles(unfetchedImages);\n };\n\n private decryptPayload = async (\n iv: Uint8Array,\n encryptedData: ArrayBuffer,\n decryptionKey: string,\n ) => {\n try {\n const decrypted = await decryptData(iv, encryptedData, decryptionKey);\n\n const decodedData = new TextDecoder(\"utf-8\").decode(\n new Uint8Array(decrypted),\n );\n return JSON.parse(decodedData);\n } catch (error) {\n window.alert(t(\"alerts.decryptFailed\"));\n console.error(error);\n return {\n type: \"INVALID_RESPONSE\",\n };\n }\n };\n\n private initializeSocketClient = async (\n existingRoomLinkData: null | { roomId: string; roomKey: string },\n ): Promise => {\n if (this.portal.socket) {\n return null;\n }\n\n let roomId;\n let roomKey;\n\n if (existingRoomLinkData) {\n ({ roomId, roomKey } = existingRoomLinkData);\n } else {\n ({ roomId, roomKey } = await generateCollaborationLinkData());\n window.history.pushState(\n {},\n APP_NAME,\n getCollaborationLink({ roomId, roomKey }),\n );\n }\n\n const scenePromise = resolvablePromise();\n\n this.isCollaborating = true;\n\n const { default: socketIOClient }: any = await import(\n /* webpackChunkName: \"socketIoClient\" */ \"socket.io-client\"\n );\n\n this.portal.open(socketIOClient(SOCKET_SERVER), roomId, roomKey);\n\n if (existingRoomLinkData) {\n this.excalidrawAPI.resetScene();\n\n try {\n const elements = await loadFromFirebase(\n roomId,\n roomKey,\n this.portal.socket,\n );\n if (elements) {\n scenePromise.resolve({\n elements,\n scrollToContent: true,\n });\n }\n } catch (error: any) {\n // log the error and move on. other peers will sync us the scene.\n console.error(error);\n }\n } else {\n const elements = this.excalidrawAPI.getSceneElements().map((element) => {\n if (isImageElement(element) && element.status === \"saved\") {\n return newElementWith(element, { status: \"pending\" });\n }\n return element;\n });\n // remove deleted elements from elements array & history to ensure we don't\n // expose potentially sensitive user data in case user manually deletes\n // existing elements (or clears scene), which would otherwise be persisted\n // to database even if deleted before creating the room.\n this.excalidrawAPI.history.clear();\n this.excalidrawAPI.updateScene({\n elements,\n commitToHistory: true,\n });\n\n this.broadcastElements(elements);\n\n const syncableElements = this.getSyncableElements(elements);\n this.saveCollabRoomToFirebase(syncableElements);\n }\n\n // fallback in case you're not alone in the room but still don't receive\n // initial SCENE_UPDATE message\n this.socketInitializationTimer = window.setTimeout(() => {\n this.initializeSocket();\n scenePromise.resolve(null);\n }, INITIAL_SCENE_UPDATE_TIMEOUT);\n\n // All socket listeners are moving to Portal\n this.portal.socket!.on(\n \"client-broadcast\",\n async (encryptedData: ArrayBuffer, iv: Uint8Array) => {\n if (!this.portal.roomKey) {\n return;\n }\n\n const decryptedData = await this.decryptPayload(\n iv,\n encryptedData,\n this.portal.roomKey,\n );\n\n switch (decryptedData.type) {\n case \"INVALID_RESPONSE\":\n return;\n case SCENE.INIT: {\n if (!this.portal.socketInitialized) {\n this.initializeSocket();\n const remoteElements = decryptedData.payload.elements;\n const reconciledElements = this.reconcileElements(remoteElements);\n this.handleRemoteSceneUpdate(reconciledElements, {\n init: true,\n });\n // noop if already resolved via init from firebase\n scenePromise.resolve({\n elements: reconciledElements,\n scrollToContent: true,\n });\n }\n break;\n }\n case SCENE.UPDATE:\n this.handleRemoteSceneUpdate(\n this.reconcileElements(decryptedData.payload.elements),\n );\n break;\n case \"MOUSE_LOCATION\": {\n const { pointer, button, username, selectedElementIds } =\n decryptedData.payload;\n const socketId: SocketUpdateDataSource[\"MOUSE_LOCATION\"][\"payload\"][\"socketId\"] =\n decryptedData.payload.socketId ||\n // @ts-ignore legacy, see #2094 (#2097)\n decryptedData.payload.socketID;\n\n const collaborators = new Map(this.collaborators);\n const user = collaborators.get(socketId) || {}!;\n user.pointer = pointer;\n user.button = button;\n user.selectedElementIds = selectedElementIds;\n user.username = username;\n collaborators.set(socketId, user);\n this.excalidrawAPI.updateScene({\n collaborators,\n });\n break;\n }\n case \"IDLE_STATUS\": {\n const { userState, socketId, username } = decryptedData.payload;\n const collaborators = new Map(this.collaborators);\n const user = collaborators.get(socketId) || {}!;\n user.userState = userState;\n user.username = username;\n this.excalidrawAPI.updateScene({\n collaborators,\n });\n break;\n }\n }\n },\n );\n\n this.portal.socket!.on(\"first-in-room\", () => {\n if (this.portal.socket) {\n this.portal.socket.off(\"first-in-room\");\n }\n this.initializeSocket();\n scenePromise.resolve(null);\n });\n\n this.initializeIdleDetector();\n\n this.setState({\n activeRoomLink: window.location.href,\n });\n\n return scenePromise;\n };\n\n private initializeSocket = () => {\n this.portal.socketInitialized = true;\n clearTimeout(this.socketInitializationTimer!);\n };\n\n private reconcileElements = (\n remoteElements: readonly ExcalidrawElement[],\n ): ReconciledElements => {\n const localElements = this.getSceneElementsIncludingDeleted();\n const appState = this.excalidrawAPI.getAppState();\n\n const reconciledElements = _reconcileElements(\n localElements,\n remoteElements,\n appState,\n );\n\n // Avoid broadcasting to the rest of the collaborators the scene\n // we just received!\n // Note: this needs to be set before updating the scene as it\n // synchronously calls render.\n this.setLastBroadcastedOrReceivedSceneVersion(\n getSceneVersion(reconciledElements),\n );\n\n return reconciledElements;\n };\n\n private loadImageFiles = throttle(async () => {\n const { loadedFiles, erroredFiles } =\n await this.fetchImageFilesFromFirebase({\n elements: this.excalidrawAPI.getSceneElementsIncludingDeleted(),\n });\n\n this.excalidrawAPI.addFiles(loadedFiles);\n\n updateStaleImageStatuses({\n excalidrawAPI: this.excalidrawAPI,\n erroredFiles,\n elements: this.excalidrawAPI.getSceneElementsIncludingDeleted(),\n });\n }, LOAD_IMAGES_TIMEOUT);\n\n private handleRemoteSceneUpdate = (\n elements: ReconciledElements,\n { init = false }: { init?: boolean } = {},\n ) => {\n this.excalidrawAPI.updateScene({\n elements,\n commitToHistory: !!init,\n });\n\n // We haven't yet implemented multiplayer undo functionality, so we clear the undo stack\n // when we receive any messages from another peer. This UX can be pretty rough -- if you\n // undo, a user makes a change, and then try to redo, your element(s) will be lost. However,\n // right now we think this is the right tradeoff.\n this.excalidrawAPI.history.clear();\n\n this.loadImageFiles();\n };\n\n private onPointerMove = () => {\n if (this.idleTimeoutId) {\n window.clearTimeout(this.idleTimeoutId);\n this.idleTimeoutId = null;\n }\n this.idleTimeoutId = window.setTimeout(this.reportIdle, IDLE_THRESHOLD);\n if (!this.activeIntervalId) {\n this.activeIntervalId = window.setInterval(\n this.reportActive,\n ACTIVE_THRESHOLD,\n );\n }\n };\n\n private onVisibilityChange = () => {\n if (document.hidden) {\n if (this.idleTimeoutId) {\n window.clearTimeout(this.idleTimeoutId);\n this.idleTimeoutId = null;\n }\n if (this.activeIntervalId) {\n window.clearInterval(this.activeIntervalId);\n this.activeIntervalId = null;\n }\n this.onIdleStateChange(UserIdleState.AWAY);\n } else {\n this.idleTimeoutId = window.setTimeout(this.reportIdle, IDLE_THRESHOLD);\n this.activeIntervalId = window.setInterval(\n this.reportActive,\n ACTIVE_THRESHOLD,\n );\n this.onIdleStateChange(UserIdleState.ACTIVE);\n }\n };\n\n private reportIdle = () => {\n this.onIdleStateChange(UserIdleState.IDLE);\n if (this.activeIntervalId) {\n window.clearInterval(this.activeIntervalId);\n this.activeIntervalId = null;\n }\n };\n\n private reportActive = () => {\n this.onIdleStateChange(UserIdleState.ACTIVE);\n };\n\n private initializeIdleDetector = () => {\n document.addEventListener(EVENT.POINTER_MOVE, this.onPointerMove);\n document.addEventListener(EVENT.VISIBILITY_CHANGE, this.onVisibilityChange);\n };\n\n setCollaborators(sockets: string[]) {\n this.setState((state) => {\n const collaborators: InstanceType[\"collaborators\"] =\n new Map();\n for (const socketId of sockets) {\n if (this.collaborators.has(socketId)) {\n collaborators.set(socketId, this.collaborators.get(socketId)!);\n } else {\n collaborators.set(socketId, {});\n }\n }\n this.collaborators = collaborators;\n this.excalidrawAPI.updateScene({ collaborators });\n });\n }\n\n public setLastBroadcastedOrReceivedSceneVersion = (version: number) => {\n this.lastBroadcastedOrReceivedSceneVersion = version;\n };\n\n public getLastBroadcastedOrReceivedSceneVersion = () => {\n return this.lastBroadcastedOrReceivedSceneVersion;\n };\n\n public getSceneElementsIncludingDeleted = () => {\n return this.excalidrawAPI.getSceneElementsIncludingDeleted();\n };\n\n onPointerUpdate = (payload: {\n pointer: SocketUpdateDataSource[\"MOUSE_LOCATION\"][\"payload\"][\"pointer\"];\n button: SocketUpdateDataSource[\"MOUSE_LOCATION\"][\"payload\"][\"button\"];\n pointersMap: Gesture[\"pointers\"];\n }) => {\n payload.pointersMap.size < 2 &&\n this.portal.socket &&\n this.portal.broadcastMouseLocation(payload);\n };\n\n onIdleStateChange = (userState: UserIdleState) => {\n this.setState({ userState });\n this.portal.broadcastIdleChange(userState);\n };\n\n broadcastElements = (elements: readonly ExcalidrawElement[]) => {\n if (\n getSceneVersion(elements) >\n this.getLastBroadcastedOrReceivedSceneVersion()\n ) {\n this.portal.broadcastScene(SCENE.UPDATE, elements, false);\n this.lastBroadcastedOrReceivedSceneVersion = getSceneVersion(elements);\n this.queueBroadcastAllElements();\n }\n };\n\n queueBroadcastAllElements = throttle(() => {\n this.portal.broadcastScene(\n SCENE.UPDATE,\n this.excalidrawAPI.getSceneElementsIncludingDeleted(),\n true,\n );\n const currentVersion = this.getLastBroadcastedOrReceivedSceneVersion();\n const newVersion = Math.max(\n currentVersion,\n getSceneVersion(this.getSceneElementsIncludingDeleted()),\n );\n this.setLastBroadcastedOrReceivedSceneVersion(newVersion);\n }, SYNC_FULL_SCENE_INTERVAL_MS);\n\n handleClose = () => {\n this.setState({ modalIsShown: false });\n };\n\n setUsername = (username: string) => {\n this.setState({ username });\n };\n\n onUsernameChange = (username: string) => {\n this.setUsername(username);\n saveUsernameToLocalStorage(username);\n };\n\n onCollabButtonClick = () => {\n this.setState({\n modalIsShown: true,\n });\n };\n\n isSyncableElement = (element: ExcalidrawElement) => {\n return element.isDeleted || !isInvisiblySmallElement(element);\n };\n\n getSyncableElements = (elements: readonly ExcalidrawElement[]) =>\n elements.filter((element) => this.isSyncableElement(element));\n\n /** PRIVATE. Use `this.getContextValue()` instead. */\n private contextValue: CollabAPI | null = null;\n\n /** Getter of context value. Returned object is stable. */\n getContextValue = (): CollabAPI => {\n if (!this.contextValue) {\n this.contextValue = {} as CollabAPI;\n }\n\n this.contextValue.isCollaborating = () => this.isCollaborating;\n this.contextValue.username = this.state.username;\n this.contextValue.onPointerUpdate = this.onPointerUpdate;\n this.contextValue.initializeSocketClient = this.initializeSocketClient;\n this.contextValue.onCollabButtonClick = this.onCollabButtonClick;\n this.contextValue.broadcastElements = this.broadcastElements;\n this.contextValue.fetchImageFilesFromFirebase =\n this.fetchImageFilesFromFirebase;\n this.contextValue.setUsername = this.setUsername;\n return this.contextValue;\n };\n\n render() {\n const { modalIsShown, username, errorMessage, activeRoomLink } = this.state;\n\n return (\n <>\n {modalIsShown && (\n {\n this.setState({ errorMessage });\n }}\n theme={this.excalidrawAPI.getAppState().theme}\n />\n )}\n {errorMessage && (\n this.setState({ errorMessage: \"\" })}\n />\n )}\n \n \n );\n }\n}\n\ndeclare global {\n interface Window {\n collab: InstanceType;\n }\n}\n\nif (\n process.env.NODE_ENV === ENV.TEST ||\n process.env.NODE_ENV === ENV.DEVELOPMENT\n) {\n window.collab = window.collab || ({} as Window[\"collab\"]);\n}\n\nexport default CollabWrapper;\n","import React from \"react\";\nimport * as i18n from \"../../i18n\";\n\nexport const LanguageList = ({\n onChange,\n languages = i18n.languages,\n currentLangCode = i18n.getLanguage().code,\n}: {\n languages?: { code: string; label: string }[];\n onChange: (langCode: i18n.Language[\"code\"]) => void;\n currentLangCode?: i18n.Language[\"code\"];\n}) => (\n \n onChange(target.value)}\n value={currentLangCode}\n aria-label={i18n.t(\"buttons.selectLanguage\")}\n >\n \n {languages.map((lang) => (\n \n ))}\n \n \n);\n","import { useEffect, useState } from \"react\";\nimport { debounce, getVersion, nFormatter } from \"../utils\";\nimport {\n getElementsStorageSize,\n getTotalStorageSize,\n} from \"./data/localStorage\";\nimport { DEFAULT_VERSION } from \"../constants\";\nimport { t } from \"../i18n\";\nimport { copyTextToSystemClipboard } from \"../clipboard\";\ntype StorageSizes = { scene: number; total: number };\n\nconst STORAGE_SIZE_TIMEOUT = 500;\n\nconst getStorageSizes = debounce((cb: (sizes: StorageSizes) => void) => {\n cb({\n scene: getElementsStorageSize(),\n total: getTotalStorageSize(),\n });\n}, STORAGE_SIZE_TIMEOUT);\n\ntype Props = {\n setToastMessage: (message: string) => void;\n};\nconst CustomStats = (props: Props) => {\n const [storageSizes, setStorageSizes] = useState({\n scene: 0,\n total: 0,\n });\n\n useEffect(() => {\n getStorageSizes((sizes) => {\n setStorageSizes(sizes);\n });\n });\n useEffect(() => () => getStorageSizes.cancel(), []);\n\n const version = getVersion();\n let hash;\n let timestamp;\n\n if (version !== DEFAULT_VERSION) {\n timestamp = version.slice(0, 16).replace(\"T\", \" \");\n hash = version.slice(21);\n } else {\n timestamp = t(\"stats.versionNotAvailable\");\n }\n\n return (\n <>\n \n {t(\"stats.storage\")}\n \n \n {t(\"stats.scene\")}\n {nFormatter(storageSizes.scene, 1)}\n \n \n {t(\"stats.total\")}\n {nFormatter(storageSizes.total, 1)}\n \n \n {t(\"stats.version\")}\n \n \n {\n try {\n await copyTextToSystemClipboard(getVersion());\n props.setToastMessage(t(\"toast.copyToClipboard\"));\n } catch {}\n }}\n title={t(\"stats.versionCopy\")}\n >\n {timestamp}\n
\n {hash}\n \n \n \n );\n};\n\nexport default CustomStats;\n","import { createIcon } from \"../../components/icons\";\n\nexport const excalidrawPlusIcon = createIcon(\n <>\n \n \n \n ,\n { width: 89, height: 131, style: { transform: \"translateX(4px)\" } },\n);\n","import React from \"react\";\nimport { Card } from \"../../components/Card\";\nimport { ToolButton } from \"../../components/ToolButton\";\nimport { serializeAsJSON } from \"../../data/json\";\nimport { loadFirebaseStorage, saveFilesToFirebase } from \"../data/firebase\";\nimport { FileId, NonDeletedExcalidrawElement } from \"../../element/types\";\nimport { AppState, BinaryFileData, BinaryFiles } from \"../../types\";\nimport { nanoid } from \"nanoid\";\nimport { t } from \"../../i18n\";\nimport { excalidrawPlusIcon } from \"./icons\";\nimport { encryptData, generateEncryptionKey } from \"../../data/encryption\";\nimport { isInitializedImageElement } from \"../../element/typeChecks\";\nimport { FILE_UPLOAD_MAX_BYTES } from \"../app_constants\";\nimport { encodeFilesForUpload } from \"../data/FileManager\";\nimport { MIME_TYPES } from \"../../constants\";\n\nconst exportToExcalidrawPlus = async (\n elements: readonly NonDeletedExcalidrawElement[],\n appState: AppState,\n files: BinaryFiles,\n) => {\n const firebase = await loadFirebaseStorage();\n\n const id = `${nanoid(12)}`;\n\n const encryptionKey = (await generateEncryptionKey())!;\n const encryptedData = await encryptData(\n encryptionKey,\n serializeAsJSON(elements, appState, files, \"database\"),\n );\n\n const blob = new Blob(\n [encryptedData.iv, new Uint8Array(encryptedData.encryptedBuffer)],\n {\n type: MIME_TYPES.binary,\n },\n );\n\n await firebase\n .storage()\n .ref(`/migrations/scenes/${id}`)\n .put(blob, {\n customMetadata: {\n data: JSON.stringify({ version: 2, name: appState.name }),\n created: Date.now().toString(),\n },\n });\n\n const filesMap = new Map();\n for (const element of elements) {\n if (isInitializedImageElement(element) && files[element.fileId]) {\n filesMap.set(element.fileId, files[element.fileId]);\n }\n }\n\n if (filesMap.size) {\n const filesToUpload = await encodeFilesForUpload({\n files: filesMap,\n encryptionKey,\n maxBytes: FILE_UPLOAD_MAX_BYTES,\n });\n\n await saveFilesToFirebase({\n prefix: `/migrations/files/scenes/${id}`,\n files: filesToUpload,\n });\n }\n\n window.open(\n `http://www.guanfu.org/whiteboard/import?excalidraw=${id},${encryptionKey}`,\n );\n};\n\nexport const ExportToExcalidrawPlus: React.FC<{\n elements: readonly NonDeletedExcalidrawElement[];\n appState: AppState;\n files: BinaryFiles;\n onError: (error: Error) => void;\n}> = ({ elements, appState, files, onError }) => {\n return (\n \n
{excalidrawPlusIcon}
\n

Excalidraw+

\n
\n {t(\"exportDialog.excalidrawplus_description\")}\n
\n {\n try {\n await exportToExcalidrawPlus(elements, appState, files);\n } catch (error: any) {\n console.error(error);\n if (error.name !== \"AbortError\") {\n onError(new Error(t(\"exportDialog.excalidrawplus_exportError\")));\n }\n }\n }}\n />\n
\n );\n};\n","import LanguageDetector from \"i18next-browser-languagedetector\";\nimport { useCallback, useContext, useEffect, useRef, useState } from \"react\";\nimport { trackEvent } from \"../analytics\";\nimport { getDefaultAppState } from \"../appState\";\nimport { ErrorDialog } from \"../components/ErrorDialog\";\nimport { TopErrorBoundary } from \"../components/TopErrorBoundary\";\nimport {\n APP_NAME,\n EVENT,\n TITLE_TIMEOUT,\n URL_HASH_KEYS,\n VERSION_TIMEOUT,\n} from \"../constants\";\nimport { loadFromBlob } from \"../data/blob\";\nimport { ImportedDataState } from \"../data/types\";\nimport {\n ExcalidrawElement,\n FileId,\n NonDeletedExcalidrawElement,\n} from \"../element/types\";\nimport { useCallbackRefState } from \"../hooks/useCallbackRefState\";\nimport { Language, t } from \"../i18n\";\nimport Excalidraw, {\n defaultLang,\n languages,\n} from \"../packages/excalidraw/index\";\nimport {\n AppState,\n LibraryItems,\n ExcalidrawImperativeAPI,\n BinaryFileData,\n BinaryFiles,\n} from \"../types\";\nimport {\n debounce,\n getVersion,\n isTestEnv,\n preventUnload,\n ResolvablePromise,\n resolvablePromise,\n} from \"../utils\";\nimport {\n FIREBASE_STORAGE_PREFIXES,\n SAVE_TO_LOCAL_STORAGE_TIMEOUT,\n STORAGE_KEYS,\n SYNC_BROWSER_TABS_TIMEOUT,\n} from \"./app_constants\";\nimport CollabWrapper, {\n CollabAPI,\n CollabContext,\n CollabContextConsumer,\n} from \"./collab/CollabWrapper\";\nimport { LanguageList } from \"./components/LanguageList\";\nimport { exportToBackend, getCollaborationLinkData, loadScene } from \"./data\";\nimport {\n getLibraryItemsFromStorage,\n importFromLocalStorage,\n importUsernameFromLocalStorage,\n saveToLocalStorage,\n} from \"./data/localStorage\";\nimport CustomStats from \"./CustomStats\";\nimport { restoreAppState, RestoredDataState } from \"../data/restore\";\nimport { Tooltip } from \"../components/Tooltip\";\nimport { shield } from \"../components/icons\";\n\nimport \"./index.scss\";\nimport { ExportToExcalidrawPlus } from \"./components/ExportToExcalidrawPlus\";\n\nimport { get,getMany, set, del, keys, createStore } from \"idb-keyval\";\nimport { FileManager, updateStaleImageStatuses } from \"./data/FileManager\";\nimport { newElementWith } from \"../element/mutateElement\";\nimport { isInitializedImageElement } from \"../element/typeChecks\";\nimport { loadFilesFromFirebase } from \"./data/firebase\";\nimport {\n isBrowserStorageStateNewer,\n updateBrowserStateVersion,\n} from \"./data/tabSync\";\nimport { loadFromJSON, saveAsJSON } from \"../data/json\";\n\nconst filesStore = createStore(\"files-db\", \"files-store\");\n\n\nconst clearObsoleteFilesFromIndexedDB = async (opts: {\n currentFileIds: FileId[];\n}) => {\n const allIds = await keys(filesStore);\n var notInFileIds=[];\n for (const id of allIds) {\n if (!opts.currentFileIds.includes(id as FileId)) {\n notInFileIds.push(id);\n }\n }\n const imgStoreNum=50;//缓存图片数量\n if(notInFileIds.length>imgStoreNum){\n\t getMany(notInFileIds, filesStore).then((filesData: any) => {\n\t\t filesData.sort(function(a: any, b: any) {//按创建时间排序,最近的排在最前面\n\t\t\treturn b.created-a.created;\n\t\t });\n\t\t for(let i=imgStoreNum;i {\n const loadedFiles: BinaryFileData[] = [];\n const erroredFiles = new Map();\n filesData.forEach((data, index) => {\n const id = ids[index];\n if (data) {\n loadedFiles.push(data);\n } else {\n erroredFiles.set(id, true);\n }\n });\n\n return { loadedFiles, erroredFiles };\n },\n );\n },\n async saveFiles({ addedFiles }) {\n const savedFiles = new Map();\n const erroredFiles = new Map();\n\n // before we use `storage` event synchronization, let's update the flag\n // optimistically. Hopefully nothing fails, and an IDB read executed\n // before an IDB write finishes will read the latest value.\n updateBrowserStateVersion(STORAGE_KEYS.VERSION_FILES);\n\n await Promise.all(\n [...addedFiles].map(async ([id, fileData]) => {\n try {\n await set(id, fileData, filesStore);\n\t\t savedFiles.set(id, true);\n } catch (error: any) {\n console.error(error);\n erroredFiles.set(id, true);\n }\n }),\n );\n\n return { savedFiles, erroredFiles };\n },\n});\n\n\n\n\nconst languageDetector = new LanguageDetector();\nlanguageDetector.init({\n languageUtils: {\n formatLanguageCode: (langCode: Language[\"code\"]) => langCode,\n isWhitelisted: () => true,\n },\n checkWhitelist: false,\n});\n\nconst saveDebounced = debounce(\n async (\n elements: readonly ExcalidrawElement[],\n appState: AppState,\n files: BinaryFiles,\n onFilesSaved: () => void,\n ) => {\n saveToLocalStorage(elements, appState);\n\n await localFileStorage.saveFiles({\n elements,\n files,\n });\n onFilesSaved();\n },\n SAVE_TO_LOCAL_STORAGE_TIMEOUT,\n);\n\nconst onBlur = () => {\n saveDebounced.flush();\n};\n\nconst initializeScene = async (opts: {\n collabAPI: CollabAPI;\n}): Promise<\n { scene: ImportedDataState | null } & (\n | { isExternalScene: true; id: string; key: string }\n | { isExternalScene: false; id?: null; key?: null }\n )\n> => {\n const searchParams = new URLSearchParams(window.location.search);\n const id = searchParams.get(\"id\");\n const jsonBackendMatch = window.location.hash.match(\n /^#json=([a-zA-Z0-9_-]+),([a-zA-Z0-9_-]+)$/,\n );\n const externalUrlMatch = window.location.hash.match(/^#url=(.*)$/);\n const siteUrlMatch = window.location.hash.match(/^#U(.*)$/);//本地或模板\n \n const localDataState = importFromLocalStorage();//导入\n\n let scene: RestoredDataState & {\n scrollToContent?: boolean;\n } = await loadScene(null, null, localDataState);\n\n let roomLinkData = getCollaborationLinkData(window.location.href);\n const isExternalScene = !!(id || jsonBackendMatch || roomLinkData);\n if (isExternalScene) {\n if (\n // don't prompt if scene is empty\n !scene.elements.length ||\n // don't prompt for collab scenes because we don't override local storage\n roomLinkData ||\n // otherwise, prompt whether user wants to override current scene\n window.confirm(t(\"alerts.loadSceneOverridePrompt\"))\n ) {\n if (jsonBackendMatch) {\n scene = await loadScene(\n jsonBackendMatch[1],\n jsonBackendMatch[2],\n localDataState,\n );\n }\n scene.scrollToContent = true;\n if (!roomLinkData) {\n window.history.replaceState({}, APP_NAME, window.location.origin);\n }\n } else {\n if (document.hidden) {\n return new Promise((resolve, reject) => {\n window.addEventListener(\n \"focus\",\n () => initializeScene(opts).then(resolve).catch(reject),\n {\n once: true,\n },\n );\n });\n }\n\n roomLinkData = null;\n window.history.replaceState({}, APP_NAME, window.location.origin);\n }\n } else if (externalUrlMatch) {\n window.history.replaceState({}, APP_NAME, window.location.origin);\n\n const url = externalUrlMatch[1];\n try {\n const request = await fetch(window.decodeURIComponent(url));\n const data = await loadFromBlob(await request.blob(), null, null);\n if (\n !scene.elements.length ||\n window.confirm(t(\"alerts.loadSceneOverridePrompt\"))\n ) {\n return { scene: data, isExternalScene };\n }\n } catch (error: any) {\n return {\n scene: {\n appState: {\n errorMessage: t(\"alerts.invalidSceneUrl\"),\n },\n },\n isExternalScene,\n };\n }\n } else if (siteUrlMatch) {\n var whiteboardUrl=siteUrlMatch[1];\n\t try {\n var txtJson;\n if(whiteboardUrl.indexOf(\"disk\")==0){//导入本地indexDB记录\n const diskFileId: number = Number(whiteboardUrl.substring(4));\n //先创建iodrawdb,file表,避免外面页面的文件操作数据库报错\n var filetb;\n var request = window.indexedDB.open('iodrawdb',1);//新建iodrawdb数据库,版本号为1\n request.onerror = function (event) {}\n request.onsuccess = function (event) {//打开数据库\n var iodrawdb = request.result;\n filetb = iodrawdb.transaction(['file'], 'readwrite').objectStore('file');\n }\n request.onupgradeneeded = function (event) {//数据库升级或新建触发\n var iodrawdb = (event as any).target.result;\n if (!iodrawdb.objectStoreNames.contains('file')) {\n filetb = iodrawdb.createObjectStore('file', { keyPath: 'id' });//创建file表,主键id\n filetb.createIndex('title', 'title', { unique: true });//创建titleIndex索引\n }\n }\n //打开表\n const iodrawFileTB = createStore(\"iodrawdb\", \"file\");\n const data = await get(diskFileId, iodrawFileTB);\n txtJson = JSON.parse(data.txt);\n }else{//导入模板\n const response = await fetch(whiteboardUrl);\n if (!response.ok) {\n window.alert(t(\"alerts.importBackendFailed\"));\n }else{\n txtJson = await response.json();\n }\n }\n //保存图片文件\n for(var key in txtJson.files){\n await set(key, txtJson.files[key], filesStore);\n }\n scene = txtJson;\n scene.scrollToContent = true;//使绘图居中\n if (!roomLinkData) {\n window.history.replaceState({}, APP_NAME, window.location.href);\n }\n } catch (error: any) {\n console.table(error);\n\t return {\n scene: {\n appState: {\n errorMessage: t(\"alerts.invalidSceneUrl\"),\n },\n },\n isExternalScene,\n };\n }\n }\n\n if (roomLinkData) {\n return {\n scene: await opts.collabAPI.initializeSocketClient(roomLinkData),\n isExternalScene: true,\n id: roomLinkData.roomId,\n key: roomLinkData.roomKey,\n };\n } else if (scene) {\n return isExternalScene && jsonBackendMatch\n ? {\n scene,\n isExternalScene,\n id: jsonBackendMatch[1],\n key: jsonBackendMatch[2],\n }\n : { scene, isExternalScene: false };\n }\n return { scene: null, isExternalScene: false };\n};\n\nconst PlusLinkJSX = (\n

\n ioDraw\n
\n \n Try out now!\n \n

\n);\n\nconst ExcalidrawWrapper = () => {\n const [errorMessage, setErrorMessage] = useState(\"\");\n let currentLangCode = languageDetector.detect() || defaultLang.code;\n if (Array.isArray(currentLangCode)) {\n currentLangCode = currentLangCode[0];\n }\n const [langCode, setLangCode] = useState(currentLangCode);\n // initial state\n // ---------------------------------------------------------------------------\n \n const initialStatePromiseRef = useRef<{\n promise: ResolvablePromise;\n }>({ promise: null! });\n if (!initialStatePromiseRef.current.promise) {\n initialStatePromiseRef.current.promise =\n resolvablePromise();\n }\n\n useEffect(() => {\n // Delayed so that the app has a time to load the latest SW\n setTimeout(() => {\n trackEvent(\"load\", \"version\", getVersion());\n }, VERSION_TIMEOUT);\n }, []);\n\n const [excalidrawAPI, excalidrawRefCallback] =\n useCallbackRefState();\n\n const collabAPI = useContext(CollabContext)?.api;\n\n useEffect(() => {\n if (!collabAPI || !excalidrawAPI) {\n return;\n }\n\n const loadImages = (\n data: ResolutionType,\n isInitialLoad = false,\n ) => {\n if (!data.scene) {\n return;\n }\n if (collabAPI.isCollaborating()) {\n if (data.scene.elements) {\n collabAPI\n .fetchImageFilesFromFirebase({\n elements: data.scene.elements,\n })\n .then(({ loadedFiles, erroredFiles }) => {\n excalidrawAPI.addFiles(loadedFiles);\n updateStaleImageStatuses({\n excalidrawAPI,\n erroredFiles,\n elements: excalidrawAPI.getSceneElementsIncludingDeleted(),\n });\n });\n }\n } else {\n const fileIds =\n data.scene.elements?.reduce((acc, element) => {\n if (isInitializedImageElement(element)) {\n return acc.concat(element.fileId);\n }\n return acc;\n }, [] as FileId[]) || [];\n\n if (data.isExternalScene) {\n loadFilesFromFirebase(\n `${FIREBASE_STORAGE_PREFIXES.shareLinkFiles}/${data.id}`,\n data.key,\n fileIds,\n ).then(({ loadedFiles, erroredFiles }) => {\n excalidrawAPI.addFiles(loadedFiles);\n updateStaleImageStatuses({\n excalidrawAPI,\n erroredFiles,\n elements: excalidrawAPI.getSceneElementsIncludingDeleted(),\n });\n });\n } else if (isInitialLoad) {\n if (fileIds.length) {\n localFileStorage\n .getFiles(fileIds)\n .then(({ loadedFiles, erroredFiles }) => {\n if (loadedFiles.length) {\n excalidrawAPI.addFiles(loadedFiles);\n }\n updateStaleImageStatuses({\n excalidrawAPI,\n erroredFiles,\n elements: excalidrawAPI.getSceneElementsIncludingDeleted(),\n });\n });\n }\n // on fresh load, clear unused files from IDB (from previous\n // session)\n clearObsoleteFilesFromIndexedDB({ currentFileIds: fileIds });\n }\n }\n\n data.scene.libraryItems = getLibraryItemsFromStorage();\n };\n\n initializeScene({ collabAPI }).then((data) => {\n loadImages(data, /* isInitialLoad */ true);\n initialStatePromiseRef.current.promise.resolve(data.scene);\n });\n\n const onHashChange = (event: HashChangeEvent) => {\n event.preventDefault();\n const hash = new URLSearchParams(window.location.hash.slice(1));\n const libraryUrl = hash.get(URL_HASH_KEYS.addLibrary);\n if (libraryUrl) {\n // If hash changed and it contains library url, import it and replace\n // the url to its previous state (important in case of collaboration\n // and similar).\n // Using history API won't trigger another hashchange.\n window.history.replaceState({}, \"\", event.oldURL);\n excalidrawAPI.importLibrary(libraryUrl, hash.get(\"token\"));\n } else {\n initializeScene({ collabAPI }).then((data) => {\n loadImages(data);\n if (data.scene) {\n excalidrawAPI.updateScene({\n ...data.scene,\n appState: restoreAppState(data.scene.appState, null),\n });\n }\n });\n }\n };\n\n /*const titleTimeout = setTimeout(\n () => (document.title = APP_NAME),\n TITLE_TIMEOUT,\n );*/\n\n const syncData = debounce(() => {\n if (isTestEnv()) {\n return;\n }\n if (!document.hidden && !collabAPI.isCollaborating()) {\n // don't sync if local state is newer or identical to browser state\n if (isBrowserStorageStateNewer(STORAGE_KEYS.VERSION_DATA_STATE)) {\n const localDataState = importFromLocalStorage();\n const username = importUsernameFromLocalStorage();\n let langCode = languageDetector.detect() || defaultLang.code;\n if (Array.isArray(langCode)) {\n langCode = langCode[0];\n }\n setLangCode(langCode);\n excalidrawAPI.updateScene({\n ...localDataState,\n libraryItems: getLibraryItemsFromStorage(),\n });\n collabAPI.setUsername(username || \"\");\n }\n\n if (isBrowserStorageStateNewer(STORAGE_KEYS.VERSION_FILES)) {\n const elements = excalidrawAPI.getSceneElementsIncludingDeleted();\n const currFiles = excalidrawAPI.getFiles();\n const fileIds =\n elements?.reduce((acc, element) => {\n if (\n isInitializedImageElement(element) &&\n // only load and update images that aren't already loaded\n !currFiles[element.fileId]\n ) {\n return acc.concat(element.fileId);\n }\n return acc;\n }, [] as FileId[]) || [];\n if (fileIds.length) {\n localFileStorage\n .getFiles(fileIds)\n .then(({ loadedFiles, erroredFiles }) => {\n if (loadedFiles.length) {\n excalidrawAPI.addFiles(loadedFiles);\n }\n updateStaleImageStatuses({\n excalidrawAPI,\n erroredFiles,\n elements: excalidrawAPI.getSceneElementsIncludingDeleted(),\n });\n });\n }\n }\n }\n }, SYNC_BROWSER_TABS_TIMEOUT);\n\n window.addEventListener(EVENT.HASHCHANGE, onHashChange, false);\n window.addEventListener(EVENT.UNLOAD, onBlur, false);\n window.addEventListener(EVENT.BLUR, onBlur, false);\n document.addEventListener(EVENT.VISIBILITY_CHANGE, syncData, false);\n window.addEventListener(EVENT.FOCUS, syncData, false);\n return () => {\n window.removeEventListener(EVENT.HASHCHANGE, onHashChange, false);\n window.removeEventListener(EVENT.UNLOAD, onBlur, false);\n window.removeEventListener(EVENT.BLUR, onBlur, false);\n window.removeEventListener(EVENT.FOCUS, syncData, false);\n document.removeEventListener(EVENT.VISIBILITY_CHANGE, syncData, false);\n //clearTimeout(titleTimeout);\n };\n }, [collabAPI, excalidrawAPI]);\n\n useEffect(() => {\n const unloadHandler = (event: BeforeUnloadEvent) => {\n saveDebounced.flush();\n\n if (\n excalidrawAPI &&\n localFileStorage.shouldPreventUnload(excalidrawAPI.getSceneElements())\n ) {\n preventUnload(event);\n }\n };\n window.addEventListener(EVENT.BEFORE_UNLOAD, unloadHandler);\n return () => {\n window.removeEventListener(EVENT.BEFORE_UNLOAD, unloadHandler);\n };\n }, [excalidrawAPI]);\n\n useEffect(() => {\n languageDetector.cacheUserLanguage(langCode);\n }, [langCode]);\n\n const onChange = (\n elements: readonly ExcalidrawElement[],\n appState: AppState,\n files: BinaryFiles,\n ) => {\n if (collabAPI?.isCollaborating()) {\n collabAPI.broadcastElements(elements);\n } else {\n saveDebounced(elements, appState, files, () => {\n if (excalidrawAPI) {\n let didChange = false;\n\n let pendingImageElement = appState.pendingImageElement;\n const elements = excalidrawAPI\n .getSceneElementsIncludingDeleted()\n .map((element) => {\n if (localFileStorage.shouldUpdateImageElementStatus(element)) {\n didChange = true;\n const newEl = newElementWith(element, { status: \"saved\" });\n if (pendingImageElement === element) {\n pendingImageElement = newEl;\n }\n return newEl;\n }\n return element;\n });\n\n if (didChange) {\n excalidrawAPI.updateScene({\n elements,\n appState: {\n pendingImageElement,\n },\n });\n }\n }\n });\n }\n };\n\n const onExportToBackend = async (\n exportedElements: readonly NonDeletedExcalidrawElement[],\n appState: AppState,\n files: BinaryFiles,\n canvas: HTMLCanvasElement | null,\n ) => {\n if (exportedElements.length === 0) {\n return window.alert(t(\"alerts.cannotExportEmptyCanvas\"));\n }\n if (canvas) {\n try {\n await exportToBackend(\n exportedElements,\n {\n ...appState,\n viewBackgroundColor: appState.exportBackground\n ? appState.viewBackgroundColor\n : getDefaultAppState().viewBackgroundColor,\n },\n files,\n );\n } catch (error: any) {\n if (error.name !== \"AbortError\") {\n const { width, height } = canvas;\n console.error(error, { width, height });\n setErrorMessage(error.message);\n }\n }\n }\n };\n\n const renderTopRightUI = useCallback(\n (isMobile: boolean, appState: AppState) => {\n if (isMobile) {\n return null;\n }\n return (\n \n {/* */}\n {/* FIXME remove after 2021-05-20 */}\n {PlusLinkJSX}\n \n );\n },\n [],\n );\n\n const renderFooter = useCallback(\n (isMobile: boolean) => {\n const renderEncryptedIcon = () => (\n \n \n {shield}\n \n \n );\n\n const renderLanguageList = () => (\n setLangCode(langCode)}\n languages={languages}\n currentLangCode={langCode}\n />\n );\n if (isMobile) {\n const isTinyDevice = window.innerWidth < 362;\n return (\n \n
\n {t(\"labels.language\")}\n {renderLanguageList()}\n
\n {/* FIXME remove after 2021-05-20 */}\n \n );\n }\n return (\n <>\n {renderEncryptedIcon()}\n {renderLanguageList()}\n \n );\n },\n [langCode],\n );\n\n const renderCustomStats = () => {\n return (\n excalidrawAPI!.setToastMessage(message)}\n />\n );\n };\n\n const onLibraryChange = async (items: LibraryItems) => {\n items = items.filter((item) => item.status==\"unpublished\");\n\tif (!items.length) {\n localStorage.removeItem(STORAGE_KEYS.LOCAL_STORAGE_LIBRARY);\n return;\n }\n const serializedItems = JSON.stringify(items);\n localStorage.setItem(STORAGE_KEYS.LOCAL_STORAGE_LIBRARY, serializedItems);\n };\n\n const onRoomClose = useCallback(() => {\n localFileStorage.reset();\n }, []);\n\n return (\n <>\n {\n return (\n {\n excalidrawAPI?.updateScene({\n appState: {\n errorMessage: error.message,\n },\n });\n }}\n />\n );\n },\n },\n },\n }}\n renderTopRightUI={renderTopRightUI}\n renderFooter={renderFooter}\n langCode={langCode}\n renderCustomStats={renderCustomStats}\n detectScroll={false}\n handleKeyboardGlobally={true}\n onLibraryChange={onLibraryChange}\n autoFocus={true}\n />\n {excalidrawAPI && (\n \n )}\n {errorMessage && (\n setErrorMessage(\"\")}\n />\n )}\n \n );\n};\n\nconst ExcalidrawApp = () => {\n return (\n \n \n \n \n \n );\n};\n\nexport default ExcalidrawApp;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === \"localhost\" ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === \"[::1]\" ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/,\n ),\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport const register = (config?: Config) => {\n if (process.env.NODE_ENV === \"production\" && \"serviceWorker\" in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener(\"load\", () => {\n const isWebexLP = window.location.pathname.startsWith(\"/webex\");\n if (isWebexLP) {\n unregister(() => {\n window.location.reload();\n });\n return false;\n }\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.info(\n \"This web app is being served cache-first by a service \" +\n \"worker. To learn more, visit https://bit.ly/CRA-PWA\",\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n};\n\nconst registerValidSW = (swUrl: string, config?: Config) => {\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === \"installed\") {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n\n console.info(\n \"New content is available and will be used when all tabs for this page are closed.\",\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n\n console.info(\"Content is cached for offline use.\");\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch((error) => {\n console.error(\"Error during service worker registration:\", error);\n });\n};\n\nconst checkValidServiceWorker = (swUrl: string, config?: Config) => {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { \"Service-Worker\": \"script\" },\n })\n .then((response) => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get(\"content-type\");\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf(\"javascript\") === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch((error) => {\n console.info(\n \"No internet connection found. App is running in offline mode.\",\n error.message,\n );\n });\n};\n\nexport const unregister = (callback?: () => void) => {\n if (\"serviceWorker\" in navigator) {\n navigator.serviceWorker.ready\n .then((registration) => {\n return registration.unregister();\n })\n .then(() => {\n callback?.();\n })\n .catch((error) => {\n console.error(error.message);\n });\n }\n};\n","import { register as registerServiceWorker } from \"../serviceWorker\";\nimport { EVENT } from \"../constants\";\n\n// On Apple mobile devices add the proprietary app icon and splashscreen markup.\n// No one should have to do this manually, and eventually this annoyance will\n// go away once https://bugs.webkit.org/show_bug.cgi?id=183937 is fixed.\nif (\n /\\b(iPad|iPhone|iPod|Safari)\\b/.test(navigator.userAgent) &&\n !matchMedia(\"(display-mode: standalone)\").matches\n) {\n import(/* webpackChunkName: \"pwacompat\" */ \"pwacompat\");\n}\n\nregisterServiceWorker({\n onUpdate: (registration) => {\n const waitingServiceWorker = registration.waiting;\n if (waitingServiceWorker) {\n waitingServiceWorker.addEventListener(\n EVENT.STATE_CHANGE,\n (event: Event) => {\n const target = event.target as ServiceWorker;\n const state = target.state as ServiceWorkerState;\n if (state === \"activated\") {\n window.location.reload();\n }\n },\n );\n waitingServiceWorker.postMessage({ type: \"SKIP_WAITING\" });\n }\n },\n});\n","import * as Sentry from \"@sentry/browser\";\nimport * as SentryIntegrations from \"@sentry/integrations\";\n\nconst SentryEnvHostnameMap: { [key: string]: string } = {\n \"guanfu.org\": \"production\",\n \"vercel.app\": \"staging\",\n};\n\n//const REACT_APP_DISABLE_SENTRY = process.env.REACT_APP_DISABLE_SENTRY === \"true\";\n//问题追踪关闭\nconst REACT_APP_DISABLE_SENTRY = true;\n// Disable Sentry locally or inside the Docker to avoid noise/respect privacy\nconst onlineEnv =\n !REACT_APP_DISABLE_SENTRY &&\n Object.keys(SentryEnvHostnameMap).find(\n (item) => window.location.hostname.indexOf(item) >= 0,\n );\n\nSentry.init({\n dsn: onlineEnv\n ? \"http://www.guanfu.org\"\n : undefined,\n environment: onlineEnv ? SentryEnvHostnameMap[onlineEnv] : undefined,\n release: process.env.REACT_APP_GIT_SHA,\n ignoreErrors: [\n \"undefined is not an object (evaluating 'window.__pad.performLoop')\", // Only happens on Safari, but spams our servers. Doesn't break anything\n ],\n integrations: [\n new SentryIntegrations.CaptureConsole({\n levels: [\"error\"],\n }),\n ],\n beforeSend(event) {\n if (event.request?.url) {\n event.request.url = event.request.url.replace(/#.*$/, \"\");\n }\n return event;\n },\n});\n","import ReactDOM from \"react-dom\";\nimport ExcalidrawApp from \"./excalidraw-app\";\n\nimport \"./excalidraw-app/pwa\";\nimport \"./excalidraw-app/sentry\";\nwindow.__EXCALIDRAW_SHA__ = process.env.REACT_APP_GIT_SHA;\n\nReactDOM.render(, document.getElementById(\"root\"));\n"],"sourceRoot":""}