@zsviczian/excalidraw 0.18.113-beta.3 → 0.18.114
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.
|
@@ -297,7 +297,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
297
297
|
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
298
298
|
|
|
299
299
|
"use strict";
|
|
300
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\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 */ castArray: () => (/* binding */ castArray),\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 */ escapeDoubleQuotes: () => (/* binding */ escapeDoubleQuotes),\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 */ getFeatureFlag: () => (/* binding */ getFeatureFlag),\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 */ 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 */ isProdEnv: () => (/* binding */ isProdEnv),\n/* harmony export */ isPromiseLike: () => (/* binding */ isPromiseLike),\n/* harmony export */ isRTL: () => (/* binding */ isRTL),\n/* harmony export */ isReadonlyArray: () => (/* binding */ isReadonlyArray),\n/* harmony export */ isRunningInIframe: () => (/* binding */ isRunningInIframe),\n/* harmony export */ isSelectionLikeTool: () => (/* binding */ isSelectionLikeTool),\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 */ isWritableElement: () => (/* binding */ isWritableElement),\n/* harmony export */ mapFind: () => (/* binding */ mapFind),\n/* harmony export */ memoize: () => (/* binding */ memoize),\n/* harmony export */ muteFSAbortError: () => (/* binding */ muteFSAbortError),\n/* harmony export */ nFormatter: () => (/* binding */ nFormatter),\n/* harmony export */ nextAnimationFrame: () => (/* binding */ nextAnimationFrame),\n/* harmony export */ normalizeEOL: () => (/* binding */ normalizeEOL),\n/* harmony export */ oneOf: () => (/* binding */ oneOf),\n/* harmony export */ preventUnload: () => (/* binding */ preventUnload),\n/* harmony export */ promiseTry: () => (/* binding */ promiseTry),\n/* harmony export */ queryFocusableElements: () => (/* binding */ queryFocusableElements),\n/* harmony export */ reduceToCommonValue: () => (/* binding */ reduceToCommonValue),\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 */ setFeatureFlag: () => (/* binding */ setFeatureFlag),\n/* harmony export */ sizeOf: () => (/* binding */ sizeOf),\n/* harmony export */ supportsEmoji: () => (/* binding */ supportsEmoji),\n/* harmony export */ throttleRAF: () => (/* binding */ throttleRAF),\n/* harmony export */ toArray: () => (/* binding */ toArray),\n/* harmony export */ toBrandedType: () => (/* binding */ toBrandedType),\n/* harmony export */ toIterable: () => (/* binding */ toIterable),\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 _excalidraw_math__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @excalidraw/math */ \"../math/src/index.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constants */ \"../common/src/constants.ts\");\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\" || target.type === \"search\") || target instanceof HTMLElement && target.closest(\".cm-editor\") !== null;\nconst getFontFamilyString = ({\n fontFamily\n}) => {\n for (const [fontFamilyString, id] of Object.entries(_constants__WEBPACK_IMPORTED_MODULE_1__.FONT_FAMILY)) {\n if (id === fontFamily) {\n return `${fontFamilyString}${(0,_constants__WEBPACK_IMPORTED_MODULE_1__.getFontFamilyFallbacks)(id).map(x => `, ${x}`).join(\"\")}`;\n }\n }\n\n return _constants__WEBPACK_IMPORTED_MODULE_1__.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};\n/** executes callback in the frame that's after the current one */\n\nconst nextAnimationFrame = async cb => {\n requestAnimationFrame(() => requestAnimationFrame(cb));\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 using the latest args\n\nconst throttleRAF = fn => {\n let timerId = null;\n let lastArgs = null;\n\n const scheduleFunc = () => {\n timerId = window.requestAnimationFrame(() => {\n timerId = null;\n const args = lastArgs;\n lastArgs = null;\n\n if (args) {\n fn(...args);\n }\n });\n };\n\n const ret = (...args) => {\n lastArgs = args;\n\n if (timerId === null) {\n scheduleFunc();\n }\n };\n\n ret.flush = () => {\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n\n if (lastArgs) {\n fn(...lastArgs);\n lastArgs = null;\n }\n };\n\n ret.cancel = () => {\n lastArgs = null;\n\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n };\n\n return ret;\n};\n/**\n * Exponential ease-out method\n *\n * @param {number} k - The value to be tweened.\n * @returns {number} The tweened value.\n */\n\nconst easeOut = k => {\n return 1 - Math.pow(1 - k, 4);\n}; // 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 isSelectionLikeTool = type => {\n return type === \"selection\" || type === \"lasso\";\n};\nconst updateActiveTool = (appState, data) => {\n var _a, _b, _c;\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.lastActiveTool === undefined ? appState.activeTool.lastActiveTool : data.lastActiveTool,\n type: data.type,\n customType: null,\n locked: (_b = data.locked) !== null && _b !== void 0 ? _b : appState.activeTool.locked,\n fromSelection: (_c = data.fromSelection) !== null && _c !== void 0 ? _c : false\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 viewportCoordsToSceneCoords = ({\n clientX,\n clientY\n}, {\n zoom,\n offsetLeft,\n offsetTop,\n scrollX,\n scrollY\n}) => {\n const x = (clientX - offsetLeft) / zoom.value - scrollX;\n const y = (clientY - offsetTop) / zoom.value - scrollY;\n return {\n x,\n y\n };\n};\nconst sceneCoordsToViewportCoords = ({\n sceneX,\n sceneY\n}, {\n zoom,\n offsetLeft,\n offsetTop,\n scrollX,\n scrollY\n}) => {\n const x = (sceneX + scrollX) * zoom.value + offsetLeft;\n const y = (sceneY + scrollY) * zoom.value + offsetTop;\n return {\n x,\n y\n };\n};\nconst getGlobalCSSVariable = name => getComputedStyle(document.documentElement).getPropertyValue(`--${name}`);\nconst RS_LTR_CHARS = \"A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF\" + \"\\u2C00-\\uFB1C\\uFDFE-\\uFE6F\\uFEFD-\\uFFFF\";\nconst RS_RTL_CHARS = \"\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC\";\nconst RE_RTL_CHECK = new RegExp(`^[^${RS_LTR_CHARS}]*[${RS_RTL_CHARS}]`);\n/**\n * Checks whether first directional character is RTL. Meaning whether it starts\n * with RTL characters, or indeterminate (numbers etc.) characters followed by\n * RTL.\n * See https://github.com/excalidraw/excalidraw/pull/1722#discussion_r436340171\n */\n\nconst isRTL = text => RE_RTL_CHECK.test(text);\nconst tupleToCoors = xyTuple => {\n const [x, y] = xyTuple;\n return {\n x,\n y\n };\n};\n/** use as a rejectionHandler to mute filesystem Abort errors */\n\nconst muteFSAbortError = error => {\n if ((error === null || error === void 0 ? void 0 : error.name) === \"AbortError\") {\n console.warn(error);\n return;\n }\n\n throw error;\n};\nconst findIndex = (array, cb, fromIndex = 0) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n\n fromIndex = Math.min(array.length, Math.max(fromIndex, 0));\n let index = fromIndex - 1;\n\n while (++index < array.length) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n\n return -1;\n};\nconst findLastIndex = (array, cb, fromIndex = array.length - 1) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n\n fromIndex = Math.min(array.length - 1, Math.max(fromIndex, 0));\n let index = fromIndex + 1;\n\n while (--index > -1) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n\n return -1;\n};\n/** returns the first non-null mapped value */\n\nconst mapFind = (collection, iteratee) => {\n for (let idx = 0; idx < collection.length; idx++) {\n const result = iteratee(collection[idx], idx);\n\n if (result != null) {\n return result;\n }\n }\n\n return undefined;\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_1__.DEFAULT_VERSION;\n}; // Adapted from https://github.com/Modernizr/Modernizr/blob/master/feature-detects/emoji.js\n\nconst supportsEmoji = () => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n return false;\n }\n\n const offset = 12;\n ctx.fillStyle = \"#f00\";\n ctx.textBaseline = \"top\";\n ctx.font = \"32px Arial\"; // Modernizr used 🐨, but it is sort of supported on Windows 7.\n // Luckily 😀 isn't supported.\n\n ctx.fillText(\"😀\", 0, 0);\n return ctx.getImageData(offset, offset, 1, 1).data[0] !== 0;\n};\nconst getNearestScrollableContainer = element => {\n let parent = element.parentElement;\n\n while (parent) {\n if (parent === document.body) {\n return document;\n }\n\n const {\n overflowY\n } = window.getComputedStyle(parent);\n const hasScrollableContent = parent.scrollHeight > parent.clientHeight;\n\n if (hasScrollableContent && (overflowY === \"auto\" || overflowY === \"scroll\" || overflowY === \"overlay\")) {\n return parent;\n }\n\n parent = parent.parentElement;\n }\n\n return document;\n};\nconst focusNearestParent = element => {\n let parent = element.parentElement;\n\n while (parent) {\n if (parent.tabIndex > -1) {\n parent.focus();\n return;\n }\n\n parent = parent.parentElement;\n }\n};\nconst preventUnload = event => {\n event.preventDefault(); // NOTE: modern browsers no longer allow showing a custom message here\n\n event.returnValue = \"\";\n};\nconst bytesToHexString = bytes => {\n return Array.from(bytes).map(byte => `0${byte.toString(16)}`.slice(-2)).join(\"\");\n};\nconst getUpdatedTimestamp = () => isTestEnv() ? 1 : Date.now();\n/**\n * Transforms array of objects containing `id` attribute,\n * or array of ids (strings), into a Map, keyd by `id`.\n */\n\nconst arrayToMap = items => {\n if (items instanceof Map) {\n return items;\n }\n\n return items.reduce((acc, element) => {\n acc.set(typeof element === \"string\" ? element : element.id, element);\n return acc;\n }, new Map());\n};\nconst arrayToMapWithIndex = elements => elements.reduce((acc, element, idx) => {\n acc.set(element.id, [element, idx]);\n return acc;\n}, new Map());\n/**\n * Transform array into an object, use only when array order is irrelevant.\n */\n\nconst arrayToObject = (array, groupBy) => array.reduce((acc, value, idx) => {\n acc[groupBy ? groupBy(value) : idx] = value;\n return acc;\n}, {});\n/**\n * Creates a circular doubly linked list by adding `prev` and `next` props to the existing array nodes.\n */\n\nconst arrayToList = array => array.reduce((acc, curr, index) => {\n const node = Object.assign(Object.assign({}, curr), {\n prev: null,\n next: null\n }); // no-op for first item, we don't want circular references on a single item\n\n if (index !== 0) {\n const prevNode = acc[index - 1];\n node.prev = prevNode;\n prevNode.next = node;\n\n if (index === array.length - 1) {\n // make the references circular and connect head & tail\n const firstNode = acc[0];\n node.next = firstNode;\n firstNode.prev = node;\n }\n }\n\n acc.push(node);\n return acc;\n}, []);\n/**\n * Converts a readonly array or map into an iterable.\n * Useful for avoiding entry allocations when iterating object / map on each iteration.\n */\n\nconst toIterable = values => {\n return Array.isArray(values) ? values : values.values();\n};\n/**\n * Converts a readonly array or map into an array.\n */\n\nconst toArray = values => {\n return Array.isArray(values) ? values : Array.from(toIterable(values));\n};\nconst isTestEnv = () => \"development\" === _constants__WEBPACK_IMPORTED_MODULE_1__.ENV.TEST;\nconst isDevEnv = () => \"development\" === _constants__WEBPACK_IMPORTED_MODULE_1__.ENV.DEVELOPMENT;\nconst isProdEnv = () => \"development\" === _constants__WEBPACK_IMPORTED_MODULE_1__.ENV.PRODUCTION;\nconst isServerEnv = () => {\n var _a;\n\n return typeof process !== \"undefined\" && !!((_a = process === null || process === void 0 ? void 0 : ({\"MODE\":\"development\",\"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:3016\",\"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\":\"3001\",\"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_APP_DISABLE_PREVENT_UNLOAD\":\"\",\"VITE_PKG_NAME\":\"@zsviczian/excalidraw\",\"VITE_PKG_VERSION\":\"0.18.113-beta.3\",\"VITE_IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV);\n};\nconst wrapEvent = (name, nativeEvent) => {\n return new CustomEvent(name, {\n detail: {\n nativeEvent\n },\n cancelable: true\n });\n};\nconst updateObject = (obj, updates) => {\n let didChange = false;\n\n for (const key in updates) {\n const value = updates[key];\n\n if (typeof value !== \"undefined\") {\n if (obj[key] === value && ( // if object, always update because its attrs could have changed\n typeof value !== \"object\" || value === null)) {\n continue;\n }\n\n didChange = true;\n }\n }\n\n if (!didChange) {\n return obj;\n }\n\n return Object.assign(Object.assign({}, obj), updates);\n};\nconst isPrimitive = val => {\n const type = typeof val;\n return val == null || type !== \"object\" && type !== \"function\";\n};\nconst getFrame = () => {\n try {\n return window.self === window.top ? \"top\" : \"iframe\";\n } catch (error) {\n return \"iframe\";\n }\n};\nconst isRunningInIframe = () => getFrame() === \"iframe\";\nconst isPromiseLike = value => {\n return !!value && typeof value === \"object\" && \"then\" in value && \"catch\" in value && \"finally\" in value;\n};\nconst queryFocusableElements = container => {\n const focusableElements = container === null || container === void 0 ? void 0 : container.querySelectorAll(\"button, a, input, select, textarea, div[tabindex], label[tabindex]\");\n return focusableElements ? Array.from(focusableElements).filter(element => element.tabIndex > -1 && !element.disabled) : [];\n};\n/** use as a fallback after identity check (for perf reasons) */\n\nconst _defaultIsShallowComparatorFallback = (a, b) => {\n // consider two empty arrays equal\n if (Array.isArray(a) && Array.isArray(b) && a.length === 0 && b.length === 0) {\n return true;\n }\n\n return a === b;\n};\n/**\n * Returns whether object/array is shallow equal.\n * Considers empty object/arrays as equal (whether top-level or second-level).\n */\n\n\nconst isShallowEqual = (objA, objB, comparators, debug = false) => {\n const aKeys = Object.keys(objA);\n const bKeys = Object.keys(objB);\n\n if (aKeys.length !== bKeys.length) {\n if (debug) {\n console.warn(`%cisShallowEqual: objects don't have same properties ->`, \"color: #8B4000\", objA, objB);\n }\n\n return false;\n }\n\n if (comparators && Array.isArray(comparators)) {\n for (const key of comparators) {\n const ret = objA[key] === objB[key] || _defaultIsShallowComparatorFallback(objA[key], objB[key]);\n\n if (!ret) {\n if (debug) {\n console.warn(`%cisShallowEqual: ${key} not equal ->`, \"color: #8B4000\", objA[key], objB[key]);\n }\n\n return false;\n }\n }\n\n return true;\n }\n\n return aKeys.every(key => {\n const comparator = comparators === null || comparators === void 0 ? void 0 : comparators[key];\n const ret = comparator ? comparator(objA[key], objB[key]) : objA[key] === objB[key] || _defaultIsShallowComparatorFallback(objA[key], objB[key]);\n\n if (!ret && debug) {\n console.warn(`%cisShallowEqual: ${key} not equal ->`, \"color: #8B4000\", objA[key], objB[key]);\n }\n\n return ret;\n });\n}; // taken from Radix UI\n// https://github.com/radix-ui/primitives/blob/main/packages/core/primitive/src/primitive.tsx\n\nconst composeEventHandlers = (originalEventHandler, ourEventHandler, {\n checkForDefaultPrevented = true\n} = {}) => {\n return function handleEvent(event) {\n originalEventHandler === null || originalEventHandler === void 0 ? void 0 : originalEventHandler(event);\n\n if (!checkForDefaultPrevented || !(event === null || event === void 0 ? void 0 : event.defaultPrevented)) {\n return ourEventHandler === null || ourEventHandler === void 0 ? void 0 : ourEventHandler(event);\n }\n };\n};\n/**\n * supply `null` as message if non-never value is valid, you just need to\n * typecheck against it\n */\n\nconst assertNever = (value, message, softAssert) => {\n if (!message) {\n return value;\n }\n\n if (softAssert) {\n console.error(message);\n return value;\n }\n\n throw new Error(message);\n};\nfunction invariant(condition, message) {\n if (!condition) {\n throw new Error(message);\n }\n}\n/**\n * Memoizes on values of `opts` object (strict equality).\n */\n\nconst memoize = func => {\n let lastArgs;\n let lastResult;\n\n const ret = function (opts) {\n const currentArgs = Object.entries(opts);\n\n if (lastArgs) {\n let argsAreEqual = true;\n\n for (const [key, value] of currentArgs) {\n if (lastArgs.get(key) !== value) {\n argsAreEqual = false;\n break;\n }\n }\n\n if (argsAreEqual) {\n return lastResult;\n }\n }\n\n const result = func(opts);\n lastArgs = new Map(currentArgs);\n lastResult = result;\n return result;\n };\n\n ret.clear = () => {\n lastArgs = undefined;\n lastResult = undefined;\n };\n\n return ret;\n};\n/** Checks if value is inside given collection. Useful for type-safety. */\n\nconst isMemberOf = (\n/** Set/Map/Array/Object */\ncollection,\n/** value to look for */\nvalue) => {\n return collection instanceof Set || collection instanceof Map ? collection.has(value) : \"includes\" in collection ? collection.includes(value) : collection.hasOwnProperty(value);\n};\nconst cloneJSON = obj => JSON.parse(JSON.stringify(obj));\nconst updateStable = (prevValue, nextValue) => {\n if (isShallowEqual(prevValue, nextValue)) {\n return prevValue;\n }\n\n return nextValue;\n}; // implem\n\nfunction addEventListener(\n/**\n * allows for falsy values so you don't have to type check when adding\n * event listeners to optional elements\n */\ntarget, type, listener, options) {\n var _a;\n\n if (!target) {\n return () => {};\n }\n\n (_a = target === null || target === void 0 ? void 0 : target.addEventListener) === null || _a === void 0 ? void 0 : _a.call(target, type, listener, options);\n return () => {\n var _a;\n\n (_a = target === null || target === void 0 ? void 0 : target.removeEventListener) === null || _a === void 0 ? void 0 : _a.call(target, type, listener, options);\n };\n}\nfunction getSvgPathFromStroke(points, closed = true) {\n const len = points.length;\n\n if (len < 4) {\n return ``;\n }\n\n let a = points[0];\n let b = points[1];\n const c = points[2];\n let result = `M${a[0].toFixed(2)},${a[1].toFixed(2)} Q${b[0].toFixed(2)},${b[1].toFixed(2)} ${(0,_excalidraw_math__WEBPACK_IMPORTED_MODULE_0__.average)(b[0], c[0]).toFixed(2)},${(0,_excalidraw_math__WEBPACK_IMPORTED_MODULE_0__.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,_excalidraw_math__WEBPACK_IMPORTED_MODULE_0__.average)(a[0], b[0]).toFixed(2)},${(0,_excalidraw_math__WEBPACK_IMPORTED_MODULE_0__.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};\nfunction 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};\n/**\n * use when you need to render unsafe string as HTML attribute, but MAKE SURE\n * the attribute is double-quoted when constructing the HTML string\n */\n\nconst escapeDoubleQuotes = str => {\n return str.replace(/\"/g, \""\");\n};\nconst castArray = value => Array.isArray(value) ? value : [value];\n/** hack for Array.isArray type guard not working with readonly value[] */\n\nconst isReadonlyArray = value => {\n return Array.isArray(value);\n};\nconst sizeOf = value => {\n return isReadonlyArray(value) ? value.length : value instanceof Map || value instanceof Set ? value.size : Object.keys(value).length;\n};\nconst reduceToCommonValue = (collection, getValue) => {\n if (sizeOf(collection) === 0) {\n return null;\n }\n\n const valueExtractor = getValue || (item => item);\n\n let commonValue = null;\n\n for (const item of collection) {\n const value = valueExtractor(item);\n\n if ((commonValue === null || commonValue === value) && value != null) {\n commonValue = value;\n } else {\n return null;\n }\n }\n\n return commonValue;\n};\nconst FEATURE_FLAGS_STORAGE_KEY = \"excalidraw-feature-flags\";\nconst DEFAULT_FEATURE_FLAGS = {\n COMPLEX_BINDINGS: false\n};\nlet featureFlags = null;\nconst getFeatureFlag = flag => {\n if (!featureFlags) {\n try {\n const serializedFlags = localStorage.getItem(FEATURE_FLAGS_STORAGE_KEY);\n\n if (serializedFlags) {\n const flags = JSON.parse(serializedFlags);\n featureFlags = flags !== null && flags !== void 0 ? flags : DEFAULT_FEATURE_FLAGS;\n }\n } catch (_a) {}\n }\n\n return (featureFlags || DEFAULT_FEATURE_FLAGS)[flag];\n};\nconst setFeatureFlag = (flag, value) => {\n try {\n featureFlags = Object.assign(Object.assign({}, featureFlags || DEFAULT_FEATURE_FLAGS), {\n [flag]: value\n });\n localStorage.setItem(FEATURE_FLAGS_STORAGE_KEY, JSON.stringify(featureFlags));\n } catch (e) {\n console.error(\"unable to set feature flag\", e);\n }\n};\nconst oneOf = (needle, haystack) => {\n return haystack.includes(needle);\n};\n\n//# sourceURL=webpack://ExcalidrawLib/../common/src/utils.ts?\n}");
|
|
300
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\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 */ castArray: () => (/* binding */ castArray),\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 */ escapeDoubleQuotes: () => (/* binding */ escapeDoubleQuotes),\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 */ getFeatureFlag: () => (/* binding */ getFeatureFlag),\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 */ 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 */ isProdEnv: () => (/* binding */ isProdEnv),\n/* harmony export */ isPromiseLike: () => (/* binding */ isPromiseLike),\n/* harmony export */ isRTL: () => (/* binding */ isRTL),\n/* harmony export */ isReadonlyArray: () => (/* binding */ isReadonlyArray),\n/* harmony export */ isRunningInIframe: () => (/* binding */ isRunningInIframe),\n/* harmony export */ isSelectionLikeTool: () => (/* binding */ isSelectionLikeTool),\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 */ isWritableElement: () => (/* binding */ isWritableElement),\n/* harmony export */ mapFind: () => (/* binding */ mapFind),\n/* harmony export */ memoize: () => (/* binding */ memoize),\n/* harmony export */ muteFSAbortError: () => (/* binding */ muteFSAbortError),\n/* harmony export */ nFormatter: () => (/* binding */ nFormatter),\n/* harmony export */ nextAnimationFrame: () => (/* binding */ nextAnimationFrame),\n/* harmony export */ normalizeEOL: () => (/* binding */ normalizeEOL),\n/* harmony export */ oneOf: () => (/* binding */ oneOf),\n/* harmony export */ preventUnload: () => (/* binding */ preventUnload),\n/* harmony export */ promiseTry: () => (/* binding */ promiseTry),\n/* harmony export */ queryFocusableElements: () => (/* binding */ queryFocusableElements),\n/* harmony export */ reduceToCommonValue: () => (/* binding */ reduceToCommonValue),\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 */ setFeatureFlag: () => (/* binding */ setFeatureFlag),\n/* harmony export */ sizeOf: () => (/* binding */ sizeOf),\n/* harmony export */ supportsEmoji: () => (/* binding */ supportsEmoji),\n/* harmony export */ throttleRAF: () => (/* binding */ throttleRAF),\n/* harmony export */ toArray: () => (/* binding */ toArray),\n/* harmony export */ toBrandedType: () => (/* binding */ toBrandedType),\n/* harmony export */ toIterable: () => (/* binding */ toIterable),\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 _excalidraw_math__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @excalidraw/math */ \"../math/src/index.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constants */ \"../common/src/constants.ts\");\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\" || target.type === \"search\") || target instanceof HTMLElement && target.closest(\".cm-editor\") !== null;\nconst getFontFamilyString = ({\n fontFamily\n}) => {\n for (const [fontFamilyString, id] of Object.entries(_constants__WEBPACK_IMPORTED_MODULE_1__.FONT_FAMILY)) {\n if (id === fontFamily) {\n return `${fontFamilyString}${(0,_constants__WEBPACK_IMPORTED_MODULE_1__.getFontFamilyFallbacks)(id).map(x => `, ${x}`).join(\"\")}`;\n }\n }\n\n return _constants__WEBPACK_IMPORTED_MODULE_1__.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};\n/** executes callback in the frame that's after the current one */\n\nconst nextAnimationFrame = async cb => {\n requestAnimationFrame(() => requestAnimationFrame(cb));\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 using the latest args\n\nconst throttleRAF = fn => {\n let timerId = null;\n let lastArgs = null;\n\n const scheduleFunc = () => {\n timerId = window.requestAnimationFrame(() => {\n timerId = null;\n const args = lastArgs;\n lastArgs = null;\n\n if (args) {\n fn(...args);\n }\n });\n };\n\n const ret = (...args) => {\n lastArgs = args;\n\n if (timerId === null) {\n scheduleFunc();\n }\n };\n\n ret.flush = () => {\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n\n if (lastArgs) {\n fn(...lastArgs);\n lastArgs = null;\n }\n };\n\n ret.cancel = () => {\n lastArgs = null;\n\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n };\n\n return ret;\n};\n/**\n * Exponential ease-out method\n *\n * @param {number} k - The value to be tweened.\n * @returns {number} The tweened value.\n */\n\nconst easeOut = k => {\n return 1 - Math.pow(1 - k, 4);\n}; // 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 isSelectionLikeTool = type => {\n return type === \"selection\" || type === \"lasso\";\n};\nconst updateActiveTool = (appState, data) => {\n var _a, _b, _c;\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.lastActiveTool === undefined ? appState.activeTool.lastActiveTool : data.lastActiveTool,\n type: data.type,\n customType: null,\n locked: (_b = data.locked) !== null && _b !== void 0 ? _b : appState.activeTool.locked,\n fromSelection: (_c = data.fromSelection) !== null && _c !== void 0 ? _c : false\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 viewportCoordsToSceneCoords = ({\n clientX,\n clientY\n}, {\n zoom,\n offsetLeft,\n offsetTop,\n scrollX,\n scrollY\n}) => {\n const x = (clientX - offsetLeft) / zoom.value - scrollX;\n const y = (clientY - offsetTop) / zoom.value - scrollY;\n return {\n x,\n y\n };\n};\nconst sceneCoordsToViewportCoords = ({\n sceneX,\n sceneY\n}, {\n zoom,\n offsetLeft,\n offsetTop,\n scrollX,\n scrollY\n}) => {\n const x = (sceneX + scrollX) * zoom.value + offsetLeft;\n const y = (sceneY + scrollY) * zoom.value + offsetTop;\n return {\n x,\n y\n };\n};\nconst getGlobalCSSVariable = name => getComputedStyle(document.documentElement).getPropertyValue(`--${name}`);\nconst RS_LTR_CHARS = \"A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF\" + \"\\u2C00-\\uFB1C\\uFDFE-\\uFE6F\\uFEFD-\\uFFFF\";\nconst RS_RTL_CHARS = \"\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC\";\nconst RE_RTL_CHECK = new RegExp(`^[^${RS_LTR_CHARS}]*[${RS_RTL_CHARS}]`);\n/**\n * Checks whether first directional character is RTL. Meaning whether it starts\n * with RTL characters, or indeterminate (numbers etc.) characters followed by\n * RTL.\n * See https://github.com/excalidraw/excalidraw/pull/1722#discussion_r436340171\n */\n\nconst isRTL = text => RE_RTL_CHECK.test(text);\nconst tupleToCoors = xyTuple => {\n const [x, y] = xyTuple;\n return {\n x,\n y\n };\n};\n/** use as a rejectionHandler to mute filesystem Abort errors */\n\nconst muteFSAbortError = error => {\n if ((error === null || error === void 0 ? void 0 : error.name) === \"AbortError\") {\n console.warn(error);\n return;\n }\n\n throw error;\n};\nconst findIndex = (array, cb, fromIndex = 0) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n\n fromIndex = Math.min(array.length, Math.max(fromIndex, 0));\n let index = fromIndex - 1;\n\n while (++index < array.length) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n\n return -1;\n};\nconst findLastIndex = (array, cb, fromIndex = array.length - 1) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n\n fromIndex = Math.min(array.length - 1, Math.max(fromIndex, 0));\n let index = fromIndex + 1;\n\n while (--index > -1) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n\n return -1;\n};\n/** returns the first non-null mapped value */\n\nconst mapFind = (collection, iteratee) => {\n for (let idx = 0; idx < collection.length; idx++) {\n const result = iteratee(collection[idx], idx);\n\n if (result != null) {\n return result;\n }\n }\n\n return undefined;\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_1__.DEFAULT_VERSION;\n}; // Adapted from https://github.com/Modernizr/Modernizr/blob/master/feature-detects/emoji.js\n\nconst supportsEmoji = () => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n return false;\n }\n\n const offset = 12;\n ctx.fillStyle = \"#f00\";\n ctx.textBaseline = \"top\";\n ctx.font = \"32px Arial\"; // Modernizr used 🐨, but it is sort of supported on Windows 7.\n // Luckily 😀 isn't supported.\n\n ctx.fillText(\"😀\", 0, 0);\n return ctx.getImageData(offset, offset, 1, 1).data[0] !== 0;\n};\nconst getNearestScrollableContainer = element => {\n let parent = element.parentElement;\n\n while (parent) {\n if (parent === document.body) {\n return document;\n }\n\n const {\n overflowY\n } = window.getComputedStyle(parent);\n const hasScrollableContent = parent.scrollHeight > parent.clientHeight;\n\n if (hasScrollableContent && (overflowY === \"auto\" || overflowY === \"scroll\" || overflowY === \"overlay\")) {\n return parent;\n }\n\n parent = parent.parentElement;\n }\n\n return document;\n};\nconst focusNearestParent = element => {\n let parent = element.parentElement;\n\n while (parent) {\n if (parent.tabIndex > -1) {\n parent.focus();\n return;\n }\n\n parent = parent.parentElement;\n }\n};\nconst preventUnload = event => {\n event.preventDefault(); // NOTE: modern browsers no longer allow showing a custom message here\n\n event.returnValue = \"\";\n};\nconst bytesToHexString = bytes => {\n return Array.from(bytes).map(byte => `0${byte.toString(16)}`.slice(-2)).join(\"\");\n};\nconst getUpdatedTimestamp = () => isTestEnv() ? 1 : Date.now();\n/**\n * Transforms array of objects containing `id` attribute,\n * or array of ids (strings), into a Map, keyd by `id`.\n */\n\nconst arrayToMap = items => {\n if (items instanceof Map) {\n return items;\n }\n\n return items.reduce((acc, element) => {\n acc.set(typeof element === \"string\" ? element : element.id, element);\n return acc;\n }, new Map());\n};\nconst arrayToMapWithIndex = elements => elements.reduce((acc, element, idx) => {\n acc.set(element.id, [element, idx]);\n return acc;\n}, new Map());\n/**\n * Transform array into an object, use only when array order is irrelevant.\n */\n\nconst arrayToObject = (array, groupBy) => array.reduce((acc, value, idx) => {\n acc[groupBy ? groupBy(value) : idx] = value;\n return acc;\n}, {});\n/**\n * Creates a circular doubly linked list by adding `prev` and `next` props to the existing array nodes.\n */\n\nconst arrayToList = array => array.reduce((acc, curr, index) => {\n const node = Object.assign(Object.assign({}, curr), {\n prev: null,\n next: null\n }); // no-op for first item, we don't want circular references on a single item\n\n if (index !== 0) {\n const prevNode = acc[index - 1];\n node.prev = prevNode;\n prevNode.next = node;\n\n if (index === array.length - 1) {\n // make the references circular and connect head & tail\n const firstNode = acc[0];\n node.next = firstNode;\n firstNode.prev = node;\n }\n }\n\n acc.push(node);\n return acc;\n}, []);\n/**\n * Converts a readonly array or map into an iterable.\n * Useful for avoiding entry allocations when iterating object / map on each iteration.\n */\n\nconst toIterable = values => {\n return Array.isArray(values) ? values : values.values();\n};\n/**\n * Converts a readonly array or map into an array.\n */\n\nconst toArray = values => {\n return Array.isArray(values) ? values : Array.from(toIterable(values));\n};\nconst isTestEnv = () => \"development\" === _constants__WEBPACK_IMPORTED_MODULE_1__.ENV.TEST;\nconst isDevEnv = () => \"development\" === _constants__WEBPACK_IMPORTED_MODULE_1__.ENV.DEVELOPMENT;\nconst isProdEnv = () => \"development\" === _constants__WEBPACK_IMPORTED_MODULE_1__.ENV.PRODUCTION;\nconst isServerEnv = () => {\n var _a;\n\n return typeof process !== \"undefined\" && !!((_a = process === null || process === void 0 ? void 0 : ({\"MODE\":\"development\",\"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:3016\",\"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\":\"3001\",\"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_APP_DISABLE_PREVENT_UNLOAD\":\"\",\"VITE_PKG_NAME\":\"@zsviczian/excalidraw\",\"VITE_PKG_VERSION\":\"0.18.113-beta.4\",\"VITE_IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV);\n};\nconst wrapEvent = (name, nativeEvent) => {\n return new CustomEvent(name, {\n detail: {\n nativeEvent\n },\n cancelable: true\n });\n};\nconst updateObject = (obj, updates) => {\n let didChange = false;\n\n for (const key in updates) {\n const value = updates[key];\n\n if (typeof value !== \"undefined\") {\n if (obj[key] === value && ( // if object, always update because its attrs could have changed\n typeof value !== \"object\" || value === null)) {\n continue;\n }\n\n didChange = true;\n }\n }\n\n if (!didChange) {\n return obj;\n }\n\n return Object.assign(Object.assign({}, obj), updates);\n};\nconst isPrimitive = val => {\n const type = typeof val;\n return val == null || type !== \"object\" && type !== \"function\";\n};\nconst getFrame = () => {\n try {\n return window.self === window.top ? \"top\" : \"iframe\";\n } catch (error) {\n return \"iframe\";\n }\n};\nconst isRunningInIframe = () => getFrame() === \"iframe\";\nconst isPromiseLike = value => {\n return !!value && typeof value === \"object\" && \"then\" in value && \"catch\" in value && \"finally\" in value;\n};\nconst queryFocusableElements = container => {\n const focusableElements = container === null || container === void 0 ? void 0 : container.querySelectorAll(\"button, a, input, select, textarea, div[tabindex], label[tabindex]\");\n return focusableElements ? Array.from(focusableElements).filter(element => element.tabIndex > -1 && !element.disabled) : [];\n};\n/** use as a fallback after identity check (for perf reasons) */\n\nconst _defaultIsShallowComparatorFallback = (a, b) => {\n // consider two empty arrays equal\n if (Array.isArray(a) && Array.isArray(b) && a.length === 0 && b.length === 0) {\n return true;\n }\n\n return a === b;\n};\n/**\n * Returns whether object/array is shallow equal.\n * Considers empty object/arrays as equal (whether top-level or second-level).\n */\n\n\nconst isShallowEqual = (objA, objB, comparators, debug = false) => {\n const aKeys = Object.keys(objA);\n const bKeys = Object.keys(objB);\n\n if (aKeys.length !== bKeys.length) {\n if (debug) {\n console.warn(`%cisShallowEqual: objects don't have same properties ->`, \"color: #8B4000\", objA, objB);\n }\n\n return false;\n }\n\n if (comparators && Array.isArray(comparators)) {\n for (const key of comparators) {\n const ret = objA[key] === objB[key] || _defaultIsShallowComparatorFallback(objA[key], objB[key]);\n\n if (!ret) {\n if (debug) {\n console.warn(`%cisShallowEqual: ${key} not equal ->`, \"color: #8B4000\", objA[key], objB[key]);\n }\n\n return false;\n }\n }\n\n return true;\n }\n\n return aKeys.every(key => {\n const comparator = comparators === null || comparators === void 0 ? void 0 : comparators[key];\n const ret = comparator ? comparator(objA[key], objB[key]) : objA[key] === objB[key] || _defaultIsShallowComparatorFallback(objA[key], objB[key]);\n\n if (!ret && debug) {\n console.warn(`%cisShallowEqual: ${key} not equal ->`, \"color: #8B4000\", objA[key], objB[key]);\n }\n\n return ret;\n });\n}; // taken from Radix UI\n// https://github.com/radix-ui/primitives/blob/main/packages/core/primitive/src/primitive.tsx\n\nconst composeEventHandlers = (originalEventHandler, ourEventHandler, {\n checkForDefaultPrevented = true\n} = {}) => {\n return function handleEvent(event) {\n originalEventHandler === null || originalEventHandler === void 0 ? void 0 : originalEventHandler(event);\n\n if (!checkForDefaultPrevented || !(event === null || event === void 0 ? void 0 : event.defaultPrevented)) {\n return ourEventHandler === null || ourEventHandler === void 0 ? void 0 : ourEventHandler(event);\n }\n };\n};\n/**\n * supply `null` as message if non-never value is valid, you just need to\n * typecheck against it\n */\n\nconst assertNever = (value, message, softAssert) => {\n if (!message) {\n return value;\n }\n\n if (softAssert) {\n console.error(message);\n return value;\n }\n\n throw new Error(message);\n};\nfunction invariant(condition, message) {\n if (!condition) {\n throw new Error(message);\n }\n}\n/**\n * Memoizes on values of `opts` object (strict equality).\n */\n\nconst memoize = func => {\n let lastArgs;\n let lastResult;\n\n const ret = function (opts) {\n const currentArgs = Object.entries(opts);\n\n if (lastArgs) {\n let argsAreEqual = true;\n\n for (const [key, value] of currentArgs) {\n if (lastArgs.get(key) !== value) {\n argsAreEqual = false;\n break;\n }\n }\n\n if (argsAreEqual) {\n return lastResult;\n }\n }\n\n const result = func(opts);\n lastArgs = new Map(currentArgs);\n lastResult = result;\n return result;\n };\n\n ret.clear = () => {\n lastArgs = undefined;\n lastResult = undefined;\n };\n\n return ret;\n};\n/** Checks if value is inside given collection. Useful for type-safety. */\n\nconst isMemberOf = (\n/** Set/Map/Array/Object */\ncollection,\n/** value to look for */\nvalue) => {\n return collection instanceof Set || collection instanceof Map ? collection.has(value) : \"includes\" in collection ? collection.includes(value) : collection.hasOwnProperty(value);\n};\nconst cloneJSON = obj => JSON.parse(JSON.stringify(obj));\nconst updateStable = (prevValue, nextValue) => {\n if (isShallowEqual(prevValue, nextValue)) {\n return prevValue;\n }\n\n return nextValue;\n}; // implem\n\nfunction addEventListener(\n/**\n * allows for falsy values so you don't have to type check when adding\n * event listeners to optional elements\n */\ntarget, type, listener, options) {\n var _a;\n\n if (!target) {\n return () => {};\n }\n\n (_a = target === null || target === void 0 ? void 0 : target.addEventListener) === null || _a === void 0 ? void 0 : _a.call(target, type, listener, options);\n return () => {\n var _a;\n\n (_a = target === null || target === void 0 ? void 0 : target.removeEventListener) === null || _a === void 0 ? void 0 : _a.call(target, type, listener, options);\n };\n}\nfunction getSvgPathFromStroke(points, closed = true) {\n const len = points.length;\n\n if (len < 4) {\n return ``;\n }\n\n let a = points[0];\n let b = points[1];\n const c = points[2];\n let result = `M${a[0].toFixed(2)},${a[1].toFixed(2)} Q${b[0].toFixed(2)},${b[1].toFixed(2)} ${(0,_excalidraw_math__WEBPACK_IMPORTED_MODULE_0__.average)(b[0], c[0]).toFixed(2)},${(0,_excalidraw_math__WEBPACK_IMPORTED_MODULE_0__.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,_excalidraw_math__WEBPACK_IMPORTED_MODULE_0__.average)(a[0], b[0]).toFixed(2)},${(0,_excalidraw_math__WEBPACK_IMPORTED_MODULE_0__.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};\nfunction 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};\n/**\n * use when you need to render unsafe string as HTML attribute, but MAKE SURE\n * the attribute is double-quoted when constructing the HTML string\n */\n\nconst escapeDoubleQuotes = str => {\n return str.replace(/\"/g, \""\");\n};\nconst castArray = value => Array.isArray(value) ? value : [value];\n/** hack for Array.isArray type guard not working with readonly value[] */\n\nconst isReadonlyArray = value => {\n return Array.isArray(value);\n};\nconst sizeOf = value => {\n return isReadonlyArray(value) ? value.length : value instanceof Map || value instanceof Set ? value.size : Object.keys(value).length;\n};\nconst reduceToCommonValue = (collection, getValue) => {\n if (sizeOf(collection) === 0) {\n return null;\n }\n\n const valueExtractor = getValue || (item => item);\n\n let commonValue = null;\n\n for (const item of collection) {\n const value = valueExtractor(item);\n\n if ((commonValue === null || commonValue === value) && value != null) {\n commonValue = value;\n } else {\n return null;\n }\n }\n\n return commonValue;\n};\nconst FEATURE_FLAGS_STORAGE_KEY = \"excalidraw-feature-flags\";\nconst DEFAULT_FEATURE_FLAGS = {\n COMPLEX_BINDINGS: false\n};\nlet featureFlags = null;\nconst getFeatureFlag = flag => {\n if (!featureFlags) {\n try {\n const serializedFlags = localStorage.getItem(FEATURE_FLAGS_STORAGE_KEY);\n\n if (serializedFlags) {\n const flags = JSON.parse(serializedFlags);\n featureFlags = flags !== null && flags !== void 0 ? flags : DEFAULT_FEATURE_FLAGS;\n }\n } catch (_a) {}\n }\n\n return (featureFlags || DEFAULT_FEATURE_FLAGS)[flag];\n};\nconst setFeatureFlag = (flag, value) => {\n try {\n featureFlags = Object.assign(Object.assign({}, featureFlags || DEFAULT_FEATURE_FLAGS), {\n [flag]: value\n });\n localStorage.setItem(FEATURE_FLAGS_STORAGE_KEY, JSON.stringify(featureFlags));\n } catch (e) {\n console.error(\"unable to set feature flag\", e);\n }\n};\nconst oneOf = (needle, haystack) => {\n return haystack.includes(needle);\n};\n\n//# sourceURL=webpack://ExcalidrawLib/../common/src/utils.ts?\n}");
|
|
301
301
|
|
|
302
302
|
/***/ },
|
|
303
303
|
|
|
@@ -1584,7 +1584,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
1584
1584
|
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
1585
1585
|
|
|
1586
1586
|
"use strict";
|
|
1587
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ trackEvent: () => (/* binding */ trackEvent)\n/* harmony export */ });\n/* harmony import */ var _excalidraw_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @excalidraw/common */ \"../common/src/index.ts\");\n// place here categories that you want to track. We want to track just a\n // small subset of categories at a given time.\n\nconst ALLOWED_CATEGORIES_TO_TRACK = new Set([\"command_palette\", \"export\"]);\nconst trackEvent = (category, action, label, value) => {\n try {\n if (typeof window === \"undefined\" || ({\"MODE\":\"development\",\"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:3016\",\"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\":\"3001\",\"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_APP_DISABLE_PREVENT_UNLOAD\":\"\",\"VITE_PKG_NAME\":\"@zsviczian/excalidraw\",\"VITE_PKG_VERSION\":\"0.18.113-beta.
|
|
1587
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ trackEvent: () => (/* binding */ trackEvent)\n/* harmony export */ });\n/* harmony import */ var _excalidraw_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @excalidraw/common */ \"../common/src/index.ts\");\n// place here categories that you want to track. We want to track just a\n // small subset of categories at a given time.\n\nconst ALLOWED_CATEGORIES_TO_TRACK = new Set([\"command_palette\", \"export\"]);\nconst trackEvent = (category, action, label, value) => {\n try {\n if (typeof window === \"undefined\" || ({\"MODE\":\"development\",\"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:3016\",\"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\":\"3001\",\"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_APP_DISABLE_PREVENT_UNLOAD\":\"\",\"VITE_PKG_NAME\":\"@zsviczian/excalidraw\",\"VITE_PKG_VERSION\":\"0.18.113-beta.4\",\"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 ((0,_excalidraw_common__WEBPACK_IMPORTED_MODULE_0__.isDevEnv)()) {\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?\n}");
|
|
1588
1588
|
|
|
1589
1589
|
/***/ },
|
|
1590
1590
|
|
|
@@ -2167,7 +2167,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
2167
2167
|
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
2168
2168
|
|
|
2169
2169
|
"use strict";
|
|
2170
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EyeDropper: () => (/* binding */ EyeDropper),\n/* harmony export */ activeEyeDropperAtom: () => (/* binding */ activeEyeDropperAtom)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ \"react-dom\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _excalidraw_common__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @excalidraw/common */ \"../common/src/index.ts\");\n/* harmony import */ var _context_ui_appState__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../context/ui-appState */ \"./context/ui-appState.ts\");\n/* harmony import */ var _editor_jotai__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../editor-jotai */ \"./editor-jotai.ts\");\n/* harmony import */ var _hooks_useCreatePortalContainer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../hooks/useCreatePortalContainer */ \"./hooks/useCreatePortalContainer.ts\");\n/* harmony import */ var _hooks_useOutsideClick__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../hooks/useOutsideClick */ \"./hooks/useOutsideClick.ts\");\n/* harmony import */ var _hooks_useStable__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../hooks/useStable */ \"./hooks/useStable.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../scene */ \"./scene/index.ts\");\n/* harmony import */ var _App__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./App */ \"./components/App.tsx\");\n/* harmony import */ var _positionElementBesideCursor__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./positionElementBesideCursor */ \"./components/positionElementBesideCursor.ts\");\n/* harmony import */ var _EyeDropper_scss__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./EyeDropper.scss */ \"./components/EyeDropper.scss\");\n\n\n\n\n\n\n\n\n\n\n\n\nconst activeEyeDropperAtom = (0,_editor_jotai__WEBPACK_IMPORTED_MODULE_4__.atom)(null);\nconst EyeDropper = ({\n onCancel,\n onChange,\n onSelect,\n colorPickerType\n}) => {\n const eyeDropperContainer = (0,_hooks_useCreatePortalContainer__WEBPACK_IMPORTED_MODULE_5__.useCreatePortalContainer)({\n className: \"excalidraw-eye-dropper-backdrop\",\n parentSelector: \".excalidraw-eye-dropper-container\"\n });\n const appState = (0,_context_ui_appState__WEBPACK_IMPORTED_MODULE_3__.useUIAppState)();\n const elements = (0,_App__WEBPACK_IMPORTED_MODULE_9__.useExcalidrawElements)();\n const app = (0,_App__WEBPACK_IMPORTED_MODULE_9__.useApp)();\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_8__.getSelectedElements)(elements, appState);\n const stableProps = (0,_hooks_useStable__WEBPACK_IMPORTED_MODULE_7__.useStable)({\n app,\n onCancel,\n onChange,\n onSelect,\n selectedElements\n });\n const {\n container: excalidrawContainer\n } = (0,_App__WEBPACK_IMPORTED_MODULE_9__.useExcalidrawContainer)();\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const colorPreviewDiv = ref.current;\n\n if (!colorPreviewDiv || !app.canvas || !eyeDropperContainer) {\n return;\n }\n\n let isHoldingPointerDown = false;\n const ctx = app.canvas.getContext(\"2d\");\n\n const getCurrentColor = ({\n clientX,\n clientY\n }) => {\n const pixel = ctx.getImageData((clientX - appState.offsetLeft) * window.devicePixelRatio, (clientY - appState.offsetTop) * window.devicePixelRatio, 1, 1).data;\n return (0,_excalidraw_common__WEBPACK_IMPORTED_MODULE_2__.rgbToHex)(pixel[0], pixel[1], pixel[2]);\n };\n\n const mouseMoveListener = ({\n clientX,\n clientY,\n altKey\n }) => {\n const {\n top,\n left\n } = (0,_positionElementBesideCursor__WEBPACK_IMPORTED_MODULE_10__.positionElementBesideCursor)({\n cursor: {\n x: clientX
|
|
2170
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EyeDropper: () => (/* binding */ EyeDropper),\n/* harmony export */ activeEyeDropperAtom: () => (/* binding */ activeEyeDropperAtom)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ \"react-dom\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _excalidraw_common__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @excalidraw/common */ \"../common/src/index.ts\");\n/* harmony import */ var _context_ui_appState__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../context/ui-appState */ \"./context/ui-appState.ts\");\n/* harmony import */ var _editor_jotai__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../editor-jotai */ \"./editor-jotai.ts\");\n/* harmony import */ var _hooks_useCreatePortalContainer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../hooks/useCreatePortalContainer */ \"./hooks/useCreatePortalContainer.ts\");\n/* harmony import */ var _hooks_useOutsideClick__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../hooks/useOutsideClick */ \"./hooks/useOutsideClick.ts\");\n/* harmony import */ var _hooks_useStable__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../hooks/useStable */ \"./hooks/useStable.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../scene */ \"./scene/index.ts\");\n/* harmony import */ var _App__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./App */ \"./components/App.tsx\");\n/* harmony import */ var _positionElementBesideCursor__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./positionElementBesideCursor */ \"./components/positionElementBesideCursor.ts\");\n/* harmony import */ var _EyeDropper_scss__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./EyeDropper.scss */ \"./components/EyeDropper.scss\");\n\n\n\n\n\n\n\n\n\n\n\n\nconst activeEyeDropperAtom = (0,_editor_jotai__WEBPACK_IMPORTED_MODULE_4__.atom)(null);\nconst EyeDropper = ({\n onCancel,\n onChange,\n onSelect,\n colorPickerType\n}) => {\n const eyeDropperContainer = (0,_hooks_useCreatePortalContainer__WEBPACK_IMPORTED_MODULE_5__.useCreatePortalContainer)({\n className: \"excalidraw-eye-dropper-backdrop\",\n parentSelector: \".excalidraw-eye-dropper-container\"\n });\n const appState = (0,_context_ui_appState__WEBPACK_IMPORTED_MODULE_3__.useUIAppState)();\n const elements = (0,_App__WEBPACK_IMPORTED_MODULE_9__.useExcalidrawElements)();\n const app = (0,_App__WEBPACK_IMPORTED_MODULE_9__.useApp)();\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_8__.getSelectedElements)(elements, appState);\n const stableProps = (0,_hooks_useStable__WEBPACK_IMPORTED_MODULE_7__.useStable)({\n app,\n onCancel,\n onChange,\n onSelect,\n selectedElements\n });\n const {\n container: excalidrawContainer\n } = (0,_App__WEBPACK_IMPORTED_MODULE_9__.useExcalidrawContainer)();\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const colorPreviewDiv = ref.current;\n\n if (!colorPreviewDiv || !app.canvas || !eyeDropperContainer) {\n return;\n }\n\n let isHoldingPointerDown = false;\n const ctx = app.canvas.getContext(\"2d\");\n\n const getCurrentColor = ({\n clientX,\n clientY\n }) => {\n const pixel = ctx.getImageData((clientX - appState.offsetLeft) * window.devicePixelRatio, (clientY - appState.offsetTop) * window.devicePixelRatio, 1, 1).data;\n return (0,_excalidraw_common__WEBPACK_IMPORTED_MODULE_2__.rgbToHex)(pixel[0], pixel[1], pixel[2]);\n };\n\n const mouseMoveListener = ({\n clientX,\n clientY,\n altKey\n }) => {\n const {\n top,\n left\n } = (0,_positionElementBesideCursor__WEBPACK_IMPORTED_MODULE_10__.positionElementBesideCursor)({\n cursor: {\n x: clientX,\n y: clientY\n },\n element: {\n width: colorPreviewDiv.offsetWidth,\n height: colorPreviewDiv.offsetHeight\n },\n container: eyeDropperContainer.getBoundingClientRect(),\n gap: 20\n });\n colorPreviewDiv.style.top = `${top}px`;\n colorPreviewDiv.style.left = `${left}px`;\n const currentColor = getCurrentColor({\n clientX,\n clientY\n });\n\n if (isHoldingPointerDown) {\n stableProps.onChange(colorPickerType, currentColor, stableProps.selectedElements, {\n altKey\n });\n }\n\n colorPreviewDiv.style.background = currentColor;\n };\n\n const onCancel = () => {\n stableProps.onCancel();\n };\n\n const onSelect = (color, event) => {\n stableProps.onSelect(color, event);\n };\n\n const pointerDownListener = event => {\n isHoldingPointerDown = true; // NOTE we can't event.preventDefault() as that would stop\n // pointermove events\n\n event.stopImmediatePropagation();\n };\n\n const pointerUpListener = event => {\n isHoldingPointerDown = false; // since we're not preventing default on pointerdown, the focus would\n // goes back to `body` so we want to refocus the editor container instead\n\n excalidrawContainer === null || excalidrawContainer === void 0 ? void 0 : excalidrawContainer.focus();\n event.stopImmediatePropagation();\n event.preventDefault();\n onSelect(getCurrentColor(event), event);\n };\n\n const keyDownListener = event => {\n if (event.key === _excalidraw_common__WEBPACK_IMPORTED_MODULE_2__.KEYS.ESCAPE) {\n event.preventDefault();\n event.stopImmediatePropagation();\n onCancel();\n }\n }; // -------------------------------------------------------------------------\n\n\n eyeDropperContainer.tabIndex = -1; // focus container so we can listen on keydown events\n\n eyeDropperContainer.focus(); // init color preview else it would show only after the first mouse move\n\n mouseMoveListener({\n clientX: stableProps.app.viewport.lastPosition.x,\n clientY: stableProps.app.viewport.lastPosition.y,\n altKey: false\n });\n eyeDropperContainer.addEventListener(_excalidraw_common__WEBPACK_IMPORTED_MODULE_2__.EVENT.KEYDOWN, keyDownListener);\n eyeDropperContainer.addEventListener(_excalidraw_common__WEBPACK_IMPORTED_MODULE_2__.EVENT.POINTER_DOWN, pointerDownListener);\n eyeDropperContainer.addEventListener(_excalidraw_common__WEBPACK_IMPORTED_MODULE_2__.EVENT.POINTER_UP, pointerUpListener);\n window.addEventListener(\"pointermove\", mouseMoveListener, {\n passive: true\n });\n window.addEventListener(_excalidraw_common__WEBPACK_IMPORTED_MODULE_2__.EVENT.BLUR, onCancel);\n return () => {\n isHoldingPointerDown = false;\n eyeDropperContainer.removeEventListener(_excalidraw_common__WEBPACK_IMPORTED_MODULE_2__.EVENT.KEYDOWN, keyDownListener);\n eyeDropperContainer.removeEventListener(_excalidraw_common__WEBPACK_IMPORTED_MODULE_2__.EVENT.POINTER_DOWN, pointerDownListener);\n eyeDropperContainer.removeEventListener(_excalidraw_common__WEBPACK_IMPORTED_MODULE_2__.EVENT.POINTER_UP, pointerUpListener);\n window.removeEventListener(\"pointermove\", mouseMoveListener);\n window.removeEventListener(_excalidraw_common__WEBPACK_IMPORTED_MODULE_2__.EVENT.BLUR, onCancel);\n };\n }, [stableProps, app.canvas, eyeDropperContainer, colorPickerType, excalidrawContainer, appState.offsetLeft, appState.offsetTop]);\n const ref = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n (0,_hooks_useOutsideClick__WEBPACK_IMPORTED_MODULE_6__.useOutsideClick)(ref, () => {\n onCancel();\n }, event => {\n if (event.target.closest(\".excalidraw-eye-dropper-trigger, .excalidraw-eye-dropper-backdrop\")) {\n return true;\n } // consider all other clicks as outside\n\n\n return false;\n });\n\n if (!eyeDropperContainer) {\n return null;\n }\n\n return /*#__PURE__*/(0,react_dom__WEBPACK_IMPORTED_MODULE_1__.createPortal)(React.createElement(\"div\", {\n ref: ref,\n className: \"excalidraw-eye-dropper-preview\"\n }), eyeDropperContainer);\n};\n\n//# sourceURL=webpack://ExcalidrawLib/./components/EyeDropper.tsx?\n}");
|
|
2171
2171
|
|
|
2172
2172
|
/***/ },
|
|
2173
2173
|
|
|
@@ -2534,6 +2534,17 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
2534
2534
|
|
|
2535
2535
|
/***/ },
|
|
2536
2536
|
|
|
2537
|
+
/***/ "./components/ObsidianRadixPortal.tsx"
|
|
2538
|
+
/*!********************************************!*\
|
|
2539
|
+
!*** ./components/ObsidianRadixPortal.tsx ***!
|
|
2540
|
+
\********************************************/
|
|
2541
|
+
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
2542
|
+
|
|
2543
|
+
"use strict";
|
|
2544
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ObsidianRadixPortal: () => (/* binding */ ObsidianRadixPortal)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\n/**\n * Purpose:\n * Render Radix floating-position wrappers directly under the owning\n * document's body. Obsidian popout windows place Excalidraw inside an\n * offset containing block, which otherwise displaces Radix's fixed wrapper.\n * The display:contents bridge retains Excalidraw's scoped theme rules and\n * inline CSS variables without creating another containing block.\n *\n * Author:\n * zsviczian\n *\n * References:\n * https://github.com/excalidraw/excalidraw/pull/10221\n *\n * Notes:\n * This is specific to Excalidraw hosted in Obsidian's Electron popouts.\n */\n\nconst ObsidianRadixPortal = ({\n children,\n container,\n portal: Portal\n}) => {\n const bridgeStyle = {\n display: \"contents\"\n };\n\n if (container) {\n Array.from(container.style).forEach(propertyName => {\n if (propertyName === \"color\" || propertyName.startsWith(\"--\")) {\n bridgeStyle[propertyName] = container.style.getPropertyValue(propertyName);\n }\n });\n }\n\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Portal, {\n container: container === null || container === void 0 ? void 0 : container.ownerDocument.body\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: container === null || container === void 0 ? void 0 : container.className,\n style: bridgeStyle\n }, children));\n};\n\n//# sourceURL=webpack://ExcalidrawLib/./components/ObsidianRadixPortal.tsx?\n}");
|
|
2545
|
+
|
|
2546
|
+
/***/ },
|
|
2547
|
+
|
|
2537
2548
|
/***/ "./components/OverwriteConfirm/OverwriteConfirm.tsx"
|
|
2538
2549
|
/*!**********************************************************!*\
|
|
2539
2550
|
!*** ./components/OverwriteConfirm/OverwriteConfirm.tsx ***!
|
|
@@ -2618,7 +2629,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
2618
2629
|
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
2619
2630
|
|
|
2620
2631
|
"use strict";
|
|
2621
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PropertiesPopover: () => (/* binding */ PropertiesPopover)\n/* harmony export */ });\n/* harmony import */ var radix_ui__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! radix-ui */ \"../../node_modules/@radix-ui/react-popover/dist/index.mjs\");\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ \"../../node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _excalidraw_common__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @excalidraw/common */ \"../common/src/index.ts\");\n/* harmony import */ var _App__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./App */ \"./components/App.tsx\");\n/* harmony import */ var _Island__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Island */ \"./components/Island.tsx\");\n\n\n\n\n\n\nconst PropertiesPopover = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().forwardRef(({\n className,\n container,\n children,\n style,\n onClose,\n onKeyDown,\n onFocusOutside,\n onPointerLeave,\n onPointerDownOutside,\n preventAutoFocusOnTouch = false\n}, ref) => {\n const editorInterface = (0,_App__WEBPACK_IMPORTED_MODULE_4__.useEditorInterface)();\n const isMobilePortrait = editorInterface.formFactor === \"phone\" && !editorInterface.isLandscape;\n return /*#__PURE__
|
|
2632
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PropertiesPopover: () => (/* binding */ PropertiesPopover)\n/* harmony export */ });\n/* harmony import */ var radix_ui__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! radix-ui */ \"../../node_modules/@radix-ui/react-popover/dist/index.mjs\");\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ \"../../node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _excalidraw_common__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @excalidraw/common */ \"../common/src/index.ts\");\n/* harmony import */ var _App__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./App */ \"./components/App.tsx\");\n/* harmony import */ var _Island__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Island */ \"./components/Island.tsx\");\n/* harmony import */ var _ObsidianRadixPortal__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./ObsidianRadixPortal */ \"./components/ObsidianRadixPortal.tsx\");\n\n\n\n\n\n\n\nconst PropertiesPopover = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().forwardRef(({\n className,\n container,\n children,\n style,\n onClose,\n onKeyDown,\n onFocusOutside,\n onPointerLeave,\n onPointerDownOutside,\n preventAutoFocusOnTouch = false\n}, ref) => {\n const editorInterface = (0,_App__WEBPACK_IMPORTED_MODULE_4__.useEditorInterface)();\n const isMobilePortrait = editorInterface.formFactor === \"phone\" && !editorInterface.isLandscape;\n return (\n /*#__PURE__*/\n\n /* <Popover.Portal container={container}> */\n react__WEBPACK_IMPORTED_MODULE_2___default().createElement(_ObsidianRadixPortal__WEBPACK_IMPORTED_MODULE_6__.ObsidianRadixPortal, {\n portal: radix_ui__WEBPACK_IMPORTED_MODULE_0__.Portal,\n container: container\n }, \" //zsviczian body-level portal prevents vertical displacement in Obsidian popout windows\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(radix_ui__WEBPACK_IMPORTED_MODULE_0__.Content, {\n ref: ref,\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(\"focus-visible-none\", className),\n \"data-prevent-outside-click\": true,\n side: isMobilePortrait ? \"bottom\" : \"right\",\n align: isMobilePortrait ? \"center\" : \"start\",\n alignOffset: -16,\n sideOffset: 20,\n collisionBoundary: container !== null && container !== void 0 ? container : undefined,\n style: {\n zIndex: \"var(--zIndex-ui-styles-popup)\",\n marginLeft: editorInterface.formFactor === \"phone\" ? \"0.5rem\" : undefined\n },\n onPointerLeave: onPointerLeave,\n onKeyDown: onKeyDown,\n onFocusOutside: onFocusOutside,\n onPointerDownOutside: onPointerDownOutside,\n onOpenAutoFocus: e => {\n // prevent auto-focus on touch devices to avoid keyboard popup\n if (preventAutoFocusOnTouch && editorInterface.isTouchScreen) {\n e.preventDefault();\n }\n },\n onCloseAutoFocus: e => {\n e.stopPropagation(); // prevents focusing the trigger\n\n e.preventDefault(); // return focus to excalidraw container unless\n // user focuses an interactive element, such as a button, or\n // enters the text editor by clicking on canvas with the text tool\n\n if (container && !(0,_excalidraw_common__WEBPACK_IMPORTED_MODULE_3__.isInteractive)(document.activeElement)) {\n container.focus();\n }\n\n onClose();\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(_Island__WEBPACK_IMPORTED_MODULE_5__.Island, {\n padding: 3,\n style: style\n }, children), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().createElement(radix_ui__WEBPACK_IMPORTED_MODULE_0__.Arrow, {\n width: 20,\n height: 10,\n style: {\n fill: \"var(--popup-bg-color)\",\n filter: \"drop-shadow(rgba(0, 0, 0, 0.05) 0px 3px 2px)\"\n }\n }))) //zsviczian </Popover.Portal>\n\n );\n});\n\n//# sourceURL=webpack://ExcalidrawLib/./components/PropertiesPopover.tsx?\n}");
|
|
2622
2633
|
|
|
2623
2634
|
/***/ },
|
|
2624
2635
|
|
|
@@ -3421,7 +3432,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
3421
3432
|
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
3422
3433
|
|
|
3423
3434
|
"use strict";
|
|
3424
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ToolPopover: () => (/* binding */ ToolPopover)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ \"../../node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _excalidraw_common__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @excalidraw/common */ \"../common/src/index.ts\");\n/* harmony import */ var radix_ui__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! radix-ui */ \"../../node_modules/@radix-ui/react-popover/dist/index.mjs\");\n/* harmony import */ var _analytics__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../analytics */ \"./analytics.ts\");\n/* harmony import */ var _IconButton__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./IconButton */ \"./components/IconButton.tsx\");\n/* harmony import */ var _Tools__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Tools */ \"./components/Tools.tsx\");\n/* harmony import */ var _ToolPopover_scss__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ToolPopover.scss */ \"./components/ToolPopover.scss\");\n/* harmony import */ var _App__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./App */ \"./components/App.tsx\");\n\n\n\n\n\n\n\n\n\nconst ToolPopover = ({\n app,\n options,\n activeTool,\n defaultOption,\n \"data-testid\": dataTestId,\n onToolChange,\n displayedOption\n}) => {\n const [isPopupOpen, setIsPopupOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n const currentType = activeTool.type;\n const isActive = displayedOption.type === currentType;\n const SIDE_OFFSET = 16;\n const {\n container\n } = (0,_App__WEBPACK_IMPORTED_MODULE_8__.useExcalidrawContainer)(); // if currentType is not in options, close popup\n\n if (!options.some(o => o.type === currentType) && isPopupOpen) {\n setIsPopupOpen(false);\n } // Close popover when user starts interacting with the canvas (pointer down)\n\n\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n // app.onPointerDownEmitter emits when pointer down happens on canvas area\n const unsubscribe = app.onPointerDownEmitter.on(() => {\n setIsPopupOpen(false);\n });\n return () => unsubscribe === null || unsubscribe === void 0 ? void 0 : unsubscribe();\n }, [app]);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(radix_ui__WEBPACK_IMPORTED_MODULE_3__.Root, {\n open: isPopupOpen\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(radix_ui__WEBPACK_IMPORTED_MODULE_3__.Trigger, {\n asChild: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_IconButton__WEBPACK_IMPORTED_MODULE_5__.IconButton, {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n fillable: displayedOption.fillable\n }),\n type: \"toggle\",\n icon: displayedOption.icon,\n checked: isActive,\n disabled: options.every(option => (0,_Tools__WEBPACK_IMPORTED_MODULE_6__.isToolButtonDisabled)(app, option.type)),\n title: (0,_excalidraw_common__WEBPACK_IMPORTED_MODULE_2__.capitalizeString)(displayedOption.title),\n \"aria-label\": (0,_excalidraw_common__WEBPACK_IMPORTED_MODULE_2__.capitalizeString)(displayedOption.title),\n \"data-testid\": dataTestId,\n onSelect: () => {\n setIsPopupOpen(v => !v);\n onToolChange(defaultOption);\n }\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(radix_ui__WEBPACK_IMPORTED_MODULE_3__.Content, {\n className: \"tool-popover-content\",\n sideOffset: SIDE_OFFSET,\n collisionBoundary: container !== null && container !== void 0 ? container : undefined\n }, options.map(({\n type,\n icon,\n title,\n fillable\n }) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_IconButton__WEBPACK_IMPORTED_MODULE_5__.IconButton, {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n fillable\n }),\n key: type,\n type: \"toggle\",\n icon: icon,\n checked: currentType === type,\n disabled: (0,_Tools__WEBPACK_IMPORTED_MODULE_6__.isToolButtonDisabled)(app, type),\n title: (0,_excalidraw_common__WEBPACK_IMPORTED_MODULE_2__.capitalizeString)(type),\n \"aria-label\": (0,_excalidraw_common__WEBPACK_IMPORTED_MODULE_2__.capitalizeString)(type),\n \"data-testid\": `toolbar-${type}`,\n onSelect: () => {\n if (app.state.activeTool.type !== type) {\n (0,_analytics__WEBPACK_IMPORTED_MODULE_4__.trackEvent)(\"toolbar\", type, \"ui\");\n app.setActiveTool({\n type: type\n });\n onToolChange === null || onToolChange === void 0 ? void 0 : onToolChange(type);\n }\n }\n }))));\n};\n\n//# sourceURL=webpack://ExcalidrawLib/./components/ToolPopover.tsx?\n}");
|
|
3435
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ToolPopover: () => (/* binding */ ToolPopover)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ \"../../node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _excalidraw_common__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @excalidraw/common */ \"../common/src/index.ts\");\n/* harmony import */ var radix_ui__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! radix-ui */ \"../../node_modules/@radix-ui/react-popover/dist/index.mjs\");\n/* harmony import */ var _analytics__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../analytics */ \"./analytics.ts\");\n/* harmony import */ var _IconButton__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./IconButton */ \"./components/IconButton.tsx\");\n/* harmony import */ var _Tools__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Tools */ \"./components/Tools.tsx\");\n/* harmony import */ var _ToolPopover_scss__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ToolPopover.scss */ \"./components/ToolPopover.scss\");\n/* harmony import */ var _App__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./App */ \"./components/App.tsx\");\n/* harmony import */ var _ObsidianRadixPortal__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./ObsidianRadixPortal */ \"./components/ObsidianRadixPortal.tsx\");\n\n\n\n\n\n\n\n\n\n\nconst ToolPopover = ({\n app,\n options,\n activeTool,\n defaultOption,\n \"data-testid\": dataTestId,\n onToolChange,\n displayedOption\n}) => {\n const [isPopupOpen, setIsPopupOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n const currentType = activeTool.type;\n const isActive = displayedOption.type === currentType;\n const SIDE_OFFSET = 16;\n const {\n container\n } = (0,_App__WEBPACK_IMPORTED_MODULE_8__.useExcalidrawContainer)(); // if currentType is not in options, close popup\n\n if (!options.some(o => o.type === currentType) && isPopupOpen) {\n setIsPopupOpen(false);\n } // Close popover when user starts interacting with the canvas (pointer down)\n\n\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n // app.onPointerDownEmitter emits when pointer down happens on canvas area\n const unsubscribe = app.onPointerDownEmitter.on(() => {\n setIsPopupOpen(false);\n });\n return () => unsubscribe === null || unsubscribe === void 0 ? void 0 : unsubscribe();\n }, [app]);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(radix_ui__WEBPACK_IMPORTED_MODULE_3__.Root, {\n open: isPopupOpen\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(radix_ui__WEBPACK_IMPORTED_MODULE_3__.Trigger, {\n asChild: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_IconButton__WEBPACK_IMPORTED_MODULE_5__.IconButton, {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n fillable: displayedOption.fillable\n }),\n type: \"toggle\",\n icon: displayedOption.icon,\n checked: isActive,\n disabled: options.every(option => (0,_Tools__WEBPACK_IMPORTED_MODULE_6__.isToolButtonDisabled)(app, option.type)),\n title: (0,_excalidraw_common__WEBPACK_IMPORTED_MODULE_2__.capitalizeString)(displayedOption.title),\n \"aria-label\": (0,_excalidraw_common__WEBPACK_IMPORTED_MODULE_2__.capitalizeString)(displayedOption.title),\n \"data-testid\": dataTestId,\n onSelect: () => {\n setIsPopupOpen(v => !v);\n onToolChange(defaultOption);\n }\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ObsidianRadixPortal__WEBPACK_IMPORTED_MODULE_9__.ObsidianRadixPortal, {\n portal: radix_ui__WEBPACK_IMPORTED_MODULE_3__.Portal,\n container: container\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(radix_ui__WEBPACK_IMPORTED_MODULE_3__.Content, {\n className: \"tool-popover-content\",\n sideOffset: SIDE_OFFSET,\n collisionBoundary: container !== null && container !== void 0 ? container : undefined\n }, options.map(({\n type,\n icon,\n title,\n fillable\n }) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_IconButton__WEBPACK_IMPORTED_MODULE_5__.IconButton, {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n fillable\n }),\n key: type,\n type: \"toggle\",\n icon: icon,\n checked: currentType === type,\n disabled: (0,_Tools__WEBPACK_IMPORTED_MODULE_6__.isToolButtonDisabled)(app, type),\n title: (0,_excalidraw_common__WEBPACK_IMPORTED_MODULE_2__.capitalizeString)(type),\n \"aria-label\": (0,_excalidraw_common__WEBPACK_IMPORTED_MODULE_2__.capitalizeString)(type),\n \"data-testid\": `toolbar-${type}`,\n onSelect: () => {\n if (app.state.activeTool.type !== type) {\n (0,_analytics__WEBPACK_IMPORTED_MODULE_4__.trackEvent)(\"toolbar\", type, \"ui\");\n app.setActiveTool({\n type: type\n });\n onToolChange === null || onToolChange === void 0 ? void 0 : onToolChange(type);\n }\n }\n })))), \" \");\n};\n\n//# sourceURL=webpack://ExcalidrawLib/./components/ToolPopover.tsx?\n}");
|
|
3425
3436
|
|
|
3426
3437
|
/***/ },
|
|
3427
3438
|
|
|
@@ -3476,7 +3487,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
3476
3487
|
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
3477
3488
|
|
|
3478
3489
|
"use strict";
|
|
3479
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TrayMenu: () => (/* binding */ TrayMenu)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _excalidraw_element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @excalidraw/element */ \"../element/src/index.ts\");\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ \"../../node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _excalidraw_common__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @excalidraw/common */ \"../common/src/index.ts\");\n/* harmony import */ var _context_tunnels__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../context/tunnels */ \"./context/tunnels.ts\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../i18n */ \"./i18n.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../scene */ \"./scene/index.ts\");\n/* harmony import */ var _scene_scrollbars__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../scene/scrollbars */ \"./scene/scrollbars.ts\");\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../actions */ \"./actions/index.ts\");\n/* harmony import */ var _Actions__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Actions */ \"./components/Actions.tsx\");\n/* harmony import */ var _App__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./App */ \"./components/App.tsx\");\n/* harmony import */ var _FixedSideContainer__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./FixedSideContainer */ \"./components/FixedSideContainer.tsx\");\n/* harmony import */ var _HintViewer__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./HintViewer */ \"./components/HintViewer.tsx\");\n/* harmony import */ var _ImageMenu__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./ImageMenu */ \"./components/ImageMenu.tsx\");\n/* harmony import */ var _Island__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Island */ \"./components/Island.tsx\");\n/* harmony import */ var _LockButton__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./LockButton */ \"./components/LockButton.tsx\");\n/* harmony import */ var _PenModeButton__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./PenModeButton */ \"./components/PenModeButton.tsx\");\n/* harmony import */ var _Section__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Section */ \"./components/Section.tsx\");\n/* harmony import */ var _Stack__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Stack */ \"./components/Stack.tsx\");\n/* harmony import */ var _dropdownMenu_DropdownMenu__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./dropdownMenu/DropdownMenu */ \"./components/dropdownMenu/DropdownMenu.tsx\");\n/* harmony import */ var _icons__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./icons */ \"./components/icons.tsx\");\n/* harmony import */ var _Tools__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Tools */ \"./components/Tools.tsx\");\n/* harmony import */ var _Stats__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Stats */ \"./components/Stats/index.tsx\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst TrayToolbar = ({\n app,\n appState,\n setAppState,\n UIOptions\n}) => {\n var _a;\n\n const {\n TTDDialogTriggerTunnel\n } = (0,_context_tunnels__WEBPACK_IMPORTED_MODULE_4__.useTunnels)();\n const {\n renderMermaid\n } = (0,_App__WEBPACK_IMPORTED_MODULE_10__.useAppProps)(); //zsviczian\n\n const stylesPanelMode = (0,_App__WEBPACK_IMPORTED_MODULE_10__.useStylesPanelMode)(); //zsviczian\n\n const [isExtraToolsMenuOpen, setIsExtraToolsMenuOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n const [isImageMenuOpen, setIsImageMenuOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false); //zsviczian\n\n const activeTool = appState.activeTool;\n const toolProps = {\n app,\n activeTool\n };\n const isFullStylesPanel = stylesPanelMode === \"full\";\n const isTrayModePanel = stylesPanelMode === \"tray\"; //zsviczian\n\n const frameToolSelected = activeTool.type === \"frame\";\n const drawShapeToolSelected = activeTool.type === \"autoshape\"; //zsviczian autoshape in tray menu\n\n const laserToolSelected = activeTool.type === \"laser\";\n const embeddableToolSelected = activeTool.type === \"embeddable\";\n const lassoToolSelected = (isFullStylesPanel || isTrayModePanel) && activeTool.type === \"lasso\" && app.state.preferredSelectionTool.type !== \"lasso\";\n const showLassoTool = isFullStylesPanel || isTrayModePanel; //zsviczian\n\n const showImageTool = ((_a = UIOptions.tools) === null || _a === void 0 ? void 0 : _a.image) !== false;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Tools__WEBPACK_IMPORTED_MODULE_21__.HandToolButton, Object.assign({}, toolProps, {\n hideKeyBinding: true\n })), appState.preferredSelectionTool.type === \"lasso\" ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Tools__WEBPACK_IMPORTED_MODULE_21__.LassoToolButton, Object.assign({}, toolProps)) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Tools__WEBPACK_IMPORTED_MODULE_21__.SelectionToolButton, Object.assign({}, toolProps)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Tools__WEBPACK_IMPORTED_MODULE_21__.RectangleToolButton, Object.assign({}, toolProps)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Tools__WEBPACK_IMPORTED_MODULE_21__.DiamondToolButton, Object.assign({}, toolProps)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Tools__WEBPACK_IMPORTED_MODULE_21__.EllipseToolButton, Object.assign({}, toolProps)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Tools__WEBPACK_IMPORTED_MODULE_21__.ArrowToolButton, Object.assign({}, toolProps)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Tools__WEBPACK_IMPORTED_MODULE_21__.LineToolButton, Object.assign({}, toolProps)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Tools__WEBPACK_IMPORTED_MODULE_21__.FreedrawToolButton, Object.assign({}, toolProps)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Tools__WEBPACK_IMPORTED_MODULE_21__.TextToolButton, Object.assign({}, toolProps)), showImageTool && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ImageMenu__WEBPACK_IMPORTED_MODULE_13__.ImageMenu, {\n app: app,\n open: isImageMenuOpen,\n onToggle: () => {\n if (!isImageMenuOpen) {\n setIsExtraToolsMenuOpen(false);\n }\n\n setIsImageMenuOpen(!isImageMenuOpen);\n },\n onClose: () => setIsImageMenuOpen(false)\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Tools__WEBPACK_IMPORTED_MODULE_21__.EraserToolButton, Object.assign({}, toolProps)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"App-toolbar__divider\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_dropdownMenu_DropdownMenu__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n open: isExtraToolsMenuOpen\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_dropdownMenu_DropdownMenu__WEBPACK_IMPORTED_MODULE_19__[\"default\"].Trigger, {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(\"App-toolbar__extra-tools-trigger\", {\n \"App-toolbar__extra-tools-trigger--selected\": frameToolSelected || embeddableToolSelected || drawShapeToolSelected || //zsviczian autoshape in tray menu\n lassoToolSelected || laserToolSelected && !app.props.isCollaborating\n }),\n onToggle: () => {\n if (!isExtraToolsMenuOpen) {\n setIsImageMenuOpen(false); //zsviczian\n }\n\n setIsExtraToolsMenuOpen(!isExtraToolsMenuOpen);\n setAppState({\n openMenu: null,\n openPopup: null\n });\n },\n title: (0,_i18n__WEBPACK_IMPORTED_MODULE_5__.t)(\"toolBar.extraTools\")\n }, frameToolSelected ? _icons__WEBPACK_IMPORTED_MODULE_20__.frameToolIcon : embeddableToolSelected ? _icons__WEBPACK_IMPORTED_MODULE_20__.EmbedIcon : drawShapeToolSelected //zsviczian autoshape in tray menu\n ? _icons__WEBPACK_IMPORTED_MODULE_20__.drawShapeToolIcon //zsviczian autoshape in tray menu\n : laserToolSelected && !app.props.isCollaborating ? _icons__WEBPACK_IMPORTED_MODULE_20__.laserPointerToolIcon : lassoToolSelected ? _icons__WEBPACK_IMPORTED_MODULE_20__.LassoIcon : _icons__WEBPACK_IMPORTED_MODULE_20__.DotsIcon), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_dropdownMenu_DropdownMenu__WEBPACK_IMPORTED_MODULE_19__[\"default\"].Content, {\n onClickOutside: () => setIsExtraToolsMenuOpen(false),\n onSelect: () => setIsExtraToolsMenuOpen(false),\n className: \"App-toolbar__extra-tools-dropdown\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_dropdownMenu_DropdownMenu__WEBPACK_IMPORTED_MODULE_19__[\"default\"].Item, {\n onSelect: () => app.setActiveTool({\n type: \"frame\"\n }),\n icon: _icons__WEBPACK_IMPORTED_MODULE_20__.frameToolIcon,\n shortcut: _excalidraw_common__WEBPACK_IMPORTED_MODULE_3__.KEYS.F.toLocaleUpperCase(),\n \"data-testid\": \"toolbar-frame\",\n selected: frameToolSelected,\n disabled: (0,_Tools__WEBPACK_IMPORTED_MODULE_21__.isToolButtonDisabled)(app, \"frame\")\n }, (0,_i18n__WEBPACK_IMPORTED_MODULE_5__.t)(\"toolBar.frame\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_dropdownMenu_DropdownMenu__WEBPACK_IMPORTED_MODULE_19__[\"default\"].Item, {\n onSelect: () => app.setActiveTool({\n type: \"embeddable\"\n }),\n icon: _icons__WEBPACK_IMPORTED_MODULE_20__.EmbedIcon,\n \"data-testid\": \"toolbar-embeddable\",\n selected: embeddableToolSelected,\n disabled: (0,_Tools__WEBPACK_IMPORTED_MODULE_21__.isToolButtonDisabled)(app, \"embeddable\")\n }, (0,_i18n__WEBPACK_IMPORTED_MODULE_5__.t)(\"toolBar.embeddable\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_dropdownMenu_DropdownMenu__WEBPACK_IMPORTED_MODULE_19__[\"default\"].Item, {\n onSelect: () => app.setActiveTool({\n type: \"autoshape\"\n }),\n icon: _icons__WEBPACK_IMPORTED_MODULE_20__.drawShapeToolIcon,\n shortcut: (0,_Tools__WEBPACK_IMPORTED_MODULE_21__.getToolShortcut)(\"autoshape\"),\n \"data-testid\": \"toolbar-autoshape\",\n selected: drawShapeToolSelected,\n disabled: (0,_Tools__WEBPACK_IMPORTED_MODULE_21__.isToolButtonDisabled)(app, \"autoshape\")\n }, (0,_i18n__WEBPACK_IMPORTED_MODULE_5__.t)(\"toolBar.autoshape\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_dropdownMenu_DropdownMenu__WEBPACK_IMPORTED_MODULE_19__[\"default\"].Item, {\n onSelect: () => app.setActiveTool({\n type: \"laser\"\n }),\n icon: _icons__WEBPACK_IMPORTED_MODULE_20__.laserPointerToolIcon,\n \"data-testid\": \"toolbar-laser\",\n selected: laserToolSelected,\n shortcut: _excalidraw_common__WEBPACK_IMPORTED_MODULE_3__.KEYS.K.toLocaleUpperCase(),\n disabled: (0,_Tools__WEBPACK_IMPORTED_MODULE_21__.isToolButtonDisabled)(app, \"laser\")\n }, (0,_i18n__WEBPACK_IMPORTED_MODULE_5__.t)(\"toolBar.laser\")), showLassoTool && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_dropdownMenu_DropdownMenu__WEBPACK_IMPORTED_MODULE_19__[\"default\"].Item, {\n onSelect: () => app.setActiveTool({\n type: \"lasso\"\n }),\n icon: _icons__WEBPACK_IMPORTED_MODULE_20__.LassoIcon,\n \"data-testid\": \"toolbar-lasso\",\n selected: lassoToolSelected,\n disabled: (0,_Tools__WEBPACK_IMPORTED_MODULE_21__.isToolButtonDisabled)(app, \"lasso\")\n }, (0,_i18n__WEBPACK_IMPORTED_MODULE_5__.t)(\"toolBar.lasso\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n margin: \"6px 0\",\n fontSize: 14,\n fontWeight: 600\n }\n }, \"Generate\"), app.props.aiEnabled !== false && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(TTDDialogTriggerTunnel.Out, null), renderMermaid &&\n /*#__PURE__*/\n //zsviczian\n react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_dropdownMenu_DropdownMenu__WEBPACK_IMPORTED_MODULE_19__[\"default\"].Item, {\n onSelect: () => app.setOpenDialog({\n name: \"ttd\",\n tab: \"mermaid\"\n }),\n icon: _icons__WEBPACK_IMPORTED_MODULE_20__.mermaidLogoIcon,\n \"data-testid\": \"toolbar-embeddable\"\n }, (0,_i18n__WEBPACK_IMPORTED_MODULE_5__.t)(\"toolBar.mermaidToExcalidraw\")), app.props.aiEnabled !== false && app.plugins.diagramToCode && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_dropdownMenu_DropdownMenu__WEBPACK_IMPORTED_MODULE_19__[\"default\"].Item, {\n onSelect: () => app.onMagicframeToolSelect(),\n icon: _icons__WEBPACK_IMPORTED_MODULE_20__.MagicIcon,\n \"data-testid\": \"toolbar-magicframe\",\n badge: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_dropdownMenu_DropdownMenu__WEBPACK_IMPORTED_MODULE_19__[\"default\"].Item.Badge, null, \"AI\"),\n disabled: (0,_Tools__WEBPACK_IMPORTED_MODULE_21__.isToolButtonDisabled)(app, \"magicframe\")\n }, (0,_i18n__WEBPACK_IMPORTED_MODULE_5__.t)(\"toolBar.magicframe\")))));\n};\n\nconst TrayMenu = ({\n appState,\n elements,\n actionManager,\n setAppState,\n onLockToggle,\n onPenModeToggle,\n renderTopRightUI,\n renderCustomStats,\n renderSidebars,\n editorInterface,\n renderWelcomeScreen,\n UIOptions,\n app\n}) => {\n var _a, _b;\n\n const {\n WelcomeScreenCenterTunnel,\n MainMenuTunnel,\n DefaultSidebarTriggerTunnel\n } = (0,_context_tunnels__WEBPACK_IMPORTED_MODULE_4__.useTunnels)();\n\n const renderToolbar = () => {\n const shouldShowStats = //zsviczian\n appState.stats.open && !appState.zenModeEnabled && !appState.viewModeEnabled;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FixedSideContainer__WEBPACK_IMPORTED_MODULE_11__.FixedSideContainer, {\n side: \"top\",\n className: \"App-top-bar\",\n sidepanelOpen: !!appState.openSidebar\n /*zsviczian*/\n\n }, renderWelcomeScreen && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(WelcomeScreenCenterTunnel.Out, null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Section__WEBPACK_IMPORTED_MODULE_17__.Section, {\n heading: \"shapes\"\n }, heading => {\n var _a, _b;\n\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Stack__WEBPACK_IMPORTED_MODULE_18__[\"default\"].Col, {\n gap: 4,\n align: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Stack__WEBPACK_IMPORTED_MODULE_18__[\"default\"].Row, {\n gap: 1,\n className: \"App-toolbar-container\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Island__WEBPACK_IMPORTED_MODULE_14__.Island, {\n padding: 1,\n className: \"App-toolbar\"\n }, heading, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Stack__WEBPACK_IMPORTED_MODULE_18__[\"default\"].Row, {\n gap: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(TrayToolbar, {\n appState: appState,\n setAppState: setAppState,\n UIOptions: UIOptions,\n app: app\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"tray-misc-tools-container\",\n style: //zsviczian\n ((_a = document.body) === null || _a === void 0 ? void 0 : _a.classList.contains(\"mod-rtl\")) ? {\n right: \"inherit\",\n left: \"calc(var(--editor-container-padding) * -1)\"\n } : undefined\n }, !appState.viewModeEnabled && ( //zsviczian\n renderTopRightUI === null || renderTopRightUI === void 0 ? void 0 : renderTopRightUI(editorInterface.formFactor === \"phone\", appState)), !appState.viewModeEnabled && ((_b = appState.openDialog) === null || _b === void 0 ? void 0 : _b.name) !== \"elementLinkSelector\" && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(DefaultSidebarTriggerTunnel.Out, null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_PenModeButton__WEBPACK_IMPORTED_MODULE_16__.PenModeButton, {\n checked: appState.penMode,\n onChange: () => onPenModeToggle(null),\n title: (0,_i18n__WEBPACK_IMPORTED_MODULE_5__.t)(\"toolBar.penMode\"),\n isMobile: true,\n penDetected: appState.penDetected\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_LockButton__WEBPACK_IMPORTED_MODULE_15__.LockButton, {\n checked: appState.activeTool.locked,\n onChange: onLockToggle,\n title: (0,_i18n__WEBPACK_IMPORTED_MODULE_5__.t)(\"toolBar.lock\"),\n isMobile: true\n }))));\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_HintViewer__WEBPACK_IMPORTED_MODULE_12__.HintViewer, {\n appState: appState,\n isMobile: true,\n editorInterface: editorInterface,\n app: app\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(\"layer-ui__wrapper__top-right zen-mode-transition\", {\n \"transition-right\": appState.zenModeEnabled\n }),\n style: {\n marginRight: \"4rem\"\n }\n }, shouldShowStats &&\n /*#__PURE__*/\n //zsviczian\n react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Stats__WEBPACK_IMPORTED_MODULE_22__.Stats, {\n app: app,\n onClose: () => {\n actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_8__.actionToggleStats);\n },\n renderCustomStats: renderCustomStats\n })));\n };\n\n const renderAppToolbar = () => {\n var _a;\n\n if (appState.viewModeEnabled) {\n return; //zsviczian\n }\n\n if (((_a = appState.openDialog) === null || _a === void 0 ? void 0 : _a.name) === \"elementLinkSelector\") {\n return (\n /*#__PURE__*/\n //zsviczian (see original below)\n react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"App-toolbar-content\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(MainMenuTunnel.Out, null))\n );\n }\n /*\n if (\n appState.viewModeEnabled ||\n appState.openDialog?.name === \"elementLinkSelector\"\n ) {\n return (\n <div className=\"App-toolbar-content\">\n <MainMenuTunnel.Out />\n </div>\n );\n }\n */\n //zsviczian fix mobile menu button positions\n\n\n const showEditMenu = (0,_excalidraw_element__WEBPACK_IMPORTED_MODULE_1__.showSelectedShapeActions)(appState, (0,_excalidraw_element__WEBPACK_IMPORTED_MODULE_1__.getNonDeletedElements)(elements));\n const showElAction = (0,_scene__WEBPACK_IMPORTED_MODULE_6__.isSomeElementSelected)((0,_excalidraw_element__WEBPACK_IMPORTED_MODULE_1__.getNonDeletedElements)(elements), appState);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"App-toolbar-content\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(MainMenuTunnel.Out, null), showEditMenu ? //zsviczian\n actionManager.renderAction(\"toggleTrayEditMenu\") : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"ToolIcon__icon\",\n \"aria-hidden\": \"true\"\n }), showElAction || appState.multiElement ? //zsviczian\n actionManager.renderAction(appState.multiElement ? \"finalize\" : \"duplicateSelection\") : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"ToolIcon__icon\",\n \"aria-hidden\": \"true\"\n }), showElAction ? //zsviczian\n actionManager.renderAction(\"deleteSelectedElements\") : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"ToolIcon__icon\",\n \"aria-hidden\": \"true\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, actionManager.renderAction(\"undo\"), actionManager.renderAction(\"redo\")));\n };\n\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, renderSidebars(), !appState.viewModeEnabled && ((_a = appState.openDialog) === null || _a === void 0 ? void 0 : _a.name) !== \"elementLinkSelector\" && renderToolbar(), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"App-bottom-bar\",\n style: {\n marginBottom: _scene_scrollbars__WEBPACK_IMPORTED_MODULE_7__.SCROLLBAR_WIDTH + _scene_scrollbars__WEBPACK_IMPORTED_MODULE_7__.SCROLLBAR_MARGIN,\n //* 2, zsviczian\n marginLeft: _scene_scrollbars__WEBPACK_IMPORTED_MODULE_7__.SCROLLBAR_WIDTH + _scene_scrollbars__WEBPACK_IMPORTED_MODULE_7__.SCROLLBAR_MARGIN * 2,\n marginRight: _scene_scrollbars__WEBPACK_IMPORTED_MODULE_7__.SCROLLBAR_WIDTH + _scene_scrollbars__WEBPACK_IMPORTED_MODULE_7__.SCROLLBAR_MARGIN * 2\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Island__WEBPACK_IMPORTED_MODULE_14__.Island, {\n padding: 0\n }, appState.openMenu === \"shape\" && !appState.viewModeEnabled && ((_b = appState.openDialog) === null || _b === void 0 ? void 0 : _b.name) !== \"elementLinkSelector\" && (0,_excalidraw_element__WEBPACK_IMPORTED_MODULE_1__.showSelectedShapeActions)(appState, elements) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Section__WEBPACK_IMPORTED_MODULE_17__.Section, {\n className: \"App-tray-menu\",\n heading: \"selectedShapeActions\",\n style: {\n maxHeight: app.state.height * 0.8\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Actions__WEBPACK_IMPORTED_MODULE_9__.SelectedShapeActions, {\n appState: appState,\n elementsMap: app.scene.getNonDeletedElementsMap(),\n renderAction: actionManager.renderAction,\n app: app\n })) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"footer\", {\n className: \"App-toolbar\"\n }, renderAppToolbar(), appState.scrolledOutside && !appState.openMenu && !appState.openSidebar && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n className: \"scroll-back-to-content\",\n onClick: () => {\n setAppState(appState => Object.assign({}, (0,_scene__WEBPACK_IMPORTED_MODULE_6__.getScrollToContentState)(elements, appState)));\n }\n }, (0,_i18n__WEBPACK_IMPORTED_MODULE_5__.t)(\"buttons.scrollBackToContent\")))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Island__WEBPACK_IMPORTED_MODULE_14__.Island, {\n padding: 1,\n style: {\n marginLeft: `4px`\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Actions__WEBPACK_IMPORTED_MODULE_9__.ZoomActions, {\n renderAction: actionManager.renderAction,\n trayMode: true\n }))));\n};\n\n//# sourceURL=webpack://ExcalidrawLib/./components/TrayMenu.tsx?\n}");
|
|
3490
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TrayMenu: () => (/* binding */ TrayMenu)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _excalidraw_element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @excalidraw/element */ \"../element/src/index.ts\");\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ \"../../node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _context_tunnels__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../context/tunnels */ \"./context/tunnels.ts\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../i18n */ \"./i18n.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../scene */ \"./scene/index.ts\");\n/* harmony import */ var _scene_scrollbars__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../scene/scrollbars */ \"./scene/scrollbars.ts\");\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../actions */ \"./actions/index.ts\");\n/* harmony import */ var _Actions__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Actions */ \"./components/Actions.tsx\");\n/* harmony import */ var _FixedSideContainer__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./FixedSideContainer */ \"./components/FixedSideContainer.tsx\");\n/* harmony import */ var _Island__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Island */ \"./components/Island.tsx\");\n/* harmony import */ var _Section__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Section */ \"./components/Section.tsx\");\n/* harmony import */ var _Stack__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Stack */ \"./components/Stack.tsx\");\n/* harmony import */ var _Stats__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Stats */ \"./components/Stats/index.tsx\");\n/* harmony import */ var _Toolbar__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Toolbar */ \"./components/Toolbar.tsx\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst TrayMenu = ({\n appState,\n elements,\n actionManager,\n setAppState,\n onLockToggle,\n onPenModeToggle,\n renderTopRightUI,\n renderCustomStats,\n renderSidebars,\n editorInterface,\n renderWelcomeScreen,\n UIOptions,\n app\n}) => {\n var _a, _b;\n\n const {\n WelcomeScreenCenterTunnel,\n MainMenuTunnel,\n DefaultSidebarTriggerTunnel\n } = (0,_context_tunnels__WEBPACK_IMPORTED_MODULE_3__.useTunnels)();\n\n const renderToolbar = () => {\n const shouldShowStats = //zsviczian\n appState.stats.open && !appState.zenModeEnabled && !appState.viewModeEnabled;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FixedSideContainer__WEBPACK_IMPORTED_MODULE_9__.FixedSideContainer, {\n side: \"top\",\n className: \"App-top-bar\",\n sidepanelOpen: !!appState.openSidebar\n /*zsviczian*/\n\n }, renderWelcomeScreen && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(WelcomeScreenCenterTunnel.Out, null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Section__WEBPACK_IMPORTED_MODULE_11__.Section, {\n heading: \"shapes\"\n }, heading => {\n var _a, _b;\n\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Stack__WEBPACK_IMPORTED_MODULE_12__[\"default\"].Col, {\n gap: 4,\n align: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Stack__WEBPACK_IMPORTED_MODULE_12__[\"default\"].Row, {\n gap: 1,\n className: \"App-toolbar-container\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Toolbar__WEBPACK_IMPORTED_MODULE_14__.Toolbar, {\n app: app,\n appState: appState,\n setAppState: setAppState,\n UIOptions: UIOptions,\n onPenModeToggle: onPenModeToggle,\n onLockToggle: onLockToggle,\n heading: heading\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"tray-misc-tools-container\",\n style: //zsviczian\n ((_a = document.body) === null || _a === void 0 ? void 0 : _a.classList.contains(\"mod-rtl\")) ? {\n right: \"inherit\",\n left: \"calc(var(--editor-container-padding) * -1)\"\n } : undefined\n }, !appState.viewModeEnabled && ( //zsviczian\n renderTopRightUI === null || renderTopRightUI === void 0 ? void 0 : renderTopRightUI(editorInterface.formFactor === \"phone\", appState)), !appState.viewModeEnabled && ((_b = appState.openDialog) === null || _b === void 0 ? void 0 : _b.name) !== \"elementLinkSelector\" && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(DefaultSidebarTriggerTunnel.Out, null))));\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(\"layer-ui__wrapper__top-right zen-mode-transition\", {\n \"transition-right\": appState.zenModeEnabled\n }),\n style: {\n marginRight: \"4rem\"\n }\n }, shouldShowStats &&\n /*#__PURE__*/\n //zsviczian\n react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Stats__WEBPACK_IMPORTED_MODULE_13__.Stats, {\n app: app,\n onClose: () => {\n actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_7__.actionToggleStats);\n },\n renderCustomStats: renderCustomStats\n })));\n };\n\n const renderAppToolbar = () => {\n var _a;\n\n if (appState.viewModeEnabled) {\n return; //zsviczian\n }\n\n if (((_a = appState.openDialog) === null || _a === void 0 ? void 0 : _a.name) === \"elementLinkSelector\") {\n return (\n /*#__PURE__*/\n //zsviczian (see original below)\n react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"App-toolbar-content\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(MainMenuTunnel.Out, null))\n );\n }\n /*\n if (\n appState.viewModeEnabled ||\n appState.openDialog?.name === \"elementLinkSelector\"\n ) {\n return (\n <div className=\"App-toolbar-content\">\n <MainMenuTunnel.Out />\n </div>\n );\n }\n */\n //zsviczian fix mobile menu button positions\n\n\n const showEditMenu = (0,_excalidraw_element__WEBPACK_IMPORTED_MODULE_1__.showSelectedShapeActions)(appState, (0,_excalidraw_element__WEBPACK_IMPORTED_MODULE_1__.getNonDeletedElements)(elements));\n const showElAction = (0,_scene__WEBPACK_IMPORTED_MODULE_5__.isSomeElementSelected)((0,_excalidraw_element__WEBPACK_IMPORTED_MODULE_1__.getNonDeletedElements)(elements), appState);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"App-toolbar-content\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(MainMenuTunnel.Out, null), showEditMenu ? //zsviczian\n actionManager.renderAction(\"toggleTrayEditMenu\") : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"ToolIcon__icon\",\n \"aria-hidden\": \"true\"\n }), showElAction || appState.multiElement ? //zsviczian\n actionManager.renderAction(appState.multiElement ? \"finalize\" : \"duplicateSelection\") : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"ToolIcon__icon\",\n \"aria-hidden\": \"true\"\n }), showElAction ? //zsviczian\n actionManager.renderAction(\"deleteSelectedElements\") : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"ToolIcon__icon\",\n \"aria-hidden\": \"true\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, actionManager.renderAction(\"undo\"), actionManager.renderAction(\"redo\")));\n };\n\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, renderSidebars(), !appState.viewModeEnabled && ((_a = appState.openDialog) === null || _a === void 0 ? void 0 : _a.name) !== \"elementLinkSelector\" && renderToolbar(), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"App-bottom-bar\",\n style: {\n marginBottom: _scene_scrollbars__WEBPACK_IMPORTED_MODULE_6__.SCROLLBAR_WIDTH + _scene_scrollbars__WEBPACK_IMPORTED_MODULE_6__.SCROLLBAR_MARGIN,\n //* 2, zsviczian\n marginLeft: _scene_scrollbars__WEBPACK_IMPORTED_MODULE_6__.SCROLLBAR_WIDTH + _scene_scrollbars__WEBPACK_IMPORTED_MODULE_6__.SCROLLBAR_MARGIN * 2,\n marginRight: _scene_scrollbars__WEBPACK_IMPORTED_MODULE_6__.SCROLLBAR_WIDTH + _scene_scrollbars__WEBPACK_IMPORTED_MODULE_6__.SCROLLBAR_MARGIN * 2\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Island__WEBPACK_IMPORTED_MODULE_10__.Island, {\n padding: 0\n }, appState.openMenu === \"shape\" && !appState.viewModeEnabled && ((_b = appState.openDialog) === null || _b === void 0 ? void 0 : _b.name) !== \"elementLinkSelector\" && (0,_excalidraw_element__WEBPACK_IMPORTED_MODULE_1__.showSelectedShapeActions)(appState, elements) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Section__WEBPACK_IMPORTED_MODULE_11__.Section, {\n className: \"App-tray-menu\",\n heading: \"selectedShapeActions\",\n style: {\n maxHeight: app.state.height * 0.8\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Actions__WEBPACK_IMPORTED_MODULE_8__.SelectedShapeActions, {\n appState: appState,\n elementsMap: app.scene.getNonDeletedElementsMap(),\n renderAction: actionManager.renderAction,\n app: app\n })) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"footer\", {\n className: \"App-toolbar\"\n }, renderAppToolbar(), appState.scrolledOutside && !appState.openMenu && !appState.openSidebar && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n className: \"scroll-back-to-content\",\n onClick: () => {\n setAppState(appState => Object.assign({}, (0,_scene__WEBPACK_IMPORTED_MODULE_5__.getScrollToContentState)(elements, appState)));\n }\n }, (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"buttons.scrollBackToContent\")))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Island__WEBPACK_IMPORTED_MODULE_10__.Island, {\n padding: 1,\n style: {\n marginLeft: `4px`\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Actions__WEBPACK_IMPORTED_MODULE_8__.ZoomActions, {\n renderAction: actionManager.renderAction,\n trayMode: true\n }))));\n};\n\n//# sourceURL=webpack://ExcalidrawLib/./components/TrayMenu.tsx?\n}");
|
|
3480
3491
|
|
|
3481
3492
|
/***/ },
|
|
3482
3493
|
|
|
@@ -3564,7 +3575,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
3564
3575
|
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
3565
3576
|
|
|
3566
3577
|
"use strict";
|
|
3567
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! clsx */ \"../../node_modules/clsx/dist/clsx.m.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 _excalidraw_common__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @excalidraw/common */ \"../common/src/index.ts\");\n/* harmony import */ var radix_ui__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! radix-ui */ \"../../node_modules/@radix-ui/react-dropdown-menu/dist/index.mjs\");\n/* harmony import */ var _hooks_useOutsideClick__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../hooks/useOutsideClick */ \"./hooks/useOutsideClick.ts\");\n/* harmony import */ var _hooks_useStable__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../hooks/useStable */ \"./hooks/useStable.ts\");\n/* harmony import */ var _App__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../App */ \"./components/App.tsx\");\n/* harmony import */ var _Island__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Island */ \"./components/Island.tsx\");\n/* harmony import */ var
|
|
3578
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! clsx */ \"../../node_modules/clsx/dist/clsx.m.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 _excalidraw_common__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @excalidraw/common */ \"../common/src/index.ts\");\n/* harmony import */ var radix_ui__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! radix-ui */ \"../../node_modules/@radix-ui/react-dropdown-menu/dist/index.mjs\");\n/* harmony import */ var _hooks_useOutsideClick__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../hooks/useOutsideClick */ \"./hooks/useOutsideClick.ts\");\n/* harmony import */ var _hooks_useStable__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../hooks/useStable */ \"./hooks/useStable.ts\");\n/* harmony import */ var _App__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../App */ \"./components/App.tsx\");\n/* harmony import */ var _Island__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Island */ \"./components/Island.tsx\");\n/* harmony import */ var _ObsidianRadixPortal__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../ObsidianRadixPortal */ \"./components/ObsidianRadixPortal.tsx\");\n/* harmony import */ var _Stack__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Stack */ \"./components/Stack.tsx\");\n/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./common */ \"./components/dropdownMenu/common.ts\");\n/* harmony import */ var _excalidraw_excalidraw_context_ui_appState__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @excalidraw/excalidraw/context/ui-appState */ \"./context/ui-appState.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst MenuContent = ({\n children,\n onClickOutside,\n className = \"\",\n onSelect,\n open = true,\n align = \"end\",\n style\n}) => {\n const editorInterface = (0,_App__WEBPACK_IMPORTED_MODULE_6__.useEditorInterface)();\n const {\n container\n } = (0,_App__WEBPACK_IMPORTED_MODULE_6__.useExcalidrawContainer)(); //zsviczian -- resolve the correct Obsidian popout document and collision boundary\n\n const appState = (0,_excalidraw_excalidraw_context_ui_appState__WEBPACK_IMPORTED_MODULE_11__.useUIAppState)(); //zsviczian\n\n const menuRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);\n const callbacksRef = (0,_hooks_useStable__WEBPACK_IMPORTED_MODULE_5__.useStable)({\n onClickOutside\n });\n (0,_hooks_useOutsideClick__WEBPACK_IMPORTED_MODULE_4__.useOutsideClick)(menuRef, (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(event => {\n var _a, _b, _c; // prevents closing if clicking on the trigger button\n\n\n if (!((_b = (_a = menuRef.current) === null || _a === void 0 ? void 0 : _a.closest(`.${_excalidraw_common__WEBPACK_IMPORTED_MODULE_2__.CLASSES.DROPDOWN_MENU_EVENT_WRAPPER}`)) === null || _b === void 0 ? void 0 : _b.contains(event.target))) {\n (_c = callbacksRef.onClickOutside) === null || _c === void 0 ? void 0 : _c.call(callbacksRef);\n }\n }, [callbacksRef]));\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {\n if (!open) {\n return;\n }\n\n const onKeyDown = event => {\n var _a;\n\n if (event.key === _excalidraw_common__WEBPACK_IMPORTED_MODULE_2__.KEYS.ESCAPE) {\n event.stopImmediatePropagation();\n (_a = callbacksRef.onClickOutside) === null || _a === void 0 ? void 0 : _a.call(callbacksRef);\n }\n };\n\n const option = {\n // so that we can stop propagation of the event before it reaches\n // event handlers that were bound before this one\n capture: true\n };\n document.addEventListener(_excalidraw_common__WEBPACK_IMPORTED_MODULE_2__.EVENT.KEYDOWN, onKeyDown, option);\n return () => {\n document.removeEventListener(_excalidraw_common__WEBPACK_IMPORTED_MODULE_2__.EVENT.KEYDOWN, onKeyDown, option);\n };\n }, [callbacksRef, open]);\n const classNames = (0,clsx__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(`dropdown-menu ${className}`, {\n \"dropdown-menu--mobile\": editorInterface.formFactor === \"phone\",\n \"dropdown-menu--tray\": editorInterface.formFactor !== \"phone\" && editorInterface.desktopUIMode === \"tray\" && appState.openMenu === \"canvas\" //zsviczian\n\n }).trim();\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_common__WEBPACK_IMPORTED_MODULE_10__.DropdownMenuContentPropsContext.Provider, {\n value: {\n onSelect\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_ObsidianRadixPortal__WEBPACK_IMPORTED_MODULE_8__.ObsidianRadixPortal, {\n portal: radix_ui__WEBPACK_IMPORTED_MODULE_3__.Portal,\n container: container\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(radix_ui__WEBPACK_IMPORTED_MODULE_3__.Content, {\n ref: menuRef,\n className: classNames,\n style: style,\n \"data-testid\": \"dropdown-menu\",\n align: align,\n sideOffset: 8,\n collisionBoundary: container !== null && container !== void 0 ? container : undefined,\n onCloseAutoFocus: event => event.preventDefault()\n }, editorInterface.formFactor === \"phone\" ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_Stack__WEBPACK_IMPORTED_MODULE_9__[\"default\"].Col, {\n className: \"dropdown-menu-container\"\n }, children) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_Island__WEBPACK_IMPORTED_MODULE_7__.Island, {\n className: \"dropdown-menu-container\",\n padding: 2\n }, children))));\n};\n\nMenuContent.displayName = \"DropdownMenuContent\";\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MenuContent);\n\n//# sourceURL=webpack://ExcalidrawLib/./components/dropdownMenu/DropdownMenuContent.tsx?\n}");
|
|
3568
3579
|
|
|
3569
3580
|
/***/ },
|
|
3570
3581
|
|
|
@@ -4136,7 +4147,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
4136
4147
|
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
4137
4148
|
|
|
4138
4149
|
"use strict";
|
|
4139
|
-
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 _excalidraw_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @excalidraw/common */ \"../common/src/index.ts\");\n/* harmony import */ var _subset_subset_main__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../subset/subset-main */ \"./subset/subset-main.ts\");\n/* harmony import */ var _data_encode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../data/encode */ \"./data/encode.ts\");\n/* harmony import */ var _obsidianUtils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../obsidianUtils */ \"./obsidianUtils.ts\");\n\n\n\n\nclass ExcalidrawFontFace {\n constructor(family, uri, descriptors) {\n this.urls = ExcalidrawFontFace.createUrls(uri);\n const sources = this.urls.map(url => `url(${url}) ${ExcalidrawFontFace.getFormat(url)}`).join(\", \");\n this.fontFace = new FontFace(family, sources, Object.assign({\n display: \"swap\",\n style: \"normal\",\n weight: \"400\"\n }, descriptors));\n }\n /**\n * Generates CSS `@font-face` definition with the (subsetted) font source as a data url for the characters within the unicode range.\n *\n * Retrieves `undefined` otherwise.\n */\n\n\n toCSS(characters) {\n // quick exit in case the characters are not within this font face's unicode range\n if (!this.getUnicodeRangeRegex().test(characters)) {\n return;\n } //zsviczian - only woffs are chopped into glyphs other fonts are returned as is\n\n\n if (typeof this.urls[0] === \"string\" && !this.urls[0].startsWith(\"data:font/woff2\")) {\n return Promise.resolve(`@font-face { font-family: ${this.fontFace.family}; src: url(${this.urls[0]}); }`);\n }\n\n const codepoints = Array.from(characters).map(char => char.codePointAt(0));\n return this.getContent(codepoints).then(content => `@font-face { font-family: ${this.fontFace.family}; src: url(${content}); }`);\n }\n /**\n * Tries to fetch woff2 content, based on the registered urls (from first to last, treated as fallbacks).\n *\n * @returns base64 with subsetted glyphs based on the passed codepoint, last defined url otherwise\n */\n\n\n async getContent(codePoints) {\n let i = 0;\n const errorMessages = [];\n\n while (i < this.urls.length) {\n const url = this.urls[i];\n\n try {\n const arrayBuffer = await this.fetchFont(url);\n const base64 = await (0,_subset_subset_main__WEBPACK_IMPORTED_MODULE_1__.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,_excalidraw_common__WEBPACK_IMPORTED_MODULE_0__.promiseTry)(async () => {\n const result = await (0,_obsidianUtils__WEBPACK_IMPORTED_MODULE_3__.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(_excalidraw_common__WEBPACK_IMPORTED_MODULE_0__.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.ASSETS_FALLBACK_URL));\n return urls;\n }\n\n static getFormat(url) {\n if (!(url instanceof URL)) {\n // format is irrelevant for data url\n return \"\";\n }\n\n try {\n const parts = new URL(url).pathname.split(\".\");\n\n if (parts.length === 1) {\n return \"\";\n }\n\n return `format('${parts.pop()}')`;\n } catch (error) {\n return \"\";\n }\n }\n\n static normalizeBaseUrl(baseUrl) {\n var _a;\n\n let result = baseUrl; // in case user passed a root-relative url (~absolute path),\n // like \"/\" or \"/some/path\", or relative (starts with \"./\"),\n // prepend it with `location.origin`\n\n if (/^\\.?\\//.test(result)) {\n result = new URL(result.replace(/^\\.?\\/+/, \"\"), (_a = window === null || window === void 0 ? void 0 : window.location) === null || _a === void 0 ? void 0 : _a.origin).toString();\n } // ensure there is a trailing slash, otherwise url won't be correctly concatenated\n\n\n result = `${result.replace(/\\/+$/, \"\")}/`;\n return result;\n }\n /**\n * zsviczian https://github.com/zsviczian/excalidraw/commit/b4cfaaa4b4f46ca01f94e27fb7bf651a9da99daa\n */\n\n\n async getContentLegacy() {\n let i = 0;\n const errorMessages = [];\n\n while (i < this.urls.length) {\n const url = this.urls[i];\n\n if (typeof url === \"string\" && url.startsWith(\"data:\")) {\n // it's dataurl, the font is inlined as base64, no need to fetch\n return url;\n }\n\n try {\n const result = await (0,_obsidianUtils__WEBPACK_IMPORTED_MODULE_3__.fetchFontFromVault)(url); //zsviczian\n\n if (result) {\n return `data:font/woff2;base64,${(0,_data_encode__WEBPACK_IMPORTED_MODULE_2__.stringToBase64)((0,_data_encode__WEBPACK_IMPORTED_MODULE_2__.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,${(0,_data_encode__WEBPACK_IMPORTED_MODULE_2__.stringToBase64)((0,_data_encode__WEBPACK_IMPORTED_MODULE_2__.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.ASSETS_FALLBACK_URL = `https://esm.sh/${({\"MODE\":\"development\",\"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:3016\",\"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\":\"3001\",\"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_APP_DISABLE_PREVENT_UNLOAD\":\"\",\"VITE_PKG_NAME\":\"@zsviczian/excalidraw\",\"VITE_PKG_VERSION\":\"0.18.113-beta.3\",\"VITE_IS_EXCALIDRAW_NPM_PACKAGE\":true}).PKG_NAME ? `${({\"MODE\":\"development\",\"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:3016\",\"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\":\"3001\",\"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_APP_DISABLE_PREVENT_UNLOAD\":\"\",\"VITE_PKG_NAME\":\"@zsviczian/excalidraw\",\"VITE_PKG_VERSION\":\"0.18.113-beta.3\",\"VITE_IS_EXCALIDRAW_NPM_PACKAGE\":true}).PKG_NAME}@${({\"MODE\":\"development\",\"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:3016\",\"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\":\"3001\",\"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_APP_DISABLE_PREVENT_UNLOAD\":\"\",\"VITE_PKG_NAME\":\"@zsviczian/excalidraw\",\"VITE_PKG_VERSION\":\"0.18.113-beta.3\",\"VITE_IS_EXCALIDRAW_NPM_PACKAGE\":true}).PKG_VERSION}` // is provided during package build\n: \"@excalidraw/excalidraw\" // fallback to the latest package version (i.e. for app)\n}/dist/prod/`;\n\n//# sourceURL=webpack://ExcalidrawLib/./fonts/ExcalidrawFontFace.ts?\n}");
|
|
4150
|
+
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 _excalidraw_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @excalidraw/common */ \"../common/src/index.ts\");\n/* harmony import */ var _subset_subset_main__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../subset/subset-main */ \"./subset/subset-main.ts\");\n/* harmony import */ var _data_encode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../data/encode */ \"./data/encode.ts\");\n/* harmony import */ var _obsidianUtils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../obsidianUtils */ \"./obsidianUtils.ts\");\n\n\n\n\nclass ExcalidrawFontFace {\n constructor(family, uri, descriptors) {\n this.urls = ExcalidrawFontFace.createUrls(uri);\n const sources = this.urls.map(url => `url(${url}) ${ExcalidrawFontFace.getFormat(url)}`).join(\", \");\n this.fontFace = new FontFace(family, sources, Object.assign({\n display: \"swap\",\n style: \"normal\",\n weight: \"400\"\n }, descriptors));\n }\n /**\n * Generates CSS `@font-face` definition with the (subsetted) font source as a data url for the characters within the unicode range.\n *\n * Retrieves `undefined` otherwise.\n */\n\n\n toCSS(characters) {\n // quick exit in case the characters are not within this font face's unicode range\n if (!this.getUnicodeRangeRegex().test(characters)) {\n return;\n } //zsviczian - only woffs are chopped into glyphs other fonts are returned as is\n\n\n if (typeof this.urls[0] === \"string\" && !this.urls[0].startsWith(\"data:font/woff2\")) {\n return Promise.resolve(`@font-face { font-family: ${this.fontFace.family}; src: url(${this.urls[0]}); }`);\n }\n\n const codepoints = Array.from(characters).map(char => char.codePointAt(0));\n return this.getContent(codepoints).then(content => `@font-face { font-family: ${this.fontFace.family}; src: url(${content}); }`);\n }\n /**\n * Tries to fetch woff2 content, based on the registered urls (from first to last, treated as fallbacks).\n *\n * @returns base64 with subsetted glyphs based on the passed codepoint, last defined url otherwise\n */\n\n\n async getContent(codePoints) {\n let i = 0;\n const errorMessages = [];\n\n while (i < this.urls.length) {\n const url = this.urls[i];\n\n try {\n const arrayBuffer = await this.fetchFont(url);\n const base64 = await (0,_subset_subset_main__WEBPACK_IMPORTED_MODULE_1__.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,_excalidraw_common__WEBPACK_IMPORTED_MODULE_0__.promiseTry)(async () => {\n const result = await (0,_obsidianUtils__WEBPACK_IMPORTED_MODULE_3__.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(_excalidraw_common__WEBPACK_IMPORTED_MODULE_0__.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.ASSETS_FALLBACK_URL));\n return urls;\n }\n\n static getFormat(url) {\n if (!(url instanceof URL)) {\n // format is irrelevant for data url\n return \"\";\n }\n\n try {\n const parts = new URL(url).pathname.split(\".\");\n\n if (parts.length === 1) {\n return \"\";\n }\n\n return `format('${parts.pop()}')`;\n } catch (error) {\n return \"\";\n }\n }\n\n static normalizeBaseUrl(baseUrl) {\n var _a;\n\n let result = baseUrl; // in case user passed a root-relative url (~absolute path),\n // like \"/\" or \"/some/path\", or relative (starts with \"./\"),\n // prepend it with `location.origin`\n\n if (/^\\.?\\//.test(result)) {\n result = new URL(result.replace(/^\\.?\\/+/, \"\"), (_a = window === null || window === void 0 ? void 0 : window.location) === null || _a === void 0 ? void 0 : _a.origin).toString();\n } // ensure there is a trailing slash, otherwise url won't be correctly concatenated\n\n\n result = `${result.replace(/\\/+$/, \"\")}/`;\n return result;\n }\n /**\n * zsviczian https://github.com/zsviczian/excalidraw/commit/b4cfaaa4b4f46ca01f94e27fb7bf651a9da99daa\n */\n\n\n async getContentLegacy() {\n let i = 0;\n const errorMessages = [];\n\n while (i < this.urls.length) {\n const url = this.urls[i];\n\n if (typeof url === \"string\" && url.startsWith(\"data:\")) {\n // it's dataurl, the font is inlined as base64, no need to fetch\n return url;\n }\n\n try {\n const result = await (0,_obsidianUtils__WEBPACK_IMPORTED_MODULE_3__.fetchFontFromVault)(url); //zsviczian\n\n if (result) {\n return `data:font/woff2;base64,${(0,_data_encode__WEBPACK_IMPORTED_MODULE_2__.stringToBase64)((0,_data_encode__WEBPACK_IMPORTED_MODULE_2__.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,${(0,_data_encode__WEBPACK_IMPORTED_MODULE_2__.stringToBase64)((0,_data_encode__WEBPACK_IMPORTED_MODULE_2__.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.ASSETS_FALLBACK_URL = `https://esm.sh/${({\"MODE\":\"development\",\"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:3016\",\"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\":\"3001\",\"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_APP_DISABLE_PREVENT_UNLOAD\":\"\",\"VITE_PKG_NAME\":\"@zsviczian/excalidraw\",\"VITE_PKG_VERSION\":\"0.18.113-beta.4\",\"VITE_IS_EXCALIDRAW_NPM_PACKAGE\":true}).PKG_NAME ? `${({\"MODE\":\"development\",\"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:3016\",\"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\":\"3001\",\"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_APP_DISABLE_PREVENT_UNLOAD\":\"\",\"VITE_PKG_NAME\":\"@zsviczian/excalidraw\",\"VITE_PKG_VERSION\":\"0.18.113-beta.4\",\"VITE_IS_EXCALIDRAW_NPM_PACKAGE\":true}).PKG_NAME}@${({\"MODE\":\"development\",\"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:3016\",\"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\":\"3001\",\"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_APP_DISABLE_PREVENT_UNLOAD\":\"\",\"VITE_PKG_NAME\":\"@zsviczian/excalidraw\",\"VITE_PKG_VERSION\":\"0.18.113-beta.4\",\"VITE_IS_EXCALIDRAW_NPM_PACKAGE\":true}).PKG_VERSION}` // is provided during package build\n: \"@excalidraw/excalidraw\" // fallback to the latest package version (i.e. for app)\n}/dist/prod/`;\n\n//# sourceURL=webpack://ExcalidrawLib/./fonts/ExcalidrawFontFace.ts?\n}");
|
|
4140
4151
|
|
|
4141
4152
|
/***/ },
|
|
4142
4153
|
|
|
@@ -4488,7 +4499,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
4488
4499
|
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
4489
4500
|
|
|
4490
4501
|
"use strict";
|
|
4491
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _excalidraw_common_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @excalidraw/common/constants */ \"../common/src/constants.ts\");\n\n\nif (\"development\" !== _excalidraw_common_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.18.113-beta.
|
|
4502
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _excalidraw_common_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @excalidraw/common/constants */ \"../common/src/constants.ts\");\n\n\nif (\"development\" !== _excalidraw_common_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.18.113-beta.4\"}/dist/`;\n}\n\n//# sourceURL=webpack://ExcalidrawLib/./publicPath.js?\n}");
|
|
4492
4503
|
|
|
4493
4504
|
/***/ },
|
|
4494
4505
|
|