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.
@@ -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
 
@@ -3466,7 +3466,11 @@ export type ExperimentalFeature = /**
3466
3466
  * When this feature is enabled, we will persist a content model in memory as long as we can,
3467
3467
  * and use cached element when write back if it is not changed.
3468
3468
  */
3469
- 'PersistCache';
3469
+ 'PersistCache'
3470
+ /**
3471
+ * Workaround for the Legacy Image Edit
3472
+ */
3473
+ | 'LegacyImageSelection';
3470
3474
 
3471
3475
  /**
3472
3476
  * Options for editor
@@ -3554,9 +3558,9 @@ export interface PasteOptions {
3554
3558
  */
3555
3559
  allowedCustomPasteType?: string[];
3556
3560
  /**
3557
- * Default paste type. By default will use the normal (as-is) paste type.
3561
+ * Default paste type or function that returns the paste type. By default will use the normal (as-is) paste type.
3558
3562
  */
3559
- defaultPasteType?: PasteType;
3563
+ defaultPasteType?: PasteTypeOrGetter;
3560
3564
  }
3561
3565
 
3562
3566
  /**
@@ -4106,7 +4110,7 @@ export interface CopyPastePluginState {
4106
4110
  /**
4107
4111
  * Default paste type. By default will use the normal (as-is) paste type.
4108
4112
  */
4109
- defaultPasteType?: PasteType;
4113
+ defaultPasteType?: PasteTypeOrGetter;
4110
4114
  }
4111
4115
 
4112
4116
  /**
@@ -4664,6 +4668,12 @@ export interface ContentModelFormatState {
4664
4668
  isDarkMode?: boolean;
4665
4669
  }
4666
4670
 
4671
+ /**
4672
+ * Represents the PasteType parameter used to set the paste type to use.
4673
+ * It can be either the Paste Type value or a callback that retuns the Paste Type to use.
4674
+ */
4675
+ export type PasteTypeOrGetter = PasteType | ((document: Document | null, clipboardData: ClipboardData) => PasteType);
4676
+
4667
4677
  /**
4668
4678
  * Image Format
4669
4679
  */
@@ -5046,6 +5056,11 @@ export interface AnnounceData {
5046
5056
  * @optional if provided, will attempt to replace {n} with each of the values inside of the array.
5047
5057
  */
5048
5058
  formatStrings?: string[];
5059
+ /**
5060
+ * @optional if provided, will set the ariaLive property of the announce container element to the provided value.
5061
+ * @see https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-live#values
5062
+ */
5063
+ ariaLiveMode?: 'assertive' | 'polite' | 'off';
5049
5064
  }
5050
5065
 
5051
5066
  /**
@@ -6195,6 +6210,15 @@ export function isElementOfType<Tag extends keyof HTMLElementTagNameMap>(element
6195
6210
  */
6196
6211
  export function getObjectKeys<T extends string | number | symbol>(obj: Record<T, any> | Partial<Record<T, any>>): T[];
6197
6212
 
6213
+ /**
6214
+ * Returns a safe Id to use in Native APIs.
6215
+ * IDs that start with number or hyphen can throw errors if used.
6216
+ * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/id
6217
+ * @param id
6218
+ * @returns
6219
+ */
6220
+ export function getSafeIdSelector(id: string): string;
6221
+
6198
6222
  /**
6199
6223
  * Convert a named node map to an array
6200
6224
  * @param collection The map to convert
@@ -7738,9 +7762,9 @@ export function redo(editor: IEditor): void;
7738
7762
  * Paste into editor using a clipboardData object
7739
7763
  * @param editor The Editor object.
7740
7764
  * @param clipboardData Clipboard data retrieved from clipboard
7741
- * @param pasteType Type of content to paste. @default normal
7765
+ * @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
7742
7766
  */
7743
- export function paste(editor: IEditor, clipboardData: ClipboardData, pasteType?: PasteType): void;
7767
+ export function paste(editor: IEditor, clipboardData: ClipboardData, pasteTypeOrGetter?: PasteTypeOrGetter): void;
7744
7768
 
7745
7769
  /**
7746
7770
  * Insert table into editor at current selection
@@ -7859,11 +7859,11 @@ var retrieveHtmlInfo_1 = __webpack_require__(/*! ./retrieveHtmlInfo */ "./packag
7859
7859
  * Paste into editor using a clipboardData object
