roosterjs 9.56.0 → 9.57.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.
@@ -1,4 +1,4 @@
1
- // Type definitions for roosterjs (Version 9.56.0)
1
+ // Type definitions for roosterjs (Version 9.57.0)
2
2
  // Generated by dts tool from roosterjs
3
3
  // Project: https://github.com/Microsoft/roosterjs
4
4
 
@@ -3890,6 +3890,11 @@ export interface IEditor {
3890
3890
  * @param featureName The name of feature to check
3891
3891
  */
3892
3892
  isExperimentalFeatureEnabled(featureName: ExperimentalFeature | string): boolean;
3893
+ /**
3894
+ * Get all experimental features enabled in this editor
3895
+ * @returns An array of experimental feature names
3896
+ */
3897
+ getExperimentalFeatures(): ExperimentalFeature[];
3893
3898
  }
3894
3899
 
3895
3900
  /**
@@ -3920,7 +3925,11 @@ export type ExperimentalFeature = GraduatedExperimentalFeature
3920
3925
  * These characters can be used to hide text in HTML and may cause unexpected behavior.
3921
3926
  * @see https://embracethered.com/blog/posts/2024/hiding-and-finding-text-with-unicode-tags/
3922
3927
  */
3923
- | 'FilterInvisibleUnicode';
3928
+ | 'FilterInvisibleUnicode'
3929
+ /**
3930
+ * Handle the drop event for content that is dropped from the same editor instance.
3931
+ */
3932
+ | 'HandleDropInternalContent';
3924
3933
 
3925
3934
  /**
3926
3935
  * Predefined experiment features (Graduated, only keep them for backward compatibility)
@@ -5101,6 +5110,10 @@ export interface FormatContentModelOptions {
5101
5110
  * When pass to true, scroll the editing caret into view after write DOM tree if need
5102
5111
  */
5103
5112
  scrollCaretIntoView?: boolean;
5113
+ /**
5114
+ * When pass to true, skip setting DOM selection after write DOM tree. @default false
5115
+ */
5116
+ skipDOMSelection?: boolean;
5104
5117
  }
5105
5118
 
5106
5119
  /**
@@ -5259,9 +5272,19 @@ export interface ContentModelFormatState {
5259
5272
 
5260
5273
  /**
5261
5274
  * Represents the PasteType parameter used to set the paste type to use.
5262
- * It can be either the Paste Type value or a callback that retuns the Paste Type to use.
5275
+ * It can be either the Paste Type value or a callback that returns the Paste Type to use.
5263
5276
  */
5264
- export type PasteTypeOrGetter = PasteType | ((document: Document | null, clipboardData: ClipboardData) => PasteType);
5277
+ export type PasteTypeOrGetter = PasteType | PasteTypeGetter;
5278
+
5279
+ /**
5280
+ * A function that returns the Paste Type to use based on the pasted content and clipboard data.
5281
+ * @param document The document parsed from the clipboard raw HTML, or null when there is no HTML
5282
+ * @param clipboardData Clipboard data retrieved from clipboard
5283
+ * @param environment The editor environment information
5284
+ * @param htmlAttributes The metadata (HTML attributes) retrieved from the pasted content
5285
+ * @returns The Paste Type to use
5286
+ */
5287
+ export type PasteTypeGetter = (document: Document | null, clipboardData: ClipboardData, environment: EditorEnvironment, htmlAttributes: Record<string, string>) => PasteType;
5265
5288
 
5266
5289
  /**
5267
5290
  * Image Format
@@ -8386,6 +8409,10 @@ export const ChangeSource: {
8386
8409
  * Content changed by paste
8387
8410
  */
8388
8411
  Paste: string;
8412
+ /**
8413
+ * Content changed by auto markdown conversion
8414
+ */
8415
+ AutoMarkdownConversion: string;
8389
8416
  /**
8390
8417
  * Content changed by setContent API
8391
8418
  */
