roosterjs 9.48.0 → 9.50.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.
@@ -4309,6 +4309,10 @@ function setListType(model, listType, removeMargins) {
4309
4309
  fontSize: segmentFormat.fontSize,
4310
4310
  textColor: segmentFormat.textColor,
4311
4311
  });
4312
+ if (removeMargins) {
4313
+ newListItem.format.marginBottom = '0px';
4314
+ newListItem.format.marginTop = '0px';
4315
+ }
4312
4316
  if (block.blockType == 'Paragraph') {
4313
4317
  (0, roosterjs_content_model_dom_1.setParagraphNotImplicit)(block);
4314
4318
  }
@@ -7886,21 +7890,25 @@ exports.setTableCellShade = setTableCellShade;
7886
7890
  /*!******************************************************************************!*\
7887
7891
  !*** ./packages/roosterjs-content-model-api/lib/publicApi/utils/checkXss.ts ***!
7888
7892
  \******************************************************************************/
7889
- (__unused_webpack_module, exports) {
7893
+ (__unused_webpack_module, exports, __webpack_require__) {
7890
7894
 
7891
7895
  "use strict";
7892
7896
 
7893
7897
  Object.defineProperty(exports, "__esModule", ({ value: true }));
7894
7898
  exports.checkXss = void 0;
7899
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
7895
7900
  /**
7896
7901
  * @internal Check if there is XSS attack in the link
7897
7902
  * @param link The link to be checked
7898
- * @returns The safe link, or empty string if there is XSS attack
7899
- * @remarks This function checks for patterns like s\nc\nr\ni\np\nt: to prevent XSS attacks. This may block some valid links,
7903
+ * @returns The safe link with invisible Unicode characters stripped, or empty string if there is XSS attack
7904
+ * @remarks This function strips invisible Unicode characters (zero-width chars, Unicode Tags, etc.)
7905
+ * and checks for patterns like s\nc\nr\ni\np\nt: to prevent XSS attacks. This may block some valid links,
7900
7906
  * but it is necessary for security reasons. We treat the word "script" as safe if there are "/" before it.
7901
7907
  */
7902
7908
  function checkXss(link) {
7903
- return link.match(/^[^\/]*s\n*c\n*r\n*i\n*p\n*t\n*:/i) ? '' : link;
7909
+ // Defense-in-depth: strip invisible Unicode even if already handled elsewhere
7910
+ var sanitized = (0, roosterjs_content_model_dom_1.stripInvisibleUnicode)(link);
7911
+ return sanitized.match(/^[^\/]*s\n*c\n*r\n*i\n*p\n*t\n*:/i) ? '' : sanitized;
7904
7912
  }
7905
7913
  exports.checkXss = checkXss;
7906
7914
 
@@ -8138,7 +8146,7 @@ var splitSelectedParagraphByBr_1 = __webpack_require__(/*! ../../modelApi/block/
8138
8146
  function formatParagraphWithContentModel(editor, apiName, setStyleCallback) {
8139
8147
  editor.formatContentModel(function (model, context) {
8140
8148
  (0, splitSelectedParagraphByBr_1.splitSelectedParagraphByBr)(model);
8141
- var paragraphs = (0, roosterjs_content_model_dom_1.getSelectedParagraphs)(model, true /*mutate*/);
8149
+ var paragraphs = (0, roosterjs_content_model_dom_1.getSelectedParagraphs)(model, true /*mutate*/, false /*removeUnmeaningful*/);
8142
8150
  paragraphs.forEach(setStyleCallback);
8143
8151
  context.newPendingFormat = 'preserve';
8144
8152
  return paragraphs.length > 0;
@@ -12989,17 +12997,24 @@ var DOMEventPlugin = /** @class */ (function () {
12989
12997
  dragEvent.preventDefault();
12990
12998
  }
12991
12999
  };
12992
- this.onDrop = function () {
12993
- var _a, _b;
12994
- var doc = (_a = _this.editor) === null || _a === void 0 ? void 0 : _a.getDocument();
12995
- (_b = doc === null || doc === void 0 ? void 0 : doc.defaultView) === null || _b === void 0 ? void 0 : _b.requestAnimationFrame(function () {
12996
- if (_this.editor) {
12997
- _this.editor.takeSnapshot();
12998
- _this.editor.triggerEvent('contentChanged', {
12999
- source: roosterjs_content_model_dom_1.ChangeSource.Drop,
13000
+ this.onDrop = function (e) {
13001
+ var _a;
13002
+ if (_this.editor) {
13003
+ var beforeDropEvent = _this.editor.triggerEvent('beforeDrop', {
13004
+ rawEvent: e,
13005
+ });
13006
+ if (!(beforeDropEvent === null || beforeDropEvent === void 0 ? void 0 : beforeDropEvent.rawEvent.defaultPrevented)) {
13007
+ var doc = _this.editor.getDocument();
13008
+ (_a = doc === null || doc === void 0 ? void 0 : doc.defaultView) === null || _a === void 0 ? void 0 : _a.requestAnimationFrame(function () {
13009
+ if (_this.editor) {
13010
+ _this.editor.takeSnapshot();
13011
+ _this.editor.triggerEvent('contentChanged', {
13012
+ source: roosterjs_content_model_dom_1.ChangeSource.Drop,
13013
+ });
13014
+ }
13000
13015
  });
13001
13016
  }
13002
- });
13017
+ }
13003
13018
  };
13004
13019
  this.onScroll = function (e) {
13005
13020
  var _a;
@@ -13135,7 +13150,7 @@ var DOMEventPlugin = /** @class */ (function () {
13135
13150
  compositionend: { beforeDispatch: this.onCompositionEnd },
13136
13151
  // 4. Drag and Drop event
13137
13152
  dragstart: { beforeDispatch: this.onDragStart },
13138
- drop: { beforeDispatch: this.onDrop },
13153
+ drop: { beforeDispatch: function (event) { return _this.onDrop(event); } },
13139
13154
  // 5. Pointer event
13140
13155
  pointerdown: { beforeDispatch: function (event) { return _this.onPointerDown(event); } },
13141
13156
  };
@@ -15618,6 +15633,7 @@ var Editor = /** @class */ (function () {
15618
15633
  };
15619
15634
  this.core = (0, createEditorCore_1.createEditorCore)(contentDiv, options);
15620
15635
  var initialModel = (_a = options.initialModel) !== null && _a !== void 0 ? _a : (0, roosterjs_content_model_dom_1.createEmptyModel)(this.core.format.defaultFormat);
15636
+ (0, roosterjs_content_model_dom_1.sanitizeInvisibleUnicode)(initialModel);
15621
15637
  this.core.api.setContentModel(this.core, initialModel, { ignoreSelection: true }, undefined /*onNodeCreated*/, true /*isInitializing*/);
15622
15638
  this.core.plugins.forEach(function (plugin) { return plugin.initialize(_this); });
15623
15639
  }
@@ -16393,10 +16409,10 @@ function shouldApplyToItem(listStyleType, listType) {
16393
16409
  exports.listItemMetadataApplier = {
16394
16410
  metadataDefinition: roosterjs_content_model_dom_1.ListMetadataDefinition,
16395
16411
  applierFunction: function (metadata, format, context) {
16396
- var _a;
16397
- var depth = context.listFormat.nodeStack.length - 2; // Minus two for the parent element and convert length to index
16412
+ var _a, _b;
16413
+ var depth = context.listFormat.currentLevel;
16398
16414
  if (depth >= 0) {
16399
- var listType = (_a = context.listFormat.nodeStack[depth + 1].listType) !== null && _a !== void 0 ? _a : 'OL';
16415
+ var listType = (_b = (_a = context.listFormat.nodeStack[depth + 1]) === null || _a === void 0 ? void 0 : _a.listType) !== null && _b !== void 0 ? _b : 'OL';
16400
16416
  var listStyleType = (0, roosterjs_content_model_dom_1.getAutoListStyleType)(listType, metadata !== null && metadata !== void 0 ? metadata : {}, depth);
16401
16417
  if (listStyleType !== undefined) {
16402
16418
  if (shouldApplyToItem(listStyleType, listType)) {
@@ -16415,10 +16431,10 @@ exports.listItemMetadataApplier = {
16415
16431
  exports.listLevelMetadataApplier = {
16416
16432
  metadataDefinition: roosterjs_content_model_dom_1.ListMetadataDefinition,
16417
16433
  applierFunction: function (metadata, format, context) {
16418
- var _a;
16419
- var depth = context.listFormat.nodeStack.length - 2; // Minus two for the parent element and convert length to index
16434
+ var _a, _b;
16435
+ var depth = context.listFormat.currentLevel;
16420
16436
  if (depth >= 0) {
16421
- var listType = (_a = context.listFormat.nodeStack[depth + 1].listType) !== null && _a !== void 0 ? _a : 'OL';
16437
+ var listType = (_b = (_a = context.listFormat.nodeStack[depth + 1]) === null || _a === void 0 ? void 0 : _a.listType) !== null && _b !== void 0 ? _b : 'OL';
16422
16438
  var listStyleType = (0, roosterjs_content_model_dom_1.getAutoListStyleType)(listType, metadata !== null && metadata !== void 0 ? metadata : {}, depth);
16423
16439
  if (listStyleType !== undefined) {
16424
16440
  if (!shouldApplyToItem(listStyleType, listType)) {
@@ -20791,6 +20807,38 @@ function normalizeText(txt, isForward) {
20791
20807
  exports.normalizeText = normalizeText;
20792
20808
 
20793
20809
 
20810
+ /***/ },
20811
+
20812
+ /***/ "./packages/roosterjs-content-model-dom/lib/domUtils/stripInvisibleUnicode.ts"
20813
+ /*!************************************************************************************!*\
20814
+ !*** ./packages/roosterjs-content-model-dom/lib/domUtils/stripInvisibleUnicode.ts ***!
20815
+ \************************************************************************************/
20816
+ (__unused_webpack_module, exports) {
20817
+
20818
+ "use strict";
20819
+
20820
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
20821
+ exports.stripInvisibleUnicode = void 0;
20822
+ var INVISIBLE_UNICODE_REGEX =
20823
+ // eslint-disable-next-line no-misleading-character-class
20824
+ /[\u00AD\u034F\u061C\u115F\u1160\u17B4\u17B5\u180B-\u180E\u200B-\u200F\u202A-\u202E\u2028\u2029\u2060-\u2064\u2066-\u2069\u3164\uFEFF\uFFA0\uFFF9-\uFFFB]|\uDB40[\uDC01-\uDCFF]/g;
20825
+ /**
20826
+ * Strip invisible Unicode characters from a string.
20827
+ * This removes zero-width characters, bidirectional marks, Unicode Tags (U+E0001-U+E00FF),
20828
+ * interlinear annotation anchors, Mongolian free variation selectors,
20829
+ * and other invisible formatting characters that can be used to hide content in links.
20830
+ *
20831
+ * @remarks This function strips ZWJ (U+200D) which may affect emoji sequences.
20832
+ * It should only be applied to href attributes, not to visible text content.
20833
+ * @param value The string to strip invisible characters from
20834
+ * @returns The string with invisible characters removed
20835
+ */
20836
+ function stripInvisibleUnicode(value) {
20837
+ return value.replace(INVISIBLE_UNICODE_REGEX, '');
20838
+ }
20839
+ exports.stripInvisibleUnicode = stripInvisibleUnicode;
20840
+
20841
+
20794
20842
  /***/ },
20795
20843
 
20796
20844
  /***/ "./packages/roosterjs-content-model-dom/lib/domUtils/style/borderValues.ts"
@@ -21634,6 +21682,7 @@ var BorderStyleKeyMap = {
21634
21682
  borderBottom: 'border-bottom-style',
21635
21683
  borderLeft: 'border-left-style',
21636
21684
  };
21685
+ var DEFAULT_COLOR = '#000000';
21637
21686
  /**
21638
21687
  * @internal
21639
21688
  */
@@ -21644,7 +21693,8 @@ exports.borderColorFormatHandler = {
21644
21693
  borderKeys_1.BorderKeys.forEach(function (key) {
21645
21694
  var width = element.style.getPropertyValue(BorderWidthKeyMap[key]);
21646
21695
  var style = element.style.getPropertyValue(BorderStyleKeyMap[key]);
21647
- var borderColor = (0, color_1.retrieveElementColor)(element, key);
21696
+ var color = (0, color_1.retrieveElementColor)(element, key);
21697
+ var borderColor = color == 'initial' ? DEFAULT_COLOR : color;
21648
21698
  if (borderColor) {
21649
21699
  var lightModeColor = (0, color_1.getLightModeColor)(borderColor, !!context.isDarkMode, context.darkColorHandler);
21650
21700
  format[key] = (0, borderValues_1.combineBorderValue)({
@@ -21663,10 +21713,10 @@ exports.borderColorFormatHandler = {
21663
21713
  var value = format[key];
21664
21714
  if (value) {
21665
21715
  var borderValues = (0, borderValues_1.extractBorderValues)(value);
21716
+ var borderColorProperty = borderKeys_1.BorderColorKeyMap[key];
21666
21717
  if (borderValues.color) {
21667
21718
  var transformedColor = (0, color_1.adaptColor)(element, borderValues.color, 'border', !!context.isDarkMode, context.darkColorHandler);
21668
21719
  if (transformedColor) {
21669
- var borderColorProperty = borderKeys_1.BorderColorKeyMap[key];
21670
21720
  element.style.setProperty(borderColorProperty, transformedColor);
21671
21721
  }
21672
21722
  }
@@ -23585,9 +23635,9 @@ exports.shouldSetValue = shouldSetValue;
23585
23635
 
23586
23636
  Object.defineProperty(exports, "__esModule", ({ value: true }));
23587
23637
  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;
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;
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;
23638
+ 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.sanitizeInvisibleUnicode = 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;
23639
+ 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.stripInvisibleUnicode = exports.normalizeText = exports.isSpace = exports.isPunctuation = exports.extractBorderValues = exports.combineBorderValue = exports.getNodePositionFromEvent = exports.isCursorMovingKey = exports.isModifierKey = exports.isCharacterValue = exports.trimModelForSelection = void 0;
23640
+ 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 = exports.runEditSteps = exports.getClosestAncestorBlockGroupIndex = void 0;
23591
23641
  var domToContentModel_1 = __webpack_require__(/*! ./domToModel/domToContentModel */ "./packages/roosterjs-content-model-dom/lib/domToModel/domToContentModel.ts");
23592
23642
  Object.defineProperty(exports, "domToContentModel", ({ enumerable: true, get: function () { return domToContentModel_1.domToContentModel; } }));
23593
23643
  var contentModelToDom_1 = __webpack_require__(/*! ./modelToDom/contentModelToDom */ "./packages/roosterjs-content-model-dom/lib/modelToDom/contentModelToDom.ts");
@@ -23708,6 +23758,8 @@ var normalizeParagraph_1 = __webpack_require__(/*! ./modelApi/common/normalizePa
23708
23758
  Object.defineProperty(exports, "normalizeParagraph", ({ enumerable: true, get: function () { return normalizeParagraph_1.normalizeParagraph; } }));
23709
23759
  var normalizeContentModel_1 = __webpack_require__(/*! ./modelApi/common/normalizeContentModel */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/normalizeContentModel.ts");
23710
23760
  Object.defineProperty(exports, "normalizeContentModel", ({ enumerable: true, get: function () { return normalizeContentModel_1.normalizeContentModel; } }));
23761
+ var sanitizeInvisibleUnicode_1 = __webpack_require__(/*! ./modelApi/common/sanitizeInvisibleUnicode */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/sanitizeInvisibleUnicode.ts");
23762
+ Object.defineProperty(exports, "sanitizeInvisibleUnicode", ({ enumerable: true, get: function () { return sanitizeInvisibleUnicode_1.sanitizeInvisibleUnicode; } }));
23711
23763
  var isGeneralSegment_1 = __webpack_require__(/*! ./modelApi/typeCheck/isGeneralSegment */ "./packages/roosterjs-content-model-dom/lib/modelApi/typeCheck/isGeneralSegment.ts");
23712
23764
  Object.defineProperty(exports, "isGeneralSegment", ({ enumerable: true, get: function () { return isGeneralSegment_1.isGeneralSegment; } }));
23713
23765
  var unwrapBlock_1 = __webpack_require__(/*! ./modelApi/common/unwrapBlock */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/unwrapBlock.ts");
@@ -23773,6 +23825,8 @@ var stringUtil_1 = __webpack_require__(/*! ./domUtils/stringUtil */ "./packages/
23773
23825
  Object.defineProperty(exports, "isPunctuation", ({ enumerable: true, get: function () { return stringUtil_1.isPunctuation; } }));
23774
23826
  Object.defineProperty(exports, "isSpace", ({ enumerable: true, get: function () { return stringUtil_1.isSpace; } }));
23775
23827
  Object.defineProperty(exports, "normalizeText", ({ enumerable: true, get: function () { return stringUtil_1.normalizeText; } }));
23828
+ var stripInvisibleUnicode_1 = __webpack_require__(/*! ./domUtils/stripInvisibleUnicode */ "./packages/roosterjs-content-model-dom/lib/domUtils/stripInvisibleUnicode.ts");
23829
+ Object.defineProperty(exports, "stripInvisibleUnicode", ({ enumerable: true, get: function () { return stripInvisibleUnicode_1.stripInvisibleUnicode; } }));
23776
23830
  var parseTableCells_1 = __webpack_require__(/*! ./domUtils/table/parseTableCells */ "./packages/roosterjs-content-model-dom/lib/domUtils/table/parseTableCells.ts");
23777
23831
  Object.defineProperty(exports, "parseTableCells", ({ enumerable: true, get: function () { return parseTableCells_1.parseTableCells; } }));
23778
23832
  var readFile_1 = __webpack_require__(/*! ./domUtils/readFile */ "./packages/roosterjs-content-model-dom/lib/domUtils/readFile.ts");
@@ -23903,6 +23957,8 @@ exports.ListFormatsToKeep = [
23903
23957
  'direction',
23904
23958
  'textAlign',
23905
23959
  'htmlAlign',
23960
+ 'marginBottom',
23961
+ 'marginTop',
23906
23962
  ];
23907
23963
  /**
23908
23964
  * When copy format from one block to another, these are all the formats that we can copy
@@ -24769,6 +24825,134 @@ function normalizeSegmentFormat(format, environment) {
24769
24825
  exports.normalizeSegmentFormat = normalizeSegmentFormat;
24770
24826
 
24771
24827
 
24828
+ /***/ },
24829
+
24830
+ /***/ "./packages/roosterjs-content-model-dom/lib/modelApi/common/sanitizeInvisibleUnicode.ts"
24831
+ /*!**********************************************************************************************!*\
24832
+ !*** ./packages/roosterjs-content-model-dom/lib/modelApi/common/sanitizeInvisibleUnicode.ts ***!
24833
+ \**********************************************************************************************/
24834
+ (__unused_webpack_module, exports, __webpack_require__) {
24835
+
24836
+ "use strict";
24837
+
24838
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
24839
+ exports.sanitizeInvisibleUnicode = void 0;
24840
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
24841
+ var stripInvisibleUnicode_1 = __webpack_require__(/*! ../../domUtils/stripInvisibleUnicode */ "./packages/roosterjs-content-model-dom/lib/domUtils/stripInvisibleUnicode.ts");
24842
+ /**
24843
+ * Strip invisible Unicode characters from all text and link hrefs in a content model.
24844
+ * This sanitizes the model at initialization time to prevent hidden content in links
24845
+ * or text (e.g. zero-width chars, bidirectional marks, Unicode Tags).
24846
+ * For General segments, all Text nodes under the element are also sanitized.
24847
+ * @param model The content model document to sanitize in-place
24848
+ */
24849
+ function sanitizeInvisibleUnicode(model) {
24850
+ sanitizeBlockGroup(model);
24851
+ }
24852
+ exports.sanitizeInvisibleUnicode = sanitizeInvisibleUnicode;
24853
+ function sanitizeBlockGroup(group) {
24854
+ var e_1, _a;
24855
+ try {
24856
+ for (var _b = (0, tslib_1.__values)(group.blocks), _c = _b.next(); !_c.done; _c = _b.next()) {
24857
+ var block = _c.value;
24858
+ sanitizeBlock(block);
24859
+ }
24860
+ }
24861
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
24862
+ finally {
24863
+ try {
24864
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
24865
+ }
24866
+ finally { if (e_1) throw e_1.error; }
24867
+ }
24868
+ }
24869
+ function sanitizeBlock(block) {
24870
+ var e_2, _a, e_3, _b, e_4, _c;
24871
+ switch (block.blockType) {
24872
+ case 'Paragraph':
24873
+ try {
24874
+ for (var _d = (0, tslib_1.__values)(block.segments), _e = _d.next(); !_e.done; _e = _d.next()) {
24875
+ var segment = _e.value;
24876
+ sanitizeSegment(segment);
24877
+ }
24878
+ }
24879
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
24880
+ finally {
24881
+ try {
24882
+ if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
24883
+ }
24884
+ finally { if (e_2) throw e_2.error; }
24885
+ }
24886
+ break;
24887
+ case 'Table':
24888
+ try {
24889
+ for (var _f = (0, tslib_1.__values)(block.rows), _g = _f.next(); !_g.done; _g = _f.next()) {
24890
+ var row = _g.value;
24891
+ try {
24892
+ for (var _h = (e_4 = void 0, (0, tslib_1.__values)(row.cells)), _j = _h.next(); !_j.done; _j = _h.next()) {
24893
+ var cell = _j.value;
24894
+ sanitizeBlockGroup(cell);
24895
+ }
24896
+ }
24897
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
24898
+ finally {
24899
+ try {
24900
+ if (_j && !_j.done && (_c = _h.return)) _c.call(_h);
24901
+ }
24902
+ finally { if (e_4) throw e_4.error; }
24903
+ }
24904
+ }
24905
+ }
24906
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
24907
+ finally {
24908
+ try {
24909
+ if (_g && !_g.done && (_b = _f.return)) _b.call(_f);
24910
+ }
24911
+ finally { if (e_3) throw e_3.error; }
24912
+ }
24913
+ break;
24914
+ case 'BlockGroup':
24915
+ sanitizeBlockGroup(block);
24916
+ if (block.blockGroupType === 'General' && block.element) {
24917
+ sanitizeTextNodes(block.element);
24918
+ }
24919
+ break;
24920
+ case 'Entity':
24921
+ case 'Divider':
24922
+ break;
24923
+ }
24924
+ }
24925
+ function sanitizeSegment(segment) {
24926
+ var _a;
24927
+ if ((_a = segment.link) === null || _a === void 0 ? void 0 : _a.format.href) {
24928
+ segment.link.format.href = (0, stripInvisibleUnicode_1.stripInvisibleUnicode)(segment.link.format.href);
24929
+ }
24930
+ switch (segment.segmentType) {
24931
+ case 'Text':
24932
+ segment.text = (0, stripInvisibleUnicode_1.stripInvisibleUnicode)(segment.text);
24933
+ break;
24934
+ case 'General':
24935
+ sanitizeTextNodes(segment.element);
24936
+ sanitizeBlockGroup(segment);
24937
+ break;
24938
+ case 'Image':
24939
+ case 'Entity':
24940
+ case 'Br':
24941
+ case 'SelectionMarker':
24942
+ break;
24943
+ }
24944
+ }
24945
+ function sanitizeTextNodes(element) {
24946
+ var walker = element.ownerDocument.createTreeWalker(element, NodeFilter.SHOW_TEXT);
24947
+ var node;
24948
+ while ((node = walker.nextNode())) {
24949
+ if (node.nodeValue) {
24950
+ node.nodeValue = (0, stripInvisibleUnicode_1.stripInvisibleUnicode)(node.nodeValue);
24951
+ }
24952
+ }
24953
+ }
24954
+
24955
+
24772
24956
  /***/ },
24773
24957
 
24774
24958
  /***/ "./packages/roosterjs-content-model-dom/lib/modelApi/common/unwrapBlock.ts"
@@ -28118,10 +28302,13 @@ function getSelectedSegments(model, includingFormatHolder, mutate) {
28118
28302
  return segments.map(function (x) { return x[0]; });
28119
28303
  }
28120
28304
  exports.getSelectedSegments = getSelectedSegments;
28121
- function getSelectedParagraphs(model, mutate) {
28305
+ function getSelectedParagraphs(model, mutate, removeUnmeaningful) {
28306
+ if (removeUnmeaningful === void 0) { removeUnmeaningful = true; }
28122
28307
  var selections = collectSelections(model, { includeListFormatHolder: 'never' });
28123
28308
  var result = [];
28124
- removeUnmeaningfulSelections(selections);
28309
+ if (removeUnmeaningful) {
28310
+ removeUnmeaningfulSelections(selections);
28311
+ }
28125
28312
  selections.forEach(function (_a) {
28126
28313
  var block = _a.block;
28127
28314
  if ((block === null || block === void 0 ? void 0 : block.blockType) == 'Paragraph') {
@@ -28895,6 +29082,7 @@ function createModelToDomFormatContext() {
28895
29082
  listFormat: {
28896
29083
  threadItemCounts: [],
28897
29084
  nodeStack: [],
29085
+ currentLevel: 0,
28898
29086
  },
28899
29087
  implicitFormat: {},
28900
29088
  };
@@ -29469,6 +29657,7 @@ var handleList = function (doc, parent, listItem, context, refNode) {
29469
29657
  var parentLevel = nodeStack[layer];
29470
29658
  var stackLevel = nodeStack[layer + 1];
29471
29659
  var itemLevel = listItem.levels[layer];
29660
+ context.listFormat.currentLevel = layer;
29472
29661
  if (stackLevel.listType != itemLevel.listType ||
29473
29662
  ((_a = stackLevel.dataset) === null || _a === void 0 ? void 0 : _a.editingInfo) != itemLevel.dataset.editingInfo ||
29474
29663
  (itemLevel.listType == 'OL' &&
@@ -29504,6 +29693,7 @@ var handleList = function (doc, parent, listItem, context, refNode) {
29504
29693
  var newList = void 0;
29505
29694
  var isNewlyCreated = false;
29506
29695
  var levelRefNode = (_c = nodeStack[layer].refNode) !== null && _c !== void 0 ? _c : null;
29696
+ context.listFormat.currentLevel = layer;
29507
29697
  if (context.allowCacheListItem && level.cachedElement) {
29508
29698
  newList = level.cachedElement;
29509
29699
  nodeStack[layer].refNode = (0, reuseCachedElement_1.reuseCachedElement)(lastParent, level.cachedElement, levelRefNode, context.rewriteFromModel);
@@ -31349,16 +31539,43 @@ exports.isMarkdownTable = isMarkdownTable;
31349
31539
 
31350
31540
  Object.defineProperty(exports, "__esModule", ({ value: true }));
31351
31541
  exports.splitParagraphSegments = void 0;
31352
- var linkRegex = /(\[([^\[]+)\]\((https?:\/\/[^\)]+)\))|(\!\[([^\[]+)\]\((https?:\/\/[^\)]+)\))/g;
31542
+ // Matches markdown links and images in a string.
31543
+ // Group 1 (full link): [text](url) e.g. [Click here](https://example.com)
31544
+ // Group 2: link text e.g. "Click here"
31545
+ // Group 3: link url e.g. "https://example.com"
31546
+ // Group 4 (full image): ![alt](url) e.g. ![Logo](https://example.com/logo.png)
31547
+ // Group 5: alt text e.g. "Logo"
31548
+ // Group 6: image url e.g. "https://example.com/logo.png"
31549
+ var linkRegex = /(\[([^\[]+)\]\(([^\)]+)\))|(\!\[([^\[]+)\]\(([^\)]+)\))/g;
31353
31550
  var isValidUrl = function (url) {
31354
- try {
31355
- new URL(url);
31551
+ if (!url) {
31552
+ return false;
31553
+ }
31554
+ // Accept common non-http schemes and relative paths
31555
+ if (url.startsWith('data:') ||
31556
+ url.startsWith('blob:') ||
31557
+ url.startsWith('/') ||
31558
+ url.startsWith('./') ||
31559
+ url.startsWith('../')) {
31356
31560
  return true;
31357
31561
  }
31562
+ try {
31563
+ var parsed = new URL(url);
31564
+ return parsed.protocol === 'http:' || parsed.protocol === 'https:';
31565
+ }
31358
31566
  catch (_) {
31359
31567
  return false;
31360
31568
  }
31361
31569
  };
31570
+ function pushText(result, text) {
31571
+ var last = result[result.length - 1];
31572
+ if (last && last.type === 'text') {
31573
+ last.text += text;
31574
+ }
31575
+ else {
31576
+ result.push({ type: 'text', text: text, url: '' });
31577
+ }
31578
+ }
31362
31579
  /**
31363
31580
  * @internal
31364
31581
  */
@@ -31368,22 +31585,28 @@ function splitParagraphSegments(text) {
31368
31585
  var match = null;
31369
31586
  while ((match = linkRegex.exec(text)) !== null) {
31370
31587
  if (match.index > lastIndex) {
31371
- result.push({ type: 'text', text: text.slice(lastIndex, match.index), url: '' });
31588
+ pushText(result, text.slice(lastIndex, match.index));
31372
31589
  }
31373
31590
  if (match[2] && match[3]) {
31374
- result.push(isValidUrl(match[3])
31375
- ? { type: 'link', text: match[2], url: match[3] }
31376
- : { type: 'text', text: match[0], url: '' });
31591
+ if (isValidUrl(match[3])) {
31592
+ result.push({ type: 'link', text: match[2], url: match[3] });
31593
+ }
31594
+ else {
31595
+ pushText(result, match[0]);
31596
+ }
31377
31597
  }
31378
31598
  else if (match[5] && match[6]) {
31379
- result.push(isValidUrl(match[6])
31380
- ? { type: 'image', text: match[5], url: match[6] }
31381
- : { type: 'text', text: match[0], url: '' });
31599
+ if (isValidUrl(match[6])) {
31600
+ result.push({ type: 'image', text: match[5], url: match[6] });
31601
+ }
31602
+ else {
31603
+ pushText(result, match[0]);
31604
+ }
31382
31605
  }
31383
31606
  lastIndex = linkRegex.lastIndex;
31384
31607
  }
31385
31608
  if (lastIndex < text.length) {
31386
- result.push({ type: 'text', text: text.slice(lastIndex), url: '' });
31609
+ pushText(result, text.slice(lastIndex));
31387
31610
  }
31388
31611
  return result;
31389
31612
  }
@@ -33208,6 +33431,192 @@ var CustomReplacePlugin = /** @class */ (function () {
33208
33431
  exports.CustomReplacePlugin = CustomReplacePlugin;
33209
33432
 
33210
33433
 
33434
+ /***/ },
33435
+
33436
+ /***/ "./packages/roosterjs-content-model-plugins/lib/dragAndDrop/DragAndDropPlugin.ts"
33437
+ /*!***************************************************************************************!*\
33438
+ !*** ./packages/roosterjs-content-model-plugins/lib/dragAndDrop/DragAndDropPlugin.ts ***!
33439
+ \***************************************************************************************/
33440
+ (__unused_webpack_module, exports, __webpack_require__) {
33441
+
33442
+ "use strict";
33443
+
33444
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
33445
+ exports.DragAndDropPlugin = void 0;
33446
+ var handleDroppedContent_1 = __webpack_require__(/*! ./utils/handleDroppedContent */ "./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/handleDroppedContent.ts");
33447
+ var DefaultOptions = {
33448
+ forbiddenElements: ['iframe'],
33449
+ };
33450
+ /**
33451
+ * DragAndDrop plugin, handles ContentChanged event when change source is "Drop"
33452
+ * to sanitize dropped content, similar to how PastePlugin sanitizes pasted content.
33453
+ */
33454
+ var DragAndDropPlugin = /** @class */ (function () {
33455
+ /**
33456
+ * Construct a new instance of DragAndDropPlugin
33457
+ */
33458
+ function DragAndDropPlugin(options) {
33459
+ if (options === void 0) { options = DefaultOptions; }
33460
+ var _a;
33461
+ this.editor = null;
33462
+ this.forbiddenElements = [];
33463
+ this.isInternalDragging = false;
33464
+ this.disposer = null;
33465
+ this.forbiddenElements = (_a = options.forbiddenElements) !== null && _a !== void 0 ? _a : [];
33466
+ }
33467
+ /**
33468
+ * Get name of this plugin
33469
+ */
33470
+ DragAndDropPlugin.prototype.getName = function () {
33471
+ return 'DragAndDrop';
33472
+ };
33473
+ /**
33474
+ * The first method that editor will call to a plugin when editor is initializing.
33475
+ * It will pass in the editor instance, plugin should take this chance to save the
33476
+ * editor reference so that it can call to any editor method or format API later.
33477
+ * @param editor The editor object
33478
+ */
33479
+ DragAndDropPlugin.prototype.initialize = function (editor) {
33480
+ var _this = this;
33481
+ this.editor = editor;
33482
+ this.disposer = editor.attachDomEvent({
33483
+ dragstart: {
33484
+ beforeDispatch: function (_ev) {
33485
+ _this.isInternalDragging = true;
33486
+ },
33487
+ },
33488
+ });
33489
+ };
33490
+ /**
33491
+ * The last method that editor will call to a plugin before it is disposed.
33492
+ * Plugin can take this chance to clear the reference to editor. After this method is
33493
+ * called, plugin should not call to any editor method since it will result in error.
33494
+ */
33495
+ DragAndDropPlugin.prototype.dispose = function () {
33496
+ this.editor = null;
33497
+ if (this.disposer) {
33498
+ this.disposer();
33499
+ this.disposer = null;
33500
+ }
33501
+ this.isInternalDragging = false;
33502
+ this.forbiddenElements = [];
33503
+ };
33504
+ /**
33505
+ * Core method for a plugin. Once an event happens in editor, editor will call this
33506
+ * method of each plugin to handle the event as long as the event is not handled
33507
+ * exclusively by another plugin.
33508
+ * @param event The event to handle:
33509
+ */
33510
+ DragAndDropPlugin.prototype.onPluginEvent = function (event) {
33511
+ var _a;
33512
+ if (this.editor && event.eventType == 'beforeDrop') {
33513
+ if (this.isInternalDragging) {
33514
+ this.isInternalDragging = false;
33515
+ }
33516
+ else {
33517
+ var dropEvent = event.rawEvent;
33518
+ var html = (_a = dropEvent.dataTransfer) === null || _a === void 0 ? void 0 : _a.getData('text/html');
33519
+ if (html) {
33520
+ (0, handleDroppedContent_1.handleDroppedContent)(this.editor, dropEvent, html, this.forbiddenElements);
33521
+ }
33522
+ }
33523
+ return;
33524
+ }
33525
+ };
33526
+ return DragAndDropPlugin;
33527
+ }());
33528
+ exports.DragAndDropPlugin = DragAndDropPlugin;
33529
+
33530
+
33531
+ /***/ },
33532
+
33533
+ /***/ "./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/cleanForbiddenElements.ts"
33534
+ /*!**************************************************************************************************!*\
33535
+ !*** ./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/cleanForbiddenElements.ts ***!
33536
+ \**************************************************************************************************/
33537
+ (__unused_webpack_module, exports, __webpack_require__) {
33538
+
33539
+ "use strict";
33540
+
33541
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
33542
+ exports.cleanForbiddenElements = void 0;
33543
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
33544
+ /**
33545
+ * @internal
33546
+ * Remove all forbidden elements from a parsed HTML document
33547
+ * @param doc The parsed HTML document to clean
33548
+ * @param forbiddenElements Array of tag names to remove (e.g., ['iframe', 'script'])
33549
+ */
33550
+ function cleanForbiddenElements(doc, forbiddenElements) {
33551
+ var e_1, _a;
33552
+ var _b;
33553
+ if (forbiddenElements.length === 0) {
33554
+ return;
33555
+ }
33556
+ var selector = forbiddenElements.join(',');
33557
+ var elements = Array.from(doc.body.querySelectorAll(selector));
33558
+ try {
33559
+ for (var elements_1 = (0, tslib_1.__values)(elements), elements_1_1 = elements_1.next(); !elements_1_1.done; elements_1_1 = elements_1.next()) {
33560
+ var element = elements_1_1.value;
33561
+ (_b = element.parentNode) === null || _b === void 0 ? void 0 : _b.removeChild(element);
33562
+ }
33563
+ }
33564
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
33565
+ finally {
33566
+ try {
33567
+ if (elements_1_1 && !elements_1_1.done && (_a = elements_1.return)) _a.call(elements_1);
33568
+ }
33569
+ finally { if (e_1) throw e_1.error; }
33570
+ }
33571
+ }
33572
+ exports.cleanForbiddenElements = cleanForbiddenElements;
33573
+
33574
+
33575
+ /***/ },
33576
+
33577
+ /***/ "./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/handleDroppedContent.ts"
33578
+ /*!************************************************************************************************!*\
33579
+ !*** ./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/handleDroppedContent.ts ***!
33580
+ \************************************************************************************************/
33581
+ (__unused_webpack_module, exports, __webpack_require__) {
33582
+
33583
+ "use strict";
33584
+
33585
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
33586
+ exports.handleDroppedContent = void 0;
33587
+ var cleanForbiddenElements_1 = __webpack_require__(/*! ./cleanForbiddenElements */ "./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/cleanForbiddenElements.ts");
33588
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
33589
+ /**
33590
+ * @internal
33591
+ * Handle dropped HTML content by inserting it at the drop position
33592
+ */
33593
+ function handleDroppedContent(editor, event, html, forbiddenElements) {
33594
+ var doc = editor.getDocument();
33595
+ var domPosition = (0, roosterjs_content_model_dom_1.getNodePositionFromEvent)(doc, editor.getDOMHelper(), event.x, event.y);
33596
+ if (domPosition) {
33597
+ event.preventDefault();
33598
+ event.stopPropagation();
33599
+ var range = doc.createRange();
33600
+ range.setStart(domPosition.node, domPosition.offset);
33601
+ range.collapse(true);
33602
+ var parsedHtml = editor.getDOMCreator().htmlToDOM(html);
33603
+ (0, cleanForbiddenElements_1.cleanForbiddenElements)(parsedHtml, forbiddenElements);
33604
+ var droppedModel_1 = (0, roosterjs_content_model_dom_1.domToContentModel)(parsedHtml.body, (0, roosterjs_content_model_dom_1.createDomToModelContext)());
33605
+ editor.formatContentModel(function (model, context) {
33606
+ (0, roosterjs_content_model_dom_1.mergeModel)(model, droppedModel_1, context);
33607
+ return true;
33608
+ }, {
33609
+ selectionOverride: {
33610
+ type: 'range',
33611
+ range: range,
33612
+ isReverted: false,
33613
+ },
33614
+ });
33615
+ }
33616
+ }
33617
+ exports.handleDroppedContent = handleDroppedContent;
33618
+
33619
+
33211
33620
  /***/ },
33212
33621
 
33213
33622
  /***/ "./packages/roosterjs-content-model-plugins/lib/edit/EditPlugin.ts"
@@ -38212,7 +38621,7 @@ exports.updateWrapper = updateWrapper;
38212
38621
  "use strict";
38213
38622
 
38214
38623
  Object.defineProperty(exports, "__esModule", ({ value: true }));
38215
- exports.AnnouncePlugin = exports.moveHighlight = exports.replace = exports.find = exports.createFindReplaceContext = exports.FindReplacePlugin = exports.TouchPlugin = exports.HiddenPropertyPlugin = exports.ImageEditPlugin = exports.CustomReplacePlugin = exports.PickerPlugin = exports.HyperlinkPlugin = exports.MarkdownPlugin = exports.isModelEmptyFast = exports.WatermarkPlugin = exports.ContextMenuPluginBase = exports.ShortcutPlugin = exports.ShortcutOutdentList = exports.ShortcutIndentList = exports.ShortcutDecreaseFont = exports.ShortcutIncreaseFont = exports.ShortcutNumbering = exports.ShortcutBullet = exports.ShortcutRedoMacOS = exports.ShortcutRedoAlt = exports.ShortcutRedo = exports.ShortcutUndo2 = exports.ShortcutUndo = exports.ShortcutClearFormat = exports.ShortcutUnderline = exports.ShortcutItalic = exports.ShortcutBold = exports.AutoFormatPlugin = exports.EditPlugin = exports.DefaultSanitizers = exports.PastePlugin = exports.TableEditPlugin = void 0;
38624
+ exports.DragAndDropPlugin = exports.AnnouncePlugin = exports.moveHighlight = exports.replace = exports.find = exports.createFindReplaceContext = exports.FindReplacePlugin = exports.TouchPlugin = exports.HiddenPropertyPlugin = exports.ImageEditPlugin = exports.CustomReplacePlugin = exports.PickerPlugin = exports.HyperlinkPlugin = exports.MarkdownPlugin = exports.isModelEmptyFast = exports.WatermarkPlugin = exports.ContextMenuPluginBase = exports.ShortcutPlugin = exports.ShortcutOutdentList = exports.ShortcutIndentList = exports.ShortcutDecreaseFont = exports.ShortcutIncreaseFont = exports.ShortcutNumbering = exports.ShortcutBullet = exports.ShortcutRedoMacOS = exports.ShortcutRedoAlt = exports.ShortcutRedo = exports.ShortcutUndo2 = exports.ShortcutUndo = exports.ShortcutClearFormat = exports.ShortcutUnderline = exports.ShortcutItalic = exports.ShortcutBold = exports.AutoFormatPlugin = exports.EditPlugin = exports.DefaultSanitizers = exports.PastePlugin = exports.TableEditPlugin = void 0;
38216
38625
  var TableEditPlugin_1 = __webpack_require__(/*! ./tableEdit/TableEditPlugin */ "./packages/roosterjs-content-model-plugins/lib/tableEdit/TableEditPlugin.ts");
38217
38626
  Object.defineProperty(exports, "TableEditPlugin", ({ enumerable: true, get: function () { return TableEditPlugin_1.TableEditPlugin; } }));
38218
38627
  var PastePlugin_1 = __webpack_require__(/*! ./paste/PastePlugin */ "./packages/roosterjs-content-model-plugins/lib/paste/PastePlugin.ts");
@@ -38273,6 +38682,8 @@ var moveHighlight_1 = __webpack_require__(/*! ./findReplace/moveHighlight */ "./
38273
38682
  Object.defineProperty(exports, "moveHighlight", ({ enumerable: true, get: function () { return moveHighlight_1.moveHighlight; } }));
38274
38683
  var AnnouncePlugin_1 = __webpack_require__(/*! ./announce/AnnouncePlugin */ "./packages/roosterjs-content-model-plugins/lib/announce/AnnouncePlugin.ts");
38275
38684
  Object.defineProperty(exports, "AnnouncePlugin", ({ enumerable: true, get: function () { return AnnouncePlugin_1.AnnouncePlugin; } }));
38685
+ var DragAndDropPlugin_1 = __webpack_require__(/*! ./dragAndDrop/DragAndDropPlugin */ "./packages/roosterjs-content-model-plugins/lib/dragAndDrop/DragAndDropPlugin.ts");
38686
+ Object.defineProperty(exports, "DragAndDropPlugin", ({ enumerable: true, get: function () { return DragAndDropPlugin_1.DragAndDropPlugin; } }));
38276
38687
 
38277
38688
 
38278
38689
  /***/ },