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