@talrace/ngx-noder 0.0.40 → 0.0.42

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 (37) hide show
  1. package/assets/i18n/noder.en.json +2 -1
  2. package/assets/i18n/noder.es.json +2 -1
  3. package/assets/i18n/noder.ru.json +2 -1
  4. package/fesm2022/talrace-ngx-noder.mjs +788 -482
  5. package/fesm2022/talrace-ngx-noder.mjs.map +1 -1
  6. package/lib/apart-components/editor-ruler/editor-ruler.component.d.ts +28 -14
  7. package/lib/apart-components/editor-search-bar/editor-search-bar.component.d.ts +26 -0
  8. package/lib/editor/components/editor.component.d.ts +7 -1
  9. package/lib/editor/display/layers/highlight.layer.d.ts +16 -0
  10. package/lib/editor/display/layers/search-highlight.layer.d.ts +12 -0
  11. package/lib/editor/display/layers/selection.layer.d.ts +3 -11
  12. package/lib/editor/display/render-changes.interface.d.ts +1 -0
  13. package/lib/editor/display/render-changes.model.d.ts +1 -0
  14. package/lib/editor/display/renderer.d.ts +5 -0
  15. package/lib/editor/display/virtual.renderer.d.ts +4 -1
  16. package/lib/editor/editor.module.d.ts +10 -9
  17. package/lib/editor/execution/edit.session.d.ts +1 -0
  18. package/lib/editor/execution/editor.d.ts +21 -8
  19. package/lib/editor/gadgets/history/operation-history.d.ts +1 -0
  20. package/lib/editor/gadgets/history/operation.type.d.ts +2 -1
  21. package/lib/editor/gadgets/search/search-result.interface.d.ts +5 -0
  22. package/lib/editor/gadgets/search/search.d.ts +14 -30
  23. package/lib/editor/interaction/editor.service.d.ts +48 -16
  24. package/lib/editor/operations/enums/command-type.enum.d.ts +2 -1
  25. package/lib/editor/operations/helpers/paragraph-operations.helper.d.ts +1 -0
  26. package/lib/editor/operations/operations-helper.helper.d.ts +1 -0
  27. package/lib/editor/operations/save-commands.helper.d.ts +1 -0
  28. package/lib/models/generated/apply-paragraphs.model.d.ts +5 -0
  29. package/lib/models/generated/command.model.d.ts +2 -0
  30. package/package.json +1 -1
  31. package/public-api.d.ts +0 -1
  32. package/src/_ngx-noder.theme.scss +2 -0
  33. package/src/lib/apart-components/editor-search-bar/_theme.scss +28 -0
  34. package/src/scss/base-editor.scss +13 -3
  35. package/lib/apart-components/editor-search/editor-search-dialog.component.d.ts +0 -23
  36. package/lib/editor/gadgets/search/replace.interface.d.ts +0 -4
  37. package/lib/editor/gadgets/search/search-iteration.interface.d.ts +0 -4
@@ -1,41 +1,42 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Directive, Injectable, inject, ChangeDetectorRef, HostBinding, Input, InjectionToken, createComponent, Component, ChangeDetectionStrategy, ViewChild, EventEmitter, Output, HostListener, signal, NgModule, Inject } from '@angular/core';
3
- import { Subject, BehaviorSubject, fromEvent, throttleTime, take, filter, startWith, takeUntil, catchError, debounceTime, distinctUntilChanged } from 'rxjs';
2
+ import { Directive, Injectable, inject, ChangeDetectorRef, HostBinding, Input, Component, ChangeDetectionStrategy, ViewChild, InjectionToken, createComponent, EventEmitter, Output, HostListener, input, signal, computed, effect, NgModule, Inject } from '@angular/core';
3
+ import { Subject, BehaviorSubject, fromEvent, throttleTime, take, filter, debounceTime, distinctUntilChanged, startWith, takeUntil, tap, map, catchError } from 'rxjs';
4
4
  import * as i1$1 from '@angular/common/http';
5
5
  import { HttpHeaders } from '@angular/common/http';
6
6
  import * as i3 from '@angular/common';
7
7
  import { CommonModule, AsyncPipe } from '@angular/common';
8
+ import * as i2 from '@angular/forms';
9
+ import { FormControl, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
10
+ import * as i4 from '@angular/material/button';
11
+ import { MatButtonModule } from '@angular/material/button';
12
+ import * as i5 from '@angular/material/icon';
13
+ import { MatIconModule } from '@angular/material/icon';
14
+ import * as i6 from '@angular/material/input';
15
+ import { MatInputModule } from '@angular/material/input';
16
+ import * as i5$2 from '@angular/material/tooltip';
17
+ import { MatTooltipModule } from '@angular/material/tooltip';
18
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
19
+ import * as i3$1 from '@ngx-translate/core';
20
+ import { TranslateModule } from '@ngx-translate/core';
21
+ import * as i5$1 from '@angular/material/form-field';
22
+ import { MatFormFieldModule } from '@angular/material/form-field';
8
23
  import { ComponentPortal } from '@angular/cdk/portal';
9
24
  import * as i1 from '@angular/cdk/overlay';
10
25
  import { OverlayConfig } from '@angular/cdk/overlay';
11
- import * as i3$1 from '@ngx-translate/core';
12
- import { TranslateModule } from '@ngx-translate/core';
13
- import * as i5 from '@angular/material/icon';
14
- import { MatIconModule } from '@angular/material/icon';
15
- import * as i5$1 from '@angular/cdk/clipboard';
16
- import * as i7 from '@angular/material/sidenav';
26
+ import * as i5$3 from '@angular/cdk/clipboard';
27
+ import * as i8 from '@angular/material/sidenav';
17
28
  import { MatSidenavModule } from '@angular/material/sidenav';
18
- import * as i4 from '@angular/material/button';
19
- import { MatButtonModule } from '@angular/material/button';
20
29
  import * as i1$2 from '@angular/material/dialog';
21
30
  import { MatDialogModule, MAT_DIALOG_DATA } from '@angular/material/dialog';
22
- import * as i5$2 from '@angular/material/tooltip';
23
- import { MatTooltipModule } from '@angular/material/tooltip';
24
- import * as i2 from '@angular/forms';
25
- import { ReactiveFormsModule, FormControl, FormsModule, Validators } from '@angular/forms';
26
31
  import { TranslateHttpLoader } from '@ngx-translate/http-loader';
27
32
  import * as i4$1 from '@angular/material/menu';
28
33
  import { MatMenuModule } from '@angular/material/menu';
29
- import * as i6 from '@angular/material/input';
30
- import { MatInputModule } from '@angular/material/input';
31
- import * as i5$3 from '@angular/material/form-field';
32
- import { MatFormFieldModule } from '@angular/material/form-field';
33
34
  import * as i4$2 from '@angular/material/expansion';
34
35
  import { MatExpansionModule } from '@angular/material/expansion';
35
36
  import * as i2$1 from '@angular/platform-browser';
36
37
  import * as i2$2 from '@angular/material/autocomplete';
37
38
  import { MatAutocompleteModule } from '@angular/material/autocomplete';
38
- import * as i8 from '@angular/material/select';
39
+ import * as i8$1 from '@angular/material/select';
39
40
  import { MatSelectModule } from '@angular/material/select';
40
41
  import * as i3$2 from '@angular/material/core';
41
42
  import * as i5$4 from 'ngx-colors';
@@ -53,9 +54,9 @@ const DocumentInfo = {
53
54
  height: 1123,
54
55
  pagesSpace: 8,
55
56
  paddingTop: 96,
56
- paddingRight: 48,
57
+ paddingRight: 96,
57
58
  paddingBottom: 96,
58
- paddingLeft: 48,
59
+ paddingLeft: 96,
59
60
  paddingHeader: 48,
60
61
  paddingFooter: 48
61
62
  };
@@ -431,6 +432,14 @@ class OperationsHistoryInfoModel {
431
432
  }
432
433
  }
433
434
 
