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