@excalidraw/common 0.18.0-ec07091 → 0.18.0-f2600fe

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.
Files changed (68) hide show
  1. package/dist/dev/index.js +156 -83
  2. package/dist/dev/index.js.map +3 -3
  3. package/dist/prod/index.js +3 -3
  4. package/dist/types/common/src/constants.d.ts +3 -16
  5. package/dist/types/common/src/editorInterface.d.ts +34 -0
  6. package/dist/types/common/src/index.d.ts +1 -0
  7. package/dist/types/common/src/utils.d.ts +0 -2
  8. package/dist/types/element/src/resizeTest.d.ts +5 -4
  9. package/dist/types/element/src/transformHandles.d.ts +5 -4
  10. package/dist/types/excalidraw/actions/actionAddToLibrary.d.ts +18 -9
  11. package/dist/types/excalidraw/actions/actionBoundText.d.ts +12 -6
  12. package/dist/types/excalidraw/actions/actionCanvas.d.ts +78 -39
  13. package/dist/types/excalidraw/actions/actionClipboard.d.ts +36 -18
  14. package/dist/types/excalidraw/actions/actionCropEditor.d.ts +6 -3
  15. package/dist/types/excalidraw/actions/actionDeleteSelected.d.ts +19 -10
  16. package/dist/types/excalidraw/actions/actionDuplicateSelection.d.ts +1 -1
  17. package/dist/types/excalidraw/actions/actionElementLink.d.ts +6 -3
  18. package/dist/types/excalidraw/actions/actionElementLock.d.ts +12 -6
  19. package/dist/types/excalidraw/actions/actionEmbeddable.d.ts +6 -3
  20. package/dist/types/excalidraw/actions/actionExport.d.ts +54 -27
  21. package/dist/types/excalidraw/actions/actionFinalize.d.ts +12 -6
  22. package/dist/types/excalidraw/actions/actionFrame.d.ts +24 -12
  23. package/dist/types/excalidraw/actions/actionGroup.d.ts +12 -6
  24. package/dist/types/excalidraw/actions/actionLinearEditor.d.ts +6 -3
  25. package/dist/types/excalidraw/actions/actionLink.d.ts +4 -1
  26. package/dist/types/excalidraw/actions/actionMenu.d.ts +7 -372
  27. package/dist/types/excalidraw/actions/actionNavigate.d.ts +12 -6
  28. package/dist/types/excalidraw/actions/actionProperties.d.ts +91 -46
  29. package/dist/types/excalidraw/actions/actionSelectAll.d.ts +6 -3
  30. package/dist/types/excalidraw/actions/actionStyles.d.ts +6 -3
  31. package/dist/types/excalidraw/actions/actionToggleGridMode.d.ts +6 -3
  32. package/dist/types/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +6 -3
  33. package/dist/types/excalidraw/actions/actionToggleSearchMenu.d.ts +6 -3
  34. package/dist/types/excalidraw/actions/actionToggleStats.d.ts +6 -3
  35. package/dist/types/excalidraw/actions/actionToggleViewMode.d.ts +6 -3
  36. package/dist/types/excalidraw/actions/actionToggleZenMode.d.ts +7 -4
  37. package/dist/types/excalidraw/actions/index.d.ts +1 -1
  38. package/dist/types/excalidraw/actions/types.d.ts +1 -1
  39. package/dist/types/excalidraw/appState.d.ts +5 -2
  40. package/dist/types/excalidraw/components/Actions.d.ts +13 -3
  41. package/dist/types/excalidraw/components/App.d.ts +19 -17
  42. package/dist/types/excalidraw/components/ColorPicker/ColorPicker.d.ts +1 -2
  43. package/dist/types/excalidraw/components/ColorPicker/Picker.d.ts +2 -0
  44. package/dist/types/excalidraw/components/ColorPicker/PickerColorList.d.ts +2 -1
  45. package/dist/types/excalidraw/components/ColorPicker/ShadeList.d.ts +2 -1
  46. package/dist/types/excalidraw/components/ExcalidrawLogo.d.ts +1 -1
  47. package/dist/types/excalidraw/components/FilledButton.d.ts +1 -1
  48. package/dist/types/excalidraw/components/FontPicker/FontPickerTrigger.d.ts +2 -1
  49. package/dist/types/excalidraw/components/HintViewer.d.ts +4 -3
  50. package/dist/types/excalidraw/components/LayerUI.d.ts +2 -1
  51. package/dist/types/excalidraw/components/MobileMenu.d.ts +3 -5
  52. package/dist/types/excalidraw/components/MobileToolBar.d.ts +11 -0
  53. package/dist/types/excalidraw/components/Popover.d.ts +2 -1
  54. package/dist/types/excalidraw/components/TTDDialog/TTDDialogTrigger.d.ts +1 -2
  55. package/dist/types/excalidraw/components/ToolPopover.d.ts +25 -0
  56. package/dist/types/excalidraw/components/canvases/InteractiveCanvas.d.ts +3 -2
  57. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenu.d.ts +4 -2
  58. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuContent.d.ts +2 -1
  59. package/dist/types/excalidraw/components/icons.d.ts +5 -1
  60. package/dist/types/excalidraw/components/live-collaboration/LiveCollaborationTrigger.d.ts +13 -1
  61. package/dist/types/excalidraw/components/main-menu/MainMenu.d.ts +0 -3
  62. package/dist/types/excalidraw/hooks/useOutsideClick.d.ts +3 -1
  63. package/dist/types/excalidraw/index.d.ts +2 -3
  64. package/dist/types/excalidraw/renderer/interactiveScene.d.ts +1 -1
  65. package/dist/types/excalidraw/scene/types.d.ts +3 -3
  66. package/dist/types/excalidraw/shortcut.d.ts +1 -0
  67. package/dist/types/excalidraw/types.d.ts +16 -17
  68. package/package.json +1 -1
