@excalidraw/excalidraw 0.17.1-1ed53b1 → 0.17.1-22b3927

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 (122) hide show
  1. package/dist/browser/dev/excalidraw-assets-dev/{chunk-JKPJV7MZ.js → chunk-Q6A4M3MN.js} +4 -2
  2. package/dist/browser/dev/excalidraw-assets-dev/chunk-Q6A4M3MN.js.map +7 -0
  3. package/dist/browser/dev/excalidraw-assets-dev/{chunk-OKAZAA6U.js → chunk-VC7RRIDZ.js} +230 -93
  4. package/dist/browser/dev/excalidraw-assets-dev/chunk-VC7RRIDZ.js.map +7 -0
  5. package/dist/browser/dev/excalidraw-assets-dev/{dist-ITJNUBZF.js → dist-6QVAH5JA.js} +36 -14
  6. package/dist/browser/dev/excalidraw-assets-dev/dist-6QVAH5JA.js.map +7 -0
  7. package/dist/browser/dev/excalidraw-assets-dev/{en-BF4XUPIZ.js → en-Y27YPU72.js} +2 -2
  8. package/dist/browser/dev/excalidraw-assets-dev/{image-LVS32KQQ.js → image-J7S3ALXP.js} +2 -2
  9. package/dist/browser/dev/index.js +335 -116
  10. package/dist/browser/dev/index.js.map +4 -4
  11. package/dist/browser/prod/excalidraw-assets/chunk-CWO763YJ.js +55 -0
  12. package/dist/browser/prod/excalidraw-assets/{chunk-O4AI3NNG.js → chunk-IZMZ6RPD.js} +1 -1
  13. package/dist/browser/prod/excalidraw-assets/dist-567JAXHK.js +7 -0
  14. package/dist/browser/prod/excalidraw-assets/{en-N7CLNF6C.js → en-GSUSWMSH.js} +1 -1
  15. package/dist/browser/prod/excalidraw-assets/image-SZBFRCU2.js +1 -0
  16. package/dist/browser/prod/index.js +24 -24
  17. package/dist/dev/{en-UQDDYCH7.json → en-OIPCBIOA.json} +3 -1
  18. package/dist/dev/index.js +576 -207
  19. package/dist/dev/index.js.map +4 -4
  20. package/dist/excalidraw/actions/actionAddToLibrary.d.ts +3 -3
  21. package/dist/excalidraw/actions/actionAlign.d.ts +6 -6
  22. package/dist/excalidraw/actions/actionBoundText.d.ts +3 -3
  23. package/dist/excalidraw/actions/actionBoundText.js +3 -1
  24. package/dist/excalidraw/actions/actionCanvas.d.ts +13 -13
  25. package/dist/excalidraw/actions/actionClipboard.d.ts +12 -12
  26. package/dist/excalidraw/actions/actionDeleteSelected.d.ts +3 -3
  27. package/dist/excalidraw/actions/actionDistribute.d.ts +2 -2
  28. package/dist/excalidraw/actions/actionDuplicateSelection.d.ts +1 -1
  29. package/dist/excalidraw/actions/actionElementLock.d.ts +2 -2
  30. package/dist/excalidraw/actions/actionExport.d.ts +11 -11
  31. package/dist/excalidraw/actions/actionFinalize.d.ts +2 -2
  32. package/dist/excalidraw/actions/actionFlip.d.ts +2 -2
  33. package/dist/excalidraw/actions/actionFrame.d.ts +312 -4
  34. package/dist/excalidraw/actions/actionGroup.d.ts +312 -2
  35. package/dist/excalidraw/actions/actionHistory.js +4 -4
  36. package/dist/excalidraw/actions/actionLinearEditor.d.ts +1 -1
  37. package/dist/excalidraw/actions/actionLink.d.ts +1 -1
  38. package/dist/excalidraw/actions/actionMenu.d.ts +3 -3
  39. package/dist/excalidraw/actions/actionNavigate.d.ts +2 -2
  40. package/dist/excalidraw/actions/actionProperties.d.ts +13 -13
  41. package/dist/excalidraw/actions/actionProperties.js +1 -1
  42. package/dist/excalidraw/actions/actionSelectAll.d.ts +1 -1
  43. package/dist/excalidraw/actions/actionStyles.d.ts +5 -2
  44. package/dist/excalidraw/actions/actionTextAutoResize.d.ts +17 -0
  45. package/dist/excalidraw/actions/actionTextAutoResize.js +38 -0
  46. package/dist/excalidraw/actions/actionToggleGridMode.d.ts +1 -1
  47. package/dist/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +1 -1
  48. package/dist/excalidraw/actions/actionToggleStats.d.ts +1 -1
  49. package/dist/excalidraw/actions/actionToggleViewMode.d.ts +1 -1
  50. package/dist/excalidraw/actions/actionToggleZenMode.d.ts +1 -1
  51. package/dist/excalidraw/actions/actionZindex.d.ts +4 -4
  52. package/dist/excalidraw/actions/types.d.ts +1 -1
  53. package/dist/excalidraw/change.js +13 -6
  54. package/dist/excalidraw/components/Actions.js +1 -1
  55. package/dist/excalidraw/components/App.d.ts +2 -2
  56. package/dist/excalidraw/components/App.js +133 -51
  57. package/dist/excalidraw/components/ButtonIconSelect.js +1 -1
  58. package/dist/excalidraw/components/CheckboxItem.js +1 -1
  59. package/dist/excalidraw/components/CommandPalette/CommandPalette.js +2 -2
  60. package/dist/excalidraw/components/ContextMenu.js +1 -1
  61. package/dist/excalidraw/components/Dialog.js +1 -1
  62. package/dist/excalidraw/components/FollowMode/FollowMode.js +1 -1
  63. package/dist/excalidraw/components/IconPicker.js +2 -2
  64. package/dist/excalidraw/components/LayerUI.js +2 -2
  65. package/dist/excalidraw/components/MobileMenu.js +1 -1
  66. package/dist/excalidraw/components/PasteChartDialog.js +1 -1
  67. package/dist/excalidraw/components/canvases/InteractiveCanvas.d.ts +3 -2
  68. package/dist/excalidraw/components/canvases/InteractiveCanvas.js +4 -2
  69. package/dist/excalidraw/components/canvases/StaticCanvas.d.ts +1 -1
  70. package/dist/excalidraw/components/canvases/StaticCanvas.js +2 -2
  71. package/dist/excalidraw/components/icons.js +6 -2
  72. package/dist/excalidraw/constants.d.ts +1 -0
  73. package/dist/excalidraw/constants.js +5 -0
  74. package/dist/excalidraw/data/restore.js +3 -0
  75. package/dist/excalidraw/element/dragElements.d.ts +2 -2
  76. package/dist/excalidraw/element/dragElements.js +27 -3
  77. package/dist/excalidraw/element/embeddable.d.ts +1 -1
  78. package/dist/excalidraw/element/index.d.ts +1 -1
  79. package/dist/excalidraw/element/index.js +1 -1
  80. package/dist/excalidraw/element/mutateElement.d.ts +1 -1
  81. package/dist/excalidraw/element/mutateElement.js +5 -3
  82. package/dist/excalidraw/element/newElement.d.ts +2 -5
  83. package/dist/excalidraw/element/newElement.js +16 -14
  84. package/dist/excalidraw/element/resizeElements.js +73 -21
  85. package/dist/excalidraw/element/resizeTest.js +2 -4
  86. package/dist/excalidraw/element/textElement.d.ts +1 -0
  87. package/dist/excalidraw/element/textElement.js +11 -3
  88. package/dist/excalidraw/element/textWysiwyg.d.ts +10 -4
  89. package/dist/excalidraw/element/textWysiwyg.js +38 -17
  90. package/dist/excalidraw/element/transformHandles.js +0 -10
  91. package/dist/excalidraw/element/types.d.ts +7 -0
  92. package/dist/excalidraw/fractionalIndex.js +2 -4
  93. package/dist/excalidraw/locales/en.json +3 -1
  94. package/dist/excalidraw/mermaid.d.ts +2 -0
  95. package/dist/excalidraw/mermaid.js +28 -0
  96. package/dist/excalidraw/renderer/interactiveScene.d.ts +1 -1
  97. package/dist/excalidraw/renderer/interactiveScene.js +31 -5
  98. package/dist/excalidraw/renderer/renderElement.d.ts +2 -2
  99. package/dist/excalidraw/renderer/renderElement.js +2 -2
  100. package/dist/excalidraw/scene/Fonts.d.ts +1 -3
  101. package/dist/excalidraw/scene/Fonts.js +6 -12
  102. package/dist/excalidraw/scene/Renderer.d.ts +1 -1
  103. package/dist/excalidraw/scene/Renderer.js +2 -3
  104. package/dist/excalidraw/scene/Scene.d.ts +10 -4
  105. package/dist/excalidraw/scene/Scene.js +14 -8
  106. package/dist/excalidraw/scene/export.js +1 -1
  107. package/dist/excalidraw/scene/types.d.ts +2 -1
  108. package/dist/excalidraw/snapping.js +2 -1
  109. package/dist/excalidraw/store.d.ts +32 -2
  110. package/dist/excalidraw/store.js +27 -0
  111. package/dist/excalidraw/types.d.ts +1 -0
  112. package/dist/prod/{en-UQDDYCH7.json → en-OIPCBIOA.json} +3 -1
  113. package/dist/prod/index.js +42 -42
  114. package/package.json +2 -2
  115. package/dist/browser/dev/excalidraw-assets-dev/chunk-JKPJV7MZ.js.map +0 -7
  116. package/dist/browser/dev/excalidraw-assets-dev/chunk-OKAZAA6U.js.map +0 -7
  117. package/dist/browser/dev/excalidraw-assets-dev/dist-ITJNUBZF.js.map +0 -7
  118. package/dist/browser/prod/excalidraw-assets/chunk-SXBDZOS3.js +0 -55
  119. package/dist/browser/prod/excalidraw-assets/dist-54276HPL.js +0 -6
  120. package/dist/browser/prod/excalidraw-assets/image-VAGBVQ3G.js +0 -1
  121. /package/dist/browser/dev/excalidraw-assets-dev/{en-BF4XUPIZ.js.map → en-Y27YPU72.js.map} +0 -0
  122. /package/dist/browser/dev/excalidraw-assets-dev/{image-LVS32KQQ.js.map → image-J7S3ALXP.js.map} +0 -0
