roosterjs 9.8.0 → 9.9.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.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- // Type definitions for roosterjs (Version 9.8.0)
1
+ // Type definitions for roosterjs (Version 9.9.0)
2
2
  // Generated by dts tool from roosterjs
3
3
  // Project: https://github.com/Microsoft/roosterjs
4
4
 
@@ -3467,7 +3467,11 @@ type ExperimentalFeature = /**
3467
3467
  * When this feature is enabled, we will persist a content model in memory as long as we can,
3468
3468
  * and use cached element when write back if it is not changed.
3469
3469
  */
3470
- 'PersistCache';
3470
+ 'PersistCache'
3471
+ /**
3472
+ * Workaround for the Legacy Image Edit
3473
+ */
3474
+ | 'LegacyImageSelection';
3471
3475
 
3472
3476
  /**
3473
3477
  * Options for editor
@@ -3555,9 +3559,9 @@ interface PasteOptions {
3555
3559
  */
3556
3560
  allowedCustomPasteType?: string[];
3557
3561
  /**
3558
- * Default paste type. By default will use the normal (as-is) paste type.
3562
+ * Default paste type or function that returns the paste type. By default will use the normal (as-is) paste type.
3559
3563
  */
3560
- defaultPasteType?: PasteType;
3564
+ defaultPasteType?: PasteTypeOrGetter;
3561
3565
  }
3562
3566
 
3563
3567
  /**
@@ -4107,7 +4111,7 @@ interface CopyPastePluginState {
4107
4111
  /**
4108
4112
  * Default paste type. By default will use the normal (as-is) paste type.
4109
4113
  */
4110
- defaultPasteType?: PasteType;
4114
+ defaultPasteType?: PasteTypeOrGetter;
4111
4115
  }
4112
4116
 
4113
4117
  /**
@@ -4665,6 +4669,12 @@ interface ContentModelFormatState {
4665
4669
  isDarkMode?: boolean;
4666
4670
  }
4667
4671
 
4672
+ /**
4673
+ * Represents the PasteType parameter used to set the paste type to use.
4674
+ * It can be either the Paste Type value or a callback that retuns the Paste Type to use.
4675
+ */
4676
+ type PasteTypeOrGetter = PasteType | ((document: Document | null, clipboardData: ClipboardData) => PasteType);
4677
+
4668
4678
  /**
4669
4679
  * Image Format
4670
4680
  */
@@ -5047,6 +5057,11 @@ interface AnnounceData {
5047
5057
  * @optional if provided, will attempt to replace {n} with each of the values inside of the array.
5048
5058
  */
5049
5059
  formatStrings?: string[];
5060
+ /**
5061
+ * @optional if provided, will set the ariaLive property of the announce container element to the provided value.
5062
+ * @see https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-live#values
5063
+ */
5064
+ ariaLiveMode?: 'assertive' | 'polite' | 'off';
5050
5065
  }
5051
5066
 
5052
5067
  /**
@@ -6196,6 +6211,15 @@ function isElementOfType<Tag extends keyof HTMLElementTagNameMap>(element: HTMLE
6196
6211
  */
6197
6212
  function getObjectKeys<T extends string | number | symbol>(obj: Record<T, any> | Partial<Record<T, any>>): T[];
6198
6213
 
6214
+ /**
6215
+ * Returns a safe Id to use in Native APIs.
6216
+ * IDs that start with number or hyphen can throw errors if used.
6217
+ * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/id
6218
+ * @param id
6219
+ * @returns
6220
+ */
6221
+ function getSafeIdSelector(id: string): string;
6222
+
6199
6223
  /**
6200
6224
  * Convert a named node map to an array
6201
6225
  * @param collection The map to convert
@@ -7739,9 +7763,9 @@ function redo(editor: IEditor): void;
7739
7763
  * Paste into editor using a clipboardData object
7740
7764
  * @param editor The Editor object.
7741
7765
  * @param clipboardData Clipboard data retrieved from clipboard
7742
- * @param pasteType Type of content to paste. @default normal
7766
+ * @param pasteTypeOrGetter Type of content to paste or function that returns the Paste Type to use based on the document and the clipboard Data. @default normal
7743
7767
  */
7744
- function paste(editor: IEditor, clipboardData: ClipboardData, pasteType?: PasteType): void;
7768
+ function paste(editor: IEditor, clipboardData: ClipboardData, pasteTypeOrGetter?: PasteTypeOrGetter): void;
7745
7769
 