435
+ class PageFormatModel {
436
+ constructor(fields) {
437
+ if (fields) {
438
+ Object.assign(this, fields);
439
+ }
440
+ }
441
+ }
442
+
434
443
  class EditorService {
435
444
  constructor() {
436
445
  this._styles$ = new BehaviorSubject({});
@@ -441,10 +450,15 @@ class EditorService {
441
450
  this._hasSelection$ = new BehaviorSubject(false);
442
451
  this._historyInfo$ = new BehaviorSubject(new OperationsHistoryInfoModel(-1, -1));
443
452
  this._toggleSidenav$ = new Subject();
444
- this._openSearchDialog$ = new Subject();
445
- this._searchOptions$ = new Subject();
446
- this._searchIteration$ = new Subject();
447
- this._replace$ = new Subject();
453
+ this._displaySearchBar$ = new Subject();
454
+ this._searchTerm$ = new Subject();
455
+ this._dialogSearchTerm$ = new Subject();
456
+ this._replaceTerm$ = new Subject();
457
+ this._searchPrevious$ = new Subject();
458
+ this._searchNext$ = new Subject();
459
+ this._replaceCurrent$ = new Subject();
460
+ this._currentSearchResultIndex$ = new Subject();
461
+ this._searchResultCount$ = new Subject();
448
462
  this._setTextStyles$ = new Subject();
449
463
  this._setParagraphStyles$ = new Subject();
450
464
  this._setNumberingTemplateType$ = new Subject();
@@ -487,6 +501,13 @@ class EditorService {
487
501
  this._applyDocumentPageFormat$ = new Subject();
488
502
  this._insertPageFormat$ = new Subject();
489
503
  this._applyPageFormat$ = new Subject();
504
+ this._pageFormat$ = new BehaviorSubject(new PageFormatModel());
505
+ this._leftMarginPageFormat$ = new Subject();
506
+ this._rightMarginPageFormat$ = new Subject();
507
+ this._firstLinePosition$ = new Subject();
508
+ this._leftIndentParagraph$ = new Subject();
509
+ this._rightIndentParagraph$ = new Subject();
510
+ this._paragraphStyle$ = new BehaviorSubject(new ParagraphStyleModel());
490
511
  }
491
512
  set styles(value) {
492
513
  this._styles$.next({ ...value });
@@ -521,29 +542,35 @@ class EditorService {
521
542
  get toggleSidenav$() {
522
543
  return this._toggleSidenav$.asObservable();
523
544
  }
524
- set openSearchDialog(value) {
525
- this._openSearchDialog$.next(value);
545
+ get displaySearchBar$() {
546
+ return this._displaySearchBar$.asObservable();
547
+ }
548
+ get searchTerm$() {
549
+ return this._searchTerm$.asObservable();
526
550
  }
527
- get openSearchDialog$() {
528
- return this._openSearchDialog$.asObservable();
551
+ get dialogSearchTerm$() {
552
+ return this._dialogSearchTerm$.asObservable();
529
553
  }
530
- set searchOptions(value) {
531
- this._searchOptions$.next(value);
554
+ get replaceTerm$() {
555
+ return this._replaceTerm$.asObservable();
532
556
  }
533
- get searchOptions$() {
534
- return this._searchOptions$.asObservable();
557
+ get searchPrevious$() {
558
+ return this._searchPrevious$.asObservable();
535
559
  }
536
- set searchIteration(value) {
537
- this._searchIteration$.next(value);
560
+ get searchNext$() {
561
+ return this._searchNext$.asObservable();
538
562
  }
539
- get searchIteration$() {
540
- return this._searchIteration$.asObservable();
563
+ get replaceCurrent$() {
564
+ return this._replaceCurrent$.asObservable();
541
565
  }
542
- set replace(value) {
543
- this._replace$.next(value);
566
+ get currentSearchResultIndex$() {
567
+ return this._currentSearchResultIndex$.asObservable();
544
568
  }
545
- get replace$() {
546
- return this._replace$.asObservable();
569
+ set searchResultCount(value) {
570
+ this._searchResultCount$.next(value);
571
+ }
572
+ get searchResultCount$() {
573
+ return this._searchResultCount$.asObservable();
547
574
  }
548
575
  get setTextStyles$() {
549
576
  return this._setTextStyles$.asObservable();
@@ -679,22 +706,61 @@ class EditorService {
679
706
  return this._applyPageFormat$.asObservable();
680
707
  }
681
708
  get pageFormat() {
682
- return this._pageFormat;
709
+ return this._pageFormat$.value;
710
+ }
711
+ get pageFormat$() {
712
+ return this._pageFormat$.asObservable();
713
+ }
714
+ get leftMarginPageFormat$() {
715
+ return this._leftMarginPageFormat$.asObservable();
716
+ }
717
+ get rightMarginPageFormat$() {
718
+ return this._rightMarginPageFormat$.asObservable();
719
+ }
720
+ get firstLinePosition$() {
721
+ return this._firstLinePosition$.asObservable();
722
+ }
723
+ get leftIndentParagraph$() {
724
+ return this._leftIndentParagraph$.asObservable();
725
+ }
726
+ get rightIndentParagraph$() {
727
+ return this._rightIndentParagraph$.asObservable();
728
+ }
729
+ get paragraphStyle$() {
730
+ return this._paragraphStyle$.asObservable();
731
+ }
732
+ applyFirstLinePosition(value) {
733
+ this._firstLinePosition$.next(value);
734
+ }
735
+ applyLeftIndentParagraph(value) {
736
+ this._leftIndentParagraph$.next(value);
737
+ }
738
+ applyRightIndentParagraph(value) {
739
+ this._rightIndentParagraph$.next(value);
740
+ }
741
+ paragraphStyle(value) {
742
+ this._paragraphStyle$.next(value);
743
+ }
744
+ applyRightMarginPageFormat(value) {
745
+ this._rightMarginPageFormat$.next(value);
746
+ }
747
+ applyLeftMarginPageFormat(value) {
748
+ this._leftMarginPageFormat$.next(value);
683
749
  }
684
750
  applyDocumentPageFormat(value) {
685
- this._pageFormat = value;
751
+ this.setPageFormat(value);
686
752
  this._applyDocumentPageFormat$.next(value);
687
753
  }
688
754
  applyPageFormat(value) {
689
- this._pageFormat = value;
755
+ this.setPageFormat(value);
690
756
  this._applyPageFormat$.next(value);
691
757
  }
692
758
  insertPageFormat(value) {
693
- this._pageFormat = value;
759
+ this.setPageFormat(value);
694
760
  this._insertPageFormat$.next(value);
695
761
  }
696
762
  setPageFormat(value) {
697
- this._pageFormat = value;
763
+ this._pageFormat$.next(value);
698
764
  }
699
765
  setLastPageNumber(value) {
700
766
  if (this.lastPageNumber === value) {
@@ -844,6 +910,33 @@ class EditorService {
844
910
  removeCustomElementsData(elements) {
845
911
  this._removeCustomElementsData$.next(elements);
846
912
  }
913
+ setNewSearchTerm(term) {
914
+ this._searchTerm$.next(term);
915
+ }
916
+ setNewReplaceTerm(term) {
917
+ this._replaceTerm$.next(term);
918
+ }
919
+ setDialogSearchTerm(term) {
920
+ this._dialogSearchTerm$.next(term);
921
+ }
922
+ goNextSearchResult() {
923
+ this._searchNext$.next();
924
+ }
925
+ goPreviousSearchResult() {
926
+ this._searchPrevious$.next();
927
+ }
928
+ replaceCurrentSearchResult() {
929
+ this._replaceCurrent$.next();
930
+ }
931
+ setDisplaySearchBar(show) {
932
+ this._displaySearchBar$.next(show);
933
+ }
934
+ setSearchResultCount(count) {
935
+ this._searchResultCount$.next(count);
936
+ }
937
+ setCurrentSearchResultIndex(index) {
938
+ this._currentSearchResultIndex$.next(index);
939
+ }
847
940
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: EditorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
848
941
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: EditorService }); }
849
942
  }
@@ -1008,6 +1101,7 @@ var CommandType;
1008
1101
  CommandType[CommandType["InsertPageFormat"] = 33] = "InsertPageFormat";
1009
1102
  CommandType[CommandType["RemoveInsertedPageFormat"] = 34] = "RemoveInsertedPageFormat";
1010
1103
  CommandType[CommandType["RestorePageFormats"] = 35] = "RestorePageFormats";
1104
+ CommandType[CommandType["ApplyParagraphs"] = 36] = "ApplyParagraphs";
1011
1105
  })(CommandType || (CommandType = {}));
1012
1106
 
1013
1107
  class PageNumbersModel {
@@ -1037,14 +1131,6 @@ class AddNumberingModel {
1037
1131
  }
1038
1132
  }
1039
1133
 
1040
- class PageFormatModel {
1041
- constructor(fields) {
1042
- if (fields) {
1043
- Object.assign(this, fields);
1044
- }
1045
- }
1046
- }
1047
-
1048
1134
  class ApplyDocumentPageFormatModel {
1049
1135
  constructor(fields) {
1050
1136
  if (fields) {
@@ -1075,6 +1161,14 @@ class ApplyPageFormatModel {
1075
1161
  }
1076
1162
  }
1077
1163
 
1164
+ class ApplyParagraphsModel {
1165
+ constructor(fields) {
1166
+ if (fields) {
1167
+ Object.assign(this, fields);
1168
+ }
1169
+ }
1170
+ }
1171
+
1078
1172
  class ApplyParagraphStyleModel {
1079
1173
  constructor(fields) {
1080
1174
  if (fields) {
@@ -1859,6 +1953,11 @@ class OperationHistory {
1859
1953
  const undoStep = new RestoreParagraphStylesModel({ paragraphs });
1860
1954
  this.addToHistory(undoStep, redoStep);
1861
1955
  }
1956
+ pushApplyParagraphs(oldParagraphs, updatedParagraphs) {
1957
+ const redoStep = new ApplyParagraphsModel({ paragraphs: updatedParagraphs });
1958
+ const undoStep = new ApplyParagraphsModel({ paragraphs: oldParagraphs });
1959
+ this.addToHistory(undoStep, redoStep);
1960
+ }
1862
1961
  pushInsertTableRows(insertIndex, rowsCount, targetIndex, inheritIndex) {
1863
1962
  const redoStep = new InsertTableRowsModel({ insertIndex, count: rowsCount, targetIndex, inheritIndex });
1864
1963
  const undoStep = new RemoveTableRowsModel({ insertIndex, startIndex: targetIndex, endIndex: targetIndex + rowsCount - 1 });
@@ -3857,6 +3956,11 @@ class ParagraphOperationsHelper {
3857
3956
  this.applyParagraphStyles(paragraphs[index].paragraphStyle, style);
3858
3957
  }
3859
3958
  }
3959
+ static applyParagraphs(paragraphs, updatedParagraphs) {
3960
+ for (const paragraph of updatedParagraphs) {
3961
+ this.applySingle(paragraphs, paragraph.insertIndex, paragraph.paragraphStyle);
3962
+ }
3963
+ }
3860
3964
  static applyParagraphStyles(target, value) {
3861
3965
  target.alignment = value.alignment ?? target.alignment;
3862
3966
  target.backgroundColor = value.backgroundColor ?? target.backgroundColor;
@@ -4500,6 +4604,11 @@ class OperationsHelper {
4500
4604
  this.restore(document, model.restore);
4501
4605
  break;
4502
4606
  }
4607
+ case CommandType.ApplyParagraphs: {
4608
+ const model = command.applyParagraphs;
4609
+ this.applyParagraphs(contents, model.paragraphs);
4610
+ break;
4611
+ }
4503
4612
  }
4504
4613
  });
4505
4614
  }
@@ -4777,6 +4886,9 @@ class OperationsHelper {
4777
4886
  static applyParagraphStyle(document, startIndex, endIndex, style) {
4778
4887
  ParagraphOperationsHelper.apply(document.paragraphs, startIndex, endIndex, style);
4779
4888
  }
4889
+ static applyParagraphs(document, paragraphs) {
4890
+ ParagraphOperationsHelper.applyParagraphs(document.paragraphs, paragraphs);
4891
+ }
4780
4892
  static applyImageStyle(document, image) {
4781
4893
  ImageOperationsHelper.apply(document.images, image);
4782
4894
  }
@@ -6183,6 +6295,9 @@ class Range {
6183
6295
  this.end = end;
6184
6296
  }
6185
6297
  isEqual(range) {
6298
+ if (this == null || range == null) {
6299
+ return this == null && range == null;
6300
+ }
6186
6301
  return (this.start.row === range.start.row &&
6187
6302
  this.end.row === range.end.row &&
6188
6303
  this.start.column === range.start.column &&
@@ -6359,6 +6474,9 @@ class CommandModel {
6359
6474
  if (fields.applyPageFormat) {
6360
6475
  fields.applyPageFormat = new ApplyPageFormatModel(fields.applyPageFormat);
6361
6476
  }
6477
+ if (fields.applyParagraphs) {
6478
+ fields.applyParagraphs = new ApplyParagraphsModel(fields.applyParagraphs);
6479
+ }
6362
6480
  if (fields.applyParagraphStyle) {
6363
6481
  fields.applyParagraphStyle = new ApplyParagraphStyleModel(fields.applyParagraphStyle);
6364
6482
  }
@@ -6538,6 +6656,10 @@ class SaveCommandsHelper {
6538
6656
  const restoreParagraphStyles = new RestoreParagraphStylesModel({ paragraphs });
6539
6657
  return new CommandModel({ commandType: CommandType.RestoreParagraphStyles, restoreParagraphStyles, targets });
6540
6658
  }
6659
+ static getApplyParagraphsCommand(paragraphs, targets) {
6660
+ const applyParagraphs = new ApplyParagraphsModel({ paragraphs });
6661
+ return new CommandModel({ commandType: CommandType.ApplyParagraphs, applyParagraphs, targets });
6662
+ }
6541
6663
  static getRestoreCommand(restore, targets) {
6542
6664
  return new CommandModel({ commandType: CommandType.Restore, restore, targets });
6543
6665
  }
@@ -6586,233 +6708,85 @@ class SaveCommandsHelper {
6586
6708
  }
6587
6709
  }
6588
6710
 
6589
- class SearchOptions {
6590
- }
6591
6711
  class Search {
6592
6712
  constructor() {
6593
- this.options = {};
6713
+ this.term = '';
6594
6714
  }
6595
- set(options) {
6596
- this.options = Object.assign({}, options);
6715
+ get currentMatchIndex() {
6716
+ return this.currentIndex + 1;
6597
6717
  }
6598
- find(session) {
6599
- const options = this.options;
6600
- this.setMatchIterator(session, options);
6601
- const iterator = this.forEach;
6602
- if (!iterator) {
6603
- return null;
6604
- }
6605
- let firstRange = null;
6606
- iterator((startRow, startColumn, endRow, endColumn) => {
6607
- firstRange = new Range(new CursorParagraph(startRow, startColumn), new CursorParagraph(endRow, endColumn));
6608
- if (startColumn === endColumn &&
6609
- options.start instanceof Range &&
6610
- options.start.start &&
6611
- options.skipCurrent !== false &&
6612
- firstRange.isEqual(options.start)) {
6613
- firstRange = null;
6614
- return false;
6615
- }
6616
- return true;
6617
- });
6618
- return firstRange;
6718
+ get currentMatch() {
6719
+ return this.currentIndex < 0 ? null : this.allMatches[this.currentIndex];
6619
6720
  }
6620
- assembleRegExp(options) {
6621
- let needle = options.term;
6622
- if (!options.term) {
6623
- options.regex = null;
6624
- return options.regex;
6625
- }
6626
- let modifier = 'gmi';
6627
- options.isMultiLine = /[\n\r]/.test(needle);
6628
- if (options.isMultiLine) {
6629
- options.regex = this.assembleMultilineRegExp(needle, modifier);
6630
- return options.regex;
6721
+ setSearchTerm(term) {
6722
+ this.term = term;
6723
+ }
6724
+ findAll(sessions) {
6725
+ this.allMatches = [];
6726
+ this.assembleRegExp(this.term);
6727
+ if (!this.regex) {
6728
+ return;
6631
6729
  }
6632
- let regular;
6633
- try {
6634
- regular = new RegExp(needle, modifier);
6730
+ for (const { session, sessionId, renderer } of sessions) {
6731
+ const sessionHighlights = [];
6732
+ for (let i = 0; i < session.displayData.paragraphs.length; i++) {
6733
+ const paragraph = session.displayData.paragraphs[i];
6734
+ const matches = paragraph.content.matchAll(this.regex);
6735
+ for (const match of matches) {
6736
+ const range = new Range(new CursorParagraph(i, match.index), new CursorParagraph(i, match.index + match[0].length));
6737
+ this.allMatches.push({ sessionId, range });
6738
+ sessionHighlights.push(range);
6739
+ }
6740
+ }
6741
+ renderer.updateSearchHighlights(sessionHighlights);
6635
6742
  }
6636
- catch {
6637
- regular = null;
6743
+ if (!this.allMatches.length) {
6744
+ this.currentIndex = -1;
6745
+ return;
6638
6746
  }
6639
- options.regex = regular;
6640
- return options.regex;
6747
+ this.currentIndex = this.currentIndex > this.allMatches.length - 1 ? this.allMatches.length - 1 : this.currentIndex;
6641
6748
  }
6642
- assembleMultilineRegExp(needle, modifier) {
6643
- const parts = needle.replace(/\r\n|\r|\n/g, '$\n^').split('\n');
6644
- const regex = [];
6645
- for (const element of parts) {
6646
- try {
6647
- regex.push(new RegExp(element, modifier));
6648
- }
6649
- catch {
6650
- return [];
6651
- }
6749
+ goNext(selection, currentSessionId) {
6750
+ if (!this.allMatches?.length) {
6751
+ return;
6652
6752
  }
6653
- return regex;
6753
+ let newIndex = this.allMatches.findIndex(x => (x.sessionId === currentSessionId &&
6754
+ x.range.start.row === selection.cursor.row &&
6755
+ x.range.start.column > selection.cursor.column) ||
6756
+ (x.sessionId === currentSessionId && x.range.start.row > selection.cursor.row) ||
6757
+ x.sessionId > currentSessionId);
6758
+ this.currentIndex = newIndex < 0 ? 0 : newIndex;
6654
6759
  }
6655
- setMatchIterator(session, options) {
6656
- const regex = this.assembleRegExp(options);
6657
- if (!regex) {
6658
- return null;
6659
- }
6660
- const backwards = options.backwards ?? false;
6661
- const skipCurrent = options.skipCurrent ?? false;
6662
- let start = options.start;
6663
- if (!start) {
6664
- start = session.selection.range;
6665
- }
6666
- let startParagraphPosition;
6667
- if (start instanceof Range && start.start) {
6668
- startParagraphPosition = start[skipCurrent !== backwards ? 'end' : 'start'];
6669
- }
6670
- let firstRow = 0;
6671
- let lastRow = session.displayData.paragraphs.length - 2;
6672
- this.setForEach(backwards, startParagraphPosition, options, firstRow, lastRow);
6673
- const singleRe = regex;
6674
- this.setForEachInLine(regex, options, backwards, session, singleRe);
6675
- }
6676
- setForEach(backwards, startParagraphPosition, options, firstRow, lastRow) {
6677
- if (backwards) {
6678
- this.setForEachForBackwards(startParagraphPosition, options, firstRow, lastRow);
6760
+ goPrevious(selection, currentSessionId) {
6761
+ if (!this.allMatches?.length) {
6679
6762
  return;
6680
6763
  }
6681
- this.setDefaultForEach(startParagraphPosition, options, firstRow, lastRow);
6682
- }
6683
- setDefaultForEach(startParagraphPosition, options, firstRow, lastRow) {
6684
- this.forEach = callback => {
6685
- let row = startParagraphPosition.row;
6686
- if (this.forEachInLine(row, startParagraphPosition.column, callback)) {
6687
- return;
6688
- }
6689
- for (row = row + 1; row <= lastRow; row++) {
6690
- if (this.forEachInLine(row, 0, callback)) {
6691
- return;
6692
- }
6693
- }
6694
- if (options.wrap === false) {
6695
- return;
6696
- }
6697
- for (row = firstRow, lastRow = startParagraphPosition.row; row <= lastRow; row++) {
6698
- if (this.forEachInLine(row, 0, callback)) {
6699
- return;
6700
- }
6701
- }
6702
- };
6703
- }
6704
- setForEachForBackwards(startParagraphPosition, options, firstRow, lastRow) {
6705
- this.forEach = callback => {
6706
- let row = startParagraphPosition.row;
6707
- if (this.forEachInLine(row, startParagraphPosition.column, callback)) {
6708
- return;
6709
- }
6710
- for (row--; row >= firstRow; row--) {
6711
- if (this.forEachInLine(row, Number.MAX_VALUE, callback)) {
6712
- return;
6713
- }
6714
- }
6715
- if (options.wrap === false) {
6716
- return;
6717
- }
6718
- for (row = lastRow, firstRow = startParagraphPosition.row; row >= firstRow; row--) {
6719
- if (this.forEachInLine(row, Number.MAX_VALUE, callback)) {
6720
- return;
6721
- }
6764
+ let prevIndex = -1;
6765
+ for (let i = this.allMatches.length - 1; i >= 0; i--) {
6766
+ const match = this.allMatches[i];
6767
+ if ((match.sessionId === currentSessionId &&
6768
+ match.range.start.row === selection.cursor.row &&
6769
+ match.range.start.column < selection.cursor.column) ||
6770
+ (match.sessionId === currentSessionId && match.range.start.row < selection.cursor.row) ||
6771
+ match.sessionId < currentSessionId) {
6772
+ prevIndex = i;
6773
+ break;
6722
6774
  }
6723
- };
6775
+ }
6776
+ this.currentIndex = prevIndex >= 0 ? prevIndex : this.allMatches.length - 1;
6724
6777
  }
6725
- setForEachInLine(re, options, backwards, session, singleRe) {
6726
- if (Array.isArray(re) && options.isMultiLine) {
6727
- this.setForEachInLineForRegArray(re, backwards, session);
6778
+ assembleRegExp(term) {
6779
+ if (!term) {
6780
+ this.regex = null;
6781
+ return;
6728
6782
  }
6729
- else if (backwards) {
6730
- this.setForEachInLineForBackwards(session, singleRe);
6783
+ try {
6784
+ this.regex = new RegExp(term, 'gmi');
6731
6785
  }
6732
- else {
6733
- this.setDefaultForEachInLine(session, singleRe);
6786
+ catch {
6787
+ this.regex = null;
6734
6788
  }
6735
6789
  }
6736
- setForEachInLineForRegArray(regex, backwards, session) {
6737
- let regularLength = regex.length;
6738
- this.forEachInLine = (row, offset, callback) => {
6739
- let startRow = backwards ? row - regularLength + 1 : row;
6740
- if (startRow < 0) {
6741
- return false;
6742
- }
6743
- let line = session.displayData.getParagraphContent(startRow);
6744
- let startIndex = line.search(regex[0]);
6745
- if ((!backwards && startIndex < offset) || startIndex === -1) {
6746
- return false;
6747
- }
6748
- for (let i = 1; i < regularLength; i++) {
6749
- line = session.displayData.getParagraphContent(startRow + i);
6750
- if (line.search(regex[i]) === -1) {
6751
- return false;
6752
- }
6753
- }
6754
- let endIndex = line.match(regex[regularLength - 1])[0].length;
6755
- if (backwards && endIndex > offset) {
6756
- return false;
6757
- }
6758
- if (callback(startRow, startIndex, startRow + regularLength - 1, endIndex)) {
6759
- return true;
6760
- }
6761
- return false;
6762
- };
6763
- }
6764
- setForEachInLineForBackwards(session, singleRe) {
6765
- this.forEachInLine = (row, endIndex, callback) => {
6766
- let line = session.displayData.getParagraphContent(row);
6767
- let matches = [];
6768
- let regexResult, last = 0;
6769
- singleRe.lastIndex = 0;
6770
- while ((regexResult = singleRe.exec(line))) {
6771
- let length = regexResult[0].length;
6772
- last = regexResult.index;
6773
- if (!length) {
6774
- if (last >= line.length) {
6775
- break;
6776
- }
6777
- singleRe.lastIndex = last + 1;
6778
- }
6779
- if (regexResult.index + length > endIndex) {
6780
- break;
6781
- }
6782
- matches.push(regexResult.index, length);
6783
- }
6784
- for (let i = matches.length - 1; i >= 0; i -= 2) {
6785
- let column = matches[i - 1];
6786
- let length = matches[i];
6787
- if (callback(row, column, row, column + length)) {
6788
- return true;
6789
- }
6790
- }
6791
- return false;
6792
- };
6793
- }
6794
- setDefaultForEachInLine(session, singleRe) {
6795
- this.forEachInLine = (row, startIndex, callback) => {
6796
- let line = session.displayData.getParagraphContent(row);
6797
- let last;
6798
- let regexResult;
6799
- singleRe.lastIndex = startIndex;
6800
- while ((regexResult = singleRe.exec(line))) {
6801
- let length = regexResult[0].length;
6802
- last = regexResult.index;
6803
- if (callback(row, last, row, last + length)) {
6804
- return true;
6805
- }
6806
- if (!length) {
6807
- singleRe.lastIndex = last += 1;
6808
- if (last >= line.length) {
6809
- return false;
6810
- }
6811
- }
6812
- }
6813
- return false;
6814
- };
6815
- }
6816
6790
  }
6817
6791
 
6818
6792
  class Selection {
@@ -7306,8 +7280,7 @@ class Editor {
7306
7280
  this.focus();
7307
7281
  this.session.applyToolbarStyles();
7308
7282
  this.search = new Search();
7309
- this.search.set({ wrap: true });
7310
- this.subscriptions.push(this.changedEdgeSizeSubscription(), this.changedEdgeSubscription(), this.changedTableSizeSubscription(), this.clipboardDataSubscription(), this.copySelectedSubscription(), this.createCustomComponentSubscription(), this.cutSelectedSubscription(), this.disableSelectionSubscription(), this.endMousePressSubscription(), this.imageLoadedSubscription(), this.insertBreakSubscription(), this.insertImageSubscription(), this.insertLinkSubscription(), this.insertTableColumnsSubscription(), this.insertTableRowsSubscription(), this.insertTableSubscription(), this.insertTextSubscription(), this.pasteFromClipboardSubscription(), this.printSubscription(), this.redoSubscription(), this.removeLeftSubscription(), this.removeNumberingsSubscription(), this.removeRightSubscription(), this.removeSelectedSubscription(), this.removeTableColumnsSubscription(), this.removeTableRowsSubscription(), this.removeTableSubscription(), this.replaceSubscription(), this.rerenderSubscription(), this.resizeTableColumnsSubscription(), this.searchOptionSubscription(), this.selectAllSubscription(), this.setImageStyleSubscription(), this.setNumberingTemplateTypeSubscription(), this.setParagraphStylesSubscription(), this.setTextStylesSubscription(), this.undoSubscription(), this.updateEdgeSubscription(), this.viewOnlyModeSubscription(), this.applyPageFormatSubscription(), this.insertPageFormatSubscription(), this.applyDocumentPageFormatSubscription(), this.dragMoveSubscription(), this.dragDropSubscription());
7283
+ this.subscriptions.push(this.changedEdgeSizeSubscription(), this.changedEdgeSubscription(), this.changedTableSizeSubscription(), this.clipboardDataSubscription(), this.copySelectedSubscription(), this.createCustomComponentSubscription(), this.cutSelectedSubscription(), this.disableSelectionSubscription(), this.endMousePressSubscription(), this.imageLoadedSubscription(), this.insertBreakSubscription(), this.insertImageSubscription(), this.insertLinkSubscription(), this.insertTableColumnsSubscription(), this.insertTableRowsSubscription(), this.insertTableSubscription(), this.insertTextSubscription(), this.pasteFromClipboardSubscription(), this.printSubscription(), this.redoSubscription(), this.removeLeftSubscription(), this.removeNumberingsSubscription(), this.removeRightSubscription(), this.removeSelectedSubscription(), this.removeTableColumnsSubscription(), this.removeTableRowsSubscription(), this.removeTableSubscription(), this.rerenderSubscription(), this.resizeTableColumnsSubscription(), ...this.searchOptionSubscriptions(), ...this.replaceSubscription(), this.selectAllSubscription(), this.setImageStyleSubscription(), this.setNumberingTemplateTypeSubscription(), this.setParagraphStylesSubscription(), this.setTextStylesSubscription(), this.undoSubscription(), this.updateEdgeSubscription(), this.viewOnlyModeSubscription(), this.applyPageFormatSubscription(), this.applyRightMarginPageFormatSubscription(), this.applyLeftMarginPageFormatSubscription(), this.insertPageFormatSubscription(), this.applyDocumentPageFormatSubscription(), this.dragMoveSubscription(), this.dragDropSubscription(), this.applyFirstLinePositionSubscription(), this.applyRightIndentParagraphSubscription(), this.applyLeftIndentParagraphSubscription());
7311
7284
  }
7312
7285
  destroy() {
7313
7286
  this.subscriptions.forEach(s => s?.unsubscribe());
@@ -7379,6 +7352,7 @@ class Editor {
7379
7352
  }
7380
7353
  this.session.insertText(position, text, textStyle);
7381
7354
  this.onSelectionChange();
7355
+ this.onContentChange();
7382
7356
  }
7383
7357
  removeLeft() {
7384
7358
  if (this.selection.isEmpty) {
@@ -7433,6 +7407,7 @@ class Editor {
7433
7407
  const endPoint = this.session.insertTab(this.selection.cursor);
7434
7408
  this.onDocumentChange(new Range(this.selection.cursor, endPoint));
7435
7409
  this.onSelectionChange();
7410
+ this.onContentChange();
7436
7411
  }
7437
7412
  insertImage(imageData) {
7438
7413
  const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.session.displayData.paragraphs, this.selection.range.start);
@@ -7496,6 +7471,7 @@ class Editor {
7496
7471
  const endPosition = this.session.replace(model);
7497
7472
  this.onDocumentChange(new Range(this.selection.cursor, endPosition));
7498
7473
  this.onSelectionChange();
7474
+ this.onContentChange();
7499
7475
  }
7500
7476
  removeToLineStart() {
7501
7477
  if (this.selection.isEmpty) {
@@ -7560,6 +7536,20 @@ class Editor {
7560
7536
  this.session.applyParagraphStyle(startIndex, endIndex, paragraphStyle);
7561
7537
  this.renderer.updateCursor();
7562
7538
  }
7539
+ applyParagraphsMargin(value) {
7540
+ const range = this.selection.range;
7541
+ const startIndex = this.session.model.paragraphs[range.start.row].insertIndex;
7542
+ const endIndex = this.session.model.paragraphs[range.end.row].insertIndex;
7543
+ const paragraphs = IndexedElementHelper.sliceSection(this.session.model.paragraphs, startIndex, endIndex);
7544
+ const paragraphsDeepCopy = paragraphs.map(x => new ParagraphModel({ insertIndex: x.insertIndex, paragraphStyle: new ParagraphStyleModel({ ...x.paragraphStyle }) }));
7545
+ const updatedParagraphs = paragraphs.map(x => new ParagraphModel({
7546
+ insertIndex: x.insertIndex,
7547
+ paragraphStyle: new ParagraphStyleModel({ ...x.paragraphStyle, ...value })
7548
+ }));
7549
+ this.saveApplyParagraphsToHistory(paragraphsDeepCopy, updatedParagraphs);
7550
+ this.session.applyParagraphs(updatedParagraphs);
7551
+ this.renderer.updateCursor();
7552
+ }
7563
7553
  setNumberingTemplate(templateLevels) {
7564
7554
  const range = this.selection.range;
7565
7555
  const startIndex = this.session.model.paragraphs[range.start.row].insertIndex;
@@ -7588,74 +7578,74 @@ class Editor {
7588
7578
  }
7589
7579
  }
7590
7580
  openSearch() {
7591
- this.editorService.openSearchDialog = true;
7581
+ this.editorService.setDisplaySearchBar(true);
7582
+ const selectedText = this.getSelectedText();
7583
+ if (selectedText) {
7584
+ setTimeout(() => {
7585
+ this.editorService.setDialogSearchTerm(selectedText);
7586
+ });
7587
+ }
7592
7588
  }
7593
- find(options) {
7594
- let range = this.selection.range;
7595
- if (options.term == null) {
7596
- let term = this.session.displayData.getTextRange(range) || this.search.options.term;
7597
- if (!term) {
7598
- range = this.session.getWordRange(range.start.row, range.start.column);
7599
- term = this.session.displayData.getTextRange(range);
7589
+ find(term, focusNext = false) {
7590
+ if (!term?.length) {
7591
+ for (const session of this.regulatorService.sessions) {
7592
+ session.renderer.updateSearchHighlights([]);
7593
+ session.renderer.updateActiveSearchHighlight(null);
7600
7594
  }
7601
- options.term = term;
7595
+ this.editorService.setSearchResultCount(0);
7596
+ return;
7602
7597
  }
7603
- if (!options.start) {
7604
- options.start = range;
7598
+ this.search.setSearchTerm(term);
7599
+ this.search.findAll(this.regulatorService.sessions);
7600
+ this.editorService.setSearchResultCount(this.search.allMatches.length);
7601
+ if (focusNext && this.search.allMatches?.length) {
7602
+ this.search.goNext(this.selection, this.regulatorService.currentSession.sessionId);
7603
+ this.updateActiveSearchHighlight();
7604
+ this.mainRenderer.scrollCursorIntoView(new CursorParagraph(this.search.currentMatch.range.start.row, this.search.currentMatch.range.start.column));
7605
7605
  }
7606
- this.search.set(options);
7607
- const newRange = this.search.find(this.session);
7608
- if (newRange) {
7609
- this.selection.placeSelection(range.start, range.end);
7610
- this.onSelectionChange();
7611
- if (this.session === this.mainSession) {
7612
- this.mainRenderer.scrollSelectionIntoView(range.start, range.end, 0.5);
7613
- }
7614
- return newRange;
7606
+ else {
7607
+ this.updateActiveSearchHighlight();
7615
7608
  }
7616
- range.end = range.start;
7617
- this.selection.placeCursor(range.start);
7618
- this.onSelectionChange();
7619
- return null;
7620
7609
  }
7621
- updateCounter() {
7622
- const regex = this.search.options.regex;
7623
- let all = 0;
7624
- let current = 0;
7625
- if (!regex) {
7626
- return { current: 0, total: 0 };
7627
- }
7628
- const value = this.session.displayData.getAllParagraphsContent().join('\n');
7629
- let offset = this.session.displayData.positionToIndex(this.selection.range.start);
7630
- regex.lastIndex = 0;
7631
- let regexResult;
7632
- while ((regexResult = regex.exec(value))) {
7633
- all++;
7634
- let last = regexResult.index;
7635
- if (last <= offset) {
7636
- current++;
7637
- }
7638
- if (all > this.MAX_COUNT) {
7639
- break;
7640
- }
7610
+ findNext() {
7611
+ if (!this.search.allMatches?.length) {
7612
+ return;
7641
7613
  }
7642
- return { current: current, total: all > this.MAX_COUNT ? this.MAX_COUNT : all };
7614
+ this.search.goNext(this.selection, this.regulatorService.currentSession.sessionId);
7615
+ this.setCursorAtSearchResult();
7616
+ this.updateActiveSearchHighlight();
7643
7617
  }
7644
- replace(search, replace) {
7645
- if (this.selection.isEmpty) {
7618
+ findPrevious() {
7619
+ if (!this.search.allMatches?.length) {
7646
7620
  return;
7647
7621
  }
7648
- if (search !== replace) {
7649
- if (replace) {
7650
- const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.session.displayData.paragraphs, this.selection.range.start);
7651
- const insertText = new InsertTextModel({ insertIndex, text: replace });
7652
- this.replaceBy(new ReplaceModel({ insertText }));
7653
- }
7654
- else {
7655
- this.removeSelected();
7656
- }
7622
+ this.search.goPrevious(this.selection, this.regulatorService.currentSession.sessionId);
7623
+ this.updateActiveSearchHighlight();
7624
+ this.setCursorAtSearchResult();
7625
+ }
7626
+ replace() {
7627
+ if (!this.search.allMatches?.length || this.search.term === this.replaceTerm) {
7628
+ return;
7657
7629
  }
7658
- this.find({ term: search, skipCurrent: true, backwards: false });
7630
+ if (this.replaceTerm) {
7631
+ const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.session.displayData.paragraphs, this.search.currentMatch.range.start);
7632
+ const insertText = new InsertTextModel({ insertIndex, text: this.replaceTerm });
7633
+ const partIndexes = ContentHelper.getSelectedPartDocumentIndexes(this.session.displayData.paragraphs, this.search.currentMatch.range);
7634
+ const deleteModel = new DeleteModel({
7635
+ startIndex: partIndexes.startIndex,
7636
+ count: partIndexes.endIndex - partIndexes.startIndex + 1
7637
+ });
7638
+ const replaceModel = new ReplaceModel({ insertText, delete: deleteModel });
7639
+ this.saveReplaceToHistory(this.search.currentMatch.range, replaceModel);
7640
+ const endPosition = this.session.replace(replaceModel);
7641
+ this.onDocumentChange(new Range(this.search.currentMatch.range.start, endPosition));
7642
+ }
7643
+ else {
7644
+ const range = this.search.currentMatch.range;
7645
+ this.saveRemoveToHistory(range);
7646
+ this.session.remove(range);
7647
+ }
7648
+ this.find(this.search.term);
7659
7649
  }
7660
7650
  undo() {
7661
7651
  const undo = this.history.popUndoOperation();
@@ -7666,6 +7656,7 @@ class Editor {
7666
7656
  this.applyOperation(undo.operation);
7667
7657
  this.selection.placeSelection(undo.cursor, undo.anchor);
7668
7658
  this.onSelectionChange();
7659
+ this.onContentChange();
7669
7660
  }
7670
7661
  redo() {
7671
7662
  const redo = this.history.popRedoOperation();
@@ -7676,6 +7667,7 @@ class Editor {
7676
7667
  this.selection.placeSelection(redo.cursor, redo.anchor);
7677
7668
  this.applyOperation(redo.operation);
7678
7669
  this.onSelectionChange();
7670
+ this.onContentChange();
7679
7671
  }
7680
7672
  applyOperation(operation) {
7681
7673
  let command = null;
@@ -7843,6 +7835,11 @@ class Editor {
7843
7835
  this.session.replaceByRestore(structuredClone(operation));
7844
7836
  command = SaveCommandsHelper.getReplaceByRestoreCommand(structuredClone(operation), this.targets);
7845
7837
  }
7838
+ else if (operation instanceof ApplyParagraphsModel) {
7839
+ const deepCopy = structuredClone(operation);
7840
+ this.session.applyParagraphs(deepCopy.paragraphs);
7841
+ command = SaveCommandsHelper.getApplyParagraphsCommand(deepCopy.paragraphs, this.targets);
7842
+ }
7846
7843
  else {
7847
7844
  throw new Error('Undo/redo is not implemented for the Operation');
7848
7845
  }
@@ -7906,6 +7903,10 @@ class Editor {
7906
7903
  this.history.pushApplyTextStyle(startIndex, endIndex, textStyle, formats, linkFormats);
7907
7904
  this.commandsService.createCommand(SaveCommandsHelper.getApplyTextStyleCommand(startIndex, endIndex, textStyle, this.targets));
7908
7905
  }
7906
+ saveApplyParagraphsToHistory(oldParagraphs, updatedParagraphs) {
7907
+ this.history.pushApplyParagraphs(oldParagraphs, updatedParagraphs);
7908
+ this.commandsService.createCommand(SaveCommandsHelper.getApplyParagraphsCommand(updatedParagraphs, this.targets));
7909
+ }
7909
7910
  saveApplyParagraphStyleToHistory(startIndex, endIndex, paragraphStyle) {
7910
7911
  const paragraphs = IndexedElementHelper.sliceSection(this.session.model.paragraphs, startIndex, endIndex);
7911
7912
  const paragraphsDeepCopy = paragraphs.map(x => new ParagraphModel({ insertIndex: x.insertIndex, paragraphStyle: new ParagraphStyleModel({ ...x.paragraphStyle }) }));
@@ -7985,6 +7986,7 @@ class Editor {
7985
7986
  const endPoint = this.session.insertElement(this.selection.cursor, data);
7986
7987
  this.onDocumentChange(new Range(this.selection.cursor, endPoint));
7987
7988
  this.onSelectionChange();
7989
+ this.onContentChange();
7988
7990
  }
7989
7991
  removeSelected() {
7990
7992
  const range = this.selection.range;
@@ -7997,6 +7999,7 @@ class Editor {
7997
7999
  this.selection.placeCursor(range.end);
7998
8000
  this.removeNumberingsFromParagraphs();
7999
8001
  this.onSelectionChange();
8002
+ this.onContentChange();
8000
8003
  this.focus();
8001
8004
  return;
8002
8005
  }
@@ -8008,6 +8011,7 @@ class Editor {
8008
8011
  this.removeCustomElementsData();
8009
8012
  this.session.remove(range);
8010
8013
  this.onSelectionChange();
8014
+ this.onContentChange();
8011
8015
  }
8012
8016
  this.focus();
8013
8017
  }
@@ -8028,6 +8032,7 @@ class Editor {
8028
8032
  this.removeCustomElementsData();
8029
8033
  this.session.removeWithParagraph(operation);
8030
8034
  this.onSelectionChange();
8035
+ this.onContentChange();
8031
8036
  }
8032
8037
  removeCustomElementsData() {
8033
8038
  const startIndex = ContentHelper.paragraphPositionToDocumentIndex(this.session.displayData.paragraphs, this.selection.range.start);
@@ -8252,6 +8257,7 @@ class Editor {
8252
8257
  if (sourceSession.sessionId === this.session.sessionId && sourceStartIndex <= targetIndex && sourceEndIndex >= targetIndex) {
8253
8258
  this.selection.placeSelection(sourceRange.start, sourceRange.end);
8254
8259
  this.onSelectionChange();
8260
+ this.onContentChange();
8255
8261
  return;
8256
8262
  }
8257
8263
  const model = new MoveRangeModel({
@@ -8264,6 +8270,7 @@ class Editor {
8264
8270
  this.moveRange(model);
8265
8271
  this.saveMoveRangeToHistory(model, sourceSession, sourceRange);
8266
8272
  this.onSelectionChange();
8273
+ this.onContentChange();
8267
8274
  }
8268
8275
  moveRange(model) {
8269
8276
  this.regulatorService.setTargetedSessionAsCurrent(model.targetTargets);
@@ -8353,6 +8360,7 @@ class Editor {
8353
8360
  this.container.nativeElement.style.maxWidth = `${pageWidth}px`;
8354
8361
  const scalingRatio = this.customPageWidth ? ScalingHelper.getRatio(this.customPageWidth, pageWidth) : 1;
8355
8362
  this.editorService.setPageFormat(this.model.pageFormats[0]);
8363
+ this.editorService.paragraphStyle(this.model.paragraphs[0].paragraphStyle);
8356
8364
  this.regulatorService.addMainSession(this.model, pageWidth, scalingRatio, this.container);
8357
8365
  }
8358
8366
  onSelectionChange() {
@@ -8362,8 +8370,17 @@ class Editor {
8362
8370
  this.renderer.updateCursor();
8363
8371
  }
8364
8372
  this.editorService.setHasSelection(!this.selection.isEmpty);
8373
+ const position = this.mainSession.displayData.positionToIndex(this.selection.selectedRange.start);
8374
+ const pageFormat = this.mainSession.displayData.getPageFormatAtPosition(position);
8375
+ this.editorService.paragraphStyle(this.session.model.paragraphs[this.selection.selectedRange.start.row].paragraphStyle);
8376
+ this.editorService.setPageFormat(pageFormat.pageFormatModel);
8365
8377
  this.rerenderMarker();
8366
8378
  }
8379
+ onContentChange() {
8380
+ if (this.search.term) {
8381
+ this.find(this.search.term);
8382
+ }
8383
+ }
8367
8384
  enableSelection() {
8368
8385
  if (!this.selection.isDisabled) {
8369
8386
  return;
@@ -8485,6 +8502,24 @@ class Editor {
8485
8502
  }
8486
8503
  return null;
8487
8504
  }
8505
+ applyLeftMarginPageFormat(value) {
8506
+ const position = this.selection.cursor;
8507
+ const startIndex = ContentHelper.paragraphToDocumentIndex(this.session.displayData.paragraphs, position.row, position.column);
8508
+ const oldPageFormat = this.mainSession.displayData.getPageFormatAtPosition(startIndex).pageFormatModel;
8509
+ const newPageFormat = new PageFormatModel({ ...oldPageFormat, marginLeft: value });
8510
+ this.saveApplyPageFormatToHistory(oldPageFormat, newPageFormat);
8511
+ OperationsHelper.updatePageFormat(this.model, newPageFormat);
8512
+ this.recreateMainSession();
8513
+ }
8514
+ applyRightMarginPageFormat(value) {
8515
+ const position = this.selection.cursor;
8516
+ const startIndex = ContentHelper.paragraphToDocumentIndex(this.session.displayData.paragraphs, position.row, position.column);
8517
+ const oldPageFormat = this.mainSession.displayData.getPageFormatAtPosition(startIndex).pageFormatModel;
8518
+ const newPageFormat = new PageFormatModel({ ...oldPageFormat, marginRight: value });
8519
+ this.saveApplyPageFormatToHistory(oldPageFormat, newPageFormat);
8520
+ OperationsHelper.updatePageFormat(this.model, newPageFormat);
8521
+ this.recreateMainSession();
8522
+ }
8488
8523
  applyPageFormat(model) {
8489
8524
  const position = this.selection.cursor;
8490
8525
  const startIndex = ContentHelper.paragraphToDocumentIndex(this.session.displayData.paragraphs, position.row, position.column);
@@ -8525,6 +8560,12 @@ class Editor {
8525
8560
  this.selection?.clearSelection();
8526
8561
  });
8527
8562
  }
8563
+ applyLeftMarginPageFormatSubscription() {
8564
+ return this.editorService.leftMarginPageFormat$.subscribe(value => this.applyLeftMarginPageFormat(value));
8565
+ }
8566
+ applyRightMarginPageFormatSubscription() {
8567
+ return this.editorService.rightMarginPageFormat$.subscribe(value => this.applyRightMarginPageFormat(value));
8568
+ }
8528
8569
  applyPageFormatSubscription() {
8529
8570
  return this.editorService.applyPageFormat$.subscribe(pageFormat => this.applyPageFormat(pageFormat));
8530
8571
  }
@@ -8534,17 +8575,18 @@ class Editor {
8534
8575
  applyDocumentPageFormatSubscription() {
8535
8576
  return this.editorService.applyDocumentPageFormat$.subscribe(pageFormat => this.applyDocumentPageFormat(pageFormat));
8536
8577
  }
8537
- searchOptionSubscription() {
8538
- return this.editorService.searchOptions$.subscribe(searchOptions => {
8539
- this.find(searchOptions);
8540
- this.editorService.searchIteration = this.updateCounter();
8541
- });
8578
+ searchOptionSubscriptions() {
8579
+ return [
8580
+ this.editorService.searchTerm$.subscribe(searchTerm => this.find(searchTerm, true)),
8581
+ this.editorService.searchNext$.subscribe(() => this.findNext()),
8582
+ this.editorService.searchPrevious$.subscribe(() => this.findPrevious())
8583
+ ];
8542
8584
  }
8543
8585
  replaceSubscription() {
8544
- return this.editorService.replace$.subscribe(replace => {
8545
- this.replace(replace.searchValue, replace.replaceValue);
8546
- this.editorService.searchIteration = this.updateCounter();
8547
- });
8586
+ return [
8587
+ this.editorService.replaceTerm$.subscribe(x => (this.replaceTerm = x)),
8588
+ this.editorService.replaceCurrent$.subscribe(() => this.replace())
8589
+ ];
8548
8590
  }
8549
8591
  setTextStylesSubscription() {
8550
8592
  return this.editorService.setTextStyles$.subscribe(textStyles => {
@@ -8570,6 +8612,18 @@ class Editor {
8570
8612
  this.focus();
8571
8613
  });
8572
8614
  }
8615
+ applyFirstLinePositionSubscription() {
8616
+ return this.editorService.firstLinePosition$.subscribe(x => {
8617
+ const value = x > 0 ? { indentFirstLine: x, indentHanging: 0 } : { indentHanging: Math.abs(x), indentFirstLine: 0 };
8618
+ this.applyParagraphsMargin(value);
8619
+ });
8620
+ }
8621
+ applyRightIndentParagraphSubscription() {
8622
+ return this.editorService.rightIndentParagraph$.subscribe(indentRight => this.applyParagraphsMargin({ indentRight }));
8623
+ }
8624
+ applyLeftIndentParagraphSubscription() {
8625
+ return this.editorService.leftIndentParagraph$.subscribe(indentLeft => this.applyParagraphsMargin({ indentLeft }));
8626
+ }
8573
8627
  setImageStyleSubscription() {
8574
8628
  return this.editorService.setImageStyle$.subscribe(image => this.applyImageStyles(image));
8575
8629
  }
@@ -8819,10 +8873,97 @@ class Editor {
8819
8873
  changeCellsWidth(rows, widthScale) {
8820
8874
  rows.forEach(row => row.cells.forEach(cell => (cell.width = Math.round(cell.width / widthScale))));
8821
8875
  }
8876
+ updateActiveSearchHighlight() {
8877
+ this.editorService.setCurrentSearchResultIndex(this.search.currentMatchIndex);
8878
+ if (!this.search.currentMatch) {
8879
+ for (const session of this.regulatorService.sessions) {
8880
+ session.renderer.updateActiveSearchHighlight(null);
8881
+ }
8882
+ return;
8883
+ }
8884
+ for (const session of this.regulatorService.sessions) {
8885
+ if (session.sessionId === this.search.currentMatch.sessionId) {
8886
+ session.renderer.updateActiveSearchHighlight(this.search.currentMatch.range);
8887
+ continue;
8888
+ }
8889
+ session.renderer.updateActiveSearchHighlight(null);
8890
+ }
8891
+ }
8892
+ setCursorAtSearchResult() {
8893
+ this.regulatorService.setCurrentSessionById(this.search.currentMatch.sessionId);
8894
+ const resultCursor = new CursorParagraph(this.search.currentMatch.range.start.row, this.search.currentMatch.range.start.column);
8895
+ this.selection.placeCursor(resultCursor);
8896
+ this.mainRenderer.scrollCursorIntoView(resultCursor);
8897
+ }
8822
8898
  }
8823
8899
 
8824
8900
  const EDITOR_VERSION = '2';
8825
8901
 
8902
+ class EditorSearchBarComponent {
8903
+ constructor(editorService, destroyRef) {
8904
+ this.editorService = editorService;
8905
+ this.destroyRef = destroyRef;
8906
+ this.searchControl = new FormControl('');
8907
+ this.replaceControl = new FormControl('');
8908
+ this.isReplace = false;
8909
+ this.searchResultCount$ = editorService.searchResultCount$;
8910
+ this.searchResultIndex$ = editorService.currentSearchResultIndex$;
8911
+ }
8912
+ ngOnInit() {
8913
+ this.searchControl.valueChanges
8914
+ .pipe(debounceTime(300), distinctUntilChanged(), takeUntilDestroyed(this.destroyRef))
8915
+ .subscribe(() => this.editorService.setNewSearchTerm(this.searchControl.value));
8916
+ this.replaceControl.valueChanges
8917
+ .pipe(distinctUntilChanged(), takeUntilDestroyed(this.destroyRef))
8918
+ .subscribe(() => this.editorService.setNewReplaceTerm(this.replaceControl.value));
8919
+ this.editorService.dialogSearchTerm$
8920
+ .pipe(distinctUntilChanged(), takeUntilDestroyed(this.destroyRef))
8921
+ .subscribe(x => this.searchControl.setValue(x));
8922
+ }
8923
+ ngOnDestroy() {
8924
+ this.editorService.setNewSearchTerm('');
8925
+ }
8926
+ onClose() {
8927
+ this.editorService.setDisplaySearchBar(false);
8928
+ }
8929
+ focusInput() {
8930
+ setTimeout(() => {
8931
+ this.searchInput?.nativeElement?.focus();
8932
+ this.searchInput?.nativeElement?.select();
8933
+ });
8934
+ }
8935
+ findNext() {
8936
+ this.editorService.goNextSearchResult();
8937
+ }
8938
+ findPrev() {
8939
+ this.editorService.goPreviousSearchResult();
8940
+ }
8941
+ setReplace() {
8942
+ this.isReplace = !this.isReplace;
8943
+ }
8944
+ replace() {
8945
+ this.editorService.replaceCurrentSearchResult();
8946
+ }
8947
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: EditorSearchBarComponent, deps: [{ token: EditorService }, { token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Component }); }
8948
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.5", type: EditorSearchBarComponent, isStandalone: true, selector: "app-nod-editor-search-bar", providers: [ExternalElementService], viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }], ngImport: i0, template: "@let searchResultCount = searchResultCount$ | async;\n@let searchResultIndex = searchResultIndex$ | async;\n<div class=\"line search-form\">\n <mat-form-field\n color=\"accent\"\n floatLabel=\"auto\"\n appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.SEARCH_FOR' | translate }}</mat-label>\n <input\n matInput\n #searchInput\n [formControl]=\"searchControl\"\n (keydown.enter)=\"findNext()\" />\n </mat-form-field>\n <div>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"findPrev()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-arrow-onleft\"></mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"findNext()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-arrow-onright\"></mat-icon>\n </button>\n </div>\n</div>\n<div\n class=\"replace-form\"\n *ngIf=\"isReplace\">\n <mat-form-field\n color=\"accent\"\n floatLabel=\"auto\"\n appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.REPLACE_WITH' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"replaceControl\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n (keydown.enter)=\"replace()\" />\n </mat-form-field>\n <button\n type=\"button\"\n mat-button\n (click)=\"replace()\">\n {{ 'NODER.LABEL.REPLACE' | translate }}\n </button>\n</div>\n<div class=\"search-options\">\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Toggle Replace Mode\"\n (click)=\"setReplace()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"{{ isReplace ? 'icon-arrow-up' : 'icon-arrow-down' }}\"></mat-icon>\n </button>\n <div class=\"counter\">\n @if (searchResultCount) {\n <span>\n {{ 'NODER.COMPLEX_LABEL.OF_COUNTER' | translate: { current: searchResultIndex, total: searchResultCount ?? 0 } }}\n </span>\n } @else {\n <span>{{ 'NODER.LABEL.NO_RESULTS' | translate }}</span>\n }\n </div>\n <button\n type=\"button\"\n mat-icon-button\n [matTooltip]=\"'NODER.LABEL.CLOSE' | translate\"\n (click)=\"onClose()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-cancel-thin\"></mat-icon>\n </button>\n</div>\n", styles: [":host{min-height:56px;max-width:100%;display:block;font-size:10px;border-style:solid;border-radius:0 0 4px 4px;border-width:1px;border-top:none}:host ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.close-icon{position:absolute;right:1px;top:1px}.search-form,.replace-form,.search-options{margin:8px 6px 0 0;display:flex;gap:8px}mat-form-field{padding-left:10px}.mdc-button{font-size:12px;padding:0 8px;min-width:unset}.search-options{line-height:40px}.search-options .counter{text-align:center;flex:1}.mat-mdc-input-element{font-size:10px}.replace-form .mdc-button{width:80px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { 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: "component", type: i4.MatIconButton, selector: "button[mat-icon-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: MatInputModule }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i5$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5$1.MatLabel, selector: "mat-label" }, { 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: ReactiveFormsModule }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
8949
+ }
8950
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: EditorSearchBarComponent, decorators: [{
8951
+ type: Component,
8952
+ args: [{ imports: [
8953
+ CommonModule,
8954
+ FormsModule,
8955
+ MatButtonModule,
8956
+ MatIconModule,
8957
+ MatInputModule,
8958
+ MatTooltipModule,
8959
+ ReactiveFormsModule,
8960
+ TranslateModule
8961
+ ], providers: [ExternalElementService], changeDetection: ChangeDetectionStrategy.OnPush, selector: 'app-nod-editor-search-bar', template: "@let searchResultCount = searchResultCount$ | async;\n@let searchResultIndex = searchResultIndex$ | async;\n<div class=\"line search-form\">\n <mat-form-field\n color=\"accent\"\n floatLabel=\"auto\"\n appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.SEARCH_FOR' | translate }}</mat-label>\n <input\n matInput\n #searchInput\n [formControl]=\"searchControl\"\n (keydown.enter)=\"findNext()\" />\n </mat-form-field>\n <div>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"findPrev()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-arrow-onleft\"></mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"findNext()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-arrow-onright\"></mat-icon>\n </button>\n </div>\n</div>\n<div\n class=\"replace-form\"\n *ngIf=\"isReplace\">\n <mat-form-field\n color=\"accent\"\n floatLabel=\"auto\"\n appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.REPLACE_WITH' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"replaceControl\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n (keydown.enter)=\"replace()\" />\n </mat-form-field>\n <button\n type=\"button\"\n mat-button\n (click)=\"replace()\">\n {{ 'NODER.LABEL.REPLACE' | translate }}\n </button>\n</div>\n<div class=\"search-options\">\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Toggle Replace Mode\"\n (click)=\"setReplace()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"{{ isReplace ? 'icon-arrow-up' : 'icon-arrow-down' }}\"></mat-icon>\n </button>\n <div class=\"counter\">\n @if (searchResultCount) {\n <span>\n {{ 'NODER.COMPLEX_LABEL.OF_COUNTER' | translate: { current: searchResultIndex, total: searchResultCount ?? 0 } }}\n </span>\n } @else {\n <span>{{ 'NODER.LABEL.NO_RESULTS' | translate }}</span>\n }\n </div>\n <button\n type=\"button\"\n mat-icon-button\n [matTooltip]=\"'NODER.LABEL.CLOSE' | translate\"\n (click)=\"onClose()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-cancel-thin\"></mat-icon>\n </button>\n</div>\n", styles: [":host{min-height:56px;max-width:100%;display:block;font-size:10px;border-style:solid;border-radius:0 0 4px 4px;border-width:1px;border-top:none}:host ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.close-icon{position:absolute;right:1px;top:1px}.search-form,.replace-form,.search-options{margin:8px 6px 0 0;display:flex;gap:8px}mat-form-field{padding-left:10px}.mdc-button{font-size:12px;padding:0 8px;min-width:unset}.search-options{line-height:40px}.search-options .counter{text-align:center;flex:1}.mat-mdc-input-element{font-size:10px}.replace-form .mdc-button{width:80px}\n"] }]
8962
+ }], ctorParameters: () => [{ type: EditorService }, { type: i0.DestroyRef }], propDecorators: { searchInput: [{
8963
+ type: ViewChild,
8964
+ args: ['searchInput']
8965
+ }] } });
8966
+
8826
8967
  const EXTERNAL_ELEMENT_SIDENAV = new InjectionToken('EXTERNAL_ELEMENT_SIDENAV');
8827
8968
  const EXTERNAL_ELEMENT_SERVICE = new InjectionToken('EXTERNAL_ELEMENT_SERVICE');
8828
8969
 
@@ -10541,7 +10682,7 @@ class TextLineInfo {
10541
10682
  }
10542
10683
  switch (align) {
10543
10684
  case Alignment$1.center:
10544
- this.paddingLeft = indent.left + (diff - indent.left - indent.right) / 2;
10685
+ this.paddingLeft = indent.left + (diff - indent.left - indent.right) / 2 + (indent.hanging - indent.firstLine) / 2;
10545
10686
  break;
10546
10687
  case Alignment$1.right:
10547
10688
  this.paddingLeft = diff - indent.right;
@@ -12565,6 +12706,15 @@ class EditSession {
12565
12706
  this.selection.placeCursor(endPosition);
12566
12707
  this.applyToolbarStyles();
12567
12708
  }
12709
+ applyParagraphs(paragraphs) {
12710
+ const startIndex = paragraphs[0].insertIndex;
12711
+ const endIndex = paragraphs[paragraphs.length - 1].insertIndex;
12712
+ const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, startIndex).row;
12713
+ const endPosition = ContentHelper.documentIndexToParagraphWithOffset(this.displayData.paragraphs, endIndex);
12714
+ OperationsHelper.applyParagraphs(this.model, paragraphs);
12715
+ this.displayData.updateNextLineIndexes(startParagraph, endPosition.row);
12716
+ this.applyToolbarStyles();
12717
+ }
12568
12718
  setTextStyle(textStyle) {
12569
12719
  const result = { ...this.editorService.styles };
12570
12720
  for (let key of Object.keys(textStyle)) {
@@ -13062,6 +13212,7 @@ class RenderChangesModel {
13062
13212
  this.lines ||
13063
13213
  this.marker ||
13064
13214
  this.selection ||
13215
+ this.search ||
13065
13216
  this.scroll ||
13066
13217
  this.size ||
13067
13218
  this.text ||
@@ -13073,6 +13224,7 @@ class RenderChangesModel {
13073
13224
  this.lines = false;
13074
13225
  this.marker = false;
13075
13226
  this.selection = false;
13227
+ this.search = false;
13076
13228
  this.scroll = false;
13077
13229
  this.size = false;
13078
13230
  this.text = false;
@@ -13131,15 +13283,14 @@ class RenderLoop {
13131
13283
  }
13132
13284
  }
13133
13285
 
13134
- class SelectionLayer {
13286
+ class HighlightLayer {
13135
13287
  constructor(parentEl, cssClass, session) {
13136
13288
  this.session = session;
13137
- this.marker = null;
13138
13289
  this.element = document.createElement('div');
13139
- this.element.className = `noder-layer noder-selection-layer ${cssClass}`;
13290
+ this.element.className = `noder-layer noder-highlight-layer ${cssClass}`;
13140
13291
  parentEl.appendChild(this.element);
13141
13292
  }
13142
- renderSelection(css) {
13293
+ renderHighlight(cssPosition, cssClass) {
13143
13294
  let selectionElement = this.selectionIndex !== -1 ? this.element.childNodes[this.selectionIndex] : null;
13144
13295
  if (!selectionElement) {
13145
13296
  selectionElement = document.createElement('div');
@@ -13149,32 +13300,8 @@ class SelectionLayer {
13149
13300
  else {
13150
13301
  this.selectionIndex++;
13151
13302
  }
13152
- selectionElement.style.cssText = css;
13153
- selectionElement.className = 'noder-selection';
13154
- }
13155
- update(config) {
13156
- if (!config) {
13157
- return;
13158
- }
13159
- this.config = config;
13160
- this.selectionIndex = 0;
13161
- if (this.marker) {
13162
- let range = this.marker.clipRows(config.contentRange.start, config.contentRange.end);
13163
- if (!range.isEmpty) {
13164
- range = range.toScreenRange(this.session);
13165
- if (range.isSingleLine) {
13166
- this.drawSingleLineMarker(range);
13167
- }
13168
- else {
13169
- this.drawMultiLineMarker(range);
13170
- }
13171
- }
13172
- }
13173
- if (this.selectionIndex !== -1) {
13174
- while (this.selectionIndex < this.element.childElementCount) {
13175
- this.element.removeChild(this.element.lastChild);
13176
- }
13177
- }
13303
+ selectionElement.style.cssText = cssPosition;
13304
+ selectionElement.className = cssClass;
13178
13305
  }
13179
13306
  getTop(row) {
13180
13307
  const paragraphs = this.session.displayData.paragraphs;
@@ -13184,7 +13311,7 @@ class SelectionLayer {
13184
13311
  this.session.scrollTop);
13185
13312
  }
13186
13313
  // Draws a multi line marker, where lines span the full width
13187
- drawMultiLineMarker(range) {
13314
+ drawMultiLineMarker(range, cssClass) {
13188
13315
  // from selection start to the end of the line
13189
13316
  const start = range.start.row;
13190
13317
  const end = range.end.row;
@@ -13220,19 +13347,19 @@ class SelectionLayer {
13220
13347
  let width = lineInfo.width + (lineInfo.wordSpacingWidth ?? 0);
13221
13348
  style = this.getMarkerStyle(lineInfo.height, width, top, left);
13222
13349
  }
13223
- this.renderSelection(style);
13350
+ this.renderHighlight(style, cssClass);
13224
13351
  top += lineInfo.height + lineInfo.offsetAfter + lineInfo.endPageOffset;
13225
13352
  }
13226
13353
  }
13227
13354
  // Draws a marker which covers part or whole width of a single screen line
13228
- drawSingleLineMarker(range) {
13355
+ drawSingleLineMarker(range, cssClass) {
13229
13356
  const rangeInfo = this.getRangeInfo(this.session, range);
13230
13357
  const paragraphInfo = PositionHelper.getParagraphInfoByRow(this.session.displayData.paragraphs, range.start.row);
13231
13358
  const height = rangeInfo.screenHeight || paragraphInfo.lineHeight;
13232
13359
  const width = rangeInfo.screenWidth;
13233
13360
  const top = this.getTop(range.start.row);
13234
13361
  const left = rangeInfo.leftPos;
13235
- this.renderSelection(this.getMarkerStyle(height, width, top, left));
13362
+ this.renderHighlight(this.getMarkerStyle(height, width, top, left), cssClass);
13236
13363
  }
13237
13364
  getRangeInfo(session, range) {
13238
13365
  const start = range.start;
@@ -13250,6 +13377,91 @@ class SelectionLayer {
13250
13377
  }
13251
13378
  }
13252
13379
 
13380
+ class SearchHighlightLayer extends HighlightLayer {
13381
+ constructor(parentEl, cssClass, session) {
13382
+ super(parentEl, cssClass, session);
13383
+ this.className = 'noder-highlight';
13384
+ this.selectedClassName = 'noder-selected-highlight';
13385
+ this.markers = [];
13386
+ }
13387
+ update(config) {
13388
+ if (!config) {
13389
+ return;
13390
+ }
13391
+ this.config = config;
13392
+ this.selectionIndex = 0;
13393
+ if (this.active) {
13394
+ const screenRange = this.active.toScreenRange(this.session);
13395
+ if (!screenRange.isEmpty &&
13396
+ (!config.visibleRange ||
13397
+ (screenRange.start.row >= config.visibleRange.startScreenLine &&
13398
+ screenRange.end.row <= config.visibleRange.endScreenLine))) {
13399
+ if (screenRange.isSingleLine) {
13400
+ this.drawSingleLineMarker(screenRange, this.selectedClassName);
13401
+ }
13402
+ else {
13403
+ this.drawMultiLineMarker(screenRange, this.selectedClassName);
13404
+ }
13405
+ }
13406
+ }
13407
+ if (this.markers) {
13408
+ const ranges = this.markers
13409
+ .map(x => x.toScreenRange(this.session))
13410
+ .filter(x => !x.isEmpty &&
13411
+ (!config.visibleRange ||
13412
+ (x.start.row >= config.visibleRange.startScreenLine && x.end.row <= config.visibleRange.endScreenLine)) &&
13413
+ !x.isEqual(this.active));
13414
+ for (const range of ranges) {
13415
+ if (!range.isEmpty) {
13416
+ if (range.isSingleLine) {
13417
+ this.drawSingleLineMarker(range, this.className);
13418
+ }
13419
+ else {
13420
+ this.drawMultiLineMarker(range, this.className);
13421
+ }
13422
+ }
13423
+ }
13424
+ }
13425
+ if (this.selectionIndex !== -1) {
13426
+ while (this.selectionIndex < this.element.childElementCount) {
13427
+ this.element.removeChild(this.element.lastChild);
13428
+ }
13429
+ }
13430
+ }
13431
+ }
13432
+
13433
+ class SelectionLayer extends HighlightLayer {
13434
+ constructor(parentEl, cssClass, session) {
13435
+ super(parentEl, cssClass, session);
13436
+ this.className = 'noder-selection';
13437
+ this.marker = null;
13438
+ }
13439
+ update(config) {
13440
+ if (!config) {
13441
+ return;
13442
+ }
13443
+ this.config = config;
13444
+ this.selectionIndex = 0;
13445
+ if (this.marker) {
13446
+ let range = this.marker.clipRows(config.contentRange.start, config.contentRange.end);
13447
+ if (!range.isEmpty) {
13448
+ range = range.toScreenRange(this.session);
13449
+ if (range.isSingleLine) {
13450
+ this.drawSingleLineMarker(range, this.className);
13451
+ }
13452
+ else {
13453
+ this.drawMultiLineMarker(range, this.className);
13454
+ }
13455
+ }
13456
+ }
13457
+ if (this.selectionIndex !== -1) {
13458
+ while (this.selectionIndex < this.element.childElementCount) {
13459
+ this.element.removeChild(this.element.lastChild);
13460
+ }
13461
+ }
13462
+ }
13463
+ }
13464
+
13253
13465
  class Renderer extends EventEmitting {
13254
13466
  constructor(parentContainer, session) {
13255
13467
  super();
@@ -13286,6 +13498,7 @@ class Renderer extends EventEmitting {
13286
13498
  this.createContentContainer();
13287
13499
  this.textLayer = new TextLayer(this.content, this.session);
13288
13500
  this.selectionLayer = new SelectionLayer(this.content, 'text-selection', this.session);
13501
+ this.searchHighlightLayer = new SearchHighlightLayer(this.content, 'text-search-highlight', this.session);
13289
13502
  this.cursorLayer = new CursorLayer(this.content, this.session);
13290
13503
  this.dragAndDropSelectionLayer = new SelectionLayer(this.content, 'drag-and-drop-selection', this.session);
13291
13504
  this.loop = new RenderLoop(changes => this.renderChanges(changes));
@@ -13319,6 +13532,9 @@ class Renderer extends EventEmitting {
13319
13532
  if (changes.marker || changes.selection) {
13320
13533
  this.renderSelection();
13321
13534
  }
13535
+ if (changes.search) {
13536
+ this.renderSearchHighlights();
13537
+ }
13322
13538
  if (changes.dragAndDrop) {
13323
13539
  this.renderDragAndDropSelection();
13324
13540
  }
@@ -13363,6 +13579,19 @@ class Renderer extends EventEmitting {
13363
13579
  this.loop.schedule({ selection: true });
13364
13580
  }
13365
13581
  }
13582
+ updateSearchHighlights(ranges) {
13583
+ if (this.searchHighlightLayer.markers.length !== ranges.length ||
13584
+ !this.searchHighlightLayer.markers.every(x => ranges.some(y => x.isEqual(y)))) {
13585
+ this.searchHighlightLayer.markers = ranges;
13586
+ this.loop.schedule({ search: true });
13587
+ }
13588
+ }
13589
+ updateActiveSearchHighlight(active) {
13590
+ if (!this.searchHighlightLayer.active?.isEqual(active)) {
13591
+ this.searchHighlightLayer.active = active;
13592
+ this.loop.schedule({ search: true });
13593
+ }
13594
+ }
13366
13595
  updateDragAndDropSelection(range) {
13367
13596
  if (range.isEmpty && this.dragAndDropSelectionLayer.marker) {
13368
13597
  this.dragAndDropSelectionLayer.marker = null;
@@ -13424,6 +13653,7 @@ class Renderer extends EventEmitting {
13424
13653
  renderFull() {
13425
13654
  this.textLayer.updateLines(this.layerConfig);
13426
13655
  this.selectionLayer.update(this.layerConfig);
13656
+ this.searchHighlightLayer.update(this.layerConfig);
13427
13657
  this.cursorLayer.update(this.layerConfig);
13428
13658
  this.moveTextAreaToCursor();
13429
13659
  this.session.onRendered();
@@ -13440,6 +13670,9 @@ class Renderer extends EventEmitting {
13440
13670
  this.selectionLayer.update(this.layerConfig);
13441
13671
  this.cursorLayer.detectVisibility();
13442
13672
  }
13673
+ renderSearchHighlights() {
13674
+ this.searchHighlightLayer.update(this.layerConfig);
13675
+ }
13443
13676
  renderDragAndDropSelection() {
13444
13677
  this.dragAndDropSelectionLayer.update(this.layerConfig);
13445
13678
  }
@@ -13641,6 +13874,9 @@ class VirtualRenderer {
13641
13874
  if (changes.marker || changes.selection) {
13642
13875
  this.renderSelection();
13643
13876
  }
13877
+ if (changes.search) {
13878
+ this.renderSearchHighlights();
13879
+ }
13644
13880
  if (changes.dragAndDrop) {
13645
13881
  this.renderDragAndDropSelection();
13646
13882
  }
@@ -13707,6 +13943,12 @@ class VirtualRenderer {
13707
13943
  updateSelection(range) {
13708
13944
  this.renderer.updateSelection(range);
13709
13945
  }
13946
+ updateSearchHighlights(ranges) {
13947
+ this.renderer.updateSearchHighlights(ranges);
13948
+ }
13949
+ updateActiveSearchHighlight(active) {
13950
+ this.renderer.updateActiveSearchHighlight(active);
13951
+ }
13710
13952
  updateDragAndDropSelection(range) {
13711
13953
  this.renderer.updateDragAndDropSelection(range);
13712
13954
  }
@@ -13830,6 +14072,7 @@ class VirtualRenderer {
13830
14072
  this.renderer.textLayer.scrollLines(this.layerConfig);
13831
14073
  }
13832
14074
  this.renderer.selectionLayer.update(this.layerConfig);
14075
+ this.renderer.searchHighlightLayer.update(this.layerConfig);
13833
14076
  if (!this.renderer.cursorLayer.isVisible) {
13834
14077
  return;
13835
14078
  }
@@ -13851,6 +14094,9 @@ class VirtualRenderer {
13851
14094
  renderSelection() {
13852
14095
  this.renderer.renderSelection();
13853
14096
  }
14097
+ renderSearchHighlights() {
14098
+ this.renderer.renderSearchHighlights();
14099
+ }
13854
14100
  renderDragAndDropSelection() {
13855
14101
  this.renderer.renderDragAndDropSelection();
13856
14102
  }
@@ -14203,17 +14449,31 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImpor
14203
14449
 
14204
14450
  class EditorRulerComponent {
14205
14451
  constructor() {
14206
- this.pxPerCm = 37.8; // 96dpi / 2.54
14452
+ this.unit = input.required();
14453
+ this.editorService = inject(EditorService);
14454
+ this.defaultPaddingCm = 2.5;
14455
+ this.pageWidth$ = this.editorService.pageFormat$.pipe(distinctUntilChanged(), tap(x => {
14456
+ this.recalcGeometry(x.pageWidth);
14457
+ this.unit() === 'inch' ? this.buildTicksInch() : this.buildTicksCm();
14458
+ this.rightMarginPageFormatPx.set(x.pageWidth - x.marginRight);
14459
+ this.leftMarginPageFormatPx.set(x.marginLeft);
14460
+ }), map(x => x.pageWidth));
14461
+ this.snapInch = 0.125;
14207
14462
  this.snapCm = 0.25;
14208
- this.defaultPadding = 2.5;
14209
- this.offsetPosition = 5;
14210
- this.containerWidthPx = 0;
14211
- this.ticks = [];
14212
- this.leftPx = signal(this.defaultPadding * this.pxPerCm);
14213
- this.firstLinePx = signal(this.defaultPadding * this.pxPerCm);
14214
- this.rightPx = signal(0);
14463
+ this.pxPerCm = 37.8; // 96dpi / 2.54
14464
+ this.pxPerInch = 96;
14465
+ this.firstLine = signal(this.defaultPaddingCm * this.pxPerCm);
14466
+ this.leftIndent = signal(this.defaultPaddingCm * this.pxPerCm);
14467
+ this.rightIndent = signal(0);
14468
+ this.leftIndentPx = computed(() => this.leftIndent() + this.leftMarginPageFormatPx());
14469
+ this.firstLinePx = computed(() => this.firstLine() + this.leftIndentPx());
14470
+ this.rightIndentPx = computed(() => this.rightMarginPageFormatPx() - this.rightIndent());
14471
+ this.leftMarginPageFormatPx = signal(this.defaultPaddingCm * this.pxPerCm);
14472
+ this.rightMarginPageFormatPx = signal(0);
14215
14473
  this.guideX = signal(0);
14216
14474
  this.showGuide = signal(false);
14475
+ this.containerWidthPx = 0;
14476
+ this.ticks = [];
14217
14477
  this.dragging = null;
14218
14478
  this.dragOffsetX = 0;
14219
14479
  this.onMove = (ev) => {
@@ -14224,22 +14484,43 @@ class EditorRulerComponent {
14224
14484
  const pointX = this.getClientX(ev);
14225
14485
  const rect = this.rulerContainer.nativeElement.getBoundingClientRect();
14226
14486
  let x = pointX - rect.left - this.dragOffsetX;
14227
- if (x < -1 || x > this.maxRulePosition) {
14487
+ if (x < -1 || x > this.containerWidthPx) {
14228
14488
  return;
14229
14489
  }
14230
14490
  x = this.snapPx(x);
14231
- if (this.dragging === 'left') {
14232
- this.leftPx.set(x);
14491
+ if (this.dragging === 'leftMarginPageFormat') {
14492
+ this.leftMarginPageFormatPx.set(x);
14233
14493
  }
14234
14494
  else if (this.dragging === 'first') {
14235
- this.firstLinePx.set(x);
14495
+ this.firstLine.set(x - this.leftIndentPx());
14236
14496
  }
14237
- else {
14238
- this.rightPx.set(x);
14497
+ else if (this.dragging === 'rightMarginPageFormat') {
14498
+ this.rightMarginPageFormatPx.set(x);
14499
+ }
14500
+ else if (this.dragging === 'leftIndent') {
14501
+ this.leftIndent.set(x - this.leftMarginPageFormatPx());
14502
+ }
14503
+ else if (this.dragging === 'rightIndent') {
14504
+ this.rightIndent.set(this.rightMarginPageFormatPx() - x);
14239
14505
  }
14240
14506
  this.guideX.set(x);
14241
14507
  };
14242
14508
  this.onUp = () => {
14509
+ if (this.dragging === 'leftMarginPageFormat') {
14510
+ this.editorService.applyLeftMarginPageFormat(Math.round(this.leftMarginPageFormatPx()));
14511
+ }
14512
+ else if (this.dragging === 'first') {
14513
+ this.editorService.applyFirstLinePosition(Math.round(this.firstLine()));
14514
+ }
14515
+ else if (this.dragging === 'leftIndent') {
14516
+ this.editorService.applyLeftIndentParagraph(Math.round(this.leftIndent()));
14517
+ }
14518
+ else if (this.dragging === 'rightIndent') {
14519
+ this.editorService.applyRightIndentParagraph(Math.round(this.rightIndent()));
14520
+ }
14521
+ else if (this.dragging === 'rightMarginPageFormat') {
14522
+ this.editorService.applyRightMarginPageFormat(Math.round(this.containerWidthPx - this.rightMarginPageFormatPx()));
14523
+ }
14243
14524
  this.dragging = null;
14244
14525
  this.showGuide.set(false);
14245
14526
  window.removeEventListener('mousemove', this.onMove);
@@ -14247,19 +14528,25 @@ class EditorRulerComponent {
14247
14528
  window.removeEventListener('touchmove', this.onMove);
14248
14529
  window.removeEventListener('touchend', this.onUp);
14249
14530
  };
14531
+ this.editorService.paragraphStyle$.pipe(takeUntilDestroyed()).subscribe(x => {
14532
+ this.firstLine.set(x.indentHanging ? -x.indentHanging : x.indentFirstLine);
14533
+ this.leftIndent.set(x.indentLeft);
14534
+ this.rightIndent.set(x.indentRight);
14535
+ });
14536
+ effect(() => (this.unit() === 'inch' ? this.buildTicksInch() : this.buildTicksCm()));
14250
14537
  }
14251
- ngAfterViewInit() {
14538
+ afterViewInit() {
14252
14539
  this.recalcGeometry();
14253
- this.buildTicks();
14254
- this.rightPx.set(this.containerWidthPx - this.cmToPx(2.5));
14540
+ this.unit() === 'inch' ? this.buildTicksInch() : this.buildTicksCm();
14541
+ this.rightMarginPageFormatPx.set(this.containerWidthPx - this.cmToPx(2.5));
14542
+ this.rightIndent.set(0);
14255
14543
  }
14256
14544
  onResize() {
14257
14545
  this.recalcGeometry();
14258
- this.buildTicks();
14546
+ this.buildTicksCm();
14259
14547
  }
14260
- recalcGeometry() {
14261
- const rect = this.rulerContainer.nativeElement.getBoundingClientRect();
14262
- this.containerWidthPx = rect.width - 10; // because padding 5px
14548
+ recalcGeometry(width = null) {
14549
+ this.containerWidthPx = width ?? this.rulerContainer.nativeElement.getBoundingClientRect().width;
14263
14550
  }
14264
14551
  cmToPx(cm) {
14265
14552
  return cm * this.pxPerCm;
@@ -14267,42 +14554,80 @@ class EditorRulerComponent {
14267
14554
  pxToCm(px) {
14268
14555
  return px / this.pxPerCm;
14269
14556
  }
14557
+ inchToPx(cm) {
14558
+ return cm * this.pxPerInch;
14559
+ }
14560
+ pxToInch(px) {
14561
+ return px / this.pxPerInch;
14562
+ }
14270
14563
  snapPx(px) {
14271
- const cm = this.pxToCm(px);
14272
- const snapped = Math.round(cm / this.snapCm) * this.snapCm;
14273
- return this.cmToPx(snapped);
14564
+ if (this.unit() === 'inch') {
14565
+ const inch = this.pxToInch(px);
14566
+ const snapped = Math.round(inch / this.snapInch) * this.snapInch;
14567
+ return this.inchToPx(snapped);
14568
+ }
14569
+ else {
14570
+ const cm = this.pxToCm(px);
14571
+ const snapped = Math.round(cm / this.snapCm) * this.snapCm;
14572
+ return this.cmToPx(snapped);
14573
+ }
14274
14574
  }
14275
- buildTicks() {
14575
+ buildTicksCm() {
14276
14576
  const totalCm = Math.ceil(this.pxToCm(this.containerWidthPx));
14277
- this.maxRulePosition = (totalCm - 1) * this.pxPerCm;
14278
14577
  const ticks = [
14279
14578
  {
14280
- position: this.cmToPx(0) + this.offsetPosition,
14579
+ position: this.cmToPx(0),
14281
14580
  major: false,
14282
14581
  half: true,
14283
14582
  label: null,
14284
14583
  originalPaddings: -2.5
14285
14584
  },
14286
14585
  {
14287
- position: this.cmToPx(0.25) + this.offsetPosition,
14586
+ position: this.cmToPx(this.snapCm),
14288
14587
  major: false,
14289
14588
  half: false,
14290
14589
  label: null,
14291
14590
  originalPaddings: -2.25
14292
14591
  }
14293
14592
  ];
14294
- for (let cm = 1; cm < totalCm; cm++) {
14295
- const position = this.cmToPx(cm) + this.offsetPosition - this.pxPerCm / 2;
14593
+ for (let cm = 1; cm <= totalCm; cm++) {
14594
+ const position = this.cmToPx(cm) - this.pxPerCm / 2;
14296
14595
  ticks.push({ position, major: true, half: false, label: Math.abs(cm - 3), originalPaddings: cm - 3 }); // -3 because we start the line with 2.5
14297
- if (cm < totalCm) {
14596
+ if (cm <= totalCm) {
14298
14597
  for (let i = 1; i < 4; i++) {
14299
- ticks.push({
14300
- position: this.cmToPx(cm + i * 0.25) + this.offsetPosition - this.pxPerCm / 2,
14301
- major: false,
14302
- half: i === 2,
14303
- label: null,
14304
- originalPaddings: cm - 3 + i * 0.25
14305
- });
14598
+ const tickPosition = position + this.cmToPx(i * this.snapCm);
14599
+ if (tickPosition < this.containerWidthPx) {
14600
+ ticks.push({
14601
+ position: tickPosition,
14602
+ major: false,
14603
+ half: i === 2,
14604
+ label: null,
14605
+ originalPaddings: cm - 3 + i * this.snapCm
14606
+ });
14607
+ }
14608
+ }
14609
+ }
14610
+ }
14611
+ this.ticks = ticks;
14612
+ }
14613
+ buildTicksInch() {
14614
+ const totalInch = Math.ceil(this.pxToInch(this.containerWidthPx));
14615
+ const ticks = [];
14616
+ for (let inch = 0; inch <= totalInch; inch++) {
14617
+ const position = this.inchToPx(inch);
14618
+ ticks.push({ position, major: true, half: false, label: Math.abs(inch - 1), originalPaddings: inch - 1 }); // -1
14619
+ if (inch <= totalInch) {
14620
+ for (let i = 1; i < 8; i++) {
14621
+ const tickPosition = position + this.inchToPx(i * this.snapInch);
14622
+ if (tickPosition < this.containerWidthPx) {
14623
+ ticks.push({
14624
+ position: tickPosition,
14625
+ major: false,
14626
+ half: i === 4,
14627
+ label: null,
14628
+ originalPaddings: inch - 1 + i * this.snapInch
14629
+ });
14630
+ }
14306
14631
  }
14307
14632
  }
14308
14633
  }
@@ -14313,14 +14638,20 @@ class EditorRulerComponent {
14313
14638
  const pointX = this.getClientX(ev);
14314
14639
  const rect = this.rulerContainer.nativeElement.getBoundingClientRect();
14315
14640
  this.dragging = target;
14316
- if (target === 'left') {
14317
- this.dragOffsetX = pointX - rect.left - this.leftPx();
14641
+ if (target === 'leftMarginPageFormat') {
14642
+ this.dragOffsetX = pointX - rect.left - this.leftMarginPageFormatPx();
14318
14643
  }
14319
14644
  else if (target === 'first') {
14320
14645
  this.dragOffsetX = pointX - rect.left - this.firstLinePx();
14321
14646
  }
14322
- else {
14323
- this.dragOffsetX = pointX - rect.left - this.rightPx();
14647
+ else if (target === 'rightMarginPageFormat') {
14648
+ this.dragOffsetX = pointX - rect.left - this.rightMarginPageFormatPx();
14649
+ }
14650
+ else if (target === 'leftIndent') {
14651
+ this.dragOffsetX = pointX - rect.left - this.leftIndentPx();
14652
+ }
14653
+ else if (target === 'rightIndent') {
14654
+ this.dragOffsetX = pointX - rect.left - this.rightIndentPx();
14324
14655
  }
14325
14656
  this.showGuide.set(true);
14326
14657
  this.guideX.set(this.getCurrentDraggedPx());
@@ -14337,21 +14668,25 @@ class EditorRulerComponent {
14337
14668
  }
14338
14669
  getCurrentDraggedPx() {
14339
14670
  switch (this.dragging) {
14340
- case 'left':
14341
- return this.leftPx();
14671
+ case 'leftMarginPageFormat':
14672
+ return this.leftMarginPageFormatPx();
14342
14673
  case 'first':
14343
14674
  return this.firstLinePx();
14344
- case 'right':
14345
- return this.rightPx();
14675
+ case 'rightMarginPageFormat':
14676
+ return this.rightMarginPageFormatPx();
14677
+ case 'leftIndent':
14678
+ return this.leftIndentPx();
14679
+ case 'rightIndent':
14680
+ return this.rightIndentPx();
14346
14681
  }
14347
14682
  }
14348
14683
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: EditorRulerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
14349
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.5", type: EditorRulerComponent, isStandalone: true, selector: "app-nod-editor-ruler", 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 #rulerContainer>\n <div\n class=\"left-area\"\n [style.width.px]=\"defaultPadding * pxPerCm + offsetPosition\"></div>\n <div\n class=\"right-area\"\n [style.width.px]=\"defaultPadding * pxPerCm + offsetPosition\"></div>\n <div class=\"ruler-track\">\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]=\"leftPx()\"\n (mousedown)=\"startDrag($event, 'left')\"\n (touchstart)=\"startDrag($event, 'left')\" />\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 <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-field-up\"\n class=\"page-marker\"\n [style.left.px]=\"rightPx()\"\n (mousedown)=\"startDrag($event, 'right')\"\n (touchstart)=\"startDrag($event, 'right')\" />\n @if (showGuide()) {\n <div\n class=\"drag-guide\"\n [style.left.px]=\"guideX() + offsetPosition\"></div>\n }\n</div>\n", styles: [":host{display:flex;width:100%;height:22px;justify-content:center;align-items:center}.ruler-container{position:relative;height:18px;width:804px;padding:0 5px;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:ew-resize;z-index:2;transform:translate(-25%)}.drag-guide{position:absolute;height:2000px;top:10px;width:1px;z-index:9999;pointer-events:none;will-change:left}.paragraph-marker{top:-6px}.page-marker{bottom:-6px}.left-area,.right-area{position:absolute;height:18px}.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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
14684
+ 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 } }, 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 [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 class=\"ruler-track\">\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 <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;width:100%;height:22px;justify-content:center;align-items:center}.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 }); }
14350
14685
  }
14351
14686
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: EditorRulerComponent, decorators: [{
14352
14687
  type: Component,
14353
- args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'app-nod-editor-ruler', imports: [MatIconModule], template: "<div\n class=\"ruler-container\"\n #rulerContainer>\n <div\n class=\"left-area\"\n [style.width.px]=\"defaultPadding * pxPerCm + offsetPosition\"></div>\n <div\n class=\"right-area\"\n [style.width.px]=\"defaultPadding * pxPerCm + offsetPosition\"></div>\n <div class=\"ruler-track\">\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]=\"leftPx()\"\n (mousedown)=\"startDrag($event, 'left')\"\n (touchstart)=\"startDrag($event, 'left')\" />\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 <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-field-up\"\n class=\"page-marker\"\n [style.left.px]=\"rightPx()\"\n (mousedown)=\"startDrag($event, 'right')\"\n (touchstart)=\"startDrag($event, 'right')\" />\n @if (showGuide()) {\n <div\n class=\"drag-guide\"\n [style.left.px]=\"guideX() + offsetPosition\"></div>\n }\n</div>\n", styles: [":host{display:flex;width:100%;height:22px;justify-content:center;align-items:center}.ruler-container{position:relative;height:18px;width:804px;padding:0 5px;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:ew-resize;z-index:2;transform:translate(-25%)}.drag-guide{position:absolute;height:2000px;top:10px;width:1px;z-index:9999;pointer-events:none;will-change:left}.paragraph-marker{top:-6px}.page-marker{bottom:-6px}.left-area,.right-area{position:absolute;height:18px}.left-area{left:0}.right-area{right:0}\n"] }]
14354
- }], propDecorators: { rulerContainer: [{
14688
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'app-nod-editor-ruler', imports: [MatIconModule, AsyncPipe], template: "<div\n class=\"ruler-container\"\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 class=\"ruler-track\">\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 <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;width:100%;height:22px;justify-content:center;align-items:center}.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"] }]
14689
+ }], ctorParameters: () => [], propDecorators: { rulerContainer: [{
14355
14690
  type: ViewChild,
14356
14691
  args: ['rulerContainer', { static: true }]
14357
14692
  }], onResize: [{
@@ -14383,6 +14718,7 @@ class EditorComponent {
14383
14718
  this.clipboard = clipboard;
14384
14719
  this.isMobile = false;
14385
14720
  this.externalElementTagNames = ['APP-NODER-INPUT', 'APP-NODER-SIGNATURE', 'APP-NODER-DATEPICKER'];
14721
+ this.rulerUnit = input.required();
14386
14722
  this.class = 'base-editor';
14387
14723
  this.subscriptions = [];
14388
14724
  this.sidenavComponentRef = null;
@@ -14398,7 +14734,7 @@ class EditorComponent {
14398
14734
  initEditor(content) {
14399
14735
  this.ngOnDestroy();
14400
14736
  this.editor = new Editor(content, this.container, this.editorService, this.regulatorService, this.commandsService, this.clipboard, this.externalElementTagNames, this.customPageWidth);
14401
- this.subscriptions.push(this.toggleSidenavSubscription());
14737
+ this.subscriptions.push(this.toggleSidenavSubscription(), this.searchBarSubscription());
14402
14738
  }
14403
14739
  toggleSidenavSubscription() {
14404
14740
  return this.editorService.toggleSidenav$.subscribe(data => {
@@ -14423,6 +14759,17 @@ class EditorComponent {
14423
14759
  this.cdr.markForCheck();
14424
14760
  });
14425
14761
  }
14762
+ searchBarSubscription() {
14763
+ return this.editorService.displaySearchBar$.subscribe(x => {
14764
+ this.showSearchBar = x;
14765
+ if (this.showSearchBar) {
14766
+ setTimeout(() => {
14767
+ this.searchBar?.focusInput();
14768
+ });
14769
+ }
14770
+ this.cdr.markForCheck();
14771
+ });
14772
+ }
14426
14773
  removeSidenavComponent() {
14427
14774
  if (!this.sidenavComponentRef) {
14428
14775
  return;
@@ -14430,13 +14777,13 @@ class EditorComponent {
14430
14777
  this.componentService.removeComponent(this.sidenavComponentRef);
14431
14778
  this.sidenavComponentRef = null;
14432
14779
  }
14433
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: EditorComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: ComponentService }, { token: EditorService }, { token: i0.Injector }, { token: RegulatorService }, { token: CommandsService }, { token: i5$1.Clipboard }], target: i0.ɵɵFactoryTarget.Component }); }
14434
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.5", type: EditorComponent, isStandalone: false, selector: "app-nod-editor", inputs: { isMobile: "isMobile", externalElementTagNames: "externalElementTagNames", customPageWidth: "customPageWidth", content: "content" }, host: { properties: { "class": "this.class" } }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, static: true }, { propertyName: "sidenavContainer", first: true, predicate: ["drawerContainer"], descendants: true, static: true }, { propertyName: "sidenav", first: true, predicate: ["drawer"], descendants: true, static: true }], ngImport: i0, template: "<mat-drawer-container\n class=\"sidenav-container\"\n [hasBackdrop]=\"sidenavProperties.hasBackdrop\">\n <mat-drawer-content>\n <app-nod-editor-ruler />\n <div class=\"container\">\n <div\n #container\n class=\"edit-container\"></div>\n </div>\n </mat-drawer-content>\n <mat-drawer\n #drawer\n [class.drawer-mobile]=\"isMobile\"\n [autoFocus]=\"sidenavProperties.autoFocus\"\n [position]=\"sidenavProperties.position\"\n [mode]=\"sidenavProperties.mode\">\n <div\n #drawerContainer\n class=\"drawer-container\"></div>\n </mat-drawer>\n</mat-drawer-container>\n", styles: [":host{flex:1;display:flex;position:relative}.sidenav-container{width:100%}.mat-drawer-content{overflow:hidden}.container{height:100%;display:flex;justify-content:center}.drawer-container{height:100%}.drawer-mobile{width:100%}\n"], dependencies: [{ kind: "component", type: EditorRulerComponent, selector: "app-nod-editor-ruler" }, { kind: "component", type: i7.MatDrawer, selector: "mat-drawer", inputs: ["position", "mode", "disableClose", "autoFocus", "opened"], outputs: ["openedChange", "opened", "openedStart", "closed", "closedStart", "positionChanged"], exportAs: ["matDrawer"] }, { kind: "component", type: i7.MatDrawerContainer, selector: "mat-drawer-container", inputs: ["autosize", "hasBackdrop"], outputs: ["backdropClick"], exportAs: ["matDrawerContainer"] }, { kind: "component", type: i7.MatDrawerContent, selector: "mat-drawer-content" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
14780
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: EditorComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: ComponentService }, { token: EditorService }, { token: i0.Injector }, { token: RegulatorService }, { token: CommandsService }, { token: i5$3.Clipboard }], target: i0.ɵɵFactoryTarget.Component }); }
14781
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.5", type: EditorComponent, isStandalone: false, selector: "app-nod-editor", inputs: { isMobile: { classPropertyName: "isMobile", publicName: "isMobile", isSignal: false, isRequired: false, transformFunction: null }, externalElementTagNames: { classPropertyName: "externalElementTagNames", publicName: "externalElementTagNames", isSignal: false, isRequired: false, transformFunction: null }, customPageWidth: { classPropertyName: "customPageWidth", publicName: "customPageWidth", isSignal: false, isRequired: false, transformFunction: null }, content: { classPropertyName: "content", publicName: "content", isSignal: false, isRequired: false, transformFunction: null }, rulerUnit: { classPropertyName: "rulerUnit", publicName: "rulerUnit", isSignal: true, isRequired: true, transformFunction: null } }, host: { properties: { "class": "this.class" } }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, static: true }, { propertyName: "sidenavContainer", first: true, predicate: ["drawerContainer"], descendants: true, static: true }, { propertyName: "sidenav", first: true, predicate: ["drawer"], descendants: true, static: true }, { propertyName: "searchBar", first: true, predicate: EditorSearchBarComponent, descendants: true }], ngImport: i0, template: "<mat-drawer-container\n class=\"sidenav-container\"\n [hasBackdrop]=\"sidenavProperties.hasBackdrop\">\n <mat-drawer-content>\n <app-nod-editor-ruler [unit]=\"rulerUnit()\" />\n @if (showSearchBar) {\n <app-nod-editor-search-bar />\n }\n <div class=\"container\">\n <div\n #container\n class=\"edit-container\"></div>\n </div>\n </mat-drawer-content>\n <mat-drawer\n #drawer\n [class.drawer-mobile]=\"isMobile\"\n [autoFocus]=\"sidenavProperties.autoFocus\"\n [position]=\"sidenavProperties.position\"\n [mode]=\"sidenavProperties.mode\">\n <div\n #drawerContainer\n class=\"drawer-container\"></div>\n </mat-drawer>\n</mat-drawer-container>\n", styles: [":host{flex:1;display:flex;position:relative}.sidenav-container{width:100%}.mat-drawer-content{overflow:hidden}.container{height:100%;display:flex;justify-content:center}.drawer-container{height:100%}.drawer-mobile{width:100%}app-nod-editor-search-bar{position:absolute;right:15px;top:0}\n"], dependencies: [{ kind: "component", type: EditorRulerComponent, selector: "app-nod-editor-ruler", inputs: ["unit"] }, { kind: "component", type: EditorSearchBarComponent, selector: "app-nod-editor-search-bar" }, { kind: "component", type: i8.MatDrawer, selector: "mat-drawer", inputs: ["position", "mode", "disableClose", "autoFocus", "opened"], outputs: ["openedChange", "opened", "openedStart", "closed", "closedStart", "positionChanged"], exportAs: ["matDrawer"] }, { kind: "component", type: i8.MatDrawerContainer, selector: "mat-drawer-container", inputs: ["autosize", "hasBackdrop"], outputs: ["backdropClick"], exportAs: ["matDrawerContainer"] }, { kind: "component", type: i8.MatDrawerContent, selector: "mat-drawer-content" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
14435
14782
  }
14436
14783
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: EditorComponent, decorators: [{
14437
14784
  type: Component,
14438
- args: [{ selector: 'app-nod-editor', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<mat-drawer-container\n class=\"sidenav-container\"\n [hasBackdrop]=\"sidenavProperties.hasBackdrop\">\n <mat-drawer-content>\n <app-nod-editor-ruler />\n <div class=\"container\">\n <div\n #container\n class=\"edit-container\"></div>\n </div>\n </mat-drawer-content>\n <mat-drawer\n #drawer\n [class.drawer-mobile]=\"isMobile\"\n [autoFocus]=\"sidenavProperties.autoFocus\"\n [position]=\"sidenavProperties.position\"\n [mode]=\"sidenavProperties.mode\">\n <div\n #drawerContainer\n class=\"drawer-container\"></div>\n </mat-drawer>\n</mat-drawer-container>\n", styles: [":host{flex:1;display:flex;position:relative}.sidenav-container{width:100%}.mat-drawer-content{overflow:hidden}.container{height:100%;display:flex;justify-content:center}.drawer-container{height:100%}.drawer-mobile{width:100%}\n"] }]
14439
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: ComponentService }, { type: EditorService }, { type: i0.Injector }, { type: RegulatorService }, { type: CommandsService }, { type: i5$1.Clipboard }], propDecorators: { isMobile: [{
14785
+ args: [{ selector: 'app-nod-editor', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<mat-drawer-container\n class=\"sidenav-container\"\n [hasBackdrop]=\"sidenavProperties.hasBackdrop\">\n <mat-drawer-content>\n <app-nod-editor-ruler [unit]=\"rulerUnit()\" />\n @if (showSearchBar) {\n <app-nod-editor-search-bar />\n }\n <div class=\"container\">\n <div\n #container\n class=\"edit-container\"></div>\n </div>\n </mat-drawer-content>\n <mat-drawer\n #drawer\n [class.drawer-mobile]=\"isMobile\"\n [autoFocus]=\"sidenavProperties.autoFocus\"\n [position]=\"sidenavProperties.position\"\n [mode]=\"sidenavProperties.mode\">\n <div\n #drawerContainer\n class=\"drawer-container\"></div>\n </mat-drawer>\n</mat-drawer-container>\n", styles: [":host{flex:1;display:flex;position:relative}.sidenav-container{width:100%}.mat-drawer-content{overflow:hidden}.container{height:100%;display:flex;justify-content:center}.drawer-container{height:100%}.drawer-mobile{width:100%}app-nod-editor-search-bar{position:absolute;right:15px;top:0}\n"] }]
14786
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: ComponentService }, { type: EditorService }, { type: i0.Injector }, { type: RegulatorService }, { type: CommandsService }, { type: i5$3.Clipboard }], propDecorators: { isMobile: [{
14440
14787
  type: Input
14441
14788
  }], externalElementTagNames: [{
14442
14789
  type: Input
@@ -14453,6 +14800,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImpor
14453
14800
  }], sidenav: [{
14454
14801
  type: ViewChild,
14455
14802
  args: ['drawer', { static: true }]
14803
+ }], searchBar: [{
14804
+ type: ViewChild,
14805
+ args: [EditorSearchBarComponent]
14456
14806
  }], class: [{
14457
14807
  type: HostBinding,
14458
14808
  args: ['class']
@@ -14493,19 +14843,21 @@ class EditorModule {
14493
14843
  NoderTableComponent,
14494
14844
  ResizerComponent,
14495
14845
  TableOverlayMenuComponent], imports: [CommonModule,
14846
+ EditorRulerComponent,
14847
+ EditorSearchBarComponent,
14496
14848
  MatButtonModule,
14497
14849
  MatDialogModule,
14498
14850
  MatIconModule,
14499
- EditorRulerComponent,
14500
14851
  MatSidenavModule,
14501
14852
  MatTooltipModule,
14502
14853
  ReactiveFormsModule,
14503
14854
  TranslateModule], exports: [EditorComponent] }); }
14504
14855
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: EditorModule, providers: [ComponentService, CustomContentService, OverlayService, RegulatorService, ExternalElementService, CommandsService], imports: [CommonModule,
14856
+ EditorRulerComponent,
14857
+ EditorSearchBarComponent,
14505
14858
  MatButtonModule,
14506
14859
  MatDialogModule,
14507
14860
  MatIconModule,
14508
- EditorRulerComponent,
14509
14861
  MatSidenavModule,
14510
14862
  MatTooltipModule,
14511
14863
  ReactiveFormsModule,
@@ -14526,10 +14878,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImpor
14526
14878
  ],
14527
14879
  imports: [
14528
14880
  CommonModule,
14881
+ EditorRulerComponent,
14882
+ EditorSearchBarComponent,
14529
14883
  MatButtonModule,
14530
14884
  MatDialogModule,
14531
14885
  MatIconModule,
14532
- EditorRulerComponent,
14533
14886
  MatSidenavModule,
14534
14887
  MatTooltipModule,
14535
14888
  ReactiveFormsModule,
@@ -14655,60 +15008,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImpor
14655
15008
  args: [{ imports: [CommonModule, MatButtonModule, MatIconModule, MatTooltipModule, MatMenuModule, TranslateModule], selector: 'app-nod-editor-title-mobile', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n *ngIf=\"showTitle\"\n class=\"menu-header\">\n <div class=\"file-name\">\n <span\n #titleSpan\n class=\"title\"\n [matTooltip]=\"'NODER.LABEL.DOUBLE_CLICK_TO_RENAME' | translate\"\n (blur)=\"onRenameTitle($event)\"\n (keydown.enter)=\"$event.target.blur()\"\n (click)=\"onFocus($event)\">\n {{ title }}\n </span>\n </div>\n</div>\n<div class=\"editor-mode\">\n <div class=\"circles\">\n <div class=\"circle\"></div>\n <div class=\"circle\"></div>\n <div class=\"circle\"></div>\n </div>\n <button\n mat-icon-button\n [matMenuTriggerFor]=\"modeMenu\"\n [matMenuTriggerRestoreFocus]=\"false\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"{{ modeOptions[selectedMode].icon }}\" />\n </button>\n <mat-menu\n #modeMenu=\"matMenu\"\n class=\"noder-editor-title-mobile-menu\"\n yPosition=\"above\">\n <ng-container *ngFor=\"let mode of modeOptions\">\n <button\n *ngIf=\"selectedMode !== mode.id\"\n mat-icon-button\n (click)=\"selectedMode = mode.id; changeMode.emit(mode.id)\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"{{ mode.icon }}\" />\n </button>\n </ng-container>\n </mat-menu>\n</div>\n", styles: [":host{display:flex;position:relative;align-items:center;width:100%}.menu-header{width:calc(100% - 48px);line-height:0;z-index:1}.file-name{display:block;margin:0 8px;overflow:hidden}.title{font-size:18px;font-weight:400;line-height:normal;outline:none;display:inline-block;white-space:nowrap;min-width:1px;overflow:hidden;max-width:100%;-webkit-user-select:none;user-select:none}.title:not(:focus){text-overflow:ellipsis}.editor-mode{display:flex;flex-direction:column;position:relative}.circles{display:flex;flex-direction:row;justify-content:center;width:100%;position:absolute;top:-8px}.circle{width:4px;height:4px;border-radius:50%}.circle:not(:last-child){margin-right:5px}.mdc-icon-button{min-width:40px;min-height:40px;width:40px;height:40px;padding:8px}::ng-deep .noder-editor-title-mobile-menu{min-width:auto!important;min-height:auto!important;overflow:hidden!important}::ng-deep .noder-editor-title-mobile-menu .mat-mdc-menu-content{display:flex;flex-direction:column-reverse}::ng-deep .noder-editor-title-mobile-menu .mdc-icon-button{margin-bottom:10px}\n"] }]
14656
15009
  }] });
14657
15010
 
14658
- class EditorSearchDialogComponent extends DestroyComponent {
14659
- constructor(editorService) {
14660
- super();
14661
- this.editorService = editorService;
14662
- this.searchControl = new FormControl('');
14663
- this.replaceControl = new FormControl('');
14664
- this.isReplace = false;
14665
- this.searchIteration$ = this.editorService.searchIteration$;
14666
- }
14667
- ngOnInit() {
14668
- this.searchControl.valueChanges
14669
- .pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this.destroy$))
14670
- .subscribe(() => (this.editorService.searchOptions = { term: this.searchControl.value, skipCurrent: false, backwards: false }));
14671
- }
14672
- onClose() {
14673
- this.editorService.openSearchDialog = false;
14674
- }
14675
- findNext() {
14676
- this.editorService.searchOptions = {
14677
- term: this.searchControl.value,
14678
- skipCurrent: true,
14679
- backwards: false
14680
- };
14681
- }
14682
- findPrev() {
14683
- this.editorService.searchOptions = {
14684
- term: this.searchControl.value,
14685
- skipCurrent: true,
14686
- backwards: true
14687
- };
14688
- }
14689
- setReplace() {
14690
- this.isReplace = !this.isReplace;
14691
- }
14692
- replace() {
14693
- this.editorService.replace = { replaceValue: this.replaceControl.value, searchValue: this.searchControl.value };
14694
- }
14695
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: EditorSearchDialogComponent, deps: [{ token: EditorService }], target: i0.ɵɵFactoryTarget.Component }); }
14696
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.5", type: EditorSearchDialogComponent, isStandalone: true, selector: "app-nod-editor-search-dialog", providers: [ExternalElementService], usesInheritance: true, ngImport: i0, template: "<div class=\"line search-form\">\n <mat-form-field\n color=\"accent\"\n floatLabel=\"auto\"\n appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.SEARCH_FOR' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"searchControl\"\n (keydown.enter)=\"findNext()\" />\n </mat-form-field>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"findPrev()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-arrow-onleft\"></mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"findNext()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-arrow-onright\"></mat-icon>\n </button>\n</div>\n<ng-container *ngIf=\"{ searchIteration: searchIteration$ | async } as data\">\n <div\n class=\"replace-form\"\n *ngIf=\"isReplace\">\n <mat-form-field\n color=\"accent\"\n floatLabel=\"auto\"\n appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.REPLACE_WITH' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"replaceControl\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n (keydown.enter)=\"replace()\" />\n </mat-form-field>\n <button\n type=\"button\"\n mat-button\n (click)=\"replace()\">\n {{ 'NODER.LABEL.REPLACE' | translate }}\n </button>\n </div>\n <div class=\"search-options\">\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Toggle Replace Mode\"\n (click)=\"setReplace()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"{{ isReplace ? 'icon-arrow-up' : 'icon-arrow-down' }}\"></mat-icon>\n </button>\n <div class=\"counter\">\n <span>\n {{\n 'NODER.COMPLEX_LABEL.OF_COUNTER'\n | translate: { current: data.searchIteration?.current ?? 0, total: data.searchIteration?.total ?? 0 }\n }}\n </span>\n </div>\n <button\n type=\"button\"\n mat-icon-button\n [matTooltip]=\"'NODER.LABEL.CLOSE' | translate\"\n (click)=\"onClose()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-cancel-thin\"></mat-icon>\n </button>\n </div>\n</ng-container>\n", styles: [":host{min-height:56px;max-width:100%;display:block;font-size:10px;padding:3px}.close-icon{position:absolute;right:1px;top:1px}.search-form,.replace-form,.search-options{display:flex}mat-form-field{padding-left:10px}.mdc-button{font-size:12px;padding:0 8px;min-width:unset}.search-options{line-height:40px}.search-options .counter{text-align:center;flex:1}.mat-mdc-input-element{font-size:10px}.replace-form .mdc-button{width:80px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { 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: "component", type: i4.MatIconButton, selector: "button[mat-icon-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: MatInputModule }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i5$3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5$3.MatLabel, selector: "mat-label" }, { 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: ReactiveFormsModule }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
14697
- }
14698
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: EditorSearchDialogComponent, decorators: [{
14699
- type: Component,
14700
- args: [{ imports: [
14701
- CommonModule,
14702
- FormsModule,
14703
- MatButtonModule,
14704
- MatIconModule,
14705
- MatInputModule,
14706
- MatTooltipModule,
14707
- ReactiveFormsModule,
14708
- TranslateModule
14709
- ], providers: [ExternalElementService], changeDetection: ChangeDetectionStrategy.OnPush, selector: 'app-nod-editor-search-dialog', template: "<div class=\"line search-form\">\n <mat-form-field\n color=\"accent\"\n floatLabel=\"auto\"\n appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.SEARCH_FOR' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"searchControl\"\n (keydown.enter)=\"findNext()\" />\n </mat-form-field>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"findPrev()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-arrow-onleft\"></mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"findNext()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-arrow-onright\"></mat-icon>\n </button>\n</div>\n<ng-container *ngIf=\"{ searchIteration: searchIteration$ | async } as data\">\n <div\n class=\"replace-form\"\n *ngIf=\"isReplace\">\n <mat-form-field\n color=\"accent\"\n floatLabel=\"auto\"\n appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.REPLACE_WITH' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"replaceControl\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n (keydown.enter)=\"replace()\" />\n </mat-form-field>\n <button\n type=\"button\"\n mat-button\n (click)=\"replace()\">\n {{ 'NODER.LABEL.REPLACE' | translate }}\n </button>\n </div>\n <div class=\"search-options\">\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Toggle Replace Mode\"\n (click)=\"setReplace()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"{{ isReplace ? 'icon-arrow-up' : 'icon-arrow-down' }}\"></mat-icon>\n </button>\n <div class=\"counter\">\n <span>\n {{\n 'NODER.COMPLEX_LABEL.OF_COUNTER'\n | translate: { current: data.searchIteration?.current ?? 0, total: data.searchIteration?.total ?? 0 }\n }}\n </span>\n </div>\n <button\n type=\"button\"\n mat-icon-button\n [matTooltip]=\"'NODER.LABEL.CLOSE' | translate\"\n (click)=\"onClose()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-cancel-thin\"></mat-icon>\n </button>\n </div>\n</ng-container>\n", styles: [":host{min-height:56px;max-width:100%;display:block;font-size:10px;padding:3px}.close-icon{position:absolute;right:1px;top:1px}.search-form,.replace-form,.search-options{display:flex}mat-form-field{padding-left:10px}.mdc-button{font-size:12px;padding:0 8px;min-width:unset}.search-options{line-height:40px}.search-options .counter{text-align:center;flex:1}.mat-mdc-input-element{font-size:10px}.replace-form .mdc-button{width:80px}\n"] }]
14710
- }], ctorParameters: () => [{ type: EditorService }] });
14711
-
14712
15011
  var EditorToolbarMode;
14713
15012
  (function (EditorToolbarMode) {
14714
15013
  EditorToolbarMode[EditorToolbarMode["Base"] = 0] = "Base";
@@ -15905,7 +16204,7 @@ class InsertTableMobileComponent {
15905
16204
  control.setValue(newValue);
15906
16205
  }
15907
16206
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: InsertTableMobileComponent, deps: [{ token: EditorService }, { token: i2.FormBuilder }, { token: ToolbarCoreService }], target: i0.ɵɵFactoryTarget.Component }); }
15908
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.5", type: InsertTableMobileComponent, isStandalone: true, selector: "app-nod-insert-table-mobile", ngImport: i0, template: "<div class=\"content\">\n <div class=\"title\">{{ 'NODER.LABEL.TABLE_OPTIONS' | translate }}</div>\n <div\n class=\"inputs\"\n [formGroup]=\"form\">\n <div class=\"rows\">\n <div class=\"input-title\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-table-rows\" />\n {{ 'NODER.LABEL.ROWS' | translate }}:\n </div>\n <mat-form-field appearance=\"outline\">\n <button\n mat-fab\n (click)=\"onChangeRows(-1)\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-remove\" />\n </button>\n <input\n matInput\n required\n type=\"number\"\n [formControl]=\"form.controls.rows\"\n (change)=\"onChangeInputRow()\" />\n <button\n mat-fab\n (click)=\"onChangeRows(1)\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-add\" />\n </button>\n <mat-error>{{ 'NODER.LABEL.THE_ROW_IS_REQUIRED' | translate }}.</mat-error>\n </mat-form-field>\n </div>\n <div class=\"columns\">\n <div class=\"input-title\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-table-columns\" />\n {{ 'NODER.LABEL.COLUMNS' | translate }}:\n </div>\n <mat-form-field appearance=\"outline\">\n <button\n mat-fab\n (click)=\"onChangeColumns(-1)\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-remove\" />\n </button>\n <input\n matInput\n required\n type=\"number\"\n [formControl]=\"form.controls.columns\"\n (change)=\"onChangeInputColumn()\" />\n <button\n mat-fab\n (click)=\"onChangeColumns(1)\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-add\" />\n </button>\n <mat-error>{{ 'NODER.LABEL.THE_COLUMN_IS_REQUIRED' | translate }}.</mat-error>\n </mat-form-field>\n </div>\n </div>\n <div class=\"quick-select\">\n <div class=\"quick-select-header\">\n <div class=\"separator\"></div>\n <div class=\"quick-select-title\">{{ 'NODER.LABEL.QUICK_SELECT' | translate }}</div>\n <div class=\"separator\"></div>\n </div>\n <div class=\"selection\">\n <ng-container *ngFor=\"let row of rows\">\n <div class=\"row\">\n <ng-container *ngFor=\"let column of columns\">\n <div\n class=\"cell-container\"\n (click)=\"onSetTable(row, column)\">\n <div\n class=\"cell\"\n [class.highlighted]=\"row <= form.controls.rows.value && column <= form.controls.columns.value\"></div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n</div>\n<div class=\"actions\">\n <button\n mat-mini-fab\n (click)=\"onClose()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-cancel-thin\" />\n </button>\n <button\n mat-mini-fab\n [disabled]=\"form.invalid\"\n (click)=\"onApply()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-done-thin\" />\n </button>\n</div>\n", styles: [":host{display:flex;flex-direction:column;width:100%;height:100%;padding:30px;justify-content:space-between;overflow:hidden}.title{font-size:16px;font-weight:500;padding-bottom:10px}.inputs{display:flex;justify-content:space-between;padding-top:10px;padding-bottom:0}.rows,.columns{display:flex;flex-direction:column;width:45%}.input-title{display:flex;align-items:center;font-size:14px;font-weight:400;padding-bottom:10px}.input-title .mat-icon{margin-right:10px}.quick-select{display:flex;flex-direction:column}.quick-select-header{display:flex;padding-bottom:20px}.quick-select-title{padding:0 10px;font-size:10px;font-weight:500;letter-spacing:1px;text-transform:uppercase}.separator{flex:1;align-self:center;border-bottom-width:1px;border-bottom-style:solid}.row{display:flex;flex-direction:row}.cell-container{width:10%;aspect-ratio:1/1;padding:2px}.cell{height:100%;width:100%;border-width:1px;border-style:solid}.mat-mdc-form-field ::ng-deep .mat-mdc-text-field-wrapper{padding:0}.mat-mdc-form-field ::ng-deep .mat-mdc-form-field-infix{display:flex;flex-direction:row;padding:0}.mat-mdc-form-field ::ng-deep .mdc-fab{width:48px;height:48px}.mat-mdc-input-element{text-align:center}.actions{text-align:end}.actions .mdc-fab:first-child{margin-right:10px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatMiniFabButton, selector: "button[mat-mini-fab]", exportAs: ["matButton"] }, { kind: "component", type: i4.MatFabButton, selector: "button[mat-fab]", inputs: ["extended"], exportAs: ["matButton"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i5$3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5$3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
16207
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.5", type: InsertTableMobileComponent, isStandalone: true, selector: "app-nod-insert-table-mobile", ngImport: i0, template: "<div class=\"content\">\n <div class=\"title\">{{ 'NODER.LABEL.TABLE_OPTIONS' | translate }}</div>\n <div\n class=\"inputs\"\n [formGroup]=\"form\">\n <div class=\"rows\">\n <div class=\"input-title\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-table-rows\" />\n {{ 'NODER.LABEL.ROWS' | translate }}:\n </div>\n <mat-form-field appearance=\"outline\">\n <button\n mat-fab\n (click)=\"onChangeRows(-1)\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-remove\" />\n </button>\n <input\n matInput\n required\n type=\"number\"\n [formControl]=\"form.controls.rows\"\n (change)=\"onChangeInputRow()\" />\n <button\n mat-fab\n (click)=\"onChangeRows(1)\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-add\" />\n </button>\n <mat-error>{{ 'NODER.LABEL.THE_ROW_IS_REQUIRED' | translate }}.</mat-error>\n </mat-form-field>\n </div>\n <div class=\"columns\">\n <div class=\"input-title\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-table-columns\" />\n {{ 'NODER.LABEL.COLUMNS' | translate }}:\n </div>\n <mat-form-field appearance=\"outline\">\n <button\n mat-fab\n (click)=\"onChangeColumns(-1)\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-remove\" />\n </button>\n <input\n matInput\n required\n type=\"number\"\n [formControl]=\"form.controls.columns\"\n (change)=\"onChangeInputColumn()\" />\n <button\n mat-fab\n (click)=\"onChangeColumns(1)\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-add\" />\n </button>\n <mat-error>{{ 'NODER.LABEL.THE_COLUMN_IS_REQUIRED' | translate }}.</mat-error>\n </mat-form-field>\n </div>\n </div>\n <div class=\"quick-select\">\n <div class=\"quick-select-header\">\n <div class=\"separator\"></div>\n <div class=\"quick-select-title\">{{ 'NODER.LABEL.QUICK_SELECT' | translate }}</div>\n <div class=\"separator\"></div>\n </div>\n <div class=\"selection\">\n <ng-container *ngFor=\"let row of rows\">\n <div class=\"row\">\n <ng-container *ngFor=\"let column of columns\">\n <div\n class=\"cell-container\"\n (click)=\"onSetTable(row, column)\">\n <div\n class=\"cell\"\n [class.highlighted]=\"row <= form.controls.rows.value && column <= form.controls.columns.value\"></div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n</div>\n<div class=\"actions\">\n <button\n mat-mini-fab\n (click)=\"onClose()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-cancel-thin\" />\n </button>\n <button\n mat-mini-fab\n [disabled]=\"form.invalid\"\n (click)=\"onApply()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-done-thin\" />\n </button>\n</div>\n", styles: [":host{display:flex;flex-direction:column;width:100%;height:100%;padding:30px;justify-content:space-between;overflow:hidden}.title{font-size:16px;font-weight:500;padding-bottom:10px}.inputs{display:flex;justify-content:space-between;padding-top:10px;padding-bottom:0}.rows,.columns{display:flex;flex-direction:column;width:45%}.input-title{display:flex;align-items:center;font-size:14px;font-weight:400;padding-bottom:10px}.input-title .mat-icon{margin-right:10px}.quick-select{display:flex;flex-direction:column}.quick-select-header{display:flex;padding-bottom:20px}.quick-select-title{padding:0 10px;font-size:10px;font-weight:500;letter-spacing:1px;text-transform:uppercase}.separator{flex:1;align-self:center;border-bottom-width:1px;border-bottom-style:solid}.row{display:flex;flex-direction:row}.cell-container{width:10%;aspect-ratio:1/1;padding:2px}.cell{height:100%;width:100%;border-width:1px;border-style:solid}.mat-mdc-form-field ::ng-deep .mat-mdc-text-field-wrapper{padding:0}.mat-mdc-form-field ::ng-deep .mat-mdc-form-field-infix{display:flex;flex-direction:row;padding:0}.mat-mdc-form-field ::ng-deep .mdc-fab{width:48px;height:48px}.mat-mdc-input-element{text-align:center}.actions{text-align:end}.actions .mdc-fab:first-child{margin-right:10px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatMiniFabButton, selector: "button[mat-mini-fab]", exportAs: ["matButton"] }, { kind: "component", type: i4.MatFabButton, selector: "button[mat-fab]", inputs: ["extended"], exportAs: ["matButton"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i5$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
15909
16208
  }
15910
16209
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: InsertTableMobileComponent, decorators: [{
15911
16210
  type: Component,
@@ -16547,11 +16846,18 @@ class PageSetupComponent {
16547
16846
  this.pageSize.width = Math.round(this.pageSize.customWidth * rate);
16548
16847
  this.pageSize.height = Math.round(this.pageSize.customHeight * rate);
16549
16848
  }
16849
+ const pageMargin = new MarginModel();
16550
16850
  const pageFormat = new PageFormatModel({
16551
16851
  pageHeight: this.pageSize.orientation == PageOrientations.Portrait ? this.pageSize.height : this.pageSize.width,
16552
16852
  pageWidth: this.pageSize.orientation == PageOrientations.Portrait ? this.pageSize.width : this.pageSize.height,
16553
16853
  unit: this.pageSize.unit,
16554
- pageOrientation: this.pageSize.orientation
16854
+ pageOrientation: this.pageSize.orientation,
16855
+ marginBottom: pageMargin.bottom,
16856
+ marginFooter: pageMargin.footer,
16857
+ marginHeader: pageMargin.header,
16858
+ marginLeft: pageMargin.left,
16859
+ marginRight: pageMargin.right,
16860
+ marginTop: pageMargin.top
16555
16861
  });
16556
16862
  switch (this.selectedDocumentArea) {
16557
16863
  case DocumentAreas.SelectedText:
@@ -16589,7 +16895,7 @@ class PageSetupComponent {
16589
16895
  return customPageSize;
16590
16896
  }
16591
16897
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: PageSetupComponent, deps: [{ token: EditorService }, { token: ToolbarCoreService }, { token: i3$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
16592
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.5", type: PageSetupComponent, isStandalone: true, selector: "app-nod-page-setup", viewQueries: [{ propertyName: "pageSizeForm", first: true, predicate: ["pageSizeForm"], descendants: true }], ngImport: i0, template: "<div class=\"title\">\n <mat-icon\n fontSet=\"noder-icon\"\n (click)=\"onClose()\"\n fontIcon=\"icon-arrow-forward\" />\n <span>{{ 'NODER.LABEL.PAGE_SETUP' | translate }}</span>\n</div>\n<form #pageSizeForm=\"ngForm\">\n <div class=\"content\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.APPLY_TO' | translate }}</mat-label>\n <mat-select [(value)]=\"selectedDocumentArea\">\n <mat-option [value]=\"documentAreas.WholeDocument\">{{ 'NODER.LABEL.WHOLE_DOCUMENT' | translate }}</mat-option>\n <mat-option [value]=\"documentAreas.ThisSection\">{{ 'NODER.LABEL.THIS_SECTION' | translate }}</mat-option>\n @if (hasSelection$ | async) {\n <mat-option [value]=\"documentAreas.SelectedText\">{{ 'NODER.LABEL.SELECTED_TEXT' | translate }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n <div class=\"orientation\">\n <div class=\"label\">{{ 'NODER.LABEL.ORIENTATION' | translate }}</div>\n <mat-radio-group\n aria-label=\"Select an option\"\n [(ngModel)]=\"pageSize.orientation\"\n name=\"orientation\"\n (change)=\"onPageOrientationChanged()\">\n <mat-radio-button [value]=\"pageOrientations.Portrait\">\n <span>{{ 'NODER.LABEL.PORTRAIT' | translate }}</span>\n </mat-radio-button>\n <mat-radio-button [value]=\"pageOrientations.Landscape\">\n <span>{{ 'NODER.LABEL.LANDSCAPE' | translate }}</span>\n </mat-radio-button>\n </mat-radio-group>\n </div>\n <div class=\"page-format\">\n <div class=\"page-format-tile\">\n <div class=\"label\">{{ 'NODER.LABEL.PAGE_FORMAT' | translate }}</div>\n <div class=\"checkbox-area\">\n <div class=\"checkbox-label\">{{ 'NODER.LABEL.CUSTOM_SIZE' | translate }}</div>\n <mat-checkbox\n [checked]=\"pageSize.isCustom\"\n (change)=\"toggleCustomSize($event)\" />\n </div>\n </div>\n @if (!pageSize.isCustom) {\n <div class=\"page-size\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.SIZE' | translate }}</mat-label>\n <mat-select\n [(value)]=\"pageSizeName\"\n (selectionChange)=\"onPageSizeChange()\">\n @for (option of pageSizes; track option) {\n <mat-option [value]=\"option.name\">\n <div class=\"size-option\">\n <span class=\"option-name\">{{ option.name + ' ' }}</span>\n <span class=\"option-size\">{{ option.size }}</span>\n </div>\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n </div>\n } @else {\n <div class=\"page-custom-size\">\n <mat-form-field\n appearance=\"outline\"\n class=\"size-unit\">\n <mat-label>{{ 'NODER.LABEL.MEASURE' | translate }}</mat-label>\n <mat-select\n [(ngModel)]=\"pageSize.unit\"\n name=\"unit\"\n (valueChange)=\"onUnitChanged($event)\">\n <mat-option [value]=\"sizeUnits.Millimeters\">{{ 'NODER.LABEL.MILLIMETERS' | translate }}</mat-option>\n <mat-option [value]=\"sizeUnits.Inches\">{{ 'NODER.LABEL.INCHES' | translate }}</mat-option>\n </mat-select>\n </mat-form-field>\n <div class=\"size-panel\">\n <mat-form-field\n appearance=\"outline\"\n class=\"custom-width\">\n <mat-label>{{ ('NODER.LABEL.WIDTH' | translate) + currentUnit }}</mat-label>\n <input\n matInput\n [(ngModel)]=\"pageSize.customWidth\"\n name=\"customWidth\" />\n </mat-form-field>\n <button\n mat-button\n (click)=\"onIncrementWidth()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-add\"></mat-icon>\n </button>\n <button\n mat-button\n (click)=\"onDecrementWidth()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-remove\"></mat-icon>\n </button>\n </div>\n <div class=\"size-panel\">\n <mat-form-field\n appearance=\"outline\"\n class=\"custom-height\">\n <mat-label>{{ ('NODER.LABEL.HEIGHT' | translate) + currentUnit }}</mat-label>\n <input\n matInput\n [(ngModel)]=\"pageSize.customHeight\"\n name=\"customHeight\" />\n </mat-form-field>\n <button\n mat-button\n (click)=\"onIncrementHeight()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-add\"></mat-icon>\n </button>\n <button\n mat-button\n (click)=\"onDecrementHeight()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-remove\"></mat-icon>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"actions\">\n <button\n mat-stroked-button\n (click)=\"onClose()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-cancel-thin\" />\n </button>\n <button\n mat-flat-button\n color=\"primary\"\n (click)=\"onApply()\"\n [disabled]=\"pageSizeForm.pristine\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-done-thin\" />\n </button>\n </div>\n</form>\n", styles: [":host{display:flex;flex-direction:column;height:100%;width:400px}.title{margin:12px 16px;height:32px;display:flex;align-items:center;gap:8px}.title span{overflow:hidden;text-overflow:ellipsis;font-size:16px;font-style:normal;font-weight:500;line-height:normal}.content{display:flex;flex-direction:column;height:100%;overflow:hidden;padding:8px 16px 0;gap:24px}.actions{display:flex;justify-content:flex-end;margin:0 16px 16px;gap:10px}.actions .mdc-button{width:32px;height:32px;min-width:32px;padding:0}.actions .mdc-button .mat-icon{margin-right:0;margin-left:0}.orientation{display:flex;flex-direction:column;align-items:flex-start;gap:8px}.orientation mat-radio-group{display:flex;width:100%;gap:16px}.label{font-size:14px;font-style:normal;font-weight:400;line-height:normal}.page-format{display:flex;flex-direction:column;gap:16px}.page-format-tile{display:flex;align-items:center;justify-content:space-between}.page-format-tile .checkbox-area{display:flex;align-items:center}.checkbox-label{font-size:12px;font-style:normal;font-weight:400;line-height:normal}.custom-width,.custom-height,.size-unit{width:120px}.page-custom-size{display:flex;flex-direction:column}.size-panel{display:flex;gap:10px}.size-panel .mdc-button{width:40px;height:40px;min-width:40px;padding:0}.size-panel .mdc-button .mat-icon{margin-right:0;margin-left:0}.size-option{display:flex;flex-direction:column}.option-name{font-weight:400}.option-size{font-size:12px}form{display:flex;flex-direction:column;flex:1}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { 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: MatFormFieldModule }, { kind: "component", type: i5$3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5$3.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3$1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i8.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i3$2.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i10.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatRadioModule }, { kind: "directive", type: i12.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i12.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
16898
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.5", type: PageSetupComponent, isStandalone: true, selector: "app-nod-page-setup", viewQueries: [{ propertyName: "pageSizeForm", first: true, predicate: ["pageSizeForm"], descendants: true }], ngImport: i0, template: "<div class=\"title\">\n <mat-icon\n fontSet=\"noder-icon\"\n (click)=\"onClose()\"\n fontIcon=\"icon-arrow-forward\" />\n <span>{{ 'NODER.LABEL.PAGE_SETUP' | translate }}</span>\n</div>\n<form #pageSizeForm=\"ngForm\">\n <div class=\"content\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.APPLY_TO' | translate }}</mat-label>\n <mat-select [(value)]=\"selectedDocumentArea\">\n <mat-option [value]=\"documentAreas.WholeDocument\">{{ 'NODER.LABEL.WHOLE_DOCUMENT' | translate }}</mat-option>\n <mat-option [value]=\"documentAreas.ThisSection\">{{ 'NODER.LABEL.THIS_SECTION' | translate }}</mat-option>\n @if (hasSelection$ | async) {\n <mat-option [value]=\"documentAreas.SelectedText\">{{ 'NODER.LABEL.SELECTED_TEXT' | translate }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n <div class=\"orientation\">\n <div class=\"label\">{{ 'NODER.LABEL.ORIENTATION' | translate }}</div>\n <mat-radio-group\n aria-label=\"Select an option\"\n [(ngModel)]=\"pageSize.orientation\"\n name=\"orientation\"\n (change)=\"onPageOrientationChanged()\">\n <mat-radio-button [value]=\"pageOrientations.Portrait\">\n <span>{{ 'NODER.LABEL.PORTRAIT' | translate }}</span>\n </mat-radio-button>\n <mat-radio-button [value]=\"pageOrientations.Landscape\">\n <span>{{ 'NODER.LABEL.LANDSCAPE' | translate }}</span>\n </mat-radio-button>\n </mat-radio-group>\n </div>\n <div class=\"page-format\">\n <div class=\"page-format-tile\">\n <div class=\"label\">{{ 'NODER.LABEL.PAGE_FORMAT' | translate }}</div>\n <div class=\"checkbox-area\">\n <div class=\"checkbox-label\">{{ 'NODER.LABEL.CUSTOM_SIZE' | translate }}</div>\n <mat-checkbox\n [checked]=\"pageSize.isCustom\"\n (change)=\"toggleCustomSize($event)\" />\n </div>\n </div>\n @if (!pageSize.isCustom) {\n <div class=\"page-size\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.SIZE' | translate }}</mat-label>\n <mat-select\n [(value)]=\"pageSizeName\"\n (selectionChange)=\"onPageSizeChange()\">\n @for (option of pageSizes; track option) {\n <mat-option [value]=\"option.name\">\n <div class=\"size-option\">\n <span class=\"option-name\">{{ option.name + ' ' }}</span>\n <span class=\"option-size\">{{ option.size }}</span>\n </div>\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n </div>\n } @else {\n <div class=\"page-custom-size\">\n <mat-form-field\n appearance=\"outline\"\n class=\"size-unit\">\n <mat-label>{{ 'NODER.LABEL.MEASURE' | translate }}</mat-label>\n <mat-select\n [(ngModel)]=\"pageSize.unit\"\n name=\"unit\"\n (valueChange)=\"onUnitChanged($event)\">\n <mat-option [value]=\"sizeUnits.Millimeters\">{{ 'NODER.LABEL.MILLIMETERS' | translate }}</mat-option>\n <mat-option [value]=\"sizeUnits.Inches\">{{ 'NODER.LABEL.INCHES' | translate }}</mat-option>\n </mat-select>\n </mat-form-field>\n <div class=\"size-panel\">\n <mat-form-field\n appearance=\"outline\"\n class=\"custom-width\">\n <mat-label>{{ ('NODER.LABEL.WIDTH' | translate) + currentUnit }}</mat-label>\n <input\n matInput\n [(ngModel)]=\"pageSize.customWidth\"\n name=\"customWidth\" />\n </mat-form-field>\n <button\n mat-button\n (click)=\"onIncrementWidth()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-add\"></mat-icon>\n </button>\n <button\n mat-button\n (click)=\"onDecrementWidth()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-remove\"></mat-icon>\n </button>\n </div>\n <div class=\"size-panel\">\n <mat-form-field\n appearance=\"outline\"\n class=\"custom-height\">\n <mat-label>{{ ('NODER.LABEL.HEIGHT' | translate) + currentUnit }}</mat-label>\n <input\n matInput\n [(ngModel)]=\"pageSize.customHeight\"\n name=\"customHeight\" />\n </mat-form-field>\n <button\n mat-button\n (click)=\"onIncrementHeight()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-add\"></mat-icon>\n </button>\n <button\n mat-button\n (click)=\"onDecrementHeight()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-remove\"></mat-icon>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"actions\">\n <button\n mat-stroked-button\n (click)=\"onClose()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-cancel-thin\" />\n </button>\n <button\n mat-flat-button\n color=\"primary\"\n (click)=\"onApply()\"\n [disabled]=\"pageSizeForm.pristine\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-done-thin\" />\n </button>\n </div>\n</form>\n", styles: [":host{display:flex;flex-direction:column;height:100%;width:400px}.title{margin:12px 16px;height:32px;display:flex;align-items:center;gap:8px}.title span{overflow:hidden;text-overflow:ellipsis;font-size:16px;font-style:normal;font-weight:500;line-height:normal}.content{display:flex;flex-direction:column;height:100%;overflow:hidden;padding:8px 16px 0;gap:24px}.actions{display:flex;justify-content:flex-end;margin:0 16px 16px;gap:10px}.actions .mdc-button{width:32px;height:32px;min-width:32px;padding:0}.actions .mdc-button .mat-icon{margin-right:0;margin-left:0}.orientation{display:flex;flex-direction:column;align-items:flex-start;gap:8px}.orientation mat-radio-group{display:flex;width:100%;gap:16px}.label{font-size:14px;font-style:normal;font-weight:400;line-height:normal}.page-format{display:flex;flex-direction:column;gap:16px}.page-format-tile{display:flex;align-items:center;justify-content:space-between}.page-format-tile .checkbox-area{display:flex;align-items:center}.checkbox-label{font-size:12px;font-style:normal;font-weight:400;line-height:normal}.custom-width,.custom-height,.size-unit{width:120px}.page-custom-size{display:flex;flex-direction:column}.size-panel{display:flex;gap:10px}.size-panel .mdc-button{width:40px;height:40px;min-width:40px;padding:0}.size-panel .mdc-button .mat-icon{margin-right:0;margin-left:0}.size-option{display:flex;flex-direction:column}.option-name{font-weight:400}.option-size{font-size:12px}form{display:flex;flex-direction:column;flex:1}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { 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: MatFormFieldModule }, { kind: "component", type: i5$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5$1.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3$1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i8$1.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i3$2.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i10.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatRadioModule }, { kind: "directive", type: i12.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i12.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
16593
16899
  }
16594
16900
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: PageSetupComponent, decorators: [{
16595
16901
  type: Component,
@@ -16740,7 +17046,7 @@ class AddLinkDialogComponent {
16740
17046
  this.dialogRef.close({ text: this.form.controls.text.value, link: this.form.controls.link.value });
16741
17047
  }
16742
17048
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: AddLinkDialogComponent, deps: [{ token: i1$2.MatDialogRef }, { token: i2.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
16743
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.5", type: AddLinkDialogComponent, isStandalone: true, selector: "app-nod-add-link-dialog", host: { listeners: { "keydown.esc": "onClose()", "keydown.enter": "onApply()" }, properties: { "class.noder-modal": "this.modal" } }, ngImport: i0, template: "<div mat-dialog-title>{{ 'NODER.LABEL.ADD_LINK' | translate }}</div>\n<div\n mat-dialog-content\n [formGroup]=\"form\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.TEXT' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"form.controls.text\"\n required />\n <mat-error>{{ 'NODER.LABEL.THE_TEXT_IS_REQUIRED' | translate }}.</mat-error>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.LINK' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"form.controls.link\"\n required />\n <mat-error>{{ 'NODER.LABEL.THE_LINK_IS_REQUIRED' | translate }}.</mat-error>\n </mat-form-field>\n</div>\n<div mat-dialog-actions>\n <button\n mat-button\n (click)=\"onClose()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-cancel-thin\" />\n {{ 'NODER.LABEL.CANCEL' | translate }}\n </button>\n <button\n mat-raised-button\n color=\"primary\"\n class=\"apply-btn\"\n [disabled]=\"form.invalid\"\n (click)=\"onApply()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-done-thin\" />\n {{ 'NODER.LABEL.APPLY' | translate }}\n </button>\n</div>\n", styles: [":host{display:flex;flex-direction:column;height:300px;width:430px;overflow:hidden}:host ::ng-deep .mdc-text-field--outlined{--mdc-outlined-text-field-container-shape: 12px;height:48px}:host ::ng-deep .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix{padding-top:12px}.mat-mdc-dialog-title{font-weight:600;padding-top:5px}mat-form-field{width:100%}.mat-mdc-dialog-content{padding-top:10px!important;padding-bottom:0}.mat-mdc-dialog-actions{display:flex;justify-content:center;padding-top:5px;height:40px;margin-bottom:30px}.mat-mdc-dialog-actions button{width:30%;height:100%;letter-spacing:1px;border-radius:8px;text-transform:uppercase}.mat-mdc-dialog-actions button .apply-btn{font-weight:400}.mat-mdc-dialog-actions button .mat-icon{font-size:24px;height:24px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: MatDialogModule }, { kind: "directive", type: i1$2.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1$2.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1$2.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i5$3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5$3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5$3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
17049
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.5", type: AddLinkDialogComponent, isStandalone: true, selector: "app-nod-add-link-dialog", host: { listeners: { "keydown.esc": "onClose()", "keydown.enter": "onApply()" }, properties: { "class.noder-modal": "this.modal" } }, ngImport: i0, template: "<div mat-dialog-title>{{ 'NODER.LABEL.ADD_LINK' | translate }}</div>\n<div\n mat-dialog-content\n [formGroup]=\"form\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.TEXT' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"form.controls.text\"\n required />\n <mat-error>{{ 'NODER.LABEL.THE_TEXT_IS_REQUIRED' | translate }}.</mat-error>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.LINK' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"form.controls.link\"\n required />\n <mat-error>{{ 'NODER.LABEL.THE_LINK_IS_REQUIRED' | translate }}.</mat-error>\n </mat-form-field>\n</div>\n<div mat-dialog-actions>\n <button\n mat-button\n (click)=\"onClose()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-cancel-thin\" />\n {{ 'NODER.LABEL.CANCEL' | translate }}\n </button>\n <button\n mat-raised-button\n color=\"primary\"\n class=\"apply-btn\"\n [disabled]=\"form.invalid\"\n (click)=\"onApply()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-done-thin\" />\n {{ 'NODER.LABEL.APPLY' | translate }}\n </button>\n</div>\n", styles: [":host{display:flex;flex-direction:column;height:300px;width:430px;overflow:hidden}:host ::ng-deep .mdc-text-field--outlined{--mdc-outlined-text-field-container-shape: 12px;height:48px}:host ::ng-deep .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix{padding-top:12px}.mat-mdc-dialog-title{font-weight:600;padding-top:5px}mat-form-field{width:100%}.mat-mdc-dialog-content{padding-top:10px!important;padding-bottom:0}.mat-mdc-dialog-actions{display:flex;justify-content:center;padding-top:5px;height:40px;margin-bottom:30px}.mat-mdc-dialog-actions button{width:30%;height:100%;letter-spacing:1px;border-radius:8px;text-transform:uppercase}.mat-mdc-dialog-actions button .apply-btn{font-weight:400}.mat-mdc-dialog-actions button .mat-icon{font-size:24px;height:24px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: MatDialogModule }, { kind: "directive", type: i1$2.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1$2.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1$2.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i5$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
16744
17050
  }
16745
17051
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: AddLinkDialogComponent, decorators: [{
16746
17052
  type: Component,
@@ -16789,7 +17095,7 @@ class AddLinkMobileComponent {
16789
17095
  this.onApply();
16790
17096
  }
16791
17097
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: AddLinkMobileComponent, deps: [{ token: EditorService }, { token: i2.FormBuilder }, { token: ToolbarCoreService }], target: i0.ɵɵFactoryTarget.Component }); }
16792
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.5", type: AddLinkMobileComponent, isStandalone: true, selector: "app-nod-add-link-mobile", ngImport: i0, template: "<div class=\"content\">\n <div class=\"title\">{{ 'NODER.LABEL.LINK_OPTIONS' | translate }}</div>\n <div\n class=\"inputs\"\n [formGroup]=\"form\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.TEXT' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"form.controls.text\"\n (keydown.enter)=\"onEnter()\"\n required />\n <mat-error>{{ 'NODER.LABEL.THE_TEXT_IS_REQUIRED' | translate }}.</mat-error>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.LINK' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"form.controls.link\"\n (keydown.enter)=\"onEnter()\"\n required />\n <mat-error>{{ 'NODER.LABEL.THE_LINK_IS_REQUIRED' | translate }}.</mat-error>\n </mat-form-field>\n </div>\n</div>\n<div class=\"actions\">\n <button\n mat-mini-fab\n (click)=\"onClose()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-cancel-thin\" />\n </button>\n <button\n mat-mini-fab\n [disabled]=\"form.invalid\"\n (click)=\"onApply()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-done-thin\" />\n </button>\n</div>\n", styles: [":host{display:flex;flex-direction:column;width:100%;height:100%;padding:30px;justify-content:space-between;overflow:hidden}:host ::ng-deep .mdc-text-field--outlined{--mdc-outlined-text-field-container-shape: 12px;height:48px}:host ::ng-deep .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix{padding-top:12px}.title{font-size:16px;font-weight:500}mat-form-field{width:100%}.inputs{padding-top:10px;padding-bottom:0}.actions{text-align:end}.actions .mdc-fab:first-child{margin-right:10px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatMiniFabButton, selector: "button[mat-mini-fab]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i5$3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5$3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5$3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
17098
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.5", type: AddLinkMobileComponent, isStandalone: true, selector: "app-nod-add-link-mobile", ngImport: i0, template: "<div class=\"content\">\n <div class=\"title\">{{ 'NODER.LABEL.LINK_OPTIONS' | translate }}</div>\n <div\n class=\"inputs\"\n [formGroup]=\"form\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.TEXT' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"form.controls.text\"\n (keydown.enter)=\"onEnter()\"\n required />\n <mat-error>{{ 'NODER.LABEL.THE_TEXT_IS_REQUIRED' | translate }}.</mat-error>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.LINK' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"form.controls.link\"\n (keydown.enter)=\"onEnter()\"\n required />\n <mat-error>{{ 'NODER.LABEL.THE_LINK_IS_REQUIRED' | translate }}.</mat-error>\n </mat-form-field>\n </div>\n</div>\n<div class=\"actions\">\n <button\n mat-mini-fab\n (click)=\"onClose()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-cancel-thin\" />\n </button>\n <button\n mat-mini-fab\n [disabled]=\"form.invalid\"\n (click)=\"onApply()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-done-thin\" />\n </button>\n</div>\n", styles: [":host{display:flex;flex-direction:column;width:100%;height:100%;padding:30px;justify-content:space-between;overflow:hidden}:host ::ng-deep .mdc-text-field--outlined{--mdc-outlined-text-field-container-shape: 12px;height:48px}:host ::ng-deep .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix{padding-top:12px}.title{font-size:16px;font-weight:500}mat-form-field{width:100%}.inputs{padding-top:10px;padding-bottom:0}.actions{text-align:end}.actions .mdc-fab:first-child{margin-right:10px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatMiniFabButton, selector: "button[mat-mini-fab]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i5$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
16793
17099
  }
16794
17100
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: AddLinkMobileComponent, decorators: [{
16795
17101
  type: Component,
@@ -16880,5 +17186,5 @@ class OperationModel {
16880
17186
  * Generated bundle index. Do not edit.
16881
17187
  */
16882
17188
 
16883
- export { AddLinkDialogComponent, AddLinkMobileComponent, Alignment, BaseNoderComponent, 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_PARAGRAPH_STYLE, DEFAULT_TAB_WIDTH, DEFAULT_TEXT_STYLE, DEFAULT_TOOLBAR_STYLES, DefaultImageApiService, DestroyComponent, DocumentInfo, DocumentModel, DocumentNameModel, DocxModel, DomHelper, EditorComponent, EditorMobileToolbarComponent, EditorModule, EditorSearchDialogComponent, EditorService, EditorTitleComponent, EditorTitleMobileComponent, EditorToolbarComponent, EditorToolbarMode, EditorToolbarModule, EditorToolbarService, ElementDataModel, ElementModel, ExternalComponent, ExternalElementModel, ExternalElementService, FileSourceModel, FormatStyleHelper, HYPERLINK_FONT_COLOR, HYPERLINK_HEADING_STYLE_ID, ImageApiService, ImageDataModel, LastDocumentRevisionModel, MenuDropdownsComponent, MenuDropdownsMobileComponent, Mode, NEW_LINE_MARKUP, NoderTranslateLoader, NumberingLevelModel, OperationModel, OperationsHistoryInfoModel, PageSetupComponent, PageType, ParagraphStyleModel, RevisionHelper, RevisionModel, TextFormatMobileComponent, TextStyleModel, ToolbarActionsComponent };
17189
+ export { AddLinkDialogComponent, AddLinkMobileComponent, Alignment, BaseNoderComponent, 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_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, FormatStyleHelper, HYPERLINK_FONT_COLOR, HYPERLINK_HEADING_STYLE_ID, ImageApiService, ImageDataModel, LastDocumentRevisionModel, MenuDropdownsComponent, MenuDropdownsMobileComponent, Mode, NEW_LINE_MARKUP, NoderTranslateLoader, NumberingLevelModel, OperationModel, OperationsHistoryInfoModel, PageSetupComponent, PageType, ParagraphStyleModel, RevisionHelper, RevisionModel, TextFormatMobileComponent, TextStyleModel, ToolbarActionsComponent };
16884
17190
  //# sourceMappingURL=talrace-ngx-noder.mjs.map