roosterjs-content-model-core 9.45.2 → 9.46.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.
Files changed (67) hide show
  1. package/lib/command/cutCopy/getContentForCopy.js +4 -15
  2. package/lib/command/cutCopy/getContentForCopy.js.map +1 -1
  3. package/lib/coreApi/setDOMSelection/setDOMSelection.js +5 -58
  4. package/lib/coreApi/setDOMSelection/setDOMSelection.js.map +1 -1
  5. package/lib/coreApi/setDOMSelection/setTableCellsStyle.d.ts +17 -0
  6. package/lib/coreApi/setDOMSelection/setTableCellsStyle.js +85 -0
  7. package/lib/coreApi/setDOMSelection/setTableCellsStyle.js.map +1 -0
  8. package/lib/coreApi/setDOMSelection/toggleTableSelection.d.ts +8 -0
  9. package/lib/coreApi/setDOMSelection/toggleTableSelection.js +34 -0
  10. package/lib/coreApi/setDOMSelection/toggleTableSelection.js.map +1 -0
  11. package/lib/coreApi/switchShadowEdit/switchShadowEdit.js +3 -0
  12. package/lib/coreApi/switchShadowEdit/switchShadowEdit.js.map +1 -1
  13. package/lib/corePlugin/selection/SelectionPlugin.js +3 -0
  14. package/lib/corePlugin/selection/SelectionPlugin.js.map +1 -1
  15. package/lib/editor/Editor.js +1 -1
  16. package/lib/editor/Editor.js.map +1 -1
  17. package/lib-amd/command/cutCopy/getContentForCopy.js +5 -14
  18. package/lib-amd/command/cutCopy/getContentForCopy.js.map +1 -1
  19. package/lib-amd/coreApi/setDOMSelection/setDOMSelection.js +4 -58
  20. package/lib-amd/coreApi/setDOMSelection/setDOMSelection.js.map +1 -1
  21. package/lib-amd/coreApi/setDOMSelection/setTableCellsStyle.d.ts +17 -0
  22. package/lib-amd/coreApi/setDOMSelection/setTableCellsStyle.js +85 -0
  23. package/lib-amd/coreApi/setDOMSelection/setTableCellsStyle.js.map +1 -0
  24. package/lib-amd/coreApi/setDOMSelection/toggleTableSelection.d.ts +8 -0
  25. package/lib-amd/coreApi/setDOMSelection/toggleTableSelection.js +34 -0
  26. package/lib-amd/coreApi/setDOMSelection/toggleTableSelection.js.map +1 -0
  27. package/lib-amd/coreApi/switchShadowEdit/switchShadowEdit.js +3 -1
  28. package/lib-amd/coreApi/switchShadowEdit/switchShadowEdit.js.map +1 -1
  29. package/lib-amd/corePlugin/selection/SelectionPlugin.js +3 -0
  30. package/lib-amd/corePlugin/selection/SelectionPlugin.js.map +1 -1
  31. package/lib-amd/editor/Editor.js +1 -1
  32. package/lib-amd/editor/Editor.js.map +1 -1
  33. package/lib-mjs/command/cutCopy/getContentForCopy.js +5 -16
  34. package/lib-mjs/command/cutCopy/getContentForCopy.js.map +1 -1
  35. package/lib-mjs/coreApi/setDOMSelection/setDOMSelection.js +5 -58
  36. package/lib-mjs/coreApi/setDOMSelection/setDOMSelection.js.map +1 -1
  37. package/lib-mjs/coreApi/setDOMSelection/setTableCellsStyle.d.ts +17 -0
  38. package/lib-mjs/coreApi/setDOMSelection/setTableCellsStyle.js +80 -0
  39. package/lib-mjs/coreApi/setDOMSelection/setTableCellsStyle.js.map +1 -0
  40. package/lib-mjs/coreApi/setDOMSelection/toggleTableSelection.d.ts +8 -0
  41. package/lib-mjs/coreApi/setDOMSelection/toggleTableSelection.js +30 -0
  42. package/lib-mjs/coreApi/setDOMSelection/toggleTableSelection.js.map +1 -0
  43. package/lib-mjs/coreApi/switchShadowEdit/switchShadowEdit.js +3 -0
  44. package/lib-mjs/coreApi/switchShadowEdit/switchShadowEdit.js.map +1 -1
  45. package/lib-mjs/corePlugin/selection/SelectionPlugin.js +3 -0
  46. package/lib-mjs/corePlugin/selection/SelectionPlugin.js.map +1 -1
  47. package/lib-mjs/editor/Editor.js +1 -1
  48. package/lib-mjs/editor/Editor.js.map +1 -1
  49. package/package.json +3 -3
  50. package/lib/command/cutCopy/preprocessTable.d.ts +0 -5
  51. package/lib/command/cutCopy/preprocessTable.js +0 -22
  52. package/lib/command/cutCopy/preprocessTable.js.map +0 -1
  53. package/lib/command/cutCopy/pruneUnselectedModel.d.ts +0 -5
  54. package/lib/command/cutCopy/pruneUnselectedModel.js +0 -135
  55. package/lib/command/cutCopy/pruneUnselectedModel.js.map +0 -1
  56. package/lib-amd/command/cutCopy/preprocessTable.d.ts +0 -5
  57. package/lib-amd/command/cutCopy/preprocessTable.js +0 -22
  58. package/lib-amd/command/cutCopy/preprocessTable.js.map +0 -1
  59. package/lib-amd/command/cutCopy/pruneUnselectedModel.d.ts +0 -5
  60. package/lib-amd/command/cutCopy/pruneUnselectedModel.js +0 -136
  61. package/lib-amd/command/cutCopy/pruneUnselectedModel.js.map +0 -1
  62. package/lib-mjs/command/cutCopy/preprocessTable.d.ts +0 -5
  63. package/lib-mjs/command/cutCopy/preprocessTable.js +0 -18
  64. package/lib-mjs/command/cutCopy/preprocessTable.js.map +0 -1
  65. package/lib-mjs/command/cutCopy/pruneUnselectedModel.d.ts +0 -5
  66. package/lib-mjs/command/cutCopy/pruneUnselectedModel.js +0 -131
  67. package/lib-mjs/command/cutCopy/pruneUnselectedModel.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"setDOMSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/setDOMSelection/setDOMSelection.ts"],"names":[],"mappings":"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","sourcesContent":["import { addRangeToSelection } from './addRangeToSelection';\nimport { areSameSelections } from '../../corePlugin/cache/areSameSelections';\nimport { ensureUniqueId } from '../setEditorStyle/ensureUniqueId';\nimport { findLastedCoInMergedCell } from './findLastedCoInMergedCell';\nimport { findTableCellElement } from './findTableCellElement';\nimport { toggleCaret } from './toggleCaret';\nimport {\n getSafeIdSelector,\n isNodeOfType,\n parseTableCells,\n toArray,\n} from 'roosterjs-content-model-dom';\nimport type {\n ParsedTable,\n SelectionChangedEvent,\n SetDOMSelection,\n TableCellCoordinate,\n} from 'roosterjs-content-model-types';\n\nconst DOM_SELECTION_CSS_KEY = '_DOMSelection';\nconst HIDE_SELECTION_CSS_KEY = '_DOMSelectionHideSelection';\nconst IMAGE_ID = 'image';\nconst TABLE_ID = 'table';\nconst TRANSPARENT_SELECTION_CSS_RULE = 'background-color: transparent !important;';\nconst SELECTION_SELECTOR = '*::selection';\nconst DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';\n\n/**\n * @internal\n */\nexport const setDOMSelection: SetDOMSelection = (core, selection, skipSelectionChangedEvent) => {\n const existingSelection = core.api.getDOMSelection(core);\n\n if (existingSelection && selection && areSameSelections(existingSelection, selection)) {\n return;\n }\n\n // We are applying a new selection, so we don't need to apply cached selection in DOMEventPlugin.\n // Set skipReselectOnFocus to skip this behavior\n const skipReselectOnFocus = core.selection.skipReselectOnFocus;\n\n const doc = core.physicalRoot.ownerDocument;\n const isDarkMode = core.lifecycle.isDarkMode;\n core.selection.skipReselectOnFocus = true;\n core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, null /*cssRule*/);\n core.api.setEditorStyle(core, HIDE_SELECTION_CSS_KEY, null /*cssRule*/);\n\n toggleCaret(core, false /* hide */);\n\n try {\n switch (selection?.type) {\n case 'image':\n const image = selection.image;\n\n core.selection.selection = selection;\n\n const imageSelectionColor = isDarkMode\n ? core.selection.imageSelectionBorderColorDark\n : core.selection.imageSelectionBorderColor;\n\n core.api.setEditorStyle(\n core,\n DOM_SELECTION_CSS_KEY,\n `outline-style:solid!important; outline-color:${\n imageSelectionColor || DEFAULT_SELECTION_BORDER_COLOR\n }!important;`,\n [getSafeIdSelector(ensureUniqueId(image, IMAGE_ID))]\n );\n core.api.setEditorStyle(\n core,\n HIDE_SELECTION_CSS_KEY,\n TRANSPARENT_SELECTION_CSS_RULE,\n [SELECTION_SELECTOR]\n );\n\n setRangeSelection(doc, image, false /* collapse */);\n break;\n case 'table':\n const { table, firstColumn, firstRow, lastColumn, lastRow } = selection;\n const parsedTable = parseTableCells(selection.table);\n let firstCell = {\n row: Math.min(firstRow, lastRow),\n col: Math.min(firstColumn, lastColumn),\n cell: <HTMLTableCellElement | null>null,\n };\n let lastCell = {\n row: Math.max(firstRow, lastRow),\n col: Math.max(firstColumn, lastColumn),\n };\n\n firstCell = findTableCellElement(parsedTable, firstCell) || firstCell;\n lastCell = findLastedCoInMergedCell(parsedTable, lastCell) || lastCell;\n\n if (\n isNaN(firstCell.row) ||\n isNaN(firstCell.col) ||\n isNaN(lastCell.row) ||\n isNaN(lastCell.col)\n ) {\n return;\n }\n\n selection = {\n type: 'table',\n table,\n firstRow: firstCell.row,\n firstColumn: firstCell.col,\n lastRow: lastCell.row,\n lastColumn: lastCell.col,\n tableSelectionInfo: selection.tableSelectionInfo,\n };\n\n const tableId = ensureUniqueId(table, TABLE_ID);\n const tableSelector = getSafeIdSelector(tableId);\n\n const tableSelectors =\n firstCell.row == 0 &&\n firstCell.col == 0 &&\n lastCell.row == parsedTable.length - 1 &&\n lastCell.col == (parsedTable[lastCell.row]?.length ?? 0) - 1\n ? [tableSelector, `${tableSelector} *`]\n : handleTableSelected(\n parsedTable,\n tableSelector,\n table,\n firstCell,\n lastCell\n );\n\n core.selection.selection = selection;\n\n const tableSelectionColor = isDarkMode\n ? core.selection.tableCellSelectionBackgroundColorDark\n : core.selection.tableCellSelectionBackgroundColor;\n core.api.setEditorStyle(\n core,\n DOM_SELECTION_CSS_KEY,\n `background-color:${tableSelectionColor}!important;`,\n tableSelectors\n );\n core.api.setEditorStyle(\n core,\n HIDE_SELECTION_CSS_KEY,\n TRANSPARENT_SELECTION_CSS_RULE,\n [SELECTION_SELECTOR]\n );\n\n toggleCaret(core, true /* hide */);\n\n const nodeToSelect = firstCell.cell?.firstElementChild || firstCell.cell;\n\n if (nodeToSelect) {\n setRangeSelection(\n doc,\n (nodeToSelect as HTMLElement) || undefined,\n true /* collapse */\n );\n }\n\n break;\n case 'range':\n addRangeToSelection(doc, selection.range, selection.isReverted);\n\n core.selection.selection = core.domHelper.hasFocus() ? null : selection;\n break;\n\n default:\n core.selection.selection = null;\n break;\n }\n } finally {\n core.selection.skipReselectOnFocus = skipReselectOnFocus;\n }\n\n if (!skipSelectionChangedEvent) {\n const eventData: SelectionChangedEvent = {\n eventType: 'selectionChanged',\n newSelection: selection,\n };\n\n core.api.triggerEvent(core, eventData, true /*broadcast*/);\n }\n};\n\nfunction handleTableSelected(\n parsedTable: ParsedTable,\n tableSelector: string,\n table: HTMLTableElement,\n firstCell: TableCellCoordinate,\n lastCell: TableCellCoordinate\n) {\n const selectors: string[] = [];\n\n // Get whether table has thead, tbody or tfoot, then Set the start and end of each of the table children,\n // so we can build the selector according the element between the table and the row.\n let cont = 0;\n const indexes = toArray(table.childNodes)\n .filter(\n (node): node is HTMLTableSectionElement =>\n ['THEAD', 'TBODY', 'TFOOT'].indexOf(\n isNodeOfType(node, 'ELEMENT_NODE') ? node.tagName : ''\n ) > -1\n )\n .map(node => {\n const result = {\n el: node.tagName,\n start: cont,\n end: node.childNodes.length + cont,\n };\n\n cont = result.end;\n return result;\n });\n\n parsedTable.forEach((row, rowIndex) => {\n let tdCount = 0;\n\n //Get current TBODY/THEAD/TFOOT\n const midElement = indexes.filter(ind => ind.start <= rowIndex && ind.end > rowIndex)[0];\n const middleElSelector = midElement ? '>' + midElement.el + '>' : '>';\n const currentRow =\n midElement && rowIndex + 1 >= midElement.start\n ? rowIndex + 1 - midElement.start\n : rowIndex + 1;\n\n for (let cellIndex = 0; cellIndex < row.length; cellIndex++) {\n const cell = row[cellIndex];\n\n if (typeof cell == 'object') {\n tdCount++;\n\n if (\n rowIndex >= firstCell.row &&\n rowIndex <= lastCell.row &&\n cellIndex >= firstCell.col &&\n cellIndex <= lastCell.col\n ) {\n const selector = `${tableSelector}${middleElSelector} tr:nth-child(${currentRow})>${cell.tagName}:nth-child(${tdCount})`;\n\n selectors.push(selector, selector + ' *');\n }\n }\n }\n });\n\n return selectors;\n}\n\nfunction setRangeSelection(doc: Document, element: HTMLElement | undefined, collapse: boolean) {\n if (element && doc.contains(element)) {\n const range = doc.createRange();\n let isReverted: boolean | undefined = undefined;\n\n range.selectNode(element);\n if (collapse) {\n range.collapse();\n } else {\n const selection = doc.defaultView?.getSelection();\n const range = selection && selection.rangeCount > 0 && selection.getRangeAt(0);\n if (selection && range) {\n isReverted =\n selection.focusNode != range.endContainer ||\n selection.focusOffset != range.endOffset;\n }\n }\n\n addRangeToSelection(doc, range, isReverted);\n }\n}\n"]}
