roosterjs 9.32.0 → 9.34.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.
@@ -2432,9 +2432,9 @@ exports.setModelIndentation = void 0;
2432
2432
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
2433
2433
  var findListItemsInSameThread_1 = __webpack_require__(/*! ../list/findListItemsInSameThread */ "./packages/roosterjs-content-model-api/lib/modelApi/list/findListItemsInSameThread.ts");
2434
2434
  var getListAnnounceData_1 = __webpack_require__(/*! ../list/getListAnnounceData */ "./packages/roosterjs-content-model-api/lib/modelApi/list/getListAnnounceData.ts");
2435
+ var adjustIndentation_1 = __webpack_require__(/*! ../common/adjustIndentation */ "./packages/roosterjs-content-model-api/lib/modelApi/common/adjustIndentation.ts");
2435
2436
  var splitSelectedParagraphByBr_1 = __webpack_require__(/*! ./splitSelectedParagraphByBr */ "./packages/roosterjs-content-model-api/lib/modelApi/block/splitSelectedParagraphByBr.ts");
2436
2437
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
2437
- var IndentStepInPixel = 40;
2438
2438
  /**
2439
2439
  * @param model The content model to set indentation
2440
2440
  * @param indentation The indentation type, 'indent' to indent, 'outdent' to outdent
@@ -2442,7 +2442,7 @@ var IndentStepInPixel = 40;
2442
2442
  * Set indentation for selected list items or paragraphs
2443
2443
  */
2444
2444
  function setModelIndentation(model, indentation, length, context) {
2445
- if (length === void 0) { length = IndentStepInPixel; }
2445
+ if (length === void 0) { length = adjustIndentation_1.IndentStepInPixel; }
2446
2446
  (0, splitSelectedParagraphByBr_1.splitSelectedParagraphByBr)(model);
2447
2447
  var paragraphOrListItem = (0, roosterjs_content_model_dom_1.getOperationalBlocks)(model, ['ListItem'], ['TableCell']);
2448
2448
  var isIndent = indentation == 'indent';
@@ -2562,7 +2562,7 @@ function isMultilevelSelection(model, listItem, parent) {
2562
2562
  return false;
2563
2563
  }
2564
2564
  function calculateMarginValue(format, isIndent, length) {
2565
- if (length === void 0) { length = IndentStepInPixel; }
2565
+ if (length === void 0) { length = adjustIndentation_1.IndentStepInPixel; }
2566
2566
  var marginLeft = format.marginLeft, marginRight = format.marginRight, direction = format.direction;
2567
2567
  var isRtl = direction == 'rtl';
2568
2568
  var originalValue = (0, roosterjs_content_model_dom_1.parseValueWithUnit)(isRtl ? marginRight : marginLeft);
@@ -2724,6 +2724,131 @@ function areAllBlockQuotes(blockAndParents) {
2724
2724
  }
2725
2725
 
2726
2726
 
2727
+ /***/ }),
2728
+
2729
+ /***/ "./packages/roosterjs-content-model-api/lib/modelApi/common/adjustIndentation.ts":
2730
+ /*!***************************************************************************************!*\
2731
+ !*** ./packages/roosterjs-content-model-api/lib/modelApi/common/adjustIndentation.ts ***!
2732
+ \***************************************************************************************/
2733
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
2734
+
2735
+ "use strict";
2736
+
2737
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
2738
+ exports.adjustTableIndentation = exports.adjustListIndentation = exports.IndentStepInPixel = void 0;
2739
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
2740
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
2741
+ var EN_SPACE = '\u2002';
2742
+ var REGULAR_SPACE = '\u0020';
2743
+ var NON_BREAK_SPACES = '\u00A0';
2744
+ /**
2745
+ * @internal
2746
+ */
2747
+ exports.IndentStepInPixel = 40;
2748
+ function countTabsSpaces(text) {
2749
+ var spaces = countSpacesBeforeText(text);
2750
+ var tabSpaces = Math.floor(spaces / 4);
2751
+ return tabSpaces;
2752
+ }
2753
+ function countSpacesBeforeText(str) {
2754
+ var e_1, _a;
2755
+ var count = 0;
2756
+ try {
2757
+ for (var str_1 = (0, tslib_1.__values)(str), str_1_1 = str_1.next(); !str_1_1.done; str_1_1 = str_1.next()) {
2758
+ var char = str_1_1.value;
2759
+ if (char === EN_SPACE || char === NON_BREAK_SPACES || char == REGULAR_SPACE) {
2760
+ count++;
2761
+ }
2762
+ else {
2763
+ break;
2764
+ }
2765
+ }
2766
+ }
2767
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
2768
+ finally {
2769
+ try {
2770
+ if (str_1_1 && !str_1_1.done && (_a = str_1.return)) _a.call(str_1);
2771
+ }
2772
+ finally { if (e_1) throw e_1.error; }
2773
+ }
2774
+ return count;
2775
+ }
2776
+ /**
2777
+ * @internal
2778
+ */
2779
+ function adjustListIndentation(listItem) {
2780
+ var block = listItem.blocks[0];
2781
+ if (block.blockType == 'Paragraph' &&
2782
+ block.segments.length > 0 &&
2783
+ block.segments[0].segmentType == 'Text') {
2784
+ var tabSpaces_1 = countTabsSpaces(block.segments[0].text);
2785
+ if (tabSpaces_1 > 0) {
2786
+ (0, roosterjs_content_model_dom_1.mutateSegment)(block, block.segments[0], function (textSegment) {
2787
+ textSegment.text = textSegment.text.substring(tabSpaces_1 * 4);
2788
+ });
2789
+ listItem.levels[0].format.marginLeft = tabSpaces_1 * exports.IndentStepInPixel + 'px';
2790
+ }
2791
+ }
2792
+ }
2793
+ exports.adjustListIndentation = adjustListIndentation;
2794
+ /**
2795
+ * @internal
2796
+ */
2797
+ function adjustTableIndentation(insertPoint, table) {
2798
+ var paragraph = insertPoint.paragraph, marker = insertPoint.marker;
2799
+ var indentationMargin = getTableIndentation(paragraph);
2800
+ if (indentationMargin) {
2801
+ insertPoint.paragraph.segments = [marker];
2802
+ if (insertPoint.paragraph.format.direction == 'rtl') {
2803
+ table.format.marginRight = indentationMargin * exports.IndentStepInPixel + 'px';
2804
+ }
2805
+ else {
2806
+ table.format.marginLeft = indentationMargin * exports.IndentStepInPixel + 'px';
2807
+ }
2808
+ }
2809
+ }
2810
+ exports.adjustTableIndentation = adjustTableIndentation;
2811
+ var getTableIndentation = function (paragraph) {
2812
+ var e_2, _a;
2813
+ var tabsNumber = 0;
2814
+ var segments = paragraph.segments;
2815
+ var isEmptyLine = paragraph.segments.every(function (s) {
2816
+ return (s.segmentType == 'Text' && s.text.trim().length == 0) ||
2817
+ s.segmentType == 'SelectionMarker' ||
2818
+ s.segmentType == 'Br';
2819
+ });
2820
+ if (!isEmptyLine) {
2821
+ return;
2822
+ }
2823
+ var numberOfSegments = 0;
2824
+ try {
2825
+ for (var segments_1 = (0, tslib_1.__values)(segments), segments_1_1 = segments_1.next(); !segments_1_1.done; segments_1_1 = segments_1.next()) {
2826
+ var seg = segments_1_1.value;
2827
+ if (seg.segmentType === 'Text') {
2828
+ tabsNumber = tabsNumber + countTabsSpaces(seg.text);
2829
+ numberOfSegments++;
2830
+ }
2831
+ else {
2832
+ break;
2833
+ }
2834
+ }
2835
+ }
2836
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
2837
+ finally {
2838
+ try {
2839
+ if (segments_1_1 && !segments_1_1.done && (_a = segments_1.return)) _a.call(segments_1);
2840
+ }
2841
+ finally { if (e_2) throw e_2.error; }
2842
+ }
2843
+ // Text segments must be >= (total segments - 2) to apply margin.
2844
+ // If not, the selection marker is likely between texts segment, so skip margin adjustment.
2845
+ if (segments.length - 2 <= numberOfSegments) {
2846
+ return tabsNumber;
2847
+ }
2848
+ return;
2849
+ };
2850
+
2851
+
2727
2852
  /***/ }),