package/dist/dev/index.js CHANGED
@@ -281,49 +281,48 @@ var BinaryHeap = class {
281
281
  content = [];
282
282
  sinkDown(idx) {
283
283
  const node = this.content[idx];
284
+ const nodeScore = this.scoreFunction(node);
284
285
  while (idx > 0) {
285
286
  const parentN = (idx + 1 >> 1) - 1;
286
287
  const parent = this.content[parentN];
287
- if (this.scoreFunction(node) < this.scoreFunction(parent)) {
288
- this.content[parentN] = node;
288
+ if (nodeScore < this.scoreFunction(parent)) {
289
289
  this.content[idx] = parent;
290
290
  idx = parentN;
291
291
  } else {
292
292
  break;
293
293
  }
294
294
  }
295
+ this.content[idx] = node;
295
296
  }
296
297
  bubbleUp(idx) {
297
298
  const length = this.content.length;
298
299
  const node = this.content[idx];
299
300
  const score = this.scoreFunction(node);
300
301
  while (true) {
301
- const child2N = idx + 1 << 1;
302
- const child1N = child2N - 1;
303
- let swap = null;
304
- let child1Score = 0;
302
+ const child1N = (idx + 1 << 1) - 1;
303
+ const child2N = child1N + 1;
304
+ let smallestIdx = idx;
305
+ let smallestScore = score;
305
306
  if (child1N < length) {
306
- const child1 = this.content[child1N];
307
- child1Score = this.scoreFunction(child1);
308
- if (child1Score < score) {
309
- swap = child1N;
307
+ const child1Score = this.scoreFunction(this.content[child1N]);
308
+ if (child1Score < smallestScore) {
309
+ smallestIdx = child1N;
310
+ smallestScore = child1Score;
310
311
  }
311
312
  }
312
313
  if (child2N < length) {
313
- const child2 = this.content[child2N];
314
- const child2Score = this.scoreFunction(child2);
315
- if (child2Score < (swap === null ? score : child1Score)) {
316
- swap = child2N;
314
+ const child2Score = this.scoreFunction(this.content[child2N]);
315
+ if (child2Score < smallestScore) {
316
+ smallestIdx = child2N;
317
317
  }
318
318
  }
319
- if (swap !== null) {
320
- this.content[idx] = this.content[swap];
321
- this.content[swap] = node;
322
- idx = swap;
323
- } else {
319
+ if (smallestIdx === idx) {
324
320
  break;
325
321
  }
322
+ this.content[idx] = this.content[smallestIdx];
323
+ idx = smallestIdx;
326
324
  }
325
+ this.content[idx] = node;
327
326
  }
328
327
  push(node) {
329
328
  this.content.push(node);
@@ -641,18 +640,6 @@ var rgbToHex = (r, g, b) => `#${((1 << 24) + (r << 16) + (g << 8) + b).toString(
641
640
 
642
641
  // src/constants.ts
643
642
  init_define_import_meta_env();
644
- var isDarwin = /Mac|iPod|iPhone|iPad/.test(navigator.platform);
645
- var isWindows = /^Win/.test(navigator.platform);
646
- var isAndroid = /\b(android)\b/i.test(navigator.userAgent);
647
- var isFirefox = typeof window !== "undefined" && "netscape" in window && navigator.userAgent.indexOf("rv:") > 1 && navigator.userAgent.indexOf("Gecko") > 1;
648
- var isChrome = navigator.userAgent.indexOf("Chrome") !== -1;
649
- var isSafari = !isChrome && navigator.userAgent.indexOf("Safari") !== -1;
650
- var isIOS = /iPad|iPhone/i.test(navigator.platform) || // iPadOS 13+
651
- navigator.userAgent.includes("Mac") && "ontouchend" in document;
652
- var isBrave = () => navigator.brave?.isBrave?.name === "isBrave";
653
- var isMobile = isIOS || /android|webos|ipod|blackberry|iemobile|opera mini/i.test(
654
- navigator.userAgent
655
- ) || /android|ios|ipod|blackberry|windows phone/i.test(navigator.platform);
656
643
  var supportsResizeObserver = typeof window !== "undefined" && "ResizeObserver" in window;
657
644
  var APP_NAME = "Excalidraw";
658
645
  var TEXT_AUTOWRAP_THRESHOLD = 36;
@@ -905,13 +892,6 @@ var DEFAULT_UI_OPTIONS = {
905
892
  image: true
906
893
  }
907
894
  };
908
- var MQ_MAX_MOBILE = 599;
909
- var MQ_MAX_WIDTH_LANDSCAPE = 1e3;
910
- var MQ_MAX_HEIGHT_LANDSCAPE = 500;
911
- var MQ_MIN_TABLET = MQ_MAX_MOBILE + 1;
912
- var MQ_MAX_TABLET = 1400;
913
- var MQ_MIN_WIDTH_DESKTOP = 1440;
914
- var MQ_RIGHT_SIDEBAR_MIN_WIDTH = 1229;
915
895
  var MAX_DECIMALS_FOR_SVG_EXPORT = 2;
916
896
  var EXPORT_SCALES = [1, 2, 3];
917
897
  var DEFAULT_EXPORT_PADDING = 10;
@@ -1032,6 +1012,9 @@ var UserIdleState = /* @__PURE__ */ ((UserIdleState2) => {
1032
1012
  })(UserIdleState || {});
1033
1013
  var LINE_POLYGON_POINT_MERGE_DISTANCE = 20;
1034
1014
  var DOUBLE_TAP_POSITION_THRESHOLD = 35;
1015
+ var MOBILE_ACTION_BUTTON_BG = {
1016
+ background: "var(--mobile-action-button-bg)"
1017
+ };
1035
1018
 
1036
1019
  // src/font-metadata.ts
1037
1020
  init_define_import_meta_env();
@@ -1187,6 +1170,133 @@ var Queue = class {
1187
1170
 
1188
1171
  // src/keys.ts
1189
1172
  init_define_import_meta_env();
1173
+
1174
+ // src/editorInterface.ts
1175
+ init_define_import_meta_env();
1176
+ var DESKTOP_UI_MODE_STORAGE_KEY = "excalidraw.desktopUIMode";
1177
+ var MQ_MAX_MOBILE = 599;
1178
+ var MQ_MAX_WIDTH_LANDSCAPE = 1e3;
1179
+ var MQ_MAX_HEIGHT_LANDSCAPE = 500;
1180
+ var MQ_MIN_TABLET = MQ_MAX_MOBILE + 1;
1181
+ var MQ_MAX_TABLET = 1400;
1182
+ var MQ_MIN_WIDTH_DESKTOP = 1440;
1183
+ var MQ_RIGHT_SIDEBAR_MIN_WIDTH = 1229;
1184
+ var isDarwin = /Mac|iPod|iPhone|iPad/.test(navigator.platform);
1185
+ var isWindows = /^Win/.test(navigator.platform);
1186
+ var isAndroid = /\b(android)\b/i.test(navigator.userAgent);
1187
+ var isFirefox = typeof window !== "undefined" && "netscape" in window && navigator.userAgent.indexOf("rv:") > 1 && navigator.userAgent.indexOf("Gecko") > 1;
1188
+ var isChrome = navigator.userAgent.indexOf("Chrome") !== -1;
1189
+ var isSafari = !isChrome && navigator.userAgent.indexOf("Safari") !== -1;
1190
+ var isIOS = /iPad|iPhone/i.test(navigator.platform) || // iPadOS 13+
1191
+ navigator.userAgent.includes("Mac") && "ontouchend" in document;
1192
+ var isBrave = () => navigator.brave?.isBrave?.name === "isBrave";
1193
+ var isMobileBreakpoint = (width, height) => {
1194
+ return width <= MQ_MAX_MOBILE || height < MQ_MAX_HEIGHT_LANDSCAPE && width < MQ_MAX_WIDTH_LANDSCAPE;
1195
+ };
1196
+ var isTabletBreakpoint = (editorWidth, editorHeight) => {
1197
+ const minSide = Math.min(editorWidth, editorHeight);
1198
+ const maxSide = Math.max(editorWidth, editorHeight);
1199
+ return minSide >= MQ_MIN_TABLET && maxSide <= MQ_MAX_TABLET;
1200
+ };
1201
+ var isMobileOrTablet = () => {
1202
+ const ua = navigator.userAgent || "";
1203
+ const platform = navigator.platform || "";
1204
+ const uaData = navigator.userAgentData;
1205
+ if (uaData) {
1206
+ const plat = (uaData.platform || "").toLowerCase();
1207
+ const isDesktopOS = plat === "windows" || plat === "macos" || plat === "linux" || plat === "chrome os";
1208
+ if (uaData.mobile === true) {
1209
+ return true;
1210
+ }
1211
+ if (uaData.mobile === false && plat === "android") {
1212
+ const looksTouchTablet = matchMedia?.("(hover: none)").matches && matchMedia?.("(pointer: coarse)").matches;
1213
+ return looksTouchTablet;
1214
+ }
1215
+ if (isDesktopOS) {
1216
+ return false;
1217
+ }
1218
+ }
1219
+ if (isIOS) {
1220
+ return true;
1221
+ }
1222
+ if (isAndroid) {
1223
+ const isAndroidPhone = /Mobile/i.test(ua);
1224
+ const isAndroidTablet = !isAndroidPhone;
1225
+ if (isAndroidPhone || isAndroidTablet) {
1226
+ const looksTouchTablet = matchMedia?.("(hover: none)").matches && matchMedia?.("(pointer: coarse)").matches;
1227
+ return looksTouchTablet;
1228
+ }
1229
+ }
1230
+ const looksDesktopPlatform = /Win|Linux|CrOS|Mac/.test(platform) || /Windows NT|X11|CrOS|Macintosh/.test(ua);
1231
+ if (looksDesktopPlatform) {
1232
+ return false;
1233
+ }
1234
+ return false;
1235
+ };
1236
+ var getFormFactor = (editorWidth, editorHeight) => {
1237
+ if (isMobileBreakpoint(editorWidth, editorHeight)) {
1238
+ return "phone";
1239
+ }
1240
+ if (isTabletBreakpoint(editorWidth, editorHeight)) {
1241
+ return "tablet";
1242
+ }
1243
+ return "desktop";
1244
+ };
1245
+ var deriveStylesPanelMode = (editorInterface) => {
1246
+ if (editorInterface.formFactor === "phone") {
1247
+ return "mobile";
1248
+ }
1249
+ if (editorInterface.formFactor === "tablet") {
1250
+ return "compact";
1251
+ }
1252
+ return editorInterface.desktopUIMode;
1253
+ };
1254
+ var createUserAgentDescriptor = (userAgentString) => {
1255
+ const normalizedUA = userAgentString ?? "";
1256
+ let platform = "unknown";
1257
+ if (isIOS) {
1258
+ platform = "ios";
1259
+ } else if (isAndroid) {
1260
+ platform = "android";
1261
+ } else if (normalizedUA) {
1262
+ platform = "other";
1263
+ }
1264
+ return {
1265
+ isMobileDevice: isMobileOrTablet(),
1266
+ platform
1267
+ };
1268
+ };
1269
+ var loadDesktopUIModePreference = () => {
1270
+ if (typeof window === "undefined") {
1271
+ return null;
1272
+ }
1273
+ try {
1274
+ const stored = window.localStorage.getItem(DESKTOP_UI_MODE_STORAGE_KEY);
1275
+ if (stored === "compact" || stored === "full") {
1276
+ return stored;
1277
+ }
1278
+ } catch (error) {
1279
+ }
1280
+ return null;
1281
+ };
1282
+ var persistDesktopUIMode = (mode) => {
1283
+ if (typeof window === "undefined") {
1284
+ return;
1285
+ }
1286
+ try {
1287
+ window.localStorage.setItem(DESKTOP_UI_MODE_STORAGE_KEY, mode);
1288
+ } catch (error) {
1289
+ }
1290
+ };
1291
+ var setDesktopUIMode = (mode) => {
1292
+ if (mode !== "compact" && mode !== "full") {
1293
+ return;
1294
+ }
1295
+ persistDesktopUIMode(mode);
1296
+ return mode;
1297
+ };
1298
+
1299
+ // src/keys.ts
1190
1300
  var CODES = {
1191
1301
  EQUAL: "Equal",
1192
1302
  MINUS: "Minus",
@@ -1637,13 +1747,6 @@ var updateActiveTool = (appState, data) => {
1637
1747
  var isFullScreen = () => document.fullscreenElement?.nodeName === "HTML";
1638
1748
  var allowFullScreen = () => document.documentElement.requestFullscreen();
1639
1749
  var exitFullScreen = () => document.exitFullscreen();
1640
- var getShortcutKey = (shortcut) => {
1641
- shortcut = shortcut.replace(/\bAlt\b/i, "Alt").replace(/\bShift\b/i, "Shift").replace(/\b(Enter|Return)\b/i, "Enter");
1642
- if (isDarwin) {
1643
- return shortcut.replace(/\bCtrlOrCmd\b/gi, "Cmd").replace(/\bAlt\b/i, "Option");
1644
- }
1645
- return shortcut.replace(/\bCtrlOrCmd\b/gi, "Ctrl");
1646
- };
1647
1750
  var viewportCoordsToSceneCoords = ({ clientX, clientY }, {
1648
1751
  zoom,
1649
1752
  offsetLeft,
@@ -2085,41 +2188,6 @@ var reduceToCommonValue = (collection, getValue) => {
2085
2188
  }
2086
2189
  return commonValue;
2087
2190
  };
2088
- var isMobileOrTablet = () => {
2089
- const ua = navigator.userAgent || "";
2090
- const platform = navigator.platform || "";
2091
- const uaData = navigator.userAgentData;
2092
- if (uaData) {
2093
- const plat = (uaData.platform || "").toLowerCase();
2094
- const isDesktopOS = plat === "windows" || plat === "macos" || plat === "linux" || plat === "chrome os";
2095
- if (uaData.mobile === true) {
2096
- return true;
2097
- }
2098
- if (uaData.mobile === false && plat === "android") {
2099
- const looksTouchTablet = matchMedia?.("(hover: none)").matches && matchMedia?.("(pointer: coarse)").matches;
2100
- return looksTouchTablet;
2101
- }
2102
- if (isDesktopOS) {
2103
- return false;
2104
- }
2105
- }
2106
- if (isIOS) {
2107
- return true;
2108
- }
2109
- if (isAndroid) {
2110
- const isAndroidPhone = /Mobile/i.test(ua);
2111
- const isAndroidTablet = !isAndroidPhone;
2112
- if (isAndroidPhone || isAndroidTablet) {
2113
- const looksTouchTablet = matchMedia?.("(hover: none)").matches && matchMedia?.("(pointer: coarse)").matches;
2114
- return looksTouchTablet;
2115
- }
2116
- }
2117
- const looksDesktopPlatform = /Win|Linux|CrOS|Mac/.test(platform) || /Windows NT|X11|CrOS|Macintosh/.test(ua);
2118
- if (looksDesktopPlatform) {
2119
- return false;
2120
- }
2121
- return false;
2122
- };
2123
2191
 
2124
2192
  // src/random.ts
2125
2193
  var random = new Random(Date.now());
@@ -2284,6 +2352,7 @@ export {
2284
2352
  MIN_FONT_SIZE,
2285
2353
  MIN_WIDTH_OR_HEIGHT,
2286
2354
  MIN_ZOOM,
2355
+ MOBILE_ACTION_BUTTON_BG,
2287
2356
  MONOSPACE_GENERIC_FONT,
2288
2357
  MQ_MAX_HEIGHT_LANDSCAPE,
2289
2358
  MQ_MAX_MOBILE,
@@ -2339,7 +2408,9 @@ export {
2339
2408
  chunk,
2340
2409
  cloneJSON,
2341
2410
  composeEventHandlers,
2411
+ createUserAgentDescriptor,
2342
2412
  debounce,
2413
+ deriveStylesPanelMode,
2343
2414
  distance,
2344
2415
  easeOut,
2345
2416
  easeToValuesRAF,
@@ -2354,13 +2425,13 @@ export {
2354
2425
  getFontFamilyFallbacks,
2355
2426
  getFontFamilyString,
2356
2427
  getFontString,
2428
+ getFormFactor,
2357
2429
  getFrame,
2358
2430
  getGenericFontFamilyFallback,
2359
2431
  getGlobalCSSVariable,
2360
2432
  getGridPoint,
2361
2433
  getLineHeight,
2362
2434
  getNearestScrollableContainer,
2363
- getShortcutKey,
2364
2435
  getSizeFromPoints,
2365
2436
  getSpecificColorShades,
2366
2437
  getSvgPathFromStroke,
@@ -2384,8 +2455,7 @@ export {
2384
2455
  isLatinChar,
2385
2456
  isLocalLink,
2386
2457
  isMemberOf,
2387
- isMobile,
2388
- isMobileOrTablet,
2458
+ isMobileBreakpoint,
2389
2459
  isPrimitive,
2390
2460
  isProdEnv,
2391
2461
  isPromiseLike,
@@ -2395,11 +2465,13 @@ export {
2395
2465
  isSafari,
2396
2466
  isServerEnv,
2397
2467
  isShallowEqual,
2468
+ isTabletBreakpoint,
2398
2469
  isTestEnv,
2399
2470
  isToolIcon,
2400
2471
  isTransparent,
2401
2472
  isWindows,
2402
2473
  isWritableElement,
2474
+ loadDesktopUIModePreference,
2403
2475
  mapFind,
2404
2476
  matchKey,
2405
2477
  memoize,
@@ -2423,6 +2495,7 @@ export {
2423
2495
  sceneCoordsToViewportCoords,
2424
2496
  selectNode,
2425
2497
  setDateTimeForTests,
2498
+ setDesktopUIMode,
2426
2499
  shouldMaintainAspectRatio,
2427
2500
  shouldResizeFromCenter,
2428
2501
  shouldRotateWithDiscreteAngle,