@talrace/ngx-noder 19.0.35 → 19.0.37

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 (31) hide show
  1. package/fesm2022/talrace-ngx-noder.mjs +762 -1315
  2. package/fesm2022/talrace-ngx-noder.mjs.map +1 -1
  3. package/lib/editor/components/external-element/external.component.d.ts +2 -0
  4. package/lib/editor/components/shared/services/custom-content.service.d.ts +1 -8
  5. package/lib/editor/content/constants/display-values.const.d.ts +6 -2
  6. package/lib/editor/content/constants/editor.const.d.ts +3 -1
  7. package/lib/editor/content/display-data/display-data.d.ts +10 -29
  8. package/lib/editor/content/display-data/display-token.model.d.ts +8 -17
  9. package/lib/editor/content/display-data/general-properties.model.d.ts +3 -2
  10. package/lib/editor/content/display-data/indent.model.d.ts +2 -1
  11. package/lib/editor/content/display-data/line-info.model.d.ts +3 -3
  12. package/lib/editor/content/display-data/paragraph-info.interface.d.ts +1 -1
  13. package/lib/editor/content/display-data/text-line-info.d.ts +1 -14
  14. package/lib/editor/content/helpers/display-token.helper.d.ts +9 -3
  15. package/lib/editor/content/helpers/line-info.helper.d.ts +10 -0
  16. package/lib/editor/display/layers/text.layer.d.ts +2 -4
  17. package/lib/editor/display/rendering.helper.d.ts +4 -13
  18. package/lib/editor/gadgets/font-metrics/font-metric-size.interface.d.ts +0 -4
  19. package/lib/editor/gadgets/numbering/numbering.helper.d.ts +16 -7
  20. package/lib/editor/gadgets/page-break/break.helper.d.ts +1 -2
  21. package/lib/editor/positioning/cursor-position.interface.d.ts +3 -7
  22. package/lib/editor/positioning/position.helper.d.ts +0 -3
  23. package/lib/models/generated/heading.model.d.ts +2 -0
  24. package/lib/models/generated/table-style.model.d.ts +13 -0
  25. package/lib/models/generated/table.model.d.ts +1 -1
  26. package/package.json +1 -1
  27. package/src/lib/apart-components/editor-toolbar/components/menu-dropdowns/_menu-dropdowns.theme.scss +0 -4
  28. package/lib/editor/components/tab/tab.helper.d.ts +0 -4
  29. package/lib/editor/content/display-data/format-ext.model.d.ts +0 -5
  30. package/lib/editor/display/print/print.rendering.helper.d.ts +0 -6
  31. package/lib/editor/positioning/line-width.helper.d.ts +0 -5
@@ -81,6 +81,25 @@ class ParagraphStyleModel {
81
81
  }
82
82
  }
83
83
 
