@zsviczian/excalidraw 0.17.6-28 → 0.17.6-29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1037,7 +1037,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
1037
1037
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
1038
1038
|
|
|
1039
1039
|
"use strict";
|
|
1040
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"trackEvent\": () => (/* binding */ trackEvent)\n/* harmony export */ });\n// place here categories that you want to track. We want to track just a\n// small subset of categories at a given time.\nconst ALLOWED_CATEGORIES_TO_TRACK = new Set([\"command_palette\", \"export\"]);\nconst trackEvent = (category, action, label, value) => {\n try {\n if (typeof window === \"undefined\" || ({\"VITE_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"VITE_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"VITE_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"VITE_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"VITE_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"VITE_APP_PLUS_LP\":\"https://plus.excalidraw.com\",\"VITE_APP_PLUS_APP\":\"http://localhost:3000\",\"VITE_APP_AI_BACKEND\":\"http://localhost:3015\",\"VITE_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"VITE_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"VITE_APP_ENABLE_TRACKING\":\"true\",\"FAST_REFRESH\":\"false\",\"VITE_APP_PORT\":\"3000\",\"VITE_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"VITE_APP_COLLAPSE_OVERLAY\":\"true\",\"VITE_APP_ENABLE_ESLINT\":\"true\",\"VITE_APP_ENABLE_PWA\":\"false\",\"VITE_APP_PLUS_EXPORT_PUBLIC_KEY\":\"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm2g5T+Rub6Kbf1Mf57t0\\n7r2zeHuVg4dla3r5ryXMswtzz6x767octl6oLThn33mQsPSy3GKglFZoCTXJR4ij\\nba8SxB04sL/N8eRrKja7TFWjCVtRwTTfyy771NYYNFVJclkxHyE5qw4m27crHF1y\\nUNWEjuqNMi/lwAErS9fFa2oJlWyT8U7zzv/5kQREkxZI6y9v0AF3qcbsy2731FnD\\ns9ChJvOUW9toIab2gsIdrKW8ZNpu084ZFVKb6LNjvIXI1Se4oMTHeszXzNptzlot\\nkdxxjOoaQMAyfljFSot1F1FlU6MQlag7UnFGvFjRHN1JI5q4K+n3a67DX+TMyRqS\\nHQIDAQAB\",\"VITE_PKG_NAME\":\"@zsviczian/excalidraw\",\"VITE_PKG_VERSION\":\"0.17.6-
|
|
1040
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"trackEvent\": () => (/* binding */ trackEvent)\n/* harmony export */ });\n// place here categories that you want to track. We want to track just a\n// small subset of categories at a given time.\nconst ALLOWED_CATEGORIES_TO_TRACK = new Set([\"command_palette\", \"export\"]);\nconst trackEvent = (category, action, label, value) => {\n try {\n if (typeof window === \"undefined\" || ({\"VITE_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"VITE_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"VITE_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"VITE_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"VITE_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"VITE_APP_PLUS_LP\":\"https://plus.excalidraw.com\",\"VITE_APP_PLUS_APP\":\"http://localhost:3000\",\"VITE_APP_AI_BACKEND\":\"http://localhost:3015\",\"VITE_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"VITE_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"VITE_APP_ENABLE_TRACKING\":\"true\",\"FAST_REFRESH\":\"false\",\"VITE_APP_PORT\":\"3000\",\"VITE_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"VITE_APP_COLLAPSE_OVERLAY\":\"true\",\"VITE_APP_ENABLE_ESLINT\":\"true\",\"VITE_APP_ENABLE_PWA\":\"false\",\"VITE_APP_PLUS_EXPORT_PUBLIC_KEY\":\"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm2g5T+Rub6Kbf1Mf57t0\\n7r2zeHuVg4dla3r5ryXMswtzz6x767octl6oLThn33mQsPSy3GKglFZoCTXJR4ij\\nba8SxB04sL/N8eRrKja7TFWjCVtRwTTfyy771NYYNFVJclkxHyE5qw4m27crHF1y\\nUNWEjuqNMi/lwAErS9fFa2oJlWyT8U7zzv/5kQREkxZI6y9v0AF3qcbsy2731FnD\\ns9ChJvOUW9toIab2gsIdrKW8ZNpu084ZFVKb6LNjvIXI1Se4oMTHeszXzNptzlot\\nkdxxjOoaQMAyfljFSot1F1FlU6MQlag7UnFGvFjRHN1JI5q4K+n3a67DX+TMyRqS\\nHQIDAQAB\",\"VITE_PKG_NAME\":\"@zsviczian/excalidraw\",\"VITE_PKG_VERSION\":\"0.17.6-29\",\"VITE_IS_EXCALIDRAW_NPM_PACKAGE\":true}).VITE_WORKER_ID || \"true\" !== \"true\") {\n return;\n }\n\n if (!ALLOWED_CATEGORIES_TO_TRACK.has(category)) {\n return;\n }\n\n if (true) {\n // comment out to debug in dev\n return;\n }\n\n if (true) {\n console.info(\"trackEvent\", {\n category,\n action,\n label,\n value\n });\n }\n\n if (window.sa_event) {\n window.sa_event(action, {\n category,\n label,\n value\n });\n }\n } catch (error) {\n console.error(\"error during analytics\", error);\n }\n};\n\n//# sourceURL=webpack://ExcalidrawLib/./analytics.ts?");
|
|
1041
1041
|
|
|
1042
1042
|
/***/ }),
|
|
1043
1043
|
|
|
@@ -3149,7 +3149,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3149
3149
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3150
3150
|
|
|
3151
3151
|
"use strict";
|
|
3152
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"BASE_PADDING\": () => (/* binding */ BASE_PADDING),\n/* harmony export */ \"updateElbowArrowPoints\": () => (/* binding */ updateElbowArrowPoints)\n/* harmony export */ });\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../math */ \"../math/index.ts\");\n/* harmony import */ var _binaryheap__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../binaryheap */ \"./binaryheap.ts\");\n/* harmony import */ var _points__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../points */ \"./points.ts\");\n/* harmony import */ var _shapes__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../shapes */ \"./shapes.tsx\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils */ \"./utils.ts\");\n/* harmony import */ var _binding__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./binding */ \"./element/binding.ts\");\n/* harmony import */ var _heading__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./heading */ \"./element/heading.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./typeChecks */ \"./element/typeChecks.ts\");\nvar __rest = undefined && undefined.__rest || function (s, e) {\n var t = {};\n\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n }\n return t;\n};\n\n\n\n\n\n\n\n\n\nconst DEDUP_TRESHOLD = 1;\nconst BASE_PADDING = 40;\n\nconst handleSegmentRenormalization = (arrow, elementsMap) => {\n var _a;\n\n const nextFixedSegments = arrow.fixedSegments ? structuredClone(arrow.fixedSegments) : null;\n\n if (nextFixedSegments) {\n const _nextPoints = [];\n arrow.points.map(p => (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + p[0], arrow.y + p[1])).forEach((p, i, points) => {\n var _a, _b;\n\n if (i < 2) {\n return _nextPoints.push(p);\n }\n\n const currentSegmentIsHorizontal = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingForPoint)(p, points[i - 1]);\n const prevSegmentIsHorizontal = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingForPoint)(points[i - 1], points[i - 2]);\n\n if ( // Check if previous two points are on the same line\n (0,_heading__WEBPACK_IMPORTED_MODULE_6__.compareHeading)(currentSegmentIsHorizontal, prevSegmentIsHorizontal)) {\n const prevSegmentIdx = (_a = nextFixedSegments === null || nextFixedSegments === void 0 ? void 0 : nextFixedSegments.findIndex(segment => segment.index === i - 1)) !== null && _a !== void 0 ? _a : -1;\n const segmentIdx = (_b = nextFixedSegments === null || nextFixedSegments === void 0 ? void 0 : nextFixedSegments.findIndex(segment => segment.index === i)) !== null && _b !== void 0 ? _b : -1; // If the current segment is a fixed segment, update its start point\n\n if (segmentIdx !== -1) {\n nextFixedSegments[segmentIdx].start = (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(points[i - 2][0] - arrow.x, points[i - 2][1] - arrow.y);\n } // Remove the fixed segment status from the previous segment if it is\n // a fixed segment, because we are going to unify that segment with\n // the current one\n\n\n if (prevSegmentIdx !== -1) {\n nextFixedSegments.splice(prevSegmentIdx, 1);\n } // Remove the duplicate point\n\n\n _nextPoints.splice(-1, 1); // Update fixed point indices\n\n\n nextFixedSegments.forEach(segment => {\n if (segment.index > i - 1) {\n segment.index -= 1;\n }\n });\n }\n\n return _nextPoints.push(p);\n });\n const nextPoints = [];\n\n _nextPoints.forEach((p, i, points) => {\n var _a, _b;\n\n if (i < 3) {\n return nextPoints.push(p);\n }\n\n if ( // Remove segments that are too short\n (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointDistance)(points[i - 2], points[i - 1]) < DEDUP_TRESHOLD) {\n const prevPrevSegmentIdx = (_a = nextFixedSegments === null || nextFixedSegments === void 0 ? void 0 : nextFixedSegments.findIndex(segment => segment.index === i - 2)) !== null && _a !== void 0 ? _a : -1;\n const prevSegmentIdx = (_b = nextFixedSegments === null || nextFixedSegments === void 0 ? void 0 : nextFixedSegments.findIndex(segment => segment.index === i - 1)) !== null && _b !== void 0 ? _b : -1; // Remove the previous fixed segment if it exists (i.e. the segment\n // which will be removed due to being parallel or too short)\n\n if (prevSegmentIdx !== -1) {\n nextFixedSegments.splice(prevSegmentIdx, 1);\n } // Remove the fixed segment status from the segment 2 steps back\n // if it is a fixed segment, because we are going to unify that\n // segment with the current one\n\n\n if (prevPrevSegmentIdx !== -1) {\n nextFixedSegments.splice(prevPrevSegmentIdx, 1);\n }\n\n nextPoints.splice(-2, 2); // Since we have to remove two segments, update any fixed segment\n\n nextFixedSegments.forEach(segment => {\n if (segment.index > i - 2) {\n segment.index -= 2;\n }\n }); // Remove aligned segment points\n\n const isHorizontal = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingForPointIsHorizontal)(p, points[i - 1]);\n return nextPoints.push((0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(!isHorizontal ? points[i - 2][0] : p[0], isHorizontal ? points[i - 2][1] : p[1]));\n }\n\n nextPoints.push(p);\n });\n\n const filteredNextFixedSegments = nextFixedSegments.filter(segment => segment.index !== 1 && segment.index !== nextPoints.length - 1);\n\n if (filteredNextFixedSegments.length === 0) {\n return normalizeArrowElementUpdate(getElbowArrowCornerPoints(removeElbowArrowShortSegments((_a = routeElbowArrow(arrow, getElbowArrowData(arrow, elementsMap, nextPoints.map(p => (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(p[0] - arrow.x, p[1] - arrow.y))))) !== null && _a !== void 0 ? _a : [])), filteredNextFixedSegments, null, null);\n }\n\n return normalizeArrowElementUpdate(nextPoints, filteredNextFixedSegments, arrow.startIsSpecial, arrow.endIsSpecial);\n }\n\n return {\n x: arrow.x,\n y: arrow.y,\n points: arrow.points,\n fixedSegments: arrow.fixedSegments,\n startIsSpecial: arrow.startIsSpecial,\n endIsSpecial: arrow.endIsSpecial\n };\n};\n\nconst handleSegmentRelease = (arrow, fixedSegments, elementsMap) => {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n\n const newFixedSegmentIndices = fixedSegments.map(segment => segment.index);\n const oldFixedSegmentIndices = (_b = (_a = arrow.fixedSegments) === null || _a === void 0 ? void 0 : _a.map(segment => segment.index)) !== null && _b !== void 0 ? _b : [];\n const deletedSegmentIdx = oldFixedSegmentIndices.findIndex(idx => !newFixedSegmentIndices.includes(idx));\n\n if (deletedSegmentIdx === -1 || !((_c = arrow.fixedSegments) === null || _c === void 0 ? void 0 : _c[deletedSegmentIdx])) {\n return {\n points: arrow.points\n };\n }\n\n const deletedIdx = arrow.fixedSegments[deletedSegmentIdx].index; // Find prev and next fixed segments\n\n const prevSegment = arrow.fixedSegments[deletedSegmentIdx - 1];\n const nextSegment = arrow.fixedSegments[deletedSegmentIdx + 1]; // We need to render a sub-arrow path to restore deleted segments\n\n const x = arrow.x + (prevSegment ? prevSegment.end[0] : 0);\n const y = arrow.y + (prevSegment ? prevSegment.end[1] : 0);\n\n const _j = getElbowArrowData({\n x,\n y,\n startBinding: prevSegment ? null : arrow.startBinding,\n endBinding: nextSegment ? null : arrow.endBinding,\n startArrowhead: null,\n endArrowhead: null\n }, elementsMap, [(0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(0, 0), (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + ((_d = nextSegment === null || nextSegment === void 0 ? void 0 : nextSegment.start[0]) !== null && _d !== void 0 ? _d : arrow.points[arrow.points.length - 1][0]) - x, arrow.y + ((_e = nextSegment === null || nextSegment === void 0 ? void 0 : nextSegment.start[1]) !== null && _e !== void 0 ? _e : arrow.points[arrow.points.length - 1][1]) - y)], {\n isDragging: false\n }),\n {\n startHeading,\n endHeading,\n startGlobalPoint,\n endGlobalPoint,\n hoveredStartElement,\n hoveredEndElement\n } = _j,\n rest = __rest(_j, [\"startHeading\", \"endHeading\", \"startGlobalPoint\", \"endGlobalPoint\", \"hoveredStartElement\", \"hoveredEndElement\"]);\n\n const {\n points: restoredPoints\n } = normalizeArrowElementUpdate(getElbowArrowCornerPoints(removeElbowArrowShortSegments((_f = routeElbowArrow(arrow, Object.assign({\n startHeading,\n endHeading,\n startGlobalPoint,\n endGlobalPoint,\n hoveredStartElement,\n hoveredEndElement\n }, rest))) !== null && _f !== void 0 ? _f : [])), fixedSegments, null, null);\n const nextPoints = []; // First part of the arrow are the old points\n\n if (prevSegment) {\n for (let i = 0; i < prevSegment.index; i++) {\n nextPoints.push((0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + arrow.points[i][0], arrow.y + arrow.points[i][1]));\n }\n }\n\n restoredPoints.forEach(p => {\n nextPoints.push((0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + (prevSegment ? prevSegment.end[0] : 0) + p[0], arrow.y + (prevSegment ? prevSegment.end[1] : 0) + p[1]));\n }); // Last part of the arrow are the old points too\n\n if (nextSegment) {\n for (let i = nextSegment.index; i < arrow.points.length; i++) {\n nextPoints.push((0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + arrow.points[i][0], arrow.y + arrow.points[i][1]));\n }\n } // Update nextFixedSegments\n\n\n const originalSegmentCountDiff = ((_g = nextSegment === null || nextSegment === void 0 ? void 0 : nextSegment.index) !== null && _g !== void 0 ? _g : arrow.points.length) - ((_h = prevSegment === null || prevSegment === void 0 ? void 0 : prevSegment.index) !== null && _h !== void 0 ? _h : 0) - 1;\n const nextFixedSegments = fixedSegments.map(segment => {\n if (segment.index > deletedIdx) {\n return Object.assign(Object.assign({}, segment), {\n index: segment.index - originalSegmentCountDiff + (restoredPoints.length - 1)\n });\n }\n\n return segment;\n });\n const simplifiedPoints = nextPoints.flatMap((p, i) => {\n const prev = nextPoints[i - 1];\n const next = nextPoints[i + 1];\n\n if (prev && next) {\n const prevHeading = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingForPoint)(p, prev);\n const nextHeading = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingForPoint)(next, p);\n\n if ((0,_heading__WEBPACK_IMPORTED_MODULE_6__.compareHeading)(prevHeading, nextHeading)) {\n // Update subsequent fixed segment indices\n nextFixedSegments.forEach(segment => {\n if (segment.index > i) {\n segment.index -= 1;\n }\n });\n return [];\n } else if ((0,_heading__WEBPACK_IMPORTED_MODULE_6__.compareHeading)(prevHeading, (0,_heading__WEBPACK_IMPORTED_MODULE_6__.flipHeading)(nextHeading))) {\n // Update subsequent fixed segment indices\n nextFixedSegments.forEach(segment => {\n if (segment.index > i) {\n segment.index += 1;\n }\n });\n return [p, p];\n }\n }\n\n return [p];\n });\n return normalizeArrowElementUpdate(simplifiedPoints, nextFixedSegments, false, false);\n};\n/**\n *\n */\n\n\nconst handleSegmentMove = (arrow, fixedSegments, startHeading, endHeading, hoveredStartElement, hoveredEndElement) => {\n var _a, _b, _c, _d;\n\n const activelyModifiedSegmentIdx = fixedSegments.map((segment, i) => {\n if (arrow.fixedSegments == null || arrow.fixedSegments[i] === undefined || arrow.fixedSegments[i].index !== segment.index) {\n return i;\n }\n\n return (segment.start[0] !== arrow.fixedSegments[i].start[0] && segment.end[0] !== arrow.fixedSegments[i].end[0]) !== (segment.start[1] !== arrow.fixedSegments[i].start[1] && segment.end[1] !== arrow.fixedSegments[i].end[1]) ? i : null;\n }).filter(idx => idx !== null).shift();\n\n if (activelyModifiedSegmentIdx == null) {\n return {\n points: arrow.points\n };\n }\n\n const firstSegmentIdx = (_b = (_a = arrow.fixedSegments) === null || _a === void 0 ? void 0 : _a.findIndex(segment => segment.index === 1)) !== null && _b !== void 0 ? _b : -1;\n const lastSegmentIdx = (_d = (_c = arrow.fixedSegments) === null || _c === void 0 ? void 0 : _c.findIndex(segment => segment.index === arrow.points.length - 1)) !== null && _d !== void 0 ? _d : -1; // Handle special case for first segment move\n\n const segmentLength = (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointDistance)(fixedSegments[activelyModifiedSegmentIdx].start, fixedSegments[activelyModifiedSegmentIdx].end);\n const segmentIsTooShort = segmentLength < BASE_PADDING + 5;\n\n if (firstSegmentIdx === -1 && fixedSegments[activelyModifiedSegmentIdx].index === 1 && hoveredStartElement) {\n const startIsHorizontal = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingIsHorizontal)(startHeading);\n const startIsPositive = startIsHorizontal ? (0,_heading__WEBPACK_IMPORTED_MODULE_6__.compareHeading)(startHeading, _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT) : (0,_heading__WEBPACK_IMPORTED_MODULE_6__.compareHeading)(startHeading, _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_DOWN);\n const padding = startIsPositive ? segmentIsTooShort ? segmentLength / 2 : BASE_PADDING : segmentIsTooShort ? -segmentLength / 2 : -BASE_PADDING;\n fixedSegments[activelyModifiedSegmentIdx].start = (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(fixedSegments[activelyModifiedSegmentIdx].start[0] + (startIsHorizontal ? padding : 0), fixedSegments[activelyModifiedSegmentIdx].start[1] + (!startIsHorizontal ? padding : 0));\n } // Handle special case for last segment move\n\n\n if (lastSegmentIdx === -1 && fixedSegments[activelyModifiedSegmentIdx].index === arrow.points.length - 1 && hoveredEndElement) {\n const endIsHorizontal = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingIsHorizontal)(endHeading);\n const endIsPositive = endIsHorizontal ? (0,_heading__WEBPACK_IMPORTED_MODULE_6__.compareHeading)(endHeading, _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT) : (0,_heading__WEBPACK_IMPORTED_MODULE_6__.compareHeading)(endHeading, _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_DOWN);\n const padding = endIsPositive ? segmentIsTooShort ? segmentLength / 2 : BASE_PADDING : segmentIsTooShort ? -segmentLength / 2 : -BASE_PADDING;\n fixedSegments[activelyModifiedSegmentIdx].end = (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(fixedSegments[activelyModifiedSegmentIdx].end[0] + (endIsHorizontal ? padding : 0), fixedSegments[activelyModifiedSegmentIdx].end[1] + (!endIsHorizontal ? padding : 0));\n } // Translate all fixed segments to global coordinates\n\n\n const nextFixedSegments = fixedSegments.map(segment => Object.assign(Object.assign({}, segment), {\n start: (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + segment.start[0], arrow.y + segment.start[1]),\n end: (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + segment.end[0], arrow.y + segment.end[1])\n })); // For start, clone old arrow points\n\n const newPoints = arrow.points.map((p, i) => (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + p[0], arrow.y + p[1]));\n const startIdx = nextFixedSegments[activelyModifiedSegmentIdx].index - 1;\n const endIdx = nextFixedSegments[activelyModifiedSegmentIdx].index;\n const start = nextFixedSegments[activelyModifiedSegmentIdx].start;\n const end = nextFixedSegments[activelyModifiedSegmentIdx].end;\n const prevSegmentIsHorizontal = newPoints[startIdx - 1] && !(0,_math__WEBPACK_IMPORTED_MODULE_0__.pointsEqual)(newPoints[startIdx], newPoints[startIdx - 1]) ? (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingForPointIsHorizontal)(newPoints[startIdx - 1], newPoints[startIdx]) : undefined;\n const nextSegmentIsHorizontal = newPoints[endIdx + 1] && !(0,_math__WEBPACK_IMPORTED_MODULE_0__.pointsEqual)(newPoints[endIdx], newPoints[endIdx + 1]) ? (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingForPointIsHorizontal)(newPoints[endIdx + 1], newPoints[endIdx]) : undefined; // Override the segment points with the actively moved fixed segment\n\n if (prevSegmentIsHorizontal !== undefined) {\n const dir = prevSegmentIsHorizontal ? 1 : 0;\n newPoints[startIdx - 1][dir] = start[dir];\n }\n\n newPoints[startIdx] = start;\n newPoints[endIdx] = end;\n\n if (nextSegmentIsHorizontal !== undefined) {\n const dir = nextSegmentIsHorizontal ? 1 : 0;\n newPoints[endIdx + 1][dir] = end[dir];\n } // Override neighboring fixedSegment start/end points, if any\n\n\n const prevSegmentIdx = nextFixedSegments.findIndex(segment => segment.index === startIdx);\n\n if (prevSegmentIdx !== -1) {\n // Align the next segment points with the moved segment\n const dir = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingForPointIsHorizontal)(nextFixedSegments[prevSegmentIdx].end, nextFixedSegments[prevSegmentIdx].start) ? 1 : 0;\n nextFixedSegments[prevSegmentIdx].start[dir] = start[dir];\n nextFixedSegments[prevSegmentIdx].end = start;\n }\n\n const nextSegmentIdx = nextFixedSegments.findIndex(segment => segment.index === endIdx + 1);\n\n if (nextSegmentIdx !== -1) {\n // Align the next segment points with the moved segment\n const dir = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingForPointIsHorizontal)(nextFixedSegments[nextSegmentIdx].end, nextFixedSegments[nextSegmentIdx].start) ? 1 : 0;\n nextFixedSegments[nextSegmentIdx].end[dir] = end[dir];\n nextFixedSegments[nextSegmentIdx].start = end;\n } // First segment move needs an additional segment\n\n\n if (firstSegmentIdx === -1 && startIdx === 0) {\n const startIsHorizontal = hoveredStartElement ? (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingIsHorizontal)(startHeading) : (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingForPointIsHorizontal)(newPoints[1], newPoints[0]);\n newPoints.unshift((0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(startIsHorizontal ? start[0] : arrow.x + arrow.points[0][0], !startIsHorizontal ? start[1] : arrow.y + arrow.points[0][1]));\n\n if (hoveredStartElement) {\n newPoints.unshift((0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + arrow.points[0][0], arrow.y + arrow.points[0][1]));\n }\n\n for (const segment of nextFixedSegments) {\n segment.index += hoveredStartElement ? 2 : 1;\n }\n } // Last segment move needs an additional segment\n\n\n if (lastSegmentIdx === -1 && endIdx === arrow.points.length - 1) {\n const endIsHorizontal = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingIsHorizontal)(endHeading);\n newPoints.push((0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(endIsHorizontal ? end[0] : arrow.x + arrow.points[arrow.points.length - 1][0], !endIsHorizontal ? end[1] : arrow.y + arrow.points[arrow.points.length - 1][1]));\n\n if (hoveredEndElement) {\n newPoints.push((0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + arrow.points[arrow.points.length - 1][0], arrow.y + arrow.points[arrow.points.length - 1][1]));\n }\n }\n\n return normalizeArrowElementUpdate(newPoints, nextFixedSegments.map(segment => Object.assign(Object.assign({}, segment), {\n start: (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(segment.start[0] - arrow.x, segment.start[1] - arrow.y),\n end: (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(segment.end[0] - arrow.x, segment.end[1] - arrow.y)\n })), false, // If you move a segment, there is no special point anymore\n false);\n};\n\nconst handleEndpointDrag = (arrow, updatedPoints, fixedSegments, startHeading, endHeading, startGlobalPoint, endGlobalPoint, hoveredStartElement, hoveredEndElement) => {\n var _a, _b;\n\n let startIsSpecial = (_a = arrow.startIsSpecial) !== null && _a !== void 0 ? _a : null;\n let endIsSpecial = (_b = arrow.endIsSpecial) !== null && _b !== void 0 ? _b : null;\n const globalUpdatedPoints = updatedPoints.map((p, i) => i === 0 ? (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + p[0], arrow.y + p[1]) : i === updatedPoints.length - 1 ? (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + p[0], arrow.y + p[1]) : (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + arrow.points[i][0], arrow.y + arrow.points[i][1]));\n const nextFixedSegments = fixedSegments.map(segment => Object.assign(Object.assign({}, segment), {\n start: (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + (segment.start[0] - updatedPoints[0][0]), arrow.y + (segment.start[1] - updatedPoints[0][1])),\n end: (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + (segment.end[0] - updatedPoints[0][0]), arrow.y + (segment.end[1] - updatedPoints[0][1]))\n }));\n const newPoints = []; // Add the inside points\n\n const offset = 2 + (startIsSpecial ? 1 : 0);\n const endOffset = 2 + (endIsSpecial ? 1 : 0);\n\n while (newPoints.length + offset < globalUpdatedPoints.length - endOffset) {\n newPoints.push(globalUpdatedPoints[newPoints.length + offset]);\n } // Calculate the moving second point connection and add the start point\n\n\n {\n const secondPoint = globalUpdatedPoints[startIsSpecial ? 2 : 1];\n const thirdPoint = globalUpdatedPoints[startIsSpecial ? 3 : 2];\n const startIsHorizontal = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingIsHorizontal)(startHeading);\n const secondIsHorizontal = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingIsHorizontal)((0,_heading__WEBPACK_IMPORTED_MODULE_6__.vectorToHeading)((0,_math__WEBPACK_IMPORTED_MODULE_0__.vectorFromPoint)(secondPoint, thirdPoint)));\n\n if (hoveredStartElement && startIsHorizontal === secondIsHorizontal) {\n const positive = startIsHorizontal ? (0,_heading__WEBPACK_IMPORTED_MODULE_6__.compareHeading)(startHeading, _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT) : (0,_heading__WEBPACK_IMPORTED_MODULE_6__.compareHeading)(startHeading, _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_DOWN);\n newPoints.unshift((0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(!secondIsHorizontal ? thirdPoint[0] : startGlobalPoint[0] + (positive ? BASE_PADDING : -BASE_PADDING), secondIsHorizontal ? thirdPoint[1] : startGlobalPoint[1] + (positive ? BASE_PADDING : -BASE_PADDING)));\n newPoints.unshift((0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(startIsHorizontal ? startGlobalPoint[0] + (positive ? BASE_PADDING : -BASE_PADDING) : startGlobalPoint[0], !startIsHorizontal ? startGlobalPoint[1] + (positive ? BASE_PADDING : -BASE_PADDING) : startGlobalPoint[1]));\n\n if (!startIsSpecial) {\n startIsSpecial = true;\n\n for (const segment of nextFixedSegments) {\n if (segment.index > 1) {\n segment.index += 1;\n }\n }\n }\n } else {\n newPoints.unshift((0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(!secondIsHorizontal ? secondPoint[0] : startGlobalPoint[0], secondIsHorizontal ? secondPoint[1] : startGlobalPoint[1]));\n\n if (startIsSpecial) {\n startIsSpecial = false;\n\n for (const segment of nextFixedSegments) {\n if (segment.index > 1) {\n segment.index -= 1;\n }\n }\n }\n }\n\n newPoints.unshift(startGlobalPoint);\n } // Calculate the moving second to last point connection\n\n {\n const secondToLastPoint = globalUpdatedPoints[globalUpdatedPoints.length - (endIsSpecial ? 3 : 2)];\n const thirdToLastPoint = globalUpdatedPoints[globalUpdatedPoints.length - (endIsSpecial ? 4 : 3)];\n const endIsHorizontal = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingIsHorizontal)(endHeading);\n const secondIsHorizontal = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingForPointIsHorizontal)(thirdToLastPoint, secondToLastPoint);\n\n if (hoveredEndElement && endIsHorizontal === secondIsHorizontal) {\n const positive = endIsHorizontal ? (0,_heading__WEBPACK_IMPORTED_MODULE_6__.compareHeading)(endHeading, _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT) : (0,_heading__WEBPACK_IMPORTED_MODULE_6__.compareHeading)(endHeading, _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_DOWN);\n newPoints.push((0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(!secondIsHorizontal ? thirdToLastPoint[0] : endGlobalPoint[0] + (positive ? BASE_PADDING : -BASE_PADDING), secondIsHorizontal ? thirdToLastPoint[1] : endGlobalPoint[1] + (positive ? BASE_PADDING : -BASE_PADDING)));\n newPoints.push((0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(endIsHorizontal ? endGlobalPoint[0] + (positive ? BASE_PADDING : -BASE_PADDING) : endGlobalPoint[0], !endIsHorizontal ? endGlobalPoint[1] + (positive ? BASE_PADDING : -BASE_PADDING) : endGlobalPoint[1]));\n\n if (!endIsSpecial) {\n endIsSpecial = true;\n }\n } else {\n newPoints.push((0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(!secondIsHorizontal ? secondToLastPoint[0] : endGlobalPoint[0], secondIsHorizontal ? secondToLastPoint[1] : endGlobalPoint[1]));\n\n if (endIsSpecial) {\n endIsSpecial = false;\n }\n }\n }\n newPoints.push(endGlobalPoint);\n return normalizeArrowElementUpdate(newPoints, nextFixedSegments.map(({\n index\n }) => ({\n index,\n start: newPoints[index - 1],\n end: newPoints[index]\n })).map(segment => Object.assign(Object.assign({}, segment), {\n start: (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(segment.start[0] - startGlobalPoint[0], segment.start[1] - startGlobalPoint[1]),\n end: (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(segment.end[0] - startGlobalPoint[0], segment.end[1] - startGlobalPoint[1])\n })), startIsSpecial, endIsSpecial);\n};\n/**\n *\n */\n\n\nconst updateElbowArrowPoints = (arrow, elementsMap, updates, options) => {\n var _a, _b, _c, _d, _e, _f;\n\n if (arrow.points.length < 2) {\n return {\n points: (_a = updates.points) !== null && _a !== void 0 ? _a : arrow.points\n };\n }\n\n if (true) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_4__.invariant)(!updates.points || updates.points.length >= 2, \"Updated point array length must match the arrow point length, contain \" + \"exactly the new start and end points or not be specified at all (i.e. \" + \"you can't add new points between start and end manually to elbow arrows)\");\n (0,_utils__WEBPACK_IMPORTED_MODULE_4__.invariant)(!arrow.fixedSegments || arrow.fixedSegments.map(s => s.start[0] === s.end[0] || s.start[1] === s.end[1]).every(Boolean), \"Fixed segments must be either horizontal or vertical\");\n (0,_utils__WEBPACK_IMPORTED_MODULE_4__.invariant)(!updates.fixedSegments || updates.fixedSegments.map(s => s.start[0] === s.end[0] || s.start[1] === s.end[1]).every(Boolean), \"Updates to fixed segments must be either horizontal or vertical\");\n (0,_utils__WEBPACK_IMPORTED_MODULE_4__.invariant)(arrow.points.slice(1).map((p, i) => p[0] === arrow.points[i][0] || p[1] === arrow.points[i][1]), \"Elbow arrow segments must be either horizontal or vertical\");\n }\n\n const updatedPoints = updates.points ? updates.points && updates.points.length === 2 ? arrow.points.map((p, idx) => idx === 0 ? updates.points[0] : idx === arrow.points.length - 1 ? updates.points[1] : p) : structuredClone(updates.points) : structuredClone(arrow.points);\n\n const _g = getElbowArrowData(arrow, elementsMap, updatedPoints, options),\n {\n startHeading,\n endHeading,\n startGlobalPoint,\n endGlobalPoint,\n hoveredStartElement,\n hoveredEndElement\n } = _g,\n rest = __rest(_g, [\"startHeading\", \"endHeading\", \"startGlobalPoint\", \"endGlobalPoint\", \"hoveredStartElement\", \"hoveredEndElement\"]);\n\n const fixedSegments = (_c = (_b = updates.fixedSegments) !== null && _b !== void 0 ? _b : arrow.fixedSegments) !== null && _c !== void 0 ? _c : []; ////\n // 1. Renormalize the arrow\n ////\n\n if (!updates.points && !updates.fixedSegments) {\n return handleSegmentRenormalization(arrow, elementsMap);\n } ////\n // 2. Just normal elbow arrow things\n ////\n\n\n if (fixedSegments.length === 0) {\n return normalizeArrowElementUpdate(getElbowArrowCornerPoints(removeElbowArrowShortSegments((_d = routeElbowArrow(arrow, Object.assign({\n startHeading,\n endHeading,\n startGlobalPoint,\n endGlobalPoint,\n hoveredStartElement,\n hoveredEndElement\n }, rest))) !== null && _d !== void 0 ? _d : [])), fixedSegments, null, null);\n } ////\n // 3. Handle releasing a fixed segment\n\n\n if (((_f = (_e = arrow.fixedSegments) === null || _e === void 0 ? void 0 : _e.length) !== null && _f !== void 0 ? _f : 0) > fixedSegments.length) {\n return handleSegmentRelease(arrow, fixedSegments, elementsMap);\n } ////\n // 4. Handle manual segment move\n ////\n\n\n if (!updates.points) {\n return handleSegmentMove(arrow, fixedSegments, startHeading, endHeading, hoveredStartElement, hoveredEndElement);\n } ////\n // 5. Handle resize\n\n\n if (updates.points && updates.fixedSegments) {\n return updates;\n } ////\n // 6. One or more segments are fixed and endpoints are moved\n //\n // The key insights are:\n // - When segments are fixed, the arrow will keep the exact amount of segments\n // - Fixed segments are \"replacements\" for exactly one segment in the old arrow\n ////\n\n\n return handleEndpointDrag(arrow, updatedPoints, fixedSegments, startHeading, endHeading, startGlobalPoint, endGlobalPoint, hoveredStartElement, hoveredEndElement);\n};\n/**\n * Retrieves data necessary for calculating the elbow arrow path.\n *\n * @param arrow - The arrow object containing its properties.\n * @param elementsMap - A map of elements in the scene.\n * @param nextPoints - The next set of points for the arrow.\n * @param options - Optional parameters for the calculation.\n * @param options.isDragging - Indicates if the arrow is being dragged.\n * @param options.startIsMidPoint - Indicates if the start point is a midpoint.\n * @param options.endIsMidPoint - Indicates if the end point is a midpoint.\n *\n * @returns An object containing various properties needed for elbow arrow calculations:\n * - dynamicAABBs: Dynamically generated axis-aligned bounding boxes.\n * - startDonglePosition: The position of the start dongle.\n * - startGlobalPoint: The global coordinates of the start point.\n * - startHeading: The heading direction from the start point.\n * - endDonglePosition: The position of the end dongle.\n * - endGlobalPoint: The global coordinates of the end point.\n * - endHeading: The heading direction from the end point.\n * - commonBounds: The common bounding box that encompasses both start and end points.\n * - hoveredStartElement: The element being hovered over at the start point.\n * - hoveredEndElement: The element being hovered over at the end point.\n */\n\nconst getElbowArrowData = (arrow, elementsMap, nextPoints, options) => {\n var _a, _b;\n\n const origStartGlobalPoint = (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointTranslate)(nextPoints[0], (0,_math__WEBPACK_IMPORTED_MODULE_0__.vector)(arrow.x, arrow.y));\n const origEndGlobalPoint = (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointTranslate)(nextPoints[nextPoints.length - 1], (0,_math__WEBPACK_IMPORTED_MODULE_0__.vector)(arrow.x, arrow.y));\n const startElement = arrow.startBinding && getBindableElementForId(arrow.startBinding.elementId, elementsMap);\n const endElement = arrow.endBinding && getBindableElementForId(arrow.endBinding.elementId, elementsMap);\n const [hoveredStartElement, hoveredEndElement] = (options === null || options === void 0 ? void 0 : options.isDragging) ? getHoveredElements(origStartGlobalPoint, origEndGlobalPoint, elementsMap, options === null || options === void 0 ? void 0 : options.zoom) : [startElement, endElement];\n const startGlobalPoint = getGlobalPoint((_a = arrow.startBinding) === null || _a === void 0 ? void 0 : _a.fixedPoint, origStartGlobalPoint, origEndGlobalPoint, elementsMap, startElement, hoveredStartElement, options === null || options === void 0 ? void 0 : options.isDragging);\n const endGlobalPoint = getGlobalPoint((_b = arrow.endBinding) === null || _b === void 0 ? void 0 : _b.fixedPoint, origEndGlobalPoint, origStartGlobalPoint, elementsMap, endElement, hoveredEndElement, options === null || options === void 0 ? void 0 : options.isDragging);\n const startHeading = getBindPointHeading(startGlobalPoint, endGlobalPoint, elementsMap, hoveredStartElement, origStartGlobalPoint);\n const endHeading = getBindPointHeading(endGlobalPoint, startGlobalPoint, elementsMap, hoveredEndElement, origEndGlobalPoint);\n const startPointBounds = [startGlobalPoint[0] - 2, startGlobalPoint[1] - 2, startGlobalPoint[0] + 2, startGlobalPoint[1] + 2];\n const endPointBounds = [endGlobalPoint[0] - 2, endGlobalPoint[1] - 2, endGlobalPoint[0] + 2, endGlobalPoint[1] + 2];\n const startElementBounds = hoveredStartElement ? (0,_shapes__WEBPACK_IMPORTED_MODULE_3__.aabbForElement)(hoveredStartElement, offsetFromHeading(startHeading, arrow.startArrowhead ? _binding__WEBPACK_IMPORTED_MODULE_5__.FIXED_BINDING_DISTANCE * 6 : _binding__WEBPACK_IMPORTED_MODULE_5__.FIXED_BINDING_DISTANCE * 2, 1)) : startPointBounds;\n const endElementBounds = hoveredEndElement ? (0,_shapes__WEBPACK_IMPORTED_MODULE_3__.aabbForElement)(hoveredEndElement, offsetFromHeading(endHeading, arrow.endArrowhead ? _binding__WEBPACK_IMPORTED_MODULE_5__.FIXED_BINDING_DISTANCE * 6 : _binding__WEBPACK_IMPORTED_MODULE_5__.FIXED_BINDING_DISTANCE * 2, 1)) : endPointBounds;\n const boundsOverlap = (0,_shapes__WEBPACK_IMPORTED_MODULE_3__.pointInsideBounds)(startGlobalPoint, hoveredEndElement ? (0,_shapes__WEBPACK_IMPORTED_MODULE_3__.aabbForElement)(hoveredEndElement, offsetFromHeading(endHeading, BASE_PADDING, BASE_PADDING)) : endPointBounds) || (0,_shapes__WEBPACK_IMPORTED_MODULE_3__.pointInsideBounds)(endGlobalPoint, hoveredStartElement ? (0,_shapes__WEBPACK_IMPORTED_MODULE_3__.aabbForElement)(hoveredStartElement, offsetFromHeading(startHeading, BASE_PADDING, BASE_PADDING)) : startPointBounds);\n const commonBounds = commonAABB(boundsOverlap ? [startPointBounds, endPointBounds] : [startElementBounds, endElementBounds]);\n const dynamicAABBs = generateDynamicAABBs(boundsOverlap ? startPointBounds : startElementBounds, boundsOverlap ? endPointBounds : endElementBounds, commonBounds, boundsOverlap ? offsetFromHeading(startHeading, !hoveredStartElement && !hoveredEndElement ? 0 : BASE_PADDING, 0) : offsetFromHeading(startHeading, !hoveredStartElement && !hoveredEndElement ? 0 : BASE_PADDING - (arrow.startArrowhead ? _binding__WEBPACK_IMPORTED_MODULE_5__.FIXED_BINDING_DISTANCE * 6 : _binding__WEBPACK_IMPORTED_MODULE_5__.FIXED_BINDING_DISTANCE * 2), BASE_PADDING), boundsOverlap ? offsetFromHeading(endHeading, !hoveredStartElement && !hoveredEndElement ? 0 : BASE_PADDING, 0) : offsetFromHeading(endHeading, !hoveredStartElement && !hoveredEndElement ? 0 : BASE_PADDING - (arrow.endArrowhead ? _binding__WEBPACK_IMPORTED_MODULE_5__.FIXED_BINDING_DISTANCE * 6 : _binding__WEBPACK_IMPORTED_MODULE_5__.FIXED_BINDING_DISTANCE * 2), BASE_PADDING), boundsOverlap, hoveredStartElement && (0,_shapes__WEBPACK_IMPORTED_MODULE_3__.aabbForElement)(hoveredStartElement), hoveredEndElement && (0,_shapes__WEBPACK_IMPORTED_MODULE_3__.aabbForElement)(hoveredEndElement));\n const startDonglePosition = getDonglePosition(dynamicAABBs[0], startHeading, startGlobalPoint);\n const endDonglePosition = getDonglePosition(dynamicAABBs[1], endHeading, endGlobalPoint);\n return {\n dynamicAABBs,\n startDonglePosition,\n startGlobalPoint,\n startHeading,\n endDonglePosition,\n endGlobalPoint,\n endHeading,\n commonBounds,\n hoveredStartElement,\n hoveredEndElement,\n boundsOverlap,\n startElementBounds,\n endElementBounds\n };\n};\n/**\n * Generate the elbow arrow segments\n *\n * @param arrow\n * @param elementsMap\n * @param nextPoints\n * @param options\n * @returns\n */\n\n\nconst routeElbowArrow = (arrow, elbowArrowData) => {\n const {\n dynamicAABBs,\n startDonglePosition,\n startGlobalPoint,\n startHeading,\n endDonglePosition,\n endGlobalPoint,\n endHeading,\n commonBounds,\n hoveredEndElement\n } = elbowArrowData; // Canculate Grid positions\n\n const grid = calculateGrid(dynamicAABBs, startDonglePosition ? startDonglePosition : startGlobalPoint, startHeading, endDonglePosition ? endDonglePosition : endGlobalPoint, endHeading, commonBounds);\n const startDongle = startDonglePosition && pointToGridNode(startDonglePosition, grid);\n const endDongle = endDonglePosition && pointToGridNode(endDonglePosition, grid); // Do not allow stepping on the true end or true start points\n\n const endNode = pointToGridNode(endGlobalPoint, grid);\n\n if (endNode && hoveredEndElement) {\n endNode.closed = true;\n }\n\n const startNode = pointToGridNode(startGlobalPoint, grid);\n\n if (startNode && arrow.startBinding) {\n startNode.closed = true;\n }\n\n const dongleOverlap = startDongle && endDongle && ((0,_shapes__WEBPACK_IMPORTED_MODULE_3__.pointInsideBounds)(startDongle.pos, dynamicAABBs[1]) || (0,_shapes__WEBPACK_IMPORTED_MODULE_3__.pointInsideBounds)(endDongle.pos, dynamicAABBs[0])); // Create path to end dongle from start dongle\n\n const path = astar(startDongle ? startDongle : startNode, endDongle ? endDongle : endNode, grid, startHeading ? startHeading : _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT, endHeading ? endHeading : _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT, dongleOverlap ? [] : dynamicAABBs);\n\n if (path) {\n const points = path.map(node => [node.pos[0], node.pos[1]]);\n startDongle && points.unshift(startGlobalPoint);\n endDongle && points.push(endGlobalPoint);\n return points;\n }\n\n return null;\n};\n\nconst offsetFromHeading = (heading, head, side) => {\n switch (heading) {\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_UP:\n return [head, side, side, side];\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT:\n return [side, head, side, side];\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_DOWN:\n return [side, side, head, side];\n }\n\n return [side, side, side, head];\n};\n/**\n * Routing algorithm based on the A* path search algorithm.\n * @see https://www.geeksforgeeks.org/a-search-algorithm/\n *\n * Binary heap is used to optimize node lookup.\n * See {@link calculateGrid} for the grid calculation details.\n *\n * Additional modifications added due to aesthetic route reasons:\n * 1) Arrow segment direction change is penalized by specific linear constant (bendMultiplier)\n * 2) Arrow segments are not allowed to go \"backwards\", overlapping with the previous segment\n */\n\n\nconst astar = (start, end, grid, startHeading, endHeading, aabbs) => {\n const bendMultiplier = m_dist(start.pos, end.pos);\n const open = new _binaryheap__WEBPACK_IMPORTED_MODULE_1__[\"default\"](node => node.f);\n open.push(start);\n\n while (open.size() > 0) {\n // Grab the lowest f(x) to process next. Heap keeps this sorted for us.\n const current = open.pop();\n\n if (!current || current.closed) {\n // Current is not passable, continue with next element\n continue;\n } // End case -- result has been found, return the traced path.\n\n\n if (current === end) {\n return pathTo(start, current);\n } // Normal case -- move current from open to closed, process each of its neighbors.\n\n\n current.closed = true; // Find all neighbors for the current node.\n\n const neighbors = getNeighbors(current.addr, grid);\n\n for (let i = 0; i < 4; i++) {\n const neighbor = neighbors[i];\n\n if (!neighbor || neighbor.closed) {\n // Not a valid node to process, skip to next neighbor.\n continue;\n } // Intersect\n\n\n const neighborHalfPoint = (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointScaleFromOrigin)(neighbor.pos, current.pos, 0.5);\n\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_4__.isAnyTrue)(...aabbs.map(aabb => (0,_shapes__WEBPACK_IMPORTED_MODULE_3__.pointInsideBounds)(neighborHalfPoint, aabb)))) {\n continue;\n } // The g score is the shortest distance from start to current node.\n // We need to check if the path we have arrived at this neighbor is the shortest one we have seen yet.\n\n\n const neighborHeading = neighborIndexToHeading(i);\n const previousDirection = current.parent ? (0,_heading__WEBPACK_IMPORTED_MODULE_6__.vectorToHeading)((0,_math__WEBPACK_IMPORTED_MODULE_0__.vectorFromPoint)(current.pos, current.parent.pos)) : startHeading; // Do not allow going in reverse\n\n const reverseHeading = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.flipHeading)(previousDirection);\n const neighborIsReverseRoute = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.compareHeading)(reverseHeading, neighborHeading) || gridAddressesEqual(start.addr, neighbor.addr) && (0,_heading__WEBPACK_IMPORTED_MODULE_6__.compareHeading)(neighborHeading, startHeading) || gridAddressesEqual(end.addr, neighbor.addr) && (0,_heading__WEBPACK_IMPORTED_MODULE_6__.compareHeading)(neighborHeading, endHeading);\n\n if (neighborIsReverseRoute) {\n continue;\n }\n\n const directionChange = previousDirection !== neighborHeading;\n const gScore = current.g + m_dist(neighbor.pos, current.pos) + (directionChange ? Math.pow(bendMultiplier, 3) : 0);\n const beenVisited = neighbor.visited;\n\n if (!beenVisited || gScore < neighbor.g) {\n const estBendCount = estimateSegmentCount(neighbor, end, neighborHeading, endHeading); // Found an optimal (so far) path to this node. Take score for node to see how good it is.\n\n neighbor.visited = true;\n neighbor.parent = current;\n neighbor.h = m_dist(end.pos, neighbor.pos) + estBendCount * Math.pow(bendMultiplier, 2);\n neighbor.g = gScore;\n neighbor.f = neighbor.g + neighbor.h;\n\n if (!beenVisited) {\n // Pushing to heap will put it in proper place based on the 'f' value.\n open.push(neighbor);\n } else {\n // Already seen the node, but since it has been rescored we need to reorder it in the heap\n open.rescoreElement(neighbor);\n }\n }\n }\n }\n\n return null;\n};\n\nconst pathTo = (start, node) => {\n let curr = node;\n const path = [];\n\n while (curr.parent) {\n path.unshift(curr);\n curr = curr.parent;\n }\n\n path.unshift(start);\n return path;\n};\n\nconst m_dist = (a, b) => Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1]);\n/**\n * Create dynamically resizing, always touching\n * bounding boxes having a minimum extent represented\n * by the given static bounds.\n */\n\n\nconst generateDynamicAABBs = (a, b, common, startDifference, endDifference, disableSideHack, startElementBounds, endElementBounds) => {\n const startEl = startElementBounds !== null && startElementBounds !== void 0 ? startElementBounds : a;\n const endEl = endElementBounds !== null && endElementBounds !== void 0 ? endElementBounds : b;\n const [startUp, startRight, startDown, startLeft] = startDifference !== null && startDifference !== void 0 ? startDifference : [0, 0, 0, 0];\n const [endUp, endRight, endDown, endLeft] = endDifference !== null && endDifference !== void 0 ? endDifference : [0, 0, 0, 0];\n const first = [a[0] > b[2] ? a[1] > b[3] || a[3] < b[1] ? Math.min((startEl[0] + endEl[2]) / 2, a[0] - startLeft) : (startEl[0] + endEl[2]) / 2 : a[0] > b[0] ? a[0] - startLeft : common[0] - startLeft, a[1] > b[3] ? a[0] > b[2] || a[2] < b[0] ? Math.min((startEl[1] + endEl[3]) / 2, a[1] - startUp) : (startEl[1] + endEl[3]) / 2 : a[1] > b[1] ? a[1] - startUp : common[1] - startUp, a[2] < b[0] ? a[1] > b[3] || a[3] < b[1] ? Math.max((startEl[2] + endEl[0]) / 2, a[2] + startRight) : (startEl[2] + endEl[0]) / 2 : a[2] < b[2] ? a[2] + startRight : common[2] + startRight, a[3] < b[1] ? a[0] > b[2] || a[2] < b[0] ? Math.max((startEl[3] + endEl[1]) / 2, a[3] + startDown) : (startEl[3] + endEl[1]) / 2 : a[3] < b[3] ? a[3] + startDown : common[3] + startDown];\n const second = [b[0] > a[2] ? b[1] > a[3] || b[3] < a[1] ? Math.min((endEl[0] + startEl[2]) / 2, b[0] - endLeft) : (endEl[0] + startEl[2]) / 2 : b[0] > a[0] ? b[0] - endLeft : common[0] - endLeft, b[1] > a[3] ? b[0] > a[2] || b[2] < a[0] ? Math.min((endEl[1] + startEl[3]) / 2, b[1] - endUp) : (endEl[1] + startEl[3]) / 2 : b[1] > a[1] ? b[1] - endUp : common[1] - endUp, b[2] < a[0] ? b[1] > a[3] || b[3] < a[1] ? Math.max((endEl[2] + startEl[0]) / 2, b[2] + endRight) : (endEl[2] + startEl[0]) / 2 : b[2] < a[2] ? b[2] + endRight : common[2] + endRight, b[3] < a[1] ? b[0] > a[2] || b[2] < a[0] ? Math.max((endEl[3] + startEl[1]) / 2, b[3] + endDown) : (endEl[3] + startEl[1]) / 2 : b[3] < a[3] ? b[3] + endDown : common[3] + endDown];\n const c = commonAABB([first, second]);\n\n if (!disableSideHack && first[2] - first[0] + second[2] - second[0] > c[2] - c[0] + 0.00000000001 && first[3] - first[1] + second[3] - second[1] > c[3] - c[1] + 0.00000000001) {\n const [endCenterX, endCenterY] = [(second[0] + second[2]) / 2, (second[1] + second[3]) / 2];\n\n if (b[0] > a[2] && a[1] > b[3]) {\n // BOTTOM LEFT\n const cX = first[2] + (second[0] - first[2]) / 2;\n const cY = second[3] + (first[1] - second[3]) / 2;\n\n if ((0,_math__WEBPACK_IMPORTED_MODULE_0__.vectorCross)((0,_math__WEBPACK_IMPORTED_MODULE_0__.vector)(a[2] - endCenterX, a[1] - endCenterY), (0,_math__WEBPACK_IMPORTED_MODULE_0__.vector)(a[0] - endCenterX, a[3] - endCenterY)) > 0) {\n return [[first[0], first[1], cX, first[3]], [cX, second[1], second[2], second[3]]];\n }\n\n return [[first[0], cY, first[2], first[3]], [second[0], second[1], second[2], cY]];\n } else if (a[2] < b[0] && a[3] < b[1]) {\n // TOP LEFT\n const cX = first[2] + (second[0] - first[2]) / 2;\n const cY = first[3] + (second[1] - first[3]) / 2;\n\n if ((0,_math__WEBPACK_IMPORTED_MODULE_0__.vectorCross)((0,_math__WEBPACK_IMPORTED_MODULE_0__.vector)(a[0] - endCenterX, a[1] - endCenterY), (0,_math__WEBPACK_IMPORTED_MODULE_0__.vector)(a[2] - endCenterX, a[3] - endCenterY)) > 0) {\n return [[first[0], first[1], first[2], cY], [second[0], cY, second[2], second[3]]];\n }\n\n return [[first[0], first[1], cX, first[3]], [cX, second[1], second[2], second[3]]];\n } else if (a[0] > b[2] && a[3] < b[1]) {\n // TOP RIGHT\n const cX = second[2] + (first[0] - second[2]) / 2;\n const cY = first[3] + (second[1] - first[3]) / 2;\n\n if ((0,_math__WEBPACK_IMPORTED_MODULE_0__.vectorCross)((0,_math__WEBPACK_IMPORTED_MODULE_0__.vector)(a[2] - endCenterX, a[1] - endCenterY), (0,_math__WEBPACK_IMPORTED_MODULE_0__.vector)(a[0] - endCenterX, a[3] - endCenterY)) > 0) {\n return [[cX, first[1], first[2], first[3]], [second[0], second[1], cX, second[3]]];\n }\n\n return [[first[0], first[1], first[2], cY], [second[0], cY, second[2], second[3]]];\n } else if (a[0] > b[2] && a[1] > b[3]) {\n // BOTTOM RIGHT\n const cX = second[2] + (first[0] - second[2]) / 2;\n const cY = second[3] + (first[1] - second[3]) / 2;\n\n if ((0,_math__WEBPACK_IMPORTED_MODULE_0__.vectorCross)((0,_math__WEBPACK_IMPORTED_MODULE_0__.vector)(a[0] - endCenterX, a[1] - endCenterY), (0,_math__WEBPACK_IMPORTED_MODULE_0__.vector)(a[2] - endCenterX, a[3] - endCenterY)) > 0) {\n return [[cX, first[1], first[2], first[3]], [second[0], second[1], cX, second[3]]];\n }\n\n return [[first[0], cY, first[2], first[3]], [second[0], second[1], second[2], cY]];\n }\n }\n\n return [first, second];\n};\n/**\n * Calculates the grid which is used as nodes at\n * the grid line intersections by the A* algorithm.\n *\n * NOTE: This is not a uniform grid. It is built at\n * various intersections of bounding boxes.\n */\n\n\nconst calculateGrid = (aabbs, start, startHeading, end, endHeading, common) => {\n const horizontal = new Set();\n const vertical = new Set();\n\n if (startHeading === _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_LEFT || startHeading === _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT) {\n vertical.add(start[1]);\n } else {\n horizontal.add(start[0]);\n }\n\n if (endHeading === _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_LEFT || endHeading === _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT) {\n vertical.add(end[1]);\n } else {\n horizontal.add(end[0]);\n }\n\n aabbs.forEach(aabb => {\n horizontal.add(aabb[0]);\n horizontal.add(aabb[2]);\n vertical.add(aabb[1]);\n vertical.add(aabb[3]);\n });\n horizontal.add(common[0]);\n horizontal.add(common[2]);\n vertical.add(common[1]);\n vertical.add(common[3]);\n\n const _vertical = Array.from(vertical).sort((a, b) => a - b);\n\n const _horizontal = Array.from(horizontal).sort((a, b) => a - b);\n\n return {\n row: _vertical.length,\n col: _horizontal.length,\n data: _vertical.flatMap((y, row) => _horizontal.map((x, col) => ({\n f: 0,\n g: 0,\n h: 0,\n closed: false,\n visited: false,\n parent: null,\n addr: [col, row],\n pos: [x, y]\n })))\n };\n};\n\nconst getDonglePosition = (bounds, heading, p) => {\n switch (heading) {\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_UP:\n return (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(p[0], bounds[1]);\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT:\n return (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(bounds[2], p[1]);\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_DOWN:\n return (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(p[0], bounds[3]);\n }\n\n return (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(bounds[0], p[1]);\n};\n\nconst estimateSegmentCount = (start, end, startHeading, endHeading) => {\n if (endHeading === _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT) {\n switch (startHeading) {\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT:\n {\n if (start.pos[0] >= end.pos[0]) {\n return 4;\n }\n\n if (start.pos[1] === end.pos[1]) {\n return 0;\n }\n\n return 2;\n }\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_UP:\n if (start.pos[1] > end.pos[1] && start.pos[0] < end.pos[0]) {\n return 1;\n }\n\n return 3;\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_DOWN:\n if (start.pos[1] < end.pos[1] && start.pos[0] < end.pos[0]) {\n return 1;\n }\n\n return 3;\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_LEFT:\n if (start.pos[1] === end.pos[1]) {\n return 4;\n }\n\n return 2;\n }\n } else if (endHeading === _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_LEFT) {\n switch (startHeading) {\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT:\n if (start.pos[1] === end.pos[1]) {\n return 4;\n }\n\n return 2;\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_UP:\n if (start.pos[1] > end.pos[1] && start.pos[0] > end.pos[0]) {\n return 1;\n }\n\n return 3;\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_DOWN:\n if (start.pos[1] < end.pos[1] && start.pos[0] > end.pos[0]) {\n return 1;\n }\n\n return 3;\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_LEFT:\n if (start.pos[0] <= end.pos[0]) {\n return 4;\n }\n\n if (start.pos[1] === end.pos[1]) {\n return 0;\n }\n\n return 2;\n }\n } else if (endHeading === _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_UP) {\n switch (startHeading) {\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT:\n if (start.pos[1] > end.pos[1] && start.pos[0] < end.pos[0]) {\n return 1;\n }\n\n return 3;\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_UP:\n if (start.pos[1] >= end.pos[1]) {\n return 4;\n }\n\n if (start.pos[0] === end.pos[0]) {\n return 0;\n }\n\n return 2;\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_DOWN:\n if (start.pos[0] === end.pos[0]) {\n return 4;\n }\n\n return 2;\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_LEFT:\n if (start.pos[1] > end.pos[1] && start.pos[0] > end.pos[0]) {\n return 1;\n }\n\n return 3;\n }\n } else if (endHeading === _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_DOWN) {\n switch (startHeading) {\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT:\n if (start.pos[1] < end.pos[1] && start.pos[0] < end.pos[0]) {\n return 1;\n }\n\n return 3;\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_UP:\n if (start.pos[0] === end.pos[0]) {\n return 4;\n }\n\n return 2;\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_DOWN:\n if (start.pos[1] <= end.pos[1]) {\n return 4;\n }\n\n if (start.pos[0] === end.pos[0]) {\n return 0;\n }\n\n return 2;\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_LEFT:\n if (start.pos[1] < end.pos[1] && start.pos[0] > end.pos[0]) {\n return 1;\n }\n\n return 3;\n }\n }\n\n return 0;\n};\n/**\n * Get neighboring points for a gived grid address\n */\n\n\nconst getNeighbors = ([col, row], grid) => [gridNodeFromAddr([col, row - 1], grid), gridNodeFromAddr([col + 1, row], grid), gridNodeFromAddr([col, row + 1], grid), gridNodeFromAddr([col - 1, row], grid)];\n\nconst gridNodeFromAddr = ([col, row], grid) => {\n var _a;\n\n if (col < 0 || col >= grid.col || row < 0 || row >= grid.row) {\n return null;\n }\n\n return (_a = grid.data[row * grid.col + col]) !== null && _a !== void 0 ? _a : null;\n};\n/**\n * Get node for global point on canvas (if exists)\n */\n\n\nconst pointToGridNode = (point, grid) => {\n for (let col = 0; col < grid.col; col++) {\n for (let row = 0; row < grid.row; row++) {\n const candidate = gridNodeFromAddr([col, row], grid);\n\n if (candidate && point[0] === candidate.pos[0] && point[1] === candidate.pos[1]) {\n return candidate;\n }\n }\n }\n\n return null;\n};\n\nconst commonAABB = aabbs => [Math.min(...aabbs.map(aabb => aabb[0])), Math.min(...aabbs.map(aabb => aabb[1])), Math.max(...aabbs.map(aabb => aabb[2])), Math.max(...aabbs.map(aabb => aabb[3]))]; /// #region Utils\n\n\nconst getBindableElementForId = (id, elementsMap) => {\n const element = elementsMap.get(id);\n\n if (element && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_7__.isBindableElement)(element)) {\n return element;\n }\n\n return null;\n};\n\nconst normalizeArrowElementUpdate = (global, nextFixedSegments, startIsSpecial, endIsSpecial) => {\n var _a;\n\n const offsetX = global[0][0];\n const offsetY = global[0][1];\n const points = global.map(p => (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointTranslate)(p, (0,_math__WEBPACK_IMPORTED_MODULE_0__.vectorScale)((0,_math__WEBPACK_IMPORTED_MODULE_0__.vectorFromPoint)(global[0]), -1)));\n return Object.assign(Object.assign({\n points,\n x: offsetX,\n y: offsetY,\n fixedSegments: ((_a = nextFixedSegments === null || nextFixedSegments === void 0 ? void 0 : nextFixedSegments.length) !== null && _a !== void 0 ? _a : 0) > 0 ? nextFixedSegments : null\n }, (0,_points__WEBPACK_IMPORTED_MODULE_2__.getSizeFromPoints)(points)), {\n startIsSpecial,\n endIsSpecial\n });\n};\n\nconst getElbowArrowCornerPoints = points => {\n if (points.length > 1) {\n let previousHorizontal = Math.abs(points[0][1] - points[1][1]) < Math.abs(points[0][0] - points[1][0]);\n return points.filter((p, idx) => {\n // The very first and last points are always kept\n if (idx === 0 || idx === points.length - 1) {\n return true;\n }\n\n const next = points[idx + 1];\n const nextHorizontal = Math.abs(p[1] - next[1]) < Math.abs(p[0] - next[0]);\n\n if (previousHorizontal === nextHorizontal) {\n previousHorizontal = nextHorizontal;\n return false;\n }\n\n previousHorizontal = nextHorizontal;\n return true;\n });\n }\n\n return points;\n};\n\nconst removeElbowArrowShortSegments = points => {\n if (points.length >= 4) {\n return points.filter((p, idx) => {\n if (idx === 0 || idx === points.length - 1) {\n return true;\n }\n\n const prev = points[idx - 1];\n const prevDist = (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointDistance)(prev, p);\n return prevDist > DEDUP_TRESHOLD;\n });\n }\n\n return points;\n};\n\nconst neighborIndexToHeading = idx => {\n switch (idx) {\n case 0:\n return _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_UP;\n\n case 1:\n return _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT;\n\n case 2:\n return _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_DOWN;\n }\n\n return _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_LEFT;\n};\n\nconst getGlobalPoint = (fixedPointRatio, initialPoint, otherPoint, elementsMap, boundElement, hoveredElement, isDragging) => {\n if (isDragging) {\n if (hoveredElement) {\n const snapPoint = getSnapPoint(initialPoint, otherPoint, hoveredElement, elementsMap);\n return (0,_binding__WEBPACK_IMPORTED_MODULE_5__.snapToMid)(hoveredElement, snapPoint);\n }\n\n return initialPoint;\n }\n\n if (boundElement) {\n const fixedGlobalPoint = (0,_binding__WEBPACK_IMPORTED_MODULE_5__.getGlobalFixedPointForBindableElement)(fixedPointRatio || [0, 0], boundElement); // NOTE: Resize scales the binding position point too, so we need to update it\n\n return Math.abs((0,_binding__WEBPACK_IMPORTED_MODULE_5__.distanceToBindableElement)(boundElement, fixedGlobalPoint, elementsMap) - _binding__WEBPACK_IMPORTED_MODULE_5__.FIXED_BINDING_DISTANCE) > 0.01 ? getSnapPoint(initialPoint, otherPoint, boundElement, elementsMap) : fixedGlobalPoint;\n }\n\n return initialPoint;\n};\n\nconst getSnapPoint = (p, otherPoint, element, elementsMap) => (0,_binding__WEBPACK_IMPORTED_MODULE_5__.bindPointToSnapToElementOutline)((0,_typeChecks__WEBPACK_IMPORTED_MODULE_7__.isRectanguloidElement)(element) ? (0,_binding__WEBPACK_IMPORTED_MODULE_5__.avoidRectangularCorner)(element, p) : p, otherPoint, element, elementsMap);\n\nconst getBindPointHeading = (p, otherPoint, elementsMap, hoveredElement, origPoint) => (0,_binding__WEBPACK_IMPORTED_MODULE_5__.getHeadingForElbowArrowSnap)(p, otherPoint, hoveredElement, hoveredElement && (0,_shapes__WEBPACK_IMPORTED_MODULE_3__.aabbForElement)(hoveredElement, Array(4).fill((0,_binding__WEBPACK_IMPORTED_MODULE_5__.distanceToBindableElement)(hoveredElement, p, elementsMap))), elementsMap, origPoint);\n\nconst getHoveredElements = (origStartGlobalPoint, origEndGlobalPoint, elementsMap, zoom) => {\n // TODO: Might be a performance bottleneck and the Map type\n // remembers the insertion order anyway...\n const nonDeletedSceneElementsMap = (0,_utils__WEBPACK_IMPORTED_MODULE_4__.toBrandedType)(new Map([...elementsMap].filter(el => !el[1].isDeleted)));\n const elements = Array.from(elementsMap.values());\n return [(0,_binding__WEBPACK_IMPORTED_MODULE_5__.getHoveredElementForBinding)((0,_utils__WEBPACK_IMPORTED_MODULE_4__.tupleToCoors)(origStartGlobalPoint), elements, nonDeletedSceneElementsMap, zoom, true), (0,_binding__WEBPACK_IMPORTED_MODULE_5__.getHoveredElementForBinding)((0,_utils__WEBPACK_IMPORTED_MODULE_4__.tupleToCoors)(origEndGlobalPoint), elements, nonDeletedSceneElementsMap, zoom, true)];\n};\n\nconst gridAddressesEqual = (a, b) => a[0] === b[0] && a[1] === b[1];\n\n//# sourceURL=webpack://ExcalidrawLib/./element/elbowArrow.ts?");
|
|
3152
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"BASE_PADDING\": () => (/* binding */ BASE_PADDING),\n/* harmony export */ \"updateElbowArrowPoints\": () => (/* binding */ updateElbowArrowPoints)\n/* harmony export */ });\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../math */ \"../math/index.ts\");\n/* harmony import */ var _binaryheap__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../binaryheap */ \"./binaryheap.ts\");\n/* harmony import */ var _points__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../points */ \"./points.ts\");\n/* harmony import */ var _shapes__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../shapes */ \"./shapes.tsx\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils */ \"./utils.ts\");\n/* harmony import */ var _binding__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./binding */ \"./element/binding.ts\");\n/* harmony import */ var _heading__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./heading */ \"./element/heading.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./typeChecks */ \"./element/typeChecks.ts\");\nvar __rest = undefined && undefined.__rest || function (s, e) {\n var t = {};\n\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n }\n return t;\n};\n\n\n\n\n\n\n\n\n\nconst DEDUP_TRESHOLD = 1;\nconst BASE_PADDING = 40;\n\nconst handleSegmentRenormalization = (arrow, elementsMap) => {\n var _a;\n\n const nextFixedSegments = arrow.fixedSegments ? structuredClone(arrow.fixedSegments) : null;\n\n if (nextFixedSegments) {\n const _nextPoints = [];\n arrow.points.map(p => (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + p[0], arrow.y + p[1])).forEach((p, i, points) => {\n var _a, _b;\n\n if (i < 2) {\n return _nextPoints.push(p);\n }\n\n const currentSegmentIsHorizontal = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingForPoint)(p, points[i - 1]);\n const prevSegmentIsHorizontal = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingForPoint)(points[i - 1], points[i - 2]);\n\n if ( // Check if previous two points are on the same line\n (0,_heading__WEBPACK_IMPORTED_MODULE_6__.compareHeading)(currentSegmentIsHorizontal, prevSegmentIsHorizontal)) {\n const prevSegmentIdx = (_a = nextFixedSegments === null || nextFixedSegments === void 0 ? void 0 : nextFixedSegments.findIndex(segment => segment.index === i - 1)) !== null && _a !== void 0 ? _a : -1;\n const segmentIdx = (_b = nextFixedSegments === null || nextFixedSegments === void 0 ? void 0 : nextFixedSegments.findIndex(segment => segment.index === i)) !== null && _b !== void 0 ? _b : -1; // If the current segment is a fixed segment, update its start point\n\n if (segmentIdx !== -1) {\n nextFixedSegments[segmentIdx].start = (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(points[i - 2][0] - arrow.x, points[i - 2][1] - arrow.y);\n } // Remove the fixed segment status from the previous segment if it is\n // a fixed segment, because we are going to unify that segment with\n // the current one\n\n\n if (prevSegmentIdx !== -1) {\n nextFixedSegments.splice(prevSegmentIdx, 1);\n } // Remove the duplicate point\n\n\n _nextPoints.splice(-1, 1); // Update fixed point indices\n\n\n nextFixedSegments.forEach(segment => {\n if (segment.index > i - 1) {\n segment.index -= 1;\n }\n });\n }\n\n return _nextPoints.push(p);\n });\n const nextPoints = [];\n\n _nextPoints.forEach((p, i, points) => {\n var _a, _b;\n\n if (i < 3) {\n return nextPoints.push(p);\n }\n\n if ( // Remove segments that are too short\n (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointDistance)(points[i - 2], points[i - 1]) < DEDUP_TRESHOLD) {\n const prevPrevSegmentIdx = (_a = nextFixedSegments === null || nextFixedSegments === void 0 ? void 0 : nextFixedSegments.findIndex(segment => segment.index === i - 2)) !== null && _a !== void 0 ? _a : -1;\n const prevSegmentIdx = (_b = nextFixedSegments === null || nextFixedSegments === void 0 ? void 0 : nextFixedSegments.findIndex(segment => segment.index === i - 1)) !== null && _b !== void 0 ? _b : -1; // Remove the previous fixed segment if it exists (i.e. the segment\n // which will be removed due to being parallel or too short)\n\n if (prevSegmentIdx !== -1) {\n nextFixedSegments.splice(prevSegmentIdx, 1);\n } // Remove the fixed segment status from the segment 2 steps back\n // if it is a fixed segment, because we are going to unify that\n // segment with the current one\n\n\n if (prevPrevSegmentIdx !== -1) {\n nextFixedSegments.splice(prevPrevSegmentIdx, 1);\n }\n\n nextPoints.splice(-2, 2); // Since we have to remove two segments, update any fixed segment\n\n nextFixedSegments.forEach(segment => {\n if (segment.index > i - 2) {\n segment.index -= 2;\n }\n }); // Remove aligned segment points\n\n const isHorizontal = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingForPointIsHorizontal)(p, points[i - 1]);\n return nextPoints.push((0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(!isHorizontal ? points[i - 2][0] : p[0], isHorizontal ? points[i - 2][1] : p[1]));\n }\n\n nextPoints.push(p);\n });\n\n const filteredNextFixedSegments = nextFixedSegments.filter(segment => segment.index !== 1 && segment.index !== nextPoints.length - 1);\n\n if (filteredNextFixedSegments.length === 0) {\n return normalizeArrowElementUpdate(getElbowArrowCornerPoints(removeElbowArrowShortSegments((_a = routeElbowArrow(arrow, getElbowArrowData(arrow, elementsMap, nextPoints.map(p => (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(p[0] - arrow.x, p[1] - arrow.y))))) !== null && _a !== void 0 ? _a : [])), filteredNextFixedSegments, null, null);\n }\n\n return normalizeArrowElementUpdate(nextPoints, filteredNextFixedSegments, arrow.startIsSpecial, arrow.endIsSpecial);\n }\n\n return {\n x: arrow.x,\n y: arrow.y,\n points: arrow.points,\n fixedSegments: arrow.fixedSegments,\n startIsSpecial: arrow.startIsSpecial,\n endIsSpecial: arrow.endIsSpecial\n };\n};\n\nconst handleSegmentRelease = (arrow, fixedSegments, elementsMap) => {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n\n const newFixedSegmentIndices = fixedSegments.map(segment => segment.index);\n const oldFixedSegmentIndices = (_b = (_a = arrow.fixedSegments) === null || _a === void 0 ? void 0 : _a.map(segment => segment.index)) !== null && _b !== void 0 ? _b : [];\n const deletedSegmentIdx = oldFixedSegmentIndices.findIndex(idx => !newFixedSegmentIndices.includes(idx));\n\n if (deletedSegmentIdx === -1 || !((_c = arrow.fixedSegments) === null || _c === void 0 ? void 0 : _c[deletedSegmentIdx])) {\n return {\n points: arrow.points\n };\n }\n\n const deletedIdx = arrow.fixedSegments[deletedSegmentIdx].index; // Find prev and next fixed segments\n\n const prevSegment = arrow.fixedSegments[deletedSegmentIdx - 1];\n const nextSegment = arrow.fixedSegments[deletedSegmentIdx + 1]; // We need to render a sub-arrow path to restore deleted segments\n\n const x = arrow.x + (prevSegment ? prevSegment.end[0] : 0);\n const y = arrow.y + (prevSegment ? prevSegment.end[1] : 0);\n\n const _j = getElbowArrowData({\n x,\n y,\n startBinding: prevSegment ? null : arrow.startBinding,\n endBinding: nextSegment ? null : arrow.endBinding,\n startArrowhead: null,\n endArrowhead: null\n }, elementsMap, [(0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(0, 0), (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + ((_d = nextSegment === null || nextSegment === void 0 ? void 0 : nextSegment.start[0]) !== null && _d !== void 0 ? _d : arrow.points[arrow.points.length - 1][0]) - x, arrow.y + ((_e = nextSegment === null || nextSegment === void 0 ? void 0 : nextSegment.start[1]) !== null && _e !== void 0 ? _e : arrow.points[arrow.points.length - 1][1]) - y)], {\n isDragging: false\n }),\n {\n startHeading,\n endHeading,\n startGlobalPoint,\n endGlobalPoint,\n hoveredStartElement,\n hoveredEndElement\n } = _j,\n rest = __rest(_j, [\"startHeading\", \"endHeading\", \"startGlobalPoint\", \"endGlobalPoint\", \"hoveredStartElement\", \"hoveredEndElement\"]);\n\n const {\n points: restoredPoints\n } = normalizeArrowElementUpdate(getElbowArrowCornerPoints(removeElbowArrowShortSegments((_f = routeElbowArrow(arrow, Object.assign({\n startHeading,\n endHeading,\n startGlobalPoint,\n endGlobalPoint,\n hoveredStartElement,\n hoveredEndElement\n }, rest))) !== null && _f !== void 0 ? _f : [])), fixedSegments, null, null);\n const nextPoints = []; // First part of the arrow are the old points\n\n if (prevSegment) {\n for (let i = 0; i < prevSegment.index; i++) {\n nextPoints.push((0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + arrow.points[i][0], arrow.y + arrow.points[i][1]));\n }\n }\n\n restoredPoints.forEach(p => {\n nextPoints.push((0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + (prevSegment ? prevSegment.end[0] : 0) + p[0], arrow.y + (prevSegment ? prevSegment.end[1] : 0) + p[1]));\n }); // Last part of the arrow are the old points too\n\n if (nextSegment) {\n for (let i = nextSegment.index; i < arrow.points.length; i++) {\n nextPoints.push((0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + arrow.points[i][0], arrow.y + arrow.points[i][1]));\n }\n } // Update nextFixedSegments\n\n\n const originalSegmentCountDiff = ((_g = nextSegment === null || nextSegment === void 0 ? void 0 : nextSegment.index) !== null && _g !== void 0 ? _g : arrow.points.length) - ((_h = prevSegment === null || prevSegment === void 0 ? void 0 : prevSegment.index) !== null && _h !== void 0 ? _h : 0) - 1;\n const nextFixedSegments = fixedSegments.map(segment => {\n if (segment.index > deletedIdx) {\n return Object.assign(Object.assign({}, segment), {\n index: segment.index - originalSegmentCountDiff + (restoredPoints.length - 1)\n });\n }\n\n return segment;\n });\n const simplifiedPoints = nextPoints.flatMap((p, i) => {\n const prev = nextPoints[i - 1];\n const next = nextPoints[i + 1];\n\n if (prev && next) {\n const prevHeading = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingForPoint)(p, prev);\n const nextHeading = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingForPoint)(next, p);\n\n if ((0,_heading__WEBPACK_IMPORTED_MODULE_6__.compareHeading)(prevHeading, nextHeading)) {\n // Update subsequent fixed segment indices\n nextFixedSegments.forEach(segment => {\n if (segment.index > i) {\n segment.index -= 1;\n }\n });\n return [];\n } else if ((0,_heading__WEBPACK_IMPORTED_MODULE_6__.compareHeading)(prevHeading, (0,_heading__WEBPACK_IMPORTED_MODULE_6__.flipHeading)(nextHeading))) {\n // Update subsequent fixed segment indices\n nextFixedSegments.forEach(segment => {\n if (segment.index > i) {\n segment.index += 1;\n }\n });\n return [p, p];\n }\n }\n\n return [p];\n });\n return normalizeArrowElementUpdate(simplifiedPoints, nextFixedSegments, false, false);\n};\n/**\n *\n */\n\n\nconst handleSegmentMove = (arrow, fixedSegments, startHeading, endHeading, hoveredStartElement, hoveredEndElement) => {\n var _a, _b, _c, _d;\n\n const activelyModifiedSegmentIdx = fixedSegments.map((segment, i) => {\n if (arrow.fixedSegments == null || arrow.fixedSegments[i] === undefined || arrow.fixedSegments[i].index !== segment.index) {\n return i;\n }\n\n return (segment.start[0] !== arrow.fixedSegments[i].start[0] && segment.end[0] !== arrow.fixedSegments[i].end[0]) !== (segment.start[1] !== arrow.fixedSegments[i].start[1] && segment.end[1] !== arrow.fixedSegments[i].end[1]) ? i : null;\n }).filter(idx => idx !== null).shift();\n\n if (activelyModifiedSegmentIdx == null) {\n return {\n points: arrow.points\n };\n }\n\n const firstSegmentIdx = (_b = (_a = arrow.fixedSegments) === null || _a === void 0 ? void 0 : _a.findIndex(segment => segment.index === 1)) !== null && _b !== void 0 ? _b : -1;\n const lastSegmentIdx = (_d = (_c = arrow.fixedSegments) === null || _c === void 0 ? void 0 : _c.findIndex(segment => segment.index === arrow.points.length - 1)) !== null && _d !== void 0 ? _d : -1; // Handle special case for first segment move\n\n const segmentLength = (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointDistance)(fixedSegments[activelyModifiedSegmentIdx].start, fixedSegments[activelyModifiedSegmentIdx].end);\n const segmentIsTooShort = segmentLength < BASE_PADDING + 5;\n\n if (firstSegmentIdx === -1 && fixedSegments[activelyModifiedSegmentIdx].index === 1 && hoveredStartElement) {\n const startIsHorizontal = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingIsHorizontal)(startHeading);\n const startIsPositive = startIsHorizontal ? (0,_heading__WEBPACK_IMPORTED_MODULE_6__.compareHeading)(startHeading, _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT) : (0,_heading__WEBPACK_IMPORTED_MODULE_6__.compareHeading)(startHeading, _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_DOWN);\n const padding = startIsPositive ? segmentIsTooShort ? segmentLength / 2 : BASE_PADDING : segmentIsTooShort ? -segmentLength / 2 : -BASE_PADDING;\n fixedSegments[activelyModifiedSegmentIdx].start = (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(fixedSegments[activelyModifiedSegmentIdx].start[0] + (startIsHorizontal ? padding : 0), fixedSegments[activelyModifiedSegmentIdx].start[1] + (!startIsHorizontal ? padding : 0));\n } // Handle special case for last segment move\n\n\n if (lastSegmentIdx === -1 && fixedSegments[activelyModifiedSegmentIdx].index === arrow.points.length - 1 && hoveredEndElement) {\n const endIsHorizontal = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingIsHorizontal)(endHeading);\n const endIsPositive = endIsHorizontal ? (0,_heading__WEBPACK_IMPORTED_MODULE_6__.compareHeading)(endHeading, _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT) : (0,_heading__WEBPACK_IMPORTED_MODULE_6__.compareHeading)(endHeading, _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_DOWN);\n const padding = endIsPositive ? segmentIsTooShort ? segmentLength / 2 : BASE_PADDING : segmentIsTooShort ? -segmentLength / 2 : -BASE_PADDING;\n fixedSegments[activelyModifiedSegmentIdx].end = (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(fixedSegments[activelyModifiedSegmentIdx].end[0] + (endIsHorizontal ? padding : 0), fixedSegments[activelyModifiedSegmentIdx].end[1] + (!endIsHorizontal ? padding : 0));\n } // Translate all fixed segments to global coordinates\n\n\n const nextFixedSegments = fixedSegments.map(segment => Object.assign(Object.assign({}, segment), {\n start: (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + segment.start[0], arrow.y + segment.start[1]),\n end: (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + segment.end[0], arrow.y + segment.end[1])\n })); // For start, clone old arrow points\n\n const newPoints = arrow.points.map((p, i) => (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + p[0], arrow.y + p[1]));\n const startIdx = nextFixedSegments[activelyModifiedSegmentIdx].index - 1;\n const endIdx = nextFixedSegments[activelyModifiedSegmentIdx].index;\n const start = nextFixedSegments[activelyModifiedSegmentIdx].start;\n const end = nextFixedSegments[activelyModifiedSegmentIdx].end;\n const prevSegmentIsHorizontal = newPoints[startIdx - 1] && !(0,_math__WEBPACK_IMPORTED_MODULE_0__.pointsEqual)(newPoints[startIdx], newPoints[startIdx - 1]) ? (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingForPointIsHorizontal)(newPoints[startIdx - 1], newPoints[startIdx]) : undefined;\n const nextSegmentIsHorizontal = newPoints[endIdx + 1] && !(0,_math__WEBPACK_IMPORTED_MODULE_0__.pointsEqual)(newPoints[endIdx], newPoints[endIdx + 1]) ? (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingForPointIsHorizontal)(newPoints[endIdx + 1], newPoints[endIdx]) : undefined; // Override the segment points with the actively moved fixed segment\n\n if (prevSegmentIsHorizontal !== undefined) {\n const dir = prevSegmentIsHorizontal ? 1 : 0;\n newPoints[startIdx - 1][dir] = start[dir];\n }\n\n newPoints[startIdx] = start;\n newPoints[endIdx] = end;\n\n if (nextSegmentIsHorizontal !== undefined) {\n const dir = nextSegmentIsHorizontal ? 1 : 0;\n newPoints[endIdx + 1][dir] = end[dir];\n } // Override neighboring fixedSegment start/end points, if any\n\n\n const prevSegmentIdx = nextFixedSegments.findIndex(segment => segment.index === startIdx);\n\n if (prevSegmentIdx !== -1) {\n // Align the next segment points with the moved segment\n const dir = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingForPointIsHorizontal)(nextFixedSegments[prevSegmentIdx].end, nextFixedSegments[prevSegmentIdx].start) ? 1 : 0;\n nextFixedSegments[prevSegmentIdx].start[dir] = start[dir];\n nextFixedSegments[prevSegmentIdx].end = start;\n }\n\n const nextSegmentIdx = nextFixedSegments.findIndex(segment => segment.index === endIdx + 1);\n\n if (nextSegmentIdx !== -1) {\n // Align the next segment points with the moved segment\n const dir = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingForPointIsHorizontal)(nextFixedSegments[nextSegmentIdx].end, nextFixedSegments[nextSegmentIdx].start) ? 1 : 0;\n nextFixedSegments[nextSegmentIdx].end[dir] = end[dir];\n nextFixedSegments[nextSegmentIdx].start = end;\n } // First segment move needs an additional segment\n\n\n if (firstSegmentIdx === -1 && startIdx === 0) {\n const startIsHorizontal = hoveredStartElement ? (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingIsHorizontal)(startHeading) : (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingForPointIsHorizontal)(newPoints[1], newPoints[0]);\n newPoints.unshift((0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(startIsHorizontal ? start[0] : arrow.x + arrow.points[0][0], !startIsHorizontal ? start[1] : arrow.y + arrow.points[0][1]));\n\n if (hoveredStartElement) {\n newPoints.unshift((0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + arrow.points[0][0], arrow.y + arrow.points[0][1]));\n }\n\n for (const segment of nextFixedSegments) {\n segment.index += hoveredStartElement ? 2 : 1;\n }\n } // Last segment move needs an additional segment\n\n\n if (lastSegmentIdx === -1 && endIdx === arrow.points.length - 1) {\n const endIsHorizontal = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingIsHorizontal)(endHeading);\n newPoints.push((0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(endIsHorizontal ? end[0] : arrow.x + arrow.points[arrow.points.length - 1][0], !endIsHorizontal ? end[1] : arrow.y + arrow.points[arrow.points.length - 1][1]));\n\n if (hoveredEndElement) {\n newPoints.push((0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + arrow.points[arrow.points.length - 1][0], arrow.y + arrow.points[arrow.points.length - 1][1]));\n }\n }\n\n return normalizeArrowElementUpdate(newPoints, nextFixedSegments.map(segment => Object.assign(Object.assign({}, segment), {\n start: (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(segment.start[0] - arrow.x, segment.start[1] - arrow.y),\n end: (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(segment.end[0] - arrow.x, segment.end[1] - arrow.y)\n })), false, // If you move a segment, there is no special point anymore\n false);\n};\n\nconst handleEndpointDrag = (arrow, updatedPoints, fixedSegments, startHeading, endHeading, startGlobalPoint, endGlobalPoint, hoveredStartElement, hoveredEndElement) => {\n var _a, _b;\n\n let startIsSpecial = (_a = arrow.startIsSpecial) !== null && _a !== void 0 ? _a : null;\n let endIsSpecial = (_b = arrow.endIsSpecial) !== null && _b !== void 0 ? _b : null;\n const globalUpdatedPoints = updatedPoints.map((p, i) => i === 0 ? (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + p[0], arrow.y + p[1]) : i === updatedPoints.length - 1 ? (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + p[0], arrow.y + p[1]) : (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + arrow.points[i][0], arrow.y + arrow.points[i][1]));\n const nextFixedSegments = fixedSegments.map(segment => Object.assign(Object.assign({}, segment), {\n start: (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + (segment.start[0] - updatedPoints[0][0]), arrow.y + (segment.start[1] - updatedPoints[0][1])),\n end: (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + (segment.end[0] - updatedPoints[0][0]), arrow.y + (segment.end[1] - updatedPoints[0][1]))\n }));\n const newPoints = []; // Add the inside points\n\n const offset = 2 + (startIsSpecial ? 1 : 0);\n const endOffset = 2 + (endIsSpecial ? 1 : 0);\n\n while (newPoints.length + offset < globalUpdatedPoints.length - endOffset) {\n newPoints.push(globalUpdatedPoints[newPoints.length + offset]);\n } // Calculate the moving second point connection and add the start point\n\n\n {\n const secondPoint = globalUpdatedPoints[startIsSpecial ? 2 : 1];\n const thirdPoint = globalUpdatedPoints[startIsSpecial ? 3 : 2];\n const startIsHorizontal = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingIsHorizontal)(startHeading);\n const secondIsHorizontal = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingIsHorizontal)((0,_heading__WEBPACK_IMPORTED_MODULE_6__.vectorToHeading)((0,_math__WEBPACK_IMPORTED_MODULE_0__.vectorFromPoint)(secondPoint, thirdPoint)));\n\n if (hoveredStartElement && startIsHorizontal === secondIsHorizontal) {\n const positive = startIsHorizontal ? (0,_heading__WEBPACK_IMPORTED_MODULE_6__.compareHeading)(startHeading, _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT) : (0,_heading__WEBPACK_IMPORTED_MODULE_6__.compareHeading)(startHeading, _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_DOWN);\n newPoints.unshift((0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(!secondIsHorizontal ? thirdPoint[0] : startGlobalPoint[0] + (positive ? BASE_PADDING : -BASE_PADDING), secondIsHorizontal ? thirdPoint[1] : startGlobalPoint[1] + (positive ? BASE_PADDING : -BASE_PADDING)));\n newPoints.unshift((0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(startIsHorizontal ? startGlobalPoint[0] + (positive ? BASE_PADDING : -BASE_PADDING) : startGlobalPoint[0], !startIsHorizontal ? startGlobalPoint[1] + (positive ? BASE_PADDING : -BASE_PADDING) : startGlobalPoint[1]));\n\n if (!startIsSpecial) {\n startIsSpecial = true;\n\n for (const segment of nextFixedSegments) {\n if (segment.index > 1) {\n segment.index += 1;\n }\n }\n }\n } else {\n newPoints.unshift((0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(!secondIsHorizontal ? secondPoint[0] : startGlobalPoint[0], secondIsHorizontal ? secondPoint[1] : startGlobalPoint[1]));\n\n if (startIsSpecial) {\n startIsSpecial = false;\n\n for (const segment of nextFixedSegments) {\n if (segment.index > 1) {\n segment.index -= 1;\n }\n }\n }\n }\n\n newPoints.unshift(startGlobalPoint);\n } // Calculate the moving second to last point connection\n\n {\n const secondToLastPoint = globalUpdatedPoints[globalUpdatedPoints.length - (endIsSpecial ? 3 : 2)];\n const thirdToLastPoint = globalUpdatedPoints[globalUpdatedPoints.length - (endIsSpecial ? 4 : 3)];\n const endIsHorizontal = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingIsHorizontal)(endHeading);\n const secondIsHorizontal = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.headingForPointIsHorizontal)(thirdToLastPoint, secondToLastPoint);\n\n if (hoveredEndElement && endIsHorizontal === secondIsHorizontal) {\n const positive = endIsHorizontal ? (0,_heading__WEBPACK_IMPORTED_MODULE_6__.compareHeading)(endHeading, _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT) : (0,_heading__WEBPACK_IMPORTED_MODULE_6__.compareHeading)(endHeading, _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_DOWN);\n newPoints.push((0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(!secondIsHorizontal ? thirdToLastPoint[0] : endGlobalPoint[0] + (positive ? BASE_PADDING : -BASE_PADDING), secondIsHorizontal ? thirdToLastPoint[1] : endGlobalPoint[1] + (positive ? BASE_PADDING : -BASE_PADDING)));\n newPoints.push((0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(endIsHorizontal ? endGlobalPoint[0] + (positive ? BASE_PADDING : -BASE_PADDING) : endGlobalPoint[0], !endIsHorizontal ? endGlobalPoint[1] + (positive ? BASE_PADDING : -BASE_PADDING) : endGlobalPoint[1]));\n\n if (!endIsSpecial) {\n endIsSpecial = true;\n }\n } else {\n newPoints.push((0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(!secondIsHorizontal ? secondToLastPoint[0] : endGlobalPoint[0], secondIsHorizontal ? secondToLastPoint[1] : endGlobalPoint[1]));\n\n if (endIsSpecial) {\n endIsSpecial = false;\n }\n }\n }\n newPoints.push(endGlobalPoint);\n return normalizeArrowElementUpdate(newPoints, nextFixedSegments.map(({\n index\n }) => ({\n index,\n start: newPoints[index - 1],\n end: newPoints[index]\n })).map(segment => Object.assign(Object.assign({}, segment), {\n start: (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(segment.start[0] - startGlobalPoint[0], segment.start[1] - startGlobalPoint[1]),\n end: (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(segment.end[0] - startGlobalPoint[0], segment.end[1] - startGlobalPoint[1])\n })), startIsSpecial, endIsSpecial);\n};\n/**\n *\n */\n\n\nconst updateElbowArrowPoints = (arrow, elementsMap, updates, options) => {\n var _a, _b, _c, _d, _e, _f;\n\n if (arrow.points.length < 2) {\n return {\n points: (_a = updates.points) !== null && _a !== void 0 ? _a : arrow.points\n };\n }\n\n if (true) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_4__.invariant)(!updates.points || updates.points.length >= 2, \"Updated point array length must match the arrow point length, contain \" + \"exactly the new start and end points or not be specified at all (i.e. \" + \"you can't add new points between start and end manually to elbow arrows)\");\n (0,_utils__WEBPACK_IMPORTED_MODULE_4__.invariant)(!arrow.fixedSegments || arrow.fixedSegments.map(s => s.start[0] === s.end[0] || s.start[1] === s.end[1]).every(Boolean), \"Fixed segments must be either horizontal or vertical\");\n (0,_utils__WEBPACK_IMPORTED_MODULE_4__.invariant)(!updates.fixedSegments || updates.fixedSegments.map(s => s.start[0] === s.end[0] || s.start[1] === s.end[1]).every(Boolean), \"Updates to fixed segments must be either horizontal or vertical\");\n (0,_utils__WEBPACK_IMPORTED_MODULE_4__.invariant)(arrow.points.slice(1).map((p, i) => p[0] === arrow.points[i][0] || p[1] === arrow.points[i][1]), \"Elbow arrow segments must be either horizontal or vertical\");\n } // 0. During all element replacement in the scene, we just need to renormalize\n // the arrow\n // TODO (dwelle,mtolmacs): Remove this once Scene.getScene() is removed\n\n\n if (elementsMap.size === 0 && updates.points) {\n return normalizeArrowElementUpdate(updates.points.map(p => (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(arrow.x + p[0], arrow.y + p[1])), arrow.fixedSegments, arrow.startIsSpecial, arrow.endIsSpecial);\n }\n\n const updatedPoints = updates.points ? updates.points && updates.points.length === 2 ? arrow.points.map((p, idx) => idx === 0 ? updates.points[0] : idx === arrow.points.length - 1 ? updates.points[1] : p) : structuredClone(updates.points) : structuredClone(arrow.points);\n\n const _g = getElbowArrowData(arrow, elementsMap, updatedPoints, options),\n {\n startHeading,\n endHeading,\n startGlobalPoint,\n endGlobalPoint,\n hoveredStartElement,\n hoveredEndElement\n } = _g,\n rest = __rest(_g, [\"startHeading\", \"endHeading\", \"startGlobalPoint\", \"endGlobalPoint\", \"hoveredStartElement\", \"hoveredEndElement\"]);\n\n const fixedSegments = (_c = (_b = updates.fixedSegments) !== null && _b !== void 0 ? _b : arrow.fixedSegments) !== null && _c !== void 0 ? _c : []; ////\n // 1. Renormalize the arrow\n ////\n\n if (!updates.points && !updates.fixedSegments) {\n return handleSegmentRenormalization(arrow, elementsMap);\n } ////\n // 2. Just normal elbow arrow things\n ////\n\n\n if (fixedSegments.length === 0) {\n return normalizeArrowElementUpdate(getElbowArrowCornerPoints(removeElbowArrowShortSegments((_d = routeElbowArrow(arrow, Object.assign({\n startHeading,\n endHeading,\n startGlobalPoint,\n endGlobalPoint,\n hoveredStartElement,\n hoveredEndElement\n }, rest))) !== null && _d !== void 0 ? _d : [])), fixedSegments, null, null);\n } ////\n // 3. Handle releasing a fixed segment\n\n\n if (((_f = (_e = arrow.fixedSegments) === null || _e === void 0 ? void 0 : _e.length) !== null && _f !== void 0 ? _f : 0) > fixedSegments.length) {\n return handleSegmentRelease(arrow, fixedSegments, elementsMap);\n } ////\n // 4. Handle manual segment move\n ////\n\n\n if (!updates.points) {\n return handleSegmentMove(arrow, fixedSegments, startHeading, endHeading, hoveredStartElement, hoveredEndElement);\n } ////\n // 5. Handle resize\n\n\n if (updates.points && updates.fixedSegments) {\n return updates;\n } ////\n // 6. One or more segments are fixed and endpoints are moved\n //\n // The key insights are:\n // - When segments are fixed, the arrow will keep the exact amount of segments\n // - Fixed segments are \"replacements\" for exactly one segment in the old arrow\n ////\n\n\n return handleEndpointDrag(arrow, updatedPoints, fixedSegments, startHeading, endHeading, startGlobalPoint, endGlobalPoint, hoveredStartElement, hoveredEndElement);\n};\n/**\n * Retrieves data necessary for calculating the elbow arrow path.\n *\n * @param arrow - The arrow object containing its properties.\n * @param elementsMap - A map of elements in the scene.\n * @param nextPoints - The next set of points for the arrow.\n * @param options - Optional parameters for the calculation.\n * @param options.isDragging - Indicates if the arrow is being dragged.\n * @param options.startIsMidPoint - Indicates if the start point is a midpoint.\n * @param options.endIsMidPoint - Indicates if the end point is a midpoint.\n *\n * @returns An object containing various properties needed for elbow arrow calculations:\n * - dynamicAABBs: Dynamically generated axis-aligned bounding boxes.\n * - startDonglePosition: The position of the start dongle.\n * - startGlobalPoint: The global coordinates of the start point.\n * - startHeading: The heading direction from the start point.\n * - endDonglePosition: The position of the end dongle.\n * - endGlobalPoint: The global coordinates of the end point.\n * - endHeading: The heading direction from the end point.\n * - commonBounds: The common bounding box that encompasses both start and end points.\n * - hoveredStartElement: The element being hovered over at the start point.\n * - hoveredEndElement: The element being hovered over at the end point.\n */\n\nconst getElbowArrowData = (arrow, elementsMap, nextPoints, options) => {\n var _a, _b;\n\n const origStartGlobalPoint = (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointTranslate)(nextPoints[0], (0,_math__WEBPACK_IMPORTED_MODULE_0__.vector)(arrow.x, arrow.y));\n const origEndGlobalPoint = (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointTranslate)(nextPoints[nextPoints.length - 1], (0,_math__WEBPACK_IMPORTED_MODULE_0__.vector)(arrow.x, arrow.y));\n const startElement = arrow.startBinding && getBindableElementForId(arrow.startBinding.elementId, elementsMap);\n const endElement = arrow.endBinding && getBindableElementForId(arrow.endBinding.elementId, elementsMap);\n const [hoveredStartElement, hoveredEndElement] = (options === null || options === void 0 ? void 0 : options.isDragging) ? getHoveredElements(origStartGlobalPoint, origEndGlobalPoint, elementsMap, options === null || options === void 0 ? void 0 : options.zoom) : [startElement, endElement];\n const startGlobalPoint = getGlobalPoint((_a = arrow.startBinding) === null || _a === void 0 ? void 0 : _a.fixedPoint, origStartGlobalPoint, origEndGlobalPoint, elementsMap, startElement, hoveredStartElement, options === null || options === void 0 ? void 0 : options.isDragging);\n const endGlobalPoint = getGlobalPoint((_b = arrow.endBinding) === null || _b === void 0 ? void 0 : _b.fixedPoint, origEndGlobalPoint, origStartGlobalPoint, elementsMap, endElement, hoveredEndElement, options === null || options === void 0 ? void 0 : options.isDragging);\n const startHeading = getBindPointHeading(startGlobalPoint, endGlobalPoint, elementsMap, hoveredStartElement, origStartGlobalPoint);\n const endHeading = getBindPointHeading(endGlobalPoint, startGlobalPoint, elementsMap, hoveredEndElement, origEndGlobalPoint);\n const startPointBounds = [startGlobalPoint[0] - 2, startGlobalPoint[1] - 2, startGlobalPoint[0] + 2, startGlobalPoint[1] + 2];\n const endPointBounds = [endGlobalPoint[0] - 2, endGlobalPoint[1] - 2, endGlobalPoint[0] + 2, endGlobalPoint[1] + 2];\n const startElementBounds = hoveredStartElement ? (0,_shapes__WEBPACK_IMPORTED_MODULE_3__.aabbForElement)(hoveredStartElement, offsetFromHeading(startHeading, arrow.startArrowhead ? _binding__WEBPACK_IMPORTED_MODULE_5__.FIXED_BINDING_DISTANCE * 6 : _binding__WEBPACK_IMPORTED_MODULE_5__.FIXED_BINDING_DISTANCE * 2, 1)) : startPointBounds;\n const endElementBounds = hoveredEndElement ? (0,_shapes__WEBPACK_IMPORTED_MODULE_3__.aabbForElement)(hoveredEndElement, offsetFromHeading(endHeading, arrow.endArrowhead ? _binding__WEBPACK_IMPORTED_MODULE_5__.FIXED_BINDING_DISTANCE * 6 : _binding__WEBPACK_IMPORTED_MODULE_5__.FIXED_BINDING_DISTANCE * 2, 1)) : endPointBounds;\n const boundsOverlap = (0,_shapes__WEBPACK_IMPORTED_MODULE_3__.pointInsideBounds)(startGlobalPoint, hoveredEndElement ? (0,_shapes__WEBPACK_IMPORTED_MODULE_3__.aabbForElement)(hoveredEndElement, offsetFromHeading(endHeading, BASE_PADDING, BASE_PADDING)) : endPointBounds) || (0,_shapes__WEBPACK_IMPORTED_MODULE_3__.pointInsideBounds)(endGlobalPoint, hoveredStartElement ? (0,_shapes__WEBPACK_IMPORTED_MODULE_3__.aabbForElement)(hoveredStartElement, offsetFromHeading(startHeading, BASE_PADDING, BASE_PADDING)) : startPointBounds);\n const commonBounds = commonAABB(boundsOverlap ? [startPointBounds, endPointBounds] : [startElementBounds, endElementBounds]);\n const dynamicAABBs = generateDynamicAABBs(boundsOverlap ? startPointBounds : startElementBounds, boundsOverlap ? endPointBounds : endElementBounds, commonBounds, boundsOverlap ? offsetFromHeading(startHeading, !hoveredStartElement && !hoveredEndElement ? 0 : BASE_PADDING, 0) : offsetFromHeading(startHeading, !hoveredStartElement && !hoveredEndElement ? 0 : BASE_PADDING - (arrow.startArrowhead ? _binding__WEBPACK_IMPORTED_MODULE_5__.FIXED_BINDING_DISTANCE * 6 : _binding__WEBPACK_IMPORTED_MODULE_5__.FIXED_BINDING_DISTANCE * 2), BASE_PADDING), boundsOverlap ? offsetFromHeading(endHeading, !hoveredStartElement && !hoveredEndElement ? 0 : BASE_PADDING, 0) : offsetFromHeading(endHeading, !hoveredStartElement && !hoveredEndElement ? 0 : BASE_PADDING - (arrow.endArrowhead ? _binding__WEBPACK_IMPORTED_MODULE_5__.FIXED_BINDING_DISTANCE * 6 : _binding__WEBPACK_IMPORTED_MODULE_5__.FIXED_BINDING_DISTANCE * 2), BASE_PADDING), boundsOverlap, hoveredStartElement && (0,_shapes__WEBPACK_IMPORTED_MODULE_3__.aabbForElement)(hoveredStartElement), hoveredEndElement && (0,_shapes__WEBPACK_IMPORTED_MODULE_3__.aabbForElement)(hoveredEndElement));\n const startDonglePosition = getDonglePosition(dynamicAABBs[0], startHeading, startGlobalPoint);\n const endDonglePosition = getDonglePosition(dynamicAABBs[1], endHeading, endGlobalPoint);\n return {\n dynamicAABBs,\n startDonglePosition,\n startGlobalPoint,\n startHeading,\n endDonglePosition,\n endGlobalPoint,\n endHeading,\n commonBounds,\n hoveredStartElement,\n hoveredEndElement,\n boundsOverlap,\n startElementBounds,\n endElementBounds\n };\n};\n/**\n * Generate the elbow arrow segments\n *\n * @param arrow\n * @param elementsMap\n * @param nextPoints\n * @param options\n * @returns\n */\n\n\nconst routeElbowArrow = (arrow, elbowArrowData) => {\n const {\n dynamicAABBs,\n startDonglePosition,\n startGlobalPoint,\n startHeading,\n endDonglePosition,\n endGlobalPoint,\n endHeading,\n commonBounds,\n hoveredEndElement\n } = elbowArrowData; // Canculate Grid positions\n\n const grid = calculateGrid(dynamicAABBs, startDonglePosition ? startDonglePosition : startGlobalPoint, startHeading, endDonglePosition ? endDonglePosition : endGlobalPoint, endHeading, commonBounds);\n const startDongle = startDonglePosition && pointToGridNode(startDonglePosition, grid);\n const endDongle = endDonglePosition && pointToGridNode(endDonglePosition, grid); // Do not allow stepping on the true end or true start points\n\n const endNode = pointToGridNode(endGlobalPoint, grid);\n\n if (endNode && hoveredEndElement) {\n endNode.closed = true;\n }\n\n const startNode = pointToGridNode(startGlobalPoint, grid);\n\n if (startNode && arrow.startBinding) {\n startNode.closed = true;\n }\n\n const dongleOverlap = startDongle && endDongle && ((0,_shapes__WEBPACK_IMPORTED_MODULE_3__.pointInsideBounds)(startDongle.pos, dynamicAABBs[1]) || (0,_shapes__WEBPACK_IMPORTED_MODULE_3__.pointInsideBounds)(endDongle.pos, dynamicAABBs[0])); // Create path to end dongle from start dongle\n\n const path = astar(startDongle ? startDongle : startNode, endDongle ? endDongle : endNode, grid, startHeading ? startHeading : _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT, endHeading ? endHeading : _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT, dongleOverlap ? [] : dynamicAABBs);\n\n if (path) {\n const points = path.map(node => [node.pos[0], node.pos[1]]);\n startDongle && points.unshift(startGlobalPoint);\n endDongle && points.push(endGlobalPoint);\n return points;\n }\n\n return null;\n};\n\nconst offsetFromHeading = (heading, head, side) => {\n switch (heading) {\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_UP:\n return [head, side, side, side];\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT:\n return [side, head, side, side];\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_DOWN:\n return [side, side, head, side];\n }\n\n return [side, side, side, head];\n};\n/**\n * Routing algorithm based on the A* path search algorithm.\n * @see https://www.geeksforgeeks.org/a-search-algorithm/\n *\n * Binary heap is used to optimize node lookup.\n * See {@link calculateGrid} for the grid calculation details.\n *\n * Additional modifications added due to aesthetic route reasons:\n * 1) Arrow segment direction change is penalized by specific linear constant (bendMultiplier)\n * 2) Arrow segments are not allowed to go \"backwards\", overlapping with the previous segment\n */\n\n\nconst astar = (start, end, grid, startHeading, endHeading, aabbs) => {\n const bendMultiplier = m_dist(start.pos, end.pos);\n const open = new _binaryheap__WEBPACK_IMPORTED_MODULE_1__[\"default\"](node => node.f);\n open.push(start);\n\n while (open.size() > 0) {\n // Grab the lowest f(x) to process next. Heap keeps this sorted for us.\n const current = open.pop();\n\n if (!current || current.closed) {\n // Current is not passable, continue with next element\n continue;\n } // End case -- result has been found, return the traced path.\n\n\n if (current === end) {\n return pathTo(start, current);\n } // Normal case -- move current from open to closed, process each of its neighbors.\n\n\n current.closed = true; // Find all neighbors for the current node.\n\n const neighbors = getNeighbors(current.addr, grid);\n\n for (let i = 0; i < 4; i++) {\n const neighbor = neighbors[i];\n\n if (!neighbor || neighbor.closed) {\n // Not a valid node to process, skip to next neighbor.\n continue;\n } // Intersect\n\n\n const neighborHalfPoint = (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointScaleFromOrigin)(neighbor.pos, current.pos, 0.5);\n\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_4__.isAnyTrue)(...aabbs.map(aabb => (0,_shapes__WEBPACK_IMPORTED_MODULE_3__.pointInsideBounds)(neighborHalfPoint, aabb)))) {\n continue;\n } // The g score is the shortest distance from start to current node.\n // We need to check if the path we have arrived at this neighbor is the shortest one we have seen yet.\n\n\n const neighborHeading = neighborIndexToHeading(i);\n const previousDirection = current.parent ? (0,_heading__WEBPACK_IMPORTED_MODULE_6__.vectorToHeading)((0,_math__WEBPACK_IMPORTED_MODULE_0__.vectorFromPoint)(current.pos, current.parent.pos)) : startHeading; // Do not allow going in reverse\n\n const reverseHeading = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.flipHeading)(previousDirection);\n const neighborIsReverseRoute = (0,_heading__WEBPACK_IMPORTED_MODULE_6__.compareHeading)(reverseHeading, neighborHeading) || gridAddressesEqual(start.addr, neighbor.addr) && (0,_heading__WEBPACK_IMPORTED_MODULE_6__.compareHeading)(neighborHeading, startHeading) || gridAddressesEqual(end.addr, neighbor.addr) && (0,_heading__WEBPACK_IMPORTED_MODULE_6__.compareHeading)(neighborHeading, endHeading);\n\n if (neighborIsReverseRoute) {\n continue;\n }\n\n const directionChange = previousDirection !== neighborHeading;\n const gScore = current.g + m_dist(neighbor.pos, current.pos) + (directionChange ? Math.pow(bendMultiplier, 3) : 0);\n const beenVisited = neighbor.visited;\n\n if (!beenVisited || gScore < neighbor.g) {\n const estBendCount = estimateSegmentCount(neighbor, end, neighborHeading, endHeading); // Found an optimal (so far) path to this node. Take score for node to see how good it is.\n\n neighbor.visited = true;\n neighbor.parent = current;\n neighbor.h = m_dist(end.pos, neighbor.pos) + estBendCount * Math.pow(bendMultiplier, 2);\n neighbor.g = gScore;\n neighbor.f = neighbor.g + neighbor.h;\n\n if (!beenVisited) {\n // Pushing to heap will put it in proper place based on the 'f' value.\n open.push(neighbor);\n } else {\n // Already seen the node, but since it has been rescored we need to reorder it in the heap\n open.rescoreElement(neighbor);\n }\n }\n }\n }\n\n return null;\n};\n\nconst pathTo = (start, node) => {\n let curr = node;\n const path = [];\n\n while (curr.parent) {\n path.unshift(curr);\n curr = curr.parent;\n }\n\n path.unshift(start);\n return path;\n};\n\nconst m_dist = (a, b) => Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1]);\n/**\n * Create dynamically resizing, always touching\n * bounding boxes having a minimum extent represented\n * by the given static bounds.\n */\n\n\nconst generateDynamicAABBs = (a, b, common, startDifference, endDifference, disableSideHack, startElementBounds, endElementBounds) => {\n const startEl = startElementBounds !== null && startElementBounds !== void 0 ? startElementBounds : a;\n const endEl = endElementBounds !== null && endElementBounds !== void 0 ? endElementBounds : b;\n const [startUp, startRight, startDown, startLeft] = startDifference !== null && startDifference !== void 0 ? startDifference : [0, 0, 0, 0];\n const [endUp, endRight, endDown, endLeft] = endDifference !== null && endDifference !== void 0 ? endDifference : [0, 0, 0, 0];\n const first = [a[0] > b[2] ? a[1] > b[3] || a[3] < b[1] ? Math.min((startEl[0] + endEl[2]) / 2, a[0] - startLeft) : (startEl[0] + endEl[2]) / 2 : a[0] > b[0] ? a[0] - startLeft : common[0] - startLeft, a[1] > b[3] ? a[0] > b[2] || a[2] < b[0] ? Math.min((startEl[1] + endEl[3]) / 2, a[1] - startUp) : (startEl[1] + endEl[3]) / 2 : a[1] > b[1] ? a[1] - startUp : common[1] - startUp, a[2] < b[0] ? a[1] > b[3] || a[3] < b[1] ? Math.max((startEl[2] + endEl[0]) / 2, a[2] + startRight) : (startEl[2] + endEl[0]) / 2 : a[2] < b[2] ? a[2] + startRight : common[2] + startRight, a[3] < b[1] ? a[0] > b[2] || a[2] < b[0] ? Math.max((startEl[3] + endEl[1]) / 2, a[3] + startDown) : (startEl[3] + endEl[1]) / 2 : a[3] < b[3] ? a[3] + startDown : common[3] + startDown];\n const second = [b[0] > a[2] ? b[1] > a[3] || b[3] < a[1] ? Math.min((endEl[0] + startEl[2]) / 2, b[0] - endLeft) : (endEl[0] + startEl[2]) / 2 : b[0] > a[0] ? b[0] - endLeft : common[0] - endLeft, b[1] > a[3] ? b[0] > a[2] || b[2] < a[0] ? Math.min((endEl[1] + startEl[3]) / 2, b[1] - endUp) : (endEl[1] + startEl[3]) / 2 : b[1] > a[1] ? b[1] - endUp : common[1] - endUp, b[2] < a[0] ? b[1] > a[3] || b[3] < a[1] ? Math.max((endEl[2] + startEl[0]) / 2, b[2] + endRight) : (endEl[2] + startEl[0]) / 2 : b[2] < a[2] ? b[2] + endRight : common[2] + endRight, b[3] < a[1] ? b[0] > a[2] || b[2] < a[0] ? Math.max((endEl[3] + startEl[1]) / 2, b[3] + endDown) : (endEl[3] + startEl[1]) / 2 : b[3] < a[3] ? b[3] + endDown : common[3] + endDown];\n const c = commonAABB([first, second]);\n\n if (!disableSideHack && first[2] - first[0] + second[2] - second[0] > c[2] - c[0] + 0.00000000001 && first[3] - first[1] + second[3] - second[1] > c[3] - c[1] + 0.00000000001) {\n const [endCenterX, endCenterY] = [(second[0] + second[2]) / 2, (second[1] + second[3]) / 2];\n\n if (b[0] > a[2] && a[1] > b[3]) {\n // BOTTOM LEFT\n const cX = first[2] + (second[0] - first[2]) / 2;\n const cY = second[3] + (first[1] - second[3]) / 2;\n\n if ((0,_math__WEBPACK_IMPORTED_MODULE_0__.vectorCross)((0,_math__WEBPACK_IMPORTED_MODULE_0__.vector)(a[2] - endCenterX, a[1] - endCenterY), (0,_math__WEBPACK_IMPORTED_MODULE_0__.vector)(a[0] - endCenterX, a[3] - endCenterY)) > 0) {\n return [[first[0], first[1], cX, first[3]], [cX, second[1], second[2], second[3]]];\n }\n\n return [[first[0], cY, first[2], first[3]], [second[0], second[1], second[2], cY]];\n } else if (a[2] < b[0] && a[3] < b[1]) {\n // TOP LEFT\n const cX = first[2] + (second[0] - first[2]) / 2;\n const cY = first[3] + (second[1] - first[3]) / 2;\n\n if ((0,_math__WEBPACK_IMPORTED_MODULE_0__.vectorCross)((0,_math__WEBPACK_IMPORTED_MODULE_0__.vector)(a[0] - endCenterX, a[1] - endCenterY), (0,_math__WEBPACK_IMPORTED_MODULE_0__.vector)(a[2] - endCenterX, a[3] - endCenterY)) > 0) {\n return [[first[0], first[1], first[2], cY], [second[0], cY, second[2], second[3]]];\n }\n\n return [[first[0], first[1], cX, first[3]], [cX, second[1], second[2], second[3]]];\n } else if (a[0] > b[2] && a[3] < b[1]) {\n // TOP RIGHT\n const cX = second[2] + (first[0] - second[2]) / 2;\n const cY = first[3] + (second[1] - first[3]) / 2;\n\n if ((0,_math__WEBPACK_IMPORTED_MODULE_0__.vectorCross)((0,_math__WEBPACK_IMPORTED_MODULE_0__.vector)(a[2] - endCenterX, a[1] - endCenterY), (0,_math__WEBPACK_IMPORTED_MODULE_0__.vector)(a[0] - endCenterX, a[3] - endCenterY)) > 0) {\n return [[cX, first[1], first[2], first[3]], [second[0], second[1], cX, second[3]]];\n }\n\n return [[first[0], first[1], first[2], cY], [second[0], cY, second[2], second[3]]];\n } else if (a[0] > b[2] && a[1] > b[3]) {\n // BOTTOM RIGHT\n const cX = second[2] + (first[0] - second[2]) / 2;\n const cY = second[3] + (first[1] - second[3]) / 2;\n\n if ((0,_math__WEBPACK_IMPORTED_MODULE_0__.vectorCross)((0,_math__WEBPACK_IMPORTED_MODULE_0__.vector)(a[0] - endCenterX, a[1] - endCenterY), (0,_math__WEBPACK_IMPORTED_MODULE_0__.vector)(a[2] - endCenterX, a[3] - endCenterY)) > 0) {\n return [[cX, first[1], first[2], first[3]], [second[0], second[1], cX, second[3]]];\n }\n\n return [[first[0], cY, first[2], first[3]], [second[0], second[1], second[2], cY]];\n }\n }\n\n return [first, second];\n};\n/**\n * Calculates the grid which is used as nodes at\n * the grid line intersections by the A* algorithm.\n *\n * NOTE: This is not a uniform grid. It is built at\n * various intersections of bounding boxes.\n */\n\n\nconst calculateGrid = (aabbs, start, startHeading, end, endHeading, common) => {\n const horizontal = new Set();\n const vertical = new Set();\n\n if (startHeading === _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_LEFT || startHeading === _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT) {\n vertical.add(start[1]);\n } else {\n horizontal.add(start[0]);\n }\n\n if (endHeading === _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_LEFT || endHeading === _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT) {\n vertical.add(end[1]);\n } else {\n horizontal.add(end[0]);\n }\n\n aabbs.forEach(aabb => {\n horizontal.add(aabb[0]);\n horizontal.add(aabb[2]);\n vertical.add(aabb[1]);\n vertical.add(aabb[3]);\n });\n horizontal.add(common[0]);\n horizontal.add(common[2]);\n vertical.add(common[1]);\n vertical.add(common[3]);\n\n const _vertical = Array.from(vertical).sort((a, b) => a - b);\n\n const _horizontal = Array.from(horizontal).sort((a, b) => a - b);\n\n return {\n row: _vertical.length,\n col: _horizontal.length,\n data: _vertical.flatMap((y, row) => _horizontal.map((x, col) => ({\n f: 0,\n g: 0,\n h: 0,\n closed: false,\n visited: false,\n parent: null,\n addr: [col, row],\n pos: [x, y]\n })))\n };\n};\n\nconst getDonglePosition = (bounds, heading, p) => {\n switch (heading) {\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_UP:\n return (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(p[0], bounds[1]);\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT:\n return (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(bounds[2], p[1]);\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_DOWN:\n return (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(p[0], bounds[3]);\n }\n\n return (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointFrom)(bounds[0], p[1]);\n};\n\nconst estimateSegmentCount = (start, end, startHeading, endHeading) => {\n if (endHeading === _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT) {\n switch (startHeading) {\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT:\n {\n if (start.pos[0] >= end.pos[0]) {\n return 4;\n }\n\n if (start.pos[1] === end.pos[1]) {\n return 0;\n }\n\n return 2;\n }\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_UP:\n if (start.pos[1] > end.pos[1] && start.pos[0] < end.pos[0]) {\n return 1;\n }\n\n return 3;\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_DOWN:\n if (start.pos[1] < end.pos[1] && start.pos[0] < end.pos[0]) {\n return 1;\n }\n\n return 3;\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_LEFT:\n if (start.pos[1] === end.pos[1]) {\n return 4;\n }\n\n return 2;\n }\n } else if (endHeading === _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_LEFT) {\n switch (startHeading) {\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT:\n if (start.pos[1] === end.pos[1]) {\n return 4;\n }\n\n return 2;\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_UP:\n if (start.pos[1] > end.pos[1] && start.pos[0] > end.pos[0]) {\n return 1;\n }\n\n return 3;\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_DOWN:\n if (start.pos[1] < end.pos[1] && start.pos[0] > end.pos[0]) {\n return 1;\n }\n\n return 3;\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_LEFT:\n if (start.pos[0] <= end.pos[0]) {\n return 4;\n }\n\n if (start.pos[1] === end.pos[1]) {\n return 0;\n }\n\n return 2;\n }\n } else if (endHeading === _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_UP) {\n switch (startHeading) {\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT:\n if (start.pos[1] > end.pos[1] && start.pos[0] < end.pos[0]) {\n return 1;\n }\n\n return 3;\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_UP:\n if (start.pos[1] >= end.pos[1]) {\n return 4;\n }\n\n if (start.pos[0] === end.pos[0]) {\n return 0;\n }\n\n return 2;\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_DOWN:\n if (start.pos[0] === end.pos[0]) {\n return 4;\n }\n\n return 2;\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_LEFT:\n if (start.pos[1] > end.pos[1] && start.pos[0] > end.pos[0]) {\n return 1;\n }\n\n return 3;\n }\n } else if (endHeading === _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_DOWN) {\n switch (startHeading) {\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT:\n if (start.pos[1] < end.pos[1] && start.pos[0] < end.pos[0]) {\n return 1;\n }\n\n return 3;\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_UP:\n if (start.pos[0] === end.pos[0]) {\n return 4;\n }\n\n return 2;\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_DOWN:\n if (start.pos[1] <= end.pos[1]) {\n return 4;\n }\n\n if (start.pos[0] === end.pos[0]) {\n return 0;\n }\n\n return 2;\n\n case _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_LEFT:\n if (start.pos[1] < end.pos[1] && start.pos[0] > end.pos[0]) {\n return 1;\n }\n\n return 3;\n }\n }\n\n return 0;\n};\n/**\n * Get neighboring points for a gived grid address\n */\n\n\nconst getNeighbors = ([col, row], grid) => [gridNodeFromAddr([col, row - 1], grid), gridNodeFromAddr([col + 1, row], grid), gridNodeFromAddr([col, row + 1], grid), gridNodeFromAddr([col - 1, row], grid)];\n\nconst gridNodeFromAddr = ([col, row], grid) => {\n var _a;\n\n if (col < 0 || col >= grid.col || row < 0 || row >= grid.row) {\n return null;\n }\n\n return (_a = grid.data[row * grid.col + col]) !== null && _a !== void 0 ? _a : null;\n};\n/**\n * Get node for global point on canvas (if exists)\n */\n\n\nconst pointToGridNode = (point, grid) => {\n for (let col = 0; col < grid.col; col++) {\n for (let row = 0; row < grid.row; row++) {\n const candidate = gridNodeFromAddr([col, row], grid);\n\n if (candidate && point[0] === candidate.pos[0] && point[1] === candidate.pos[1]) {\n return candidate;\n }\n }\n }\n\n return null;\n};\n\nconst commonAABB = aabbs => [Math.min(...aabbs.map(aabb => aabb[0])), Math.min(...aabbs.map(aabb => aabb[1])), Math.max(...aabbs.map(aabb => aabb[2])), Math.max(...aabbs.map(aabb => aabb[3]))]; /// #region Utils\n\n\nconst getBindableElementForId = (id, elementsMap) => {\n const element = elementsMap.get(id);\n\n if (element && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_7__.isBindableElement)(element)) {\n return element;\n }\n\n return null;\n};\n\nconst normalizeArrowElementUpdate = (global, nextFixedSegments, startIsSpecial, endIsSpecial) => {\n var _a;\n\n const offsetX = global[0][0];\n const offsetY = global[0][1];\n const points = global.map(p => (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointTranslate)(p, (0,_math__WEBPACK_IMPORTED_MODULE_0__.vectorScale)((0,_math__WEBPACK_IMPORTED_MODULE_0__.vectorFromPoint)(global[0]), -1)));\n return Object.assign(Object.assign({\n points,\n x: offsetX,\n y: offsetY,\n fixedSegments: ((_a = nextFixedSegments === null || nextFixedSegments === void 0 ? void 0 : nextFixedSegments.length) !== null && _a !== void 0 ? _a : 0) > 0 ? nextFixedSegments : null\n }, (0,_points__WEBPACK_IMPORTED_MODULE_2__.getSizeFromPoints)(points)), {\n startIsSpecial,\n endIsSpecial\n });\n};\n\nconst getElbowArrowCornerPoints = points => {\n if (points.length > 1) {\n let previousHorizontal = Math.abs(points[0][1] - points[1][1]) < Math.abs(points[0][0] - points[1][0]);\n return points.filter((p, idx) => {\n // The very first and last points are always kept\n if (idx === 0 || idx === points.length - 1) {\n return true;\n }\n\n const next = points[idx + 1];\n const nextHorizontal = Math.abs(p[1] - next[1]) < Math.abs(p[0] - next[0]);\n\n if (previousHorizontal === nextHorizontal) {\n previousHorizontal = nextHorizontal;\n return false;\n }\n\n previousHorizontal = nextHorizontal;\n return true;\n });\n }\n\n return points;\n};\n\nconst removeElbowArrowShortSegments = points => {\n if (points.length >= 4) {\n return points.filter((p, idx) => {\n if (idx === 0 || idx === points.length - 1) {\n return true;\n }\n\n const prev = points[idx - 1];\n const prevDist = (0,_math__WEBPACK_IMPORTED_MODULE_0__.pointDistance)(prev, p);\n return prevDist > DEDUP_TRESHOLD;\n });\n }\n\n return points;\n};\n\nconst neighborIndexToHeading = idx => {\n switch (idx) {\n case 0:\n return _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_UP;\n\n case 1:\n return _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_RIGHT;\n\n case 2:\n return _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_DOWN;\n }\n\n return _heading__WEBPACK_IMPORTED_MODULE_6__.HEADING_LEFT;\n};\n\nconst getGlobalPoint = (fixedPointRatio, initialPoint, otherPoint, elementsMap, boundElement, hoveredElement, isDragging) => {\n if (isDragging) {\n if (hoveredElement) {\n const snapPoint = getSnapPoint(initialPoint, otherPoint, hoveredElement, elementsMap);\n return (0,_binding__WEBPACK_IMPORTED_MODULE_5__.snapToMid)(hoveredElement, snapPoint);\n }\n\n return initialPoint;\n }\n\n if (boundElement) {\n const fixedGlobalPoint = (0,_binding__WEBPACK_IMPORTED_MODULE_5__.getGlobalFixedPointForBindableElement)(fixedPointRatio || [0, 0], boundElement); // NOTE: Resize scales the binding position point too, so we need to update it\n\n return Math.abs((0,_binding__WEBPACK_IMPORTED_MODULE_5__.distanceToBindableElement)(boundElement, fixedGlobalPoint, elementsMap) - _binding__WEBPACK_IMPORTED_MODULE_5__.FIXED_BINDING_DISTANCE) > 0.01 ? getSnapPoint(initialPoint, otherPoint, boundElement, elementsMap) : fixedGlobalPoint;\n }\n\n return initialPoint;\n};\n\nconst getSnapPoint = (p, otherPoint, element, elementsMap) => (0,_binding__WEBPACK_IMPORTED_MODULE_5__.bindPointToSnapToElementOutline)((0,_typeChecks__WEBPACK_IMPORTED_MODULE_7__.isRectanguloidElement)(element) ? (0,_binding__WEBPACK_IMPORTED_MODULE_5__.avoidRectangularCorner)(element, p) : p, otherPoint, element, elementsMap);\n\nconst getBindPointHeading = (p, otherPoint, elementsMap, hoveredElement, origPoint) => (0,_binding__WEBPACK_IMPORTED_MODULE_5__.getHeadingForElbowArrowSnap)(p, otherPoint, hoveredElement, hoveredElement && (0,_shapes__WEBPACK_IMPORTED_MODULE_3__.aabbForElement)(hoveredElement, Array(4).fill((0,_binding__WEBPACK_IMPORTED_MODULE_5__.distanceToBindableElement)(hoveredElement, p, elementsMap))), elementsMap, origPoint);\n\nconst getHoveredElements = (origStartGlobalPoint, origEndGlobalPoint, elementsMap, zoom) => {\n // TODO: Might be a performance bottleneck and the Map type\n // remembers the insertion order anyway...\n const nonDeletedSceneElementsMap = (0,_utils__WEBPACK_IMPORTED_MODULE_4__.toBrandedType)(new Map([...elementsMap].filter(el => !el[1].isDeleted)));\n const elements = Array.from(elementsMap.values());\n return [(0,_binding__WEBPACK_IMPORTED_MODULE_5__.getHoveredElementForBinding)((0,_utils__WEBPACK_IMPORTED_MODULE_4__.tupleToCoors)(origStartGlobalPoint), elements, nonDeletedSceneElementsMap, zoom, true), (0,_binding__WEBPACK_IMPORTED_MODULE_5__.getHoveredElementForBinding)((0,_utils__WEBPACK_IMPORTED_MODULE_4__.tupleToCoors)(origEndGlobalPoint), elements, nonDeletedSceneElementsMap, zoom, true)];\n};\n\nconst gridAddressesEqual = (a, b) => a[0] === b[0] && a[1] === b[1];\n\n//# sourceURL=webpack://ExcalidrawLib/./element/elbowArrow.ts?");
|
|
3153
3153
|
|
|
3154
3154
|
/***/ }),
|
|
3155
3155
|
|
|
@@ -3182,7 +3182,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3182
3182
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3183
3183
|
|
|
3184
3184
|
"use strict";
|
|
3185
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"FlowChartCreator\": () => (/* binding */ FlowChartCreator),\n/* harmony export */ \"FlowChartNavigator\": () => (/* binding */ FlowChartNavigator),\n/* harmony export */ \"addNewNodes\": () => (/* binding */ addNewNodes),\n/* harmony export */ \"getLinkDirectionFromKey\": () => (/* binding */ getLinkDirectionFromKey),\n/* harmony export */ \"getPredecessors\": () => (/* binding */ getPredecessors),\n/* harmony export */ \"isNodeInFlowchart\": () => (/* binding */ isNodeInFlowchart)\n/* harmony export */ });\n/* harmony import */ var _heading__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./heading */ \"./element/heading.ts\");\n/* harmony import */ var _binding__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./binding */ \"./element/binding.ts\");\n/* harmony import */ var _linearElementEditor__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./linearElementEditor */ \"./element/linearElementEditor.ts\");\n/* harmony import */ var _newElement__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./newElement */ \"./element/newElement.ts\");\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../keys */ \"./keys.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./mutateElement */ \"./element/mutateElement.ts\");\n/* harmony import */ var _frame__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../frame */ \"./frame.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./typeChecks */ \"./element/typeChecks.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils */ \"./utils.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../math */ \"../math/index.ts\");\n/* harmony import */ var _shapes__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../shapes */ \"./shapes.tsx\");\n\n\n\n\n\n\n\n\n\n\n\nconst VERTICAL_OFFSET = 100;\nconst HORIZONTAL_OFFSET = 100;\nconst getLinkDirectionFromKey = key => {\n switch (key) {\n case _keys__WEBPACK_IMPORTED_MODULE_4__.KEYS.ARROW_UP:\n return \"up\";\n\n case _keys__WEBPACK_IMPORTED_MODULE_4__.KEYS.ARROW_DOWN:\n return \"down\";\n\n case _keys__WEBPACK_IMPORTED_MODULE_4__.KEYS.ARROW_RIGHT:\n return \"right\";\n\n case _keys__WEBPACK_IMPORTED_MODULE_4__.KEYS.ARROW_LEFT:\n return \"left\";\n\n default:\n return \"right\";\n }\n};\n\nconst getNodeRelatives = (type, node, elementsMap, direction) => {\n const items = [...elementsMap.values()].reduce((acc, el) => {\n var _a;\n\n let oppositeBinding;\n\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_7__.isElbowArrow)(el) && ( // we want check existence of the opposite binding, in the direction\n // we're interested in\n oppositeBinding = el[type === \"predecessors\" ? \"startBinding\" : \"endBinding\"]) && // similarly, we need to filter only arrows bound to target node\n ((_a = el[type === \"predecessors\" ? \"endBinding\" : \"startBinding\"]) === null || _a === void 0 ? void 0 : _a.elementId) === node.id) {\n const relative = elementsMap.get(oppositeBinding.elementId);\n\n if (!relative) {\n return acc;\n }\n\n (0,_utils__WEBPACK_IMPORTED_MODULE_8__.invariant)((0,_typeChecks__WEBPACK_IMPORTED_MODULE_7__.isBindableElement)(relative), \"not an ExcalidrawBindableElement\");\n const edgePoint = type === \"predecessors\" ? el.points[el.points.length - 1] : [0, 0];\n const heading = (0,_heading__WEBPACK_IMPORTED_MODULE_0__.headingForPointFromElement)(node, (0,_shapes__WEBPACK_IMPORTED_MODULE_10__.aabbForElement)(node), [edgePoint[0] + el.x, edgePoint[1] + el.y]);\n acc.push({\n relative,\n heading\n });\n }\n\n return acc;\n }, []);\n\n switch (direction) {\n case \"up\":\n return items.filter(item => (0,_heading__WEBPACK_IMPORTED_MODULE_0__.compareHeading)(item.heading, _heading__WEBPACK_IMPORTED_MODULE_0__.HEADING_UP)).map(item => item.relative);\n\n case \"down\":\n return items.filter(item => (0,_heading__WEBPACK_IMPORTED_MODULE_0__.compareHeading)(item.heading, _heading__WEBPACK_IMPORTED_MODULE_0__.HEADING_DOWN)).map(item => item.relative);\n\n case \"right\":\n return items.filter(item => (0,_heading__WEBPACK_IMPORTED_MODULE_0__.compareHeading)(item.heading, _heading__WEBPACK_IMPORTED_MODULE_0__.HEADING_RIGHT)).map(item => item.relative);\n\n case \"left\":\n return items.filter(item => (0,_heading__WEBPACK_IMPORTED_MODULE_0__.compareHeading)(item.heading, _heading__WEBPACK_IMPORTED_MODULE_0__.HEADING_LEFT)).map(item => item.relative);\n }\n};\n\nconst getSuccessors = (node, elementsMap, direction) => {\n return getNodeRelatives(\"successors\", node, elementsMap, direction);\n};\n\nconst getPredecessors = (node, elementsMap, direction) => {\n return getNodeRelatives(\"predecessors\", node, elementsMap, direction);\n};\n\nconst getOffsets = (element, linkedNodes, direction) => {\n const _HORIZONTAL_OFFSET = HORIZONTAL_OFFSET + element.width; // check if vertical space or horizontal space is available first\n\n\n if (direction === \"up\" || direction === \"down\") {\n const _VERTICAL_OFFSET = VERTICAL_OFFSET + element.height; // check vertical space\n\n\n const minX = element.x;\n const maxX = element.x + element.width; // vertical space is available\n\n if (linkedNodes.every(linkedNode => linkedNode.x + linkedNode.width < minX || linkedNode.x > maxX)) {\n return {\n x: 0,\n y: _VERTICAL_OFFSET * (direction === \"up\" ? -1 : 1)\n };\n }\n } else if (direction === \"right\" || direction === \"left\") {\n const minY = element.y;\n const maxY = element.y + element.height;\n\n if (linkedNodes.every(linkedNode => linkedNode.y + linkedNode.height < minY || linkedNode.y > maxY)) {\n return {\n x: (HORIZONTAL_OFFSET + element.width) * (direction === \"left\" ? -1 : 1),\n y: 0\n };\n }\n }\n\n if (direction === \"up\" || direction === \"down\") {\n const _VERTICAL_OFFSET = VERTICAL_OFFSET + element.height;\n\n const y = linkedNodes.length === 0 ? _VERTICAL_OFFSET : _VERTICAL_OFFSET;\n const x = linkedNodes.length === 0 ? 0 : (linkedNodes.length + 1) % 2 === 0 ? (linkedNodes.length + 1) / 2 * _HORIZONTAL_OFFSET : linkedNodes.length / 2 * _HORIZONTAL_OFFSET * -1;\n\n if (direction === \"up\") {\n return {\n x,\n y: y * -1\n };\n }\n\n return {\n x,\n y\n };\n }\n\n const _VERTICAL_OFFSET = VERTICAL_OFFSET + element.height;\n\n const x = (linkedNodes.length === 0 ? HORIZONTAL_OFFSET : HORIZONTAL_OFFSET) + element.width;\n const y = linkedNodes.length === 0 ? 0 : (linkedNodes.length + 1) % 2 === 0 ? (linkedNodes.length + 1) / 2 * _VERTICAL_OFFSET : linkedNodes.length / 2 * _VERTICAL_OFFSET * -1;\n\n if (direction === \"left\") {\n return {\n x: x * -1,\n y\n };\n }\n\n return {\n x,\n y\n };\n};\n\nconst addNewNode = (element, elementsMap, appState, direction) => {\n const successors = getSuccessors(element, elementsMap, direction);\n const predeccessors = getPredecessors(element, elementsMap, direction);\n const offsets = getOffsets(element, [...successors, ...predeccessors], direction);\n const nextNode = (0,_newElement__WEBPACK_IMPORTED_MODULE_3__.newElement)({\n type: element.type,\n x: element.x + offsets.x,\n y: element.y + offsets.y,\n // TODO: extract this to a util\n width: element.width,\n height: element.height,\n roundness: element.roundness,\n roughness: element.roughness,\n backgroundColor: element.backgroundColor,\n strokeColor: element.strokeColor,\n strokeWidth: element.strokeWidth\n });\n (0,_utils__WEBPACK_IMPORTED_MODULE_8__.invariant)((0,_typeChecks__WEBPACK_IMPORTED_MODULE_7__.isFlowchartNodeElement)(nextNode), \"not an ExcalidrawFlowchartNodeElement\");\n const bindingArrow = createBindingArrow(element, nextNode, elementsMap, direction, appState);\n return {\n nextNode,\n bindingArrow\n };\n};\n\nconst addNewNodes = (startNode, elementsMap, appState, direction, numberOfNodes) => {\n // always start from 0 and distribute evenly\n const newNodes = [];\n\n for (let i = 0; i < numberOfNodes; i++) {\n let nextX;\n let nextY;\n\n if (direction === \"left\" || direction === \"right\") {\n const totalHeight = VERTICAL_OFFSET * (numberOfNodes - 1) + numberOfNodes * startNode.height;\n const startY = startNode.y + startNode.height / 2 - totalHeight / 2;\n let offsetX = HORIZONTAL_OFFSET + startNode.width;\n\n if (direction === \"left\") {\n offsetX *= -1;\n }\n\n nextX = startNode.x + offsetX;\n const offsetY = (VERTICAL_OFFSET + startNode.height) * i;\n nextY = startY + offsetY;\n } else {\n const totalWidth = HORIZONTAL_OFFSET * (numberOfNodes - 1) + numberOfNodes * startNode.width;\n const startX = startNode.x + startNode.width / 2 - totalWidth / 2;\n let offsetY = VERTICAL_OFFSET + startNode.height;\n\n if (direction === \"up\") {\n offsetY *= -1;\n }\n\n nextY = startNode.y + offsetY;\n const offsetX = (HORIZONTAL_OFFSET + startNode.width) * i;\n nextX = startX + offsetX;\n }\n\n const nextNode = (0,_newElement__WEBPACK_IMPORTED_MODULE_3__.newElement)({\n type: startNode.type,\n x: nextX,\n y: nextY,\n // TODO: extract this to a util\n width: startNode.width,\n height: startNode.height,\n roundness: startNode.roundness,\n roughness: startNode.roughness,\n backgroundColor: startNode.backgroundColor,\n strokeColor: startNode.strokeColor,\n strokeWidth: startNode.strokeWidth\n });\n (0,_utils__WEBPACK_IMPORTED_MODULE_8__.invariant)((0,_typeChecks__WEBPACK_IMPORTED_MODULE_7__.isFlowchartNodeElement)(nextNode), \"not an ExcalidrawFlowchartNodeElement\");\n const bindingArrow = createBindingArrow(startNode, nextNode, elementsMap, direction, appState);\n newNodes.push(nextNode);\n newNodes.push(bindingArrow);\n }\n\n return newNodes;\n};\n\nconst createBindingArrow = (startBindingElement, endBindingElement, elementsMap, direction, appState) => {\n let startX;\n let startY;\n const PADDING = 6;\n\n switch (direction) {\n case \"up\":\n {\n startX = startBindingElement.x + startBindingElement.width / 2;\n startY = startBindingElement.y - PADDING;\n break;\n }\n\n case \"down\":\n {\n startX = startBindingElement.x + startBindingElement.width / 2;\n startY = startBindingElement.y + startBindingElement.height + PADDING;\n break;\n }\n\n case \"right\":\n {\n startX = startBindingElement.x + startBindingElement.width + PADDING;\n startY = startBindingElement.y + startBindingElement.height / 2;\n break;\n }\n\n case \"left\":\n {\n startX = startBindingElement.x - PADDING;\n startY = startBindingElement.y + startBindingElement.height / 2;\n break;\n }\n }\n\n let endX;\n let endY;\n\n switch (direction) {\n case \"up\":\n {\n endX = endBindingElement.x + endBindingElement.width / 2 - startX;\n endY = endBindingElement.y + endBindingElement.height - startY + PADDING;\n break;\n }\n\n case \"down\":\n {\n endX = endBindingElement.x + endBindingElement.width / 2 - startX;\n endY = endBindingElement.y - startY - PADDING;\n break;\n }\n\n case \"right\":\n {\n endX = endBindingElement.x - startX - PADDING;\n endY = endBindingElement.y - startY + endBindingElement.height / 2;\n break;\n }\n\n case \"left\":\n {\n endX = endBindingElement.x + endBindingElement.width - startX + PADDING;\n endY = endBindingElement.y - startY + endBindingElement.height / 2;\n break;\n }\n }\n\n const bindingArrow = (0,_newElement__WEBPACK_IMPORTED_MODULE_3__.newArrowElement)({\n type: \"arrow\",\n x: startX,\n y: startY,\n startArrowhead: appState.currentItemStartArrowhead,\n endArrowhead: appState.currentItemEndArrowhead,\n strokeColor: appState.currentItemStrokeColor,\n strokeStyle: appState.currentItemStrokeStyle,\n strokeWidth: appState.currentItemStrokeWidth,\n points: [(0,_math__WEBPACK_IMPORTED_MODULE_9__.pointFrom)(0, 0), (0,_math__WEBPACK_IMPORTED_MODULE_9__.pointFrom)(endX, endY)],\n elbowed: true\n });\n (0,_binding__WEBPACK_IMPORTED_MODULE_1__.bindLinearElement)(bindingArrow, startBindingElement, \"start\", elementsMap);\n (0,_binding__WEBPACK_IMPORTED_MODULE_1__.bindLinearElement)(bindingArrow, endBindingElement, \"end\", elementsMap);\n const changedElements = new Map();\n changedElements.set(startBindingElement.id, startBindingElement);\n changedElements.set(endBindingElement.id, endBindingElement);\n changedElements.set(bindingArrow.id, bindingArrow);\n _linearElementEditor__WEBPACK_IMPORTED_MODULE_2__.LinearElementEditor.movePoints(bindingArrow, [{\n index: 1,\n point: bindingArrow.points[1]\n }]);\n return bindingArrow;\n};\n\nclass FlowChartNavigator {\n constructor() {\n this.isExploring = false; // nodes that are ONE link away (successor and predecessor both included)\n\n this.sameLevelNodes = [];\n this.sameLevelIndex = 0; // set it to the opposite of the defalut creation direction\n\n this.direction = null; // for speedier navigation\n\n this.visitedNodes = new Set();\n }\n\n clear() {\n this.isExploring = false;\n this.sameLevelNodes = [];\n this.sameLevelIndex = 0;\n this.direction = null;\n this.visitedNodes.clear();\n }\n\n exploreByDirection(element, elementsMap, direction) {\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_7__.isBindableElement)(element)) {\n return null;\n } // clear if going at a different direction\n\n\n if (direction !== this.direction) {\n this.clear();\n } // add the current node to the visited\n\n\n if (!this.visitedNodes.has(element.id)) {\n this.visitedNodes.add(element.id);\n }\n /**\n * CASE:\n * - already started exploring, AND\n * - there are multiple nodes at the same level, AND\n * - still going at the same direction, AND\n *\n * RESULT:\n * - loop through nodes at the same level\n *\n * WHY:\n * - provides user the capability to loop through nodes at the same level\n */\n\n\n if (this.isExploring && direction === this.direction && this.sameLevelNodes.length > 1) {\n this.sameLevelIndex = (this.sameLevelIndex + 1) % this.sameLevelNodes.length;\n return this.sameLevelNodes[this.sameLevelIndex].id;\n }\n\n const nodes = [...getSuccessors(element, elementsMap, direction), ...getPredecessors(element, elementsMap, direction)];\n /**\n * CASE:\n * - just started exploring at the given direction\n *\n * RESULT:\n * - go to the first node in the given direction\n */\n\n if (nodes.length > 0) {\n this.sameLevelIndex = 0;\n this.isExploring = true;\n this.sameLevelNodes = nodes;\n this.direction = direction;\n this.visitedNodes.add(nodes[0].id);\n return nodes[0].id;\n }\n /**\n * CASE:\n * - (just started exploring or still going at the same direction) OR\n * - there're no nodes at the given direction\n *\n * RESULT:\n * - go to some other unvisited linked node\n *\n * WHY:\n * - provide a speedier navigation from a given node to some predecessor\n * without the user having to change arrow key\n */\n\n\n if (direction === this.direction || !this.isExploring) {\n if (!this.isExploring) {\n // just started and no other nodes at the given direction\n // so the current node is technically the first visited node\n // (this is needed so that we don't get stuck between looping through )\n this.visitedNodes.add(element.id);\n }\n\n const otherDirections = [\"up\", \"right\", \"down\", \"left\"].filter(dir => dir !== direction);\n const otherLinkedNodes = otherDirections.map(dir => [...getSuccessors(element, elementsMap, dir), ...getPredecessors(element, elementsMap, dir)]).flat().filter(linkedNode => !this.visitedNodes.has(linkedNode.id));\n\n for (const linkedNode of otherLinkedNodes) {\n if (!this.visitedNodes.has(linkedNode.id)) {\n this.visitedNodes.add(linkedNode.id);\n this.isExploring = true;\n this.direction = direction;\n return linkedNode.id;\n }\n }\n }\n\n return null;\n }\n\n}\nclass FlowChartCreator {\n constructor() {\n this.isCreatingChart = false;\n this.numberOfNodes = 0;\n this.direction = \"right\";\n this.pendingNodes = null;\n }\n\n createNodes(startNode, elementsMap, appState, direction) {\n if (direction !== this.direction) {\n const {\n nextNode,\n bindingArrow\n } = addNewNode(startNode, elementsMap, appState, direction);\n this.numberOfNodes = 1;\n this.isCreatingChart = true;\n this.direction = direction;\n this.pendingNodes = [nextNode, bindingArrow];\n } else {\n this.numberOfNodes += 1;\n const newNodes = addNewNodes(startNode, elementsMap, appState, direction, this.numberOfNodes);\n this.isCreatingChart = true;\n this.direction = direction;\n this.pendingNodes = newNodes;\n } // add pending nodes to the same frame as the start node\n // if every pending node is at least intersecting with the frame\n\n\n if (startNode.frameId) {\n const frame = elementsMap.get(startNode.frameId);\n (0,_utils__WEBPACK_IMPORTED_MODULE_8__.invariant)(frame && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_7__.isFrameElement)(frame), \"not an ExcalidrawFrameElement\");\n\n if (frame && this.pendingNodes.every(node => (0,_frame__WEBPACK_IMPORTED_MODULE_6__.elementsAreInFrameBounds)([node], frame, elementsMap) || (0,_frame__WEBPACK_IMPORTED_MODULE_6__.elementOverlapsWithFrame)(node, frame, elementsMap))) {\n this.pendingNodes = this.pendingNodes.map(node => (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(node, {\n frameId: startNode.frameId\n }, false));\n }\n }\n }\n\n clear() {\n this.isCreatingChart = false;\n this.pendingNodes = null;\n this.direction = null;\n this.numberOfNodes = 0;\n }\n\n}\nconst isNodeInFlowchart = (element, elementsMap) => {\n var _a, _b;\n\n for (const [, el] of elementsMap) {\n if (el.type === \"arrow\" && (((_a = el.startBinding) === null || _a === void 0 ? void 0 : _a.elementId) === element.id || ((_b = el.endBinding) === null || _b === void 0 ? void 0 : _b.elementId) === element.id)) {\n return true;\n }\n }\n\n return false;\n};\n\n//# sourceURL=webpack://ExcalidrawLib/./element/flowchart.ts?");
|
|
3185
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"FlowChartCreator\": () => (/* binding */ FlowChartCreator),\n/* harmony export */ \"FlowChartNavigator\": () => (/* binding */ FlowChartNavigator),\n/* harmony export */ \"addNewNodes\": () => (/* binding */ addNewNodes),\n/* harmony export */ \"getLinkDirectionFromKey\": () => (/* binding */ getLinkDirectionFromKey),\n/* harmony export */ \"getPredecessors\": () => (/* binding */ getPredecessors),\n/* harmony export */ \"isNodeInFlowchart\": () => (/* binding */ isNodeInFlowchart)\n/* harmony export */ });\n/* harmony import */ var _heading__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./heading */ \"./element/heading.ts\");\n/* harmony import */ var _binding__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./binding */ \"./element/binding.ts\");\n/* harmony import */ var _linearElementEditor__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./linearElementEditor */ \"./element/linearElementEditor.ts\");\n/* harmony import */ var _newElement__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./newElement */ \"./element/newElement.ts\");\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../keys */ \"./keys.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./mutateElement */ \"./element/mutateElement.ts\");\n/* harmony import */ var _frame__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../frame */ \"./frame.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./typeChecks */ \"./element/typeChecks.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils */ \"./utils.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../math */ \"../math/index.ts\");\n/* harmony import */ var _shapes__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../shapes */ \"./shapes.tsx\");\n\n\n\n\n\n\n\n\n\n\n\nconst VERTICAL_OFFSET = 100;\nconst HORIZONTAL_OFFSET = 100;\nconst getLinkDirectionFromKey = key => {\n switch (key) {\n case _keys__WEBPACK_IMPORTED_MODULE_4__.KEYS.ARROW_UP:\n return \"up\";\n\n case _keys__WEBPACK_IMPORTED_MODULE_4__.KEYS.ARROW_DOWN:\n return \"down\";\n\n case _keys__WEBPACK_IMPORTED_MODULE_4__.KEYS.ARROW_RIGHT:\n return \"right\";\n\n case _keys__WEBPACK_IMPORTED_MODULE_4__.KEYS.ARROW_LEFT:\n return \"left\";\n\n default:\n return \"right\";\n }\n};\n\nconst getNodeRelatives = (type, node, elementsMap, direction) => {\n const items = [...elementsMap.values()].reduce((acc, el) => {\n var _a;\n\n let oppositeBinding;\n\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_7__.isElbowArrow)(el) && ( // we want check existence of the opposite binding, in the direction\n // we're interested in\n oppositeBinding = el[type === \"predecessors\" ? \"startBinding\" : \"endBinding\"]) && // similarly, we need to filter only arrows bound to target node\n ((_a = el[type === \"predecessors\" ? \"endBinding\" : \"startBinding\"]) === null || _a === void 0 ? void 0 : _a.elementId) === node.id) {\n const relative = elementsMap.get(oppositeBinding.elementId);\n\n if (!relative) {\n return acc;\n }\n\n (0,_utils__WEBPACK_IMPORTED_MODULE_8__.invariant)((0,_typeChecks__WEBPACK_IMPORTED_MODULE_7__.isBindableElement)(relative), \"not an ExcalidrawBindableElement\");\n const edgePoint = type === \"predecessors\" ? el.points[el.points.length - 1] : [0, 0];\n const heading = (0,_heading__WEBPACK_IMPORTED_MODULE_0__.headingForPointFromElement)(node, (0,_shapes__WEBPACK_IMPORTED_MODULE_10__.aabbForElement)(node), [edgePoint[0] + el.x, edgePoint[1] + el.y]);\n acc.push({\n relative,\n heading\n });\n }\n\n return acc;\n }, []);\n\n switch (direction) {\n case \"up\":\n return items.filter(item => (0,_heading__WEBPACK_IMPORTED_MODULE_0__.compareHeading)(item.heading, _heading__WEBPACK_IMPORTED_MODULE_0__.HEADING_UP)).map(item => item.relative);\n\n case \"down\":\n return items.filter(item => (0,_heading__WEBPACK_IMPORTED_MODULE_0__.compareHeading)(item.heading, _heading__WEBPACK_IMPORTED_MODULE_0__.HEADING_DOWN)).map(item => item.relative);\n\n case \"right\":\n return items.filter(item => (0,_heading__WEBPACK_IMPORTED_MODULE_0__.compareHeading)(item.heading, _heading__WEBPACK_IMPORTED_MODULE_0__.HEADING_RIGHT)).map(item => item.relative);\n\n case \"left\":\n return items.filter(item => (0,_heading__WEBPACK_IMPORTED_MODULE_0__.compareHeading)(item.heading, _heading__WEBPACK_IMPORTED_MODULE_0__.HEADING_LEFT)).map(item => item.relative);\n }\n};\n\nconst getSuccessors = (node, elementsMap, direction) => {\n return getNodeRelatives(\"successors\", node, elementsMap, direction);\n};\n\nconst getPredecessors = (node, elementsMap, direction) => {\n return getNodeRelatives(\"predecessors\", node, elementsMap, direction);\n};\n\nconst getOffsets = (element, linkedNodes, direction) => {\n const _HORIZONTAL_OFFSET = HORIZONTAL_OFFSET + element.width; // check if vertical space or horizontal space is available first\n\n\n if (direction === \"up\" || direction === \"down\") {\n const _VERTICAL_OFFSET = VERTICAL_OFFSET + element.height; // check vertical space\n\n\n const minX = element.x;\n const maxX = element.x + element.width; // vertical space is available\n\n if (linkedNodes.every(linkedNode => linkedNode.x + linkedNode.width < minX || linkedNode.x > maxX)) {\n return {\n x: 0,\n y: _VERTICAL_OFFSET * (direction === \"up\" ? -1 : 1)\n };\n }\n } else if (direction === \"right\" || direction === \"left\") {\n const minY = element.y;\n const maxY = element.y + element.height;\n\n if (linkedNodes.every(linkedNode => linkedNode.y + linkedNode.height < minY || linkedNode.y > maxY)) {\n return {\n x: (HORIZONTAL_OFFSET + element.width) * (direction === \"left\" ? -1 : 1),\n y: 0\n };\n }\n }\n\n if (direction === \"up\" || direction === \"down\") {\n const _VERTICAL_OFFSET = VERTICAL_OFFSET + element.height;\n\n const y = linkedNodes.length === 0 ? _VERTICAL_OFFSET : _VERTICAL_OFFSET;\n const x = linkedNodes.length === 0 ? 0 : (linkedNodes.length + 1) % 2 === 0 ? (linkedNodes.length + 1) / 2 * _HORIZONTAL_OFFSET : linkedNodes.length / 2 * _HORIZONTAL_OFFSET * -1;\n\n if (direction === \"up\") {\n return {\n x,\n y: y * -1\n };\n }\n\n return {\n x,\n y\n };\n }\n\n const _VERTICAL_OFFSET = VERTICAL_OFFSET + element.height;\n\n const x = (linkedNodes.length === 0 ? HORIZONTAL_OFFSET : HORIZONTAL_OFFSET) + element.width;\n const y = linkedNodes.length === 0 ? 0 : (linkedNodes.length + 1) % 2 === 0 ? (linkedNodes.length + 1) / 2 * _VERTICAL_OFFSET : linkedNodes.length / 2 * _VERTICAL_OFFSET * -1;\n\n if (direction === \"left\") {\n return {\n x: x * -1,\n y\n };\n }\n\n return {\n x,\n y\n };\n};\n\nconst addNewNode = (element, elementsMap, appState, direction) => {\n const successors = getSuccessors(element, elementsMap, direction);\n const predeccessors = getPredecessors(element, elementsMap, direction);\n const offsets = getOffsets(element, [...successors, ...predeccessors], direction);\n const nextNode = (0,_newElement__WEBPACK_IMPORTED_MODULE_3__.newElement)({\n type: element.type,\n x: element.x + offsets.x,\n y: element.y + offsets.y,\n // TODO: extract this to a util\n width: element.width,\n height: element.height,\n roundness: element.roundness,\n roughness: element.roughness,\n backgroundColor: element.backgroundColor,\n strokeColor: element.strokeColor,\n strokeWidth: element.strokeWidth\n });\n (0,_utils__WEBPACK_IMPORTED_MODULE_8__.invariant)((0,_typeChecks__WEBPACK_IMPORTED_MODULE_7__.isFlowchartNodeElement)(nextNode), \"not an ExcalidrawFlowchartNodeElement\");\n const bindingArrow = createBindingArrow(element, nextNode, elementsMap, direction, appState);\n return {\n nextNode,\n bindingArrow\n };\n};\n\nconst addNewNodes = (startNode, elementsMap, appState, direction, numberOfNodes) => {\n // always start from 0 and distribute evenly\n const newNodes = [];\n\n for (let i = 0; i < numberOfNodes; i++) {\n let nextX;\n let nextY;\n\n if (direction === \"left\" || direction === \"right\") {\n const totalHeight = VERTICAL_OFFSET * (numberOfNodes - 1) + numberOfNodes * startNode.height;\n const startY = startNode.y + startNode.height / 2 - totalHeight / 2;\n let offsetX = HORIZONTAL_OFFSET + startNode.width;\n\n if (direction === \"left\") {\n offsetX *= -1;\n }\n\n nextX = startNode.x + offsetX;\n const offsetY = (VERTICAL_OFFSET + startNode.height) * i;\n nextY = startY + offsetY;\n } else {\n const totalWidth = HORIZONTAL_OFFSET * (numberOfNodes - 1) + numberOfNodes * startNode.width;\n const startX = startNode.x + startNode.width / 2 - totalWidth / 2;\n let offsetY = VERTICAL_OFFSET + startNode.height;\n\n if (direction === \"up\") {\n offsetY *= -1;\n }\n\n nextY = startNode.y + offsetY;\n const offsetX = (HORIZONTAL_OFFSET + startNode.width) * i;\n nextX = startX + offsetX;\n }\n\n const nextNode = (0,_newElement__WEBPACK_IMPORTED_MODULE_3__.newElement)({\n type: startNode.type,\n x: nextX,\n y: nextY,\n // TODO: extract this to a util\n width: startNode.width,\n height: startNode.height,\n roundness: startNode.roundness,\n roughness: startNode.roughness,\n backgroundColor: startNode.backgroundColor,\n strokeColor: startNode.strokeColor,\n strokeWidth: startNode.strokeWidth\n });\n (0,_utils__WEBPACK_IMPORTED_MODULE_8__.invariant)((0,_typeChecks__WEBPACK_IMPORTED_MODULE_7__.isFlowchartNodeElement)(nextNode), \"not an ExcalidrawFlowchartNodeElement\");\n const bindingArrow = createBindingArrow(startNode, nextNode, elementsMap, direction, appState);\n newNodes.push(nextNode);\n newNodes.push(bindingArrow);\n }\n\n return newNodes;\n};\n\nconst createBindingArrow = (startBindingElement, endBindingElement, elementsMap, direction, appState) => {\n let startX;\n let startY;\n const PADDING = 6;\n\n switch (direction) {\n case \"up\":\n {\n startX = startBindingElement.x + startBindingElement.width / 2;\n startY = startBindingElement.y - PADDING;\n break;\n }\n\n case \"down\":\n {\n startX = startBindingElement.x + startBindingElement.width / 2;\n startY = startBindingElement.y + startBindingElement.height + PADDING;\n break;\n }\n\n case \"right\":\n {\n startX = startBindingElement.x + startBindingElement.width + PADDING;\n startY = startBindingElement.y + startBindingElement.height / 2;\n break;\n }\n\n case \"left\":\n {\n startX = startBindingElement.x - PADDING;\n startY = startBindingElement.y + startBindingElement.height / 2;\n break;\n }\n }\n\n let endX;\n let endY;\n\n switch (direction) {\n case \"up\":\n {\n endX = endBindingElement.x + endBindingElement.width / 2 - startX;\n endY = endBindingElement.y + endBindingElement.height - startY + PADDING;\n break;\n }\n\n case \"down\":\n {\n endX = endBindingElement.x + endBindingElement.width / 2 - startX;\n endY = endBindingElement.y - startY - PADDING;\n break;\n }\n\n case \"right\":\n {\n endX = endBindingElement.x - startX - PADDING;\n endY = endBindingElement.y - startY + endBindingElement.height / 2;\n break;\n }\n\n case \"left\":\n {\n endX = endBindingElement.x + endBindingElement.width - startX + PADDING;\n endY = endBindingElement.y - startY + endBindingElement.height / 2;\n break;\n }\n }\n\n const bindingArrow = (0,_newElement__WEBPACK_IMPORTED_MODULE_3__.newArrowElement)({\n type: \"arrow\",\n x: startX,\n y: startY,\n startArrowhead: null,\n endArrowhead: appState.currentItemEndArrowhead,\n strokeColor: startBindingElement.strokeColor,\n strokeStyle: startBindingElement.strokeStyle,\n strokeWidth: startBindingElement.strokeWidth,\n points: [(0,_math__WEBPACK_IMPORTED_MODULE_9__.pointFrom)(0, 0), (0,_math__WEBPACK_IMPORTED_MODULE_9__.pointFrom)(endX, endY)],\n elbowed: true\n });\n (0,_binding__WEBPACK_IMPORTED_MODULE_1__.bindLinearElement)(bindingArrow, startBindingElement, \"start\", elementsMap);\n (0,_binding__WEBPACK_IMPORTED_MODULE_1__.bindLinearElement)(bindingArrow, endBindingElement, \"end\", elementsMap);\n const changedElements = new Map();\n changedElements.set(startBindingElement.id, startBindingElement);\n changedElements.set(endBindingElement.id, endBindingElement);\n changedElements.set(bindingArrow.id, bindingArrow);\n _linearElementEditor__WEBPACK_IMPORTED_MODULE_2__.LinearElementEditor.movePoints(bindingArrow, [{\n index: 1,\n point: bindingArrow.points[1]\n }]);\n return bindingArrow;\n};\n\nclass FlowChartNavigator {\n constructor() {\n this.isExploring = false; // nodes that are ONE link away (successor and predecessor both included)\n\n this.sameLevelNodes = [];\n this.sameLevelIndex = 0; // set it to the opposite of the defalut creation direction\n\n this.direction = null; // for speedier navigation\n\n this.visitedNodes = new Set();\n }\n\n clear() {\n this.isExploring = false;\n this.sameLevelNodes = [];\n this.sameLevelIndex = 0;\n this.direction = null;\n this.visitedNodes.clear();\n }\n\n exploreByDirection(element, elementsMap, direction) {\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_7__.isBindableElement)(element)) {\n return null;\n } // clear if going at a different direction\n\n\n if (direction !== this.direction) {\n this.clear();\n } // add the current node to the visited\n\n\n if (!this.visitedNodes.has(element.id)) {\n this.visitedNodes.add(element.id);\n }\n /**\n * CASE:\n * - already started exploring, AND\n * - there are multiple nodes at the same level, AND\n * - still going at the same direction, AND\n *\n * RESULT:\n * - loop through nodes at the same level\n *\n * WHY:\n * - provides user the capability to loop through nodes at the same level\n */\n\n\n if (this.isExploring && direction === this.direction && this.sameLevelNodes.length > 1) {\n this.sameLevelIndex = (this.sameLevelIndex + 1) % this.sameLevelNodes.length;\n return this.sameLevelNodes[this.sameLevelIndex].id;\n }\n\n const nodes = [...getSuccessors(element, elementsMap, direction), ...getPredecessors(element, elementsMap, direction)];\n /**\n * CASE:\n * - just started exploring at the given direction\n *\n * RESULT:\n * - go to the first node in the given direction\n */\n\n if (nodes.length > 0) {\n this.sameLevelIndex = 0;\n this.isExploring = true;\n this.sameLevelNodes = nodes;\n this.direction = direction;\n this.visitedNodes.add(nodes[0].id);\n return nodes[0].id;\n }\n /**\n * CASE:\n * - (just started exploring or still going at the same direction) OR\n * - there're no nodes at the given direction\n *\n * RESULT:\n * - go to some other unvisited linked node\n *\n * WHY:\n * - provide a speedier navigation from a given node to some predecessor\n * without the user having to change arrow key\n */\n\n\n if (direction === this.direction || !this.isExploring) {\n if (!this.isExploring) {\n // just started and no other nodes at the given direction\n // so the current node is technically the first visited node\n // (this is needed so that we don't get stuck between looping through )\n this.visitedNodes.add(element.id);\n }\n\n const otherDirections = [\"up\", \"right\", \"down\", \"left\"].filter(dir => dir !== direction);\n const otherLinkedNodes = otherDirections.map(dir => [...getSuccessors(element, elementsMap, dir), ...getPredecessors(element, elementsMap, dir)]).flat().filter(linkedNode => !this.visitedNodes.has(linkedNode.id));\n\n for (const linkedNode of otherLinkedNodes) {\n if (!this.visitedNodes.has(linkedNode.id)) {\n this.visitedNodes.add(linkedNode.id);\n this.isExploring = true;\n this.direction = direction;\n return linkedNode.id;\n }\n }\n }\n\n return null;\n }\n\n}\nclass FlowChartCreator {\n constructor() {\n this.isCreatingChart = false;\n this.numberOfNodes = 0;\n this.direction = \"right\";\n this.pendingNodes = null;\n }\n\n createNodes(startNode, elementsMap, appState, direction) {\n if (direction !== this.direction) {\n const {\n nextNode,\n bindingArrow\n } = addNewNode(startNode, elementsMap, appState, direction);\n this.numberOfNodes = 1;\n this.isCreatingChart = true;\n this.direction = direction;\n this.pendingNodes = [nextNode, bindingArrow];\n } else {\n this.numberOfNodes += 1;\n const newNodes = addNewNodes(startNode, elementsMap, appState, direction, this.numberOfNodes);\n this.isCreatingChart = true;\n this.direction = direction;\n this.pendingNodes = newNodes;\n } // add pending nodes to the same frame as the start node\n // if every pending node is at least intersecting with the frame\n\n\n if (startNode.frameId) {\n const frame = elementsMap.get(startNode.frameId);\n (0,_utils__WEBPACK_IMPORTED_MODULE_8__.invariant)(frame && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_7__.isFrameElement)(frame), \"not an ExcalidrawFrameElement\");\n\n if (frame && this.pendingNodes.every(node => (0,_frame__WEBPACK_IMPORTED_MODULE_6__.elementsAreInFrameBounds)([node], frame, elementsMap) || (0,_frame__WEBPACK_IMPORTED_MODULE_6__.elementOverlapsWithFrame)(node, frame, elementsMap))) {\n this.pendingNodes = this.pendingNodes.map(node => (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(node, {\n frameId: startNode.frameId\n }, false));\n }\n }\n }\n\n clear() {\n this.isCreatingChart = false;\n this.pendingNodes = null;\n this.direction = null;\n this.numberOfNodes = 0;\n }\n\n}\nconst isNodeInFlowchart = (element, elementsMap) => {\n var _a, _b;\n\n for (const [, el] of elementsMap) {\n if (el.type === \"arrow\" && (((_a = el.startBinding) === null || _a === void 0 ? void 0 : _a.elementId) === element.id || ((_b = el.endBinding) === null || _b === void 0 ? void 0 : _b.elementId) === element.id)) {\n return true;\n }\n }\n\n return false;\n};\n\n//# sourceURL=webpack://ExcalidrawLib/./element/flowchart.ts?");
|
|
3186
3186
|
|
|
3187
3187
|
/***/ }),
|
|
3188
3188
|
|
|
@@ -3435,7 +3435,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3435
3435
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3436
3436
|
|
|
3437
3437
|
"use strict";
|
|
3438
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"ExcalidrawFontFace\": () => (/* binding */ ExcalidrawFontFace)\n/* harmony export */ });\n/* harmony import */ var _data_encode__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../data/encode */ \"./data/encode.ts\");\n/* harmony import */ var _obsidianUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../obsidianUtils */ \"./obsidianUtils.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils */ \"./utils.ts\");\n/* harmony import */ var _FontMetadata__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./FontMetadata */ \"./fonts/FontMetadata.ts\");\n/* harmony import */ var _subset_subset_main__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../subset/subset-main */ \"./subset/subset-main.ts\");\n\n\n\n\n\nclass ExcalidrawFontFace {\n constructor(family, uri, descriptors) {\n this.urls = ExcalidrawFontFace.createUrls(uri);\n const sources = this.urls.map(url => `url(${url}) ${ExcalidrawFontFace.getFormat(url)}`).join(\", \");\n this.fontFace = new FontFace(family, sources, Object.assign({\n display: \"swap\",\n style: \"normal\",\n weight: \"400\"\n }, descriptors));\n }\n /**\n * Generates CSS `@font-face` definition with the (subsetted) font source as a data url for the characters within the unicode range.\n *\n * Retrieves `undefined` otherwise.\n */\n\n\n toCSS(characters) {\n // quick exit in case the characters are not within this font face's unicode range\n if (!this.getUnicodeRangeRegex().test(characters)) {\n return;\n } //zsviczian - only woffs are chopped into glyphs other fonts are returned as is\n\n\n if (typeof this.urls[0] === \"string\" && !this.urls[0].startsWith(\"data:font/woff2\")) {\n return Promise.resolve(`@font-face { font-family: ${this.fontFace.family}; src: url(${this.urls[0]}); }`);\n }\n\n const codepoints = Array.from(characters).map(char => char.codePointAt(0));\n return this.getContent(codepoints).then(content => `@font-face { font-family: ${this.fontFace.family}; src: url(${content}); }`);\n }\n /**\n * Tries to fetch woff2 content, based on the registered urls (from first to last, treated as fallbacks).\n *\n * @returns base64 with subsetted glyphs based on the passed codepoint, last defined url otherwise\n */\n\n\n async getContent(codePoints) {\n let i = 0;\n const errorMessages = [];\n\n while (i < this.urls.length) {\n const url = this.urls[i];\n\n try {\n const arrayBuffer = await this.fetchFont(url);\n const base64 = await (0,_subset_subset_main__WEBPACK_IMPORTED_MODULE_4__.subsetWoff2GlyphsByCodepoints)(arrayBuffer, codePoints);\n return base64;\n } catch (e) {\n errorMessages.push(`\"${url.toString()}\" returned error \"${e}\"`);\n }\n\n i++;\n }\n\n console.error(`Failed to fetch font family \"${this.fontFace.family}\"`, JSON.stringify(errorMessages, undefined, 2)); // in case of issues, at least return the last url as a content\n // defaults to unpkg for bundled fonts (so that we don't have to host them forever) and http url for others\n\n return this.urls.length ? this.urls[this.urls.length - 1].toString() : \"\";\n }\n\n fetchFont(url) {\n return (0,_utils__WEBPACK_IMPORTED_MODULE_2__.promiseTry)(async () => {\n const result = await (0,_obsidianUtils__WEBPACK_IMPORTED_MODULE_1__.fetchFontFromVault)(url); //zsviczian\n\n if (result) {\n return result;\n }\n\n const response = await fetch(url, {\n // always prefer cache (even stale), otherwise it always triggers an unnecessary validation request\n // which we don't need as we are controlling freshness of the fonts with the stable hash suffix in the url\n // https://developer.mozilla.org/en-US/docs/Web/API/Request/cache\n cache: \"force-cache\",\n headers: {\n Accept: \"font/woff2\"\n }\n });\n\n if (!response.ok) {\n const urlString = url instanceof URL ? url.toString() : \"dataurl\";\n throw new Error(`Failed to fetch \"${urlString}\": ${response.statusText}`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n return arrayBuffer;\n });\n }\n\n getUnicodeRangeRegex() {\n // using \\u{h} or \\u{hhhhh} to match any number of hex digits,\n // otherwise we would get an \"Invalid Unicode escape\" error\n // e.g. U+0-1007F -> \\u{0}-\\u{1007F}\n const unicodeRangeRegex = this.fontFace.unicodeRange.split(/,\\s*/).map(range => {\n const [start, end] = range.replace(\"U+\", \"\").split(\"-\");\n\n if (end) {\n return `\\\\u{${start}}-\\\\u{${end}}`;\n }\n\n return `\\\\u{${start}}`;\n }).join(\"\");\n return new RegExp(`[${unicodeRangeRegex}]`, \"u\");\n }\n\n static createUrls(uri) {\n if (uri.startsWith(\"data\")) {\n // don't create the URL instance, as parsing the huge dataurl string is expensive\n return [uri];\n }\n\n if (uri.startsWith(_FontMetadata__WEBPACK_IMPORTED_MODULE_3__.LOCAL_FONT_PROTOCOL)) {\n // no url for local fonts\n return [];\n }\n\n if (uri.startsWith(\"http\")) {\n // one url for http imports or data url\n return [new URL(uri)];\n } // absolute assets paths, which are found in tests and excalidraw-app build, won't work with base url, so we are stripping initial slash away\n\n\n const assetUrl = uri.replace(/^\\/+/, \"\");\n const urls = [];\n\n if (typeof window.EXCALIDRAW_ASSET_PATH === \"string\") {\n const normalizedBaseUrl = this.normalizeBaseUrl(window.EXCALIDRAW_ASSET_PATH);\n urls.push(new URL(assetUrl, normalizedBaseUrl));\n } else if (Array.isArray(window.EXCALIDRAW_ASSET_PATH)) {\n window.EXCALIDRAW_ASSET_PATH.forEach(path => {\n const normalizedBaseUrl = this.normalizeBaseUrl(path);\n urls.push(new URL(assetUrl, normalizedBaseUrl));\n });\n } // fallback url for bundled fonts\n\n\n urls.push(new URL(assetUrl, ExcalidrawFontFace.UNPKG_FALLBACK_URL));\n return urls;\n }\n\n static getFormat(url) {\n if (!(url instanceof URL)) {\n // format is irrelevant for data url\n return \"\";\n }\n\n try {\n const parts = new URL(url).pathname.split(\".\");\n\n if (parts.length === 1) {\n return \"\";\n }\n\n return `format('${parts.pop()}')`;\n } catch (error) {\n return \"\";\n }\n }\n\n static normalizeBaseUrl(baseUrl) {\n var _a;\n\n let result = baseUrl; // in case user passed a root-relative url (~absolute path),\n // like \"/\" or \"/some/path\", or relative (starts with \"./\"),\n // prepend it with `location.origin`\n\n if (/^\\.?\\//.test(result)) {\n result = new URL(result.replace(/^\\.?\\/+/, \"\"), (_a = window === null || window === void 0 ? void 0 : window.location) === null || _a === void 0 ? void 0 : _a.origin).toString();\n } // ensure there is a trailing slash, otherwise url won't be correctly concatenated\n\n\n result = `${result.replace(/\\/+$/, \"\")}/`;\n return result;\n }\n /**\n * zsviczian https://github.com/zsviczian/excalidraw/commit/b4cfaaa4b4f46ca01f94e27fb7bf651a9da99daa\n */\n\n\n async getContentLegacy() {\n let i = 0;\n const errorMessages = [];\n\n while (i < this.urls.length) {\n const url = this.urls[i];\n\n if (typeof url === \"string\" && url.startsWith(\"data:\")) {\n // it's dataurl, the font is inlined as base64, no need to fetch\n return url;\n }\n\n try {\n const result = await (0,_obsidianUtils__WEBPACK_IMPORTED_MODULE_1__.fetchFontFromVault)(url); //zsviczian\n\n if (result) {\n return `data:font/woff2;base64,${await (0,_data_encode__WEBPACK_IMPORTED_MODULE_0__.stringToBase64)(await (0,_data_encode__WEBPACK_IMPORTED_MODULE_0__.toByteString)(result), true)}`;\n }\n\n const response = await fetch(url, {\n headers: {\n Accept: \"font/woff2\"\n }\n });\n\n if (response.ok) {\n const mimeType = response.headers.get(\"Content-Type\");\n const buffer = await response.arrayBuffer();\n return `data:${mimeType};base64,${await (0,_data_encode__WEBPACK_IMPORTED_MODULE_0__.stringToBase64)(await (0,_data_encode__WEBPACK_IMPORTED_MODULE_0__.toByteString)(buffer), true)}`;\n } // response not ok, try to continue\n\n\n errorMessages.push(`\"${url.toString()}\" returned status \"${response.status}\"`);\n } catch (e) {\n errorMessages.push(`\"${url.toString()}\" returned error \"${e}\"`);\n }\n\n i++;\n }\n\n console.error(`Failed to fetch font \"${this.fontFace.family}\" from urls \"${this.urls.toString()}`, JSON.stringify(errorMessages, undefined, 2)); // in case of issues, at least return the last url as a content\n // defaults to unpkg for bundled fonts (so that we don't have to host them forever) and http url for others\n\n return this.urls.length ? this.urls[this.urls.length - 1].toString() : \"\";\n }\n\n}\nExcalidrawFontFace.UNPKG_FALLBACK_URL = `https://unpkg.com/${ true ? `${\"@zsviczian/excalidraw\"}@${({\"VITE_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"VITE_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"VITE_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"VITE_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"VITE_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"VITE_APP_PLUS_LP\":\"https://plus.excalidraw.com\",\"VITE_APP_PLUS_APP\":\"http://localhost:3000\",\"VITE_APP_AI_BACKEND\":\"http://localhost:3015\",\"VITE_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"VITE_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"VITE_APP_ENABLE_TRACKING\":\"true\",\"FAST_REFRESH\":\"false\",\"VITE_APP_PORT\":\"3000\",\"VITE_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"VITE_APP_COLLAPSE_OVERLAY\":\"true\",\"VITE_APP_ENABLE_ESLINT\":\"true\",\"VITE_APP_ENABLE_PWA\":\"false\",\"VITE_APP_PLUS_EXPORT_PUBLIC_KEY\":\"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm2g5T+Rub6Kbf1Mf57t0\\n7r2zeHuVg4dla3r5ryXMswtzz6x767octl6oLThn33mQsPSy3GKglFZoCTXJR4ij\\nba8SxB04sL/N8eRrKja7TFWjCVtRwTTfyy771NYYNFVJclkxHyE5qw4m27crHF1y\\nUNWEjuqNMi/lwAErS9fFa2oJlWyT8U7zzv/5kQREkxZI6y9v0AF3qcbsy2731FnD\\ns9ChJvOUW9toIab2gsIdrKW8ZNpu084ZFVKb6LNjvIXI1Se4oMTHeszXzNptzlot\\nkdxxjOoaQMAyfljFSot1F1FlU6MQlag7UnFGvFjRHN1JI5q4K+n3a67DX+TMyRqS\\nHQIDAQAB\",\"VITE_PKG_NAME\":\"@zsviczian/excalidraw\",\"VITE_PKG_VERSION\":\"0.17.6-27\",\"VITE_IS_EXCALIDRAW_NPM_PACKAGE\":true}).PKG_VERSION}` // should be provided by vite during package build\n: 0 // fallback to latest package version (i.e. for app)\n}/dist/prod/`;\n\n//# sourceURL=webpack://ExcalidrawLib/./fonts/ExcalidrawFontFace.ts?");
|
|
3438
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"ExcalidrawFontFace\": () => (/* binding */ ExcalidrawFontFace)\n/* harmony export */ });\n/* harmony import */ var _data_encode__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../data/encode */ \"./data/encode.ts\");\n/* harmony import */ var _obsidianUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../obsidianUtils */ \"./obsidianUtils.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils */ \"./utils.ts\");\n/* harmony import */ var _FontMetadata__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./FontMetadata */ \"./fonts/FontMetadata.ts\");\n/* harmony import */ var _subset_subset_main__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../subset/subset-main */ \"./subset/subset-main.ts\");\n\n\n\n\n\nclass ExcalidrawFontFace {\n constructor(family, uri, descriptors) {\n this.urls = ExcalidrawFontFace.createUrls(uri);\n const sources = this.urls.map(url => `url(${url}) ${ExcalidrawFontFace.getFormat(url)}`).join(\", \");\n this.fontFace = new FontFace(family, sources, Object.assign({\n display: \"swap\",\n style: \"normal\",\n weight: \"400\"\n }, descriptors));\n }\n /**\n * Generates CSS `@font-face` definition with the (subsetted) font source as a data url for the characters within the unicode range.\n *\n * Retrieves `undefined` otherwise.\n */\n\n\n toCSS(characters) {\n // quick exit in case the characters are not within this font face's unicode range\n if (!this.getUnicodeRangeRegex().test(characters)) {\n return;\n } //zsviczian - only woffs are chopped into glyphs other fonts are returned as is\n\n\n if (typeof this.urls[0] === \"string\" && !this.urls[0].startsWith(\"data:font/woff2\")) {\n return Promise.resolve(`@font-face { font-family: ${this.fontFace.family}; src: url(${this.urls[0]}); }`);\n }\n\n const codepoints = Array.from(characters).map(char => char.codePointAt(0));\n return this.getContent(codepoints).then(content => `@font-face { font-family: ${this.fontFace.family}; src: url(${content}); }`);\n }\n /**\n * Tries to fetch woff2 content, based on the registered urls (from first to last, treated as fallbacks).\n *\n * @returns base64 with subsetted glyphs based on the passed codepoint, last defined url otherwise\n */\n\n\n async getContent(codePoints) {\n let i = 0;\n const errorMessages = [];\n\n while (i < this.urls.length) {\n const url = this.urls[i];\n\n try {\n const arrayBuffer = await this.fetchFont(url);\n const base64 = await (0,_subset_subset_main__WEBPACK_IMPORTED_MODULE_4__.subsetWoff2GlyphsByCodepoints)(arrayBuffer, codePoints);\n return base64;\n } catch (e) {\n errorMessages.push(`\"${url.toString()}\" returned error \"${e}\"`);\n }\n\n i++;\n }\n\n console.error(`Failed to fetch font family \"${this.fontFace.family}\"`, JSON.stringify(errorMessages, undefined, 2)); // in case of issues, at least return the last url as a content\n // defaults to unpkg for bundled fonts (so that we don't have to host them forever) and http url for others\n\n return this.urls.length ? this.urls[this.urls.length - 1].toString() : \"\";\n }\n\n fetchFont(url) {\n return (0,_utils__WEBPACK_IMPORTED_MODULE_2__.promiseTry)(async () => {\n const result = await (0,_obsidianUtils__WEBPACK_IMPORTED_MODULE_1__.fetchFontFromVault)(url); //zsviczian\n\n if (result) {\n return result;\n }\n\n const response = await fetch(url, {\n // always prefer cache (even stale), otherwise it always triggers an unnecessary validation request\n // which we don't need as we are controlling freshness of the fonts with the stable hash suffix in the url\n // https://developer.mozilla.org/en-US/docs/Web/API/Request/cache\n cache: \"force-cache\",\n headers: {\n Accept: \"font/woff2\"\n }\n });\n\n if (!response.ok) {\n const urlString = url instanceof URL ? url.toString() : \"dataurl\";\n throw new Error(`Failed to fetch \"${urlString}\": ${response.statusText}`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n return arrayBuffer;\n });\n }\n\n getUnicodeRangeRegex() {\n // using \\u{h} or \\u{hhhhh} to match any number of hex digits,\n // otherwise we would get an \"Invalid Unicode escape\" error\n // e.g. U+0-1007F -> \\u{0}-\\u{1007F}\n const unicodeRangeRegex = this.fontFace.unicodeRange.split(/,\\s*/).map(range => {\n const [start, end] = range.replace(\"U+\", \"\").split(\"-\");\n\n if (end) {\n return `\\\\u{${start}}-\\\\u{${end}}`;\n }\n\n return `\\\\u{${start}}`;\n }).join(\"\");\n return new RegExp(`[${unicodeRangeRegex}]`, \"u\");\n }\n\n static createUrls(uri) {\n if (uri.startsWith(\"data\")) {\n // don't create the URL instance, as parsing the huge dataurl string is expensive\n return [uri];\n }\n\n if (uri.startsWith(_FontMetadata__WEBPACK_IMPORTED_MODULE_3__.LOCAL_FONT_PROTOCOL)) {\n // no url for local fonts\n return [];\n }\n\n if (uri.startsWith(\"http\")) {\n // one url for http imports or data url\n return [new URL(uri)];\n } // absolute assets paths, which are found in tests and excalidraw-app build, won't work with base url, so we are stripping initial slash away\n\n\n const assetUrl = uri.replace(/^\\/+/, \"\");\n const urls = [];\n\n if (typeof window.EXCALIDRAW_ASSET_PATH === \"string\") {\n const normalizedBaseUrl = this.normalizeBaseUrl(window.EXCALIDRAW_ASSET_PATH);\n urls.push(new URL(assetUrl, normalizedBaseUrl));\n } else if (Array.isArray(window.EXCALIDRAW_ASSET_PATH)) {\n window.EXCALIDRAW_ASSET_PATH.forEach(path => {\n const normalizedBaseUrl = this.normalizeBaseUrl(path);\n urls.push(new URL(assetUrl, normalizedBaseUrl));\n });\n } // fallback url for bundled fonts\n\n\n urls.push(new URL(assetUrl, ExcalidrawFontFace.UNPKG_FALLBACK_URL));\n return urls;\n }\n\n static getFormat(url) {\n if (!(url instanceof URL)) {\n // format is irrelevant for data url\n return \"\";\n }\n\n try {\n const parts = new URL(url).pathname.split(\".\");\n\n if (parts.length === 1) {\n return \"\";\n }\n\n return `format('${parts.pop()}')`;\n } catch (error) {\n return \"\";\n }\n }\n\n static normalizeBaseUrl(baseUrl) {\n var _a;\n\n let result = baseUrl; // in case user passed a root-relative url (~absolute path),\n // like \"/\" or \"/some/path\", or relative (starts with \"./\"),\n // prepend it with `location.origin`\n\n if (/^\\.?\\//.test(result)) {\n result = new URL(result.replace(/^\\.?\\/+/, \"\"), (_a = window === null || window === void 0 ? void 0 : window.location) === null || _a === void 0 ? void 0 : _a.origin).toString();\n } // ensure there is a trailing slash, otherwise url won't be correctly concatenated\n\n\n result = `${result.replace(/\\/+$/, \"\")}/`;\n return result;\n }\n /**\n * zsviczian https://github.com/zsviczian/excalidraw/commit/b4cfaaa4b4f46ca01f94e27fb7bf651a9da99daa\n */\n\n\n async getContentLegacy() {\n let i = 0;\n const errorMessages = [];\n\n while (i < this.urls.length) {\n const url = this.urls[i];\n\n if (typeof url === \"string\" && url.startsWith(\"data:\")) {\n // it's dataurl, the font is inlined as base64, no need to fetch\n return url;\n }\n\n try {\n const result = await (0,_obsidianUtils__WEBPACK_IMPORTED_MODULE_1__.fetchFontFromVault)(url); //zsviczian\n\n if (result) {\n return `data:font/woff2;base64,${await (0,_data_encode__WEBPACK_IMPORTED_MODULE_0__.stringToBase64)(await (0,_data_encode__WEBPACK_IMPORTED_MODULE_0__.toByteString)(result), true)}`;\n }\n\n const response = await fetch(url, {\n headers: {\n Accept: \"font/woff2\"\n }\n });\n\n if (response.ok) {\n const mimeType = response.headers.get(\"Content-Type\");\n const buffer = await response.arrayBuffer();\n return `data:${mimeType};base64,${await (0,_data_encode__WEBPACK_IMPORTED_MODULE_0__.stringToBase64)(await (0,_data_encode__WEBPACK_IMPORTED_MODULE_0__.toByteString)(buffer), true)}`;\n } // response not ok, try to continue\n\n\n errorMessages.push(`\"${url.toString()}\" returned status \"${response.status}\"`);\n } catch (e) {\n errorMessages.push(`\"${url.toString()}\" returned error \"${e}\"`);\n }\n\n i++;\n }\n\n console.error(`Failed to fetch font \"${this.fontFace.family}\" from urls \"${this.urls.toString()}`, JSON.stringify(errorMessages, undefined, 2)); // in case of issues, at least return the last url as a content\n // defaults to unpkg for bundled fonts (so that we don't have to host them forever) and http url for others\n\n return this.urls.length ? this.urls[this.urls.length - 1].toString() : \"\";\n }\n\n}\nExcalidrawFontFace.UNPKG_FALLBACK_URL = `https://unpkg.com/${ true ? `${\"@zsviczian/excalidraw\"}@${({\"VITE_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"VITE_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"VITE_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"VITE_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"VITE_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"VITE_APP_PLUS_LP\":\"https://plus.excalidraw.com\",\"VITE_APP_PLUS_APP\":\"http://localhost:3000\",\"VITE_APP_AI_BACKEND\":\"http://localhost:3015\",\"VITE_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"VITE_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"VITE_APP_ENABLE_TRACKING\":\"true\",\"FAST_REFRESH\":\"false\",\"VITE_APP_PORT\":\"3000\",\"VITE_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"VITE_APP_COLLAPSE_OVERLAY\":\"true\",\"VITE_APP_ENABLE_ESLINT\":\"true\",\"VITE_APP_ENABLE_PWA\":\"false\",\"VITE_APP_PLUS_EXPORT_PUBLIC_KEY\":\"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm2g5T+Rub6Kbf1Mf57t0\\n7r2zeHuVg4dla3r5ryXMswtzz6x767octl6oLThn33mQsPSy3GKglFZoCTXJR4ij\\nba8SxB04sL/N8eRrKja7TFWjCVtRwTTfyy771NYYNFVJclkxHyE5qw4m27crHF1y\\nUNWEjuqNMi/lwAErS9fFa2oJlWyT8U7zzv/5kQREkxZI6y9v0AF3qcbsy2731FnD\\ns9ChJvOUW9toIab2gsIdrKW8ZNpu084ZFVKb6LNjvIXI1Se4oMTHeszXzNptzlot\\nkdxxjOoaQMAyfljFSot1F1FlU6MQlag7UnFGvFjRHN1JI5q4K+n3a67DX+TMyRqS\\nHQIDAQAB\",\"VITE_PKG_NAME\":\"@zsviczian/excalidraw\",\"VITE_PKG_VERSION\":\"0.17.6-29\",\"VITE_IS_EXCALIDRAW_NPM_PACKAGE\":true}).PKG_VERSION}` // should be provided by vite during package build\n: 0 // fallback to latest package version (i.e. for app)\n}/dist/prod/`;\n\n//# sourceURL=webpack://ExcalidrawLib/./fonts/ExcalidrawFontFace.ts?");
|
|
3439
3439
|
|
|
3440
3440
|
/***/ }),
|
|
3441
3441
|
|
|
@@ -3809,7 +3809,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3809
3809
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3810
3810
|
|
|
3811
3811
|
"use strict";
|
|
3812
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants */ \"./constants.ts\");\n\n\nif (\"development\" !== _constants__WEBPACK_IMPORTED_MODULE_0__.ENV.TEST) {\n /* eslint-disable */\n\n /* global __webpack_public_path__:writable */\n __webpack_require__.p = window.EXCALIDRAW_ASSET_PATH || `https://unpkg.com/${\"@zsviczian/excalidraw\"}@${\"0.17.6-
|
|
3812
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants */ \"./constants.ts\");\n\n\nif (\"development\" !== _constants__WEBPACK_IMPORTED_MODULE_0__.ENV.TEST) {\n /* eslint-disable */\n\n /* global __webpack_public_path__:writable */\n __webpack_require__.p = window.EXCALIDRAW_ASSET_PATH || `https://unpkg.com/${\"@zsviczian/excalidraw\"}@${\"0.17.6-29\"}/dist/`;\n}\n\n//# sourceURL=webpack://ExcalidrawLib/./publicPath.js?");
|
|
3813
3813
|
|
|
3814
3814
|
/***/ }),
|
|
3815
3815
|
|
|
@@ -4227,7 +4227,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
4227
4227
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
4228
4228
|
|
|
4229
4229
|
"use strict";
|
|
4230
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"PromisePool\": () => (/* binding */ PromisePool),\n/* harmony export */ \"addEventListener\": () => (/* binding */ addEventListener),\n/* harmony export */ \"allowFullScreen\": () => (/* binding */ allowFullScreen),\n/* harmony export */ \"arrayToList\": () => (/* binding */ arrayToList),\n/* harmony export */ \"arrayToMap\": () => (/* binding */ arrayToMap),\n/* harmony export */ \"arrayToMapWithIndex\": () => (/* binding */ arrayToMapWithIndex),\n/* harmony export */ \"arrayToObject\": () => (/* binding */ arrayToObject),\n/* harmony export */ \"assertNever\": () => (/* binding */ assertNever),\n/* harmony export */ \"bytesToHexString\": () => (/* binding */ bytesToHexString),\n/* harmony export */ \"capitalizeString\": () => (/* binding */ capitalizeString),\n/* harmony export */ \"chunk\": () => (/* binding */ chunk),\n/* harmony export */ \"cloneJSON\": () => (/* binding */ cloneJSON),\n/* harmony export */ \"composeEventHandlers\": () => (/* binding */ composeEventHandlers),\n/* harmony export */ \"debounce\": () => (/* binding */ debounce),\n/* harmony export */ \"distance\": () => (/* binding */ distance),\n/* harmony export */ \"easeOut\": () => (/* binding */ easeOut),\n/* harmony export */ \"easeToValuesRAF\": () => (/* binding */ easeToValuesRAF),\n/* harmony export */ \"exitFullScreen\": () => (/* binding */ exitFullScreen),\n/* harmony export */ \"findIndex\": () => (/* binding */ findIndex),\n/* harmony export */ \"findLastIndex\": () => (/* binding */ findLastIndex),\n/* harmony export */ \"focusNearestParent\": () => (/* binding */ focusNearestParent),\n/* harmony export */ \"getDateTime\": () => (/* binding */ getDateTime),\n/* harmony export */ \"getFontFamilyString\": () => (/* binding */ getFontFamilyString),\n/* harmony export */ \"getFontString\": () => (/* binding */ getFontString),\n/* harmony export */ \"getFrame\": () => (/* binding */ getFrame),\n/* harmony export */ \"getGlobalCSSVariable\": () => (/* binding */ getGlobalCSSVariable),\n/* harmony export */ \"getNearestScrollableContainer\": () => (/* binding */ getNearestScrollableContainer),\n/* harmony export */ \"getShortcutKey\": () => (/* binding */ getShortcutKey),\n/* harmony export */ \"getSvgPathFromStroke\": () => (/* binding */ getSvgPathFromStroke),\n/* harmony export */ \"getUpdatedTimestamp\": () => (/* binding */ getUpdatedTimestamp),\n/* harmony export */ \"getVersion\": () => (/* binding */ getVersion),\n/* harmony export */ \"invariant\": () => (/* binding */ invariant),\n/* harmony export */ \"isAnyTrue\": () => (/* binding */ isAnyTrue),\n/* harmony export */ \"isDevEnv\": () => (/* binding */ isDevEnv),\n/* harmony export */ \"isFullScreen\": () => (/* binding */ isFullScreen),\n/* harmony export */ \"isInputLike\": () => (/* binding */ isInputLike),\n/* harmony export */ \"isInteractive\": () => (/* binding */ isInteractive),\n/* harmony export */ \"isMemberOf\": () => (/* binding */ isMemberOf),\n/* harmony export */ \"isPrimitive\": () => (/* binding */ isPrimitive),\n/* harmony export */ \"isPromiseLike\": () => (/* binding */ isPromiseLike),\n/* harmony export */ \"isRTL\": () => (/* binding */ isRTL),\n/* harmony export */ \"isRunningInIframe\": () => (/* binding */ isRunningInIframe),\n/* harmony export */ \"isServerEnv\": () => (/* binding */ isServerEnv),\n/* harmony export */ \"isShallowEqual\": () => (/* binding */ isShallowEqual),\n/* harmony export */ \"isTestEnv\": () => (/* binding */ isTestEnv),\n/* harmony export */ \"isToolIcon\": () => (/* binding */ isToolIcon),\n/* harmony export */ \"isTransparent\": () => (/* binding */ isTransparent),\n/* harmony export */ \"isWritableElement\": () => (/* binding */ isWritableElement),\n/* harmony export */ \"memoize\": () => (/* binding */ memoize),\n/* harmony export */ \"muteFSAbortError\": () => (/* binding */ muteFSAbortError),\n/* harmony export */ \"nFormatter\": () => (/* binding */ nFormatter),\n/* harmony export */ \"normalizeEOL\": () => (/* binding */ normalizeEOL),\n/* harmony export */ \"preventUnload\": () => (/* binding */ preventUnload),\n/* harmony export */ \"promiseTry\": () => (/* binding */ promiseTry),\n/* harmony export */ \"queryFocusableElements\": () => (/* binding */ queryFocusableElements),\n/* harmony export */ \"removeSelection\": () => (/* binding */ removeSelection),\n/* harmony export */ \"resolvablePromise\": () => (/* binding */ resolvablePromise),\n/* harmony export */ \"safelyParseJSON\": () => (/* binding */ safelyParseJSON),\n/* harmony export */ \"sanitizeHTMLAttribute\": () => (/* binding */ sanitizeHTMLAttribute),\n/* harmony export */ \"sceneCoordsToViewportCoords\": () => (/* binding */ sceneCoordsToViewportCoords),\n/* harmony export */ \"selectNode\": () => (/* binding */ selectNode),\n/* harmony export */ \"setDateTimeForTests\": () => (/* binding */ setDateTimeForTests),\n/* harmony export */ \"supportsEmoji\": () => (/* binding */ supportsEmoji),\n/* harmony export */ \"throttleRAF\": () => (/* binding */ throttleRAF),\n/* harmony export */ \"toBrandedType\": () => (/* binding */ toBrandedType),\n/* harmony export */ \"tupleToCoors\": () => (/* binding */ tupleToCoors),\n/* harmony export */ \"updateActiveTool\": () => (/* binding */ updateActiveTool),\n/* harmony export */ \"updateObject\": () => (/* binding */ updateObject),\n/* harmony export */ \"updateStable\": () => (/* binding */ updateStable),\n/* harmony export */ \"viewportCoordsToSceneCoords\": () => (/* binding */ viewportCoordsToSceneCoords),\n/* harmony export */ \"wrapEvent\": () => (/* binding */ wrapEvent)\n/* harmony export */ });\n/* harmony import */ var es6_promise_pool__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! es6-promise-pool */ \"../../node_modules/es6-promise-pool/es6-promise-pool.js\");\n/* harmony import */ var es6_promise_pool__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(es6_promise_pool__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../math */ \"../math/index.ts\");\n/* harmony import */ var _colors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./colors */ \"./colors.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constants */ \"./constants.ts\");\n\n\n\n\nlet mockDateTime = null;\nconst setDateTimeForTests = dateTime => {\n mockDateTime = dateTime;\n};\nconst 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 return `${year}-${month}-${day}-${hr}${min}`;\n};\nconst capitalizeString = str => str.charAt(0).toUpperCase() + str.slice(1);\nconst isToolIcon = target => target instanceof HTMLElement && target.className.includes(\"ToolIcon\");\nconst isInputLike = target => target instanceof HTMLElement && target.dataset.type === \"wysiwyg\" || target instanceof HTMLBRElement || // newline in wysiwyg\ntarget instanceof HTMLInputElement || target instanceof HTMLTextAreaElement || target instanceof HTMLSelectElement;\nconst isInteractive = target => {\n return isInputLike(target) || target instanceof Element && !!target.closest(\"label, button\");\n};\nconst isWritableElement = target => target instanceof HTMLElement && target.dataset.type === \"wysiwyg\" || target instanceof HTMLBRElement || // newline in wysiwyg\ntarget instanceof HTMLTextAreaElement || target instanceof HTMLInputElement && (target.type === \"text\" || target.type === \"number\" || target.type === \"password\");\nconst getFontFamilyString = ({\n fontFamily\n}) => {\n for (const [fontFamilyString, id] of Object.entries(_constants__WEBPACK_IMPORTED_MODULE_3__.FONT_FAMILY)) {\n if (id === fontFamily) {\n // TODO: we should fallback first to generic family names first\n return `${fontFamilyString}${(0,_constants__WEBPACK_IMPORTED_MODULE_3__.getFontFamilyFallbacks)(id).map(x => `, ${x}`).join(\"\")}`;\n }\n }\n\n return _constants__WEBPACK_IMPORTED_MODULE_3__.WINDOWS_EMOJI_FALLBACK_FONT;\n};\n/** returns fontSize+fontFamily string for assignment to DOM elements */\n\nconst getFontString = ({\n fontSize,\n fontFamily\n}) => {\n return `${fontSize}px ${getFontFamilyString({\n fontFamily\n })}`;\n};\nconst debounce = (fn, timeout) => {\n let handle = 0;\n let lastArgs = null;\n\n const ret = (...args) => {\n lastArgs = args;\n clearTimeout(handle);\n handle = window.setTimeout(() => {\n lastArgs = null;\n fn(...args);\n }, timeout);\n };\n\n ret.flush = () => {\n clearTimeout(handle);\n\n if (lastArgs) {\n const _lastArgs = lastArgs;\n lastArgs = null;\n fn(..._lastArgs);\n }\n };\n\n ret.cancel = () => {\n lastArgs = null;\n clearTimeout(handle);\n };\n\n return ret;\n}; // throttle callback to execute once per animation frame\n\nconst throttleRAF = (fn, opts) => {\n let timerId = null;\n let lastArgs = null;\n let lastArgsTrailing = null;\n\n const scheduleFunc = args => {\n timerId = window.requestAnimationFrame(() => {\n timerId = null;\n fn(...args);\n lastArgs = null;\n\n if (lastArgsTrailing) {\n lastArgs = lastArgsTrailing;\n lastArgsTrailing = null;\n scheduleFunc(lastArgs);\n }\n });\n };\n\n const ret = (...args) => {\n if (false) {}\n\n lastArgs = args;\n\n if (timerId === null) {\n scheduleFunc(lastArgs);\n } else if (opts === null || opts === void 0 ? void 0 : opts.trailing) {\n lastArgsTrailing = args;\n }\n };\n\n ret.flush = () => {\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n\n if (lastArgs) {\n fn(...(lastArgsTrailing || lastArgs));\n lastArgs = lastArgsTrailing = null;\n }\n };\n\n ret.cancel = () => {\n lastArgs = lastArgsTrailing = null;\n\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n };\n\n return ret;\n};\n/**\n * Exponential ease-out method\n *\n * @param {number} k - The value to be tweened.\n * @returns {number} The tweened value.\n */\n\nconst easeOut = k => {\n return 1 - Math.pow(1 - k, 4);\n};\n\nconst easeOutInterpolate = (from, to, progress) => {\n return (to - from) * easeOut(progress) + from;\n};\n/**\n * Animates values from `fromValues` to `toValues` using the requestAnimationFrame API.\n * Executes the `onStep` callback on each step with the interpolated values.\n * Returns a function that can be called to cancel the animation.\n *\n * @example\n * // Example usage:\n * const fromValues = { x: 0, y: 0 };\n * const toValues = { x: 100, y: 200 };\n * const onStep = ({x, y}) => {\n * setState(x, y)\n * };\n * const onCancel = () => {\n * console.log(\"Animation canceled\");\n * };\n *\n * const cancelAnimation = easeToValuesRAF({\n * fromValues,\n * toValues,\n * onStep,\n * onCancel,\n * });\n *\n * // To cancel the animation:\n * cancelAnimation();\n */\n\n\nconst easeToValuesRAF = ({\n fromValues,\n toValues,\n onStep,\n duration = 250,\n interpolateValue,\n onStart,\n onEnd,\n onCancel\n}) => {\n let canceled = false;\n let frameId = 0;\n let startTime;\n\n function step(timestamp) {\n if (canceled) {\n return;\n }\n\n if (startTime === undefined) {\n startTime = timestamp;\n onStart === null || onStart === void 0 ? void 0 : onStart();\n }\n\n const elapsed = Math.min(timestamp - startTime, duration);\n const factor = easeOut(elapsed / duration);\n const newValues = {};\n Object.keys(fromValues).forEach(key => {\n const _key = key;\n const result = (toValues[_key] - fromValues[_key]) * factor + fromValues[_key];\n newValues[_key] = result;\n });\n onStep(newValues);\n\n if (elapsed < duration) {\n const progress = elapsed / duration;\n const newValues = {};\n Object.keys(fromValues).forEach(key => {\n const _key = key;\n const startValue = fromValues[_key];\n const endValue = toValues[_key];\n let result;\n result = interpolateValue ? interpolateValue(startValue, endValue, progress, _key) : easeOutInterpolate(startValue, endValue, progress);\n\n if (result == null) {\n result = easeOutInterpolate(startValue, endValue, progress);\n }\n\n newValues[_key] = result;\n });\n onStep(newValues);\n frameId = window.requestAnimationFrame(step);\n } else {\n onStep(toValues);\n onEnd === null || onEnd === void 0 ? void 0 : onEnd();\n }\n }\n\n frameId = window.requestAnimationFrame(step);\n return () => {\n onCancel === null || onCancel === void 0 ? void 0 : onCancel();\n canceled = true;\n window.cancelAnimationFrame(frameId);\n };\n}; // https://github.com/lodash/lodash/blob/es/chunk.js\n\nconst chunk = (array, size) => {\n if (!array.length || size < 1) {\n return [];\n }\n\n let index = 0;\n let resIndex = 0;\n const result = Array(Math.ceil(array.length / size));\n\n while (index < array.length) {\n result[resIndex++] = array.slice(index, index += size);\n }\n\n return result;\n};\nconst selectNode = node => {\n const selection = window.getSelection();\n\n if (selection) {\n const range = document.createRange();\n range.selectNodeContents(node);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n};\nconst removeSelection = () => {\n const selection = window.getSelection();\n\n if (selection) {\n selection.removeAllRanges();\n }\n};\nconst distance = (x, y) => Math.abs(x - y);\nconst updateActiveTool = (appState, data) => {\n var _a, _b;\n\n if (data.type === \"custom\") {\n return Object.assign(Object.assign({}, appState.activeTool), {\n type: \"custom\",\n customType: data.customType,\n locked: (_a = data.locked) !== null && _a !== void 0 ? _a : appState.activeTool.locked\n });\n }\n\n return Object.assign(Object.assign({}, appState.activeTool), {\n lastActiveTool: data.lastActiveToolBeforeEraser === undefined ? appState.activeTool.lastActiveTool : data.lastActiveToolBeforeEraser,\n type: data.type,\n customType: null,\n locked: (_b = data.locked) !== null && _b !== void 0 ? _b : appState.activeTool.locked\n });\n};\nconst isFullScreen = () => {\n var _a;\n\n return ((_a = document.fullscreenElement) === null || _a === void 0 ? void 0 : _a.nodeName) === \"HTML\";\n};\nconst allowFullScreen = () => document.documentElement.requestFullscreen();\nconst exitFullScreen = () => document.exitFullscreen();\nconst getShortcutKey = shortcut => {\n shortcut = shortcut.replace(/\\bAlt\\b/i, \"Alt\").replace(/\\bShift\\b/i, \"Shift\").replace(/\\b(Enter|Return)\\b/i, \"Enter\");\n\n if (_constants__WEBPACK_IMPORTED_MODULE_3__.isDarwin) {\n return shortcut.replace(/\\bCtrlOrCmd\\b/gi, \"Cmd\").replace(/\\bAlt\\b/i, \"Option\");\n }\n\n return shortcut.replace(/\\bCtrlOrCmd\\b/gi, \"Ctrl\");\n};\nconst viewportCoordsToSceneCoords = ({\n clientX,\n clientY\n}, {\n zoom,\n offsetLeft,\n offsetTop,\n scrollX,\n scrollY\n}) => {\n const x = (clientX - offsetLeft) / zoom.value - scrollX;\n const y = (clientY - offsetTop) / zoom.value - scrollY;\n return {\n x,\n y\n };\n};\nconst sceneCoordsToViewportCoords = ({\n sceneX,\n sceneY\n}, {\n zoom,\n offsetLeft,\n offsetTop,\n scrollX,\n scrollY\n}) => {\n const x = (sceneX + scrollX) * zoom.value + offsetLeft;\n const y = (sceneY + scrollY) * zoom.value + offsetTop;\n return {\n x,\n y\n };\n};\nconst getGlobalCSSVariable = name => getComputedStyle(document.documentElement).getPropertyValue(`--${name}`);\nconst RS_LTR_CHARS = \"A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF\" + \"\\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 */\n\nconst isRTL = text => RE_RTL_CHECK.test(text);\nconst tupleToCoors = xyTuple => {\n const [x, y] = xyTuple;\n return {\n x,\n y\n };\n};\n/** use as a rejectionHandler to mute filesystem Abort errors */\n\nconst muteFSAbortError = error => {\n if ((error === null || error === void 0 ? void 0 : error.name) === \"AbortError\") {\n console.warn(error);\n return;\n }\n\n throw error;\n};\nconst findIndex = (array, cb, fromIndex = 0) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n\n fromIndex = Math.min(array.length, Math.max(fromIndex, 0));\n let index = fromIndex - 1;\n\n while (++index < array.length) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n\n return -1;\n};\nconst findLastIndex = (array, cb, fromIndex = array.length - 1) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n\n fromIndex = Math.min(array.length - 1, Math.max(fromIndex, 0));\n let index = fromIndex + 1;\n\n while (--index > -1) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n\n return -1;\n};\nconst isTransparent = color => {\n const isRGBTransparent = color.length === 5 && color.substr(4, 1) === \"0\";\n const isRRGGBBTransparent = color.length === 9 && color.substr(7, 2) === \"00\";\n return isRGBTransparent || isRRGGBBTransparent || color === _colors__WEBPACK_IMPORTED_MODULE_2__.COLOR_PALETTE.transparent;\n};\nconst resolvablePromise = () => {\n let resolve;\n let reject;\n const promise = new Promise((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n promise.resolve = resolve;\n promise.reject = reject;\n return promise;\n}; //https://stackoverflow.com/a/9462382/8418\n\nconst nFormatter = (num, digits) => {\n const si = [{\n value: 1,\n symbol: \"b\"\n }, {\n value: 1e3,\n symbol: \"k\"\n }, {\n value: 1e6,\n symbol: \"M\"\n }, {\n value: 1e9,\n symbol: \"G\"\n }];\n const rx = /\\.0+$|(\\.[0-9]*[1-9])0+$/;\n let index;\n\n for (index = si.length - 1; index > 0; index--) {\n if (num >= si[index].value) {\n break;\n }\n }\n\n return (num / si[index].value).toFixed(digits).replace(rx, \"$1\") + si[index].symbol;\n};\nconst getVersion = () => {\n var _a;\n\n return ((_a = document.querySelector('meta[name=\"version\"]')) === null || _a === void 0 ? void 0 : _a.content) || _constants__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_VERSION;\n}; // Adapted from https://github.com/Modernizr/Modernizr/blob/master/feature-detects/emoji.js\n\nconst supportsEmoji = () => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n return false;\n }\n\n const offset = 12;\n ctx.fillStyle = \"#f00\";\n ctx.textBaseline = \"top\";\n ctx.font = \"32px Arial\"; // Modernizr used 🐨, but it is sort of supported on Windows 7.\n // Luckily 😀 isn't supported.\n\n ctx.fillText(\"😀\", 0, 0);\n return ctx.getImageData(offset, offset, 1, 1).data[0] !== 0;\n};\nconst getNearestScrollableContainer = element => {\n let parent = element.parentElement;\n\n while (parent) {\n if (parent === document.body) {\n return document;\n }\n\n const {\n overflowY\n } = window.getComputedStyle(parent);\n const hasScrollableContent = parent.scrollHeight > parent.clientHeight;\n\n if (hasScrollableContent && (overflowY === \"auto\" || overflowY === \"scroll\" || overflowY === \"overlay\")) {\n return parent;\n }\n\n parent = parent.parentElement;\n }\n\n return document;\n};\nconst focusNearestParent = element => {\n let parent = element.parentElement;\n\n while (parent) {\n if (parent.tabIndex > -1) {\n parent.focus();\n return;\n }\n\n parent = parent.parentElement;\n }\n};\nconst preventUnload = event => {\n event.preventDefault(); // NOTE: modern browsers no longer allow showing a custom message here\n\n event.returnValue = \"\";\n};\nconst bytesToHexString = bytes => {\n return Array.from(bytes).map(byte => `0${byte.toString(16)}`.slice(-2)).join(\"\");\n};\nconst getUpdatedTimestamp = () => isTestEnv() ? 1 : Date.now();\n/**\n * Transforms array of objects containing `id` attribute,\n * or array of ids (strings), into a Map, keyd by `id`.\n */\n\nconst arrayToMap = items => {\n if (items instanceof Map) {\n return items;\n }\n\n return items.reduce((acc, element) => {\n acc.set(typeof element === \"string\" ? element : element.id, element);\n return acc;\n }, new Map());\n};\nconst arrayToMapWithIndex = elements => elements.reduce((acc, element, idx) => {\n acc.set(element.id, [element, idx]);\n return acc;\n}, new Map());\n/**\n * Transform array into an object, use only when array order is irrelevant.\n */\n\nconst arrayToObject = (array, groupBy) => array.reduce((acc, value) => {\n acc[groupBy ? groupBy(value) : String(value)] = value;\n return acc;\n}, {});\n/**\n * Creates a circular doubly linked list by adding `prev` and `next` props to the existing array nodes.\n */\n\nconst arrayToList = array => array.reduce((acc, curr, index) => {\n const node = Object.assign(Object.assign({}, curr), {\n prev: null,\n next: null\n }); // no-op for first item, we don't want circular references on a single item\n\n if (index !== 0) {\n const prevNode = acc[index - 1];\n node.prev = prevNode;\n prevNode.next = node;\n\n if (index === array.length - 1) {\n // make the references circular and connect head & tail\n const firstNode = acc[0];\n node.next = firstNode;\n firstNode.prev = node;\n }\n }\n\n acc.push(node);\n return acc;\n}, []);\nconst isTestEnv = () => \"development\" === \"test\";\nconst isDevEnv = () => \"development\" === \"development\";\nconst isServerEnv = () => {\n var _a;\n\n return typeof process !== \"undefined\" && !!((_a = process === null || process === void 0 ? void 0 : ({\"VITE_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"VITE_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"VITE_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"VITE_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"VITE_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"VITE_APP_PLUS_LP\":\"https://plus.excalidraw.com\",\"VITE_APP_PLUS_APP\":\"http://localhost:3000\",\"VITE_APP_AI_BACKEND\":\"http://localhost:3015\",\"VITE_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"VITE_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"VITE_APP_ENABLE_TRACKING\":\"true\",\"FAST_REFRESH\":\"false\",\"VITE_APP_PORT\":\"3000\",\"VITE_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"VITE_APP_COLLAPSE_OVERLAY\":\"true\",\"VITE_APP_ENABLE_ESLINT\":\"true\",\"VITE_APP_ENABLE_PWA\":\"false\",\"VITE_APP_PLUS_EXPORT_PUBLIC_KEY\":\"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm2g5T+Rub6Kbf1Mf57t0\\n7r2zeHuVg4dla3r5ryXMswtzz6x767octl6oLThn33mQsPSy3GKglFZoCTXJR4ij\\nba8SxB04sL/N8eRrKja7TFWjCVtRwTTfyy771NYYNFVJclkxHyE5qw4m27crHF1y\\nUNWEjuqNMi/lwAErS9fFa2oJlWyT8U7zzv/5kQREkxZI6y9v0AF3qcbsy2731FnD\\ns9ChJvOUW9toIab2gsIdrKW8ZNpu084ZFVKb6LNjvIXI1Se4oMTHeszXzNptzlot\\nkdxxjOoaQMAyfljFSot1F1FlU6MQlag7UnFGvFjRHN1JI5q4K+n3a67DX+TMyRqS\\nHQIDAQAB\",\"VITE_PKG_NAME\":\"@zsviczian/excalidraw\",\"VITE_PKG_VERSION\":\"0.17.6-27\",\"VITE_IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV);\n};\nconst wrapEvent = (name, nativeEvent) => {\n return new CustomEvent(name, {\n detail: {\n nativeEvent\n },\n cancelable: true\n });\n};\nconst updateObject = (obj, updates) => {\n let didChange = false;\n\n for (const key in updates) {\n const value = updates[key];\n\n if (typeof value !== \"undefined\") {\n if (obj[key] === value && ( // if object, always update because its attrs could have changed\n typeof value !== \"object\" || value === null)) {\n continue;\n }\n\n didChange = true;\n }\n }\n\n if (!didChange) {\n return obj;\n }\n\n return Object.assign(Object.assign({}, obj), updates);\n};\nconst isPrimitive = val => {\n const type = typeof val;\n return val == null || type !== \"object\" && type !== \"function\";\n};\nconst getFrame = () => {\n try {\n return window.self === window.top ? \"top\" : \"iframe\";\n } catch (error) {\n return \"iframe\";\n }\n};\nconst isRunningInIframe = () => getFrame() === \"iframe\";\nconst isPromiseLike = value => {\n return !!value && typeof value === \"object\" && \"then\" in value && \"catch\" in value && \"finally\" in value;\n};\nconst queryFocusableElements = container => {\n const focusableElements = container === null || container === void 0 ? void 0 : container.querySelectorAll(\"button, a, input, select, textarea, div[tabindex], label[tabindex]\");\n return focusableElements ? Array.from(focusableElements).filter(element => element.tabIndex > -1 && !element.disabled) : [];\n};\n/** use as a fallback after identity check (for perf reasons) */\n\nconst _defaultIsShallowComparatorFallback = (a, b) => {\n // consider two empty arrays equal\n if (Array.isArray(a) && Array.isArray(b) && a.length === 0 && b.length === 0) {\n return true;\n }\n\n return a === b;\n};\n/**\n * Returns whether object/array is shallow equal.\n * Considers empty object/arrays as equal (whether top-level or second-level).\n */\n\n\nconst isShallowEqual = (objA, objB, comparators, debug = false) => {\n const aKeys = Object.keys(objA);\n const bKeys = Object.keys(objB);\n\n if (aKeys.length !== bKeys.length) {\n if (debug) {\n console.warn(`%cisShallowEqual: objects don't have same properties ->`, \"color: #8B4000\", objA, objB);\n }\n\n return false;\n }\n\n if (comparators && Array.isArray(comparators)) {\n for (const key of comparators) {\n const ret = objA[key] === objB[key] || _defaultIsShallowComparatorFallback(objA[key], objB[key]);\n\n if (!ret) {\n if (debug) {\n console.warn(`%cisShallowEqual: ${key} not equal ->`, \"color: #8B4000\", objA[key], objB[key]);\n }\n\n return false;\n }\n }\n\n return true;\n }\n\n return aKeys.every(key => {\n const comparator = comparators === null || comparators === void 0 ? void 0 : comparators[key];\n const ret = comparator ? comparator(objA[key], objB[key]) : objA[key] === objB[key] || _defaultIsShallowComparatorFallback(objA[key], objB[key]);\n\n if (!ret && debug) {\n console.warn(`%cisShallowEqual: ${key} not equal ->`, \"color: #8B4000\", objA[key], objB[key]);\n }\n\n return ret;\n });\n}; // taken from Radix UI\n// https://github.com/radix-ui/primitives/blob/main/packages/core/primitive/src/primitive.tsx\n\nconst composeEventHandlers = (originalEventHandler, ourEventHandler, {\n checkForDefaultPrevented = true\n} = {}) => {\n return function handleEvent(event) {\n originalEventHandler === null || originalEventHandler === void 0 ? void 0 : originalEventHandler(event);\n\n if (!checkForDefaultPrevented || !(event === null || event === void 0 ? void 0 : event.defaultPrevented)) {\n return ourEventHandler === null || ourEventHandler === void 0 ? void 0 : ourEventHandler(event);\n }\n };\n};\n/**\n * supply `null` as message if non-never value is valid, you just need to\n * typecheck against it\n */\n\nconst assertNever = (value, message, softAssert) => {\n if (!message) {\n return value;\n }\n\n if (softAssert) {\n console.error(message);\n return value;\n }\n\n throw new Error(message);\n};\nfunction invariant(condition, message) {\n if (!condition) {\n throw new Error(message);\n }\n}\n/**\n * Memoizes on values of `opts` object (strict equality).\n */\n\nconst memoize = func => {\n let lastArgs;\n let lastResult;\n\n const ret = function (opts) {\n const currentArgs = Object.entries(opts);\n\n if (lastArgs) {\n let argsAreEqual = true;\n\n for (const [key, value] of currentArgs) {\n if (lastArgs.get(key) !== value) {\n argsAreEqual = false;\n break;\n }\n }\n\n if (argsAreEqual) {\n return lastResult;\n }\n }\n\n const result = func(opts);\n lastArgs = new Map(currentArgs);\n lastResult = result;\n return result;\n };\n\n ret.clear = () => {\n lastArgs = undefined;\n lastResult = undefined;\n };\n\n return ret;\n};\n/** Checks if value is inside given collection. Useful for type-safety. */\n\nconst isMemberOf = (\n/** Set/Map/Array/Object */\ncollection,\n/** value to look for */\nvalue) => {\n return collection instanceof Set || collection instanceof Map ? collection.has(value) : \"includes\" in collection ? collection.includes(value) : collection.hasOwnProperty(value);\n};\nconst cloneJSON = obj => JSON.parse(JSON.stringify(obj));\nconst updateStable = (prevValue, nextValue) => {\n if (isShallowEqual(prevValue, nextValue)) {\n return prevValue;\n }\n\n return nextValue;\n}; // implem\n\nfunction addEventListener(\n/**\n * allows for falsy values so you don't have to type check when adding\n * event listeners to optional elements\n */\ntarget, type, listener, options) {\n var _a;\n\n if (!target) {\n return () => {};\n }\n\n (_a = target === null || target === void 0 ? void 0 : target.addEventListener) === null || _a === void 0 ? void 0 : _a.call(target, type, listener, options);\n return () => {\n var _a;\n\n (_a = target === null || target === void 0 ? void 0 : target.removeEventListener) === null || _a === void 0 ? void 0 : _a.call(target, type, listener, options);\n };\n}\nfunction getSvgPathFromStroke(points, closed = true) {\n const len = points.length;\n\n if (len < 4) {\n return ``;\n }\n\n let a = points[0];\n let b = points[1];\n const c = points[2];\n let result = `M${a[0].toFixed(2)},${a[1].toFixed(2)} Q${b[0].toFixed(2)},${b[1].toFixed(2)} ${(0,_math__WEBPACK_IMPORTED_MODULE_1__.average)(b[0], c[0]).toFixed(2)},${(0,_math__WEBPACK_IMPORTED_MODULE_1__.average)(b[1], c[1]).toFixed(2)} T`;\n\n for (let i = 2, max = len - 1; i < max; i++) {\n a = points[i];\n b = points[i + 1];\n result += `${(0,_math__WEBPACK_IMPORTED_MODULE_1__.average)(a[0], b[0]).toFixed(2)},${(0,_math__WEBPACK_IMPORTED_MODULE_1__.average)(a[1], b[1]).toFixed(2)} `;\n }\n\n if (closed) {\n result += \"Z\";\n }\n\n return result;\n}\nconst normalizeEOL = str => {\n return str.replace(/\\r?\\n|\\r/g, \"\\n\");\n};\n/**\n * Makes type into a branded type, ensuring that value is assignable to\n * the base ubranded type. Optionally you can explicitly supply current value\n * type to combine both (useful for composite branded types. Make sure you\n * compose branded types which are not composite themselves.)\n */\n\nconst toBrandedType = value => {\n return value;\n}; // -----------------------------------------------------------------------------\n// Promise.try, adapted from https://github.com/sindresorhus/p-try\n\nconst promiseTry = async (fn, ...args) => {\n return new Promise(resolve => {\n resolve(fn(...args));\n });\n};\nconst isAnyTrue = (...args) => Math.max(...args.map(arg => arg ? 1 : 0)) > 0;\nconst safelyParseJSON = json => {\n try {\n return JSON.parse(json);\n } catch (_a) {\n return null;\n }\n};\nclass PromisePool {\n constructor(source, concurrency) {\n this.entries = {};\n this.pool = new (es6_promise_pool__WEBPACK_IMPORTED_MODULE_0___default())(source, concurrency);\n }\n\n all() {\n const listener = event => {\n if (event.data.result) {\n // by default pool does not return the results, so we are gathering them manually\n // with the correct call order (represented by the index in the tuple)\n const [index, value] = event.data.result;\n this.entries[index] = value;\n }\n };\n\n this.pool.addEventListener(\"fulfilled\", listener);\n return this.pool.start().then(() => {\n setTimeout(() => {\n this.pool.removeEventListener(\"fulfilled\", listener);\n });\n return Object.values(this.entries);\n });\n }\n\n}\nconst sanitizeHTMLAttribute = html => {\n return html // note, if we're not doing stupid things, escaping \" is enough,\n // but we might end up doing stupid things\n .replace(/\"/g, \""\") //.replace(/&/g, \"&\") //zsviczian\n //.replace(/'/g, \"'\")\n //.replace(/>/g, \">\")\n //.replace(/</g, \"<\")\n ;\n};\n\n//# sourceURL=webpack://ExcalidrawLib/./utils.ts?");
|
|
4230
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"PromisePool\": () => (/* binding */ PromisePool),\n/* harmony export */ \"addEventListener\": () => (/* binding */ addEventListener),\n/* harmony export */ \"allowFullScreen\": () => (/* binding */ allowFullScreen),\n/* harmony export */ \"arrayToList\": () => (/* binding */ arrayToList),\n/* harmony export */ \"arrayToMap\": () => (/* binding */ arrayToMap),\n/* harmony export */ \"arrayToMapWithIndex\": () => (/* binding */ arrayToMapWithIndex),\n/* harmony export */ \"arrayToObject\": () => (/* binding */ arrayToObject),\n/* harmony export */ \"assertNever\": () => (/* binding */ assertNever),\n/* harmony export */ \"bytesToHexString\": () => (/* binding */ bytesToHexString),\n/* harmony export */ \"capitalizeString\": () => (/* binding */ capitalizeString),\n/* harmony export */ \"chunk\": () => (/* binding */ chunk),\n/* harmony export */ \"cloneJSON\": () => (/* binding */ cloneJSON),\n/* harmony export */ \"composeEventHandlers\": () => (/* binding */ composeEventHandlers),\n/* harmony export */ \"debounce\": () => (/* binding */ debounce),\n/* harmony export */ \"distance\": () => (/* binding */ distance),\n/* harmony export */ \"easeOut\": () => (/* binding */ easeOut),\n/* harmony export */ \"easeToValuesRAF\": () => (/* binding */ easeToValuesRAF),\n/* harmony export */ \"exitFullScreen\": () => (/* binding */ exitFullScreen),\n/* harmony export */ \"findIndex\": () => (/* binding */ findIndex),\n/* harmony export */ \"findLastIndex\": () => (/* binding */ findLastIndex),\n/* harmony export */ \"focusNearestParent\": () => (/* binding */ focusNearestParent),\n/* harmony export */ \"getDateTime\": () => (/* binding */ getDateTime),\n/* harmony export */ \"getFontFamilyString\": () => (/* binding */ getFontFamilyString),\n/* harmony export */ \"getFontString\": () => (/* binding */ getFontString),\n/* harmony export */ \"getFrame\": () => (/* binding */ getFrame),\n/* harmony export */ \"getGlobalCSSVariable\": () => (/* binding */ getGlobalCSSVariable),\n/* harmony export */ \"getNearestScrollableContainer\": () => (/* binding */ getNearestScrollableContainer),\n/* harmony export */ \"getShortcutKey\": () => (/* binding */ getShortcutKey),\n/* harmony export */ \"getSvgPathFromStroke\": () => (/* binding */ getSvgPathFromStroke),\n/* harmony export */ \"getUpdatedTimestamp\": () => (/* binding */ getUpdatedTimestamp),\n/* harmony export */ \"getVersion\": () => (/* binding */ getVersion),\n/* harmony export */ \"invariant\": () => (/* binding */ invariant),\n/* harmony export */ \"isAnyTrue\": () => (/* binding */ isAnyTrue),\n/* harmony export */ \"isDevEnv\": () => (/* binding */ isDevEnv),\n/* harmony export */ \"isFullScreen\": () => (/* binding */ isFullScreen),\n/* harmony export */ \"isInputLike\": () => (/* binding */ isInputLike),\n/* harmony export */ \"isInteractive\": () => (/* binding */ isInteractive),\n/* harmony export */ \"isMemberOf\": () => (/* binding */ isMemberOf),\n/* harmony export */ \"isPrimitive\": () => (/* binding */ isPrimitive),\n/* harmony export */ \"isPromiseLike\": () => (/* binding */ isPromiseLike),\n/* harmony export */ \"isRTL\": () => (/* binding */ isRTL),\n/* harmony export */ \"isRunningInIframe\": () => (/* binding */ isRunningInIframe),\n/* harmony export */ \"isServerEnv\": () => (/* binding */ isServerEnv),\n/* harmony export */ \"isShallowEqual\": () => (/* binding */ isShallowEqual),\n/* harmony export */ \"isTestEnv\": () => (/* binding */ isTestEnv),\n/* harmony export */ \"isToolIcon\": () => (/* binding */ isToolIcon),\n/* harmony export */ \"isTransparent\": () => (/* binding */ isTransparent),\n/* harmony export */ \"isWritableElement\": () => (/* binding */ isWritableElement),\n/* harmony export */ \"memoize\": () => (/* binding */ memoize),\n/* harmony export */ \"muteFSAbortError\": () => (/* binding */ muteFSAbortError),\n/* harmony export */ \"nFormatter\": () => (/* binding */ nFormatter),\n/* harmony export */ \"normalizeEOL\": () => (/* binding */ normalizeEOL),\n/* harmony export */ \"preventUnload\": () => (/* binding */ preventUnload),\n/* harmony export */ \"promiseTry\": () => (/* binding */ promiseTry),\n/* harmony export */ \"queryFocusableElements\": () => (/* binding */ queryFocusableElements),\n/* harmony export */ \"removeSelection\": () => (/* binding */ removeSelection),\n/* harmony export */ \"resolvablePromise\": () => (/* binding */ resolvablePromise),\n/* harmony export */ \"safelyParseJSON\": () => (/* binding */ safelyParseJSON),\n/* harmony export */ \"sanitizeHTMLAttribute\": () => (/* binding */ sanitizeHTMLAttribute),\n/* harmony export */ \"sceneCoordsToViewportCoords\": () => (/* binding */ sceneCoordsToViewportCoords),\n/* harmony export */ \"selectNode\": () => (/* binding */ selectNode),\n/* harmony export */ \"setDateTimeForTests\": () => (/* binding */ setDateTimeForTests),\n/* harmony export */ \"supportsEmoji\": () => (/* binding */ supportsEmoji),\n/* harmony export */ \"throttleRAF\": () => (/* binding */ throttleRAF),\n/* harmony export */ \"toBrandedType\": () => (/* binding */ toBrandedType),\n/* harmony export */ \"tupleToCoors\": () => (/* binding */ tupleToCoors),\n/* harmony export */ \"updateActiveTool\": () => (/* binding */ updateActiveTool),\n/* harmony export */ \"updateObject\": () => (/* binding */ updateObject),\n/* harmony export */ \"updateStable\": () => (/* binding */ updateStable),\n/* harmony export */ \"viewportCoordsToSceneCoords\": () => (/* binding */ viewportCoordsToSceneCoords),\n/* harmony export */ \"wrapEvent\": () => (/* binding */ wrapEvent)\n/* harmony export */ });\n/* harmony import */ var es6_promise_pool__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! es6-promise-pool */ \"../../node_modules/es6-promise-pool/es6-promise-pool.js\");\n/* harmony import */ var es6_promise_pool__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(es6_promise_pool__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../math */ \"../math/index.ts\");\n/* harmony import */ var _colors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./colors */ \"./colors.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constants */ \"./constants.ts\");\n\n\n\n\nlet mockDateTime = null;\nconst setDateTimeForTests = dateTime => {\n mockDateTime = dateTime;\n};\nconst 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 return `${year}-${month}-${day}-${hr}${min}`;\n};\nconst capitalizeString = str => str.charAt(0).toUpperCase() + str.slice(1);\nconst isToolIcon = target => target instanceof HTMLElement && target.className.includes(\"ToolIcon\");\nconst isInputLike = target => target instanceof HTMLElement && target.dataset.type === \"wysiwyg\" || target instanceof HTMLBRElement || // newline in wysiwyg\ntarget instanceof HTMLInputElement || target instanceof HTMLTextAreaElement || target instanceof HTMLSelectElement;\nconst isInteractive = target => {\n return isInputLike(target) || target instanceof Element && !!target.closest(\"label, button\");\n};\nconst isWritableElement = target => target instanceof HTMLElement && target.dataset.type === \"wysiwyg\" || target instanceof HTMLBRElement || // newline in wysiwyg\ntarget instanceof HTMLTextAreaElement || target instanceof HTMLInputElement && (target.type === \"text\" || target.type === \"number\" || target.type === \"password\");\nconst getFontFamilyString = ({\n fontFamily\n}) => {\n for (const [fontFamilyString, id] of Object.entries(_constants__WEBPACK_IMPORTED_MODULE_3__.FONT_FAMILY)) {\n if (id === fontFamily) {\n // TODO: we should fallback first to generic family names first\n return `${fontFamilyString}${(0,_constants__WEBPACK_IMPORTED_MODULE_3__.getFontFamilyFallbacks)(id).map(x => `, ${x}`).join(\"\")}`;\n }\n }\n\n return _constants__WEBPACK_IMPORTED_MODULE_3__.WINDOWS_EMOJI_FALLBACK_FONT;\n};\n/** returns fontSize+fontFamily string for assignment to DOM elements */\n\nconst getFontString = ({\n fontSize,\n fontFamily\n}) => {\n return `${fontSize}px ${getFontFamilyString({\n fontFamily\n })}`;\n};\nconst debounce = (fn, timeout) => {\n let handle = 0;\n let lastArgs = null;\n\n const ret = (...args) => {\n lastArgs = args;\n clearTimeout(handle);\n handle = window.setTimeout(() => {\n lastArgs = null;\n fn(...args);\n }, timeout);\n };\n\n ret.flush = () => {\n clearTimeout(handle);\n\n if (lastArgs) {\n const _lastArgs = lastArgs;\n lastArgs = null;\n fn(..._lastArgs);\n }\n };\n\n ret.cancel = () => {\n lastArgs = null;\n clearTimeout(handle);\n };\n\n return ret;\n}; // throttle callback to execute once per animation frame\n\nconst throttleRAF = (fn, opts) => {\n let timerId = null;\n let lastArgs = null;\n let lastArgsTrailing = null;\n\n const scheduleFunc = args => {\n timerId = window.requestAnimationFrame(() => {\n timerId = null;\n fn(...args);\n lastArgs = null;\n\n if (lastArgsTrailing) {\n lastArgs = lastArgsTrailing;\n lastArgsTrailing = null;\n scheduleFunc(lastArgs);\n }\n });\n };\n\n const ret = (...args) => {\n if (false) {}\n\n lastArgs = args;\n\n if (timerId === null) {\n scheduleFunc(lastArgs);\n } else if (opts === null || opts === void 0 ? void 0 : opts.trailing) {\n lastArgsTrailing = args;\n }\n };\n\n ret.flush = () => {\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n\n if (lastArgs) {\n fn(...(lastArgsTrailing || lastArgs));\n lastArgs = lastArgsTrailing = null;\n }\n };\n\n ret.cancel = () => {\n lastArgs = lastArgsTrailing = null;\n\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n };\n\n return ret;\n};\n/**\n * Exponential ease-out method\n *\n * @param {number} k - The value to be tweened.\n * @returns {number} The tweened value.\n */\n\nconst easeOut = k => {\n return 1 - Math.pow(1 - k, 4);\n};\n\nconst easeOutInterpolate = (from, to, progress) => {\n return (to - from) * easeOut(progress) + from;\n};\n/**\n * Animates values from `fromValues` to `toValues` using the requestAnimationFrame API.\n * Executes the `onStep` callback on each step with the interpolated values.\n * Returns a function that can be called to cancel the animation.\n *\n * @example\n * // Example usage:\n * const fromValues = { x: 0, y: 0 };\n * const toValues = { x: 100, y: 200 };\n * const onStep = ({x, y}) => {\n * setState(x, y)\n * };\n * const onCancel = () => {\n * console.log(\"Animation canceled\");\n * };\n *\n * const cancelAnimation = easeToValuesRAF({\n * fromValues,\n * toValues,\n * onStep,\n * onCancel,\n * });\n *\n * // To cancel the animation:\n * cancelAnimation();\n */\n\n\nconst easeToValuesRAF = ({\n fromValues,\n toValues,\n onStep,\n duration = 250,\n interpolateValue,\n onStart,\n onEnd,\n onCancel\n}) => {\n let canceled = false;\n let frameId = 0;\n let startTime;\n\n function step(timestamp) {\n if (canceled) {\n return;\n }\n\n if (startTime === undefined) {\n startTime = timestamp;\n onStart === null || onStart === void 0 ? void 0 : onStart();\n }\n\n const elapsed = Math.min(timestamp - startTime, duration);\n const factor = easeOut(elapsed / duration);\n const newValues = {};\n Object.keys(fromValues).forEach(key => {\n const _key = key;\n const result = (toValues[_key] - fromValues[_key]) * factor + fromValues[_key];\n newValues[_key] = result;\n });\n onStep(newValues);\n\n if (elapsed < duration) {\n const progress = elapsed / duration;\n const newValues = {};\n Object.keys(fromValues).forEach(key => {\n const _key = key;\n const startValue = fromValues[_key];\n const endValue = toValues[_key];\n let result;\n result = interpolateValue ? interpolateValue(startValue, endValue, progress, _key) : easeOutInterpolate(startValue, endValue, progress);\n\n if (result == null) {\n result = easeOutInterpolate(startValue, endValue, progress);\n }\n\n newValues[_key] = result;\n });\n onStep(newValues);\n frameId = window.requestAnimationFrame(step);\n } else {\n onStep(toValues);\n onEnd === null || onEnd === void 0 ? void 0 : onEnd();\n }\n }\n\n frameId = window.requestAnimationFrame(step);\n return () => {\n onCancel === null || onCancel === void 0 ? void 0 : onCancel();\n canceled = true;\n window.cancelAnimationFrame(frameId);\n };\n}; // https://github.com/lodash/lodash/blob/es/chunk.js\n\nconst chunk = (array, size) => {\n if (!array.length || size < 1) {\n return [];\n }\n\n let index = 0;\n let resIndex = 0;\n const result = Array(Math.ceil(array.length / size));\n\n while (index < array.length) {\n result[resIndex++] = array.slice(index, index += size);\n }\n\n return result;\n};\nconst selectNode = node => {\n const selection = window.getSelection();\n\n if (selection) {\n const range = document.createRange();\n range.selectNodeContents(node);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n};\nconst removeSelection = () => {\n const selection = window.getSelection();\n\n if (selection) {\n selection.removeAllRanges();\n }\n};\nconst distance = (x, y) => Math.abs(x - y);\nconst updateActiveTool = (appState, data) => {\n var _a, _b;\n\n if (data.type === \"custom\") {\n return Object.assign(Object.assign({}, appState.activeTool), {\n type: \"custom\",\n customType: data.customType,\n locked: (_a = data.locked) !== null && _a !== void 0 ? _a : appState.activeTool.locked\n });\n }\n\n return Object.assign(Object.assign({}, appState.activeTool), {\n lastActiveTool: data.lastActiveToolBeforeEraser === undefined ? appState.activeTool.lastActiveTool : data.lastActiveToolBeforeEraser,\n type: data.type,\n customType: null,\n locked: (_b = data.locked) !== null && _b !== void 0 ? _b : appState.activeTool.locked\n });\n};\nconst isFullScreen = () => {\n var _a;\n\n return ((_a = document.fullscreenElement) === null || _a === void 0 ? void 0 : _a.nodeName) === \"HTML\";\n};\nconst allowFullScreen = () => document.documentElement.requestFullscreen();\nconst exitFullScreen = () => document.exitFullscreen();\nconst getShortcutKey = shortcut => {\n shortcut = shortcut.replace(/\\bAlt\\b/i, \"Alt\").replace(/\\bShift\\b/i, \"Shift\").replace(/\\b(Enter|Return)\\b/i, \"Enter\");\n\n if (_constants__WEBPACK_IMPORTED_MODULE_3__.isDarwin) {\n return shortcut.replace(/\\bCtrlOrCmd\\b/gi, \"Cmd\").replace(/\\bAlt\\b/i, \"Option\");\n }\n\n return shortcut.replace(/\\bCtrlOrCmd\\b/gi, \"Ctrl\");\n};\nconst viewportCoordsToSceneCoords = ({\n clientX,\n clientY\n}, {\n zoom,\n offsetLeft,\n offsetTop,\n scrollX,\n scrollY\n}) => {\n const x = (clientX - offsetLeft) / zoom.value - scrollX;\n const y = (clientY - offsetTop) / zoom.value - scrollY;\n return {\n x,\n y\n };\n};\nconst sceneCoordsToViewportCoords = ({\n sceneX,\n sceneY\n}, {\n zoom,\n offsetLeft,\n offsetTop,\n scrollX,\n scrollY\n}) => {\n const x = (sceneX + scrollX) * zoom.value + offsetLeft;\n const y = (sceneY + scrollY) * zoom.value + offsetTop;\n return {\n x,\n y\n };\n};\nconst getGlobalCSSVariable = name => getComputedStyle(document.documentElement).getPropertyValue(`--${name}`);\nconst RS_LTR_CHARS = \"A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF\" + \"\\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 */\n\nconst isRTL = text => RE_RTL_CHECK.test(text);\nconst tupleToCoors = xyTuple => {\n const [x, y] = xyTuple;\n return {\n x,\n y\n };\n};\n/** use as a rejectionHandler to mute filesystem Abort errors */\n\nconst muteFSAbortError = error => {\n if ((error === null || error === void 0 ? void 0 : error.name) === \"AbortError\") {\n console.warn(error);\n return;\n }\n\n throw error;\n};\nconst findIndex = (array, cb, fromIndex = 0) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n\n fromIndex = Math.min(array.length, Math.max(fromIndex, 0));\n let index = fromIndex - 1;\n\n while (++index < array.length) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n\n return -1;\n};\nconst findLastIndex = (array, cb, fromIndex = array.length - 1) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n\n fromIndex = Math.min(array.length - 1, Math.max(fromIndex, 0));\n let index = fromIndex + 1;\n\n while (--index > -1) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n\n return -1;\n};\nconst isTransparent = color => {\n const isRGBTransparent = color.length === 5 && color.substr(4, 1) === \"0\";\n const isRRGGBBTransparent = color.length === 9 && color.substr(7, 2) === \"00\";\n return isRGBTransparent || isRRGGBBTransparent || color === _colors__WEBPACK_IMPORTED_MODULE_2__.COLOR_PALETTE.transparent;\n};\nconst resolvablePromise = () => {\n let resolve;\n let reject;\n const promise = new Promise((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n promise.resolve = resolve;\n promise.reject = reject;\n return promise;\n}; //https://stackoverflow.com/a/9462382/8418\n\nconst nFormatter = (num, digits) => {\n const si = [{\n value: 1,\n symbol: \"b\"\n }, {\n value: 1e3,\n symbol: \"k\"\n }, {\n value: 1e6,\n symbol: \"M\"\n }, {\n value: 1e9,\n symbol: \"G\"\n }];\n const rx = /\\.0+$|(\\.[0-9]*[1-9])0+$/;\n let index;\n\n for (index = si.length - 1; index > 0; index--) {\n if (num >= si[index].value) {\n break;\n }\n }\n\n return (num / si[index].value).toFixed(digits).replace(rx, \"$1\") + si[index].symbol;\n};\nconst getVersion = () => {\n var _a;\n\n return ((_a = document.querySelector('meta[name=\"version\"]')) === null || _a === void 0 ? void 0 : _a.content) || _constants__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_VERSION;\n}; // Adapted from https://github.com/Modernizr/Modernizr/blob/master/feature-detects/emoji.js\n\nconst supportsEmoji = () => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n return false;\n }\n\n const offset = 12;\n ctx.fillStyle = \"#f00\";\n ctx.textBaseline = \"top\";\n ctx.font = \"32px Arial\"; // Modernizr used 🐨, but it is sort of supported on Windows 7.\n // Luckily 😀 isn't supported.\n\n ctx.fillText(\"😀\", 0, 0);\n return ctx.getImageData(offset, offset, 1, 1).data[0] !== 0;\n};\nconst getNearestScrollableContainer = element => {\n let parent = element.parentElement;\n\n while (parent) {\n if (parent === document.body) {\n return document;\n }\n\n const {\n overflowY\n } = window.getComputedStyle(parent);\n const hasScrollableContent = parent.scrollHeight > parent.clientHeight;\n\n if (hasScrollableContent && (overflowY === \"auto\" || overflowY === \"scroll\" || overflowY === \"overlay\")) {\n return parent;\n }\n\n parent = parent.parentElement;\n }\n\n return document;\n};\nconst focusNearestParent = element => {\n let parent = element.parentElement;\n\n while (parent) {\n if (parent.tabIndex > -1) {\n parent.focus();\n return;\n }\n\n parent = parent.parentElement;\n }\n};\nconst preventUnload = event => {\n event.preventDefault(); // NOTE: modern browsers no longer allow showing a custom message here\n\n event.returnValue = \"\";\n};\nconst bytesToHexString = bytes => {\n return Array.from(bytes).map(byte => `0${byte.toString(16)}`.slice(-2)).join(\"\");\n};\nconst getUpdatedTimestamp = () => isTestEnv() ? 1 : Date.now();\n/**\n * Transforms array of objects containing `id` attribute,\n * or array of ids (strings), into a Map, keyd by `id`.\n */\n\nconst arrayToMap = items => {\n if (items instanceof Map) {\n return items;\n }\n\n return items.reduce((acc, element) => {\n acc.set(typeof element === \"string\" ? element : element.id, element);\n return acc;\n }, new Map());\n};\nconst arrayToMapWithIndex = elements => elements.reduce((acc, element, idx) => {\n acc.set(element.id, [element, idx]);\n return acc;\n}, new Map());\n/**\n * Transform array into an object, use only when array order is irrelevant.\n */\n\nconst arrayToObject = (array, groupBy) => array.reduce((acc, value) => {\n acc[groupBy ? groupBy(value) : String(value)] = value;\n return acc;\n}, {});\n/**\n * Creates a circular doubly linked list by adding `prev` and `next` props to the existing array nodes.\n */\n\nconst arrayToList = array => array.reduce((acc, curr, index) => {\n const node = Object.assign(Object.assign({}, curr), {\n prev: null,\n next: null\n }); // no-op for first item, we don't want circular references on a single item\n\n if (index !== 0) {\n const prevNode = acc[index - 1];\n node.prev = prevNode;\n prevNode.next = node;\n\n if (index === array.length - 1) {\n // make the references circular and connect head & tail\n const firstNode = acc[0];\n node.next = firstNode;\n firstNode.prev = node;\n }\n }\n\n acc.push(node);\n return acc;\n}, []);\nconst isTestEnv = () => \"development\" === \"test\";\nconst isDevEnv = () => \"development\" === \"development\";\nconst isServerEnv = () => {\n var _a;\n\n return typeof process !== \"undefined\" && !!((_a = process === null || process === void 0 ? void 0 : ({\"VITE_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"VITE_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"VITE_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"VITE_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"VITE_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"VITE_APP_PLUS_LP\":\"https://plus.excalidraw.com\",\"VITE_APP_PLUS_APP\":\"http://localhost:3000\",\"VITE_APP_AI_BACKEND\":\"http://localhost:3015\",\"VITE_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"VITE_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"VITE_APP_ENABLE_TRACKING\":\"true\",\"FAST_REFRESH\":\"false\",\"VITE_APP_PORT\":\"3000\",\"VITE_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"VITE_APP_COLLAPSE_OVERLAY\":\"true\",\"VITE_APP_ENABLE_ESLINT\":\"true\",\"VITE_APP_ENABLE_PWA\":\"false\",\"VITE_APP_PLUS_EXPORT_PUBLIC_KEY\":\"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm2g5T+Rub6Kbf1Mf57t0\\n7r2zeHuVg4dla3r5ryXMswtzz6x767octl6oLThn33mQsPSy3GKglFZoCTXJR4ij\\nba8SxB04sL/N8eRrKja7TFWjCVtRwTTfyy771NYYNFVJclkxHyE5qw4m27crHF1y\\nUNWEjuqNMi/lwAErS9fFa2oJlWyT8U7zzv/5kQREkxZI6y9v0AF3qcbsy2731FnD\\ns9ChJvOUW9toIab2gsIdrKW8ZNpu084ZFVKb6LNjvIXI1Se4oMTHeszXzNptzlot\\nkdxxjOoaQMAyfljFSot1F1FlU6MQlag7UnFGvFjRHN1JI5q4K+n3a67DX+TMyRqS\\nHQIDAQAB\",\"VITE_PKG_NAME\":\"@zsviczian/excalidraw\",\"VITE_PKG_VERSION\":\"0.17.6-29\",\"VITE_IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV);\n};\nconst wrapEvent = (name, nativeEvent) => {\n return new CustomEvent(name, {\n detail: {\n nativeEvent\n },\n cancelable: true\n });\n};\nconst updateObject = (obj, updates) => {\n let didChange = false;\n\n for (const key in updates) {\n const value = updates[key];\n\n if (typeof value !== \"undefined\") {\n if (obj[key] === value && ( // if object, always update because its attrs could have changed\n typeof value !== \"object\" || value === null)) {\n continue;\n }\n\n didChange = true;\n }\n }\n\n if (!didChange) {\n return obj;\n }\n\n return Object.assign(Object.assign({}, obj), updates);\n};\nconst isPrimitive = val => {\n const type = typeof val;\n return val == null || type !== \"object\" && type !== \"function\";\n};\nconst getFrame = () => {\n try {\n return window.self === window.top ? \"top\" : \"iframe\";\n } catch (error) {\n return \"iframe\";\n }\n};\nconst isRunningInIframe = () => getFrame() === \"iframe\";\nconst isPromiseLike = value => {\n return !!value && typeof value === \"object\" && \"then\" in value && \"catch\" in value && \"finally\" in value;\n};\nconst queryFocusableElements = container => {\n const focusableElements = container === null || container === void 0 ? void 0 : container.querySelectorAll(\"button, a, input, select, textarea, div[tabindex], label[tabindex]\");\n return focusableElements ? Array.from(focusableElements).filter(element => element.tabIndex > -1 && !element.disabled) : [];\n};\n/** use as a fallback after identity check (for perf reasons) */\n\nconst _defaultIsShallowComparatorFallback = (a, b) => {\n // consider two empty arrays equal\n if (Array.isArray(a) && Array.isArray(b) && a.length === 0 && b.length === 0) {\n return true;\n }\n\n return a === b;\n};\n/**\n * Returns whether object/array is shallow equal.\n * Considers empty object/arrays as equal (whether top-level or second-level).\n */\n\n\nconst isShallowEqual = (objA, objB, comparators, debug = false) => {\n const aKeys = Object.keys(objA);\n const bKeys = Object.keys(objB);\n\n if (aKeys.length !== bKeys.length) {\n if (debug) {\n console.warn(`%cisShallowEqual: objects don't have same properties ->`, \"color: #8B4000\", objA, objB);\n }\n\n return false;\n }\n\n if (comparators && Array.isArray(comparators)) {\n for (const key of comparators) {\n const ret = objA[key] === objB[key] || _defaultIsShallowComparatorFallback(objA[key], objB[key]);\n\n if (!ret) {\n if (debug) {\n console.warn(`%cisShallowEqual: ${key} not equal ->`, \"color: #8B4000\", objA[key], objB[key]);\n }\n\n return false;\n }\n }\n\n return true;\n }\n\n return aKeys.every(key => {\n const comparator = comparators === null || comparators === void 0 ? void 0 : comparators[key];\n const ret = comparator ? comparator(objA[key], objB[key]) : objA[key] === objB[key] || _defaultIsShallowComparatorFallback(objA[key], objB[key]);\n\n if (!ret && debug) {\n console.warn(`%cisShallowEqual: ${key} not equal ->`, \"color: #8B4000\", objA[key], objB[key]);\n }\n\n return ret;\n });\n}; // taken from Radix UI\n// https://github.com/radix-ui/primitives/blob/main/packages/core/primitive/src/primitive.tsx\n\nconst composeEventHandlers = (originalEventHandler, ourEventHandler, {\n checkForDefaultPrevented = true\n} = {}) => {\n return function handleEvent(event) {\n originalEventHandler === null || originalEventHandler === void 0 ? void 0 : originalEventHandler(event);\n\n if (!checkForDefaultPrevented || !(event === null || event === void 0 ? void 0 : event.defaultPrevented)) {\n return ourEventHandler === null || ourEventHandler === void 0 ? void 0 : ourEventHandler(event);\n }\n };\n};\n/**\n * supply `null` as message if non-never value is valid, you just need to\n * typecheck against it\n */\n\nconst assertNever = (value, message, softAssert) => {\n if (!message) {\n return value;\n }\n\n if (softAssert) {\n console.error(message);\n return value;\n }\n\n throw new Error(message);\n};\nfunction invariant(condition, message) {\n if (!condition) {\n throw new Error(message);\n }\n}\n/**\n * Memoizes on values of `opts` object (strict equality).\n */\n\nconst memoize = func => {\n let lastArgs;\n let lastResult;\n\n const ret = function (opts) {\n const currentArgs = Object.entries(opts);\n\n if (lastArgs) {\n let argsAreEqual = true;\n\n for (const [key, value] of currentArgs) {\n if (lastArgs.get(key) !== value) {\n argsAreEqual = false;\n break;\n }\n }\n\n if (argsAreEqual) {\n return lastResult;\n }\n }\n\n const result = func(opts);\n lastArgs = new Map(currentArgs);\n lastResult = result;\n return result;\n };\n\n ret.clear = () => {\n lastArgs = undefined;\n lastResult = undefined;\n };\n\n return ret;\n};\n/** Checks if value is inside given collection. Useful for type-safety. */\n\nconst isMemberOf = (\n/** Set/Map/Array/Object */\ncollection,\n/** value to look for */\nvalue) => {\n return collection instanceof Set || collection instanceof Map ? collection.has(value) : \"includes\" in collection ? collection.includes(value) : collection.hasOwnProperty(value);\n};\nconst cloneJSON = obj => JSON.parse(JSON.stringify(obj));\nconst updateStable = (prevValue, nextValue) => {\n if (isShallowEqual(prevValue, nextValue)) {\n return prevValue;\n }\n\n return nextValue;\n}; // implem\n\nfunction addEventListener(\n/**\n * allows for falsy values so you don't have to type check when adding\n * event listeners to optional elements\n */\ntarget, type, listener, options) {\n var _a;\n\n if (!target) {\n return () => {};\n }\n\n (_a = target === null || target === void 0 ? void 0 : target.addEventListener) === null || _a === void 0 ? void 0 : _a.call(target, type, listener, options);\n return () => {\n var _a;\n\n (_a = target === null || target === void 0 ? void 0 : target.removeEventListener) === null || _a === void 0 ? void 0 : _a.call(target, type, listener, options);\n };\n}\nfunction getSvgPathFromStroke(points, closed = true) {\n const len = points.length;\n\n if (len < 4) {\n return ``;\n }\n\n let a = points[0];\n let b = points[1];\n const c = points[2];\n let result = `M${a[0].toFixed(2)},${a[1].toFixed(2)} Q${b[0].toFixed(2)},${b[1].toFixed(2)} ${(0,_math__WEBPACK_IMPORTED_MODULE_1__.average)(b[0], c[0]).toFixed(2)},${(0,_math__WEBPACK_IMPORTED_MODULE_1__.average)(b[1], c[1]).toFixed(2)} T`;\n\n for (let i = 2, max = len - 1; i < max; i++) {\n a = points[i];\n b = points[i + 1];\n result += `${(0,_math__WEBPACK_IMPORTED_MODULE_1__.average)(a[0], b[0]).toFixed(2)},${(0,_math__WEBPACK_IMPORTED_MODULE_1__.average)(a[1], b[1]).toFixed(2)} `;\n }\n\n if (closed) {\n result += \"Z\";\n }\n\n return result;\n}\nconst normalizeEOL = str => {\n return str.replace(/\\r?\\n|\\r/g, \"\\n\");\n};\n/**\n * Makes type into a branded type, ensuring that value is assignable to\n * the base ubranded type. Optionally you can explicitly supply current value\n * type to combine both (useful for composite branded types. Make sure you\n * compose branded types which are not composite themselves.)\n */\n\nconst toBrandedType = value => {\n return value;\n}; // -----------------------------------------------------------------------------\n// Promise.try, adapted from https://github.com/sindresorhus/p-try\n\nconst promiseTry = async (fn, ...args) => {\n return new Promise(resolve => {\n resolve(fn(...args));\n });\n};\nconst isAnyTrue = (...args) => Math.max(...args.map(arg => arg ? 1 : 0)) > 0;\nconst safelyParseJSON = json => {\n try {\n return JSON.parse(json);\n } catch (_a) {\n return null;\n }\n};\nclass PromisePool {\n constructor(source, concurrency) {\n this.entries = {};\n this.pool = new (es6_promise_pool__WEBPACK_IMPORTED_MODULE_0___default())(source, concurrency);\n }\n\n all() {\n const listener = event => {\n if (event.data.result) {\n // by default pool does not return the results, so we are gathering them manually\n // with the correct call order (represented by the index in the tuple)\n const [index, value] = event.data.result;\n this.entries[index] = value;\n }\n };\n\n this.pool.addEventListener(\"fulfilled\", listener);\n return this.pool.start().then(() => {\n setTimeout(() => {\n this.pool.removeEventListener(\"fulfilled\", listener);\n });\n return Object.values(this.entries);\n });\n }\n\n}\nconst sanitizeHTMLAttribute = html => {\n return html // note, if we're not doing stupid things, escaping \" is enough,\n // but we might end up doing stupid things\n .replace(/\"/g, \""\") //.replace(/&/g, \"&\") //zsviczian\n //.replace(/'/g, \"'\")\n //.replace(/>/g, \">\")\n //.replace(/</g, \"<\")\n ;\n};\n\n//# sourceURL=webpack://ExcalidrawLib/./utils.ts?");
|
|
4231
4231
|
|
|
4232
4232
|
/***/ }),
|
|
4233
4233
|
|
|
@@ -4652,7 +4652,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
4652
4652
|
\**********************************************************************/
|
|
4653
4653
|
/***/ ((module, exports, __webpack_require__) => {
|
|
4654
4654
|
|
|
4655
|
-
eval("/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\tlet m;\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\t// eslint-disable-next-line no-return-assign\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)) && parseInt(m[1], 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug');\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = ({\"VITE_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"VITE_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"VITE_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"VITE_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"VITE_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"VITE_APP_PLUS_LP\":\"https://plus.excalidraw.com\",\"VITE_APP_PLUS_APP\":\"http://localhost:3000\",\"VITE_APP_AI_BACKEND\":\"http://localhost:3015\",\"VITE_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"VITE_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"VITE_APP_ENABLE_TRACKING\":\"true\",\"FAST_REFRESH\":\"false\",\"VITE_APP_PORT\":\"3000\",\"VITE_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"VITE_APP_COLLAPSE_OVERLAY\":\"true\",\"VITE_APP_ENABLE_ESLINT\":\"true\",\"VITE_APP_ENABLE_PWA\":\"false\",\"VITE_APP_PLUS_EXPORT_PUBLIC_KEY\":\"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm2g5T+Rub6Kbf1Mf57t0\\n7r2zeHuVg4dla3r5ryXMswtzz6x767octl6oLThn33mQsPSy3GKglFZoCTXJR4ij\\nba8SxB04sL/N8eRrKja7TFWjCVtRwTTfyy771NYYNFVJclkxHyE5qw4m27crHF1y\\nUNWEjuqNMi/lwAErS9fFa2oJlWyT8U7zzv/5kQREkxZI6y9v0AF3qcbsy2731FnD\\ns9ChJvOUW9toIab2gsIdrKW8ZNpu084ZFVKb6LNjvIXI1Se4oMTHeszXzNptzlot\\nkdxxjOoaQMAyfljFSot1F1FlU6MQlag7UnFGvFjRHN1JI5q4K+n3a67DX+TMyRqS\\nHQIDAQAB\",\"VITE_PKG_NAME\":\"@zsviczian/excalidraw\",\"VITE_PKG_VERSION\":\"0.17.6-
|
|
4655
|
+
eval("/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\tlet m;\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\t// eslint-disable-next-line no-return-assign\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)) && parseInt(m[1], 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug');\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = ({\"VITE_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"VITE_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"VITE_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"VITE_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"VITE_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"VITE_APP_PLUS_LP\":\"https://plus.excalidraw.com\",\"VITE_APP_PLUS_APP\":\"http://localhost:3000\",\"VITE_APP_AI_BACKEND\":\"http://localhost:3015\",\"VITE_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"VITE_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"VITE_APP_ENABLE_TRACKING\":\"true\",\"FAST_REFRESH\":\"false\",\"VITE_APP_PORT\":\"3000\",\"VITE_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"VITE_APP_COLLAPSE_OVERLAY\":\"true\",\"VITE_APP_ENABLE_ESLINT\":\"true\",\"VITE_APP_ENABLE_PWA\":\"false\",\"VITE_APP_PLUS_EXPORT_PUBLIC_KEY\":\"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm2g5T+Rub6Kbf1Mf57t0\\n7r2zeHuVg4dla3r5ryXMswtzz6x767octl6oLThn33mQsPSy3GKglFZoCTXJR4ij\\nba8SxB04sL/N8eRrKja7TFWjCVtRwTTfyy771NYYNFVJclkxHyE5qw4m27crHF1y\\nUNWEjuqNMi/lwAErS9fFa2oJlWyT8U7zzv/5kQREkxZI6y9v0AF3qcbsy2731FnD\\ns9ChJvOUW9toIab2gsIdrKW8ZNpu084ZFVKb6LNjvIXI1Se4oMTHeszXzNptzlot\\nkdxxjOoaQMAyfljFSot1F1FlU6MQlag7UnFGvFjRHN1JI5q4K+n3a67DX+TMyRqS\\nHQIDAQAB\",\"VITE_PKG_NAME\":\"@zsviczian/excalidraw\",\"VITE_PKG_VERSION\":\"0.17.6-29\",\"VITE_IS_EXCALIDRAW_NPM_PACKAGE\":true}).DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = __webpack_require__(/*! ./common */ \"../../node_modules/micromark/node_modules/debug/src/common.js\")(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n\n\n//# sourceURL=webpack://ExcalidrawLib/../../node_modules/micromark/node_modules/debug/src/browser.js?");
|
|
4656
4656
|
|
|
4657
4657
|
/***/ }),
|
|
4658
4658
|
|
|
@@ -16433,7 +16433,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
16433
16433
|
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
16434
16434
|
|
|
16435
16435
|
"use strict";
|
|
16436
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n\n\nlet FORCE_COLOR, NODE_DISABLE_COLORS, NO_COLOR, TERM, isTTY=true;\nif (typeof process !== 'undefined') {\n\t({ FORCE_COLOR, NODE_DISABLE_COLORS, NO_COLOR, TERM } = ({\"VITE_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"VITE_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"VITE_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"VITE_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"VITE_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"VITE_APP_PLUS_LP\":\"https://plus.excalidraw.com\",\"VITE_APP_PLUS_APP\":\"http://localhost:3000\",\"VITE_APP_AI_BACKEND\":\"http://localhost:3015\",\"VITE_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"VITE_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"VITE_APP_ENABLE_TRACKING\":\"true\",\"FAST_REFRESH\":\"false\",\"VITE_APP_PORT\":\"3000\",\"VITE_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"VITE_APP_COLLAPSE_OVERLAY\":\"true\",\"VITE_APP_ENABLE_ESLINT\":\"true\",\"VITE_APP_ENABLE_PWA\":\"false\",\"VITE_APP_PLUS_EXPORT_PUBLIC_KEY\":\"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm2g5T+Rub6Kbf1Mf57t0\\n7r2zeHuVg4dla3r5ryXMswtzz6x767octl6oLThn33mQsPSy3GKglFZoCTXJR4ij\\nba8SxB04sL/N8eRrKja7TFWjCVtRwTTfyy771NYYNFVJclkxHyE5qw4m27crHF1y\\nUNWEjuqNMi/lwAErS9fFa2oJlWyT8U7zzv/5kQREkxZI6y9v0AF3qcbsy2731FnD\\ns9ChJvOUW9toIab2gsIdrKW8ZNpu084ZFVKb6LNjvIXI1Se4oMTHeszXzNptzlot\\nkdxxjOoaQMAyfljFSot1F1FlU6MQlag7UnFGvFjRHN1JI5q4K+n3a67DX+TMyRqS\\nHQIDAQAB\",\"VITE_PKG_NAME\":\"@zsviczian/excalidraw\",\"VITE_PKG_VERSION\":\"0.17.6-
|
|
16436
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n\n\nlet FORCE_COLOR, NODE_DISABLE_COLORS, NO_COLOR, TERM, isTTY=true;\nif (typeof process !== 'undefined') {\n\t({ FORCE_COLOR, NODE_DISABLE_COLORS, NO_COLOR, TERM } = ({\"VITE_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"VITE_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"VITE_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"VITE_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"VITE_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"VITE_APP_PLUS_LP\":\"https://plus.excalidraw.com\",\"VITE_APP_PLUS_APP\":\"http://localhost:3000\",\"VITE_APP_AI_BACKEND\":\"http://localhost:3015\",\"VITE_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"VITE_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"VITE_APP_ENABLE_TRACKING\":\"true\",\"FAST_REFRESH\":\"false\",\"VITE_APP_PORT\":\"3000\",\"VITE_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"VITE_APP_COLLAPSE_OVERLAY\":\"true\",\"VITE_APP_ENABLE_ESLINT\":\"true\",\"VITE_APP_ENABLE_PWA\":\"false\",\"VITE_APP_PLUS_EXPORT_PUBLIC_KEY\":\"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm2g5T+Rub6Kbf1Mf57t0\\n7r2zeHuVg4dla3r5ryXMswtzz6x767octl6oLThn33mQsPSy3GKglFZoCTXJR4ij\\nba8SxB04sL/N8eRrKja7TFWjCVtRwTTfyy771NYYNFVJclkxHyE5qw4m27crHF1y\\nUNWEjuqNMi/lwAErS9fFa2oJlWyT8U7zzv/5kQREkxZI6y9v0AF3qcbsy2731FnD\\ns9ChJvOUW9toIab2gsIdrKW8ZNpu084ZFVKb6LNjvIXI1Se4oMTHeszXzNptzlot\\nkdxxjOoaQMAyfljFSot1F1FlU6MQlag7UnFGvFjRHN1JI5q4K+n3a67DX+TMyRqS\\nHQIDAQAB\",\"VITE_PKG_NAME\":\"@zsviczian/excalidraw\",\"VITE_PKG_VERSION\":\"0.17.6-29\",\"VITE_IS_EXCALIDRAW_NPM_PACKAGE\":true}) || 0);\n\tisTTY = process.stdout && process.stdout.isTTY;\n}\n\nconst $ = {\n\tenabled: !NODE_DISABLE_COLORS && NO_COLOR == null && TERM !== 'dumb' && (\n\t\tFORCE_COLOR != null && FORCE_COLOR !== '0' || isTTY\n\t),\n\n\t// modifiers\n\treset: init(0, 0),\n\tbold: init(1, 22),\n\tdim: init(2, 22),\n\titalic: init(3, 23),\n\tunderline: init(4, 24),\n\tinverse: init(7, 27),\n\thidden: init(8, 28),\n\tstrikethrough: init(9, 29),\n\n\t// colors\n\tblack: init(30, 39),\n\tred: init(31, 39),\n\tgreen: init(32, 39),\n\tyellow: init(33, 39),\n\tblue: init(34, 39),\n\tmagenta: init(35, 39),\n\tcyan: init(36, 39),\n\twhite: init(37, 39),\n\tgray: init(90, 39),\n\tgrey: init(90, 39),\n\n\t// background colors\n\tbgBlack: init(40, 49),\n\tbgRed: init(41, 49),\n\tbgGreen: init(42, 49),\n\tbgYellow: init(43, 49),\n\tbgBlue: init(44, 49),\n\tbgMagenta: init(45, 49),\n\tbgCyan: init(46, 49),\n\tbgWhite: init(47, 49)\n};\n\nfunction run(arr, str) {\n\tlet i=0, tmp, beg='', end='';\n\tfor (; i < arr.length; i++) {\n\t\ttmp = arr[i];\n\t\tbeg += tmp.open;\n\t\tend += tmp.close;\n\t\tif (!!~str.indexOf(tmp.close)) {\n\t\t\tstr = str.replace(tmp.rgx, tmp.close + tmp.open);\n\t\t}\n\t}\n\treturn beg + str + end;\n}\n\nfunction chain(has, keys) {\n\tlet ctx = { has, keys };\n\n\tctx.reset = $.reset.bind(ctx);\n\tctx.bold = $.bold.bind(ctx);\n\tctx.dim = $.dim.bind(ctx);\n\tctx.italic = $.italic.bind(ctx);\n\tctx.underline = $.underline.bind(ctx);\n\tctx.inverse = $.inverse.bind(ctx);\n\tctx.hidden = $.hidden.bind(ctx);\n\tctx.strikethrough = $.strikethrough.bind(ctx);\n\n\tctx.black = $.black.bind(ctx);\n\tctx.red = $.red.bind(ctx);\n\tctx.green = $.green.bind(ctx);\n\tctx.yellow = $.yellow.bind(ctx);\n\tctx.blue = $.blue.bind(ctx);\n\tctx.magenta = $.magenta.bind(ctx);\n\tctx.cyan = $.cyan.bind(ctx);\n\tctx.white = $.white.bind(ctx);\n\tctx.gray = $.gray.bind(ctx);\n\tctx.grey = $.grey.bind(ctx);\n\n\tctx.bgBlack = $.bgBlack.bind(ctx);\n\tctx.bgRed = $.bgRed.bind(ctx);\n\tctx.bgGreen = $.bgGreen.bind(ctx);\n\tctx.bgYellow = $.bgYellow.bind(ctx);\n\tctx.bgBlue = $.bgBlue.bind(ctx);\n\tctx.bgMagenta = $.bgMagenta.bind(ctx);\n\tctx.bgCyan = $.bgCyan.bind(ctx);\n\tctx.bgWhite = $.bgWhite.bind(ctx);\n\n\treturn ctx;\n}\n\nfunction init(open, close) {\n\tlet blk = {\n\t\topen: `\\x1b[${open}m`,\n\t\tclose: `\\x1b[${close}m`,\n\t\trgx: new RegExp(`\\\\x1b\\\\[${close}m`, 'g')\n\t};\n\treturn function (txt) {\n\t\tif (this !== void 0 && this.has !== void 0) {\n\t\t\t!!~this.has.indexOf(open) || (this.has.push(open),this.keys.push(blk));\n\t\t\treturn txt === void 0 ? this : $.enabled ? run(this.keys, txt+'') : txt+'';\n\t\t}\n\t\treturn txt === void 0 ? chain([open], [blk]) : $.enabled ? run([blk], txt+'') : txt+'';\n\t};\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ($);\n\n\n//# sourceURL=webpack://ExcalidrawLib/../../node_modules/kleur/index.mjs?");
|
|
16437
16437
|
|
|
16438
16438
|
/***/ }),
|
|
16439
16439
|
|