2728
2853
 
2729
2854
  /***/ "./packages/roosterjs-content-model-api/lib/modelApi/common/clearModelFormat.ts":
@@ -3697,6 +3822,7 @@ function getListNumber(path, listItem) {
3697
3822
 
3698
3823
  Object.defineProperty(exports, "__esModule", ({ value: true }));
3699
3824
  exports.setListType = void 0;
3825
+ var adjustIndentation_1 = __webpack_require__(/*! ../common/adjustIndentation */ "./packages/roosterjs-content-model-api/lib/modelApi/common/adjustIndentation.ts");
3700
3826
  var splitSelectedParagraphByBr_1 = __webpack_require__(/*! ../block/splitSelectedParagraphByBr */ "./packages/roosterjs-content-model-api/lib/modelApi/block/splitSelectedParagraphByBr.ts");
3701
3827
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
3702
3828
  /**
@@ -3725,6 +3851,11 @@ function setListType(model, listType, removeMargins) {
3725
3851
  var level = block.levels.pop();
3726
3852
  if (!alreadyInExpectedType && level) {
3727
3853
  level.listType = listType;
3854
+ (0, roosterjs_content_model_dom_1.updateListMetadata)(level, function (metadata) {
3855
+ return Object.assign({}, metadata, {
3856
+ applyListStyleFromLevel: true,
3857
+ });
3858
+ });
3728
3859
  block.levels.push(level);
3729
3860
  }
3730
3861
  else if (block.blocks.length == 1) {
@@ -3768,6 +3899,7 @@ function setListType(model, listType, removeMargins) {
3768
3899
  }
3769
3900
  var mutableBlock = (0, roosterjs_content_model_dom_1.mutateBlock)(block);
3770
3901
  newListItem.blocks.push(mutableBlock);
3902
+ (0, adjustIndentation_1.adjustListIndentation)(newListItem);
3771
3903
  (0, roosterjs_content_model_dom_1.copyFormat)(newListItem.format, mutableBlock.format, roosterjs_content_model_dom_1.ListFormatsToMove, true /*deleteOriginalFormat*/);
3772
3904
  (0, roosterjs_content_model_dom_1.copyFormat)(newListItem.format, mutableBlock.format, roosterjs_content_model_dom_1.ListFormatsToKeep);
3773
3905
  (0, roosterjs_content_model_dom_1.mutateBlock)(parent).blocks.splice(index, 1, newListItem);
@@ -5306,7 +5438,7 @@ function getFormatState(editor, conflictSolution) {
5306
5438
  isDarkMode: editor.isDarkMode(),
5307
5439
  };
5308
5440
  editor.formatContentModel(function (model) {
5309
- (0, roosterjs_content_model_dom_1.retrieveModelFormatState)(model, pendingFormat, result, conflictSolution, editor.getDOMHelper());
5441
+ (0, roosterjs_content_model_dom_1.retrieveModelFormatState)(model, pendingFormat, result, conflictSolution, editor.getDOMHelper(), editor.isDarkMode(), editor.getColorManager());
5310
5442
  return false;
5311
5443
  }, undefined /*options*/, {
5312
5444
  processorOverride: {
@@ -6940,6 +7072,7 @@ exports.formatTable = formatTable;
6940
7072
 
6941
7073
  Object.defineProperty(exports, "__esModule", ({ value: true }));
6942
7074
  exports.insertTable = void 0;
7075
+ var adjustIndentation_1 = __webpack_require__(/*! ../../modelApi/common/adjustIndentation */ "./packages/roosterjs-content-model-api/lib/modelApi/common/adjustIndentation.ts");
6943
7076
  var createTableStructure_1 = __webpack_require__(/*! ../../modelApi/table/createTableStructure */ "./packages/roosterjs-content-model-api/lib/modelApi/table/createTableStructure.ts");
6944
7077
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
6945
7078
  /**
@@ -6960,6 +7093,7 @@ function insertTable(editor, columns, rows, format) {
6960
7093
  var doc = (0, roosterjs_content_model_dom_1.createContentModelDocument)();
6961
7094
  var table = (0, createTableStructure_1.createTableStructure)(doc, columns, rows);
6962
7095
  (0, roosterjs_content_model_dom_1.normalizeTable)(table, editor.getPendingFormat() || insertPosition.marker.format);
7096
+ (0, adjustIndentation_1.adjustTableIndentation)(insertPosition, table);
6963
7097
  // Assign default vertical align
6964
7098
  format = format || { verticalAlign: 'top' };
6965
7099
  (0, roosterjs_content_model_dom_1.applyTableFormat)(table, format);
@@ -7616,6 +7750,7 @@ var DefaultSanitizingOption = {
7616
7750
  additionalDisallowedTags: [],
7617
7751
  styleSanitizers: {},
7618
7752
  attributeSanitizers: {},
7753
+ processNonVisibleElements: false,
7619
7754
  };
7620
7755
  /**
7621
7756
  * @internal
@@ -8055,26 +8190,37 @@ function isCssVariable(value) {
8055
8190
  Object.defineProperty(exports, "__esModule", ({ value: true }));
8056
8191
  exports.exportContent = void 0;
8057
8192
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
8193
+ // Here I didn't add 'HTMLFast' to ExportContentMode type because it will make this a breaking change and EditorAdapter will see build time error without bumping version
8194
+ // Once we are confident that 'HTMLFast' is stable, we can fully switch 'HTML' to use the 'HTMLFast' approach
8058
8195
  function exportContent(editor, mode, optionsOrCallbacks) {
8059
8196
  if (mode === void 0) { mode = 'HTML'; }
8060
- if (mode == 'PlainTextFast') {
8061
- return editor.getDOMHelper().getTextContent();
8062
- }
8063
- else {
8064
- var model = editor.getContentModelCopy('clean');
8065
- if (mode == 'PlainText') {
8197
+ var model;
8198
+ switch (mode) {
8199
+ case 'PlainTextFast':
8200
+ return editor.getDOMHelper().getTextContent();
8201
+ case 'PlainText':
8202
+ model = editor.getContentModelCopy('clean');
8066
8203
  return (0, roosterjs_content_model_dom_1.contentModelToText)(model, undefined /*separator*/, optionsOrCallbacks);
8067
- }
8068
- else {
8204
+ case 'HTMLFast':
8205
+ var clonedRoot = editor.getDOMHelper().getClonedRoot();
8206
+ if (editor.isDarkMode()) {
8207
+ (0, roosterjs_content_model_dom_1.transformColor)(clonedRoot, false /*includeSelf*/, 'darkToLight', editor.getColorManager());
8208
+ }
8209
+ return getHTMLFromDOM(editor, clonedRoot);
8210
+ case 'HTML':
8211
+ default:
8212
+ model = editor.getContentModelCopy('clean');
8069
8213
  var doc = editor.getDocument();
8070
8214
  var div = doc.createElement('div');
8071
8215
  (0, roosterjs_content_model_dom_1.contentModelToDom)(doc, div, model, (0, roosterjs_content_model_dom_1.createModelToDomContext)(undefined /*editorContext*/, optionsOrCallbacks));
8072
- editor.triggerEvent('extractContentWithDom', { clonedRoot: div }, true /*broadcast*/);
8073
- return div.innerHTML;
8074
- }
8216
+ return getHTMLFromDOM(editor, div);
8075
8217
  }
8076
8218
  }
8077
8219
  exports.exportContent = exportContent;
8220
+ function getHTMLFromDOM(editor, root) {
8221
+ editor.triggerEvent('extractContentWithDom', { clonedRoot: root }, true /*broadcast*/);
8222
+ return root.innerHTML;
8223
+ }
8078
8224
 
8079
8225
 
8080
8226
  /***/ }),
@@ -8249,6 +8395,8 @@ function generatePasteOptionFromPlugins(editor, clipboardData, fragment, htmlFro
8249
8395
  processorOverride: {},
8250
8396
  styleSanitizers: {},
8251
8397
  attributeSanitizers: {},
8398
+ processNonVisibleElements: !!editor.getEnvironment().domToModelSettings.customized
8399
+ .processNonVisibleElements,
8252
8400
  };