1
+ {"version":3,"file":"setDOMSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/setDOMSelection/setDOMSelection.ts"],"names":[],"mappings":"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","sourcesContent":["import { addRangeToSelection } from './addRangeToSelection';\nimport { areSameSelections } from '../../corePlugin/cache/areSameSelections';\nimport { ensureUniqueId } from '../setEditorStyle/ensureUniqueId';\nimport { findLastedCoInMergedCell } from './findLastedCoInMergedCell';\nimport { findTableCellElement } from './findTableCellElement';\nimport { getSafeIdSelector, parseTableCells } from 'roosterjs-content-model-dom';\nimport { setTableCellsStyle } from './setTableCellsStyle';\nimport { toggleCaret } from './toggleCaret';\nimport type { SelectionChangedEvent, SetDOMSelection } from 'roosterjs-content-model-types';\n\nconst DOM_SELECTION_CSS_KEY = '_DOMSelection';\nconst HIDE_SELECTION_CSS_KEY = '_DOMSelectionHideSelection';\nconst IMAGE_ID = 'image';\nconst TRANSPARENT_SELECTION_CSS_RULE = 'background-color: transparent !important;';\nconst SELECTION_SELECTOR = '*::selection';\nconst DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';\n\n/**\n * @internal\n */\nexport const setDOMSelection: SetDOMSelection = (core, selection, skipSelectionChangedEvent) => {\n const existingSelection = core.api.getDOMSelection(core);\n\n if (existingSelection && selection && areSameSelections(existingSelection, selection)) {\n return;\n }\n\n // We are applying a new selection, so we don't need to apply cached selection in DOMEventPlugin.\n // Set skipReselectOnFocus to skip this behavior\n const skipReselectOnFocus = core.selection.skipReselectOnFocus;\n\n const doc = core.physicalRoot.ownerDocument;\n const isDarkMode = core.lifecycle.isDarkMode;\n core.selection.skipReselectOnFocus = true;\n core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, null /*cssRule*/);\n core.api.setEditorStyle(core, HIDE_SELECTION_CSS_KEY, null /*cssRule*/);\n\n toggleCaret(core, false /* hide */);\n\n try {\n switch (selection?.type) {\n case 'image':\n const image = selection.image;\n\n core.selection.selection = selection;\n\n const imageSelectionColor = isDarkMode\n ? core.selection.imageSelectionBorderColorDark\n : core.selection.imageSelectionBorderColor;\n\n core.api.setEditorStyle(\n core,\n DOM_SELECTION_CSS_KEY,\n `outline-style:solid!important; outline-color:${\n imageSelectionColor || DEFAULT_SELECTION_BORDER_COLOR\n }!important;`,\n [getSafeIdSelector(ensureUniqueId(image, IMAGE_ID))]\n );\n core.api.setEditorStyle(\n core,\n HIDE_SELECTION_CSS_KEY,\n TRANSPARENT_SELECTION_CSS_RULE,\n [SELECTION_SELECTOR]\n );\n\n setRangeSelection(doc, image, false /* collapse */);\n break;\n case 'table':\n const { table, firstColumn, firstRow, lastColumn, lastRow } = selection;\n const parsedTable = parseTableCells(selection.table);\n let firstCell = {\n row: Math.min(firstRow, lastRow),\n col: Math.min(firstColumn, lastColumn),\n cell: <HTMLTableCellElement | null>null,\n };\n let lastCell = {\n row: Math.max(firstRow, lastRow),\n col: Math.max(firstColumn, lastColumn),\n };\n\n firstCell = findTableCellElement(parsedTable, firstCell) || firstCell;\n lastCell = findLastedCoInMergedCell(parsedTable, lastCell) || lastCell;\n\n if (\n isNaN(firstCell.row) ||\n isNaN(firstCell.col) ||\n isNaN(lastCell.row) ||\n isNaN(lastCell.col)\n ) {\n return;\n }\n\n selection = {\n type: 'table',\n table,\n firstRow: firstCell.row,\n firstColumn: firstCell.col,\n lastRow: lastCell.row,\n lastColumn: lastCell.col,\n tableSelectionInfo: selection.tableSelectionInfo,\n };\n\n core.selection.selection = selection;\n\n setTableCellsStyle(core, table, parsedTable, firstCell, lastCell);\n core.api.setEditorStyle(\n core,\n HIDE_SELECTION_CSS_KEY,\n TRANSPARENT_SELECTION_CSS_RULE,\n [SELECTION_SELECTOR]\n );\n\n toggleCaret(core, true /* hide */);\n\n const nodeToSelect = firstCell.cell?.firstElementChild || firstCell.cell;\n\n if (nodeToSelect) {\n setRangeSelection(\n doc,\n (nodeToSelect as HTMLElement) || undefined,\n true /* collapse */\n );\n }\n\n break;\n case 'range':\n addRangeToSelection(doc, selection.range, selection.isReverted);\n\n core.selection.selection = core.domHelper.hasFocus() ? null : selection;\n break;\n\n default:\n core.selection.selection = null;\n break;\n }\n } finally {\n core.selection.skipReselectOnFocus = skipReselectOnFocus;\n }\n\n if (!skipSelectionChangedEvent) {\n const eventData: SelectionChangedEvent = {\n eventType: 'selectionChanged',\n newSelection: selection,\n };\n\n core.api.triggerEvent(core, eventData, true /*broadcast*/);\n }\n};\n\nfunction setRangeSelection(doc: Document, element: HTMLElement | undefined, collapse: boolean) {\n if (element && doc.contains(element)) {\n const range = doc.createRange();\n let isReverted: boolean | undefined = undefined;\n\n range.selectNode(element);\n if (collapse) {\n range.collapse();\n } else {\n const selection = doc.defaultView?.getSelection();\n const range = selection && selection.rangeCount > 0 && selection.getRangeAt(0);\n if (selection && range) {\n isReverted =\n selection.focusNode != range.endContainer ||\n selection.focusOffset != range.endOffset;\n }\n }\n\n addRangeToSelection(doc, range, isReverted);\n }\n}\n"]}
@@ -0,0 +1,17 @@
1
+ import type { EditorCore, ParsedTable, TableCellCoordinate } from 'roosterjs-content-model-types';
2
+ /**
3
+ * @internal
4
+ * Remove table cell selection styles
5
+ * @param core The EditorCore object
6
+ */
7
+ export declare function removeTableCellsStyle(core: EditorCore): void;
8
+ /**
9
+ * @internal
10
+ * Set style for table cells in the selection
11
+ * @param core The EditorCore object
12
+ * @param table The HTML table element
13
+ * @param parsedTable The parsed table structure
14
+ * @param firstCell The coordinates of the first selected cell
15
+ * @param lastCell The coordinates of the last selected cell
16
+ */
17
+ export declare function setTableCellsStyle(core: EditorCore, table: HTMLTableElement, parsedTable: ParsedTable, firstCell: TableCellCoordinate, lastCell: TableCellCoordinate): void;
@@ -0,0 +1,85 @@
1
+ define(["require", "exports", "../setEditorStyle/ensureUniqueId", "roosterjs-content-model-dom"], function (require, exports, ensureUniqueId_1, roosterjs_content_model_dom_1) {
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.setTableCellsStyle = exports.removeTableCellsStyle = void 0;
5
+ var DOM_SELECTION_CSS_KEY = '_DOMSelection';
6
+ var TABLE_ID = 'table';
7
+ /**
8
+ * @internal
9
+ * Remove table cell selection styles
10
+ * @param core The EditorCore object
11
+ */
12
+ function removeTableCellsStyle(core) {
13
+ core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, '');
14
+ }
15
+ exports.removeTableCellsStyle = removeTableCellsStyle;
16
+ /**
17
+ * @internal
18
+ * Set style for table cells in the selection
19
+ * @param core The EditorCore object
20
+ * @param table The HTML table element
21
+ * @param parsedTable The parsed table structure
22
+ * @param firstCell The coordinates of the first selected cell
23
+ * @param lastCell The coordinates of the last selected cell
24
+ */
25
+ function setTableCellsStyle(core, table, parsedTable, firstCell, lastCell) {
26
+ var _a, _b;
27
+ var tableId = (0, ensureUniqueId_1.ensureUniqueId)(table, TABLE_ID);
28
+ var tableSelector = (0, roosterjs_content_model_dom_1.getSafeIdSelector)(tableId);
29
+ var tableSelectionColor = core.lifecycle.isDarkMode
30
+ ? core.selection.tableCellSelectionBackgroundColorDark
31
+ : core.selection.tableCellSelectionBackgroundColor;
32
+ var tableSelectors = firstCell.row == 0 &&
33
+ firstCell.col == 0 &&
34
+ lastCell.row == parsedTable.length - 1 &&
35
+ lastCell.col == ((_b = (_a = parsedTable[lastCell.row]) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) - 1
36
+ ? [tableSelector, tableSelector + " *"]
37
+ : buildTableSelectors(parsedTable, tableSelector, table, firstCell, lastCell);
38
+ core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, "background-color:" + tableSelectionColor + "!important;", tableSelectors);
39
+ }
40
+ exports.setTableCellsStyle = setTableCellsStyle;
41
+ /**
42
+ * @internal
43
+ * Build CSS selectors for table cells within the selection range
44
+ */
45
+ function buildTableSelectors(parsedTable, tableSelector, table, firstCell, lastCell) {
46
+ var selectors = [];
47
+ var cont = 0;
48
+ var indexes = (0, roosterjs_content_model_dom_1.toArray)(table.childNodes)
49
+ .filter(function (node) {
50
+ return ['THEAD', 'TBODY', 'TFOOT'].indexOf((0, roosterjs_content_model_dom_1.isNodeOfType)(node, 'ELEMENT_NODE') ? node.tagName : '') > -1;
51
+ })
52
+ .map(function (node) {
53
+ var result = {
54
+ el: node.tagName,
55
+ start: cont,
56
+ end: node.childNodes.length + cont,
57
+ };
58
+ cont = result.end;
59
+ return result;
60
+ });
61
+ parsedTable.forEach(function (row, rowIndex) {
62
+ var tdCount = 0;
63
+ var midElement = indexes.filter(function (ind) { return ind.start <= rowIndex && ind.end > rowIndex; })[0];
64
+ var middleElSelector = midElement ? '>' + midElement.el + '>' : '>';
65
+ var currentRow = midElement && rowIndex + 1 >= midElement.start
66
+ ? rowIndex + 1 - midElement.start
67
+ : rowIndex + 1;
68
+ for (var cellIndex = 0; cellIndex < row.length; cellIndex++) {
69
+ var cell = row[cellIndex];
70
+ if (typeof cell == 'object') {
71
+ tdCount++;
72
+ if (rowIndex >= firstCell.row &&
73
+ rowIndex <= lastCell.row &&
74
+ cellIndex >= firstCell.col &&
75
+ cellIndex <= lastCell.col) {
76
+ var selector = "" + tableSelector + middleElSelector + " tr:nth-child(" + currentRow + ")>" + cell.tagName + ":nth-child(" + tdCount + ")";
77
+ selectors.push(selector, selector + ' *');
78
+ }
79
+ }
80
+ }
81
+ });
82
+ return selectors;
83
+ }
84
+ });
85
+ //# sourceMappingURL=setTableCellsStyle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setTableCellsStyle.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/setDOMSelection/setTableCellsStyle.ts"],"names":[],"mappings":"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","sourcesContent":["import { ensureUniqueId } from '../setEditorStyle/ensureUniqueId';\nimport { getSafeIdSelector, isNodeOfType, toArray } from 'roosterjs-content-model-dom';\nimport type { EditorCore, ParsedTable, TableCellCoordinate } from 'roosterjs-content-model-types';\n\nconst DOM_SELECTION_CSS_KEY = '_DOMSelection';\nconst TABLE_ID = 'table';\n\n/**\n * @internal\n * Remove table cell selection styles\n * @param core The EditorCore object\n */\nexport function removeTableCellsStyle(core: EditorCore) {\n core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, '');\n}\n\n/**\n * @internal\n * Set style for table cells in the selection\n * @param core The EditorCore object\n * @param table The HTML table element\n * @param parsedTable The parsed table structure\n * @param firstCell The coordinates of the first selected cell\n * @param lastCell The coordinates of the last selected cell\n */\nexport function setTableCellsStyle(\n core: EditorCore,\n table: HTMLTableElement,\n parsedTable: ParsedTable,\n firstCell: TableCellCoordinate,\n lastCell: TableCellCoordinate\n) {\n const tableId = ensureUniqueId(table, TABLE_ID);\n const tableSelector = getSafeIdSelector(tableId);\n const tableSelectionColor = core.lifecycle.isDarkMode\n ? core.selection.tableCellSelectionBackgroundColorDark\n : core.selection.tableCellSelectionBackgroundColor;\n\n const tableSelectors =\n firstCell.row == 0 &&\n firstCell.col == 0 &&\n lastCell.row == parsedTable.length - 1 &&\n lastCell.col == (parsedTable[lastCell.row]?.length ?? 0) - 1\n ? [tableSelector, `${tableSelector} *`]\n : buildTableSelectors(parsedTable, tableSelector, table, firstCell, lastCell);\n\n core.api.setEditorStyle(\n core,\n DOM_SELECTION_CSS_KEY,\n `background-color:${tableSelectionColor}!important;`,\n tableSelectors\n );\n}\n\n/**\n * @internal\n * Build CSS selectors for table cells within the selection range\n */\nfunction buildTableSelectors(\n parsedTable: ParsedTable,\n tableSelector: string,\n table: HTMLTableElement,\n firstCell: TableCellCoordinate,\n lastCell: TableCellCoordinate\n): string[] {\n const selectors: string[] = [];\n\n let cont = 0;\n const indexes = toArray(table.childNodes)\n .filter(\n (node): node is HTMLTableSectionElement =>\n ['THEAD', 'TBODY', 'TFOOT'].indexOf(\n isNodeOfType(node, 'ELEMENT_NODE') ? node.tagName : ''\n ) > -1\n )\n .map(node => {\n const result = {\n el: node.tagName,\n start: cont,\n end: node.childNodes.length + cont,\n };\n\n cont = result.end;\n return result;\n });\n\n parsedTable.forEach((row, rowIndex) => {\n let tdCount = 0;\n\n const midElement = indexes.filter(ind => ind.start <= rowIndex && ind.end > rowIndex)[0];\n const middleElSelector = midElement ? '>' + midElement.el + '>' : '>';\n const currentRow =\n midElement && rowIndex + 1 >= midElement.start\n ? rowIndex + 1 - midElement.start\n : rowIndex + 1;\n\n for (let cellIndex = 0; cellIndex < row.length; cellIndex++) {\n const cell = row[cellIndex];\n\n if (typeof cell == 'object') {\n tdCount++;\n\n if (\n rowIndex >= firstCell.row &&\n rowIndex <= lastCell.row &&\n cellIndex >= firstCell.col &&\n cellIndex <= lastCell.col\n ) {\n const selector = `${tableSelector}${middleElSelector} tr:nth-child(${currentRow})>${cell.tagName}:nth-child(${tdCount})`;\n\n selectors.push(selector, selector + ' *');\n }\n }\n }\n });\n\n return selectors;\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import type { EditorCore } from 'roosterjs-content-model-types';
2
+ /**
3
+ * @internal
4
+ * Toggle table selection styles on/off
5
+ * @param core The EditorCore object
6
+ * @param isHiding True to hide the table selection background, false to show it
7
+ */
8
+ export declare function toggleTableSelection(core: EditorCore, isHiding: boolean): void;
@@ -0,0 +1,34 @@
1
+ define(["require", "exports", "roosterjs-content-model-dom", "./setTableCellsStyle"], function (require, exports, roosterjs_content_model_dom_1, setTableCellsStyle_1) {
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.toggleTableSelection = void 0;
5
+ /**
6
+ * @internal
7
+ * Toggle table selection styles on/off
8
+ * @param core The EditorCore object
9
+ * @param isHiding True to hide the table selection background, false to show it
10
+ */
11
+ function toggleTableSelection(core, isHiding) {
12
+ var selection = core.selection.selection;
13
+ if ((selection === null || selection === void 0 ? void 0 : selection.type) === 'table') {
14
+ if (isHiding) {
15
+ (0, setTableCellsStyle_1.removeTableCellsStyle)(core);
16
+ }
17
+ else {
18
+ var table = selection.table, firstColumn = selection.firstColumn, firstRow = selection.firstRow, lastColumn = selection.lastColumn, lastRow = selection.lastRow;
19
+ var parsedTable = (0, roosterjs_content_model_dom_1.parseTableCells)(table);
20
+ var firstCell = {
21
+ row: Math.min(firstRow, lastRow),
22
+ col: Math.min(firstColumn, lastColumn),
23
+ };
24
+ var lastCell = {
25
+ row: Math.max(firstRow, lastRow),
26
+ col: Math.max(firstColumn, lastColumn),
27
+ };
28
+ (0, setTableCellsStyle_1.setTableCellsStyle)(core, table, parsedTable, firstCell, lastCell);
29
+ }
30
+ }
31
+ }
32
+ exports.toggleTableSelection = toggleTableSelection;
33
+ });
34
+ //# sourceMappingURL=toggleTableSelection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toggleTableSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/setDOMSelection/toggleTableSelection.ts"],"names":[],"mappings":";;;;IAKA;;;;;OAKG;IACH,SAAgB,oBAAoB,CAAC,IAAgB,EAAE,QAAiB;QACpE,IAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;QAE3C,IAAI,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,IAAI,MAAK,OAAO,EAAE;YAC7B,IAAI,QAAQ,EAAE;gBACV,IAAA,0CAAqB,EAAC,IAAI,CAAC,CAAC;aAC/B;iBAAM;gBACK,IAAA,KAAK,GAAiD,SAAS,MAA1D,EAAE,WAAW,GAAoC,SAAS,YAA7C,EAAE,QAAQ,GAA0B,SAAS,SAAnC,EAAE,UAAU,GAAc,SAAS,WAAvB,EAAE,OAAO,GAAK,SAAS,QAAd,CAAe;gBACxE,IAAM,WAAW,GAAG,IAAA,6CAAe,EAAC,KAAK,CAAC,CAAC;gBAC3C,IAAM,SAAS,GAAwB;oBACnC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC;oBAChC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC;iBACzC,CAAC;gBACF,IAAM,QAAQ,GAAwB;oBAClC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC;oBAChC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC;iBACzC,CAAC;gBAEF,IAAA,uCAAkB,EAAC,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;aACrE;SACJ;IACL,CAAC;IArBD,oDAqBC","sourcesContent":["import { parseTableCells } from 'roosterjs-content-model-dom';\nimport { removeTableCellsStyle, setTableCellsStyle } from './setTableCellsStyle';\n\nimport type { EditorCore, TableCellCoordinate } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Toggle table selection styles on/off\n * @param core The EditorCore object\n * @param isHiding True to hide the table selection background, false to show it\n */\nexport function toggleTableSelection(core: EditorCore, isHiding: boolean) {\n const selection = core.selection.selection;\n\n if (selection?.type === 'table') {\n if (isHiding) {\n removeTableCellsStyle(core);\n } else {\n const { table, firstColumn, firstRow, lastColumn, lastRow } = selection;\n const parsedTable = parseTableCells(table);\n const firstCell: TableCellCoordinate = {\n row: Math.min(firstRow, lastRow),\n col: Math.min(firstColumn, lastColumn),\n };\n const lastCell: TableCellCoordinate = {\n row: Math.max(firstRow, lastRow),\n col: Math.max(firstColumn, lastColumn),\n };\n\n setTableCellsStyle(core, table, parsedTable, firstCell, lastCell);\n }\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- define(["require", "exports", "roosterjs-content-model-dom", "../setDOMSelection/toggleCaret"], function (require, exports, roosterjs_content_model_dom_1, toggleCaret_1) {
1
+ define(["require", "exports", "roosterjs-content-model-dom", "../setDOMSelection/toggleCaret", "../setDOMSelection/toggleTableSelection"], function (require, exports, roosterjs_content_model_dom_1, toggleCaret_1, toggleTableSelection_1) {
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.switchShadowEdit = void 0;
@@ -25,11 +25,13 @@ define(["require", "exports", "roosterjs-content-model-dom", "../setDOMSelection
25
25
  core.cache.cachedModel = model;
26
26
  }
27
27
  (0, toggleCaret_1.toggleCaret)(core, true /* hide */);
28
+ (0, toggleTableSelection_1.toggleTableSelection)(core, true /* hide */);
28
29
  core.lifecycle.shadowEditFragment = fragment;
29
30
  }
30
31
  else {
31
32
  core.lifecycle.shadowEditFragment = null;
32
33
  (0, toggleCaret_1.toggleCaret)(core, false /* hide */);
34
+ (0, toggleTableSelection_1.toggleTableSelection)(core, false /* hide */);
33
35
  core.api.triggerEvent(core, {
34
36
  eventType: 'leavingShadowEdit',
35
37
  }, false /*broadcast*/);
@@ -1 +1 @@
1
- {"version":3,"file":"switchShadowEdit.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/switchShadowEdit/switchShadowEdit.ts"],"names":[],"mappings":";;;;IAIA;;;;;OAKG;IACI,IAAM,gBAAgB,GAAqB,UAAC,UAAU,EAAE,IAAI;QAC/D,IAAM,IAAI,GAAG,UAAU,CAAC;QAExB,IAAI,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE;YAC7C,IAAI,IAAI,EAAE;gBACN,IAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACjF,IAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,sBAAsB,EAAE,CAAC;gBACzE,IAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAE7D,IAAA,4CAAc,EAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;gBAErC,IAAI,CAAC,GAAG,CAAC,YAAY,CACjB,IAAI,EACJ;oBACI,SAAS,EAAE,mBAAmB;iBACjC,EACD,KAAK,CAAC,aAAa,CACtB,CAAC;gBAEF,oIAAoI;gBACpI,6DAA6D;gBAC7D,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,KAAK,EAAE;oBAClC,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;iBAClC;gBAED,IAAA,yBAAW,EAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;gBAEnC,IAAI,CAAC,SAAS,CAAC,kBAAkB,GAAG,QAAQ,CAAC;aAChD;iBAAM;gBACH,IAAI,CAAC,SAAS,CAAC,kBAAkB,GAAG,IAAI,CAAC;gBAEzC,IAAA,yBAAW,EAAC,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;gBAEpC,IAAI,CAAC,GAAG,CAAC,YAAY,CACjB,IAAI,EACJ;oBACI,SAAS,EAAE,mBAAmB;iBACjC,EACD,KAAK,CAAC,aAAa,CACtB,CAAC;gBAEF,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;oBACxB,iDAAiD;oBACjD,IAAA,+CAAiB,EAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,cAAO,CAAC,CAAC,CAAC;oBAEpD,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;wBACnD,eAAe,EAAE,IAAI,EAAE,qGAAqG;qBAC/H,CAAC,CAAC;iBACN;aACJ;SACJ;IACL,CAAC,CAAC;IAnDW,QAAA,gBAAgB,oBAmD3B","sourcesContent":["import { iterateSelections, moveChildNodes } from 'roosterjs-content-model-dom';\nimport { toggleCaret } from '../setDOMSelection/toggleCaret';\nimport type { SwitchShadowEdit } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Switch the Shadow Edit mode of editor On/Off\n * @param editorCore The EditorCore object\n * @param isOn True to switch On, False to switch Off\n */\nexport const switchShadowEdit: SwitchShadowEdit = (editorCore, isOn): void => {\n const core = editorCore;\n\n if (isOn != !!core.lifecycle.shadowEditFragment) {\n if (isOn) {\n const model = !core.cache.cachedModel ? core.api.createContentModel(core) : null;\n const fragment = core.logicalRoot.ownerDocument.createDocumentFragment();\n const clonedRoot = core.logicalRoot.cloneNode(true /*deep*/);\n\n moveChildNodes(fragment, clonedRoot);\n\n core.api.triggerEvent(\n core,\n {\n eventType: 'enteredShadowEdit',\n },\n false /*broadcast*/\n );\n\n // This need to be done after EnteredShadowEdit event is triggered since EnteredShadowEdit event will cause a SelectionChanged event\n // if current selection is table selection or image selection\n if (!core.cache.cachedModel && model) {\n core.cache.cachedModel = model;\n }\n\n toggleCaret(core, true /* hide */);\n\n core.lifecycle.shadowEditFragment = fragment;\n } else {\n core.lifecycle.shadowEditFragment = null;\n\n toggleCaret(core, false /* hide */);\n\n core.api.triggerEvent(\n core,\n {\n eventType: 'leavingShadowEdit',\n },\n false /*broadcast*/\n );\n\n if (core.cache.cachedModel) {\n // Force clear cached element from selected block\n iterateSelections(core.cache.cachedModel, () => {});\n\n core.api.setContentModel(core, core.cache.cachedModel, {\n ignoreSelection: true, // Do not set focus and selection when quit shadow edit, focus may remain in UI control (picker, ...)\n });\n }\n }\n }\n};\n"]}
1
+ {"version":3,"file":"switchShadowEdit.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/switchShadowEdit/switchShadowEdit.ts"],"names":[],"mappings":";;;;IAKA;;;;;OAKG;IACI,IAAM,gBAAgB,GAAqB,UAAC,UAAU,EAAE,IAAI;QAC/D,IAAM,IAAI,GAAG,UAAU,CAAC;QAExB,IAAI,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE;YAC7C,IAAI,IAAI,EAAE;gBACN,IAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACjF,IAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,sBAAsB,EAAE,CAAC;gBACzE,IAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAE7D,IAAA,4CAAc,EAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;gBAErC,IAAI,CAAC,GAAG,CAAC,YAAY,CACjB,IAAI,EACJ;oBACI,SAAS,EAAE,mBAAmB;iBACjC,EACD,KAAK,CAAC,aAAa,CACtB,CAAC;gBAEF,oIAAoI;gBACpI,6DAA6D;gBAC7D,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,KAAK,EAAE;oBAClC,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;iBAClC;gBAED,IAAA,yBAAW,EAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;gBACnC,IAAA,2CAAoB,EAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;gBAE5C,IAAI,CAAC,SAAS,CAAC,kBAAkB,GAAG,QAAQ,CAAC;aAChD;iBAAM;gBACH,IAAI,CAAC,SAAS,CAAC,kBAAkB,GAAG,IAAI,CAAC;gBAEzC,IAAA,yBAAW,EAAC,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;gBACpC,IAAA,2CAAoB,EAAC,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;gBAE7C,IAAI,CAAC,GAAG,CAAC,YAAY,CACjB,IAAI,EACJ;oBACI,SAAS,EAAE,mBAAmB;iBACjC,EACD,KAAK,CAAC,aAAa,CACtB,CAAC;gBAEF,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;oBACxB,iDAAiD;oBACjD,IAAA,+CAAiB,EAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,cAAO,CAAC,CAAC,CAAC;oBAEpD,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;wBACnD,eAAe,EAAE,IAAI,EAAE,qGAAqG;qBAC/H,CAAC,CAAC;iBACN;aACJ;SACJ;IACL,CAAC,CAAC;IArDW,QAAA,gBAAgB,oBAqD3B","sourcesContent":["import { iterateSelections, moveChildNodes } from 'roosterjs-content-model-dom';\nimport { toggleCaret } from '../setDOMSelection/toggleCaret';\nimport { toggleTableSelection } from '../setDOMSelection/toggleTableSelection';\nimport type { SwitchShadowEdit } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Switch the Shadow Edit mode of editor On/Off\n * @param editorCore The EditorCore object\n * @param isOn True to switch On, False to switch Off\n */\nexport const switchShadowEdit: SwitchShadowEdit = (editorCore, isOn): void => {\n const core = editorCore;\n\n if (isOn != !!core.lifecycle.shadowEditFragment) {\n if (isOn) {\n const model = !core.cache.cachedModel ? core.api.createContentModel(core) : null;\n const fragment = core.logicalRoot.ownerDocument.createDocumentFragment();\n const clonedRoot = core.logicalRoot.cloneNode(true /*deep*/);\n\n moveChildNodes(fragment, clonedRoot);\n\n core.api.triggerEvent(\n core,\n {\n eventType: 'enteredShadowEdit',\n },\n false /*broadcast*/\n );\n\n // This need to be done after EnteredShadowEdit event is triggered since EnteredShadowEdit event will cause a SelectionChanged event\n // if current selection is table selection or image selection\n if (!core.cache.cachedModel && model) {\n core.cache.cachedModel = model;\n }\n\n toggleCaret(core, true /* hide */);\n toggleTableSelection(core, true /* hide */);\n\n core.lifecycle.shadowEditFragment = fragment;\n } else {\n core.lifecycle.shadowEditFragment = null;\n\n toggleCaret(core, false /* hide */);\n toggleTableSelection(core, false /* hide */);\n\n core.api.triggerEvent(\n core,\n {\n eventType: 'leavingShadowEdit',\n },\n false /*broadcast*/\n );\n\n if (core.cache.cachedModel) {\n // Force clear cached element from selected block\n iterateSelections(core.cache.cachedModel, () => {});\n\n core.api.setContentModel(core, core.cache.cachedModel, {\n ignoreSelection: true, // Do not set focus and selection when quit shadow edit, focus may remain in UI control (picker, ...)\n });\n }\n }\n }\n};\n"]}
@@ -452,6 +452,9 @@ define(["require", "exports", "./findCoordinate", "../../coreApi/setDOMSelection
452
452
  break;
453
453
  }
454
454
  }
455
+ if (this.editor.getSnapshotsManager().hasNewContent) {
456
+ this.editor.takeSnapshot();
457
+ }
455
458
  }
