roosterjs 8.53.0 → 8.55.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.
package/dist/rooster.js CHANGED
@@ -2725,7 +2725,7 @@ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./
2725
2725
  * Get element based Format State at cursor
2726
2726
  * @param editor The editor instance
2727
2727
  * @param event (Optional) The plugin event, it stores the event cached data for looking up.
2728
- * In this function the event cache is used to get list state and header level. If not passed,
2728
+ * In this function the event cache is used to get list state and heading level. If not passed,
2729
2729
  * it will query the node within selection to get the info
2730
2730
  * @returns An ElementBasedFormatState object
2731
2731
  */
@@ -2739,17 +2739,19 @@ function getElementBasedFormatState(editor, event) {
2739
2739
  var endingBlock = editor.getBlockElementAtNode(range.endContainer);
2740
2740
  multiline = endingBlock && startingBlock ? !endingBlock.equals(startingBlock) : false;
2741
2741
  }
2742
- var headerTag = (0, roosterjs_editor_dom_1.getTagOfNode)(editor.getElementAtCursor('H1,H2,H3,H4,H5,H6', undefined /*startFrom*/, event));
2742
+ var headingTag = (0, roosterjs_editor_dom_1.getTagOfNode)(editor.getElementAtCursor('H1,H2,H3,H4,H5,H6', undefined /*startFrom*/, event));
2743
2743
  var table = editor.queryElements('table', 1 /* OnSelection */)[0];
2744
2744
  var tableFormat = table ? (0, roosterjs_editor_dom_1.getTableFormatInfo)(table) : undefined;
2745
- var hasHeader = (table === null || table === void 0 ? void 0 : table.rows[0])
2745
+ var hasTableHeader = (table === null || table === void 0 ? void 0 : table.rows[0])
2746
2746
  ? (0, roosterjs_editor_dom_1.toArray)(table.rows[0].cells).every(function (cell) { return (0, roosterjs_editor_dom_1.getTagOfNode)(cell) == 'TH'; })
2747
2747
  : undefined;
2748
+ var headingLevel = (headingTag && parseInt(headingTag[1])) || 0;
2748
2749
  return {
2749
2750
  isBullet: listTag == 'UL',
2750
2751
  isNumbering: listTag == 'OL',
2751
2752
  isMultilineSelection: multiline,
2752
- headerLevel: (headerTag && parseInt(headerTag[1])) || 0,
2753
+ headingLevel: headingLevel,
2754
+ headerLevel: headingLevel,
2753
2755
  canUnlink: !!editor.queryElements('a[href]', 1 /* OnSelection */)[0],
2754
2756
  canAddImageAltText: !!editor.queryElements('img', 1 /* OnSelection */)[0],
2755
2757
  isBlockQuote: !!editor.queryElements('blockquote', 1 /* OnSelection */)[0],
@@ -2757,7 +2759,7 @@ function getElementBasedFormatState(editor, event) {
2757
2759
  isCodeBlock: !!editor.queryElements('pre>code', 1 /* OnSelection */)[0],
2758
2760
  isInTable: !!table,
2759
2761
  tableFormat: tableFormat || {},
2760
- tableHasHeader: hasHeader,
2762
+ tableHasHeader: hasTableHeader,
2761
2763
  canMergeTableCell: canMergeTableCell(editor),
2762
2764
  };
2763
2765
  }
@@ -2768,7 +2770,7 @@ exports.getElementBasedFormatState = getElementBasedFormatState;
2768
2770
  * bold, italic, underline, font name, font size, etc.
2769
2771
  * @param editor The editor instance
2770
2772
  * @param event (Optional) The plugin event, it stores the event cached data for looking up.
2771
- * In this function the event cache is used to get list state and header level. If not passed,
2773
+ * In this function the event cache is used to get list state and heading level. If not passed,
2772
2774
  * it will query the node within selection to get the info
2773
2775
  * @returns The format state at cursor
2774
2776
  */
@@ -3294,6 +3296,66 @@ function setFontSize(editor, fontSize) {
3294
3296
  exports["default"] = setFontSize;
3295
3297
 
3296
3298
 
3299
+ /***/ }),
3300
+
3301
+ /***/ "./packages/roosterjs-editor-api/lib/format/setHeadingLevel.ts":
3302
+ /*!*********************************************************************!*\
3303
+ !*** ./packages/roosterjs-editor-api/lib/format/setHeadingLevel.ts ***!
3304
+ \*********************************************************************/
3305
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
3306
+
3307
+ "use strict";
3308
+
3309
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
3310
+ exports.toggleHeader = void 0;
3311
+ var formatUndoSnapshot_1 = __webpack_require__(/*! ../utils/formatUndoSnapshot */ "./packages/roosterjs-editor-api/lib/utils/formatUndoSnapshot.ts");
3312
+ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
3313
+ /**
3314
+ * Set heading level at selection
3315
+ * @param editor The editor instance
3316
+ * @param level The heading level, can be a number from 0 to 6, in which 1 ~ 6 refers to
3317
+ * the HTML heading element <H1> to <H6>, 0 means no heading
3318
+ * if passed in param is outside the range, will be rounded to nearest number in the range
3319
+ */
3320
+ function setHeadingLevel(editor, level) {
3321
+ level = Math.min(Math.max(Math.round(level), 0), 6);
3322
+ (0, formatUndoSnapshot_1.default)(editor, function () {
3323
+ editor.focus();
3324
+ var wrapped = false;
3325
+ editor.queryElements('H1,H2,H3,H4,H5,H6', 1 /* OnSelection */, function (heading) {
3326
+ if (!wrapped) {
3327
+ editor.getDocument().execCommand("formatBlock" /* FormatBlock */, false, '<DIV>');
3328
+ wrapped = true;
3329
+ }
3330
+ var div = editor.getDocument().createElement('div');
3331
+ (0, roosterjs_editor_dom_1.moveChildNodes)(div, heading);
3332
+ editor.replaceNode(heading, div);
3333
+ });
3334
+ if (level > 0) {
3335
+ var traverser = editor.getSelectionTraverser();
3336
+ var blockElement = traverser === null || traverser === void 0 ? void 0 : traverser.currentBlockElement;
3337
+ var sanitizer = new roosterjs_editor_dom_1.HtmlSanitizer({
3338
+ cssStyleCallbacks: {
3339
+ 'font-size': function () { return false; },
3340
+ },
3341
+ });
3342
+ while (blockElement) {
3343
+ var element = blockElement.collapseToSingleElement();
3344
+ sanitizer.sanitize(element);
3345
+ blockElement = traverser === null || traverser === void 0 ? void 0 : traverser.getNextBlockElement();
3346
+ }
3347
+ editor.getDocument().execCommand("formatBlock" /* FormatBlock */, false, "<H" + level + ">");
3348
+ }
3349
+ }, 'toggleHeader');
3350
+ }
3351
+ exports["default"] = setHeadingLevel;
3352
+ /**
3353
+ * @deprecated Use setHeadingLevel instead
3354
+ * Keep this for compatibility only, will be removed in next major release
3355
+ */
3356
+ exports.toggleHeader = setHeadingLevel;
3357
+
3358
+
3297
3359
  /***/ }),