@@ -8862,6 +8889,11 @@ export class Editor implements IEditor {
8862
8889
  * @param featureName The name of feature to check
8863
8890
  */
8864
8891
  isExperimentalFeatureEnabled(featureName: ExperimentalFeature | string): boolean;
8892
+ /**
8893
+ * Get all experimental features enabled in this editor
8894
+ * @returns An array of experimental feature names
8895
+ * */
8896
+ getExperimentalFeatures(): ExperimentalFeature[];
8865
8897
  /**
8866
8898
  * @returns the current EditorCore object
8867
8899
  * @throws a standard Error if there's no core object
@@ -10933,7 +10965,7 @@ export class AnnouncePlugin implements EditorPlugin {
10933
10965
  export class DragAndDropPlugin implements EditorPlugin {
10934
10966
  private editor;
10935
10967
  private forbiddenElements;
10936
- private isInternalDragging;
10968
+ private internalDrag;
10937
10969
  private disposer;
10938
10970
  /**
10939
10971
  * Construct a new instance of DragAndDropPlugin
@@ -8544,9 +8544,9 @@ var DefaultSanitizingOption = {
8544
8544
  /**
8545
8545
  * @internal
8546
8546
  */
8547
- function createDomToModelContextForSanitizing(document, defaultFormat, defaultOption, additionalSanitizingOption, domHelper) {
8547
+ function createDomToModelContextForSanitizing(document, defaultFormat, defaultOption, additionalSanitizingOption, domHelper, experimentalFeatures) {
8548
8548
  var sanitizingOption = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, DefaultSanitizingOption), additionalSanitizingOption);
8549
- return (0, roosterjs_content_model_dom_1.createDomToModelContext)((0, tslib_1.__assign)((0, tslib_1.__assign)({ defaultFormat: defaultFormat }, (0, getRootComputedStyleForContext_1.getRootComputedStyleForContext)(document)), { experimentalFeatures: [], editorViewWidth: domHelper === null || domHelper === void 0 ? void 0 : domHelper.getClientWidth() }), defaultOption, {
8549
+ return (0, roosterjs_content_model_dom_1.createDomToModelContext)((0, tslib_1.__assign)((0, tslib_1.__assign)({ defaultFormat: defaultFormat }, (0, getRootComputedStyleForContext_1.getRootComputedStyleForContext)(document)), { experimentalFeatures: experimentalFeatures !== null && experimentalFeatures !== void 0 ? experimentalFeatures : [], editorViewWidth: domHelper === null || domHelper === void 0 ? void 0 : domHelper.getClientWidth() }), defaultOption, {
8550
8550
  processorOverride: {
8551
8551
  '#text': pasteTextProcessor_1.pasteTextProcessor,
8552
8552
  entity: (0, pasteEntityProcessor_1.createPasteEntityProcessor)(sanitizingOption),
@@ -9388,12 +9388,13 @@ var BlackColor = 'rgb(0,0,0)';
9388
9388
  */
9389
9389
  function mergePasteContent(editor, eventResult, isFirstPaste) {
9390
9390
  var fragment = eventResult.fragment, domToModelOption = eventResult.domToModelOption, customizedMerge = eventResult.customizedMerge, pasteType = eventResult.pasteType, clipboardData = eventResult.clipboardData, containsBlockElements = eventResult.containsBlockElements;
9391
+ var shouldScrollCaretIntoView = !isImageOnlyFragment(fragment);
9391
9392
  editor.formatContentModel(function (model, context) {
9392
9393
  if (!isFirstPaste && clipboardData.modelBeforePaste) {
9393
9394
  var clonedModel = (0, roosterjs_content_model_dom_1.cloneModelForPaste)(clipboardData.modelBeforePaste);
9394
9395
  model.blocks = clonedModel.blocks;
9395
9396
  }
9396
- var domToModelContext = (0, createDomToModelContextForSanitizing_1.createDomToModelContextForSanitizing)(editor.getDocument(), undefined /*defaultFormat*/, editor.getEnvironment().domToModelSettings.customized, domToModelOption, editor.getDOMHelper());
9397
+ var domToModelContext = (0, createDomToModelContextForSanitizing_1.createDomToModelContextForSanitizing)(editor.getDocument(), undefined /*defaultFormat*/, editor.getEnvironment().domToModelSettings.customized, domToModelOption, editor.getDOMHelper(), editor.getExperimentalFeatures());
9397
9398
  domToModelContext.segmentFormat = getSegmentFormatForPaste(model, pasteType);
9398
9399
  var pasteModel = (0, roosterjs_content_model_dom_1.domToContentModel)(fragment, domToModelContext);
9399
9400
  var mergeOption = {
@@ -9413,7 +9414,7 @@ function mergePasteContent(editor, eventResult, isFirstPaste) {
9413
9414
  }, {
9414
9415
  changeSource: roosterjs_content_model_dom_1.ChangeSource.Paste,
9415
9416
  getChangeData: function () { return clipboardData; },
9416
- scrollCaretIntoView: true,
9417
+ scrollCaretIntoView: shouldScrollCaretIntoView,
9417
9418
  apiName: 'paste',
9418
9419
  });
9419
9420
  }
@@ -9454,6 +9455,13 @@ function getLastSegmentFormat(pasteModel) {
9454
9455
  }
9455
9456
  return {};
9456
9457
  }
9458
+ function isImageOnlyFragment(pasteFragment) {
9459
+ var _a;
9460
+ var images = pasteFragment.querySelectorAll('img');
9461
+ return (images.length === 1 &&
9462
+ pasteFragment.childNodes.length === 1 &&
9463
+ ((_a = pasteFragment.textContent) === null || _a === void 0 ? void 0 : _a.trim()) === '');
9464
+ }
9457
9465
 
9458
9466
 
9459
9467
  /***/ },
@@ -9499,11 +9507,11 @@ function paste(editor, clipboardData, pasteTypeOrGetter) {
9499
9507
  clipboardData.rawHtml = (0, cleanHtmlComments_1.cleanHtmlComments)(clipboardData.rawHtml);
9500
9508
  }
9501
9509
  var doc = createDOMFromHtml(clipboardData.rawHtml, domCreator);
9502
- var pasteType = typeof pasteTypeOrGetter == 'function'
9503
- ? pasteTypeOrGetter(doc, clipboardData)
9504
- : pasteTypeOrGetter;
9505
9510
  // 2. Handle HTML from clipboard
9506
9511
  var htmlFromClipboard = (0, retrieveHtmlInfo_1.retrieveHtmlInfo)(doc, clipboardData);
9512
+ var pasteType = typeof pasteTypeOrGetter == 'function'
9513
+ ? pasteTypeOrGetter(doc, clipboardData, editor.getEnvironment(), htmlFromClipboard.metadata)
9514
+ : pasteTypeOrGetter;
9507
9515
  // 3. Create target fragment
9508
9516
  var sourceFragment = (0, createPasteFragment_1.createPasteFragment)(editor.getDocument(), clipboardData, pasteType, (_a = (clipboardData.rawHtml == clipboardData.html
9509
9517
  ? doc
@@ -10288,7 +10296,7 @@ var formatContentModel = function (core, formatter, options, domToModelOptions)
10288
10296
  try {
10289
10297
  handleImages(core, context);
10290
10298
  selection =
10291
- (_a = core.api.setContentModel(core, model, hasFocus ? undefined : { ignoreSelection: true }, // If editor did not have focus before format, do not set focus after format
10299
+ (_a = core.api.setContentModel(core, model, hasFocus && !(options === null || options === void 0 ? void 0 : options.skipDOMSelection) ? undefined : { ignoreSelection: true }, // If editor did not have focus before format, do not set focus after format
10292
10300
  onNodeCreated)) !== null && _a !== void 0 ? _a : undefined;
10293
10301
  handlePendingFormat(core, context, selection);
10294
10302
  if (scroll && ((selection === null || selection === void 0 ? void 0 : selection.type) == 'range' || (selection === null || selection === void 0 ? void 0 : selection.type) == 'image')) {
@@ -14490,6 +14498,7 @@ var Down = 'ArrowDown';
14490
14498
  var Left = 'ArrowLeft';
14491
14499
  var Right = 'ArrowRight';
14492
14500
  var Tab = 'Tab';
14501
+ var F10 = 'F10';
14493
14502
  /**
14494
14503
  * @internal
14495
14504
  */
@@ -14506,7 +14515,6 @@ var SelectionPlugin = /** @class */ (function () {
14506
14515
  this.disposer = null;
14507
14516
  this.logicalRootDisposer = null;
14508
14517
  this.isSafari = false;
14509
- this.isMac = false;
14510
14518
  this.scrollTopCache = 0;
14511
14519
  this.onMouseMove = function (event) {
14512
14520
  var _a, _b, _c;
@@ -14558,7 +14566,7 @@ var SelectionPlugin = /** @class */ (function () {
14558
14566
  // MacOS will not create a mouseUp event if contextMenu event is not prevent defaulted.
14559
14567
  // Make sure we capture image target even if image is wrapped
14560
14568
  this.getContainedTargetImage = function (event, previousSelection) {
14561
- if (!_this.isMac || !previousSelection || previousSelection.type !== 'image') {
14569
+ if (!previousSelection || previousSelection.type !== 'image') {
14562
14570
  return null;
14563
14571
  }
14564
14572
  var target = event.target;
@@ -14598,11 +14606,11 @@ var SelectionPlugin = /** @class */ (function () {
14598
14606
  if (((_a = _this.editor) === null || _a === void 0 ? void 0 : _a.hasFocus()) && !_this.editor.isInShadowEdit()) {
14599
14607
  var newSelection = _this.editor.getDOMSelection();
14600
14608
  var domHelper = _this.editor.getDOMHelper();
14601
- //If am image selection changed to a wider range due a keyboard event, we should update the selection
14609
+ // If an image selection changed to a wider range due to a keyboard event, we should update the selection
14602
14610
  var range = domHelper.getSelectionRange();
14603
14611
  if (range) {
14604
14612
  var image = (0, isSingleImageInSelection_1.isSingleImageInSelection)(range);
14605
- if ((newSelection === null || newSelection === void 0 ? void 0 : newSelection.type) == 'image' && !image) {
14613
+ if ((newSelection === null || newSelection === void 0 ? void 0 : newSelection.type) == 'image' && !image && !range.collapsed) {
14606
14614
  var sel = (_b = _this.editor.getDocument().defaultView) === null || _b === void 0 ? void 0 : _b.getSelection();
14607
14615
  var isReverted = sel
14608
14616
  ? sel.focusNode != range.endContainer || sel.focusOffset != range.endOffset
@@ -14661,7 +14669,6 @@ var SelectionPlugin = /** @class */ (function () {
14661
14669
  var env = this.editor.getEnvironment();
14662
14670
  var document = this.editor.getDocument();
14663
14671
  this.isSafari = !!env.isSafari;
14664
- this.isMac = !!env.isMac;
14665
14672
  document.addEventListener('selectionchange', this.onSelectionChange);
14666
14673
  if (this.isSafari) {
14667
14674
  this.disposer = this.editor.attachDomEvent({
@@ -14814,6 +14821,7 @@ var SelectionPlugin = /** @class */ (function () {
14814
14821
  }
14815
14822
  break;
14816
14823
  case 'range':
14824
+ var image = void 0;
14817
14825
  if (key == Up || key == Down || key == Left || key == Right || key == Tab) {
14818
14826
  var start = selection.range.startContainer;
14819
14827
  this.state.tableSelection = this.parseTableSelection(start, start, editor.getDOMHelper());
@@ -14829,6 +14837,14 @@ var SelectionPlugin = /** @class */ (function () {
14829
14837
  }
14830
14838
  }
14831
14839
  }
14840
+ else if (key == F10 &&
14841
+ rawEvent.shiftKey &&
14842
+ (image = (0, isSingleImageInSelection_1.isSingleImageInSelection)(selection.range))) {
14843
+ this.setDOMSelection({
14844
+ type: 'image',
14845
+ image: image,
14846
+ }, null /* tableSelection */);
14847
+ }
14832
14848
  break;
14833
14849
  case 'table':
14834
14850
  // After a content change event is handled tableSelection state is reset to null
@@ -15972,6 +15988,13 @@ var Editor = /** @class */ (function () {
15972
15988
  Editor.prototype.isExperimentalFeatureEnabled = function (featureName) {
15973
15989
  return this.getCore().experimentalFeatures.indexOf(featureName) >= 0;
15974
15990
  };
15991
+ /**
15992
+ * Get all experimental features enabled in this editor
15993
+ * @returns An array of experimental feature names
15994
+ * */
15995
+ Editor.prototype.getExperimentalFeatures = function () {
15996
+ return this.getCore().experimentalFeatures;
15997
+ };
15975
15998
  /**
15976
15999
  * @returns the current EditorCore object
15977
16000
  * @throws a standard Error if there's no core object
@@ -17203,6 +17226,10 @@ exports.ChangeSource = {
17203
17226
  * Content changed by paste
17204
17227
  */
17205
17228
  Paste: 'Paste',
17229
+ /**
17230
+ * Content changed by auto markdown conversion
17231
+ */
17232
+ AutoMarkdownConversion: 'AutoMarkdownConversion',
17206
17233
  /**
17207
17234
  * Content changed by setContent API
17208
17235
  */
@@ -27012,6 +27039,11 @@ function mergeTables(markerPosition, newTable, source) {
27012
27039
  var newTableRowCount = newTable.rows.length;
27013
27040
  var lastTargetColIndex = getTargetColIndex(table, rowIndex, colIndex, newTableColCount);
27014
27041
  var extraColsNeeded = lastTargetColIndex - table.rows[0].cells.length;
27042
+ newTable.rows.forEach(function (row) {
27043
+ row.cells.forEach(function (cell) {
27044
+ cell.spanAbove = false;
27045
+ });
27046
+ });
27015
27047
  if (extraColsNeeded > 0) {
27016
27048
  var currentColCount = table.rows[0].cells.length;
27017
27049
  for (var col = 0; col < extraColsNeeded; col++) {
@@ -31043,9 +31075,9 @@ var MarkdownBlockGroupType = {
31043
31075
  /**
31044
31076
  * @internal
31045
31077
  */
31046
- function createBlockGroupFromMarkdown(text, patternName, options, group) {
31078
+ function createBlockGroupFromMarkdown(text, patternName, options, group, list) {
31047
31079
  if (MarkdownBlockGroupType[patternName] === 'ListItem') {
31048
- return (0, createListFromMarkdown_1.createListFromMarkdown)(text, patternName === 'ordered_list' ? 'OL' : 'UL', options);
31080
+ return (0, createListFromMarkdown_1.createListFromMarkdown)(text, patternName === 'ordered_list' ? 'OL' : 'UL', options, list);
31049
31081
  }
31050
31082
  else {
31051
31083
  return (0, createBlockQuoteFromMarkdown_1.createBlockQuoteFromMarkdown)(text, options, group);
@@ -31133,12 +31165,13 @@ var createParagraphFromMarkdown_1 = __webpack_require__(/*! ./createParagraphFro
31133
31165
  /**
31134
31166
  * @internal
31135
31167
  */
31136
- function createListFromMarkdown(text, listType, options) {
31168
+ function createListFromMarkdown(text, listType, options, list) {
31137
31169
  var marker = text.trim().split(' ')[0];
31138
31170
  var isDummy = isDummyListItem(marker);
31171
+ var startNumber = listType === 'OL' && !list ? parseInt(marker, 10) : undefined;
31139
31172
  var itemText = isDummy ? text : text.trim().substring(marker.length);
31140
31173
  var paragraph = (0, createParagraphFromMarkdown_1.createParagraphFromMarkdown)(itemText.trim(), options);
31141
- var levels = createLevels(text, listType, isDummy, options);
31174
+ var levels = createLevels(text, listType, isDummy, options, startNumber);
31142
31175
  var listModel = (0, roosterjs_content_model_dom_1.createListItem)(levels);
31143
31176
  if (options.direction) {
31144
31177
  listModel.format.direction = options.direction;
@@ -31147,8 +31180,11 @@ function createListFromMarkdown(text, listType, options) {
31147
31180
  return listModel;
31148
31181
  }
31149
31182
  exports.createListFromMarkdown = createListFromMarkdown;
31150
- function createLevels(text, listType, isDummy, options) {
31183
+ function createLevels(text, listType, isDummy, options, startNumberOverride) {
31151
31184
  var level = (0, roosterjs_content_model_dom_1.createListLevel)(listType, options.direction ? { direction: options.direction } : undefined);
31185
+ if (startNumberOverride) {
31186
+ level.format.startNumberOverride = startNumberOverride;
31187
+ }
31152
31188
  if (isDummy) {
31153
31189
  level.format.displayForDummyItem = 'block';
31154
31190
  }
@@ -31437,7 +31473,7 @@ function addMarkdownBlockToModel(model, blockType, markdown, patternName, markdo
31437
31473
  model.blocks.push(divider);
31438
31474
  break;
31439
31475
  case 'BlockGroup':
31440
- var blockGroup = (0, createBlockGroupFromMarkdown_1.createBlockGroupFromMarkdown)(markdown, patternName, options, markdownContext.lastQuote);
31476
+ var blockGroup = (0, createBlockGroupFromMarkdown_1.createBlockGroupFromMarkdown)(markdown, patternName, options, markdownContext.lastQuote, markdownContext.lastList);
31441
31477
  if (!markdownContext.lastQuote) {
31442
31478
  model.blocks.push(blockGroup);
31443
31479
  }
@@ -32289,6 +32325,7 @@ var MarkdownPastePlugin = /** @class */ (function () {
32289
32325
  return true;
32290
32326
  }, {
32291
32327
  apiName: 'MarkdownConversion',
32328
+ changeSource: roosterjs_content_model_dom_1.ChangeSource.AutoMarkdownConversion,
32292
32329
  scrollCaretIntoView: true,
32293
32330
  });
32294
32331
  }
@@ -33870,7 +33907,8 @@ exports.CustomReplacePlugin = CustomReplacePlugin;
33870
33907
 
33871
33908
  Object.defineProperty(exports, "__esModule", ({ value: true }));
33872
33909
  exports.DragAndDropPlugin = void 0;
33873
- var handleDroppedContent_1 = __webpack_require__(/*! ./utils/handleDroppedContent */ "./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/handleDroppedContent.ts");
33910
+ var handleDroppedExternalContent_1 = __webpack_require__(/*! ./utils/handleDroppedExternalContent */ "./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/handleDroppedExternalContent.ts");
33911
+ var handleDroppedInternalContent_1 = __webpack_require__(/*! ./utils/handleDroppedInternalContent */ "./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/handleDroppedInternalContent.ts");
33874
33912
  var DefaultOptions = {
33875
33913
  forbiddenElements: ['iframe'],
33876
33914
  };
@@ -33887,7 +33925,7 @@ var DragAndDropPlugin = /** @class */ (function () {
33887
33925
  var _a;
33888
33926
  this.editor = null;
33889
33927
  this.forbiddenElements = [];
33890
- this.isInternalDragging = false;
33928
+ this.internalDrag = false;
33891
33929
  this.disposer = null;
33892
33930
  this.forbiddenElements = (_a = options.forbiddenElements) !== null && _a !== void 0 ? _a : [];
33893
33931
  }
@@ -33909,7 +33947,7 @@ var DragAndDropPlugin = /** @class */ (function () {
33909
33947
  this.disposer = editor.attachDomEvent({
33910
33948
  dragstart: {
33911
33949
  beforeDispatch: function (_ev) {
33912
- _this.isInternalDragging = true;
33950
+ _this.internalDrag = true;
33913
33951
  },
33914
33952
  },
33915
33953
  });
@@ -33925,7 +33963,6 @@ var DragAndDropPlugin = /** @class */ (function () {
33925
33963
  this.disposer();
33926
33964
  this.disposer = null;
33927
33965
  }
33928
- this.isInternalDragging = false;
33929
33966
  this.forbiddenElements = [];
33930
33967
  };
33931
33968
  /**
@@ -33937,17 +33974,18 @@ var DragAndDropPlugin = /** @class */ (function () {
33937
33974
  DragAndDropPlugin.prototype.onPluginEvent = function (event) {
33938
33975
  var _a;
33939
33976
  if (this.editor && event.eventType == 'beforeDrop') {
33940
- if (this.isInternalDragging) {
33941
- this.isInternalDragging = false;
33977
+ var dropEvent = event.rawEvent;
33978
+ if (this.internalDrag &&
33979
+ this.editor.isExperimentalFeatureEnabled('HandleDropInternalContent')) {
33980
+ (0, handleDroppedInternalContent_1.handleDroppedInternalContent)(this.editor, dropEvent);
33942
33981
  }
33943
- else {
33944
- var dropEvent = event.rawEvent;
33982
+ else if (!this.internalDrag) {
33945
33983
  var html = (_a = dropEvent.dataTransfer) === null || _a === void 0 ? void 0 : _a.getData('text/html');
33946
33984
  if (html) {
33947
- (0, handleDroppedContent_1.handleDroppedContent)(this.editor, dropEvent, html, this.forbiddenElements);
33985
+ (0, handleDroppedExternalContent_1.handleDroppedExternalContent)(this.editor, dropEvent, html, this.forbiddenElements);
33948
33986
  }
33949
33987
  }
33950
- return;
33988
+ this.internalDrag = false;
33951
33989
  }
33952
33990
  };
33953
33991
  return DragAndDropPlugin;
@@ -34001,23 +34039,23 @@ exports.cleanForbiddenElements = cleanForbiddenElements;
34001
34039
 
34002
34040
  /***/ },
34003
34041
 
34004
- /***/ "./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/handleDroppedContent.ts"
34005
- /*!************************************************************************************************!*\
34006
- !*** ./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/handleDroppedContent.ts ***!
34007
- \************************************************************************************************/
34042
+ /***/ "./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/handleDroppedExternalContent.ts"
34043
+ /*!********************************************************************************************************!*\
34044
+ !*** ./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/handleDroppedExternalContent.ts ***!
34045
+ \********************************************************************************************************/
34008
34046
  (__unused_webpack_module, exports, __webpack_require__) {
34009
34047
 
34010
34048
  "use strict";
34011
34049
 
34012
34050
  Object.defineProperty(exports, "__esModule", ({ value: true }));
34013
- exports.handleDroppedContent = void 0;
34051
+ exports.handleDroppedExternalContent = void 0;
34014
34052
  var cleanForbiddenElements_1 = __webpack_require__(/*! ./cleanForbiddenElements */ "./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/cleanForbiddenElements.ts");
34015
34053
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
34016
34054
  /**
34017
34055
  * @internal
34018
34056
  * Handle dropped HTML content by inserting it at the drop position
34019
34057
  */
34020
- function handleDroppedContent(editor, event, html, forbiddenElements) {
34058
+ function handleDroppedExternalContent(editor, event, html, forbiddenElements) {
34021
34059
  var doc = editor.getDocument();
34022
34060
  var domPosition = (0, roosterjs_content_model_dom_1.getNodePositionFromEvent)(doc, editor.getDOMHelper(), event.x, event.y);
34023
34061
  if (domPosition) {
@@ -34041,7 +34079,56 @@ function handleDroppedContent(editor, event, html, forbiddenElements) {
34041
34079
  });
34042
34080
  }
34043
34081
  }
34044
- exports.handleDroppedContent = handleDroppedContent;
34082
+ exports.handleDroppedExternalContent = handleDroppedExternalContent;
34083
+
34084
+
34085
+ /***/ },
34086
+
34087
+ /***/ "./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/handleDroppedInternalContent.ts"
34088
+ /*!********************************************************************************************************!*\
34089
+ !*** ./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/handleDroppedInternalContent.ts ***!
34090
+ \********************************************************************************************************/
34091
+ (__unused_webpack_module, exports, __webpack_require__) {
34092
+
34093
+ "use strict";
34094
+
34095
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
34096
+ exports.handleDroppedInternalContent = void 0;
34097
+ var roosterjs_content_model_api_1 = __webpack_require__(/*! roosterjs-content-model-api */ "./packages/roosterjs-content-model-api/lib/index.ts");
34098
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
34099
+ /**
34100
+ * @internal
34101
+ * Handle dropped internal HTML content by inserting it at the drop position
34102
+ */
34103
+ function handleDroppedInternalContent(editor, event) {
34104
+ var doc = editor.getDocument();
34105
+ var domPosition = (0, roosterjs_content_model_dom_1.getNodePositionFromEvent)(doc, editor.getDOMHelper(), event.x, event.y);
34106
+ var selection = editor.getDOMSelection();
34107
+ if (domPosition && selection) {
34108
+ event.preventDefault();
34109
+ event.stopPropagation();
34110
+ (0, roosterjs_content_model_api_1.formatInsertPointWithContentModel)(editor, domPosition, function (model, context, insertPoint) {
34111
+ if (insertPoint) {
34112
+ var cloneModel = (0, roosterjs_content_model_dom_1.cloneModelForPaste)(model);
34113
+ (0, roosterjs_content_model_dom_1.trimModelForSelection)(cloneModel, selection);
34114
+ if ((0, roosterjs_content_model_dom_1.deleteSelection)(model, [], context).deleteResult == 'range') {
34115
+ (0, roosterjs_content_model_dom_1.normalizeContentModel)(model);
34116
+ }
34117
+ var startMarker = (0, roosterjs_content_model_dom_1.createSelectionMarker)(insertPoint.marker.format);
34118
+ var startParagraph = (0, roosterjs_content_model_dom_1.mutateBlock)(insertPoint.paragraph);
34119
+ var startIndex = startParagraph.segments.indexOf(insertPoint.marker);
34120
+ startParagraph.segments.splice(startIndex, 0, startMarker);
34121
+ var newInsertPoint = (0, roosterjs_content_model_dom_1.mergeModel)(model, cloneModel, context, {
34122
+ insertPosition: insertPoint,
34123
+ });
34124
+ if (newInsertPoint) {
34125
+ (0, roosterjs_content_model_dom_1.setSelection)(model, startMarker, newInsertPoint.marker);
34126
+ }
34127
+ }
34128
+ });
34129
+ }
34130
+ }
34131
+ exports.handleDroppedInternalContent = handleDroppedInternalContent;
34045
34132
 
34046
34133
 
34047
34134
  /***/ },
@@ -37115,7 +37202,7 @@ var ImageEditPlugin = /** @class */ (function () {
37115
37202
  if (event.rawEvent.key == 'Enter' && this.isCropMode) {
37116
37203
  event.rawEvent.preventDefault();
37117
37204
  }
37118
- this.applyFormatWithContentModel(editor, this.isCropMode, true /** should selectImage */, false /* isApiOperation */);
37205
+ this.applyFormatWithContentModel(editor, this.isCropMode, false /** should selectImage */, false /* isApiOperation */);
37119
37206
  }
37120
37207
  }
37121
37208
  };
@@ -37155,6 +37242,28 @@ var ImageEditPlugin = /** @class */ (function () {
37155
37242
  var editingImageModel;
37156
37243
  var selection = editor.getDOMSelection();
37157
37244
  var isRTL = false;
37245
+ var formatContentModelOptions = {
37246
+ onNodeCreated: function (model, node) {
37247
+ var _a;
37248
+ if (!isApiOperation &&
37249
+ editingImageModel &&
37250
+ editingImageModel == model &&
37251
+ editingImageModel.format.imageState == findEditingImage_1.EDITING_MARKER &&
37252
+ (0, roosterjs_content_model_dom_1.isNodeOfType)(node, 'ELEMENT_NODE') &&
37253
+ (0, roosterjs_content_model_dom_1.isElementOfType)(node, 'img')) {
37254
+ if (_this.isCropMode) {
37255
+ _this.startCropMode(editor, node, isRTL);
37256
+ }
37257
+ else {
37258
+ (_a = editor.getDocument().defaultView) === null || _a === void 0 ? void 0 : _a.requestAnimationFrame(function () {
37259
+ _this.startRotateAndResize(editor, node, isRTL);
37260
+ });
37261
+ }
37262
+ }
37263
+ },
37264
+ apiName: IMAGE_EDIT_FORMAT_EVENT,
37265
+ skipDOMSelection: false,
37266
+ };
37158
37267
  editor.formatContentModel(function (model, context) {
37159
37268
  var editingImage = (0, getSelectedImage_1.getSelectedImage)(model);
37160
37269
  var previousSelectedImage = isApiOperation
@@ -37213,28 +37322,12 @@ var ImageEditPlugin = /** @class */ (function () {
37213
37322
  _this.imageEditInfo = (0, updateImageEditInfo_1.updateImageEditInfo)(image, selection.image);
37214
37323
  image.format.imageState = 'isEditing';
37215
37324
  });
37325
+ formatContentModelOptions.skipDOMSelection = !isCropMode;
37216
37326
  result = true;
37217
37327
  }
37218
37328
  }
37219
37329
  return result;
37220
- }, {
37221
- onNodeCreated: function (model, node) {
37222
- if (!isApiOperation &&
37223
- editingImageModel &&
37224
- editingImageModel == model &&
37225
- editingImageModel.format.imageState == findEditingImage_1.EDITING_MARKER &&
37226
- (0, roosterjs_content_model_dom_1.isNodeOfType)(node, 'ELEMENT_NODE') &&
37227
- (0, roosterjs_content_model_dom_1.isElementOfType)(node, 'img')) {
37228
- if (isCropMode) {
37229
- _this.startCropMode(editor, node, isRTL);
37230
- }
37231
- else {
37232
- _this.startRotateAndResize(editor, node, isRTL);
37233
- }
37234
- }
37235
- },
37236
- apiName: IMAGE_EDIT_FORMAT_EVENT,
37237
- }, {
37330
+ }, formatContentModelOptions, {
37238
37331
  tryGetFromCache: true,
37239
37332
  });
37240
37333
  };
@@ -38220,7 +38313,6 @@ var createImageCropper_1 = __webpack_require__(/*! ../Cropper/createImageCropper
38220
38313
  var createImageResizer_1 = __webpack_require__(/*! ../Resizer/createImageResizer */ "./packages/roosterjs-content-model-plugins/lib/imageEdit/Resizer/createImageResizer.ts");
38221
38314
  var createImageRotator_1 = __webpack_require__(/*! ../Rotator/createImageRotator */ "./packages/roosterjs-content-model-plugins/lib/imageEdit/Rotator/createImageRotator.ts");
38222
38315
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
38223
- var IMAGE_EDIT_SHADOW_ROOT = 'ImageEditShadowRoot';
38224
38316
  /**
38225
38317
  * @internal
38226
38318
  */
@@ -38253,15 +38345,8 @@ var createShadowSpan = function (wrapper, imageSpan, imageWidth, imageHeight) {
38253
38345
  var shadowRoot = imageSpan.attachShadow({
38254
38346
  mode: 'open',
38255
38347
  });
38256
- imageSpan.id = IMAGE_EDIT_SHADOW_ROOT;
38257
- // Pin the shadow host to the original image's box so that wrapping the image does not grow the
38258
- // surrounding line box. Without this, the taller edit wrapper enlarges the line and the browser
38259
- // scrolls the selection back into view, making the editor jump. The wrapper and handles still
38260
- // overflow the host visually because overflow is left visible.
38261
38348
  if (imageWidth > 0 && imageHeight > 0) {
38262
38349
  imageSpan.style.display = 'inline-block';
38263
- imageSpan.style.width = imageWidth + "px";
38264
- imageSpan.style.height = imageHeight + "px";
38265
38350
  imageSpan.style.verticalAlign = 'bottom';
38266
38351
  imageSpan.style.overflow = 'visible';
38267
38352
  }
@@ -38935,7 +39020,7 @@ function getSelectedImageMetadata(editor, image) {
38935
39020
  (0, roosterjs_content_model_dom_1.mutateSegment)(selectedImage.paragraph, selectedImage === null || selectedImage === void 0 ? void 0 : selectedImage.image, function (modelImage) {
38936
39021
  imageMetadata = updateImageEditInfo(modelImage, image);
38937
39022
  });
38938
- return true;
39023
+ return false;
38939
39024
  }
38940
39025
  return false;
38941
39026
  });
@@ -39745,6 +39830,7 @@ var BulletSelector = '* > span > span[style*=mso-special-format]';
39745
39830
  var MsOfficeSpecialFormat = 'mso-special-format';
39746
39831
  var CssStyleKey = 'style';
39747
39832
  var MsoSpecialFormatRegex = /mso-special-format:\s*([^;]*)/;
39833
+ var TableElementTags = new Set(['TABLE', 'THEAD', 'TBODY', 'TFOOT', 'TR', 'TD', 'TH']);
39748
39834
  var clearListItemStyles = function (format) {
39749
39835
  delete format.textAlign;
39750
39836
  delete format.marginLeft;
@@ -39771,7 +39857,9 @@ function processPastedContentFromPowerPoint(event, domCreator) {
39771
39857
  if (style.includes(MsOfficeSpecialFormat) && context.listFormat.levels.length > 0) {
39772
39858
  return;
39773
39859
  }
39774
- var bulletElement = element.querySelector(BulletSelector);
39860
+ var bulletElement = !TableElementTags.has(element.tagName)
39861
+ ? element.querySelector(BulletSelector)
39862
+ : null;
39775
39863
  if (bulletElement) {
39776
39864
  var _c = extractPowerPointListInfo(element, bulletElement), depth = _c.depth, unorderedBulletType = _c.unorderedBulletType, orderedBulletType = _c.orderedBulletType, startNumberOverrideOrBullet_1 = _c.startNumberOverrideOrBullet, isOrderedList = _c.isOrderedList, isNewList_1 = _c.isNewList;
39777
39865
  // Setup the listformat with the metadata extracted from the bullet element
@@ -39792,6 +39880,12 @@ function processPastedContentFromPowerPoint(event, domCreator) {
39792
39880
  }
39793
39881
  clearListItemStyles(listItem.levels[listItem.levels.length - 1].format);
39794
39882
  clearListItemStyles(listItem.format);
39883
+ // When the list is inside a table cell, remove the font size from the
39884
+ // list marker so it does not inherit the list's font size. Otherwise a
39885
+ // large marker may be rendered outside of the table cell.
39886
+ if (element.closest('td,th')) {
39887
+ delete listItem.formatHolder.format.fontSize;
39888
+ }
39795
39889
  });
39796
39890
  }
39797
39891
  else {