@excalidraw/excalidraw 0.18.0-7b8a5f54c → 0.18.0-835eb8d

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 (79) hide show
  1. package/dist/dev/{chunk-CRKRRBMD.js → chunk-N4PQJPAH.js} +49 -60
  2. package/dist/dev/chunk-N4PQJPAH.js.map +7 -0
  3. package/dist/dev/{chunk-QF5FRM6O.js → chunk-PWQMCSHA.js} +12 -4
  4. package/dist/dev/chunk-PWQMCSHA.js.map +7 -0
  5. package/dist/dev/data/{image-IWGLHPIX.js → image-RT6RLBUE.js} +2 -2
  6. package/dist/dev/index.css +686 -501
  7. package/dist/dev/index.css.map +3 -3
  8. package/dist/dev/index.js +2872 -1649
  9. package/dist/dev/index.js.map +4 -4
  10. package/dist/dev/locales/{en-SMAPCEOQ.js → en-V3NQTBPG.js} +2 -2
  11. package/dist/prod/{chunk-I4UNSFV6.js → chunk-GF46JCB3.js} +2 -2
  12. package/dist/prod/chunk-SVEJI6WL.js +4 -0
  13. package/dist/prod/data/{image-4SM4COIL.js → image-HPGPBQV2.js} +1 -1
  14. package/dist/prod/index.css +1 -1
  15. package/dist/prod/index.js +19 -19
  16. package/dist/prod/locales/{en-TYY6KWIJ.js → en-LQE6K457.js} +1 -1
  17. package/dist/types/common/src/constants.d.ts +20 -4
  18. package/dist/types/common/src/utils.d.ts +3 -0
  19. package/dist/types/element/src/bounds.d.ts +1 -1
  20. package/dist/types/element/src/delta.d.ts +4 -4
  21. package/dist/types/element/src/index.d.ts +1 -0
  22. package/dist/types/element/src/positionElementsOnGrid.d.ts +2 -0
  23. package/dist/types/element/src/renderElement.d.ts +4 -1
  24. package/dist/types/element/src/store.d.ts +3 -2
  25. package/dist/types/element/src/textElement.d.ts +1 -1
  26. package/dist/types/excalidraw/actions/actionAddToLibrary.d.ts +6 -3
  27. package/dist/types/excalidraw/actions/actionBoundText.d.ts +4 -2
  28. package/dist/types/excalidraw/actions/actionCanvas.d.ts +29 -15
  29. package/dist/types/excalidraw/actions/actionClipboard.d.ts +12 -6
  30. package/dist/types/excalidraw/actions/actionCropEditor.d.ts +2 -1
  31. package/dist/types/excalidraw/actions/actionDeleteSelected.d.ts +6 -3
  32. package/dist/types/excalidraw/actions/actionElementLink.d.ts +2 -1
  33. package/dist/types/excalidraw/actions/actionElementLock.d.ts +4 -2
  34. package/dist/types/excalidraw/actions/actionEmbeddable.d.ts +2 -1
  35. package/dist/types/excalidraw/actions/actionExport.d.ts +18 -9
  36. package/dist/types/excalidraw/actions/actionFinalize.d.ts +4 -2
  37. package/dist/types/excalidraw/actions/actionFrame.d.ts +8 -4
  38. package/dist/types/excalidraw/actions/actionGroup.d.ts +4 -2
  39. package/dist/types/excalidraw/actions/actionLinearEditor.d.ts +3 -2
  40. package/dist/types/excalidraw/actions/actionLink.d.ts +2 -1
  41. package/dist/types/excalidraw/actions/actionMenu.d.ts +6 -3
  42. package/dist/types/excalidraw/actions/actionNavigate.d.ts +4 -2
  43. package/dist/types/excalidraw/actions/actionProperties.d.ts +48 -24
  44. package/dist/types/excalidraw/actions/actionSelectAll.d.ts +2 -1
  45. package/dist/types/excalidraw/actions/actionStyles.d.ts +2 -1
  46. package/dist/types/excalidraw/actions/actionToggleGridMode.d.ts +2 -1
  47. package/dist/types/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +2 -1
  48. package/dist/types/excalidraw/actions/actionToggleSearchMenu.d.ts +2 -1
  49. package/dist/types/excalidraw/actions/actionToggleStats.d.ts +2 -1
  50. package/dist/types/excalidraw/actions/actionToggleViewMode.d.ts +2 -1
  51. package/dist/types/excalidraw/actions/actionToggleZenMode.d.ts +2 -1
  52. package/dist/types/excalidraw/actions/index.d.ts +1 -1
  53. package/dist/types/excalidraw/actions/types.d.ts +1 -1
  54. package/dist/types/excalidraw/appState.d.ts +1 -0
  55. package/dist/types/excalidraw/clipboard.d.ts +64 -1
  56. package/dist/types/excalidraw/components/Actions.d.ts +8 -1
  57. package/dist/types/excalidraw/components/App.d.ts +11 -9
  58. package/dist/types/excalidraw/components/ColorPicker/ColorPicker.d.ts +2 -1
  59. package/dist/types/excalidraw/components/CommandPalette/CommandPalette.d.ts +1 -0
  60. package/dist/types/excalidraw/components/FontPicker/FontPicker.d.ts +2 -1
  61. package/dist/types/excalidraw/components/FontPicker/FontPickerTrigger.d.ts +2 -1
  62. package/dist/types/excalidraw/components/InlineIcon.d.ts +3 -1
  63. package/dist/types/excalidraw/components/LibraryMenuSection.d.ts +1 -1
  64. package/dist/types/excalidraw/components/PropertiesPopover.d.ts +1 -0
  65. package/dist/types/excalidraw/components/TextField.d.ts +1 -0
  66. package/dist/types/excalidraw/components/icons.d.ts +6 -0
  67. package/dist/types/excalidraw/components/shapes.d.ts +129 -1
  68. package/dist/types/excalidraw/data/blob.d.ts +3 -7
  69. package/dist/types/excalidraw/data/types.d.ts +4 -1
  70. package/dist/types/excalidraw/hooks/useLibraryItemSvg.d.ts +1 -1
  71. package/dist/types/excalidraw/hooks/useTextEditorFocus.d.ts +14 -0
  72. package/dist/types/excalidraw/types.d.ts +5 -1
  73. package/dist/types/math/src/segment.d.ts +1 -0
  74. package/package.json +5 -5
  75. package/dist/dev/chunk-CRKRRBMD.js.map +0 -7
  76. package/dist/dev/chunk-QF5FRM6O.js.map +0 -7
  77. package/dist/prod/chunk-HHV2PJKY.js +0 -4
  78. /package/dist/dev/data/{image-IWGLHPIX.js.map → image-RT6RLBUE.js.map} +0 -0
  79. /package/dist/dev/locales/{en-SMAPCEOQ.js.map → en-V3NQTBPG.js.map} +0 -0
