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