roosterjs 8.44.0 → 8.44.2

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.
@@ -3028,7 +3028,6 @@ function insertImageWithSrc(editor, src, attributes) {
3028
3028
  return image.setAttribute(attribute, attributes[attribute]);
3029
3029
  });
3030
3030
  }
3031
- image.style.maxWidth = '100%';
3032
3031
  editor.insertNode(image);
3033
3032
  }, 'insertImage');
3034
3033
  }
@@ -4097,12 +4096,21 @@ function editTable(editor, operation) {
4097
4096
  vtable.writeBack();
4098
4097
  editor.transformToDarkColor(vtable.table);
4099
4098
  editor.focus();
4100
- var cellToSelect = calculateCellToSelect(operation, vtable.row, vtable.col);
4101
- editor.select(vtable.getCell(cellToSelect.newRow, cellToSelect.newCol).td, 0 /* Begin */);
4099
+ if (isUndefined(vtable.row) || isUndefined(vtable.col)) {
4100
+ return;
4101
+ }
4102
+ var _a = calculateCellToSelect(operation, vtable.row, vtable.col), newCol = _a.newCol, newRow = _a.newRow;
4103
+ var newTd = vtable.getCell(newRow, newCol).td;
4104
+ if (newTd) {
4105
+ editor.select(newTd, 0 /* Begin */);
4106
+ }
4102
4107
  }, 'editTable');
4103
4108
  }
4104
4109
  }
4105
4110
  exports.default = editTable;
4111
+ function isUndefined(n) {
4112
+ return n == undefined;
4113
+ }
4106
4114
  function calculateCellToSelect(operation, currentRow, currentCol) {
4107
4115
  var newRow = currentRow;
4108
4116
  var newCol = currentCol;
@@ -4128,9 +4136,10 @@ function calculateCellToSelect(operation, currentRow, currentCol) {
4128
4136
  };
4129
4137
  }
4130
4138
  function saveTableSelection(editor, vtable) {
4139
+ var _a;
4131
4140
  var selection = editor.getSelectionRangeEx();
4132
4141
  if (selection && selection.type === 1 /* TableSelection */) {
4133
- vtable.selection = selection.coordinates;
4142
+ vtable.selection = (_a = selection.coordinates) !== null && _a !== void 0 ? _a : null;
4134
4143
  }
4135
4144
  }
4136
4145
 
@@ -4159,12 +4168,17 @@ function formatTable(editor, format, table) {
4159
4168
  table = table || editor.getElementAtCursor('TABLE');
4160
4169
  if (table) {
4161
4170
  (0, formatUndoSnapshot_1.default)(editor, function (start, end) {
4171
+ if (!table) {
4172
+ return;
4173
+ }
4162
4174
  var vtable = new roosterjs_editor_dom_1.VTable(table);
4163
4175
  vtable.applyFormat(format);
4164
4176
  vtable.writeBack();
4165
4177
  editor.transformToDarkColor(vtable.table);
4166
4178
  editor.focus();
4167
- editor.select(start, end);
4179
+ if (start && end) {
4180
+ editor.select(start, end);
4181
+ }
4168
4182
  }, 'formatTable');
4169
4183
  }
4170
4184
  }
@@ -4217,7 +4231,7 @@ function insertTable(editor, columns, rows, format) {
4217
4231
  (0, setBackgroundColor_1.default)(editor, 'transparent');
4218
4232
  }
4219
4233
  var vtable = new roosterjs_editor_dom_1.VTable(table);
4220
- vtable.applyFormat(format);
4234
+ vtable.applyFormat(format || {});
4221
4235
  vtable.writeBack();
4222
4236
  editor.insertNode(table);