84
+ class MarginsModel {
85
+ constructor(fields) {
86
+ if (fields) {
87
+ Object.assign(this, fields);
88
+ }
89
+ }
90
+ }
91
+
92
+ class TableStyleModel {
93
+ constructor(fields) {
94
+ if (fields) {
95
+ if (fields.margins) {
96
+ fields.margins = new MarginsModel(fields.margins);
97
+ }
98
+ Object.assign(this, fields);
99
+ }
100
+ }
101
+ }
102
+
84
103
  class TextStyleModel {
85
104
  constructor(fields) {
86
105
  if (fields) {
@@ -95,6 +114,9 @@ class HeadingModel {
95
114
  if (fields.paragraphStyle) {
96
115
  fields.paragraphStyle = new ParagraphStyleModel(fields.paragraphStyle);
97
116
  }
117
+ if (fields.tableStyle) {
118
+ fields.tableStyle = new TableStyleModel(fields.tableStyle);
119
+ }
98
120
  if (fields.textStyle) {
99
121
  fields.textStyle = new TextStyleModel(fields.textStyle);
100
122
  }
@@ -103,6 +125,21 @@ class HeadingModel {
103
125
  }
104
126
  }
105
127
 
128
+ class MarginModel {
129
+ constructor(fields) {
130
+ this.left = DocumentInfo.paddingLeft;
131
+ this.right = DocumentInfo.paddingRight;
132
+ this.top = DocumentInfo.paddingTop;
133
+ this.bottom = DocumentInfo.paddingBottom;
134
+ this.header = DocumentInfo.paddingHeader;
135
+ this.footer = DocumentInfo.paddingFooter;
136
+ if (!fields) {
137
+ return;
138
+ }
139
+ Object.assign(this, fields);
140
+ }
141
+ }
142
+
106
143
  var VerticalAlignment;
107
144
  (function (VerticalAlignment) {
108
145
  VerticalAlignment[VerticalAlignment["None"] = 0] = "None";
@@ -125,7 +162,7 @@ const DEFAULT_TOOLBAR_STYLES = () => ({
125
162
  const DEFAULT_BACKGROUND_COLOR = 'transparent';
126
163
  const DEFAULT_FONT_FAMILY = 'Times New Roman';
127
164
  const DEFAULT_FONT_SIZE = 11;
128
- const DEFAULT_FONT_COLOR = '#000';
165
+ const DEFAULT_FONT_COLOR = '#000000';
129
166
  const HYPERLINK_FONT_COLOR = '#0000EE';
130
167
  const DEFAULT_HEADING_STYLE_ID = 'Default';
131
168
  const HYPERLINK_HEADING_STYLE_ID = 'Hyperlink';
@@ -180,6 +217,12 @@ const NEW_LINE_MARKUP = '\n';
180
217
  const DEFAULT_TAB_WIDTH = 48;
181
218
  const DEFAULT_OFFSET_AFTER_NUMBERING_MARKER = 20;
182
219
  const DEFAULT_EDGE_MAX_HEIGHT_MULTIPLIER = 0.4;
220
+ const DEFAULT_TABLE_MARGINS = new MarginModel({
221
+ top: 0,
222
+ left: 7,
223
+ right: 7,
224
+ bottom: 0
225
+ });
183
226
 
184
227
  var PageType;
185
228
  (function (PageType) {
@@ -487,11 +530,7 @@ class FontMetrics {
487
530
  return {
488
531
  width: textMetrics.width,
489
532
  height: textMetrics.fontBoundingBoxAscent + textMetrics.fontBoundingBoxDescent,
490
- baseline: fontBaseLine.baseline,
491
- content: fontBaseLine.content,
492
533
  font: fontBaseLine.font,
493
- line: fontBaseLine.line,
494
- multiplier: fontBaseLine.multiplier,
495
534
  ascent: textMetrics.fontBoundingBoxAscent,
496
535
  descent: textMetrics.fontBoundingBoxDescent
497
536
  };
@@ -1304,6 +1343,10 @@ class ExternalComponent extends BaseNoderComponent {
1304
1343
  constructor() {
1305
1344
  super(...arguments);
1306
1345
  this.focusSidenav = true;
1346
+ this.isText = false;
1347
+ }
1348
+ getText() {
1349
+ return '';
1307
1350
  }
1308
1351
  skipSidenav() {
1309
1352
  return this.editorService.isViewOnly;
@@ -1660,11 +1703,11 @@ const CUSTOM_ELEMENT_MARKER = '*';
1660
1703
  const TABLE_MARKER = '#';
1661
1704
 
1662
1705
  class BreakHelper {
1663
- static getBreakType(model, char, insertIndex) {
1706
+ static getBreakType(breaks, char, insertIndex) {
1664
1707
  if (char !== CUSTOM_ELEMENT_MARKER) {
1665
1708
  return null;
1666
1709
  }
1667
- return model.breaks.find(x => x.insertIndex === insertIndex)?.breakType ?? null;
1710
+ return breaks.find(x => x.insertIndex === insertIndex)?.breakType ?? null;
1668
1711
  }
1669
1712
  static removeBreakMarker(breaks, text, fragmentStartIndex) {
1670
1713
  const index = text.at(-1) === NEW_LINE_MARKUP ? -2 : -1;
@@ -2773,14 +2816,6 @@ class BreakOperationsHelper {
2773
2816
  }
2774
2817
  }
2775
2818
 
2776
- class MarginsModel {
2777
- constructor(fields) {
2778
- if (fields) {
2779
- Object.assign(this, fields);
2780
- }
2781
- }
2782
- }
2783
-
2784
2819
  class CellModel {
2785
2820
  constructor(fields) {
2786
2821
  if (fields) {
@@ -2892,7 +2927,7 @@ class RangeElementHelper {
2892
2927
  element.startIndex += length;
2893
2928
  element.endIndex += length;
2894
2929
  }
2895
- else if (element.endIndex >= index) {
2930
+ else if (element.endIndex > index) {
2896
2931
  element.endIndex += length;
2897
2932
  }
2898
2933
  }
@@ -4749,7 +4784,7 @@ class TableOperationsHelper {
4749
4784
  });
4750
4785
  columns.push(column);
4751
4786
  }
4752
- const table = new TableModel({ insertIndex: insertIndex, alignment: 0, rows, columns });
4787
+ const table = new TableModel({ insertIndex: insertIndex, alignment: 0, rows, columns, margins: DEFAULT_TABLE_MARGINS });
4753
4788
  IndexedElementOperationsHelper.insertContent(tables, insertIndex, 1);
4754
4789
  const index = tables.findIndex(x => x.insertIndex > table.insertIndex);
4755
4790
  if (index < 0) {
@@ -5915,24 +5950,191 @@ class PageHelper {
5915
5950
  }
5916
5951
  }
5917
5952
 
5918
- const DisplayValue = {
5919
- char: 1,
5920
- customContent: 3,
5921
- punctuation: 9,
5922
- space: 10,
5923
- trailingSpace: 11,
5924
- emptyLine: 13
5925
- };
5953
+ class NumberingDataModel {
5954
+ constructor(fields) {
5955
+ if (!fields) {
5956
+ return;
5957
+ }
5958
+ Object.assign(this, fields);
5959
+ }
5960
+ }
5961
+
5962
+ class NumberingParagraphStyleModel extends ParagraphStyleModel {
5963
+ constructor(fields) {
5964
+ super();
5965
+ this.numberingType = null;
5966
+ this.numberingLevelsStyles = null;
5967
+ if (!fields) {
5968
+ return;
5969
+ }
5970
+ Object.assign(this, fields);
5971
+ }
5972
+ }
5926
5973
 
5927
- class LineWidthHelper {
5928
- static getParagraphLineDisplayTokens(session, paragraphIndex, lineIndex) {
5929
- const docPos = session.displayData.positionToIndex(new CursorParagraph(paragraphIndex, 0), 0);
5930
- const rowWrap = session.displayData.paragraphs[paragraphIndex]?.nextLineIndexes || [];
5931
- const startWrapIndex = lineIndex > 0 ? rowWrap[lineIndex - 1] : 0;
5932
- const endIndex = rowWrap[lineIndex];
5933
- const docLine = session.displayData.getParagraphContent(paragraphIndex);
5934
- const offset = startWrapIndex ? docPos + startWrapIndex : docPos;
5935
- return session.displayData.getLineTokens(session.model, docLine.substring(startWrapIndex, endIndex || undefined), offset);
5974
+ class NumberingHelper {
5975
+ static addValueToNumberingInfo(numberingId, numberingInfo, numberingLevels) {
5976
+ if (numberingInfo[numberingId]) {
5977
+ return;
5978
+ }
5979
+ numberingInfo[numberingId] = [];
5980
+ for (let numberingLevel of numberingLevels) {
5981
+ numberingInfo[numberingId][numberingLevel.level] = {
5982
+ markerIndex: numberingLevel.startValue,
5983
+ start: numberingLevel.startValue,
5984
+ needToRecalculate: true,
5985
+ needToCalculateFirstMarker: false
5986
+ };
5987
+ }
5988
+ }
5989
+ static setNumberingNeedToRecalculate(numberingInfo, numberingId) {
5990
+ numberingInfo[numberingId].forEach(x => {
5991
+ x.needToRecalculate = true;
5992
+ x.markerIndex = x.start;
5993
+ x.needToCalculateFirstMarker = false;
5994
+ });
5995
+ }
5996
+ static setAllNumberingIsCalculated(numberingInfo) {
5997
+ for (let numberingId in numberingInfo) {
5998
+ numberingInfo[numberingId].forEach(x => {
5999
+ x.needToRecalculate = false;
6000
+ x.needToCalculateFirstMarker = false;
6001
+ });
6002
+ }
6003
+ }
6004
+ static getStyles(paragraphStyle, numberings) {
6005
+ const numberingLevels = numberings.find(x => x.numberingId === paragraphStyle.numberingId).levels;
6006
+ const numberingLevelsStyles = numberingLevels.reduce((prev, next) => `${prev}${next.marker}${next.markerType}`, '');
6007
+ const level = numberingLevels.find(x => x.level === paragraphStyle.numberingLevel);
6008
+ return new NumberingParagraphStyleModel({ ...paragraphStyle, numberingType: level.markerType, numberingLevelsStyles });
6009
+ }
6010
+ static findNumberingLevel(numberings, id, level) {
6011
+ const numbering = numberings.find(x => x.numberingId === id);
6012
+ return numbering?.levels.find(x => x.level === level);
6013
+ }
6014
+ static findNumberingLevels(numberings, id) {
6015
+ const numbering = numberings.find(x => x.numberingId === id);
6016
+ return numbering?.levels;
6017
+ }
6018
+ static calculateNumberingInfo(numberingId, level, numberingInfo, numberings) {
6019
+ const numberingModel = this.findNumberingLevel(numberings, numberingId, level);
6020
+ if (numberingModel?.markerType === NumberingMarkerType.Bullet) {
6021
+ return;
6022
+ }
6023
+ this.calculateMarkerIndexes(numberingId, level, numberingInfo);
6024
+ }
6025
+ static calculateMarkerIndexes(numberingId, level, numberingInfo) {
6026
+ if (numberingInfo[numberingId][level].needToRecalculate) {
6027
+ if (numberingInfo[numberingId][level].needToCalculateFirstMarker) {
6028
+ numberingInfo[numberingId][level].markerIndex++;
6029
+ }
6030
+ else {
6031
+ numberingInfo[numberingId][level].needToCalculateFirstMarker = true;
6032
+ }
6033
+ for (let i = level + 1; i < numberingInfo[numberingId].length; i++) {
6034
+ numberingInfo[numberingId][i].markerIndex = numberingInfo[numberingId][i].start;
6035
+ numberingInfo[numberingId][i].needToCalculateFirstMarker = false;
6036
+ }
6037
+ for (let i = 0; i < level; i++) {
6038
+ if (numberingInfo[numberingId][i].markerIndex === numberingInfo[numberingId][i].start) {
6039
+ numberingInfo[numberingId][i].needToCalculateFirstMarker = true;
6040
+ }
6041
+ }
6042
+ }
6043
+ }
6044
+ static getMarker(levelModels, level, numberingId, numberingInfo) {
6045
+ let levelMarker = levelModels[level].marker;
6046
+ let index = levelMarker.indexOf('%');
6047
+ if (index === -1) {
6048
+ return levelMarker;
6049
+ }
6050
+ const splittedMarker = levelMarker.split('.');
6051
+ return this.createMarkerString(numberingInfo, numberingId, splittedMarker);
6052
+ }
6053
+ static createDataModel(numberings, paragraphs, paragraphIndex, numberingInfo) {
6054
+ const paragraph = paragraphs[paragraphIndex];
6055
+ const numberingId = paragraph?.paragraphStyle.numberingId;
6056
+ if (!numberingId) {
6057
+ return new NumberingDataModel({ numberingId: null });
6058
+ }
6059
+ const level = paragraph.paragraphStyle.numberingLevel;
6060
+ const numberingLevelModel = this.findNumberingLevels(numberings, numberingId);
6061
+ const marker = this.getMarker(numberingLevelModel, level, numberingId, numberingInfo);
6062
+ return new NumberingDataModel({ numberingId, level, marker });
6063
+ }
6064
+ static updateMarkerData(numberings, paragraph, paragraphTextStyle, paragraphStyle) {
6065
+ const numberingLevel = NumberingHelper.findNumberingLevel(numberings, paragraph.numberingData.numberingId, paragraph.numberingData.level);
6066
+ const markerTextStyle = ContentStyleHelper.combineTextStyles(numberingLevel.markerStyle, paragraphTextStyle);
6067
+ const markerSizes = NumberingHelper.getMarkerSizes(paragraph.numberingData.marker, markerTextStyle);
6068
+ paragraph.numberingData.markerTextStyle = markerTextStyle;
6069
+ paragraph.numberingData.width = markerSizes.width;
6070
+ paragraph.numberingData.height = markerSizes.height;
6071
+ const indentLeft = paragraphStyle.indentLeft !== null ? paragraphStyle.indentLeft : numberingLevel.indentLeft;
6072
+ let indent = 0;
6073
+ if (paragraphStyle.indentHanging === null && paragraphStyle.indentFirstLine === null) {
6074
+ indent = -numberingLevel.indentHanging;
6075
+ }
6076
+ else {
6077
+ indent = paragraphStyle.indentHanging !== null ? -paragraphStyle.indentHanging : paragraphStyle.indentFirstLine;
6078
+ }
6079
+ paragraph.numberingData.paddingLeft = indentLeft + indent;
6080
+ }
6081
+ static getMarkerSizes(marker, markerStyle) {
6082
+ let width = 0;
6083
+ let height = 0;
6084
+ const markerStylesString = ContentStyleHelper.getFontStylesString(markerStyle);
6085
+ for (let char of marker) {
6086
+ const markerCharSizes = FontMetrics.measureCharSize(char, markerStylesString);
6087
+ width += markerCharSizes.width;
6088
+ if (height < markerCharSizes.height) {
6089
+ height = markerCharSizes.height;
6090
+ }
6091
+ }
6092
+ return { height, width };
6093
+ }
6094
+ static updateNumberingInfo(numberingInfo, marker, numberingId, level) {
6095
+ const markerLevels = this.getLevelInfo(marker);
6096
+ const lastMarkerLevel = markerLevels.length - 1;
6097
+ numberingInfo[numberingId][level].markerIndex = markerLevels[lastMarkerLevel];
6098
+ numberingInfo[numberingId][level].needToRecalculate = true;
6099
+ }
6100
+ static getLevelInfo(input) {
6101
+ return input
6102
+ .split('.')
6103
+ .filter(x => !!x)
6104
+ .map(x => parseInt(x));
6105
+ }
6106
+ static createMarkerString(numberingInfo, numberingId, splittedMarker) {
6107
+ const markers = splittedMarker.map(x => {
6108
+ if (x === '') {
6109
+ return '';
6110
+ }
6111
+ if (x.indexOf('%') === -1) {
6112
+ return x;
6113
+ }
6114
+ const markerLevel = parseInt(x.slice(1));
6115
+ const markerIndex = numberingInfo[numberingId][markerLevel - 1]?.markerIndex;
6116
+ return `${markerIndex}`;
6117
+ });
6118
+ return markers.join('.');
6119
+ }
6120
+ static getMarkerOffset(paragraphSettings) {
6121
+ const numberingData = paragraphSettings.numberingData;
6122
+ const info = paragraphSettings.textLinesInfo[0];
6123
+ if (numberingData.numberingId === null) {
6124
+ return { offset: 0, markerWidth: 0 };
6125
+ }
6126
+ const offset = numberingData.width + numberingData.paddingLeft;
6127
+ let markerWidth = info.indentFirstLine !== null || (offset - info.indentLeft > 0 && offset - info.indentLeft < info.indent.markerWidth)
6128
+ ? info.indent.markerWidth
6129
+ : 0;
6130
+ return { offset, markerWidth };
6131
+ }
6132
+ static getOffsetCausedByMarker(numberingData, info) {
6133
+ if (!info.isNumbering) {
6134
+ return 0;
6135
+ }
6136
+ const offset = numberingData.width + numberingData.paddingLeft - info.indentLeft;
6137
+ return info.indentFirstLine !== null || (offset > 0 && offset <= info.indent.markerWidth) ? info.indent.markerWidth : 0;
5936
6138
  }
5937
6139
  }
5938
6140
 
@@ -5960,8 +6162,8 @@ class PositionHelper {
5960
6162
  paragraphIndex,
5961
6163
  lineIndex,
5962
6164
  lineTopOffset,
5963
- indentBefore: paragraphLineInfo.offsetBefore,
5964
- lineHeight: paragraphLineInfo.height
6165
+ lineHeight: paragraphLineInfo.height,
6166
+ lineAscent: paragraphLineInfo.ascent
5965
6167
  };
5966
6168
  }
5967
6169
  static documentToScreen(session, paragraph, indexInParagraph) {
@@ -5999,34 +6201,14 @@ class PositionHelper {
5999
6201
  static screenToPixel(session, row, column) {
6000
6202
  const paragraphs = session.displayData.paragraphs;
6001
6203
  const paragraphInfo = this.getParagraphInfoByRow(paragraphs, row);
6002
- const tokens = LineWidthHelper.getParagraphLineDisplayTokens(session, paragraphInfo.paragraphIndex, paragraphInfo.lineIndex);
6003
- let size = {
6004
- width: 8,
6005
- height: paragraphInfo.lineHeight,
6006
- baseline: paragraphInfo.lineHeight,
6007
- content: paragraphInfo.lineHeight,
6008
- font: paragraphInfo.lineHeight,
6009
- line: paragraphInfo.lineHeight,
6010
- multiplier: paragraphInfo.lineHeight,
6011
- ascent: 0,
6012
- descent: 0
6013
- };
6204
+ const tokens = session.displayData.getParagraphLineTokens(paragraphInfo.paragraphIndex, paragraphInfo.lineIndex);
6014
6205
  let tokenIndex = column > 0 ? column - 1 : column;
6015
- if (tokens.length > 0) {
6016
- size = tokens[tokenIndex];
6017
- }
6018
- const sizeNext = tokens[tokenIndex + 1];
6019
- let sizeMax = { ...size };
6206
+ let sizeMax = { ...tokens[tokenIndex] };
6020
6207
  let lineWidthToPosition = session.displayData.pagesFormat[0].pageFormatModel.marginLeft; // this value is the same for all page formats.
6021
- const { paragraphIndex, lineIndex } = this.findLineInParagraphs(paragraphs, row);
6022
- const lineInfo = paragraphs[paragraphIndex].paragraphSettings.textLinesInfo[lineIndex];
6023
6208
  for (let currentColumn = 0; currentColumn < tokens.length; currentColumn++) {
6024
6209
  const currentToken = tokens[currentColumn];
6025
6210
  if (currentColumn < column) {
6026
6211
  lineWidthToPosition += currentToken.width;
6027
- if (currentToken.displayValue === DisplayValue.space && lineInfo.wordSpacing) {
6028
- lineWidthToPosition += lineInfo.wordSpacing;
6029
- }
6030
6212
  }
6031
6213
  if (sizeMax.ascent < currentToken.ascent) {
6032
6214
  sizeMax = currentToken;
@@ -6037,18 +6219,14 @@ class PositionHelper {
6037
6219
  }
6038
6220
  const paragraph = paragraphs[paragraphInfo.paragraphIndex];
6039
6221
  const paragraphTop = paragraph.paragraphSettings.distanceFromTop || 0;
6040
- const linePaddingLeft = paragraph.paragraphSettings.textLinesInfo[paragraphInfo.lineIndex].paddingLeft;
6041
- const offsetMargin = paragraph.paragraphSettings.textLinesInfo[paragraphInfo.lineIndex].offsetMargin;
6042
- const markerWidth = this.getMarkerWidth(paragraph.paragraphSettings, paragraph.paragraphSettings.textLinesInfo[0], paragraphInfo.lineIndex);
6222
+ const info = paragraph.paragraphSettings.textLinesInfo[paragraphInfo.lineIndex];
6223
+ const markerOffset = NumberingHelper.getOffsetCausedByMarker(paragraph.paragraphSettings.numberingData, info); // todo: verify (case - 1) numbering paragraph with multi-lines; 2) marker is moved far left so it not affect line offset)
6043
6224
  return {
6044
- pageX: lineWidthToPosition + linePaddingLeft + offsetMargin + markerWidth,
6225
+ pageX: lineWidthToPosition + info.paddingLeft + info.offsetMargin + markerOffset,
6045
6226
  pageY: paragraphTop + paragraphInfo.lineTopOffset - session.scrollTop,
6046
- lineHeight: paragraphInfo.lineHeight,
6047
- sizeCurrent: size,
6048
- sizeMax,
6049
- sizeNext,
6050
- firstChar: column === 0,
6051
- lastChar: column === tokens.length - 1
6227
+ width: tokens[tokenIndex].width,
6228
+ height: paragraphInfo.lineHeight,
6229
+ ascent: paragraphInfo.lineAscent
6052
6230
  };
6053
6231
  }
6054
6232
  /**
@@ -6084,24 +6262,17 @@ class PositionHelper {
6084
6262
  static mapPixelToClosestTokenMidpoint(session, xPixel, paragraphIndex, lineIndex, leftOffset) {
6085
6263
  const paragraphSettings = session.displayData.paragraphs[paragraphIndex].paragraphSettings;
6086
6264
  const marginLeft = session.displayData.pagesFormat[0].pageFormatModel.marginLeft; // this value is the same for all page formats.
6087
- const tokens = LineWidthHelper.getParagraphLineDisplayTokens(session, paragraphIndex, lineIndex);
6265
+ const tokens = session.displayData.getParagraphLineTokens(paragraphIndex, lineIndex);
6088
6266
  const lineInfo = paragraphSettings.textLinesInfo[lineIndex];
6089
6267
  const line = lineInfo.screenLine;
6090
- if (tokens[0].displayValue === DisplayValue.emptyLine) {
6268
+ if (tokens[0].isParagraph) {
6091
6269
  return { line, indexInLine: 0 };
6092
6270
  }
6093
6271
  let indexInLine = 0;
6094
- const markerWidth = this.getMarkerWidth(paragraphSettings, lineInfo, lineIndex);
6095
- let relativeX = xPixel - leftOffset - marginLeft - lineInfo.paddingLeft - lineInfo.offsetMargin - markerWidth;
6096
- const wordSpacing = lineInfo.wordSpacing ?? 0;
6097
- while (indexInLine < tokens.length) {
6098
- const token = tokens[indexInLine];
6099
- const isSpace = token.displayValue === DisplayValue.space;
6100
- const width = token.width + (isSpace ? wordSpacing : 0);
6101
- if (relativeX < width / 2) {
6102
- break;
6103
- }
6104
- relativeX -= width;
6272
+ const markerOffset = NumberingHelper.getOffsetCausedByMarker(paragraphSettings.numberingData, lineInfo);
6273
+ let relativeX = xPixel - leftOffset - marginLeft - lineInfo.paddingLeft - lineInfo.offsetMargin - markerOffset;
6274
+ while (indexInLine < tokens.length && relativeX >= tokens[indexInLine].width / 2) {
6275
+ relativeX -= tokens[indexInLine].width;
6105
6276
  indexInLine++;
6106
6277
  }
6107
6278
  return { line, indexInLine };
@@ -6112,24 +6283,17 @@ class PositionHelper {
6112
6283
  static mapPixelToNextTokenBoundary(session, xPixel, paragraphIndex, lineIndex, leftOffset) {
6113
6284
  const paragraphSettings = session.displayData.paragraphs[paragraphIndex].paragraphSettings;
6114
6285
  const marginLeft = session.displayData.pagesFormat[0].pageFormatModel.marginLeft; // this value is the same for all page formats.
6115
- const tokens = LineWidthHelper.getParagraphLineDisplayTokens(session, paragraphIndex, lineIndex);
6286
+ const tokens = session.displayData.getParagraphLineTokens(paragraphIndex, lineIndex);
6116
6287
  const lineInfo = paragraphSettings.textLinesInfo[lineIndex];
6117
6288
  const line = lineInfo.screenLine;
6118
- if (tokens[0].displayValue === DisplayValue.emptyLine) {
6289
+ if (tokens[0].isParagraph) {
6119
6290
  return { line, indexInLine: 0 };
6120
6291
  }
6121
6292
  let indexInLine = 0;
6122
- const markerWidth = this.getMarkerWidth(paragraphSettings, lineInfo, lineIndex);
6123
- let relativeX = xPixel - leftOffset - marginLeft - lineInfo.paddingLeft - lineInfo.offsetMargin - markerWidth;
6124
- const wordSpacing = lineInfo.wordSpacing ?? 0;
6125
- while (indexInLine < tokens.length) {
6126
- const token = tokens[indexInLine];
6127
- const isSpace = token.displayValue === DisplayValue.space;
6128
- const width = token.width + (isSpace ? wordSpacing : 0);
6129
- if (relativeX < width) {
6130
- break;
6131
- }
6132
- relativeX -= width;
6293
+ const markerOffset = NumberingHelper.getOffsetCausedByMarker(paragraphSettings.numberingData, lineInfo);
6294
+ let relativeX = xPixel - leftOffset - marginLeft - lineInfo.paddingLeft - lineInfo.offsetMargin - markerOffset;
6295
+ while (indexInLine < tokens.length && relativeX >= tokens[indexInLine].width) {
6296
+ relativeX -= tokens[indexInLine].width;
6133
6297
  indexInLine++;
6134
6298
  }
6135
6299
  return { line, indexInLine };
@@ -6151,38 +6315,19 @@ class PositionHelper {
6151
6315
  const paragraphs = session.displayData.paragraphs;
6152
6316
  const marginLeft = session.displayData.pagesFormat[0].pageFormatModel.marginLeft; // this value is the same for all page formats.
6153
6317
  const { paragraphIndex, lineIndex } = PositionHelper.findLineInParagraphs(paragraphs, documentLine);
6154
- let column = 0;
6155
- const tokens = LineWidthHelper.getParagraphLineDisplayTokens(session, paragraphIndex, lineIndex);
6156
- if (tokens.length === 1 && tokens[0].displayValue === DisplayValue.emptyLine) {
6157
- return column;
6158
- }
6159
- const textLineInfo = paragraphs[paragraphIndex].paragraphSettings.textLinesInfo[lineIndex];
6160
- const wordSpacing = textLineInfo.wordSpacing ?? 0;
6161
- const markerWidth = this.getMarkerWidth(paragraphs[paragraphIndex].paragraphSettings, textLineInfo, lineIndex);
6162
- let width = positionWidth - textLineInfo.paddingLeft - marginLeft - textLineInfo.offsetMargin - markerWidth;
6163
- while (column < tokens.length) {
6164
- const token = tokens[column];
6165
- if (width < token.width) {
6166
- break;
6167
- }
6168
- const isSpace = token.displayValue === DisplayValue.space;
6169
- width -= token.width + (isSpace ? wordSpacing : 0);
6170
- column++;
6318
+ const tokens = session.displayData.getParagraphLineTokens(paragraphIndex, lineIndex);
6319
+ if (tokens[0].isParagraph) {
6320
+ return 0;
6171
6321
  }
6172
- return column;
6173
- }
6174
- static getMarkerWidth(paragraphSettings, textLineInfo, lineIndex) {
6175
- const numberingOffsetLeft = paragraphSettings.numberingData.numberingId === null
6176
- ? 0
6177
- : paragraphSettings.numberingData.width + paragraphSettings.numberingData.paddingLeft;
6178
- if (textLineInfo.isNumbering &&
6179
- lineIndex === 0 &&
6180
- (textLineInfo.indentFirstLine !== null ||
6181
- (numberingOffsetLeft - textLineInfo.indentLeft > 0 &&
6182
- numberingOffsetLeft - textLineInfo.indentLeft <= textLineInfo.markerWidth))) {
6183
- return textLineInfo.markerWidth;
6322
+ let index = 0;
6323
+ const lineInfo = paragraphs[paragraphIndex].paragraphSettings.textLinesInfo[lineIndex];
6324
+ const markerOffset = NumberingHelper.getOffsetCausedByMarker(paragraphs[paragraphIndex].paragraphSettings.numberingData, lineInfo);
6325
+ let width = positionWidth - lineInfo.paddingLeft - marginLeft - lineInfo.offsetMargin - markerOffset;
6326
+ while (index < tokens.length && width >= tokens[index].width) {
6327
+ width -= tokens[index].width;
6328
+ index++;
6184
6329
  }
6185
- return 0;
6330
+ return index;
6186
6331
  }
6187
6332
  }
6188
6333
 
@@ -6233,15 +6378,6 @@ class EdgeElementModel {
6233
6378
  }
6234
6379
  }
6235
6380
 
6236
- class FormatExtModel extends FormatModel {
6237
- constructor(fields) {
6238
- super(fields);
6239
- if (fields) {
6240
- Object.assign(this, fields);
6241
- }
6242
- }
6243
- }
6244
-
6245
6381
  class ScalingHelper {
6246
6382
  static getRatio(current, original) {
6247
6383
  return parseFloat((current / original).toFixed(1));
@@ -6255,100 +6391,55 @@ class RenderingHelper {
6255
6391
  static createLineElement(lineInfo, numberingOffsetLeft, scalingRatio) {
6256
6392
  let lineEl = document.createElement('div');
6257
6393
  lineEl.className = 'noder-line';
6258
- if (lineInfo) {
6259
- const paddingLeft = ScalingHelper.scale(lineInfo.paddingLeft, scalingRatio);
6260
- const marginLeft = numberingOffsetLeft !== null ? -numberingOffsetLeft : 0;
6261
- // eslint-disable-next-line prettier/prettier
6262
- let styleString = `padding-left:${paddingLeft}px;height:${lineInfo.height + lineInfo.offsetAfter}px;margin-top:${lineInfo.offsetBefore}px;margin-bottom:${lineInfo.endPageOffset}px;margin-left:${marginLeft}px;background-color:${lineInfo.backgroundColor};`;
6263
- if (lineInfo.wordSpacing) {
6264
- styleString += `word-spacing:${lineInfo.wordSpacing}px;`;
6265
- }
6266
- lineEl.setAttribute('style', styleString);
6267
- lineEl.setAttribute('screen-index', `${lineInfo.screenLine}`);
6268
- }
6394
+ const paddingLeft = ScalingHelper.scale(lineInfo.paddingLeft, scalingRatio);
6395
+ const marginLeft = numberingOffsetLeft !== null ? -numberingOffsetLeft : 0;
6396
+ let styleString = `padding-left:${paddingLeft}px;height:${lineInfo.height + lineInfo.offsetAfter}px;margin-top:${lineInfo.offsetBefore}px;margin-bottom:${lineInfo.endPageOffset}px;margin-left:${marginLeft}px;background-color:${lineInfo.backgroundColor};`;
6397
+ lineEl.setAttribute('style', styleString);
6398
+ lineEl.setAttribute('screen-index', `${lineInfo.screenLine}`);
6269
6399
  return lineEl;
6270
6400
  }
6271
- static renderContentSimpleLine(domContent, formatsExt, rowDistance, customContentService, customComponents, lineInfo, breaks = []) {
6272
- const valueFragment = DomHelper.createFragment(domContent.currentElement);
6273
- for (const formatExt of formatsExt) {
6274
- const fragmentDocumentStartIndex = rowDistance.start > formatExt.startIndex ? rowDistance.start : formatExt.startIndex;
6275
- const fragmentDocumentEndIndex = formatExt.endIndex > rowDistance.end ? rowDistance.end : formatExt.endIndex;
6276
- const fragmentDocumentDistance = new DistanceModel({ start: fragmentDocumentStartIndex, end: fragmentDocumentEndIndex });
6277
- const fragmentStartIndex = rowDistance.start > formatExt.startIndex ? rowDistance.start - formatExt.startIndex : 0;
6278
- const fragmentEndIndex = formatExt.endIndex > rowDistance.end ? rowDistance.end - formatExt.startIndex : formatExt.endIndex - formatExt.startIndex;
6279
- const fragmentDistance = new DistanceModel({ start: fragmentStartIndex, end: fragmentEndIndex });
6280
- this.renderFormatContent(valueFragment, formatExt, fragmentDocumentDistance, fragmentDistance, customContentService, customComponents, breaks, lineInfo, true);
6281
- }
6282
- domContent.parentNode.appendChild(valueFragment);
6283
- }
6284
- static renderContentWrappedLine(domContent, splits, currentParagraph, formatsExt, distance, customContentService, customComponents, scalingRatio, breaks = []) {
6285
- let splitIndex = 0;
6286
- const numberingOffsetLeft = currentParagraph.numberingData.numberingId === null
6287
- ? 0
6288
- : currentParagraph.numberingData.width + currentParagraph.numberingData.paddingLeft;
6289
- let markerWidth = 0;
6290
- if (currentParagraph.textLinesInfo[0].isNumbering &&
6291
- (currentParagraph.textLinesInfo[0].indentFirstLine !== null ||
6292
- (numberingOffsetLeft - currentParagraph.textLinesInfo[0].indentLeft > 0 &&
6293
- numberingOffsetLeft - currentParagraph.textLinesInfo[0].indentLeft < currentParagraph.textLinesInfo[0].markerWidth))) {
6294
- markerWidth = currentParagraph.textLinesInfo[0].markerWidth;
6295
- }
6296
- let lineEl = RenderingHelper.createLineElement(currentParagraph.textLinesInfo[splitIndex], numberingOffsetLeft - markerWidth, scalingRatio);
6297
- domContent.parentNode.appendChild(lineEl);
6298
- const valueFragment = DomHelper.createFragment(domContent.currentElement);
6299
- let isLastLineFragment = false;
6300
- let paragraphChars = 0;
6301
- let split = splits[splitIndex];
6302
- let lineInfo = currentParagraph.textLinesInfo[splitIndex];
6303
- for (const formatExt of formatsExt) {
6304
- const beforeSplitIndex = split ? split - 1 : distance.end - distance.start;
6305
- const beforeSplitDocumentIndex = distance.start + beforeSplitIndex;
6306
- const fragmentDocumentStartIndex = distance.start + paragraphChars;
6307
- const fragmentDocumentEndIndex = formatExt.endIndex < beforeSplitDocumentIndex ? formatExt.endIndex : beforeSplitDocumentIndex;
6308
- const fragmentDocumentDistance = new DistanceModel({ start: fragmentDocumentStartIndex, end: fragmentDocumentEndIndex });
6309
- const fragmentStartIndex = distance.start > formatExt.startIndex ? distance.start - formatExt.startIndex : 0;
6310
- const fragmentEndIndex = formatExt.endIndex < beforeSplitDocumentIndex
6311
- ? fragmentStartIndex + formatExt.endIndex - formatExt.startIndex
6312
- : distance.start + beforeSplitIndex - formatExt.startIndex;
6313
- const fragmentDistance = new DistanceModel({ start: fragmentStartIndex, end: fragmentEndIndex });
6314
- isLastLineFragment = split === fragmentDocumentDistance.end + 1;
6315
- paragraphChars += this.renderFormatContent(valueFragment, formatExt, fragmentDocumentDistance, fragmentDistance, customContentService, customComponents, breaks, lineInfo, isLastLineFragment);
6316
- lineEl.appendChild(valueFragment);
6317
- let nextFragmentStartIndex = fragmentEndIndex + 1;
6318
- while (paragraphChars === split && nextFragmentStartIndex !== distance.end) {
6319
- split = splits[++splitIndex];
6320
- lineInfo = currentParagraph.textLinesInfo[splitIndex];
6321
- const nextFragmentDocumentStartIndex = fragmentDocumentStartIndex + nextFragmentStartIndex - fragmentStartIndex;
6322
- lineEl = RenderingHelper.createLineElement(lineInfo, numberingOffsetLeft, scalingRatio);
6323
- if (split > formatExt.endIndex) {
6324
- const nextFragmentEndIndex = formatExt.content.length - 1;
6325
- const nextFragmentDistance = new DistanceModel({ start: nextFragmentStartIndex, end: nextFragmentEndIndex });
6326
- const nextFragmentDocumentEndIndex = nextFragmentDocumentStartIndex + nextFragmentEndIndex - nextFragmentStartIndex;
6327
- const nextFragmentDocumentDistance = new DistanceModel({
6328
- start: nextFragmentDocumentStartIndex,
6329
- end: nextFragmentDocumentEndIndex
6330
- });
6331
- isLastLineFragment = split === nextFragmentDocumentDistance.end + 1;
6332
- paragraphChars += this.renderFormatContent(valueFragment, formatExt, nextFragmentDocumentDistance, nextFragmentDistance, customContentService, customComponents, breaks, lineInfo, isLastLineFragment);
6333
- lineEl.appendChild(valueFragment);
6401
+ static renderParagraph(domContent, paragraph, formats, customContentService, customComponents, scalingRatio, breaks = []) {
6402
+ const { offset, markerWidth } = NumberingHelper.getMarkerOffset(paragraph.paragraphSettings);
6403
+ const lineInfos = paragraph.paragraphSettings.textLinesInfo;
6404
+ const start = paragraph.startIndex;
6405
+ const end = paragraph.startIndex + paragraph.content.length;
6406
+ const fragment = DomHelper.createFragment(domContent.currentElement);
6407
+ let lineIndex = 0;
6408
+ let renderedCount = 0;
6409
+ let lineEl = RenderingHelper.createLineElement(paragraph.paragraphSettings.textLinesInfo[0], offset - markerWidth, scalingRatio);
6410
+ for (const format of formats) {
6411
+ do {
6412
+ const lineEnd = paragraph.nextLineIndexes[lineIndex]
6413
+ ? paragraph.startIndex + paragraph.nextLineIndexes[lineIndex] - 1
6414
+ : end;
6415
+ let fragmentEnd = format.endIndex < lineEnd ? format.endIndex : lineEnd;
6416
+ let wordSpacing = lineInfos[lineIndex].wordSpacing;
6417
+ if (wordSpacing) {
6418
+ const lineStart = lineIndex > 0 ? paragraph.nextLineIndexes[lineIndex - 1] : 0;
6419
+ const lineStartIndex = start + lineStart;
6420
+ const wordSpacingStart = lineInfos[lineIndex].wordSpacingStart;
6421
+ const wordSpacingEnd = lineInfos[lineIndex].wordSpacingEnd;
6422
+ if (renderedCount - lineStart < wordSpacingStart && lineStartIndex + wordSpacingStart < fragmentEnd) {
6423
+ fragmentEnd = lineStartIndex + wordSpacingStart;
6424
+ }
6425
+ else if (renderedCount - lineStart < wordSpacingEnd && lineStartIndex + wordSpacingEnd < fragmentEnd) {
6426
+ fragmentEnd = lineStartIndex + wordSpacingEnd;
6427
+ }
6428
+ if (renderedCount - lineStart < wordSpacingStart || renderedCount - lineStart > wordSpacingEnd) {
6429
+ wordSpacing = null;
6430
+ }
6431
+ }
6432
+ const fragmentLength = fragmentEnd - start - renderedCount + 1;
6433
+ this.renderFormatContent(fragment, format.textStyle, start + renderedCount, fragmentEnd, paragraph.content.substring(renderedCount, renderedCount + fragmentLength), customContentService, customComponents, breaks, wordSpacing);
6434
+ lineEl.appendChild(fragment);
6435
+ renderedCount += fragmentLength;
6436
+ if (paragraph.nextLineIndexes.length > lineIndex && start + renderedCount > lineEnd) {
6437
+ lineIndex++;
6334
6438
  domContent.parentNode.appendChild(lineEl);
6335
- break;
6439
+ lineEl = RenderingHelper.createLineElement(lineInfos[lineIndex], offset, scalingRatio);
6336
6440
  }
6337
- const textIndexLength = RenderingHelper.getTextIndexLengthForInsert(formatExt, nextFragmentDocumentStartIndex, distance, split, paragraphChars);
6338
- const nextFragmentDocumentEndIndex = nextFragmentDocumentStartIndex + textIndexLength;
6339
- const nextFragmentEndIndex = nextFragmentStartIndex + textIndexLength;
6340
- const nextFragmentDistance = new DistanceModel({ start: nextFragmentStartIndex, end: nextFragmentEndIndex });
6341
- const nextFragmentDocumentDistance = new DistanceModel({
6342
- start: nextFragmentDocumentStartIndex,
6343
- end: nextFragmentDocumentEndIndex
6344
- });
6345
- isLastLineFragment = split === nextFragmentDocumentDistance.end + 1;
6346
- const renderedChars = this.renderFormatContent(valueFragment, formatExt, nextFragmentDocumentDistance, nextFragmentDistance, customContentService, customComponents, breaks, lineInfo, isLastLineFragment);
6347
- lineEl.appendChild(valueFragment);
6348
- domContent.parentNode.appendChild(lineEl);
6349
- nextFragmentStartIndex += renderedChars;
6350
- paragraphChars += renderedChars;
6351
- }
6441
+ } while (renderedCount < paragraph.content.length && format.endIndex > start + renderedCount);
6442
+ domContent.parentNode.appendChild(lineEl);
6352
6443
  }
6353
6444
  }
6354
6445
  static renderNumberingMarker(paragraph, layerElement, scalingRatio) {
@@ -6365,11 +6456,7 @@ class RenderingHelper {
6365
6456
  const numberingLineEl = this.createLineElement(markerLineInfo, 0, scalingRatio);
6366
6457
  const markerFragment = DomHelper.createFragment(layerElement);
6367
6458
  const marker = paragraph.numberingData.marker;
6368
- const markerExtModel = new FormatExtModel({
6369
- textStyle: paragraph.numberingData.markerTextStyle,
6370
- content: marker
6371
- });
6372
- this.renderText(markerFragment, markerExtModel, marker);
6459
+ this.renderText(markerFragment, paragraph.numberingData.markerTextStyle, marker, null);
6373
6460
  numberingLineEl.appendChild(markerFragment);
6374
6461
  return numberingLineEl;
6375
6462
  }
@@ -6378,60 +6465,35 @@ class RenderingHelper {
6378
6465
  containerElement.className = className;
6379
6466
  return containerElement;
6380
6467
  }
6381
- static renderFormatContent(fragment, formatExt, fragmentDocumentDistance, fragmentDistance, customContentService, customComponents, breaks, lineInfo, isLastLineFragment) {
6382
- let textFragment = formatExt.content.substring(fragmentDistance.start, fragmentDistance.end + 1);
6468
+ static renderFormatContent(fragment, textStyle, start, end, textFragment, customContentService, customComponents, breaks, wordSpacing) {
6383
6469
  if (!textFragment) {
6384
- return 0;
6385
- }
6386
- const textFragmentWithoutBreaks = BreakHelper.removeBreakMarker(breaks, textFragment, fragmentDocumentDistance.start);
6387
- if (customContentService.isFragmentContainComponent(customComponents, textFragment, fragmentDocumentDistance)) {
6388
- this.renderTextWithCustomContent(fragment, formatExt, fragmentDocumentDistance, textFragmentWithoutBreaks, customContentService, customComponents, lineInfo);
6389
- }
6390
- else if (isLastLineFragment) {
6391
- this.renderTextWithSpacingHandling(fragment, formatExt, textFragmentWithoutBreaks, lineInfo);
6392
- }
6393
- else {
6394
- const paddingLeft = textFragment.startsWith(' ') && lineInfo.wordSpacing ? lineInfo.wordSpacing : null;
6395
- this.renderText(fragment, formatExt, textFragmentWithoutBreaks, paddingLeft);
6396
- }
6397
- return textFragment.length;
6398
- }
6399
- static renderTextWithCustomContent(fragment, formatExt, fragmentDocumentDistance, textFragment, customContentService, customComponents, lineInfo) {
6400
- const components = customContentService.getComponents(customComponents, fragmentDocumentDistance);
6401
- if (!components.length) {
6402
- this.renderTextWithSpacingHandling(fragment, formatExt, textFragment, lineInfo);
6403
6470
  return;
6404
6471
  }
6405
- let newTextFragmentStartIndex = fragmentDocumentDistance.start;
6406
- let nextTextFragment = textFragment;
6407
- for (const component of components) {
6408
- const textBeforeElement = nextTextFragment.substring(0, component.instance.insertIndex - newTextFragmentStartIndex);
6409
- nextTextFragment = nextTextFragment.substring(textBeforeElement.length + 1, nextTextFragment.length);
6410
- newTextFragmentStartIndex = newTextFragmentStartIndex + (textBeforeElement.length ? textBeforeElement.length + 1 : 1);
6411
- if (textBeforeElement.length) {
6412
- const paddingLeft = textBeforeElement.startsWith(' ') && lineInfo.wordSpacing ? lineInfo.wordSpacing : null;
6413
- this.renderText(fragment, formatExt, textBeforeElement, paddingLeft);
6472
+ const textFragmentWithoutBreaks = BreakHelper.removeBreakMarker(breaks, textFragment, start);
6473
+ const components = customContentService.getComponents(customComponents, start, end);
6474
+ if (components.length) {
6475
+ let newTextFragmentStartIndex = start;
6476
+ let nextTextFragment = textFragmentWithoutBreaks;
6477
+ for (const component of components) {
6478
+ const textBeforeElement = nextTextFragment.substring(0, component.instance.insertIndex - newTextFragmentStartIndex);
6479
+ nextTextFragment = nextTextFragment.substring(textBeforeElement.length + 1, nextTextFragment.length);
6480
+ newTextFragmentStartIndex = newTextFragmentStartIndex + (textBeforeElement.length ? textBeforeElement.length + 1 : 1);
6481
+ if (textBeforeElement.length) {
6482
+ this.renderText(fragment, textStyle, textBeforeElement, wordSpacing);
6483
+ }
6484
+ customContentService.componentService.attachComponent(fragment, component);
6485
+ }
6486
+ if (nextTextFragment.length) {
6487
+ this.renderText(fragment, textStyle, nextTextFragment, wordSpacing);
6414
6488
  }
6415
- this.attachComponent(fragment, component, customContentService);
6416
- }
6417
- if (nextTextFragment.length) {
6418
- this.renderTextWithSpacingHandling(fragment, formatExt, nextTextFragment, lineInfo);
6419
- }
6420
- }
6421
- static renderTextWithSpacingHandling(fragment, formatExt, textFragment, lineInfo) {
6422
- const paddingLeft = textFragment.startsWith(' ') && lineInfo.wordSpacing ? lineInfo.wordSpacing : null;
6423
- if (lineInfo.wordSpacing && textFragment.endsWith(' ')) {
6424
- this.renderText(fragment, formatExt, textFragment.slice(0, -1), paddingLeft);
6425
- this.renderText(fragment, formatExt, ' ');
6426
6489
  }
6427
6490
  else {
6428
- this.renderText(fragment, formatExt, textFragment, paddingLeft);
6491
+ this.renderText(fragment, textStyle, textFragmentWithoutBreaks, wordSpacing);
6429
6492
  }
6430
6493
  }
6431
- static renderText(fragment, formatExt, textFragment, paddingLeft = null) {
6494
+ static renderText(fragment, textStyle, content, wordSpacing) {
6432
6495
  const span = document.createElement('span');
6433
- const textStyle = new TextStyleModel({ ...formatExt.textStyle });
6434
- if (textFragment === NEW_LINE_MARKUP) {
6496
+ if (content === NEW_LINE_MARKUP) {
6435
6497
  span.className = 'paragraph-symbol';
6436
6498
  }
6437
6499
  if (textStyle.headingStyleId === HYPERLINK_HEADING_STYLE_ID) {
@@ -6446,21 +6508,14 @@ class RenderingHelper {
6446
6508
  };
6447
6509
  span.onmouseleave = () => span.classList.remove('hyperlink-hover');
6448
6510
  }
6449
- span.textContent = textFragment;
6511
+ span.textContent = content;
6450
6512
  let styleString = ContentStyleHelper.getTextStylesString(textStyle);
6451
- if (paddingLeft) {
6452
- styleString += `padding-left:${paddingLeft}px;`;
6513
+ if (wordSpacing) {
6514
+ styleString += `word-spacing:${wordSpacing}px;`;
6453
6515
  }
6454
6516
  span.setAttribute('style', styleString);
6455
6517
  fragment.appendChild(span);
6456
6518
  }
6457
- static getTextIndexLengthForInsert(formatExt, fragmentDocumentStartIndex, paragraphDistance, split, paragraphChars) {
6458
- const maxLength = Math.max(paragraphDistance.end - paragraphChars - paragraphDistance.start, 0);
6459
- return (Math.min(split - paragraphChars || Number.MAX_VALUE, maxLength, formatExt.endIndex - fragmentDocumentStartIndex + 1, formatExt.content.length) - 1);
6460
- }
6461
- static attachComponent(fragment, component, customContentService) {
6462
- customContentService.componentService.attachComponent(fragment, component);
6463
- }
6464
6519
  }
6465
6520
 
6466
6521
  class EdgesLayer {
@@ -6775,12 +6830,6 @@ class PrintPagesLayer extends PagesLayer {
6775
6830
  }
6776
6831
  }
6777
6832
 
6778
- class PrintRenderingHelper extends RenderingHelper {
6779
- static attachComponent(fragment, component, customContentService) {
6780
- customContentService.componentService.cloneAndAttachComponent(fragment, component);
6781
- }
6782
- }
6783
-
6784
6833
  class Lines {
6785
6834
  get length() {
6786
6835
  return this.cells.length;
@@ -7056,10 +7105,9 @@ class ParagraphHelper {
7056
7105
  }
7057
7106
 
7058
7107
  class TextLayer {
7059
- constructor(parentElement, session, renderingHelper = RenderingHelper) {
7108
+ constructor(parentElement, session) {
7060
7109
  this.parentElement = parentElement;
7061
7110
  this.session = session;
7062
- this.renderingHelper = renderingHelper;
7063
7111
  this.pagesCountChangedHandler = (event) => {
7064
7112
  this.lines.setSizes(event.pagesCount, event.pageHeight);
7065
7113
  };
@@ -7134,46 +7182,22 @@ class TextLayer {
7134
7182
  DomHelper.setStyle(paragraphCell.element.style, 'margin-right', `${offsetForLittlePages}px`);
7135
7183
  const paragraphSettings = this.session.displayData.getParagraphSettings(row);
7136
7184
  if (paragraphSettings.numberingData.numberingId !== null) {
7137
- const numberingElement = this.renderingHelper.renderNumberingMarker(paragraphSettings, this.element, this.session.generalProperties.scalingRatio);
7185
+ const numberingElement = RenderingHelper.renderNumberingMarker(paragraphSettings, this.element, this.session.generalProperties.scalingRatio);
7138
7186
  numberingElement.className = 'numberingMarker';
7139
7187
  paragraphCell.element.appendChild(numberingElement);
7140
7188
  }
7141
- this.renderTextLines(paragraphCell.element, row);
7189
+ this.renderParagraph(paragraphCell.element, this.session.displayData.paragraphs[row]);
7142
7190
  fragment.push(paragraphCell);
7143
7191
  }
7144
7192
  return fragment;
7145
7193
  }
7146
- renderTextLines(parent, row) {
7147
- const linesContainerElement = this.renderingHelper.createDivContainer('lines-container');
7148
- const paragraphSettings = this.session.displayData.getParagraphSettings(row);
7149
- const paragraphHeight = ParagraphHelper.getParagraphHeight(paragraphSettings.textLinesInfo);
7194
+ renderParagraph(parent, paragraph) {
7195
+ const linesContainerElement = RenderingHelper.createDivContainer('lines-container');
7196
+ const paragraphHeight = ParagraphHelper.getParagraphHeight(paragraph.paragraphSettings.textLinesInfo);
7150
7197
  DomHelper.setStyle(linesContainerElement.style, 'height', `${paragraphHeight}px`);
7151
7198
  parent.appendChild(linesContainerElement);
7152
- const startIndex = this.session.displayData.positionToIndex({ row, column: 0 });
7153
- const endIndex = this.session.displayData.positionToIndex({ row: row + 1, column: 0 }) - 1;
7154
- const combinedFormats = FormatStyleHelper.combineSection(this.session.model.formats, this.session.model.links, startIndex, endIndex).map(x => new FormatExtModel({ ...x, content: this.session.model.content.substring(x.startIndex, x.endIndex + 1) }));
7155
- const splits = this.session.displayData.paragraphs[row].nextLineIndexes;
7156
- if (splits?.length) {
7157
- const distance = new DistanceModel({ start: startIndex, end: endIndex });
7158
- this.renderingHelper.renderContentWrappedLine({ currentElement: this.element, parentNode: linesContainerElement }, splits, paragraphSettings, combinedFormats, distance, this.session.customContentService, this.session.customComponents, this.session.generalProperties.scalingRatio, this.session.model.breaks);
7159
- }
7160
- else {
7161
- const markerWidth = paragraphSettings.textLinesInfo[0].indentFirstLine ? paragraphSettings.textLinesInfo[0].markerWidth : 0;
7162
- const numberingOffsetLeft = paragraphSettings.numberingData.numberingId === null
7163
- ? 0
7164
- : paragraphSettings.numberingData.width + paragraphSettings.numberingData.paddingLeft - markerWidth;
7165
- let offset = 0;
7166
- if (paragraphSettings.textLinesInfo[0].isNumbering &&
7167
- numberingOffsetLeft - paragraphSettings.textLinesInfo[0].indentLeft > 0 &&
7168
- numberingOffsetLeft - paragraphSettings.textLinesInfo[0].indentLeft < paragraphSettings.textLinesInfo[0].markerWidth) {
7169
- offset = paragraphSettings.textLinesInfo[0].markerWidth;
7170
- }
7171
- const lineInfo = paragraphSettings.textLinesInfo[0];
7172
- const lastLineEl = this.renderingHelper.createLineElement(lineInfo, numberingOffsetLeft - offset, this.session.generalProperties.scalingRatio);
7173
- linesContainerElement.appendChild(lastLineEl);
7174
- const rowDistance = new DistanceModel({ start: startIndex, end: endIndex });
7175
- this.renderingHelper.renderContentSimpleLine({ currentElement: this.element, parentNode: lastLineEl }, combinedFormats, rowDistance, this.session.customContentService, this.session.customComponents, lineInfo, this.session.model.breaks);
7176
- }
7199
+ const combinedFormats = FormatStyleHelper.combineSection(this.session.model.formats, this.session.model.links, paragraph.startIndex, paragraph.startIndex + paragraph.content.length);
7200
+ RenderingHelper.renderParagraph({ currentElement: this.element, parentNode: linesContainerElement }, paragraph, combinedFormats, this.session.customContentService, this.session.customComponents, this.session.generalProperties.scalingRatio, this.session.model.breaks);
7177
7201
  }
7178
7202
  }
7179
7203
 
@@ -7219,7 +7243,7 @@ class PrintRenderer {
7219
7243
  this.content.className = 'noder-content print';
7220
7244
  }
7221
7245
  createLayers() {
7222
- this.textLayer = new PrintTextLayer(this.content, this.mainSession, PrintRenderingHelper);
7246
+ this.textLayer = new PrintTextLayer(this.content, this.mainSession);
7223
7247
  this.pagesLayer = new PrintPagesLayer(this.content, this.mainSession);
7224
7248
  this.edgesLayer = new EdgesLayer(this.content, this.mainSession);
7225
7249
  }
@@ -8621,7 +8645,7 @@ class Editor {
8621
8645
  const cursor = PositionHelper.documentToPixel(this.session, this.session.selection.cursor);
8622
8646
  const rect = this.renderer.container.getBoundingClientRect();
8623
8647
  const x = rect.left + cursor.pageX;
8624
- const y = rect.top + cursor.pageY + cursor.lineHeight;
8648
+ const y = rect.top + cursor.pageY + cursor.height;
8625
8649
  this.overlayService.open(component, { textKey }, x, y);
8626
8650
  }
8627
8651
  cut() {
@@ -9271,7 +9295,7 @@ class Editor {
9271
9295
  saveInsertBreakToHistory(model) {
9272
9296
  model.isOnNewParagraph =
9273
9297
  model.breakType === BreakTypes.Page &&
9274
- BreakHelper.getBreakType(this.session.model, CUSTOM_ELEMENT_MARKER, model.insertIndex - 1) !== BreakTypes.Page;
9298
+ BreakHelper.getBreakType(this.session.model.breaks, CUSTOM_ELEMENT_MARKER, model.insertIndex - 1) !== BreakTypes.Page;
9275
9299
  const count = model.isOnNewParagraph ? NEW_LINE_MARKUP.length + 1 : 1;
9276
9300
  this.history.pushInsertBreak(model, count);
9277
9301
  this.commandsService.createCommand(SaveCommandsHelper.getInsertBreakCommand(model, this.targets));
@@ -9865,7 +9889,7 @@ class Editor {
9865
9889
  const mainRect = this.mainRenderer.container.getBoundingClientRect();
9866
9890
  const rect = this.renderer.container.getBoundingClientRect();
9867
9891
  const hintX = mainRect.right - 20;
9868
- const hintY = rect.top + cursor.pageY + cursor.lineHeight / 2 - 20;
9892
+ const hintY = rect.top + cursor.pageY + cursor.height / 2 - 20;
9869
9893
  this.overlayService.open(CommentPopupComponent, {}, hintX, hintY);
9870
9894
  }
9871
9895
  }
@@ -9915,9 +9939,7 @@ class Editor {
9915
9939
  changedTableSize(insertIndex, sessionId) {
9916
9940
  const session = this.regulatorService.getSession(sessionId);
9917
9941
  const paragraph = ContentHelper.documentIndexToParagraphIndex(session.displayData.paragraphs, insertIndex).row;
9918
- session.displayData.resetAllNumberingInfo(paragraph);
9919
9942
  session.displayData.updateNextLineIndexes(paragraph, paragraph);
9920
- session.displayData.updateNumberingsDataOnChange(paragraph + 1);
9921
9943
  this.focus();
9922
9944
  this.onContentChange();
9923
9945
  }
@@ -10377,18 +10399,12 @@ class Editor {
10377
10399
  let existed = this.mainSession.customComponents.edges.headersComponents.findIndex(x => x.instance.sessionId === sessionId);
10378
10400
  if (existed !== -1) {
10379
10401
  const headers = this.mainSession.customComponents.edges.headersComponents.slice(existed + 1);
10380
- headers.forEach(x => {
10381
- x.instance.session.displayData.resetAllNumberingInfo(0);
10382
- x.instance.session.displayData.updateNextLineIndexes(0, x.instance.session.displayData.paragraphs.length - 1);
10383
- });
10402
+ headers.forEach(x => x.instance.session.displayData.updateNextLineIndexes(0, x.instance.session.displayData.paragraphs.length - 1));
10384
10403
  }
10385
10404
  else {
10386
10405
  existed = this.mainSession.customComponents.edges.footersComponents.findIndex(x => x.instance.sessionId === sessionId);
10387
10406
  const footers = this.mainSession.customComponents.edges.footersComponents.slice(existed + 1);
10388
- footers.forEach(x => {
10389
- x.instance.session.displayData.resetAllNumberingInfo(0);
10390
- x.instance.session.displayData.updateNextLineIndexes(0, x.instance.session.displayData.paragraphs.length - 1);
10391
- });
10407
+ footers.forEach(x => x.instance.session.displayData.updateNextLineIndexes(0, x.instance.session.displayData.paragraphs.length - 1));
10392
10408
  }
10393
10409
  });
10394
10410
  }
@@ -10467,7 +10483,7 @@ class Editor {
10467
10483
  const mainRect = this.mainRenderer.container.getBoundingClientRect();
10468
10484
  const rect = this.renderer.container.getBoundingClientRect();
10469
10485
  const hintX = mainRect.right - 20;
10470
- const hintY = rect.top + cursor.pageY + cursor.lineHeight / 2 - 20;
10486
+ const hintY = rect.top + cursor.pageY + cursor.height / 2 - 20;
10471
10487
  this.overlayService.open(CommentPopupComponent, {}, hintX, hintY);
10472
10488
  event?.stopPropagation();
10473
10489
  }
@@ -10652,10 +10668,47 @@ class CellSessionSourceModel {
10652
10668
  }
10653
10669
  }
10654
10670
 
10671
+ const DisplayValue = {
10672
+ char: 1,
10673
+ customContent: 3,
10674
+ table: 4,
10675
+ pageBreak: 5,
10676
+ lineBreak: 6,
10677
+ punctuation: 9,
10678
+ space: 10,
10679
+ tab: 11,
10680
+ paragraph: 13,
10681
+ hyphen: 14
10682
+ };
10683
+
10655
10684
  class DisplayToken {
10685
+ get isSpace() {
10686
+ return this.displayValue === DisplayValue.space;
10687
+ }
10688
+ get isParagraph() {
10689
+ return this.displayValue === DisplayValue.paragraph;
10690
+ }
10691
+ get isPageBreak() {
10692
+ return this.displayValue === DisplayValue.pageBreak;
10693
+ }
10694
+ get isLineBreak() {
10695
+ return this.displayValue === DisplayValue.lineBreak;
10696
+ }
10697
+ get isTab() {
10698
+ return this.displayValue === DisplayValue.tab;
10699
+ }
10700
+ get isTable() {
10701
+ return this.displayValue === DisplayValue.table;
10702
+ }
10703
+ get isWhiteSpace() {
10704
+ return this.isSpace || this.isParagraph;
10705
+ }
10656
10706
  get breaksLine() {
10657
10707
  return this.isPageBreak || this.isLineBreak;
10658
10708
  }
10709
+ get breakable() {
10710
+ return this.displayValue !== DisplayValue.char && this.displayValue !== DisplayValue.punctuation;
10711
+ }
10659
10712
  constructor(fields) {
10660
10713
  if (!fields) {
10661
10714
  return;
@@ -10664,79 +10717,28 @@ class DisplayToken {
10664
10717
  }
10665
10718
  }
10666
10719
 
10667
- class IndentModel {
10668
- constructor(firstLine, hanging, left, right) {
10669
- this.firstLine = firstLine;
10670
- this.hanging = hanging;
10671
- this.left = left;
10672
- this.right = right;
10720
+ class NoderTabComponent extends BaseNoderComponent {
10721
+ get tab() {
10722
+ return this.content;
10673
10723
  }
10674
- }
10675
-
10676
- class LineInfoModel {
10677
- constructor(fields) {
10678
- if (!fields) {
10679
- return;
10680
- }
10681
- Object.assign(this, fields);
10724
+ set tab(val) {
10725
+ this.content = val;
10682
10726
  }
10683
- }
10684
-
10685
- class DisplayTokenHelper {
10686
- static getDisplayValue(charCode) {
10687
- if (charCode === 32) {
10688
- return DisplayValue.space;
10689
- }
10690
- if ((charCode > 39 && charCode < 48) || (charCode > 57 && charCode < 64)) {
10691
- return DisplayValue.punctuation;
10692
- }
10693
- return DisplayValue.char;
10727
+ initialize() {
10728
+ this.applySize(this.tab.width);
10694
10729
  }
10695
- static getLineInfoFromToken(prevToken, firstWrapToken, wrapTokens, isAfterPageBreak) {
10696
- const info = new LineInfoModel({
10697
- width: 0,
10698
- height: 0,
10699
- align: prevToken.align,
10700
- indent: new IndentModel(prevToken.indentFirstLine, prevToken.indentHanging, prevToken.indentLeft, prevToken.indentRight),
10701
- offsetBefore: prevToken.indentBefore,
10702
- offsetAfter: prevToken.indentAfter,
10703
- lineSpacing: prevToken.lineSpacing,
10704
- markerWidth: prevToken.markerWidth,
10705
- isAfterPageBreak,
10706
- isEndedByPageBreak: prevToken.isPageBreak,
10707
- isNumbering: prevToken.isNumbering
10708
- });
10709
- if (firstWrapToken) {
10710
- info.align = firstWrapToken.align;
10711
- info.indent.firstLine = firstWrapToken.indentFirstLine;
10712
- info.indent.hanging = firstWrapToken.indentHanging;
10713
- info.indent.left = firstWrapToken.indentLeft;
10714
- info.indent.right = firstWrapToken.indentRight;
10715
- info.offsetBefore = firstWrapToken.indentBefore;
10716
- info.offsetAfter = firstWrapToken.indentAfter;
10717
- info.lineSpacing = firstWrapToken.lineSpacing;
10718
- info.hasTable = firstWrapToken.isTable;
10719
- info.isNumbering = firstWrapToken.isNumbering;
10720
- info.markerWidth = firstWrapToken.markerWidth;
10721
- }
10722
- let maxAscent = 0;
10723
- let maxDescent = 0;
10724
- const tokens = isAfterPageBreak && !wrapTokens.length ? [prevToken] : wrapTokens;
10725
- for (const wrapToken of tokens) {
10726
- if (maxAscent < wrapToken.ascent) {
10727
- maxAscent = wrapToken.ascent;
10728
- }
10729
- if (maxDescent < wrapToken.descent) {
10730
- maxDescent = wrapToken.descent;
10731
- }
10732
- info.width += wrapToken.width;
10733
- }
10734
- info.maxAscent = maxAscent;
10735
- info.height = maxAscent + maxDescent;
10736
- info.offsetAfter = info.height * (info.lineSpacing - 1);
10737
- return info;
10730
+ applySize(width) {
10731
+ this.width.set(ScalingHelper.scale(width, this.generalProperties.scalingRatio));
10738
10732
  }
10733
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: NoderTabComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
10734
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.5", type: NoderTabComponent, isStandalone: false, selector: "app-nod-tab", host: { properties: { "style.min-width.px": "width()" } }, usesInheritance: true, ngImport: i0, template: "&emsp;\n", styles: [":host{position:relative;outline:none}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
10739
10735
  }
10736
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: NoderTabComponent, decorators: [{
10737
+ type: Component,
10738
+ args: [{ selector: 'app-nod-tab', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, host: {
10739
+ '[style.min-width.px]': 'width()'
10740
+ }, template: "&emsp;\n", styles: [":host{position:relative;outline:none}\n"] }]
10741
+ }] });
10740
10742
 
10741
10743
  class CellDataModel {
10742
10744
  constructor(cell, cellContentHeight, componentRef) {
@@ -10888,21 +10890,6 @@ class CellResizerParametersModel {
10888
10890
  }
10889
10891
  }
10890
10892
 
10891
- class MarginModel {
10892
- constructor(fields) {
10893
- this.left = DocumentInfo.paddingLeft;
10894
- this.right = DocumentInfo.paddingRight;
10895
- this.top = DocumentInfo.paddingTop;
10896
- this.bottom = DocumentInfo.paddingBottom;
10897
- this.header = DocumentInfo.paddingHeader;
10898
- this.footer = DocumentInfo.paddingFooter;
10899
- if (!fields) {
10900
- return;
10901
- }
10902
- Object.assign(this, fields);
10903
- }
10904
- }
10905
-
10906
10893
  class NoderTableCellComponent {
10907
10894
  get session() {
10908
10895
  return this.cellSession.session;
@@ -10935,10 +10922,10 @@ class NoderTableCellComponent {
10935
10922
  }
10936
10923
  initialize() {
10937
10924
  const marginModel = new MarginModel({
10938
- left: 7,
10939
- right: 7,
10940
- top: 0,
10941
- bottom: 0,
10925
+ left: this.cell.margins?.left ?? this.table.margins?.left ?? 0,
10926
+ right: this.cell.margins?.right ?? this.table.margins?.right ?? 0,
10927
+ top: this.cell.margins?.top ?? this.table.margins?.top ?? 0,
10928
+ bottom: this.cell.margins?.bottom ?? this.table.margins?.bottom ?? 0,
10942
10929
  header: 0,
10943
10930
  footer: 0
10944
10931
  });
@@ -11988,195 +11975,156 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImpor
11988
11975
  args: [{ selector: 'app-nod-table', template: '', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, styles: [":host{position:relative}:host::ng-deep table{position:relative;border-collapse:collapse;background:transparent;empty-cells:show;border-spacing:0;overflow:visible;table-layout:fixed}:host::ng-deep td{position:relative;vertical-align:top;border:1px solid #000;margin:0;padding:0;height:inherit}:host::ng-deep .hidden-cell{display:none;cursor:not-allowed}:host::ng-deep .resizer-border{position:absolute;border:solid .5px blue;z-index:1}\n"] }]
11989
11976
  }], ctorParameters: () => [{ type: ComponentService }, { type: i0.ElementRef }, { type: OverlayService }, { type: RegulatorService }] });
11990
11977
 
11991
- class NumberingDataModel {
11992
- constructor(fields) {
11993
- if (!fields) {
11994
- return;
11995
- }
11996
- Object.assign(this, fields);
11997
- }
11998
- }
11999
-
12000
- class NumberingParagraphStyleModel extends ParagraphStyleModel {
12001
- constructor(fields) {
12002
- super();
12003
- this.numberingType = null;
12004
- this.numberingLevelsStyles = null;
12005
- if (!fields) {
12006
- return;
12007
- }
12008
- Object.assign(this, fields);
12009
- }
12010
- }
12011
-
12012
- class NumberingHelper {
12013
- static getStyles(paragraphStyle, numberings) {
12014
- const numberingLevels = numberings.find(x => x.numberingId === paragraphStyle.numberingId).levels;
12015
- const numberingLevelsStyles = numberingLevels.reduce((prev, next) => `${prev}${next.marker}${next.markerType}`, '');
12016
- const level = numberingLevels.find(x => x.level === paragraphStyle.numberingLevel);
12017
- return new NumberingParagraphStyleModel({ ...paragraphStyle, numberingType: level.markerType, numberingLevelsStyles });
12018
- }
12019
- static find(numberings, id, level) {
12020
- const numbering = numberings.find(x => x.numberingId === id);
12021
- return numbering?.levels.find(x => x.level === level);
12022
- }
12023
- static calculateNumberingInfo(numberingId, level, marker, numberingInfo, numberings) {
12024
- const numberingModel = this.find(numberings, numberingId, level);
12025
- if (numberingModel?.markerType === NumberingMarkerType.Bullet) {
12026
- return;
11978
+ class DisplayTokenHelper {
11979
+ static getDisplayValue(charCode, breakType) {
11980
+ if (breakType === BreakTypes.Page) {
11981
+ return DisplayValue.pageBreak;
12027
11982
  }
12028
- this.calculateMarkerIndexes(numberingId, level, marker, numberingInfo);
12029
- }
12030
- static calculateMarkerIndexes(numberingId, level, marker, numberingInfo) {
12031
- if (!numberingId) {
12032
- return;
11983
+ if (breakType === BreakTypes.TextWrapping) {
11984
+ return DisplayValue.lineBreak;
12033
11985
  }
12034
- if (!numberingInfo[numberingId]?.length || !numberingInfo[numberingId][level]) {
12035
- numberingInfo[numberingId] ??= [];
12036
- return;
11986
+ if (charCode === 32) {
11987
+ return DisplayValue.space;
12037
11988
  }
12038
- if (!numberingInfo[numberingId][level]?.visited) {
12039
- if (!marker) {
12040
- numberingInfo[numberingId][level].markerIndex++;
12041
- return;
12042
- }
12043
- this.updateNumberingInfo(numberingInfo, marker, numberingId, level);
11989
+ if (charCode === 45) {
11990
+ return DisplayValue.hyphen;
12044
11991
  }
12045
- else {
12046
- numberingInfo[numberingId][level].markerIndex++;
12047
- for (let i = 0; i < numberingInfo[numberingId].length; i++) {
12048
- if (i >= level + 1) {
12049
- numberingInfo[numberingId][i].markerIndex = 0;
12050
- }
12051
- else {
12052
- if (numberingInfo[numberingId][i].markerIndex === 0) {
12053
- numberingInfo[numberingId][i].markerIndex++;
12054
- }
12055
- }
12056
- }
11992
+ if ((charCode > 39 && charCode < 48) || (charCode > 57 && charCode < 64)) {
11993
+ return DisplayValue.punctuation;
12057
11994
  }
11995
+ return DisplayValue.char;
12058
11996
  }
12059
- static getMarker(levelModel, numberingId, paragraphs, paragraphIndex, numberingInfo) {
12060
- let resultMarker = levelModel.marker;
12061
- let index = resultMarker.indexOf('%');
12062
- if (index === -1) {
12063
- return resultMarker;
12064
- }
12065
- if (numberingInfo[numberingId]?.length && numberingInfo[numberingId][levelModel.level]) {
12066
- return this.createMarkerString(numberingInfo, numberingId, levelModel.level);
12067
- }
12068
- while (index !== -1) {
12069
- const symbolLevelNumber = Number(resultMarker[index + 1]) - 1;
12070
- const levelIndex = this.getLevelIndex(paragraphs, paragraphIndex, numberingId, symbolLevelNumber);
12071
- const count = levelModel.startValue + levelIndex;
12072
- resultMarker = resultMarker.slice(0, index) + count.toString() + resultMarker.slice(index + 2);
12073
- index = resultMarker.indexOf('%');
12074
- }
12075
- numberingInfo[numberingId] ??= [];
12076
- this.updateNumberingInfo(numberingInfo, resultMarker, numberingId, levelModel.level);
12077
- const markerLevels = resultMarker.split('.');
12078
- if (levelModel.level !== 0 && markerLevels[markerLevels.length - 1] === '') {
12079
- return resultMarker.slice(0, -1);
12080
- }
12081
- return resultMarker;
11997
+ static getParagraphToken(paragraphSymbolStyle) {
11998
+ const size = FontMetrics.measureCharSize('0', ContentStyleHelper.getFontStylesString(paragraphSymbolStyle));
11999
+ return new DisplayToken({ ...size, displayValue: DisplayValue.paragraph });
12082
12000
  }
12083
- static createDataModel(numberings, paragraphs, paragraphIndex, numberingInfo) {
12084
- const paragraph = paragraphs[paragraphIndex];
12085
- const numberingId = paragraph?.paragraphStyle.numberingId;
12086
- if (!numberingId) {
12087
- return new NumberingDataModel({ numberingId: null });
12001
+ static getSymbolToken(code, size, breakType) {
12002
+ const result = new DisplayToken({ ...size, displayValue: DisplayTokenHelper.getDisplayValue(code, breakType) });
12003
+ if (result.isSpace) {
12004
+ result.ascent = 0;
12005
+ result.descent = 0;
12006
+ result.height = 0;
12088
12007
  }
12089
- const level = paragraph.paragraphStyle.numberingLevel;
12090
- const numberingLevelModel = this.find(numberings, numberingId, level);
12091
- for (let i = 0; i < level; i++) {
12092
- if (!numberingInfo[numberingId] || !numberingInfo[numberingId][i]) {
12093
- const numberingLevel = this.find(numberings, numberingId, i);
12094
- this.getMarker(numberingLevel, numberingId, paragraphs, paragraphIndex, numberingInfo);
12095
- }
12096
- }
12097
- const marker = this.getMarker(numberingLevelModel, numberingId, paragraphs, paragraphIndex, numberingInfo);
12098
- return new NumberingDataModel({ numberingId, level, marker });
12008
+ return result;
12099
12009
  }
12100
- static updateMarkerData(properties, paragraph, paragraphTextStyle, paragraphStyle) {
12101
- const numberingLevel = NumberingHelper.find(properties.numberings, paragraph.numberingData.numberingId, paragraph.numberingData.level);
12102
- const markerTextStyle = ContentStyleHelper.combineTextStyles(numberingLevel.markerStyle, paragraphTextStyle);
12103
- const markerSizes = NumberingHelper.getMarkerSizes(paragraph.numberingData.marker, markerTextStyle);
12104
- paragraph.numberingData.markerTextStyle = markerTextStyle;
12105
- paragraph.numberingData.width = markerSizes.width;
12106
- paragraph.numberingData.height = markerSizes.height;
12107
- const indentLeft = paragraphStyle.indentLeft !== null ? paragraphStyle.indentLeft : numberingLevel.indentLeft;
12108
- let indent = 0;
12109
- if (paragraphStyle.indentHanging === null && paragraphStyle.indentFirstLine === null) {
12110
- indent = -numberingLevel.indentHanging;
12111
- }
12112
- else {
12113
- indent = paragraphStyle.indentHanging !== null ? -paragraphStyle.indentHanging : paragraphStyle.indentFirstLine;
12114
- }
12115
- paragraph.numberingData.paddingLeft = indentLeft + indent;
12010
+ static getComponentToken(component, size) {
12011
+ const ascent = component.instance.ascent() ?? 0;
12012
+ const descent = component.instance.descent() ?? 0;
12013
+ let displayValue = component.instance instanceof NoderTabComponent ? DisplayValue.tab : DisplayValue.customContent;
12014
+ displayValue = component.instance instanceof NoderTableComponent ? DisplayValue.table : displayValue;
12015
+ return new DisplayToken({
12016
+ width: component.instance.width(),
12017
+ height: ascent + descent,
12018
+ font: size.font,
12019
+ ascent,
12020
+ descent,
12021
+ displayValue
12022
+ });
12116
12023
  }
12117
- static getMarkerSizes(marker, markerStyle) {
12118
- let width = 0;
12119
- let height = 0;
12120
- const markerStylesString = ContentStyleHelper.getFontStylesString(markerStyle);
12121
- for (let char of marker) {
12122
- const markerCharSizes = FontMetrics.measureCharSize(char, markerStylesString);
12123
- width += markerCharSizes.width;
12124
- if (height < markerCharSizes.height) {
12125
- height = markerCharSizes.height;
12126
- }
12127
- }
12128
- return { height, width };
12024
+ }
12025
+
12026
+ class IndentModel {
12027
+ constructor(firstLine, hanging, left, right, markerWidth) {
12028
+ this.firstLine = firstLine;
12029
+ this.hanging = hanging;
12030
+ this.left = left;
12031
+ this.right = right;
12032
+ this.markerWidth = markerWidth;
12129
12033
  }
12130
- static updateNumberingInfo(numberingInfo, marker, numberingId, level) {
12131
- if (!numberingInfo[numberingId]) {
12034
+ }
12035
+
12036
+ class LineInfoModel {
12037
+ constructor(fields) {
12038
+ if (!fields) {
12132
12039
  return;
12133
12040
  }
12134
- const markerLevels = this.getLevelInfo(marker);
12135
- const lastMarkerLevel = markerLevels.length - 1;
12136
- numberingInfo[numberingId][level] = {
12137
- markerIndex: markerLevels[lastMarkerLevel],
12138
- markerLevel: Math.min(lastMarkerLevel, level),
12139
- visited: true
12140
- };
12041
+ Object.assign(this, fields);
12141
12042
  }
12142
- static getLevelIndex(paragraphs, paragraphIndex, numberingId, numberingLevel) {
12143
- let index = 0;
12144
- let isOnlySubLevelsBefore = false;
12145
- for (let i = paragraphIndex; i >= 0; i--) {
12146
- if (paragraphs[i].paragraphStyle.numberingId !== numberingId) {
12147
- continue;
12148
- }
12149
- if (paragraphs[i].paragraphStyle.numberingLevel < numberingLevel) {
12150
- break;
12151
- }
12152
- if (paragraphs[i].paragraphStyle.numberingLevel > numberingLevel) {
12153
- isOnlySubLevelsBefore = true;
12043
+ }
12044
+
12045
+ class LineInfoHelper {
12046
+ static get(tokens, isAfterPageBreak, isLastLine, style, indent, isNumbering, width, defaultHeight, defaultAscent) {
12047
+ const result = new LineInfoModel({
12048
+ isAfterPageBreak,
12049
+ isEndedByPageBreak: tokens[tokens.length - 1].isPageBreak,
12050
+ backgroundColor: style.backgroundColor,
12051
+ align: style.alignment ?? DEFAULT_PARAGRAPH_STYLE.alignment,
12052
+ indent,
12053
+ offsetBefore: DEFAULT_PARAGRAPH_STYLE.spaceBefore,
12054
+ lineSpacing: style.lineSpacing ?? DEFAULT_PARAGRAPH_STYLE.lineSpacing,
12055
+ isNumbering,
12056
+ hasTable: false,
12057
+ width: 0
12058
+ });
12059
+ let maxAscent = 0;
12060
+ let maxDescent = 0;
12061
+ for (const token of tokens) {
12062
+ if (maxAscent < token.ascent) {
12063
+ maxAscent = token.ascent;
12064
+ }
12065
+ if (maxDescent < token.descent) {
12066
+ maxDescent = token.descent;
12067
+ }
12068
+ result.width += token.width;
12069
+ }
12070
+ result.height = maxAscent + maxDescent;
12071
+ result.ascent = maxAscent;
12072
+ if (result.height === 0) {
12073
+ result.height = defaultHeight;
12074
+ result.ascent = defaultAscent;
12075
+ }
12076
+ result.offsetAfter = result.height * (result.lineSpacing - 1);
12077
+ if (style.alignment === Alignment$1.justify && !isLastLine) {
12078
+ let right = tokens.length - 1;
12079
+ let adjustableWidth = result.width;
12080
+ while (right > 0 && tokens[right].isSpace) {
12081
+ adjustableWidth -= tokens[right].width;
12082
+ right--;
12083
+ }
12084
+ let left = 0;
12085
+ while (left < tokens.length - 1 && tokens[left].isSpace) {
12086
+ left++;
12087
+ }
12088
+ let spaces = 0;
12089
+ for (let i = right; i > left; i--) {
12090
+ if (tokens[i].isTab) {
12091
+ left = i;
12092
+ }
12093
+ if (tokens[i].isSpace) {
12094
+ spaces++;
12095
+ }
12154
12096
  }
12155
- else {
12156
- index++;
12157
- isOnlySubLevelsBefore = false;
12097
+ const indentWidth = (indent.left ?? 0) + (indent.right ?? 0) + (indent.firstLine ?? 0) - (indent.hanging ?? 0);
12098
+ const availableWidth = width - indentWidth - indent.markerWidth; // todo: use NumberingHelper.getOffsetCausedByMarker
12099
+ const whitespaceDeficit = availableWidth - adjustableWidth;
12100
+ if (spaces > 0 && whitespaceDeficit > 0) {
12101
+ result.wordSpacing = whitespaceDeficit / spaces;
12102
+ result.width = availableWidth;
12103
+ result.wordSpacingStart = left;
12104
+ result.wordSpacingEnd = right;
12105
+ for (let i = right; i > left; i--) {
12106
+ if (tokens[i].isSpace) {
12107
+ tokens[i].width += result.wordSpacing;
12108
+ }
12109
+ }
12158
12110
  }
12159
12111
  }
12160
- index = isOnlySubLevelsBefore ? index + 1 : index;
12161
- return index <= 0 ? 0 : index - 1;
12162
- }
12163
- static getLevelInfo(input) {
12164
- return input
12165
- .split('.')
12166
- .filter(x => !!x)
12167
- .map(x => parseInt(x));
12112
+ return result;
12168
12113
  }
12169
- static createMarkerString(numberingInfo, numberingId, level) {
12170
- if (level === 0) {
12171
- return numberingInfo[numberingId][level].markerIndex + '.';
12172
- }
12173
- let marker = [];
12174
- let { markerLevel, markerIndex } = numberingInfo[numberingId][level];
12175
- for (let i = 0; i < markerLevel; i++) {
12176
- marker.push(numberingInfo[numberingId][i].markerIndex);
12114
+ static getFirstLineIndent(model, paragraphIndex, generalProperties) {
12115
+ const paragraph = model.paragraphs[paragraphIndex];
12116
+ const paragraphStyle = paragraph.paragraphStyle;
12117
+ if (paragraphStyle.numberingId === null) {
12118
+ return new IndentModel(paragraph.paragraphStyle.indentFirstLine ?? DEFAULT_PARAGRAPH_STYLE.indentFirstLine, paragraph.paragraphStyle.indentHanging ?? DEFAULT_PARAGRAPH_STYLE.indentHanging, paragraph.paragraphStyle.indentLeft ?? DEFAULT_PARAGRAPH_STYLE.indentLeft, paragraph.paragraphStyle.indentRight ?? DEFAULT_PARAGRAPH_STYLE.indentRight, 0);
12177
12119
  }
12178
- marker.push(markerIndex);
12179
- return marker.join('.');
12120
+ const levelsModel = NumberingHelper.findNumberingLevels(generalProperties.numberings, paragraphStyle.numberingId);
12121
+ const paragraphFormat = FormatStyleHelper.getFormatAtIndex(model.formats, paragraph.insertIndex);
12122
+ const markerTextStyle = ContentStyleHelper.combineTextStyles(levelsModel[paragraphStyle.numberingLevel].markerStyle, paragraphFormat.textStyle);
12123
+ const marker = NumberingHelper.getMarker(levelsModel, paragraphStyle.numberingLevel, paragraphStyle.numberingId, generalProperties.numberingInfo);
12124
+ const markerWidth = NumberingHelper.getMarkerSizes(marker, markerTextStyle).width;
12125
+ return new IndentModel(paragraph.paragraphStyle.indentFirstLine ?? DEFAULT_PARAGRAPH_STYLE.indentFirstLine, DEFAULT_PARAGRAPH_STYLE.indentHanging, paragraph.paragraphStyle.indentLeft !== null
12126
+ ? paragraph.paragraphStyle.indentLeft
12127
+ : levelsModel[paragraphStyle.numberingLevel].indentLeft, paragraph.paragraphStyle.indentRight ?? DEFAULT_PARAGRAPH_STYLE.indentRight, markerWidth + markerWidth / marker.length);
12180
12128
  }
12181
12129
  }
12182
12130
 
@@ -12259,20 +12207,14 @@ class PageFormat {
12259
12207
  }
12260
12208
  }
12261
12209
 
12262
- class TextLineInfo {
12210
+ class TextLineInfo extends LineInfoModel {
12263
12211
  constructor(offsetMargin, contentWidth, align, indent, fields) {
12212
+ super(fields);
12264
12213
  this.paddingLeft = 0;
12265
12214
  this.offsetMargin = 0;
12266
- this.offsetBefore = 0;
12267
- this.offsetAfter = 0;
12268
12215
  this.firstLinePageOffset = 0; // for selection
12269
12216
  this.endPageOffset = 0; // for selection
12270
12217
  this.screenLine = 0;
12271
- this.isAfterPageBreak = false;
12272
- this.isEndedByPageBreak = false;
12273
- if (fields) {
12274
- Object.assign(this, fields);
12275
- }
12276
12218
  this.indentFirstLine = indent.firstLine;
12277
12219
  this.offsetMargin = offsetMargin;
12278
12220
  this.indentLeft = indent.left;
@@ -12394,47 +12336,6 @@ class ParagraphInfosRemoved {
12394
12336
  }
12395
12337
  }
12396
12338
 
12397
- class ParagraphStyleHelper {
12398
- static getParagraphsAtRange(paragraphs, startIndex, endIndex) {
12399
- if (!paragraphs?.length) {
12400
- return [];
12401
- }
12402
- let firstModifierIndexInRange = paragraphs.findIndex(paragraph => paragraph.insertIndex >= startIndex);
12403
- firstModifierIndexInRange = firstModifierIndexInRange === -1 ? paragraphs.length : firstModifierIndexInRange;
12404
- let lastModifierIndexInRange = paragraphs.findIndex(x => x.insertIndex >= endIndex);
12405
- lastModifierIndexInRange =
12406
- startIndex === endIndex || lastModifierIndexInRange === -1 ? firstModifierIndexInRange : lastModifierIndexInRange;
12407
- return paragraphs.slice(firstModifierIndexInRange, lastModifierIndexInRange + 1);
12408
- }
12409
- static getParagraphAtIndex(paragraphs, insertIndex) {
12410
- if (!paragraphs?.length) {
12411
- return null;
12412
- }
12413
- let startIndex = 0;
12414
- let endIndex = paragraphs.length - 1;
12415
- while (startIndex <= endIndex) {
12416
- const middleIndex = Math.round((startIndex + endIndex) / 2);
12417
- const paragraph = paragraphs[middleIndex];
12418
- if (paragraph.insertIndex < insertIndex) {
12419
- startIndex = middleIndex + 1;
12420
- }
12421
- else {
12422
- endIndex = middleIndex - 1;
12423
- }
12424
- }
12425
- return paragraphs[startIndex];
12426
- }
12427
- static isEndOfParagraph(paragraphs, endIndex) {
12428
- const paragraph = this.getParagraphAtIndex(paragraphs, endIndex);
12429
- let paragraphIndex = paragraphs.findIndex(x => x === paragraph);
12430
- const endOfParagraphIsParagraph = paragraph && endIndex === paragraph.insertIndex && paragraphs.length - 1 > paragraphIndex;
12431
- if (endOfParagraphIsParagraph) {
12432
- paragraphIndex += 1;
12433
- }
12434
- return paragraphs[paragraphIndex].insertIndex === endIndex + 1;
12435
- }
12436
- }
12437
-
12438
12339
  var TabAlignment;
12439
12340
  (function (TabAlignment) {
12440
12341
  TabAlignment[TabAlignment["Left"] = 0] = "Left";
@@ -12444,14 +12345,6 @@ var TabAlignment;
12444
12345
  TabAlignment[TabAlignment["Bar"] = 4] = "Bar";
12445
12346
  })(TabAlignment || (TabAlignment = {}));
12446
12347
 
12447
- class TabHelper {
12448
- static calculateTabWidth(rowWidth, defaultTabWidth, tabSettings) {
12449
- const tabs = tabSettings ?? [];
12450
- const nextSetting = tabs.find(x => x.position > rowWidth);
12451
- return nextSetting ? nextSetting.position - rowWidth : defaultTabWidth - (rowWidth % defaultTabWidth);
12452
- }
12453
- }
12454
-
12455
12348
  class DisplayData extends EventEmitting {
12456
12349
  get maxPageWidth() {
12457
12350
  let max = 0;
@@ -12478,7 +12371,6 @@ class DisplayData extends EventEmitting {
12478
12371
  this.paragraphs = [];
12479
12372
  this.pagesFormat = [];
12480
12373
  this.allPagesHeight = 0;
12481
- this.tabTokens = [];
12482
12374
  this.ParagraphInfoChanges = new Subject();
12483
12375
  this.lastParagraphId = 0;
12484
12376
  this.updateDataForModel();
@@ -12745,26 +12637,36 @@ class DisplayData extends EventEmitting {
12745
12637
  }
12746
12638
  if (paragraphSettings.numberingData.numberingId !== null) {
12747
12639
  const paragraphFormat = FormatStyleHelper.getFormatAtIndex(this.model.formats, this.model.paragraphs[index].insertIndex);
12748
- NumberingHelper.updateMarkerData(this.generalProperties, paragraphSettings, paragraphFormat.textStyle, this.model.paragraphs[index].paragraphStyle);
12640
+ NumberingHelper.updateMarkerData(this.generalProperties.numberings, paragraphSettings, paragraphFormat.textStyle, this.model.paragraphs[index].paragraphStyle);
12749
12641
  }
12750
12642
  }
12751
12643
  updateNextLineIndexes(firstParagraph, lastParagraph) {
12752
12644
  this.updateParagraphStartIndex(firstParagraph);
12753
12645
  let indexOfParagraphAfterPageBreak = this.getParagraphSettings(firstParagraph - 1)?.isEndedByPageBreak ? firstParagraph : -1;
12754
- let firstUsedTabIndex = this.model.tabs.findIndex(x => x.insertIndex >= this.paragraphs[firstParagraph].startIndex);
12646
+ let updateNumberingFromIndex = null;
12755
12647
  for (let i = firstParagraph; i <= lastParagraph; i++) {
12756
12648
  if (!this.paragraphs[i]) {
12757
12649
  continue;
12758
12650
  }
12759
- this.tabTokens = [];
12760
- const sameNumberingIndex = this.findSameNumberingIndex(i);
12761
- let marker = this.getParagraphSettings(sameNumberingIndex)?.numberingData.marker;
12762
- if (sameNumberingIndex < 0 && this.getParagraphSettings(i)?.numberingData.numberingId) {
12763
- marker = '0.';
12651
+ const numberingId = this.model.paragraphs[i].paragraphStyle.numberingId ?? this.getParagraphSettings(i)?.numberingData.numberingId;
12652
+ if (numberingId) {
12653
+ const numberingsLevels = NumberingHelper.findNumberingLevels(this.generalProperties.numberings, numberingId);
12654
+ NumberingHelper.addValueToNumberingInfo(numberingId, this.generalProperties.numberingInfo, numberingsLevels);
12655
+ let startNumberingParagraphIndex = i;
12656
+ while (this.isSameNumberingId(startNumberingParagraphIndex, numberingId)) {
12657
+ startNumberingParagraphIndex -= 1;
12658
+ }
12659
+ if (updateNumberingFromIndex === null || updateNumberingFromIndex > startNumberingParagraphIndex) {
12660
+ updateNumberingFromIndex = startNumberingParagraphIndex;
12661
+ }
12662
+ if (this.model.paragraphs[i].paragraphStyle.numberingId !== this.getParagraphSettings(i)?.numberingData.numberingId) {
12663
+ const updatedNumberingId = this.getParagraphSettings(i)?.numberingData.numberingId ?? this.model.paragraphs[i].paragraphStyle.numberingId;
12664
+ NumberingHelper.setNumberingNeedToRecalculate(this.generalProperties.numberingInfo, updatedNumberingId);
12665
+ }
12666
+ NumberingHelper.setNumberingNeedToRecalculate(this.generalProperties.numberingInfo, numberingId);
12764
12667
  }
12765
- NumberingHelper.calculateNumberingInfo(this.model.paragraphs[i].paragraphStyle.numberingId ?? this.getParagraphSettings(i)?.numberingData.numberingId ?? null, this.model.paragraphs[i].paragraphStyle.numberingLevel ?? this.getParagraphSettings(i)?.numberingData.level ?? null, marker, this.generalProperties.numberingInfo, this.generalProperties.numberings);
12766
12668
  const numberingData = NumberingHelper.createDataModel(this.generalProperties.numberings, this.model.paragraphs, i, this.generalProperties.numberingInfo);
12767
- const { splits, rowInfos } = this.getSplits(this.model, i);
12669
+ const { splits, rowInfos } = this.splitParagraphByLines(i);
12768
12670
  this.paragraphs[i].nextLineIndexes = splits;
12769
12671
  if (indexOfParagraphAfterPageBreak === i) {
12770
12672
  rowInfos[0].isAfterPageBreak = true;
@@ -12772,235 +12674,134 @@ class DisplayData extends EventEmitting {
12772
12674
  indexOfParagraphAfterPageBreak = rowInfos[rowInfos.length - 1].isEndedByPageBreak ? i + 1 : -1;
12773
12675
  this.setParagraphSettings(i, rowInfos, numberingData);
12774
12676
  this.updateParagraphSettingsNumberingData(i);
12775
- firstUsedTabIndex = this.updateParagraphTabs(firstUsedTabIndex, i);
12776
12677
  }
12678
+ this.updateNumberingsDataOnChange(updateNumberingFromIndex);
12777
12679
  this.getParagraphSettings(lastParagraph + 1)?.setIsAfterPageBreak(indexOfParagraphAfterPageBreak > -1);
12778
12680
  this.updateParagraphLineNumber(firstParagraph);
12779
12681
  this.processParagraphsProperties(firstParagraph);
12780
12682
  }
12683
+ isSameNumberingId(paragraphIndex, numberingId) {
12684
+ if (paragraphIndex === 0) {
12685
+ return false;
12686
+ }
12687
+ const startNumberingId = this.model.paragraphs[paragraphIndex].paragraphStyle.numberingId ??
12688
+ this.getParagraphSettings(paragraphIndex)?.numberingData.numberingId;
12689
+ return numberingId === startNumberingId;
12690
+ }
12781
12691
  updateNumberingsDataOnChange(index) {
12692
+ if (index === null) {
12693
+ return;
12694
+ }
12782
12695
  for (let i = index; i < this.paragraphs.length; i++) {
12783
12696
  const paragraphStyle = this.model.paragraphs[i].paragraphStyle;
12784
12697
  const paragraphSettings = this.getParagraphSettings(i);
12785
12698
  if (this.model.paragraphs[i].paragraphStyle.numberingId !== null) {
12786
- NumberingHelper.calculateNumberingInfo(paragraphStyle.numberingId, paragraphStyle.numberingLevel, paragraphSettings.numberingData.marker, this.generalProperties.numberingInfo, this.generalProperties.numberings);
12787
- paragraphSettings.numberingData = NumberingHelper.createDataModel(this.generalProperties.numberings, this.model.paragraphs, i, this.generalProperties.numberingInfo);
12788
- const paragraphFormat = FormatStyleHelper.getFormatAtIndex(this.model.formats, this.model.paragraphs[i].insertIndex);
12789
- NumberingHelper.updateMarkerData(this.generalProperties, paragraphSettings, paragraphFormat.textStyle, paragraphStyle);
12699
+ if (this.generalProperties.numberingInfo[paragraphStyle.numberingId][paragraphStyle.numberingLevel].needToRecalculate) {
12700
+ NumberingHelper.calculateNumberingInfo(paragraphStyle.numberingId, paragraphStyle.numberingLevel, this.generalProperties.numberingInfo, this.generalProperties.numberings);
12701
+ paragraphSettings.numberingData = NumberingHelper.createDataModel(this.generalProperties.numberings, this.model.paragraphs, i, this.generalProperties.numberingInfo);
12702
+ const paragraphFormat = FormatStyleHelper.getFormatAtIndex(this.model.formats, this.model.paragraphs[i].insertIndex);
12703
+ NumberingHelper.updateMarkerData(this.generalProperties.numberings, paragraphSettings, paragraphFormat.textStyle, paragraphStyle);
12704
+ }
12790
12705
  }
12791
12706
  const table = this.customContentService.findComponent(this.customComponents.tables, paragraphSettings.startInsertIndex);
12792
12707
  if (table) {
12793
12708
  table.instance.updateCells();
12794
12709
  }
12795
12710
  }
12711
+ NumberingHelper.setAllNumberingIsCalculated(this.generalProperties.numberingInfo);
12796
12712
  if ('pageType' in this.model) {
12797
12713
  this.editorService.updateEdges(this.sessionId);
12798
12714
  }
12799
12715
  }
12800
- resetAllNumberingInfo(paragraphIndex) {
12801
- for (let i = paragraphIndex; i < this.model.paragraphs.length; i++) {
12802
- const { numberingId } = this.model.paragraphs[i].paragraphStyle;
12803
- if (numberingId !== null && this.generalProperties.numberingInfo[numberingId]) {
12804
- this.generalProperties.numberingInfo[numberingId] = [];
12805
- }
12806
- }
12807
- }
12808
- resetNumberingInfoByTableCell(table) {
12809
- for (const element of table.instance.rowMatrix) {
12810
- for (let cell of element.cells) {
12811
- const { marker, numberingId, level } = cell.componentRef.instance.session.displayData.paragraphs[0].paragraphSettings.numberingData;
12812
- if (marker && numberingId) {
12813
- NumberingHelper.updateNumberingInfo(this.generalProperties.numberingInfo, marker, numberingId, level);
12814
- this.resetAllNumberingInfo(0);
12815
- return;
12816
- }
12817
- }
12818
- }
12819
- }
12820
- updateParagraphTabs(tabIndex, paragraphIndex) {
12821
- const paragraphContentLength = this.getParagraphContent(paragraphIndex).length;
12822
- const paragraphLastIndex = this.paragraphs[paragraphIndex].startIndex + paragraphContentLength;
12823
- if (tabIndex === -1 ||
12824
- tabIndex >= this.customComponents.tabs.length ||
12825
- this.customComponents.tabs[tabIndex].instance.insertIndex > paragraphLastIndex) {
12826
- return tabIndex;
12827
- }
12828
- const startIndex = tabIndex;
12829
- while (this.customComponents.tabs[tabIndex] && this.customComponents.tabs[tabIndex].instance.insertIndex <= paragraphLastIndex) {
12830
- this.customComponents.tabs[tabIndex].instance.applySize(this.tabTokens[tabIndex - startIndex].width);
12831
- tabIndex++;
12832
- }
12833
- return tabIndex;
12834
- }
12835
- getSplits(model, paragraphIndex) {
12836
- const paragraphContent = this.getParagraphContent(paragraphIndex);
12837
- const strTokens = this.getDisplayTokens(model, paragraphContent, this.paragraphs[paragraphIndex].startIndex);
12838
- if (!strTokens.length) {
12839
- const defaultRowInfo = new LineInfoModel({
12840
- height: (DEFAULT_FONT_SIZE * 4) / 3,
12841
- width: 0,
12842
- align: DEFAULT_PARAGRAPH_STYLE.alignment,
12843
- indent: new IndentModel(DEFAULT_PARAGRAPH_STYLE.indentFirstLine, DEFAULT_PARAGRAPH_STYLE.indentHanging, DEFAULT_PARAGRAPH_STYLE.indentLeft, DEFAULT_PARAGRAPH_STYLE.indentRight),
12844
- offsetAfter: DEFAULT_PARAGRAPH_STYLE.spaceAfter,
12845
- offsetBefore: DEFAULT_PARAGRAPH_STYLE.spaceBefore,
12846
- lineSpacing: DEFAULT_PARAGRAPH_STYLE.lineSpacing,
12847
- isAfterPageBreak: false,
12848
- isEndedByPageBreak: false,
12849
- markerWidth: 0,
12850
- isNumbering: false,
12851
- backgroundColor: DEFAULT_PARAGRAPH_STYLE.backgroundColor
12852
- });
12853
- return { splits: [], rowInfos: [defaultRowInfo] };
12854
- }
12716
+ splitParagraphByLines(paragraphIndex) {
12717
+ const paragraph = this.paragraphs[paragraphIndex];
12718
+ const { paragraphTokens, paragraphToken } = this.getParagraphTokens(paragraph);
12855
12719
  const splits = [];
12856
12720
  const rowInfos = [];
12857
- let prevToken;
12858
- let index = -1;
12859
- let initial = paragraphContent;
12860
- const pageFormat = this.getPageFormatAtPosition(this.paragraphs[paragraphIndex].startIndex);
12861
- while (index) {
12862
- initial = initial.slice(index > 0 ? index : 0);
12863
- const tokens = strTokens.slice(paragraphContent.length - initial.length);
12864
- if (!tokens.length) {
12865
- tokens.push(...this.getEmptyDisplayTokens(model, this.paragraphs[paragraphIndex].startIndex + index));
12866
- }
12867
- let wrapLimit = this.computeWrapIndex(tokens, pageFormat.contentWidth, this.generalProperties.defaultTabWidth, model.paragraphs[paragraphIndex].paragraphStyle.tabSettings);
12868
- if (tokens[tokens.length - 1].isPageBreak && wrapLimit === tokens.length && this.paragraphs.length > paragraphIndex + 1) {
12869
- wrapLimit = 0;
12870
- }
12871
- const wrapSplit = tokens[wrapLimit - 1]?.breaksLine || tokens[wrapLimit - 1]?.isTable ? wrapLimit : this.computeWrapSplit(tokens, wrapLimit);
12872
- const wrapTokens = tokens.slice(0, wrapSplit || undefined);
12873
- if (wrapTokens.length) {
12874
- prevToken = wrapTokens[wrapTokens.length - 1];
12875
- }
12876
- const isAfterPageBreak = !rowInfos.length ? false : rowInfos[rowInfos.length - 1].isEndedByPageBreak;
12877
- const lineInfo = DisplayTokenHelper.getLineInfoFromToken(prevToken, wrapTokens[0], wrapTokens, isAfterPageBreak);
12878
- const paragraphStyle = model.paragraphs[paragraphIndex].paragraphStyle;
12879
- lineInfo.backgroundColor = paragraphStyle.backgroundColor;
12880
- const isLastLineOfParagraph = !wrapLimit || prevToken.isLineBreak;
12881
- if (paragraphStyle.alignment === Alignment$1.justify && !isLastLineOfParagraph && wrapTokens.length > 1) {
12882
- let currentLineWidth = 0;
12883
- let spaceCount = wrapTokens[0].markerWidth ? 1 : 0;
12884
- for (let i = 0; i < wrapTokens.length; i++) {
12885
- const token = wrapTokens[i];
12886
- currentLineWidth += token.width;
12887
- if (token.displayValue === DisplayValue.space) {
12888
- if (i === wrapTokens.length - 1) {
12889
- token.displayValue = DisplayValue.trailingSpace;
12890
- }
12891
- else {
12892
- spaceCount++;
12893
- }
12894
- }
12721
+ const style = this.model.paragraphs[paragraphIndex].paragraphStyle;
12722
+ const pageFormat = this.getPageFormatAtPosition(paragraph.startIndex);
12723
+ const defaultHeight = paragraphToken.height;
12724
+ const defaultAscent = paragraphToken.ascent;
12725
+ let index = 0;
12726
+ let indent = LineInfoHelper.getFirstLineIndent(this.model, paragraphIndex, this.generalProperties);
12727
+ do {
12728
+ let tokens = paragraphTokens.slice(index);
12729
+ const maxWidth = pageFormat.contentWidth - indent.right - indent.markerWidth;
12730
+ let startWidth = indent.left + indent.firstLine - indent.hanging || 0;
12731
+ let last = this.computeWrapIndex(tokens, startWidth, maxWidth, style.tabSettings ?? []);
12732
+ tokens = tokens.slice(0, last + 1);
12733
+ const width = pageFormat.contentWidth;
12734
+ const isNumbering = index === 0 && !!indent.markerWidth;
12735
+ const isBreak = !rowInfos.length ? false : rowInfos[rowInfos.length - 1].isEndedByPageBreak;
12736
+ const isLast = index + last + 1 === paragraphTokens.length;
12737
+ const info = LineInfoHelper.get(tokens, isBreak, isLast, style, indent, isNumbering, width, defaultHeight, defaultAscent);
12738
+ for (let i = 0; i < tokens.length; i++) {
12739
+ if (tokens[i].isTab) {
12740
+ const tab = this.customComponents.tabs.find(x => x.instance.insertIndex === paragraph.startIndex + index + i);
12741
+ tab.instance.applySize(tokens[i].width);
12895
12742
  }
12896
- const { left, right, firstLine, hanging } = lineInfo.indent;
12897
- const indent = left + right + firstLine - hanging || 0;
12898
- const availableWidth = pageFormat.contentWidth - indent - wrapTokens[0].markerWidth;
12899
- const whitespaceDeficit = availableWidth - currentLineWidth;
12900
- if (spaceCount > 0 && whitespaceDeficit > 0) {
12901
- lineInfo.wordSpacing = whitespaceDeficit / spaceCount;
12902
- lineInfo.wordSpacingWidth = whitespaceDeficit;
12743
+ else if (tokens[i].isTable) {
12744
+ info.hasTable = true;
12903
12745
  }
12904
12746
  }
12905
- rowInfos.push(lineInfo);
12906
- if (!wrapLimit) {
12907
- break;
12747
+ rowInfos.push(info);
12748
+ index += last + 1;
12749
+ if (index < paragraphTokens.length) {
12750
+ splits.push(index);
12751
+ indent = new IndentModel(null, null, indent.left, indent.right, 0);
12908
12752
  }
12909
- index = wrapSplit;
12910
- const splitsLength = splits.length;
12911
- const splitIndex = splitsLength ? index + splits[splitsLength - 1] : index;
12912
- splits.push(splitIndex);
12913
- }
12914
- this.tabTokens.push(...strTokens.filter(x => x.isTab));
12915
- ParagraphHelper.applyParagraphIndentsToLines(rowInfos, paragraphIndex, model.paragraphs);
12753
+ } while (index < paragraphTokens.length);
12754
+ ParagraphHelper.applyParagraphIndentsToLines(rowInfos, paragraphIndex, this.model.paragraphs);
12916
12755
  return { splits, rowInfos };
12917
12756
  }
12918
- /**
12919
- * Given a string, returns an array of the display characters, including tabs and spaces and custom components.
12920
- */
12921
- getDisplayTokens(model, str, startIndex) {
12922
- if (!str.length) {
12923
- return this.getEmptyDisplayTokens(model, startIndex);
12924
- }
12925
- return this.fillLineTokens(startIndex, str, model);
12757
+ getParagraphTokens(paragraphInfo) {
12758
+ const paragraphSymbolIndex = paragraphInfo.startIndex + paragraphInfo.content.length;
12759
+ const { tokens, paragraphToken } = this.getTokens(paragraphInfo.startIndex, paragraphInfo.content, paragraphSymbolIndex);
12760
+ return { paragraphTokens: tokens, paragraphToken };
12761
+ }
12762
+ getParagraphLineTokens(paragraphIndex, lineIndex) {
12763
+ const paragraph = this.paragraphs[paragraphIndex];
12764
+ const lineStart = lineIndex > 0 ? paragraph.nextLineIndexes[lineIndex - 1] : 0;
12765
+ const lineEnd = paragraph.nextLineIndexes[lineIndex] ? paragraph.nextLineIndexes[lineIndex] : paragraph.content.length;
12766
+ const lineContent = paragraph.content.substring(lineStart, lineEnd);
12767
+ const paragraphSymbolIndex = paragraph.paragraphSettings.startInsertIndex + paragraph.content.length;
12768
+ const { tokens } = this.getTokens(lineStart + paragraph.startIndex, lineContent, paragraphSymbolIndex);
12769
+ const pageFormat = this.getPageFormatAtPosition(this.paragraphs[paragraphIndex].startIndex);
12770
+ const paragraphStyle = this.model.paragraphs[paragraphIndex].paragraphStyle;
12771
+ const lineInfo = paragraph.paragraphSettings.textLinesInfo[lineIndex];
12772
+ const maxWidth = pageFormat.contentWidth - lineInfo.indent.right - lineInfo.indent.markerWidth;
12773
+ const startWidth = lineInfo.indentLeft + lineInfo.indentFirstLine - lineInfo.indent.hanging || 0;
12774
+ this.computeWrapIndex(tokens, startWidth, maxWidth, paragraphStyle.tabSettings ?? []); // needed to proceed a tab width correction according to the tabs complex positioning
12775
+ const isLast = lineIndex === paragraph.nextLineIndexes.length;
12776
+ LineInfoHelper.get(tokens, false, isLast, paragraphStyle, lineInfo.indent, lineInfo.isNumbering, pageFormat.contentWidth, 0, 0); // needed to proceed a space width correction according to the wordSpacing in case of justify alignment
12777
+ return tokens;
12926
12778
  }
12927
- fillLineTokens(startIndex, line, model) {
12928
- const lineInfo = this.getLineInfoByBreakModifier(model, startIndex + line.length);
12779
+ getTokens(contentIndex, content, paragraphSymbolIndex) {
12929
12780
  const tokens = [];
12930
- let characters = [];
12931
- let format = FormatStyleHelper.getFormatAtIndex(model.formats, startIndex);
12932
- let prevFormat = null;
12933
- let prevCharCode = null;
12934
- let prevFontString = null;
12935
- let prevChar = null;
12936
- let fontString = ContentStyleHelper.getFontStylesString(format?.textStyle);
12937
- let symbolChange = false;
12938
- for (let i = 0; i < line.length; i++) {
12939
- const char = line[i];
12940
- const size = FontMetrics.measureCharSize(char, fontString);
12941
- const customComponent = this.getOrGenerateComponent(startIndex, char);
12942
- const breakType = BreakHelper.getBreakType(model, char, startIndex);
12943
- if (customComponent && !breakType) {
12944
- const token = this.customContentService.getTokenFromComponent(customComponent, lineInfo, DisplayValue.customContent, i === 0, size);
12945
- tokens.push(token);
12946
- prevCharCode = -1;
12947
- prevChar = '';
12948
- characters = [];
12949
- }
12950
- else {
12951
- const charCode = char.charCodeAt(0);
12952
- const displayValue = DisplayTokenHelper.getDisplayValue(charCode);
12953
- const isFirstCharacter = i === 0;
12954
- const token = new DisplayToken({
12955
- ...size,
12956
- displayValue,
12957
- align: lineInfo.align,
12958
- indentFirstLine: isFirstCharacter ? lineInfo.indent.firstLine : DEFAULT_PARAGRAPH_STYLE.indentFirstLine,
12959
- indentHanging: isFirstCharacter && !lineInfo.isNumbering ? lineInfo.indent.hanging : DEFAULT_PARAGRAPH_STYLE.indentHanging,
12960
- indentLeft: lineInfo.indent.left,
12961
- indentRight: lineInfo.indent.right,
12962
- indentBefore: lineInfo.offsetBefore,
12963
- indentAfter: lineInfo.offsetAfter,
12964
- lineSpacing: lineInfo.lineSpacing,
12965
- markerWidth: isFirstCharacter && lineInfo.isNumbering ? lineInfo.markerWidth : 0,
12966
- isNumbering: lineInfo.isNumbering,
12967
- isPageBreak: breakType === BreakTypes.Page,
12968
- isLineBreak: breakType === BreakTypes.TextWrapping,
12969
- isTab: false
12970
- });
12971
- tokens.push(token);
12972
- if (charCode !== prevCharCode ||
12973
- !prevFormat ||
12974
- !ContentStyleHelper.areSameTextStyles(format?.textStyle, prevFormat?.textStyle)) {
12975
- symbolChange = true;
12976
- }
12977
- else if (i === line.length - 1) {
12978
- characters.push(token);
12979
- symbolChange = true;
12980
- }
12981
- else {
12982
- characters.push(token);
12983
- }
12984
- if (characters.length > 1 && symbolChange) {
12985
- this.processCharSizes(prevChar, prevFontString, characters);
12986
- characters = [token];
12987
- symbolChange = false;
12988
- }
12989
- else if (symbolChange) {
12990
- characters = [token];
12991
- }
12992
- prevCharCode = charCode;
12993
- prevChar = char;
12994
- }
12995
- prevFormat = format;
12996
- prevFontString = fontString;
12997
- startIndex++;
12998
- if (startIndex > format?.endIndex) {
12999
- format = FormatStyleHelper.getFormatAtIndex(model.formats, startIndex);
13000
- fontString = ContentStyleHelper.getFontStylesString(format?.textStyle);
13001
- }
13002
- }
13003
- return tokens;
12781
+ const prev = { char: '', style: null, size: null };
12782
+ let format = FormatStyleHelper.getFormatAtIndex(this.model.formats, contentIndex);
12783
+ let fontString = ContentStyleHelper.getFontStylesString(format.textStyle);
12784
+ for (let i = 0; i < content.length; i++) {
12785
+ if (content[i] !== prev.char || !prev.style || !ContentStyleHelper.areSameTextStyles(format.textStyle, prev.style)) {
12786
+ prev.size = FontMetrics.measureCharSize(content[i], fontString);
12787
+ prev.char = content[i];
12788
+ prev.style = format.textStyle;
12789
+ }
12790
+ const customComponent = this.getOrGenerateComponent(contentIndex, content[i]);
12791
+ const breakType = BreakHelper.getBreakType(this.model.breaks, content[i], contentIndex);
12792
+ const token = customComponent && !breakType
12793
+ ? DisplayTokenHelper.getComponentToken(customComponent, prev.size)
12794
+ : DisplayTokenHelper.getSymbolToken(content.charCodeAt(i), prev.size, breakType);
12795
+ contentIndex++;
12796
+ if (contentIndex > format.endIndex) {
12797
+ format = FormatStyleHelper.getFormatAtIndex(this.model.formats, contentIndex);
12798
+ fontString = ContentStyleHelper.getFontStylesString(format.textStyle);
12799
+ }
12800
+ tokens.push(token);
12801
+ }
12802
+ const paragraphFormat = FormatStyleHelper.getFormatAtIndex(this.model.formats, paragraphSymbolIndex);
12803
+ const paragraphToken = DisplayTokenHelper.getParagraphToken(paragraphFormat.textStyle);
12804
+ return tokens.length ? { tokens, paragraphToken } : { tokens: [paragraphToken], paragraphToken };
13004
12805
  }
13005
12806
  getOrGenerateComponent(charIndex, char) {
13006
12807
  if (!this.customContentService.isSpecialMarker(char)) {
@@ -13016,12 +12817,6 @@ class DisplayData extends EventEmitting {
13016
12817
  const pageFormat = this.getPageFormatAtPosition(charIndex);
13017
12818
  return this.customContentService.generateComponent(this.model, this.customComponents, this.sessionId, this.generalProperties, pageFormat.contentWidth, charIndex);
13018
12819
  }
13019
- processCharSizes(prevChar, prevFontString, characters) {
13020
- const newSize = FontMetrics.measureCharSize(prevChar, prevFontString);
13021
- for (let item of characters) {
13022
- Object.assign(item, newSize);
13023
- }
13024
- }
13025
12820
  getPageFormatParagraphs(pageFormatIndex) {
13026
12821
  if (pageFormatIndex === this.pagesFormat.length - 1) {
13027
12822
  return this.paragraphs.filter(x => x.startIndex >= this.pagesFormat[pageFormatIndex].pageFormatModel.insertIndex);
@@ -13052,303 +12847,65 @@ class DisplayData extends EventEmitting {
13052
12847
  }
13053
12848
  return -1;
13054
12849
  }
13055
- getLineTokens(model, line, startIndex) {
13056
- const lineInfo = this.getLineInfoFromTextLine(startIndex + line.length);
13057
- if (!line.length) {
13058
- return this.getEmptyLineTokens(model, startIndex, lineInfo);
13059
- }
13060
- const tokens = [];
13061
- let characters = [];
13062
- let format = FormatStyleHelper.getFormatAtIndex(model.formats, startIndex);
13063
- let prevFormat = null;
13064
- let prevCharCode = null;
13065
- let prevFontString = null;
13066
- let prevChar = null;
13067
- let fontString = ContentStyleHelper.getFontStylesString(format?.textStyle);
13068
- let symbolChange = false;
13069
- for (let i = 0; i < line.length; i++) {
13070
- const char = line[i];
13071
- const size = FontMetrics.measureCharSize(char, fontString);
13072
- const customComponent = this.customContentService.getComponent(this.customComponents, char, startIndex);
13073
- const breakType = BreakHelper.getBreakType(model, char, startIndex);
13074
- if (customComponent && !breakType) {
13075
- const token = this.customContentService.getTokenFromComponent(customComponent, lineInfo, DisplayValue.customContent, i === 0, size);
13076
- tokens.push(token);
13077
- prevCharCode = -1;
13078
- prevChar = '';
13079
- characters = [];
12850
+ // The index of a token which should be the last on the line
12851
+ computeWrapIndex(displayTokens, startWidth, maxWidth, tabSettings) {
12852
+ let width = startWidth;
12853
+ let lastBreakable = -1;
12854
+ const lastTab = { token: null, alignment: TabAlignment.Left, usedWidth: 0, tokenWidth: 0 };
12855
+ for (let i = 0; i < displayTokens.length; i++) {
12856
+ const token = displayTokens[i];
12857
+ if (token.breaksLine) {
12858
+ return i;
13080
12859
  }
13081
- else {
13082
- const charCode = char.charCodeAt(0);
13083
- const displayValue = DisplayTokenHelper.getDisplayValue(charCode);
13084
- const isFirstCharacter = i === 0;
13085
- const token = new DisplayToken({
13086
- ...size,
13087
- displayValue,
13088
- align: lineInfo.align,
13089
- indentFirstLine: isFirstCharacter ? lineInfo.indent.firstLine : DEFAULT_PARAGRAPH_STYLE.indentFirstLine,
13090
- indentHanging: isFirstCharacter && !lineInfo.isNumbering ? lineInfo.indent.hanging : DEFAULT_PARAGRAPH_STYLE.indentHanging,
13091
- indentLeft: lineInfo.indent.left,
13092
- indentRight: lineInfo.indent.right,
13093
- indentBefore: lineInfo.offsetBefore,
13094
- indentAfter: lineInfo.offsetAfter,
13095
- lineSpacing: lineInfo.lineSpacing,
13096
- markerWidth: isFirstCharacter && lineInfo.isNumbering ? lineInfo.markerWidth : 0,
13097
- isPageBreak: breakType === BreakTypes.Page,
13098
- isLineBreak: breakType === BreakTypes.TextWrapping,
13099
- isTab: false,
13100
- isNumbering: lineInfo.isNumbering
13101
- });
13102
- tokens.push(token);
13103
- if (charCode !== prevCharCode ||
13104
- !prevFormat ||
13105
- !ContentStyleHelper.areSameTextStyles(format?.textStyle, prevFormat?.textStyle)) {
13106
- symbolChange = true;
12860
+ if (token.isTable) {
12861
+ return i > 0 ? i - 1 : 0;
12862
+ }
12863
+ width += this.adjustLastTab(token, width, lastTab, tabSettings);
12864
+ if (width > maxWidth && !token.isParagraph) {
12865
+ if (i > 0) {
12866
+ i--;
13107
12867
  }
13108
- else if (i === line.length - 1) {
13109
- characters.push(token);
13110
- symbolChange = true;
12868
+ while (i + 1 < displayTokens.length && displayTokens[i + 1].isWhiteSpace) {
12869
+ i++;
13111
12870
  }
13112
- else {
13113
- characters.push(token);
12871
+ if (displayTokens[i].isTab) {
12872
+ return i > 0 ? i - 1 : 0;
13114
12873
  }
13115
- if (characters.length > 1 && symbolChange) {
13116
- this.processCharSizes(prevChar, prevFontString, characters);
13117
- characters = [token];
13118
- symbolChange = false;
12874
+ const breakable = displayTokens[i].breakable && !displayTokens[i].isTab;
12875
+ if (i + 1 === displayTokens.length || breakable || displayTokens[i + 1].breakable || lastBreakable === -1) {
12876
+ return i;
13119
12877
  }
13120
- else if (symbolChange) {
13121
- characters = [token];
12878
+ if (displayTokens[lastBreakable].isTab) {
12879
+ return lastBreakable > 0 ? lastBreakable - 1 : i;
13122
12880
  }
13123
- prevCharCode = charCode;
13124
- prevChar = char;
12881
+ return lastBreakable;
13125
12882
  }
13126
- prevFormat = format;
13127
- prevFontString = fontString;
13128
- startIndex++;
13129
- if (startIndex > format?.endIndex) {
13130
- format = FormatStyleHelper.getFormatAtIndex(model.formats, startIndex);
13131
- fontString = ContentStyleHelper.getFontStylesString(format?.textStyle);
12883
+ if (token.breakable) {
12884
+ lastBreakable = i;
13132
12885
  }
13133
12886
  }
13134
- return tokens;
12887
+ return displayTokens.length - 1;
13135
12888
  }
13136
- findSameNumberingIndex(index) {
13137
- let sameNumberingIndex = index;
13138
- if (this.getParagraphSettings(index)?.numberingData.numberingId) {
13139
- while (sameNumberingIndex >= 0 &&
13140
- this.model.paragraphs[sameNumberingIndex].paragraphStyle.numberingId !==
13141
- this.getParagraphSettings(index)?.numberingData.numberingId) {
13142
- sameNumberingIndex--;
13143
- }
12889
+ adjustLastTab(token, position, tab, tabSettings) {
12890
+ if (token.isTab) {
12891
+ tab.token = token;
12892
+ const setting = tabSettings.find(x => x.position > position);
12893
+ const defaultTabWidth = this.generalProperties.defaultTabWidth;
12894
+ tab.token.width = setting ? setting.position - position : defaultTabWidth - (position % defaultTabWidth);
12895
+ tab.alignment = setting?.alignment ?? TabAlignment.Left;
12896
+ return token.width;
13144
12897
  }
13145
- else if (this.model.paragraphs[index].paragraphStyle.numberingId) {
13146
- while (sameNumberingIndex < this.paragraphs.length &&
13147
- this.model.paragraphs[index].paragraphStyle.numberingId !==
13148
- this.getParagraphSettings(sameNumberingIndex)?.numberingData.numberingId) {
13149
- sameNumberingIndex++;
13150
- }
12898
+ else if (tab.alignment === TabAlignment.Center && tab.token.width > 0) {
12899
+ const width = tab.token.width > token.width / 2 ? token.width / 2 : token.width - tab.token.width;
12900
+ tab.token.width -= tab.token.width > width ? width : tab.token.width;
12901
+ return width;
13151
12902
  }
13152
- return sameNumberingIndex;
13153
- }
13154
- getEmptyDisplayTokens(model, startIndex) {
13155
- const lineInfo = this.getLineInfoByBreakModifier(model, startIndex);
13156
- return this.getEmptyLineTokens(model, startIndex, lineInfo);
13157
- }
13158
- getEmptyLineTokens(model, startIndex, lineInfo) {
13159
- const storedFormat = FormatStyleHelper.getFormatAtIndex(model.formats, startIndex);
13160
- if (!storedFormat) {
13161
- return [];
13162
- }
13163
- const size = FontMetrics.measureCharSize('EMPTY_LINE', ContentStyleHelper.getFontStylesString(storedFormat.textStyle));
13164
- size.width = 3;
13165
- return [
13166
- new DisplayToken({
13167
- ...size,
13168
- displayValue: DisplayValue.emptyLine,
13169
- align: lineInfo.align,
13170
- indentFirstLine: lineInfo.indent.firstLine,
13171
- indentHanging: lineInfo.isNumbering ? 0 : lineInfo.indent.hanging,
13172
- indentLeft: lineInfo.indent.left,
13173
- indentRight: lineInfo.indent.right,
13174
- indentBefore: lineInfo.offsetBefore,
13175
- indentAfter: lineInfo.offsetAfter,
13176
- markerWidth: lineInfo.markerWidth,
13177
- isNumbering: lineInfo.isNumbering,
13178
- isPageBreak: false,
13179
- isLineBreak: false,
13180
- isTab: false,
13181
- lineSpacing: lineInfo.lineSpacing
13182
- })
13183
- ];
13184
- }
13185
- getLineInfoByBreakModifier(model, index) {
13186
- const paragraph = ParagraphStyleHelper.getParagraphAtIndex(model.paragraphs, index);
13187
- if (!paragraph) {
13188
- return new LineInfoModel({
13189
- align: DEFAULT_PARAGRAPH_STYLE.alignment,
13190
- indent: new IndentModel(DEFAULT_PARAGRAPH_STYLE.indentFirstLine, DEFAULT_PARAGRAPH_STYLE.indentHanging, DEFAULT_PARAGRAPH_STYLE.indentLeft, DEFAULT_PARAGRAPH_STYLE.indentRight),
13191
- offsetBefore: DEFAULT_PARAGRAPH_STYLE.spaceBefore,
13192
- offsetAfter: DEFAULT_PARAGRAPH_STYLE.spaceAfter,
13193
- lineSpacing: DEFAULT_PARAGRAPH_STYLE.lineSpacing
13194
- });
13195
- }
13196
- const { indent, markerWidth } = this.getParagraphIndentLeft(model, paragraph);
13197
- return this.getLineInfoModel(paragraph, indent, markerWidth);
13198
- }
13199
- getParagraphIndentLeft(model, paragraph) {
13200
- const numberingId = paragraph.paragraphStyle.numberingId;
13201
- if (numberingId === null) {
13202
- return {
13203
- indent: new IndentModel(paragraph.paragraphStyle.indentFirstLine ?? DEFAULT_PARAGRAPH_STYLE.indentFirstLine, paragraph.paragraphStyle.indentHanging ?? DEFAULT_PARAGRAPH_STYLE.indentHanging, paragraph.paragraphStyle.indentLeft ?? DEFAULT_PARAGRAPH_STYLE.indentLeft, paragraph.paragraphStyle.indentRight ?? DEFAULT_PARAGRAPH_STYLE.indentRight),
13204
- markerWidth: 0
13205
- };
13206
- }
13207
- const level = paragraph.paragraphStyle.numberingLevel;
13208
- const paragraphIndex = model.paragraphs.indexOf(paragraph);
13209
- const levelModel = NumberingHelper.find(this.generalProperties.numberings, numberingId, level);
13210
- const paragraphFormat = FormatStyleHelper.getFormatAtIndex(model.formats, paragraph.insertIndex);
13211
- const markerTextStyle = ContentStyleHelper.combineTextStyles(levelModel.markerStyle, paragraphFormat.textStyle);
13212
- const paragraphSettings = this.getParagraphSettings(paragraphIndex);
13213
- let markerWidth = paragraphSettings?.numberingData?.width;
13214
- const marker = NumberingHelper.getMarker(levelModel, numberingId, model.paragraphs, paragraphIndex, this.generalProperties.numberingInfo);
13215
- const markerSizes = NumberingHelper.getMarkerSizes(marker, markerTextStyle);
13216
- markerWidth = markerSizes.width;
13217
- let indentHanging = levelModel.indentHanging;
13218
- let indentFirstLine = DEFAULT_PARAGRAPH_STYLE.indentFirstLine;
13219
- if (paragraph.paragraphStyle.indentFirstLine !== null || paragraph.paragraphStyle.indentHanging !== null) {
13220
- if (paragraph.paragraphStyle.indentFirstLine !== null) {
13221
- indentFirstLine = paragraph.paragraphStyle.indentFirstLine;
13222
- indentHanging = null;
13223
- }
13224
- else {
13225
- indentHanging =
13226
- paragraph.paragraphStyle.indentHanging !== null ? paragraph.paragraphStyle.indentHanging : levelModel.indentHanging;
13227
- }
12903
+ else if (tab.alignment === TabAlignment.Right && tab.token.width > 0) {
12904
+ const width = tab.token.width > token.width ? token.width : tab.token.width;
12905
+ tab.token.width -= tab.token.width > width ? width : tab.token.width;
12906
+ return token.width - width;
13228
12907
  }
13229
- const indent = new IndentModel(indentFirstLine, indentHanging, paragraph.paragraphStyle.indentLeft !== null ? paragraph.paragraphStyle.indentLeft : levelModel.indentLeft, paragraph.paragraphStyle.indentRight ?? DEFAULT_PARAGRAPH_STYLE.indentRight);
13230
- return { indent, markerWidth: markerWidth + markerWidth / marker.length };
13231
- }
13232
- getLineInfoFromTextLine(index) {
13233
- const paragraph = ParagraphStyleHelper.getParagraphAtIndex(this.model.paragraphs, index);
13234
- const indentLeft = this.getIndentLeftFromTextLine(index);
13235
- const indent = new IndentModel(paragraph.paragraphStyle.indentFirstLine ?? DEFAULT_PARAGRAPH_STYLE.indentFirstLine, paragraph.paragraphStyle.indentHanging ?? DEFAULT_PARAGRAPH_STYLE.indentHanging, indentLeft ?? DEFAULT_PARAGRAPH_STYLE.indentLeft, paragraph.paragraphStyle.indentRight ?? DEFAULT_PARAGRAPH_STYLE.indentRight);
13236
- return this.getLineInfoModel(paragraph, indent, 0);
13237
- }
13238
- getLineInfoModel(paragraph, indent, markerWidth) {
13239
- return new LineInfoModel({
13240
- align: paragraph.paragraphStyle.alignment ?? DEFAULT_PARAGRAPH_STYLE.alignment,
13241
- indent,
13242
- offsetBefore: DEFAULT_PARAGRAPH_STYLE.spaceBefore,
13243
- offsetAfter: DEFAULT_PARAGRAPH_STYLE.spaceAfter,
13244
- lineSpacing: paragraph.paragraphStyle.lineSpacing ?? DEFAULT_PARAGRAPH_STYLE.lineSpacing,
13245
- isNumbering: !!markerWidth,
13246
- markerWidth
13247
- });
13248
- }
13249
- getIndentLeftFromTextLine(insertIndex) {
13250
- let startIndex = 0;
13251
- let endIndex = this.paragraphs.length - 1;
13252
- while (startIndex <= endIndex) {
13253
- const middleIndex = Math.round((startIndex + endIndex) / 2);
13254
- const paragraphInfo = this.paragraphs[middleIndex];
13255
- if (paragraphInfo.startIndex > insertIndex) {
13256
- startIndex = middleIndex + 1;
13257
- }
13258
- else {
13259
- endIndex = middleIndex - 1;
13260
- }
13261
- }
13262
- const textLinesInfo = this.paragraphs[startIndex]?.paragraphSettings.textLinesInfo;
13263
- return textLinesInfo ? Math.max(...textLinesInfo.map(x => x.indentLeft)) : null;
13264
- }
13265
- computeWrapSplit(tokens, wrapLimit) {
13266
- if (!tokens.length || tokens.length <= wrapLimit) {
13267
- return null;
13268
- }
13269
- // If there is a space or tab at this split position, then making
13270
- // a split is simple.
13271
- if (wrapLimit === 0 ||
13272
- tokens[wrapLimit].displayValue === DisplayValue.customContent ||
13273
- (this.isWhiteSpace(tokens[wrapLimit - 1]) && this.isWhiteSpace(tokens[wrapLimit]))) {
13274
- return wrapLimit;
13275
- }
13276
- return this.calculateSplit(wrapLimit, tokens);
13277
- }
13278
- calculateSplit(index, tokens) {
13279
- for (let i = index; i >= 0; i--) {
13280
- if (this.isWhiteSpace(tokens[i]) || tokens[i].displayValue === DisplayValue.customContent) {
13281
- return i + 1;
13282
- }
13283
- }
13284
- return index;
13285
- }
13286
- isWhiteSpace(token) {
13287
- return [DisplayValue.space, DisplayValue.emptyLine].includes(token.displayValue);
13288
- }
13289
- /**
13290
- * Computes wrap index based on max row width
13291
- */
13292
- computeWrapIndex(displayTokens, contentWidth, defaultTabWidth, tabSettings) {
13293
- if (!displayTokens[0]) {
13294
- return 0;
13295
- }
13296
- if (displayTokens[0].isTable || (displayTokens[0].breaksLine && displayTokens.length === 1)) {
13297
- return 1;
13298
- }
13299
- const maxRowWidth = contentWidth - displayTokens[0].indentRight - displayTokens[0].markerWidth;
13300
- let sum = displayTokens[0].indentLeft + displayTokens[0].indentFirstLine - displayTokens[0].indentHanging || 0;
13301
- let prevTabIndex = null;
13302
- let tabCenter = null;
13303
- let prevTabAlignment = TabAlignment.Left;
13304
- for (let i = 0; i < displayTokens.length; i++) {
13305
- const token = displayTokens[i];
13306
- const prevToken = i > 0 ? displayTokens[i - 1] : null;
13307
- if (token.isTab) {
13308
- const tabs = tabSettings ?? [];
13309
- const nextSettingIndex = tabs.findIndex(x => x.position > sum);
13310
- const tokenWidth = TabHelper.calculateTabWidth(sum, defaultTabWidth, tabSettings);
13311
- if (nextSettingIndex >= 0 && tabs[nextSettingIndex].alignment === TabAlignment.Center) {
13312
- prevTabAlignment = TabAlignment.Center;
13313
- tabCenter = { stringWidth: 0, tokenWidth };
13314
- token.width = tokenWidth;
13315
- }
13316
- else {
13317
- prevTabAlignment = nextSettingIndex >= 0 ? tabs[nextSettingIndex].alignment : TabAlignment.Left;
13318
- token.width = tokenWidth;
13319
- tabCenter = null;
13320
- }
13321
- prevTabIndex = i;
13322
- }
13323
- if (prevTabAlignment === TabAlignment.Center && !token.isTab && tabCenter.stringWidth < tabCenter.tokenWidth) {
13324
- const tokenWidth = token.width / 2;
13325
- displayTokens[prevTabIndex].width -= tokenWidth;
13326
- tabCenter.stringWidth += tokenWidth;
13327
- sum += tokenWidth;
13328
- }
13329
- else if (prevTabAlignment === TabAlignment.Right && !token.isTab && displayTokens[prevTabIndex].width !== 0) {
13330
- if (displayTokens[prevTabIndex].width - token.width < 0) {
13331
- sum += token.width - displayTokens[prevTabIndex].width;
13332
- displayTokens[prevTabIndex].width = 0;
13333
- }
13334
- else {
13335
- displayTokens[prevTabIndex].width -= token.width;
13336
- }
13337
- }
13338
- else {
13339
- sum += token.width;
13340
- }
13341
- if (sum >= maxRowWidth) {
13342
- return i > 0 ? i - 1 : 0;
13343
- }
13344
- if (prevToken?.breaksLine || token.isTable) {
13345
- return i;
13346
- }
13347
- if (token.isLineBreak || (i === displayTokens.length - 1 && token.isPageBreak)) {
13348
- return i + 1;
13349
- }
13350
- }
13351
- return 0;
12908
+ return token.width;
13352
12909
  }
13353
12910
  getPreviousParagraphInfo(row) {
13354
12911
  if (!row || !this.paragraphs.length) {
@@ -14131,28 +13688,40 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImpor
14131
13688
  args: [{ selector: 'app-nod-image', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<app-nod-resizer\n *ngIf=\"isFocused\"\n class=\"resizer\"\n [isDisabled]=\"isViewOnly$ | async\"\n [size]=\"size\"\n (resizeEnd)=\"onResizeEnd($event)\" />\n", styles: [":host{position:relative;outline:none}.resizer{position:absolute;z-index:1}\n"] }]
14132
13689
  }], ctorParameters: () => [{ type: i0.ElementRef }, { type: ImageApiService }] });
14133
13690
 
14134
- class NoderTabComponent extends BaseNoderComponent {
14135
- get tab() {
14136
- return this.content;
14137
- }
14138
- set tab(val) {
14139
- this.content = val;
13691
+ class ParagraphStyleHelper {
13692
+ static getParagraphsAtRange(paragraphs, startIndex, endIndex) {
13693
+ let firstModifierIndexInRange = paragraphs.findIndex(paragraph => paragraph.insertIndex >= startIndex);
13694
+ firstModifierIndexInRange = firstModifierIndexInRange === -1 ? paragraphs.length : firstModifierIndexInRange;
13695
+ let lastModifierIndexInRange = paragraphs.findIndex(x => x.insertIndex >= endIndex);
13696
+ lastModifierIndexInRange =
13697
+ startIndex === endIndex || lastModifierIndexInRange === -1 ? firstModifierIndexInRange : lastModifierIndexInRange;
13698
+ return paragraphs.slice(firstModifierIndexInRange, lastModifierIndexInRange + 1);
14140
13699
  }
14141
- initialize() {
14142
- this.applySize(this.tab.width);
13700
+ static getParagraphAtIndex(paragraphs, insertIndex) {
13701
+ let startIndex = 0;
13702
+ let endIndex = paragraphs.length - 1;
13703
+ while (startIndex <= endIndex) {
13704
+ const middleIndex = Math.round((startIndex + endIndex) / 2);
13705
+ const paragraph = paragraphs[middleIndex];
13706
+ if (paragraph.insertIndex < insertIndex) {
13707
+ startIndex = middleIndex + 1;
13708
+ }
13709
+ else {
13710
+ endIndex = middleIndex - 1;
13711
+ }
13712
+ }
13713
+ return paragraphs[startIndex];
14143
13714
  }
14144
- applySize(width) {
14145
- this.width.set(ScalingHelper.scale(width, this.generalProperties.scalingRatio));
13715
+ static isEndOfParagraph(paragraphs, endIndex) {
13716
+ const paragraph = this.getParagraphAtIndex(paragraphs, endIndex);
13717
+ let paragraphIndex = paragraphs.findIndex(x => x === paragraph);
13718
+ const endOfParagraphIsParagraph = paragraph && endIndex === paragraph.insertIndex && paragraphs.length - 1 > paragraphIndex;
13719
+ if (endOfParagraphIsParagraph) {
13720
+ paragraphIndex += 1;
13721
+ }
13722
+ return paragraphs[paragraphIndex].insertIndex === endIndex + 1;
14146
13723
  }
14147
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: NoderTabComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
14148
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.5", type: NoderTabComponent, isStandalone: false, selector: "app-nod-tab", host: { properties: { "style.width.px": "width()" } }, usesInheritance: true, ngImport: i0, template: "&emsp;\n", styles: [":host{position:relative;outline:none}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
14149
13724
  }
14150
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: NoderTabComponent, decorators: [{
14151
- type: Component,
14152
- args: [{ selector: 'app-nod-tab', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, host: {
14153
- '[style.width.px]': 'width()'
14154
- }, template: "&emsp;\n", styles: [":host{position:relative;outline:none}\n"] }]
14155
- }] });
14156
13725
 
14157
13726
  const CHARS = [
14158
13727
  // eslint-disable-next-line prettier/prettier
@@ -14357,7 +13926,6 @@ class EditSession {
14357
13926
  const endParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, endIndex).row;
14358
13927
  OperationsHelper.applyTextStyle(this.model, startIndex, endIndex, textStyle);
14359
13928
  this.provideTextStyle(startIndex, endIndex);
14360
- this.displayData.resetAllNumberingInfo(startParagraph);
14361
13929
  this.displayData.updateNextLineIndexes(startParagraph, endParagraph);
14362
13930
  this.setTextStyle(textStyle);
14363
13931
  }
@@ -14370,36 +13938,25 @@ class EditSession {
14370
13938
  startParagraph = this.displayData.paragraphs.findIndex(x => x.paragraphSettings.numberingData.numberingId === numberingId);
14371
13939
  endParagraph = this.displayData.paragraphs.findLastIndex(x => x.paragraphSettings.numberingData.numberingId === numberingId);
14372
13940
  }
14373
- this.displayData.resetAllNumberingInfo(startParagraph);
14374
13941
  this.displayData.updateNextLineIndexes(startParagraph, endParagraph);
14375
13942
  this.applyToolbarStyles();
14376
13943
  }
14377
13944
  rerender(insertIndex) {
14378
13945
  const paragraphIndex = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, insertIndex).row;
14379
- this.displayData.resetAllNumberingInfo(paragraphIndex);
14380
13946
  this.displayData.updateNextLineIndexes(paragraphIndex, paragraphIndex);
14381
13947
  }
14382
13948
  addNumbering(levels, startIndex, endIndex, numberingId) {
14383
13949
  const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, startIndex).row;
14384
13950
  const endParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, endIndex).row;
14385
13951
  OperationsHelper.addNumbering(this.model, this.generalProperties.numberings, startIndex, endIndex, levels, numberingId);
14386
- this.generalProperties.numberingInfo = {};
14387
13952
  this.displayData.updateNextLineIndexes(startParagraph, endParagraph);
14388
- for (let i = startParagraph; i <= endParagraph; i++) {
14389
- if (this.displayData.getParagraphSettings(i).numberingData.numberingId !== null) {
14390
- this.displayData.updateNumberingsDataOnChange(endParagraph + 1);
14391
- break;
14392
- }
14393
- }
14394
13953
  this.applyToolbarStyles();
14395
13954
  }
14396
13955
  removeNumberings(startIndex, endIndex) {
14397
13956
  const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, startIndex).row;
14398
13957
  const endParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, endIndex).row;
14399
- this.displayData.resetAllNumberingInfo(startParagraph);
14400
13958
  OperationsHelper.removeNumberings(this.model, this.generalProperties.numberings, startIndex, endIndex);
14401
13959
  this.displayData.updateNextLineIndexes(startParagraph, endParagraph);
14402
- this.displayData.updateNumberingsDataOnChange(endParagraph);
14403
13960
  this.applyToolbarStyles();
14404
13961
  }
14405
13962
  restoreNumberings(paragraphs, numberings) {
@@ -14407,15 +13964,8 @@ class EditSession {
14407
13964
  const endIndex = paragraphs[paragraphs.length - 1].insertIndex;
14408
13965
  const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, startIndex).row;
14409
13966
  const endPosition = ContentHelper.documentIndexToParagraphWithOffset(this.displayData.paragraphs, endIndex);
14410
- this.displayData.resetAllNumberingInfo(startParagraph);
14411
13967
  OperationsHelper.restoreNumberings(this.model, this.generalProperties.numberings, paragraphs, numberings);
14412
13968
  this.displayData.updateNextLineIndexes(startParagraph, endPosition.row);
14413
- for (const paragraph of paragraphs) {
14414
- if (paragraph.paragraphStyle.numberingId !== null) {
14415
- this.displayData.updateNumberingsDataOnChange(endPosition.row + 1);
14416
- break;
14417
- }
14418
- }
14419
13969
  this.selection.placeCursor(endPosition);
14420
13970
  this.applyToolbarStyles();
14421
13971
  }
@@ -14424,7 +13974,6 @@ class EditSession {
14424
13974
  imageComponentRef.instance.resize({ width: applyImage.width, height: applyImage.height });
14425
13975
  OperationsHelper.applyImageStyle(this.model, applyImage);
14426
13976
  const start = this.displayData.indexToPosition(applyImage.insertIndex, 0);
14427
- this.displayData.resetAllNumberingInfo(start.row);
14428
13977
  this.displayData.updateNextLineIndexes(start.row, this.displayData.paragraphs.length - 1);
14429
13978
  }
14430
13979
  restoreTextStyles(formats, linkFormats) {
@@ -14434,7 +13983,6 @@ class EditSession {
14434
13983
  const endPosition = ContentHelper.documentIndexToParagraphWithOffset(this.displayData.paragraphs, endIndex);
14435
13984
  OperationsHelper.restoreTextStyles(this.model, formats, linkFormats);
14436
13985
  this.provideTextStyle(startIndex, endIndex);
14437
- this.displayData.resetAllNumberingInfo(startParagraph);
14438
13986
  this.displayData.updateNextLineIndexes(startParagraph, endPosition.row);
14439
13987
  this.selection.placeCursor(endPosition);
14440
13988
  this.applyToolbarStyles();
@@ -14445,7 +13993,6 @@ class EditSession {
14445
13993
  const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, startIndex).row;
14446
13994
  const endPosition = ContentHelper.documentIndexToParagraphWithOffset(this.displayData.paragraphs, endIndex);
14447
13995
  OperationsHelper.restoreParagraphStyles(this.model, paragraphs);
14448
- this.displayData.resetAllNumberingInfo(0);
14449
13996
  this.displayData.updateNextLineIndexes(startParagraph, endPosition.row);
14450
13997
  this.selection.placeCursor(endPosition);
14451
13998
  this.applyToolbarStyles();
@@ -14456,7 +14003,6 @@ class EditSession {
14456
14003
  const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, startIndex).row;
14457
14004
  const endParagraph = ContentHelper.documentIndexToParagraphWithOffset(this.displayData.paragraphs, endIndex).row;
14458
14005
  OperationsHelper.applyParagraphs(this.model, paragraphs);
14459
- this.displayData.resetAllNumberingInfo(startParagraph);
14460
14006
  this.displayData.updateNextLineIndexes(startParagraph, endParagraph);
14461
14007
  this.applyToolbarStyles();
14462
14008
  }
@@ -14476,11 +14022,7 @@ class EditSession {
14476
14022
  CustomComponentHelper.applyRemovingComponents(this.customComponents.tabs, partIndexes.startIndex, partIndexes.endIndex);
14477
14023
  OperationsHelper.delete(this.model, partIndexes.startIndex, partIndexes.endIndex - partIndexes.startIndex + 1);
14478
14024
  this.selection.placeCursor(range.start);
14479
- this.displayData.resetAllNumberingInfo(range.start.row);
14480
14025
  this.displayData.updateNextLineIndexes(range.start.row, range.start.row);
14481
- if (range.end.row - range.start.row && this.type !== 'cell') {
14482
- this.displayData.updateNumberingsDataOnChange(range.start.row + 1);
14483
- }
14484
14026
  this.applyToolbarStyles();
14485
14027
  }
14486
14028
  replace(model) {
@@ -14542,11 +14084,7 @@ class EditSession {
14542
14084
  OperationsHelper.insertText(this.model, text, insertIndex);
14543
14085
  }
14544
14086
  const endPosition = this.displayData.insertText(position, text);
14545
- this.displayData.resetAllNumberingInfo(position.row);
14546
14087
  this.displayData.updateNextLineIndexes(position.row, endPosition.row);
14547
- if (endPosition.row - position.row && this.type !== 'cell') {
14548
- this.displayData.updateNumberingsDataOnChange(endPosition.row + 1);
14549
- }
14550
14088
  this.selection.placeCursor(endPosition);
14551
14089
  return endPosition;
14552
14090
  }
@@ -14569,7 +14107,6 @@ class EditSession {
14569
14107
  const model = this.model.elements.find(x => x.insertIndex === insertIndex);
14570
14108
  const type = this.customContentService.findComponentType(model.type);
14571
14109
  this.addComponent(this.customComponents.customElements, model, type);
14572
- this.displayData.resetAllNumberingInfo(position.row);
14573
14110
  this.displayData.updateNextLineIndexes(position.row, endPosition.row);
14574
14111
  this.selection.placeCursor(endPosition);
14575
14112
  return endPosition;
@@ -14577,15 +14114,11 @@ class EditSession {
14577
14114
  insertBreak(position, breakType) {
14578
14115
  const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.displayData.paragraphs, position);
14579
14116
  const isOnNewParagraph = breakType === BreakTypes.Page &&
14580
- BreakHelper.getBreakType(this.model, CUSTOM_ELEMENT_MARKER, insertIndex - 1) !== BreakTypes.Page;
14117
+ BreakHelper.getBreakType(this.model.breaks, CUSTOM_ELEMENT_MARKER, insertIndex - 1) !== BreakTypes.Page;
14581
14118
  const text = isOnNewParagraph ? `${NEW_LINE_MARKUP}${CUSTOM_ELEMENT_MARKER}` : CUSTOM_ELEMENT_MARKER;
14582
14119
  OperationsHelper.insertBreak(this.model, text, insertIndex, breakType);
14583
14120
  const endPosition = this.displayData.insertText(position, text);
14584
- this.displayData.resetAllNumberingInfo(position.row);
14585
14121
  this.displayData.updateNextLineIndexes(position.row, endPosition.row);
14586
- if (isOnNewParagraph && endPosition.row - position.row) {
14587
- this.displayData.updateNumberingsDataOnChange(endPosition.row);
14588
- }
14589
14122
  const cursorPosition = this.displayData.getPositionAfterBreak(endPosition, breakType);
14590
14123
  this.selection.placeCursor(cursorPosition);
14591
14124
  return endPosition;
@@ -14596,7 +14129,6 @@ class EditSession {
14596
14129
  const model = this.model.tabs.find(x => x.insertIndex === insertIndex);
14597
14130
  this.addComponent(this.customComponents.tabs, model, NoderTabComponent);
14598
14131
  const endPosition = this.displayData.insertText(position, CUSTOM_ELEMENT_MARKER);
14599
- this.displayData.resetAllNumberingInfo(position.row);
14600
14132
  this.displayData.updateNextLineIndexes(position.row, position.row);
14601
14133
  this.selection.placeCursor(endPosition);
14602
14134
  return endPosition;
@@ -14607,7 +14139,6 @@ class EditSession {
14607
14139
  const model = this.model.images.find(x => x.insertIndex === insertIndex);
14608
14140
  this.addComponent(this.customComponents.images, model, NoderImageComponent);
14609
14141
  const endPosition = this.displayData.insertText(position, CUSTOM_ELEMENT_MARKER);
14610
- this.displayData.resetAllNumberingInfo(position.row);
14611
14142
  this.displayData.updateNextLineIndexes(position.row, position.row);
14612
14143
  this.selection.placeCursor(endPosition);
14613
14144
  return endPosition;
@@ -14616,7 +14147,6 @@ class EditSession {
14616
14147
  const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.displayData.paragraphs, position);
14617
14148
  OperationsHelper.insertLink(this.model, linkData.text, linkData.link, insertIndex);
14618
14149
  const endPosition = this.displayData.insertText(position, linkData.text);
14619
- this.displayData.resetAllNumberingInfo(position.row);
14620
14150
  this.displayData.updateNextLineIndexes(position.row, position.row);
14621
14151
  this.selection.placeCursor(endPosition);
14622
14152
  return endPosition;
@@ -14627,11 +14157,7 @@ class EditSession {
14627
14157
  const model = this.model.tables.find(x => x.insertIndex >= tableModel.insertIndex);
14628
14158
  this.addComponent(this.customComponents.tables, model, NoderTableComponent);
14629
14159
  const endPosition = this.displayData.insertText(position, text);
14630
- this.displayData.resetAllNumberingInfo(position.row);
14631
14160
  this.displayData.updateNextLineIndexes(position.row, endPosition.row);
14632
- if (endPosition.row - position.row) {
14633
- this.displayData.updateNumberingsDataOnChange(endPosition.row);
14634
- }
14635
14161
  this.selection.placeCursor(endPosition);
14636
14162
  return endPosition;
14637
14163
  }
@@ -14652,11 +14178,7 @@ class EditSession {
14652
14178
  CustomComponentHelper.applyRemovingComponents(this.customComponents.tabs, moveModel.sourceStartIndex, endIndex);
14653
14179
  const restoreModel = OperationsHelper.removeMoveRange(this.model, moveModel);
14654
14180
  this.selection.placeCursor(startPosition);
14655
- this.displayData.resetAllNumberingInfo(startPosition.row);
14656
14181
  this.displayData.updateNextLineIndexes(startPosition.row, endPosition.row);
14657
- if (endPosition.row - startPosition.row && this.type !== 'cell') {
14658
- this.displayData.updateNumberingsDataOnChange(startPosition.row + 1);
14659
- }
14660
14182
  this.applyToolbarStyles();
14661
14183
  return restoreModel;
14662
14184
  }
@@ -14669,11 +14191,7 @@ class EditSession {
14669
14191
  this.restoreElementComponents(this.model.elements, moveIndex, endIndex);
14670
14192
  const startPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, moveIndex);
14671
14193
  const endPosition = this.displayData.insertText(startPosition, restoreModel.text);
14672
- this.displayData.resetAllNumberingInfo(startPosition.row);
14673
14194
  this.displayData.updateNextLineIndexes(startPosition.row, endPosition.row);
14674
- if (endPosition.row - startPosition.row && this.type !== 'cell') {
14675
- this.displayData.updateNumberingsDataOnChange(endPosition.row);
14676
- }
14677
14195
  this.selection.placeCursor(endPosition);
14678
14196
  this.applyToolbarStyles();
14679
14197
  const newStartPosition = this.displayData.indexToPosition(moveIndex, 0);
@@ -14764,11 +14282,7 @@ class EditSession {
14764
14282
  this.restoreComponents(this.model.images, this.customComponents.images, NoderImageComponent, model.insertIndex, restoreEndIndex);
14765
14283
  this.restoreComponents(this.model.tabs, this.customComponents.tabs, NoderTabComponent, model.insertIndex, restoreEndIndex);
14766
14284
  this.restoreElementComponents(this.model.elements, model.insertIndex, restoreEndIndex);
14767
- this.displayData.resetAllNumberingInfo(paragraphPosition.row);
14768
14285
  this.displayData.updateNextLineIndexes(paragraphPosition.row, endPoint.row);
14769
- if (endPoint.row - paragraphPosition.row && this.type !== 'cell') {
14770
- this.displayData.updateNumberingsDataOnChange(endPoint.row + 1);
14771
- }
14772
14286
  this.selection.placeCursor(endPoint);
14773
14287
  this.applyToolbarStyles();
14774
14288
  }
@@ -14801,33 +14315,28 @@ class EditSession {
14801
14315
  }
14802
14316
  insertTableRows(insertIndex, rowsCount, targetIndex, inheritIndex) {
14803
14317
  const table = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
14804
- this.displayData.resetNumberingInfoByTableCell(table);
14805
14318
  OperationsHelper.insertTableRows(this.model, insertIndex, rowsCount, targetIndex, inheritIndex);
14806
14319
  table.instance.updateTable();
14807
14320
  }
14808
14321
  insertTableColumns(insertIndex, columnsCount, targetIndex, inheritIndex) {
14809
14322
  const table = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
14810
14323
  const pageFormat = this.displayData.getPageFormatAtPosition(insertIndex);
14811
- this.displayData.resetNumberingInfoByTableCell(table);
14812
14324
  OperationsHelper.insertTableColumns(this.model, insertIndex, columnsCount, targetIndex, inheritIndex, pageFormat.contentWidth);
14813
14325
  table.instance.updateTable();
14814
14326
  }
14815
14327
  removeTableRows(insertIndex, startIndex, endIndex) {
14816
14328
  const table = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
14817
- this.displayData.resetNumberingInfoByTableCell(table);
14818
14329
  OperationsHelper.removeTableRows(this.model, insertIndex, startIndex, endIndex);
14819
14330
  table.instance.updateTable();
14820
14331
  }
14821
14332
  removeTableColumns(insertIndex, startIndex, endIndex) {
14822
14333
  const table = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
14823
- this.displayData.resetNumberingInfoByTableCell(table);
14824
14334
  const pageFormat = this.displayData.getPageFormatAtPosition(insertIndex);
14825
14335
  OperationsHelper.removeTableColumns(this.model, insertIndex, startIndex, endIndex, pageFormat.contentWidth);
14826
14336
  table.instance.updateTable();
14827
14337
  }
14828
14338
  resizeTableColumns(resizeTableColumns) {
14829
14339
  const table = this.customComponents.tables.find(x => x.instance.insertIndex === resizeTableColumns.insertIndex);
14830
- this.displayData.resetNumberingInfoByTableCell(table);
14831
14340
  OperationsHelper.resizeTableColumns(this.model, resizeTableColumns);
14832
14341
  table.instance.updateTable();
14833
14342
  }
@@ -15079,26 +14588,16 @@ class HighlightLayer {
15079
14588
  const results = [];
15080
14589
  for (let i = 0; i < textLinesInfo.length; i++) {
15081
14590
  const lineInfo = textLinesInfo[i].textLinesInfo;
15082
- const paragraphLineIndex = textLinesInfo[i].paragraphSettings.textLinesInfo.findIndex(x => x === textLinesInfo[i].textLinesInfo);
15083
14591
  if (i !== 0) {
15084
14592
  top += lineInfo.firstLinePageOffset;
15085
14593
  top += lineInfo.offsetBefore;
15086
14594
  }
15087
- let markerWidth = 0;
15088
- const numberingOffsetLeft = textLinesInfo[i].paragraphSettings.numberingData.numberingId === null
15089
- ? 0
15090
- : textLinesInfo[i].paragraphSettings.numberingData.width + textLinesInfo[i].paragraphSettings.numberingData.paddingLeft;
15091
- if (paragraphLineIndex === 0 &&
15092
- lineInfo.isNumbering &&
15093
- (lineInfo.indentFirstLine ||
15094
- (numberingOffsetLeft - lineInfo.indentLeft > 0 && numberingOffsetLeft - lineInfo.indentLeft <= lineInfo.markerWidth))) {
15095
- markerWidth = lineInfo.markerWidth;
15096
- }
15097
- const left = lineInfo.paddingLeft + padding + lineInfo.offsetMargin + markerWidth;
14595
+ const markerOffset = NumberingHelper.getOffsetCausedByMarker(textLinesInfo[i].paragraphSettings.numberingData, lineInfo);
14596
+ const left = lineInfo.paddingLeft + padding + lineInfo.offsetMargin + markerOffset;
15098
14597
  let style;
15099
14598
  if (i === 0) {
15100
14599
  const rangeInfo = this.getRangeInfo(this.session, range);
15101
- const width = lineInfo.width - rangeInfo.leftPos + left + (lineInfo.wordSpacingWidth ?? 0);
14600
+ const width = lineInfo.width - rangeInfo.leftPos + left;
15102
14601
  style = this.getMarkerStyle(lineInfo.height, width, top, rangeInfo.leftPos);
15103
14602
  }
15104
14603
  else if (i === textLinesInfo.length - 1) {
@@ -15107,7 +14606,7 @@ class HighlightLayer {
15107
14606
  style = this.getMarkerStyle(lineInfo.height, rangeInfo.screenWidth, top, left);
15108
14607
  }
15109
14608
  else {
15110
- let width = lineInfo.width + (lineInfo.wordSpacingWidth ?? 0);
14609
+ let width = lineInfo.width;
15111
14610
  style = this.getMarkerStyle(lineInfo.height, width, top, left);
15112
14611
  }
15113
14612
  const result = this.renderHighlight(style, cssClass);
@@ -15137,7 +14636,7 @@ class HighlightLayer {
15137
14636
  }
15138
14637
  const top = this.getTop(screenParentRange.start.row);
15139
14638
  const info = this.getRangeInfo(this.session, screenParentRange);
15140
- this.renderHighlight(this.getMarkerStyle(elementInfo.location.height, elementInfo.location.width, top + lineInfo.maxAscent - elementInfo.location.height + elementInfo.location.top, info.leftPos + elementInfo.location.left), cssClass);
14639
+ this.renderHighlight(this.getMarkerStyle(elementInfo.location.height, elementInfo.location.width, top + lineInfo.ascent - elementInfo.location.height + elementInfo.location.top, info.leftPos + elementInfo.location.left), cssClass);
15141
14640
  }
15142
14641
  getRangeInfo(session, range) {
15143
14642
  const start = range.start;
@@ -15277,16 +14776,9 @@ class CursorLayer {
15277
14776
  fontSize: textStyle.fontSize,
15278
14777
  fontFamily: textStyle.fontFamily
15279
14778
  })));
15280
- const fontMetricHeight = metricSize.ascent + metricSize.descent;
15281
- const maxHeight = this.cursorPosition.sizeMax.ascent + this.cursorPosition.sizeMax.descent;
15282
- const fontShoulders = fontMetricHeight - metricSize.font;
15283
- const offset = metricSize.descent - fontShoulders;
15284
- let top = this.cursorPosition.pageY + this.cursorPosition.sizeMax.ascent - metricSize.font + offset;
15285
- if (fontMetricHeight !== maxHeight && maxHeight >= this.cursorPosition.lineHeight) {
15286
- top -= maxHeight - this.cursorPosition.lineHeight;
15287
- }
15288
- DomHelper.setStyle(this.cursor.style, 'top', `${top < 0 ? 0 : top}px`);
15289
- DomHelper.setStyle(this.cursor.style, 'height', `${fontMetricHeight}px`);
14779
+ const top = this.cursorPosition.pageY + this.cursorPosition.ascent - metricSize.ascent;
14780
+ DomHelper.setStyle(this.cursor.style, 'top', `${top}px`);
14781
+ DomHelper.setStyle(this.cursor.style, 'height', `${metricSize.height}px`);
15290
14782
  }
15291
14783
  restartAnimation() {
15292
14784
  this.removeAnimationClass();
@@ -15302,9 +14794,8 @@ class CursorLayer {
15302
14794
  return;
15303
14795
  }
15304
14796
  DomHelper.setStyle(this.cursor.style, 'display', 'block');
15305
- const currentSize = this.cursorPosition.sizeCurrent;
15306
14797
  DomHelper.setStyle(this.cursor.style, 'left', `${this.cursorPosition.pageX}px`);
15307
- DomHelper.setStyle(this.cursor.style, 'width', `${currentSize.width}px`);
14798
+ DomHelper.setStyle(this.cursor.style, 'width', `${this.cursorPosition.width}px`);
15308
14799
  this.addTextStylesToCursor();
15309
14800
  }
15310
14801
  removeAnimationClass() {
@@ -15619,7 +15110,7 @@ class Renderer extends EventEmitting {
15619
15110
  this.session = session;
15620
15111
  this.layerConfig = {
15621
15112
  width: 1,
15622
- contentRange: new DistanceModel({ start: 0, end: 0 }),
15113
+ contentRange: new DistanceModel({ start: 0, end: 0 }), // paragraphs
15623
15114
  maxHeight: 1,
15624
15115
  offset: 0,
15625
15116
  height: 1,
@@ -16376,11 +15867,11 @@ class VirtualRenderer {
16376
15867
  this.scrollBar.setScrollTop(top);
16377
15868
  this.loop.schedule({ scroll: true });
16378
15869
  }
16379
- else if (this.scrollBar.scrollTop + this.container.scrollHeight < top + position.lineHeight) {
15870
+ else if (this.scrollBar.scrollTop + this.container.scrollHeight < top + position.height) {
16380
15871
  if (offset) {
16381
15872
  top += offset * this.container.scrollHeight;
16382
15873
  }
16383
- top += position.lineHeight - this.container.scrollHeight;
15874
+ top += position.height - this.container.scrollHeight;
16384
15875
  this.scrollBar.setScrollTop(top);
16385
15876
  this.loop.schedule({ scroll: true });
16386
15877
  }
@@ -16549,22 +16040,11 @@ class CustomContentService {
16549
16040
  }
16550
16041
  return null;
16551
16042
  }
16552
- isFragmentContainComponent(components, textFragment, fragmentDistance) {
16553
- if (textFragment.includes(CUSTOM_ELEMENT_MARKER)) {
16554
- return (this.isFragmentContainComponents(components.images, fragmentDistance) ||
16555
- this.isFragmentContainComponents(components.tabs, fragmentDistance) ||
16556
- this.isFragmentContainComponents(components.customElements, fragmentDistance));
16557
- }
16558
- if (textFragment.includes(TABLE_MARKER)) {
16559
- return this.isFragmentContainComponents(components.tables, fragmentDistance);
16560
- }
16561
- return false;
16562
- }
16563
- getComponents(components, distance) {
16564
- const images = components.images.filter(x => x.instance.insertIndex >= distance.start && x.instance.insertIndex <= distance.end);
16565
- const tables = components.tables.filter(x => x.instance.insertIndex >= distance.start && x.instance.insertIndex <= distance.end);
16566
- const tabs = components.tabs.filter(x => x.instance.insertIndex >= distance.start && x.instance.insertIndex <= distance.end);
16567
- const custom = components.customElements.filter(x => x.instance.insertIndex >= distance.start && x.instance.insertIndex <= distance.end);
16043
+ getComponents(components, start, end) {
16044
+ const images = components.images.filter(x => x.instance.insertIndex >= start && x.instance.insertIndex <= end);
16045
+ const tables = components.tables.filter(x => x.instance.insertIndex >= start && x.instance.insertIndex <= end);
16046
+ const tabs = components.tabs.filter(x => x.instance.insertIndex >= start && x.instance.insertIndex <= end);
16047
+ const custom = components.customElements.filter(x => x.instance.insertIndex >= start && x.instance.insertIndex <= end);
16568
16048
  return [...images, ...tables, ...tabs, ...custom].sort((a, b) => a.instance.insertIndex - b.instance.insertIndex);
16569
16049
  }
16570
16050
  getComponent(components, char, charIndex) {
@@ -16575,45 +16055,12 @@ class CustomContentService {
16575
16055
  }
16576
16056
  return this.findComponent(components.tables, charIndex);
16577
16057
  }
16578
- getTokenFromComponent(component, lineInfo, displayValue, isFirst, size) {
16579
- const ascent = component.instance.ascent() ?? 0;
16580
- const descent = component.instance.descent() ?? 0;
16581
- return new DisplayToken({
16582
- width: component.instance.width(),
16583
- height: ascent + descent,
16584
- baseline: 0,
16585
- content: 0,
16586
- font: size.font,
16587
- ascent,
16588
- descent,
16589
- line: 0,
16590
- lineSpacing: lineInfo.lineSpacing,
16591
- multiplier: 0,
16592
- align: lineInfo.align,
16593
- indentFirstLine: isFirst ? lineInfo.indent.firstLine : DEFAULT_PARAGRAPH_STYLE.indentFirstLine,
16594
- indentHanging: isFirst && !lineInfo.isNumbering ? lineInfo.indent.hanging : DEFAULT_PARAGRAPH_STYLE.indentHanging,
16595
- indentLeft: lineInfo.indent.left,
16596
- indentRight: lineInfo.indent.right,
16597
- indentBefore: lineInfo.offsetBefore,
16598
- indentAfter: lineInfo.offsetAfter,
16599
- markerWidth: isFirst && lineInfo.isNumbering ? lineInfo.markerWidth : 0,
16600
- isNumbering: lineInfo.isNumbering,
16601
- isPageBreak: false,
16602
- isLineBreak: false,
16603
- displayValue,
16604
- isTab: component.instance instanceof NoderTabComponent,
16605
- isTable: component.instance instanceof NoderTableComponent
16606
- });
16607
- }
16608
16058
  findComponentType(type) {
16609
16059
  return this.elements.find(x => x.type === type).componentType;
16610
16060
  }
16611
16061
  findComponent(components, insertIndex) {
16612
16062
  return components.find((x) => x.instance.insertIndex === insertIndex);
16613
16063
  }
16614
- isFragmentContainComponents(components, distance) {
16615
- return components.some(x => x.instance.insertIndex >= distance.start && x.instance.insertIndex <= distance.end);
16616
- }
16617
16064
  isSpecialMarker(char) {
16618
16065
  return char === CUSTOM_ELEMENT_MARKER || char === TABLE_MARKER;
16619
16066
  }
@@ -17375,11 +16822,11 @@ class EditorRulerComponent {
17375
16822
  }
17376
16823
  }
17377
16824
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: EditorRulerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
17378
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.5", type: EditorRulerComponent, isStandalone: true, selector: "app-nod-editor-ruler", inputs: { unit: { classPropertyName: "unit", publicName: "unit", isSignal: true, isRequired: true, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "window:resize": "onResize()" } }, viewQueries: [{ propertyName: "rulerContainer", first: true, predicate: ["rulerContainer"], descendants: true, static: true }], ngImport: i0, template: "<div\n class=\"ruler-container\"\n [class.disabled]=\"disabled()\"\n [style.width.px]=\"pageWidth$ | async\"\n #rulerContainer>\n <div\n class=\"left-area\"\n [style.width.px]=\"leftMarginPageFormatPx()\"></div>\n <div\n class=\"right-area\"\n [style.width.px]=\"containerWidthPx - rightMarginPageFormatPx()\"></div>\n <div\n class=\"separator left-page-format\"\n [style.left.px]=\"leftMarginPageFormatPx()\"\n (mousedown)=\"startDrag($event, 'leftMarginPageFormat')\"\n (touchstart)=\"startDrag($event, 'leftMarginPageFormat')\"></div>\n <div\n class=\"separator right-page-format\"\n [style.left.px]=\"rightMarginPageFormatPx()\"\n (mousedown)=\"startDrag($event, 'rightMarginPageFormat')\"\n (touchstart)=\"startDrag($event, 'rightMarginPageFormat')\"></div>\n\n <div\n class=\"ruler-track\"\n (mousedown)=\"addTab($event)\"\n (touchstart)=\"addTab($event)\"\n (dblclick)=\"onOpenDialog()\">\n @for (tick of ticks; track tick) {\n <div\n class=\"tick\"\n [style.left.px]=\"tick.position\"\n [class.major]=\"tick.major\"\n [class.half]=\"tick.half\">\n @if (tick.label !== null) {\n <span class=\"label\">\n {{ tick.label }}\n </span>\n }\n </div>\n }\n </div>\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-field-up\"\n class=\"page-marker\"\n [style.left.px]=\"leftIndentPx()\"\n (mousedown)=\"startDrag($event, 'leftIndent')\"\n (touchstart)=\"startDrag($event, 'leftIndent')\" />\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-field-down\"\n class=\"paragraph-marker\"\n [style.left.px]=\"firstLinePx()\"\n (mousedown)=\"startDrag($event, 'first')\"\n (touchstart)=\"startDrag($event, 'first')\" />\n @for (tabSetting of tabSettings(); track tabSetting; let index = $index) {\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-field-up\"\n class=\"page-marker\"\n [style.left.px]=\"tabSetting.position + this.leftMarginPageFormatPx()\"\n (mousedown)=\"startDrag($event, 'tabs', index)\"\n (touchstart)=\"startDrag($event, 'tabs', index)\"\n (dblclick)=\"onOpenDialog()\" />\n }\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-field-up\"\n class=\"page-marker\"\n [style.left.px]=\"rightIndentPx()\"\n (mousedown)=\"startDrag($event, 'rightIndent')\"\n (touchstart)=\"startDrag($event, 'rightIndent')\" />\n @if (showGuide()) {\n <div\n class=\"drag-guide\"\n [style.left.px]=\"guideX()\"></div>\n }\n</div>\n", styles: [":host{display:flex;position:relative;z-index:3;width:100%;height:22px;justify-content:center;align-items:center}.disabled{pointer-events:none}.ruler-container{position:relative;height:18px;border-bottom-width:1px;border-bottom-style:solid;border-top-width:1px;border-top-style:solid;-webkit-user-select:none;user-select:none}.ruler-track{position:absolute;left:0;right:0;bottom:0;height:18px;overflow:hidden}.tick{position:absolute;top:50%;transform:translateY(-50%);width:1px;height:4px}.major{height:0}.half{height:8px}.label{position:absolute;top:50%;transform:translate(-50%,-50%);font-size:10px}mat-icon{position:absolute;width:17px;height:17px;font-size:18px;font-weight:700;cursor:grab;z-index:2;transform:translate(-50%)}.drag-guide{position:absolute;height:2000px;top:10px;width:1px;z-index:9999;pointer-events:none;will-change:left}.paragraph-marker{top:-6px;z-index:2}.page-marker{bottom:-6px;z-index:2}.left-area,.right-area,.separator{position:absolute;height:18px}.separator{width:5px;transform:translate(-50%);background-color:transparent;cursor:ew-resize;z-index:2}.left-area{left:0}.right-area{right:0}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
16825
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.5", type: EditorRulerComponent, isStandalone: true, selector: "app-nod-editor-ruler", inputs: { unit: { classPropertyName: "unit", publicName: "unit", isSignal: true, isRequired: true, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "window:resize": "onResize()" } }, viewQueries: [{ propertyName: "rulerContainer", first: true, predicate: ["rulerContainer"], descendants: true, static: true }], ngImport: i0, template: "<div\n class=\"ruler-container\"\n [class.disabled]=\"disabled()\"\n [style.width.px]=\"pageWidth$ | async\"\n #rulerContainer>\n <div\n class=\"left-area\"\n [style.width.px]=\"leftMarginPageFormatPx()\"></div>\n <div\n class=\"right-area\"\n [style.width.px]=\"containerWidthPx - rightMarginPageFormatPx()\"></div>\n <div\n class=\"separator left-page-format\"\n [style.left.px]=\"leftMarginPageFormatPx()\"\n (mousedown)=\"startDrag($event, 'leftMarginPageFormat')\"\n (touchstart)=\"startDrag($event, 'leftMarginPageFormat')\"></div>\n <div\n class=\"separator right-page-format\"\n [style.left.px]=\"rightMarginPageFormatPx()\"\n (mousedown)=\"startDrag($event, 'rightMarginPageFormat')\"\n (touchstart)=\"startDrag($event, 'rightMarginPageFormat')\"></div>\n\n <div\n class=\"ruler-track\"\n (mousedown)=\"addTab($event)\"\n (touchstart)=\"addTab($event)\"\n (dblclick)=\"onOpenDialog()\">\n @for (tick of ticks; track tick.position) {\n <div\n class=\"tick\"\n [style.left.px]=\"tick.position\"\n [class.major]=\"tick.major\"\n [class.half]=\"tick.half\">\n @if (tick.label !== null) {\n <span class=\"label\">\n {{ tick.label }}\n </span>\n }\n </div>\n }\n </div>\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-field-up\"\n class=\"page-marker\"\n [style.left.px]=\"leftIndentPx()\"\n (mousedown)=\"startDrag($event, 'leftIndent')\"\n (touchstart)=\"startDrag($event, 'leftIndent')\" />\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-field-down\"\n class=\"paragraph-marker\"\n [style.left.px]=\"firstLinePx()\"\n (mousedown)=\"startDrag($event, 'first')\"\n (touchstart)=\"startDrag($event, 'first')\" />\n @for (tabSetting of tabSettings(); track tabSetting; let index = $index) {\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-field-up\"\n class=\"page-marker\"\n [style.left.px]=\"tabSetting.position + this.leftMarginPageFormatPx()\"\n (mousedown)=\"startDrag($event, 'tabs', index)\"\n (touchstart)=\"startDrag($event, 'tabs', index)\"\n (dblclick)=\"onOpenDialog()\" />\n }\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-field-up\"\n class=\"page-marker\"\n [style.left.px]=\"rightIndentPx()\"\n (mousedown)=\"startDrag($event, 'rightIndent')\"\n (touchstart)=\"startDrag($event, 'rightIndent')\" />\n @if (showGuide()) {\n <div\n class=\"drag-guide\"\n [style.left.px]=\"guideX()\"></div>\n }\n</div>\n", styles: [":host{display:flex;position:relative;z-index:3;width:100%;height:22px;justify-content:center;align-items:center}.disabled{pointer-events:none}.ruler-container{position:relative;height:18px;border-bottom-width:1px;border-bottom-style:solid;border-top-width:1px;border-top-style:solid;-webkit-user-select:none;user-select:none}.ruler-track{position:absolute;left:0;right:0;bottom:0;height:18px;overflow:hidden}.tick{position:absolute;top:50%;transform:translateY(-50%);width:1px;height:4px}.major{height:0}.half{height:8px}.label{position:absolute;top:50%;transform:translate(-50%,-50%);font-size:10px}mat-icon{position:absolute;width:17px;height:17px;font-size:18px;font-weight:700;cursor:grab;z-index:2;transform:translate(-50%)}.drag-guide{position:absolute;height:2000px;top:10px;width:1px;z-index:9999;pointer-events:none;will-change:left}.paragraph-marker{top:-6px;z-index:2}.page-marker{bottom:-6px;z-index:2}.left-area,.right-area,.separator{position:absolute;height:18px}.separator{width:5px;transform:translate(-50%);background-color:transparent;cursor:ew-resize;z-index:2}.left-area{left:0}.right-area{right:0}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
17379
16826
  }
17380
16827
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: EditorRulerComponent, decorators: [{
17381
16828
  type: Component,
17382
- args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'app-nod-editor-ruler', imports: [MatIconModule, AsyncPipe], template: "<div\n class=\"ruler-container\"\n [class.disabled]=\"disabled()\"\n [style.width.px]=\"pageWidth$ | async\"\n #rulerContainer>\n <div\n class=\"left-area\"\n [style.width.px]=\"leftMarginPageFormatPx()\"></div>\n <div\n class=\"right-area\"\n [style.width.px]=\"containerWidthPx - rightMarginPageFormatPx()\"></div>\n <div\n class=\"separator left-page-format\"\n [style.left.px]=\"leftMarginPageFormatPx()\"\n (mousedown)=\"startDrag($event, 'leftMarginPageFormat')\"\n (touchstart)=\"startDrag($event, 'leftMarginPageFormat')\"></div>\n <div\n class=\"separator right-page-format\"\n [style.left.px]=\"rightMarginPageFormatPx()\"\n (mousedown)=\"startDrag($event, 'rightMarginPageFormat')\"\n (touchstart)=\"startDrag($event, 'rightMarginPageFormat')\"></div>\n\n <div\n class=\"ruler-track\"\n (mousedown)=\"addTab($event)\"\n (touchstart)=\"addTab($event)\"\n (dblclick)=\"onOpenDialog()\">\n @for (tick of ticks; track tick) {\n <div\n class=\"tick\"\n [style.left.px]=\"tick.position\"\n [class.major]=\"tick.major\"\n [class.half]=\"tick.half\">\n @if (tick.label !== null) {\n <span class=\"label\">\n {{ tick.label }}\n </span>\n }\n </div>\n }\n </div>\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-field-up\"\n class=\"page-marker\"\n [style.left.px]=\"leftIndentPx()\"\n (mousedown)=\"startDrag($event, 'leftIndent')\"\n (touchstart)=\"startDrag($event, 'leftIndent')\" />\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-field-down\"\n class=\"paragraph-marker\"\n [style.left.px]=\"firstLinePx()\"\n (mousedown)=\"startDrag($event, 'first')\"\n (touchstart)=\"startDrag($event, 'first')\" />\n @for (tabSetting of tabSettings(); track tabSetting; let index = $index) {\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-field-up\"\n class=\"page-marker\"\n [style.left.px]=\"tabSetting.position + this.leftMarginPageFormatPx()\"\n (mousedown)=\"startDrag($event, 'tabs', index)\"\n (touchstart)=\"startDrag($event, 'tabs', index)\"\n (dblclick)=\"onOpenDialog()\" />\n }\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-field-up\"\n class=\"page-marker\"\n [style.left.px]=\"rightIndentPx()\"\n (mousedown)=\"startDrag($event, 'rightIndent')\"\n (touchstart)=\"startDrag($event, 'rightIndent')\" />\n @if (showGuide()) {\n <div\n class=\"drag-guide\"\n [style.left.px]=\"guideX()\"></div>\n }\n</div>\n", styles: [":host{display:flex;position:relative;z-index:3;width:100%;height:22px;justify-content:center;align-items:center}.disabled{pointer-events:none}.ruler-container{position:relative;height:18px;border-bottom-width:1px;border-bottom-style:solid;border-top-width:1px;border-top-style:solid;-webkit-user-select:none;user-select:none}.ruler-track{position:absolute;left:0;right:0;bottom:0;height:18px;overflow:hidden}.tick{position:absolute;top:50%;transform:translateY(-50%);width:1px;height:4px}.major{height:0}.half{height:8px}.label{position:absolute;top:50%;transform:translate(-50%,-50%);font-size:10px}mat-icon{position:absolute;width:17px;height:17px;font-size:18px;font-weight:700;cursor:grab;z-index:2;transform:translate(-50%)}.drag-guide{position:absolute;height:2000px;top:10px;width:1px;z-index:9999;pointer-events:none;will-change:left}.paragraph-marker{top:-6px;z-index:2}.page-marker{bottom:-6px;z-index:2}.left-area,.right-area,.separator{position:absolute;height:18px}.separator{width:5px;transform:translate(-50%);background-color:transparent;cursor:ew-resize;z-index:2}.left-area{left:0}.right-area{right:0}\n"] }]
16829
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'app-nod-editor-ruler', imports: [MatIconModule, AsyncPipe], template: "<div\n class=\"ruler-container\"\n [class.disabled]=\"disabled()\"\n [style.width.px]=\"pageWidth$ | async\"\n #rulerContainer>\n <div\n class=\"left-area\"\n [style.width.px]=\"leftMarginPageFormatPx()\"></div>\n <div\n class=\"right-area\"\n [style.width.px]=\"containerWidthPx - rightMarginPageFormatPx()\"></div>\n <div\n class=\"separator left-page-format\"\n [style.left.px]=\"leftMarginPageFormatPx()\"\n (mousedown)=\"startDrag($event, 'leftMarginPageFormat')\"\n (touchstart)=\"startDrag($event, 'leftMarginPageFormat')\"></div>\n <div\n class=\"separator right-page-format\"\n [style.left.px]=\"rightMarginPageFormatPx()\"\n (mousedown)=\"startDrag($event, 'rightMarginPageFormat')\"\n (touchstart)=\"startDrag($event, 'rightMarginPageFormat')\"></div>\n\n <div\n class=\"ruler-track\"\n (mousedown)=\"addTab($event)\"\n (touchstart)=\"addTab($event)\"\n (dblclick)=\"onOpenDialog()\">\n @for (tick of ticks; track tick.position) {\n <div\n class=\"tick\"\n [style.left.px]=\"tick.position\"\n [class.major]=\"tick.major\"\n [class.half]=\"tick.half\">\n @if (tick.label !== null) {\n <span class=\"label\">\n {{ tick.label }}\n </span>\n }\n </div>\n }\n </div>\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-field-up\"\n class=\"page-marker\"\n [style.left.px]=\"leftIndentPx()\"\n (mousedown)=\"startDrag($event, 'leftIndent')\"\n (touchstart)=\"startDrag($event, 'leftIndent')\" />\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-field-down\"\n class=\"paragraph-marker\"\n [style.left.px]=\"firstLinePx()\"\n (mousedown)=\"startDrag($event, 'first')\"\n (touchstart)=\"startDrag($event, 'first')\" />\n @for (tabSetting of tabSettings(); track tabSetting; let index = $index) {\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-field-up\"\n class=\"page-marker\"\n [style.left.px]=\"tabSetting.position + this.leftMarginPageFormatPx()\"\n (mousedown)=\"startDrag($event, 'tabs', index)\"\n (touchstart)=\"startDrag($event, 'tabs', index)\"\n (dblclick)=\"onOpenDialog()\" />\n }\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-field-up\"\n class=\"page-marker\"\n [style.left.px]=\"rightIndentPx()\"\n (mousedown)=\"startDrag($event, 'rightIndent')\"\n (touchstart)=\"startDrag($event, 'rightIndent')\" />\n @if (showGuide()) {\n <div\n class=\"drag-guide\"\n [style.left.px]=\"guideX()\"></div>\n }\n</div>\n", styles: [":host{display:flex;position:relative;z-index:3;width:100%;height:22px;justify-content:center;align-items:center}.disabled{pointer-events:none}.ruler-container{position:relative;height:18px;border-bottom-width:1px;border-bottom-style:solid;border-top-width:1px;border-top-style:solid;-webkit-user-select:none;user-select:none}.ruler-track{position:absolute;left:0;right:0;bottom:0;height:18px;overflow:hidden}.tick{position:absolute;top:50%;transform:translateY(-50%);width:1px;height:4px}.major{height:0}.half{height:8px}.label{position:absolute;top:50%;transform:translate(-50%,-50%);font-size:10px}mat-icon{position:absolute;width:17px;height:17px;font-size:18px;font-weight:700;cursor:grab;z-index:2;transform:translate(-50%)}.drag-guide{position:absolute;height:2000px;top:10px;width:1px;z-index:9999;pointer-events:none;will-change:left}.paragraph-marker{top:-6px;z-index:2}.page-marker{bottom:-6px;z-index:2}.left-area,.right-area,.separator{position:absolute;height:18px}.separator{width:5px;transform:translate(-50%);background-color:transparent;cursor:ew-resize;z-index:2}.left-area{left:0}.right-area{right:0}\n"] }]
17383
16830
  }], ctorParameters: () => [], propDecorators: { rulerContainer: [{
17384
16831
  type: ViewChild,
17385
16832
  args: ['rulerContainer', { static: true }]
@@ -18253,11 +17700,11 @@ class MenuDropdownsComponent extends BaseToolbarComponent {
18253
17700
  });
18254
17701
  }
18255
17702
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: MenuDropdownsComponent, deps: [{ token: CustomIconService }, { token: i0.Injector }, { token: i0.ChangeDetectorRef }, { token: EditorService }], target: i0.ɵɵFactoryTarget.Component }); }
18256
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.5", type: MenuDropdownsComponent, isStandalone: false, selector: "app-nod-menu-dropdowns", inputs: { showFile: "showFile", showEdit: "showEdit", showInsert: "showInsert", showLayout: "showLayout", showFormat: "showFormat" }, outputs: { openFileFromDisk: "openFileFromDisk", saveAs: "saveAs", saveAsTemplate: "saveAsTemplate", downloadPdf: "downloadPdf", insertPageBreak: "insertPageBreak", createDocument: "createDocument", pageSetup: "pageSetup", rename: "rename", delete: "delete", openEditMenu: "openEditMenu", cutSelected: "cutSelected", copySelected: "copySelected", pasteClipboardData: "pasteClipboardData", selectAll: "selectAll", removeSelected: "removeSelected" }, viewQueries: [{ propertyName: "tableInsertMenu", first: true, predicate: ["tableInsert"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container\n *ngIf=\"{\n clipboardData: editorService.clipboardData$ | async,\n hasSelection: editorService.hasSelection$ | async,\n isViewOnly: editorService.isViewOnly$ | async\n } as data\">\n <button\n *ngIf=\"showFile\"\n id=\"menu-dropdowns-menu-file\"\n mat-button\n [matMenuTriggerFor]=\"fileMenu\"\n [matMenuTriggerRestoreFocus]=\"false\">\n {{ 'NODER.LABEL.FILE' | translate }}\n </button>\n <mat-menu\n #fileMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n *ngIf=\"createDocument.observed && !data.isViewOnly\"\n id=\"menu-dropdowns-menu-item-new\"\n mat-menu-item\n (click)=\"createDocument.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-add-new\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.NEW' | translate }}</span>\n </div>\n </button>\n <button\n *ngIf=\"!data.isViewOnly\"\n id=\"menu-dropdowns-menu-page-setup\"\n mat-menu-item\n (click)=\"pageSetup.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-system-file\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.PAGE_SETUP' | translate }}</span>\n </div>\n </button>\n <button\n *ngIf=\"openFileFromDisk.observed && !data.isViewOnly\"\n id=\"menu-dropdowns-menu-item-open-from\"\n mat-menu-item\n (click)=\"openFileFromDisk.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-open-from\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.OPEN_FROM' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+O</span>\n </div>\n </button>\n <button\n *ngIf=\"saveAs.observed\"\n id=\"menu-dropdowns-menu-item-save-as\"\n mat-menu-item\n (click)=\"saveAs.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-save\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.SAVE_AS' | translate }}</span>\n </div>\n </button>\n @if (saveAsTemplate.observed) {\n <button\n id=\"menu-dropdowns-menu-item-save-as-template\"\n mat-menu-item\n (click)=\"saveAsTemplate.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-save\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.SAVE_AS_TEMPLATE' | translate }}</span>\n </div>\n </button>\n }\n <button\n *ngIf=\"downloadPdf.observed\"\n id=\"menu-dropdowns-menu-item-download-pdf\"\n mat-menu-item\n (click)=\"downloadPdf.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-save\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.DOWNLOAD_PDF' | translate }}</span>\n </div>\n </button>\n <button\n *ngIf=\"rename.observed\"\n id=\"menu-dropdowns-menu-item-rename\"\n mat-menu-item\n (click)=\"rename.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-rename\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.RENAME' | translate }}</span>\n </div>\n </button>\n <button\n *ngIf=\"print.observed\"\n id=\"menu-dropdowns-menu-item-print\"\n mat-menu-item\n (click)=\"print.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-print\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.PRINT' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+P</span>\n </div>\n </button>\n <button\n *ngIf=\"delete.observed\"\n id=\"menu-dropdowns-menu-item-delete\"\n mat-menu-item\n (click)=\"delete.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-delete\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.DELETE' | translate }}</span>\n </div>\n </button>\n </mat-menu>\n <button\n *ngIf=\"showEdit\"\n id=\"menu-dropdowns-menu-edit\"\n mat-button\n [matMenuTriggerFor]=\"editMenu\"\n [matMenuTriggerRestoreFocus]=\"false\"\n (menuOpened)=\"openEditMenu.emit()\">\n {{ 'NODER.LABEL.EDIT' | translate }}\n </button>\n <mat-menu\n #editMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n *ngIf=\"undo.observed\"\n id=\"menu-dropdowns-menu-item-undo\"\n mat-menu-item\n [disabled]=\"!canUndo\"\n (click)=\"undo.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-undo\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.UNDO' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+Z</span>\n </div>\n </button>\n <button\n *ngIf=\"redo.observed\"\n id=\"menu-dropdowns-menu-item-redo\"\n mat-menu-item\n [disabled]=\"!canRedo\"\n (click)=\"redo.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-redo\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.REDO' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+Y</span>\n </div>\n </button>\n <hr class=\"noder-divider\" />\n <button\n *ngIf=\"cutSelected.observed\"\n id=\"menu-dropdowns-menu-item-cut\"\n mat-menu-item\n [disabled]=\"!data.hasSelection\"\n (click)=\"cutSelected.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-content-cut\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.CUT' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+X</span>\n </div>\n </button>\n <button\n *ngIf=\"copySelected.observed\"\n id=\"menu-dropdowns-menu-item-copy\"\n mat-menu-item\n [disabled]=\"!data.hasSelection\"\n (click)=\"copySelected.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-file-copy\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.COPY' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+C</span>\n </div>\n </button>\n <button\n *ngIf=\"pasteClipboardData.observed\"\n id=\"menu-dropdowns-menu-item-paste\"\n mat-menu-item\n [disabled]=\"!data.clipboardData?.length\"\n (click)=\"pasteClipboardData.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-content-paste\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.PASTE' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+V</span>\n </div>\n </button>\n <hr class=\"noder-divider\" />\n <button\n *ngIf=\"selectAll.observed\"\n id=\"menu-dropdowns-menu-item-select-all\"\n mat-menu-item\n (click)=\"selectAll.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-select-all\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.SELECT_ALL' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+A</span>\n </div>\n </button>\n <button\n *ngIf=\"removeSelected.observed\"\n id=\"menu-dropdowns-menu-item-delete-text\"\n mat-menu-item\n [disabled]=\"!data.hasSelection\"\n (click)=\"removeSelected.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-delete\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.DELETE' | translate }}</span>\n </div>\n </button>\n </mat-menu>\n <button\n *ngIf=\"showInsert && !data.isViewOnly\"\n #insertMenuTrigger=\"matMenuTrigger\"\n id=\"menu-dropdowns-menu-insert\"\n mat-button\n [matMenuTriggerFor]=\"insertMenu\"\n [matMenuTriggerRestoreFocus]=\"false\">\n {{ 'NODER.LABEL.INSERT' | translate }}\n </button>\n <mat-menu\n #insertMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n *ngIf=\"insertImage.observed\"\n id=\"menu-dropdowns-menu-item-image\"\n mat-menu-item\n (click)=\"insertImage.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-image\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.IMAGE' | translate }}</span>\n </div>\n </button>\n <button\n id=\"menu-dropdowns-menu-item-table\"\n mat-menu-item\n [matMenuTriggerFor]=\"tableInsert\"\n (menuOpened)=\"showInsertTableMenu = true\"\n (menuClosed)=\"onTableInsertMenuClosed()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-table\"></mat-icon>\n {{ 'NODER.LABEL.TABLE' | translate }}\n </button>\n <hr class=\"noder-divider\" />\n <button\n *ngIf=\"insertLink.observed\"\n id=\"menu-dropdowns-menu-item-link\"\n mat-menu-item\n (click)=\"insertLink.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-link-on\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.LINK' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+K</span>\n </div>\n </button>\n <button\n *ngFor=\"let element of elements\"\n id=\"menu-dropdowns-menu-item-{{ element.nameId }}\"\n mat-menu-item\n (click)=\"onCreateElement(element)\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"{{ element.icon }}\"></mat-icon>\n <span class=\"menu-item-text\">{{ element.nameTranslate | translate }}</span>\n </div>\n </button>\n <button\n id=\"menu-dropdowns-menu-item-headers-footers\"\n mat-menu-item\n class=\"hidden\"\n [matMenuTriggerFor]=\"listHeadersFootersMenu\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-headers-footers\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.HEADERS_AND_FOOTERS' | translate }}</span>\n </div>\n </button>\n <mat-menu\n #listHeadersFootersMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n id=\"menu-dropdowns-menu-item-header\"\n mat-menu-item>\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-header\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.HEADER' | translate }}</span>\n </div>\n </button>\n <button\n id=\"menu-dropdowns-menu-item-footer\"\n mat-menu-item>\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-bottom\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.FOOTER' | translate }}</span>\n </div>\n </button>\n </mat-menu>\n </mat-menu>\n <button\n *ngIf=\"showLayout && !data.isViewOnly\"\n id=\"menu-dropdowns-menu-layout\"\n mat-button\n [matMenuTriggerFor]=\"layoutMenu\"\n [matMenuTriggerRestoreFocus]=\"false\">\n {{ 'NODER.LABEL.LAYOUT' | translate }}\n </button>\n <mat-menu\n #layoutMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n *ngIf=\"insertPageBreak.observed\"\n id=\"menu-dropdowns-menu-item-page-break\"\n mat-menu-item\n (click)=\"insertPageBreak.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-page-break\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.PAGE_BREAK' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+Enter</span>\n </div>\n </button>\n </mat-menu>\n <button\n *ngIf=\"showFormat && !data.isViewOnly\"\n id=\"menu-dropdowns-menu-format\"\n mat-button\n [matMenuTriggerFor]=\"formatMenu\"\n [matMenuTriggerRestoreFocus]=\"false\">\n {{ 'NODER.LABEL.FORMAT' | translate }}\n </button>\n <mat-menu\n #formatMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n id=\"menu-dropdowns-menu-item-align\"\n mat-menu-item\n [matMenuTriggerFor]=\"listAlignMenu\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-alignleft\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.ALIGN' | translate }}</span>\n </div>\n </button>\n <mat-menu\n #listAlignMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n id=\"menu-dropdowns-menu-item-align-left\"\n mat-menu-item\n (click)=\"onSelectFormat(alignments.Left)\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-alignleft\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.LEFT' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+L</span>\n </div>\n </button>\n <button\n id=\"menu-dropdowns-menu-item-align-center\"\n mat-menu-item\n (click)=\"onSelectFormat(alignments.Center)\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-aligncenter\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.CENTER' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+E</span>\n </div>\n </button>\n <button\n id=\"menu-dropdowns-menu-item-align-right\"\n mat-menu-item\n (click)=\"onSelectFormat(alignments.Right)\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-alignright\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.RIGHT' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+R</span>\n </div>\n </button>\n </mat-menu>\n <button\n id=\"menu-dropdowns-menu-item-bullets-numbering\"\n mat-menu-item\n [matMenuTriggerFor]=\"listBulletsNumberingMenu\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-bulleted\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.BULLETS_AND_NUMBERING' | translate }}</span>\n </div>\n </button>\n <mat-menu\n #listBulletsNumberingMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n id=\"menu-dropdowns-menu-item-bullets\"\n mat-menu-item\n [matMenuTriggerFor]=\"listBulletedMenu\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-bulleted\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.BULLET_LIST_MENU' | translate }}</span>\n </div>\n </button>\n <mat-menu\n #listBulletedMenu=\"matMenu\"\n class=\"dropdown-numbering-overlay noder-modal\"\n yPosition=\"below\">\n <div class=\"list-icon list-marker\">\n <mat-icon\n svgIcon=\"marker-1\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.BulletList1\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.BulletList1)\"></mat-icon>\n <mat-icon\n svgIcon=\"marker-2\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.BulletList2\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.BulletList2)\"></mat-icon>\n <mat-icon\n svgIcon=\"marker-3\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.BulletList3\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.BulletList3)\"></mat-icon>\n </div>\n <div class=\"list-icon list-marker\">\n <mat-icon\n svgIcon=\"marker-4\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.BulletList4\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.BulletList4)\"></mat-icon>\n <mat-icon\n svgIcon=\"marker-5\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.BulletList5\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.BulletList5)\"></mat-icon>\n <mat-icon\n svgIcon=\"marker-6\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.BulletList6\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.BulletList6)\"></mat-icon>\n </div>\n </mat-menu>\n <button\n id=\"menu-dropdowns-menu-item-numbering\"\n mat-menu-item\n [matMenuTriggerFor]=\"listNumberedMenu\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-numbered\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.NUMBERED_LIST_MENU' | translate }}</span>\n </div>\n </button>\n <mat-menu\n #listNumberedMenu=\"matMenu\"\n class=\"dropdown-numbering-overlay noder-modal\"\n yPosition=\"below\">\n <div class=\"list-icon list-number\">\n <mat-icon\n svgIcon=\"number-1\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.NumberList1\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.NumberList1)\"></mat-icon>\n <mat-icon\n svgIcon=\"number-2\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.NumberList2\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.NumberList2)\"></mat-icon>\n <mat-icon\n svgIcon=\"number-3\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.NumberList3\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.NumberList3)\"></mat-icon>\n </div>\n <div class=\"list-icon list-number\">\n <mat-icon\n svgIcon=\"number-4\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.NumberList4\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.NumberList4)\"></mat-icon>\n <mat-icon\n svgIcon=\"number-5\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.NumberList5\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.NumberList5)\"></mat-icon>\n <mat-icon\n svgIcon=\"number-6\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.NumberList6\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.NumberList6)\"></mat-icon>\n </div>\n </mat-menu>\n </mat-menu>\n <button\n id=\"menu-dropdowns-menu-item-text\"\n mat-menu-item\n [matMenuTriggerFor]=\"listTextMenu\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-bold\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.TEXT' | translate }}</span>\n </div>\n </button>\n <mat-menu\n #listTextMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n id=\"menu-dropdowns-menu-item-bold\"\n mat-menu-item\n (click)=\"onApplyBold()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-bold\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.BOLD' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+B</span>\n </div>\n </button>\n <button\n id=\"menu-dropdowns-menu-item-italic\"\n mat-menu-item\n (click)=\"onApplyItalic()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-italic\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.ITALIC' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+I</span>\n </div>\n </button>\n <button\n id=\"menu-dropdowns-menu-item-underlined\"\n mat-menu-item\n (click)=\"onApplyUnderline()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-underlined\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.UNDERLINED' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+U</span>\n </div>\n </button>\n </mat-menu>\n <button\n id=\"menu-dropdowns-menu-item-header-footer\"\n mat-menu-item\n class=\"hidden\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-headers-footers\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.HEADERS_AND_FOOTERS' | translate }}</span>\n </div>\n </button>\n </mat-menu>\n <mat-menu\n #tableInsert=\"matMenu\"\n class=\"insert-table noder-modal\">\n <app-nod-insert-table\n *ngIf=\"showInsertTableMenu\"\n (selectSizes)=\"insertTable.emit($event)\" />\n </mat-menu>\n</ng-container>\n", styles: [":host{display:flex;align-items:center;height:100%}.menu-buttons mat-icon{width:24px;height:24px;font-size:24px}.heading-menu{display:inline-flex;width:210px}.hot-keys{text-align:end;width:auto}.menu-item-text{white-space:nowrap;width:64%}.mat-mdc-menu-item .mat-icon{margin-right:4px;width:28px}.hidden{display:none}.list-marker,.list-number{margin:0 5px}.list-marker mat-icon,.list-number mat-icon{width:70px;height:80px;margin:0 5px}.list-marker mat-icon:hover,.list-number mat-icon:hover{border:none}.list-icon .selected,.list-icon .selected:hover,.list-number .selected,.list-number .selected:hover{border-width:2px;border-style:solid}\n"], dependencies: [{ kind: "directive", type: i3$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: InsertTableComponent, selector: "app-nod-insert-table", outputs: ["selectSizes"] }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i4$1.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i4$1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4$1.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
17703
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.5", type: MenuDropdownsComponent, isStandalone: false, selector: "app-nod-menu-dropdowns", inputs: { showFile: "showFile", showEdit: "showEdit", showInsert: "showInsert", showLayout: "showLayout", showFormat: "showFormat" }, outputs: { openFileFromDisk: "openFileFromDisk", saveAs: "saveAs", saveAsTemplate: "saveAsTemplate", downloadPdf: "downloadPdf", insertPageBreak: "insertPageBreak", createDocument: "createDocument", pageSetup: "pageSetup", rename: "rename", delete: "delete", openEditMenu: "openEditMenu", cutSelected: "cutSelected", copySelected: "copySelected", pasteClipboardData: "pasteClipboardData", selectAll: "selectAll", removeSelected: "removeSelected" }, viewQueries: [{ propertyName: "tableInsertMenu", first: true, predicate: ["tableInsert"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container\n *ngIf=\"{\n clipboardData: editorService.clipboardData$ | async,\n hasSelection: editorService.hasSelection$ | async,\n isViewOnly: editorService.isViewOnly$ | async\n } as data\">\n <button\n *ngIf=\"showFile\"\n id=\"menu-dropdowns-menu-file\"\n mat-button\n [matMenuTriggerFor]=\"fileMenu\"\n [matMenuTriggerRestoreFocus]=\"false\">\n {{ 'NODER.LABEL.FILE' | translate }}\n </button>\n <mat-menu\n #fileMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n *ngIf=\"createDocument.observed && !data.isViewOnly\"\n id=\"menu-dropdowns-menu-item-new\"\n mat-menu-item\n (click)=\"createDocument.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-add-new\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.NEW' | translate }}</span>\n </div>\n </button>\n <button\n *ngIf=\"!data.isViewOnly\"\n id=\"menu-dropdowns-menu-page-setup\"\n mat-menu-item\n (click)=\"pageSetup.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-system-file\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.PAGE_SETUP' | translate }}</span>\n </div>\n </button>\n <button\n *ngIf=\"openFileFromDisk.observed && !data.isViewOnly\"\n id=\"menu-dropdowns-menu-item-open-from\"\n mat-menu-item\n (click)=\"openFileFromDisk.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-open-from\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.OPEN_FROM' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+O</span>\n </div>\n </button>\n <button\n *ngIf=\"saveAs.observed\"\n id=\"menu-dropdowns-menu-item-save-as\"\n mat-menu-item\n (click)=\"saveAs.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-save\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.SAVE_AS' | translate }}</span>\n </div>\n </button>\n @if (saveAsTemplate.observed) {\n <button\n id=\"menu-dropdowns-menu-item-save-as-template\"\n mat-menu-item\n (click)=\"saveAsTemplate.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-save\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.SAVE_AS_TEMPLATE' | translate }}</span>\n </div>\n </button>\n }\n <button\n *ngIf=\"downloadPdf.observed\"\n id=\"menu-dropdowns-menu-item-download-pdf\"\n mat-menu-item\n (click)=\"downloadPdf.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-save\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.DOWNLOAD_PDF' | translate }}</span>\n </div>\n </button>\n <button\n *ngIf=\"rename.observed\"\n id=\"menu-dropdowns-menu-item-rename\"\n mat-menu-item\n (click)=\"rename.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-rename\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.RENAME' | translate }}</span>\n </div>\n </button>\n <button\n *ngIf=\"print.observed\"\n id=\"menu-dropdowns-menu-item-print\"\n mat-menu-item\n (click)=\"print.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-print\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.PRINT' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+P</span>\n </div>\n </button>\n <button\n *ngIf=\"delete.observed\"\n id=\"menu-dropdowns-menu-item-delete\"\n mat-menu-item\n (click)=\"delete.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-delete\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.DELETE' | translate }}</span>\n </div>\n </button>\n </mat-menu>\n <button\n *ngIf=\"showEdit\"\n id=\"menu-dropdowns-menu-edit\"\n mat-button\n [matMenuTriggerFor]=\"editMenu\"\n [matMenuTriggerRestoreFocus]=\"false\"\n (menuOpened)=\"openEditMenu.emit()\">\n {{ 'NODER.LABEL.EDIT' | translate }}\n </button>\n <mat-menu\n #editMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n *ngIf=\"undo.observed\"\n id=\"menu-dropdowns-menu-item-undo\"\n mat-menu-item\n [disabled]=\"!canUndo\"\n (click)=\"undo.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-undo\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.UNDO' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+Z</span>\n </div>\n </button>\n <button\n *ngIf=\"redo.observed\"\n id=\"menu-dropdowns-menu-item-redo\"\n mat-menu-item\n [disabled]=\"!canRedo\"\n (click)=\"redo.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-redo\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.REDO' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+Y</span>\n </div>\n </button>\n <hr class=\"noder-divider\" />\n <button\n *ngIf=\"cutSelected.observed\"\n id=\"menu-dropdowns-menu-item-cut\"\n mat-menu-item\n [disabled]=\"!data.hasSelection\"\n (click)=\"cutSelected.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-content-cut\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.CUT' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+X</span>\n </div>\n </button>\n <button\n *ngIf=\"copySelected.observed\"\n id=\"menu-dropdowns-menu-item-copy\"\n mat-menu-item\n [disabled]=\"!data.hasSelection\"\n (click)=\"copySelected.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-file-copy\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.COPY' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+C</span>\n </div>\n </button>\n <button\n *ngIf=\"pasteClipboardData.observed\"\n id=\"menu-dropdowns-menu-item-paste\"\n mat-menu-item\n [disabled]=\"!data.clipboardData?.length\"\n (click)=\"pasteClipboardData.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-content-paste\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.PASTE' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+V</span>\n </div>\n </button>\n <hr class=\"noder-divider\" />\n <button\n *ngIf=\"selectAll.observed\"\n id=\"menu-dropdowns-menu-item-select-all\"\n mat-menu-item\n (click)=\"selectAll.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-select-all\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.SELECT_ALL' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+A</span>\n </div>\n </button>\n <button\n *ngIf=\"removeSelected.observed\"\n id=\"menu-dropdowns-menu-item-delete-text\"\n mat-menu-item\n [disabled]=\"!data.hasSelection\"\n (click)=\"removeSelected.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-delete\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.DELETE' | translate }}</span>\n </div>\n </button>\n </mat-menu>\n <button\n *ngIf=\"showInsert && !data.isViewOnly\"\n #insertMenuTrigger=\"matMenuTrigger\"\n id=\"menu-dropdowns-menu-insert\"\n mat-button\n [matMenuTriggerFor]=\"insertMenu\"\n [matMenuTriggerRestoreFocus]=\"false\">\n {{ 'NODER.LABEL.INSERT' | translate }}\n </button>\n <mat-menu\n #insertMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n *ngIf=\"insertImage.observed\"\n id=\"menu-dropdowns-menu-item-image\"\n mat-menu-item\n (click)=\"insertImage.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-image\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.IMAGE' | translate }}</span>\n </div>\n </button>\n <button\n id=\"menu-dropdowns-menu-item-table\"\n mat-menu-item\n [matMenuTriggerFor]=\"tableInsert\"\n (menuOpened)=\"showInsertTableMenu = true\"\n (menuClosed)=\"onTableInsertMenuClosed()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-table\"></mat-icon>\n {{ 'NODER.LABEL.TABLE' | translate }}\n </button>\n <hr class=\"noder-divider\" />\n <button\n *ngIf=\"insertLink.observed\"\n id=\"menu-dropdowns-menu-item-link\"\n mat-menu-item\n (click)=\"insertLink.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-link-on\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.LINK' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+K</span>\n </div>\n </button>\n <button\n *ngFor=\"let element of elements\"\n id=\"menu-dropdowns-menu-item-{{ element.nameId }}\"\n mat-menu-item\n (click)=\"onCreateElement(element)\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"{{ element.icon }}\"></mat-icon>\n <span class=\"menu-item-text\">{{ element.nameTranslate | translate }}</span>\n </div>\n </button>\n <button\n id=\"menu-dropdowns-menu-item-headers-footers\"\n mat-menu-item\n class=\"hidden\"\n [matMenuTriggerFor]=\"listHeadersFootersMenu\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-headers-footers\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.HEADERS_AND_FOOTERS' | translate }}</span>\n </div>\n </button>\n <mat-menu\n #listHeadersFootersMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n id=\"menu-dropdowns-menu-item-header\"\n mat-menu-item>\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-header\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.HEADER' | translate }}</span>\n </div>\n </button>\n <button\n id=\"menu-dropdowns-menu-item-footer\"\n mat-menu-item>\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-bottom\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.FOOTER' | translate }}</span>\n </div>\n </button>\n </mat-menu>\n </mat-menu>\n <button\n *ngIf=\"showLayout && !data.isViewOnly\"\n id=\"menu-dropdowns-menu-layout\"\n mat-button\n [matMenuTriggerFor]=\"layoutMenu\"\n [matMenuTriggerRestoreFocus]=\"false\">\n {{ 'NODER.LABEL.LAYOUT' | translate }}\n </button>\n <mat-menu\n #layoutMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n *ngIf=\"insertPageBreak.observed\"\n id=\"menu-dropdowns-menu-item-page-break\"\n mat-menu-item\n (click)=\"insertPageBreak.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-page-break\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.PAGE_BREAK' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+Enter</span>\n </div>\n </button>\n </mat-menu>\n <button\n *ngIf=\"showFormat && !data.isViewOnly\"\n id=\"menu-dropdowns-menu-format\"\n mat-button\n [matMenuTriggerFor]=\"formatMenu\"\n [matMenuTriggerRestoreFocus]=\"false\">\n {{ 'NODER.LABEL.FORMAT' | translate }}\n </button>\n <mat-menu\n #formatMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n id=\"menu-dropdowns-menu-item-align\"\n mat-menu-item\n [matMenuTriggerFor]=\"listAlignMenu\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-alignleft\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.ALIGN' | translate }}</span>\n </div>\n </button>\n <mat-menu\n #listAlignMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n id=\"menu-dropdowns-menu-item-align-left\"\n mat-menu-item\n (click)=\"onSelectFormat(alignments.Left)\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-alignleft\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.LEFT' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+L</span>\n </div>\n </button>\n <button\n id=\"menu-dropdowns-menu-item-align-center\"\n mat-menu-item\n (click)=\"onSelectFormat(alignments.Center)\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-aligncenter\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.CENTER' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+E</span>\n </div>\n </button>\n <button\n id=\"menu-dropdowns-menu-item-align-right\"\n mat-menu-item\n (click)=\"onSelectFormat(alignments.Right)\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-alignright\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.RIGHT' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+R</span>\n </div>\n </button>\n </mat-menu>\n <button\n id=\"menu-dropdowns-menu-item-bullets-numbering\"\n mat-menu-item\n [matMenuTriggerFor]=\"listBulletsNumberingMenu\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-bulleted\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.BULLETS_AND_NUMBERING' | translate }}</span>\n </div>\n </button>\n <mat-menu\n #listBulletsNumberingMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n id=\"menu-dropdowns-menu-item-bullets\"\n mat-menu-item\n [matMenuTriggerFor]=\"listBulletedMenu\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-bulleted\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.BULLET_LIST_MENU' | translate }}</span>\n </div>\n </button>\n <mat-menu\n #listBulletedMenu=\"matMenu\"\n class=\"dropdown-numbering-overlay noder-modal\"\n yPosition=\"below\">\n <div class=\"list-icon list-marker\">\n <mat-icon\n svgIcon=\"marker-1\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.BulletList1\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.BulletList1)\"></mat-icon>\n <mat-icon\n svgIcon=\"marker-2\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.BulletList2\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.BulletList2)\"></mat-icon>\n <mat-icon\n svgIcon=\"marker-3\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.BulletList3\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.BulletList3)\"></mat-icon>\n </div>\n <div class=\"list-icon list-marker\">\n <mat-icon\n svgIcon=\"marker-4\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.BulletList4\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.BulletList4)\"></mat-icon>\n <mat-icon\n svgIcon=\"marker-5\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.BulletList5\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.BulletList5)\"></mat-icon>\n <mat-icon\n svgIcon=\"marker-6\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.BulletList6\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.BulletList6)\"></mat-icon>\n </div>\n </mat-menu>\n <button\n id=\"menu-dropdowns-menu-item-numbering\"\n mat-menu-item\n [matMenuTriggerFor]=\"listNumberedMenu\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-numbered\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.NUMBERED_LIST_MENU' | translate }}</span>\n </div>\n </button>\n <mat-menu\n #listNumberedMenu=\"matMenu\"\n class=\"dropdown-numbering-overlay noder-modal\"\n yPosition=\"below\">\n <div class=\"list-icon list-number\">\n <mat-icon\n svgIcon=\"number-1\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.NumberList1\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.NumberList1)\"></mat-icon>\n <mat-icon\n svgIcon=\"number-2\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.NumberList2\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.NumberList2)\"></mat-icon>\n <mat-icon\n svgIcon=\"number-3\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.NumberList3\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.NumberList3)\"></mat-icon>\n </div>\n <div class=\"list-icon list-number\">\n <mat-icon\n svgIcon=\"number-4\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.NumberList4\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.NumberList4)\"></mat-icon>\n <mat-icon\n svgIcon=\"number-5\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.NumberList5\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.NumberList5)\"></mat-icon>\n <mat-icon\n svgIcon=\"number-6\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.NumberList6\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.NumberList6)\"></mat-icon>\n </div>\n </mat-menu>\n </mat-menu>\n <button\n id=\"menu-dropdowns-menu-item-text\"\n mat-menu-item\n [matMenuTriggerFor]=\"listTextMenu\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-bold\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.TEXT' | translate }}</span>\n </div>\n </button>\n <mat-menu\n #listTextMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n id=\"menu-dropdowns-menu-item-bold\"\n mat-menu-item\n (click)=\"onApplyBold()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-bold\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.BOLD' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+B</span>\n </div>\n </button>\n <button\n id=\"menu-dropdowns-menu-item-italic\"\n mat-menu-item\n (click)=\"onApplyItalic()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-italic\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.ITALIC' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+I</span>\n </div>\n </button>\n <button\n id=\"menu-dropdowns-menu-item-underlined\"\n mat-menu-item\n (click)=\"onApplyUnderline()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-underlined\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.UNDERLINED' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+U</span>\n </div>\n </button>\n </mat-menu>\n <button\n id=\"menu-dropdowns-menu-item-header-footer\"\n mat-menu-item\n class=\"hidden\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-headers-footers\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.HEADERS_AND_FOOTERS' | translate }}</span>\n </div>\n </button>\n </mat-menu>\n <mat-menu\n #tableInsert=\"matMenu\"\n class=\"insert-table noder-modal\">\n <app-nod-insert-table\n *ngIf=\"showInsertTableMenu\"\n (selectSizes)=\"insertTable.emit($event)\" />\n </mat-menu>\n</ng-container>\n", styles: [":host{display:flex;align-items:center;height:100%}button.mat-mdc-button{letter-spacing:0}.menu-buttons mat-icon{width:24px;height:24px;font-size:24px}.heading-menu{display:inline-flex;width:210px}.hot-keys{text-align:end;width:auto}.menu-item-text{white-space:nowrap;width:64%}.mat-mdc-menu-item .mat-icon{margin-right:4px;width:28px}.hidden{display:none}.list-marker,.list-number{margin:0 5px}.list-marker mat-icon,.list-number mat-icon{width:70px;height:80px;margin:0 5px}.list-marker mat-icon:hover,.list-number mat-icon:hover{border:none}.list-icon .selected,.list-icon .selected:hover,.list-number .selected,.list-number .selected:hover{border-width:2px;border-style:solid}\n"], dependencies: [{ kind: "directive", type: i3$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: InsertTableComponent, selector: "app-nod-insert-table", outputs: ["selectSizes"] }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i4$1.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i4$1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4$1.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
18257
17704
  }
18258
17705
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: MenuDropdownsComponent, decorators: [{
18259
17706
  type: Component,
18260
- args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'app-nod-menu-dropdowns', standalone: false, template: "<ng-container\n *ngIf=\"{\n clipboardData: editorService.clipboardData$ | async,\n hasSelection: editorService.hasSelection$ | async,\n isViewOnly: editorService.isViewOnly$ | async\n } as data\">\n <button\n *ngIf=\"showFile\"\n id=\"menu-dropdowns-menu-file\"\n mat-button\n [matMenuTriggerFor]=\"fileMenu\"\n [matMenuTriggerRestoreFocus]=\"false\">\n {{ 'NODER.LABEL.FILE' | translate }}\n </button>\n <mat-menu\n #fileMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n *ngIf=\"createDocument.observed && !data.isViewOnly\"\n id=\"menu-dropdowns-menu-item-new\"\n mat-menu-item\n (click)=\"createDocument.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-add-new\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.NEW' | translate }}</span>\n </div>\n </button>\n <button\n *ngIf=\"!data.isViewOnly\"\n id=\"menu-dropdowns-menu-page-setup\"\n mat-menu-item\n (click)=\"pageSetup.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-system-file\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.PAGE_SETUP' | translate }}</span>\n </div>\n </button>\n <button\n *ngIf=\"openFileFromDisk.observed && !data.isViewOnly\"\n id=\"menu-dropdowns-menu-item-open-from\"\n mat-menu-item\n (click)=\"openFileFromDisk.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-open-from\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.OPEN_FROM' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+O</span>\n </div>\n </button>\n <button\n *ngIf=\"saveAs.observed\"\n id=\"menu-dropdowns-menu-item-save-as\"\n mat-menu-item\n (click)=\"saveAs.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-save\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.SAVE_AS' | translate }}</span>\n </div>\n </button>\n @if (saveAsTemplate.observed) {\n <button\n id=\"menu-dropdowns-menu-item-save-as-template\"\n mat-menu-item\n (click)=\"saveAsTemplate.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-save\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.SAVE_AS_TEMPLATE' | translate }}</span>\n </div>\n </button>\n }\n <button\n *ngIf=\"downloadPdf.observed\"\n id=\"menu-dropdowns-menu-item-download-pdf\"\n mat-menu-item\n (click)=\"downloadPdf.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-save\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.DOWNLOAD_PDF' | translate }}</span>\n </div>\n </button>\n <button\n *ngIf=\"rename.observed\"\n id=\"menu-dropdowns-menu-item-rename\"\n mat-menu-item\n (click)=\"rename.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-rename\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.RENAME' | translate }}</span>\n </div>\n </button>\n <button\n *ngIf=\"print.observed\"\n id=\"menu-dropdowns-menu-item-print\"\n mat-menu-item\n (click)=\"print.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-print\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.PRINT' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+P</span>\n </div>\n </button>\n <button\n *ngIf=\"delete.observed\"\n id=\"menu-dropdowns-menu-item-delete\"\n mat-menu-item\n (click)=\"delete.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-delete\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.DELETE' | translate }}</span>\n </div>\n </button>\n </mat-menu>\n <button\n *ngIf=\"showEdit\"\n id=\"menu-dropdowns-menu-edit\"\n mat-button\n [matMenuTriggerFor]=\"editMenu\"\n [matMenuTriggerRestoreFocus]=\"false\"\n (menuOpened)=\"openEditMenu.emit()\">\n {{ 'NODER.LABEL.EDIT' | translate }}\n </button>\n <mat-menu\n #editMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n *ngIf=\"undo.observed\"\n id=\"menu-dropdowns-menu-item-undo\"\n mat-menu-item\n [disabled]=\"!canUndo\"\n (click)=\"undo.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-undo\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.UNDO' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+Z</span>\n </div>\n </button>\n <button\n *ngIf=\"redo.observed\"\n id=\"menu-dropdowns-menu-item-redo\"\n mat-menu-item\n [disabled]=\"!canRedo\"\n (click)=\"redo.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-redo\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.REDO' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+Y</span>\n </div>\n </button>\n <hr class=\"noder-divider\" />\n <button\n *ngIf=\"cutSelected.observed\"\n id=\"menu-dropdowns-menu-item-cut\"\n mat-menu-item\n [disabled]=\"!data.hasSelection\"\n (click)=\"cutSelected.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-content-cut\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.CUT' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+X</span>\n </div>\n </button>\n <button\n *ngIf=\"copySelected.observed\"\n id=\"menu-dropdowns-menu-item-copy\"\n mat-menu-item\n [disabled]=\"!data.hasSelection\"\n (click)=\"copySelected.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-file-copy\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.COPY' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+C</span>\n </div>\n </button>\n <button\n *ngIf=\"pasteClipboardData.observed\"\n id=\"menu-dropdowns-menu-item-paste\"\n mat-menu-item\n [disabled]=\"!data.clipboardData?.length\"\n (click)=\"pasteClipboardData.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-content-paste\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.PASTE' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+V</span>\n </div>\n </button>\n <hr class=\"noder-divider\" />\n <button\n *ngIf=\"selectAll.observed\"\n id=\"menu-dropdowns-menu-item-select-all\"\n mat-menu-item\n (click)=\"selectAll.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-select-all\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.SELECT_ALL' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+A</span>\n </div>\n </button>\n <button\n *ngIf=\"removeSelected.observed\"\n id=\"menu-dropdowns-menu-item-delete-text\"\n mat-menu-item\n [disabled]=\"!data.hasSelection\"\n (click)=\"removeSelected.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-delete\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.DELETE' | translate }}</span>\n </div>\n </button>\n </mat-menu>\n <button\n *ngIf=\"showInsert && !data.isViewOnly\"\n #insertMenuTrigger=\"matMenuTrigger\"\n id=\"menu-dropdowns-menu-insert\"\n mat-button\n [matMenuTriggerFor]=\"insertMenu\"\n [matMenuTriggerRestoreFocus]=\"false\">\n {{ 'NODER.LABEL.INSERT' | translate }}\n </button>\n <mat-menu\n #insertMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n *ngIf=\"insertImage.observed\"\n id=\"menu-dropdowns-menu-item-image\"\n mat-menu-item\n (click)=\"insertImage.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-image\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.IMAGE' | translate }}</span>\n </div>\n </button>\n <button\n id=\"menu-dropdowns-menu-item-table\"\n mat-menu-item\n [matMenuTriggerFor]=\"tableInsert\"\n (menuOpened)=\"showInsertTableMenu = true\"\n (menuClosed)=\"onTableInsertMenuClosed()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-table\"></mat-icon>\n {{ 'NODER.LABEL.TABLE' | translate }}\n </button>\n <hr class=\"noder-divider\" />\n <button\n *ngIf=\"insertLink.observed\"\n id=\"menu-dropdowns-menu-item-link\"\n mat-menu-item\n (click)=\"insertLink.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-link-on\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.LINK' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+K</span>\n </div>\n </button>\n <button\n *ngFor=\"let element of elements\"\n id=\"menu-dropdowns-menu-item-{{ element.nameId }}\"\n mat-menu-item\n (click)=\"onCreateElement(element)\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"{{ element.icon }}\"></mat-icon>\n <span class=\"menu-item-text\">{{ element.nameTranslate | translate }}</span>\n </div>\n </button>\n <button\n id=\"menu-dropdowns-menu-item-headers-footers\"\n mat-menu-item\n class=\"hidden\"\n [matMenuTriggerFor]=\"listHeadersFootersMenu\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-headers-footers\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.HEADERS_AND_FOOTERS' | translate }}</span>\n </div>\n </button>\n <mat-menu\n #listHeadersFootersMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n id=\"menu-dropdowns-menu-item-header\"\n mat-menu-item>\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-header\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.HEADER' | translate }}</span>\n </div>\n </button>\n <button\n id=\"menu-dropdowns-menu-item-footer\"\n mat-menu-item>\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-bottom\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.FOOTER' | translate }}</span>\n </div>\n </button>\n </mat-menu>\n </mat-menu>\n <button\n *ngIf=\"showLayout && !data.isViewOnly\"\n id=\"menu-dropdowns-menu-layout\"\n mat-button\n [matMenuTriggerFor]=\"layoutMenu\"\n [matMenuTriggerRestoreFocus]=\"false\">\n {{ 'NODER.LABEL.LAYOUT' | translate }}\n </button>\n <mat-menu\n #layoutMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n *ngIf=\"insertPageBreak.observed\"\n id=\"menu-dropdowns-menu-item-page-break\"\n mat-menu-item\n (click)=\"insertPageBreak.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-page-break\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.PAGE_BREAK' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+Enter</span>\n </div>\n </button>\n </mat-menu>\n <button\n *ngIf=\"showFormat && !data.isViewOnly\"\n id=\"menu-dropdowns-menu-format\"\n mat-button\n [matMenuTriggerFor]=\"formatMenu\"\n [matMenuTriggerRestoreFocus]=\"false\">\n {{ 'NODER.LABEL.FORMAT' | translate }}\n </button>\n <mat-menu\n #formatMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n id=\"menu-dropdowns-menu-item-align\"\n mat-menu-item\n [matMenuTriggerFor]=\"listAlignMenu\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-alignleft\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.ALIGN' | translate }}</span>\n </div>\n </button>\n <mat-menu\n #listAlignMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n id=\"menu-dropdowns-menu-item-align-left\"\n mat-menu-item\n (click)=\"onSelectFormat(alignments.Left)\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-alignleft\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.LEFT' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+L</span>\n </div>\n </button>\n <button\n id=\"menu-dropdowns-menu-item-align-center\"\n mat-menu-item\n (click)=\"onSelectFormat(alignments.Center)\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-aligncenter\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.CENTER' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+E</span>\n </div>\n </button>\n <button\n id=\"menu-dropdowns-menu-item-align-right\"\n mat-menu-item\n (click)=\"onSelectFormat(alignments.Right)\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-alignright\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.RIGHT' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+R</span>\n </div>\n </button>\n </mat-menu>\n <button\n id=\"menu-dropdowns-menu-item-bullets-numbering\"\n mat-menu-item\n [matMenuTriggerFor]=\"listBulletsNumberingMenu\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-bulleted\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.BULLETS_AND_NUMBERING' | translate }}</span>\n </div>\n </button>\n <mat-menu\n #listBulletsNumberingMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n id=\"menu-dropdowns-menu-item-bullets\"\n mat-menu-item\n [matMenuTriggerFor]=\"listBulletedMenu\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-bulleted\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.BULLET_LIST_MENU' | translate }}</span>\n </div>\n </button>\n <mat-menu\n #listBulletedMenu=\"matMenu\"\n class=\"dropdown-numbering-overlay noder-modal\"\n yPosition=\"below\">\n <div class=\"list-icon list-marker\">\n <mat-icon\n svgIcon=\"marker-1\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.BulletList1\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.BulletList1)\"></mat-icon>\n <mat-icon\n svgIcon=\"marker-2\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.BulletList2\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.BulletList2)\"></mat-icon>\n <mat-icon\n svgIcon=\"marker-3\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.BulletList3\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.BulletList3)\"></mat-icon>\n </div>\n <div class=\"list-icon list-marker\">\n <mat-icon\n svgIcon=\"marker-4\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.BulletList4\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.BulletList4)\"></mat-icon>\n <mat-icon\n svgIcon=\"marker-5\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.BulletList5\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.BulletList5)\"></mat-icon>\n <mat-icon\n svgIcon=\"marker-6\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.BulletList6\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.BulletList6)\"></mat-icon>\n </div>\n </mat-menu>\n <button\n id=\"menu-dropdowns-menu-item-numbering\"\n mat-menu-item\n [matMenuTriggerFor]=\"listNumberedMenu\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-numbered\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.NUMBERED_LIST_MENU' | translate }}</span>\n </div>\n </button>\n <mat-menu\n #listNumberedMenu=\"matMenu\"\n class=\"dropdown-numbering-overlay noder-modal\"\n yPosition=\"below\">\n <div class=\"list-icon list-number\">\n <mat-icon\n svgIcon=\"number-1\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.NumberList1\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.NumberList1)\"></mat-icon>\n <mat-icon\n svgIcon=\"number-2\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.NumberList2\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.NumberList2)\"></mat-icon>\n <mat-icon\n svgIcon=\"number-3\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.NumberList3\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.NumberList3)\"></mat-icon>\n </div>\n <div class=\"list-icon list-number\">\n <mat-icon\n svgIcon=\"number-4\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.NumberList4\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.NumberList4)\"></mat-icon>\n <mat-icon\n svgIcon=\"number-5\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.NumberList5\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.NumberList5)\"></mat-icon>\n <mat-icon\n svgIcon=\"number-6\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.NumberList6\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.NumberList6)\"></mat-icon>\n </div>\n </mat-menu>\n </mat-menu>\n <button\n id=\"menu-dropdowns-menu-item-text\"\n mat-menu-item\n [matMenuTriggerFor]=\"listTextMenu\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-bold\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.TEXT' | translate }}</span>\n </div>\n </button>\n <mat-menu\n #listTextMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n id=\"menu-dropdowns-menu-item-bold\"\n mat-menu-item\n (click)=\"onApplyBold()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-bold\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.BOLD' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+B</span>\n </div>\n </button>\n <button\n id=\"menu-dropdowns-menu-item-italic\"\n mat-menu-item\n (click)=\"onApplyItalic()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-italic\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.ITALIC' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+I</span>\n </div>\n </button>\n <button\n id=\"menu-dropdowns-menu-item-underlined\"\n mat-menu-item\n (click)=\"onApplyUnderline()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-underlined\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.UNDERLINED' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+U</span>\n </div>\n </button>\n </mat-menu>\n <button\n id=\"menu-dropdowns-menu-item-header-footer\"\n mat-menu-item\n class=\"hidden\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-headers-footers\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.HEADERS_AND_FOOTERS' | translate }}</span>\n </div>\n </button>\n </mat-menu>\n <mat-menu\n #tableInsert=\"matMenu\"\n class=\"insert-table noder-modal\">\n <app-nod-insert-table\n *ngIf=\"showInsertTableMenu\"\n (selectSizes)=\"insertTable.emit($event)\" />\n </mat-menu>\n</ng-container>\n", styles: [":host{display:flex;align-items:center;height:100%}.menu-buttons mat-icon{width:24px;height:24px;font-size:24px}.heading-menu{display:inline-flex;width:210px}.hot-keys{text-align:end;width:auto}.menu-item-text{white-space:nowrap;width:64%}.mat-mdc-menu-item .mat-icon{margin-right:4px;width:28px}.hidden{display:none}.list-marker,.list-number{margin:0 5px}.list-marker mat-icon,.list-number mat-icon{width:70px;height:80px;margin:0 5px}.list-marker mat-icon:hover,.list-number mat-icon:hover{border:none}.list-icon .selected,.list-icon .selected:hover,.list-number .selected,.list-number .selected:hover{border-width:2px;border-style:solid}\n"] }]
17707
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'app-nod-menu-dropdowns', standalone: false, template: "<ng-container\n *ngIf=\"{\n clipboardData: editorService.clipboardData$ | async,\n hasSelection: editorService.hasSelection$ | async,\n isViewOnly: editorService.isViewOnly$ | async\n } as data\">\n <button\n *ngIf=\"showFile\"\n id=\"menu-dropdowns-menu-file\"\n mat-button\n [matMenuTriggerFor]=\"fileMenu\"\n [matMenuTriggerRestoreFocus]=\"false\">\n {{ 'NODER.LABEL.FILE' | translate }}\n </button>\n <mat-menu\n #fileMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n *ngIf=\"createDocument.observed && !data.isViewOnly\"\n id=\"menu-dropdowns-menu-item-new\"\n mat-menu-item\n (click)=\"createDocument.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-add-new\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.NEW' | translate }}</span>\n </div>\n </button>\n <button\n *ngIf=\"!data.isViewOnly\"\n id=\"menu-dropdowns-menu-page-setup\"\n mat-menu-item\n (click)=\"pageSetup.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-system-file\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.PAGE_SETUP' | translate }}</span>\n </div>\n </button>\n <button\n *ngIf=\"openFileFromDisk.observed && !data.isViewOnly\"\n id=\"menu-dropdowns-menu-item-open-from\"\n mat-menu-item\n (click)=\"openFileFromDisk.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-open-from\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.OPEN_FROM' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+O</span>\n </div>\n </button>\n <button\n *ngIf=\"saveAs.observed\"\n id=\"menu-dropdowns-menu-item-save-as\"\n mat-menu-item\n (click)=\"saveAs.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-save\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.SAVE_AS' | translate }}</span>\n </div>\n </button>\n @if (saveAsTemplate.observed) {\n <button\n id=\"menu-dropdowns-menu-item-save-as-template\"\n mat-menu-item\n (click)=\"saveAsTemplate.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-save\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.SAVE_AS_TEMPLATE' | translate }}</span>\n </div>\n </button>\n }\n <button\n *ngIf=\"downloadPdf.observed\"\n id=\"menu-dropdowns-menu-item-download-pdf\"\n mat-menu-item\n (click)=\"downloadPdf.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-save\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.DOWNLOAD_PDF' | translate }}</span>\n </div>\n </button>\n <button\n *ngIf=\"rename.observed\"\n id=\"menu-dropdowns-menu-item-rename\"\n mat-menu-item\n (click)=\"rename.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-rename\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.RENAME' | translate }}</span>\n </div>\n </button>\n <button\n *ngIf=\"print.observed\"\n id=\"menu-dropdowns-menu-item-print\"\n mat-menu-item\n (click)=\"print.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-print\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.PRINT' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+P</span>\n </div>\n </button>\n <button\n *ngIf=\"delete.observed\"\n id=\"menu-dropdowns-menu-item-delete\"\n mat-menu-item\n (click)=\"delete.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-delete\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.DELETE' | translate }}</span>\n </div>\n </button>\n </mat-menu>\n <button\n *ngIf=\"showEdit\"\n id=\"menu-dropdowns-menu-edit\"\n mat-button\n [matMenuTriggerFor]=\"editMenu\"\n [matMenuTriggerRestoreFocus]=\"false\"\n (menuOpened)=\"openEditMenu.emit()\">\n {{ 'NODER.LABEL.EDIT' | translate }}\n </button>\n <mat-menu\n #editMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n *ngIf=\"undo.observed\"\n id=\"menu-dropdowns-menu-item-undo\"\n mat-menu-item\n [disabled]=\"!canUndo\"\n (click)=\"undo.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-undo\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.UNDO' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+Z</span>\n </div>\n </button>\n <button\n *ngIf=\"redo.observed\"\n id=\"menu-dropdowns-menu-item-redo\"\n mat-menu-item\n [disabled]=\"!canRedo\"\n (click)=\"redo.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-redo\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.REDO' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+Y</span>\n </div>\n </button>\n <hr class=\"noder-divider\" />\n <button\n *ngIf=\"cutSelected.observed\"\n id=\"menu-dropdowns-menu-item-cut\"\n mat-menu-item\n [disabled]=\"!data.hasSelection\"\n (click)=\"cutSelected.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-content-cut\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.CUT' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+X</span>\n </div>\n </button>\n <button\n *ngIf=\"copySelected.observed\"\n id=\"menu-dropdowns-menu-item-copy\"\n mat-menu-item\n [disabled]=\"!data.hasSelection\"\n (click)=\"copySelected.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-file-copy\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.COPY' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+C</span>\n </div>\n </button>\n <button\n *ngIf=\"pasteClipboardData.observed\"\n id=\"menu-dropdowns-menu-item-paste\"\n mat-menu-item\n [disabled]=\"!data.clipboardData?.length\"\n (click)=\"pasteClipboardData.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-content-paste\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.PASTE' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+V</span>\n </div>\n </button>\n <hr class=\"noder-divider\" />\n <button\n *ngIf=\"selectAll.observed\"\n id=\"menu-dropdowns-menu-item-select-all\"\n mat-menu-item\n (click)=\"selectAll.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-select-all\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.SELECT_ALL' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+A</span>\n </div>\n </button>\n <button\n *ngIf=\"removeSelected.observed\"\n id=\"menu-dropdowns-menu-item-delete-text\"\n mat-menu-item\n [disabled]=\"!data.hasSelection\"\n (click)=\"removeSelected.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-delete\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.DELETE' | translate }}</span>\n </div>\n </button>\n </mat-menu>\n <button\n *ngIf=\"showInsert && !data.isViewOnly\"\n #insertMenuTrigger=\"matMenuTrigger\"\n id=\"menu-dropdowns-menu-insert\"\n mat-button\n [matMenuTriggerFor]=\"insertMenu\"\n [matMenuTriggerRestoreFocus]=\"false\">\n {{ 'NODER.LABEL.INSERT' | translate }}\n </button>\n <mat-menu\n #insertMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n *ngIf=\"insertImage.observed\"\n id=\"menu-dropdowns-menu-item-image\"\n mat-menu-item\n (click)=\"insertImage.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-image\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.IMAGE' | translate }}</span>\n </div>\n </button>\n <button\n id=\"menu-dropdowns-menu-item-table\"\n mat-menu-item\n [matMenuTriggerFor]=\"tableInsert\"\n (menuOpened)=\"showInsertTableMenu = true\"\n (menuClosed)=\"onTableInsertMenuClosed()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-table\"></mat-icon>\n {{ 'NODER.LABEL.TABLE' | translate }}\n </button>\n <hr class=\"noder-divider\" />\n <button\n *ngIf=\"insertLink.observed\"\n id=\"menu-dropdowns-menu-item-link\"\n mat-menu-item\n (click)=\"insertLink.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-link-on\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.LINK' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+K</span>\n </div>\n </button>\n <button\n *ngFor=\"let element of elements\"\n id=\"menu-dropdowns-menu-item-{{ element.nameId }}\"\n mat-menu-item\n (click)=\"onCreateElement(element)\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"{{ element.icon }}\"></mat-icon>\n <span class=\"menu-item-text\">{{ element.nameTranslate | translate }}</span>\n </div>\n </button>\n <button\n id=\"menu-dropdowns-menu-item-headers-footers\"\n mat-menu-item\n class=\"hidden\"\n [matMenuTriggerFor]=\"listHeadersFootersMenu\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-headers-footers\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.HEADERS_AND_FOOTERS' | translate }}</span>\n </div>\n </button>\n <mat-menu\n #listHeadersFootersMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n id=\"menu-dropdowns-menu-item-header\"\n mat-menu-item>\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-header\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.HEADER' | translate }}</span>\n </div>\n </button>\n <button\n id=\"menu-dropdowns-menu-item-footer\"\n mat-menu-item>\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-bottom\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.FOOTER' | translate }}</span>\n </div>\n </button>\n </mat-menu>\n </mat-menu>\n <button\n *ngIf=\"showLayout && !data.isViewOnly\"\n id=\"menu-dropdowns-menu-layout\"\n mat-button\n [matMenuTriggerFor]=\"layoutMenu\"\n [matMenuTriggerRestoreFocus]=\"false\">\n {{ 'NODER.LABEL.LAYOUT' | translate }}\n </button>\n <mat-menu\n #layoutMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n *ngIf=\"insertPageBreak.observed\"\n id=\"menu-dropdowns-menu-item-page-break\"\n mat-menu-item\n (click)=\"insertPageBreak.emit()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-page-break\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.PAGE_BREAK' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+Enter</span>\n </div>\n </button>\n </mat-menu>\n <button\n *ngIf=\"showFormat && !data.isViewOnly\"\n id=\"menu-dropdowns-menu-format\"\n mat-button\n [matMenuTriggerFor]=\"formatMenu\"\n [matMenuTriggerRestoreFocus]=\"false\">\n {{ 'NODER.LABEL.FORMAT' | translate }}\n </button>\n <mat-menu\n #formatMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n id=\"menu-dropdowns-menu-item-align\"\n mat-menu-item\n [matMenuTriggerFor]=\"listAlignMenu\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-alignleft\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.ALIGN' | translate }}</span>\n </div>\n </button>\n <mat-menu\n #listAlignMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n id=\"menu-dropdowns-menu-item-align-left\"\n mat-menu-item\n (click)=\"onSelectFormat(alignments.Left)\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-alignleft\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.LEFT' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+L</span>\n </div>\n </button>\n <button\n id=\"menu-dropdowns-menu-item-align-center\"\n mat-menu-item\n (click)=\"onSelectFormat(alignments.Center)\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-aligncenter\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.CENTER' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+E</span>\n </div>\n </button>\n <button\n id=\"menu-dropdowns-menu-item-align-right\"\n mat-menu-item\n (click)=\"onSelectFormat(alignments.Right)\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-alignright\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.RIGHT' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+R</span>\n </div>\n </button>\n </mat-menu>\n <button\n id=\"menu-dropdowns-menu-item-bullets-numbering\"\n mat-menu-item\n [matMenuTriggerFor]=\"listBulletsNumberingMenu\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-bulleted\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.BULLETS_AND_NUMBERING' | translate }}</span>\n </div>\n </button>\n <mat-menu\n #listBulletsNumberingMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n id=\"menu-dropdowns-menu-item-bullets\"\n mat-menu-item\n [matMenuTriggerFor]=\"listBulletedMenu\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-bulleted\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.BULLET_LIST_MENU' | translate }}</span>\n </div>\n </button>\n <mat-menu\n #listBulletedMenu=\"matMenu\"\n class=\"dropdown-numbering-overlay noder-modal\"\n yPosition=\"below\">\n <div class=\"list-icon list-marker\">\n <mat-icon\n svgIcon=\"marker-1\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.BulletList1\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.BulletList1)\"></mat-icon>\n <mat-icon\n svgIcon=\"marker-2\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.BulletList2\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.BulletList2)\"></mat-icon>\n <mat-icon\n svgIcon=\"marker-3\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.BulletList3\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.BulletList3)\"></mat-icon>\n </div>\n <div class=\"list-icon list-marker\">\n <mat-icon\n svgIcon=\"marker-4\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.BulletList4\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.BulletList4)\"></mat-icon>\n <mat-icon\n svgIcon=\"marker-5\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.BulletList5\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.BulletList5)\"></mat-icon>\n <mat-icon\n svgIcon=\"marker-6\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.BulletList6\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.BulletList6)\"></mat-icon>\n </div>\n </mat-menu>\n <button\n id=\"menu-dropdowns-menu-item-numbering\"\n mat-menu-item\n [matMenuTriggerFor]=\"listNumberedMenu\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-numbered\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.NUMBERED_LIST_MENU' | translate }}</span>\n </div>\n </button>\n <mat-menu\n #listNumberedMenu=\"matMenu\"\n class=\"dropdown-numbering-overlay noder-modal\"\n yPosition=\"below\">\n <div class=\"list-icon list-number\">\n <mat-icon\n svgIcon=\"number-1\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.NumberList1\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.NumberList1)\"></mat-icon>\n <mat-icon\n svgIcon=\"number-2\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.NumberList2\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.NumberList2)\"></mat-icon>\n <mat-icon\n svgIcon=\"number-3\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.NumberList3\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.NumberList3)\"></mat-icon>\n </div>\n <div class=\"list-icon list-number\">\n <mat-icon\n svgIcon=\"number-4\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.NumberList4\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.NumberList4)\"></mat-icon>\n <mat-icon\n svgIcon=\"number-5\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.NumberList5\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.NumberList5)\"></mat-icon>\n <mat-icon\n svgIcon=\"number-6\"\n [class.selected]=\"numberingTemplateType === numberingTemplateTypes.NumberList6\"\n (click)=\"onSelectNumberingTemplate(numberingTemplateTypes.NumberList6)\"></mat-icon>\n </div>\n </mat-menu>\n </mat-menu>\n <button\n id=\"menu-dropdowns-menu-item-text\"\n mat-menu-item\n [matMenuTriggerFor]=\"listTextMenu\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-bold\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.TEXT' | translate }}</span>\n </div>\n </button>\n <mat-menu\n #listTextMenu=\"matMenu\"\n class=\"noder-modal\">\n <button\n id=\"menu-dropdowns-menu-item-bold\"\n mat-menu-item\n (click)=\"onApplyBold()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-bold\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.BOLD' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+B</span>\n </div>\n </button>\n <button\n id=\"menu-dropdowns-menu-item-italic\"\n mat-menu-item\n (click)=\"onApplyItalic()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-italic\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.ITALIC' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+I</span>\n </div>\n </button>\n <button\n id=\"menu-dropdowns-menu-item-underlined\"\n mat-menu-item\n (click)=\"onApplyUnderline()\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-format-underlined\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.UNDERLINED' | translate }}</span>\n <span class=\"hot-keys\">Ctrl+U</span>\n </div>\n </button>\n </mat-menu>\n <button\n id=\"menu-dropdowns-menu-item-header-footer\"\n mat-menu-item\n class=\"hidden\">\n <div class=\"heading-menu\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-headers-footers\"></mat-icon>\n <span class=\"menu-item-text\">{{ 'NODER.LABEL.HEADERS_AND_FOOTERS' | translate }}</span>\n </div>\n </button>\n </mat-menu>\n <mat-menu\n #tableInsert=\"matMenu\"\n class=\"insert-table noder-modal\">\n <app-nod-insert-table\n *ngIf=\"showInsertTableMenu\"\n (selectSizes)=\"insertTable.emit($event)\" />\n </mat-menu>\n</ng-container>\n", styles: [":host{display:flex;align-items:center;height:100%}button.mat-mdc-button{letter-spacing:0}.menu-buttons mat-icon{width:24px;height:24px;font-size:24px}.heading-menu{display:inline-flex;width:210px}.hot-keys{text-align:end;width:auto}.menu-item-text{white-space:nowrap;width:64%}.mat-mdc-menu-item .mat-icon{margin-right:4px;width:28px}.hidden{display:none}.list-marker,.list-number{margin:0 5px}.list-marker mat-icon,.list-number mat-icon{width:70px;height:80px;margin:0 5px}.list-marker mat-icon:hover,.list-number mat-icon:hover{border:none}.list-icon .selected,.list-icon .selected:hover,.list-number .selected,.list-number .selected:hover{border-width:2px;border-style:solid}\n"] }]
18261
17708
  }], ctorParameters: () => [{ type: CustomIconService }, { type: i0.Injector }, { type: i0.ChangeDetectorRef }, { type: EditorService }], propDecorators: { showFile: [{
18262
17709
  type: Input
18263
17710
  }], showEdit: [{
@@ -18328,11 +17775,11 @@ class FontComponent {
18328
17775
  this.selectFont.emit(font);
18329
17776
  }
18330
17777
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: FontComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
18331
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.5", type: FontComponent, isStandalone: true, selector: "app-nod-font", inputs: { isDisabled: "isDisabled", styles: "styles" }, outputs: { selectFont: "selectFont" }, ngImport: i0, template: "<button\n mat-button\n [matMenuTriggerFor]=\"fontMenu\"\n [matMenuTriggerRestoreFocus]=\"false\"\n [matTooltip]=\"'NODER.TOOLTIP.FONT' | translate\"\n matTooltipPosition=\"below\">\n <div class=\"font-menu\">\n <span>{{ font }}</span>\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-arrow-dropdown\"></mat-icon>\n </div>\n</button>\n<mat-menu\n #fontMenu=\"matMenu\"\n class=\"noder-modal\">\n <ng-container *ngFor=\"let font of fonts\">\n <button\n mat-menu-item\n [disabled]=\"isDisabled\"\n (click)=\"onSelectFont(font)\">\n {{ font }}\n </button>\n </ng-container>\n</mat-menu>\n", styles: [".font-menu{display:flex;justify-content:space-between;align-items:center;width:130px}span{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-align:start}button{height:28px;margin:0 4px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i4$1.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i4$1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4$1.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5$2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
17778
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.5", type: FontComponent, isStandalone: true, selector: "app-nod-font", inputs: { isDisabled: "isDisabled", styles: "styles" }, outputs: { selectFont: "selectFont" }, ngImport: i0, template: "<button\n mat-button\n [matMenuTriggerFor]=\"fontMenu\"\n [matMenuTriggerRestoreFocus]=\"false\"\n [matTooltip]=\"'NODER.TOOLTIP.FONT' | translate\"\n matTooltipPosition=\"below\">\n <div class=\"font-menu\">\n <span>{{ font }}</span>\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-arrow-dropdown\"></mat-icon>\n </div>\n</button>\n<mat-menu\n #fontMenu=\"matMenu\"\n class=\"noder-modal\">\n <ng-container *ngFor=\"let font of fonts\">\n <button\n mat-menu-item\n [disabled]=\"isDisabled\"\n (click)=\"onSelectFont(font)\">\n {{ font }}\n </button>\n </ng-container>\n</mat-menu>\n", styles: [".font-menu{display:flex;justify-content:space-between;align-items:center;width:130px}span{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-align:start}button{margin:0 4px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i4$1.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i4$1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4$1.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5$2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
18332
17779
  }
18333
17780
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: FontComponent, decorators: [{
18334
17781
  type: Component,
18335
- args: [{ imports: [CommonModule, MatButtonModule, MatIconModule, MatMenuModule, MatTooltipModule, TranslateModule], selector: 'app-nod-font', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n mat-button\n [matMenuTriggerFor]=\"fontMenu\"\n [matMenuTriggerRestoreFocus]=\"false\"\n [matTooltip]=\"'NODER.TOOLTIP.FONT' | translate\"\n matTooltipPosition=\"below\">\n <div class=\"font-menu\">\n <span>{{ font }}</span>\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-arrow-dropdown\"></mat-icon>\n </div>\n</button>\n<mat-menu\n #fontMenu=\"matMenu\"\n class=\"noder-modal\">\n <ng-container *ngFor=\"let font of fonts\">\n <button\n mat-menu-item\n [disabled]=\"isDisabled\"\n (click)=\"onSelectFont(font)\">\n {{ font }}\n </button>\n </ng-container>\n</mat-menu>\n", styles: [".font-menu{display:flex;justify-content:space-between;align-items:center;width:130px}span{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-align:start}button{height:28px;margin:0 4px}\n"] }]
17782
+ args: [{ imports: [CommonModule, MatButtonModule, MatIconModule, MatMenuModule, MatTooltipModule, TranslateModule], selector: 'app-nod-font', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n mat-button\n [matMenuTriggerFor]=\"fontMenu\"\n [matMenuTriggerRestoreFocus]=\"false\"\n [matTooltip]=\"'NODER.TOOLTIP.FONT' | translate\"\n matTooltipPosition=\"below\">\n <div class=\"font-menu\">\n <span>{{ font }}</span>\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-arrow-dropdown\"></mat-icon>\n </div>\n</button>\n<mat-menu\n #fontMenu=\"matMenu\"\n class=\"noder-modal\">\n <ng-container *ngFor=\"let font of fonts\">\n <button\n mat-menu-item\n [disabled]=\"isDisabled\"\n (click)=\"onSelectFont(font)\">\n {{ font }}\n </button>\n </ng-container>\n</mat-menu>\n", styles: [".font-menu{display:flex;justify-content:space-between;align-items:center;width:130px}span{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-align:start}button{margin:0 4px}\n"] }]
18336
17783
  }], propDecorators: { isDisabled: [{
18337
17784
  type: Input
18338
17785
  }], styles: [{
@@ -19953,5 +19400,5 @@ class OperationModel {
19953
19400
  * Generated bundle index. Do not edit.
19954
19401
  */
19955
19402
 
19956
- export { AddLinkDialogComponent, AddLinkMobileComponent, Alignment, BaseCommentComponent, BaseNoderComponent, Borders, BreakTypes, CommandModel, CommandType, CommandsService, ConfirmDialogComponent, DEFAULT_BACKGROUND_COLOR, DEFAULT_EDGE_MAX_HEIGHT_MULTIPLIER, DEFAULT_FONT_COLOR, DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE, DEFAULT_HEADINGS, DEFAULT_HEADING_STYLE_ID, DEFAULT_OFFSET_AFTER_NUMBERING_MARKER, DEFAULT_PARAGRAPH_STYLE, DEFAULT_TAB_WIDTH, DEFAULT_TEXT_STYLE, DEFAULT_TOOLBAR_STYLES, DefaultImageApiService, DestroyComponent, DocumentInfo, DocumentModel, DocumentNameModel, DocxModel, DomHelper, EditorComponent, EditorMobileToolbarComponent, EditorModule, EditorService, EditorTitleComponent, EditorTitleMobileComponent, EditorToolbarComponent, EditorToolbarMode, EditorToolbarModule, EditorToolbarService, ElementDataModel, ElementModel, ExternalComponent, ExternalElementModel, ExternalElementService, FileSourceModel, FontMetrics, FormatStyleHelper, GrammarService, HYPERLINK_FONT_COLOR, HYPERLINK_HEADING_STYLE_ID, ImageApiService, ImageDataModel, LastDocumentRevisionModel, LineStyles, MenuDropdownsComponent, MenuDropdownsMobileComponent, Mode, NEW_LINE_MARKUP, NoderTranslateLoader, NumberingLevelModel, OperationModel, OperationsHistoryInfoModel, PageSetupComponent, PageType, ParagraphStyleModel, RevisionHelper, RevisionModel, SearchResultLocation, TextFormatMobileComponent, TextStyleModel, ToolbarActionsComponent };
19403
+ export { AddLinkDialogComponent, AddLinkMobileComponent, Alignment, BaseCommentComponent, BaseNoderComponent, Borders, BreakTypes, CommandModel, CommandType, CommandsService, ConfirmDialogComponent, DEFAULT_BACKGROUND_COLOR, DEFAULT_EDGE_MAX_HEIGHT_MULTIPLIER, DEFAULT_FONT_COLOR, DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE, DEFAULT_HEADINGS, DEFAULT_HEADING_STYLE_ID, DEFAULT_OFFSET_AFTER_NUMBERING_MARKER, DEFAULT_PARAGRAPH_STYLE, DEFAULT_TABLE_MARGINS, DEFAULT_TAB_WIDTH, DEFAULT_TEXT_STYLE, DEFAULT_TOOLBAR_STYLES, DefaultImageApiService, DestroyComponent, DocumentInfo, DocumentModel, DocumentNameModel, DocxModel, DomHelper, EditorComponent, EditorMobileToolbarComponent, EditorModule, EditorService, EditorTitleComponent, EditorTitleMobileComponent, EditorToolbarComponent, EditorToolbarMode, EditorToolbarModule, EditorToolbarService, ElementDataModel, ElementModel, ExternalComponent, ExternalElementModel, ExternalElementService, FileSourceModel, FontMetrics, FormatStyleHelper, GrammarService, HYPERLINK_FONT_COLOR, HYPERLINK_HEADING_STYLE_ID, ImageApiService, ImageDataModel, LastDocumentRevisionModel, LineStyles, MenuDropdownsComponent, MenuDropdownsMobileComponent, Mode, NEW_LINE_MARKUP, NoderTranslateLoader, NumberingLevelModel, OperationModel, OperationsHistoryInfoModel, PageSetupComponent, PageType, ParagraphStyleModel, RevisionHelper, RevisionModel, SearchResultLocation, TextFormatMobileComponent, TextStyleModel, ToolbarActionsComponent };
19957
19404
  //# sourceMappingURL=talrace-ngx-noder.mjs.map