roosterjs 8.31.0 → 8.32.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
@@ -3062,6 +3062,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3062
3062
  var blockFormat_1 = __webpack_require__(/*! ../utils/blockFormat */ "./packages/roosterjs-editor-api/lib/utils/blockFormat.ts");
3063
3063
  var execCommand_1 = __webpack_require__(/*! ../utils/execCommand */ "./packages/roosterjs-editor-api/lib/utils/execCommand.ts");
3064
3064
  var formatUndoSnapshot_1 = __webpack_require__(/*! ../utils/formatUndoSnapshot */ "./packages/roosterjs-editor-api/lib/utils/formatUndoSnapshot.ts");
3065
+ var normalizeBlockquote_1 = __webpack_require__(/*! ../utils/normalizeBlockquote */ "./packages/roosterjs-editor-api/lib/utils/normalizeBlockquote.ts");
3065
3066
  var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
3066
3067
  /**
3067
3068
  * Set content alignment
@@ -3130,7 +3131,14 @@ function alignText(editor, alignment) {
3130
3131
  align = 'right';
3131
3132
  }
3132
3133
  (0, execCommand_1.default)(editor, command);
3133
- editor.queryElements('[align]', 1 /* OnSelection */, function (node) { return (node.style.textAlign = align); });
3134
+ var elements = editor.queryElements('[align]', 1 /* OnSelection */, function (node) {
3135
+ node.style.textAlign = align;
3136
+ (0, normalizeBlockquote_1.default)(node);
3137
+ });
3138
+ if (elements.length == 0) {
3139
+ var node = editor.getElementAtCursor();
3140
+ (0, normalizeBlockquote_1.default)(node);
3141
+ }
3134
3142
  }
3135
3143
  function isList(element) {
3136
3144
  return (0, roosterjs_editor_dom_1.findClosestElementAncestor)(element, undefined /** root */, 'LI');
@@ -3319,6 +3327,7 @@ exports.default = setImageAltText;
3319
3327
 
3320
3328
  Object.defineProperty(exports, "__esModule", { value: true });
3321
3329
  var blockFormat_1 = __webpack_require__(/*! ../utils/blockFormat */ "./packages/roosterjs-editor-api/lib/utils/blockFormat.ts");
3330
+ var normalizeBlockquote_1 = __webpack_require__(/*! ../utils/normalizeBlockquote */ "./packages/roosterjs-editor-api/lib/utils/normalizeBlockquote.ts");
3322
3331
  var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
3323
3332
  /**
3324
3333
  * Set indentation at selection
@@ -3351,7 +3360,7 @@ function setIndentation(editor, indentation) {
3351
3360
  indentation == 1 /* Decrease */
3352
3361
  ? vList.setIndentation(start, end, indentation, false /* softOutdent */, isTabKeyTextFeaturesEnabled /* preventItemRemoval */)
3353
3362
  : vList.setIndentation(start, end, indentation);
3354
- vList.writeBack();
3363
+ vList.writeBack(editor.isFeatureEnabled("ReuseAllAncestorListElements" /* ReuseAllAncestorListElements */));
3355
3364
  blockGroups.push([]);
3356
3365
  }
3357
3366
  }
@@ -3375,12 +3384,14 @@ function setIndentation(editor, indentation) {
3375
3384
  }
3376
3385
  return true;
3377
3386
  }, 'setIndentation');
3387
+ function indent(region, blocks) {
3388
+ var nodes = (0, roosterjs_editor_dom_1.collapseNodesInRegion)(region, blocks);
3389
+ (0, roosterjs_editor_dom_1.wrap)(nodes, 2 /* BlockquoteWrapper */);
3390
+ var quotesHandled = [];
3391
+ nodes.forEach(function (node) { return (0, normalizeBlockquote_1.default)(node, quotesHandled); });
3392
+ }
3378
3393
  }
3379
3394
  exports.default = setIndentation;
3380
- function indent(region, blocks) {
3381
- var nodes = (0, roosterjs_editor_dom_1.collapseNodesInRegion)(region, blocks);
3382
- (0, roosterjs_editor_dom_1.wrap)(nodes, 2 /* BlockquoteWrapper */);
3383
- }
3384
3395
  function outdent(region, blocks) {
3385
3396
  blocks.forEach(function (blockElement) {
3386
3397
  var node = blockElement.collapseToSingleElement();
@@ -3437,7 +3448,7 @@ function setOrderedListNumbering(editor, separator, startNumber) {
3437
3448
  var vList = (0, roosterjs_editor_dom_1.createVListFromRegion)(regions[0], false /*includeSiblingLists*/, separator);
3438
3449
  if (vList) {
3439
3450
  vList.split(separator, startNumber);
3440
- vList.writeBack();
3451
+ vList.writeBack(editor.isFeatureEnabled("ReuseAllAncestorListElements" /* ReuseAllAncestorListElements */));
3441
3452
  }
3442
3453
  }
3443
3454
  }, 'setOrderedListNumbering');
@@ -3945,8 +3956,6 @@ Object.defineProperty(exports, "experimentCommitListChains", { enumerable: true,
3945
3956
  Object.defineProperty(exports, "__esModule", { value: true });
3946
3957
  var formatUndoSnapshot_1 = __webpack_require__(/*! ../utils/formatUndoSnapshot */ "./packages/roosterjs-editor-api/lib/utils/formatUndoSnapshot.ts");
3947
3958
  var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
3948
- var TEMP_BACKGROUND_COLOR = 'originalBackgroundColor';
3949
- var CELL_SHADE = 'cellShade';
3950
3959
  /**
3951
3960
  * Set background color of cells.
3952
3961
  * @param editor The editor instance
@@ -3959,9 +3968,7 @@ function applyCellShading(editor, color) {
3959
3968
  regions.forEach(function (region) {
3960
3969
  if ((0, roosterjs_editor_dom_1.safeInstanceOf)(region.rootNode, 'HTMLTableCellElement')) {
3961
3970
  (0, roosterjs_editor_dom_1.setColor)(region.rootNode, color, true /* isBackgroundColor */, editor.isDarkMode(), true /** shouldAdaptFontColor */);
3962
- region.rootNode.dataset[CELL_SHADE] = 'true';
3963
- region.rootNode.dataset[TEMP_BACKGROUND_COLOR] =
3964
- region.rootNode.style.backgroundColor;
3971
+ (0, roosterjs_editor_dom_1.saveTableCellMetadata)(region.rootNode, { bgColorOverride: true });
3965
3972
  }
3966
3973
  });
3967
3974
  }, 'applyCellShading');
@@ -4434,7 +4441,8 @@ function commitListChains(editor, chains) {
4434
4441
  var range = editor.getSelectionRange();
4435
4442
  var start = range && roosterjs_editor_dom_1.Position.getStart(range);
4436
4443
  var end = range && roosterjs_editor_dom_1.Position.getEnd(range);
4437
- chains.forEach(function (chain) { return chain.commit(); });
4444
+ var shouldReuseAllAncestorListElements_1 = editor.isFeatureEnabled("ReuseAllAncestorListElements" /* ReuseAllAncestorListElements */);
4445
+ chains.forEach(function (chain) { return chain.commit(shouldReuseAllAncestorListElements_1); });
4438
4446
  editor.select(start, end);
4439
4447
  }
4440
4448
  }
@@ -4533,6 +4541,61 @@ function formatUndoSnapshot(editor, callback, apiName) {
4533
4541
  exports.default = formatUndoSnapshot;
4534
4542
 
4535
4543
 
4544
+ /***/ }),
4545
+
4546
+ /***/ "./packages/roosterjs-editor-api/lib/utils/normalizeBlockquote.ts":
4547
+ /*!************************************************************************!*\
4548
+ !*** ./packages/roosterjs-editor-api/lib/utils/normalizeBlockquote.ts ***!
4549
+ \************************************************************************/
4550
+ /*! no static exports found */
4551
+ /***/ (function(module, exports, __webpack_require__) {
4552
+
4553
+ "use strict";
4554
+
4555
+ Object.defineProperty(exports, "__esModule", { value: true });
4556
+ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
4557
+ /**
4558
+ * @internal
4559
+ * @param node start node to normalize
4560
+ * @param quotesHandled Optional parameter to prevent already modified quotes to be rechecked.
4561
+ * @returns
4562
+ */
4563
+ function normalizeBlockquote(node, quotesHandled) {
4564
+ if ((0, roosterjs_editor_dom_1.safeInstanceOf)(node, 'HTMLElement')) {
4565
+ var alignment = node.style.textAlign;
4566
+ var quote = (0, roosterjs_editor_dom_1.findClosestElementAncestor)(node, undefined /* root */, 'blockquote');
4567
+ var isNodeRTL = isRTL(node);
4568
+ if (quotesHandled) {
4569
+ if (quotesHandled.indexOf(quote) > -1) {
4570
+ return;
4571
+ }
4572
+ quotesHandled.push(quote);
4573
+ }
4574
+ while (quote) {
4575
+ if (alignment == 'center') {
4576
+ if (isNodeRTL) {
4577
+ delete quote.style.marginInlineEnd;
4578
+ quote.style.marginInlineStart = 'auto';
4579
+ }
4580
+ else {
4581
+ delete quote.style.marginInlineStart;
4582
+ quote.style.marginInlineEnd = 'auto';
4583
+ }
4584
+ }
4585
+ else {
4586
+ delete quote.style.marginInlineStart;
4587
+ delete quote.style.marginInlineEnd;
4588
+ }
4589
+ quote = (0, roosterjs_editor_dom_1.findClosestElementAncestor)(quote.parentElement, undefined /* root */, 'blockquote');
4590
+ }
4591
+ }
4592
+ }
4593
+ exports.default = normalizeBlockquote;
4594
+ function isRTL(el) {
4595
+ return (0, roosterjs_editor_dom_1.getComputedStyle)(el, 'direction') == 'rtl' || el.getAttribute('dir') == 'rtl';
4596
+ }
4597
+
4598
+
4536
4599
  /***/ }),
4537
4600
 
4538
4601
  /***/ "./packages/roosterjs-editor-api/lib/utils/toggleListType.ts":
@@ -4580,7 +4643,7 @@ function toggleListType(editor, listType, startNumber, includeSiblingLists, orde
4580
4643
  if (editor.isFeatureEnabled("AutoFormatList" /* AutoFormatList */)) {
4581
4644
  vList.setListStyleType(orderedStyle, unorderedStyle);
4582
4645
  }
4583
- vList.writeBack();
4646
+ vList.writeBack(editor.isFeatureEnabled("ReuseAllAncestorListElements" /* ReuseAllAncestorListElements */));
4584
4647
  }
4585
4648
  }, undefined /* beforeRunCallback */, apiNameOverride || 'toggleListType');
4586
4649
  }
@@ -4766,6 +4829,7 @@ var getStyleBasedFormatState_1 = __webpack_require__(/*! ./getStyleBasedFormatSt
4766
4829
  var hasFocus_1 = __webpack_require__(/*! ./hasFocus */ "./packages/roosterjs-editor-core/lib/coreApi/hasFocus.ts");
4767
4830
  var insertNode_1 = __webpack_require__(/*! ./insertNode */ "./packages/roosterjs-editor-core/lib/coreApi/insertNode.ts");
4768
4831
  var restoreUndoSnapshot_1 = __webpack_require__(/*! ./restoreUndoSnapshot */ "./packages/roosterjs-editor-core/lib/coreApi/restoreUndoSnapshot.ts");
4832
+ var selectImage_1 = __webpack_require__(/*! ./selectImage */ "./packages/roosterjs-editor-core/lib/coreApi/selectImage.ts");
4769
4833
  var selectRange_1 = __webpack_require__(/*! ./selectRange */ "./packages/roosterjs-editor-core/lib/coreApi/selectRange.ts");
4770
4834
  var selectTable_1 = __webpack_require__(/*! ./selectTable */ "./packages/roosterjs-editor-core/lib/coreApi/selectTable.ts");