456
459
  else {
457
460
  this.state.tableSelection = null;
@@ -1 +1 @@
1
- {"version":3,"file":"SelectionPlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/selection/SelectionPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { findCoordinate } from './findCoordinate';\nimport { findTableCellElement } from '../../coreApi/setDOMSelection/findTableCellElement';\nimport { isSingleImageInSelection } from './isSingleImageInSelection';\nimport { normalizePos } from './normalizePos';\nimport {\n isCharacterValue,\n isElementOfType,\n isModifierKey,\n isNodeOfType,\n parseTableCells,\n toArray,\n} from 'roosterjs-content-model-dom';\nimport type {\n DOMSelection,\n IEditor,\n PluginEvent,\n PluginWithState,\n SelectionPluginState,\n EditorOptions,\n DOMHelper,\n ParsedTable,\n TableSelectionInfo,\n TableCellCoordinate,\n} from 'roosterjs-content-model-types';\n\nconst MouseLeftButton = 0;\nconst MouseRightButton = 2;\nconst Up = 'ArrowUp';\nconst Down = 'ArrowDown';\nconst Left = 'ArrowLeft';\nconst Right = 'ArrowRight';\nconst Tab = 'Tab';\n\n/**\n * @internal\n */\nexport const DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';\n/**\n * @internal\n */\nexport const DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR = '#C6C6C6';\n\nclass SelectionPlugin implements PluginWithState<SelectionPluginState> {\n private editor: IEditor | null = null;\n private state: SelectionPluginState;\n private disposer: (() => void) | null = null;\n private logicalRootDisposer: (() => void) | null = null;\n private isSafari = false;\n private isMac = false;\n private scrollTopCache: number = 0;\n\n constructor(options: EditorOptions) {\n this.state = {\n selection: null,\n tableSelection: null,\n imageSelectionBorderColor:\n options.imageSelectionBorderColor ?? DEFAULT_SELECTION_BORDER_COLOR,\n imageSelectionBorderColorDark: options.imageSelectionBorderColor\n ? undefined\n : DEFAULT_SELECTION_BORDER_COLOR,\n tableCellSelectionBackgroundColor:\n options.tableCellSelectionBackgroundColor ??\n DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR,\n tableCellSelectionBackgroundColorDark: options.tableCellSelectionBackgroundColor\n ? undefined\n : DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR,\n };\n }\n\n getName() {\n return 'Selection';\n }\n\n initialize(editor: IEditor) {\n this.editor = editor;\n\n if (!this.state.imageSelectionBorderColorDark && this.state.imageSelectionBorderColor) {\n this.state.imageSelectionBorderColorDark = editor\n .getColorManager()\n .getDarkColor(this.state.imageSelectionBorderColor, undefined, 'border');\n }\n\n if (\n !this.state.tableCellSelectionBackgroundColorDark &&\n this.state.tableCellSelectionBackgroundColor\n ) {\n this.state.tableCellSelectionBackgroundColorDark = editor\n .getColorManager()\n .getDarkColor(\n this.state.tableCellSelectionBackgroundColor,\n undefined,\n 'background'\n );\n }\n\n const env = this.editor.getEnvironment();\n const document = this.editor.getDocument();\n\n this.isSafari = !!env.isSafari;\n this.isMac = !!env.isMac;\n document.addEventListener('selectionchange', this.onSelectionChange);\n if (this.isSafari) {\n this.disposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n drop: { beforeDispatch: this.onDrop },\n });\n } else {\n this.disposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n blur: { beforeDispatch: this.onBlur },\n drop: { beforeDispatch: this.onDrop },\n });\n }\n }\n\n dispose() {\n this.editor?.getDocument().removeEventListener('selectionchange', this.onSelectionChange);\n\n if (this.disposer) {\n this.disposer();\n this.disposer = null;\n }\n\n this.logicalRootDisposer?.();\n this.logicalRootDisposer = null;\n\n this.detachMouseEvent();\n this.editor = null;\n }\n\n getState(): SelectionPluginState {\n return this.state;\n }\n\n onPluginEvent(event: PluginEvent) {\n if (!this.editor) {\n return;\n }\n\n switch (event.eventType) {\n case 'mouseDown':\n this.onMouseDown(this.editor, event.rawEvent);\n break;\n\n case 'mouseUp':\n this.onMouseUp();\n break;\n\n case 'keyDown':\n this.onKeyDown(this.editor, event.rawEvent);\n break;\n\n case 'contentChanged':\n this.state.tableSelection = null;\n break;\n\n case 'scroll':\n if (!this.editor.hasFocus()) {\n this.scrollTopCache = event.scrollContainer.scrollTop;\n }\n break;\n\n case 'logicalRootChanged':\n this.logicalRootDisposer?.();\n if (this.isSafari) {\n this.logicalRootDisposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n drop: { beforeDispatch: this.onDrop },\n });\n } else {\n this.logicalRootDisposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n blur: { beforeDispatch: this.onBlur },\n drop: { beforeDispatch: this.onDrop },\n });\n }\n break;\n }\n }\n\n private onMouseDown(editor: IEditor, rawEvent: MouseEvent) {\n const selection = editor.getDOMSelection();\n let image: HTMLImageElement | null;\n\n // Image selection\n if (\n selection?.type == 'image' &&\n (rawEvent.button == MouseLeftButton ||\n (rawEvent.button == MouseRightButton &&\n !this.getClickingImage(rawEvent) &&\n !this.getContainedTargetImage(rawEvent, selection)))\n ) {\n this.setDOMSelection(null /*domSelection*/, null /*tableSelection*/);\n }\n\n if (\n (image =\n this.getClickingImage(rawEvent) ??\n this.getContainedTargetImage(rawEvent, selection)) &&\n image.isContentEditable\n ) {\n this.setDOMSelection(\n {\n type: 'image',\n image: image,\n },\n null\n );\n return;\n }\n\n // Table selection\n if (selection?.type == 'table' && rawEvent.button == MouseLeftButton) {\n this.setDOMSelection(null /*domSelection*/, null /*tableSelection*/);\n }\n\n let tableSelection: TableSelectionInfo | null;\n const target = rawEvent.target as Node;\n\n if (\n target &&\n rawEvent.button == MouseLeftButton &&\n (tableSelection = this.parseTableSelection(target, target, editor.getDOMHelper()))\n ) {\n this.state.tableSelection = tableSelection;\n\n if (rawEvent.detail >= 3) {\n const lastCo = findCoordinate(\n tableSelection.parsedTable,\n rawEvent.target as Node,\n editor.getDOMHelper()\n );\n\n if (lastCo) {\n // Triple click, select the current cell\n tableSelection.lastCo = lastCo;\n this.updateTableSelection(lastCo);\n rawEvent.preventDefault();\n }\n }\n\n this.state.mouseDisposer?.();\n this.state.mouseDisposer = editor.attachDomEvent({\n mousemove: {\n beforeDispatch: this.onMouseMove,\n },\n });\n }\n }\n\n private onMouseMove = (event: Event) => {\n if (this.editor && this.state.tableSelection) {\n const hasTableSelection = !!this.state.tableSelection.lastCo;\n const currentNode = event.target as Node;\n const domHelper = this.editor.getDOMHelper();\n\n const range = this.editor.getDocument().createRange();\n const startNode = this.state.tableSelection.startNode;\n const isReverted =\n currentNode.compareDocumentPosition(startNode) == Node.DOCUMENT_POSITION_FOLLOWING;\n\n if (isReverted) {\n range.setStart(currentNode, 0);\n range.setEnd(\n startNode,\n isNodeOfType(startNode, 'TEXT_NODE')\n ? startNode.nodeValue?.length ?? 0\n : startNode.childNodes.length\n );\n } else {\n range.setStart(startNode, 0);\n range.setEnd(currentNode, 0);\n }\n\n // Use common container of the range to search a common table that covers both start and end node\n const tableStart = range.commonAncestorContainer;\n const newTableSelection = this.parseTableSelection(tableStart, startNode, domHelper);\n\n if (newTableSelection) {\n const lastCo = findCoordinate(\n newTableSelection.parsedTable,\n currentNode,\n domHelper\n );\n\n if (newTableSelection.table != this.state.tableSelection.table) {\n // Move mouse into another table (nest table scenario)\n this.state.tableSelection = newTableSelection;\n this.state.tableSelection.lastCo = lastCo ?? undefined;\n }\n\n const updated = lastCo && this.updateTableSelection(lastCo);\n\n if (hasTableSelection || updated) {\n event.preventDefault();\n }\n } else if (this.editor.getDOMSelection()?.type == 'table') {\n // Move mouse out of table\n this.setDOMSelection(\n {\n type: 'range',\n range,\n isReverted,\n },\n this.state.tableSelection\n );\n }\n }\n };\n\n private onMouseUp() {\n this.detachMouseEvent();\n }\n\n private onDrop = () => {\n this.detachMouseEvent();\n };\n\n private onKeyDown(editor: IEditor, rawEvent: KeyboardEvent) {\n const key = rawEvent.key;\n const selection = editor.getDOMSelection();\n const win = editor.getDocument().defaultView;\n\n switch (selection?.type) {\n case 'image':\n if (!isModifierKey(rawEvent) && !rawEvent.shiftKey && selection.image.parentNode) {\n if (key === 'Escape') {\n this.selectBeforeOrAfterElement(editor, selection.image);\n rawEvent.stopPropagation();\n } else if (key !== 'Delete' && key !== 'Backspace') {\n this.selectBeforeOrAfterElement(editor, selection.image);\n }\n }\n\n if (\n (isModifierKey(rawEvent) || rawEvent.shiftKey) &&\n selection.image &&\n !this.isSafari\n ) {\n const range = selection.image.ownerDocument.createRange();\n range.selectNode(selection.image);\n this.setDOMSelection(\n {\n type: 'range',\n range,\n isReverted: false,\n },\n null /* tableSelection */\n );\n }\n break;\n\n case 'range':\n if (key == Up || key == Down || key == Left || key == Right || key == Tab) {\n const start = selection.range.startContainer;\n this.state.tableSelection = this.parseTableSelection(\n start,\n start,\n editor.getDOMHelper()\n );\n\n if (this.state.tableSelection && !rawEvent.defaultPrevented) {\n if (key == Tab) {\n this.handleSelectionInTable(this.getTabKey(rawEvent));\n rawEvent.preventDefault();\n } else {\n win?.requestAnimationFrame(() => this.handleSelectionInTable(key));\n }\n }\n }\n break;\n\n case 'table':\n // After a content change event is handled tableSelection state is reset to null\n // Since we have table selection from DOMSelection, we can use it to re-create the tableSelection state\n if (this.state.tableSelection == null) {\n const { table, firstRow, firstColumn, lastRow, lastColumn } = selection;\n\n const parsedTable = parseTableCells(table);\n if (parsedTable) {\n const firstCo = { row: firstRow, col: firstColumn };\n const lastCo = { row: lastRow, col: lastColumn };\n\n // Create the tableSelection with current table info\n this.state.tableSelection = {\n table,\n parsedTable,\n firstCo,\n lastCo,\n startNode: findTableCellElement(parsedTable, firstCo)?.cell || table,\n };\n }\n }\n if (this.state.tableSelection?.lastCo) {\n const { shiftKey, key } = rawEvent;\n\n if (shiftKey && (key == Left || key == Right)) {\n const isRtl =\n win?.getComputedStyle(this.state.tableSelection.table).direction ==\n 'rtl';\n\n this.updateTableSelectionFromKeyboard(\n 0,\n (key == Left ? -1 : 1) * (isRtl ? -1 : 1)\n );\n rawEvent.preventDefault();\n } else if (shiftKey && (key == Up || key == Down)) {\n this.updateTableSelectionFromKeyboard(key == Up ? -1 : 1, 0);\n rawEvent.preventDefault();\n } else if (key != 'Shift' && !isCharacterValue(rawEvent)) {\n if (key == Up || key == Down || key == Left || key == Right) {\n this.setDOMSelection(null /*domSelection*/, this.state.tableSelection);\n win?.requestAnimationFrame(() => this.handleSelectionInTable(key));\n }\n }\n }\n break;\n }\n }\n\n private getTabKey(rawEvent: KeyboardEvent) {\n return rawEvent.shiftKey ? 'TabLeft' : 'TabRight';\n }\n\n private handleSelectionInTable(\n key: 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight' | 'TabLeft' | 'TabRight'\n ) {\n if (!this.editor || !this.state.tableSelection) {\n return;\n }\n\n const selection = this.editor.getDOMSelection();\n const domHelper = this.editor.getDOMHelper();\n\n if (selection?.type == 'range') {\n const {\n range: { collapsed, startContainer, endContainer, commonAncestorContainer },\n isReverted,\n } = selection;\n const start = isReverted ? endContainer : startContainer;\n const end: Node | null = isReverted ? startContainer : endContainer;\n const tableSel = this.parseTableSelection(commonAncestorContainer, start, domHelper);\n\n if (!tableSel) {\n return;\n }\n\n let lastCo = findCoordinate(tableSel?.parsedTable, end, domHelper);\n let tabMove = false;\n const { parsedTable, firstCo: oldCo, table } = this.state.tableSelection;\n\n if (lastCo && tableSel.table == table) {\n if (lastCo.col != oldCo.col && (key == Up || key == Down)) {\n const change = key == Up ? -1 : 1;\n const originalTd = findTableCellElement(parsedTable, oldCo)?.cell;\n let td: HTMLTableCellElement | null = null;\n\n lastCo = { row: oldCo.row + change, col: oldCo.col };\n\n while (lastCo.row >= 0 && lastCo.row < parsedTable.length) {\n td = findTableCellElement(parsedTable, lastCo)?.cell || null;\n\n if (td == originalTd) {\n lastCo.row += change;\n } else {\n break;\n }\n }\n\n if (collapsed && td) {\n this.setRangeSelectionInTable(\n td,\n key == Up ? td.childNodes.length : 0,\n this.editor\n );\n } else if (!td && (lastCo.row == -1 || lastCo.row <= parsedTable.length)) {\n this.selectBeforeOrAfterElement(\n this.editor,\n table,\n change == 1 /* after */,\n change != 1 /* setSelectionInNextSiblingElement */\n );\n }\n } else if (key == 'TabLeft' || key == 'TabRight') {\n const reverse = key == 'TabLeft';\n for (\n let step = reverse ? -1 : 1,\n row = lastCo.row ?? 0,\n col = (lastCo.col ?? 0) + step;\n ;\n col += step\n ) {\n if (col < 0 || col >= parsedTable[row].length) {\n row += step;\n if (row < 0) {\n this.selectBeforeOrAfterElement(this.editor, tableSel.table);\n break;\n } else if (row >= parsedTable.length) {\n this.selectBeforeOrAfterElement(\n this.editor,\n tableSel.table,\n true /*after*/\n );\n break;\n }\n col = reverse ? parsedTable[row].length - 1 : 0;\n }\n const cell = parsedTable[row][col];\n\n if (typeof cell != 'string') {\n tabMove = true;\n this.setRangeSelectionInTable(\n cell,\n 0,\n this.editor,\n true /* selectAll */\n );\n lastCo.row = row;\n lastCo.col = col;\n break;\n }\n }\n } else {\n this.state.tableSelection = null;\n }\n\n if (\n collapsed &&\n (lastCo.col != oldCo.col || lastCo.row != oldCo.row) &&\n lastCo.row >= 0 &&\n lastCo.row == parsedTable.length - 1 &&\n lastCo.col == parsedTable[lastCo.row]?.length - 1\n ) {\n this.editor?.announce({ defaultStrings: 'announceOnFocusLastCell' });\n }\n }\n\n if (!collapsed && lastCo && !tabMove) {\n this.state.tableSelection = tableSel;\n this.updateTableSelection(lastCo);\n }\n }\n }\n\n private setRangeSelectionInTable(\n cell: Node,\n nodeOffset: number,\n editor: IEditor,\n selectAll?: boolean\n ) {\n const range = editor.getDocument().createRange();\n if (selectAll && cell.firstChild && cell.lastChild) {\n const cellStart = cell.firstChild;\n const cellEnd = cell.lastChild;\n // Get first deepest editable position in the cell\n const posStart = normalizePos(cellStart, 0);\n // Get last deepest editable position in the cell\n const posEnd = normalizePos(cellEnd, cellEnd.childNodes.length);\n\n range.setStart(posStart.node, posStart.offset);\n range.setEnd(posEnd.node, posEnd.offset);\n\n if (range.toString() === '') {\n range.collapse(true /* toStart */);\n }\n } else {\n // Get deepest editable position in the cell\n const { node, offset } = normalizePos(cell, nodeOffset);\n\n range.setStart(node, offset);\n range.collapse(true /* toStart */);\n }\n\n this.setDOMSelection(\n {\n type: 'range',\n range,\n isReverted: false,\n },\n null /*tableSelection*/\n );\n }\n\n private updateTableSelectionFromKeyboard(rowChange: number, colChange: number) {\n if (this.state.tableSelection?.lastCo && this.editor) {\n const { lastCo, parsedTable } = this.state.tableSelection;\n const row = lastCo.row + rowChange;\n const col = lastCo.col + colChange;\n\n if (row >= 0 && row < parsedTable.length && col >= 0 && col < parsedTable[row].length) {\n this.updateTableSelection({ row, col });\n }\n }\n }\n\n private selectBeforeOrAfterElement(\n editor: IEditor,\n element: HTMLElement,\n after?: boolean,\n setSelectionInNextSiblingElement?: boolean\n ) {\n const doc = editor.getDocument();\n const parent = element.parentNode;\n const index = parent && toArray(parent.childNodes).indexOf(element);\n let sibling: Element | undefined | null;\n\n if (parent && index !== null && index >= 0) {\n const range = doc.createRange();\n if (\n setSelectionInNextSiblingElement &&\n (sibling = after ? element.nextElementSibling : element.previousElementSibling) &&\n isNodeOfType(sibling, 'ELEMENT_NODE')\n ) {\n range.selectNodeContents(sibling);\n range.collapse(false /* toStart */);\n } else {\n range.setStart(parent, index + (after ? 1 : 0));\n range.collapse();\n }\n\n this.setDOMSelection(\n {\n type: 'range',\n range: range,\n isReverted: false,\n },\n null /*tableSelection*/\n );\n }\n }\n\n private getClickingImage(event: UIEvent): HTMLImageElement | null {\n const target = event.target as Node;\n\n return isNodeOfType(target, 'ELEMENT_NODE') && isElementOfType(target, 'img')\n ? target\n : null;\n }\n\n // MacOS will not create a mouseUp event if contextMenu event is not prevent defaulted.\n // Make sure we capture image target even if image is wrapped\n private getContainedTargetImage = (\n event: MouseEvent,\n previousSelection: DOMSelection | null\n ): HTMLImageElement | null => {\n if (!this.isMac || !previousSelection || previousSelection.type !== 'image') {\n return null;\n }\n\n const target = event.target as Node;\n if (\n isNodeOfType(target, 'ELEMENT_NODE') &&\n isElementOfType(target, 'span') &&\n target.firstChild === previousSelection.image\n ) {\n return previousSelection.image;\n }\n return null;\n };\n\n private onFocus = () => {\n if (!this.state.skipReselectOnFocus && this.state.selection) {\n this.setDOMSelection(this.state.selection, this.state.tableSelection);\n }\n\n if (this.state.selection?.type == 'range' && !this.isSafari) {\n // Editor is focused, now we can get live selection. So no need to keep a selection if the selection type is range.\n this.state.selection = null;\n }\n\n if (this.scrollTopCache && this.editor) {\n const sc = this.editor.getScrollContainer();\n sc.scrollTop = this.scrollTopCache;\n this.scrollTopCache = 0;\n }\n };\n\n private onBlur = () => {\n if (this.editor) {\n if (!this.state.selection) {\n this.state.selection = this.editor.getDOMSelection();\n }\n const sc = this.editor.getScrollContainer();\n this.scrollTopCache = sc.scrollTop;\n }\n };\n\n private onSelectionChange = () => {\n if (this.editor?.hasFocus() && !this.editor.isInShadowEdit()) {\n const newSelection = this.editor.getDOMSelection();\n\n //If am image selection changed to a wider range due a keyboard event, we should update the selection\n const selection = this.editor.getDocument().getSelection();\n if (selection && selection.focusNode) {\n const image = isSingleImageInSelection(selection);\n if (newSelection?.type == 'image' && !image) {\n const range = selection.getRangeAt(0);\n this.editor.setDOMSelection({\n type: 'range',\n range,\n isReverted:\n selection.focusNode != range.endContainer ||\n selection.focusOffset != range.endOffset,\n });\n } else if (newSelection?.type !== 'image' && image) {\n this.editor.setDOMSelection({\n type: 'image',\n image,\n });\n }\n }\n\n // Safari has problem to handle onBlur event. When blur, we cannot get the original selection from editor.\n // So we always save a selection whenever editor has focus. Then after blur, we can still use this cached selection.\n if (newSelection?.type == 'range') {\n if (this.isSafari) {\n this.state.selection = newSelection;\n }\n }\n }\n };\n\n private parseTableSelection(\n tableStart: Node,\n tdStart: Node,\n domHelper: DOMHelper\n ): TableSelectionInfo | null {\n let table: HTMLTableElement | null;\n let parsedTable: ParsedTable | null;\n let firstCo: TableCellCoordinate | null;\n\n if (\n (table = domHelper.findClosestElementAncestor(tableStart, 'table')) &&\n table.isContentEditable &&\n (parsedTable = parseTableCells(table)) &&\n (firstCo = findCoordinate(parsedTable, tdStart, domHelper))\n ) {\n return { table, parsedTable, firstCo, startNode: tdStart };\n } else {\n return null;\n }\n }\n\n private updateTableSelection(lastCo: TableCellCoordinate) {\n if (this.state.tableSelection && this.editor) {\n const {\n table,\n firstCo,\n parsedTable,\n startNode,\n lastCo: oldCo,\n } = this.state.tableSelection;\n\n if (oldCo || firstCo.row != lastCo.row || firstCo.col != lastCo.col) {\n this.state.tableSelection.lastCo = lastCo;\n this.setDOMSelection(\n {\n type: 'table',\n table,\n firstRow: firstCo.row,\n firstColumn: firstCo.col,\n lastRow: lastCo.row,\n lastColumn: lastCo.col,\n tableSelectionInfo: this.state.tableSelection,\n },\n { table, firstCo, lastCo, parsedTable, startNode }\n );\n\n return true;\n }\n }\n\n return false;\n }\n\n private setDOMSelection(\n selection: DOMSelection | null,\n tableSelection: TableSelectionInfo | null\n ) {\n this.editor?.setDOMSelection(selection);\n this.state.tableSelection = tableSelection;\n }\n\n private detachMouseEvent() {\n if (this.state.mouseDisposer) {\n this.state.mouseDisposer();\n this.state.mouseDisposer = undefined;\n }\n }\n}\n\n/**\n * @internal\n * Create a new instance of SelectionPlugin.\n * @param option The editor option\n */\nexport function createSelectionPlugin(\n options: EditorOptions\n): PluginWithState<SelectionPluginState> {\n return new SelectionPlugin(options);\n}\n"]}
1
+ {"version":3,"file":"SelectionPlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/selection/SelectionPlugin.ts"],"names":[],"mappings":";;;;IAyBA,IAAM,eAAe,GAAG,CAAC,CAAC;IAC1B,IAAM,gBAAgB,GAAG,CAAC,CAAC;IAC3B,IAAM,EAAE,GAAG,SAAS,CAAC;IACrB,IAAM,IAAI,GAAG,WAAW,CAAC;IACzB,IAAM,IAAI,GAAG,WAAW,CAAC;IACzB,IAAM,KAAK,GAAG,YAAY,CAAC;IAC3B,IAAM,GAAG,GAAG,KAAK,CAAC;IAElB;;OAEG;IACU,QAAA,8BAA8B,GAAG,SAAS,CAAC;IACxD;;OAEG;IACU,QAAA,6CAA6C,GAAG,SAAS,CAAC;IAEvE;QASI,yBAAY,OAAsB;YAAlC,iBAgBC;;YAxBO,WAAM,GAAmB,IAAI,CAAC;YAE9B,aAAQ,GAAwB,IAAI,CAAC;YACrC,wBAAmB,GAAwB,IAAI,CAAC;YAChD,aAAQ,GAAG,KAAK,CAAC;YACjB,UAAK,GAAG,KAAK,CAAC;YACd,mBAAc,GAAW,CAAC,CAAC;YAyM3B,gBAAW,GAAG,UAAC,KAAY;;gBAC/B,IAAI,KAAI,CAAC,MAAM,IAAI,KAAI,CAAC,KAAK,CAAC,cAAc,EAAE;oBAC1C,IAAM,iBAAiB,GAAG,CAAC,CAAC,KAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC;oBAC7D,IAAM,WAAW,GAAG,KAAK,CAAC,MAAc,CAAC;oBACzC,IAAM,SAAS,GAAG,KAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;oBAE7C,IAAM,KAAK,GAAG,KAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,CAAC;oBACtD,IAAM,SAAS,GAAG,KAAI,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC;oBACtD,IAAM,UAAU,GACZ,WAAW,CAAC,uBAAuB,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,2BAA2B,CAAC;oBAEvF,IAAI,UAAU,EAAE;wBACZ,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;wBAC/B,KAAK,CAAC,MAAM,CACR,SAAS,EACT,IAAA,0CAAY,EAAC,SAAS,EAAE,WAAW,CAAC;4BAChC,CAAC,CAAC,MAAA,MAAA,SAAS,CAAC,SAAS,0CAAE,MAAM,mCAAI,CAAC;4BAClC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CACpC,CAAC;qBACL;yBAAM;wBACH,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;wBAC7B,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;qBAChC;oBAED,iGAAiG;oBACjG,IAAM,UAAU,GAAG,KAAK,CAAC,uBAAuB,CAAC;oBACjD,IAAM,iBAAiB,GAAG,KAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;oBAErF,IAAI,iBAAiB,EAAE;wBACnB,IAAM,MAAM,GAAG,IAAA,+BAAc,EACzB,iBAAiB,CAAC,WAAW,EAC7B,WAAW,EACX,SAAS,CACZ,CAAC;wBAEF,IAAI,iBAAiB,CAAC,KAAK,IAAI,KAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,EAAE;4BAC5D,sDAAsD;4BACtD,KAAI,CAAC,KAAK,CAAC,cAAc,GAAG,iBAAiB,CAAC;4BAC9C,KAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,SAAS,CAAC;yBAC1D;wBAED,IAAM,OAAO,GAAG,MAAM,IAAI,KAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;wBAE5D,IAAI,iBAAiB,IAAI,OAAO,EAAE;4BAC9B,KAAK,CAAC,cAAc,EAAE,CAAC;yBAC1B;qBACJ;yBAAM,IAAI,CAAA,MAAA,KAAI,CAAC,MAAM,CAAC,eAAe,EAAE,0CAAE,IAAI,KAAI,OAAO,EAAE;wBACvD,0BAA0B;wBAC1B,KAAI,CAAC,eAAe,CAChB;4BACI,IAAI,EAAE,OAAO;4BACb,KAAK,OAAA;4BACL,UAAU,YAAA;yBACb,EACD,KAAI,CAAC,KAAK,CAAC,cAAc,CAC5B,CAAC;qBACL;iBACJ;YACL,CAAC,CAAC;YAMM,WAAM,GAAG;gBACb,KAAI,CAAC,gBAAgB,EAAE,CAAC;YAC5B,CAAC,CAAC;YAsUF,uFAAuF;YACvF,6DAA6D;YACrD,4BAAuB,GAAG,UAC9B,KAAiB,EACjB,iBAAsC;gBAEtC,IAAI,CAAC,KAAI,CAAC,KAAK,IAAI,CAAC,iBAAiB,IAAI,iBAAiB,CAAC,IAAI,KAAK,OAAO,EAAE;oBACzE,OAAO,IAAI,CAAC;iBACf;gBAED,IAAM,MAAM,GAAG,KAAK,CAAC,MAAc,CAAC;gBACpC,IACI,IAAA,0CAAY,EAAC,MAAM,EAAE,cAAc,CAAC;oBACpC,IAAA,6CAAe,EAAC,MAAM,EAAE,MAAM,CAAC;oBAC/B,MAAM,CAAC,UAAU,KAAK,iBAAiB,CAAC,KAAK,EAC/C;oBACE,OAAO,iBAAiB,CAAC,KAAK,CAAC;iBAClC;gBACD,OAAO,IAAI,CAAC;YAChB,CAAC,CAAC;YAEM,YAAO,GAAG;;gBACd,IAAI,CAAC,KAAI,CAAC,KAAK,CAAC,mBAAmB,IAAI,KAAI,CAAC,KAAK,CAAC,SAAS,EAAE;oBACzD,KAAI,CAAC,eAAe,CAAC,KAAI,CAAC,KAAK,CAAC,SAAS,EAAE,KAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;iBACzE;gBAED,IAAI,CAAA,MAAA,KAAI,CAAC,KAAK,CAAC,SAAS,0CAAE,IAAI,KAAI,OAAO,IAAI,CAAC,KAAI,CAAC,QAAQ,EAAE;oBACzD,mHAAmH;oBACnH,KAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;iBAC/B;gBAED,IAAI,KAAI,CAAC,cAAc,IAAI,KAAI,CAAC,MAAM,EAAE;oBACpC,IAAM,EAAE,GAAG,KAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;oBAC5C,EAAE,CAAC,SAAS,GAAG,KAAI,CAAC,cAAc,CAAC;oBACnC,KAAI,CAAC,cAAc,GAAG,CAAC,CAAC;iBAC3B;YACL,CAAC,CAAC;YAEM,WAAM,GAAG;gBACb,IAAI,KAAI,CAAC,MAAM,EAAE;oBACb,IAAI,CAAC,KAAI,CAAC,KAAK,CAAC,SAAS,EAAE;wBACvB,KAAI,CAAC,KAAK,CAAC,SAAS,GAAG,KAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;qBACxD;oBACD,IAAM,EAAE,GAAG,KAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;oBAC5C,KAAI,CAAC,cAAc,GAAG,EAAE,CAAC,SAAS,CAAC;iBACtC;YACL,CAAC,CAAC;YAEM,sBAAiB,GAAG;;gBACxB,IAAI,CAAA,MAAA,KAAI,CAAC,MAAM,0CAAE,QAAQ,EAAE,KAAI,CAAC,KAAI,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE;oBAC1D,IAAM,YAAY,GAAG,KAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;oBAEnD,qGAAqG;oBACrG,IAAM,SAAS,GAAG,KAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,YAAY,EAAE,CAAC;oBAC3D,IAAI,SAAS,IAAI,SAAS,CAAC,SAAS,EAAE;wBAClC,IAAM,KAAK,GAAG,IAAA,mDAAwB,EAAC,SAAS,CAAC,CAAC;wBAClD,IAAI,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,IAAI,KAAI,OAAO,IAAI,CAAC,KAAK,EAAE;4BACzC,IAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;4BACtC,KAAI,CAAC,MAAM,CAAC,eAAe,CAAC;gCACxB,IAAI,EAAE,OAAO;gCACb,KAAK,OAAA;gCACL,UAAU,EACN,SAAS,CAAC,SAAS,IAAI,KAAK,CAAC,YAAY;oCACzC,SAAS,CAAC,WAAW,IAAI,KAAK,CAAC,SAAS;6BAC/C,CAAC,CAAC;yBACN;6BAAM,IAAI,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,IAAI,MAAK,OAAO,IAAI,KAAK,EAAE;4BAChD,KAAI,CAAC,MAAM,CAAC,eAAe,CAAC;gCACxB,IAAI,EAAE,OAAO;gCACb,KAAK,OAAA;6BACR,CAAC,CAAC;yBACN;qBACJ;oBAED,0GAA0G;oBAC1G,oHAAoH;oBACpH,IAAI,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,IAAI,KAAI,OAAO,EAAE;wBAC/B,IAAI,KAAI,CAAC,QAAQ,EAAE;4BACf,KAAI,CAAC,KAAK,CAAC,SAAS,GAAG,YAAY,CAAC;yBACvC;qBACJ;iBACJ;YACL,CAAC,CAAC;YA/pBE,IAAI,CAAC,KAAK,GAAG;gBACT,SAAS,EAAE,IAAI;gBACf,cAAc,EAAE,IAAI;gBACpB,yBAAyB,EACrB,MAAA,OAAO,CAAC,yBAAyB,mCAAI,sCAA8B;gBACvE,6BAA6B,EAAE,OAAO,CAAC,yBAAyB;oBAC5D,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,sCAA8B;gBACpC,iCAAiC,EAC7B,MAAA,OAAO,CAAC,iCAAiC,mCACzC,qDAA6C;gBACjD,qCAAqC,EAAE,OAAO,CAAC,iCAAiC;oBAC5E,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,qDAA6C;aACtD,CAAC;QACN,CAAC;QAED,iCAAO,GAAP;YACI,OAAO,WAAW,CAAC;QACvB,CAAC;QAED,oCAAU,GAAV,UAAW,MAAe;YACtB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YAErB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,6BAA6B,IAAI,IAAI,CAAC,KAAK,CAAC,yBAAyB,EAAE;gBACnF,IAAI,CAAC,KAAK,CAAC,6BAA6B,GAAG,MAAM;qBAC5C,eAAe,EAAE;qBACjB,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,yBAAyB,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;aAChF;YAED,IACI,CAAC,IAAI,CAAC,KAAK,CAAC,qCAAqC;gBACjD,IAAI,CAAC,KAAK,CAAC,iCAAiC,EAC9C;gBACE,IAAI,CAAC,KAAK,CAAC,qCAAqC,GAAG,MAAM;qBACpD,eAAe,EAAE;qBACjB,YAAY,CACT,IAAI,CAAC,KAAK,CAAC,iCAAiC,EAC5C,SAAS,EACT,YAAY,CACf,CAAC;aACT;YAED,IAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YACzC,IAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAE3C,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;YAC/B,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB,QAAQ,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACrE,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACf,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;oBACvC,KAAK,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,OAAO,EAAE;oBACvC,IAAI,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,MAAM,EAAE;iBACxC,CAAC,CAAC;aACN;iBAAM;gBACH,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;oBACvC,KAAK,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,OAAO,EAAE;oBACvC,IAAI,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,MAAM,EAAE;oBACrC,IAAI,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,MAAM,EAAE;iBACxC,CAAC,CAAC;aACN;QACL,CAAC;QAED,iCAAO,GAAP;;YACI,MAAA,IAAI,CAAC,MAAM,0CAAE,WAAW,GAAG,mBAAmB,CAAC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAE1F,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACf,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;aACxB;YAED,MAAA,IAAI,CAAC,mBAAmB,+CAAxB,IAAI,CAAwB,CAAC;YAC7B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAEhC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACvB,CAAC;QAED,kCAAQ,GAAR;YACI,OAAO,IAAI,CAAC,KAAK,CAAC;QACtB,CAAC;QAED,uCAAa,GAAb,UAAc,KAAkB;;YAC5B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBACd,OAAO;aACV;YAED,QAAQ,KAAK,CAAC,SAAS,EAAE;gBACrB,KAAK,WAAW;oBACZ,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;oBAC9C,MAAM;gBAEV,KAAK,SAAS;oBACV,IAAI,CAAC,SAAS,EAAE,CAAC;oBACjB,MAAM;gBAEV,KAAK,SAAS;oBACV,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;oBAC5C,MAAM;gBAEV,KAAK,gBAAgB;oBACjB,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;oBACjC,MAAM;gBAEV,KAAK,QAAQ;oBACT,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE;wBACzB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,eAAe,CAAC,SAAS,CAAC;qBACzD;oBACD,MAAM;gBAEV,KAAK,oBAAoB;oBACrB,MAAA,IAAI,CAAC,mBAAmB,+CAAxB,IAAI,CAAwB,CAAC;oBAC7B,IAAI,IAAI,CAAC,QAAQ,EAAE;wBACf,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;4BAClD,KAAK,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,OAAO,EAAE;4BACvC,IAAI,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,MAAM,EAAE;yBACxC,CAAC,CAAC;qBACN;yBAAM;wBACH,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;4BAClD,KAAK,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,OAAO,EAAE;4BACvC,IAAI,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,MAAM,EAAE;4BACrC,IAAI,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,MAAM,EAAE;yBACxC,CAAC,CAAC;qBACN;oBACD,MAAM;aACb;QACL,CAAC;QAEO,qCAAW,GAAnB,UAAoB,MAAe,EAAE,QAAoB;;YACrD,IAAM,SAAS,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3C,IAAI,KAA8B,CAAC;YAEnC,kBAAkB;YAClB,IACI,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,IAAI,KAAI,OAAO;gBAC1B,CAAC,QAAQ,CAAC,MAAM,IAAI,eAAe;oBAC/B,CAAC,QAAQ,CAAC,MAAM,IAAI,gBAAgB;wBAChC,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;wBAChC,CAAC,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,EAC9D;gBACE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;aACxE;YAED,IACI,CAAC,KAAK;gBACF,MAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,mCAC/B,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;gBACtD,KAAK,CAAC,iBAAiB,EACzB;gBACE,IAAI,CAAC,eAAe,CAChB;oBACI,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,KAAK;iBACf,EACD,IAAI,CACP,CAAC;gBACF,OAAO;aACV;YAED,kBAAkB;YAClB,IAAI,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,IAAI,KAAI,OAAO,IAAI,QAAQ,CAAC,MAAM,IAAI,eAAe,EAAE;gBAClE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;aACxE;YAED,IAAI,cAAyC,CAAC;YAC9C,IAAM,MAAM,GAAG,QAAQ,CAAC,MAAc,CAAC;YAEvC,IACI,MAAM;gBACN,QAAQ,CAAC,MAAM,IAAI,eAAe;gBAClC,CAAC,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,EACpF;gBACE,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,cAAc,CAAC;gBAE3C,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE;oBACtB,IAAM,MAAM,GAAG,IAAA,+BAAc,EACzB,cAAc,CAAC,WAAW,EAC1B,QAAQ,CAAC,MAAc,EACvB,MAAM,CAAC,YAAY,EAAE,CACxB,CAAC;oBAEF,IAAI,MAAM,EAAE;wBACR,wCAAwC;wBACxC,cAAc,CAAC,MAAM,GAAG,MAAM,CAAC;wBAC/B,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;wBAClC,QAAQ,CAAC,cAAc,EAAE,CAAC;qBAC7B;iBACJ;gBAED,MAAA,MAAA,IAAI,CAAC,KAAK,EAAC,aAAa,kDAAI,CAAC;gBAC7B,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC,cAAc,CAAC;oBAC7C,SAAS,EAAE;wBACP,cAAc,EAAE,IAAI,CAAC,WAAW;qBACnC;iBACJ,CAAC,CAAC;aACN;QACL,CAAC;QA8DO,mCAAS,GAAjB;YACI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5B,CAAC;QAMO,mCAAS,GAAjB,UAAkB,MAAe,EAAE,QAAuB;YAA1D,iBAoGC;;YAnGG,IAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;YACzB,IAAM,SAAS,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3C,IAAM,GAAG,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,WAAW,CAAC;YAE7C,QAAQ,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,IAAI,EAAE;gBACrB,KAAK,OAAO;oBACR,IAAI,CAAC,IAAA,2CAAa,EAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE;wBAC9E,IAAI,GAAG,KAAK,QAAQ,EAAE;4BAClB,IAAI,CAAC,0BAA0B,CAAC,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;4BACzD,QAAQ,CAAC,eAAe,EAAE,CAAC;yBAC9B;6BAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,WAAW,EAAE;4BAChD,IAAI,CAAC,0BAA0B,CAAC,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;yBAC5D;qBACJ;oBAED,IACI,CAAC,IAAA,2CAAa,EAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC;wBAC9C,SAAS,CAAC,KAAK;wBACf,CAAC,IAAI,CAAC,QAAQ,EAChB;wBACE,IAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;wBAC1D,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;wBAClC,IAAI,CAAC,eAAe,CAChB;4BACI,IAAI,EAAE,OAAO;4BACb,KAAK,OAAA;4BACL,UAAU,EAAE,KAAK;yBACpB,EACD,IAAI,CAAC,oBAAoB,CAC5B,CAAC;qBACL;oBACD,MAAM;gBAEV,KAAK,OAAO;oBACR,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,GAAG,EAAE;wBACvE,IAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC;wBAC7C,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAChD,KAAK,EACL,KAAK,EACL,MAAM,CAAC,YAAY,EAAE,CACxB,CAAC;wBAEF,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE;4BACzD,IAAI,GAAG,IAAI,GAAG,EAAE;gCACZ,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;gCACtD,QAAQ,CAAC,cAAc,EAAE,CAAC;6BAC7B;iCAAM;gCACH,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,qBAAqB,CAAC,cAAM,OAAA,KAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,EAAhC,CAAgC,CAAC,CAAC;6BACtE;yBACJ;qBACJ;oBACD,MAAM;gBAEV,KAAK,OAAO;oBACR,gFAAgF;oBAChF,uGAAuG;oBACvG,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,IAAI,IAAI,EAAE;wBAC3B,IAAA,KAAK,GAAiD,SAAS,MAA1D,EAAE,QAAQ,GAAuC,SAAS,SAAhD,EAAE,WAAW,GAA0B,SAAS,YAAnC,EAAE,OAAO,GAAiB,SAAS,QAA1B,EAAE,UAAU,GAAK,SAAS,WAAd,CAAe;wBAExE,IAAM,WAAW,GAAG,IAAA,6CAAe,EAAC,KAAK,CAAC,CAAC;wBAC3C,IAAI,WAAW,EAAE;4BACb,IAAM,OAAO,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC;4BACpD,IAAM,MAAM,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;4BAEjD,oDAAoD;4BACpD,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG;gCACxB,KAAK,OAAA;gCACL,WAAW,aAAA;gCACX,OAAO,SAAA;gCACP,MAAM,QAAA;gCACN,SAAS,EAAE,CAAA,MAAA,IAAA,2CAAoB,EAAC,WAAW,EAAE,OAAO,CAAC,0CAAE,IAAI,KAAI,KAAK;6BACvE,CAAC;yBACL;qBACJ;oBACD,IAAI,MAAA,IAAI,CAAC,KAAK,CAAC,cAAc,0CAAE,MAAM,EAAE;wBAC3B,IAAA,QAAQ,GAAU,QAAQ,SAAlB,EAAE,KAAG,GAAK,QAAQ,IAAb,CAAc;wBAEnC,IAAI,QAAQ,IAAI,CAAC,KAAG,IAAI,IAAI,IAAI,KAAG,IAAI,KAAK,CAAC,EAAE;4BAC3C,IAAM,KAAK,GACP,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS;gCAChE,KAAK,CAAC;4BAEV,IAAI,CAAC,gCAAgC,CACjC,CAAC,EACD,CAAC,KAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC5C,CAAC;4BACF,QAAQ,CAAC,cAAc,EAAE,CAAC;yBAC7B;6BAAM,IAAI,QAAQ,IAAI,CAAC,KAAG,IAAI,EAAE,IAAI,KAAG,IAAI,IAAI,CAAC,EAAE;4BAC/C,IAAI,CAAC,gCAAgC,CAAC,KAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;4BAC7D,QAAQ,CAAC,cAAc,EAAE,CAAC;yBAC7B;6BAAM,IAAI,KAAG,IAAI,OAAO,IAAI,CAAC,IAAA,8CAAgB,EAAC,QAAQ,CAAC,EAAE;4BACtD,IAAI,KAAG,IAAI,EAAE,IAAI,KAAG,IAAI,IAAI,IAAI,KAAG,IAAI,IAAI,IAAI,KAAG,IAAI,KAAK,EAAE;gCACzD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;gCACvE,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,qBAAqB,CAAC,cAAM,OAAA,KAAI,CAAC,sBAAsB,CAAC,KAAG,CAAC,EAAhC,CAAgC,CAAC,CAAC;6BACtE;yBACJ;qBACJ;oBACD,MAAM;aACb;QACL,CAAC;QAEO,mCAAS,GAAjB,UAAkB,QAAuB;YACrC,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;QACtD,CAAC;QAEO,gDAAsB,GAA9B,UACI,GAAkF;;YAElF,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;gBAC5C,OAAO;aACV;YAED,IAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;YAChD,IAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YAE7C,IAAI,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,IAAI,KAAI,OAAO,EAAE;gBAExB,IAAA,KAEA,SAAS,MAFkE,EAAlE,SAAS,eAAA,EAAE,cAAc,oBAAA,EAAE,YAAY,kBAAA,EAAE,uBAAuB,6BAAA,EACzE,UAAU,GACV,SAAS,WADC,CACA;gBACd,IAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC;gBACzD,IAAM,GAAG,GAAgB,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC;gBACpE,IAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,uBAAuB,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;gBAErF,IAAI,CAAC,QAAQ,EAAE;oBACX,OAAO;iBACV;gBAED,IAAI,MAAM,GAAG,IAAA,+BAAc,EAAC,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,WAAW,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;gBACnE,IAAI,OAAO,GAAG,KAAK,CAAC;gBACd,IAAA,KAAyC,IAAI,CAAC,KAAK,CAAC,cAAc,EAAhE,WAAW,iBAAA,EAAW,KAAK,aAAA,EAAE,KAAK,WAA8B,CAAC;gBAEzE,IAAI,MAAM,IAAI,QAAQ,CAAC,KAAK,IAAI,KAAK,EAAE;oBACnC,IAAI,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE;wBACvD,IAAM,MAAM,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBAClC,IAAM,UAAU,GAAG,MAAA,IAAA,2CAAoB,EAAC,WAAW,EAAE,KAAK,CAAC,0CAAE,IAAI,CAAC;wBAClE,IAAI,EAAE,GAAgC,IAAI,CAAC;wBAE3C,MAAM,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,GAAG,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;wBAErD,OAAO,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,MAAM,CAAC,GAAG,GAAG,WAAW,CAAC,MAAM,EAAE;4BACvD,EAAE,GAAG,CAAA,MAAA,IAAA,2CAAoB,EAAC,WAAW,EAAE,MAAM,CAAC,0CAAE,IAAI,KAAI,IAAI,CAAC;4BAE7D,IAAI,EAAE,IAAI,UAAU,EAAE;gCAClB,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC;6BACxB;iCAAM;gCACH,MAAM;6BACT;yBACJ;wBAED,IAAI,SAAS,IAAI,EAAE,EAAE;4BACjB,IAAI,CAAC,wBAAwB,CACzB,EAAE,EACF,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EACpC,IAAI,CAAC,MAAM,CACd,CAAC;yBACL;6BAAM,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE;4BACtE,IAAI,CAAC,0BAA0B,CAC3B,IAAI,CAAC,MAAM,EACX,KAAK,EACL,MAAM,IAAI,CAAC,CAAC,WAAW,EACvB,MAAM,IAAI,CAAC,CAAC,sCAAsC,CACrD,CAAC;yBACL;qBACJ;yBAAM,IAAI,GAAG,IAAI,SAAS,IAAI,GAAG,IAAI,UAAU,EAAE;wBAC9C,IAAM,OAAO,GAAG,GAAG,IAAI,SAAS,CAAC;wBACjC,KACI,IAAI,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACvB,GAAG,GAAG,MAAA,MAAM,CAAC,GAAG,mCAAI,CAAC,EACrB,GAAG,GAAG,CAAC,MAAA,MAAM,CAAC,GAAG,mCAAI,CAAC,CAAC,GAAG,IAAI,GAElC,GAAG,IAAI,IAAI,EACb;4BACE,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE;gCAC3C,GAAG,IAAI,IAAI,CAAC;gCACZ,IAAI,GAAG,GAAG,CAAC,EAAE;oCACT,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;oCAC7D,MAAM;iCACT;qCAAM,IAAI,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE;oCAClC,IAAI,CAAC,0BAA0B,CAC3B,IAAI,CAAC,MAAM,EACX,QAAQ,CAAC,KAAK,EACd,IAAI,CAAC,SAAS,CACjB,CAAC;oCACF,MAAM;iCACT;gCACD,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;6BACnD;4BACD,IAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;4BAEnC,IAAI,OAAO,IAAI,IAAI,QAAQ,EAAE;gCACzB,OAAO,GAAG,IAAI,CAAC;gCACf,IAAI,CAAC,wBAAwB,CACzB,IAAI,EACJ,CAAC,EACD,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,eAAe,CACvB,CAAC;gCACF,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;gCACjB,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;gCACjB,MAAM;6BACT;yBACJ;wBACD,IAAI,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC,aAAa,EAAE;4BACjD,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;yBAC9B;qBACJ;yBAAM;wBACH,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;qBACpC;oBAED,IACI,SAAS;wBACT,CAAC,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC;wBACpD,MAAM,CAAC,GAAG,IAAI,CAAC;wBACf,MAAM,CAAC,GAAG,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;wBACpC,MAAM,CAAC,GAAG,IAAI,CAAA,MAAA,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,0CAAE,MAAM,IAAG,CAAC,EACnD;wBACE,MAAA,IAAI,CAAC,MAAM,0CAAE,QAAQ,CAAC,EAAE,cAAc,EAAE,yBAAyB,EAAE,CAAC,CAAC;qBACxE;iBACJ;gBAED,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,CAAC,OAAO,EAAE;oBAClC,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,QAAQ,CAAC;oBACrC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;iBACrC;aACJ;QACL,CAAC;QAEO,kDAAwB,GAAhC,UACI,IAAU,EACV,UAAkB,EAClB,MAAe,EACf,SAAmB;YAEnB,IAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,CAAC;YACjD,IAAI,SAAS,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,EAAE;gBAChD,IAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;gBAClC,IAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;gBAC/B,kDAAkD;gBAClD,IAAM,QAAQ,GAAG,IAAA,2BAAY,EAAC,SAAS,EAAE,CAAC,CAAC,CAAC;gBAC5C,iDAAiD;gBACjD,IAAM,MAAM,GAAG,IAAA,2BAAY,EAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBAEhE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAC/C,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;gBAEzC,IAAI,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;oBACzB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;iBACtC;aACJ;iBAAM;gBACH,4CAA4C;gBACtC,IAAA,KAAmB,IAAA,2BAAY,EAAC,IAAI,EAAE,UAAU,CAAC,EAA/C,IAAI,UAAA,EAAE,MAAM,YAAmC,CAAC;gBAExD,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAC7B,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;aACtC;YAED,IAAI,CAAC,eAAe,CAChB;gBACI,IAAI,EAAE,OAAO;gBACb,KAAK,OAAA;gBACL,UAAU,EAAE,KAAK;aACpB,EACD,IAAI,CAAC,kBAAkB,CAC1B,CAAC;QACN,CAAC;QAEO,0DAAgC,GAAxC,UAAyC,SAAiB,EAAE,SAAiB;;YACzE,IAAI,CAAA,MAAA,IAAI,CAAC,KAAK,CAAC,cAAc,0CAAE,MAAM,KAAI,IAAI,CAAC,MAAM,EAAE;gBAC5C,IAAA,KAA0B,IAAI,CAAC,KAAK,CAAC,cAAc,EAAjD,MAAM,YAAA,EAAE,WAAW,iBAA8B,CAAC;gBAC1D,IAAM,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,SAAS,CAAC;gBACnC,IAAM,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,SAAS,CAAC;gBAEnC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,WAAW,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE;oBACnF,IAAI,CAAC,oBAAoB,CAAC,EAAE,GAAG,KAAA,EAAE,GAAG,KAAA,EAAE,CAAC,CAAC;iBAC3C;aACJ;QACL,CAAC;QAEO,oDAA0B,GAAlC,UACI,MAAe,EACf,OAAoB,EACpB,KAAe,EACf,gCAA0C;YAE1C,IAAM,GAAG,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;YACjC,IAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;YAClC,IAAM,KAAK,GAAG,MAAM,IAAI,IAAA,qCAAO,EAAC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACpE,IAAI,OAAmC,CAAC;YAExC,IAAI,MAAM,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI,CAAC,EAAE;gBACxC,IAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;gBAChC,IACI,gCAAgC;oBAChC,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC;oBAC/E,IAAA,0CAAY,EAAC,OAAO,EAAE,cAAc,CAAC,EACvC;oBACE,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;oBAClC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;iBACvC;qBAAM;oBACH,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAChD,KAAK,CAAC,QAAQ,EAAE,CAAC;iBACpB;gBAED,IAAI,CAAC,eAAe,CAChB;oBACI,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,KAAK;oBACZ,UAAU,EAAE,KAAK;iBACpB,EACD,IAAI,CAAC,kBAAkB,CAC1B,CAAC;aACL;QACL,CAAC;QAEO,0CAAgB,GAAxB,UAAyB,KAAc;YACnC,IAAM,MAAM,GAAG,KAAK,CAAC,MAAc,CAAC;YAEpC,OAAO,IAAA,0CAAY,EAAC,MAAM,EAAE,cAAc,CAAC,IAAI,IAAA,6CAAe,EAAC,MAAM,EAAE,KAAK,CAAC;gBACzE,CAAC,CAAC,MAAM;gBACR,CAAC,CAAC,IAAI,CAAC;QACf,CAAC;QAqFO,6CAAmB,GAA3B,UACI,UAAgB,EAChB,OAAa,EACb,SAAoB;YAEpB,IAAI,KAA8B,CAAC;YACnC,IAAI,WAA+B,CAAC;YACpC,IAAI,OAAmC,CAAC;YAExC,IACI,CAAC,KAAK,GAAG,SAAS,CAAC,0BAA0B,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBACnE,KAAK,CAAC,iBAAiB;gBACvB,CAAC,WAAW,GAAG,IAAA,6CAAe,EAAC,KAAK,CAAC,CAAC;gBACtC,CAAC,OAAO,GAAG,IAAA,+BAAc,EAAC,WAAW,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,EAC7D;gBACE,OAAO,EAAE,KAAK,OAAA,EAAE,WAAW,aAAA,EAAE,OAAO,SAAA,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;aAC9D;iBAAM;gBACH,OAAO,IAAI,CAAC;aACf;QACL,CAAC;QAEO,8CAAoB,GAA5B,UAA6B,MAA2B;YACpD,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,IAAI,IAAI,CAAC,MAAM,EAAE;gBACpC,IAAA,KAMF,IAAI,CAAC,KAAK,CAAC,cAAc,EALzB,KAAK,WAAA,EACL,OAAO,aAAA,EACP,WAAW,iBAAA,EACX,SAAS,eAAA,EACD,KAAK,YACY,CAAC;gBAE9B,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,EAAE;oBACjE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,MAAM,CAAC;oBAC1C,IAAI,CAAC,eAAe,CAChB;wBACI,IAAI,EAAE,OAAO;wBACb,KAAK,OAAA;wBACL,QAAQ,EAAE,OAAO,CAAC,GAAG;wBACrB,WAAW,EAAE,OAAO,CAAC,GAAG;wBACxB,OAAO,EAAE,MAAM,CAAC,GAAG;wBACnB,UAAU,EAAE,MAAM,CAAC,GAAG;wBACtB,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc;qBAChD,EACD,EAAE,KAAK,OAAA,EAAE,OAAO,SAAA,EAAE,MAAM,QAAA,EAAE,WAAW,aAAA,EAAE,SAAS,WAAA,EAAE,CACrD,CAAC;oBAEF,OAAO,IAAI,CAAC;iBACf;aACJ;YAED,OAAO,KAAK,CAAC;QACjB,CAAC;QAEO,yCAAe,GAAvB,UACI,SAA8B,EAC9B,cAAyC;;YAEzC,MAAA,IAAI,CAAC,MAAM,0CAAE,eAAe,CAAC,SAAS,CAAC,CAAC;YACxC,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,cAAc,CAAC;QAC/C,CAAC;QAEO,0CAAgB,GAAxB;YACI,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;gBAC1B,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;gBAC3B,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,SAAS,CAAC;aACxC;QACL,CAAC;QACL,sBAAC;IAAD,CAAC,AA9uBD,IA8uBC;IAED;;;;OAIG;IACH,SAAgB,qBAAqB,CACjC,OAAsB;QAEtB,OAAO,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAJD,sDAIC","sourcesContent":["import { findCoordinate } from './findCoordinate';\nimport { findTableCellElement } from '../../coreApi/setDOMSelection/findTableCellElement';\nimport { isSingleImageInSelection } from './isSingleImageInSelection';\nimport { normalizePos } from './normalizePos';\nimport {\n isCharacterValue,\n isElementOfType,\n isModifierKey,\n isNodeOfType,\n parseTableCells,\n toArray,\n} from 'roosterjs-content-model-dom';\nimport type {\n DOMSelection,\n IEditor,\n PluginEvent,\n PluginWithState,\n SelectionPluginState,\n EditorOptions,\n DOMHelper,\n ParsedTable,\n TableSelectionInfo,\n TableCellCoordinate,\n} from 'roosterjs-content-model-types';\n\nconst MouseLeftButton = 0;\nconst MouseRightButton = 2;\nconst Up = 'ArrowUp';\nconst Down = 'ArrowDown';\nconst Left = 'ArrowLeft';\nconst Right = 'ArrowRight';\nconst Tab = 'Tab';\n\n/**\n * @internal\n */\nexport const DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';\n/**\n * @internal\n */\nexport const DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR = '#C6C6C6';\n\nclass SelectionPlugin implements PluginWithState<SelectionPluginState> {\n private editor: IEditor | null = null;\n private state: SelectionPluginState;\n private disposer: (() => void) | null = null;\n private logicalRootDisposer: (() => void) | null = null;\n private isSafari = false;\n private isMac = false;\n private scrollTopCache: number = 0;\n\n constructor(options: EditorOptions) {\n this.state = {\n selection: null,\n tableSelection: null,\n imageSelectionBorderColor:\n options.imageSelectionBorderColor ?? DEFAULT_SELECTION_BORDER_COLOR,\n imageSelectionBorderColorDark: options.imageSelectionBorderColor\n ? undefined\n : DEFAULT_SELECTION_BORDER_COLOR,\n tableCellSelectionBackgroundColor:\n options.tableCellSelectionBackgroundColor ??\n DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR,\n tableCellSelectionBackgroundColorDark: options.tableCellSelectionBackgroundColor\n ? undefined\n : DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR,\n };\n }\n\n getName() {\n return 'Selection';\n }\n\n initialize(editor: IEditor) {\n this.editor = editor;\n\n if (!this.state.imageSelectionBorderColorDark && this.state.imageSelectionBorderColor) {\n this.state.imageSelectionBorderColorDark = editor\n .getColorManager()\n .getDarkColor(this.state.imageSelectionBorderColor, undefined, 'border');\n }\n\n if (\n !this.state.tableCellSelectionBackgroundColorDark &&\n this.state.tableCellSelectionBackgroundColor\n ) {\n this.state.tableCellSelectionBackgroundColorDark = editor\n .getColorManager()\n .getDarkColor(\n this.state.tableCellSelectionBackgroundColor,\n undefined,\n 'background'\n );\n }\n\n const env = this.editor.getEnvironment();\n const document = this.editor.getDocument();\n\n this.isSafari = !!env.isSafari;\n this.isMac = !!env.isMac;\n document.addEventListener('selectionchange', this.onSelectionChange);\n if (this.isSafari) {\n this.disposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n drop: { beforeDispatch: this.onDrop },\n });\n } else {\n this.disposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n blur: { beforeDispatch: this.onBlur },\n drop: { beforeDispatch: this.onDrop },\n });\n }\n }\n\n dispose() {\n this.editor?.getDocument().removeEventListener('selectionchange', this.onSelectionChange);\n\n if (this.disposer) {\n this.disposer();\n this.disposer = null;\n }\n\n this.logicalRootDisposer?.();\n this.logicalRootDisposer = null;\n\n this.detachMouseEvent();\n this.editor = null;\n }\n\n getState(): SelectionPluginState {\n return this.state;\n }\n\n onPluginEvent(event: PluginEvent) {\n if (!this.editor) {\n return;\n }\n\n switch (event.eventType) {\n case 'mouseDown':\n this.onMouseDown(this.editor, event.rawEvent);\n break;\n\n case 'mouseUp':\n this.onMouseUp();\n break;\n\n case 'keyDown':\n this.onKeyDown(this.editor, event.rawEvent);\n break;\n\n case 'contentChanged':\n this.state.tableSelection = null;\n break;\n\n case 'scroll':\n if (!this.editor.hasFocus()) {\n this.scrollTopCache = event.scrollContainer.scrollTop;\n }\n break;\n\n case 'logicalRootChanged':\n this.logicalRootDisposer?.();\n if (this.isSafari) {\n this.logicalRootDisposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n drop: { beforeDispatch: this.onDrop },\n });\n } else {\n this.logicalRootDisposer = this.editor.attachDomEvent({\n focus: { beforeDispatch: this.onFocus },\n blur: { beforeDispatch: this.onBlur },\n drop: { beforeDispatch: this.onDrop },\n });\n }\n break;\n }\n }\n\n private onMouseDown(editor: IEditor, rawEvent: MouseEvent) {\n const selection = editor.getDOMSelection();\n let image: HTMLImageElement | null;\n\n // Image selection\n if (\n selection?.type == 'image' &&\n (rawEvent.button == MouseLeftButton ||\n (rawEvent.button == MouseRightButton &&\n !this.getClickingImage(rawEvent) &&\n !this.getContainedTargetImage(rawEvent, selection)))\n ) {\n this.setDOMSelection(null /*domSelection*/, null /*tableSelection*/);\n }\n\n if (\n (image =\n this.getClickingImage(rawEvent) ??\n this.getContainedTargetImage(rawEvent, selection)) &&\n image.isContentEditable\n ) {\n this.setDOMSelection(\n {\n type: 'image',\n image: image,\n },\n null\n );\n return;\n }\n\n // Table selection\n if (selection?.type == 'table' && rawEvent.button == MouseLeftButton) {\n this.setDOMSelection(null /*domSelection*/, null /*tableSelection*/);\n }\n\n let tableSelection: TableSelectionInfo | null;\n const target = rawEvent.target as Node;\n\n if (\n target &&\n rawEvent.button == MouseLeftButton &&\n (tableSelection = this.parseTableSelection(target, target, editor.getDOMHelper()))\n ) {\n this.state.tableSelection = tableSelection;\n\n if (rawEvent.detail >= 3) {\n const lastCo = findCoordinate(\n tableSelection.parsedTable,\n rawEvent.target as Node,\n editor.getDOMHelper()\n );\n\n if (lastCo) {\n // Triple click, select the current cell\n tableSelection.lastCo = lastCo;\n this.updateTableSelection(lastCo);\n rawEvent.preventDefault();\n }\n }\n\n this.state.mouseDisposer?.();\n this.state.mouseDisposer = editor.attachDomEvent({\n mousemove: {\n beforeDispatch: this.onMouseMove,\n },\n });\n }\n }\n\n private onMouseMove = (event: Event) => {\n if (this.editor && this.state.tableSelection) {\n const hasTableSelection = !!this.state.tableSelection.lastCo;\n const currentNode = event.target as Node;\n const domHelper = this.editor.getDOMHelper();\n\n const range = this.editor.getDocument().createRange();\n const startNode = this.state.tableSelection.startNode;\n const isReverted =\n currentNode.compareDocumentPosition(startNode) == Node.DOCUMENT_POSITION_FOLLOWING;\n\n if (isReverted) {\n range.setStart(currentNode, 0);\n range.setEnd(\n startNode,\n isNodeOfType(startNode, 'TEXT_NODE')\n ? startNode.nodeValue?.length ?? 0\n : startNode.childNodes.length\n );\n } else {\n range.setStart(startNode, 0);\n range.setEnd(currentNode, 0);\n }\n\n // Use common container of the range to search a common table that covers both start and end node\n const tableStart = range.commonAncestorContainer;\n const newTableSelection = this.parseTableSelection(tableStart, startNode, domHelper);\n\n if (newTableSelection) {\n const lastCo = findCoordinate(\n newTableSelection.parsedTable,\n currentNode,\n domHelper\n );\n\n if (newTableSelection.table != this.state.tableSelection.table) {\n // Move mouse into another table (nest table scenario)\n this.state.tableSelection = newTableSelection;\n this.state.tableSelection.lastCo = lastCo ?? undefined;\n }\n\n const updated = lastCo && this.updateTableSelection(lastCo);\n\n if (hasTableSelection || updated) {\n event.preventDefault();\n }\n } else if (this.editor.getDOMSelection()?.type == 'table') {\n // Move mouse out of table\n this.setDOMSelection(\n {\n type: 'range',\n range,\n isReverted,\n },\n this.state.tableSelection\n );\n }\n }\n };\n\n private onMouseUp() {\n this.detachMouseEvent();\n }\n\n private onDrop = () => {\n this.detachMouseEvent();\n };\n\n private onKeyDown(editor: IEditor, rawEvent: KeyboardEvent) {\n const key = rawEvent.key;\n const selection = editor.getDOMSelection();\n const win = editor.getDocument().defaultView;\n\n switch (selection?.type) {\n case 'image':\n if (!isModifierKey(rawEvent) && !rawEvent.shiftKey && selection.image.parentNode) {\n if (key === 'Escape') {\n this.selectBeforeOrAfterElement(editor, selection.image);\n rawEvent.stopPropagation();\n } else if (key !== 'Delete' && key !== 'Backspace') {\n this.selectBeforeOrAfterElement(editor, selection.image);\n }\n }\n\n if (\n (isModifierKey(rawEvent) || rawEvent.shiftKey) &&\n selection.image &&\n !this.isSafari\n ) {\n const range = selection.image.ownerDocument.createRange();\n range.selectNode(selection.image);\n this.setDOMSelection(\n {\n type: 'range',\n range,\n isReverted: false,\n },\n null /* tableSelection */\n );\n }\n break;\n\n case 'range':\n if (key == Up || key == Down || key == Left || key == Right || key == Tab) {\n const start = selection.range.startContainer;\n this.state.tableSelection = this.parseTableSelection(\n start,\n start,\n editor.getDOMHelper()\n );\n\n if (this.state.tableSelection && !rawEvent.defaultPrevented) {\n if (key == Tab) {\n this.handleSelectionInTable(this.getTabKey(rawEvent));\n rawEvent.preventDefault();\n } else {\n win?.requestAnimationFrame(() => this.handleSelectionInTable(key));\n }\n }\n }\n break;\n\n case 'table':\n // After a content change event is handled tableSelection state is reset to null\n // Since we have table selection from DOMSelection, we can use it to re-create the tableSelection state\n if (this.state.tableSelection == null) {\n const { table, firstRow, firstColumn, lastRow, lastColumn } = selection;\n\n const parsedTable = parseTableCells(table);\n if (parsedTable) {\n const firstCo = { row: firstRow, col: firstColumn };\n const lastCo = { row: lastRow, col: lastColumn };\n\n // Create the tableSelection with current table info\n this.state.tableSelection = {\n table,\n parsedTable,\n firstCo,\n lastCo,\n startNode: findTableCellElement(parsedTable, firstCo)?.cell || table,\n };\n }\n }\n if (this.state.tableSelection?.lastCo) {\n const { shiftKey, key } = rawEvent;\n\n if (shiftKey && (key == Left || key == Right)) {\n const isRtl =\n win?.getComputedStyle(this.state.tableSelection.table).direction ==\n 'rtl';\n\n this.updateTableSelectionFromKeyboard(\n 0,\n (key == Left ? -1 : 1) * (isRtl ? -1 : 1)\n );\n rawEvent.preventDefault();\n } else if (shiftKey && (key == Up || key == Down)) {\n this.updateTableSelectionFromKeyboard(key == Up ? -1 : 1, 0);\n rawEvent.preventDefault();\n } else if (key != 'Shift' && !isCharacterValue(rawEvent)) {\n if (key == Up || key == Down || key == Left || key == Right) {\n this.setDOMSelection(null /*domSelection*/, this.state.tableSelection);\n win?.requestAnimationFrame(() => this.handleSelectionInTable(key));\n }\n }\n }\n break;\n }\n }\n\n private getTabKey(rawEvent: KeyboardEvent) {\n return rawEvent.shiftKey ? 'TabLeft' : 'TabRight';\n }\n\n private handleSelectionInTable(\n key: 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight' | 'TabLeft' | 'TabRight'\n ) {\n if (!this.editor || !this.state.tableSelection) {\n return;\n }\n\n const selection = this.editor.getDOMSelection();\n const domHelper = this.editor.getDOMHelper();\n\n if (selection?.type == 'range') {\n const {\n range: { collapsed, startContainer, endContainer, commonAncestorContainer },\n isReverted,\n } = selection;\n const start = isReverted ? endContainer : startContainer;\n const end: Node | null = isReverted ? startContainer : endContainer;\n const tableSel = this.parseTableSelection(commonAncestorContainer, start, domHelper);\n\n if (!tableSel) {\n return;\n }\n\n let lastCo = findCoordinate(tableSel?.parsedTable, end, domHelper);\n let tabMove = false;\n const { parsedTable, firstCo: oldCo, table } = this.state.tableSelection;\n\n if (lastCo && tableSel.table == table) {\n if (lastCo.col != oldCo.col && (key == Up || key == Down)) {\n const change = key == Up ? -1 : 1;\n const originalTd = findTableCellElement(parsedTable, oldCo)?.cell;\n let td: HTMLTableCellElement | null = null;\n\n lastCo = { row: oldCo.row + change, col: oldCo.col };\n\n while (lastCo.row >= 0 && lastCo.row < parsedTable.length) {\n td = findTableCellElement(parsedTable, lastCo)?.cell || null;\n\n if (td == originalTd) {\n lastCo.row += change;\n } else {\n break;\n }\n }\n\n if (collapsed && td) {\n this.setRangeSelectionInTable(\n td,\n key == Up ? td.childNodes.length : 0,\n this.editor\n );\n } else if (!td && (lastCo.row == -1 || lastCo.row <= parsedTable.length)) {\n this.selectBeforeOrAfterElement(\n this.editor,\n table,\n change == 1 /* after */,\n change != 1 /* setSelectionInNextSiblingElement */\n );\n }\n } else if (key == 'TabLeft' || key == 'TabRight') {\n const reverse = key == 'TabLeft';\n for (\n let step = reverse ? -1 : 1,\n row = lastCo.row ?? 0,\n col = (lastCo.col ?? 0) + step;\n ;\n col += step\n ) {\n if (col < 0 || col >= parsedTable[row].length) {\n row += step;\n if (row < 0) {\n this.selectBeforeOrAfterElement(this.editor, tableSel.table);\n break;\n } else if (row >= parsedTable.length) {\n this.selectBeforeOrAfterElement(\n this.editor,\n tableSel.table,\n true /*after*/\n );\n break;\n }\n col = reverse ? parsedTable[row].length - 1 : 0;\n }\n const cell = parsedTable[row][col];\n\n if (typeof cell != 'string') {\n tabMove = true;\n this.setRangeSelectionInTable(\n cell,\n 0,\n this.editor,\n true /* selectAll */\n );\n lastCo.row = row;\n lastCo.col = col;\n break;\n }\n }\n if (this.editor.getSnapshotsManager().hasNewContent) {\n this.editor.takeSnapshot();\n }\n } else {\n this.state.tableSelection = null;\n }\n\n if (\n collapsed &&\n (lastCo.col != oldCo.col || lastCo.row != oldCo.row) &&\n lastCo.row >= 0 &&\n lastCo.row == parsedTable.length - 1 &&\n lastCo.col == parsedTable[lastCo.row]?.length - 1\n ) {\n this.editor?.announce({ defaultStrings: 'announceOnFocusLastCell' });\n }\n }\n\n if (!collapsed && lastCo && !tabMove) {\n this.state.tableSelection = tableSel;\n this.updateTableSelection(lastCo);\n }\n }\n }\n\n private setRangeSelectionInTable(\n cell: Node,\n nodeOffset: number,\n editor: IEditor,\n selectAll?: boolean\n ) {\n const range = editor.getDocument().createRange();\n if (selectAll && cell.firstChild && cell.lastChild) {\n const cellStart = cell.firstChild;\n const cellEnd = cell.lastChild;\n // Get first deepest editable position in the cell\n const posStart = normalizePos(cellStart, 0);\n // Get last deepest editable position in the cell\n const posEnd = normalizePos(cellEnd, cellEnd.childNodes.length);\n\n range.setStart(posStart.node, posStart.offset);\n range.setEnd(posEnd.node, posEnd.offset);\n\n if (range.toString() === '') {\n range.collapse(true /* toStart */);\n }\n } else {\n // Get deepest editable position in the cell\n const { node, offset } = normalizePos(cell, nodeOffset);\n\n range.setStart(node, offset);\n range.collapse(true /* toStart */);\n }\n\n this.setDOMSelection(\n {\n type: 'range',\n range,\n isReverted: false,\n },\n null /*tableSelection*/\n );\n }\n\n private updateTableSelectionFromKeyboard(rowChange: number, colChange: number) {\n if (this.state.tableSelection?.lastCo && this.editor) {\n const { lastCo, parsedTable } = this.state.tableSelection;\n const row = lastCo.row + rowChange;\n const col = lastCo.col + colChange;\n\n if (row >= 0 && row < parsedTable.length && col >= 0 && col < parsedTable[row].length) {\n this.updateTableSelection({ row, col });\n }\n }\n }\n\n private selectBeforeOrAfterElement(\n editor: IEditor,\n element: HTMLElement,\n after?: boolean,\n setSelectionInNextSiblingElement?: boolean\n ) {\n const doc = editor.getDocument();\n const parent = element.parentNode;\n const index = parent && toArray(parent.childNodes).indexOf(element);\n let sibling: Element | undefined | null;\n\n if (parent && index !== null && index >= 0) {\n const range = doc.createRange();\n if (\n setSelectionInNextSiblingElement &&\n (sibling = after ? element.nextElementSibling : element.previousElementSibling) &&\n isNodeOfType(sibling, 'ELEMENT_NODE')\n ) {\n range.selectNodeContents(sibling);\n range.collapse(false /* toStart */);\n } else {\n range.setStart(parent, index + (after ? 1 : 0));\n range.collapse();\n }\n\n this.setDOMSelection(\n {\n type: 'range',\n range: range,\n isReverted: false,\n },\n null /*tableSelection*/\n );\n }\n }\n\n private getClickingImage(event: UIEvent): HTMLImageElement | null {\n const target = event.target as Node;\n\n return isNodeOfType(target, 'ELEMENT_NODE') && isElementOfType(target, 'img')\n ? target\n : null;\n }\n\n // MacOS will not create a mouseUp event if contextMenu event is not prevent defaulted.\n // Make sure we capture image target even if image is wrapped\n private getContainedTargetImage = (\n event: MouseEvent,\n previousSelection: DOMSelection | null\n ): HTMLImageElement | null => {\n if (!this.isMac || !previousSelection || previousSelection.type !== 'image') {\n return null;\n }\n\n const target = event.target as Node;\n if (\n isNodeOfType(target, 'ELEMENT_NODE') &&\n isElementOfType(target, 'span') &&\n target.firstChild === previousSelection.image\n ) {\n return previousSelection.image;\n }\n return null;\n };\n\n private onFocus = () => {\n if (!this.state.skipReselectOnFocus && this.state.selection) {\n this.setDOMSelection(this.state.selection, this.state.tableSelection);\n }\n\n if (this.state.selection?.type == 'range' && !this.isSafari) {\n // Editor is focused, now we can get live selection. So no need to keep a selection if the selection type is range.\n this.state.selection = null;\n }\n\n if (this.scrollTopCache && this.editor) {\n const sc = this.editor.getScrollContainer();\n sc.scrollTop = this.scrollTopCache;\n this.scrollTopCache = 0;\n }\n };\n\n private onBlur = () => {\n if (this.editor) {\n if (!this.state.selection) {\n this.state.selection = this.editor.getDOMSelection();\n }\n const sc = this.editor.getScrollContainer();\n this.scrollTopCache = sc.scrollTop;\n }\n };\n\n private onSelectionChange = () => {\n if (this.editor?.hasFocus() && !this.editor.isInShadowEdit()) {\n const newSelection = this.editor.getDOMSelection();\n\n //If am image selection changed to a wider range due a keyboard event, we should update the selection\n const selection = this.editor.getDocument().getSelection();\n if (selection && selection.focusNode) {\n const image = isSingleImageInSelection(selection);\n if (newSelection?.type == 'image' && !image) {\n const range = selection.getRangeAt(0);\n this.editor.setDOMSelection({\n type: 'range',\n range,\n isReverted:\n selection.focusNode != range.endContainer ||\n selection.focusOffset != range.endOffset,\n });\n } else if (newSelection?.type !== 'image' && image) {\n this.editor.setDOMSelection({\n type: 'image',\n image,\n });\n }\n }\n\n // Safari has problem to handle onBlur event. When blur, we cannot get the original selection from editor.\n // So we always save a selection whenever editor has focus. Then after blur, we can still use this cached selection.\n if (newSelection?.type == 'range') {\n if (this.isSafari) {\n this.state.selection = newSelection;\n }\n }\n }\n };\n\n private parseTableSelection(\n tableStart: Node,\n tdStart: Node,\n domHelper: DOMHelper\n ): TableSelectionInfo | null {\n let table: HTMLTableElement | null;\n let parsedTable: ParsedTable | null;\n let firstCo: TableCellCoordinate | null;\n\n if (\n (table = domHelper.findClosestElementAncestor(tableStart, 'table')) &&\n table.isContentEditable &&\n (parsedTable = parseTableCells(table)) &&\n (firstCo = findCoordinate(parsedTable, tdStart, domHelper))\n ) {\n return { table, parsedTable, firstCo, startNode: tdStart };\n } else {\n return null;\n }\n }\n\n private updateTableSelection(lastCo: TableCellCoordinate) {\n if (this.state.tableSelection && this.editor) {\n const {\n table,\n firstCo,\n parsedTable,\n startNode,\n lastCo: oldCo,\n } = this.state.tableSelection;\n\n if (oldCo || firstCo.row != lastCo.row || firstCo.col != lastCo.col) {\n this.state.tableSelection.lastCo = lastCo;\n this.setDOMSelection(\n {\n type: 'table',\n table,\n firstRow: firstCo.row,\n firstColumn: firstCo.col,\n lastRow: lastCo.row,\n lastColumn: lastCo.col,\n tableSelectionInfo: this.state.tableSelection,\n },\n { table, firstCo, lastCo, parsedTable, startNode }\n );\n\n return true;\n }\n }\n\n return false;\n }\n\n private setDOMSelection(\n selection: DOMSelection | null,\n tableSelection: TableSelectionInfo | null\n ) {\n this.editor?.setDOMSelection(selection);\n this.state.tableSelection = tableSelection;\n }\n\n private detachMouseEvent() {\n if (this.state.mouseDisposer) {\n this.state.mouseDisposer();\n this.state.mouseDisposer = undefined;\n }\n }\n}\n\n/**\n * @internal\n * Create a new instance of SelectionPlugin.\n * @param option The editor option\n */\nexport function createSelectionPlugin(\n options: EditorOptions\n): PluginWithState<SelectionPluginState> {\n return new SelectionPlugin(options);\n}\n"]}
@@ -227,7 +227,7 @@ define(["require", "exports", "tslib", "./core/createEditorCore", "roosterjs-con
227
227
  if (!!isDarkMode != core.lifecycle.isDarkMode) {
228
228
  (0, roosterjs_content_model_dom_1.transformColor)(core.physicalRoot, false /*includeSelf*/, isDarkMode ? 'lightToDark' : 'darkToLight', core.darkColorHandler, {
229
229
  tableBorders: this.isExperimentalFeatureEnabled('TransformTableBorderColors'),
230
- });
230
+ }, core.format.defaultFormat.textColor);
231
231
  core.lifecycle.isDarkMode = !!isDarkMode;
232
232
  core.api.triggerEvent(core, {
233
233
  eventType: 'contentChanged',