@zsviczian/excalidraw 0.17.6-17 → 0.17.6-18
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.
- package/dist/excalidraw.development.js +6 -6
- package/dist/excalidraw.production.min.js +1 -1
- package/package.json +1 -1
- package/types/excalidraw/types.d.ts +1 -0
- package/types/excalidraw/components/MagicSettings.d.ts +0 -8
- package/types/excalidraw/components/Stats.d.ts +0 -11
- package/types/excalidraw/data/magic.d.ts +0 -23
- package/types/excalidraw/fonts/ExcalidrawFont.d.ts +0 -37
- package/types/excalidraw/fonts/metadata.d.ts +0 -37
- package/types/excalidraw/fonts/subset/subset-main.d.ts +0 -12
- package/types/excalidraw/fonts/subset/subset-shared.chunk.d.ts +0 -32
- package/types/excalidraw/fonts/subset/subset-worker.chunk.d.ts +0 -15
- package/types/excalidraw/fonts/wasm/hb-subset-bindings.d.ts +0 -45
- package/types/excalidraw/fonts/wasm/hb-subset-loader.d.ts +0 -13
- package/types/excalidraw/fonts/wasm/hb-subset-wasm.d.ts +0 -2
- package/types/excalidraw/fonts/wasm/hb-subset.bindings.d.ts +0 -45
- package/types/excalidraw/fonts/wasm/hb-subset.loader.d.ts +0 -5
- package/types/excalidraw/fonts/wasm/hb-subset.wasm.d.ts +0 -2
- package/types/excalidraw/fonts/wasm/woff2-bindings.d.ts +0 -31
- package/types/excalidraw/fonts/wasm/woff2-loader.d.ts +0 -14
- package/types/excalidraw/fonts/wasm/woff2-wasm.d.ts +0 -2
- package/types/excalidraw/fonts/wasm/woff2.bindings.d.ts +0 -31
- package/types/excalidraw/fonts/wasm/woff2.loader.d.ts +0 -6
- package/types/excalidraw/fonts/wasm/woff2.wasm.d.ts +0 -2
- package/types/excalidraw/fonts/woff2/Cascadia/index.d.ts +0 -2
- package/types/excalidraw/fonts/woff2/Comic/index.d.ts +0 -2
- package/types/excalidraw/fonts/woff2/Emoji/index.d.ts +0 -2
- package/types/excalidraw/fonts/woff2/Excalifont/index.d.ts +0 -2
- package/types/excalidraw/fonts/woff2/Helvetica/index.d.ts +0 -2
- package/types/excalidraw/fonts/woff2/Liberation/index.d.ts +0 -2
- package/types/excalidraw/fonts/woff2/Lilita/index.d.ts +0 -2
- package/types/excalidraw/fonts/woff2/Nunito/index.d.ts +0 -2
- package/types/excalidraw/fonts/woff2/Virgil/index.d.ts +0 -2
- package/types/excalidraw/fonts/woff2/Xiaolai/index.d.ts +0 -8
- package/types/excalidraw/ga.d.ts +0 -63
- package/types/excalidraw/gadirections.d.ts +0 -8
- package/types/excalidraw/galines.d.ts +0 -22
- package/types/excalidraw/gapoints.d.ts +0 -7
- package/types/excalidraw/gatransforms.d.ts +0 -10
- package/types/excalidraw/math.d.ts +0 -79
- package/types/excalidraw/scene/Fonts.d.ts +0 -19
- package/types/utils/geometry/geometry.d.ts +0 -89
|
@@ -803,7 +803,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
803
803
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
804
804
|
|
|
805
805
|
"use strict";
|
|
806
|
-
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-
|
|
806
|
+
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-17\",\"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?");
|
|
807
807
|
|
|
808
808
|
/***/ }),
|
|
809
809
|
|
|
@@ -2497,7 +2497,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
2497
2497
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2498
2498
|
|
|
2499
2499
|
"use strict";
|
|
2500
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Hyperlink\": () => (/* binding */ Hyperlink),\n/* harmony export */ \"getContextMenuLabel\": () => (/* binding */ getContextMenuLabel),\n/* harmony export */ \"hideHyperlinkToolip\": () => (/* binding */ hideHyperlinkToolip),\n/* harmony export */ \"showHyperlinkTooltip\": () => (/* binding */ showHyperlinkTooltip)\n/* harmony export */ });\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ \"../../node_modules/react/jsx-runtime.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils */ \"./utils.ts\");\n/* harmony import */ var _element_embeddable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../element/embeddable */ \"./element/embeddable.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../element/mutateElement */ \"./element/mutateElement.ts\");\n/* harmony import */ var _ToolButton__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ToolButton */ \"./components/ToolButton.tsx\");\n/* harmony import */ var _icons__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../icons */ \"./components/icons.tsx\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../i18n */ \"./i18n.ts\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! clsx */ \"../../node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../keys */ \"./keys.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../constants */ \"./constants.ts\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../element/bounds */ \"./element/bounds.ts\");\n/* harmony import */ var _components_Tooltip__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../components/Tooltip */ \"./components/Tooltip.tsx\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../scene */ \"./scene/index.ts\");\n/* harmony import */ var _element_collision__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../element/collision */ \"./element/collision.ts\");\n/* harmony import */ var _data_url__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../data/url */ \"./data/url.ts\");\n/* harmony import */ var _analytics__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../analytics */ \"./analytics.ts\");\n/* harmony import */ var _App__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../App */ \"./components/App.tsx\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../element/typeChecks */ \"./element/typeChecks.ts\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./helpers */ \"./components/hyperlink/helpers.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../../math */ \"../math/index.ts\");\n/* harmony import */ var _element_elementLink__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../element/elementLink */ \"./element/elementLink.ts\");\n/* harmony import */ var _Hyperlink_scss__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Hyperlink.scss */ \"./components/hyperlink/Hyperlink.scss\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst POPUP_WIDTH = 380;\nconst POPUP_HEIGHT = 42;\nconst POPUP_PADDING = 5;\nconst SPACE_BOTTOM = 85;\nconst AUTO_HIDE_TIMEOUT = 500;\nlet IS_HYPERLINK_TOOLTIP_VISIBLE = false;\nconst embeddableLinkCache = new Map();\nconst Hyperlink = ({\n element,\n elementsMap,\n setAppState,\n onLinkOpen,\n setToast,\n updateEmbedValidationStatus\n}) => {\n const appState = (0,_App__WEBPACK_IMPORTED_MODULE_17__.useExcalidrawAppState)();\n const appProps = (0,_App__WEBPACK_IMPORTED_MODULE_17__.useAppProps)();\n const device = (0,_App__WEBPACK_IMPORTED_MODULE_17__.useDevice)();\n const linkVal = element.link || \"\";\n const [inputVal, setInputVal] = (0,react__WEBPACK_IMPORTED_MODULE_7__.useState)(linkVal);\n const inputRef = (0,react__WEBPACK_IMPORTED_MODULE_7__.useRef)(null);\n const isEditing = appState.showHyperlinkPopup === \"editor\";\n const handleSubmit = (0,react__WEBPACK_IMPORTED_MODULE_7__.useCallback)(() => {\n var _a;\n\n if (!inputRef.current) {\n return;\n }\n\n const link = (0,_data_url__WEBPACK_IMPORTED_MODULE_15__.normalizeLink)(inputRef.current.value) || null;\n\n if (!element.link && link) {\n (0,_analytics__WEBPACK_IMPORTED_MODULE_16__.trackEvent)(\"hyperlink\", \"create\");\n }\n\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_18__.isEmbeddableElement)(element)) {\n if (((_a = appState.activeEmbeddable) === null || _a === void 0 ? void 0 : _a.element) === element) {\n setAppState({\n activeEmbeddable: null\n });\n }\n\n if (!link) {\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_3__.mutateElement)(element, {\n link: null\n });\n updateEmbedValidationStatus(element, false);\n return;\n }\n\n if (!(0,_element_embeddable__WEBPACK_IMPORTED_MODULE_2__.embeddableURLValidator)(link, appProps.validateEmbeddable)) {\n if (link) {\n setToast({\n message: (0,_i18n__WEBPACK_IMPORTED_MODULE_6__.t)(\"toast.unableToEmbed\"),\n closable: true\n });\n }\n\n element.link && embeddableLinkCache.set(element.id, element.link);\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_3__.mutateElement)(element, {\n link\n });\n updateEmbedValidationStatus(element, false);\n } else {\n const {\n width,\n height\n } = element;\n const embedLink = (0,_element_embeddable__WEBPACK_IMPORTED_MODULE_2__.getEmbedLink)(link);\n\n if ((embedLink === null || embedLink === void 0 ? void 0 : embedLink.error) instanceof URIError) {\n setToast({\n message: (0,_i18n__WEBPACK_IMPORTED_MODULE_6__.t)(\"toast.unrecognizedLinkFormat\"),\n closable: true\n });\n }\n\n const ar = embedLink ? embedLink.intrinsicSize.w / embedLink.intrinsicSize.h : 1;\n const hasLinkChanged = embeddableLinkCache.get(element.id) !== element.link;\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_3__.mutateElement)(element, Object.assign(Object.assign({}, hasLinkChanged ? {\n width: (embedLink === null || embedLink === void 0 ? void 0 : embedLink.type) === \"video\" ? width > height ? width : height * ar : width,\n height: (embedLink === null || embedLink === void 0 ? void 0 : embedLink.type) === \"video\" ? width > height ? width / ar : height : height\n } : {}), {\n link\n }));\n updateEmbedValidationStatus(element, true);\n\n if (embeddableLinkCache.has(element.id)) {\n embeddableLinkCache.delete(element.id);\n }\n }\n } else {\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_3__.mutateElement)(element, {\n link\n });\n }\n }, [element, setToast, appProps.validateEmbeddable, appState.activeEmbeddable, setAppState, updateEmbedValidationStatus]);\n (0,react__WEBPACK_IMPORTED_MODULE_7__.useLayoutEffect)(() => {\n return () => {\n handleSubmit();\n };\n }, [handleSubmit]);\n (0,react__WEBPACK_IMPORTED_MODULE_7__.useEffect)(() => {\n let timeoutId = null;\n\n if (inputRef && inputRef.current && !(device.viewport.isMobile || device.isTouchScreen)) {\n inputRef.current.select();\n }\n\n const handlePointerMove = event => {\n if (isEditing) {\n return;\n }\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n const shouldHide = shouldHideLinkPopup(element, elementsMap, appState, (0,_math__WEBPACK_IMPORTED_MODULE_20__.pointFrom)(event.clientX, event.clientY));\n\n if (shouldHide) {\n timeoutId = window.setTimeout(() => {\n setAppState({\n showHyperlinkPopup: false\n });\n }, AUTO_HIDE_TIMEOUT);\n }\n };\n\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_10__.EVENT.POINTER_MOVE, handlePointerMove, false);\n return () => {\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_10__.EVENT.POINTER_MOVE, handlePointerMove, false);\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n };\n }, [appState, element, isEditing, setAppState, elementsMap, device.viewport.isMobile, device.isTouchScreen]);\n const handleRemove = (0,react__WEBPACK_IMPORTED_MODULE_7__.useCallback)(() => {\n (0,_analytics__WEBPACK_IMPORTED_MODULE_16__.trackEvent)(\"hyperlink\", \"delete\");\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_3__.mutateElement)(element, {\n link: null\n });\n setAppState({\n showHyperlinkPopup: false\n });\n }, [setAppState, element]);\n\n const onEdit = () => {\n (0,_analytics__WEBPACK_IMPORTED_MODULE_16__.trackEvent)(\"hyperlink\", \"edit\", \"popup-ui\");\n setAppState({\n showHyperlinkPopup: \"editor\"\n });\n };\n\n const {\n x,\n y\n } = getCoordsForPopover(element, appState, elementsMap);\n\n if (appState.contextMenu || appState.selectedElementsAreBeingDragged || appState.resizingElement || appState.isRotating || appState.openMenu || appState.viewModeEnabled) {\n return null;\n }\n\n return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", Object.assign({\n className: \"excalidraw-hyperlinkContainer\",\n style: {\n top: `${y}px`,\n left: `${x}px`,\n width: POPUP_WIDTH,\n padding: POPUP_PADDING\n }\n }, {\n children: [isEditing ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"input\", {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(\"excalidraw-hyperlinkContainer-input\"),\n placeholder: (0,_i18n__WEBPACK_IMPORTED_MODULE_6__.t)(\"labels.link.hint\"),\n ref: inputRef,\n value: inputVal,\n onChange: event => setInputVal(event.target.value),\n autoFocus: true,\n onKeyDown: event => {\n event.stopPropagation(); // prevent cmd/ctrl+k shortcut when editing link\n\n if (event[_keys__WEBPACK_IMPORTED_MODULE_9__.KEYS.CTRL_OR_CMD] && event.key === _keys__WEBPACK_IMPORTED_MODULE_9__.KEYS.K) {\n event.preventDefault();\n }\n\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_9__.KEYS.ENTER || event.key === _keys__WEBPACK_IMPORTED_MODULE_9__.KEYS.ESCAPE) {\n handleSubmit();\n setAppState({\n showHyperlinkPopup: \"info\"\n });\n }\n }\n }) : element.link ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"a\", Object.assign({\n href: (0,_data_url__WEBPACK_IMPORTED_MODULE_15__.normalizeLink)(element.link || \"\"),\n className: \"excalidraw-hyperlinkContainer-link\",\n target: (0,_data_url__WEBPACK_IMPORTED_MODULE_15__.isLocalLink)(element.link) ? \"_self\" : \"_blank\",\n onClick: event => {\n if (element.link && onLinkOpen) {\n const customEvent = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.wrapEvent)(_constants__WEBPACK_IMPORTED_MODULE_10__.EVENT.EXCALIDRAW_LINK, event.nativeEvent);\n onLinkOpen(Object.assign(Object.assign({}, element), {\n link: (0,_data_url__WEBPACK_IMPORTED_MODULE_15__.normalizeLink)(element.link)\n }), customEvent);\n\n if (customEvent.defaultPrevented) {\n event.preventDefault();\n }\n }\n },\n rel: \"noopener noreferrer\"\n }, {\n children: element.link\n })) : (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({\n className: \"excalidraw-hyperlinkContainer-link\"\n }, {\n children: (0,_i18n__WEBPACK_IMPORTED_MODULE_6__.t)(\"labels.link.empty\")\n })), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", Object.assign({\n className: \"excalidraw-hyperlinkContainer__buttons\"\n }, {\n children: [!isEditing && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_ToolButton__WEBPACK_IMPORTED_MODULE_4__.ToolButton, {\n type: \"button\",\n title: (0,_i18n__WEBPACK_IMPORTED_MODULE_6__.t)(\"buttons.edit\"),\n \"aria-label\": (0,_i18n__WEBPACK_IMPORTED_MODULE_6__.t)(\"buttons.edit\"),\n label: (0,_i18n__WEBPACK_IMPORTED_MODULE_6__.t)(\"buttons.edit\"),\n onClick: onEdit,\n className: \"excalidraw-hyperlinkContainer--edit\",\n icon: _icons__WEBPACK_IMPORTED_MODULE_5__.FreedrawIcon\n }), linkVal && !(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_18__.isEmbeddableElement)(element) && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_ToolButton__WEBPACK_IMPORTED_MODULE_4__.ToolButton, {\n type: \"button\",\n title: (0,_i18n__WEBPACK_IMPORTED_MODULE_6__.t)(\"buttons.remove\"),\n \"aria-label\": (0,_i18n__WEBPACK_IMPORTED_MODULE_6__.t)(\"buttons.remove\"),\n label: (0,_i18n__WEBPACK_IMPORTED_MODULE_6__.t)(\"buttons.remove\"),\n onClick: handleRemove,\n className: \"excalidraw-hyperlinkContainer--remove\",\n icon: _icons__WEBPACK_IMPORTED_MODULE_5__.TrashIcon\n })]\n }))]\n }));\n};\n\nconst getCoordsForPopover = (element, appState, elementsMap) => {\n const [x1, y1] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_11__.getElementAbsoluteCoords)(element, elementsMap);\n const {\n x: viewportX,\n y: viewportY\n } = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.sceneCoordsToViewportCoords)({\n sceneX: x1 + element.width / 2,\n sceneY: y1\n }, appState);\n const x = viewportX - appState.offsetLeft - POPUP_WIDTH / 2;\n const y = viewportY - appState.offsetTop - SPACE_BOTTOM;\n return {\n x,\n y\n };\n};\n\nconst getContextMenuLabel = (elements, appState) => {\n var _a;\n\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_13__.getSelectedElements)(elements, appState);\n const label = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_18__.isEmbeddableElement)(selectedElements[0]) ? \"labels.link.editEmbed\" : ((_a = selectedElements[0]) === null || _a === void 0 ? void 0 : _a.link) ? \"labels.link.edit\" : \"labels.link.create\";\n return label;\n};\nlet HYPERLINK_TOOLTIP_TIMEOUT_ID = null;\nconst showHyperlinkTooltip = (element, appState, elementsMap) => {\n if (HYPERLINK_TOOLTIP_TIMEOUT_ID) {\n clearTimeout(HYPERLINK_TOOLTIP_TIMEOUT_ID);\n }\n\n HYPERLINK_TOOLTIP_TIMEOUT_ID = window.setTimeout(() => renderTooltip(element, appState, elementsMap), _constants__WEBPACK_IMPORTED_MODULE_10__.HYPERLINK_TOOLTIP_DELAY);\n};\n\nconst renderTooltip = (element, appState, elementsMap) => {\n if (!element.link) {\n return;\n }\n\n const tooltipDiv = (0,_components_Tooltip__WEBPACK_IMPORTED_MODULE_12__.getTooltipDiv)();\n tooltipDiv.classList.add(\"excalidraw-tooltip--visible\");\n tooltipDiv.style.maxWidth = \"20rem\";\n tooltipDiv.textContent = (0,_element_elementLink__WEBPACK_IMPORTED_MODULE_21__.isElementLink)(element.link) ? (0,_i18n__WEBPACK_IMPORTED_MODULE_6__.t)(\"labels.link.goToElement\") : element.link;\n const [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_11__.getElementAbsoluteCoords)(element, elementsMap);\n const [linkX, linkY, linkWidth, linkHeight] = (0,_helpers__WEBPACK_IMPORTED_MODULE_19__.getLinkHandleFromCoords)([x1, y1, x2, y2], element.angle, appState);\n const linkViewportCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.sceneCoordsToViewportCoords)({\n sceneX: linkX,\n sceneY: linkY\n }, appState);\n (0,_components_Tooltip__WEBPACK_IMPORTED_MODULE_12__.updateTooltipPosition)(tooltipDiv, {\n left: linkViewportCoords.x,\n top: linkViewportCoords.y,\n width: linkWidth,\n height: linkHeight\n }, \"top\");\n (0,_analytics__WEBPACK_IMPORTED_MODULE_16__.trackEvent)(\"hyperlink\", \"tooltip\", \"link-icon\");\n IS_HYPERLINK_TOOLTIP_VISIBLE = true;\n};\n\nconst hideHyperlinkToolip = () => {\n if (HYPERLINK_TOOLTIP_TIMEOUT_ID) {\n clearTimeout(HYPERLINK_TOOLTIP_TIMEOUT_ID);\n }\n\n if (IS_HYPERLINK_TOOLTIP_VISIBLE) {\n IS_HYPERLINK_TOOLTIP_VISIBLE = false;\n (0,_components_Tooltip__WEBPACK_IMPORTED_MODULE_12__.getTooltipDiv)().classList.remove(\"excalidraw-tooltip--visible\");\n }\n};\n\nconst shouldHideLinkPopup = (element, elementsMap, appState, [clientX, clientY]) => {\n const {\n x: sceneX,\n y: sceneY\n } = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.viewportCoordsToSceneCoords)({\n clientX,\n clientY\n }, appState);\n const threshold = 15 / appState.zoom.value; // hitbox to prevent hiding when hovered in element bounding box\n\n if ((0,_element_collision__WEBPACK_IMPORTED_MODULE_14__.hitElementBoundingBox)(sceneX, sceneY, element, elementsMap)) {\n return false;\n }\n\n const [x1, y1, x2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_11__.getElementAbsoluteCoords)(element, elementsMap); // hit box to prevent hiding when hovered in the vertical area between element and popover\n\n if (sceneX >= x1 && sceneX <= x2 && sceneY >= y1 - SPACE_BOTTOM && sceneY <= y1) {\n return false;\n } // hit box to prevent hiding when hovered around popover within threshold\n\n\n const {\n x: popoverX,\n y: popoverY\n } = getCoordsForPopover(element, appState, elementsMap);\n\n if (clientX >= popoverX - threshold && clientX <= popoverX + POPUP_WIDTH + POPUP_PADDING * 2 + threshold && clientY >= popoverY - threshold && clientY <= popoverY + threshold + POPUP_PADDING * 2 + POPUP_HEIGHT) {\n return false;\n }\n\n return true;\n};\n\n//# sourceURL=webpack://ExcalidrawLib/./components/hyperlink/Hyperlink.tsx?");
|
|
2500
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Hyperlink\": () => (/* binding */ Hyperlink),\n/* harmony export */ \"getContextMenuLabel\": () => (/* binding */ getContextMenuLabel),\n/* harmony export */ \"hideHyperlinkToolip\": () => (/* binding */ hideHyperlinkToolip),\n/* harmony export */ \"showHyperlinkTooltip\": () => (/* binding */ showHyperlinkTooltip)\n/* harmony export */ });\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ \"../../node_modules/react/jsx-runtime.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils */ \"./utils.ts\");\n/* harmony import */ var _element_embeddable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../element/embeddable */ \"./element/embeddable.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../element/mutateElement */ \"./element/mutateElement.ts\");\n/* harmony import */ var _ToolButton__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ToolButton */ \"./components/ToolButton.tsx\");\n/* harmony import */ var _icons__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../icons */ \"./components/icons.tsx\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../i18n */ \"./i18n.ts\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! clsx */ \"../../node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../keys */ \"./keys.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../constants */ \"./constants.ts\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../element/bounds */ \"./element/bounds.ts\");\n/* harmony import */ var _components_Tooltip__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../components/Tooltip */ \"./components/Tooltip.tsx\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../scene */ \"./scene/index.ts\");\n/* harmony import */ var _element_collision__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../element/collision */ \"./element/collision.ts\");\n/* harmony import */ var _data_url__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../data/url */ \"./data/url.ts\");\n/* harmony import */ var _analytics__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../analytics */ \"./analytics.ts\");\n/* harmony import */ var _App__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../App */ \"./components/App.tsx\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../element/typeChecks */ \"./element/typeChecks.ts\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./helpers */ \"./components/hyperlink/helpers.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../../math */ \"../math/index.ts\");\n/* harmony import */ var _element_elementLink__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../element/elementLink */ \"./element/elementLink.ts\");\n/* harmony import */ var _Hyperlink_scss__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Hyperlink.scss */ \"./components/hyperlink/Hyperlink.scss\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst POPUP_WIDTH = 380;\nconst POPUP_HEIGHT = 42;\nconst POPUP_PADDING = 5;\nconst SPACE_BOTTOM = 85;\nconst AUTO_HIDE_TIMEOUT = 500;\nlet IS_HYPERLINK_TOOLTIP_VISIBLE = false;\nconst embeddableLinkCache = new Map();\nconst Hyperlink = ({\n element,\n elementsMap,\n setAppState,\n onLinkOpen,\n setToast,\n updateEmbedValidationStatus\n}) => {\n const appState = (0,_App__WEBPACK_IMPORTED_MODULE_17__.useExcalidrawAppState)();\n const appProps = (0,_App__WEBPACK_IMPORTED_MODULE_17__.useAppProps)();\n const device = (0,_App__WEBPACK_IMPORTED_MODULE_17__.useDevice)();\n const linkVal = element.link || \"\";\n const [inputVal, setInputVal] = (0,react__WEBPACK_IMPORTED_MODULE_7__.useState)(linkVal);\n const inputRef = (0,react__WEBPACK_IMPORTED_MODULE_7__.useRef)(null);\n const isEditing = appState.showHyperlinkPopup === \"editor\";\n const handleSubmit = (0,react__WEBPACK_IMPORTED_MODULE_7__.useCallback)(() => {\n var _a;\n\n if (!inputRef.current) {\n return;\n }\n\n const link = (0,_data_url__WEBPACK_IMPORTED_MODULE_15__.normalizeLink)(inputRef.current.value) || null;\n\n if (!element.link && link) {\n (0,_analytics__WEBPACK_IMPORTED_MODULE_16__.trackEvent)(\"hyperlink\", \"create\");\n }\n\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_18__.isEmbeddableElement)(element)) {\n if (((_a = appState.activeEmbeddable) === null || _a === void 0 ? void 0 : _a.element) === element) {\n setAppState({\n activeEmbeddable: null\n });\n }\n\n if (!link) {\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_3__.mutateElement)(element, {\n link: null\n });\n updateEmbedValidationStatus(element, false);\n return;\n }\n\n if (!(0,_element_embeddable__WEBPACK_IMPORTED_MODULE_2__.embeddableURLValidator)(link, appProps.validateEmbeddable)) {\n if (link) {\n setToast({\n message: (0,_i18n__WEBPACK_IMPORTED_MODULE_6__.t)(\"toast.unableToEmbed\"),\n closable: true\n });\n }\n\n element.link && embeddableLinkCache.set(element.id, element.link);\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_3__.mutateElement)(element, {\n link\n });\n updateEmbedValidationStatus(element, false);\n } else {\n const {\n width,\n height\n } = element;\n const embedLink = (0,_element_embeddable__WEBPACK_IMPORTED_MODULE_2__.getEmbedLink)(link);\n\n if ((embedLink === null || embedLink === void 0 ? void 0 : embedLink.error) instanceof URIError) {\n setToast({\n message: (0,_i18n__WEBPACK_IMPORTED_MODULE_6__.t)(\"toast.unrecognizedLinkFormat\"),\n closable: true\n });\n }\n\n const ar = embedLink ? embedLink.intrinsicSize.w / embedLink.intrinsicSize.h : 1;\n const hasLinkChanged = embeddableLinkCache.get(element.id) !== element.link;\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_3__.mutateElement)(element, Object.assign(Object.assign({}, hasLinkChanged ? {\n width: (embedLink === null || embedLink === void 0 ? void 0 : embedLink.type) === \"video\" ? width > height ? width : height * ar : width,\n height: (embedLink === null || embedLink === void 0 ? void 0 : embedLink.type) === \"video\" ? width > height ? width / ar : height : height\n } : {}), {\n link\n }));\n updateEmbedValidationStatus(element, true);\n\n if (embeddableLinkCache.has(element.id)) {\n embeddableLinkCache.delete(element.id);\n }\n }\n } else {\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_3__.mutateElement)(element, {\n link\n });\n }\n }, [element, setToast, appProps.validateEmbeddable, appState.activeEmbeddable, setAppState, updateEmbedValidationStatus]);\n (0,react__WEBPACK_IMPORTED_MODULE_7__.useLayoutEffect)(() => {\n return () => {\n handleSubmit();\n };\n }, [handleSubmit]);\n (0,react__WEBPACK_IMPORTED_MODULE_7__.useEffect)(() => {\n let timeoutId = null;\n\n if (inputRef && inputRef.current && !(device.viewport.isMobile || device.isTouchScreen)) {\n inputRef.current.select();\n }\n\n const handlePointerMove = event => {\n if (isEditing) {\n return;\n }\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n const shouldHide = shouldHideLinkPopup(element, elementsMap, appState, (0,_math__WEBPACK_IMPORTED_MODULE_20__.pointFrom)(event.clientX, event.clientY));\n\n if (shouldHide) {\n timeoutId = window.setTimeout(() => {\n setAppState({\n showHyperlinkPopup: false\n });\n }, AUTO_HIDE_TIMEOUT);\n }\n };\n\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_10__.EVENT.POINTER_MOVE, handlePointerMove, false);\n return () => {\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_10__.EVENT.POINTER_MOVE, handlePointerMove, false);\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n };\n }, [appState, element, isEditing, setAppState, elementsMap, device.viewport.isMobile, device.isTouchScreen]);\n const handleRemove = (0,react__WEBPACK_IMPORTED_MODULE_7__.useCallback)(() => {\n (0,_analytics__WEBPACK_IMPORTED_MODULE_16__.trackEvent)(\"hyperlink\", \"delete\");\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_3__.mutateElement)(element, {\n link: null\n });\n setAppState({\n showHyperlinkPopup: false\n });\n }, [setAppState, element]);\n\n const onEdit = () => {\n (0,_analytics__WEBPACK_IMPORTED_MODULE_16__.trackEvent)(\"hyperlink\", \"edit\", \"popup-ui\");\n setAppState({\n showHyperlinkPopup: \"editor\"\n });\n };\n\n const {\n x,\n y\n } = getCoordsForPopover(element, appState, elementsMap);\n\n if (appState.contextMenu || appState.selectedElementsAreBeingDragged || appState.resizingElement || appState.isRotating || appState.openMenu || appState.viewModeEnabled) {\n return null;\n }\n\n return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", Object.assign({\n className: \"excalidraw-hyperlinkContainer\",\n style: {\n top: `${y}px`,\n left: `${x}px`,\n width: POPUP_WIDTH,\n padding: POPUP_PADDING\n }\n }, {\n children: [isEditing ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"input\", {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(\"excalidraw-hyperlinkContainer-input\"),\n placeholder: (0,_i18n__WEBPACK_IMPORTED_MODULE_6__.t)(\"labels.link.hint\"),\n ref: inputRef,\n value: inputVal,\n onChange: event => setInputVal(event.target.value),\n autoFocus: true,\n onKeyDown: event => {\n event.stopPropagation(); // prevent cmd/ctrl+k shortcut when editing link\n\n if (event[_keys__WEBPACK_IMPORTED_MODULE_9__.KEYS.CTRL_OR_CMD] && event.key === _keys__WEBPACK_IMPORTED_MODULE_9__.KEYS.K) {\n event.preventDefault();\n }\n\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_9__.KEYS.ENTER || event.key === _keys__WEBPACK_IMPORTED_MODULE_9__.KEYS.ESCAPE) {\n handleSubmit();\n setAppState({\n showHyperlinkPopup: \"info\"\n });\n }\n }\n }) : element.link ? (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"a\", Object.assign({\n href: (0,_data_url__WEBPACK_IMPORTED_MODULE_15__.normalizeLink)(element.link || \"\"),\n className: \"excalidraw-hyperlinkContainer-link\",\n target: (0,_data_url__WEBPACK_IMPORTED_MODULE_15__.isLocalLink)(element.link) ? \"_self\" : \"_blank\",\n onClick: event => {\n if (element.link && onLinkOpen) {\n const customEvent = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.wrapEvent)(_constants__WEBPACK_IMPORTED_MODULE_10__.EVENT.EXCALIDRAW_LINK, event.nativeEvent);\n onLinkOpen(Object.assign(Object.assign({}, element), {\n link: (0,_data_url__WEBPACK_IMPORTED_MODULE_15__.normalizeLink)(element.link)\n }), customEvent);\n\n if (customEvent.defaultPrevented) {\n event.preventDefault();\n }\n }\n },\n rel: \"noopener noreferrer\"\n }, {\n children: element.link\n })) : (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({\n className: \"excalidraw-hyperlinkContainer-link\"\n }, {\n children: (0,_i18n__WEBPACK_IMPORTED_MODULE_6__.t)(\"labels.link.empty\")\n })), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", Object.assign({\n className: \"excalidraw-hyperlinkContainer__buttons\"\n }, {\n children: [!isEditing && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_ToolButton__WEBPACK_IMPORTED_MODULE_4__.ToolButton, {\n type: \"button\",\n title: (0,_i18n__WEBPACK_IMPORTED_MODULE_6__.t)(\"buttons.edit\"),\n \"aria-label\": (0,_i18n__WEBPACK_IMPORTED_MODULE_6__.t)(\"buttons.edit\"),\n label: (0,_i18n__WEBPACK_IMPORTED_MODULE_6__.t)(\"buttons.edit\"),\n onClick: onEdit,\n className: \"excalidraw-hyperlinkContainer--edit\",\n icon: _icons__WEBPACK_IMPORTED_MODULE_5__.FreedrawIcon\n }), //zsviczian - do not show the Obsidian search button\n Boolean(appProps.insertLinkAction) && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_ToolButton__WEBPACK_IMPORTED_MODULE_4__.ToolButton, {\n type: \"button\",\n title: \"Obsidian Search\",\n \"aria-label\": \"Obsidian Search\",\n label: \"Obsidian Search\",\n onClick: () => {\n if (appProps.insertLinkAction) {\n setAppState({\n showHyperlinkPopup: false\n });\n appProps.insertLinkAction(inputVal);\n }\n },\n icon: _icons__WEBPACK_IMPORTED_MODULE_5__.searchIcon\n }), linkVal && !(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_18__.isEmbeddableElement)(element) && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_ToolButton__WEBPACK_IMPORTED_MODULE_4__.ToolButton, {\n type: \"button\",\n title: (0,_i18n__WEBPACK_IMPORTED_MODULE_6__.t)(\"buttons.remove\"),\n \"aria-label\": (0,_i18n__WEBPACK_IMPORTED_MODULE_6__.t)(\"buttons.remove\"),\n label: (0,_i18n__WEBPACK_IMPORTED_MODULE_6__.t)(\"buttons.remove\"),\n onClick: handleRemove,\n className: \"excalidraw-hyperlinkContainer--remove\",\n icon: _icons__WEBPACK_IMPORTED_MODULE_5__.TrashIcon\n })]\n }))]\n }));\n};\n\nconst getCoordsForPopover = (element, appState, elementsMap) => {\n const [x1, y1] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_11__.getElementAbsoluteCoords)(element, elementsMap);\n const {\n x: viewportX,\n y: viewportY\n } = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.sceneCoordsToViewportCoords)({\n sceneX: x1 + element.width / 2,\n sceneY: y1\n }, appState);\n const x = viewportX - appState.offsetLeft - POPUP_WIDTH / 2;\n const y = viewportY - appState.offsetTop - SPACE_BOTTOM;\n return {\n x,\n y\n };\n};\n\nconst getContextMenuLabel = (elements, appState) => {\n var _a;\n\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_13__.getSelectedElements)(elements, appState);\n const label = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_18__.isEmbeddableElement)(selectedElements[0]) ? \"labels.link.editEmbed\" : ((_a = selectedElements[0]) === null || _a === void 0 ? void 0 : _a.link) ? \"labels.link.edit\" : \"labels.link.create\";\n return label;\n};\nlet HYPERLINK_TOOLTIP_TIMEOUT_ID = null;\nconst showHyperlinkTooltip = (element, appState, elementsMap) => {\n if (HYPERLINK_TOOLTIP_TIMEOUT_ID) {\n clearTimeout(HYPERLINK_TOOLTIP_TIMEOUT_ID);\n }\n\n HYPERLINK_TOOLTIP_TIMEOUT_ID = window.setTimeout(() => renderTooltip(element, appState, elementsMap), _constants__WEBPACK_IMPORTED_MODULE_10__.HYPERLINK_TOOLTIP_DELAY);\n};\n\nconst renderTooltip = (element, appState, elementsMap) => {\n if (!element.link) {\n return;\n }\n\n const tooltipDiv = (0,_components_Tooltip__WEBPACK_IMPORTED_MODULE_12__.getTooltipDiv)();\n tooltipDiv.classList.add(\"excalidraw-tooltip--visible\");\n tooltipDiv.style.maxWidth = \"20rem\";\n tooltipDiv.textContent = (0,_element_elementLink__WEBPACK_IMPORTED_MODULE_21__.isElementLink)(element.link) ? (0,_i18n__WEBPACK_IMPORTED_MODULE_6__.t)(\"labels.link.goToElement\") : element.link;\n const [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_11__.getElementAbsoluteCoords)(element, elementsMap);\n const [linkX, linkY, linkWidth, linkHeight] = (0,_helpers__WEBPACK_IMPORTED_MODULE_19__.getLinkHandleFromCoords)([x1, y1, x2, y2], element.angle, appState);\n const linkViewportCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.sceneCoordsToViewportCoords)({\n sceneX: linkX,\n sceneY: linkY\n }, appState);\n (0,_components_Tooltip__WEBPACK_IMPORTED_MODULE_12__.updateTooltipPosition)(tooltipDiv, {\n left: linkViewportCoords.x,\n top: linkViewportCoords.y,\n width: linkWidth,\n height: linkHeight\n }, \"top\");\n (0,_analytics__WEBPACK_IMPORTED_MODULE_16__.trackEvent)(\"hyperlink\", \"tooltip\", \"link-icon\");\n IS_HYPERLINK_TOOLTIP_VISIBLE = true;\n};\n\nconst hideHyperlinkToolip = () => {\n if (HYPERLINK_TOOLTIP_TIMEOUT_ID) {\n clearTimeout(HYPERLINK_TOOLTIP_TIMEOUT_ID);\n }\n\n if (IS_HYPERLINK_TOOLTIP_VISIBLE) {\n IS_HYPERLINK_TOOLTIP_VISIBLE = false;\n (0,_components_Tooltip__WEBPACK_IMPORTED_MODULE_12__.getTooltipDiv)().classList.remove(\"excalidraw-tooltip--visible\");\n }\n};\n\nconst shouldHideLinkPopup = (element, elementsMap, appState, [clientX, clientY]) => {\n const {\n x: sceneX,\n y: sceneY\n } = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.viewportCoordsToSceneCoords)({\n clientX,\n clientY\n }, appState);\n const threshold = 15 / appState.zoom.value; // hitbox to prevent hiding when hovered in element bounding box\n\n if ((0,_element_collision__WEBPACK_IMPORTED_MODULE_14__.hitElementBoundingBox)(sceneX, sceneY, element, elementsMap)) {\n return false;\n }\n\n const [x1, y1, x2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_11__.getElementAbsoluteCoords)(element, elementsMap); // hit box to prevent hiding when hovered in the vertical area between element and popover\n\n if (sceneX >= x1 && sceneX <= x2 && sceneY >= y1 - SPACE_BOTTOM && sceneY <= y1) {\n return false;\n } // hit box to prevent hiding when hovered around popover within threshold\n\n\n const {\n x: popoverX,\n y: popoverY\n } = getCoordsForPopover(element, appState, elementsMap);\n\n if (clientX >= popoverX - threshold && clientX <= popoverX + POPUP_WIDTH + POPUP_PADDING * 2 + threshold && clientY >= popoverY - threshold && clientY <= popoverY + threshold + POPUP_PADDING * 2 + POPUP_HEIGHT) {\n return false;\n }\n\n return true;\n};\n\n//# sourceURL=webpack://ExcalidrawLib/./components/hyperlink/Hyperlink.tsx?");
|
|
2501
2501
|
|
|
2502
2502
|
/***/ }),
|
|
2503
2503
|
|
|
@@ -3179,7 +3179,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3179
3179
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3180
3180
|
|
|
3181
3181
|
"use strict";
|
|
3182
|
-
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 /**\r\n * Generates CSS `@font-face` definition with the (subsetted) font source as a data url for the characters within the unicode range.\r\n *\r\n * Retrieves `undefined` otherwise.\r\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 /**\r\n * Tries to fetch woff2 content, based on the registered urls (from first to last, treated as fallbacks).\r\n *\r\n * @returns base64 with subsetted glyphs based on the passed codepoint, last defined url otherwise\r\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 /**\r\n * zsviczian https://github.com/zsviczian/excalidraw/commit/b4cfaaa4b4f46ca01f94e27fb7bf651a9da99daa\r\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-16\",\"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?");
|
|
3182
|
+
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 /**\r\n * Generates CSS `@font-face` definition with the (subsetted) font source as a data url for the characters within the unicode range.\r\n *\r\n * Retrieves `undefined` otherwise.\r\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 /**\r\n * Tries to fetch woff2 content, based on the registered urls (from first to last, treated as fallbacks).\r\n *\r\n * @returns base64 with subsetted glyphs based on the passed codepoint, last defined url otherwise\r\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 /**\r\n * zsviczian https://github.com/zsviczian/excalidraw/commit/b4cfaaa4b4f46ca01f94e27fb7bf651a9da99daa\r\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-17\",\"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?");
|
|
3183
3183
|
|
|
3184
3184
|
/***/ }),
|
|
3185
3185
|
|
|
@@ -3476,7 +3476,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3476
3476
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3477
3477
|
|
|
3478
3478
|
"use strict";
|
|
3479
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Button\": () => (/* reexport safe */ _components_Button__WEBPACK_IMPORTED_MODULE_32__.Button),\n/* harmony export */ \"DEFAULT_LASER_COLOR\": () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_10__.DEFAULT_LASER_COLOR),\n/* harmony export */ \"DefaultSidebar\": () => (/* reexport safe */ _components_DefaultSidebar__WEBPACK_IMPORTED_MODULE_34__.DefaultSidebar),\n/* harmony export */ \"DiagramToCodePlugin\": () => (/* reexport safe */ _components_DiagramToCodePlugin_DiagramToCodePlugin__WEBPACK_IMPORTED_MODULE_42__.DiagramToCodePlugin),\n/* harmony export */ \"Excalidraw\": () => (/* binding */ Excalidraw),\n/* harmony export */ \"FONT_FAMILY\": () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_10__.FONT_FAMILY),\n/* harmony export */ \"Footer\": () => (/* reexport safe */ _components_footer_FooterCenter__WEBPACK_IMPORTED_MODULE_12__[\"default\"]),\n/* harmony export */ \"LiveCollaborationTrigger\": () => (/* reexport safe */ _components_live_collaboration_LiveCollaborationTrigger__WEBPACK_IMPORTED_MODULE_15__[\"default\"]),\n/* harmony export */ \"MIME_TYPES\": () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_10__.MIME_TYPES),\n/* harmony export */ \"MainMenu\": () => (/* reexport safe */ _components_main_menu_MainMenu__WEBPACK_IMPORTED_MODULE_13__[\"default\"]),\n/* harmony export */ \"ROUNDNESS\": () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_10__.ROUNDNESS),\n/* harmony export */ \"Sidebar\": () => (/* reexport safe */ _components_Sidebar_Sidebar__WEBPACK_IMPORTED_MODULE_31__.Sidebar),\n/* harmony export */ \"Stats\": () => (/* reexport safe */ _components_Stats__WEBPACK_IMPORTED_MODULE_33__.Stats),\n/* harmony export */ \"StoreAction\": () => (/* reexport safe */ _store__WEBPACK_IMPORTED_MODULE_29__.StoreAction),\n/* harmony export */ \"THEME\": () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_10__.THEME),\n/* harmony export */ \"TTDDialog\": () => (/* reexport safe */ _components_TTDDialog_TTDDialog__WEBPACK_IMPORTED_MODULE_35__.TTDDialog),\n/* harmony export */ \"TTDDialogTrigger\": () => (/* reexport safe */ _components_TTDDialog_TTDDialogTrigger__WEBPACK_IMPORTED_MODULE_36__.TTDDialogTrigger),\n/* harmony export */ \"WelcomeScreen\": () => (/* reexport safe */ _components_welcome_screen_WelcomeScreen__WEBPACK_IMPORTED_MODULE_14__[\"default\"]),\n/* harmony export */ \"bumpVersion\": () => (/* reexport safe */ _element_mutateElement__WEBPACK_IMPORTED_MODULE_28__.bumpVersion),\n/* harmony export */ \"convertToExcalidrawElements\": () => (/* reexport safe */ _data_transform__WEBPACK_IMPORTED_MODULE_39__.convertToExcalidrawElements),\n/* harmony export */ \"defaultLang\": () => (/* reexport safe */ _i18n__WEBPACK_IMPORTED_MODULE_9__.defaultLang),\n/* harmony export */ \"destroyObsidianUtils\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.destroyObsidianUtils),\n/* harmony export */ \"determineFocusDistance\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.determineFocusDistance),\n/* harmony export */ \"elementPartiallyOverlapsWithOrContainsBBox\": () => (/* reexport safe */ _utils_withinBounds__WEBPACK_IMPORTED_MODULE_41__.elementPartiallyOverlapsWithOrContainsBBox),\n/* harmony export */ \"elementsOverlappingBBox\": () => (/* reexport safe */ _utils_withinBounds__WEBPACK_IMPORTED_MODULE_41__.elementsOverlappingBBox),\n/* harmony export */ \"exportToBlob\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.exportToBlob),\n/* harmony export */ \"exportToCanvas\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.exportToCanvas),\n/* harmony export */ \"exportToClipboard\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.exportToClipboard),\n/* harmony export */ \"exportToSvg\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.exportToSvg),\n/* harmony export */ \"getBoundTextMaxWidth\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.getBoundTextMaxWidth),\n/* harmony export */ \"getCSSFontDefinition\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.getCSSFontDefinition),\n/* harmony export */ \"getCommonBoundingBox\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.getCommonBoundingBox),\n/* harmony export */ \"getCommonBounds\": () => (/* reexport safe */ _element_bounds__WEBPACK_IMPORTED_MODULE_40__.getCommonBounds),\n/* harmony export */ \"getContainerElement\": () => (/* reexport safe */ _element_textElement__WEBPACK_IMPORTED_MODULE_22__.getContainerElement),\n/* harmony export */ \"getDataURL\": () => (/* reexport safe */ _data_blob__WEBPACK_IMPORTED_MODULE_24__.getDataURL),\n/* harmony export */ \"getEmbedLink\": () => (/* reexport safe */ _element_embeddable__WEBPACK_IMPORTED_MODULE_30__.getEmbedLink),\n/* harmony export */ \"getFontFamilies\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.getFontFamilies),\n/* harmony export */ \"getFontFamilyString\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.getFontFamilyString),\n/* harmony export */ \"getFontString\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.getFontString),\n/* harmony export */ \"getFreeDrawSvgPath\": () => (/* reexport safe */ _renderer_renderElement__WEBPACK_IMPORTED_MODULE_25__.getFreeDrawSvgPath),\n/* harmony export */ \"getLibraryItemsHash\": () => (/* reexport safe */ _data_library__WEBPACK_IMPORTED_MODULE_26__.getLibraryItemsHash),\n/* harmony export */ \"getLineHeight\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.getLineHeight),\n/* harmony export */ \"getMaximumGroups\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.getMaximumGroups),\n/* harmony export */ \"getNonDeletedElements\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_17__.getNonDeletedElements),\n/* harmony export */ \"getSceneVersion\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_17__.getSceneVersion),\n/* harmony export */ \"getTextFromElements\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_17__.getTextFromElements),\n/* harmony export */ \"getVisibleSceneBounds\": () => (/* reexport safe */ _element_bounds__WEBPACK_IMPORTED_MODULE_40__.getVisibleSceneBounds),\n/* harmony export */ \"hashElementsVersion\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_17__.hashElementsVersion),\n/* harmony export */ \"hashString\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_17__.hashString),\n/* harmony export */ \"intersectElementWithLine\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.intersectElementWithLine),\n/* harmony export */ \"isElementInsideBBox\": () => (/* reexport safe */ _utils_withinBounds__WEBPACK_IMPORTED_MODULE_41__.isElementInsideBBox),\n/* harmony export */ \"isElementLink\": () => (/* reexport safe */ _element_elementLink__WEBPACK_IMPORTED_MODULE_43__.isElementLink),\n/* harmony export */ \"isInvisiblySmallElement\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_17__.isInvisiblySmallElement),\n/* harmony export */ \"isLinearElement\": () => (/* reexport safe */ _element_typeChecks__WEBPACK_IMPORTED_MODULE_27__.isLinearElement),\n/* harmony export */ \"languages\": () => (/* reexport safe */ _i18n__WEBPACK_IMPORTED_MODULE_9__.languages),\n/* harmony export */ \"loadFromBlob\": () => (/* reexport safe */ _data_blob__WEBPACK_IMPORTED_MODULE_24__.loadFromBlob),\n/* harmony export */ \"loadLibraryFromBlob\": () => (/* reexport safe */ _data_blob__WEBPACK_IMPORTED_MODULE_24__.loadLibraryFromBlob),\n/* harmony export */ \"loadSceneFonts\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.loadSceneFonts),\n/* harmony export */ \"loadSceneOrLibraryFromBlob\": () => (/* reexport safe */ _data_blob__WEBPACK_IMPORTED_MODULE_24__.loadSceneOrLibraryFromBlob),\n/* harmony export */ \"measureText\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.measureText),\n/* harmony export */ \"mergeLibraryItems\": () => (/* reexport safe */ _data_library__WEBPACK_IMPORTED_MODULE_26__.mergeLibraryItems),\n/* harmony export */ \"mermaidToExcalidraw\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.mermaidToExcalidraw),\n/* harmony export */ \"mutateElement\": () => (/* reexport safe */ _element_mutateElement__WEBPACK_IMPORTED_MODULE_28__.mutateElement),\n/* harmony export */ \"newElementWith\": () => (/* reexport safe */ _element_mutateElement__WEBPACK_IMPORTED_MODULE_28__.newElementWith),\n/* harmony export */ \"normalizeLink\": () => (/* reexport safe */ _data_url__WEBPACK_IMPORTED_MODULE_37__.normalizeLink),\n/* harmony export */ \"parseLibraryTokensFromUrl\": () => (/* reexport safe */ _data_library__WEBPACK_IMPORTED_MODULE_26__.parseLibraryTokensFromUrl),\n/* harmony export */ \"reconcileElements\": () => (/* reexport safe */ _data_reconcile__WEBPACK_IMPORTED_MODULE_19__.reconcileElements),\n/* harmony export */ \"refreshTextDimensions\": () => (/* reexport safe */ _element_newElement__WEBPACK_IMPORTED_MODULE_21__.refreshTextDimensions),\n/* harmony export */ \"registerFontsInCSS\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.registerFontsInCSS),\n/* harmony export */ \"registerLocalFont\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.registerLocalFont),\n/* harmony export */ \"restore\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_18__.restore),\n/* harmony export */ \"restoreAppState\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_18__.restoreAppState),\n/* harmony export */ \"restoreElements\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_18__.restoreElements),\n/* harmony export */ \"restoreLibraryItems\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_18__.restoreLibraryItems),\n/* harmony export */ \"safelyParseJSON\": () => (/* reexport safe */ _utils__WEBPACK_IMPORTED_MODULE_4__.safelyParseJSON),\n/* harmony export */ \"sceneCoordsToViewportCoords\": () => (/* reexport safe */ _utils__WEBPACK_IMPORTED_MODULE_4__.sceneCoordsToViewportCoords),\n/* harmony export */ \"serializeAsJSON\": () => (/* reexport safe */ _data_json__WEBPACK_IMPORTED_MODULE_23__.serializeAsJSON),\n/* harmony export */ \"serializeLibraryAsJSON\": () => (/* reexport safe */ _data_json__WEBPACK_IMPORTED_MODULE_23__.serializeLibraryAsJSON),\n/* harmony export */ \"useDevice\": () => (/* reexport safe */ _components_App__WEBPACK_IMPORTED_MODULE_3__.useDevice),\n/* harmony export */ \"useHandleLibrary\": () => (/* reexport safe */ _data_library__WEBPACK_IMPORTED_MODULE_26__.useHandleLibrary),\n/* harmony export */ \"useI18n\": () => (/* reexport safe */ _i18n__WEBPACK_IMPORTED_MODULE_9__.useI18n),\n/* harmony export */ \"viewportCoordsToSceneCoords\": () => (/* reexport safe */ _utils__WEBPACK_IMPORTED_MODULE_4__.viewportCoordsToSceneCoords),\n/* harmony export */ \"wrapText\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.wrapText),\n/* harmony export */ \"zoomToFitBounds\": () => (/* reexport safe */ _actions_actionCanvas__WEBPACK_IMPORTED_MODULE_38__.zoomToFitBounds)\n/* harmony export */ });\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ \"../../node_modules/react/jsx-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _components_InitializeApp__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./components/InitializeApp */ \"./components/InitializeApp.tsx\");\n/* harmony import */ var _components_App__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/App */ \"./components/App.tsx\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils */ \"./utils.ts\");\n/* harmony import */ var _polyfill__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./polyfill */ \"./polyfill.ts\");\n/* harmony import */ var _css_app_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./css/app.scss */ \"./css/app.scss\");\n/* harmony import */ var _css_styles_scss__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./css/styles.scss */ \"./css/styles.scss\");\n/* harmony import */ var _fonts_fonts_css__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./fonts/fonts.css */ \"./fonts/fonts.css\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./i18n */ \"./i18n.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./constants */ \"./constants.ts\");\n/* harmony import */ var jotai__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! jotai */ \"../../node_modules/jotai/esm/index.mjs\");\n/* harmony import */ var _jotai__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./jotai */ \"./jotai.ts\");\n/* harmony import */ var _components_footer_FooterCenter__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./components/footer/FooterCenter */ \"./components/footer/FooterCenter.tsx\");\n/* harmony import */ var _components_main_menu_MainMenu__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./components/main-menu/MainMenu */ \"./components/main-menu/MainMenu.tsx\");\n/* harmony import */ var _components_welcome_screen_WelcomeScreen__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./components/welcome-screen/WelcomeScreen */ \"./components/welcome-screen/WelcomeScreen.tsx\");\n/* harmony import */ var _components_live_collaboration_LiveCollaborationTrigger__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./components/live-collaboration/LiveCollaborationTrigger */ \"./components/live-collaboration/LiveCollaborationTrigger.tsx\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./element */ \"./element/index.ts\");\n/* harmony import */ var _data_restore__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./data/restore */ \"./data/restore.ts\");\n/* harmony import */ var _data_reconcile__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./data/reconcile */ \"./data/reconcile.ts\");\n/* harmony import */ var _utils_export__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../utils/export */ \"../utils/export.ts\");\n/* harmony import */ var _element_newElement__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./element/newElement */ \"./element/newElement.ts\");\n/* harmony import */ var _element_textElement__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./element/textElement */ \"./element/textElement.ts\");\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./data/json */ \"./data/json.ts\");\n/* harmony import */ var _data_blob__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./data/blob */ \"./data/blob.ts\");\n/* harmony import */ var _renderer_renderElement__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./renderer/renderElement */ \"./renderer/renderElement.ts\");\n/* harmony import */ var _data_library__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./data/library */ \"./data/library.ts\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./element/typeChecks */ \"./element/typeChecks.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./element/mutateElement */ \"./element/mutateElement.ts\");\n/* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./store */ \"./store.ts\");\n/* harmony import */ var _element_embeddable__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./element/embeddable */ \"./element/embeddable.ts\");\n/* harmony import */ var _components_Sidebar_Sidebar__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./components/Sidebar/Sidebar */ \"./components/Sidebar/Sidebar.tsx\");\n/* harmony import */ var _components_Button__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./components/Button */ \"./components/Button.tsx\");\n/* harmony import */ var _components_Stats__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./components/Stats */ \"./components/Stats/index.tsx\");\n/* harmony import */ var _components_DefaultSidebar__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./components/DefaultSidebar */ \"./components/DefaultSidebar.tsx\");\n/* harmony import */ var _components_TTDDialog_TTDDialog__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./components/TTDDialog/TTDDialog */ \"./components/TTDDialog/TTDDialog.tsx\");\n/* harmony import */ var _components_TTDDialog_TTDDialogTrigger__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./components/TTDDialog/TTDDialogTrigger */ \"./components/TTDDialog/TTDDialogTrigger.tsx\");\n/* harmony import */ var _data_url__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./data/url */ \"./data/url.ts\");\n/* harmony import */ var _actions_actionCanvas__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./actions/actionCanvas */ \"./actions/actionCanvas.tsx\");\n/* harmony import */ var _data_transform__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./data/transform */ \"./data/transform.ts\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./element/bounds */ \"./element/bounds.ts\");\n/* harmony import */ var _utils_withinBounds__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ../utils/withinBounds */ \"../utils/withinBounds.ts\");\n/* harmony import */ var _components_DiagramToCodePlugin_DiagramToCodePlugin__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./components/DiagramToCodePlugin/DiagramToCodePlugin */ \"./components/DiagramToCodePlugin/DiagramToCodePlugin.tsx\");\n/* harmony import */ var _element_elementLink__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ./element/elementLink */ \"./element/elementLink.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\n\n\n\n\n\n\n\n\n\n(0,_polyfill__WEBPACK_IMPORTED_MODULE_5__[\"default\"])();\n\nconst ExcalidrawBase = props => {\n var _a, _b, _c, _d, _e, _f;\n\n const {\n onChange,\n initialData,\n excalidrawAPI,\n isCollaborating = false,\n onPointerUpdate,\n renderTopRightUI,\n langCode = _i18n__WEBPACK_IMPORTED_MODULE_9__.defaultLang.code,\n viewModeEnabled,\n zenModeEnabled,\n gridModeEnabled,\n initState,\n //zsviczian\n libraryReturnUrl,\n theme,\n name,\n renderCustomStats,\n onPaste,\n onDrop,\n //zsviczian\n detectScroll = true,\n handleKeyboardGlobally = false,\n onLibraryChange,\n autoFocus = false,\n onBeforeTextEdit,\n //zsviczian\n onBeforeTextSubmit,\n //zsviczian\n generateIdForFile,\n onThemeChange,\n //zsviczian\n onLinkOpen,\n onLinkHover,\n //zsviczian\n onViewModeChange,\n //zsviczian\n generateLinkForSelection,\n onPointerDown,\n onPointerUp,\n onScrollChange,\n children,\n validateEmbeddable,\n renderEmbeddable,\n renderWebview,\n //zsviczian\n renderEmbeddableMenu,\n //zsviczian\n renderMermaid,\n //zsviczian\n onContextMenu,\n //zsviczian\n aiEnabled,\n showDeprecatedFonts\n } = props;\n const canvasActions = (_a = props.UIOptions) === null || _a === void 0 ? void 0 : _a.canvasActions; // FIXME normalize/set defaults in parent component so that the memo resolver\n // compares the same values\n\n const UIOptions = Object.assign(Object.assign({}, props.UIOptions), {\n canvasActions: Object.assign(Object.assign({}, _constants__WEBPACK_IMPORTED_MODULE_10__.DEFAULT_UI_OPTIONS.canvasActions), canvasActions),\n tools: {\n image: (_d = (_c = (_b = props.UIOptions) === null || _b === void 0 ? void 0 : _b.tools) === null || _c === void 0 ? void 0 : _c.image) !== null && _d !== void 0 ? _d : true\n }\n });\n\n if (canvasActions === null || canvasActions === void 0 ? void 0 : canvasActions.export) {\n UIOptions.canvasActions.export.saveFileToDisk = (_f = (_e = canvasActions.export) === null || _e === void 0 ? void 0 : _e.saveFileToDisk) !== null && _f !== void 0 ? _f : _constants__WEBPACK_IMPORTED_MODULE_10__.DEFAULT_UI_OPTIONS.canvasActions[\"export\"].saveFileToDisk;\n }\n\n if (UIOptions.canvasActions.toggleTheme === null && typeof theme === \"undefined\") {\n UIOptions.canvasActions.toggleTheme = true;\n }\n\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {\n const importPolyfill = async () => {\n //@ts-ignore\n await Promise.resolve(/*! import() */).then(__webpack_require__.t.bind(__webpack_require__, /*! canvas-roundrect-polyfill */ \"../../node_modules/canvas-roundrect-polyfill/roundRect.js\", 23));\n };\n\n importPolyfill(); // Block pinch-zooming on iOS outside of the content area\n\n const handleTouchMove = event => {\n // @ts-ignore\n if (typeof event.scale === \"number\" && event.scale !== 1) {\n event.preventDefault();\n }\n };\n\n document.addEventListener(\"touchmove\", handleTouchMove, {\n passive: false\n });\n return () => {\n document.removeEventListener(\"touchmove\", handleTouchMove);\n };\n }, []);\n return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(jotai__WEBPACK_IMPORTED_MODULE_16__.Provider, Object.assign({\n unstable_createStore: () => _jotai__WEBPACK_IMPORTED_MODULE_11__.jotaiStore,\n scope: _jotai__WEBPACK_IMPORTED_MODULE_11__.jotaiScope\n }, {\n children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_InitializeApp__WEBPACK_IMPORTED_MODULE_2__.InitializeApp, Object.assign({\n langCode: langCode,\n theme: theme\n }, {\n children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_App__WEBPACK_IMPORTED_MODULE_3__[\"default\"], Object.assign({\n onChange: onChange,\n initialData: initialData,\n excalidrawAPI: excalidrawAPI,\n isCollaborating: isCollaborating,\n onPointerUpdate: onPointerUpdate,\n renderTopRightUI: renderTopRightUI,\n langCode: langCode,\n viewModeEnabled: viewModeEnabled,\n zenModeEnabled: zenModeEnabled,\n gridModeEnabled: gridModeEnabled,\n initState: initState,\n libraryReturnUrl: libraryReturnUrl,\n theme: theme,\n name: name,\n renderCustomStats: renderCustomStats,\n UIOptions: UIOptions,\n onPaste: onPaste,\n onDrop: onDrop,\n detectScroll: detectScroll,\n handleKeyboardGlobally: handleKeyboardGlobally,\n onLibraryChange: onLibraryChange,\n autoFocus: autoFocus,\n onBeforeTextEdit: onBeforeTextEdit,\n onBeforeTextSubmit: onBeforeTextSubmit,\n generateIdForFile: generateIdForFile,\n onThemeChange: onThemeChange,\n onLinkOpen: onLinkOpen,\n onLinkHover: onLinkHover,\n onViewModeChange: onViewModeChange,\n generateLinkForSelection: generateLinkForSelection,\n onPointerDown: onPointerDown,\n onPointerUp: onPointerUp,\n onScrollChange: onScrollChange,\n validateEmbeddable: validateEmbeddable,\n renderEmbeddable: renderEmbeddable,\n renderWebview: renderWebview,\n renderEmbeddableMenu: renderEmbeddableMenu,\n renderMermaid: renderMermaid,\n onContextMenu: onContextMenu,\n aiEnabled: aiEnabled !== false,\n showDeprecatedFonts: showDeprecatedFonts\n }, {\n children: children\n }))\n }))\n }));\n};\n\nconst areEqual = (prevProps, nextProps) => {\n // short-circuit early\n if (prevProps.children !== nextProps.children) {\n return false;\n }\n\n const {\n initialData: prevInitialData,\n UIOptions: prevUIOptions = {}\n } = prevProps,\n prev = __rest(prevProps, [\"initialData\", \"UIOptions\"]);\n\n const {\n initialData: nextInitialData,\n UIOptions: nextUIOptions = {}\n } = nextProps,\n next = __rest(nextProps, [\"initialData\", \"UIOptions\"]); // comparing UIOptions\n\n\n const prevUIOptionsKeys = Object.keys(prevUIOptions);\n const nextUIOptionsKeys = Object.keys(nextUIOptions);\n\n if (prevUIOptionsKeys.length !== nextUIOptionsKeys.length) {\n return false;\n }\n\n const isUIOptionsSame = prevUIOptionsKeys.every(key => {\n if (key === \"canvasActions\") {\n const canvasOptionKeys = Object.keys(prevUIOptions.canvasActions);\n return canvasOptionKeys.every(key => {\n var _a, _b, _c, _d;\n\n if (key === \"export\" && ((_a = prevUIOptions === null || prevUIOptions === void 0 ? void 0 : prevUIOptions.canvasActions) === null || _a === void 0 ? void 0 : _a.export) && ((_b = nextUIOptions === null || nextUIOptions === void 0 ? void 0 : nextUIOptions.canvasActions) === null || _b === void 0 ? void 0 : _b.export)) {\n return prevUIOptions.canvasActions.export.saveFileToDisk === nextUIOptions.canvasActions.export.saveFileToDisk;\n }\n\n return ((_c = prevUIOptions === null || prevUIOptions === void 0 ? void 0 : prevUIOptions.canvasActions) === null || _c === void 0 ? void 0 : _c[key]) === ((_d = nextUIOptions === null || nextUIOptions === void 0 ? void 0 : nextUIOptions.canvasActions) === null || _d === void 0 ? void 0 : _d[key]);\n });\n }\n\n return prevUIOptions[key] === nextUIOptions[key];\n });\n return isUIOptionsSame && (0,_utils__WEBPACK_IMPORTED_MODULE_4__.isShallowEqual)(prev, next);\n};\n\nconst Excalidraw = react__WEBPACK_IMPORTED_MODULE_1___default().memo(ExcalidrawBase, areEqual);\nExcalidraw.displayName = \"Excalidraw\";\n\n\n\n\n\n //zsviczian\n\n //zsviczian\n\n\n\n\n\n\n\n\n\n\n\n //zsviczian - not sure if I use it any more\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceURL=webpack://ExcalidrawLib/./index.tsx?");
|
|
3479
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Button\": () => (/* reexport safe */ _components_Button__WEBPACK_IMPORTED_MODULE_32__.Button),\n/* harmony export */ \"DEFAULT_LASER_COLOR\": () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_10__.DEFAULT_LASER_COLOR),\n/* harmony export */ \"DefaultSidebar\": () => (/* reexport safe */ _components_DefaultSidebar__WEBPACK_IMPORTED_MODULE_34__.DefaultSidebar),\n/* harmony export */ \"DiagramToCodePlugin\": () => (/* reexport safe */ _components_DiagramToCodePlugin_DiagramToCodePlugin__WEBPACK_IMPORTED_MODULE_42__.DiagramToCodePlugin),\n/* harmony export */ \"Excalidraw\": () => (/* binding */ Excalidraw),\n/* harmony export */ \"FONT_FAMILY\": () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_10__.FONT_FAMILY),\n/* harmony export */ \"Footer\": () => (/* reexport safe */ _components_footer_FooterCenter__WEBPACK_IMPORTED_MODULE_12__[\"default\"]),\n/* harmony export */ \"LiveCollaborationTrigger\": () => (/* reexport safe */ _components_live_collaboration_LiveCollaborationTrigger__WEBPACK_IMPORTED_MODULE_15__[\"default\"]),\n/* harmony export */ \"MIME_TYPES\": () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_10__.MIME_TYPES),\n/* harmony export */ \"MainMenu\": () => (/* reexport safe */ _components_main_menu_MainMenu__WEBPACK_IMPORTED_MODULE_13__[\"default\"]),\n/* harmony export */ \"ROUNDNESS\": () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_10__.ROUNDNESS),\n/* harmony export */ \"Sidebar\": () => (/* reexport safe */ _components_Sidebar_Sidebar__WEBPACK_IMPORTED_MODULE_31__.Sidebar),\n/* harmony export */ \"Stats\": () => (/* reexport safe */ _components_Stats__WEBPACK_IMPORTED_MODULE_33__.Stats),\n/* harmony export */ \"StoreAction\": () => (/* reexport safe */ _store__WEBPACK_IMPORTED_MODULE_29__.StoreAction),\n/* harmony export */ \"THEME\": () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_10__.THEME),\n/* harmony export */ \"TTDDialog\": () => (/* reexport safe */ _components_TTDDialog_TTDDialog__WEBPACK_IMPORTED_MODULE_35__.TTDDialog),\n/* harmony export */ \"TTDDialogTrigger\": () => (/* reexport safe */ _components_TTDDialog_TTDDialogTrigger__WEBPACK_IMPORTED_MODULE_36__.TTDDialogTrigger),\n/* harmony export */ \"WelcomeScreen\": () => (/* reexport safe */ _components_welcome_screen_WelcomeScreen__WEBPACK_IMPORTED_MODULE_14__[\"default\"]),\n/* harmony export */ \"bumpVersion\": () => (/* reexport safe */ _element_mutateElement__WEBPACK_IMPORTED_MODULE_28__.bumpVersion),\n/* harmony export */ \"convertToExcalidrawElements\": () => (/* reexport safe */ _data_transform__WEBPACK_IMPORTED_MODULE_39__.convertToExcalidrawElements),\n/* harmony export */ \"defaultLang\": () => (/* reexport safe */ _i18n__WEBPACK_IMPORTED_MODULE_9__.defaultLang),\n/* harmony export */ \"destroyObsidianUtils\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.destroyObsidianUtils),\n/* harmony export */ \"determineFocusDistance\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.determineFocusDistance),\n/* harmony export */ \"elementPartiallyOverlapsWithOrContainsBBox\": () => (/* reexport safe */ _utils_withinBounds__WEBPACK_IMPORTED_MODULE_41__.elementPartiallyOverlapsWithOrContainsBBox),\n/* harmony export */ \"elementsOverlappingBBox\": () => (/* reexport safe */ _utils_withinBounds__WEBPACK_IMPORTED_MODULE_41__.elementsOverlappingBBox),\n/* harmony export */ \"exportToBlob\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.exportToBlob),\n/* harmony export */ \"exportToCanvas\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.exportToCanvas),\n/* harmony export */ \"exportToClipboard\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.exportToClipboard),\n/* harmony export */ \"exportToSvg\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.exportToSvg),\n/* harmony export */ \"getBoundTextMaxWidth\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.getBoundTextMaxWidth),\n/* harmony export */ \"getCSSFontDefinition\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.getCSSFontDefinition),\n/* harmony export */ \"getCommonBoundingBox\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.getCommonBoundingBox),\n/* harmony export */ \"getCommonBounds\": () => (/* reexport safe */ _element_bounds__WEBPACK_IMPORTED_MODULE_40__.getCommonBounds),\n/* harmony export */ \"getContainerElement\": () => (/* reexport safe */ _element_textElement__WEBPACK_IMPORTED_MODULE_22__.getContainerElement),\n/* harmony export */ \"getDataURL\": () => (/* reexport safe */ _data_blob__WEBPACK_IMPORTED_MODULE_24__.getDataURL),\n/* harmony export */ \"getEmbedLink\": () => (/* reexport safe */ _element_embeddable__WEBPACK_IMPORTED_MODULE_30__.getEmbedLink),\n/* harmony export */ \"getFontFamilies\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.getFontFamilies),\n/* harmony export */ \"getFontFamilyString\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.getFontFamilyString),\n/* harmony export */ \"getFontString\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.getFontString),\n/* harmony export */ \"getFreeDrawSvgPath\": () => (/* reexport safe */ _renderer_renderElement__WEBPACK_IMPORTED_MODULE_25__.getFreeDrawSvgPath),\n/* harmony export */ \"getLibraryItemsHash\": () => (/* reexport safe */ _data_library__WEBPACK_IMPORTED_MODULE_26__.getLibraryItemsHash),\n/* harmony export */ \"getLineHeight\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.getLineHeight),\n/* harmony export */ \"getMaximumGroups\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.getMaximumGroups),\n/* harmony export */ \"getNonDeletedElements\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_17__.getNonDeletedElements),\n/* harmony export */ \"getSceneVersion\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_17__.getSceneVersion),\n/* harmony export */ \"getTextFromElements\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_17__.getTextFromElements),\n/* harmony export */ \"getVisibleSceneBounds\": () => (/* reexport safe */ _element_bounds__WEBPACK_IMPORTED_MODULE_40__.getVisibleSceneBounds),\n/* harmony export */ \"hashElementsVersion\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_17__.hashElementsVersion),\n/* harmony export */ \"hashString\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_17__.hashString),\n/* harmony export */ \"intersectElementWithLine\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.intersectElementWithLine),\n/* harmony export */ \"isElementInsideBBox\": () => (/* reexport safe */ _utils_withinBounds__WEBPACK_IMPORTED_MODULE_41__.isElementInsideBBox),\n/* harmony export */ \"isElementLink\": () => (/* reexport safe */ _element_elementLink__WEBPACK_IMPORTED_MODULE_43__.isElementLink),\n/* harmony export */ \"isInvisiblySmallElement\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_17__.isInvisiblySmallElement),\n/* harmony export */ \"isLinearElement\": () => (/* reexport safe */ _element_typeChecks__WEBPACK_IMPORTED_MODULE_27__.isLinearElement),\n/* harmony export */ \"languages\": () => (/* reexport safe */ _i18n__WEBPACK_IMPORTED_MODULE_9__.languages),\n/* harmony export */ \"loadFromBlob\": () => (/* reexport safe */ _data_blob__WEBPACK_IMPORTED_MODULE_24__.loadFromBlob),\n/* harmony export */ \"loadLibraryFromBlob\": () => (/* reexport safe */ _data_blob__WEBPACK_IMPORTED_MODULE_24__.loadLibraryFromBlob),\n/* harmony export */ \"loadSceneFonts\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.loadSceneFonts),\n/* harmony export */ \"loadSceneOrLibraryFromBlob\": () => (/* reexport safe */ _data_blob__WEBPACK_IMPORTED_MODULE_24__.loadSceneOrLibraryFromBlob),\n/* harmony export */ \"measureText\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.measureText),\n/* harmony export */ \"mergeLibraryItems\": () => (/* reexport safe */ _data_library__WEBPACK_IMPORTED_MODULE_26__.mergeLibraryItems),\n/* harmony export */ \"mermaidToExcalidraw\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.mermaidToExcalidraw),\n/* harmony export */ \"mutateElement\": () => (/* reexport safe */ _element_mutateElement__WEBPACK_IMPORTED_MODULE_28__.mutateElement),\n/* harmony export */ \"newElementWith\": () => (/* reexport safe */ _element_mutateElement__WEBPACK_IMPORTED_MODULE_28__.newElementWith),\n/* harmony export */ \"normalizeLink\": () => (/* reexport safe */ _data_url__WEBPACK_IMPORTED_MODULE_37__.normalizeLink),\n/* harmony export */ \"parseLibraryTokensFromUrl\": () => (/* reexport safe */ _data_library__WEBPACK_IMPORTED_MODULE_26__.parseLibraryTokensFromUrl),\n/* harmony export */ \"reconcileElements\": () => (/* reexport safe */ _data_reconcile__WEBPACK_IMPORTED_MODULE_19__.reconcileElements),\n/* harmony export */ \"refreshTextDimensions\": () => (/* reexport safe */ _element_newElement__WEBPACK_IMPORTED_MODULE_21__.refreshTextDimensions),\n/* harmony export */ \"registerFontsInCSS\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.registerFontsInCSS),\n/* harmony export */ \"registerLocalFont\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.registerLocalFont),\n/* harmony export */ \"restore\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_18__.restore),\n/* harmony export */ \"restoreAppState\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_18__.restoreAppState),\n/* harmony export */ \"restoreElements\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_18__.restoreElements),\n/* harmony export */ \"restoreLibraryItems\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_18__.restoreLibraryItems),\n/* harmony export */ \"safelyParseJSON\": () => (/* reexport safe */ _utils__WEBPACK_IMPORTED_MODULE_4__.safelyParseJSON),\n/* harmony export */ \"sceneCoordsToViewportCoords\": () => (/* reexport safe */ _utils__WEBPACK_IMPORTED_MODULE_4__.sceneCoordsToViewportCoords),\n/* harmony export */ \"serializeAsJSON\": () => (/* reexport safe */ _data_json__WEBPACK_IMPORTED_MODULE_23__.serializeAsJSON),\n/* harmony export */ \"serializeLibraryAsJSON\": () => (/* reexport safe */ _data_json__WEBPACK_IMPORTED_MODULE_23__.serializeLibraryAsJSON),\n/* harmony export */ \"useDevice\": () => (/* reexport safe */ _components_App__WEBPACK_IMPORTED_MODULE_3__.useDevice),\n/* harmony export */ \"useHandleLibrary\": () => (/* reexport safe */ _data_library__WEBPACK_IMPORTED_MODULE_26__.useHandleLibrary),\n/* harmony export */ \"useI18n\": () => (/* reexport safe */ _i18n__WEBPACK_IMPORTED_MODULE_9__.useI18n),\n/* harmony export */ \"viewportCoordsToSceneCoords\": () => (/* reexport safe */ _utils__WEBPACK_IMPORTED_MODULE_4__.viewportCoordsToSceneCoords),\n/* harmony export */ \"wrapText\": () => (/* reexport safe */ _utils_export__WEBPACK_IMPORTED_MODULE_20__.wrapText),\n/* harmony export */ \"zoomToFitBounds\": () => (/* reexport safe */ _actions_actionCanvas__WEBPACK_IMPORTED_MODULE_38__.zoomToFitBounds)\n/* harmony export */ });\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ \"../../node_modules/react/jsx-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _components_InitializeApp__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./components/InitializeApp */ \"./components/InitializeApp.tsx\");\n/* harmony import */ var _components_App__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/App */ \"./components/App.tsx\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils */ \"./utils.ts\");\n/* harmony import */ var _polyfill__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./polyfill */ \"./polyfill.ts\");\n/* harmony import */ var _css_app_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./css/app.scss */ \"./css/app.scss\");\n/* harmony import */ var _css_styles_scss__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./css/styles.scss */ \"./css/styles.scss\");\n/* harmony import */ var _fonts_fonts_css__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./fonts/fonts.css */ \"./fonts/fonts.css\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./i18n */ \"./i18n.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./constants */ \"./constants.ts\");\n/* harmony import */ var jotai__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! jotai */ \"../../node_modules/jotai/esm/index.mjs\");\n/* harmony import */ var _jotai__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./jotai */ \"./jotai.ts\");\n/* harmony import */ var _components_footer_FooterCenter__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./components/footer/FooterCenter */ \"./components/footer/FooterCenter.tsx\");\n/* harmony import */ var _components_main_menu_MainMenu__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./components/main-menu/MainMenu */ \"./components/main-menu/MainMenu.tsx\");\n/* harmony import */ var _components_welcome_screen_WelcomeScreen__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./components/welcome-screen/WelcomeScreen */ \"./components/welcome-screen/WelcomeScreen.tsx\");\n/* harmony import */ var _components_live_collaboration_LiveCollaborationTrigger__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./components/live-collaboration/LiveCollaborationTrigger */ \"./components/live-collaboration/LiveCollaborationTrigger.tsx\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./element */ \"./element/index.ts\");\n/* harmony import */ var _data_restore__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./data/restore */ \"./data/restore.ts\");\n/* harmony import */ var _data_reconcile__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./data/reconcile */ \"./data/reconcile.ts\");\n/* harmony import */ var _utils_export__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../utils/export */ \"../utils/export.ts\");\n/* harmony import */ var _element_newElement__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./element/newElement */ \"./element/newElement.ts\");\n/* harmony import */ var _element_textElement__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./element/textElement */ \"./element/textElement.ts\");\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./data/json */ \"./data/json.ts\");\n/* harmony import */ var _data_blob__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./data/blob */ \"./data/blob.ts\");\n/* harmony import */ var _renderer_renderElement__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./renderer/renderElement */ \"./renderer/renderElement.ts\");\n/* harmony import */ var _data_library__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./data/library */ \"./data/library.ts\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./element/typeChecks */ \"./element/typeChecks.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./element/mutateElement */ \"./element/mutateElement.ts\");\n/* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./store */ \"./store.ts\");\n/* harmony import */ var _element_embeddable__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./element/embeddable */ \"./element/embeddable.ts\");\n/* harmony import */ var _components_Sidebar_Sidebar__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./components/Sidebar/Sidebar */ \"./components/Sidebar/Sidebar.tsx\");\n/* harmony import */ var _components_Button__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./components/Button */ \"./components/Button.tsx\");\n/* harmony import */ var _components_Stats__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./components/Stats */ \"./components/Stats/index.tsx\");\n/* harmony import */ var _components_DefaultSidebar__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./components/DefaultSidebar */ \"./components/DefaultSidebar.tsx\");\n/* harmony import */ var _components_TTDDialog_TTDDialog__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./components/TTDDialog/TTDDialog */ \"./components/TTDDialog/TTDDialog.tsx\");\n/* harmony import */ var _components_TTDDialog_TTDDialogTrigger__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./components/TTDDialog/TTDDialogTrigger */ \"./components/TTDDialog/TTDDialogTrigger.tsx\");\n/* harmony import */ var _data_url__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./data/url */ \"./data/url.ts\");\n/* harmony import */ var _actions_actionCanvas__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./actions/actionCanvas */ \"./actions/actionCanvas.tsx\");\n/* harmony import */ var _data_transform__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./data/transform */ \"./data/transform.ts\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./element/bounds */ \"./element/bounds.ts\");\n/* harmony import */ var _utils_withinBounds__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ../utils/withinBounds */ \"../utils/withinBounds.ts\");\n/* harmony import */ var _components_DiagramToCodePlugin_DiagramToCodePlugin__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./components/DiagramToCodePlugin/DiagramToCodePlugin */ \"./components/DiagramToCodePlugin/DiagramToCodePlugin.tsx\");\n/* harmony import */ var _element_elementLink__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ./element/elementLink */ \"./element/elementLink.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\n\n\n\n\n\n\n\n\n\n(0,_polyfill__WEBPACK_IMPORTED_MODULE_5__[\"default\"])();\n\nconst ExcalidrawBase = props => {\n var _a, _b, _c, _d, _e, _f;\n\n const {\n onChange,\n initialData,\n excalidrawAPI,\n isCollaborating = false,\n onPointerUpdate,\n renderTopRightUI,\n langCode = _i18n__WEBPACK_IMPORTED_MODULE_9__.defaultLang.code,\n viewModeEnabled,\n zenModeEnabled,\n gridModeEnabled,\n initState,\n //zsviczian\n libraryReturnUrl,\n theme,\n name,\n renderCustomStats,\n onPaste,\n onDrop,\n //zsviczian\n detectScroll = true,\n handleKeyboardGlobally = false,\n onLibraryChange,\n autoFocus = false,\n onBeforeTextEdit,\n //zsviczian\n onBeforeTextSubmit,\n //zsviczian\n generateIdForFile,\n onThemeChange,\n //zsviczian\n onLinkOpen,\n onLinkHover,\n //zsviczian\n onViewModeChange,\n //zsviczian\n generateLinkForSelection,\n onPointerDown,\n onPointerUp,\n onScrollChange,\n children,\n validateEmbeddable,\n renderEmbeddable,\n renderWebview,\n //zsviczian\n renderEmbeddableMenu,\n //zsviczian\n renderMermaid,\n //zsviczian\n onContextMenu,\n //zsviczian\n aiEnabled,\n showDeprecatedFonts,\n insertLinkAction //zsviczian\n\n } = props;\n const canvasActions = (_a = props.UIOptions) === null || _a === void 0 ? void 0 : _a.canvasActions; // FIXME normalize/set defaults in parent component so that the memo resolver\n // compares the same values\n\n const UIOptions = Object.assign(Object.assign({}, props.UIOptions), {\n canvasActions: Object.assign(Object.assign({}, _constants__WEBPACK_IMPORTED_MODULE_10__.DEFAULT_UI_OPTIONS.canvasActions), canvasActions),\n tools: {\n image: (_d = (_c = (_b = props.UIOptions) === null || _b === void 0 ? void 0 : _b.tools) === null || _c === void 0 ? void 0 : _c.image) !== null && _d !== void 0 ? _d : true\n }\n });\n\n if (canvasActions === null || canvasActions === void 0 ? void 0 : canvasActions.export) {\n UIOptions.canvasActions.export.saveFileToDisk = (_f = (_e = canvasActions.export) === null || _e === void 0 ? void 0 : _e.saveFileToDisk) !== null && _f !== void 0 ? _f : _constants__WEBPACK_IMPORTED_MODULE_10__.DEFAULT_UI_OPTIONS.canvasActions[\"export\"].saveFileToDisk;\n }\n\n if (UIOptions.canvasActions.toggleTheme === null && typeof theme === \"undefined\") {\n UIOptions.canvasActions.toggleTheme = true;\n }\n\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {\n const importPolyfill = async () => {\n //@ts-ignore\n await Promise.resolve(/*! import() */).then(__webpack_require__.t.bind(__webpack_require__, /*! canvas-roundrect-polyfill */ \"../../node_modules/canvas-roundrect-polyfill/roundRect.js\", 23));\n };\n\n importPolyfill(); // Block pinch-zooming on iOS outside of the content area\n\n const handleTouchMove = event => {\n // @ts-ignore\n if (typeof event.scale === \"number\" && event.scale !== 1) {\n event.preventDefault();\n }\n };\n\n document.addEventListener(\"touchmove\", handleTouchMove, {\n passive: false\n });\n return () => {\n document.removeEventListener(\"touchmove\", handleTouchMove);\n };\n }, []);\n return (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(jotai__WEBPACK_IMPORTED_MODULE_16__.Provider, Object.assign({\n unstable_createStore: () => _jotai__WEBPACK_IMPORTED_MODULE_11__.jotaiStore,\n scope: _jotai__WEBPACK_IMPORTED_MODULE_11__.jotaiScope\n }, {\n children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_InitializeApp__WEBPACK_IMPORTED_MODULE_2__.InitializeApp, Object.assign({\n langCode: langCode,\n theme: theme\n }, {\n children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_App__WEBPACK_IMPORTED_MODULE_3__[\"default\"], Object.assign({\n onChange: onChange,\n initialData: initialData,\n excalidrawAPI: excalidrawAPI,\n isCollaborating: isCollaborating,\n onPointerUpdate: onPointerUpdate,\n renderTopRightUI: renderTopRightUI,\n langCode: langCode,\n viewModeEnabled: viewModeEnabled,\n zenModeEnabled: zenModeEnabled,\n gridModeEnabled: gridModeEnabled,\n initState: initState,\n libraryReturnUrl: libraryReturnUrl,\n theme: theme,\n name: name,\n renderCustomStats: renderCustomStats,\n UIOptions: UIOptions,\n onPaste: onPaste,\n onDrop: onDrop,\n detectScroll: detectScroll,\n handleKeyboardGlobally: handleKeyboardGlobally,\n onLibraryChange: onLibraryChange,\n autoFocus: autoFocus,\n onBeforeTextEdit: onBeforeTextEdit,\n onBeforeTextSubmit: onBeforeTextSubmit,\n generateIdForFile: generateIdForFile,\n onThemeChange: onThemeChange,\n onLinkOpen: onLinkOpen,\n onLinkHover: onLinkHover,\n onViewModeChange: onViewModeChange,\n generateLinkForSelection: generateLinkForSelection,\n onPointerDown: onPointerDown,\n onPointerUp: onPointerUp,\n onScrollChange: onScrollChange,\n validateEmbeddable: validateEmbeddable,\n renderEmbeddable: renderEmbeddable,\n renderWebview: renderWebview,\n renderEmbeddableMenu: renderEmbeddableMenu,\n renderMermaid: renderMermaid,\n onContextMenu: onContextMenu,\n aiEnabled: aiEnabled !== false,\n showDeprecatedFonts: showDeprecatedFonts,\n insertLinkAction: insertLinkAction\n }, {\n children: children\n }))\n }))\n }));\n};\n\nconst areEqual = (prevProps, nextProps) => {\n // short-circuit early\n if (prevProps.children !== nextProps.children) {\n return false;\n }\n\n const {\n initialData: prevInitialData,\n UIOptions: prevUIOptions = {}\n } = prevProps,\n prev = __rest(prevProps, [\"initialData\", \"UIOptions\"]);\n\n const {\n initialData: nextInitialData,\n UIOptions: nextUIOptions = {}\n } = nextProps,\n next = __rest(nextProps, [\"initialData\", \"UIOptions\"]); // comparing UIOptions\n\n\n const prevUIOptionsKeys = Object.keys(prevUIOptions);\n const nextUIOptionsKeys = Object.keys(nextUIOptions);\n\n if (prevUIOptionsKeys.length !== nextUIOptionsKeys.length) {\n return false;\n }\n\n const isUIOptionsSame = prevUIOptionsKeys.every(key => {\n if (key === \"canvasActions\") {\n const canvasOptionKeys = Object.keys(prevUIOptions.canvasActions);\n return canvasOptionKeys.every(key => {\n var _a, _b, _c, _d;\n\n if (key === \"export\" && ((_a = prevUIOptions === null || prevUIOptions === void 0 ? void 0 : prevUIOptions.canvasActions) === null || _a === void 0 ? void 0 : _a.export) && ((_b = nextUIOptions === null || nextUIOptions === void 0 ? void 0 : nextUIOptions.canvasActions) === null || _b === void 0 ? void 0 : _b.export)) {\n return prevUIOptions.canvasActions.export.saveFileToDisk === nextUIOptions.canvasActions.export.saveFileToDisk;\n }\n\n return ((_c = prevUIOptions === null || prevUIOptions === void 0 ? void 0 : prevUIOptions.canvasActions) === null || _c === void 0 ? void 0 : _c[key]) === ((_d = nextUIOptions === null || nextUIOptions === void 0 ? void 0 : nextUIOptions.canvasActions) === null || _d === void 0 ? void 0 : _d[key]);\n });\n }\n\n return prevUIOptions[key] === nextUIOptions[key];\n });\n return isUIOptionsSame && (0,_utils__WEBPACK_IMPORTED_MODULE_4__.isShallowEqual)(prev, next);\n};\n\nconst Excalidraw = react__WEBPACK_IMPORTED_MODULE_1___default().memo(ExcalidrawBase, areEqual);\nExcalidraw.displayName = \"Excalidraw\";\n\n\n\n\n\n //zsviczian\n\n //zsviczian\n\n\n\n\n\n\n\n\n\n\n\n //zsviczian - not sure if I use it any more\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceURL=webpack://ExcalidrawLib/./index.tsx?");
|
|
3480
3480
|
|
|
3481
3481
|
/***/ }),
|
|
3482
3482
|
|
|
@@ -3564,7 +3564,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3564
3564
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3565
3565
|
|
|
3566
3566
|
"use strict";
|
|
3567
|
-
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-
|
|
3567
|
+
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-17\"}/dist/`;\n}\n\n//# sourceURL=webpack://ExcalidrawLib/./publicPath.js?");
|
|
3568
3568
|
|
|
3569
3569
|
/***/ }),
|
|
3570
3570
|
|
|
@@ -3982,7 +3982,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3982
3982
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3983
3983
|
|
|
3984
3984
|
"use strict";
|
|
3985
|
-
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 */ \"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/**\r\n * Exponential ease-out method\r\n *\r\n * @param {number} k - The value to be tweened.\r\n * @returns {number} The tweened value.\r\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/**\r\n * Animates values from `fromValues` to `toValues` using the requestAnimationFrame API.\r\n * Executes the `onStep` callback on each step with the interpolated values.\r\n * Returns a function that can be called to cancel the animation.\r\n *\r\n * @example\r\n * // Example usage:\r\n * const fromValues = { x: 0, y: 0 };\r\n * const toValues = { x: 100, y: 200 };\r\n * const onStep = ({x, y}) => {\r\n * setState(x, y)\r\n * };\r\n * const onCancel = () => {\r\n * console.log(\"Animation canceled\");\r\n * };\r\n *\r\n * const cancelAnimation = easeToValuesRAF({\r\n * fromValues,\r\n * toValues,\r\n * onStep,\r\n * onCancel,\r\n * });\r\n *\r\n * // To cancel the animation:\r\n * cancelAnimation();\r\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/**\r\n * Checks whether first directional character is RTL. Meaning whether it starts\r\n * with RTL characters, or indeterminate (numbers etc.) characters followed by\r\n * RTL.\r\n * See https://github.com/excalidraw/excalidraw/pull/1722#discussion_r436340171\r\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/**\r\n * Transforms array of objects containing `id` attribute,\r\n * or array of ids (strings), into a Map, keyd by `id`.\r\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/**\r\n * Transform array into an object, use only when array order is irrelevant.\r\n */\n\nconst arrayToObject = (array, groupBy) => array.reduce((acc, value) => {\n acc[groupBy ? groupBy(value) : String(value)] = value;\n return acc;\n}, {});\n/**\r\n * Creates a circular doubly linked list by adding `prev` and `next` props to the existing array nodes.\r\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-16\",\"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/**\r\n * Returns whether object/array is shallow equal.\r\n * Considers empty object/arrays as equal (whether top-level or second-level).\r\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/**\r\n * supply `null` as message if non-never value is valid, you just need to\r\n * typecheck against it\r\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/**\r\n * Memoizes on values of `opts` object (strict equality).\r\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/**\r\n * allows for falsy values so you don't have to type check when adding\r\n * event listeners to optional elements\r\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/**\r\n * Makes type into a branded type, ensuring that value is assignable to\r\n * the base ubranded type. Optionally you can explicitly supply current value\r\n * type to combine both (useful for composite branded types. Make sure you\r\n * compose branded types which are not composite themselves.)\r\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}\n\n//# sourceURL=webpack://ExcalidrawLib/./utils.ts?");
|
|
3985
|
+
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 */ \"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/**\r\n * Exponential ease-out method\r\n *\r\n * @param {number} k - The value to be tweened.\r\n * @returns {number} The tweened value.\r\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/**\r\n * Animates values from `fromValues` to `toValues` using the requestAnimationFrame API.\r\n * Executes the `onStep` callback on each step with the interpolated values.\r\n * Returns a function that can be called to cancel the animation.\r\n *\r\n * @example\r\n * // Example usage:\r\n * const fromValues = { x: 0, y: 0 };\r\n * const toValues = { x: 100, y: 200 };\r\n * const onStep = ({x, y}) => {\r\n * setState(x, y)\r\n * };\r\n * const onCancel = () => {\r\n * console.log(\"Animation canceled\");\r\n * };\r\n *\r\n * const cancelAnimation = easeToValuesRAF({\r\n * fromValues,\r\n * toValues,\r\n * onStep,\r\n * onCancel,\r\n * });\r\n *\r\n * // To cancel the animation:\r\n * cancelAnimation();\r\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/**\r\n * Checks whether first directional character is RTL. Meaning whether it starts\r\n * with RTL characters, or indeterminate (numbers etc.) characters followed by\r\n * RTL.\r\n * See https://github.com/excalidraw/excalidraw/pull/1722#discussion_r436340171\r\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/**\r\n * Transforms array of objects containing `id` attribute,\r\n * or array of ids (strings), into a Map, keyd by `id`.\r\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/**\r\n * Transform array into an object, use only when array order is irrelevant.\r\n */\n\nconst arrayToObject = (array, groupBy) => array.reduce((acc, value) => {\n acc[groupBy ? groupBy(value) : String(value)] = value;\n return acc;\n}, {});\n/**\r\n * Creates a circular doubly linked list by adding `prev` and `next` props to the existing array nodes.\r\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-17\",\"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/**\r\n * Returns whether object/array is shallow equal.\r\n * Considers empty object/arrays as equal (whether top-level or second-level).\r\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/**\r\n * supply `null` as message if non-never value is valid, you just need to\r\n * typecheck against it\r\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/**\r\n * Memoizes on values of `opts` object (strict equality).\r\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/**\r\n * allows for falsy values so you don't have to type check when adding\r\n * event listeners to optional elements\r\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/**\r\n * Makes type into a branded type, ensuring that value is assignable to\r\n * the base ubranded type. Optionally you can explicitly supply current value\r\n * type to combine both (useful for composite branded types. Make sure you\r\n * compose branded types which are not composite themselves.)\r\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}\n\n//# sourceURL=webpack://ExcalidrawLib/./utils.ts?");
|
|
3986
3986
|
|
|
3987
3987
|
/***/ }),
|
|
3988
3988
|
|