4771
4835
  var setContent_1 = __webpack_require__(/*! ./setContent */ "./packages/roosterjs-editor-core/lib/coreApi/setContent.ts");
@@ -4795,6 +4859,7 @@ exports.coreApiMap = {
4795
4859
  transformColor: transformColor_1.transformColor,
4796
4860
  triggerEvent: triggerEvent_1.triggerEvent,
4797
4861
  selectTable: selectTable_1.selectTable,
4862
+ selectImage: selectImage_1.selectImage,
4798
4863
  };
4799
4864
 
4800
4865
 
@@ -4976,11 +5041,14 @@ function getCurrentFormat(core, node) {
4976
5041
  };
4977
5042
  }
4978
5043
  function createBeforePasteEvent(core, clipboardData) {
5044
+ var options = (0, roosterjs_editor_dom_1.createDefaultHtmlSanitizerOptions)();
5045
+ // Remove "caret-color" style generated by Safari to make sure caret shows in right color after paste
5046
+ options.cssStyleCallbacks['caret-color'] = function () { return false; };
4979
5047
  return {
4980
5048
  eventType: 10 /* BeforePaste */,
4981
5049
  clipboardData: clipboardData,
4982
5050
  fragment: core.contentDiv.ownerDocument.createDocumentFragment(),
4983
- sanitizingOption: (0, roosterjs_editor_dom_1.createDefaultHtmlSanitizerOptions)(),
5051
+ sanitizingOption: options,
4984
5052
  htmlBefore: '',
4985
5053
  htmlAfter: '',
4986
5054
  htmlAttributes: {},
@@ -5364,10 +5432,10 @@ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./
5364
5432
  * @returns A Range object of the selection range
5365
5433
  */
5366
5434
  var getSelectionRangeEx = function (core) {
5367
- var _a, _b;
5435
+ var _a, _b, _c;
5368
5436
  var result = null;
5369
5437
  if (core.lifecycle.shadowEditFragment) {
5370
- var _c = core.lifecycle, shadowEditTableSelectionPath = _c.shadowEditTableSelectionPath, shadowEditSelectionPath = _c.shadowEditSelectionPath;
5438
+ var _d = core.lifecycle, shadowEditTableSelectionPath = _d.shadowEditTableSelectionPath, shadowEditSelectionPath = _d.shadowEditSelectionPath, shadowEditImageSelectionPath = _d.shadowEditImageSelectionPath;
5371
5439
  if (((shadowEditTableSelectionPath === null || shadowEditTableSelectionPath === void 0 ? void 0 : shadowEditTableSelectionPath.length) || 0) > 0) {
5372
5440
  var ranges = core.lifecycle.shadowEditTableSelectionPath.map(function (path) {
5373
5441
  return (0, roosterjs_editor_dom_1.createRange)(core.contentDiv, path.start, path.end);
@@ -5380,6 +5448,18 @@ var getSelectionRangeEx = function (core) {
5380
5448
  coordinates: undefined,
5381
5449
  };
5382
5450
  }
5451
+ else if (((shadowEditImageSelectionPath === null || shadowEditImageSelectionPath === void 0 ? void 0 : shadowEditImageSelectionPath.length) || 0) > 0) {
5452
+ var ranges = core.lifecycle.shadowEditImageSelectionPath.map(function (path) {
5453
+ return (0, roosterjs_editor_dom_1.createRange)(core.contentDiv, path.start, path.end);
5454
+ });
5455
+ return {
5456
+ type: 2 /* ImageSelection */,
5457
+ ranges: ranges,
5458
+ areAllCollapsed: checkAllCollapsed(ranges),
5459
+ image: (0, roosterjs_editor_dom_1.findClosestElementAncestor)(ranges[0].startContainer, core.contentDiv, 'img'),
5460
+ imageId: undefined,
5461
+ };
5462
+ }
5383
5463
  else {
5384
5464
  var shadowRange = shadowEditSelectionPath &&
5385
5465
  (0, roosterjs_editor_dom_1.createRange)(core.contentDiv, shadowEditSelectionPath.start, shadowEditSelectionPath.end);
@@ -5391,6 +5471,9 @@ var getSelectionRangeEx = function (core) {
5391
5471
  if (core.domEvent.tableSelectionRange) {
5392
5472
  return core.domEvent.tableSelectionRange;
5393
5473
  }
5474
+ if (core.domEvent.imageSelectionRange) {
5475
+ return core.domEvent.imageSelectionRange;
5476
+ }
5394
5477
  var selection = (_a = core.contentDiv.ownerDocument.defaultView) === null || _a === void 0 ? void 0 : _a.getSelection();
5395
5478
  if (!result && selection && selection.rangeCount > 0) {
5396
5479
  var range = selection.getRangeAt(0);
@@ -5399,7 +5482,7 @@ var getSelectionRangeEx = function (core) {
5399
5482
  }
5400
5483
  }
5401
5484
  }
5402
- return ((_b = core.domEvent.tableSelectionRange) !== null && _b !== void 0 ? _b : createNormalSelectionEx(core.domEvent.selectionRange ? [core.domEvent.selectionRange] : []));
5485
+ return ((_c = (_b = core.domEvent.tableSelectionRange) !== null && _b !== void 0 ? _b : core.domEvent.imageSelectionRange) !== null && _c !== void 0 ? _c : createNormalSelectionEx(core.domEvent.selectionRange ? [core.domEvent.selectionRange] : []));
5403
5486
  }
5404
5487
  };
5405
5488
  exports.getSelectionRangeEx = getSelectionRangeEx;
@@ -5709,6 +5792,71 @@ var restoreUndoSnapshot = function (core, step) {
5709
5792
  exports.restoreUndoSnapshot = restoreUndoSnapshot;
5710
5793
 
5711
5794
 
5795
+ /***/ }),
5796
+
5797
+ /***/ "./packages/roosterjs-editor-core/lib/coreApi/selectImage.ts":
5798
+ /*!*******************************************************************!*\
5799
+ !*** ./packages/roosterjs-editor-core/lib/coreApi/selectImage.ts ***!
5800
+ \*******************************************************************/
5801
+ /*! no static exports found */
5802
+ /***/ (function(module, exports, __webpack_require__) {
5803
+
5804
+ "use strict";
5805
+
5806
+ Object.defineProperty(exports, "__esModule", { value: true });
5807
+ exports.selectImage = void 0;
5808
+ var addSelectionStyle_1 = __webpack_require__(/*! ./utils/addSelectionStyle */ "./packages/roosterjs-editor-core/lib/coreApi/utils/addSelectionStyle.ts");
5809
+ var addUniqueId_1 = __webpack_require__(/*! ./utils/addUniqueId */ "./packages/roosterjs-editor-core/lib/coreApi/utils/addUniqueId.ts");
5810
+ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
5811
+ var IMAGE_ID = 'imageSelected';
5812
+ var CONTENT_DIV_ID = 'contentDiv_';
5813
+ var STYLE_ID = 'imageStyle';
5814
+ /**
5815
+ * @internal
5816
+ * Select a image and save data of the selected range
5817
+ * @param image Image to select
5818
+ * @returns Selected image information
5819
+ */
5820
+ var selectImage = function (core, image) {
5821
+ unselect(core);
5822
+ if (image) {
5823
+ var range = (0, roosterjs_editor_dom_1.createRange)(image);
5824
+ (0, addUniqueId_1.default)(image, IMAGE_ID);
5825
+ (0, addUniqueId_1.default)(core.contentDiv, CONTENT_DIV_ID);
5826
+ select(core, image);
5827
+ return {
5828
+ type: 2 /* ImageSelection */,
5829
+ ranges: [range],
5830
+ image: image,
5831
+ areAllCollapsed: range.collapsed,
5832
+ };
5833
+ }
5834
+ return null;
5835
+ };
5836
+ exports.selectImage = selectImage;
5837
+ var select = function (core, image) {
5838
+ var borderCSS = buildBorderCSS(core, image.id);
5839
+ (0, addSelectionStyle_1.default)(core, borderCSS, STYLE_ID);
5840
+ };
5841
+ var buildBorderCSS = function (core, imageId) {
5842
+ var borderColor = core.imageSelectionBorderColor || '#DB626C';
5843
+ return ('#' +
5844
+ core.contentDiv.id +
5845
+ ' #' +
5846
+ imageId +
5847
+ ' { margin: -2px; border: 2px solid' +
5848
+ borderColor +
5849
+ ' !important; }');
5850
+ };
5851
+ var unselect = function (core) {
5852
+ var doc = core.contentDiv.ownerDocument;
5853
+ var styleTag = doc.getElementById(STYLE_ID + core.contentDiv.id);
5854
+ if (styleTag) {
5855
+ doc.head.removeChild(styleTag);
5856
+ }
5857
+ };
5858
+
5859
+
5712
5860
  /***/ }),
5713
5861
 
5714
5862
  /***/ "./packages/roosterjs-editor-core/lib/coreApi/selectRange.ts":
@@ -5786,6 +5934,8 @@ function restorePendingFormatState(core) {
5786
5934
 
5787
5935
  Object.defineProperty(exports, "__esModule", { value: true });
5788
5936
  exports.selectTable = void 0;
5937
+ var addSelectionStyle_1 = __webpack_require__(/*! ./utils/addSelectionStyle */ "./packages/roosterjs-editor-core/lib/coreApi/utils/addSelectionStyle.ts");
5938
+ var addUniqueId_1 = __webpack_require__(/*! ./utils/addUniqueId */ "./packages/roosterjs-editor-core/lib/coreApi/utils/addUniqueId.ts");
5789
5939
  var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
5790
5940
  var TABLE_ID = 'tableSelected';
5791
5941
  var CONTENT_DIV_ID = 'contentDiv_';
@@ -5803,8 +5953,8 @@ var selectTable = function (core, table, coordinates) {
5803
5953
  var _a;
5804
5954
  unselect(core);
5805
5955
  if (areValidCoordinates(coordinates) && table) {
5806
- ensureUniqueId(table, TABLE_ID);
5807
- ensureUniqueId(core.contentDiv, CONTENT_DIV_ID);
5956
+ (0, addUniqueId_1.default)(table, TABLE_ID);
5957
+ (0, addUniqueId_1.default)(core.contentDiv, CONTENT_DIV_ID);
5808
5958
  var ranges = select(core, table, coordinates);
5809
5959
  if (!isMergedCell(table, coordinates)) {
5810
5960
  var cellToSelect = (_a = table.rows
@@ -5890,17 +6040,9 @@ function buildCss(table, coordinates, contentDivSelector) {
5890
6040
  return { css: css, ranges: ranges };
5891
6041
  }
5892
6042
  function select(core, table, coordinates) {
5893
- var _a;
5894
- var doc = core.contentDiv.ownerDocument;
5895
6043
  var contentDivSelector = '#' + core.contentDiv.id;
5896
- var _b = buildCss(table, coordinates, contentDivSelector), css = _b.css, ranges = _b.ranges;
5897
- var styleElement = doc.getElementById(STYLE_ID + core.contentDiv.id);
5898
- if (!styleElement) {
5899
- styleElement = doc.createElement('style');
5900
- doc.head.appendChild(styleElement);
5901
- styleElement.id = STYLE_ID + core.contentDiv.id;
5902
- }
5903
- (_a = styleElement.sheet) === null || _a === void 0 ? void 0 : _a.insertRule(css);
6044
+ var _a = buildCss(table, coordinates, contentDivSelector), css = _a.css, ranges = _a.ranges;
6045
+ (0, addSelectionStyle_1.default)(core, css, STYLE_ID);
5904
6046
  return ranges;
5905
6047
  }
5906
6048
  function unselect(core) {
@@ -5913,27 +6055,6 @@ function unselect(core) {
5913
6055
  }
5914
6056
  }
5915
6057
  }
5916
- function ensureUniqueId(el, idPrefix) {
5917
- var doc = el.ownerDocument;
5918
- if (!el.id) {
5919
- var cont_1 = 0;
5920
- var getElement = function () { return doc.getElementById(idPrefix + cont_1); };
5921
- //Ensure that there are no elements with the same ID
5922
- var element = getElement();
5923
- while (element) {
5924
- cont_1++;
5925
- element = getElement();
5926
- }
5927
- el.id = idPrefix + cont_1;
5928
- }
5929
- else {
5930
- var elements = doc.querySelectorAll("#" + el.id);
5931
- if (elements.length > 1) {
5932
- el.removeAttribute('id');
5933
- ensureUniqueId(el, idPrefix);
5934
- }
5935
- }
5936
- }
5937
6058
  function generateCssFromCell(contentDivSelector, tableId, middleElSelector, rowIndex, cellTag, index) {
5938
6059
  return (contentDivSelector +
5939
6060
  ' #' +
@@ -6069,20 +6190,23 @@ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./
6069
6190
  */
6070
6191
  var switchShadowEdit = function (core, isOn) {
6071
6192
  var lifecycle = core.lifecycle, contentDiv = core.contentDiv;
6072
- var shadowEditFragment = lifecycle.shadowEditFragment, shadowEditSelectionPath = lifecycle.shadowEditSelectionPath, shadowEditTableSelectionPath = lifecycle.shadowEditTableSelectionPath;
6193
+ var shadowEditFragment = lifecycle.shadowEditFragment, shadowEditSelectionPath = lifecycle.shadowEditSelectionPath, shadowEditTableSelectionPath = lifecycle.shadowEditTableSelectionPath, shadowEditImageSelectionPath = lifecycle.shadowEditImageSelectionPath;
6073
6194
  var wasInShadowEdit = !!shadowEditFragment;
6195
+ var getShadowEditSelectionPath = function (selectionType, shadowEditSelection) {
6196
+ return (((shadowEditSelection === null || shadowEditSelection === void 0 ? void 0 : shadowEditSelection.type) == selectionType &&
6197
+ shadowEditSelection.ranges
6198
+ .map(function (range) { return (0, roosterjs_editor_dom_1.getSelectionPath)(contentDiv, range); })
6199
+ .map(function (w) { return w; })) ||
6200
+ null);
6201
+ };
6074
6202
  if (isOn) {
6075
6203
  if (!wasInShadowEdit) {
6076
6204
  var selection = core.api.getSelectionRangeEx(core);
6077
6205
  var range = core.api.getSelectionRange(core, true /*tryGetFromCache*/);
6078
6206
  shadowEditSelectionPath = range && (0, roosterjs_editor_dom_1.getSelectionPath)(contentDiv, range);
6079
- shadowEditTableSelectionPath =
6080
- ((selection === null || selection === void 0 ? void 0 : selection.type) == 1 /* TableSelection */ &&
6081
- selection.ranges
6082
- .map(function (range) { return (0, roosterjs_editor_dom_1.getSelectionPath)(contentDiv, range); })
6083
- .map(function (w) { return w; })) ||
6084
- null;
6207
+ shadowEditTableSelectionPath = getShadowEditSelectionPath(1 /* TableSelection */, selection);
6085
6208
  shadowEditFragment = core.contentDiv.ownerDocument.createDocumentFragment();
6209
+ shadowEditImageSelectionPath = getShadowEditSelectionPath(2 /* ImageSelection */, selection);
6086
6210
  (0, roosterjs_editor_dom_1.moveChildNodes)(shadowEditFragment, contentDiv);
6087
6211
  shadowEditFragment.normalize();
6088
6212
  core.api.triggerEvent(core, {
@@ -6093,6 +6217,7 @@ var switchShadowEdit = function (core, isOn) {
6093
6217
  lifecycle.shadowEditFragment = shadowEditFragment;
6094
6218
  lifecycle.shadowEditSelectionPath = shadowEditSelectionPath;
6095
6219
  lifecycle.shadowEditTableSelectionPath = shadowEditTableSelectionPath;
6220
+ lifecycle.shadowEditImageSelectionPath = shadowEditImageSelectionPath;
6096
6221
  }
6097
6222
  (0, roosterjs_editor_dom_1.moveChildNodes)(contentDiv);
6098
6223
  if (lifecycle.shadowEditFragment) {
@@ -6114,6 +6239,13 @@ var switchShadowEdit = function (core, isOn) {
6114
6239
  if (shadowEditSelectionPath) {
6115
6240
  core.api.selectRange(core, (0, roosterjs_editor_dom_1.createRange)(contentDiv, shadowEditSelectionPath.start, shadowEditSelectionPath.end));
6116
6241
  }
6242
+ if (core.domEvent.imageSelectionRange) {
6243
+ var image = core.domEvent.imageSelectionRange.image;
6244
+ var imageElement = core.contentDiv.querySelector('#' + image.id);
6245
+ if (imageElement) {
6246
+ core.domEvent.imageSelectionRange = core.api.selectImage(core, image);
6247
+ }
6248
+ }
6117
6249
  if (core.domEvent.tableSelectionRange) {
6118
6250
  var _a = core.domEvent.tableSelectionRange, table = _a.table, coordinates = _a.coordinates;
6119
6251
  var tableId = table.id;
@@ -6314,6 +6446,83 @@ function handledExclusively(event, plugin) {
6314
6446
  }
6315
6447
 
6316
6448
 
6449
+ /***/ }),
6450
+
6451
+ /***/ "./packages/roosterjs-editor-core/lib/coreApi/utils/addSelectionStyle.ts":
6452
+ /*!*******************************************************************************!*\
6453
+ !*** ./packages/roosterjs-editor-core/lib/coreApi/utils/addSelectionStyle.ts ***!
6454
+ \*******************************************************************************/
6455
+ /*! no static exports found */
6456
+ /***/ (function(module, exports, __webpack_require__) {
6457
+
6458
+ "use strict";
6459
+
6460
+ Object.defineProperty(exports, "__esModule", { value: true });
6461
+ /**
6462
+ * Add style to selected elements
6463
+ * @param core The Editor core object
6464
+ * @param cssRule The css rule that must added to the selection
6465
+ * @param styleId the ID of the style tag
6466
+ */
6467
+ function addSelectionStyle(core, cssRule, styleId) {
6468
+ var _a;
6469
+ var styleTagId = styleId + core.contentDiv.id;
6470
+ var doc = core.contentDiv.ownerDocument;
6471
+ var styleTag = doc.getElementById(styleTagId);
6472
+ if (!styleTag) {
6473
+ styleTag = doc.createElement('style');
6474
+ styleTag.id = styleTagId;
6475
+ doc.head.appendChild(styleTag);
6476
+ }
6477
+ (_a = styleTag.sheet) === null || _a === void 0 ? void 0 : _a.insertRule(cssRule);
6478
+ }
6479
+ exports.default = addSelectionStyle;
6480
+
6481
+
6482
+ /***/ }),
6483
+
6484
+ /***/ "./packages/roosterjs-editor-core/lib/coreApi/utils/addUniqueId.ts":
6485
+ /*!*************************************************************************!*\
6486
+ !*** ./packages/roosterjs-editor-core/lib/coreApi/utils/addUniqueId.ts ***!
6487
+ \*************************************************************************/
6488
+ /*! no static exports found */
6489
+ /***/ (function(module, exports, __webpack_require__) {
6490
+
6491
+ "use strict";
6492
+
6493
+ Object.defineProperty(exports, "__esModule", { value: true });
6494
+ /**
6495
+ * Add an unique id to element and ensure that is unique
6496
+ * @param el The HTMLElement that will receive the id
6497
+ * @param idPrefix The prefix that will antecede the id (Ex: tableSelected01)
6498
+ */
6499
+ function addUniqueId(el, idPrefix) {
6500
+ var doc = el.ownerDocument;
6501
+ if (!el.id) {
6502
+ applyId(el, idPrefix, doc);
6503
+ }
6504
+ else {
6505
+ var elements = doc.querySelectorAll("#" + el.id);
6506
+ if (elements.length > 1) {
6507
+ el.removeAttribute('id');
6508
+ applyId(el, idPrefix, doc);
6509
+ }
6510
+ }
6511
+ }
6512
+ exports.default = addUniqueId;
6513
+ function applyId(el, idPrefix, doc) {
6514
+ var cont = 0;
6515
+ var getElement = function () { return doc.getElementById(idPrefix + cont); };
6516
+ //Ensure that there are no elements with the same ID
6517
+ var element = getElement();
6518
+ while (element) {
6519
+ cont++;
6520
+ element = getElement();
6521
+ }
6522
+ el.id = idPrefix + cont;
6523
+ }
6524
+
6525
+
6317
6526
  /***/ }),
6318
6527
 
6319
6528
  /***/ "./packages/roosterjs-editor-core/lib/corePlugins/CopyPastePlugin.ts":
@@ -6567,9 +6776,13 @@ var DOMEventPlugin = /** @class */ (function () {
6567
6776
  };
6568
6777
  this.onFocus = function () {
6569
6778
  var _a = _this.state.tableSelectionRange || {}, table = _a.table, coordinates = _a.coordinates;
6779
+ var image = (_this.state.imageSelectionRange || {}).image;
6570
6780
  if (table && coordinates) {
6571
6781
  _this.editor.select(table, coordinates);
6572
6782
  }
6783
+ else if (image) {
6784
+ _this.editor.select(image);
6785
+ }
6573
6786
  else {
6574
6787
  _this.editor.select(_this.state.selectionRange);
6575
6788
  }
@@ -6633,6 +6846,7 @@ var DOMEventPlugin = /** @class */ (function () {
6633
6846
  stopPrintableKeyboardEventPropagation: !options.allowKeyboardEventPropagation,
6634
6847
  contextMenuProviders: ((_a = options.plugins) === null || _a === void 0 ? void 0 : _a.filter(isContextMenuProvider)) || [],
6635
6848
  tableSelectionRange: null,
6849
+ imageSelectionRange: null,
6636
6850
  };
6637
6851
  }
6638
6852
  /**
@@ -7269,6 +7483,7 @@ var LifecyclePlugin = /** @class */ (function () {
7269
7483
  shadowEditFragment: null,
7270
7484
  shadowEditSelectionPath: null,
7271
7485
  shadowEditTableSelectionPath: null,
7486
+ shadowEditImageSelectionPath: null,
7272
7487
  };
7273
7488
  }
7274
7489
  /**
@@ -7526,7 +7741,6 @@ var NormalizeTablePlugin = /** @class */ (function () {
7526
7741
  case 11 /* EditorReady */:
7527
7742
  case 7 /* ContentChanged */:
7528
7743
  this.normalizeTables(this.editor.queryElements('table'));
7529
- this.normalizeBlockquotes(this.editor.queryElements('blockquote'));
7530
7744
  break;
7531
7745
  case 10 /* BeforePaste */:
7532
7746
  this.normalizeTables((0, roosterjs_editor_dom_1.toArray)(event.fragment.querySelectorAll('table')));
@@ -7567,31 +7781,9 @@ var NormalizeTablePlugin = /** @class */ (function () {
7567
7781
  }
7568
7782
  }
7569
7783
  };
7570
- NormalizeTablePlugin.prototype.normalizeBlockquotes = function (elements) {
7571
- elements.forEach(function (quote) {
7572
- var centeredElement = quote.querySelector('[style^="text-align: center"]');
7573
- if (centeredElement) {
7574
- if (isRTL(centeredElement)) {
7575
- delete quote.style.marginInlineEnd;
7576
- quote.style.marginInlineStart = 'auto';
7577
- }
7578
- else {
7579
- delete quote.style.marginInlineStart;
7580
- quote.style.marginInlineEnd = 'auto';
7581
- }
7582
- }
7583
- else {
7584
- delete quote.style.marginInlineStart;
7585
- delete quote.style.marginInlineEnd;
7586
- }
7587
- });
7588
- };
7589
7784
  return NormalizeTablePlugin;
7590
7785
  }());
7591
7786
  exports.default = NormalizeTablePlugin;
7592
- function isRTL(el) {
7593
- return (0, roosterjs_editor_dom_1.getComputedStyle)(el, 'direction') == 'rtl' || el.getAttribute('dir') == 'rtl';
7594
- }
7595
7787
  function normalizeTables(tables) {
7596
7788
  var isDOMChanged = false;
7597
7789
  tables.forEach(function (table) {
@@ -8288,7 +8480,13 @@ var Editor = /** @class */ (function () {
8288
8480
  }
8289
8481
  });
8290
8482
  var zoomScale = ((_a = options.zoomScale) !== null && _a !== void 0 ? _a : -1) > 0 ? options.zoomScale : 1;
8291
- this.core = __assign(__assign({ contentDiv: contentDiv, api: __assign(__assign({}, coreApiMap_1.coreApiMap), (options.coreApiOverride || {})), originalApi: coreApiMap_1.coreApiMap, plugins: plugins.filter(function (x) { return !!x; }) }, (0, createCorePlugins_1.getPluginState)(corePlugins)), { trustedHTMLHandler: options.trustedHTMLHandler || (function (html) { return html; }), zoomScale: zoomScale, sizeTransformer: options.sizeTransformer || (function (size) { return size / zoomScale; }) });
8483
+ this.core = __assign(__assign({ contentDiv: contentDiv, api: __assign(__assign({}, coreApiMap_1.coreApiMap), (options.coreApiOverride || {})), originalApi: coreApiMap_1.coreApiMap, plugins: plugins.filter(function (x) { return !!x; }) }, (0, createCorePlugins_1.getPluginState)(corePlugins)), { trustedHTMLHandler: options.trustedHTMLHandler || (function (html) { return html; }), zoomScale: zoomScale, sizeTransformer: options.sizeTransformer || (function (size) { return size / zoomScale; }), getVisibleViewport: options.getVisibleViewport ||
8484
+ (function () {
8485
+ var scrollContainer = _this.getScrollContainer();
8486
+ return (0, roosterjs_editor_dom_1.getIntersectedRect)(scrollContainer == contentDiv
8487
+ ? [scrollContainer]
8488
+ : [scrollContainer, contentDiv]);
8489
+ }), imageSelectionBorderColor: options.imageSelectionBorderColor });
8292
8490
  // 3. Initialize plugins
8293
8491
  this.core.plugins.forEach(function (plugin) { return plugin.initialize(_this); });
8294
8492
  // 4. Ensure user will type in a container node, not the editor content DIV
@@ -8556,6 +8754,17 @@ var Editor = /** @class */ (function () {
8556
8754
  core.api.selectTable(core, null);
8557
8755
  core.domEvent.tableSelectionRange = null;
8558
8756
  }
8757
+ if (this.isFeatureEnabled("ImageSelection" /* ImageSelection */) &&
8758
+ (0, roosterjs_editor_dom_1.safeInstanceOf)(arg1, 'HTMLImageElement') &&
8759
+ !arg2) {
8760
+ var selection = core.api.selectImage(core, arg1);
8761
+ core.domEvent.imageSelectionRange = selection;
8762
+ return !!selection;
8763
+ }
8764
+ else {
8765
+ core.api.selectImage(core, null);
8766
+ core.domEvent.imageSelectionRange = null;
8767
+ }
8559
8768
  var range = !arg1
8560
8769
  ? null
8561
8770
  : (0, roosterjs_editor_dom_1.safeInstanceOf)(arg1, 'Range')
@@ -8833,6 +9042,8 @@ var Editor = /** @class */ (function () {
8833
9042
  return this.getCore().contentDiv.getAttribute(name);
8834
9043
  };
8835
9044
  /**
9045
+ * @deprecated Use getVisibleViewport() instead.
9046
+ *
8836
9047
  * Get current relative distance from top-left corner of the given element to top-left corner of editor content DIV.
8837
9048
  * @param element The element to calculate from. If the given element is not in editor, return value will be null
8838
9049
  * @param addScroll When pass true, The return value will also add scrollLeft and scrollTop if any. So the value
@@ -9005,6 +9216,12 @@ var Editor = /** @class */ (function () {
9005
9216
  }
9006
9217
  }
9007
9218
  };
9219
+ /**
9220
+ * Retrieves the rect of the visible viewport of the editor.
9221
+ */
9222
+ Editor.prototype.getVisibleViewport = function () {
9223
+ return this.getCore().getVisibleViewport();
9224
+ };
9008
9225
  /**
9009
9226
  * @returns the current EditorCore object
9010
9227
  * @throws a standard Error if there's no core object
@@ -11781,9 +11998,9 @@ exports.default = getPredefinedCssForElement;
11781
11998
  "use strict";
11782
11999
 
11783
12000
  Object.defineProperty(exports, "__esModule", { value: true });
11784
- exports.VTable = exports.moveChildNodes = exports.KnownCreateElementData = exports.createElement = exports.matchesSelector = exports.setColor = exports.getInnerHTML = exports.readFile = exports.safeInstanceOf = exports.normalizeRect = exports.splitTextNode = exports.getLastLeafNode = exports.getFirstLeafNode = exports.getPreviousLeafSibling = exports.getNextLeafSibling = exports.wrap = exports.unwrap = exports.splitBalancedNodeRange = exports.splitParentNode = exports.queryElements = exports.matchLink = exports.isVoidHtmlElement = exports.isNodeEmpty = exports.isBlockElement = exports.getTagOfNode = exports.PendableFormatCommandMap = exports.getPendableFormatState = exports.getComputedStyle = exports.getComputedStyles = exports.fromHtml = exports.findClosestElementAncestor = exports.contains = exports.collapseNodes = exports.changeElementTag = exports.applyFormat = exports.getBrowserInfo = exports.Browser = exports.extractClipboardItemsForIE = exports.extractClipboardItems = exports.extractClipboardEvent = exports.applyTextStyle = exports.PartialInlineElement = exports.NodeInlineElement = exports.LinkInlineElement = exports.ImageInlineElement = exports.getInlineElementAtNode = exports.PositionContentSearcher = exports.ContentTraverser = exports.getFirstLastBlockElement = exports.getBlockElementAtNode = void 0;
11785
- exports.createNumberDefinition = exports.validate = exports.getTextContent = exports.deleteSelectedContent = exports.adjustInsertPosition = exports.setStyles = exports.getStyles = exports.isCtrlOrMetaPressed = exports.isCharacterValue = exports.isModifierKey = exports.clearEventDataCache = exports.cacheGetEventData = exports.getEntitySelector = exports.getEntityFromElement = exports.commitEntity = exports.chainSanitizerCallback = exports.createDefaultHtmlSanitizerOptions = exports.getInheritableStyles = exports.HtmlSanitizer = exports.canUndoAutoComplete = exports.createSnapshots = exports.moveCurrentSnapsnot = exports.moveCurrentSnapshot = exports.clearProceedingSnapshotsV2 = exports.clearProceedingSnapshots = exports.canMoveCurrentSnapshot = exports.addSnapshotV2 = exports.addSnapshot = exports.addRangeToSelection = exports.setHtmlWithMetadata = exports.setHtmlWithSelectionPath = exports.getHtmlWithSelectionPath = exports.getSelectionPath = exports.isPositionAtBeginningOf = exports.getPositionRect = exports.createRange = exports.Position = exports.mergeBlocksInRegion = exports.getSelectionRangeInRegion = exports.isNodeInRegion = exports.collapseNodesInRegion = exports.getSelectedBlockElementsInRegion = exports.getRegionsFromRange = exports.getTableFormatInfo = exports.setListItemStyle = exports.VListChain = exports.createVListFromRegion = exports.VListItem = exports.VList = exports.isWholeTableSelected = void 0;
11786
- exports.toArray = exports.getObjectKeys = exports.arrayPush = exports.removeMetadata = exports.setMetadata = exports.getMetadata = exports.createObjectDefinition = exports.createArrayDefinition = exports.createStringDefinition = exports.createBooleanDefinition = void 0;
12001
+ exports.getIntersectedRect = exports.moveChildNodes = exports.KnownCreateElementData = exports.createElement = exports.matchesSelector = exports.setColor = exports.getInnerHTML = exports.readFile = exports.safeInstanceOf = exports.normalizeRect = exports.splitTextNode = exports.getLastLeafNode = exports.getFirstLeafNode = exports.getPreviousLeafSibling = exports.getNextLeafSibling = exports.wrap = exports.unwrap = exports.splitBalancedNodeRange = exports.splitParentNode = exports.queryElements = exports.matchLink = exports.isVoidHtmlElement = exports.isNodeEmpty = exports.isBlockElement = exports.getTagOfNode = exports.PendableFormatCommandMap = exports.getPendableFormatState = exports.getComputedStyle = exports.getComputedStyles = exports.fromHtml = exports.findClosestElementAncestor = exports.contains = exports.collapseNodes = exports.changeElementTag = exports.applyFormat = exports.getBrowserInfo = exports.Browser = exports.extractClipboardItemsForIE = exports.extractClipboardItems = exports.extractClipboardEvent = exports.applyTextStyle = exports.PartialInlineElement = exports.NodeInlineElement = exports.LinkInlineElement = exports.ImageInlineElement = exports.getInlineElementAtNode = exports.PositionContentSearcher = exports.ContentTraverser = exports.getFirstLastBlockElement = exports.getBlockElementAtNode = void 0;
12002
+ exports.getTextContent = exports.deleteSelectedContent = exports.adjustInsertPosition = exports.setStyles = exports.getStyles = exports.isCtrlOrMetaPressed = exports.isCharacterValue = exports.isModifierKey = exports.clearEventDataCache = exports.cacheGetEventData = exports.getEntitySelector = exports.getEntityFromElement = exports.commitEntity = exports.chainSanitizerCallback = exports.createDefaultHtmlSanitizerOptions = exports.getInheritableStyles = exports.HtmlSanitizer = exports.canUndoAutoComplete = exports.createSnapshots = exports.moveCurrentSnapsnot = exports.moveCurrentSnapshot = exports.clearProceedingSnapshotsV2 = exports.clearProceedingSnapshots = exports.canMoveCurrentSnapshot = exports.addSnapshotV2 = exports.addSnapshot = exports.addRangeToSelection = exports.setHtmlWithMetadata = exports.setHtmlWithSelectionPath = exports.getHtmlWithSelectionPath = exports.getSelectionPath = exports.isPositionAtBeginningOf = exports.getPositionRect = exports.createRange = exports.Position = exports.mergeBlocksInRegion = exports.getSelectionRangeInRegion = exports.isNodeInRegion = exports.collapseNodesInRegion = exports.getSelectedBlockElementsInRegion = exports.getRegionsFromRange = exports.saveTableCellMetadata = exports.getTableFormatInfo = exports.setListItemStyle = exports.VListChain = exports.createVListFromRegion = exports.VListItem = exports.VList = exports.isWholeTableSelected = exports.VTable = void 0;
12003
+ exports.toArray = exports.getObjectKeys = exports.arrayPush = exports.removeMetadata = exports.setMetadata = exports.getMetadata = exports.createObjectDefinition = exports.createArrayDefinition = exports.createStringDefinition = exports.createBooleanDefinition = exports.createNumberDefinition = exports.validate = void 0;
11787
12004
  var getBlockElementAtNode_1 = __webpack_require__(/*! ./blockElements/getBlockElementAtNode */ "./packages/roosterjs-editor-dom/lib/blockElements/getBlockElementAtNode.ts");
11788
12005
  Object.defineProperty(exports, "getBlockElementAtNode", { enumerable: true, get: function () { return getBlockElementAtNode_1.default; } });
11789
12006
  var getFirstLastBlockElement_1 = __webpack_require__(/*! ./blockElements/getFirstLastBlockElement */ "./packages/roosterjs-editor-dom/lib/blockElements/getFirstLastBlockElement.ts");
@@ -11875,6 +12092,8 @@ Object.defineProperty(exports, "createElement", { enumerable: true, get: functio
11875
12092
  Object.defineProperty(exports, "KnownCreateElementData", { enumerable: true, get: function () { return createElement_1.KnownCreateElementData; } });
11876
12093
  var moveChildNodes_1 = __webpack_require__(/*! ./utils/moveChildNodes */ "./packages/roosterjs-editor-dom/lib/utils/moveChildNodes.ts");
11877
12094
  Object.defineProperty(exports, "moveChildNodes", { enumerable: true, get: function () { return moveChildNodes_1.default; } });
12095
+ var getIntersectedRect_1 = __webpack_require__(/*! ./utils/getIntersectedRect */ "./packages/roosterjs-editor-dom/lib/utils/getIntersectedRect.ts");
12096
+ Object.defineProperty(exports, "getIntersectedRect", { enumerable: true, get: function () { return getIntersectedRect_1.default; } });
11878
12097
  var VTable_1 = __webpack_require__(/*! ./table/VTable */ "./packages/roosterjs-editor-dom/lib/table/VTable.ts");
11879
12098
  Object.defineProperty(exports, "VTable", { enumerable: true, get: function () { return VTable_1.default; } });
11880
12099
  var isWholeTableSelected_1 = __webpack_require__(/*! ./table/isWholeTableSelected */ "./packages/roosterjs-editor-dom/lib/table/isWholeTableSelected.ts");
@@ -11891,6 +12110,8 @@ var setListItemStyle_1 = __webpack_require__(/*! ./list/setListItemStyle */ "./p
11891
12110
  Object.defineProperty(exports, "setListItemStyle", { enumerable: true, get: function () { return setListItemStyle_1.default; } });
11892
12111
  var tableFormatInfo_1 = __webpack_require__(/*! ./table/tableFormatInfo */ "./packages/roosterjs-editor-dom/lib/table/tableFormatInfo.ts");
11893
12112
  Object.defineProperty(exports, "getTableFormatInfo", { enumerable: true, get: function () { return tableFormatInfo_1.getTableFormatInfo; } });
12113
+ var tableCellInfo_1 = __webpack_require__(/*! ./table/tableCellInfo */ "./packages/roosterjs-editor-dom/lib/table/tableCellInfo.ts");
12114
+ Object.defineProperty(exports, "saveTableCellMetadata", { enumerable: true, get: function () { return tableCellInfo_1.saveTableCellMetadata; } });
11894
12115
  var getRegionsFromRange_1 = __webpack_require__(/*! ./region/getRegionsFromRange */ "./packages/roosterjs-editor-dom/lib/region/getRegionsFromRange.ts");
11895
12116
  Object.defineProperty(exports, "getRegionsFromRange", { enumerable: true, get: function () { return getRegionsFromRange_1.default; } });
11896
12117
  var getSelectedBlockElementsInRegion_1 = __webpack_require__(/*! ./region/getSelectedBlockElementsInRegion */ "./packages/roosterjs-editor-dom/lib/region/getSelectedBlockElementsInRegion.ts");
@@ -12861,8 +13082,10 @@ var VList = /** @class */ (function () {
12861
13082
  /**
12862
13083
  * Write the result back into DOM tree
12863
13084
  * After that, this VList becomes unavailable because we set this.rootList to null
13085
+ *
13086
+ * @param shouldReuseAllAncestorListElements Optional - defaults to false.
12864
13087
  */
12865
- VList.prototype.writeBack = function () {
13088
+ VList.prototype.writeBack = function (shouldReuseAllAncestorListElements) {
12866
13089
  var _this = this;
12867
13090
  if (!this.rootList) {
12868
13091
  throw new Error('rootList must not be null');
@@ -12880,7 +13103,7 @@ var VList = /** @class */ (function () {
12880
13103
  listStack.splice(1, listStack.length - 1);
12881
13104
  start = newListStart;
12882
13105
  }
12883
- item.writeBack(listStack, _this.rootList);
13106
+ item.writeBack(listStack, _this.rootList, shouldReuseAllAncestorListElements);
12884
13107
  var topList = listStack[1];
12885
13108
  if ((0, safeInstanceOf_1.default)(topList, 'HTMLOListElement')) {
12886
13109
  if (lastList != topList) {
@@ -13260,7 +13483,7 @@ var VListChain = /** @class */ (function () {
13260
13483
  * After change the lists, commit the change to all lists in this chain to update the list number,
13261
13484
  * and clear the temporary dataset values added to list node
13262
13485
  */
13263
- VListChain.prototype.commit = function () {
13486
+ VListChain.prototype.commit = function (shouldReuseAllAncestorListElements) {
13264
13487
  var lists = this.getLists();
13265
13488
  var lastNumber = 0;
13266
13489
  for (var i = 0; i < lists.length; i++) {
@@ -13270,7 +13493,7 @@ var VListChain = /** @class */ (function () {
13270
13493
  lastNumber = vlist.getLastItemNumber() || 0;
13271
13494
  delete list.dataset[CHAIN_DATASET_NAME];
13272
13495
  delete list.dataset[AFTER_CURSOR_DATASET_NAME];
13273
- vlist.writeBack();
13496
+ vlist.writeBack(shouldReuseAllAncestorListElements);
13274
13497
  }
13275
13498
  };
13276
13499
  /**
@@ -13356,7 +13579,7 @@ var NEGATIVE_MARGIN = '-.25in';
13356
13579
  */
13357
13580
  exports.ListStyleDefinitionMetadata = (0, definitionCreators_1.createObjectDefinition)({
13358
13581
  orderedStyleType: (0, definitionCreators_1.createNumberDefinition)(true /** isOptional */, undefined /** value **/, 1 /* Min */, 20 /* Max */),
13359
- unorderedStyleType: (0, definitionCreators_1.createNumberDefinition)(true /** isOptional */, undefined /** value **/, 1 /* Min */, 8 /* Max */),
13582
+ unorderedStyleType: (0, definitionCreators_1.createNumberDefinition)(true /** isOptional */, undefined /** value **/, 1 /* Min */, 9 /* Max */),
13360
13583
  }, true /** isOptional */, true /** allowNull */);
13361
13584
  /**
13362
13585
  * !!! Never directly create instance of this class. It should be created within VList class !!!
@@ -13544,19 +13767,41 @@ var VListItem = /** @class */ (function () {
13544
13767
  * Write the change result back into DOM
13545
13768
  * @param listStack current stack of list elements
13546
13769
  * @param originalRoot Original list root element. It will be reused when write back if possible
13770
+ * @param shouldReuseAllAncestorListElements Optional - defaults to false. If true, only make
13771
+ * sure the direct parent of this list matches the list types when writing back.
13547
13772
  */
13548
- VListItem.prototype.writeBack = function (listStack, originalRoot) {
13773
+ VListItem.prototype.writeBack = function (listStack, originalRoot, shouldReuseAllAncestorListElements) {
13549
13774
  var _a;
13775
+ if (shouldReuseAllAncestorListElements === void 0) { shouldReuseAllAncestorListElements = false; }
13550
13776
  var nextLevel = 1;
13551
- // 1. Determine list elements that we can reuse
13552
- // e.g.:
13553
- // passed in listStack: Fragment > OL > UL > OL
13554
- // local listTypes: null > OL > UL > UL > OL
13555
- // then Fragment > OL > UL can be reused
13556
- for (; nextLevel < listStack.length; nextLevel++) {
13557
- if ((0, getListTypeFromNode_1.default)(listStack[nextLevel]) !== this.listTypes[nextLevel]) {
13558
- listStack.splice(nextLevel);
13559
- break;
13777
+ if (shouldReuseAllAncestorListElements) {
13778
+ // Remove any un-needed lists from the stack.
13779
+ if (listStack.length > this.listTypes.length) {
13780
+ listStack.splice(this.listTypes.length);
13781
+ }
13782
+ // 1. If the listStack is the same length as the listTypes for this item, check
13783
+ // if the last item needs to change, and remove it if needed. We can always re-use
13784
+ // the other lists even if the type doesn't match - since the display is the same
13785
+ // as long as the list immediately surrounding the item is correct.
13786
+ var listStackEndIndex = listStack.length - 1;
13787
+ if (listStackEndIndex === this.listTypes.length - 1 && // they are the same length
13788
+ (0, getListTypeFromNode_1.default)(listStack[listStackEndIndex]) !==
13789
+ this.listTypes[listStackEndIndex]) {
13790
+ listStack.splice(listStackEndIndex);
13791
+ }
13792
+ nextLevel = listStack.length;
13793
+ }
13794
+ else {
13795
+ // 1. Determine list elements that we can reuse
13796
+ // e.g.:
13797
+ // passed in listStack: Fragment > OL > UL > OL
13798
+ // local listTypes: null > OL > UL > UL > OL
13799
+ // then Fragment > OL > UL can be reused
13800
+ for (; nextLevel < listStack.length; nextLevel++) {
13801
+ if ((0, getListTypeFromNode_1.default)(listStack[nextLevel]) !== this.listTypes[nextLevel]) {
13802
+ listStack.splice(nextLevel);
13803
+ break;
13804
+ }
13560
13805
  }
13561
13806
  }
13562
13807
  // 2. Add new list elements
@@ -13573,7 +13818,8 @@ var VListItem = /** @class */ (function () {
13573
13818
  //apply the styles of the current parent list to the new list
13574
13819
  if (this.getDeepChildIndex(originalRoot) == stackLength) {
13575
13820
  var listStyleType = (_a = this.node.parentElement) === null || _a === void 0 ? void 0 : _a.style.listStyleType;
13576
- if (listStyleType) {
13821
+ if (listStyleType &&
13822
+ (0, getTagOfNode_1.default)(this.node.parentElement) === (0, getTagOfNode_1.default)(newList)) {
13577
13823
  newList.style.listStyleType = listStyleType;
13578
13824
  }
13579
13825
  }
@@ -14439,6 +14685,10 @@ function validate(input, def) {
14439
14685
  if ((def.isOptional && typeof input === 'undefined') || (def.allowNull && input === null)) {
14440
14686
  result = true;
14441
14687
  }
14688
+ else if ((!def.isOptional && typeof input === 'undefined') ||
14689
+ (!def.allowNull && input === null)) {
14690
+ return false;
14691
+ }
14442
14692
  else {
14443
14693
  switch (def.type) {
14444
14694
  case 2 /* String */:
@@ -15851,7 +16101,7 @@ var normalizeRect_1 = __webpack_require__(/*! ../utils/normalizeRect */ "./packa
15851
16101
  var safeInstanceOf_1 = __webpack_require__(/*! ../utils/safeInstanceOf */ "./packages/roosterjs-editor-dom/lib/utils/safeInstanceOf.ts");
15852
16102
  var toArray_1 = __webpack_require__(/*! ../jsUtils/toArray */ "./packages/roosterjs-editor-dom/lib/jsUtils/toArray.ts");
15853
16103
  var tableFormatInfo_1 = __webpack_require__(/*! ./tableFormatInfo */ "./packages/roosterjs-editor-dom/lib/table/tableFormatInfo.ts");
15854
- var CELL_SHADE = 'cellShade';
16104
+ var metadata_1 = __webpack_require__(/*! ../metadata/metadata */ "./packages/roosterjs-editor-dom/lib/metadata/metadata.ts");
15855
16105
  var DEFAULT_FORMAT = {
15856
16106
  topBorderColor: '#ABABAB',
15857
16107
  bottomBorderColor: '#ABABAB',
@@ -16005,8 +16255,8 @@ var VTable = /** @class */ (function () {
16005
16255
  VTable.prototype.deleteCellShadeDataset = function (cells) {
16006
16256
  cells === null || cells === void 0 ? void 0 : cells.forEach(function (row) {
16007
16257
  row.forEach(function (cell) {
16008
- if (cell.td && cell.td.dataset[CELL_SHADE]) {
16009
- delete cell.td.dataset[CELL_SHADE];
16258
+ if (cell.td) {
16259
+ (0, metadata_1.removeMetadata)(cell.td);
16010
16260
  }
16011
16261
  });
16012
16262
  });
@@ -16550,10 +16800,10 @@ function cloneNode(node) {
16550
16800
  Object.defineProperty(exports, "__esModule", { value: true });
16551
16801
  var changeElementTag_1 = __webpack_require__(/*! ../utils/changeElementTag */ "./packages/roosterjs-editor-dom/lib/utils/changeElementTag.ts");
16552
16802
  var setColor_1 = __webpack_require__(/*! ../utils/setColor */ "./packages/roosterjs-editor-dom/lib/utils/setColor.ts");
16803
+ var tableCellInfo_1 = __webpack_require__(/*! ./tableCellInfo */ "./packages/roosterjs-editor-dom/lib/table/tableCellInfo.ts");
16553
16804
  var TRANSPARENT = 'transparent';
16554
16805
  var TABLE_CELL_TAG_NAME = 'TD';
16555
16806
  var TABLE_HEADER_TAG_NAME = 'TH';
16556
- var CELL_SHADE = 'cellShade';
16557
16807
  /**
16558
16808
  * @internal
16559
16809
  * Apply the given table format to this virtual table
@@ -16576,11 +16826,11 @@ exports.default = applyTableFormat;
16576
16826
  * @returns
16577
16827
  */
16578
16828
  function hasCellShade(cell) {
16829
+ var _a;
16579
16830
  if (!cell.td) {
16580
16831
  return false;
16581
16832
  }
16582
- var colorShade = cell.td.dataset[CELL_SHADE];
16583
- return colorShade ? true : false;
16833
+ return !!((_a = (0, tableCellInfo_1.getTableCellMetadata)(cell.td)) === null || _a === void 0 ? void 0 : _a.bgColorOverride);
16584
16834
  }
16585
16835
  /**
16586
16836
  * Set color to the table
@@ -16858,6 +17108,47 @@ function isWholeTableSelected(vTable, selection) {
16858
17108
  exports.default = isWholeTableSelected;
16859
17109
 
16860
17110
 
17111
+ /***/ }),
17112
+
17113
+ /***/ "./packages/roosterjs-editor-dom/lib/table/tableCellInfo.ts":
17114
+ /*!******************************************************************!*\
17115
+ !*** ./packages/roosterjs-editor-dom/lib/table/tableCellInfo.ts ***!
17116
+ \******************************************************************/
17117
+ /*! no static exports found */
17118
+ /***/ (function(module, exports, __webpack_require__) {
17119
+
17120
+ "use strict";
17121
+
17122
+ Object.defineProperty(exports, "__esModule", { value: true });
17123
+ exports.saveTableCellMetadata = exports.getTableCellMetadata = void 0;
17124
+ var definitionCreators_1 = __webpack_require__(/*! ../metadata/definitionCreators */ "./packages/roosterjs-editor-dom/lib/metadata/definitionCreators.ts");
17125
+ var metadata_1 = __webpack_require__(/*! ../metadata/metadata */ "./packages/roosterjs-editor-dom/lib/metadata/metadata.ts");
17126
+ var BooleanDefinition = (0, definitionCreators_1.createBooleanDefinition)(false /** isOptional */, undefined /** value */, true /** allowNull */);
17127
+ var TableCellFormatMetadata = (0, definitionCreators_1.createObjectDefinition)({
17128
+ bgColorOverride: BooleanDefinition,
17129
+ }, false /* isOptional */, true /** allowNull */);
17130
+ /**
17131
+ * @internal
17132
+ * Get the format info of a table cell
17133
+ * @param cell The table cell to use
17134
+ */
17135
+ function getTableCellMetadata(cell) {
17136
+ return (0, metadata_1.getMetadata)(cell, TableCellFormatMetadata);
17137
+ }
17138
+ exports.getTableCellMetadata = getTableCellMetadata;
17139
+ /**
17140
+ * Add metadata to a cell
17141
+ * @param cell The table cell to add the metadata
17142
+ * @param format The format of the table
17143
+ */
17144
+ function saveTableCellMetadata(cell, format) {
17145
+ if (cell && format) {
17146
+ (0, metadata_1.setMetadata)(cell, format, TableCellFormatMetadata);
17147
+ }
17148
+ }
17149
+ exports.saveTableCellMetadata = saveTableCellMetadata;
17150
+
17151
+
16861
17152
  /***/ }),
16862
17153
 
16863
17154
  /***/ "./packages/roosterjs-editor-dom/lib/table/tableFormatInfo.ts":
@@ -17509,6 +17800,61 @@ function getInnerHTML(node) {
17509
17800
  exports.default = getInnerHTML;
17510
17801
 
17511
17802
 
17803
+ /***/ }),
17804
+
17805
+ /***/ "./packages/roosterjs-editor-dom/lib/utils/getIntersectedRect.ts":
17806
+ /*!***********************************************************************!*\
17807
+ !*** ./packages/roosterjs-editor-dom/lib/utils/getIntersectedRect.ts ***!
17808
+ \***********************************************************************/
17809
+ /*! no static exports found */
17810
+ /***/ (function(module, exports, __webpack_require__) {
17811
+
17812
+ "use strict";
17813
+
17814
+ Object.defineProperty(exports, "__esModule", { value: true });
17815
+ var normalizeRect_1 = __webpack_require__(/*! ./normalizeRect */ "./packages/roosterjs-editor-dom/lib/utils/normalizeRect.ts");
17816
+ /**
17817
+ * Get the intersected Rect of elements provided
17818
+ *
17819
+ * @example
17820
+ * The result of the following Elements Rects would be:
17821
+ {
17822
+ top: Element2.top,
17823
+ bottom: Element1.bottom,
17824
+ left: Element2.left,
17825
+ right: Element2.right
17826
+ }
17827
+ +-------------------------+
17828
+ | Element 1 |
17829
+ | +-----------------+ |
17830
+ | | Element2 | |
17831
+ | | | |
17832
+ | | | |
17833
+ +-------------------------+
17834
+ | |
17835
+ +-----------------+
17836
+
17837
+ * @param elements Elements to use.
17838
+ * @param additionalRects additional rects to use
17839
+ * @returns If the Rect is valid return the rect, if not, return null.
17840
+ */
17841
+ function getIntersectedRect(elements, additionalRects) {
17842
+ if (additionalRects === void 0) { additionalRects = []; }
17843
+ var rects = elements
17844
+ .map(function (element) { return (0, normalizeRect_1.default)(element.getBoundingClientRect()); })
17845
+ .filter(function (element) { return !!element; })
17846
+ .concat(additionalRects);
17847
+ var result = {
17848
+ top: Math.max.apply(Math, rects.map(function (r) { return r.top; })),
17849
+ bottom: Math.min.apply(Math, rects.map(function (r) { return r.bottom; })),
17850
+ left: Math.max.apply(Math, rects.map(function (r) { return r.left; })),
17851
+ right: Math.min.apply(Math, rects.map(function (r) { return r.right; })),
17852
+ };
17853
+ return result.top < result.bottom && result.left < result.right ? result : null;
17854
+ }
17855
+ exports.default = getIntersectedRect;
17856
+
17857
+
17512
17858
  /***/ }),
17513
17859
 
17514
17860
  /***/ "./packages/roosterjs-editor-dom/lib/utils/getLeafNode.ts":
@@ -18795,6 +19141,31 @@ Object.defineProperty(exports, "__esModule", { value: true });
18795
19141
  __exportStar(__webpack_require__(/*! ./plugins/ImageResize/index */ "./packages/roosterjs-editor-plugins/lib/plugins/ImageResize/index.ts"), exports);
18796
19142
 
18797
19143
 
19144
+ /***/ }),
19145
+
19146
+ /***/ "./packages/roosterjs-editor-plugins/lib/ImageSelection.ts":
19147
+ /*!*****************************************************************!*\
19148
+ !*** ./packages/roosterjs-editor-plugins/lib/ImageSelection.ts ***!
19149
+ \*****************************************************************/
19150
+ /*! no static exports found */
19151
+ /***/ (function(module, exports, __webpack_require__) {
19152
+
19153
+ "use strict";
19154
+
19155
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
19156
+ if (k2 === undefined) k2 = k;
19157
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
19158
+ }) : (function(o, m, k, k2) {
19159
+ if (k2 === undefined) k2 = k;
19160
+ o[k2] = m[k];
19161
+ }));
19162
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
19163
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
19164
+ };
19165
+ Object.defineProperty(exports, "__esModule", { value: true });
19166
+ __exportStar(__webpack_require__(/*! ./plugins/ImageSelection/index */ "./packages/roosterjs-editor-plugins/lib/plugins/ImageSelection/index.ts"), exports);
19167
+
19168
+
18798
19169
  /***/ }),
18799
19170
 
18800
19171
  /***/ "./packages/roosterjs-editor-plugins/lib/Paste.ts":
@@ -18955,6 +19326,7 @@ __exportStar(__webpack_require__(/*! ./TableResize */ "./packages/roosterjs-edit
18955
19326
  __exportStar(__webpack_require__(/*! ./Watermark */ "./packages/roosterjs-editor-plugins/lib/Watermark.ts"), exports);
18956
19327
  __exportStar(__webpack_require__(/*! ./TableCellSelection */ "./packages/roosterjs-editor-plugins/lib/TableCellSelection.ts"), exports);
18957
19328
  __exportStar(__webpack_require__(/*! ./AutoFormat */ "./packages/roosterjs-editor-plugins/lib/AutoFormat.ts"), exports);
19329
+ __exportStar(__webpack_require__(/*! ./ImageSelection */ "./packages/roosterjs-editor-plugins/lib/ImageSelection.ts"), exports);
18958
19330
 
18959
19331
 
18960
19332
  /***/ }),
@@ -19638,7 +20010,7 @@ var MergeInNewLine = {
19638
20010
  (0, roosterjs_editor_api_1.blockFormat)(editor, function (region, start, end) {
19639
20011
  var vList = (0, roosterjs_editor_dom_1.createVListFromRegion)(region, false /*includeSiblingList*/, li);
19640
20012
  vList.setIndentation(start, end, 1 /* Decrease */, true /*softOutdent*/);
19641
- vList.writeBack();
20013
+ vList.writeBack(editor.isFeatureEnabled("ReuseAllAncestorListElements" /* ReuseAllAncestorListElements */));
19642
20014
  event.rawEvent.preventDefault();
19643
20015
  });
19644
20016
  }
@@ -19714,7 +20086,8 @@ function isAListPattern(textBeforeCursor) {
19714
20086
  var AutoBullet = {
19715
20087
  keys: [32 /* SPACE */],
19716
20088
  shouldHandleEvent: function (event, editor) {
19717
- if (!cacheGetListElement(event, editor)) {
20089
+ if (!cacheGetListElement(event, editor) &&
20090
+ !editor.isFeatureEnabled("AutoFormatList" /* AutoFormatList */)) {
19718
20091
  var searcher = editor.getContentSearcherOfCursor(event);
19719
20092
  var textBeforeCursor = searcher.getSubStringBefore(4);
19720
20093
  // Auto list is triggered if:
@@ -19802,23 +20175,13 @@ var AutoNumberingList = {
19802
20175
  event.rawEvent.preventDefault();
19803
20176
  editor.addUndoSnapshot(function () {
19804
20177
  var _a;
19805
- var regions;
19806
20178
  var searcher = editor.getContentSearcherOfCursor();
19807
20179
  var textBeforeCursor = searcher.getSubStringBefore(5);
19808
20180
  var textRange = searcher.getRangeFromText(textBeforeCursor, true /*exactMatch*/);
19809
- if (!textRange) {
19810
- // no op if the range can't be found
19811
- }
19812
- else if ((regions = editor.getSelectedRegions()) && regions.length == 1) {
19813
- var num = parseInt(textBeforeCursor);
19814
- var listStyle = (0, getAutoNumberingListStyle_1.default)(textBeforeCursor, num);
19815
- prepareAutoBullet(editor, textRange);
19816
- (0, roosterjs_editor_api_1.toggleNumbering)(editor, num, listStyle, 'autoToggleList' /** apiNameOverride */);
19817
- }
19818
- else {
20181
+ if (textRange) {
19819
20182
  var listStyle = (0, getAutoNumberingListStyle_1.default)(textBeforeCursor);
19820
20183
  prepareAutoBullet(editor, textRange);
19821
- (0, roosterjs_editor_api_1.toggleNumbering)(editor, undefined /* startNumber*/, listStyle, 'autoToggleList' /** apiNameOverride */);
20184
+ (0, roosterjs_editor_api_1.toggleNumbering)(editor, undefined /** startNumber */, listStyle, 'autoToggleList' /** apiNameOverride */);
19822
20185
  }
19823
20186
  (_a = searcher.getRangeFromText(textBeforeCursor, true /*exactMatch*/)) === null || _a === void 0 ? void 0 : _a.deleteContents();
19824
20187
  }, null /*changeSource*/, true /*canUndoByBackspace*/);
@@ -19890,7 +20253,14 @@ function shouldTriggerList(event, editor, getListStyle) {
19890
20253
  var searcher = editor.getContentSearcherOfCursor(event);
19891
20254
  var textBeforeCursor = searcher.getSubStringBefore(4);
19892
20255
  var itHasSpace = /\s/g.test(textBeforeCursor);
19893
- return (!itHasSpace && !searcher.getNearestNonTextInlineElement() && getListStyle(textBeforeCursor));
20256
+ var element = editor.getElementAtCursor();
20257
+ var previousNode = editor.getBodyTraverser(element).getPreviousBlockElement();
20258
+ var isLi = previousNode
20259
+ ? (0, roosterjs_editor_dom_1.getTagOfNode)(previousNode === null || previousNode === void 0 ? void 0 : previousNode.collapseToSingleElement()) === 'LI'
20260
+ : false;
20261
+ return (!itHasSpace &&
20262
+ !searcher.getNearestNonTextInlineElement() &&
20263
+ getListStyle(textBeforeCursor, !isLi));
19894
20264
  }
19895
20265
  /**
19896
20266
  * @internal
@@ -19944,7 +20314,7 @@ function cacheGetRangeForMarkdownOperation(event, editor, triggerCharacter) {
19944
20314
  var searcher = editor.getContentSearcherOfCursor(event);
19945
20315
  var startPosition;
19946
20316
  var endPosition;
19947
- searcher.forEachTextInlineElement(function (textInlineElement) {
20317
+ searcher === null || searcher === void 0 ? void 0 : searcher.forEachTextInlineElement(function (textInlineElement) {
19948
20318
  if (endPosition && startPosition) {
19949
20319
  return true;
19950
20320
  }
@@ -19988,7 +20358,8 @@ function handleMarkdownEvent(event, editor, triggerCharacter, elementTag) {
19988
20358
  var textContentRange = range.cloneRange();
19989
20359
  textContentRange.setStart(textContentRange.startContainer, textContentRange.startOffset + 1);
19990
20360
  // set the removal range to include the typed last character.
19991
- range.setEnd(range.endContainer, range.endOffset + 1);
20361
+ var lastIndex = range.endContainer.length;
20362
+ range.setEnd(range.endContainer, lastIndex);
19992
20363
  // extract content and put it into a new element.
19993
20364
  var elementToWrap = editor.getDocument().createElement(elementTag);
19994
20365
  elementToWrap.appendChild(textContentRange.extractContents());
@@ -20006,19 +20377,19 @@ function handleMarkdownEvent(event, editor, triggerCharacter, elementTag) {
20006
20377
  /**
20007
20378
  * Markdown bold feature. Make bold text with markdown shortcuts.
20008
20379
  */
20009
- var MarkdownBold = generateBasicMarkdownFeature(56 /* EIGHT_ASTERISK */, '*', 'b', true);
20380
+ var MarkdownBold = generateBasicMarkdownFeature(56 /* EIGHT_ASTERISK */, '*', 'b', true /* useShiftKey */);
20010
20381
  /**
20011
20382
  * Markdown italics feature. Make italic text with markdown shortcuts.
20012
20383
  */
20013
- var MarkdownItalic = generateBasicMarkdownFeature(189 /* DASH_UNDERSCORE */, '_', 'i', true);
20384
+ var MarkdownItalic = generateBasicMarkdownFeature(189 /* DASH_UNDERSCORE */, '_', 'i', true /* useShiftKey */);
20014
20385
  /**
20015
20386
  * Markdown strikethrough feature. MAke strikethrough text with markdown shortcuts.
20016
20387
  */
20017
- var MarkdownStrikethrough = generateBasicMarkdownFeature(192 /* GRAVE_TILDE */, '~', 's', true);
20388
+ var MarkdownStrikethrough = generateBasicMarkdownFeature(192 /* GRAVE_TILDE */, '~', 's', true /* useShiftKey */);
20018
20389
  /**
20019
20390
  * Markdown inline code feature. Marks specific text as inline code with markdown shortcuts.
20020
20391
  */
20021
- var MarkdownInlineCode = generateBasicMarkdownFeature(192 /* GRAVE_TILDE */, '`', 'code', false);
20392
+ var MarkdownInlineCode = generateBasicMarkdownFeature(192 /* GRAVE_TILDE */, '`', 'code', false /* useShiftKey */);
20022
20393
  /**
20023
20394
  * @internal
20024
20395
  */
@@ -20738,13 +21109,7 @@ var characters = {
20738
21109
  '-': 2 /* Dash */,
20739
21110
  ')': 3 /* Parenthesis */,
20740
21111
  };
20741
- var numberingTriggers = {
20742
- '1': 1 /* Decimal */,
20743
- i: 4 /* LowerRoman */,
20744
- I: 5 /* UpperRoman */,
20745
- a: 2 /* LowerAlpha */,
20746
- A: 3 /* UpperAlpha */,
20747
- };
21112
+ var numberingTriggers = ['1', 'a', 'A', 'I', 'i'];
20748
21113
  var identifyNumberingType = function (text) {
20749
21114
  if (!isNaN(parseInt(text))) {
20750
21115
  return 1 /* Decimal */;
@@ -20803,16 +21168,14 @@ var DecimalsTypes = (_f = {},
20803
21168
  _f[3 /* Parenthesis */] = 3 /* DecimalParenthesis */,
20804
21169
  _f[4 /* DoubleParenthesis */] = 4 /* DecimalDoubleParenthesis */,
20805
21170
  _f);
20806
- var identifyNumberingListType = function (numbering, isDoubleParenthesis, startNumber) {
21171
+ var identifyNumberingListType = function (numbering, isDoubleParenthesis) {
20807
21172
  var separatorCharacter = isDoubleParenthesis
20808
21173
  ? 4 /* DoubleParenthesis */
20809
21174
  : characters[numbering[1]];
20810
21175
  // if separator is not valid, no need to check if the number is valid.
20811
21176
  if (separatorCharacter) {
20812
- var number = numbering.length === 3 ? numbering[1] : numbering[0];
20813
- var numberingType = startNumber
20814
- ? identifyNumberingType(number)
20815
- : numberingTriggers[number];
21177
+ var number = numbering[numbering.length - 2];
21178
+ var numberingType = identifyNumberingType(number);
20816
21179
  return numberingType ? numberingListTypes[numberingType](separatorCharacter) : null;
20817
21180
  }
20818
21181
  return null;
@@ -20820,16 +21183,22 @@ var identifyNumberingListType = function (numbering, isDoubleParenthesis, startN
20820
21183
  /**
20821
21184
  * @internal
20822
21185
  * @param textBeforeCursor The trigger character
20823
- * @param startNumber (Optional) Start number of the list
21186
+ * @param isTheFirstItem (Optional) Is the start number of a list.
20824
21187
  * @returns The style of a numbering list triggered by a string
20825
21188
  */
20826
- function getAutoNumberingListStyle(textBeforeCursor, startNumber) {
21189
+ function getAutoNumberingListStyle(textBeforeCursor, isTheFirstItem) {
20827
21190
  var trigger = textBeforeCursor.trim();
21191
+ //Only the staring items ['1', 'a', 'A', 'I', 'i'] must trigger a new list. All the other triggers is used to keep the list chain.
21192
+ //The index is always the character before the last character
21193
+ var listIndex = trigger[trigger.length - 2];
21194
+ if (isTheFirstItem && numberingTriggers.indexOf(listIndex) < 0) {
21195
+ return null;
21196
+ }
20828
21197
  // the marker must be a combination of 2 or 3 characters, so if the length is less than 2, no need to check
20829
21198
  // If the marker length is 3, the marker style is double parenthesis such as (1), (A).
20830
21199
  var isDoubleParenthesis = trigger.length === 3 && trigger[0] === '(' && trigger[2] === ')';
20831
21200
  var numberingType = trigger.length === 2 || isDoubleParenthesis
20832
- ? identifyNumberingListType(trigger, isDoubleParenthesis, startNumber)
21201
+ ? identifyNumberingListType(trigger, isDoubleParenthesis)
20833
21202
  : null;
20834
21203
  return numberingType;
20835
21204
  }
@@ -22997,6 +23366,99 @@ var ImageResize_1 = __webpack_require__(/*! ./ImageResize */ "./packages/rooster
22997
23366
  Object.defineProperty(exports, "ImageResize", { enumerable: true, get: function () { return ImageResize_1.default; } });
22998
23367
 
22999
23368
 
23369
+ /***/ }),
23370
+
23371
+ /***/ "./packages/roosterjs-editor-plugins/lib/plugins/ImageSelection/ImageSelection.ts":
23372
+ /*!****************************************************************************************!*\
23373
+ !*** ./packages/roosterjs-editor-plugins/lib/plugins/ImageSelection/ImageSelection.ts ***!
23374
+ \****************************************************************************************/
23375
+ /*! no static exports found */
23376
+ /***/ (function(module, exports, __webpack_require__) {
23377
+
23378
+ "use strict";
23379
+
23380
+ Object.defineProperty(exports, "__esModule", { value: true });
23381
+ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
23382
+ /**
23383
+ * Detect image selection and help highlight the image
23384
+ */
23385
+ var ImageSelection = /** @class */ (function () {
23386
+ function ImageSelection() {
23387
+ this.editor = null;
23388
+ this.imageId = null;
23389
+ }
23390
+ /**
23391
+ * Get a friendly name of this plugin
23392
+ */
23393
+ ImageSelection.prototype.getName = function () {
23394
+ return 'ImageSelection';
23395
+ };
23396
+ /**
23397
+ * Initialize this plugin. This should only be called from Editor
23398
+ * @param editor Editor instance
23399
+ */
23400
+ ImageSelection.prototype.initialize = function (editor) {
23401
+ this.editor = editor;
23402
+ };
23403
+ /**
23404
+ * Dispose this plugin
23405
+ */
23406
+ ImageSelection.prototype.dispose = function () {
23407
+ this.editor.select(null);
23408
+ this.editor = null;
23409
+ this.imageId = null;
23410
+ };
23411
+ ImageSelection.prototype.onPluginEvent = function (event) {
23412
+ if (this.editor) {
23413
+ switch (event.eventType) {
23414
+ case 17 /* EnteredShadowEdit */:
23415
+ var selection = this.editor.getSelectionRangeEx();
23416
+ if (selection.type == 2 /* ImageSelection */) {
23417
+ this.editor.select(selection.image);
23418
+ }
23419
+ break;
23420
+ case 18 /* LeavingShadowEdit */:
23421
+ if (this.imageId) {
23422
+ var images = this.editor.queryElements('#' + this.imageId);
23423
+ if (images.length == 1) {
23424
+ var image = images[0];
23425
+ this.editor.select(image);
23426
+ }
23427
+ this.imageId = null;
23428
+ }
23429
+ break;
23430
+ case 5 /* MouseDown */:
23431
+ var target = event.rawEvent.target;
23432
+ if ((0, roosterjs_editor_dom_1.safeInstanceOf)(target, 'HTMLImageElement')) {
23433
+ this.editor.select(target);
23434
+ this.imageId = target.id;
23435
+ }
23436
+ break;
23437
+ }
23438
+ }
23439
+ };
23440
+ return ImageSelection;
23441
+ }());
23442
+ exports.default = ImageSelection;
23443
+
23444
+
23445
+ /***/ }),
23446
+
23447
+ /***/ "./packages/roosterjs-editor-plugins/lib/plugins/ImageSelection/index.ts":
23448
+ /*!*******************************************************************************!*\
23449
+ !*** ./packages/roosterjs-editor-plugins/lib/plugins/ImageSelection/index.ts ***!
23450
+ \*******************************************************************************/
23451
+ /*! no static exports found */
23452
+ /***/ (function(module, exports, __webpack_require__) {
23453
+
23454
+ "use strict";
23455
+
23456
+ Object.defineProperty(exports, "__esModule", { value: true });
23457
+ exports.ImageSelection = void 0;
23458
+ var ImageSelection_1 = __webpack_require__(/*! ./ImageSelection */ "./packages/roosterjs-editor-plugins/lib/plugins/ImageSelection/ImageSelection.ts");
23459
+ Object.defineProperty(exports, "ImageSelection", { enumerable: true, get: function () { return ImageSelection_1.default; } });
23460
+
23461
+
23000
23462
  /***/ }),
23001
23463
 
23002
23464
  /***/ "./packages/roosterjs-editor-plugins/lib/plugins/Paste/Paste.ts":
@@ -26426,12 +26888,18 @@ var INSERTER_HOVER_OFFSET = 5;
26426
26888
  * When set a different current table or change current TD, we need to update these areas
26427
26889
  */
26428
26890
  var TableEditor = /** @class */ (function () {
26429
- function TableEditor(editor, table, onChanged, onShowHelperElement, eventTarget) {
26891
+ function TableEditor(editor, table, onChanged, onShowHelperElement, contentDiv) {
26430
26892
  var _this = this;
26431
26893
  this.editor = editor;
26432
26894
  this.table = table;
26433
26895
  this.onChanged = onChanged;
26434
26896
  this.onShowHelperElement = onShowHelperElement;
26897
+ // 1, 2 - Insert a column or a row
26898
+ this.horizontalInserter = null;
26899
+ this.verticalInserter = null;
26900
+ // 3, 4 - Resize a column or a row from a cell
26901
+ this.horizontalResizer = null;
26902
+ this.verticalResizer = null;
26435
26903
  this.onFinishEditing = function () {
26436
26904
  _this.editor.focus();
26437
26905
  _this.editor.select(_this.start, _this.end);
@@ -26485,8 +26953,9 @@ var TableEditor = /** @class */ (function () {
26485
26953
  }
26486
26954
  };
26487
26955
  this.isRTL = (0, roosterjs_editor_dom_1.getComputedStyle)(table, 'direction') == 'rtl';
26488
- this.tableResizer = (0, TableResizer_1.default)(table, editor.getZoomScale(), this.isRTL, this.onStartTableResize, this.onFinishEditing, this.onShowHelperElement);
26489
- this.tableSelector = (0, TableSelector_1.default)(table, editor.getZoomScale(), this.onSelect, this.onShowHelperElement, this.getShouldShowTableSelectorHandler(this.editor.getScrollContainer(), eventTarget));
26956
+ var zoomScale = editor.getZoomScale();
26957
+ this.tableResizer = (0, TableResizer_1.default)(table, zoomScale, this.isRTL, this.onStartTableResize, this.onFinishEditing, this.onShowHelperElement);
26958
+ this.tableSelector = (0, TableSelector_1.default)(table, zoomScale, editor, this.onSelect, this.onShowHelperElement, contentDiv);
26490
26959
  this.isCurrentlyEditing = false;
26491
26960
  }
26492
26961
  TableEditor.prototype.dispose = function () {
@@ -26571,7 +27040,7 @@ var TableEditor = /** @class */ (function () {
26571
27040
  this.disposeTableInserter();
26572
27041
  }
26573
27042
  if (!this.horizontalInserter && !this.verticalInserter && td) {
26574
- var newInserter = (0, TableInserter_1.default)(this.editor, td, this.isRTL, isHorizontal, this.onInserted, this.onShowHelperElement);
27043
+ var newInserter = (0, TableInserter_1.default)(this.editor, td, this.isRTL, !!isHorizontal, this.onInserted, this.onShowHelperElement);
26575
27044
  if (isHorizontal) {
26576
27045
  this.horizontalInserter = newInserter;
26577
27046
  }
@@ -26621,21 +27090,6 @@ var TableEditor = /** @class */ (function () {
26621
27090
  }
26622
27091
  this.editor.addUndoSnapshot();
26623
27092
  };
26624
- TableEditor.prototype.getShouldShowTableSelectorHandler = function (scrollContainer, eventTarget) {
26625
- if (eventTarget && (0, roosterjs_editor_dom_1.safeInstanceOf)(eventTarget, 'HTMLElement') && scrollContainer) {
26626
- var scrollContainerRect_1 = (0, roosterjs_editor_dom_1.normalizeRect)(scrollContainer.getBoundingClientRect());
26627
- var containerRect_1 = (0, roosterjs_editor_dom_1.normalizeRect)(eventTarget.getBoundingClientRect());
26628
- if (scrollContainerRect_1 && containerRect_1) {
26629
- var scrollContainerVisibleTop_1 = scrollContainer.scrollTop - scrollContainerRect_1.top;
26630
- return function (rect) {
26631
- return containerRect_1.top <= rect.top &&
26632
- scrollContainerVisibleTop_1 <= rect.top &&
26633
- scrollContainerRect_1.top <= rect.top;
26634
- };
26635
- }
26636
- }
26637
- return function () { return true; };
26638
- };
26639
27093
  return TableEditor;
26640
27094
  }());
26641
27095
  exports.default = TableEditor;
@@ -26659,10 +27113,12 @@ exports.disposeTableEditFeature = void 0;
26659
27113
  */
26660
27114
  function disposeTableEditFeature(resizer) {
26661
27115
  var _a, _b, _c;
26662
- (_b = (_a = resizer.div) === null || _a === void 0 ? void 0 : _a.parentNode) === null || _b === void 0 ? void 0 : _b.removeChild(resizer.div);
26663
- resizer.div = null;
26664
- (_c = resizer.featureHandler) === null || _c === void 0 ? void 0 : _c.dispose();
26665
- resizer.featureHandler = null;
27116
+ if (resizer) {
27117
+ (_b = (_a = resizer.div) === null || _a === void 0 ? void 0 : _a.parentNode) === null || _b === void 0 ? void 0 : _b.removeChild(resizer.div);
27118
+ resizer.div = null;
27119
+ (_c = resizer.featureHandler) === null || _c === void 0 ? void 0 : _c.dispose();
27120
+ resizer.featureHandler = null;
27121
+ }
26666
27122
  }
26667
27123
  exports.disposeTableEditFeature = disposeTableEditFeature;
26668
27124
 
@@ -26713,6 +27169,7 @@ function createTableInserter(editor, td, isRTL, isHorizontal, onInsert, onShowHe
26713
27169
  var handler = new TableInsertHandler(div, td, isHorizontal, editor, onInsert);
26714
27170
  return { div: div, featureHandler: handler, node: td };
26715
27171
  }
27172
+ return null;
26716
27173
  }
26717
27174
  exports.default = createTableInserter;
26718
27175
  var TableInsertHandler = /** @class */ (function () {
@@ -26895,10 +27352,10 @@ var TABLE_SELECTOR_ID = '_Table_Selector';
26895
27352
  /**
26896
27353
  * @internal
26897
27354
  */
26898
- function createTableSelector(table, zoomScale, onFinishDragging, onShowHelperElement, shouldShow) {
27355
+ function createTableSelector(table, zoomScale, editor, onFinishDragging, onShowHelperElement, contentDiv) {
26899
27356
  var rect = (0, roosterjs_editor_dom_1.normalizeRect)(table.getBoundingClientRect());
26900
- if (rect && shouldShow && !shouldShow(rect)) {
26901
- return { div: null, featureHandler: null, node: table };
27357
+ if (!isTableTopVisible(editor, rect, contentDiv)) {
27358
+ return null;
26902
27359
  }
26903
27360
  var document = table.ownerDocument;
26904
27361
  var createElementData = {
@@ -26936,6 +27393,14 @@ function setSelectorDivPosition(context, trigger) {
26936
27393
  trigger.style.left = rect.left - TABLE_SELECTOR_LENGTH - 2 + "px";
26937
27394
  }
26938
27395
  }
27396
+ function isTableTopVisible(editor, rect, contentDiv) {
27397
+ var visibleViewport = editor.getVisibleViewport();
27398
+ if (contentDiv && (0, roosterjs_editor_dom_1.safeInstanceOf)(contentDiv, 'HTMLElement') && visibleViewport && rect) {
27399
+ var containerRect = (0, roosterjs_editor_dom_1.normalizeRect)(contentDiv.getBoundingClientRect());
27400
+ return containerRect.top <= rect.top && visibleViewport.top <= rect.top;
27401
+ }
27402
+ return true;
27403
+ }
26939
27404
 
26940
27405
 
26941
27406
  /***/ }),
@@ -27212,10 +27677,14 @@ var CompatibleBulletListType;
27212
27677
  * Bullet triggered by -->
27213
27678
  */
27214
27679
  CompatibleBulletListType[CompatibleBulletListType["DoubleLongArrow"] = 8] = "DoubleLongArrow";
27680
+ /**
27681
+ * Bullet type circle
27682
+ */
27683
+ CompatibleBulletListType[CompatibleBulletListType["Circle"] = 9] = "Circle";
27215
27684
  /**
27216
27685
  * Maximum value of the enum
27217
27686
  */
27218
- CompatibleBulletListType[CompatibleBulletListType["Max"] = 8] = "Max";
27687
+ CompatibleBulletListType[CompatibleBulletListType["Max"] = 9] = "Max";
27219
27688
  })(CompatibleBulletListType = exports.CompatibleBulletListType || (exports.CompatibleBulletListType = {}));
27220
27689
 
27221
27690
 
@@ -28082,6 +28551,17 @@ var CompatibleExperimentalFeatures;
28082
28551
  * e.g. We will move list items with "display: block" into previous list item and change tag to be DIV
28083
28552
  */
28084
28553
  CompatibleExperimentalFeatures["NormalizeList"] = "NormalizeList";
28554
+ /**
28555
+ * When a html image is selected, the selected image data will be stored by editor core.
28556
+ */
28557
+ CompatibleExperimentalFeatures["ImageSelection"] = "ImageSelection";
28558
+ /**
28559
+ * With this feature enabled, when writing back a list item we will re-use all
28560
+ * ancestor list elements, even if they don't match the types currently in the
28561
+ * listTypes array for that item. The only list that we will ensure is correct
28562
+ * is the one closest to the item.
28563
+ */
28564
+ CompatibleExperimentalFeatures["ReuseAllAncestorListElements"] = "ReuseAllAncestorListElements";
28085
28565
  })(CompatibleExperimentalFeatures = exports.CompatibleExperimentalFeatures || (exports.CompatibleExperimentalFeatures = {}));
28086
28566
 
28087
28567
 
@@ -28815,6 +29295,10 @@ var CompatibleSelectionRangeTypes;
28815
29295
  * Selection made inside of a single table.
28816
29296
  */
28817
29297
  CompatibleSelectionRangeTypes[CompatibleSelectionRangeTypes["TableSelection"] = 1] = "TableSelection";
29298
+ /**
29299
+ * Selection made in a image.
29300
+ */
29301
+ CompatibleSelectionRangeTypes[CompatibleSelectionRangeTypes["ImageSelection"] = 2] = "ImageSelection";
28818
29302
  })(CompatibleSelectionRangeTypes = exports.CompatibleSelectionRangeTypes || (exports.CompatibleSelectionRangeTypes = {}));
28819
29303
 
28820
29304