3298
3360
 
3299
3361
  /***/ "./packages/roosterjs-editor-api/lib/format/setImageAltText.ts":
@@ -3638,60 +3700,6 @@ function toggleCodeBlock(editor, styler) {
3638
3700
  exports["default"] = toggleCodeBlock;
3639
3701
 
3640
3702
 
3641
- /***/ }),
3642
-
3643
- /***/ "./packages/roosterjs-editor-api/lib/format/toggleHeader.ts":
3644
- /*!******************************************************************!*\
3645
- !*** ./packages/roosterjs-editor-api/lib/format/toggleHeader.ts ***!
3646
- \******************************************************************/
3647
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
3648
-
3649
- "use strict";
3650
-
3651
- Object.defineProperty(exports, "__esModule", ({ value: true }));
3652
- var formatUndoSnapshot_1 = __webpack_require__(/*! ../utils/formatUndoSnapshot */ "./packages/roosterjs-editor-api/lib/utils/formatUndoSnapshot.ts");
3653
- var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
3654
- /**
3655
- * Toggle header at selection
3656
- * @param editor The editor instance
3657
- * @param level The header level, can be a number from 0 to 6, in which 1 ~ 6 refers to
3658
- * the HTML header element &lt;H1&gt; to &lt;H6&gt;, 0 means no header
3659
- * if passed in param is outside the range, will be rounded to nearest number in the range
3660
- */
3661
- function toggleHeader(editor, level) {
3662
- level = Math.min(Math.max(Math.round(level), 0), 6);
3663
- (0, formatUndoSnapshot_1.default)(editor, function () {
3664
- editor.focus();
3665
- var wrapped = false;
3666
- editor.queryElements('H1,H2,H3,H4,H5,H6', 1 /* OnSelection */, function (header) {
3667
- if (!wrapped) {
3668
- editor.getDocument().execCommand("formatBlock" /* FormatBlock */, false, '<DIV>');
3669
- wrapped = true;
3670
- }
3671
- var div = editor.getDocument().createElement('div');
3672
- (0, roosterjs_editor_dom_1.moveChildNodes)(div, header);
3673
- editor.replaceNode(header, div);
3674
- });
3675
- if (level > 0) {
3676
- var traverser = editor.getSelectionTraverser();
3677
- var blockElement = traverser === null || traverser === void 0 ? void 0 : traverser.currentBlockElement;
3678
- var sanitizer = new roosterjs_editor_dom_1.HtmlSanitizer({
3679
- cssStyleCallbacks: {
3680
- 'font-size': function () { return false; },
3681
- },
3682
- });
3683
- while (blockElement) {
3684
- var element = blockElement.collapseToSingleElement();
3685
- sanitizer.sanitize(element);
3686
- blockElement = traverser === null || traverser === void 0 ? void 0 : traverser.getNextBlockElement();
3687
- }
3688
- editor.getDocument().execCommand("formatBlock" /* FormatBlock */, false, "<H" + level + ">");
3689
- }
3690
- }, 'toggleHeader');
3691
- }
3692
- exports["default"] = toggleHeader;
3693
-
3694
-
3695
3703
  /***/ }),
3696
3704
 
3697
3705
  /***/ "./packages/roosterjs-editor-api/lib/format/toggleItalic.ts":
@@ -3866,7 +3874,7 @@ exports["default"] = toggleUnderline;
3866
3874
  "use strict";
3867
3875
 
3868
3876
  Object.defineProperty(exports, "__esModule", ({ value: true }));
3869
- exports.experimentCommitListChains = exports.commitListChains = exports.blockFormat = exports.toggleListType = exports.applyCellShading = exports.toggleHeader = exports.toggleUnderline = exports.toggleSuperscript = exports.toggleSubscript = exports.toggleStrikethrough = exports.toggleCodeBlock = exports.toggleBlockQuote = exports.setOrderedListNumbering = exports.toggleNumbering = exports.toggleItalic = exports.toggleBullet = exports.toggleBold = exports.changeCapitalization = exports.setIndentation = exports.setImageAltText = exports.setFontSize = exports.setFontName = exports.setDirection = exports.setTextColor = exports.setBackgroundColor = exports.setAlignment = exports.rotateElement = exports.replaceWithNode = exports.removeLink = exports.formatTable = exports.editTable = exports.insertTable = exports.insertImage = exports.insertEntity = exports.getElementBasedFormatState = exports.getFormatState = exports.createLink = exports.clearFormat = exports.clearBlockFormat = exports.FONT_SIZES = exports.changeFontSize = void 0;
3877
+ exports.experimentCommitListChains = exports.commitListChains = exports.blockFormat = exports.toggleListType = exports.applyCellShading = exports.toggleHeader = exports.setHeadingLevel = exports.toggleUnderline = exports.toggleSuperscript = exports.toggleSubscript = exports.toggleStrikethrough = exports.toggleCodeBlock = exports.toggleBlockQuote = exports.setOrderedListNumbering = exports.toggleNumbering = exports.toggleItalic = exports.toggleBullet = exports.toggleBold = exports.changeCapitalization = exports.setIndentation = exports.setImageAltText = exports.setFontSize = exports.setFontName = exports.setDirection = exports.setTextColor = exports.setBackgroundColor = exports.setAlignment = exports.rotateElement = exports.replaceWithNode = exports.removeLink = exports.formatTable = exports.editTable = exports.insertTable = exports.insertImage = exports.insertEntity = exports.getElementBasedFormatState = exports.getFormatState = exports.createLink = exports.clearFormat = exports.clearBlockFormat = exports.FONT_SIZES = exports.changeFontSize = void 0;
3870
3878
  var changeFontSize_1 = __webpack_require__(/*! ./format/changeFontSize */ "./packages/roosterjs-editor-api/lib/format/changeFontSize.ts");