7860
7860
  * @param editor The Editor object.
7861
7861
  * @param clipboardData Clipboard data retrieved from clipboard
7862
- * @param pasteType Type of content to paste. @default normal
7862
+ * @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
7863
7863
  */
7864
- function paste(editor, clipboardData, pasteType) {
7864
+ function paste(editor, clipboardData, pasteTypeOrGetter) {
7865
7865
  var _a;
7866
- if (pasteType === void 0) { pasteType = 'normal'; }
7866
+ if (pasteTypeOrGetter === void 0) { pasteTypeOrGetter = 'normal'; }
7867
7867
  editor.focus();
7868
7868
  var trustedHTMLHandler = editor.getTrustedHTMLHandler();
7869
7869
  if (!clipboardData.modelBeforePaste) {
@@ -7874,6 +7874,9 @@ function paste(editor, clipboardData, pasteType) {
7874
7874
  }
7875
7875
  // 1. Prepare variables
7876
7876
  var doc = createDOMFromHtml(clipboardData.rawHtml, trustedHTMLHandler);
7877
+ var pasteType = typeof pasteTypeOrGetter == 'function'
7878
+ ? pasteTypeOrGetter(doc, clipboardData)
7879
+ : pasteTypeOrGetter;
7877
7880
  // 2. Handle HTML from clipboard
7878
7881
  var htmlFromClipboard = (0, retrieveHtmlInfo_1.retrieveHtmlInfo)(doc, clipboardData);
7879
7882
  // 3. Create target fragment
@@ -8326,7 +8329,7 @@ var DOT_STRING = '.';
8326
8329
  * @param announceData Data to announce
8327
8330
  */
8328
8331
  var announce = function (core, announceData) {
8329
- var text = announceData.text, defaultStrings = announceData.defaultStrings, _a = announceData.formatStrings, formatStrings = _a === void 0 ? [] : _a;
8332
+ var text = announceData.text, defaultStrings = announceData.defaultStrings, _a = announceData.formatStrings, formatStrings = _a === void 0 ? [] : _a, _b = announceData.ariaLiveMode, ariaLiveMode = _b === void 0 ? 'assertive' : _b;
8330
8333
  var announcerStringGetter = core.lifecycle.announcerStringGetter;
8331
8334
  var template = defaultStrings && (announcerStringGetter === null || announcerStringGetter === void 0 ? void 0 : announcerStringGetter(defaultStrings));
8332
8335
  var textToAnnounce = formatString(template || text, formatStrings);
@@ -8335,6 +8338,9 @@ var announce = function (core, announceData) {
8335
8338
  }
8336
8339
  if (textToAnnounce && core.lifecycle.announceContainer) {
8337
8340
  var announceContainer = core.lifecycle.announceContainer;
8341
+ if (announceContainer.ariaLive != ariaLiveMode) {
8342
+ announceContainer.ariaLive = ariaLiveMode;
8343
+ }
8338
8344
  if (textToAnnounce == announceContainer.textContent) {
8339
8345
  textToAnnounce += DOT_STRING;
8340
8346
  }
@@ -9089,6 +9095,7 @@ exports.restoreSnapshotLogicalRoot = restoreSnapshotLogicalRoot;
9089
9095
  Object.defineProperty(exports, "__esModule", ({ value: true }));
9090
9096
  exports.restoreSnapshotSelection = void 0;
9091
9097
  var getPositionFromPath_1 = __webpack_require__(/*! ./getPositionFromPath */ "./packages/roosterjs-content-model-core/lib/coreApi/restoreUndoSnapshot/getPositionFromPath.ts");
9098
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
9092
9099
  /**
9093
9100
  * @internal
9094
9101
  */
@@ -9113,7 +9120,7 @@ function restoreSnapshotSelection(core, snapshot) {
9113
9120
  };
9114
9121
  break;
9115
9122
  case 'table':
9116
- var table = physicalRoot.querySelector('#' + snapshotSelection.tableId);
9123
+ var table = physicalRoot.querySelector((0, roosterjs_content_model_dom_1.getSafeIdSelector)(snapshotSelection.tableId));
9117
9124
  if (table) {
9118
9125
  domSelection = {
9119
9126
  type: 'table',
@@ -9126,7 +9133,7 @@ function restoreSnapshotSelection(core, snapshot) {
9126
9133
  }
9127
9134
  break;
9128
9135
  case 'image':
9129
- var image = physicalRoot.querySelector('#' + snapshotSelection.imageId);
9136
+ var image = physicalRoot.querySelector((0, roosterjs_content_model_dom_1.getSafeIdSelector)(snapshotSelection.imageId));
9130
9137
  if (image) {
9131
9138
  domSelection = {
9132
9139
  type: 'image',
@@ -9417,7 +9424,7 @@ var setDOMSelection = function (core, selection, skipSelectionChangedEvent) {
9417
9424
  var imageSelectionColor = isDarkMode
9418
9425
  ? core.selection.imageSelectionBorderColorDark
9419
9426
  : core.selection.imageSelectionBorderColor;
9420
- 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)]);
9427
+ 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))]);
9421
9428
  core.api.setEditorStyle(core, HIDE_SELECTION_CSS_KEY, TRANSPARENT_SELECTION_CSS_RULE, [SELECTION_SELECTOR]);
9422
9429
  setRangeSelection(doc, image, false /* collapse */);
9423
9430
  break;
@@ -9450,12 +9457,13 @@ var setDOMSelection = function (core, selection, skipSelectionChangedEvent) {
9450
9457
  lastColumn: lastCell.col,
9451
9458
  };
9452
9459
  var tableId = (0, ensureUniqueId_1.ensureUniqueId)(table, TABLE_ID);
9460
+ var tableSelector = (0, roosterjs_content_model_dom_1.getSafeIdSelector)(tableId);
9453
9461
  var tableSelectors = firstCell.row == 0 &&
9454
9462
  firstCell.col == 0 &&
9455
9463
  lastCell.row == parsedTable.length - 1 &&
9456
9464
  lastCell.col == ((_b = (_a = parsedTable[lastCell.row]) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) - 1
9457
- ? ["#" + tableId, "#" + tableId + " *"]
9458
- : handleTableSelected(parsedTable, tableId, table, firstCell, lastCell);
9465
+ ? [tableSelector, tableSelector + " *"]
9466
+ : handleTableSelected(parsedTable, tableSelector, table, firstCell, lastCell);
9459
9467
  core.selection.selection = selection;
9460
9468
  var tableSelectionColor = isDarkMode
9461
9469
  ? core.selection.tableCellSelectionBackgroundColorDark
@@ -9488,7 +9496,7 @@ var setDOMSelection = function (core, selection, skipSelectionChangedEvent) {
9488
9496
  }
9489
9497
  };
9490
9498
  exports.setDOMSelection = setDOMSelection;
9491
- function handleTableSelected(parsedTable, tableId, table, firstCell, lastCell) {
9499
+ function handleTableSelected(parsedTable, tableSelector, table, firstCell, lastCell) {
9492
9500
  var selectors = [];
9493
9501
  // Get whether table has thead, tbody or tfoot, then Set the start and end of each of the table children,
9494
9502
  // so we can build the selector according the element between the table and the row.
@@ -9522,7 +9530,7 @@ function handleTableSelected(parsedTable, tableId, table, firstCell, lastCell) {
9522
9530
  rowIndex <= lastCell.row &&
9523
9531
  cellIndex >= firstCell.col &&
9524
9532
  cellIndex <= lastCell.col) {
9525
- var selector = "#" + tableId + middleElSelector + " tr:nth-child(" + currentRow + ")>" + cell.tagName + ":nth-child(" + tdCount + ")";
9533
+ var selector = "" + tableSelector + middleElSelector + " tr:nth-child(" + currentRow + ")>" + cell.tagName + ":nth-child(" + tdCount + ")";
9526
9534
  selectors.push(selector, selector + ' *');
9527
9535
  }
9528
9536
  }
@@ -9559,12 +9567,13 @@ function setRangeSelection(doc, element, collapse) {
9559
9567
  /*!********************************************************************************************!*\
9560
9568
  !*** ./packages/roosterjs-content-model-core/lib/coreApi/setEditorStyle/ensureUniqueId.ts ***!
9561
9569
  \********************************************************************************************/
9562
- /***/ ((__unused_webpack_module, exports) => {
9570
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
9563
9571
 
9564
9572
  "use strict";
9565
9573
 
9566
9574
  Object.defineProperty(exports, "__esModule", ({ value: true }));
9567
9575
  exports.ensureUniqueId = void 0;
9576
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
9568
9577
  /**
9569
9578
  * @internal
9570
9579
  */
@@ -9572,7 +9581,7 @@ function ensureUniqueId(element, idPrefix) {
9572
9581
  idPrefix = element.id || idPrefix;
9573
9582
  var doc = element.ownerDocument;
9574
9583
  var i = 0;
9575
- while (!element.id || doc.querySelectorAll("[id=\"" + element.id + "\"]").length > 1) {
9584
+ while (!element.id || doc.querySelectorAll((0, roosterjs_content_model_dom_1.getSafeIdSelector)(element.id)).length > 1) {
9576
9585
  element.id = idPrefix + '_' + i++;
9577
9586
  }
9578
9587
  return element.id;
@@ -9593,6 +9602,7 @@ exports.ensureUniqueId = ensureUniqueId;
9593
9602
  Object.defineProperty(exports, "__esModule", ({ value: true }));
9594
9603
  exports.setEditorStyle = void 0;
9595
9604
  var ensureUniqueId_1 = __webpack_require__(/*! ./ensureUniqueId */ "./packages/roosterjs-content-model-core/lib/coreApi/setEditorStyle/ensureUniqueId.ts");
9605
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
9596
9606
  var MAX_RULE_SELECTOR_LENGTH = 9000;
9597
9607
  var CONTENT_DIV_ID = 'contentDiv';
9598
9608
  /**
@@ -9614,7 +9624,7 @@ var setEditorStyle = function (core, key, cssRule, subSelectors, maxRuleLength)
9614
9624
  sheet.deleteRule(i);
9615
9625
  }
9616
9626
  if (cssRule) {
9617
- var rootSelector = '#' + (0, ensureUniqueId_1.ensureUniqueId)(core.physicalRoot, CONTENT_DIV_ID);
9627
+ var rootSelector = (0, roosterjs_content_model_dom_1.getSafeIdSelector)((0, ensureUniqueId_1.ensureUniqueId)(core.physicalRoot, CONTENT_DIV_ID));
9618
9628
  var selectors = !subSelectors
9619
9629
  ? [rootSelector]
9620
9630
  : typeof subSelectors === 'string'
@@ -12420,6 +12430,7 @@ var isSingleImageInSelection_1 = __webpack_require__(/*! ./isSingleImageInSelect
12420
12430
  var normalizePos_1 = __webpack_require__(/*! ./normalizePos */ "./packages/roosterjs-content-model-core/lib/corePlugin/selection/normalizePos.ts");
12421
12431
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
12422
12432
  var MouseLeftButton = 0;
12433
+ var MouseMiddleButton = 1;
12423
12434
  var MouseRightButton = 2;
12424
12435
  var Up = 'ArrowUp';
12425
12436
  var Down = 'ArrowDown';
@@ -12626,7 +12637,7 @@ var SelectionPlugin = /** @class */ (function () {
12626
12637
  this.onMouseDown(this.editor, event.rawEvent);
12627
12638
  break;
12628
12639
  case 'mouseUp':
12629
- this.onMouseUp();
12640
+ this.onMouseUp(this.editor, event);
12630
12641
  break;
12631
12642
  case 'keyDown':
12632
12643
  this.onKeyDown(this.editor, event.rawEvent);
@@ -12642,25 +12653,40 @@ var SelectionPlugin = /** @class */ (function () {
12642
12653
  }
12643
12654
  };
12644
12655
  SelectionPlugin.prototype.onMouseDown = function (editor, rawEvent) {
12645
- var _a;
12656
+ var _a, _b;
12646
12657
  var selection = editor.getDOMSelection();
12647
12658
  var image;
12648
12659
  // Image selection
12649
- if ((selection === null || selection === void 0 ? void 0 : selection.type) == 'image' &&
12650
- (rawEvent.button == MouseLeftButton ||
12651
- (rawEvent.button == MouseRightButton &&
12652
- !this.getClickingImage(rawEvent) &&
12653
- !this.getContainedTargetImage(rawEvent, selection)))) {
12654
- this.setDOMSelection(null /*domSelection*/, null /*tableSelection*/);
12660
+ if (editor.isExperimentalFeatureEnabled('LegacyImageSelection')) {
12661
+ if (rawEvent.button === MouseRightButton &&
12662
+ (image =
12663
+ (_a = this.getClickingImage(rawEvent)) !== null && _a !== void 0 ? _a : this.getContainedTargetImage(rawEvent, selection)) &&
12664
+ image.isContentEditable) {
12665
+ this.selectImageWithRange(image, rawEvent);
12666
+ return;
12667
+ }
12668
+ else if ((selection === null || selection === void 0 ? void 0 : selection.type) == 'image' && selection.image !== rawEvent.target) {
12669
+ this.selectBeforeOrAfterElement(editor, selection.image);
12670
+ return;
12671
+ }
12655
12672
  }
12656
- if ((image =
12657
- (_a = this.getClickingImage(rawEvent)) !== null && _a !== void 0 ? _a : this.getContainedTargetImage(rawEvent, selection)) &&
12658
- image.isContentEditable) {
12659
- this.setDOMSelection({
12660
- type: 'image',
12661
- image: image,
12662
- }, null);
12663
- return;
12673
+ else {
12674
+ if ((selection === null || selection === void 0 ? void 0 : selection.type) == 'image' &&
12675
+ (rawEvent.button == MouseLeftButton ||
12676
+ (rawEvent.button == MouseRightButton &&
12677
+ !this.getClickingImage(rawEvent) &&
12678
+ !this.getContainedTargetImage(rawEvent, selection)))) {
12679
+ this.setDOMSelection(null /*domSelection*/, null /*tableSelection*/);
12680
+ }
12681
+ if ((image =
12682
+ (_b = this.getClickingImage(rawEvent)) !== null && _b !== void 0 ? _b : this.getContainedTargetImage(rawEvent, selection)) &&
12683
+ image.isContentEditable) {
12684
+ this.setDOMSelection({
12685
+ type: 'image',
12686
+ image: image,
12687
+ }, null);
12688
+ return;
12689
+ }
12664
12690
  }
12665
12691
  // Table selection
12666
12692
  if ((selection === null || selection === void 0 ? void 0 : selection.type) == 'table' && rawEvent.button == MouseLeftButton) {
@@ -12688,7 +12714,33 @@ var SelectionPlugin = /** @class */ (function () {
12688
12714
  });
12689
12715
  }
12690
12716
  };
12691
- SelectionPlugin.prototype.onMouseUp = function () {
12717
+ SelectionPlugin.prototype.selectImageWithRange = function (image, event) {
12718
+ var _a;
12719
+ var range = image.ownerDocument.createRange();
12720
+ range.selectNode(image);
12721
+ var domSelection = (_a = this.editor) === null || _a === void 0 ? void 0 : _a.getDOMSelection();
12722
+ if ((domSelection === null || domSelection === void 0 ? void 0 : domSelection.type) == 'image' && image == domSelection.image) {
12723
+ event.preventDefault();
12724
+ }
12725
+ else {
12726
+ this.setDOMSelection({
12727
+ type: 'range',
12728
+ isReverted: false,
12729
+ range: range,
12730
+ }, null);
12731
+ }
12732
+ };
12733
+ SelectionPlugin.prototype.onMouseUp = function (editor, event) {
12734
+ var image;
12735
+ if (editor.isExperimentalFeatureEnabled('LegacyImageSelection') &&
12736
+ (image = this.getClickingImage(event.rawEvent)) &&
12737
+ image.isContentEditable &&
12738
+ event.rawEvent.button != MouseMiddleButton &&
12739
+ (event.rawEvent.button ==
12740
+ MouseRightButton /* it's not possible to drag using right click */ ||
12741
+ event.isClicking)) {
12742
+ this.selectImageWithRange(image, event.rawEvent);
12743
+ }
12692
12744
  this.detachMouseEvent();
12693
12745
  };
12694
12746
  SelectionPlugin.prototype.onKeyDown = function (editor, rawEvent) {
@@ -17342,6 +17394,40 @@ function getObjectKeys(obj) {
17342
17394
  exports.getObjectKeys = getObjectKeys;
17343
17395
 
17344
17396
 
17397
+ /***/ }),
17398
+
17399
+ /***/ "./packages/roosterjs-content-model-dom/lib/domUtils/getSafeIdSelector.ts":
17400
+ /*!********************************************************************************!*\
17401
+ !*** ./packages/roosterjs-content-model-dom/lib/domUtils/getSafeIdSelector.ts ***!
17402
+ \********************************************************************************/
17403
+ /***/ ((__unused_webpack_module, exports) => {
17404
+
17405
+ "use strict";
17406
+
17407
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
17408
+ exports.getSafeIdSelector = void 0;
17409
+ var StartsWithUnsupportedCharacter = /^[.|\-|_|\d]/;
17410
+ /**
17411
+ * Returns a safe Id to use in Native APIs.
17412
+ * IDs that start with number or hyphen can throw errors if used.
17413
+ * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/id
17414
+ * @param id
17415
+ * @returns
17416
+ */
17417
+ function getSafeIdSelector(id) {
17418
+ if (!id) {
17419
+ return id;
17420
+ }
17421
+ if (id.match(StartsWithUnsupportedCharacter)) {
17422
+ return "[id=\"" + id + "\"]";
17423
+ }
17424
+ else {
17425
+ return "#" + id;
17426
+ }
17427
+ }
17428
+ exports.getSafeIdSelector = getSafeIdSelector;
17429
+
17430
+
17345
17431
  /***/ }),
17346
17432
 
17347
17433
  /***/ "./packages/roosterjs-content-model-dom/lib/domUtils/isElementOfType.ts":
@@ -20057,9 +20143,9 @@ exports.shouldSetValue = shouldSetValue;
20057
20143
  "use strict";
20058
20144
 
20059
20145
  Object.defineProperty(exports, "__esModule", ({ value: true }));
20060
- 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;
20061
- 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;
20062
- 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;
20146
+ 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;
20147
+ 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;
20148
+ 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;
20063
20149
  var domToContentModel_1 = __webpack_require__(/*! ./domToModel/domToContentModel */ "./packages/roosterjs-content-model-dom/lib/domToModel/domToContentModel.ts");
20064
20150
  Object.defineProperty(exports, "domToContentModel", ({ enumerable: true, get: function () { return domToContentModel_1.domToContentModel; } }));
20065
20151
  var contentModelToDom_1 = __webpack_require__(/*! ./modelToDom/contentModelToDom */ "./packages/roosterjs-content-model-dom/lib/modelToDom/contentModelToDom.ts");
@@ -20094,6 +20180,8 @@ var isElementOfType_1 = __webpack_require__(/*! ./domUtils/isElementOfType */ ".
20094
20180
  Object.defineProperty(exports, "isElementOfType", ({ enumerable: true, get: function () { return isElementOfType_1.isElementOfType; } }));
20095
20181
  var getObjectKeys_1 = __webpack_require__(/*! ./domUtils/getObjectKeys */ "./packages/roosterjs-content-model-dom/lib/domUtils/getObjectKeys.ts");
20096
20182
  Object.defineProperty(exports, "getObjectKeys", ({ enumerable: true, get: function () { return getObjectKeys_1.getObjectKeys; } }));
20183
+ var getSafeIdSelector_1 = __webpack_require__(/*! ./domUtils/getSafeIdSelector */ "./packages/roosterjs-content-model-dom/lib/domUtils/getSafeIdSelector.ts");
20184
+ Object.defineProperty(exports, "getSafeIdSelector", ({ enumerable: true, get: function () { return getSafeIdSelector_1.getSafeIdSelector; } }));
20097
20185
  var toArray_1 = __webpack_require__(/*! ./domUtils/toArray */ "./packages/roosterjs-content-model-dom/lib/domUtils/toArray.ts");
20098
20186
  Object.defineProperty(exports, "toArray", ({ enumerable: true, get: function () { return toArray_1.toArray; } }));
20099
20187
  var moveChildNodes_1 = __webpack_require__(/*! ./domUtils/moveChildNodes */ "./packages/roosterjs-content-model-dom/lib/domUtils/moveChildNodes.ts");
@@ -29225,7 +29313,7 @@ var ImageEditPlugin = /** @class */ (function () {
29225
29313
  this.croppers = croppers;
29226
29314
  this.zoomScale = editor.getDOMHelper().calculateZoomScale();
29227
29315
  editor.setEditorStyle('imageEdit', "outline-style:none!important;", [
29228
- "span:has(>img#" + this.selectedImage.id + ")",
29316
+ "span:has(>img" + (0, roosterjs_content_model_dom_1.getSafeIdSelector)(this.selectedImage.id) + ")",
29229
29317
  ]);
29230
29318
  };
29231
29319
  ImageEditPlugin.prototype.startRotateAndResize = function (editor, image) {