@@ -137,7 +137,8 @@ var getDefaultAppState = () => {
137
137
  croppingElementId: null,
138
138
  searchMatches: null,
139
139
  lockedMultiSelections: {},
140
- activeLockedId: null
140
+ activeLockedId: null,
141
+ stylesPanelMode: "full"
141
142
  };
142
143
  };
143
144
  var APP_STATE_STORAGE_CONF = /* @__PURE__ */ ((config) => config)({
@@ -245,7 +246,8 @@ var APP_STATE_STORAGE_CONF = /* @__PURE__ */ ((config) => config)({
245
246
  croppingElementId: { browser: false, export: false, server: false },
246
247
  searchMatches: { browser: false, export: false, server: false },
247
248
  lockedMultiSelections: { browser: true, export: true, server: true },
248
- activeLockedId: { browser: false, export: false, server: false }
249
+ activeLockedId: { browser: false, export: false, server: false },
250
+ stylesPanelMode: { browser: true, export: false, server: false }
249
251
  });
250
252
  var _clearAppStateForStorage = (appState, exportType) => {
251
253
  const stateForExport = {};
@@ -529,8 +531,8 @@ import {
529
531
  supported as nativeFileSystemSupported
530
532
  } from "browser-fs-access";
531
533
  import { EVENT, MIME_TYPES, debounce } from "@excalidraw/common";
532
- var INPUT_CHANGE_INTERVAL_MS = 500;
533
- var fileOpen = (opts) => {
534
+ var INPUT_CHANGE_INTERVAL_MS = 5e3;
535
+ var fileOpen = async (opts) => {
534
536
  const mimeTypes = opts.extensions?.reduce((mimeTypes2, type) => {
535
537
  mimeTypes2.push(MIME_TYPES[type]);
536
538
  return mimeTypes2;
@@ -541,7 +543,7 @@ var fileOpen = (opts) => {
541
543
  }
542
544
  return acc.concat(`.${ext}`);
543
545
  }, []);
544
- return _fileOpen({
546
+ const files = await _fileOpen({
545
547
  description: opts.description,
546
548
  extensions,
547
549
  mimeTypes,
@@ -579,6 +581,12 @@ var fileOpen = (opts) => {
579
581
  };
580
582
  }
581
583
  });
584
+ if (Array.isArray(files)) {
585
+ return await Promise.all(
586
+ files.map((file) => normalizeFile(file))
587
+ );
588
+ }
589
+ return await normalizeFile(files);
582
590
  };
583
591
  var fileSave = (blob, opts) => {
584
592
  return _fileSave(
@@ -637,12 +645,7 @@ var loadFromJSON = async (localAppState, localElements) => {
637
645
  // gets resolved. Else, iOS users cannot open `.excalidraw` files.
638
646
  // extensions: ["json", "excalidraw", "png", "svg"],
639
647
  });
640
- return loadFromBlob(
641
- await normalizeFile(file),
642
- localAppState,
643
- localElements,
644
- file.handle
645
- );
648
+ return loadFromBlob(file, localAppState, localElements, file.handle);
646
649
  };
647
650
  var isValidExcalidrawData = (data) => {
648
651
  return data?.type === EXPORT_DATA_TYPES.excalidraw && (!data.elements || Array.isArray(data.elements) && (!data.appState || typeof data.appState === "object"));
@@ -4923,7 +4926,7 @@ var restoreElement = (element, opts) => {
4923
4926
  elbowed: true,
4924
4927
  startBinding: repairBinding(element, element.startBinding),
4925
4928
  endBinding: repairBinding(element, element.endBinding),
4926
- fixedSegments: element.fixedSegments,
4929
+ fixedSegments: element.fixedSegments?.length && base.points.length >= 4 ? element.fixedSegments : null,
4927
4930
  startIsSpecial: element.startIsSpecial,
4928
4931
  endIsSpecial: element.endIsSpecial
4929
4932
  }) : restoreElementWithProperties(element, base);
@@ -5219,7 +5222,7 @@ var parseFileContents = async (blob) => {
5219
5222
  let contents;
5220
5223
  if (blob.type === MIME_TYPES6.png) {
5221
5224
  try {
5222
- return await (await import("./data/image-IWGLHPIX.js")).decodePngMetadata(blob);
5225
+ return await (await import("./data/image-RT6RLBUE.js")).decodePngMetadata(blob);
5223
5226
  } catch (error) {
5224
5227
  if (error.message === "INVALID") {
5225
5228
  throw new ImageSceneDataError(
@@ -5463,16 +5466,11 @@ var ImageURLToFile = async (imageUrl, filename = "") => {
5463
5466
  }
5464
5467
  throw new Error("Error: unsupported file type", { cause: "UNSUPPORTED" });
5465
5468
  };
5466
- var getFileFromEvent = async (event) => {
5467
- const file = event.dataTransfer.files.item(0);
5468
- const fileHandle = await getFileHandle(event);
5469
- return { file: file ? await normalizeFile(file) : null, fileHandle };
5470
- };
5471
5469
  var getFileHandle = async (event) => {
5472
5470
  if (nativeFileSystemSupported) {
5473
5471
  try {
5474
- const item = event.dataTransfer.items[0];
5475
- const handle = await item.getAsFileSystemHandle() || null;
5472
+ const dataTransferItem = event instanceof DataTransferItem ? event : event.dataTransfer?.items?.[0];
5473
+ const handle = await dataTransferItem.getAsFileSystemHandle() || null;
5476
5474
  return handle;
5477
5475
  } catch (error) {
5478
5476
  console.warn(error.name, error.message);
@@ -5481,61 +5479,52 @@ var getFileHandle = async (event) => {
5481
5479
  }
5482
5480
  return null;
5483
5481
  };
5484
- var getActualMimeTypeFromImage = (buffer) => {
5482
+ var getActualMimeTypeFromImage = async (file) => {
5485
5483
  let mimeType = null;
5486
- const first8Bytes = `${[...new Uint8Array(buffer).slice(0, 8)].join(" ")} `;
5487
- const headerBytes = {
5484
+ const leadingBytes = [
5485
+ ...new Uint8Array(await blobToArrayBuffer(file.slice(0, 15)))
5486
+ ].join(" ");
5487
+ const bytes = {
5488
5488
  // https://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header
5489
- png: "137 80 78 71 13 10 26 10 ",
5489
+ png: /^137 80 78 71 13 10 26 10\b/,
5490
5490
  // https://en.wikipedia.org/wiki/JPEG#Syntax_and_structure
5491
5491
  // jpg is a bit wonky. Checking the first three bytes should be enough,
5492
5492
  // but may yield false positives. (https://stackoverflow.com/a/23360709/927631)
5493
- jpg: "255 216 255 ",
5493
+ jpg: /^255 216 255\b/,
5494
5494
  // https://en.wikipedia.org/wiki/GIF#Example_GIF_file
5495
- gif: "71 73 70 56 57 97 "
5495
+ gif: /^71 73 70 56 57 97\b/,
5496
+ // 4 bytes for RIFF + 4 bytes for chunk size + WEBP identifier
5497
+ webp: /^82 73 70 70 \d+ \d+ \d+ \d+ 87 69 66 80 86 80 56\b/
5496
5498
  };
5497
- if (first8Bytes === headerBytes.png) {
5498
- mimeType = MIME_TYPES6.png;
5499
- } else if (first8Bytes.startsWith(headerBytes.jpg)) {
5500
- mimeType = MIME_TYPES6.jpg;
5501
- } else if (first8Bytes.startsWith(headerBytes.gif)) {
5502
- mimeType = MIME_TYPES6.gif;
5503
- }
5504
- return mimeType;
5499
+ for (const type of Object.keys(bytes)) {
5500
+ if (leadingBytes.match(bytes[type])) {
5501
+ mimeType = MIME_TYPES6[type];
5502
+ break;
5503
+ }
5504
+ }
5505
+ return mimeType || file.type || null;
5505
5506
  };
5506
5507
  var createFile = (blob, mimeType, name) => {
5507
5508
  return new File([blob], name || "", {
5508
5509
  type: mimeType
5509
5510
  });
5510
5511
  };
5512
+ var normalizedFileSymbol = Symbol("fileNormalized");
5511
5513
  var normalizeFile = async (file) => {
5512
- if (!file.type) {
5513
- if (file?.name?.endsWith(".excalidrawlib")) {
5514
- file = createFile(
5515
- await blobToArrayBuffer(file),
5516
- MIME_TYPES6.excalidrawlib,
5517
- file.name
5518
- );
5519
- } else if (file?.name?.endsWith(".excalidraw")) {
5520
- file = createFile(
5521
- await blobToArrayBuffer(file),
5522
- MIME_TYPES6.excalidraw,
5523
- file.name
5524
- );
5525
- } else {
5526
- const buffer = await blobToArrayBuffer(file);
5527
- const mimeType = getActualMimeTypeFromImage(buffer);
5528
- if (mimeType) {
5529
- file = createFile(buffer, mimeType, file.name);
5530
- }
5531
- }
5532
- } else if (isSupportedImageFile(file)) {
5533
- const buffer = await blobToArrayBuffer(file);
5534
- const mimeType = getActualMimeTypeFromImage(buffer);
5514
+ if (file[normalizedFileSymbol]) {
5515
+ return file;
5516
+ }
5517
+ if (file?.name?.endsWith(".excalidrawlib")) {
5518
+ file = createFile(file, MIME_TYPES6.excalidrawlib, file.name);
5519
+ } else if (file?.name?.endsWith(".excalidraw")) {
5520
+ file = createFile(file, MIME_TYPES6.excalidraw, file.name);
5521
+ } else if (!file.type || file.type?.startsWith("image/")) {
5522
+ const mimeType = await getActualMimeTypeFromImage(file);
5535
5523
  if (mimeType && mimeType !== file.type) {
5536
- file = createFile(buffer, mimeType, file.name);
5524
+ file = createFile(file, mimeType, file.name);
5537
5525
  }
5538
5526
  }
5527
+ file[normalizedFileSymbol] = true;
5539
5528
  return file;
5540
5529
  };
5541
5530
  var blobToArrayBuffer = (blob) => {
@@ -5670,8 +5659,8 @@ export {
5670
5659
  resizeImageFile,
5671
5660
  SVGStringToFile,
5672
5661
  ImageURLToFile,
5673
- getFileFromEvent,
5662
+ getFileHandle,
5674
5663
  createFile,
5675
5664
  normalizeFile
5676
5665
  };
5677
- //# sourceMappingURL=chunk-CRKRRBMD.js.map
5666
+ //# sourceMappingURL=chunk-N4PQJPAH.js.map