7746
7770
  /**
7747
7771
  * Insert table into editor at current selection
package/dist/rooster.js CHANGED
@@ -7860,11 +7860,11 @@ var retrieveHtmlInfo_1 = __webpack_require__(/*! ./retrieveHtmlInfo */ "./packag
7860
7860
  * Paste into editor using a clipboardData object
7861
7861
  * @param editor The Editor object.
7862
7862
  * @param clipboardData Clipboard data retrieved from clipboard
7863
- * @param pasteType Type of content to paste. @default normal
7863
+ * @param pasteTypeOrGetter Type of content to paste or function that returns the Paste Type to use based on the document and the clipboard Data. @default normal
7864
7864
  */
7865
- function paste(editor, clipboardData, pasteType) {
7865
+ function paste(editor, clipboardData, pasteTypeOrGetter) {
7866
7866
  var _a;
7867
- if (pasteType === void 0) { pasteType = 'normal'; }
7867
+ if (pasteTypeOrGetter === void 0) { pasteTypeOrGetter = 'normal'; }
7868
7868
  editor.focus();
7869
7869
  var trustedHTMLHandler = editor.getTrustedHTMLHandler();
7870
7870
  if (!clipboardData.modelBeforePaste) {
@@ -7875,6 +7875,9 @@ function paste(editor, clipboardData, pasteType) {
7875
7875
  }
7876
7876
  // 1. Prepare variables
7877
7877
  var doc = createDOMFromHtml(clipboardData.rawHtml, trustedHTMLHandler);
7878
+ var pasteType = typeof pasteTypeOrGetter == 'function'
7879
+ ? pasteTypeOrGetter(doc, clipboardData)
7880
+ : pasteTypeOrGetter;
7878
7881
  // 2. Handle HTML from clipboard
7879
7882
  var htmlFromClipboard = (0, retrieveHtmlInfo_1.retrieveHtmlInfo)(doc, clipboardData);
7880
7883
  // 3. Create target fragment
@@ -8327,7 +8330,7 @@ var DOT_STRING = '.';
8327
8330
  * @param announceData Data to announce
8328
8331
  */
8329
8332
  var announce = function (core, announceData) {
8330
- var text = announceData.text, defaultStrings = announceData.defaultStrings, _a = announceData.formatStrings, formatStrings = _a === void 0 ? [] : _a;
8333
+ var text = announceData.text, defaultStrings = announceData.defaultStrings, _a = announceData.formatStrings, formatStrings = _a === void 0 ? [] : _a, _b = announceData.ariaLiveMode, ariaLiveMode = _b === void 0 ? 'assertive' : _b;
8331
8334
  var announcerStringGetter = core.lifecycle.announcerStringGetter;
8332
8335
  var template = defaultStrings && (announcerStringGetter === null || announcerStringGetter === void 0 ? void 0 : announcerStringGetter(defaultStrings));
8333
8336
  var textToAnnounce = formatString(template || text, formatStrings);
@@ -8336,6 +8339,9 @@ var announce = function (core, announceData) {
8336
8339
  }
8337
8340
  if (textToAnnounce && core.lifecycle.announceContainer) {
8338
8341
  var announceContainer = core.lifecycle.announceContainer;
8342
+ if (announceContainer.ariaLive != ariaLiveMode) {
8343
+ announceContainer.ariaLive = ariaLiveMode;
8344
+ }
8339
8345
  if (textToAnnounce == announceContainer.textContent) {
8340
8346
  textToAnnounce += DOT_STRING;
8341
8347
  }
@@ -9090,6 +9096,7 @@ exports.restoreSnapshotLogicalRoot = restoreSnapshotLogicalRoot;
9090
9096
  Object.defineProperty(exports, "__esModule", ({ value: true }));
9091
9097
  exports.restoreSnapshotSelection = void 0;
9092
9098
  var getPositionFromPath_1 = __webpack_require__(/*! ./getPositionFromPath */ "./packages/roosterjs-content-model-core/lib/coreApi/restoreUndoSnapshot/getPositionFromPath.ts");
9099
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
9093
9100
  /**
9094
9101
  * @internal
9095
9102
  */
@@ -9114,7 +9121,7 @@ function restoreSnapshotSelection(core, snapshot) {
9114
9121
  };
9115
9122
  break;
9116
9123
  case 'table':
9117
- var table = physicalRoot.querySelector('#' + snapshotSelection.tableId);
9124
+ var table = physicalRoot.querySelector((0, roosterjs_content_model_dom_1.getSafeIdSelector)(snapshotSelection.tableId));
9118
9125
  if (table) {
9119
9126
  domSelection = {
9120
9127
  type: 'table',
@@ -9127,7 +9134,7 @@ function restoreSnapshotSelection(core, snapshot) {
9127
9134
  }
9128
9135
  break;
9129
9136
  case 'image':
9130
- var image = physicalRoot.querySelector('#' + snapshotSelection.imageId);
9137
+ var image = physicalRoot.querySelector((0, roosterjs_content_model_dom_1.getSafeIdSelector)(snapshotSelection.imageId));
9131
9138
  if (image) {
9132
9139
  domSelection = {
9133
9140
  type: 'image',
@@ -9418,7 +9425,7 @@ var setDOMSelection = function (core, selection, skipSelectionChangedEvent) {
9418
9425
  var imageSelectionColor = isDarkMode
9419
9426
  ? core.selection.imageSelectionBorderColorDark
9420
9427
  : core.selection.imageSelectionBorderColor;
9421
- core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, "outline-style:solid!important; outline-color:" + (imageSelectionColor || DEFAULT_SELECTION_BORDER_COLOR) + "!important;", ["#" + (0, ensureUniqueId_1.ensureUniqueId)(image, IMAGE_ID)]);
9428
+ core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, "outline-style:solid!important; outline-color:" + (imageSelectionColor || DEFAULT_SELECTION_BORDER_COLOR) + "!important;", [(0, roosterjs_content_model_dom_1.getSafeIdSelector)((0, ensureUniqueId_1.ensureUniqueId)(image, IMAGE_ID))]);
9422
9429
  core.api.setEditorStyle(core, HIDE_SELECTION_CSS_KEY, TRANSPARENT_SELECTION_CSS_RULE, [SELECTION_SELECTOR]);
9423
9430
  setRangeSelection(doc, image, false /* collapse */);
9424
9431
  break;
@@ -9451,12 +9458,13 @@ var setDOMSelection = function (core, selection, skipSelectionChangedEvent) {
9451
9458
  lastColumn: lastCell.col,
9452
9459
  };
9453
9460
  var tableId = (0, ensureUniqueId_1.ensureUniqueId)(table, TABLE_ID);
9461
+ var tableSelector = (0, roosterjs_content_model_dom_1.getSafeIdSelector)(tableId);
9454
9462
  var tableSelectors = firstCell.row == 0 &&
9455
9463
  firstCell.col == 0 &&
9456
9464
  lastCell.row == parsedTable.length - 1 &&
9457
9465
  lastCell.col == ((_b = (_a = parsedTable[lastCell.row]) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) - 1
9458
- ? ["#" + tableId, "#" + tableId + " *"]
9459
- : handleTableSelected(parsedTable, tableId, table, firstCell, lastCell);
9466
+ ? [tableSelector, tableSelector + " *"]
9467
+ : handleTableSelected(parsedTable, tableSelector, table, firstCell, lastCell);
9460
9468
  core.selection.selection = selection;
9461
9469
  var tableSelectionColor = isDarkMode
9462
9470
  ? core.selection.tableCellSelectionBackgroundColorDark
@@ -9489,7 +9497,7 @@ var setDOMSelection = function (core, selection, skipSelectionChangedEvent) {
9489
9497
  }
9490
9498
  };
9491
9499
  exports.setDOMSelection = setDOMSelection;
9492
- function handleTableSelected(parsedTable, tableId, table, firstCell, lastCell) {
9500
+ function handleTableSelected(parsedTable, tableSelector, table, firstCell, lastCell) {
9493
9501
  var selectors = [];
9494
9502
  // Get whether table has thead, tbody or tfoot, then Set the start and end of each of the table children,
9495
9503
  // so we can build the selector according the element between the table and the row.
@@ -9523,7 +9531,7 @@ function handleTableSelected(parsedTable, tableId, table, firstCell, lastCell) {
9523
9531
  rowIndex <= lastCell.row &&
9524
9532
  cellIndex >= firstCell.col &&
9525
9533
  cellIndex <= lastCell.col) {
9526
- var selector = "#" + tableId + middleElSelector + " tr:nth-child(" + currentRow + ")>" + cell.tagName + ":nth-child(" + tdCount + ")";
9534
+ var selector = "" + tableSelector + middleElSelector + " tr:nth-child(" + currentRow + ")>" + cell.tagName + ":nth-child(" + tdCount + ")";
9527
9535
  selectors.push(selector, selector + ' *');
9528
9536
  }
9529
9537
  }
@@ -9560,12 +9568,13 @@ function setRangeSelection(doc, element, collapse) {
9560
9568
  /*!********************************************************************************************!*\
9561
9569
  !*** ./packages/roosterjs-content-model-core/lib/coreApi/setEditorStyle/ensureUniqueId.ts ***!
9562
9570
  \********************************************************************************************/
9563
- /***/ ((__unused_webpack_module, exports) => {
9571
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
9564
9572
 
9565
9573
  "use strict";
9566
9574
 
9567
9575
  Object.defineProperty(exports, "__esModule", ({ value: true }));
9568
9576
  exports.ensureUniqueId = void 0;
9577
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
9569
9578
  /**
9570
9579
  * @internal
9571
9580
  */
@@ -9573,7 +9582,7 @@ function ensureUniqueId(element, idPrefix) {
9573
9582
  idPrefix = element.id || idPrefix;
9574
9583
  var doc = element.ownerDocument;
9575
9584
  var i = 0;
9576
- while (!element.id || doc.querySelectorAll("[id=\"" + element.id + "\"]").length > 1) {
9585
+ while (!element.id || doc.querySelectorAll((0, roosterjs_content_model_dom_1.getSafeIdSelector)(element.id)).length > 1) {
9577
9586
  element.id = idPrefix + '_' + i++;
9578
9587
  }
9579
9588
  return element.id;
@@ -9594,6 +9603,7 @@ exports.ensureUniqueId = ensureUniqueId;
9594
9603
  Object.defineProperty(exports, "__esModule", ({ value: true }));
9595
9604
  exports.setEditorStyle = void 0;
9596
9605
  var ensureUniqueId_1 = __webpack_require__(/*! ./ensureUniqueId */ "./packages/roosterjs-content-model-core/lib/coreApi/setEditorStyle/ensureUniqueId.ts");
9606
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
9597
9607
  var MAX_RULE_SELECTOR_LENGTH = 9000;
9598
9608
  var CONTENT_DIV_ID = 'contentDiv';
9599
9609
  /**
@@ -9615,7 +9625,7 @@ var setEditorStyle = function (core, key, cssRule, subSelectors, maxRuleLength)
9615
9625
  sheet.deleteRule(i);
9616
9626
  }
9617
9627
  if (cssRule) {
9618
- var rootSelector = '#' + (0, ensureUniqueId_1.ensureUniqueId)(core.physicalRoot, CONTENT_DIV_ID);
9628
+ var rootSelector = (0, roosterjs_content_model_dom_1.getSafeIdSelector)((0, ensureUniqueId_1.ensureUniqueId)(core.physicalRoot, CONTENT_DIV_ID));
9619
9629
  var selectors = !subSelectors
9620
9630
  ? [rootSelector]
9621
9631
  : typeof subSelectors === 'string'
@@ -12421,6 +12431,7 @@ var isSingleImageInSelection_1 = __webpack_require__(/*! ./isSingleImageInSelect
12421
12431
  var normalizePos_1 = __webpack_require__(/*! ./normalizePos */ "./packages/roosterjs-content-model-core/lib/corePlugin/selection/normalizePos.ts");
12422
12432
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
12423
12433
  var MouseLeftButton = 0;
12434
+ var MouseMiddleButton = 1;
12424
12435
  var MouseRightButton = 2;
12425
12436
  var Up = 'ArrowUp';
12426
12437
  var Down = 'ArrowDown';
@@ -12627,7 +12638,7 @@ var SelectionPlugin = /** @class */ (function () {
12627
12638
  this.onMouseDown(this.editor, event.rawEvent);
12628
12639
  break;
12629
12640
  case 'mouseUp':
12630
- this.onMouseUp();
12641
+ this.onMouseUp(this.editor, event);
12631
12642
  break;
12632
12643
  case 'keyDown':
12633
12644
  this.onKeyDown(this.editor, event.rawEvent);
@@ -12643,25 +12654,40 @@ var SelectionPlugin = /** @class */ (function () {
12643
12654
  }
12644
12655
  };
12645
12656
  SelectionPlugin.prototype.onMouseDown = function (editor, rawEvent) {
12646
- var _a;
12657
+ var _a, _b;
12647
12658
  var selection = editor.getDOMSelection();
12648
12659
  var image;
12649
12660
  // Image selection
12650
- if ((selection === null || selection === void 0 ? void 0 : selection.type) == 'image' &&
12651
- (rawEvent.button == MouseLeftButton ||
12652
- (rawEvent.button == MouseRightButton &&
12653
- !this.getClickingImage(rawEvent) &&
12654
- !this.getContainedTargetImage(rawEvent, selection)))) {
12655
- this.setDOMSelection(null /*domSelection*/, null /*tableSelection*/);
12661
+ if (editor.isExperimentalFeatureEnabled('LegacyImageSelection')) {
12662
+ if (rawEvent.button === MouseRightButton &&
12663
+ (image =
12664
+ (_a = this.getClickingImage(rawEvent)) !== null && _a !== void 0 ? _a : this.getContainedTargetImage(rawEvent, selection)) &&
12665
+ image.isContentEditable) {
12666
+ this.selectImageWithRange(image, rawEvent);
12667
+ return;
12668
+ }
12669
+ else if ((selection === null || selection === void 0 ? void 0 : selection.type) == 'image' && selection.image !== rawEvent.target) {
12670
+ this.selectBeforeOrAfterElement(editor, selection.image);
12671
+ return;
12672
+ }
12656
12673
  }
12657
- if ((image =
12658
- (_a = this.getClickingImage(rawEvent)) !== null && _a !== void 0 ? _a : this.getContainedTargetImage(rawEvent, selection)) &&
12659
- image.isContentEditable) {
12660
- this.setDOMSelection({
12661
- type: 'image',
12662
- image: image,
12663
- }, null);
12664
- return;
12674
+ else {
12675
+ if ((selection === null || selection === void 0 ? void 0 : selection.type) == 'image' &&
12676
+ (rawEvent.button == MouseLeftButton ||
12677
+ (rawEvent.button == MouseRightButton &&
12678
+ !this.getClickingImage(rawEvent) &&
12679
+ !this.getContainedTargetImage(rawEvent, selection)))) {
12680
+ this.setDOMSelection(null /*domSelection*/, null /*tableSelection*/);
12681
+ }
12682
+ if ((image =
12683
+ (_b = this.getClickingImage(rawEvent)) !== null && _b !== void 0 ? _b : this.getContainedTargetImage(rawEvent, selection)) &&
12684
+ image.isContentEditable) {
12685
+ this.setDOMSelection({
12686
+ type: 'image',
12687
+ image: image,
12688
+ }, null);
12689
+ return;
12690
+ }
12665
12691
  }
12666
12692
  // Table selection
12667
12693
  if ((selection === null || selection === void 0 ? void 0 : selection.type) == 'table' && rawEvent.button == MouseLeftButton) {
@@ -12689,7 +12715,33 @@ var SelectionPlugin = /** @class */ (function () {
12689
12715
  });
12690
12716
  }
12691
12717
  };
12692
- SelectionPlugin.prototype.onMouseUp = function () {
12718
+ SelectionPlugin.prototype.selectImageWithRange = function (image, event) {
12719
+ var _a;
12720
+ var range = image.ownerDocument.createRange();
12721
+ range.selectNode(image);
12722
+ var domSelection = (_a = this.editor) === null || _a === void 0 ? void 0 : _a.getDOMSelection();
12723
+ if ((domSelection === null || domSelection === void 0 ? void 0 : domSelection.type) == 'image' && image == domSelection.image) {
12724
+ event.preventDefault();
12725
+ }
12726
+ else {
12727
+ this.setDOMSelection({
12728
+ type: 'range',
12729
+ isReverted: false,
12730
+ range: range,
12731
+ }, null);
12732
+ }
12733
+ };
12734
+ SelectionPlugin.prototype.onMouseUp = function (editor, event) {
12735
+ var image;
12736
+ if (editor.isExperimentalFeatureEnabled('LegacyImageSelection') &&
12737
+ (image = this.getClickingImage(event.rawEvent)) &&
12738
+ image.isContentEditable &&
12739
+ event.rawEvent.button != MouseMiddleButton &&
12740
+ (event.rawEvent.button ==
12741
+ MouseRightButton /* it's not possible to drag using right click */ ||
12742
+ event.isClicking)) {
12743
+ this.selectImageWithRange(image, event.rawEvent);
12744
+ }
12693
12745
  this.detachMouseEvent();
12694
12746
  };
12695
12747
  SelectionPlugin.prototype.onKeyDown = function (editor, rawEvent) {
@@ -17343,6 +17395,40 @@ function getObjectKeys(obj) {
17343
17395
  exports.getObjectKeys = getObjectKeys;
17344
17396
 
17345
17397
 
17398
+ /***/ }),
17399
+
17400
+ /***/ "./packages/roosterjs-content-model-dom/lib/domUtils/getSafeIdSelector.ts":
17401
+ /*!********************************************************************************!*\
17402
+ !*** ./packages/roosterjs-content-model-dom/lib/domUtils/getSafeIdSelector.ts ***!
17403
+ \********************************************************************************/
17404
+ /***/ ((__unused_webpack_module, exports) => {
17405
+
17406
+ "use strict";
17407
+
17408
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
17409
+ exports.getSafeIdSelector = void 0;
17410
+ var StartsWithUnsupportedCharacter = /^[.|\-|_|\d]/;
17411
+ /**
17412
+ * Returns a safe Id to use in Native APIs.
17413
+ * IDs that start with number or hyphen can throw errors if used.
17414
+ * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/id
17415
+ * @param id
17416
+ * @returns
17417
+ */
17418
+ function getSafeIdSelector(id) {
17419
+ if (!id) {
17420
+ return id;
17421
+ }
17422
+ if (id.match(StartsWithUnsupportedCharacter)) {
17423
+ return "[id=\"" + id + "\"]";
17424
+ }
17425
+ else {
17426
+ return "#" + id;
17427
+ }
17428
+ }
17429
+ exports.getSafeIdSelector = getSafeIdSelector;
17430
+
17431
+
17346
17432
  /***/ }),
17347
17433
 
17348
17434
  /***/ "./packages/roosterjs-content-model-dom/lib/domUtils/isElementOfType.ts":
@@ -20058,9 +20144,9 @@ exports.shouldSetValue = shouldSetValue;
20058
20144
  "use strict";
20059
20145
 
20060
20146
  Object.defineProperty(exports, "__esModule", ({ value: true }));
20061
- exports.createEntity = exports.createGeneralBlock = exports.createGeneralSegment = exports.createParagraphDecorator = exports.createContentModelDocument = exports.createImage = exports.createText = exports.createTableCell = exports.createTable = exports.createSelectionMarker = exports.createParagraph = exports.createFormatContainer = exports.createListItem = exports.createBr = exports.normalizeRect = exports.isWhiteSpacePreserved = exports.reuseCachedElement = exports.findClosestBlockEntityContainer = exports.isBlockEntityContainer = exports.isEntityDelimiter = exports.addDelimiters = exports.generateEntityClassNames = exports.parseEntityFormat = exports.getAllEntityWrappers = exports.findClosestEntityWrapper = exports.isEntityElement = exports.unwrap = exports.wrap = exports.wrapAllChildNodes = exports.moveChildNodes = exports.toArray = exports.getObjectKeys = exports.isElementOfType = exports.isNodeOfType = exports.hasMetadata = exports.getMetadata = exports.updateMetadata = exports.buildSelectionMarker = exports.isBlockElement = exports.areSameFormats = exports.parseFormat = exports.getRegularSelectionOffsets = exports.tableProcessor = exports.entityProcessor = exports.processChildNode = exports.handleRegularSelection = exports.childProcessor = exports.contentModelToText = exports.contentModelToDom = exports.domToContentModel = void 0;
20062
- exports.cacheGetEventData = exports.extractClipboardItems = exports.transformColor = exports.readFile = exports.parseTableCells = exports.normalizeText = exports.isSpace = exports.isPunctuation = exports.extractBorderValues = exports.combineBorderValue = exports.isCursorMovingKey = exports.isModifierKey = exports.isCharacterValue = exports.getDOMInsertPointRect = exports.getSelectionRootNode = exports.isBold = exports.createModelToDomConfig = exports.createModelToDomContextWithConfig = exports.createModelToDomContext = exports.createDomToModelConfig = exports.createDomToModelContextWithConfig = exports.createDomToModelContext = exports.defaultGenerateColorKey = exports.parseColor = exports.setColor = exports.getColor = exports.DeprecatedColors = exports.BorderKeys = exports.parseValueWithUnit = exports.getAutoListStyleType = exports.getOrderedListNumberStr = exports.setParagraphNotImplicit = exports.normalizeSingleSegment = exports.isEmpty = exports.addSegment = exports.unwrapBlock = exports.isGeneralSegment = exports.normalizeContentModel = exports.normalizeParagraph = exports.addTextSegment = exports.addLink = exports.addCode = exports.addBlock = exports.mutateSegment = exports.mutateSegments = exports.mutateBlock = exports.createTableRow = exports.createEmptyModel = exports.createListLevel = exports.createDivider = void 0;
20063
- exports.EmptySegmentFormat = exports.UnorderedListStyleMap = exports.OrderedListStyleMap = exports.TableBorderFormat = exports.NumberingListType = exports.BulletListType = exports.ChangeSource = exports.ListMetadataDefinition = exports.getListMetadata = exports.updateListMetadata = exports.getTableMetadata = exports.updateTableMetadata = exports.getTableCellMetadata = exports.updateTableCellMetadata = exports.getImageMetadata = exports.updateImageMetadata = exports.runEditSteps = exports.getClosestAncestorBlockGroupIndex = exports.getSegmentTextFormat = exports.getListStyleTypeFromString = exports.retrieveModelFormatState = exports.setTableCellBackgroundColor = exports.MIN_ALLOWED_TABLE_CELL_HEIGHT = exports.MIN_ALLOWED_TABLE_CELL_WIDTH = exports.normalizeTable = exports.setFirstColumnFormatBorders = exports.applyTableFormat = exports.deleteBlock = exports.deleteSegment = exports.deleteSelection = exports.mergeModel = exports.cloneModel = exports.setSelection = exports.hasSelectionInBlockGroup = exports.hasSelectionInSegment = exports.hasSelectionInBlock = exports.getSelectedCells = exports.getSelectedSegmentsAndParagraphs = exports.getSelectedSegments = exports.getSelectedParagraphs = exports.getOperationalBlocks = exports.getFirstSelectedTable = exports.getFirstSelectedListItem = exports.iterateSelections = exports.isBlockGroupOfType = void 0;
20147
+ exports.createGeneralBlock = exports.createGeneralSegment = exports.createParagraphDecorator = exports.createContentModelDocument = exports.createImage = exports.createText = exports.createTableCell = exports.createTable = exports.createSelectionMarker = exports.createParagraph = exports.createFormatContainer = exports.createListItem = exports.createBr = exports.normalizeRect = exports.isWhiteSpacePreserved = exports.reuseCachedElement = exports.findClosestBlockEntityContainer = exports.isBlockEntityContainer = exports.isEntityDelimiter = exports.addDelimiters = exports.generateEntityClassNames = exports.parseEntityFormat = exports.getAllEntityWrappers = exports.findClosestEntityWrapper = exports.isEntityElement = exports.unwrap = exports.wrap = exports.wrapAllChildNodes = exports.moveChildNodes = exports.toArray = exports.getSafeIdSelector = exports.getObjectKeys = exports.isElementOfType = exports.isNodeOfType = exports.hasMetadata = exports.getMetadata = exports.updateMetadata = exports.buildSelectionMarker = exports.isBlockElement = exports.areSameFormats = exports.parseFormat = exports.getRegularSelectionOffsets = exports.tableProcessor = exports.entityProcessor = exports.processChildNode = exports.handleRegularSelection = exports.childProcessor = exports.contentModelToText = exports.contentModelToDom = exports.domToContentModel = void 0;
20148
+ exports.extractClipboardItems = exports.transformColor = exports.readFile = exports.parseTableCells = exports.normalizeText = exports.isSpace = exports.isPunctuation = exports.extractBorderValues = exports.combineBorderValue = exports.isCursorMovingKey = exports.isModifierKey = exports.isCharacterValue = exports.getDOMInsertPointRect = exports.getSelectionRootNode = exports.isBold = exports.createModelToDomConfig = exports.createModelToDomContextWithConfig = exports.createModelToDomContext = exports.createDomToModelConfig = exports.createDomToModelContextWithConfig = exports.createDomToModelContext = exports.defaultGenerateColorKey = exports.parseColor = exports.setColor = exports.getColor = exports.DeprecatedColors = exports.BorderKeys = exports.parseValueWithUnit = exports.getAutoListStyleType = exports.getOrderedListNumberStr = exports.setParagraphNotImplicit = exports.normalizeSingleSegment = exports.isEmpty = exports.addSegment = exports.unwrapBlock = exports.isGeneralSegment = exports.normalizeContentModel = exports.normalizeParagraph = exports.addTextSegment = exports.addLink = exports.addCode = exports.addBlock = exports.mutateSegment = exports.mutateSegments = exports.mutateBlock = exports.createTableRow = exports.createEmptyModel = exports.createListLevel = exports.createDivider = exports.createEntity = void 0;
20149
+ exports.EmptySegmentFormat = exports.UnorderedListStyleMap = exports.OrderedListStyleMap = exports.TableBorderFormat = exports.NumberingListType = exports.BulletListType = exports.ChangeSource = exports.ListMetadataDefinition = exports.getListMetadata = exports.updateListMetadata = exports.getTableMetadata = exports.updateTableMetadata = exports.getTableCellMetadata = exports.updateTableCellMetadata = exports.getImageMetadata = exports.updateImageMetadata = exports.runEditSteps = exports.getClosestAncestorBlockGroupIndex = exports.getSegmentTextFormat = exports.getListStyleTypeFromString = exports.retrieveModelFormatState = exports.setTableCellBackgroundColor = exports.MIN_ALLOWED_TABLE_CELL_HEIGHT = exports.MIN_ALLOWED_TABLE_CELL_WIDTH = exports.normalizeTable = exports.setFirstColumnFormatBorders = exports.applyTableFormat = exports.deleteBlock = exports.deleteSegment = exports.deleteSelection = exports.mergeModel = exports.cloneModel = exports.setSelection = exports.hasSelectionInBlockGroup = exports.hasSelectionInSegment = exports.hasSelectionInBlock = exports.getSelectedCells = exports.getSelectedSegmentsAndParagraphs = exports.getSelectedSegments = exports.getSelectedParagraphs = exports.getOperationalBlocks = exports.getFirstSelectedTable = exports.getFirstSelectedListItem = exports.iterateSelections = exports.isBlockGroupOfType = exports.cacheGetEventData = void 0;
20064
20150
  var domToContentModel_1 = __webpack_require__(/*! ./domToModel/domToContentModel */ "./packages/roosterjs-content-model-dom/lib/domToModel/domToContentModel.ts");
20065
20151
  Object.defineProperty(exports, "domToContentModel", ({ enumerable: true, get: function () { return domToContentModel_1.domToContentModel; } }));
20066
20152
  var contentModelToDom_1 = __webpack_require__(/*! ./modelToDom/contentModelToDom */ "./packages/roosterjs-content-model-dom/lib/modelToDom/contentModelToDom.ts");
@@ -20095,6 +20181,8 @@ var isElementOfType_1 = __webpack_require__(/*! ./domUtils/isElementOfType */ ".
20095
20181
  Object.defineProperty(exports, "isElementOfType", ({ enumerable: true, get: function () { return isElementOfType_1.isElementOfType; } }));
20096
20182
  var getObjectKeys_1 = __webpack_require__(/*! ./domUtils/getObjectKeys */ "./packages/roosterjs-content-model-dom/lib/domUtils/getObjectKeys.ts");
20097
20183
  Object.defineProperty(exports, "getObjectKeys", ({ enumerable: true, get: function () { return getObjectKeys_1.getObjectKeys; } }));
20184
+ var getSafeIdSelector_1 = __webpack_require__(/*! ./domUtils/getSafeIdSelector */ "./packages/roosterjs-content-model-dom/lib/domUtils/getSafeIdSelector.ts");
20185
+ Object.defineProperty(exports, "getSafeIdSelector", ({ enumerable: true, get: function () { return getSafeIdSelector_1.getSafeIdSelector; } }));
20098
20186
  var toArray_1 = __webpack_require__(/*! ./domUtils/toArray */ "./packages/roosterjs-content-model-dom/lib/domUtils/toArray.ts");
20099
20187
  Object.defineProperty(exports, "toArray", ({ enumerable: true, get: function () { return toArray_1.toArray; } }));
20100
20188
  var moveChildNodes_1 = __webpack_require__(/*! ./domUtils/moveChildNodes */ "./packages/roosterjs-content-model-dom/lib/domUtils/moveChildNodes.ts");
@@ -29226,7 +29314,7 @@ var ImageEditPlugin = /** @class */ (function () {
29226
29314
  this.croppers = croppers;
29227
29315
  this.zoomScale = editor.getDOMHelper().calculateZoomScale();
29228
29316
  editor.setEditorStyle('imageEdit', "outline-style:none!important;", [
29229
- "span:has(>img#" + this.selectedImage.id + ")",
29317
+ "span:has(>img" + (0, roosterjs_content_model_dom_1.getSafeIdSelector)(this.selectedImage.id) + ")",
29230
29318
  ]);
29231
29319
  };
29232
29320
  ImageEditPlugin.prototype.startRotateAndResize = function (editor, image) {