roosterjs 9.57.0 → 9.58.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
@@ -1247,12 +1247,13 @@ module.exports = {
1247
1247
  /* MIT license */
1248
1248
  var colorNames = __webpack_require__(/*! color-name */ "./node_modules/color-name/index.js");
1249
1249
  var swizzle = __webpack_require__(/*! simple-swizzle */ "./node_modules/simple-swizzle/index.js");
1250
+ var hasOwnProperty = Object.hasOwnProperty;
1250
1251
 
1251
- var reverseNames = {};
1252
+ var reverseNames = Object.create(null);
1252
1253
 
1253
1254
  // create a list of reverse color names
1254
1255
  for (var name in colorNames) {
1255
- if (colorNames.hasOwnProperty(name)) {
1256
+ if (hasOwnProperty.call(colorNames, name)) {
1256
1257
  reverseNames[colorNames[name]] = name;
1257
1258
  }
1258
1259
  }
@@ -1295,9 +1296,9 @@ cs.get.rgb = function (string) {
1295
1296
 
1296
1297
  var abbr = /^#([a-f0-9]{3,4})$/i;
1297
1298
  var hex = /^#([a-f0-9]{6})([a-f0-9]{2})?$/i;
1298
- var rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/;
1299
- var per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/;
1300
- var keyword = /(\D+)/;
1299
+ var rgba = /^rgba?\(\s*([+-]?\d+)(?=[\s,])\s*(?:,\s*)?([+-]?\d+)(?=[\s,])\s*(?:,\s*)?([+-]?\d+)\s*(?:[,|\/]\s*([+-]?[\d\.]+)(%?)\s*)?\)$/;
1300
+ var per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,?\s*([+-]?[\d\.]+)\%\s*,?\s*([+-]?[\d\.]+)\%\s*(?:[,|\/]\s*([+-]?[\d\.]+)(%?)\s*)?\)$/;
1301
+ var keyword = /^(\w+)$/;
1301
1302
 
1302
1303
  var rgb = [0, 0, 0, 1];
1303
1304
  var match;
@@ -1334,7 +1335,11 @@ cs.get.rgb = function (string) {
1334
1335
  }
1335
1336
 
1336
1337
  if (match[4]) {
1337
- rgb[3] = parseFloat(match[4]);
1338
+ if (match[5]) {
1339
+ rgb[3] = parseFloat(match[4]) * 0.01;
1340
+ } else {
1341
+ rgb[3] = parseFloat(match[4]);
1342
+ }
1338
1343
  }
1339
1344
  } else if (match = string.match(per)) {
1340
1345
  for (i = 0; i < 3; i++) {
@@ -1342,19 +1347,22 @@ cs.get.rgb = function (string) {
1342
1347
  }
1343
1348
 
1344
1349
  if (match[4]) {
1345
- rgb[3] = parseFloat(match[4]);
1350
+ if (match[5]) {
1351
+ rgb[3] = parseFloat(match[4]) * 0.01;
1352
+ } else {
1353
+ rgb[3] = parseFloat(match[4]);
1354
+ }
1346
1355
  }
1347
1356
  } else if (match = string.match(keyword)) {
1348
1357
  if (match[1] === 'transparent') {
1349
1358
  return [0, 0, 0, 0];
1350
1359
  }
1351
1360
 
1352
- rgb = colorNames[match[1]];
1353
-
1354
- if (!rgb) {
1361
+ if (!hasOwnProperty.call(colorNames, match[1])) {
1355
1362
  return null;
1356
1363
  }
1357
1364
 
1365
+ rgb = colorNames[match[1]];
1358
1366
  rgb[3] = 1;
1359
1367
 
1360
1368
  return rgb;
@@ -1375,12 +1383,12 @@ cs.get.hsl = function (string) {
1375
1383
  return null;
1376
1384
  }
1377
1385
 
1378
- var hsl = /^hsla?\(\s*([+-]?(?:\d{0,3}\.)?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/;
1386
+ var hsl = /^hsla?\(\s*([+-]?(?:\d{0,3}\.)?\d+)(?:deg)?\s*,?\s*([+-]?[\d\.]+)%\s*,?\s*([+-]?[\d\.]+)%\s*(?:[,|\/]\s*([+-]?(?=\.\d|\d)(?:0|[1-9]\d*)?(?:\.\d*)?(?:[eE][+-]?\d+)?)\s*)?\)$/;
1379
1387
  var match = string.match(hsl);
1380
1388
 
1381
1389
  if (match) {
1382
1390
  var alpha = parseFloat(match[4]);
1383
- var h = (parseFloat(match[1]) + 360) % 360;
1391
+ var h = ((parseFloat(match[1]) % 360) + 360) % 360;
1384
1392
  var s = clamp(parseFloat(match[2]), 0, 100);
1385
1393
  var l = clamp(parseFloat(match[3]), 0, 100);
1386
1394
  var a = clamp(isNaN(alpha) ? 1 : alpha, 0, 1);
@@ -1396,7 +1404,7 @@ cs.get.hwb = function (string) {
1396
1404
  return null;
1397
1405
  }
1398
1406
 
1399
- var hwb = /^hwb\(\s*([+-]?\d{0,3}(?:\.\d+)?)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/;
1407
+ var hwb = /^hwb\(\s*([+-]?\d{0,3}(?:\.\d+)?)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?(?=\.\d|\d)(?:0|[1-9]\d*)?(?:\.\d*)?(?:[eE][+-]?\d+)?)\s*)?\)$/;
1400
1408
  var match = string.match(hwb);
1401
1409
 
1402
1410
  if (match) {
@@ -1475,7 +1483,7 @@ function clamp(num, min, max) {
1475
1483
  }
1476
1484
 
1477
1485
  function hexDouble(num) {
1478
- var str = num.toString(16).toUpperCase();
1486
+ var str = Math.round(num).toString(16).toUpperCase();
1479
1487
  return (str.length < 2) ? '0' + str : str;
1480
1488
  }
1481
1489
 
@@ -2043,6 +2051,7 @@ swizzle.wrap = function (fn) {
2043
2051
  "use strict";
2044
2052
  __webpack_require__.r(__webpack_exports__);
2045
2053
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2054
+ /* harmony export */ __addDisposableResource: () => (/* binding */ __addDisposableResource),
2046
2055
  /* harmony export */ __assign: () => (/* binding */ __assign),
2047
2056
  /* harmony export */ __asyncDelegator: () => (/* binding */ __asyncDelegator),
2048
2057
  /* harmony export */ __asyncGenerator: () => (/* binding */ __asyncGenerator),
@@ -2054,6 +2063,7 @@ __webpack_require__.r(__webpack_exports__);
2054
2063
  /* harmony export */ __classPrivateFieldSet: () => (/* binding */ __classPrivateFieldSet),
2055
2064
  /* harmony export */ __createBinding: () => (/* binding */ __createBinding),
2056
2065
  /* harmony export */ __decorate: () => (/* binding */ __decorate),
2066
+ /* harmony export */ __disposeResources: () => (/* binding */ __disposeResources),
2057
2067
  /* harmony export */ __esDecorate: () => (/* binding */ __esDecorate),
2058
2068
  /* harmony export */ __exportStar: () => (/* binding */ __exportStar),
2059
2069
  /* harmony export */ __extends: () => (/* binding */ __extends),
@@ -2066,6 +2076,7 @@ __webpack_require__.r(__webpack_exports__);
2066
2076
  /* harmony export */ __propKey: () => (/* binding */ __propKey),
2067
2077
  /* harmony export */ __read: () => (/* binding */ __read),
2068
2078
  /* harmony export */ __rest: () => (/* binding */ __rest),
2079
+ /* harmony export */ __rewriteRelativeImportExtension: () => (/* binding */ __rewriteRelativeImportExtension),
2069
2080
  /* harmony export */ __runInitializers: () => (/* binding */ __runInitializers),
2070
2081
  /* harmony export */ __setFunctionName: () => (/* binding */ __setFunctionName),
2071
2082
  /* harmony export */ __spread: () => (/* binding */ __spread),
@@ -2088,7 +2099,7 @@ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
2088
2099
  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
2089
2100
  PERFORMANCE OF THIS SOFTWARE.
2090
2101
  ***************************************************************************** */
2091
- /* global Reflect, Promise */
2102
+ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
2092
2103
 
2093
2104
  var extendStatics = function(d, b) {
2094
2105
  extendStatics = Object.setPrototypeOf ||
@@ -2199,8 +2210,8 @@ function __awaiter(thisArg, _arguments, P, generator) {
2199
2210
  }
2200
2211
 
2201
2212
  function __generator(thisArg, body) {
2202
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
2203
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
2213
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
2214
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
2204
2215
  function verb(n) { return function (v) { return step([n, v]); }; }
2205
2216
  function step(op) {
2206
2217
  if (f) throw new TypeError("Generator is already executing.");
@@ -2304,8 +2315,9 @@ function __await(v) {
2304
2315
  function __asyncGenerator(thisArg, _arguments, generator) {
2305
2316
  if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
2306
2317
  var g = generator.apply(thisArg, _arguments || []), i, q = [];
2307
- return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
2308
- function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
2318
+ return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
2319
+ function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
2320
+ function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
2309
2321
  function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
2310
2322
  function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
2311
2323
  function fulfill(value) { resume("next", value); }
@@ -2338,10 +2350,19 @@ var __setModuleDefault = Object.create ? (function(o, v) {
2338
2350
  o["default"] = v;
2339
2351
  };
2340
2352
 
2353
+ var ownKeys = function(o) {
2354
+ ownKeys = Object.getOwnPropertyNames || function (o) {
2355
+ var ar = [];
2356
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
2357
+ return ar;
2358
+ };
2359
+ return ownKeys(o);
2360
+ };
2361
+
2341
2362
  function __importStar(mod) {
2342
2363
  if (mod && mod.__esModule) return mod;
2343
2364
  var result = {};
2344
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
2365
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
2345
2366
  __setModuleDefault(result, mod);
2346
2367
  return result;
2347
2368
  }
@@ -2368,12 +2389,79 @@ function __classPrivateFieldIn(state, receiver) {
2368
2389
  return typeof state === "function" ? receiver === state : state.has(receiver);
2369
2390
  }
2370
2391
 
2392
+ function __addDisposableResource(env, value, async) {
2393
+ if (value !== null && value !== void 0) {
2394
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
2395
+ var dispose, inner;
2396
+ if (async) {
2397
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
2398
+ dispose = value[Symbol.asyncDispose];
2399
+ }
2400
+ if (dispose === void 0) {
2401
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
2402
+ dispose = value[Symbol.dispose];
2403
+ if (async) inner = dispose;
2404
+ }
2405
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
2406
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
2407
+ env.stack.push({ value: value, dispose: dispose, async: async });
2408
+ }
2409
+ else if (async) {
2410
+ env.stack.push({ async: true });
2411
+ }
2412
+ return value;
2413
+ }
2414
+
2415
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
2416
+ var e = new Error(message);
2417
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
2418
+ };
2419
+
2420
+ function __disposeResources(env) {
2421
+ function fail(e) {
2422
+ env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
2423
+ env.hasError = true;
2424
+ }
2425
+ var r, s = 0;
2426
+ function next() {
2427
+ while (r = env.stack.pop()) {
2428
+ try {
2429
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
2430
+ if (r.dispose) {
2431
+ var result = r.dispose.call(r.value);
2432
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
2433
+ }
2434
+ else s |= 1;
2435
+ }
2436
+ catch (e) {
2437
+ fail(e);
2438
+ }
2439
+ }
2440
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
2441
+ if (env.hasError) throw env.error;
2442
+ }
2443
+ return next();
2444
+ }
2445
+
2446
+ function __rewriteRelativeImportExtension(path, preserveJsx) {
2447
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
2448
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
2449
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
2450
+ });
2451
+ }
2452
+ return path;
2453
+ }
2454
+
2371
2455
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
2372
2456
  __extends,
2373
2457
  __assign,
2374
2458
  __rest,
2375
2459
  __decorate,
2376
2460
  __param,
2461
+ __esDecorate,
2462
+ __runInitializers,
2463
+ __propKey,
2464
+ __setFunctionName,
2377
2465
  __metadata,
2378
2466
  __awaiter,
2379
2467
  __generator,
@@ -2394,6 +2482,9 @@ function __classPrivateFieldIn(state, receiver) {
2394
2482
  __classPrivateFieldGet,
2395
2483
  __classPrivateFieldSet,
2396
2484
  __classPrivateFieldIn,
2485
+ __addDisposableResource,
2486
+ __disposeResources,
2487
+ __rewriteRelativeImportExtension,
2397
2488
  });
2398
2489
 
2399
2490
 
@@ -9234,95 +9325,6 @@ function removeCommentsFromHtml(html, marker, endId, startId) {
9234
9325
  }
9235
9326
 
9236
9327
 
9237
- /***/ },
9238
-
9239
- /***/ "./packages/roosterjs-content-model-core/lib/command/paste/createPasteFragment.ts"
9240
- /*!****************************************************************************************!*\
9241
- !*** ./packages/roosterjs-content-model-core/lib/command/paste/createPasteFragment.ts ***!
9242
- \****************************************************************************************/
9243
- (__unused_webpack_module, exports, __webpack_require__) {
9244
-
9245
- "use strict";
9246
-
9247
- Object.defineProperty(exports, "__esModule", ({ value: true }));
9248
- exports.createPasteFragment = void 0;
9249
- var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
9250
- var NBSP_HTML = '\u00A0';
9251
- var ENSP_HTML = '\u2002';
9252
- var TAB_SPACES = 6;
9253
- /**
9254
- * @internal
9255
- */
9256
- function createPasteFragment(document, clipboardData, pasteType, root) {
9257
- if (!clipboardData.text && pasteType === 'asPlainText' && root) {
9258
- clipboardData.text = root.textContent || clipboardData.text;
9259
- }
9260
- var imageDataUri = clipboardData.imageDataUri, text = clipboardData.text;
9261
- var fragment = document.createDocumentFragment();
9262
- if ((pasteType == 'asImage' && imageDataUri) ||
9263
- (pasteType != 'asPlainText' && !text && imageDataUri)) {
9264
- // Paste image
9265
- var img = document.createElement('img');
9266
- img.style.maxWidth = '100%';
9267
- img.src = imageDataUri;
9268
- fragment.appendChild(img);
9269
- }
9270
- else if (pasteType != 'asPlainText' && root) {
9271
- (0, roosterjs_content_model_dom_1.moveChildNodes)(fragment, root);
9272
- }
9273
- else if (text) {
9274
- text.split('\n').forEach(function (line, index, lines) {
9275
- line = line
9276
- .replace(/^ /g, NBSP_HTML)
9277
- .replace(/ $/g, NBSP_HTML)
9278
- .replace(/\r/g, '')
9279
- .replace(/ {2}/g, ' ' + NBSP_HTML);
9280
- if (line.includes('\t')) {
9281
- line = transformTabCharacters(line);
9282
- }
9283
- var textNode = document.createTextNode(line);
9284
- // There are 3 scenarios:
9285
- // 1. Single line: Paste as it is
9286
- // 2. Two lines: Add <br> between the lines
9287
- // 3. 3 or More lines, For first and last line, paste as it is. For middle lines, wrap with DIV, and add BR if it is empty line
9288
- if (lines.length == 2 && index == 0) {
9289
- // 1 of 2 lines scenario, add BR
9290
- fragment.appendChild(textNode);
9291
- fragment.appendChild(document.createElement('br'));
9292
- }
9293
- else if (index > 0 && index < lines.length - 1) {
9294
- // Middle line of >=3 lines scenario, wrap with DIV
9295
- fragment.appendChild((0, roosterjs_content_model_dom_1.wrap)(document, line == '' ? document.createElement('br') : textNode, 'div'));
9296
- }
9297
- else {
9298
- // All others, paste as it is
9299
- fragment.appendChild(textNode);
9300
- }
9301
- });
9302
- }
9303
- return fragment;
9304
- }
9305
- exports.createPasteFragment = createPasteFragment;
9306
- /**
9307
- * Transform \t characters into EN SPACE characters
9308
- * @param input string NOT containing \n characters
9309
- * @example t("\thello", 2) => "&ensp;&ensp;&ensp;&ensp;hello"
9310
- */
9311
- function transformTabCharacters(input, initialOffset) {
9312
- if (initialOffset === void 0) { initialOffset = 0; }
9313
- var line = input;
9314
- var tIndex;
9315
- while ((tIndex = line.indexOf('\t')) != -1) {
9316
- var lineBefore = line.slice(0, tIndex);
9317
- var lineAfter = line.slice(tIndex + 1);
9318
- var tabCount = TAB_SPACES - ((lineBefore.length + initialOffset) % TAB_SPACES);
9319
- var tabStr = Array(tabCount).fill(ENSP_HTML).join('');
9320
- line = lineBefore + tabStr + lineAfter;
9321
- }
9322
- return line;
9323
- }
9324
-
9325
-
9326
9328
  /***/ },
9327
9329
 
9328
9330
  /***/ "./packages/roosterjs-content-model-core/lib/command/paste/generatePasteOptionFromPlugins.ts"
@@ -9389,14 +9391,15 @@ var BlackColor = 'rgb(0,0,0)';
9389
9391
  */
9390
9392
  function mergePasteContent(editor, eventResult, isFirstPaste) {
9391
9393
  var fragment = eventResult.fragment, domToModelOption = eventResult.domToModelOption, customizedMerge = eventResult.customizedMerge, pasteType = eventResult.pasteType, clipboardData = eventResult.clipboardData, containsBlockElements = eventResult.containsBlockElements;
9392
- var shouldScrollCaretIntoView = !isImageOnlyFragment(fragment);
9394
+ var isImageOnly = isImageOnlyFragment(fragment);
9395
+ var shouldScrollCaretIntoView = !isImageOnly;
9393
9396
  editor.formatContentModel(function (model, context) {
9394
9397
  if (!isFirstPaste && clipboardData.modelBeforePaste) {
9395
9398
  var clonedModel = (0, roosterjs_content_model_dom_1.cloneModelForPaste)(clipboardData.modelBeforePaste);
9396
9399
  model.blocks = clonedModel.blocks;
9397
9400
  }
9398
9401
  var domToModelContext = (0, createDomToModelContextForSanitizing_1.createDomToModelContextForSanitizing)(editor.getDocument(), undefined /*defaultFormat*/, editor.getEnvironment().domToModelSettings.customized, domToModelOption, editor.getDOMHelper(), editor.getExperimentalFeatures());
9399
- domToModelContext.segmentFormat = getSegmentFormatForPaste(model, pasteType);
9402
+ domToModelContext.segmentFormat = getSegmentFormatForPaste(model, pasteType, isImageOnly);
9400
9403
  var pasteModel = (0, roosterjs_content_model_dom_1.domToContentModel)(fragment, domToModelContext);
9401
9404
  var mergeOption = {
9402
9405
  mergeFormat: pasteType == 'mergeFormat' ? 'keepSourceEmphasisFormat' : 'none',
@@ -9420,14 +9423,16 @@ function mergePasteContent(editor, eventResult, isFirstPaste) {
9420
9423
  });
9421
9424
  }
9422
9425
  exports.mergePasteContent = mergePasteContent;
9423
- function getSegmentFormatForPaste(model, pasteType) {
9426
+ function getSegmentFormatForPaste(model, pasteType, isImageOnly) {
9424
9427
  var selectedSegment = (0, roosterjs_content_model_dom_1.getSelectedSegments)(model, true /*includeFormatHolder*/)[0];
9425
9428
  if (selectedSegment) {
9426
9429
  var result = (0, roosterjs_content_model_dom_1.getSegmentTextFormat)(selectedSegment);
9427
- if (pasteType == 'normal') {
9430
+ if (pasteType == 'normal' && !isImageOnly) {
9428
9431
  // When using normal paste (Keep source formatting) set the default text color to black when creating the
9429
9432
  // Model from the clipboard content, so the elements that do not contain any text color in their style
9430
9433
  // Are set to black. Otherwise, These segments would get the selected segments format or the default text set in the content.
9434
+ // Skip this when pasting an image only, since there is no text to apply the default color to, and forcing
9435
+ // black here would incorrectly become the pending format used for text typed right after the pasted image.
9431
9436
  result.textColor = BlackColor;
9432
9437
  }
9433
9438
  return result;
@@ -9480,7 +9485,6 @@ exports.paste = void 0;
9480
9485
  var cleanHtmlComments_1 = __webpack_require__(/*! ./cleanHtmlComments */ "./packages/roosterjs-content-model-core/lib/command/paste/cleanHtmlComments.ts");
9481
9486
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
9482
9487
  var convertInlineCss_1 = __webpack_require__(/*! ../createModelFromHtml/convertInlineCss */ "./packages/roosterjs-content-model-core/lib/command/createModelFromHtml/convertInlineCss.ts");
9483
- var createPasteFragment_1 = __webpack_require__(/*! ./createPasteFragment */ "./packages/roosterjs-content-model-core/lib/command/paste/createPasteFragment.ts");
9484
9488
  var generatePasteOptionFromPlugins_1 = __webpack_require__(/*! ./generatePasteOptionFromPlugins */ "./packages/roosterjs-content-model-core/lib/command/paste/generatePasteOptionFromPlugins.ts");
9485
9489
  var mergePasteContent_1 = __webpack_require__(/*! ./mergePasteContent */ "./packages/roosterjs-content-model-core/lib/command/paste/mergePasteContent.ts");
9486
9490
  var retrieveHtmlInfo_1 = __webpack_require__(/*! ./retrieveHtmlInfo */ "./packages/roosterjs-content-model-core/lib/command/paste/retrieveHtmlInfo.ts");
@@ -9514,7 +9518,7 @@ function paste(editor, clipboardData, pasteTypeOrGetter) {
9514
9518
  ? pasteTypeOrGetter(doc, clipboardData, editor.getEnvironment(), htmlFromClipboard.metadata)
9515
9519
  : pasteTypeOrGetter;
9516
9520
  // 3. Create target fragment
9517
- var sourceFragment = (0, createPasteFragment_1.createPasteFragment)(editor.getDocument(), clipboardData, pasteType, (_a = (clipboardData.rawHtml == clipboardData.html
9521
+ var sourceFragment = (0, roosterjs_content_model_dom_1.createPasteFragment)(editor.getDocument(), clipboardData, pasteType, (_a = (clipboardData.rawHtml == clipboardData.html
9518
9522
  ? doc
9519
9523
  : createDOMFromHtml(clipboardData.html, domCreator))) === null || _a === void 0 ? void 0 : _a.body);
9520
9524
  // 4. Trigger BeforePaste event to allow plugins modify the fragment
@@ -11156,10 +11160,13 @@ function setRangeSelection(core, element, collapse) {
11156
11160
  "use strict";
11157
11161
 
11158
11162
  Object.defineProperty(exports, "__esModule", ({ value: true }));
11159
- exports.setTableCellsStyle = exports.removeTableCellsStyle = void 0;
11163
+ exports.setTableCellsStyle = exports.removeTableCellsStyle = exports.DOM_SELECTION_CSS_KEY = void 0;
11160
11164
  var ensureUniqueId_1 = __webpack_require__(/*! ../setEditorStyle/ensureUniqueId */ "./packages/roosterjs-content-model-core/lib/coreApi/setEditorStyle/ensureUniqueId.ts");
11161
11165
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
11162
- var DOM_SELECTION_CSS_KEY = '_DOMSelection';
11166
+ /**
11167
+ * @internal
11168
+ */
11169
+ exports.DOM_SELECTION_CSS_KEY = '_DOMSelection';
11163
11170
  var TABLE_ID = 'table';
11164
11171
  /**
11165
11172
  * @internal
@@ -11167,7 +11174,7 @@ var TABLE_ID = 'table';
11167
11174
  * @param core The EditorCore object
11168
11175
  */
11169
11176
  function removeTableCellsStyle(core) {
11170
- core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, '');
11177
+ core.api.setEditorStyle(core, exports.DOM_SELECTION_CSS_KEY, '');
11171
11178
  }
11172
11179
  exports.removeTableCellsStyle = removeTableCellsStyle;
11173
11180
  /**
@@ -11192,7 +11199,7 @@ function setTableCellsStyle(core, table, parsedTable, firstCell, lastCell) {
11192
11199
  lastCell.col == ((_b = (_a = parsedTable[lastCell.row]) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) - 1
11193
11200
  ? [tableSelector, tableSelector + " *"]
11194
11201
  : buildTableSelectors(parsedTable, tableSelector, table, firstCell, lastCell);
11195
- core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, "background-color:" + tableSelectionColor + "!important;", tableSelectors);
11202
+ core.api.setEditorStyle(core, exports.DOM_SELECTION_CSS_KEY, "background-color:" + tableSelectionColor + "!important;", tableSelectors);
11196
11203
  }
11197
11204
  exports.setTableCellsStyle = setTableCellsStyle;
11198
11205
  /**
@@ -11251,16 +11258,19 @@ function buildTableSelectors(parsedTable, tableSelector, table, firstCell, lastC
11251
11258
  "use strict";
11252
11259
 
11253
11260
  Object.defineProperty(exports, "__esModule", ({ value: true }));
11254
- exports.toggleCaret = void 0;
11261
+ exports.toggleCaret = exports.HIDE_CURSOR_CSS_KEY = void 0;
11255
11262
  var CARET_CSS_RULE = 'caret-color: transparent';
11256
- var HIDE_CURSOR_CSS_KEY = '_DOMSelectionHideCursor';
11263
+ /**
11264
+ * @internal
11265
+ */
11266
+ exports.HIDE_CURSOR_CSS_KEY = '_DOMSelectionHideCursor';
11257
11267
  /**
11258
11268
  * @internal Show/Hide caret in editor
11259
11269
  * @param core The editor core
11260
11270
  * @param isHiding True to hide caret, false to show caret
11261
11271
  */
11262
11272
  function toggleCaret(core, isHiding) {
11263
- core.api.setEditorStyle(core, HIDE_CURSOR_CSS_KEY, isHiding ? CARET_CSS_RULE : null);
11273
+ core.api.setEditorStyle(core, exports.HIDE_CURSOR_CSS_KEY, isHiding ? CARET_CSS_RULE : null);
11264
11274
  }
11265
11275
  exports.toggleCaret = toggleCaret;
11266
11276
 
@@ -14492,6 +14502,8 @@ var findTableCellElement_1 = __webpack_require__(/*! ../../coreApi/setDOMSelecti
14492
14502
  var isSingleImageInSelection_1 = __webpack_require__(/*! ./isSingleImageInSelection */ "./packages/roosterjs-content-model-core/lib/corePlugin/selection/isSingleImageInSelection.ts");
14493
14503
  var normalizePos_1 = __webpack_require__(/*! ./normalizePos */ "./packages/roosterjs-content-model-core/lib/corePlugin/selection/normalizePos.ts");
14494
14504
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
14505
+ var setTableCellsStyle_1 = __webpack_require__(/*! ../../coreApi/setDOMSelection/setTableCellsStyle */ "./packages/roosterjs-content-model-core/lib/coreApi/setDOMSelection/setTableCellsStyle.ts");
14506
+ var toggleCaret_1 = __webpack_require__(/*! ../../coreApi/setDOMSelection/toggleCaret */ "./packages/roosterjs-content-model-core/lib/coreApi/setDOMSelection/toggleCaret.ts");
14495
14507
  var MouseLeftButton = 0;
14496
14508
  var MouseRightButton = 2;
14497
14509
  var Up = 'ArrowUp';
@@ -14517,6 +14529,7 @@ var SelectionPlugin = /** @class */ (function () {
14517
14529
  this.logicalRootDisposer = null;
14518
14530
  this.isSafari = false;
14519
14531
  this.scrollTopCache = 0;
14532
+ this.isInsideSelection = false;
14520
14533
  this.onMouseMove = function (event) {
14521
14534
  var _a, _b, _c;
14522
14535
  if (_this.editor && _this.state.tableSelection) {
@@ -14716,6 +14729,10 @@ var SelectionPlugin = /** @class */ (function () {
14716
14729
  this.onKeyDown(this.editor, event.rawEvent);
14717
14730
  break;
14718
14731
  case 'contentChanged':
14732
+ if (event.source == roosterjs_content_model_dom_1.ChangeSource.Drop && this.isInsideSelection) {
14733
+ this.setDOMSelection(null /* DOMSelection */, null /* tableSelection */);
14734
+ this.isInsideSelection = false;
14735
+ }
14719
14736
  this.state.tableSelection = null;
14720
14737
  break;
14721
14738
  case 'scroll':
@@ -14763,14 +14780,22 @@ var SelectionPlugin = /** @class */ (function () {
14763
14780
  return;
14764
14781
  }
14765
14782
  // Table selection
14783
+ var target = rawEvent.target;
14784
+ var tableSelection = target
14785
+ ? this.parseTableSelection(target, target, editor.getDOMHelper())
14786
+ : null;
14787
+ if ((selection === null || selection === void 0 ? void 0 : selection.type) == 'table' &&
14788
+ tableSelection &&
14789
+ this.isInsideTableSelection(selection, tableSelection) &&
14790
+ rawEvent.detail == 1) {
14791
+ this.isInsideSelection = true;
14792
+ this.setTableDragSelection(editor, rawEvent);
14793
+ return;
14794
+ }
14766
14795
  if ((selection === null || selection === void 0 ? void 0 : selection.type) == 'table' && rawEvent.button == MouseLeftButton) {
14767
14796
  this.setDOMSelection(null /*domSelection*/, null /*tableSelection*/);
14768
14797
  }
14769
- var tableSelection;
14770
- var target = rawEvent.target;
14771
- if (target &&
14772
- rawEvent.button == MouseLeftButton &&
14773
- (tableSelection = this.parseTableSelection(target, target, editor.getDOMHelper()))) {
14798
+ if (target && rawEvent.button == MouseLeftButton && tableSelection) {
14774
14799
  this.state.tableSelection = tableSelection;
14775
14800
  if (rawEvent.detail >= 3) {
14776
14801
  var lastCo = (0, findCoordinate_1.findCoordinate)(tableSelection.parsedTable, rawEvent.target, editor.getDOMHelper());
@@ -14790,6 +14815,10 @@ var SelectionPlugin = /** @class */ (function () {
14790
14815
  }
14791
14816
  };
14792
14817
  SelectionPlugin.prototype.onMouseUp = function () {
14818
+ if (this.isInsideSelection) {
14819
+ this.setDOMSelection(null /*domSelection*/, null /*tableSelection*/);
14820
+ this.isInsideSelection = false;
14821
+ }
14793
14822
  this.detachMouseEvent();
14794
14823
  };
14795
14824
  SelectionPlugin.prototype.onKeyDown = function (editor, rawEvent) {
@@ -14984,6 +15013,30 @@ var SelectionPlugin = /** @class */ (function () {
14984
15013
  }
14985
15014
  }
14986
15015
  };
15016
+ SelectionPlugin.prototype.isInsideTableSelection = function (prevSelection, tableSelection) {
15017
+ var selectedCell = tableSelection.firstCo;
15018
+ return (selectedCell.row >= prevSelection.firstRow &&
15019
+ selectedCell.row <= prevSelection.lastRow &&
15020
+ selectedCell.col >= prevSelection.firstColumn &&
15021
+ selectedCell.col <= prevSelection.lastColumn);
15022
+ };
15023
+ SelectionPlugin.prototype.setTableDragSelection = function (editor, rawEvent) {
15024
+ var doc = editor.getDocument();
15025
+ var cell = editor
15026
+ .getDOMHelper()
15027
+ .findClosestElementAncestor(rawEvent.target, 'td,th');
15028
+ if (cell) {
15029
+ // Hide the table cell selection styles (grey cell background applied by
15030
+ // setDOMSelection) and the native selection highlight so that only the
15031
+ // dragged content is visible while dragging. Also restore the caret which
15032
+ // is hidden while a table selection is active.
15033
+ editor.setEditorStyle(setTableCellsStyle_1.DOM_SELECTION_CSS_KEY, null /*cssRule*/);
15034
+ editor.setEditorStyle(toggleCaret_1.HIDE_CURSOR_CSS_KEY, null /*cssRule*/);
15035
+ var range = doc.createRange();
15036
+ range.selectNodeContents(cell);
15037
+ editor.getDOMHelper().setSelectionRange(range);
15038
+ }
15039
+ };
14987
15040
  SelectionPlugin.prototype.getTextOffset = function (editor, range, td, isKeyUp) {
14988
15041
  var doc = editor.getDocument();
14989
15042
  var cursorRect = range
@@ -17272,6 +17325,10 @@ exports.ChangeSource = {
17272
17325
  * Content changed by replace
17273
17326
  */
17274
17327
  Replace: 'Replace',
17328
+ /**
17329
+ * Content changed by dragging content out the editor
17330
+ */
17331
+ DragOutOfEditor: 'DragOutOfEditor',
17275
17332
  };
17276
17333
 
17277
17334
 
@@ -17760,6 +17817,7 @@ exports.defaultProcessorMap = {
17760
17817
  h5: headingProcessor_1.headingProcessor,
17761
17818
  h6: headingProcessor_1.headingProcessor,
17762
17819
  hr: hrProcessor_1.hrProcessor,
17820
+ label: knownElementProcessor_1.knownElementProcessor,
17763
17821
  li: listItemProcessor_1.listItemProcessor,
17764
17822
  ol: listProcessor_1.listProcessor,
17765
17823
  p: pProcessor_1.pProcessor,
@@ -19783,6 +19841,53 @@ function cacheGetEventData(event, key, getter) {
19783
19841
  exports.cacheGetEventData = cacheGetEventData;
19784
19842
 
19785
19843
 
19844
+ /***/ },
19845
+
19846
+ /***/ "./packages/roosterjs-content-model-dom/lib/domUtils/event/createPasteFragment.ts"
19847
+ /*!****************************************************************************************!*\
19848
+ !*** ./packages/roosterjs-content-model-dom/lib/domUtils/event/createPasteFragment.ts ***!
19849
+ \****************************************************************************************/
19850
+ (__unused_webpack_module, exports, __webpack_require__) {
19851
+
19852
+ "use strict";
19853
+
19854
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
19855
+ exports.createPasteFragment = void 0;
19856
+ var moveChildNodes_1 = __webpack_require__(/*! ../moveChildNodes */ "./packages/roosterjs-content-model-dom/lib/domUtils/moveChildNodes.ts");
19857
+ var textToFragment_1 = __webpack_require__(/*! ../textToFragment */ "./packages/roosterjs-content-model-dom/lib/domUtils/textToFragment.ts");
19858
+ /**
19859
+ * Create a document fragment from clipboard content using the specified paste type
19860
+ * @param document The document used to create the fragment
19861
+ * @param clipboardData The clipboard data to convert
19862
+ * @param pasteType The paste type that determines which clipboard content to use
19863
+ * @param root The optional root element containing the parsed HTML content
19864
+ * @returns A document fragment containing the content to paste
19865
+ */
19866
+ function createPasteFragment(document, clipboardData, pasteType, root) {
19867
+ if (!clipboardData.text && pasteType === 'asPlainText' && root) {
19868
+ clipboardData.text = root.textContent || clipboardData.text;
19869
+ }
19870
+ var imageDataUri = clipboardData.imageDataUri, text = clipboardData.text;
19871
+ var fragment = document.createDocumentFragment();
19872
+ if ((pasteType == 'asImage' && imageDataUri) ||
19873
+ (pasteType != 'asPlainText' && !text && imageDataUri)) {
19874
+ // Paste image
19875
+ var img = document.createElement('img');
19876
+ img.style.maxWidth = '100%';
19877
+ img.src = imageDataUri;
19878
+ fragment.appendChild(img);
19879
+ }
19880
+ else if (pasteType != 'asPlainText' && root) {
19881
+ (0, moveChildNodes_1.moveChildNodes)(fragment, root);
19882
+ }
19883
+ else if (text) {
19884
+ return (0, textToFragment_1.textToFragment)(text, document);
19885
+ }
19886
+ return fragment;
19887
+ }
19888
+ exports.createPasteFragment = createPasteFragment;
19889
+
19890
+
19786
19891
  /***/ },
19787
19892
 
19788
19893
  /***/ "./packages/roosterjs-content-model-dom/lib/domUtils/event/eventUtils.ts"
@@ -19959,14 +20064,14 @@ function getNodePositionFromEvent(doc, domHelper, x, y) {
19959
20064
  // Firefox, Chrome, Edge, Safari, Opera
19960
20065
  var pos = doc.caretPositionFromPoint(x, y);
19961
20066
  if (pos && domHelper.isNodeInEditor(pos.offsetNode)) {
19962
- return { node: pos.offsetNode, offset: pos.offset };
20067
+ return normalizePosition(pos.offsetNode, pos.offset);
19963
20068
  }
19964
20069
  }
19965
20070
  if (doc.caretRangeFromPoint) {
19966
20071
  // Safari
19967
20072
  var range = doc.caretRangeFromPoint(x, y);
19968
20073
  if (range && domHelper.isNodeInEditor(range.startContainer)) {
19969
- return { node: range.startContainer, offset: range.startOffset };
20074
+ return normalizePosition(range.startContainer, range.startOffset);
19970
20075
  }
19971
20076
  }
19972
20077
  if (doc.elementFromPoint) {
@@ -19979,6 +20084,14 @@ function getNodePositionFromEvent(doc, domHelper, x, y) {
19979
20084
  return null;
19980
20085
  }
19981
20086
  exports.getNodePositionFromEvent = getNodePositionFromEvent;
20087
+ function normalizePosition(node, offset) {
20088
+ var _a;
20089
+ // Safari hit-testing in tableMoverTest returns offset 1 after the lone BR of an empty block.
20090
+ var normalizedOffset = offset == 1 && node.childNodes.length == 1 && ((_a = node.firstChild) === null || _a === void 0 ? void 0 : _a.nodeName) == 'BR'
20091
+ ? 0
20092
+ : offset;
20093
+ return { node: node, offset: normalizedOffset };
20094
+ }
19982
20095
 
19983
20096
 
19984
20097
  /***/ },
@@ -21281,6 +21394,78 @@ function parseTableCells(table) {
21281
21394
  exports.parseTableCells = parseTableCells;
21282
21395
 
21283
21396
 
21397
+ /***/ },
21398
+
21399
+ /***/ "./packages/roosterjs-content-model-dom/lib/domUtils/textToFragment.ts"
21400
+ /*!*****************************************************************************!*\
21401
+ !*** ./packages/roosterjs-content-model-dom/lib/domUtils/textToFragment.ts ***!
21402
+ \*****************************************************************************/
21403
+ (__unused_webpack_module, exports, __webpack_require__) {
21404
+
21405
+ "use strict";
21406
+
21407
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
21408
+ exports.textToFragment = void 0;
21409
+ var wrap_1 = __webpack_require__(/*! ./wrap */ "./packages/roosterjs-content-model-dom/lib/domUtils/wrap.ts");
21410
+ var NBSP_HTML = '\u00A0';
21411
+ var ENSP_HTML = '\u2002';
21412
+ var TAB_SPACES = 6;
21413
+ /**
21414
+ * @internal
21415
+ */
21416
+ function textToFragment(text, doc) {
21417
+ var fragment = doc.createDocumentFragment();
21418
+ text.split('\n').forEach(function (line, index, lines) {
21419
+ line = line
21420
+ .replace(/^ /g, NBSP_HTML)
21421
+ .replace(/ $/g, NBSP_HTML)
21422
+ .replace(/\r/g, '')
21423
+ .replace(/ {2}/g, ' ' + NBSP_HTML);
21424
+ if (line.includes('\t')) {
21425
+ line = transformTabCharacters(line);
21426
+ }
21427
+ var textNode = doc.createTextNode(line);
21428
+ // There are 3 scenarios:
21429
+ // 1. Single line: Paste as it is
21430
+ // 2. Two lines: Add <br> between the lines
21431
+ // 3. 3 or More lines, For first and last line, paste as it is. For middle lines, wrap with DIV, and add BR if it is empty line
21432
+ if (lines.length == 2 && index == 0) {
21433
+ // 1 of 2 lines scenario, add BR
21434
+ fragment.appendChild(textNode);
21435
+ fragment.appendChild(doc.createElement('br'));
21436
+ }
21437
+ else if (index > 0 && index < lines.length - 1) {
21438
+ // Middle line of >=3 lines scenario, wrap with DIV
21439
+ fragment.appendChild((0, wrap_1.wrap)(doc, line == '' ? doc.createElement('br') : textNode, 'div'));
21440
+ }
21441
+ else {
21442
+ // All others, paste as it is
21443
+ fragment.appendChild(textNode);
21444
+ }
21445
+ });
21446
+ return fragment;
21447
+ }
21448
+ exports.textToFragment = textToFragment;
21449
+ /**
21450
+ * Transform \t characters into EN SPACE characters
21451
+ * @param input string NOT containing \n characters
21452
+ * @example t("\thello", 2) => "&ensp;&ensp;&ensp;&ensp;hello"
21453
+ */
21454
+ function transformTabCharacters(input, initialOffset) {
21455
+ if (initialOffset === void 0) { initialOffset = 0; }
21456
+ var line = input;
21457
+ var tIndex;
21458
+ while ((tIndex = line.indexOf('\t')) != -1) {
21459
+ var lineBefore = line.slice(0, tIndex);
21460
+ var lineAfter = line.slice(tIndex + 1);
21461
+ var tabCount = TAB_SPACES - ((lineBefore.length + initialOffset) % TAB_SPACES);
21462
+ var tabStr = Array(tabCount).fill(ENSP_HTML).join('');
21463
+ line = lineBefore + tabStr + lineAfter;
21464
+ }
21465
+ return line;
21466
+ }
21467
+
21468
+
21284
21469
  /***/ },
21285
21470
 
21286
21471
  /***/ "./packages/roosterjs-content-model-dom/lib/domUtils/toArray.ts"
@@ -23866,8 +24051,8 @@ exports.shouldSetValue = shouldSetValue;
23866
24051
  Object.defineProperty(exports, "__esModule", ({ value: true }));
23867
24052
  exports.createImage = exports.createText = exports.createTableCell = exports.createTable = exports.createSelectionMarker = exports.createParagraph = exports.createFormatContainer = exports.createListItem = exports.createBr = exports.isLinkUndeletable = exports.setLinkUndeletable = exports.scrollRectIntoView = 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.formatContainerProcessor = exports.tableProcessor = exports.entityProcessor = exports.processChildNode = exports.handleRegularSelection = exports.childProcessor = exports.contentModelToText = exports.contentModelToDom = exports.domToContentModel = void 0;
23868
24053
  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.ParagraphFormats = exports.ListFormatsToMove = exports.ListFormatsToKeep = exports.ListFormats = exports.copyFormat = exports.setParagraphNotImplicit = exports.normalizeSegmentFormat = exports.mergeTextSegments = exports.normalizeSingleSegment = exports.isEmpty = exports.addSegment = exports.unwrapBlock = exports.isGeneralSegment = exports.normalizeContentModel = exports.normalizeParagraph = exports.addTextSegment = exports.addLink = exports.addData = exports.addCode = exports.addBlock = exports.mutateSegment = exports.mutateSegments = exports.mutateBlock = exports.createTableRow = exports.createEmptyModel = exports.createListLevel = exports.createDivider = exports.createEntity = exports.createGeneralBlock = exports.createGeneralSegment = exports.createParagraphDecorator = exports.createContentModelDocument = void 0;
23869
- 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.cloneModelForPaste = 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.getRangesByText = exports.getImageState = exports.setImageState = exports.getParagraphMarker = exports.setParagraphMarker = exports.cacheGetEventData = exports.extractClipboardItems = exports.normalizeFontFamily = exports.transformColor = exports.retrieveDocumentMetadata = exports.readFile = exports.parseTableCells = exports.normalizeText = exports.isSpace = exports.isPunctuation = exports.extractBorderValues = exports.combineBorderValue = exports.getNodePositionFromEvent = exports.isCursorMovingKey = exports.isModifierKey = exports.isCharacterValue = exports.trimModelForSelection = void 0;
23870
- 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 = void 0;
24054
+ 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.cloneModelForPaste = 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.getRangesByText = exports.getImageState = exports.setImageState = exports.getParagraphMarker = exports.setParagraphMarker = exports.cacheGetEventData = exports.createPasteFragment = exports.extractClipboardItems = exports.normalizeFontFamily = exports.transformColor = exports.retrieveDocumentMetadata = exports.readFile = exports.parseTableCells = exports.normalizeText = exports.isSpace = exports.isPunctuation = exports.extractBorderValues = exports.combineBorderValue = exports.getNodePositionFromEvent = exports.isCursorMovingKey = exports.isModifierKey = exports.isCharacterValue = exports.trimModelForSelection = void 0;
24055
+ 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 = void 0;
23871
24056
  var domToContentModel_1 = __webpack_require__(/*! ./domToModel/domToContentModel */ "./packages/roosterjs-content-model-dom/lib/domToModel/domToContentModel.ts");
23872
24057
  Object.defineProperty(exports, "domToContentModel", ({ enumerable: true, get: function () { return domToContentModel_1.domToContentModel; } }));
23873
24058
  var contentModelToDom_1 = __webpack_require__(/*! ./modelToDom/contentModelToDom */ "./packages/roosterjs-content-model-dom/lib/modelToDom/contentModelToDom.ts");
@@ -24067,6 +24252,8 @@ var normalizeFontFamily_1 = __webpack_require__(/*! ./domUtils/style/normalizeFo
24067
24252
  Object.defineProperty(exports, "normalizeFontFamily", ({ enumerable: true, get: function () { return normalizeFontFamily_1.normalizeFontFamily; } }));
24068
24253
  var extractClipboardItems_1 = __webpack_require__(/*! ./domUtils/event/extractClipboardItems */ "./packages/roosterjs-content-model-dom/lib/domUtils/event/extractClipboardItems.ts");
24069
24254
  Object.defineProperty(exports, "extractClipboardItems", ({ enumerable: true, get: function () { return extractClipboardItems_1.extractClipboardItems; } }));
24255
+ var createPasteFragment_1 = __webpack_require__(/*! ./domUtils/event/createPasteFragment */ "./packages/roosterjs-content-model-dom/lib/domUtils/event/createPasteFragment.ts");
24256
+ Object.defineProperty(exports, "createPasteFragment", ({ enumerable: true, get: function () { return createPasteFragment_1.createPasteFragment; } }));
24070
24257
  var cacheGetEventData_1 = __webpack_require__(/*! ./domUtils/event/cacheGetEventData */ "./packages/roosterjs-content-model-dom/lib/domUtils/event/cacheGetEventData.ts");
24071
24258
  Object.defineProperty(exports, "cacheGetEventData", ({ enumerable: true, get: function () { return cacheGetEventData_1.cacheGetEventData; } }));
24072
24259
  var paragraphMarker_1 = __webpack_require__(/*! ./domUtils/hiddenProperties/paragraphMarker */ "./packages/roosterjs-content-model-dom/lib/domUtils/hiddenProperties/paragraphMarker.ts");
@@ -26910,6 +27097,7 @@ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.m
26910
27097
  var addBlock_1 = __webpack_require__(/*! ../common/addBlock */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/addBlock.ts");
26911
27098
  var addSegment_1 = __webpack_require__(/*! ../common/addSegment */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/addSegment.ts");
26912
27099
  var applyTableFormat_1 = __webpack_require__(/*! ./applyTableFormat */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/applyTableFormat.ts");
27100
+ var createBr_1 = __webpack_require__(/*! ../creators/createBr */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createBr.ts");
26913
27101
  var createListItem_1 = __webpack_require__(/*! ../creators/createListItem */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createListItem.ts");
26914
27102
  var createParagraph_1 = __webpack_require__(/*! ../creators/createParagraph */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createParagraph.ts");
26915
27103
  var createSelectionMarker_1 = __webpack_require__(/*! ../creators/createSelectionMarker */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createSelectionMarker.ts");
@@ -26932,11 +27120,14 @@ var KeysOfSegmentFormat = (0, getObjectKeys_1.getObjectKeys)(EmptySegmentFormat_
26932
27120
  * @returns Insert point after merge, or null if there is no insert point
26933
27121
  */
26934
27122
  function mergeModel(target, source, context, options) {
26935
- var _a;
27123
+ var _a, _b;
26936
27124
  var insertPosition = (_a = options === null || options === void 0 ? void 0 : options.insertPosition) !== null && _a !== void 0 ? _a : (0, deleteSelection_1.deleteSelection)(target, [], context).insertPoint;
26937
- var _b = options || {}, addParagraphAfterMergedContent = _b.addParagraphAfterMergedContent, mergeFormat = _b.mergeFormat, mergeTable = _b.mergeTable;
27125
+ var _c = options || {}, addParagraphAfterMergedContent = _c.addParagraphAfterMergedContent, mergeFormat = _c.mergeFormat, mergeParagraphAfterList = _c.mergeParagraphAfterList, mergeTable = _c.mergeTable;
27126
+ if (mergeParagraphAfterList && insertPosition && ((_b = source.blocks[0]) === null || _b === void 0 ? void 0 : _b.blockType) == 'Paragraph') {
27127
+ moveParagraphAfterListIntoList(insertPosition);
27128
+ }
26938
27129
  if (addParagraphAfterMergedContent && !mergeTable) {
26939
- var _c = insertPosition || {}, paragraph = _c.paragraph, marker = _c.marker;
27130
+ var _d = insertPosition || {}, paragraph = _d.paragraph, marker = _d.marker;
26940
27131
  var newPara = (0, createParagraph_1.createParagraph)(false /* isImplicit */, paragraph === null || paragraph === void 0 ? void 0 : paragraph.format, marker === null || marker === void 0 ? void 0 : marker.format);
26941
27132
  (0, addBlock_1.addBlock)(source, newPara);
26942
27133
  }
@@ -26984,6 +27175,22 @@ function mergeModel(target, source, context, options) {
26984
27175
  return insertPosition;
26985
27176
  }
26986
27177
  exports.mergeModel = mergeModel;
27178
+ function moveParagraphAfterListIntoList(insertPosition) {
27179
+ var paragraph = insertPosition.paragraph, path = insertPosition.path;
27180
+ var parent = path[0];
27181
+ var paragraphIndex = parent.blocks.indexOf(paragraph);
27182
+ var previousBlock = parent.blocks[paragraphIndex - 1];
27183
+ if (paragraph.segments.every(function (segment) { return segment.segmentType == 'SelectionMarker' || segment.segmentType == 'Br'; }) &&
27184
+ (previousBlock === null || previousBlock === void 0 ? void 0 : previousBlock.blockType) == 'BlockGroup' &&
27185
+ previousBlock.blockGroupType == 'ListItem') {
27186
+ var newListItem = (0, createListItem_1.createListItem)(previousBlock.levels, previousBlock.formatHolder.format);
27187
+ var paragraphAfterList = (0, createParagraph_1.createParagraph)(false, paragraph.format);
27188
+ (0, addBlock_1.addBlock)(newListItem, paragraph);
27189
+ paragraphAfterList.segments.push((0, createBr_1.createBr)());
27190
+ (0, mutate_1.mutateBlock)(parent).blocks.splice(paragraphIndex, 1, newListItem, paragraphAfterList);
27191
+ path.unshift(newListItem);
27192
+ }
27193
+ }
26987
27194
  function mergeParagraph(markerPosition, newPara, mergeToCurrentParagraph, context, option) {
26988
27195
  var paragraph = markerPosition.paragraph, marker = markerPosition.marker;
26989
27196
  var newParagraph = mergeToCurrentParagraph
@@ -32317,7 +32524,11 @@ var MarkdownPastePlugin = /** @class */ (function () {
32317
32524
  (0, isPastedContentMarkdown_1.isPastedContentMarkdown)(this.editor, clipboardData) &&
32318
32525
  clipboardData.modelBeforePaste) {
32319
32526
  var modelBeforePaste_1 = (0, roosterjs_content_model_dom_1.cloneModelForPaste)(clipboardData.modelBeforePaste);
32320
- (0, roosterjs_content_model_dom_1.mergeModel)(modelBeforePaste_1, (0, convertMarkdownToContentModel_1.convertMarkdownToContentModel)(clipboardData.text, { emptyLine: 'merge' }));
32527
+ (0, roosterjs_content_model_dom_1.mergeModel)(modelBeforePaste_1, (0, convertMarkdownToContentModel_1.convertMarkdownToContentModel)(clipboardData.text, {
32528
+ emptyLine: 'merge',
32529
+ }), undefined /*context*/, {
32530
+ mergeFormat: 'preferTarget',
32531
+ });
32321
32532
  if (this.options.undoConversion) {
32322
32533
  this.editor.takeSnapshot();
32323
32534
  }
@@ -32371,7 +32582,7 @@ var BlockPatterns = [
32371
32582
  /^\s*>\s.+/,
32372
32583
  /^\s*[\*\-\+]\s.+/,
32373
32584
  /^\s*\d+\.\s.+/,
32374
- /^---+$/,
32585
+ /^---$/,
32375
32586
  /^\s*\|.*\|\s*$/, // table row: "| a | b |"
32376
32587
  ];
32377
32588
  // Inline markdown patterns. The text contains markdown if any of these match anywhere.
@@ -33910,9 +34121,12 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
33910
34121
  exports.DragAndDropPlugin = void 0;
33911
34122
  var handleDroppedExternalContent_1 = __webpack_require__(/*! ./utils/handleDroppedExternalContent */ "./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/handleDroppedExternalContent.ts");
33912
34123
  var handleDroppedInternalContent_1 = __webpack_require__(/*! ./utils/handleDroppedInternalContent */ "./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/handleDroppedInternalContent.ts");
34124
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
34125
+ var reorderList_1 = __webpack_require__(/*! ./utils/reorderList */ "./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/reorderList.ts");
33913
34126
  var DefaultOptions = {
33914
34127
  forbiddenElements: ['iframe'],
33915
34128
  };
34129
+ var DeleteByDragInputType = 'deleteByDrag';
33916
34130
  /**
33917
34131
  * DragAndDrop plugin, handles ContentChanged event when change source is "Drop"
33918
34132
  * to sanitize dropped content, similar to how PastePlugin sanitizes pasted content.
@@ -33947,8 +34161,21 @@ var DragAndDropPlugin = /** @class */ (function () {
33947
34161
  this.editor = editor;
33948
34162
  this.disposer = editor.attachDomEvent({
33949
34163
  dragstart: {
33950
- beforeDispatch: function (_ev) {
34164
+ beforeDispatch: function (ev) {
33951
34165
  _this.internalDrag = true;
34166
+ if (_this.editor &&
34167
+ _this.editor.isExperimentalFeatureEnabled('HandleDropInternalContent')) {
34168
+ _this.adjustDraggingCursor(_this.editor, ev);
34169
+ }
34170
+ },
34171
+ },
34172
+ beforeinput: {
34173
+ beforeDispatch: function (event) {
34174
+ var ev = event;
34175
+ if (_this.internalDrag) {
34176
+ _this.handleDragOutOfTheEditor(editor, ev);
34177
+ _this.internalDrag = false;
34178
+ }
33952
34179
  },
33953
34180
  },
33954
34181
  });
@@ -33965,6 +34192,7 @@ var DragAndDropPlugin = /** @class */ (function () {
33965
34192
  this.disposer = null;
33966
34193
  }
33967
34194
  this.forbiddenElements = [];
34195
+ this.internalDrag = false;
33968
34196
  };
33969
34197
  /**
33970
34198
  * Core method for a plugin. Once an event happens in editor, editor will call this
@@ -33973,7 +34201,6 @@ var DragAndDropPlugin = /** @class */ (function () {
33973
34201
  * @param event The event to handle:
33974
34202
  */
33975
34203
  DragAndDropPlugin.prototype.onPluginEvent = function (event) {
33976
- var _a;
33977
34204
  if (this.editor && event.eventType == 'beforeDrop') {
33978
34205
  var dropEvent = event.rawEvent;
33979
34206
  if (this.internalDrag &&
@@ -33981,14 +34208,36 @@ var DragAndDropPlugin = /** @class */ (function () {
33981
34208
  (0, handleDroppedInternalContent_1.handleDroppedInternalContent)(this.editor, dropEvent);
33982
34209
  }
33983
34210
  else if (!this.internalDrag) {
33984
- var html = (_a = dropEvent.dataTransfer) === null || _a === void 0 ? void 0 : _a.getData('text/html');
33985
- if (html) {
33986
- (0, handleDroppedExternalContent_1.handleDroppedExternalContent)(this.editor, dropEvent, html, this.forbiddenElements);
33987
- }
34211
+ (0, handleDroppedExternalContent_1.handleDroppedExternalContent)(this.editor, dropEvent, this.forbiddenElements);
33988
34212
  }
33989
34213
  this.internalDrag = false;
33990
34214
  }
33991
34215
  };
34216
+ DragAndDropPlugin.prototype.adjustDraggingCursor = function (editor, dragEvent) {
34217
+ var _a, _b;
34218
+ var selection = editor.getDOMSelection();
34219
+ if ((selection === null || selection === void 0 ? void 0 : selection.type) == 'table') {
34220
+ var doc = (_a = this.editor) === null || _a === void 0 ? void 0 : _a.getDocument();
34221
+ if (doc && dragEvent.dataTransfer) {
34222
+ var ghost_1 = doc.createElement('span');
34223
+ ghost_1.textContent = '|';
34224
+ doc.body.appendChild(ghost_1);
34225
+ dragEvent.dataTransfer.setDragImage(ghost_1, 0, 0);
34226
+ (_b = doc.defaultView) === null || _b === void 0 ? void 0 : _b.requestAnimationFrame(function () { return ghost_1.remove(); });
34227
+ }
34228
+ }
34229
+ };
34230
+ DragAndDropPlugin.prototype.handleDragOutOfTheEditor = function (editor, inputEvent) {
34231
+ if (inputEvent.inputType == DeleteByDragInputType) {
34232
+ inputEvent.preventDefault();
34233
+ editor.formatContentModel(function (model, context) {
34234
+ (0, roosterjs_content_model_dom_1.deleteSelection)(model, [reorderList_1.reorderList], context);
34235
+ return true;
34236
+ }, {
34237
+ changeSource: roosterjs_content_model_dom_1.ChangeSource.DragOutOfEditor,
34238
+ });
34239
+ }
34240
+ };
33992
34241
  return DragAndDropPlugin;
33993
34242
  }());
33994
34243
  exports.DragAndDropPlugin = DragAndDropPlugin;
@@ -34050,37 +34299,90 @@ exports.cleanForbiddenElements = cleanForbiddenElements;
34050
34299
 
34051
34300
  Object.defineProperty(exports, "__esModule", ({ value: true }));
34052
34301
  exports.handleDroppedExternalContent = void 0;
34302
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
34053
34303
  var cleanForbiddenElements_1 = __webpack_require__(/*! ./cleanForbiddenElements */ "./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/cleanForbiddenElements.ts");
34054
34304
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
34055
34305
  /**
34056
34306
  * @internal
34057
34307
  * Handle dropped HTML content by inserting it at the drop position
34058
34308
  */
34059
- function handleDroppedExternalContent(editor, event, html, forbiddenElements) {
34060
- var doc = editor.getDocument();
34061
- var domPosition = (0, roosterjs_content_model_dom_1.getNodePositionFromEvent)(doc, editor.getDOMHelper(), event.x, event.y);
34062
- if (domPosition) {
34063
- event.preventDefault();
34064
- event.stopPropagation();
34065
- var range = doc.createRange();
34066
- range.setStart(domPosition.node, domPosition.offset);
34067
- range.collapse(true);
34068
- var parsedHtml = editor.getDOMCreator().htmlToDOM(html);
34069
- (0, cleanForbiddenElements_1.cleanForbiddenElements)(parsedHtml, forbiddenElements);
34070
- var droppedModel_1 = (0, roosterjs_content_model_dom_1.domToContentModel)(parsedHtml.body, (0, roosterjs_content_model_dom_1.createDomToModelContext)());
34071
- editor.formatContentModel(function (model, context) {
34072
- (0, roosterjs_content_model_dom_1.mergeModel)(model, droppedModel_1, context);
34073
- return true;
34074
- }, {
34075
- selectionOverride: {
34076
- type: 'range',
34077
- range: range,
34078
- isReverted: false,
34079
- },
34309
+ function handleDroppedExternalContent(editor, event, forbiddenElements) {
34310
+ return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
34311
+ var items, doc, domPosition, droppedModel_1, range;
34312
+ return (0, tslib_1.__generator)(this, function (_a) {
34313
+ switch (_a.label) {
34314
+ case 0:
34315
+ items = getSupportedItems(event.dataTransfer);
34316
+ if (items.length == 0) {
34317
+ return [2 /*return*/];
34318
+ }
34319
+ doc = editor.getDocument();
34320
+ domPosition = (0, roosterjs_content_model_dom_1.getNodePositionFromEvent)(doc, editor.getDOMHelper(), event.x, event.y);
34321
+ if (!domPosition) return [3 /*break*/, 2];
34322
+ event.preventDefault();
34323
+ event.stopPropagation();
34324
+ return [4 /*yield*/, getDroppedModel(editor, items, forbiddenElements)];
34325
+ case 1:
34326
+ droppedModel_1 = _a.sent();
34327
+ if (!droppedModel_1) {
34328
+ return [2 /*return*/];
34329
+ }
34330
+ range = doc.createRange();
34331
+ range.setStart(domPosition.node, domPosition.offset);
34332
+ range.collapse(true);
34333
+ editor.formatContentModel(function (model, context) {
34334
+ (0, roosterjs_content_model_dom_1.mergeModel)(model, droppedModel_1, context, {
34335
+ mergeParagraphAfterList: true,
34336
+ });
34337
+ return true;
34338
+ }, {
34339
+ selectionOverride: {
34340
+ type: 'range',
34341
+ range: range,
34342
+ isReverted: false,
34343
+ },
34344
+ });
34345
+ _a.label = 2;
34346
+ case 2: return [2 /*return*/];
34347
+ }
34080
34348
  });
34081
- }
34349
+ });
34082
34350
  }
34083
34351
  exports.handleDroppedExternalContent = handleDroppedExternalContent;
34352
+ function getDroppedModel(editor, items, forbiddenElements) {
34353
+ return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
34354
+ var clipboardData, domCreator, doc, fragment;
34355
+ return (0, tslib_1.__generator)(this, function (_a) {
34356
+ switch (_a.label) {
34357
+ case 0: return [4 /*yield*/, (0, roosterjs_content_model_dom_1.extractClipboardItems)(items, undefined)];
34358
+ case 1:
34359
+ clipboardData = _a.sent();
34360
+ domCreator = editor.getDOMCreator();
34361
+ doc = clipboardData.rawHtml ? domCreator.htmlToDOM(clipboardData.rawHtml) : null;
34362
+ if (doc) {
34363
+ (0, cleanForbiddenElements_1.cleanForbiddenElements)(doc, forbiddenElements);
34364
+ }
34365
+ fragment = (0, roosterjs_content_model_dom_1.createPasteFragment)(editor.getDocument(), clipboardData, 'normal', doc === null || doc === void 0 ? void 0 : doc.body);
34366
+ return [2 /*return*/, (0, roosterjs_content_model_dom_1.domToContentModel)(fragment, (0, roosterjs_content_model_dom_1.createDomToModelContext)())];
34367
+ }
34368
+ });
34369
+ });
34370
+ }
34371
+ function getSupportedItems(dataTransfer) {
34372
+ var _a;
34373
+ var result = [];
34374
+ for (var i = 0; i < ((_a = dataTransfer === null || dataTransfer === void 0 ? void 0 : dataTransfer.items.length) !== null && _a !== void 0 ? _a : 0); i++) {
34375
+ var item = dataTransfer.items[i];
34376
+ if ((item.kind == 'string' &&
34377
+ (item.type == 'text/html' ||
34378
+ item.type == 'text/plain' ||
34379
+ item.type == 'text/uri-list')) ||
34380
+ (item.kind == 'file' && item.type.indexOf('image/') == 0)) {
34381
+ result.push(item);
34382
+ }
34383
+ }
34384
+ return result;
34385
+ }
34084
34386
 
34085
34387
 
34086
34388
  /***/ },
@@ -34097,6 +34399,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
34097
34399
  exports.handleDroppedInternalContent = void 0;
34098
34400
  var roosterjs_content_model_api_1 = __webpack_require__(/*! roosterjs-content-model-api */ "./packages/roosterjs-content-model-api/lib/index.ts");
34099
34401
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
34402
+ var reorderList_1 = __webpack_require__(/*! ./reorderList */ "./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/reorderList.ts");
34100
34403
  /**
34101
34404
  * @internal
34102
34405
  * Handle dropped internal HTML content by inserting it at the drop position
@@ -34112,8 +34415,10 @@ function handleDroppedInternalContent(editor, event) {
34112
34415
  if (insertPoint) {
34113
34416
  var cloneModel = (0, roosterjs_content_model_dom_1.cloneModelForPaste)(model);
34114
34417
  (0, roosterjs_content_model_dom_1.trimModelForSelection)(cloneModel, selection);
34115
- if ((0, roosterjs_content_model_dom_1.deleteSelection)(model, [], context).deleteResult == 'range') {
34116
- (0, roosterjs_content_model_dom_1.normalizeContentModel)(model);
34418
+ if (!event.ctrlKey && !event.metaKey) {
34419
+ if ((0, roosterjs_content_model_dom_1.deleteSelection)(model, [reorderList_1.reorderList], context).deleteResult == 'range') {
34420
+ (0, roosterjs_content_model_dom_1.normalizeContentModel)(model);
34421
+ }
34117
34422
  }
34118
34423
  var startMarker = (0, roosterjs_content_model_dom_1.createSelectionMarker)(insertPoint.marker.format);
34119
34424
  var startParagraph = (0, roosterjs_content_model_dom_1.mutateBlock)(insertPoint.paragraph);
@@ -34121,6 +34426,7 @@ function handleDroppedInternalContent(editor, event) {
34121
34426
  startParagraph.segments.splice(startIndex, 0, startMarker);
34122
34427
  var newInsertPoint = (0, roosterjs_content_model_dom_1.mergeModel)(model, cloneModel, context, {
34123
34428
  insertPosition: insertPoint,
34429
+ mergeParagraphAfterList: true,
34124
34430
  });
34125
34431
  if (newInsertPoint) {
34126
34432
  (0, roosterjs_content_model_dom_1.setSelection)(model, startMarker, newInsertPoint.marker);
@@ -34132,6 +34438,39 @@ function handleDroppedInternalContent(editor, event) {
34132
34438
  exports.handleDroppedInternalContent = handleDroppedInternalContent;
34133
34439
 
34134
34440
 
34441
+ /***/ },
34442
+
34443
+ /***/ "./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/reorderList.ts"
34444
+ /*!***************************************************************************************!*\
34445
+ !*** ./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/reorderList.ts ***!
34446
+ \***************************************************************************************/
34447
+ (__unused_webpack_module, exports, __webpack_require__) {
34448
+
34449
+ "use strict";
34450
+
34451
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
34452
+ exports.reorderList = void 0;
34453
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
34454
+ var getListItemFromInsertPoint_1 = __webpack_require__(/*! ../../edit/utils/getListItemFromInsertPoint */ "./packages/roosterjs-content-model-plugins/lib/edit/utils/getListItemFromInsertPoint.ts");
34455
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
34456
+ /**
34457
+ * @internal
34458
+ */
34459
+ var reorderList = function (context) {
34460
+ if (context.deleteResult != 'range') {
34461
+ return;
34462
+ }
34463
+ var paragraph = context.insertPoint.paragraph;
34464
+ var listItemAndParent = (0, getListItemFromInsertPoint_1.getListItemFromInsertPoint)(context.insertPoint);
34465
+ if (listItemAndParent) {
34466
+ var _a = (0, tslib_1.__read)(listItemAndParent, 1), item = _a[0];
34467
+ var mutableList = (0, roosterjs_content_model_dom_1.mutateBlock)(item);
34468
+ mutableList.blocks.splice(mutableList.blocks.indexOf(paragraph), mutableList.blocks.length);
34469
+ }
34470
+ };
34471
+ exports.reorderList = reorderList;
34472
+
34473
+
34135
34474
  /***/ },
34136
34475
 
34137
34476
  /***/ "./packages/roosterjs-content-model-plugins/lib/edit/EditPlugin.ts"
@@ -34415,6 +34754,9 @@ var deleteAllSegmentBefore = function (context) {
34415
34754
  context.deleteResult = 'range';
34416
34755
  }
34417
34756
  }
34757
+ if (mutableParagraph.segments.length == 1 && mutableParagraph.segments[0] == marker) {
34758
+ mutableParagraph.segments.push((0, roosterjs_content_model_dom_1.createBr)(marker.format));
34759
+ }
34418
34760
  };
34419
34761
  exports.deleteAllSegmentBefore = deleteAllSegmentBefore;
34420
34762
 
@@ -34630,6 +34972,7 @@ var insertNewLine = function (quote, parent, quoteIndex, paragraph) {
34630
34972
  Object.defineProperty(exports, "__esModule", ({ value: true }));
34631
34973
  exports.deleteList = void 0;
34632
34974
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
34975
+ var getListItemFromInsertPoint_1 = __webpack_require__(/*! ../utils/getListItemFromInsertPoint */ "./packages/roosterjs-content-model-plugins/lib/edit/utils/getListItemFromInsertPoint.ts");
34633
34976
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
34634
34977
  /**
34635
34978
  * @internal
@@ -34639,18 +34982,14 @@ var deleteList = function (context) {
34639
34982
  if (context.deleteResult != 'notDeleted') {
34640
34983
  return;
34641
34984
  }
34642
- var _c = context.insertPoint, paragraph = _c.paragraph, marker = _c.marker, path = _c.path;
34643
- var index = (0, roosterjs_content_model_dom_1.getClosestAncestorBlockGroupIndex)(path, ['ListItem'], ['TableCell', 'FormatContainer']);
34644
- var item = path[index];
34645
- var parent = path[index + 1];
34646
- if ((item === null || item === void 0 ? void 0 : item.blockGroupType) == 'ListItem' &&
34647
- item.levels.length > 0 &&
34648
- paragraph.segments[0] == marker &&
34649
- parent) {
34985
+ var paragraph = context.insertPoint.paragraph;
34986
+ var listItemAndParent = (0, getListItemFromInsertPoint_1.getListItemFromInsertPoint)(context.insertPoint);
34987
+ if (listItemAndParent) {
34988
+ var _c = (0, tslib_1.__read)(listItemAndParent, 2), item = _c[0], parent_1 = _c[1];
34650
34989
  var mutableList = (0, roosterjs_content_model_dom_1.mutateBlock)(item);
34651
34990
  var lastLevel = mutableList.levels[mutableList.levels.length - 1];
34652
- var listItemIndex = parent.blocks.indexOf(item);
34653
- var previousItem = parent.blocks[listItemIndex - 1];
34991
+ var listItemIndex = parent_1.blocks.indexOf(item);
34992
+ var previousItem = parent_1.blocks[listItemIndex - 1];
34654
34993
  // 1. If the last level is dummy, just remove it (legacy behavior)
34655
34994
  // 2. If focus is at the beginning of list item and previous block is a list item with the same level count,
34656
34995
  // merge current list item into previous one
@@ -34666,7 +35005,7 @@ var deleteList = function (context) {
34666
35005
  previousItem.levels.length == mutableList.levels.length) {
34667
35006
  var mutablePreviousItem = (0, roosterjs_content_model_dom_1.mutateBlock)(previousItem);
34668
35007
  (_a = mutablePreviousItem.blocks).push.apply(_a, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(mutableList.blocks), false));
34669
- (0, roosterjs_content_model_dom_1.mutateBlock)(parent).blocks.splice(listItemIndex, 1);
35008
+ (0, roosterjs_content_model_dom_1.mutateBlock)(parent_1).blocks.splice(listItemIndex, 1);
34670
35009
  context.deleteResult = 'range';
34671
35010
  }
34672
35011
  else {
@@ -34674,10 +35013,10 @@ var deleteList = function (context) {
34674
35013
  if (mutableList.levels.length > 1) {
34675
35014
  var newListItem = (0, roosterjs_content_model_dom_1.createListItem)(mutableList.levels.slice(0, -1), mutableList.formatHolder.format);
34676
35015
  newListItem.blocks = removedBlocks.map(function (block) { return (0, roosterjs_content_model_dom_1.mutateBlock)(block); });
34677
- (0, roosterjs_content_model_dom_1.mutateBlock)(parent).blocks.splice(listItemIndex + 1, 0, newListItem);
35016
+ (0, roosterjs_content_model_dom_1.mutateBlock)(parent_1).blocks.splice(listItemIndex + 1, 0, newListItem);
34678
35017
  }
34679
35018
  else {
34680
- (_b = (0, roosterjs_content_model_dom_1.mutateBlock)(parent).blocks).splice.apply(_b, (0, tslib_1.__spreadArray)([listItemIndex + 1, 0], (0, tslib_1.__read)(removedBlocks), false));
35019
+ (_b = (0, roosterjs_content_model_dom_1.mutateBlock)(parent_1).blocks).splice.apply(_b, (0, tslib_1.__spreadArray)([listItemIndex + 1, 0], (0, tslib_1.__read)(removedBlocks), false));
34681
35020
  }
34682
35021
  context.deleteResult = 'range';
34683
35022
  }
@@ -35142,6 +35481,11 @@ var handleEnterOnParagraph = function (formatsToPreserveOnMerge) { return functi
35142
35481
  context.deleteResult = 'range';
35143
35482
  context.lastParagraph = newPara;
35144
35483
  context.insertPoint.paragraph = newPara;
35484
+ if (context.formatContext) {
35485
+ context.formatContext.announceData = {
35486
+ defaultStrings: 'newLineInserted',
35487
+ };
35488
+ }
35145
35489
  }
35146
35490
  }; };
35147
35491
  exports.handleEnterOnParagraph = handleEnterOnParagraph;
@@ -35846,6 +36190,37 @@ function getLeafSiblingBlock(path, block, isNext) {
35846
36190
  exports.getLeafSiblingBlock = getLeafSiblingBlock;
35847
36191
 
35848
36192
 
36193
+ /***/ },
36194
+
36195
+ /***/ "./packages/roosterjs-content-model-plugins/lib/edit/utils/getListItemFromInsertPoint.ts"
36196
+ /*!***********************************************************************************************!*\
36197
+ !*** ./packages/roosterjs-content-model-plugins/lib/edit/utils/getListItemFromInsertPoint.ts ***!
36198
+ \***********************************************************************************************/
36199
+ (__unused_webpack_module, exports, __webpack_require__) {
36200
+
36201
+ "use strict";
36202
+
36203
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
36204
+ exports.getListItemFromInsertPoint = void 0;
36205
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
36206
+ /**
36207
+ * @internal
36208
+ */
36209
+ function getListItemFromInsertPoint(insertPoint) {
36210
+ var paragraph = insertPoint.paragraph, marker = insertPoint.marker, path = insertPoint.path;
36211
+ var index = (0, roosterjs_content_model_dom_1.getClosestAncestorBlockGroupIndex)(path, ['ListItem'], ['TableCell', 'FormatContainer']);
36212
+ var item = path[index];
36213
+ var parent = path[index + 1];
36214
+ return (item === null || item === void 0 ? void 0 : item.blockGroupType) == 'ListItem' &&
36215
+ item.levels.length > 0 &&
36216
+ paragraph.segments[0] == marker &&
36217
+ parent
36218
+ ? [item, parent]
36219
+ : null;
36220
+ }
36221
+ exports.getListItemFromInsertPoint = getListItemFromInsertPoint;
36222
+
36223
+
35849
36224
  /***/ },
35850
36225
 
35851
36226
  /***/ "./packages/roosterjs-content-model-plugins/lib/edit/utils/preserveParagraphFormat.ts"