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