3871
3879
  Object.defineProperty(exports, "changeFontSize", ({ enumerable: true, get: function () { return changeFontSize_1.default; } }));
3872
3880
  Object.defineProperty(exports, "FONT_SIZES", ({ enumerable: true, get: function () { return changeFontSize_1.FONT_SIZES; } }));
@@ -3935,8 +3943,9 @@ var toggleSuperscript_1 = __webpack_require__(/*! ./format/toggleSuperscript */
3935
3943
  Object.defineProperty(exports, "toggleSuperscript", ({ enumerable: true, get: function () { return toggleSuperscript_1.default; } }));
3936
3944
  var toggleUnderline_1 = __webpack_require__(/*! ./format/toggleUnderline */ "./packages/roosterjs-editor-api/lib/format/toggleUnderline.ts");
3937
3945
  Object.defineProperty(exports, "toggleUnderline", ({ enumerable: true, get: function () { return toggleUnderline_1.default; } }));
3938
- var toggleHeader_1 = __webpack_require__(/*! ./format/toggleHeader */ "./packages/roosterjs-editor-api/lib/format/toggleHeader.ts");
3939
- Object.defineProperty(exports, "toggleHeader", ({ enumerable: true, get: function () { return toggleHeader_1.default; } }));
3946
+ var setHeadingLevel_1 = __webpack_require__(/*! ./format/setHeadingLevel */ "./packages/roosterjs-editor-api/lib/format/setHeadingLevel.ts");
3947
+ Object.defineProperty(exports, "setHeadingLevel", ({ enumerable: true, get: function () { return setHeadingLevel_1.default; } }));
3948
+ Object.defineProperty(exports, "toggleHeader", ({ enumerable: true, get: function () { return setHeadingLevel_1.toggleHeader; } }));
3940
3949
  var applyCellShading_1 = __webpack_require__(/*! ./table/applyCellShading */ "./packages/roosterjs-editor-api/lib/table/applyCellShading.ts");
3941
3950
  Object.defineProperty(exports, "applyCellShading", ({ enumerable: true, get: function () { return applyCellShading_1.default; } }));
3942
3951
  var toggleListType_1 = __webpack_require__(/*! ./utils/toggleListType */ "./packages/roosterjs-editor-api/lib/utils/toggleListType.ts");
@@ -4977,8 +4986,10 @@ function createFragmentFromClipboardData(core, clipboardData, position, pasteAsT
4977
4986
  // Paste text
4978
4987
  (0, roosterjs_editor_dom_1.handleTextPaste)(text, position, fragment);
4979
4988
  }
4980
- // Step 4: Trigger BeforePasteEvent so that plugins can do proper change before paste
4981
- core.api.triggerEvent(core, event, true /*broadcast*/);
4989
+ // Step 4: Trigger BeforePasteEvent so that plugins can do proper change before paste, when the type of paste is different than Plain Text
4990
+ if (event.pasteType !== 1 /* AsPlainText */) {
4991
+ core.api.triggerEvent(core, event, true /*broadcast*/);
4992
+ }
4982
4993
  // Step 5. Sanitize the fragment before paste to make sure the content is safe
4983
4994
  (0, roosterjs_editor_dom_1.sanitizePasteContent)(event, position);
4984
4995
  return fragment;
@@ -6811,6 +6822,14 @@ var DOMEventPlugin = /** @class */ (function () {
6811
6822
  var _a;
6812
6823
  this.editor = null;
6813
6824
  this.disposer = null;
6825
+ this.onDragStart = function (e) {
6826
+ var _a;
6827
+ var dragEvent = e;
6828
+ var element = (_a = _this.editor) === null || _a === void 0 ? void 0 : _a.getElementAtCursor('*', dragEvent.target);
6829
+ if (element && !element.isContentEditable) {
6830
+ dragEvent.preventDefault();
6831
+ }
6832
+ };
6814
6833
  this.onDrop = function () {
6815
6834
  var _a;
6816
6835
  (_a = _this.editor) === null || _a === void 0 ? void 0 : _a.runAsync(function (editor) {
@@ -6933,7 +6952,8 @@ var DOMEventPlugin = /** @class */ (function () {
6933
6952
  rawEvent: rawEvent,
6934
6953
  });
6935
6954
  },
6936
- // 4. Drop event
6955
+ // 4. Drag and Drop event
6956
+ dragstart: this.onDragStart,
6937
6957
  drop: this.onDrop,
6938
6958
  // 5. Focus management
6939
6959
  focus: this.onFocus
@@ -7139,7 +7159,6 @@ var EntityPlugin = /** @class */ (function () {
7139
7159
  function EntityPlugin() {
7140
7160
  var _this = this;
7141
7161
  this.editor = null;
7142
- this.disposer = null;
7143
7162
  this.handleCutEvent = function (event) {
7144
7163
  var _a;
7145
7164
  var range = (_a = _this.editor) === null || _a === void 0 ? void 0 : _a.getSelectionRange();
@@ -7147,14 +7166,6 @@ var EntityPlugin = /** @class */ (function () {
7147
7166
  _this.checkRemoveEntityForRange(event);
7148
7167
  }
7149
7168
  };
7150
- this.onDragStart = function (e) {
7151
- var _a, _b;
7152
- var dragEvent = e;
7153
- var entityWrapper = (_a = _this.editor) === null || _a === void 0 ? void 0 : _a.getElementAtCursor((0, roosterjs_editor_dom_1.getEntitySelector)(), dragEvent.target);
7154
- if (entityWrapper && ((_b = (0, roosterjs_editor_dom_1.getEntityFromElement)(entityWrapper)) === null || _b === void 0 ? void 0 : _b.isReadonly)) {
7155
- dragEvent.preventDefault();
7156
- }
7157
- };
7158
7169
  this.state = {
7159
7170
  entityMap: {},
7160
7171
  };
@@ -7171,15 +7182,11 @@ var EntityPlugin = /** @class */ (function () {
7171
7182
  */
7172
7183
  EntityPlugin.prototype.initialize = function (editor) {
7173
7184
  this.editor = editor;
7174
- this.disposer = this.editor.addDomEventHandler('dragstart', this.onDragStart);
7175
7185
  };
7176
7186
  /**
7177
7187
  * Dispose this plugin
7178
7188
  */
7179
7189
  EntityPlugin.prototype.dispose = function () {
7180
- var _a;
7181
- (_a = this.disposer) === null || _a === void 0 ? void 0 : _a.call(this);
7182
- this.disposer = null;
7183
7190
  this.editor = null;
7184
7191
  this.state.entityMap = {};
7185
7192
  };
@@ -9721,10 +9728,12 @@ var EditorBase = /** @class */ (function () {
9721
9728
  /**
9722
9729
  * Transform the given node and all its child nodes to dark mode color if editor is in dark mode
9723
9730
  * @param node The node to transform
9731
+ * @param direction The transform direction. @default ColorTransformDirection.LightToDark
9724
9732
  */
9725
- EditorBase.prototype.transformToDarkColor = function (node) {
9733
+ EditorBase.prototype.transformToDarkColor = function (node, direction) {
9734
+ if (direction === void 0) { direction = 0 /* LightToDark */; }
9726
9735
  var core = this.getCore();
9727
- core.api.transformColor(core, node, true /*includeSelf*/, null /*callback*/, 0 /* LightToDark */);
9736
+ core.api.transformColor(core, node, true /*includeSelf*/, null /*callback*/, direction);
9728
9737
  };
9729
9738
  /**
9730
9739
  * Get a darkColorHandler object for this editor.
@@ -17763,6 +17772,17 @@ var VTable = /** @class */ (function () {
17763
17772
  }
17764
17773
  }
17765
17774
  }
17775
+ for (var col = 0; col < _this.cells[rowIndex].length; col++) {
17776
+ if (!_this.cells[rowIndex][col]) {
17777
+ _this.cells[rowIndex][col] = {
17778
+ td: null,
17779
+ spanLeft: false,
17780
+ spanAbove: false,
17781
+ width: undefined,
17782
+ height: undefined,
17783
+ };
17784
+ }
17785
+ }
17766
17786
  });
17767
17787
  this.formatInfo = (0, tableFormatInfo_1.getTableFormatInfo)(this.table);
17768
17788
  if (normalizeSize) {
@@ -24180,7 +24200,7 @@ var ImageEdit = /** @class */ (function () {
24180
24200
  var cropHandles = getEditElements(wrapper, "r_cropH" /* CropHandle */);
24181
24201
  // Cropping and resizing will show different UI, so check if it is cropping here first
24182
24202
  _this.isCropping = cropContainers.length == 1 && cropOverlays.length == 4;
24183
- var _c = _this.editInfo, angleRad = _c.angleRad, bottomPercent = _c.bottomPercent, leftPercent = _c.leftPercent, rightPercent = _c.rightPercent, topPercent = _c.topPercent;
24203
+ var _c = _this.editInfo, angleRad = _c.angleRad, bottomPercent = _c.bottomPercent, leftPercent = _c.leftPercent, rightPercent = _c.rightPercent, topPercent = _c.topPercent, flippedHorizontal = _c.flippedHorizontal, flippedVertical = _c.flippedVertical;
24184
24204
  // Width/height of the image
24185
24205
  var _d = (0, getGeneratedImageSize_1.default)(_this.editInfo, _this.isCropping), targetWidth = _d.targetWidth, targetHeight = _d.targetHeight, originalWidth = _d.originalWidth, originalHeight = _d.originalHeight, visibleWidth = _d.visibleWidth, visibleHeight = _d.visibleHeight;
24186
24206
  var marginHorizontal = (targetWidth - visibleWidth) / 2;
@@ -24199,6 +24219,8 @@ var ImageEdit = /** @class */ (function () {
24199
24219
  // Update size of the image
24200
24220
  _this.clonedImage.style.width = getPx(originalWidth);
24201
24221
  _this.clonedImage.style.height = getPx(originalHeight);
24222
+ //Update flip direction
24223
+ setFlipped(_this.clonedImage.parentElement, flippedHorizontal, flippedVertical);
24202
24224
  if (_this.isCropping) {
24203
24225
  // For crop, we also need to set position of the overlays
24204
24226
  setSize(cropContainers[0], cropLeftPx, cropTopPx, cropRightPx, cropBottomPx, undefined, undefined);
@@ -24222,7 +24244,7 @@ var ImageEdit = /** @class */ (function () {
24222
24244
  var viewport = (_b = _this.editor) === null || _b === void 0 ? void 0 : _b.getVisibleViewport();
24223
24245
  var isSmall = isASmallImage(targetWidth, targetHeight);
24224
24246
  if (rotateHandle && rotateCenter && viewport) {
24225
- (0, Rotator_1.updateRotateHandleState)(viewport, rotateCenter, rotateHandle, isSmall);
24247
+ (0, Rotator_1.updateRotateHandleState)(viewport, angleRad, wrapper, rotateCenter, rotateHandle, isSmall);
24226
24248
  }
24227
24249
  updateSideHandlesVisibility(resizeHandles, isSmall);
24228
24250
  updateHandleCursor(resizeHandles, angleRad);
@@ -24273,7 +24295,7 @@ var ImageEdit = /** @class */ (function () {
24273
24295
  * @param e PluginEvent object
24274
24296
  */
24275
24297
  ImageEdit.prototype.onPluginEvent = function (e) {
24276
- var _a;
24298
+ var _a, _b;
24277
24299
  switch (e.eventType) {
24278
24300
  case 22 /* SelectionChanged */:
24279
24301
  if (e.selectionRangeEx &&
@@ -24293,6 +24315,13 @@ var ImageEdit = /** @class */ (function () {
24293
24315
  this.setEditingImage(null);
24294
24316
  }
24295
24317
  break;
24318
+ case 6 /* MouseUp */:
24319
+ // When mouse up, if the image and the shadow span exists, the editing mode is on.
24320
+ // To make sure the selection did not jump to the shadow root, reselect the image.
24321
+ if (this.image && this.shadowSpan) {
24322
+ (_a = this.editor) === null || _a === void 0 ? void 0 : _a.select(this.image);
24323
+ }
24324
+ break;
24296
24325
  case 0 /* KeyDown */:
24297
24326
  this.setEditingImage(null);
24298
24327
  break;
@@ -24302,7 +24331,7 @@ var ImageEdit = /** @class */ (function () {
24302
24331
  break;
24303
24332
  case 8 /* ExtractContentWithDom */:
24304
24333
  // When extract content, remove all image info since they may not be valid when load the content again
24305
- if ((_a = this.options) === null || _a === void 0 ? void 0 : _a.imageSelector) {
24334
+ if ((_b = this.options) === null || _b === void 0 ? void 0 : _b.imageSelector) {
24306
24335
  (0, roosterjs_editor_dom_1.toArray)(e.clonedRoot.querySelectorAll(this.options.imageSelector)).forEach(function (img) {
24307
24336
  (0, editInfo_1.deleteEditInfo)(img);
24308
24337
  });
@@ -24443,7 +24472,6 @@ var ImageEdit = /** @class */ (function () {
24443
24472
  // Set image src to original src to help show editing UI, also it will be used when regenerate image dataURL after editing
24444
24473
  if (this.clonedImage) {
24445
24474
  this.clonedImage.src = (_c = this.pngSource) !== null && _c !== void 0 ? _c : this.editInfo.src;
24446
- setFlipped(this.clonedImage, this.editInfo.flippedHorizontal, this.editInfo.flippedVertical);
24447
24475
  this.clonedImage.style.position = 'absolute';
24448
24476
  }
24449
24477
  // Get HTML for all edit elements (resize handle, rotate handle, crop handle and overlay, ...) and create HTML element
@@ -24614,7 +24642,9 @@ function getColorString(color, isDarkMode) {
24614
24642
  return isDarkMode ? color.darkModeColor.trim() : color.lightModeColor.trim();
24615
24643
  }
24616
24644
  function setFlipped(element, flippedHorizontally, flippedVertically) {
24617
- element.style.transform = "scale(" + (flippedHorizontally ? '-1' : '1') + ", " + (flippedVertically ? '-1' : '1') + ")";
24645
+ if (element) {
24646
+ element.style.transform = "scale(" + (flippedHorizontally ? -1 : 1) + ", " + (flippedVertically ? -1 : 1) + ")";
24647
+ }
24618
24648
  }
24619
24649
 
24620
24650
 
@@ -24786,7 +24816,7 @@ function loadImage(img, src, callback) {
24786
24816
  "use strict";
24787
24817
 
24788
24818
  Object.defineProperty(exports, "__esModule", ({ value: true }));
24789
- exports.MIN_HEIGHT_WIDTH = exports.Ys = exports.Xs = exports.CROP_HANDLE_WIDTH = exports.CROP_HANDLE_SIZE = exports.ROTATE_HANDLE_TOP = exports.ROTATE_WIDTH = exports.ROTATION = exports.ROTATE_ICON_MARGIN = exports.DEFAULT_ROTATE_HANDLE_HEIGHT = exports.DEG_PER_RAD = exports.ROTATE_GAP = exports.ROTATE_SIZE = exports.RESIZE_HANDLE_MARGIN = exports.RESIZE_HANDLE_SIZE = void 0;
24819
+ exports.MIN_HEIGHT_WIDTH = exports.YS_CROP = exports.XS_CROP = exports.CROP_HANDLE_WIDTH = exports.CROP_HANDLE_SIZE = exports.ROTATE_HANDLE_TOP = exports.ROTATE_WIDTH = exports.Ys = exports.Xs = exports.ROTATION = exports.ROTATE_ICON_MARGIN = exports.DEFAULT_ROTATE_HANDLE_HEIGHT = exports.DEG_PER_RAD = exports.ROTATE_GAP = exports.ROTATE_SIZE = exports.RESIZE_HANDLE_MARGIN = exports.RESIZE_HANDLE_SIZE = void 0;
24790
24820
  exports.RESIZE_HANDLE_SIZE = 10;
24791
24821
  exports.RESIZE_HANDLE_MARGIN = 6;
24792
24822
  exports.ROTATE_SIZE = 32;
@@ -24800,12 +24830,14 @@ exports.ROTATION = {
24800
24830
  ne: 180,
24801
24831
  se: 270,
24802
24832
  };
24833
+ exports.Xs = ['w', '', 'e'];
24834
+ exports.Ys = ['s', '', 'n'];
24803
24835
  exports.ROTATE_WIDTH = 1;
24804
24836
  exports.ROTATE_HANDLE_TOP = exports.ROTATE_GAP + exports.RESIZE_HANDLE_MARGIN;
24805
24837
  exports.CROP_HANDLE_SIZE = 22;
24806
24838
  exports.CROP_HANDLE_WIDTH = 7;
24807
- exports.Xs = ['w', '', 'e'];
24808
- exports.Ys = ['s', '', 'n'];
24839
+ exports.XS_CROP = ['w', 'e'];
24840
+ exports.YS_CROP = ['s', 'n'];
24809
24841
  exports.MIN_HEIGHT_WIDTH = 3 * exports.RESIZE_HANDLE_SIZE + 2 * exports.RESIZE_HANDLE_MARGIN;
24810
24842
 
24811
24843
 
@@ -25234,8 +25266,8 @@ exports.tryToConvertGifToPng = tryToConvertGifToPng;
25234
25266
  Object.defineProperty(exports, "__esModule", ({ value: true }));
25235
25267
  exports.getCropHTML = exports.Cropper = void 0;
25236
25268
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
25237
- var constants_1 = __webpack_require__(/*! ../constants/constants */ "./packages/roosterjs-editor-plugins/lib/plugins/ImageEdit/constants/constants.ts");
25238
25269
  var Resizer_1 = __webpack_require__(/*! ./Resizer */ "./packages/roosterjs-editor-plugins/lib/plugins/ImageEdit/imageEditors/Resizer.ts");
25270
+ var constants_1 = __webpack_require__(/*! ../constants/constants */ "./packages/roosterjs-editor-plugins/lib/plugins/ImageEdit/constants/constants.ts");
25239
25271
  /**
25240
25272
  * @internal
25241
25273
  * Crop handle for DragAndDropHelper
@@ -25307,7 +25339,9 @@ function getCropHTML() {
25307
25339
  children: [],
25308
25340
  };
25309
25341
  if (containerHTML) {
25310
- constants_1.Xs.forEach(function (x) { return constants_1.Ys.forEach(function (y) { var _a; return (_a = containerHTML.children) === null || _a === void 0 ? void 0 : _a.push(getCropHTMLInternal(x, y)); }); });
25342
+ constants_1.XS_CROP.forEach(function (x) {
25343
+ return constants_1.YS_CROP.forEach(function (y) { var _a; return (_a = containerHTML.children) === null || _a === void 0 ? void 0 : _a.push(getCropHTMLInternal(x, y)); });
25344
+ });
25311
25345
  }
25312
25346
  return [containerHTML, overlayHTML, overlayHTML, overlayHTML, overlayHTML];
25313
25347
  }
@@ -25597,7 +25631,7 @@ exports.Rotator = {
25597
25631
  * Move rotate handle. When image is very close to the border of editor, rotate handle may not be visible.
25598
25632
  * Fix it by reduce the distance from image to rotate handle
25599
25633
  */
25600
- function updateRotateHandleState(editorRect, rotateCenter, rotateHandle, isSmallImage) {
25634
+ function updateRotateHandleState(editorRect, angleRad, wrapper, rotateCenter, rotateHandle, isSmallImage) {
25601
25635
  if (isSmallImage) {
25602
25636
  rotateCenter.style.display = 'none';
25603
25637
  rotateHandle.style.display = 'none';
@@ -25607,23 +25641,30 @@ function updateRotateHandleState(editorRect, rotateCenter, rotateHandle, isSmall
25607
25641
  rotateCenter.style.display = '';
25608
25642
  rotateHandle.style.display = '';
25609
25643
  var rotateHandleRect = rotateHandle.getBoundingClientRect();
25610
- if (rotateHandleRect) {
25611
- var top_1 = rotateHandleRect.top - editorRect.top;
25612
- var left = rotateHandleRect.left - editorRect.left;
25613
- var right = rotateHandleRect.right - editorRect.right;
25614
- var bottom = rotateHandleRect.bottom - editorRect.bottom;
25644
+ var wrapperRect = wrapper.getBoundingClientRect();
25645
+ if (rotateHandleRect && wrapperRect) {
25615
25646
  var adjustedDistance = Number.MAX_SAFE_INTEGER;
25616
- if (top_1 <= 0) {
25647
+ var angle = angleRad * constants_1.DEG_PER_RAD;
25648
+ if (angle < 45 && angle > -45 && wrapperRect.top - editorRect.top < constants_1.ROTATE_GAP) {
25649
+ var top_1 = rotateHandleRect.top - editorRect.top;
25617
25650
  adjustedDistance = top_1;
25618
25651
  }
25619
- else if (left <= 0) {
25652
+ else if (angle <= -80 &&
25653
+ angle >= -100 &&
25654
+ wrapperRect.left - editorRect.left < constants_1.ROTATE_GAP) {
25655
+ var left = rotateHandleRect.left - editorRect.left;
25620
25656
  adjustedDistance = left;
25621
25657
  }
25622
- else if (right >= 0) {
25623
- adjustedDistance = right;
25658
+ else if (angle >= 80 &&
25659
+ angle <= 100 &&
25660
+ editorRect.right - wrapperRect.right < constants_1.ROTATE_GAP) {
25661
+ var right = rotateHandleRect.right - editorRect.right;
25662
+ adjustedDistance = Math.min(editorRect.right - wrapperRect.right, right);
25624
25663
  }
25625
- else if (bottom >= 0) {
25626
- adjustedDistance = bottom;
25664
+ else if ((angle <= -160 || angle >= 160) &&
25665
+ editorRect.bottom - wrapperRect.bottom < constants_1.ROTATE_GAP) {
25666
+ var bottom = rotateHandleRect.bottom - editorRect.bottom;
25667
+ adjustedDistance = Math.min(editorRect.bottom - wrapperRect.bottom, bottom);
25627
25668
  }
25628
25669
  var rotateGap = Math.max(Math.min(constants_1.ROTATE_GAP, adjustedDistance), 0);
25629
25670
  var rotateTop = Math.max(Math.min(constants_1.ROTATE_SIZE, adjustedDistance - rotateGap), 0);
@@ -25888,6 +25929,7 @@ var Paste = /** @class */ (function () {
25888
25929
  }
25889
25930
  (0, sanitizeLinks_1.default)(sanitizingOption);
25890
25931
  (0, sanitizeHtmlColorsFromPastedContent_1.default)(sanitizingOption);
25932
+ sanitizeBlockStyles(sanitizingOption);
25891
25933
  // Replace unknown tags with SPAN
25892
25934
  sanitizingOption.unknownTagReplacement = this.unknownTagReplacement;
25893
25935
  }
@@ -25895,6 +25937,11 @@ var Paste = /** @class */ (function () {
25895
25937
  return Paste;
25896
25938
  }());
25897
25939
  exports["default"] = Paste;
25940
+ function sanitizeBlockStyles(sanitizingOption) {
25941
+ (0, roosterjs_editor_dom_1.chainSanitizerCallback)(sanitizingOption.cssStyleCallbacks, 'display', function (value) {
25942
+ return value != 'flex'; // return whether we keep the style
25943
+ });
25944
+ }
25898
25945
 
25899
25946
 
25900
25947
  /***/ }),
@@ -26972,7 +27019,7 @@ function convertPastedContentFromWord(event) {
26972
27019
  });
26973
27020
  var wordConverter = (0, wordConverter_1.createWordConverter)();
26974
27021
  // First find all the nodes that we need to check for list item information
26975
- // This call will return all the p and header elements under the root node.. These are the elements that
27022
+ // This call will return all the p and heading elements under the root node.. These are the elements that
26976
27023
  // Word uses a list items, so we'll only process them and avoid walking the whole tree.
26977
27024
  var elements = fragment.querySelectorAll(LIST_ELEMENTS_SELECTOR);
26978
27025
  if (elements.length > 0) {
@@ -28316,12 +28363,12 @@ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./
28316
28363
  * @internal
28317
28364
  */
28318
28365
  function handleKeyDownEvent(event, state, editor) {
28319
- var _a;
28320
- var _b = event.rawEvent, shiftKey = _b.shiftKey, ctrlKey = _b.ctrlKey, metaKey = _b.metaKey, which = _b.which, defaultPrevented = _b.defaultPrevented;
28366
+ var _a = event.rawEvent, shiftKey = _a.shiftKey, ctrlKey = _a.ctrlKey, metaKey = _a.metaKey, which = _a.which, defaultPrevented = _a.defaultPrevented;
28321
28367
  if ((shiftKey && (ctrlKey || metaKey)) || which == 16 /* SHIFT */ || defaultPrevented) {
28322
28368
  state.preventKeyUp = defaultPrevented;
28323
28369
  return;
28324
28370
  }
28371
+ var range = editor.getSelectionRangeEx();
28325
28372
  if (shiftKey) {
28326
28373
  if (!state.firstTarget) {
28327
28374
  var pos = editor.getFocusedPosition();
@@ -28353,9 +28400,14 @@ function handleKeyDownEvent(event, state, editor) {
28353
28400
  }
28354
28401
  });
28355
28402
  }
28356
- else if (((_a = editor.getSelectionRangeEx()) === null || _a === void 0 ? void 0 : _a.type) == 1 /* TableSelection */ &&
28403
+ else if ((range === null || range === void 0 ? void 0 : range.type) == 1 /* TableSelection */ &&
28357
28404
  (!(0, roosterjs_editor_dom_1.isCtrlOrMetaPressed)(event.rawEvent) || which == 36 /* HOME */ || which == 35 /* END */)) {
28358
- editor.select(null);
28405
+ // Select all content in the first cell
28406
+ var row = range.ranges[0];
28407
+ var firstCell = row.startContainer.childNodes[row.startOffset];
28408
+ var children = firstCell.childNodes;
28409
+ var contentRange = (0, roosterjs_editor_dom_1.createRange)(children[0], children[children.length - 1]);
28410
+ editor.select(contentRange);
28359
28411
  }
28360
28412
  }
28361
28413
  exports.handleKeyDownEvent = handleKeyDownEvent;
@@ -28484,6 +28536,7 @@ function shouldConvertToTableSelection(state, editor) {
28484
28536
  Object.defineProperty(exports, "__esModule", ({ value: true }));
28485
28537
  exports.handleKeyUpEvent = void 0;
28486
28538
  var clearState_1 = __webpack_require__(/*! ../utils/clearState */ "./packages/roosterjs-editor-plugins/lib/plugins/TableCellSelection/utils/clearState.ts");
28539
+ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
28487
28540
  var IGNORE_KEY_UP_KEYS = [
28488
28541
  16 /* SHIFT */,
28489
28542
  18 /* ALT */,
@@ -28501,6 +28554,9 @@ function handleKeyUpEvent(event, state, editor) {
28501
28554
  state.firstTarget &&
28502
28555
  !state.preventKeyUp &&
28503
28556
  IGNORE_KEY_UP_KEYS.indexOf(which) == -1) {
28557
+ if ((0, roosterjs_editor_dom_1.isCharacterValue)(event.rawEvent)) {
28558
+ editor.addUndoSnapshot();
28559
+ }
28504
28560
  (0, clearState_1.clearState)(state, editor);
28505
28561
  }
28506
28562
  state.preventKeyUp = false;
@@ -28539,8 +28595,9 @@ var RIGHT_CLICK = 3;
28539
28595
  */
28540
28596
  function handleMouseDownEvent(event, state, editor) {
28541
28597
  var _a;
28542
- var _b = event.rawEvent, which = _b.which, shiftKey = _b.shiftKey, target = _b.target;
28598
+ var _b = event.rawEvent, which = _b.which, shiftKey = _b.shiftKey, target = _b.target, detail = _b.detail;
28543
28599
  var table = editor.getElementAtCursor('table', target, event);
28600
+ var tripleClick = detail >= 3;
28544
28601
  if (table && !table.isContentEditable) {
28545
28602
  return;
28546
28603
  }
@@ -28567,51 +28624,54 @@ function handleMouseDownEvent(event, state, editor) {
28567
28624
  }
28568
28625
  }
28569
28626
  }
28570
- if (which == LEFT_CLICK && !shiftKey) {
28571
- (0, clearState_1.clearState)(state, editor);
28572
- if ((0, getTableAtCursor_1.getTableAtCursor)(editor, event.rawEvent.target)) {
28573
- var doc_1 = editor.getDocument() || document;
28574
- var mouseUpListener_1 = getOnMouseUp(state);
28575
- var mouseMoveListener_1 = onMouseMove(state, editor);
28576
- doc_1.addEventListener('mouseup', mouseUpListener_1, true /*setCapture*/);
28577
- doc_1.addEventListener('mousemove', mouseMoveListener_1, true /*setCapture*/);
28578
- state.mouseMoveDisposer = function () {
28579
- doc_1.removeEventListener('mouseup', mouseUpListener_1, true /*setCapture*/);
28580
- doc_1.removeEventListener('mousemove', mouseMoveListener_1, true /*setCapture*/);
28581
- };
28582
- state.startedSelection = true;
28583
- }
28584
- }
28585
- if (which == LEFT_CLICK && shiftKey) {
28586
- editor.runAsync(function (editor) {
28587
- var _a;
28588
- var sel = (_a = editor.getDocument().defaultView) === null || _a === void 0 ? void 0 : _a.getSelection();
28589
- var first = (0, getCellAtCursor_1.getCellAtCursor)(editor, sel === null || sel === void 0 ? void 0 : sel.anchorNode);
28590
- var last = (0, getCellAtCursor_1.getCellAtCursor)(editor, sel === null || sel === void 0 ? void 0 : sel.focusNode);
28591
- var firstTable = (0, getTableAtCursor_1.getTableAtCursor)(editor, first);
28592
- var targetTable = (0, getTableAtCursor_1.getTableAtCursor)(editor, first);
28593
- if (firstTable == targetTable &&
28594
- (0, roosterjs_editor_dom_1.safeInstanceOf)(first, 'HTMLTableCellElement') &&
28595
- (0, roosterjs_editor_dom_1.safeInstanceOf)(last, 'HTMLTableCellElement')) {
28596
- state.vTable = new roosterjs_editor_dom_1.VTable(first);
28597
- var firstCord = (0, getCellCoordinates_1.getCellCoordinates)(state.vTable, first);
28598
- var lastCord = (0, getCellCoordinates_1.getCellCoordinates)(state.vTable, last);
28599
- if (!firstCord || !lastCord) {
28600
- return;
28601
- }
28602
- state.vTable.selection = {
28603
- firstCell: firstCord,
28604
- lastCell: lastCord,
28627
+ if (which == LEFT_CLICK) {
28628
+ if (!shiftKey && !tripleClick) {
28629
+ (0, clearState_1.clearState)(state, editor);
28630
+ if ((0, getTableAtCursor_1.getTableAtCursor)(editor, event.rawEvent.target)) {
28631
+ var doc_1 = editor.getDocument() || document;
28632
+ var mouseUpListener_1 = getOnMouseUp(state);
28633
+ var mouseMoveListener_1 = onMouseMove(state, editor);
28634
+ doc_1.addEventListener('mouseup', mouseUpListener_1, true /*setCapture*/);
28635
+ doc_1.addEventListener('mousemove', mouseMoveListener_1, true /*setCapture*/);
28636
+ state.mouseMoveDisposer = function () {
28637
+ doc_1.removeEventListener('mouseup', mouseUpListener_1, true /*setCapture*/);
28638
+ doc_1.removeEventListener('mousemove', mouseMoveListener_1, true /*setCapture*/);
28605
28639
  };
28606
- state.firstTarget = first;
28607
- state.lastTarget = last;
28608
- (0, selectTable_1.selectTable)(editor, state);
28609
- state.tableSelection = true;
28610
- state.firstTable = firstTable;
28611
- state.targetTable = targetTable;
28612
- (0, updateSelection_1.updateSelection)(editor, first, 0);
28640
+ state.startedSelection = true;
28613
28641
  }
28614
- });
28642
+ }
28643
+ if (shiftKey || tripleClick) {
28644
+ editor.runAsync(function (editor) {
28645
+ var _a;
28646
+ var sel = (_a = editor.getDocument().defaultView) === null || _a === void 0 ? void 0 : _a.getSelection();
28647
+ var first = (0, getCellAtCursor_1.getCellAtCursor)(editor, sel === null || sel === void 0 ? void 0 : sel.anchorNode);
28648
+ // Triple clicking a cell will select that cell only
28649
+ // Assign last the same as first to make sure we can select the cell
28650
+ var last = tripleClick ? first : (0, getCellAtCursor_1.getCellAtCursor)(editor, sel === null || sel === void 0 ? void 0 : sel.focusNode);
28651
+ var firstTable = (0, getTableAtCursor_1.getTableAtCursor)(editor, first);
28652
+ if (firstTable &&
28653
+ (0, roosterjs_editor_dom_1.safeInstanceOf)(first, 'HTMLTableCellElement') &&
28654
+ (0, roosterjs_editor_dom_1.safeInstanceOf)(last, 'HTMLTableCellElement')) {
28655
+ state.vTable = new roosterjs_editor_dom_1.VTable(first);
28656
+ var firstCord = (0, getCellCoordinates_1.getCellCoordinates)(state.vTable, first);
28657
+ var lastCord = (0, getCellCoordinates_1.getCellCoordinates)(state.vTable, last);
28658
+ if (!firstCord || !lastCord) {
28659
+ return;
28660
+ }
28661
+ state.vTable.selection = {
28662
+ firstCell: firstCord,
28663
+ lastCell: lastCord,
28664
+ };
28665
+ state.firstTarget = first;
28666
+ state.lastTarget = last;
28667
+ (0, selectTable_1.selectTable)(editor, state);
28668
+ state.tableSelection = true;
28669
+ state.firstTable = firstTable;
28670
+ state.targetTable = firstTable;
28671
+ (0, updateSelection_1.updateSelection)(editor, first, 0);
28672
+ }
28673
+ });
28674
+ }
28615
28675
  }
28616
28676
  }
28617
28677
  exports.handleMouseDownEvent = handleMouseDownEvent;