roosterjs 9.46.0 → 9.48.0

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.
@@ -11683,17 +11683,18 @@ var CachePlugin = /** @class */ (function () {
11683
11683
  if (contentModel) {
11684
11684
  (0, updateCache_1.updateCache)(this.state, contentModel, selection);
11685
11685
  }
11686
- else {
11687
- this.invalidateCache();
11688
- }
11689
11686
  break;
11690
11687
  }
11691
11688
  };
11692
11689
  CachePlugin.prototype.invalidateCache = function () {
11693
11690
  var _a, _b;
11694
11691
  if (!((_a = this.editor) === null || _a === void 0 ? void 0 : _a.isInShadowEdit())) {
11695
- this.state.cachedModel = undefined;
11696
- this.state.cachedSelection = undefined;
11692
+ if (this.state.cachedModel) {
11693
+ this.state.cachedModel = undefined;
11694
+ }
11695
+ if (this.state.cachedSelection) {
11696
+ this.state.cachedSelection = undefined;
11697
+ }
11697
11698
  // Clear paragraph indexer to prevent stale references to old paragraphs
11698
11699
  // It will be rebuild next time when we create a new Content Model
11699
11700
  (_b = this.state.paragraphMap) === null || _b === void 0 ? void 0 : _b.clear();
@@ -12427,7 +12428,8 @@ var TextMutationObserverImpl = /** @class */ (function () {
12427
12428
  continue;
12428
12429
  }
12429
12430
  else if (!includedNodes.has(target)) {
12430
- if ((0, roosterjs_content_model_dom_1.findClosestEntityWrapper)(target, _this.domHelper) ||
12431
+ if (!_this.domHelper.isNodeInEditor(target) ||
12432
+ (0, roosterjs_content_model_dom_1.findClosestEntityWrapper)(target, _this.domHelper) ||
12431
12433
  (0, roosterjs_content_model_dom_1.findClosestBlockEntityContainer)(target, _this.domHelper)) {
12432
12434
  ignoredNodes.add(target);
12433
12435
  continue;
@@ -14760,7 +14762,9 @@ var SelectionPlugin = /** @class */ (function () {
14760
14762
  rawEvent.preventDefault();
14761
14763
  }
14762
14764
  else {
14763
- win === null || win === void 0 ? void 0 : win.requestAnimationFrame(function () { return _this.handleSelectionInTable(key); });
14765
+ win === null || win === void 0 ? void 0 : win.requestAnimationFrame(function () {
14766
+ return _this.handleSelectionInTable(key, selection.range);
14767
+ });
14764
14768
  }
14765
14769
  }
14766
14770
  }
@@ -14809,7 +14813,7 @@ var SelectionPlugin = /** @class */ (function () {
14809
14813
  SelectionPlugin.prototype.getTabKey = function (rawEvent) {
14810
14814
  return rawEvent.shiftKey ? 'TabLeft' : 'TabRight';
14811
14815
  };
14812
- SelectionPlugin.prototype.handleSelectionInTable = function (key) {
14816
+ SelectionPlugin.prototype.handleSelectionInTable = function (key, rangeBeforeChange) {
14813
14817
  var _a, _b, _c, _d, _e, _f;
14814
14818
  if (!this.editor || !this.state.tableSelection) {
14815
14819
  return;
@@ -14843,7 +14847,15 @@ var SelectionPlugin = /** @class */ (function () {
14843
14847
  }
14844
14848
  }
14845
14849
  if (collapsed && td) {
14846
- this.setRangeSelectionInTable(td, key == Up ? td.childNodes.length : 0, this.editor);
14850
+ var textOffset = (key == 'ArrowUp' || key == 'ArrowDown') && rangeBeforeChange
14851
+ ? this.getTextOffset(this.editor, rangeBeforeChange, td, key == 'ArrowUp')
14852
+ : null;
14853
+ if (textOffset) {
14854
+ this.setRangeSelectionInTable(textOffset.node, textOffset.offset, this.editor, false /* selectAll */);
14855
+ }
14856
+ else {
14857
+ this.setRangeSelectionInTable(td, 0, this.editor, false /* selectAll */);
14858
+ }
14847
14859
  }
14848
14860
  else if (!td && (lastCo.row == -1 || lastCo.row <= parsedTable.length)) {
14849
14861
  this.selectBeforeOrAfterElement(this.editor, table, change == 1 /* after */, change != 1 /* setSelectionInNextSiblingElement */);
@@ -14894,8 +14906,23 @@ var SelectionPlugin = /** @class */ (function () {
14894
14906
  }
14895
14907
  }
14896
14908
  };
14909
+ SelectionPlugin.prototype.getTextOffset = function (editor, range, td, isKeyUp) {
14910
+ var doc = editor.getDocument();
14911
+ var cursorRect = range
14912
+ ? (0, roosterjs_content_model_dom_1.getDOMInsertPointRect)(doc, {
14913
+ node: range.startContainer,
14914
+ offset: range.startOffset,
14915
+ })
14916
+ : undefined;
14917
+ var rect = td === null || td === void 0 ? void 0 : td.getBoundingClientRect();
14918
+ var textOffset = cursorRect && rect
14919
+ ? (0, roosterjs_content_model_dom_1.getNodePositionFromEvent)(doc, editor.getDOMHelper(), cursorRect.left, isKeyUp ? rect.top : rect.top + 1)
14920
+ : null;
14921
+ return textOffset;
14922
+ };
14897
14923
  SelectionPlugin.prototype.setRangeSelectionInTable = function (cell, nodeOffset, editor, selectAll) {
14898
- var range = editor.getDocument().createRange();
14924
+ var doc = editor.getDocument();
14925
+ var range = doc.createRange();
14899
14926
  if (selectAll && cell.firstChild && cell.lastChild) {
14900
14927
  var cellStart = cell.firstChild;
14901
14928
  var cellEnd = cell.lastChild;
@@ -19680,6 +19707,52 @@ function getAllowedCustomType(type, allowedCustomPasteType) {
19680
19707
  }
19681
19708
 
19682
19709
 
19710
+ /***/ },
19711
+
19712
+ /***/ "./packages/roosterjs-content-model-dom/lib/domUtils/event/getNodePositionFromEvent.ts"
19713
+ /*!*********************************************************************************************!*\
19714
+ !*** ./packages/roosterjs-content-model-dom/lib/domUtils/event/getNodePositionFromEvent.ts ***!
19715
+ \*********************************************************************************************/
19716
+ (__unused_webpack_module, exports) {
19717
+
19718
+ "use strict";
19719
+
19720
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
19721
+ exports.getNodePositionFromEvent = void 0;
19722
+ /**
19723
+ * Get insertion point from coordinate.
19724
+ * @param doc Parent document object
19725
+ * @param domHelper The DOM helper of the editor
19726
+ * @param x The cursor coordinate for the x-axis
19727
+ * @param y The cursor coordinate for the y-axis
19728
+ */
19729
+ function getNodePositionFromEvent(doc, domHelper, x, y) {
19730
+ if ('caretPositionFromPoint' in doc) {
19731
+ // Firefox, Chrome, Edge, Safari, Opera
19732
+ var pos = doc.caretPositionFromPoint(x, y);
19733
+ if (pos && domHelper.isNodeInEditor(pos.offsetNode)) {
19734
+ return { node: pos.offsetNode, offset: pos.offset };
19735
+ }
19736
+ }
19737
+ if (doc.caretRangeFromPoint) {
19738
+ // Safari
19739
+ var range = doc.caretRangeFromPoint(x, y);
19740
+ if (range && domHelper.isNodeInEditor(range.startContainer)) {
19741
+ return { node: range.startContainer, offset: range.startOffset };
19742
+ }
19743
+ }
19744
+ if (doc.elementFromPoint) {
19745
+ // Fallback
19746
+ var element = doc.elementFromPoint(x, y);
19747
+ if (element && domHelper.isNodeInEditor(element)) {
19748
+ return { node: element, offset: 0 };
19749
+ }
19750
+ }
19751
+ return null;
19752
+ }
19753
+ exports.getNodePositionFromEvent = getNodePositionFromEvent;
19754
+
19755
+
19683
19756
  /***/ },
19684
19757
 
19685
19758
  /***/ "./packages/roosterjs-content-model-dom/lib/domUtils/getObjectKeys.ts"
@@ -22082,13 +22155,15 @@ var styleBasedSegmentFormats = [
22082
22155
  'fontFamily',
22083
22156
  'fontSize',
22084
22157
  ];
22085
- var elementBasedSegmentFormats = [
22158
+ var sizeNeutralElementBasedSegmentFormats = [
22086
22159
  'strike',
22087
22160
  'underline',
22088
- 'superOrSubScript',
22089
22161
  'italic',
22090
22162
  'bold',
22091
22163
  ];
22164
+ var elementBasedSegmentFormats = (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(sizeNeutralElementBasedSegmentFormats), false), [
22165
+ 'superOrSubScript',
22166
+ ], false);
22092
22167
  var sharedBlockFormats = [
22093
22168
  'direction',
22094
22169
  'textAlign',
@@ -22112,7 +22187,8 @@ exports.defaultFormatKeysPerCategory = {
22112
22187
  listItemElement: (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(sharedBlockFormats), false), ['listItemAlign', 'margin', 'listStyle'], false),
22113
22188
  listLevel: ['direction', 'textAlign', 'margin', 'padding', 'listStyle', 'backgroundColor'],
22114
22189
  styleBasedSegment: (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(styleBasedSegmentFormats), false), ['textColor', 'backgroundColor', 'lineHeight'], false),
22115
- elementBasedSegment: elementBasedSegmentFormats,
22190
+ elementBasedSegment: sizeNeutralElementBasedSegmentFormats,
22191
+ superOrSubScript: ['superOrSubScript'],
22116
22192
  segment: (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(styleBasedSegmentFormats), false), (0, tslib_1.__read)(elementBasedSegmentFormats), false), [
22117
22193
  'textColor',
22118
22194
  'backgroundColor',
@@ -23510,8 +23586,8 @@ exports.shouldSetValue = shouldSetValue;
23510
23586
  Object.defineProperty(exports, "__esModule", ({ value: true }));
23511
23587
  exports.createImage = exports.createText = exports.createTableCell = exports.createTable = exports.createSelectionMarker = exports.createParagraph = exports.createFormatContainer = exports.createListItem = exports.createBr = exports.isLinkUndeletable = exports.setLinkUndeletable = exports.scrollRectIntoView = exports.normalizeRect = exports.isWhiteSpacePreserved = exports.reuseCachedElement = exports.findClosestBlockEntityContainer = exports.isBlockEntityContainer = exports.isEntityDelimiter = exports.addDelimiters = exports.generateEntityClassNames = exports.parseEntityFormat = exports.getAllEntityWrappers = exports.findClosestEntityWrapper = exports.isEntityElement = exports.unwrap = exports.wrap = exports.wrapAllChildNodes = exports.moveChildNodes = exports.toArray = exports.getSafeIdSelector = exports.getObjectKeys = exports.isElementOfType = exports.isNodeOfType = exports.hasMetadata = exports.getMetadata = exports.updateMetadata = exports.buildSelectionMarker = exports.isBlockElement = exports.areSameFormats = exports.parseFormat = exports.getRegularSelectionOffsets = exports.formatContainerProcessor = exports.tableProcessor = exports.entityProcessor = exports.processChildNode = exports.handleRegularSelection = exports.childProcessor = exports.contentModelToText = exports.contentModelToDom = exports.domToContentModel = void 0;
23512
23588
  exports.trimModelForSelection = exports.getDOMInsertPointRect = exports.getSelectionRootNode = exports.isBold = exports.createModelToDomConfig = exports.createModelToDomContextWithConfig = exports.createModelToDomContext = exports.createDomToModelConfig = exports.createDomToModelContextWithConfig = exports.createDomToModelContext = exports.defaultGenerateColorKey = exports.parseColor = exports.setColor = exports.getColor = exports.DeprecatedColors = exports.BorderKeys = exports.parseValueWithUnit = exports.getAutoListStyleType = exports.getOrderedListNumberStr = exports.ParagraphFormats = exports.ListFormatsToMove = exports.ListFormatsToKeep = exports.ListFormats = exports.copyFormat = exports.setParagraphNotImplicit = exports.normalizeSegmentFormat = exports.mergeTextSegments = exports.normalizeSingleSegment = exports.isEmpty = exports.addSegment = exports.unwrapBlock = exports.isGeneralSegment = exports.normalizeContentModel = exports.normalizeParagraph = exports.addTextSegment = exports.addLink = exports.addCode = exports.addBlock = exports.mutateSegment = exports.mutateSegments = exports.mutateBlock = exports.createTableRow = exports.createEmptyModel = exports.createListLevel = exports.createDivider = exports.createEntity = exports.createGeneralBlock = exports.createGeneralSegment = exports.createParagraphDecorator = exports.createContentModelDocument = void 0;
23513
- exports.updateImageMetadata = exports.runEditSteps = exports.getClosestAncestorBlockGroupIndex = exports.getSegmentTextFormat = exports.getListStyleTypeFromString = exports.retrieveModelFormatState = exports.setTableCellBackgroundColor = exports.MIN_ALLOWED_TABLE_CELL_HEIGHT = exports.MIN_ALLOWED_TABLE_CELL_WIDTH = exports.normalizeTable = exports.setFirstColumnFormatBorders = exports.applyTableFormat = exports.deleteBlock = exports.deleteSegment = exports.deleteSelection = exports.mergeModel = exports.cloneModel = exports.setSelection = exports.hasSelectionInBlockGroup = exports.hasSelectionInSegment = exports.hasSelectionInBlock = exports.getSelectedCells = exports.getSelectedSegmentsAndParagraphs = exports.getSelectedSegments = exports.getSelectedParagraphs = exports.getOperationalBlocks = exports.getFirstSelectedTable = exports.getFirstSelectedListItem = exports.iterateSelections = exports.isBlockGroupOfType = exports.getRangesByText = exports.getImageState = exports.setImageState = exports.getParagraphMarker = exports.setParagraphMarker = exports.cacheGetEventData = exports.extractClipboardItems = exports.normalizeFontFamily = exports.transformColor = exports.retrieveDocumentMetadata = exports.readFile = exports.parseTableCells = exports.normalizeText = exports.isSpace = exports.isPunctuation = exports.extractBorderValues = exports.combineBorderValue = exports.isCursorMovingKey = exports.isModifierKey = exports.isCharacterValue = void 0;
23514
- exports.EmptySegmentFormat = exports.UnorderedListStyleMap = exports.OrderedListStyleMap = exports.TableBorderFormat = exports.NumberingListType = exports.BulletListType = exports.ChangeSource = exports.ListMetadataDefinition = exports.getListMetadata = exports.updateListMetadata = exports.getTableMetadata = exports.updateTableMetadata = exports.getTableCellMetadata = exports.updateTableCellMetadata = exports.getImageMetadata = void 0;
23589
+ exports.runEditSteps = exports.getClosestAncestorBlockGroupIndex = exports.getSegmentTextFormat = exports.getListStyleTypeFromString = exports.retrieveModelFormatState = exports.setTableCellBackgroundColor = exports.MIN_ALLOWED_TABLE_CELL_HEIGHT = exports.MIN_ALLOWED_TABLE_CELL_WIDTH = exports.normalizeTable = exports.setFirstColumnFormatBorders = exports.applyTableFormat = exports.deleteBlock = exports.deleteSegment = exports.deleteSelection = exports.mergeModel = exports.cloneModel = exports.setSelection = exports.hasSelectionInBlockGroup = exports.hasSelectionInSegment = exports.hasSelectionInBlock = exports.getSelectedCells = exports.getSelectedSegmentsAndParagraphs = exports.getSelectedSegments = exports.getSelectedParagraphs = exports.getOperationalBlocks = exports.getFirstSelectedTable = exports.getFirstSelectedListItem = exports.iterateSelections = exports.isBlockGroupOfType = exports.getRangesByText = exports.getImageState = exports.setImageState = exports.getParagraphMarker = exports.setParagraphMarker = exports.cacheGetEventData = exports.extractClipboardItems = exports.normalizeFontFamily = exports.transformColor = exports.retrieveDocumentMetadata = exports.readFile = exports.parseTableCells = exports.normalizeText = exports.isSpace = exports.isPunctuation = exports.extractBorderValues = exports.combineBorderValue = exports.getNodePositionFromEvent = exports.isCursorMovingKey = exports.isModifierKey = exports.isCharacterValue = void 0;
23590
+ exports.EmptySegmentFormat = exports.UnorderedListStyleMap = exports.OrderedListStyleMap = exports.TableBorderFormat = exports.NumberingListType = exports.BulletListType = exports.ChangeSource = exports.ListMetadataDefinition = exports.getListMetadata = exports.updateListMetadata = exports.getTableMetadata = exports.updateTableMetadata = exports.getTableCellMetadata = exports.updateTableCellMetadata = exports.getImageMetadata = exports.updateImageMetadata = void 0;
23515
23591
  var domToContentModel_1 = __webpack_require__(/*! ./domToModel/domToContentModel */ "./packages/roosterjs-content-model-dom/lib/domToModel/domToContentModel.ts");
23516
23592
  Object.defineProperty(exports, "domToContentModel", ({ enumerable: true, get: function () { return domToContentModel_1.domToContentModel; } }));
23517
23593
  var contentModelToDom_1 = __webpack_require__(/*! ./modelToDom/contentModelToDom */ "./packages/roosterjs-content-model-dom/lib/modelToDom/contentModelToDom.ts");
@@ -23688,6 +23764,8 @@ var eventUtils_1 = __webpack_require__(/*! ./domUtils/event/eventUtils */ "./pac
23688
23764
  Object.defineProperty(exports, "isCharacterValue", ({ enumerable: true, get: function () { return eventUtils_1.isCharacterValue; } }));
23689
23765
  Object.defineProperty(exports, "isModifierKey", ({ enumerable: true, get: function () { return eventUtils_1.isModifierKey; } }));
23690
23766
  Object.defineProperty(exports, "isCursorMovingKey", ({ enumerable: true, get: function () { return eventUtils_1.isCursorMovingKey; } }));
23767
+ var getNodePositionFromEvent_1 = __webpack_require__(/*! ./domUtils/event/getNodePositionFromEvent */ "./packages/roosterjs-content-model-dom/lib/domUtils/event/getNodePositionFromEvent.ts");
23768
+ Object.defineProperty(exports, "getNodePositionFromEvent", ({ enumerable: true, get: function () { return getNodePositionFromEvent_1.getNodePositionFromEvent; } }));
23691
23769
  var borderValues_1 = __webpack_require__(/*! ./domUtils/style/borderValues */ "./packages/roosterjs-content-model-dom/lib/domUtils/style/borderValues.ts");
23692
23770
  Object.defineProperty(exports, "combineBorderValue", ({ enumerable: true, get: function () { return borderValues_1.combineBorderValue; } }));
23693
23771
  Object.defineProperty(exports, "extractBorderValues", ({ enumerable: true, get: function () { return borderValues_1.extractBorderValues; } }));
@@ -25456,7 +25534,7 @@ var BorderFormatters = (_a = {},
25456
25534
  * Apply vertical align, borders, and background color to all cells in the table
25457
25535
  */
25458
25536
  function formatCells(rows, format, metaOverrides) {
25459
- var hasBandedRows = format.hasBandedRows, hasBandedColumns = format.hasBandedColumns, bgColorOdd = format.bgColorOdd, bgColorEven = format.bgColorEven, hasFirstColumn = format.hasFirstColumn;
25537
+ var hasBandedRows = format.hasBandedRows, hasBandedColumns = format.hasBandedColumns, bgColorOdd = format.bgColorOdd, bgColorEven = format.bgColorEven, hasFirstColumn = format.hasFirstColumn, hasHeaderRow = format.hasHeaderRow;
25460
25538
  rows.forEach(function (row, rowIndex) {
25461
25539
  row.cells.forEach(function (readonlyCell, colIndex) {
25462
25540
  var _a;
@@ -25487,19 +25565,14 @@ function formatCells(rows, format, metaOverrides) {
25487
25565
  }
25488
25566
  // Format Background Color
25489
25567
  if (!metaOverrides.bgColorOverrides[rowIndex][colIndex]) {
25490
- var color = void 0;
25491
- if (hasFirstColumn && colIndex == 0 && rowIndex > 0) {
25492
- color = null;
25493
- }
25494
- else {
25495
- color =
25496
- hasBandedRows || hasBandedColumns
25497
- ? (hasBandedColumns && colIndex % 2 != 0) ||
25498
- (hasBandedRows && rowIndex % 2 != 0)
25499
- ? bgColorOdd
25500
- : bgColorEven
25501
- : bgColorEven; /* bgColorEven is the default color */
25502
- }
25568
+ var bandedColumnMod = hasFirstColumn ? 0 : 1;
25569
+ var bandedRowMod = hasHeaderRow ? 0 : 1;
25570
+ var color = hasBandedRows || hasBandedColumns
25571
+ ? (hasBandedColumns && colIndex % 2 != bandedColumnMod) ||
25572
+ (hasBandedRows && rowIndex % 2 != bandedRowMod)
25573
+ ? bgColorOdd
25574
+ : bgColorEven
25575
+ : bgColorEven; /* bgColorEven is the default color */
25503
25576
  (0, setTableCellBackgroundColor_1.setTableCellBackgroundColor)(cell, color, false /*isColorOverride*/, true /*applyToSegments*/);
25504
25577
  }
25505
25578
  // Format Vertical Align
@@ -25517,6 +25590,7 @@ function formatCells(rows, format, metaOverrides) {
25517
25590
  * @param format The table metadata format
25518
25591
  */
25519
25592
  function setFirstColumnFormatBorders(rows, format) {
25593
+ var customStyles = format.hasFirstColumn ? format.firstColumnCustomStyles : undefined;
25520
25594
  rows.forEach(function (row, rowIndex) {
25521
25595
  row.cells.forEach(function (readonlyCell, cellIndex) {
25522
25596
  var e_1, _a, e_2, _b;
@@ -25525,6 +25599,16 @@ function setFirstColumnFormatBorders(rows, format) {
25525
25599
  if (rowIndex == 0) {
25526
25600
  cell.isHeader = !!format.hasHeaderRow;
25527
25601
  }
25602
+ if (format.hasFirstColumn && customStyles) {
25603
+ setStyleIfDefined(cell.format, 'textAlign', customStyles.textAlign);
25604
+ setBorderColorIfExists(cell.format, 'borderTop', customStyles.borderTopColor);
25605
+ setBorderColorIfExists(cell.format, 'borderRight', customStyles.borderRightColor);
25606
+ setBorderColorIfExists(cell.format, 'borderBottom', customStyles.borderBottomColor);
25607
+ setBorderColorIfExists(cell.format, 'borderLeft', customStyles.borderLeftColor);
25608
+ if (customStyles.backgroundColor) {
25609
+ (0, setTableCellBackgroundColor_1.setTableCellBackgroundColor)(cell, customStyles.backgroundColor, false /*isColorOverride*/, true /*applyToSegments*/);
25610
+ }
25611
+ }
25528
25612
  try {
25529
25613
  for (var _c = (0, tslib_1.__values)(cell.blocks), _d = _c.next(); !_d.done; _d = _c.next()) {
25530
25614
  var block = _d.value;
@@ -25533,9 +25617,12 @@ function setFirstColumnFormatBorders(rows, format) {
25533
25617
  for (var _e = (e_2 = void 0, (0, tslib_1.__values)(block.segments)), _f = _e.next(); !_f.done; _f = _e.next()) {
25534
25618
  var segment = _f.value;
25535
25619
  (0, mutate_1.mutateSegment)(block, segment, function (cellSegment) {
25620
+ var _a, _b;
25536
25621
  if (format.hasFirstColumn) {
25537
- cellSegment.format.fontWeight = 'bold';
25538
- cell.format.fontWeight = 'bold';
25622
+ setStyleIfDefined(cellSegment.format, 'fontWeight', (_a = customStyles === null || customStyles === void 0 ? void 0 : customStyles.fontWeight) !== null && _a !== void 0 ? _a : 'bold');
25623
+ setStyleIfDefined(cell.format, 'textAlign', customStyles === null || customStyles === void 0 ? void 0 : customStyles.textAlign);
25624
+ setStyleIfDefined(cell.format, 'fontWeight', (_b = customStyles === null || customStyles === void 0 ? void 0 : customStyles.fontWeight) !== null && _b !== void 0 ? _b : 'bold');
25625
+ setStyleIfDefined(cellSegment.format, 'italic', customStyles === null || customStyles === void 0 ? void 0 : customStyles.italic);
25539
25626
  }
25540
25627
  else if (cellSegment.format.fontWeight == 'bold' &&
25541
25628
  cell.format.fontWeight == 'bold') {
@@ -25567,24 +25654,74 @@ function setFirstColumnFormatBorders(rows, format) {
25567
25654
  });
25568
25655
  }
25569
25656
  exports.setFirstColumnFormatBorders = setFirstColumnFormatBorders;
25657
+ function setBorderColorIfExists(format, key, value) {
25658
+ if (value !== undefined) {
25659
+ setBorderColor(format, key, value);
25660
+ }
25661
+ }
25662
+ function setStyleIfDefined(format, key, value) {
25663
+ if (value !== undefined) {
25664
+ format[key] = value;
25665
+ }
25666
+ }
25570
25667
  function setHeaderRowFormat(rows, format, metaOverrides) {
25571
25668
  var _a;
25572
- // Exit early if hasHeaderRow is not set
25573
25669
  if (!format.hasHeaderRow) {
25574
25670
  return;
25575
25671
  }
25576
25672
  var rowIndex = 0;
25673
+ var customStyles = format.headerRowCustomStyles;
25577
25674
  (_a = rows[rowIndex]) === null || _a === void 0 ? void 0 : _a.cells.forEach(function (readonlyCell, cellIndex) {
25675
+ var e_3, _a, e_4, _b;
25676
+ var _c, _d, _e, _f;
25578
25677
  var cell = (0, mutate_1.mutateBlock)(readonlyCell);
25579
25678
  cell.isHeader = true;
25580
- cell.format.fontWeight = 'bold';
25679
+ cell.format.fontWeight = (_c = customStyles === null || customStyles === void 0 ? void 0 : customStyles.fontWeight) !== null && _c !== void 0 ? _c : 'bold';
25581
25680
  if (format.headerRowColor) {
25582
25681
  if (!metaOverrides.bgColorOverrides[rowIndex][cellIndex]) {
25583
25682
  (0, setTableCellBackgroundColor_1.setTableCellBackgroundColor)(cell, format.headerRowColor, false /*isColorOverride*/, true /*applyToSegments*/);
25584
25683
  }
25585
- setBorderColor(cell.format, 'borderTop', format.headerRowColor);
25586
- setBorderColor(cell.format, 'borderRight', format.headerRowColor);
25587
- setBorderColor(cell.format, 'borderLeft', format.headerRowColor);
25684
+ setBorderColor(cell.format, 'borderTop', (_d = customStyles === null || customStyles === void 0 ? void 0 : customStyles.borderTopColor) !== null && _d !== void 0 ? _d : format.headerRowColor);
25685
+ setBorderColor(cell.format, 'borderRight', (_e = customStyles === null || customStyles === void 0 ? void 0 : customStyles.borderRightColor) !== null && _e !== void 0 ? _e : format.headerRowColor);
25686
+ setBorderColor(cell.format, 'borderLeft', (_f = customStyles === null || customStyles === void 0 ? void 0 : customStyles.borderLeftColor) !== null && _f !== void 0 ? _f : format.headerRowColor);
25687
+ }
25688
+ if (customStyles) {
25689
+ setStyleIfDefined(cell.format, 'textAlign', customStyles.textAlign);
25690
+ setBorderColorIfExists(cell.format, 'borderBottom', customStyles.borderBottomColor);
25691
+ try {
25692
+ for (var _g = (0, tslib_1.__values)(cell.blocks), _h = _g.next(); !_h.done; _h = _g.next()) {
25693
+ var block = _h.value;
25694
+ if (block.blockType == 'Paragraph') {
25695
+ try {
25696
+ for (var _j = (e_4 = void 0, (0, tslib_1.__values)(block.segments)), _k = _j.next(); !_k.done; _k = _j.next()) {
25697
+ var segment = _k.value;
25698
+ (0, mutate_1.mutateSegment)(block, segment, function (cellSegment) {
25699
+ if (customStyles.italic) {
25700
+ cellSegment.format.italic = customStyles.italic;
25701
+ }
25702
+ else if (cellSegment.format.italic) {
25703
+ delete cellSegment.format.italic;
25704
+ }
25705
+ });
25706
+ }
25707
+ }
25708
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
25709
+ finally {
25710
+ try {
25711
+ if (_k && !_k.done && (_b = _j.return)) _b.call(_j);
25712
+ }
25713
+ finally { if (e_4) throw e_4.error; }
25714
+ }
25715
+ }
25716
+ }
25717
+ }
25718
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
25719
+ finally {
25720
+ try {
25721
+ if (_h && !_h.done && (_a = _g.return)) _a.call(_g);
25722
+ }
25723
+ finally { if (e_3) throw e_3.error; }
25724
+ }
25588
25725
  }
25589
25726
  });
25590
25727
  }
@@ -26498,7 +26635,7 @@ function mergeParagraph(markerPosition, newPara, mergeToCurrentParagraph, contex
26498
26635
  }
26499
26636
  }
26500
26637
  function mergeTables(markerPosition, newTable, source) {
26501
- var _a, _b, _c, _d, _e;
26638
+ var _a, _b, _c, _d, _e, _f;
26502
26639
  var tableContext = markerPosition.tableContext, marker = markerPosition.marker;
26503
26640
  if (tableContext && source.blocks.length == 1 && source.blocks[0] == newTable) {
26504
26641
  var readonlyTable = tableContext.table, colIndex = tableContext.colIndex, rowIndex = tableContext.rowIndex;
@@ -26535,12 +26672,30 @@ function mergeTables(markerPosition, newTable, source) {
26535
26672
  }
26536
26673
  }
26537
26674
  }
26675
+ var logicalRowOffsets = [];
26676
+ var logicalRowCount = 0;
26677
+ for (var i = 0; i < newTableRowCount; i++) {
26678
+ logicalRowOffsets[i] = logicalRowCount;
26679
+ var row = newTable.rows[i];
26680
+ if (row && row.cells.some(function (cell) { return !cell.spanAbove; })) {
26681
+ logicalRowCount++;
26682
+ }
26683
+ }
26538
26684
  for (var i = 0; i < newTable.rows.length; i++) {
26539
- var targetRowIndex = getTargetRowIndex(table, rowIndex, i, colIndex);
26685
+ var sourceRow = newTable.rows[i];
26686
+ var targetRowIndex = getTargetRowIndex(table, rowIndex, logicalRowOffsets[i], colIndex);
26687
+ var logicalColOffsets = [];
26688
+ var logicalColCount = 0;
26689
+ for (var j = 0; j < sourceRow.cells.length; j++) {
26690
+ logicalColOffsets[j] = logicalColCount;
26691
+ if (!((_e = sourceRow.cells[j]) === null || _e === void 0 ? void 0 : _e.spanLeft)) {
26692
+ logicalColCount++;
26693
+ }
26694
+ }
26540
26695
  for (var j = 0; j < newTable.rows[i].cells.length; j++) {
26541
- var newCell = newTable.rows[i].cells[j];
26542
- var targetColIndex = getTargetColIndex(table, targetRowIndex, colIndex, j);
26543
- var oldCell = (_e = table.rows[targetRowIndex]) === null || _e === void 0 ? void 0 : _e.cells[targetColIndex];
26696
+ var newCell = sourceRow.cells[j];
26697
+ var targetColIndex = getTargetColIndex(table, targetRowIndex, colIndex, logicalColOffsets[j]);
26698
+ var oldCell = (_f = table.rows[targetRowIndex]) === null || _f === void 0 ? void 0 : _f.cells[targetColIndex];
26544
26699
  table.rows[targetRowIndex].cells[targetColIndex] = newCell;
26545
26700
  if (i == 0 && j == 0) {
26546
26701
  var newMarker = (0, createSelectionMarker_1.createSelectionMarker)(marker.format);
@@ -27779,14 +27934,28 @@ var updateMetadata_1 = __webpack_require__(/*! ./updateMetadata */ "./packages/r
27779
27934
  var TableBorderFormat_1 = __webpack_require__(/*! ../../constants/TableBorderFormat */ "./packages/roosterjs-content-model-dom/lib/constants/TableBorderFormat.ts");
27780
27935
  var definitionCreators_1 = __webpack_require__(/*! ./definitionCreators */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/definitionCreators.ts");
27781
27936
  var NullStringDefinition = (0, definitionCreators_1.createStringDefinition)(false /** isOptional */, undefined /** value */, true /** allowNull */);
27937
+ var OptionalStringDefinition = (0, definitionCreators_1.createStringDefinition)(true /** isOptional */);
27938
+ var OptionalBooleanDefinition = (0, definitionCreators_1.createBooleanDefinition)(true /** isOptional */);
27782
27939
  var BooleanDefinition = (0, definitionCreators_1.createBooleanDefinition)(false /** isOptional */);
27940
+ var TableSpecialCellFormatDefinition = (0, definitionCreators_1.createObjectDefinition)({
27941
+ fontWeight: OptionalStringDefinition,
27942
+ italic: OptionalBooleanDefinition,
27943
+ borderTopColor: OptionalStringDefinition,
27944
+ borderRightColor: OptionalStringDefinition,
27945
+ borderBottomColor: OptionalStringDefinition,
27946
+ borderLeftColor: OptionalStringDefinition,
27947
+ textAlign: OptionalStringDefinition,
27948
+ backgroundColor: OptionalStringDefinition,
27949
+ }, true /* isOptional */, true /** allowNull */);
27783
27950
  var TableFormatDefinition = (0, definitionCreators_1.createObjectDefinition)({
27784
27951
  topBorderColor: NullStringDefinition,
27785
27952
  bottomBorderColor: NullStringDefinition,
27786
27953
  verticalBorderColor: NullStringDefinition,
27787
27954
  hasHeaderRow: BooleanDefinition,
27788
27955
  headerRowColor: NullStringDefinition,
27956
+ headerRowCustomStyles: TableSpecialCellFormatDefinition,
27789
27957
  hasFirstColumn: BooleanDefinition,
27958
+ firstColumnCustomStyles: TableSpecialCellFormatDefinition,
27790
27959
  hasBandedColumns: BooleanDefinition,
27791
27960
  hasBandedRows: BooleanDefinition,
27792
27961
  bgColorEven: NullStringDefinition,
@@ -29513,23 +29682,40 @@ var handleParagraph = function (doc, parent, paragraph, context, refNode) {
29513
29682
  segment: null,
29514
29683
  };
29515
29684
  var handleSegments = function () {
29685
+ var e_1, _a;
29686
+ var _b;
29516
29687
  var parent = container;
29517
29688
  if (parent) {
29518
29689
  var firstSegment = paragraph.segments[0];
29690
+ var segmentContext = context;
29519
29691
  if ((firstSegment === null || firstSegment === void 0 ? void 0 : firstSegment.segmentType) == 'SelectionMarker') {
29520
29692
  // Make sure there is a segment created before selection marker.
29521
29693
  // If selection marker is the first selected segment in a paragraph, create a dummy text node,
29522
29694
  // so after rewrite, the regularSelection object can have a valid segment object set to the text node.
29523
- context.modelHandlers.text(doc, parent, (0, tslib_1.__assign)((0, tslib_1.__assign)({}, firstSegment), { segmentType: 'Text', text: '' }), context, []);
29695
+ context.modelHandlers.text(doc, parent, (0, tslib_1.__assign)((0, tslib_1.__assign)({}, firstSegment), { segmentType: 'Text', text: '' }), segmentContext, []);
29524
29696
  }
29525
- paragraph.segments.forEach(function (segment) {
29697
+ for (var i = 0; i < paragraph.segments.length; i++) {
29698
+ var segment = paragraph.segments[i];
29699
+ segmentContext.noFollowingTextSegmentOrLast =
29700
+ i === paragraph.segments.length - 1 ||
29701
+ !hasTextSegmentAfter(paragraph.segments, i);
29526
29702
  var newSegments = [];
29527
- context.modelHandlers.segment(doc, parent, segment, context, newSegments);
29528
- newSegments.forEach(function (node) {
29529
- var _a;
29530
- (_a = context.domIndexer) === null || _a === void 0 ? void 0 : _a.onSegment(node, paragraph, [segment]);
29531
- });
29532
- });
29703
+ context.modelHandlers.segment(doc, parent, segment, segmentContext, newSegments);
29704
+ try {
29705
+ for (var newSegments_1 = (e_1 = void 0, (0, tslib_1.__values)(newSegments)), newSegments_1_1 = newSegments_1.next(); !newSegments_1_1.done; newSegments_1_1 = newSegments_1.next()) {
29706
+ var node = newSegments_1_1.value;
29707
+ (_b = context.domIndexer) === null || _b === void 0 ? void 0 : _b.onSegment(node, paragraph, [segment]);
29708
+ }
29709
+ }
29710
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
29711
+ finally {
29712
+ try {
29713
+ if (newSegments_1_1 && !newSegments_1_1.done && (_a = newSegments_1.return)) _a.call(newSegments_1);
29714
+ }
29715
+ finally { if (e_1) throw e_1.error; }
29716
+ }
29717
+ }
29718
+ delete segmentContext.noFollowingTextSegmentOrLast;
29533
29719
  }
29534
29720
  };
29535
29721
  if (needParagraphWrapper) {
@@ -29569,6 +29755,21 @@ var handleParagraph = function (doc, parent, paragraph, context, refNode) {
29569
29755
  return refNode;
29570
29756
  };
29571
29757
  exports.handleParagraph = handleParagraph;
29758
+ function hasTextSegmentAfter(segments, index) {
29759
+ for (var i = index + 1; i < segments.length; i++) {
29760
+ var type = segments[i].segmentType;
29761
+ if (type === 'SelectionMarker') {
29762
+ continue;
29763
+ }
29764
+ if (type === 'Text') {
29765
+ return true;
29766
+ }
29767
+ else {
29768
+ return false;
29769
+ }
29770
+ }
29771
+ return false;
29772
+ }
29572
29773
 
29573
29774
 
29574
29775
  /***/ },
@@ -29809,11 +30010,15 @@ exports.handleTable = handleTable;
29809
30010
  Object.defineProperty(exports, "__esModule", ({ value: true }));
29810
30011
  exports.handleText = void 0;
29811
30012
  var handleSegmentCommon_1 = __webpack_require__(/*! ../utils/handleSegmentCommon */ "./packages/roosterjs-content-model-dom/lib/modelToDom/utils/handleSegmentCommon.ts");
30013
+ var nonBreakingSpace = '\u00A0';
29812
30014
  /**
29813
30015
  * @internal
29814
30016
  */
29815
30017
  var handleText = function (doc, parent, segment, context, segmentNodes) {
29816
- var txt = doc.createTextNode(segment.text);
30018
+ var textContent = context.noFollowingTextSegmentOrLast && segment.text.endsWith(' ')
30019
+ ? segment.text.slice(0, -1) + nonBreakingSpace
30020
+ : segment.text;
30021
+ var txt = doc.createTextNode(textContent);
29817
30022
  var element = doc.createElement('span');
29818
30023
  parent.appendChild(element);
29819
30024
  element.appendChild(txt);
@@ -30099,8 +30304,9 @@ function handleSegmentCommon(doc, segmentNode, containerNode, segment, context,
30099
30304
  }
30100
30305
  (0, applyFormat_1.applyFormat)(containerNode, context.formatAppliers.styleBasedSegment, segment.format, context);
30101
30306
  segmentNodes === null || segmentNodes === void 0 ? void 0 : segmentNodes.push(segmentNode);
30102
- context.modelHandlers.segmentDecorator(doc, containerNode, segment, context, segmentNodes);
30103
30307
  (0, applyFormat_1.applyFormat)(containerNode, context.formatAppliers.elementBasedSegment, segment.format, context);
30308
+ context.modelHandlers.segmentDecorator(doc, containerNode, segment, context, segmentNodes);
30309
+ (0, applyFormat_1.applyFormat)(containerNode, context.formatAppliers.superOrSubScript, segment.format, context);
30104
30310
  (_a = context.onNodeCreated) === null || _a === void 0 ? void 0 : _a.call(context, segment, segmentNode);
30105
30311
  }
30106
30312
  exports.handleSegmentCommon = handleSegmentCommon;
@@ -36315,7 +36521,7 @@ var ImageEditPlugin = /** @class */ (function () {
36315
36521
  operation === 'crop');
36316
36522
  };
36317
36523
  ImageEditPlugin.prototype.canRegenerateImage = function (image) {
36318
- return (0, canRegenerateImage_1.canRegenerateImage)(image);
36524
+ return (0, canRegenerateImage_1.canRegenerateImage)(image, this.options.resolveImageSource);
36319
36525
  };
36320
36526
  ImageEditPlugin.prototype.startCropMode = function (editor, image, isRTL) {
36321
36527
  var _this = this;
@@ -37076,12 +37282,21 @@ exports.canRegenerateImage = void 0;
37076
37282
  * Check if we can regenerate edited image from the source image.
37077
37283
  * An image can't regenerate result when there is CORS issue of the source content.
37078
37284
  * @param img The image element to test
37285
+ * @param resolveImageSource Optional callback to resolve an image `src` into a canvas-safe URL (e.g., a data URL).
37079
37286
  * @returns True when we can regenerate the edited image, otherwise false
37080
37287
  */
37081
- function canRegenerateImage(img) {
37288
+ function canRegenerateImage(img, resolveImageSource) {
37082
37289
  if (!img) {
37083
37290
  return false;
37084
37291
  }
37292
+ // If a resolveImageSource callback is provided, the image source should be resolved to a
37293
+ // canvas-compatible URL when editing starts, so we can assume the image can be regenerated.
37294
+ if (resolveImageSource && img.src) {
37295
+ var resolved = resolveImageSource(img.src);
37296
+ if (resolved && resolved !== img.src) {
37297
+ return true;
37298
+ }
37299
+ }
37085
37300
  try {
37086
37301
  var canvas = img.ownerDocument.createElement('canvas');
37087
37302
  canvas.width = 10;
@@ -37185,7 +37400,7 @@ var IMAGE_EDIT_SHADOW_ROOT = 'ImageEditShadowRoot';
37185
37400
  * @internal
37186
37401
  */
37187
37402
  function createImageWrapper(editor, image, options, editInfo, htmlOptions, operation) {
37188
- var imageClone = cloneImage(image, editInfo);
37403
+ var imageClone = cloneImage(image, editInfo, options.resolveImageSource);
37189
37404
  var doc = editor.getDocument();
37190
37405
  var rotators = [];
37191
37406
  if (!options.disableRotate && operation.indexOf('rotate') > -1) {
@@ -37251,11 +37466,12 @@ var createBorder = function (editor, borderColor) {
37251
37466
  resizeBorder.setAttribute("style", "position:absolute;left:0;right:0;top:0;bottom:0;border:solid 2px " + borderColor + ";pointer-events:none;");
37252
37467
  return resizeBorder;
37253
37468
  };
37254
- var cloneImage = function (image, editInfo) {
37469
+ var cloneImage = function (image, editInfo, resolveImageSource) {
37470
+ var _a;
37255
37471
  var imageClone = image.cloneNode(true);
37256
37472
  imageClone.style.removeProperty('transform');
37257
37473
  if (editInfo.src) {
37258
- imageClone.src = editInfo.src;
37474
+ imageClone.src = (_a = resolveImageSource === null || resolveImageSource === void 0 ? void 0 : resolveImageSource(editInfo.src)) !== null && _a !== void 0 ? _a : editInfo.src;
37259
37475
  imageClone.removeAttribute('id');
37260
37476
  imageClone.style.removeProperty('max-width');
37261
37477
  imageClone.style.removeProperty('max-height');
@@ -38920,6 +39136,7 @@ var LIST_ELEMENT_TAGS = ['UL', 'OL', 'LI'];
38920
39136
  var LIST_ELEMENT_SELECTOR = LIST_ELEMENT_TAGS.join(',');
38921
39137
  var END_OF_PARAGRAPH = 'EOP';
38922
39138
  var SELECTED_CLASS = 'Selected';
39139
+ var BASE_PADDING_WAC_LISTS = '1em';
38923
39140
  /**
38924
39141
  * Wac components do not use sub and super tags, instead only add vertical align to a span.
38925
39142
  * This parser normalize the content for content model
@@ -39017,15 +39234,13 @@ var wacListItemParser = function (format, element) {
39017
39234
  if (element.style.display === 'block') {
39018
39235
  format.displayForDummyItem = undefined;
39019
39236
  }
39020
- format.marginLeft = undefined;
39021
- format.marginRight = undefined;
39022
39237
  };
39023
39238
  /**
39024
39239
  * Wac usually adds padding to lists which is unwanted so remove it.
39025
39240
  */
39026
39241
  var wacListLevelParser = function (format) {
39027
39242
  format.marginLeft = undefined;
39028
- format.paddingLeft = undefined;
39243
+ format.paddingLeft = BASE_PADDING_WAC_LISTS;
39029
39244
  };
39030
39245
  /**
39031
39246
  * This function returns whether we need to clear the list format.
@@ -39244,6 +39459,7 @@ var getStyles_1 = __webpack_require__(/*! ../utils/getStyles */ "./packages/roos
39244
39459
  var listLevelParser_1 = __webpack_require__(/*! ../parsers/listLevelParser */ "./packages/roosterjs-content-model-plugins/lib/paste/parsers/listLevelParser.ts");
39245
39460
  var processWordComments_1 = __webpack_require__(/*! ./processWordComments */ "./packages/roosterjs-content-model-plugins/lib/paste/WordDesktop/processWordComments.ts");
39246
39461
  var processWordLists_1 = __webpack_require__(/*! ./processWordLists */ "./packages/roosterjs-content-model-plugins/lib/paste/WordDesktop/processWordLists.ts");
39462
+ var adjustWordListMarginParser_1 = __webpack_require__(/*! ../parsers/adjustWordListMarginParser */ "./packages/roosterjs-content-model-plugins/lib/paste/parsers/adjustWordListMarginParser.ts");
39247
39463
  var removeNegativeTextIndentParser_1 = __webpack_require__(/*! ../parsers/removeNegativeTextIndentParser */ "./packages/roosterjs-content-model-plugins/lib/paste/parsers/removeNegativeTextIndentParser.ts");
39248
39464
  var setProcessor_1 = __webpack_require__(/*! ../utils/setProcessor */ "./packages/roosterjs-content-model-plugins/lib/paste/utils/setProcessor.ts");
39249
39465
  var wordContainerParser_1 = __webpack_require__(/*! ../parsers/wordContainerParser */ "./packages/roosterjs-content-model-plugins/lib/paste/parsers/wordContainerParser.ts");
@@ -39260,6 +39476,7 @@ function processPastedContentFromWordDesktop(domToModelOption, htmlString) {
39260
39476
  (0, addParser_1.addParser)(domToModelOption, 'block', adjustPercentileLineHeightParser_1.adjustPercentileLineHeight);
39261
39477
  (0, addParser_1.addParser)(domToModelOption, 'block', removeNegativeTextIndentParser_1.removeNegativeTextIndentParser);
39262
39478
  (0, addParser_1.addParser)(domToModelOption, 'listItemElement', removeNegativeTextIndentParser_1.removeNegativeTextIndentParser);
39479
+ (0, addParser_1.addParser)(domToModelOption, 'listItemElement', adjustWordListMarginParser_1.adjustWordListMarginParser);
39263
39480
  (0, addParser_1.addParser)(domToModelOption, 'listLevel', listLevelParser_1.listLevelParser);
39264
39481
  (0, addParser_1.addParser)(domToModelOption, 'container', wordContainerParser_1.wordContainerParser);
39265
39482
  (0, addParser_1.addParser)(domToModelOption, 'table', wordTableParser_1.wordTableParser);
@@ -39684,6 +39901,42 @@ function adjustPercentileLineHeight(format, element) {
39684
39901
  exports.adjustPercentileLineHeight = adjustPercentileLineHeight;
39685
39902
 
39686
39903
 
39904
+ /***/ },
39905
+
39906
+ /***/ "./packages/roosterjs-content-model-plugins/lib/paste/parsers/adjustWordListMarginParser.ts"
39907
+ /*!**************************************************************************************************!*\
39908
+ !*** ./packages/roosterjs-content-model-plugins/lib/paste/parsers/adjustWordListMarginParser.ts ***!
39909
+ \**************************************************************************************************/
39910
+ (__unused_webpack_module, exports, __webpack_require__) {
39911
+
39912
+ "use strict";
39913
+
39914
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
39915
+ exports.adjustWordListMarginParser = void 0;
39916
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
39917
+ var MSO_LIST_PARAGRAPH_CLASS = 'MsoListParagraph';
39918
+ // Default list padding from the HTML user-agent stylesheet (paddingInlineStart for <ul>/<ol>)
39919
+ var DEFAULT_LIST_PADDING_INLINE_START = '40px';
39920
+ /**
39921
+ * @internal
39922
+ * Parser that subtracts the default list format (paddingInlineStart: 40px) from
39923
+ * the marginLeft of list item elements that have the MsoListParagraph class,
39924
+ * since Word adds the full indentation as margin on the paragraph, which
39925
+ * duplicates the padding the list element already provides.
39926
+ */
39927
+ var adjustWordListMarginParser = function (format, element) {
39928
+ if (element.classList.contains(MSO_LIST_PARAGRAPH_CLASS) && format.marginLeft) {
39929
+ var currentPx = (0, roosterjs_content_model_dom_1.parseValueWithUnit)(format.marginLeft, element);
39930
+ var defaultPx = (0, roosterjs_content_model_dom_1.parseValueWithUnit)(DEFAULT_LIST_PADDING_INLINE_START);
39931
+ var result = currentPx - defaultPx;
39932
+ if (result > 0) {
39933
+ format.marginLeft = result + "px";
39934
+ }
39935
+ }
39936
+ };
39937
+ exports.adjustWordListMarginParser = adjustWordListMarginParser;
39938
+
39939
+
39687
39940
  /***/ },
39688
39941
 
39689
39942
  /***/ "./packages/roosterjs-content-model-plugins/lib/paste/parsers/blockElementParser.ts"
@@ -42569,7 +42822,6 @@ var createElement_1 = __webpack_require__(/*! ../../../pluginUtils/CreateElement
42569
42822
  var DragAndDropHelper_1 = __webpack_require__(/*! ../../../pluginUtils/DragAndDrop/DragAndDropHelper */ "./packages/roosterjs-content-model-plugins/lib/pluginUtils/DragAndDrop/DragAndDropHelper.ts");
42570
42823
  var roosterjs_content_model_api_1 = __webpack_require__(/*! roosterjs-content-model-api */ "./packages/roosterjs-content-model-api/lib/index.ts");
42571
42824
  var getTableFromContentModel_1 = __webpack_require__(/*! ../utils/getTableFromContentModel */ "./packages/roosterjs-content-model-plugins/lib/tableEdit/editors/utils/getTableFromContentModel.ts");
42572
- var getNodePositionFromEvent_1 = __webpack_require__(/*! ../../../utils/getNodePositionFromEvent */ "./packages/roosterjs-content-model-plugins/lib/utils/getNodePositionFromEvent.ts");
42573
42825
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
42574
42826
  var TABLE_MOVER_LENGTH = 12;
42575
42827
  /**
@@ -42697,7 +42949,7 @@ function onDragging(context, event, initValue) {
42697
42949
  // Move table outline rectangle
42698
42950
  tableRect.style.top = event.clientY + TABLE_MOVER_LENGTH + "px";
42699
42951
  tableRect.style.left = event.clientX + TABLE_MOVER_LENGTH + "px";
42700
- var pos = (0, getNodePositionFromEvent_1.getNodePositionFromEvent)(editor, event.clientX, event.clientY);
42952
+ var pos = (0, roosterjs_content_model_dom_1.getNodePositionFromEvent)(editor.getDocument(), editor.getDOMHelper(), event.clientX, event.clientY);
42701
42953
  if (pos) {
42702
42954
  var range = editor.getDocument().createRange();
42703
42955
  range.setStart(pos.node, pos.offset);
@@ -42737,7 +42989,7 @@ function onDragEnd(context, event, initValue) {
42737
42989
  }
42738
42990
  var insertionSuccess_1 = false;
42739
42991
  // Get position to insert table
42740
- var insertPosition = (0, getNodePositionFromEvent_1.getNodePositionFromEvent)(editor, event.clientX, event.clientY);
42992
+ var insertPosition = (0, roosterjs_content_model_dom_1.getNodePositionFromEvent)(editor.getDocument(), editor.getDOMHelper(), event.clientX, event.clientY);
42741
42993
  if (insertPosition) {
42742
42994
  // Move table to new position
42743
42995
  (0, roosterjs_content_model_api_1.formatInsertPointWithContentModel)(editor, insertPosition, function (model, context, ip) {
@@ -43274,7 +43526,7 @@ exports.getCMTableFromTable = getCMTableFromTable;
43274
43526
 
43275
43527
  Object.defineProperty(exports, "__esModule", ({ value: true }));
43276
43528
  exports.TouchPlugin = void 0;
43277
- var getNodePositionFromEvent_1 = __webpack_require__(/*! ../utils/getNodePositionFromEvent */ "./packages/roosterjs-content-model-plugins/lib/utils/getNodePositionFromEvent.ts");
43529
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
43278
43530
  var MAX_TOUCH_MOVE_DISTANCE = 6; // the max number of offsets for the touch selection to move
43279
43531
  var POINTER_DETECTION_DELAY = 150; // Delay time to wait for selection to be updated and also detect if pointerup is a tap or part of double tap
43280
43532
  var PUNCTUATION_MATCHING_REGEX = /[.,;:!]/;
@@ -43342,7 +43594,7 @@ var TouchPlugin = /** @class */ (function () {
43342
43594
  if (_this.editor) {
43343
43595
  if (!_this.isDblClicked) {
43344
43596
  _this.editor.focus();
43345
- var caretPosition = (0, getNodePositionFromEvent_1.getNodePositionFromEvent)(_this.editor, event.rawEvent.x, event.rawEvent.y);
43597
+ var caretPosition = (0, roosterjs_content_model_dom_1.getNodePositionFromEvent)(_this.editor.getDocument(), _this.editor.getDOMHelper(), event.rawEvent.x, event.rawEvent.y);
43346
43598
  var newRange = _this.editor.getDocument().createRange();
43347
43599
  if (caretPosition) {
43348
43600
  var node = caretPosition.node, offset = caretPosition.offset;
@@ -43390,7 +43642,7 @@ var TouchPlugin = /** @class */ (function () {
43390
43642
  if (this.isTouchPenPointerEvent) {
43391
43643
  event.rawEvent.preventDefault();
43392
43644
  this.isDblClicked = true;
43393
- var caretPosition = (0, getNodePositionFromEvent_1.getNodePositionFromEvent)(this.editor, event.rawEvent.x, event.rawEvent.y);
43645
+ var caretPosition = (0, roosterjs_content_model_dom_1.getNodePositionFromEvent)(this.editor.getDocument(), this.editor.getDOMHelper(), event.rawEvent.x, event.rawEvent.y);
43394
43646
  if (caretPosition) {
43395
43647
  var node = caretPosition.node, offset = caretPosition.offset;
43396
43648
  if (node.nodeType !== Node.TEXT_NODE) {
@@ -43484,50 +43736,6 @@ function findWordBoundaries(text, offset) {
43484
43736
  }
43485
43737
 
43486
43738
 
43487
- /***/ },
43488
-
43489
- /***/ "./packages/roosterjs-content-model-plugins/lib/utils/getNodePositionFromEvent.ts"
43490
- /*!****************************************************************************************!*\
43491
- !*** ./packages/roosterjs-content-model-plugins/lib/utils/getNodePositionFromEvent.ts ***!
43492
- \****************************************************************************************/
43493
- (__unused_webpack_module, exports) {
43494
-
43495
- "use strict";
43496
-
43497
- Object.defineProperty(exports, "__esModule", ({ value: true }));
43498
- exports.getNodePositionFromEvent = void 0;
43499
- /**
43500
- * @internal Get insertion point from coordinate.
43501
- */
43502
- function getNodePositionFromEvent(editor, x, y) {
43503
- var doc = editor.getDocument();
43504
- var domHelper = editor.getDOMHelper();
43505
- if ('caretPositionFromPoint' in doc) {
43506
- // Firefox, Chrome, Edge, Safari, Opera
43507
- var pos = doc.caretPositionFromPoint(x, y);
43508
- if (pos && domHelper.isNodeInEditor(pos.offsetNode)) {
43509
- return { node: pos.offsetNode, offset: pos.offset };
43510
- }
43511
- }
43512
- if (doc.caretRangeFromPoint) {
43513
- // Safari
43514
- var range = doc.caretRangeFromPoint(x, y);
43515
- if (range && domHelper.isNodeInEditor(range.startContainer)) {
43516
- return { node: range.startContainer, offset: range.startOffset };
43517
- }
43518
- }
43519
- if (doc.elementFromPoint) {
43520
- // Fallback
43521
- var element = doc.elementFromPoint(x, y);
43522
- if (element && domHelper.isNodeInEditor(element)) {
43523
- return { node: element, offset: 0 };
43524
- }
43525
- }
43526
- return null;
43527
- }
43528
- exports.getNodePositionFromEvent = getNodePositionFromEvent;
43529
-
43530
-
43531
43739
  /***/ },
43532
43740
 
43533
43741
  /***/ "./packages/roosterjs-content-model-plugins/lib/watermark/WatermarkPlugin.ts"