@@ -4934,6 +4934,7 @@ navigator.userAgent.includes("Mac") && "ontouchend" in document;
4934
4934
  var isBrave = () => navigator.brave?.isBrave?.name === "isBrave";
4935
4935
  var supportsResizeObserver = typeof window !== "undefined" && "ResizeObserver" in window;
4936
4936
  var APP_NAME = "Excalidraw";
4937
+ var TEXT_AUTOWRAP_THRESHOLD = 36;
4937
4938
  var DRAGGING_THRESHOLD = 10;
4938
4939
  var LINE_CONFIRM_THRESHOLD = 8;
4939
4940
  var ELEMENT_SHIFT_TRANSLATE_AMOUNT = 5;
@@ -11148,8 +11149,8 @@ var redrawTextBoundingBox = (textElement, container, elementsMap, informMutation
11148
11149
  angle: container?.angle ?? textElement.angle
11149
11150
  };
11150
11151
  boundTextUpdates.text = textElement.text;
11151
- if (container) {
11152
- maxWidth = getBoundTextMaxWidth(container, textElement);
11152
+ if (container || !textElement.autoResize) {
11153
+ maxWidth = container ? getBoundTextMaxWidth(container, textElement) : textElement.width;
11153
11154
  boundTextUpdates.text = wrapText(
11154
11155
  textElement.originalText,
11155
11156
  getFontString(textElement),
@@ -11161,7 +11162,9 @@ var redrawTextBoundingBox = (textElement, container, elementsMap, informMutation
11161
11162
  getFontString(textElement),
11162
11163
  textElement.lineHeight
11163
11164
  );
11164
- boundTextUpdates.width = metrics.width;
11165
+ if (textElement.autoResize) {
11166
+ boundTextUpdates.width = metrics.width;
11167
+ }
11165
11168
  boundTextUpdates.height = metrics.height;
11166
11169
  if (container) {
11167
11170
  const maxContainerHeight = getBoundTextMaxHeight(
@@ -11707,6 +11710,9 @@ var getDefaultLineHeight = (fontFamily) => {
11707
11710
  }
11708
11711
  return DEFAULT_LINE_HEIGHT[DEFAULT_FONT_FAMILY];
11709
11712
  };
11713
+ var getMinTextElementWidth = (font, lineHeight) => {
11714
+ return measureText("", font, lineHeight).width + BOUND_TEXT_PADDING * 2;
11715
+ };
11710
11716
 
11711
11717
  // renderer/renderElement.ts
11712
11718
  var IMAGE_INVERT_FILTER = "invert(100%) hue-rotate(180deg) saturate(1.25)";
@@ -12021,14 +12027,14 @@ var drawElementFromCanvas = (elementWithCanvas, context, renderConfig, appState,
12021
12027
  }
12022
12028
  context.restore();
12023
12029
  };
12024
- var renderSelectionElement = (element, context, appState) => {
12030
+ var renderSelectionElement = (element, context, appState, selectionColor) => {
12025
12031
  context.save();
12026
12032
  context.translate(element.x + appState.scrollX, element.y + appState.scrollY);
12027
12033
  context.fillStyle = "rgba(0, 0, 200, 0.04)";
12028
12034
  const offset2 = 0.5 / appState.zoom.value;
12029
12035
  context.fillRect(offset2, offset2, element.width, element.height);
12030
12036
  context.lineWidth = 1 / appState.zoom.value;
12031
- context.strokeStyle = " rgb(105, 101, 219)";
12037
+ context.strokeStyle = selectionColor;
12032
12038
  context.strokeRect(offset2, offset2, element.width, element.height);
12033
12039
  context.restore();
12034
12040
  };
@@ -13951,36 +13957,41 @@ var newTextElement = (opts) => {
13951
13957
  { textAlign, verticalAlign },
13952
13958
  metrics
13953
13959
  );
13960
+ const textElementProps = {
13961
+ ..._newElementBase("text", opts),
13962
+ text,
13963
+ fontSize,
13964
+ fontFamily,
13965
+ textAlign,
13966
+ verticalAlign,
13967
+ x: opts.x - offsets.x,
13968
+ y: opts.y - offsets.y,
13969
+ width: metrics.width,
13970
+ height: metrics.height,
13971
+ containerId: opts.containerId || null,
13972
+ originalText: opts.originalText ?? text,
13973
+ autoResize: opts.autoResize ?? true,
13974
+ lineHeight
13975
+ };
13954
13976
  const textElement = newElementWith(
13955
- {
13956
- ..._newElementBase("text", opts),
13957
- text,
13958
- fontSize,
13959
- fontFamily,
13960
- textAlign,
13961
- verticalAlign,
13962
- x: opts.x - offsets.x,
13963
- y: opts.y - offsets.y,
13964
- width: metrics.width,
13965
- height: metrics.height,
13966
- containerId: opts.containerId || null,
13967
- originalText: text,
13968
- lineHeight
13969
- },
13977
+ textElementProps,
13970
13978
  {}
13971
13979
  );
13972
13980
  return textElement;
13973
13981
  };
13974
13982
  var getAdjustedDimensions = (element, elementsMap, nextText) => {
13975
- const { width: nextWidth, height: nextHeight } = measureText(
13983
+ let { width: nextWidth, height: nextHeight } = measureText(
13976
13984
  nextText,
13977
13985
  getFontString(element),
13978
13986
  element.lineHeight
13979
13987
  );
13988
+ if (!element.autoResize) {
13989
+ nextWidth = element.width;
13990
+ }
13980
13991
  const { textAlign, verticalAlign } = element;
13981
13992
  let x;
13982
13993
  let y;
13983
- if (textAlign === "center" && verticalAlign === VERTICAL_ALIGN.MIDDLE && !element.containerId) {
13994
+ if (textAlign === "center" && verticalAlign === VERTICAL_ALIGN.MIDDLE && !element.containerId && element.autoResize) {
13984
13995
  const prevMetrics = measureText(
13985
13996
  element.text,
13986
13997
  getFontString(element),
@@ -14030,27 +14041,16 @@ var refreshTextDimensions = (textElement, container, elementsMap, text = textEle
14030
14041
  if (textElement.isDeleted) {
14031
14042
  return;
14032
14043
  }
14033
- if (container) {
14044
+ if (container || !textElement.autoResize) {
14034
14045
  text = wrapText(
14035
14046
  text,
14036
14047
  getFontString(textElement),
14037
- getBoundTextMaxWidth(container, textElement)
14048
+ container ? getBoundTextMaxWidth(container, textElement) : textElement.width
14038
14049
  );
14039
14050
  }
14040
14051
  const dimensions = getAdjustedDimensions(textElement, elementsMap, text);
14041
14052
  return { text, ...dimensions };
14042
14053
  };
14043
- var updateTextElement = (textElement, container, elementsMap, {
14044
- text,
14045
- isDeleted,
14046
- originalText
14047
- }) => {
14048
- return newElementWith(textElement, {
14049
- originalText,
14050
- isDeleted: isDeleted ?? textElement.isDeleted,
14051
- ...refreshTextDimensions(textElement, container, elementsMap, originalText)
14052
- });
14053
- };
14054
14054
  var newFreeDrawElement = (opts) => {
14055
14055
  return {
14056
14056
  ..._newElementBase(opts.type, opts),
@@ -14519,18 +14519,10 @@ var getMovedIndicesGroups = (elements, movedElements) => {
14519
14519
  const indicesGroups = [];
14520
14520
  let i2 = 0;
14521
14521
  while (i2 < elements.length) {
14522
- if (movedElements.has(elements[i2].id) && !isValidFractionalIndex(
14523
- elements[i2]?.index,
14524
- elements[i2 - 1]?.index,
14525
- elements[i2 + 1]?.index
14526
- )) {
14522
+ if (movedElements.has(elements[i2].id)) {
14527
14523
  const indicesGroup = [i2 - 1, i2];
14528
14524
  while (++i2 < elements.length) {
14529
- if (!(movedElements.has(elements[i2].id) && !isValidFractionalIndex(
14530
- elements[i2]?.index,
14531
- elements[i2 - 1]?.index,
14532
- elements[i2 + 1]?.index
14533
- ))) {
14525
+ if (!movedElements.has(elements[i2].id)) {
14534
14526
  break;
14535
14527
  }
14536
14528
  indicesGroup.push(i2);
@@ -15554,12 +15546,22 @@ var ElementsChange = class _ElementsChange {
15554
15546
  if (!flags.containsZindexDifference) {
15555
15547
  return elements;
15556
15548
  }
15557
- const previous = Array.from(elements.values());
15558
- const reordered = orderByFractionalIndex([...previous]);
15559
- if (!flags.containsVisibleDifference && Delta.isRightDifferent(previous, reordered, true)) {
15549
+ const unordered = Array.from(elements.values());
15550
+ const ordered = orderByFractionalIndex([...unordered]);
15551
+ const moved = Delta.getRightDifferences(unordered, ordered, true).reduce(
15552
+ (acc, arrayIndex) => {
15553
+ const candidate = unordered[Number(arrayIndex)];
15554
+ if (candidate && changed.has(candidate.id)) {
15555
+ acc.set(candidate.id, candidate);
15556
+ }
15557
+ return acc;
15558
+ },
15559
+ /* @__PURE__ */ new Map()
15560
+ );
15561
+ if (!flags.containsVisibleDifference && moved.size) {
15560
15562
  flags.containsVisibleDifference = true;
15561
15563
  }
15562
- return arrayToMap(syncMovedIndices(reordered, changed));
15564
+ return arrayToMap(syncMovedIndices(ordered, moved));
15563
15565
  }
15564
15566
  /**
15565
15567
  * It is necessary to post process the partials in case of reference values,
@@ -15640,8 +15642,35 @@ var getObservedAppState = (appState) => {
15640
15642
  };
15641
15643
  var isObservedAppState = (appState) => !!Reflect.get(appState, hiddenObservedAppStateProp);
15642
15644
  var StoreAction = {
15645
+ /**
15646
+ * Immediately undoable.
15647
+ *
15648
+ * Use for updates which should be captured.
15649
+ * Should be used for most of the local updates.
15650
+ *
15651
+ * These updates will _immediately_ make it to the local undo / redo stacks.
15652
+ */
15643
15653
  CAPTURE: "capture",
15654
+ /**
15655
+ * Never undoable.
15656
+ *
15657
+ * Use for updates which should never be recorded, such as remote updates
15658
+ * or scene initialization.
15659
+ *
15660
+ * These updates will _never_ make it to the local undo / redo stacks.
15661
+ */
15644
15662
  UPDATE: "update",
15663
+ /**
15664
+ * Eventually undoable.
15665
+ *
15666
+ * Use for updates which should not be captured immediately - likely
15667
+ * exceptions which are part of some async multi-step process. Otherwise, all
15668
+ * such updates would end up being captured with the next
15669
+ * `StoreAction.CAPTURE` - triggered either by the next `updateScene`
15670
+ * or internally by the editor.
15671
+ *
15672
+ * These updates will _eventually_ make it to the local undo / redo stacks.
15673
+ */
15645
15674
  NONE: "none"
15646
15675
  };
15647
15676
  var StoreIncrementEvent = class {
@@ -17691,7 +17720,7 @@ var exportToSvg = async (elements, appState, files, opts) => {
17691
17720
  let metadata = "";
17692
17721
  if (exportEmbedScene) {
17693
17722
  try {
17694
- metadata = await (await import("./image-LVS32KQQ.js")).encodeSvgMetadata({
17723
+ metadata = await (await import("./image-J7S3ALXP.js")).encodeSvgMetadata({
17695
17724
  // when embedding scene, we want to embed the origionally supplied
17696
17725
  // elements which don't contain the temp frame labels.
17697
17726
  // But it also requires that the exportToSvg is being supplied with
@@ -17717,7 +17746,7 @@ var exportToSvg = async (elements, appState, files, opts) => {
17717
17746
  }
17718
17747
  let assetPath = "https://excalidraw.com/";
17719
17748
  if (define_import_meta_env_default.VITE_IS_EXCALIDRAW_NPM_PACKAGE) {
17720
- assetPath = window.EXCALIDRAW_ASSET_PATH || `https://unpkg.com/${define_import_meta_env_default.VITE_PKG_NAME}@${define_import_meta_env_default.PKG_VERSION}`;
17749
+ assetPath = window.EXCALIDRAW_ASSET_PATH || `https://unpkg.com/${define_import_meta_env_default.VITE_PKG_NAME}@${define_import_meta_env_default.VITE_PKG_VERSION}`;
17721
17750
  if (assetPath?.startsWith("/")) {
17722
17751
  assetPath = assetPath.replace("/", `${window.location.origin}/`);
17723
17752
  }
@@ -17909,6 +17938,7 @@ var restoreElement = (element) => {
17909
17938
  verticalAlign: element.verticalAlign || DEFAULT_VERTICAL_ALIGN,
17910
17939
  containerId: element.containerId ?? null,
17911
17940
  originalText: element.originalText || text,
17941
+ autoResize: element.autoResize ?? true,
17912
17942
  lineHeight
17913
17943
  });
17914
17944
  if (!text && !element.isDeleted) {
@@ -17958,7 +17988,8 @@ var restoreElement = (element) => {
17958
17988
  endArrowhead,
17959
17989
  points,
17960
17990
  x,
17961
- y
17991
+ y,
17992
+ ...getSizeFromPoints(points)
17962
17993
  });
17963
17994
  }
17964
17995
  case "ellipse":
@@ -19720,7 +19751,16 @@ var Scene = class _Scene {
19720
19751
  elements: null,
19721
19752
  cache: /* @__PURE__ */ new Map()
19722
19753
  };
19723
- versionNonce;
19754
+ /**
19755
+ * Random integer regenerated each scene update.
19756
+ *
19757
+ * Does not relate to elements versions, it's only a renderer
19758
+ * cache-invalidation nonce at the moment.
19759
+ */
19760
+ sceneNonce;
19761
+ getSceneNonce() {
19762
+ return this.sceneNonce;
19763
+ }
19724
19764
  getNonDeletedElementsMap() {
19725
19765
  return this.nonDeletedElementsMap;
19726
19766
  }
@@ -19765,9 +19805,6 @@ var Scene = class _Scene {
19765
19805
  getElement(id) {
19766
19806
  return this.elementsMap.get(id) || null;
19767
19807
  }
19768
- getVersionNonce() {
19769
- return this.versionNonce;
19770
- }
19771
19808
  getNonDeletedElement(id) {
19772
19809
  const element = this.getElement(id);
19773
19810
  if (element && isNonDeletedElement(element)) {
@@ -19824,15 +19861,15 @@ var Scene = class _Scene {
19824
19861
  this.nonDeletedElementsMap = nonDeletedElements.elementsMap;
19825
19862
  this.frames = nextFrameLikes;
19826
19863
  this.nonDeletedFramesLikes = getNonDeletedElements3(this.frames).elements;
19827
- this.informMutation();
19864
+ this.triggerUpdate();
19828
19865
  }
19829
- informMutation() {
19830
- this.versionNonce = randomInteger();
19866
+ triggerUpdate() {
19867
+ this.sceneNonce = randomInteger();
19831
19868
  for (const callback of Array.from(this.callbacks)) {
19832
19869
  callback();
19833
19870
  }
19834
19871
  }
19835
- addCallback(cb) {
19872
+ onUpdate(cb) {
19836
19873
  if (this.callbacks.has(cb)) {
19837
19874
  throw new Error();
19838
19875
  }
@@ -19965,11 +20002,11 @@ var mutateElement = (element, updates, informMutation = true) => {
19965
20002
  element.versionNonce = randomInteger();
19966
20003
  element.updated = getUpdatedTimestamp();
19967
20004
  if (informMutation) {
19968
- Scene_default.getScene(element)?.informMutation();
20005
+ Scene_default.getScene(element)?.triggerUpdate();
19969
20006
  }
19970
20007
  return element;
19971
20008
  };
19972
- var newElementWith = (element, updates) => {
20009
+ var newElementWith = (element, updates, force = false) => {
19973
20010
  let didChange = false;
19974
20011
  for (const key in updates) {
19975
20012
  const value = updates[key];
@@ -19981,7 +20018,7 @@ var newElementWith = (element, updates) => {
19981
20018
  didChange = true;
19982
20019
  }
19983
20020
  }
19984
- if (!didChange) {
20021
+ if (!didChange && !force) {
19985
20022
  return element;
19986
20023
  }
19987
20024
  return {
@@ -20097,12 +20134,6 @@ var DEFAULT_OMIT_SIDES = {
20097
20134
  n: true,
20098
20135
  w: true
20099
20136
  };
20100
- var OMIT_SIDES_FOR_TEXT_ELEMENT = {
20101
- e: true,
20102
- s: true,
20103
- n: true,
20104
- w: true
20105
- };
20106
20137
  var OMIT_SIDES_FOR_LINE_SLASH = {
20107
20138
  e: true,
20108
20139
  s: true,
@@ -20263,8 +20294,6 @@ var getTransformHandles = (element, zoom, elementsMap, pointerType = "mouse", om
20263
20294
  omitSides = OMIT_SIDES_FOR_LINE_BACKSLASH;
20264
20295
  }
20265
20296
  }
20266
- } else if (isTextElement(element)) {
20267
- omitSides = OMIT_SIDES_FOR_TEXT_ELEMENT;
20268
20297
  } else if (isFrameLikeElement(element)) {
20269
20298
  omitSides = {
20270
20299
  ...omitSides,
@@ -20327,7 +20356,7 @@ var resizeTest = (element, elementsMap, appState, x, y, zoom, pointerType, devic
20327
20356
  element,
20328
20357
  elementsMap
20329
20358
  );
20330
- if (element.type !== "text" && !(isLinearElement(element) && element.points.length <= 2)) {
20359
+ if (!(isLinearElement(element) && element.points.length <= 2)) {
20331
20360
  const SPACING = SIDE_RESIZING_THRESHOLD / zoom.value;
20332
20361
  const sides = getSelectionBorders(
20333
20362
  [x1 - SPACING, y1 - SPACING],
@@ -20477,8 +20506,9 @@ var transformElements = (originalElements, transformHandleType, selectedElements
20477
20506
  shouldRotateWithDiscreteAngle2
20478
20507
  );
20479
20508
  updateBoundElements(element, elementsMap);
20480
- } else if (isTextElement(element) && (transformHandleType === "nw" || transformHandleType === "ne" || transformHandleType === "sw" || transformHandleType === "se")) {
20509
+ } else if (isTextElement(element) && transformHandleType) {
20481
20510
  resizeSingleTextElement(
20511
+ originalElements,
20482
20512
  element,
20483
20513
  elementsMap,
20484
20514
  transformHandleType,
@@ -20580,7 +20610,7 @@ var measureFontSizeFromWidth = (element, elementsMap, nextWidth) => {
20580
20610
  size: nextFontSize
20581
20611
  };
20582
20612
  };
20583
- var resizeSingleTextElement = (element, elementsMap, transformHandleType, shouldResizeFromCenter2, pointerX, pointerY) => {
20613
+ var resizeSingleTextElement = (originalElements, element, elementsMap, transformHandleType, shouldResizeFromCenter2, pointerX, pointerY) => {
20584
20614
  const [x1, y1, x2, y2, cx, cy] = getElementAbsoluteCoords(
20585
20615
  element,
20586
20616
  elementsMap
@@ -20594,17 +20624,19 @@ var resizeSingleTextElement = (element, elementsMap, transformHandleType, should
20594
20624
  );
20595
20625
  let scaleX = 0;
20596
20626
  let scaleY = 0;
20597
- if (transformHandleType.includes("e")) {
20598
- scaleX = (rotatedX - x1) / (x2 - x1);
20599
- }
20600
- if (transformHandleType.includes("w")) {
20601
- scaleX = (x2 - rotatedX) / (x2 - x1);
20602
- }
20603
- if (transformHandleType.includes("n")) {
20604
- scaleY = (y2 - rotatedY) / (y2 - y1);
20605
- }
20606
- if (transformHandleType.includes("s")) {
20607
- scaleY = (rotatedY - y1) / (y2 - y1);
20627
+ if (transformHandleType !== "e" && transformHandleType !== "w") {
20628
+ if (transformHandleType.includes("e")) {
20629
+ scaleX = (rotatedX - x1) / (x2 - x1);
20630
+ }
20631
+ if (transformHandleType.includes("w")) {
20632
+ scaleX = (x2 - rotatedX) / (x2 - x1);
20633
+ }
20634
+ if (transformHandleType.includes("n")) {
20635
+ scaleY = (y2 - rotatedY) / (y2 - y1);
20636
+ }
20637
+ if (transformHandleType.includes("s")) {
20638
+ scaleY = (rotatedY - y1) / (y2 - y1);
20639
+ }
20608
20640
  }
20609
20641
  const scale = Math.max(scaleX, scaleY);
20610
20642
  if (scale > 0) {
@@ -20659,6 +20691,89 @@ var resizeSingleTextElement = (element, elementsMap, transformHandleType, should
20659
20691
  y: nextY
20660
20692
  });
20661
20693
  }
20694
+ if (transformHandleType === "e" || transformHandleType === "w") {
20695
+ const stateAtResizeStart = originalElements.get(element.id);
20696
+ const [x12, y12, x22, y22] = getResizedElementAbsoluteCoords(
20697
+ stateAtResizeStart,
20698
+ stateAtResizeStart.width,
20699
+ stateAtResizeStart.height,
20700
+ true
20701
+ );
20702
+ const startTopLeft = [x12, y12];
20703
+ const startBottomRight = [x22, y22];
20704
+ const startCenter = centerPoint(startTopLeft, startBottomRight);
20705
+ const rotatedPointer = rotatePoint(
20706
+ [pointerX, pointerY],
20707
+ startCenter,
20708
+ -stateAtResizeStart.angle
20709
+ );
20710
+ const [esx1, , esx2] = getResizedElementAbsoluteCoords(
20711
+ element,
20712
+ element.width,
20713
+ element.height,
20714
+ true
20715
+ );
20716
+ const boundsCurrentWidth = esx2 - esx1;
20717
+ const atStartBoundsWidth = startBottomRight[0] - startTopLeft[0];
20718
+ const minWidth = getMinTextElementWidth(
20719
+ getFontString({
20720
+ fontSize: element.fontSize,
20721
+ fontFamily: element.fontFamily
20722
+ }),
20723
+ element.lineHeight
20724
+ );
20725
+ let scaleX2 = atStartBoundsWidth / boundsCurrentWidth;
20726
+ if (transformHandleType.includes("e")) {
20727
+ scaleX2 = (rotatedPointer[0] - startTopLeft[0]) / boundsCurrentWidth;
20728
+ }
20729
+ if (transformHandleType.includes("w")) {
20730
+ scaleX2 = (startBottomRight[0] - rotatedPointer[0]) / boundsCurrentWidth;
20731
+ }
20732
+ const newWidth = element.width * scaleX2 < minWidth ? minWidth : element.width * scaleX2;
20733
+ const text = wrapText(
20734
+ element.originalText,
20735
+ getFontString(element),
20736
+ Math.abs(newWidth)
20737
+ );
20738
+ const metrics = measureText(
20739
+ text,
20740
+ getFontString(element),
20741
+ element.lineHeight
20742
+ );
20743
+ const eleNewHeight = metrics.height;
20744
+ const [newBoundsX1, newBoundsY1, newBoundsX2, newBoundsY2] = getResizedElementAbsoluteCoords(
20745
+ stateAtResizeStart,
20746
+ newWidth,
20747
+ eleNewHeight,
20748
+ true
20749
+ );
20750
+ const newBoundsWidth = newBoundsX2 - newBoundsX1;
20751
+ const newBoundsHeight = newBoundsY2 - newBoundsY1;
20752
+ let newTopLeft = [...startTopLeft];
20753
+ if (["n", "w", "nw"].includes(transformHandleType)) {
20754
+ newTopLeft = [
20755
+ startBottomRight[0] - Math.abs(newBoundsWidth),
20756
+ startTopLeft[1]
20757
+ ];
20758
+ }
20759
+ const angle = stateAtResizeStart.angle;
20760
+ const rotatedTopLeft = rotatePoint(newTopLeft, startCenter, angle);
20761
+ const newCenter = [
20762
+ newTopLeft[0] + Math.abs(newBoundsWidth) / 2,
20763
+ newTopLeft[1] + Math.abs(newBoundsHeight) / 2
20764
+ ];
20765
+ const rotatedNewCenter = rotatePoint(newCenter, startCenter, angle);
20766
+ newTopLeft = rotatePoint(rotatedTopLeft, rotatedNewCenter, -angle);
20767
+ const resizedElement = {
20768
+ width: Math.abs(newWidth),
20769
+ height: Math.abs(metrics.height),
20770
+ x: newTopLeft[0],
20771
+ y: newTopLeft[1],
20772
+ text,
20773
+ autoResize: false
20774
+ };
20775
+ mutateElement(element, resizedElement);
20776
+ }
20662
20777
  };
20663
20778
  var resizeSingleElement = (originalElements, shouldMaintainAspectRatio2, element, elementsMap, transformHandleDirection, shouldResizeFromCenter2, pointerX, pointerY) => {
20664
20779
  const stateAtResizeStart = originalElements.get(element.id);
@@ -21050,7 +21165,7 @@ var resizeMultipleElements = (originalElements, selectedElements, elementsMap, t
21050
21165
  handleBindTextResize(element, elementsMap, transformHandleType, true);
21051
21166
  }
21052
21167
  }
21053
- Scene_default.getScene(elementsAndUpdates[0].element)?.informMutation();
21168
+ Scene_default.getScene(elementsAndUpdates[0].element)?.triggerUpdate();
21054
21169
  };
21055
21170
  var rotateMultipleElements = (originalElements, elements, elementsMap, pointerX, pointerY, shouldRotateWithDiscreteAngle2, centerX, centerY) => {
21056
21171
  let centerAngle = 5 * Math.PI / 2 + Math.atan2(pointerY - centerY, pointerX - centerX);
@@ -21095,7 +21210,7 @@ var rotateMultipleElements = (originalElements, elements, elementsMap, pointerX,
21095
21210
  );
21096
21211
  }
21097
21212
  });
21098
- Scene_default.getScene(elements[0])?.informMutation();
21213
+ Scene_default.getScene(elements[0])?.triggerUpdate();
21099
21214
  };
21100
21215
  var getResizeOffsetXY = (transformHandleType, selectedElements, elementsMap, x, y) => {
21101
21216
  const [x1, y1, x2, y2] = selectedElements.length === 1 ? getElementAbsoluteCoords(selectedElements[0], elementsMap) : getCommonBounds(selectedElements);
@@ -21209,7 +21324,7 @@ var getDragOffsetXY = (selectedElements, x, y) => {
21209
21324
  const [x1, y1] = getCommonBounds(selectedElements);
21210
21325
  return [x - x1, y - y1];
21211
21326
  };
21212
- var dragNewElement = (draggingElement, elementType, originX, originY, x, y, width, height, shouldMaintainAspectRatio2, shouldResizeFromCenter2, widthAspectRatio, originOffset = null) => {
21327
+ var dragNewElement = (draggingElement, elementType, originX, originY, x, y, width, height, shouldMaintainAspectRatio2, shouldResizeFromCenter2, zoom, widthAspectRatio, originOffset = null) => {
21213
21328
  if (shouldMaintainAspectRatio2 && draggingElement.type !== "selection") {
21214
21329
  if (widthAspectRatio) {
21215
21330
  height = width / widthAspectRatio;
@@ -21240,12 +21355,34 @@ var dragNewElement = (draggingElement, elementType, originX, originY, x, y, widt
21240
21355
  newX = originX - width / 2;
21241
21356
  newY = originY - height / 2;
21242
21357
  }
21358
+ let textAutoResize = null;
21359
+ if (isTextElement(draggingElement)) {
21360
+ height = draggingElement.height;
21361
+ const minWidth = getMinTextElementWidth(
21362
+ getFontString({
21363
+ fontSize: draggingElement.fontSize,
21364
+ fontFamily: draggingElement.fontFamily
21365
+ }),
21366
+ draggingElement.lineHeight
21367
+ );
21368
+ width = Math.max(width, minWidth);
21369
+ if (Math.abs(x - originX) > TEXT_AUTOWRAP_THRESHOLD / zoom) {
21370
+ textAutoResize = {
21371
+ autoResize: false
21372
+ };
21373
+ }
21374
+ newY = originY;
21375
+ if (shouldResizeFromCenter2) {
21376
+ newX = originX - width / 2;
21377
+ }
21378
+ }
21243
21379
  if (width !== 0 && height !== 0) {
21244
21380
  mutateElement(draggingElement, {
21245
21381
  x: newX + (originOffset?.x ?? 0),
21246
21382
  y: newY + (originOffset?.y ?? 0),
21247
21383
  width,
21248
- height
21384
+ height,
21385
+ ...textAutoResize
21249
21386
  });
21250
21387
  }
21251
21388
  };
@@ -21289,7 +21426,7 @@ var parseFileContents = async (blob) => {
21289
21426
  let contents;
21290
21427
  if (blob.type === MIME_TYPES.png) {
21291
21428
  try {
21292
- return await (await import("./image-LVS32KQQ.js")).decodePngMetadata(blob);
21429
+ return await (await import("./image-J7S3ALXP.js")).decodePngMetadata(blob);
21293
21430
  } catch (error) {
21294
21431
  if (error.message === "INVALID") {
21295
21432
  throw new ImageSceneDataError(
@@ -21316,7 +21453,7 @@ var parseFileContents = async (blob) => {
21316
21453
  }
21317
21454
  if (blob.type === MIME_TYPES.svg) {
21318
21455
  try {
21319
- return await (await import("./image-LVS32KQQ.js")).decodeSvgMetadata({
21456
+ return await (await import("./image-J7S3ALXP.js")).decodeSvgMetadata({
21320
21457
  svg: contents
21321
21458
  });
21322
21459
  } catch (error) {
@@ -22000,6 +22137,7 @@ export {
22000
22137
  getBoundTextMaxHeight,
22001
22138
  isMeasureTextSupported,
22002
22139
  getDefaultLineHeight,
22140
+ getMinTextElementWidth,
22003
22141
  getElementAbsoluteCoords,
22004
22142
  getCommonBounds,
22005
22143
  getDraggedElementsBounds,
@@ -22037,7 +22175,6 @@ export {
22037
22175
  newMagicFrameElement,
22038
22176
  newTextElement,
22039
22177
  refreshTextDimensions,
22040
- updateTextElement,
22041
22178
  newFreeDrawElement,
22042
22179
  newLinearElement,
22043
22180
  newImageElement,
@@ -22189,4 +22326,4 @@ export {
22189
22326
  getNormalizedZoom,
22190
22327
  getStateForZoom
22191
22328
  };
22192
- //# sourceMappingURL=chunk-OKAZAA6U.js.map
22329
+ //# sourceMappingURL=chunk-VC7RRIDZ.js.map