4223
4237
  editor.runAsync(function (editor) {
@@ -4293,6 +4307,9 @@ function applyInlineStyle(editor, callback, apiName) {
4293
4307
  var lastNode;
4294
4308
  selection.ranges.forEach(function (range) {
4295
4309
  var contentTraverser = editor.getSelectionTraverser(range);
4310
+ if (!contentTraverser) {
4311
+ return;
4312
+ }
4296
4313
  var inlineElement = contentTraverser && contentTraverser.currentInlineElement;
4297
4314
  while (inlineElement) {
4298
4315
  var nextInlineElement = contentTraverser.getNextInlineElement();
@@ -4391,7 +4408,7 @@ function blockFormat(editor, callback, beforeRunCallback, apiName) {
4391
4408
  (0, commitListChains_1.default)(editor, chains_1);
4392
4409
  }
4393
4410
  }
4394
- if (selection.type == 0 /* Normal */) {
4411
+ if (selection.type == 0 /* Normal */ && start && end) {
4395
4412
  editor.select(start, end);
4396
4413
  }
4397
4414
  else {
@@ -4440,9 +4457,11 @@ function blockWrap(editor, wrapFunction, beforeRunCallback, apiName) {
4440
4457
  }
4441
4458
  }
4442
4459
  while (nodes[0] &&
4460
+ nodes[0].parentNode &&
4443
4461
  (0, roosterjs_editor_dom_1.isNodeInRegion)(region, nodes[0].parentNode) &&
4444
4462
  nodes.some(function (node) { return (0, roosterjs_editor_dom_1.getTagOfNode)(node) == 'LI'; })) {
4445
- nodes = [(0, roosterjs_editor_dom_1.splitBalancedNodeRange)(nodes)];
4463
+ var result = (0, roosterjs_editor_dom_1.splitBalancedNodeRange)(nodes);
4464
+ nodes = result ? [result] : [];
4446
4465
  }
4447
4466
  wrapFunction(nodes);
4448
4467
  }
@@ -4472,7 +4491,10 @@ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./
4472
4491
  */
4473
4492
  function collapseSelectedBlocks(editor, forEachCallback) {
4474
4493
  var traverser = editor.getSelectionTraverser();
4475
- var block = traverser && traverser.currentBlockElement;
4494
+ if (!traverser) {
4495
+ return;
4496
+ }
4497
+ var block = traverser.currentBlockElement;
4476
4498
  var blocks = [];
4477
4499
  while (block) {
4478
4500
  if (!isEmptyBlockUnderTR(block)) {
@@ -4520,7 +4542,9 @@ function commitListChains(editor, chains) {
4520
4542
  var end = range && roosterjs_editor_dom_1.Position.getEnd(range);
4521
4543
  var shouldReuseAllAncestorListElements_1 = editor.isFeatureEnabled("ReuseAllAncestorListElements" /* ReuseAllAncestorListElements */);
4522
4544
  chains.forEach(function (chain) { return chain.commit(shouldReuseAllAncestorListElements_1); });
4523
- editor.select(start, end);
4545
+ if (start && end) {
4546
+ editor.select(start, end);
4547
+ }
4524
4548
  }
4525
4549
  }
4526
4550
  exports.default = commitListChains;
@@ -4557,7 +4581,7 @@ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./
4557
4581
  */
4558
4582
  function execCommand(editor, command, apiName) {
4559
4583
  editor.focus();
4560
- var formatter = function () { return editor.getDocument().execCommand(command, false, null); };
4584
+ var formatter = function () { return editor.getDocument().execCommand(command, false, undefined); };
4561
4585
  var selection = editor.getSelectionRangeEx();
4562
4586
  if (selection && selection.areAllCollapsed) {
4563
4587
  editor.addUndoSnapshot();
@@ -4610,9 +4634,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
4610
4634
  * Default value is false.
4611
4635
  */
4612
4636
  function formatUndoSnapshot(editor, callback, apiName) {
4613
- editor.addUndoSnapshot(callback, "Format" /* Format */, undefined /* canUndoByBackspace */, apiName && {
4614
- formatApiName: apiName,
4615
- });
4637
+ editor.addUndoSnapshot(callback, "Format" /* Format */, undefined /* canUndoByBackspace */, apiName && apiName != ''
4638
+ ? {
4639
+ formatApiName: apiName,
4640
+ }
4641
+ : undefined);
4616
4642
  }
4617
4643
  exports.default = formatUndoSnapshot;
4618
4644
 
@@ -4640,6 +4666,9 @@ function normalizeBlockquote(node, quotesHandled) {
4640
4666
  if ((0, roosterjs_editor_dom_1.safeInstanceOf)(node, 'HTMLElement')) {
4641
4667
  var alignment = node.style.textAlign;
4642
4668
  var quote = (0, roosterjs_editor_dom_1.findClosestElementAncestor)(node, undefined /* root */, 'blockquote');
4669
+ if (!quote) {
4670
+ return;
4671
+ }
4643
4672
  var isNodeRTL = isRTL(node);
4644
4673
  if (quotesHandled) {
4645
4674
  if (quotesHandled.indexOf(quote) > -1) {
@@ -4650,17 +4679,17 @@ function normalizeBlockquote(node, quotesHandled) {
4650
4679
  while (quote) {
4651
4680
  if (alignment == 'center') {
4652
4681
  if (isNodeRTL) {
4653
- delete quote.style.marginInlineEnd;
4682
+ quote.style.removeProperty('marginInlineEnd');
4654
4683
  quote.style.marginInlineStart = 'auto';
4655
4684
  }
4656
4685
  else {
4657
- delete quote.style.marginInlineStart;
4686
+ quote.style.removeProperty('marginInlineStart');
4658
4687
  quote.style.marginInlineEnd = 'auto';
4659
4688
  }
4660
4689
  }
4661
4690
  else {
4662
- delete quote.style.marginInlineStart;
4663
- delete quote.style.marginInlineEnd;
4691
+ quote.style.removeProperty('marginInlineEnd');
4692
+ quote.style.removeProperty('marginInlineStart');
4664
4693
  }
4665
4694
  quote = (0, roosterjs_editor_dom_1.findClosestElementAncestor)(quote.parentElement, undefined /* root */, 'blockquote');
4666
4695
  }
@@ -4707,14 +4736,19 @@ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./
4707
4736
  * @param apiNameOverride (Optional) Set a new api name, if empty the api name will be 'toggleListType'.
4708
4737
  */
4709
4738
  function toggleListType(editor, listType, startNumber, includeSiblingLists, orderedStyle, unorderedStyle, apiNameOverride) {
4739
+ if (startNumber === void 0) { startNumber = 0; }
4710
4740
  if (includeSiblingLists === void 0) { includeSiblingLists = true; }
4711
4741
  (0, blockFormat_1.default)(editor, function (region, start, end, chains) {
4712
- var _a;
4742
+ var _a, _b;
4713
4743
  var chain = startNumber > 0 && chains.filter(function (chain) { return chain.canAppendAtCursor(startNumber); })[0];
4714
- var vList = chain && start.equalTo(end)
4715
- ? chain.createVListAtBlock((_a = (0, roosterjs_editor_dom_1.getBlockElementAtNode)(region.rootNode, start.node)) === null || _a === void 0 ? void 0 : _a.collapseToSingleElement(), startNumber)
4744
+ var block = (_b = (0, roosterjs_editor_dom_1.getBlockElementAtNode)(region.rootNode, (_a = start === null || start === void 0 ? void 0 : start.node) !== null && _a !== void 0 ? _a : null)) === null || _b === void 0 ? void 0 : _b.collapseToSingleElement();
4745
+ if (!block) {
4746
+ return;
4747
+ }
4748
+ var vList = chain && end && (start === null || start === void 0 ? void 0 : start.equalTo(end))
4749
+ ? chain.createVListAtBlock(block, startNumber)
4716
4750
  : (0, roosterjs_editor_dom_1.createVListFromRegion)(region, startNumber === 1 ? false : includeSiblingLists);
4717
- if (vList) {
4751
+ if (vList && start && end) {
4718
4752
  vList.changeListType(start, end, listType);
4719
4753
  if (editor.isFeatureEnabled("AutoFormatList" /* AutoFormatList */)) {
4720
4754
  vList.setListStyleType(orderedStyle, unorderedStyle);
@@ -8806,7 +8840,6 @@ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./
8806
8840
  var DELIMITER_SELECTOR = '.' + "entityDelimiterAfter" /* DELIMITER_AFTER */ + ',.' + "entityDelimiterBefore" /* DELIMITER_BEFORE */;
8807
8841
  var ZERO_WIDTH_SPACE = '\u200B';
8808
8842
  var INLINE_ENTITY_SELECTOR = 'span' + (0, roosterjs_editor_dom_1.getEntitySelector)();
8809
- var NBSP = '\u00A0';
8810
8843
  function inlineEntityOnPluginEvent(event, editor) {
8811
8844
  switch (event.eventType) {
8812
8845
  case 7 /* ContentChanged */:
@@ -8818,7 +8851,14 @@ function inlineEntityOnPluginEvent(event, editor) {
8818
8851
  normalizeDelimitersInEditor(editor);
8819
8852
  break;
8820
8853
  case 10 /* BeforePaste */:
8821
- addDelimitersIfNeeded(event.fragment.querySelectorAll(INLINE_ENTITY_SELECTOR));
8854
+ var fragment = event.fragment, sanitizingOption = event.sanitizingOption;
8855
+ addDelimitersIfNeeded(fragment.querySelectorAll(INLINE_ENTITY_SELECTOR));
8856
+ if (sanitizingOption.additionalAllowedCssClasses) {
8857
+ (0, roosterjs_editor_dom_1.arrayPush)(sanitizingOption.additionalAllowedCssClasses, [
8858
+ "entityDelimiterAfter" /* DELIMITER_AFTER */,
8859
+ "entityDelimiterBefore" /* DELIMITER_BEFORE */,
8860
+ ]);
8861
+ }
8822
8862
  break;
8823
8863
  case 8 /* ExtractContentWithDom */:
8824
8864
  case 9 /* BeforeCutCopy */:
@@ -8864,12 +8904,12 @@ function normalizeDelimitersInEditor(editor) {
8864
8904
  exports.normalizeDelimitersInEditor = normalizeDelimitersInEditor;
8865
8905
  function addDelimitersIfNeeded(nodes) {
8866
8906
  nodes.forEach(function (node) {
8867
- if (tryGetEntityFromNode(node)) {
8907
+ if (isEntityElement(node)) {
8868
8908
  (0, roosterjs_editor_dom_1.addDelimiters)(node);
8869
8909
  }
8870
8910
  });
8871
8911
  }
8872
- function tryGetEntityFromNode(node) {
8912
+ function isEntityElement(node) {
8873
8913
  return !!(node &&
8874
8914
  (0, roosterjs_editor_dom_1.safeInstanceOf)(node, 'HTMLElement') &&
8875
8915
  isReadOnly((0, roosterjs_editor_dom_1.getEntityFromElement)(node)));
@@ -8898,13 +8938,14 @@ function removeInvalidDelimiters(nodes) {
8898
8938
  }
8899
8939
  });
8900
8940
  }
8901
- function removeDelimiterAttr(node) {
8941
+ function removeDelimiterAttr(node, checkEntity) {
8942
+ if (checkEntity === void 0) { checkEntity = true; }
8902
8943
  if (!node) {
8903
8944
  return;
8904
8945
  }
8905
8946
  var isAfter = node.classList.contains("entityDelimiterAfter" /* DELIMITER_AFTER */);
8906
8947
  var entitySibling = isAfter ? node.previousElementSibling : node.nextElementSibling;
8907
- if (entitySibling && tryGetEntityFromNode(entitySibling)) {
8948
+ if (checkEntity && entitySibling && isEntityElement(entitySibling)) {
8908
8949
  return;
8909
8950
  }
8910
8951
  node.classList.remove("entityDelimiterAfter" /* DELIMITER_AFTER */, "entityDelimiterBefore" /* DELIMITER_BEFORE */);
@@ -8918,31 +8959,34 @@ function removeDelimiterAttr(node) {
8918
8959
  });
8919
8960
  }
8920
8961
  function handleCollapsedEnter(editor, delimiter) {
8962
+ var _a;
8921
8963
  var isAfter = delimiter.classList.contains("entityDelimiterAfter" /* DELIMITER_AFTER */);
8922
- var sibling = isAfter ? delimiter.nextSibling : delimiter.previousSibling;
8923
- var positionToUse;
8924
- var element;
8925
- if (sibling) {
8926
- positionToUse = new roosterjs_editor_dom_1.Position(sibling, isAfter ? 0 /* Begin */ : -1 /* End */);
8927
- }
8928
- else {
8929
- element = delimiter.insertAdjacentElement(isAfter ? 'afterend' : 'beforebegin', (0, roosterjs_editor_dom_1.createElement)({
8930
- tag: 'span',
8931
- children: [NBSP],
8932
- }, editor.getDocument()));
8933
- if (!element) {
8964
+ var entity = !isAfter ? delimiter.nextSibling : delimiter.previousSibling;
8965
+ var block = (_a = editor.getBlockElementAtNode(delimiter)) === null || _a === void 0 ? void 0 : _a.getStartNode();
8966
+ editor.runAsync(function () {
8967
+ if (!block) {
8934
8968
  return;
8935
8969
  }
8936
- positionToUse = new roosterjs_editor_dom_1.Position(element, 0 /* Begin */);
8937
- }
8938
- if (positionToUse) {
8939
- editor.select(positionToUse);
8940
- editor.runAsync(function (aEditor) {
8941
- var elAfter = aEditor.getElementAtCursor();
8942
- removeDelimiterAttr(elAfter);
8943
- removeNode(element);
8944
- });
8945
- }
8970
+ var blockToCheck = isAfter ? block.nextSibling : block.previousSibling;
8971
+ if (blockToCheck && (0, roosterjs_editor_dom_1.safeInstanceOf)(blockToCheck, 'HTMLElement')) {
8972
+ var delimiters = blockToCheck.querySelectorAll(DELIMITER_SELECTOR);
8973
+ // Check if the last or first delimiter still contain the delimiter class and remove it.
8974
+ var delimiterToCheck = delimiters.item(isAfter ? 0 : delimiters.length - 1);
8975
+ removeDelimiterAttr(delimiterToCheck);
8976
+ }
8977
+ if (isEntityElement(entity)) {
8978
+ var nextElementSibling = entity.nextElementSibling, previousElementSibling = entity.previousElementSibling;
8979
+ [nextElementSibling, previousElementSibling].forEach(function (el) {
8980
+ // Check if after Enter the ZWS got removed but we still have a element with the class
8981
+ // Remove the attributes of the element if it is invalid now.
8982
+ if (el && (0, roosterjs_editor_dom_1.matchesSelector)(el, DELIMITER_SELECTOR) && !(0, roosterjs_editor_dom_1.getDelimiterFromElement)(el)) {
8983
+ removeDelimiterAttr(el, false /* checkEntity */);
8984
+ }
8985
+ });
8986
+ // Add delimiters to the entity if needed because on Enter we can sometimes lose the ZWS of the element.
8987
+ (0, roosterjs_editor_dom_1.addDelimiters)(entity);
8988
+ }
8989
+ });
8946
8990
  }
8947
8991
  var getPosition = function (container) {
8948
8992
  if (container && (0, roosterjs_editor_dom_1.getDelimiterFromElement)(container)) {
@@ -11503,7 +11547,7 @@ function insertDelimiter(element, delimiterClass) {
11503
11547
  var insertPosition = delimiterClass == "entityDelimiterAfter" /* DELIMITER_AFTER */ ? 'afterend' : 'beforebegin';
11504
11548
  element.insertAdjacentElement(insertPosition, span);
11505
11549
  }
11506
- return element;
11550
+ return span;
11507
11551
  }
11508
11552
 
11509
11553
 
@@ -21279,6 +21323,7 @@ exports.CursorFeatures = {
21279
21323
  Object.defineProperty(exports, "__esModule", { value: true });
21280
21324
  exports.EntityFeatures = void 0;
21281
21325
  var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
21326
+ var roosterjs_editor_dom_2 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
21282
21327
  /**
21283
21328
  * A content edit feature to trigger EntityOperation event with operation "Click" when user
21284
21329
  * clicks on a readonly entity.
@@ -21302,13 +21347,13 @@ var EscapeFromEntityFeature = {
21302
21347
  },
21303
21348
  };
21304
21349
  function cacheGetReadonlyEntityElement(event, editor, operation) {
21305
- var element = (0, roosterjs_editor_dom_1.cacheGetEventData)(event, 'READONLY_ENTITY_ELEMENT', function () {
21350
+ var element = (0, roosterjs_editor_dom_2.cacheGetEventData)(event, 'READONLY_ENTITY_ELEMENT', function () {
21306
21351
  var node = event.rawEvent.target;
21307
- var entityElement = node && editor.getElementAtCursor((0, roosterjs_editor_dom_1.getEntitySelector)(), node);
21352
+ var entityElement = node && editor.getElementAtCursor((0, roosterjs_editor_dom_2.getEntitySelector)(), node);
21308
21353
  return entityElement && !entityElement.isContentEditable ? entityElement : null;
21309
21354
  });
21310
21355
  if (element && operation !== undefined) {
21311
- var entity = (0, roosterjs_editor_dom_1.getEntityFromElement)(element);
21356
+ var entity = (0, roosterjs_editor_dom_2.getEntityFromElement)(element);
21312
21357
  if (entity) {
21313
21358
  editor.triggerPluginEvent(15 /* EntityOperation */, {
21314
21359
  operation: operation,
@@ -21337,7 +21382,7 @@ var EnterBeforeReadonlyEntityFeature = {
21337
21382
  if (!range) {
21338
21383
  return;
21339
21384
  }
21340
- var node = roosterjs_editor_dom_1.Position.getEnd(range).normalize().node;
21385
+ var node = roosterjs_editor_dom_2.Position.getEnd(range).normalize().node;
21341
21386
  var br = editor.getDocument().createElement('BR');
21342
21387
  (_a = node.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(br, node.nextSibling);
21343
21388
  var block = editor.getBlockElementAtNode(node);
@@ -21379,13 +21424,13 @@ var DeleteBeforeEntityFeature = {
21379
21424
  },
21380
21425
  };
21381
21426
  function cacheGetNeighborEntityElement(event, editor, isNext, collapseOnly, operation) {
21382
- var element = (0, roosterjs_editor_dom_1.cacheGetEventData)(event, 'NEIGHBOR_ENTITY_ELEMENT_' + isNext + '_' + collapseOnly, function () {
21427
+ var element = (0, roosterjs_editor_dom_2.cacheGetEventData)(event, 'NEIGHBOR_ENTITY_ELEMENT_' + isNext + '_' + collapseOnly, function () {
21383
21428
  var range = editor.getSelectionRange();
21384
21429
  if (!range || (collapseOnly && !range.collapsed)) {
21385
21430
  return null;
21386
21431
  }
21387
21432
  range.commonAncestorContainer.normalize();
21388
- var pos = roosterjs_editor_dom_1.Position.getEnd(range).normalize();
21433
+ var pos = roosterjs_editor_dom_2.Position.getEnd(range).normalize();
21389
21434
  var isAtBeginOrEnd = pos.offset == 0 || pos.isAtEnd;
21390
21435
  var entityNode = null;
21391
21436
  if (isAtBeginOrEnd) {
@@ -21404,12 +21449,12 @@ function cacheGetNeighborEntityElement(event, editor, isNext, collapseOnly, oper
21404
21449
  node = null;
21405
21450
  }
21406
21451
  }
21407
- entityNode = node && editor.getElementAtCursor((0, roosterjs_editor_dom_1.getEntitySelector)(), node);
21452
+ entityNode = node && editor.getElementAtCursor((0, roosterjs_editor_dom_2.getEntitySelector)(), node);
21408
21453
  }
21409
21454
  return entityNode;
21410
21455
  });
21411
21456
  if (element && operation !== undefined) {
21412
- var entity = (0, roosterjs_editor_dom_1.getEntityFromElement)(element);
21457
+ var entity = (0, roosterjs_editor_dom_2.getEntityFromElement)(element);
21413
21458
  if (entity) {
21414
21459
  triggerOperation(entity, editor, operation, event);
21415
21460
  }
@@ -21422,15 +21467,17 @@ function cacheGetNeighborEntityElement(event, editor, isNext, collapseOnly, oper
21422
21467
  */
21423
21468
  var MoveBetweenDelimitersFeature = {
21424
21469
  keys: [39 /* RIGHT */, 37 /* LEFT */],
21470
+ allowFunctionKeys: true,
21425
21471
  shouldHandleEvent: function (event, editor) {
21426
- if (!editor.isFeatureEnabled("InlineEntityReadOnlyDelimiters" /* InlineEntityReadOnlyDelimiters */)) {
21472
+ if (event.rawEvent.altKey ||
21473
+ !editor.isFeatureEnabled("InlineEntityReadOnlyDelimiters" /* InlineEntityReadOnlyDelimiters */)) {
21427
21474
  return false;
21428
21475
  }
21429
21476
  var element = editor.getElementAtCursor();
21430
21477
  if (!element) {
21431
21478
  return false;
21432
21479
  }
21433
- var isRTL = (0, roosterjs_editor_dom_1.getComputedStyle)(element, 'direction') === 'rtl';
21480
+ var isRTL = (0, roosterjs_editor_dom_2.getComputedStyle)(element, 'direction') === 'rtl';
21434
21481
  var shouldCheckBefore = isRTL == (event.rawEvent.which === 37 /* LEFT */);
21435
21482
  return getIsDelimiterAtCursor(event, editor, shouldCheckBefore);
21436
21483
  },
@@ -21440,8 +21487,8 @@ var MoveBetweenDelimitersFeature = {
21440
21487
  if (!delimiter) {
21441
21488
  return;
21442
21489
  }
21443
- var _a = getRelatedElements(delimiter, checkBefore), delimiterPair = _a.delimiterPair, entity = _a.entity;
21444
- if (delimiterPair && entity && (0, roosterjs_editor_dom_1.matchesSelector)(entity, (0, roosterjs_editor_dom_1.getEntitySelector)())) {
21490
+ var _a = getRelatedElements(delimiter, checkBefore, editor), delimiterPair = _a.delimiterPair, entity = _a.entity;
21491
+ if (delimiterPair && entity && (0, roosterjs_editor_dom_2.matchesSelector)(entity, (0, roosterjs_editor_dom_2.getEntitySelector)())) {
21445
21492
  event.rawEvent.preventDefault();
21446
21493
  editor.runAsync(function () {
21447
21494
  var positionType = checkBefore
@@ -21449,7 +21496,7 @@ var MoveBetweenDelimitersFeature = {
21449
21496
  ? -3 /* After */
21450
21497
  : -1 /* End */
21451
21498
  : -2 /* Before */;
21452
- var position = new roosterjs_editor_dom_1.Position(delimiterPair, positionType);
21499
+ var position = new roosterjs_editor_dom_2.Position(delimiterPair, positionType);
21453
21500
  if (event.rawEvent.shiftKey) {
21454
21501
  var selection = delimiterPair.ownerDocument.getSelection();
21455
21502
  selection === null || selection === void 0 ? void 0 : selection.extend(position.node, position.offset);
@@ -21503,51 +21550,65 @@ function getIsDelimiterAtCursor(event, editor, checkBefore) {
21503
21550
  : position.node == position.element
21504
21551
  ? position.element.childNodes.item(position.offset)
21505
21552
  : position.element;
21506
- var searcher = editor.getContentSearcherOfCursor(event);
21507
21553
  var data = checkBefore
21508
21554
  ? {
21509
21555
  class: "entityDelimiterBefore" /* DELIMITER_BEFORE */,
21510
21556
  pairClass: "entityDelimiterAfter" /* DELIMITER_AFTER */,
21511
- getDelimiterPair: function (element) { var _a; return (_a = element.nextElementSibling) === null || _a === void 0 ? void 0 : _a.nextElementSibling; },
21512
- getNextSibling: function () {
21513
- var _a;
21514
- return (_a = searcher === null || searcher === void 0 ? void 0 : searcher.getInlineElementAfter()) === null || _a === void 0 ? void 0 : _a.getContainerNode();
21515
- },
21516
21557
  isAtEndOrBeginning: position.isAtEnd,
21517
21558
  }
21518
21559
  : {
21519
21560
  class: "entityDelimiterAfter" /* DELIMITER_AFTER */,
21520
21561
  pairClass: "entityDelimiterBefore" /* DELIMITER_BEFORE */,
21521
- getDelimiterPair: function (element) { var _a; return (_a = element.previousElementSibling) === null || _a === void 0 ? void 0 : _a.previousElementSibling; },
21522
- getNextSibling: function () {
21523
- var _a;
21524
- return (_a = searcher === null || searcher === void 0 ? void 0 : searcher.getInlineElementBefore()) === null || _a === void 0 ? void 0 : _a.getContainerNode();
21525
- },
21526
21562
  isAtEndOrBeginning: position.offset == 0,
21527
21563
  };
21528
- var sibling = data.getNextSibling();
21564
+ var sibling = getNextSibling(editor, focusedElement, checkBefore);
21529
21565
  if (data.isAtEndOrBeginning && sibling) {
21530
21566
  var elAtCursor = editor.getElementAtCursor('.' + data.class, sibling);
21531
21567
  if (elAtCursor && !!shouldHandle(elAtCursor)) {
21532
21568
  return true;
21533
21569
  }
21534
21570
  }
21535
- var entityAtCursor = editor.getElementAtCursor('.' + data.class, focusedElement);
21571
+ var entityAtCursor = focusedElement && editor.getElementAtCursor('.' + data.class, focusedElement);
21536
21572
  return !!shouldHandle(entityAtCursor);
21537
21573
  function shouldHandle(element) {
21538
- var _a;
21539
- return (element &&
21540
- (((_a = data.getDelimiterPair(element)) === null || _a === void 0 ? void 0 : _a.className) || '').indexOf(data.pairClass) > -1 &&
21574
+ if (!element) {
21575
+ return false;
21576
+ }
21577
+ var delimiterPair = getRelatedElements(element, checkBefore, editor).delimiterPair;
21578
+ return (delimiterPair &&
21579
+ (delimiterPair.className || '').indexOf(data.pairClass) > -1 &&
21541
21580
  cacheDelimiter(event, checkBefore, element));
21542
21581
  }
21543
21582
  }
21583
+ function getNextSibling(editor, element, checkBefore) {
21584
+ var traverser = getBlockTraverser(editor, element);
21585
+ if (!traverser) {
21586
+ return undefined;
21587
+ }
21588
+ var traverseFn = function (t) {
21589
+ return checkBefore ? t.getNextInlineElement() : t.getPreviousInlineElement();
21590
+ };
21591
+ var currentInline = traverser.currentInlineElement;
21592
+ while (currentInline && currentInline.getContainerNode() === element) {
21593
+ currentInline = traverseFn(traverser);
21594
+ }
21595
+ return currentInline === null || currentInline === void 0 ? void 0 : currentInline.getContainerNode();
21596
+ }
21597
+ function getBlockTraverser(editor, element) {
21598
+ var _a;
21599
+ if (!element) {
21600
+ return undefined;
21601
+ }
21602
+ var blockElement = (_a = editor.getBlockElementAtNode(element)) === null || _a === void 0 ? void 0 : _a.getStartNode();
21603
+ return blockElement ? roosterjs_editor_dom_1.ContentTraverser.createBodyTraverser(blockElement, element) : undefined;
21604
+ }
21544
21605
  function cacheDelimiter(event, checkBefore, delimiter) {
21545
- return (0, roosterjs_editor_dom_1.cacheGetEventData)(event, 'delimiter_cache_key_' + checkBefore, function () { return delimiter; });
21606
+ return (0, roosterjs_editor_dom_2.cacheGetEventData)(event, 'delimiter_cache_key_' + checkBefore, function () { return delimiter; });
21546
21607
  }
21547
21608
  function cacheEntityBetweenDelimiter(event, editor, checkBefore, entity, operation) {
21548
- var element = (0, roosterjs_editor_dom_1.cacheGetEventData)(event, 'entity_delimiter_cache_key_' + checkBefore, function () { return entity && editor.getElementAtCursor((0, roosterjs_editor_dom_1.getEntitySelector)(), entity); });
21609
+ var element = (0, roosterjs_editor_dom_2.cacheGetEventData)(event, 'entity_delimiter_cache_key_' + checkBefore, function () { return entity && editor.getElementAtCursor((0, roosterjs_editor_dom_2.getEntitySelector)(), entity); });
21549
21610
  if (element && operation !== undefined) {
21550
- var entity_1 = (0, roosterjs_editor_dom_1.getEntityFromElement)(element);
21611
+ var entity_1 = (0, roosterjs_editor_dom_2.getEntityFromElement)(element);
21551
21612
  if (entity_1) {
21552
21613
  triggerOperation(entity_1, editor, operation, event);
21553
21614
  }
@@ -21562,7 +21623,7 @@ function triggerOperation(entity, editor, operation, event) {
21562
21623
  entity: entity,
21563
21624
  });
21564
21625
  if (entity.isReadonly &&
21565
- !(0, roosterjs_editor_dom_1.isBlockElement)(entity.wrapper) &&
21626
+ !(0, roosterjs_editor_dom_2.isBlockElement)(entity.wrapper) &&
21566
21627
  editor.isFeatureEnabled("InlineEntityReadOnlyDelimiters" /* InlineEntityReadOnlyDelimiters */)) {
21567
21628
  if (event.rawEvent.defaultPrevented) {
21568
21629
  editor.runAsync(function () {
@@ -21570,41 +21631,58 @@ function triggerOperation(entity, editor, operation, event) {
21570
21631
  removeDelimiters(nextElementSibling, previousElementSibling);
21571
21632
  }
21572
21633
  else {
21573
- var delimiterAfter = (0, roosterjs_editor_dom_1.addDelimiters)(entity.wrapper)[0];
21634
+ var delimiterAfter = (0, roosterjs_editor_dom_2.addDelimiters)(entity.wrapper)[0];
21574
21635
  if (delimiterAfter) {
21575
21636
  editor.select(delimiterAfter, -3 /* After */);
21576
21637
  }
21577
21638
  }
21578
21639
  });
21579
21640
  }
21580
- else if ((0, roosterjs_editor_dom_1.getDelimiterFromElement)(nextElementSibling) &&
21581
- (0, roosterjs_editor_dom_1.getDelimiterFromElement)(previousElementSibling)) {
21582
- editor.select((0, roosterjs_editor_dom_1.createRange)(previousElementSibling, nextElementSibling));
21641
+ else if ((0, roosterjs_editor_dom_2.getDelimiterFromElement)(nextElementSibling) &&
21642
+ (0, roosterjs_editor_dom_2.getDelimiterFromElement)(previousElementSibling)) {
21643
+ editor.select((0, roosterjs_editor_dom_2.createRange)(previousElementSibling, nextElementSibling));
21583
21644
  }
21584
21645
  }
21585
21646
  }
21586
21647
  function removeDelimiters(nextElementSibling, previousElementSibling) {
21587
21648
  [nextElementSibling, previousElementSibling].forEach(function (sibling) {
21588
21649
  var _a;
21589
- if ((0, roosterjs_editor_dom_1.getDelimiterFromElement)(sibling)) {
21650
+ if ((0, roosterjs_editor_dom_2.getDelimiterFromElement)(sibling)) {
21590
21651
  (_a = sibling === null || sibling === void 0 ? void 0 : sibling.parentElement) === null || _a === void 0 ? void 0 : _a.removeChild(sibling);
21591
21652
  }
21592
21653
  });
21593
21654
  }
21594
21655
  function cacheGetCheckBefore(event, checkBefore) {
21595
- return !!(0, roosterjs_editor_dom_1.cacheGetEventData)(event, 'Check_Before', function () { return checkBefore; });
21656
+ return !!(0, roosterjs_editor_dom_2.cacheGetEventData)(event, 'Check_Before', function () { return checkBefore; });
21596
21657
  }
21597
- function getRelatedElements(delimiter, checkBefore) {
21598
- var _a, _b;
21599
- var entity;
21600
- var delimiterPair;
21601
- if (checkBefore) {
21602
- entity = delimiter.nextElementSibling;
21603
- delimiterPair = (_a = entity === null || entity === void 0 ? void 0 : entity.nextElementSibling) !== null && _a !== void 0 ? _a : null;
21658
+ function getRelatedElements(delimiter, checkBefore, editor) {
21659
+ var entity = null;
21660
+ var delimiterPair = null;
21661
+ var traverser = getBlockTraverser(editor, delimiter);
21662
+ if (!traverser) {
21663
+ return { delimiterPair: delimiterPair, entity: entity };
21604
21664
  }
21605
- else {
21606
- entity = delimiter.previousElementSibling;
21607
- delimiterPair = (_b = entity === null || entity === void 0 ? void 0 : entity.previousElementSibling) !== null && _b !== void 0 ? _b : null;
21665
+ var selector = "." + (checkBefore ? "entityDelimiterAfter" /* DELIMITER_AFTER */ : "entityDelimiterBefore" /* DELIMITER_BEFORE */);
21666
+ var traverseFn = function (t) {
21667
+ return checkBefore ? t.getNextInlineElement() : t.getPreviousInlineElement();
21668
+ };
21669
+ var getElementFromInline = function (element, selector) {
21670
+ var _a;
21671
+ var node = element === null || element === void 0 ? void 0 : element.getContainerNode();
21672
+ return (_a = (node && editor.getElementAtCursor(selector, node))) !== null && _a !== void 0 ? _a : null;
21673
+ };
21674
+ var entitySelector = (0, roosterjs_editor_dom_2.getEntitySelector)();
21675
+ var current = traverser.currentInlineElement;
21676
+ while (current && (!entity || !delimiterPair)) {
21677
+ entity = entity || getElementFromInline(current, entitySelector);
21678
+ delimiterPair = delimiterPair || getElementFromInline(current, selector);
21679
+ // If we found the entity but the next inline after the entity is not a delimiter,
21680
+ // it means that the delimiter pair got removed or is invalid, return null instead.
21681
+ if (entity && !delimiterPair && !getElementFromInline(current, entitySelector)) {
21682
+ delimiterPair = null;
21683
+ break;
21684
+ }
21685
+ current = traverseFn(traverser);
21608
21686
  }
21609
21687
  return { entity: entity, delimiterPair: delimiterPair };
21610
21688
  }
@@ -21664,21 +21742,19 @@ var handleIndentationEvent = function (indenting) { return function (event, edit
21664
21742
  * IndentWhenTab edit feature, provides the ability to indent current list when user press TAB
21665
21743
  */
21666
21744
  var IndentWhenTab = {
21667
- keys: [9 /* TAB */, 39 /* RIGHT */],
21745
+ keys: roosterjs_editor_dom_1.Browser.isMac ? [9 /* TAB */] : [9 /* TAB */, 39 /* RIGHT */],
21668
21746
  shouldHandleEvent: shouldHandleIndentationEvent(true),
21669
21747
  handleEvent: handleIndentationEvent(true),
21670
21748
  allowFunctionKeys: true,
21671
- defaultDisabled: roosterjs_editor_dom_1.Browser.isMac,
21672
21749
  };
21673
21750
  /**
21674
21751
  * OutdentWhenShiftTab edit feature, provides the ability to outdent current list when user press Shift+TAB
21675
21752
  */
21676
21753
  var OutdentWhenShiftTab = {
21677
- keys: [9 /* TAB */, 37 /* LEFT */],
21754
+ keys: roosterjs_editor_dom_1.Browser.isMac ? [9 /* TAB */] : [9 /* TAB */, 37 /* LEFT */],
21678
21755
  shouldHandleEvent: shouldHandleIndentationEvent(false),
21679
21756
  handleEvent: handleIndentationEvent(false),
21680
21757
  allowFunctionKeys: true,
21681
- defaultDisabled: roosterjs_editor_dom_1.Browser.isMac,
21682
21758
  };
21683
21759
  /**
21684
21760
  * MergeInNewLine edit feature, provides the ability to merge current line into a new line when user press
@@ -23832,12 +23908,8 @@ var ImageEdit = /** @class */ (function () {
23832
23908
  * Remove the temp wrapper of the image
23833
23909
  */
23834
23910
  this.removeWrapper = function () {
23835
- if (_this.editor &&
23836
- _this.image &&
23837
- _this.image.parentNode &&
23838
- _this.editor.contains(_this.image) &&
23839
- _this.wrapper) {
23840
- (0, roosterjs_editor_dom_1.unwrap)(_this.image.parentNode);
23911
+ if (_this.shadowSpan) {
23912
+ (0, roosterjs_editor_dom_1.unwrap)(_this.shadowSpan);
23841
23913
  }
23842
23914
  _this.wrapper = null;
23843
23915
  _this.shadowSpan = null;
@@ -23905,7 +23977,7 @@ var ImageEdit = /** @class */ (function () {
23905
23977
  }
23906
23978
  var viewport = (_b = _this.editor) === null || _b === void 0 ? void 0 : _b.getVisibleViewport();
23907
23979
  if (rotateHandle && rotateCenter && viewport) {
23908
- (0, Rotator_1.updateRotateHandlePosition)(_this.editInfo, viewport, marginVertical, rotateCenter, rotateHandle);
23980
+ (0, Rotator_1.updateRotateHandlePosition)(viewport, rotateCenter, rotateHandle);
23909
23981
  }
23910
23982
  updateHandleCursor(resizeHandles, angleRad);
23911
23983
  }
@@ -24048,6 +24120,54 @@ var ImageEdit = /** @class */ (function () {
24048
24120
  this.editor.select(this.image);
24049
24121
  }
24050
24122
  };
24123
+ /**
24124
+ * Flip the image.
24125
+ * @param image The image to be flipped
24126
+ * @param direction
24127
+ */
24128
+ ImageEdit.prototype.flipImage = function (image, direction) {
24129
+ var _a;
24130
+ this.image = image;
24131
+ this.editInfo = (0, editInfo_1.getEditInfoFromImage)(image);
24132
+ var angleRad = this.editInfo.angleRad;
24133
+ var isInVerticalPostion = (angleRad >= Math.PI / 2 && angleRad < (3 * Math.PI) / 4) ||
24134
+ (angleRad <= -Math.PI / 2 && angleRad > (-3 * Math.PI) / 4);
24135
+ if (isInVerticalPostion) {
24136
+ if (direction === 'horizontal') {
24137
+ this.editInfo.flippedVertical = !this.editInfo.flippedVertical;
24138
+ }
24139
+ else {
24140
+ this.editInfo.flippedHorizontal = !this.editInfo.flippedHorizontal;
24141
+ }
24142
+ }
24143
+ else {
24144
+ if (direction === 'vertical') {
24145
+ this.editInfo.flippedVertical = !this.editInfo.flippedVertical;
24146
+ }
24147
+ else {
24148
+ this.editInfo.flippedHorizontal = !this.editInfo.flippedHorizontal;
24149
+ }
24150
+ }
24151
+ this.createWrapper(4 /* Rotate */);
24152
+ this.updateWrapper();
24153
+ this.setEditingImage(null);
24154
+ (_a = this.editor) === null || _a === void 0 ? void 0 : _a.select(image);
24155
+ };
24156
+ /**
24157
+ * Rotate the image in radian angle.
24158
+ * @param image The image to be rotated
24159
+ * @param angleRad The angle in radian that the image must be rotated.
24160
+ */
24161
+ ImageEdit.prototype.rotateImage = function (image, angleRad) {
24162
+ var _a;
24163
+ this.image = image;
24164
+ this.editInfo = (0, editInfo_1.getEditInfoFromImage)(image);
24165
+ this.editInfo.angleRad = this.editInfo.angleRad + angleRad;
24166
+ this.createWrapper(4 /* Rotate */);
24167
+ this.updateWrapper();
24168
+ this.setEditingImage(null);
24169
+ (_a = this.editor) === null || _a === void 0 ? void 0 : _a.select(image);
24170
+ };
24051
24171
  /**
24052
24172
  * Create editing wrapper for the image
24053
24173
  */
@@ -24066,6 +24186,7 @@ var ImageEdit = /** @class */ (function () {
24066
24186
  // Set image src to original src to help show editing UI, also it will be used when regenerate image dataURL after editing
24067
24187
  if (this.clonedImage) {
24068
24188
  this.clonedImage.src = this.editInfo.src;
24189
+ setFlipped(this.clonedImage, this.editInfo.flippedHorizontal, this.editInfo.flippedVertical);
24069
24190
  this.clonedImage.style.position = 'absolute';
24070
24191
  }
24071
24192
  // Get HTML for all edit elements (resize handle, rotate handle, crop handle and overlay, ...) and create HTML element
@@ -24223,6 +24344,9 @@ function getColorString(color, isDarkMode) {
24223
24344
  }
24224
24345
  return isDarkMode ? color.darkModeColor.trim() : color.lightModeColor.trim();
24225
24346
  }
24347
+ function setFlipped(element, flipppedHorizontally, flipppedVertically) {
24348
+ element.style.transform = "scale(" + (flipppedHorizontally ? '-1' : '1') + ", " + (flipppedVertically ? '-1' : '1') + ")";
24349
+ }
24226
24350
 
24227
24351
 
24228
24352
  /***/ }),
@@ -24509,13 +24633,18 @@ function checkEditInfoState(editInfo, compareTo) {
24509
24633
  if (!editInfo || !editInfo.src || ALL_KEYS.some(function (key) { return !isNumber(editInfo[key]); })) {
24510
24634
  return 0 /* Invalid */;
24511
24635
  }
24512
- else if (ROTATE_CROP_KEYS.every(function (key) { return areSameNumber(editInfo[key], 0); })) {
24636
+ else if (ROTATE_CROP_KEYS.every(function (key) { return areSameNumber(editInfo[key], 0); }) &&
24637
+ !editInfo.flippedHorizontal &&
24638
+ !editInfo.flippedVertical &&
24639
+ (!compareTo || (compareTo && editInfo.angleRad === compareTo.angleRad))) {
24513
24640
  return 1 /* ResizeOnly */;
24514
24641
  }
24515
24642
  else if (compareTo &&
24516
24643
  ROTATE_KEYS.every(function (key) { return areSameNumber(editInfo[key], 0); }) &&
24517
24644
  ROTATE_KEYS.every(function (key) { return areSameNumber(compareTo[key], 0); }) &&
24518
- CROP_KEYS.every(function (key) { return areSameNumber(editInfo[key], compareTo[key]); })) {
24645
+ CROP_KEYS.every(function (key) { return areSameNumber(editInfo[key], compareTo[key]); }) &&
24646
+ compareTo.flippedHorizontal === editInfo.flippedHorizontal &&
24647
+ compareTo.flippedVertical === editInfo.flippedVertical) {
24519
24648
  return 2 /* SameWithLast */;
24520
24649
  }
24521
24650
  else {
@@ -24636,6 +24765,7 @@ function generateDataURL(image, editInfo) {
24636
24765
  if (context) {
24637
24766
  context.translate(targetWidth / 2, targetHeight / 2);
24638
24767
  context.rotate(angle);
24768
+ context.scale(editInfo.flippedHorizontal ? -1 : 1, editInfo.flippedVertical ? -1 : 1);
24639
24769
  context.drawImage(image, naturalWidth * left, naturalHeight * top, imageWidth, imageHeight, -width / 2, -height / 2, width, height);
24640
24770
  }
24641
24771
  return canvas.toDataURL('image/png', 1.0);
@@ -25141,15 +25271,26 @@ exports.Rotator = {
25141
25271
  * Move rotate handle. When image is very close to the border of editor, rotate handle may not be visible.
25142
25272
  * Fix it by reduce the distance from image to rotate handle
25143
25273
  */
25144
- function updateRotateHandlePosition(editInfo, editorRect, marginVertical, rotateCenter, rotateHandle) {
25274
+ function updateRotateHandlePosition(editorRect, rotateCenter, rotateHandle) {
25145
25275
  var rotateHandleRect = rotateHandle.getBoundingClientRect();
25146
25276
  if (rotateHandleRect) {
25147
25277
  var top_1 = rotateHandleRect.top - editorRect.top;
25148
- var angleRad = editInfo.angleRad, heightPx = editInfo.heightPx;
25149
- var cosAngle = Math.cos(angleRad);
25150
- var adjustedDistance = cosAngle <= 0
25151
- ? Number.MAX_SAFE_INTEGER
25152
- : (top_1 + heightPx / 2 + marginVertical) / cosAngle - heightPx / 2;
25278
+ var left = rotateHandleRect.left - editorRect.left;
25279
+ var right = rotateHandleRect.right - editorRect.right;
25280
+ var bottom = rotateHandleRect.bottom - editorRect.bottom;
25281
+ var adjustedDistance = Number.MAX_SAFE_INTEGER;
25282
+ if (top_1 <= 0) {
25283
+ adjustedDistance = top_1;
25284
+ }
25285
+ else if (left <= 0) {
25286
+ adjustedDistance = left;
25287
+ }
25288
+ else if (right >= 0) {
25289
+ adjustedDistance = right;
25290
+ }
25291
+ else if (bottom >= 0) {
25292
+ adjustedDistance = bottom;
25293
+ }
25153
25294
  var rotateGap = Math.max(Math.min(ROTATE_GAP, adjustedDistance), 0);
25154
25295
  var rotateTop = Math.max(Math.min(ROTATE_SIZE, adjustedDistance - rotateGap), 0);
25155
25296
  rotateCenter.style.top = -rotateGap + 'px';
@@ -25671,7 +25812,8 @@ function checkAndAddBr(root, block, isFirst, firstBlock) {
25671
25812
  // If the first block and the last block are Siblings, add a BR before so the only two
25672
25813
  // lines that are being pasted are not merged.
25673
25814
  var previousSibling = (0, roosterjs_editor_dom_1.getPreviousLeafSibling)(root, block.start);
25674
- if (firstBlock.end.contains(previousSibling)) {
25815
+ if (firstBlock.end.contains(previousSibling) &&
25816
+ !(0, roosterjs_editor_dom_1.findClosestElementAncestor)(block.start, root, 'li')) {
25675
25817
  var br = (_c = block.start.ownerDocument) === null || _c === void 0 ? void 0 : _c.createElement('br');
25676
25818
  if (br) {
25677
25819
  (_d = block.start.parentNode) === null || _d === void 0 ? void 0 : _d.insertBefore(br, block.start);