8253
8401
  var event = {
8254
8402
  eventType: 'beforePaste',
@@ -8930,7 +9078,7 @@ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-mo
8930
9078
  */
8931
9079
  var attachDomEvent = function (core, eventMap) {
8932
9080
  var disposers = (0, roosterjs_content_model_dom_1.getObjectKeys)(eventMap || {}).map(function (key) {
8933
- var _a = eventMap[key], pluginEventType = _a.pluginEventType, beforeDispatch = _a.beforeDispatch;
9081
+ var _a = eventMap[key], pluginEventType = _a.pluginEventType, beforeDispatch = _a.beforeDispatch, capture = _a.capture;
8934
9082
  var eventName = key;
8935
9083
  var onEvent = function (event) {
8936
9084
  if (beforeDispatch) {
@@ -8943,9 +9091,11 @@ var attachDomEvent = function (core, eventMap) {
8943
9091
  }, false /*broadcast*/);
8944
9092
  }
8945
9093
  };
8946
- core.logicalRoot.addEventListener(eventName, onEvent);
9094
+ core.logicalRoot.addEventListener(eventName, onEvent, { capture: capture });
8947
9095
  return function () {
8948
- core.logicalRoot.removeEventListener(eventName, onEvent);
9096
+ core.logicalRoot.removeEventListener(eventName, onEvent, {
9097
+ capture: capture,
9098
+ });
8949
9099
  };
8950
9100
  });
8951
9101
  return function () { return disposers.forEach(function (disposers) { return disposers(); }); };
@@ -15165,8 +15315,10 @@ var DOMHelperImpl = /** @class */ (function () {
15165
15315
  };
15166
15316
  /**
15167
15317
  * Get format of the container element
15318
+ * @param isInDarkMode Optional flag to indicate if the environment is in dark mode
15319
+ * @param darkColorHandler Optional DarkColorHandler to retrieve dark mode colors
15168
15320
  */
15169
- DOMHelperImpl.prototype.getContainerFormat = function () {
15321
+ DOMHelperImpl.prototype.getContainerFormat = function (isInDarkMode, darkColorHandler) {
15170
15322
  var _a, _b;
15171
15323
  var window = this.contentDiv.ownerDocument.defaultView;
15172
15324
  var style = window === null || window === void 0 ? void 0 : window.getComputedStyle(this.contentDiv);
@@ -15175,8 +15327,8 @@ var DOMHelperImpl = /** @class */ (function () {
15175
15327
  fontSize: style.fontSize,
15176
15328
  fontFamily: style.fontFamily,
15177
15329
  fontWeight: style.fontWeight,
15178
- textColor: style.color,
15179
- backgroundColor: style.backgroundColor,
15330
+ textColor: (0, roosterjs_content_model_dom_1.getColor)(this.contentDiv, false /*isBackgroundColor*/, !!isInDarkMode, darkColorHandler, style.color),
15331
+ backgroundColor: (0, roosterjs_content_model_dom_1.getColor)(this.contentDiv, true /*isBackgroundColor*/, !!isInDarkMode, darkColorHandler, style.backgroundColor),
15180
15332
  italic: style.fontStyle == 'italic',
15181
15333
  letterSpacing: style.letterSpacing,
15182
15334
  lineHeight: style.lineHeight,
@@ -15862,6 +16014,13 @@ exports.defaultContentModelFormatMap = {
15862
16014
  code: {
15863
16015
  fontFamily: 'monospace',
15864
16016
  },
16017
+ dd: {
16018
+ marginLeft: '40px',
16019
+ },
16020
+ dl: {
16021
+ marginTop: '1em',
16022
+ marginBottom: '1em',
16023
+ },
15865
16024
  h1: {
15866
16025
  fontWeight: 'bold',
15867
16026
  fontSize: '2em',
@@ -15940,9 +16099,13 @@ exports.defaultHTMLStyleMap = {
15940
16099
  display: 'block',
15941
16100
  textAlign: 'center',
15942
16101
  },
15943
- dd: blockElement,
16102
+ dd: { display: 'block', marginInlineStart: '40px' },
15944
16103
  div: blockElement,
15945
- dl: blockElement,
16104
+ dl: {
16105
+ display: 'block',
16106
+ marginTop: '1em',
16107
+ marginBottom: '1em',
16108
+ },
15946
16109
  dt: blockElement,
15947
16110
  em: {
15948
16111
  fontStyle: 'italic',
@@ -16576,6 +16739,7 @@ function createDomToModelConfig(options) {
16576
16739
  formatParsers: buildFormatParsers(options.map(function (x) { return x === null || x === void 0 ? void 0 : x.formatParserOverride; }), options.map(function (x) { return x === null || x === void 0 ? void 0 : x.additionalFormatParsers; })),
16577
16740
  defaultElementProcessors: defaultProcessors_1.defaultProcessorMap,
16578
16741
  defaultFormatParsers: defaultFormatHandlers_1.defaultFormatParsers,
16742
+ processNonVisibleElements: options.some(function (x) { return !!(x === null || x === void 0 ? void 0 : x.processNonVisibleElements); }),
16579
16743
  };
16580
16744
  }
16581
16745
  exports.createDomToModelConfig = createDomToModelConfig;
@@ -16655,8 +16819,11 @@ exports.defaultProcessorMap = {
16655
16819
  blockquote: knownElementProcessor_1.knownElementProcessor,
16656
16820
  br: brProcessor_1.brProcessor,
16657
16821
  code: codeProcessor_1.codeProcessor,
16822
+ dd: formatContainerProcessor_1.formatContainerProcessor,
16658
16823
  del: knownElementProcessor_1.knownElementProcessor,
16659
16824
  div: knownElementProcessor_1.knownElementProcessor,
16825
+ dl: formatContainerProcessor_1.formatContainerProcessor,
16826
+ dt: formatContainerProcessor_1.formatContainerProcessor,
16660
16827
  em: knownElementProcessor_1.knownElementProcessor,
16661
16828
  font: fontProcessor_1.fontProcessor,
16662
16829
  i: knownElementProcessor_1.knownElementProcessor,
@@ -16848,10 +17015,10 @@ exports.childProcessor = childProcessor;
16848
17015
  * @param group The parent block group
16849
17016
  * @param parent Parent DOM node to process
16850
17017
  * @param context DOM to Content Model context
16851
- *
16852
17018
  */
16853
17019
  function processChildNode(group, child, context) {
16854
- if ((0, isNodeOfType_1.isNodeOfType)(child, 'ELEMENT_NODE') && child.style.display != 'none') {
17020
+ if ((0, isNodeOfType_1.isNodeOfType)(child, 'ELEMENT_NODE') &&
17021
+ (child.style.display != 'none' || context.processNonVisibleElements)) {
16855
17022
  context.elementProcessors.element(group, child, context);
16856
17023
  }
16857
17024
  else if ((0, isNodeOfType_1.isNodeOfType)(child, 'TEXT_NODE')) {
@@ -18202,8 +18369,9 @@ var BLOCK_DISPLAY_STYLES = ['block', 'list-item', 'table', 'table-cell', 'flex']
18202
18369
  * @param context The context of DOM to Content Model conversion
18203
18370
  */
18204
18371
  function isBlockElement(element) {
18205
- var display = element.style.display || (0, getDefaultStyle_1.getDefaultStyle)(element).display || '';
18206
- return BLOCK_DISPLAY_STYLES.indexOf(display) >= 0;
18372
+ var display = element.style.display == 'none' ? null : element.style.display;
18373
+ var effectiveDisplay = display || (0, getDefaultStyle_1.getDefaultStyle)(element).display || '';
18374
+ return BLOCK_DISPLAY_STYLES.indexOf(effectiveDisplay) >= 0;
18207
18375
  }
18208
18376
  exports.isBlockElement = isBlockElement;
18209
18377
 
@@ -19651,12 +19819,13 @@ exports.wrap = wrap;
19651
19819
  /*!*************************************************************************************************!*\
19652
19820
  !*** ./packages/roosterjs-content-model-dom/lib/formatHandlers/block/directionFormatHandler.ts ***!
19653
19821
  \*************************************************************************************************/
19654
- /***/ ((__unused_webpack_module, exports) => {
19822
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
19655
19823
 
19656
19824
  "use strict";
19657
19825
 
19658
19826
  Object.defineProperty(exports, "__esModule", ({ value: true }));
19659
19827
  exports.directionFormatHandler = void 0;
19828
+ var isElementOfType_1 = __webpack_require__(/*! ../../domUtils/isElementOfType */ "./packages/roosterjs-content-model-dom/lib/domUtils/isElementOfType.ts");
19660
19829
  /**
19661
19830
  * @internal
19662
19831
  */
@@ -19671,6 +19840,9 @@ exports.directionFormatHandler = {
19671
19840
  if (format.direction) {
19672
19841
  element.style.direction = format.direction;
19673
19842
  }
19843
+ if (format.direction == 'rtl' && (0, isElementOfType_1.isElementOfType)(element, 'table')) {
19844
+ element.style.justifySelf = 'flex-end';
19845
+ }
19674
19846
  },
19675
19847
  };
19676
19848
 
@@ -19793,13 +19965,33 @@ var MarginKeys = [
19793
19965
  'marginBottom',
19794
19966
  'marginLeft',
19795
19967
  ];
19968
+ var DefaultMarginKey = {
19969
+ ltr: {
19970
+ marginRight: 'marginInlineEnd',
19971
+ marginLeft: 'marginInlineStart',
19972
+ },
19973
+ rtl: {
19974
+ marginRight: 'marginInlineStart',
19975
+ marginLeft: 'marginInlineEnd',
19976
+ },
19977
+ };
19978
+ var LTR = {
19979
+ marginLeft: 'marginRight',
19980
+ marginRight: 'marginLeft',
19981
+ marginTop: 'marginTop',
19982
+ marginBottom: 'marginBottom',
19983
+ };
19796
19984
  /**
19797
19985
  * @internal
19798
19986
  */
19799
19987
  exports.marginFormatHandler = {
19800
19988
  parse: function (format, element, _, defaultStyle) {
19801
19989
  MarginKeys.forEach(function (key) {
19802
- var value = element.style[key] || defaultStyle[key];
19990
+ var _a, _b;
19991
+ var alternativeKey = DefaultMarginKey[(_a = format.direction) !== null && _a !== void 0 ? _a : 'ltr'][key];
19992
+ var value = element.style[key] ||
19993
+ defaultStyle[key] ||
19994
+ (alternativeKey ? (_b = defaultStyle[alternativeKey]) === null || _b === void 0 ? void 0 : _b.toString() : '');
19803
19995
  if (value) {
19804
19996
  switch (key) {
19805
19997
  case 'marginTop':
@@ -19821,7 +20013,8 @@ exports.marginFormatHandler = {
19821
20013
  apply: function (format, element, context) {
19822
20014
  MarginKeys.forEach(function (key) {
19823
20015
  var value = format[key];
19824
- if (value != context.implicitFormat[key]) {
20016
+ var ltrKey = format.direction == 'rtl' ? LTR[key] : key;
20017
+ if (value != context.implicitFormat[ltrKey]) {
19825
20018
  element.style[key] = value || '0';
19826
20019
  }
19827
20020
  });
@@ -20624,6 +20817,7 @@ exports.defaultFormatKeysPerCategory = {
20624
20817
  'size',
20625
20818
  'tableLayout',
20626
20819
  'textColor',
20820
+ 'direction',
20627
20821
  ],
20628
20822
  tableBorder: ['borderBox', 'tableSpacing'],
20629
20823
  tableCellBorder: ['borderBox'],
@@ -21549,11 +21743,12 @@ var COLOR_VAR_PREFIX = '--darkColor';
21549
21743
  * @param isBackground True to get background color, false to get text color
21550
21744
  * @param isDarkMode Whether element is in dark mode now
21551
21745
  * @param darkColorHandler @optional The dark color handler object to help manager dark mode color
21746
+ * @param fallback @optional Fallback color to use if no color is found from the element
21552
21747
  */
21553
- function getColor(element, isBackground, isDarkMode, darkColorHandler) {
21748
+ function getColor(element, isBackground, isDarkMode, darkColorHandler, fallback) {
21554
21749
  var color = (isBackground ? element.style.backgroundColor : element.style.color) ||
21555
21750
  element.getAttribute(isBackground ? 'bgcolor' : 'color') ||
21556
- undefined;
21751
+ fallback;
21557
21752
  if (color && exports.DeprecatedColors.indexOf(color) > -1) {
21558
21753
  color = isBackground ? undefined : BlackColor;
21559
21754
  }
@@ -25181,8 +25376,12 @@ var parseValueWithUnit_1 = __webpack_require__(/*! ../../formatHandlers/utils/pa
25181
25376
  * @param pendingFormat Existing pending format, if any
25182
25377
  * @param formatState Existing format state object, used for receiving the result
25183
25378
  * @param conflictSolution The strategy for handling format conflicts
25379
+ * @param domHelper Optional DOMHelper to retrieve container format
25380
+ * @param isInDarkMode Optional flag to indicate if the environment is in dark mode
25381
+ * @param colorHandler Optional DarkColorHandler to handle dark mode colors
25382
+ *
25184
25383
  */
25185
- function retrieveModelFormatState(model, pendingFormat, formatState, conflictSolution, domHelper) {
25384
+ function retrieveModelFormatState(model, pendingFormat, formatState, conflictSolution, domHelper, isInDarkMode, colorHandler) {
25186
25385
  if (conflictSolution === void 0) { conflictSolution = 'remove'; }
25187
25386
  var firstTableContext;
25188
25387
  var firstBlock;
@@ -25219,7 +25418,8 @@ function retrieveModelFormatState(model, pendingFormat, formatState, conflictSol
25219
25418
  // to make sure the current format contains all required format.
25220
25419
  if (!hasAllRequiredFormat(currentFormat)) {
25221
25420
  if (!containerFormat) {
25222
- containerFormat = (_d = domHelper === null || domHelper === void 0 ? void 0 : domHelper.getContainerFormat()) !== null && _d !== void 0 ? _d : modelFormat;
25421
+ containerFormat =
25422
+ (_d = domHelper === null || domHelper === void 0 ? void 0 : domHelper.getContainerFormat(isInDarkMode, colorHandler)) !== null && _d !== void 0 ? _d : modelFormat;
25223
25423
  }
25224
25424
  currentFormat = Object.assign({}, containerFormat, currentFormat);
25225
25425
  }
@@ -26953,6 +27153,7 @@ function calcPosition(pos) {
26953
27153
  Object.defineProperty(exports, "__esModule", ({ value: true }));
26954
27154
  exports.buildFormatAppliers = exports.createModelToDomConfig = exports.createModelToDomContextWithConfig = exports.createModelToDomContext = void 0;
26955
27155
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
27156
+ var defaultContentModelFormatMap_1 = __webpack_require__(/*! ../../config/defaultContentModelFormatMap */ "./packages/roosterjs-content-model-dom/lib/config/defaultContentModelFormatMap.ts");
26956
27157
  var defaultContentModelHandlers_1 = __webpack_require__(/*! ./defaultContentModelHandlers */ "./packages/roosterjs-content-model-dom/lib/modelToDom/context/defaultContentModelHandlers.ts");
26957
27158
  var getObjectKeys_1 = __webpack_require__(/*! ../../domUtils/getObjectKeys */ "./packages/roosterjs-content-model-dom/lib/domUtils/getObjectKeys.ts");
26958
27159
  var defaultFormatHandlers_1 = __webpack_require__(/*! ../../formatHandlers/defaultFormatHandlers */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/defaultFormatHandlers.ts");
@@ -27017,6 +27218,8 @@ function createModelToDomConfig(options) {
27017
27218
  defaultModelHandlers: defaultContentModelHandlers_1.defaultContentModelHandlers,
27018
27219
  defaultFormatAppliers: defaultFormatHandlers_1.defaultFormatAppliers,
27019
27220
  metadataAppliers: Object.assign.apply(Object, (0, tslib_1.__spreadArray)([{}], (0, tslib_1.__read)(options.map(function (x) { return x === null || x === void 0 ? void 0 : x.metadataAppliers; })), false)),
27221
+ defaultContentModelFormatMap: Object.assign.apply(Object, (0, tslib_1.__spreadArray)([{},
27222
+ defaultContentModelFormatMap_1.defaultContentModelFormatMap], (0, tslib_1.__read)(options.map(function (x) { return x === null || x === void 0 ? void 0 : x.defaultContentModelFormatOverride; })), false)),
27020
27223
  };
27021
27224
  }
27022
27225
  exports.createModelToDomConfig = createModelToDomConfig;
@@ -28270,13 +28473,12 @@ exports.handleSegmentCommon = handleSegmentCommon;
28270
28473
  Object.defineProperty(exports, "__esModule", ({ value: true }));
28271
28474
  exports.stackFormat = void 0;
28272
28475
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
28273
- var defaultContentModelFormatMap_1 = __webpack_require__(/*! ../../config/defaultContentModelFormatMap */ "./packages/roosterjs-content-model-dom/lib/config/defaultContentModelFormatMap.ts");
28274
28476
  /**
28275
28477
  * @internal
28276
28478
  */
28277
28479
  function stackFormat(context, tagNameOrFormat, callback) {
28278
28480
  var newFormat = typeof tagNameOrFormat === 'string'
28279
- ? defaultContentModelFormatMap_1.defaultContentModelFormatMap[tagNameOrFormat]
28481
+ ? context.defaultContentModelFormatMap[tagNameOrFormat]
28280
28482
  : tagNameOrFormat;
28281
28483
  if (newFormat) {
28282
28484
  var implicitFormat = context.implicitFormat;
@@ -28555,7 +28757,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
28555
28757
  exports.applyTextFormatting = void 0;
28556
28758
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
28557
28759
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
28558
- var SPLIT_PATTERN = /(\*\*\*.*?\*\*\*|\*\*.*?\*\*|\*.*?\*)/;
28760
+ var SPLIT_PATTERN = /(\*\*\*.*?\*\*\*|\*\*.*?\*\*|\*.*?\*|\~\~.*?\~\~)/;
28559
28761
  /**
28560
28762
  * @internal
28561
28763
  */
@@ -28598,6 +28800,10 @@ function createFormattedSegment(text, format, link) {
28598
28800
  text = text.replace(/\*/g, '');
28599
28801
  text = text + ' ';
28600
28802
  }
28803
+ else if (text.startsWith('~~') && text.endsWith('~~')) {
28804
+ format = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, format), { strikethrough: true });
28805
+ text = text.replace(/\~\~/g, '');
28806
+ }
28601
28807
  return (0, roosterjs_content_model_dom_1.createText)(text, format, link);
28602
28808
  }
28603
28809
 
@@ -29462,6 +29668,9 @@ function textProcessor(text) {
29462
29668
  if (text.format.fontWeight == 'bold') {
29463
29669
  markdownString = "**" + markdownString + "**";
29464
29670
  }
29671
+ if (text.format.strikethrough) {
29672
+ markdownString = "~~" + markdownString + "~~";
29673
+ }
29465
29674
  if (text.format.italic) {
29466
29675
  markdownString = "*" + markdownString + "*";
29467
29676
  }
@@ -30616,7 +30825,10 @@ function getNumericValue(text, checkFullText) {
30616
30825
  var number = checkFullText ? text : text.substring(0, text.length - ORDINAL_LENGTH);
30617
30826
  var isNumber = /^-?\d+$/.test(number);
30618
30827
  if (isNumber) {
30619
- return parseInt(text);
30828
+ var numericValue = parseInt(number);
30829
+ return Math.abs(numericValue) < 20
30830
+ ? numericValue
30831
+ : parseInt(number.substring(number.length - 1));
30620
30832
  }
30621
30833
  return null;
30622
30834
  }
@@ -31320,6 +31532,38 @@ var deleteList = function (context) {
31320
31532
  exports.deleteList = deleteList;
31321
31533
 
31322
31534
 
31535
+ /***/ }),
31536
+
31537
+ /***/ "./packages/roosterjs-content-model-plugins/lib/edit/deleteSteps/deleteParagraphStyle.ts":
31538
+ /*!***********************************************************************************************!*\
31539
+ !*** ./packages/roosterjs-content-model-plugins/lib/edit/deleteSteps/deleteParagraphStyle.ts ***!
31540
+ \***********************************************************************************************/
31541
+ /***/ ((__unused_webpack_module, exports) => {
31542
+
31543
+ "use strict";
31544
+
31545
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
31546
+ exports.deleteParagraphStyle = void 0;
31547
+ /**
31548
+ * @internal
31549
+ */
31550
+ var deleteParagraphStyle = function (context) {
31551
+ if (context.deleteResult === 'nothingToDelete') {
31552
+ var insertPoint = context.insertPoint;
31553
+ var paragraph = insertPoint.paragraph;
31554
+ // If the paragraph is empty, we will delete any style in it
31555
+ // This is to ensure the paragraph style is reset to default when there is no content in the paragraph
31556
+ if (paragraph.segments.every(function (s) { return s.segmentType === 'SelectionMarker' || s.segmentType === 'Br'; }) &&
31557
+ paragraph.segments.filter(function (s) { return s.segmentType === 'Br'; }).length <= 1 &&
31558
+ Object.keys(paragraph.format).length > 0) {
31559
+ paragraph.format = {};
31560
+ context.deleteResult = 'range';
31561
+ }
31562
+ }
31563
+ };
31564
+ exports.deleteParagraphStyle = deleteParagraphStyle;
31565
+
31566
+
31323
31567
  /***/ }),
31324
31568
 
31325
31569
  /***/ "./packages/roosterjs-content-model-plugins/lib/edit/deleteSteps/deleteWordSelection.ts":
@@ -31765,6 +32009,7 @@ exports.keyboardDelete = void 0;
31765
32009
  var deleteAllSegmentBefore_1 = __webpack_require__(/*! ./deleteSteps/deleteAllSegmentBefore */ "./packages/roosterjs-content-model-plugins/lib/edit/deleteSteps/deleteAllSegmentBefore.ts");
31766
32010
  var deleteEmptyQuote_1 = __webpack_require__(/*! ./deleteSteps/deleteEmptyQuote */ "./packages/roosterjs-content-model-plugins/lib/edit/deleteSteps/deleteEmptyQuote.ts");
31767
32011
  var deleteList_1 = __webpack_require__(/*! ./deleteSteps/deleteList */ "./packages/roosterjs-content-model-plugins/lib/edit/deleteSteps/deleteList.ts");
32012
+ var deleteParagraphStyle_1 = __webpack_require__(/*! ./deleteSteps/deleteParagraphStyle */ "./packages/roosterjs-content-model-plugins/lib/edit/deleteSteps/deleteParagraphStyle.ts");
31768
32013
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
31769
32014
  var handleKeyboardEventCommon_1 = __webpack_require__(/*! ./handleKeyboardEventCommon */ "./packages/roosterjs-content-model-plugins/lib/edit/handleKeyboardEventCommon.ts");
31770
32015
  var deleteWordSelection_1 = __webpack_require__(/*! ./deleteSteps/deleteWordSelection */ "./packages/roosterjs-content-model-plugins/lib/edit/deleteSteps/deleteWordSelection.ts");
@@ -31815,6 +32060,7 @@ function getDeleteSteps(rawEvent, isMac) {
31815
32060
  isForward ? null : deleteList_1.deleteList,
31816
32061
  deleteCollapsedSelection,
31817
32062
  deleteQuote,
32063
+ deleteParagraphStyle_1.deleteParagraphStyle,
31818
32064
  ];
31819
32065
  }
31820
32066
  function shouldDeleteWithContentModel(selection, rawEvent, handleExpandedSelection) {
@@ -32919,6 +33165,7 @@ var imageEditUtils_1 = __webpack_require__(/*! ./utils/imageEditUtils */ "./pack
32919
33165
  var createImageWrapper_1 = __webpack_require__(/*! ./utils/createImageWrapper */ "./packages/roosterjs-content-model-plugins/lib/imageEdit/utils/createImageWrapper.ts");
32920
33166
  var cropperContext_1 = __webpack_require__(/*! ./Cropper/cropperContext */ "./packages/roosterjs-content-model-plugins/lib/imageEdit/Cropper/cropperContext.ts");
32921
33167
  var findEditingImage_1 = __webpack_require__(/*! ./utils/findEditingImage */ "./packages/roosterjs-content-model-plugins/lib/imageEdit/utils/findEditingImage.ts");
33168
+ var filterInnerResizerHandles_1 = __webpack_require__(/*! ./utils/filterInnerResizerHandles */ "./packages/roosterjs-content-model-plugins/lib/imageEdit/utils/filterInnerResizerHandles.ts");
32922
33169
  var getDropAndDragHelpers_1 = __webpack_require__(/*! ./utils/getDropAndDragHelpers */ "./packages/roosterjs-content-model-plugins/lib/imageEdit/utils/getDropAndDragHelpers.ts");
32923
33170
  var getHTMLImageOptions_1 = __webpack_require__(/*! ./utils/getHTMLImageOptions */ "./packages/roosterjs-content-model-plugins/lib/imageEdit/utils/getHTMLImageOptions.ts");
32924
33171
  var getSelectedImage_1 = __webpack_require__(/*! ./utils/getSelectedImage */ "./packages/roosterjs-content-model-plugins/lib/imageEdit/utils/getSelectedImage.ts");
@@ -32927,6 +33174,7 @@ var ImageEditElementClass_1 = __webpack_require__(/*! ./types/ImageEditElementCl
32927
33174
  var normalizeImageSelection_1 = __webpack_require__(/*! ./utils/normalizeImageSelection */ "./packages/roosterjs-content-model-plugins/lib/imageEdit/utils/normalizeImageSelection.ts");
32928
33175
  var resizerContext_1 = __webpack_require__(/*! ./Resizer/resizerContext */ "./packages/roosterjs-content-model-plugins/lib/imageEdit/Resizer/resizerContext.ts");
32929
33176
  var rotatorContext_1 = __webpack_require__(/*! ./Rotator/rotatorContext */ "./packages/roosterjs-content-model-plugins/lib/imageEdit/Rotator/rotatorContext.ts");
33177
+ var updateHandleCursor_1 = __webpack_require__(/*! ./utils/updateHandleCursor */ "./packages/roosterjs-content-model-plugins/lib/imageEdit/utils/updateHandleCursor.ts");
32930
33178
  var updateRotateHandle_1 = __webpack_require__(/*! ./Rotator/updateRotateHandle */ "./packages/roosterjs-content-model-plugins/lib/imageEdit/Rotator/updateRotateHandle.ts");
32931
33179
  var updateWrapper_1 = __webpack_require__(/*! ./utils/updateWrapper */ "./packages/roosterjs-content-model-plugins/lib/imageEdit/utils/updateWrapper.ts");
32932
33180
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
@@ -32953,8 +33201,6 @@ var IMAGE_EDIT_FORMAT_EVENT = 'ImageEditEvent';
32953
33201
  */
32954
33202
  var ImageEditPlugin = /** @class */ (function () {
32955
33203
  function ImageEditPlugin(options) {
32956
- if (options === void 0) { options = DefaultOptions; }
32957
- this.options = options;
32958
33204
  this.editor = null;
32959
33205
  this.shadowSpan = null;
32960
33206
  this.selectedImage = null;
@@ -32972,6 +33218,7 @@ var ImageEditPlugin = /** @class */ (function () {
32972
33218
  this.zoomScale = 1;
32973
33219
  this.disposer = null;
32974
33220
  this.isEditing = false;
33221
+ this.options = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, DefaultOptions), options);
32975
33222
  }
32976
33223
  /**
32977
33224
  * Get name of this plugin
@@ -33254,11 +33501,42 @@ var ImageEditPlugin = /** @class */ (function () {
33254
33501
  });
33255
33502
  };
33256
33503
  ImageEditPlugin.prototype.startEditing = function (editor, image, apiOperation) {
33504
+ var _this = this;
33505
+ if (!this.imageEditInfo) {
33506
+ this.imageEditInfo = (0, updateImageEditInfo_1.getSelectedImageMetadata)(editor, image);
33507
+ }
33508
+ if ((this.imageEditInfo.widthPx == 0 || this.imageEditInfo.heightPx == 0) &&
33509
+ !image.complete) {
33510
+ // Image dimensions are zero and loading is incomplete, wait for image to load.
33511
+ image.onload = function () {
33512
+ _this.updateImageDimensionsIfZero(image);
33513
+ _this.startEditingInternal(editor, image, apiOperation);
33514
+ image.onload = null;
33515
+ image.onerror = null;
33516
+ };
33517
+ image.onerror = function () {
33518
+ image.onload = null;
33519
+ image.onerror = null;
33520
+ };
33521
+ }
33522
+ else {
33523
+ this.updateImageDimensionsIfZero(image);
33524
+ this.startEditingInternal(editor, image, apiOperation);
33525
+ }
33526
+ };
33527
+ ImageEditPlugin.prototype.updateImageDimensionsIfZero = function (image) {
33528
+ var _a, _b;
33529
+ if (((_a = this.imageEditInfo) === null || _a === void 0 ? void 0 : _a.widthPx) === 0 || ((_b = this.imageEditInfo) === null || _b === void 0 ? void 0 : _b.heightPx) === 0) {
33530
+ this.imageEditInfo.widthPx = image.clientWidth;
33531
+ this.imageEditInfo.heightPx = image.clientHeight;
33532
+ }
33533
+ };
33534
+ ImageEditPlugin.prototype.startEditingInternal = function (editor, image, apiOperation) {
33257
33535
  if (!this.imageEditInfo) {
33258
33536
  this.imageEditInfo = (0, updateImageEditInfo_1.getSelectedImageMetadata)(editor, image);
33259
33537
  }
33260
- this.lastSrc = image.getAttribute('src');
33261
33538
  this.imageHTMLOptions = (0, getHTMLImageOptions_1.getHTMLImageOptions)(editor, this.options, this.imageEditInfo);
33539
+ this.lastSrc = image.getAttribute('src');
33262
33540
  var _a = (0, createImageWrapper_1.createImageWrapper)(editor, image, this.options, this.imageEditInfo, this.imageHTMLOptions, apiOperation), resizers = _a.resizers, rotators = _a.rotators, wrapper = _a.wrapper, shadowSpan = _a.shadowSpan, imageClone = _a.imageClone, croppers = _a.croppers;
33263
33541
  this.shadowSpan = shadowSpan;
33264
33542
  this.selectedImage = image;
@@ -33276,7 +33554,7 @@ var ImageEditPlugin = /** @class */ (function () {
33276
33554
  };
33277
33555
  ImageEditPlugin.prototype.startRotateAndResize = function (editor, image) {
33278
33556
  var _this = this;
33279
- var _a;
33557
+ var _a, _b;
33280
33558
  if (this.imageEditInfo) {
33281
33559
  this.startEditing(editor, image, ['resize', 'rotate']);
33282
33560
  if (this.selectedImage && this.imageEditInfo && this.wrapper && this.clonedImage) {
@@ -33290,21 +33568,28 @@ var ImageEditPlugin = /** @class */ (function () {
33290
33568
  _this.wasImageResized = true;
33291
33569
  }
33292
33570
  }, this.zoomScale, isMobileOrTable)), false), (0, tslib_1.__read)((0, getDropAndDragHelpers_1.getDropAndDragHelpers)(this.wrapper, this.imageEditInfo, this.options, ImageEditElementClass_1.ImageEditElementClass.RotateHandle, rotatorContext_1.Rotator, function () {
33293
- var _a;
33571
+ var _a, _b;
33294
33572
  if (_this.imageEditInfo &&
33295
33573
  _this.selectedImage &&
33296
33574
  _this.wrapper &&
33297
33575
  _this.clonedImage) {
33298
33576
  (0, updateWrapper_1.updateWrapper)(_this.imageEditInfo, _this.options, _this.selectedImage, _this.clonedImage, _this.wrapper);
33299
- _this.updateRotateHandleState(editor, _this.selectedImage, _this.wrapper, _this.rotators, (_a = _this.imageEditInfo) === null || _a === void 0 ? void 0 : _a.angleRad);
33577
+ _this.updateRotateHandleState(editor, _this.selectedImage, _this.wrapper, _this.rotators, (_a = _this.imageEditInfo) === null || _a === void 0 ? void 0 : _a.angleRad, !!((_b = _this.options) === null || _b === void 0 ? void 0 : _b.disableSideResize));
33578
+ _this.updateResizeHandleDirection(_this.resizers, _this.imageEditInfo.angleRad);
33300
33579
  }
33301
33580
  }, this.zoomScale, isMobileOrTable)), false);
33302
33581
  (0, updateWrapper_1.updateWrapper)(this.imageEditInfo, this.options, this.selectedImage, this.clonedImage, this.wrapper, this.resizers);
33303
- this.updateRotateHandleState(editor, this.selectedImage, this.wrapper, this.rotators, (_a = this.imageEditInfo) === null || _a === void 0 ? void 0 : _a.angleRad);
33582
+ this.updateRotateHandleState(editor, this.selectedImage, this.wrapper, this.rotators, (_a = this.imageEditInfo) === null || _a === void 0 ? void 0 : _a.angleRad, !!((_b = this.options) === null || _b === void 0 ? void 0 : _b.disableSideResize));
33304
33583
  }
33305
33584
  }
33306
33585
  };
33307
- ImageEditPlugin.prototype.updateRotateHandleState = function (editor, image, wrapper, rotators, angleRad) {
33586
+ ImageEditPlugin.prototype.updateResizeHandleDirection = function (resizers, angleRad) {
33587
+ var resizeHandles = (0, filterInnerResizerHandles_1.filterInnerResizerHandles)(resizers);
33588
+ if (angleRad !== undefined) {
33589
+ (0, updateHandleCursor_1.updateHandleCursor)(resizeHandles, angleRad);
33590
+ }
33591
+ };
33592
+ ImageEditPlugin.prototype.updateRotateHandleState = function (editor, image, wrapper, rotators, angleRad, disableSideResize) {
33308
33593
  var viewport = editor.getVisibleViewport();
33309
33594
  var smallImage = (0, imageEditUtils_1.isASmallImage)(image.width, image.height);
33310
33595
  if (viewport && rotators && rotators.length > 0) {
@@ -33312,7 +33597,7 @@ var ImageEditPlugin = /** @class */ (function () {
33312
33597
  var rotatorHandle = rotator.firstElementChild;
33313
33598
  if ((0, roosterjs_content_model_dom_1.isNodeOfType)(rotatorHandle, 'ELEMENT_NODE') &&
33314
33599
  (0, roosterjs_content_model_dom_1.isElementOfType)(rotatorHandle, 'div')) {
33315
- (0, updateRotateHandle_1.updateRotateHandle)(viewport, angleRad !== null && angleRad !== void 0 ? angleRad : 0, wrapper, rotator, rotatorHandle, smallImage);
33600
+ (0, updateRotateHandle_1.updateRotateHandle)(viewport, angleRad !== null && angleRad !== void 0 ? angleRad : 0, wrapper, rotator, rotatorHandle, smallImage, disableSideResize);
33316
33601
  }
33317
33602
  }
33318
33603
  };
@@ -33461,7 +33746,6 @@ exports.ImageEditPlugin = ImageEditPlugin;
33461
33746
 
33462
33747
  Object.defineProperty(exports, "__esModule", ({ value: true }));
33463
33748
  exports.createImageResizer = void 0;
33464
- var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
33465
33749
  var createElement_1 = __webpack_require__(/*! ../../pluginUtils/CreateElement/createElement */ "./packages/roosterjs-content-model-plugins/lib/pluginUtils/CreateElement/createElement.ts");
33466
33750
  var ImageEditElementClass_1 = __webpack_require__(/*! ../types/ImageEditElementClass */ "./packages/roosterjs-content-model-plugins/lib/imageEdit/types/ImageEditElementClass.ts");
33467
33751
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
@@ -33471,17 +33755,18 @@ var RESIZE_HANDLE_SIZE = 10;
33471
33755
  /**
33472
33756
  * @internal
33473
33757
  */
33474
- function createImageResizer(doc, onShowResizeHandle) {
33758
+ function createImageResizer(doc, disableSideResize, onShowResizeHandle) {
33475
33759
  var cornerElements = getCornerResizeHTML(onShowResizeHandle);
33476
33760
  var sideElements = getSideResizeHTML(onShowResizeHandle);
33477
- var handles = (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(cornerElements), false), (0, tslib_1.__read)(sideElements), false).map(function (element) {
33761
+ var handles = disableSideResize ? cornerElements : cornerElements.concat(sideElements);
33762
+ return handles
33763
+ .map(function (element) {
33478
33764
  var handle = (0, createElement_1.createElement)(element, doc);
33479
33765
  if ((0, roosterjs_content_model_dom_1.isNodeOfType)(handle, 'ELEMENT_NODE') && (0, roosterjs_content_model_dom_1.isElementOfType)(handle, 'div')) {
33480
33766
  return handle;
33481
33767
  }
33482
33768
  })
33483
33769
  .filter(function (element) { return !!element; });
33484
- return handles;
33485
33770
  }
33486
33771
  exports.createImageResizer = createImageResizer;
33487
33772
  /**
@@ -33683,13 +33968,13 @@ exports.createImageRotator = createImageRotator;
33683
33968
  *
33684
33969
  */
33685
33970
  function getRotateHTML(_a) {
33686
- var borderColor = _a.borderColor, rotateHandleBackColor = _a.rotateHandleBackColor;
33971
+ var borderColor = _a.borderColor, rotateHandleBackColor = _a.rotateHandleBackColor, disableSideResize = _a.disableSideResize;
33687
33972
  var handleLeft = constants_1.ROTATE_SIZE / 2;
33688
33973
  return [
33689
33974
  {
33690
33975
  tag: 'div',
33691
33976
  className: ImageEditElementClass_1.ImageEditElementClass.RotateCenter,
33692
- style: "position:absolute;left:50%;width:1px;background-color:" + borderColor + ";top:" + -constants_1.ROTATE_HANDLE_TOP + "px;height:" + constants_1.ROTATE_GAP + "px;margin-left:" + -constants_1.ROTATE_WIDTH + "px;",
33977
+ style: "position:absolute;left:50%;width:1px;background-color:" + borderColor + ";top:" + (disableSideResize ? -constants_1.ROTATE_HANDLE_TOP_NO_SIDE_RESIZE : -constants_1.ROTATE_HANDLE_TOP) + "px;height:" + constants_1.ROTATE_GAP + "px;margin-left:" + -constants_1.ROTATE_WIDTH + "px;",
33693
33978
  children: [
33694
33979
  {
33695
33980
  tag: 'div',
@@ -33796,7 +34081,7 @@ var constants_1 = __webpack_require__(/*! ../constants/constants */ "./packages/
33796
34081
  * Move rotate handle. When image is very close to the border of editor, rotate handle may not be visible.
33797
34082
  * Fix it by reduce the distance from image to rotate handle
33798
34083
  */
33799
- function updateRotateHandle(editorRect, angleRad, wrapper, rotateCenter, rotateHandle, isSmallImage) {
34084
+ function updateRotateHandle(editorRect, angleRad, wrapper, rotateCenter, rotateHandle, isSmallImage, disableSideResize) {
33800
34085
  if (isSmallImage) {
33801
34086
  rotateCenter.style.display = 'none';
33802
34087
  rotateHandle.style.display = 'none';
@@ -33834,7 +34119,8 @@ function updateRotateHandle(editorRect, angleRad, wrapper, rotateCenter, rotateH
33834
34119
  }
33835
34120
  var rotateGap = Math.max(Math.min(constants_1.ROTATE_GAP, adjustedDistance), 0);
33836
34121
  var rotateTop = Math.max(Math.min(constants_1.ROTATE_SIZE, adjustedDistance - rotateGap), 0);
33837
- rotateCenter.style.top = -rotateGap - constants_1.RESIZE_HANDLE_MARGIN + 'px';
34122
+ rotateCenter.style.top =
34123
+ -rotateGap - (disableSideResize ? 0 : constants_1.RESIZE_HANDLE_MARGIN) + 'px';
33838
34124
  rotateCenter.style.height = rotateGap + 'px';
33839
34125
  rotateHandle.style.top = -rotateTop + 'px';
33840
34126
  }
@@ -33854,7 +34140,7 @@ exports.updateRotateHandle = updateRotateHandle;
33854
34140
  "use strict";
33855
34141
 
33856
34142
  Object.defineProperty(exports, "__esModule", ({ value: true }));
33857
- exports.RESIZE_IMAGE = 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;
34143
+ exports.RESIZE_IMAGE = exports.MIN_HEIGHT_WIDTH = exports.YS_CROP = exports.XS_CROP = exports.CROP_HANDLE_WIDTH = exports.CROP_HANDLE_SIZE = exports.ROTATE_HANDLE_TOP_NO_SIDE_RESIZE = 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;
33858
34144
  /**
33859
34145
  * @internal
33860
34146
  */
@@ -33908,6 +34194,10 @@ exports.ROTATE_WIDTH = 1;
33908
34194
  * @internal
33909
34195
  */
33910
34196
  exports.ROTATE_HANDLE_TOP = exports.ROTATE_GAP + exports.RESIZE_HANDLE_MARGIN;
34197
+ /**
34198
+ * @internal
34199
+ */
34200
+ exports.ROTATE_HANDLE_TOP_NO_SIDE_RESIZE = exports.ROTATE_GAP;
33911
34201
  /**
33912
34202
  * @internal
33913
34203
  */
@@ -34197,7 +34487,7 @@ function createImageWrapper(editor, image, options, editInfo, htmlOptions, opera
34197
34487
  }
34198
34488
  var resizers = [];
34199
34489
  if (operation.indexOf('resize') > -1) {
34200
- resizers = (0, createImageResizer_1.createImageResizer)(doc);
34490
+ resizers = (0, createImageResizer_1.createImageResizer)(doc, !!options.disableSideResize);
34201
34491
  }
34202
34492
  var croppers = [];
34203
34493
  if (operation.indexOf('crop') > -1) {
@@ -34214,7 +34504,6 @@ var createShadowSpan = function (wrapper, imageSpan) {
34214
34504
  mode: 'open',
34215
34505
  });
34216
34506
  imageSpan.id = IMAGE_EDIT_SHADOW_ROOT;
34217
- wrapper.style.verticalAlign = 'bottom';
34218
34507
  shadowRoot.appendChild(wrapper);
34219
34508
  return imageSpan;
34220
34509
  };
@@ -34317,6 +34606,36 @@ function doubleCheckResize(editInfo, preserveRatio, actualWidth, actualHeight) {
34317
34606
  exports.doubleCheckResize = doubleCheckResize;
34318
34607
 
34319
34608
 
34609
+ /***/ }),
34610
+
34611
+ /***/ "./packages/roosterjs-content-model-plugins/lib/imageEdit/utils/filterInnerResizerHandles.ts":
34612
+ /*!***************************************************************************************************!*\
34613
+ !*** ./packages/roosterjs-content-model-plugins/lib/imageEdit/utils/filterInnerResizerHandles.ts ***!
34614
+ \***************************************************************************************************/
34615
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
34616
+
34617
+ "use strict";
34618
+
34619
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
34620
+ exports.filterInnerResizerHandles = void 0;
34621
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
34622
+ /**
34623
+ * @internal
34624
+ */
34625
+ function filterInnerResizerHandles(resizeHandles) {
34626
+ return resizeHandles
34627
+ .map(function (resizer) {
34628
+ var resizeHandle = resizer.firstElementChild;
34629
+ if ((0, roosterjs_content_model_dom_1.isNodeOfType)(resizeHandle, 'ELEMENT_NODE') &&
34630
+ (0, roosterjs_content_model_dom_1.isElementOfType)(resizeHandle, 'div')) {
34631
+ return resizeHandle;
34632
+ }
34633
+ })
34634
+ .filter(function (handle) { return !!handle; });
34635
+ }
34636
+ exports.filterInnerResizerHandles = filterInnerResizerHandles;
34637
+
34638
+
34320
34639
  /***/ }),
34321
34640
 
34322
34641
  /***/ "./packages/roosterjs-content-model-plugins/lib/imageEdit/utils/findEditingImage.ts":
@@ -34544,6 +34863,7 @@ var getHTMLImageOptions = function (editor, options, editInfo) {
34544
34863
  borderColor: options.borderColor || (editor.isDarkMode() ? DARK_MODE_BGCOLOR : LIGHT_MODE_BGCOLOR),
34545
34864
  rotateHandleBackColor: editor.isDarkMode() ? DARK_MODE_BGCOLOR : LIGHT_MODE_BGCOLOR,
34546
34865
  isSmallImage: (0, imageEditUtils_1.isASmallImage)((_a = editInfo.widthPx) !== null && _a !== void 0 ? _a : 0, (_b = editInfo.heightPx) !== null && _b !== void 0 ? _b : 0),
34866
+ disableSideResize: !!options.disableSideResize,
34547
34867
  };
34548
34868
  };
34549
34869
  exports.getHTMLImageOptions = getHTMLImageOptions;
@@ -34854,6 +35174,7 @@ exports.getSelectedImageMetadata = getSelectedImageMetadata;
34854
35174
  Object.defineProperty(exports, "__esModule", ({ value: true }));
34855
35175
  exports.updateWrapper = void 0;
34856
35176
  var doubleCheckResize_1 = __webpack_require__(/*! ./doubleCheckResize */ "./packages/roosterjs-content-model-plugins/lib/imageEdit/utils/doubleCheckResize.ts");
35177
+ var filterInnerResizerHandles_1 = __webpack_require__(/*! ./filterInnerResizerHandles */ "./packages/roosterjs-content-model-plugins/lib/imageEdit/utils/filterInnerResizerHandles.ts");
34857
35178
  var generateImageSize_1 = __webpack_require__(/*! ./generateImageSize */ "./packages/roosterjs-content-model-plugins/lib/imageEdit/utils/generateImageSize.ts");
34858
35179
  var ImageEditElementClass_1 = __webpack_require__(/*! ../types/ImageEditElementClass */ "./packages/roosterjs-content-model-plugins/lib/imageEdit/types/ImageEditElementClass.ts");
34859
35180
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
@@ -34877,9 +35198,13 @@ function updateWrapper(editInfo, options, image, clonedImage, wrapper, resizers,
34877
35198
  var cropTopPx = originalHeight * (topPercent || 0);
34878
35199
  var cropBottomPx = originalHeight * (bottomPercent || 0);
34879
35200
  // Update size and margin of the wrapper
34880
- wrapper.style.margin = marginVertical + "px " + marginHorizontal + "px";
35201
+ wrapper.style.marginTop = marginVertical + "px";
35202
+ wrapper.style.marginBottom = marginVertical + 5 + "px "; // 5px to adjust the image on top of the handles
35203
+ wrapper.style.marginLeft = marginHorizontal + "px";
35204
+ wrapper.style.marginRight = marginHorizontal + "px";
34881
35205
  wrapper.style.transform = "rotate(" + angleRad + "rad)";
34882
35206
  (0, imageEditUtils_1.setWrapperSizeDimensions)(wrapper, image, visibleWidth, visibleHeight);
35207
+ wrapper.style.verticalAlign = 'text-bottom';
34883
35208
  // Update the text-alignment to avoid the image to overflow if the parent element have align center or right
34884
35209
  // or if the direction is Right To Left
34885
35210
  if ((0, imageEditUtils_1.isRTL)(clonedImage)) {
@@ -34895,7 +35220,6 @@ function updateWrapper(editInfo, options, image, clonedImage, wrapper, resizers,
34895
35220
  // Update size of the image
34896
35221
  clonedImage.style.width = (0, imageEditUtils_1.getPx)(originalWidth);
34897
35222
  clonedImage.style.height = (0, imageEditUtils_1.getPx)(originalHeight);
34898
- clonedImage.style.verticalAlign = 'bottom';
34899
35223
  clonedImage.style.position = 'absolute';
34900
35224
  //Update flip direction
34901
35225
  (0, imageEditUtils_1.setFlipped)(clonedImage.parentElement, flippedHorizontal, flippedVertical);
@@ -34921,15 +35245,7 @@ function updateWrapper(editInfo, options, image, clonedImage, wrapper, resizers,
34921
35245
  var clientWidth = wrapper.clientWidth;
34922
35246
  var clientHeight = wrapper.clientHeight;
34923
35247
  (0, doubleCheckResize_1.doubleCheckResize)(editInfo, options.preserveRatio || false, clientWidth, clientHeight);
34924
- var resizeHandles = resizers
34925
- .map(function (resizer) {
34926
- var resizeHandle = resizer.firstElementChild;
34927
- if ((0, roosterjs_content_model_dom_1.isNodeOfType)(resizeHandle, 'ELEMENT_NODE') &&
34928
- (0, roosterjs_content_model_dom_1.isElementOfType)(resizeHandle, 'div')) {
34929
- return resizeHandle;
34930
- }
34931
- })
34932
- .filter(function (handle) { return !!handle; });
35248
+ var resizeHandles = (0, filterInnerResizerHandles_1.filterInnerResizerHandles)(resizers);
34933
35249
  if (angleRad !== undefined) {
34934
35250
  (0, updateHandleCursor_1.updateHandleCursor)(resizeHandles, angleRad);
34935
35251
  }