@tmdjr/ngx-editor-js2 0.0.7 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -20,7 +20,7 @@ Ngx-EditorJs2 is an Angular-based, highly extensible block-style editor inspired
20
20
  To install Ngx-EditorJs2, run:
21
21
 
22
22
  ```sh
23
- npm install @tmdjr/ngx-editorjs2
23
+ npm install @tmdjr/ngx-editor-js2
24
24
  ```
25
25
 
26
26
  ## Usage
@@ -41,7 +41,7 @@ import { NgxEditorJs2Component } from '@tmdjr/ngx-editor-js2';
41
41
  `,
42
42
  })
43
43
  ```
44
- - Implementation found in the [Demo Src](https://github.com/Ba5ik7/ngx-editorjs2/blob/main/projects/ngx-editorjs2-demo/src/app/components/document.component.ts#L9)
44
+ - Implementation found in the [Demo Src](https://github.com/Ba5ik7/ngx-editor-js2-blocks/blob/main/projects/demo/src/app/app.component.ts)
45
45
 
46
46
  Css is required for the editor to function properly. Add the following to your global styles:
47
47
 
@@ -91,10 +91,6 @@ Ngx-EditorJs2 comes with built-in block components:
91
91
 
92
92
  You can also add custom blocks by implementing the `NGX_EDITORJS_OPTIONS` provider:
93
93
 
94
- ```sh
95
- npm install @tmdjr/ngx-editor-js2-image
96
- ```
97
-
98
94
  ```ts
99
95
  import { NGX_EDITORJS_OPTIONS } from '@tmdjr/ngx-editor-js2';
100
96
  import { NgxEditorJs2ImageComponent } from '@tmdjr/ngx-editor-js2-image';
@@ -119,6 +115,50 @@ export const appConfig: ApplicationConfig = {
119
115
  };
120
116
  ```
121
117
 
118
+ ## 📦 Custom Blocks for Ngx-EditorJs2
119
+
120
+ Ngx-EditorJs2 allows you to extend its functionality with custom blocks. Below are some additional components that can be installed separately to enhance the editor with images, blockquotes, and code blocks.
121
+
122
+ ### 🖼️ Image Block
123
+ Easily add and manage images within the editor.
124
+
125
+ - **Component:** `NgxEditorJs2ImageComponent`
126
+ - **Install:**
127
+ ```sh
128
+ npm install @tmdjr/ngx-editor-js2-image
129
+ ```
130
+ - **Package:** [@tmdjr/ngx-editor-js2-image](https://www.npmjs.com/package/@tmdjr/ngx-editor-js2-image)
131
+
132
+ ---
133
+
134
+ ### 📝 Blockquotes Block
135
+ Insert styled blockquotes to emphasize key points in the content.
136
+
137
+ - **Component:** `NgxEditorJs2BlockquotesComponent`
138
+ - **Install:**
139
+ ```sh
140
+ npm install @tmdjr/ngx-editor-js2-blockquotes
141
+ ```
142
+ - **Package:** [@tmdjr/ngx-editor-js2-blockquotes](https://www.npmjs.com/package/@tmdjr/ngx-editor-js2-blockquotes)
143
+
144
+ ---
145
+
146
+ ### 💻 Code Block
147
+ Embed syntax-highlighted code snippets using CodeMirror.
148
+
149
+ - **Component:** `NgxEditorJs2CodemirrorComponent`
150
+ - **Install:**
151
+ ```sh
152
+ npm install @tmdjr/ngx-editor-js2-codemirror
153
+ ```
154
+ - **Package:** [@tmdjr/ngx-editor-js2-codemirror](https://www.npmjs.com/package/@tmdjr/ngx-editor-js2-codemirror)
155
+
156
+ ---
157
+
158
+ For more details and documentation, visit the official repository.
159
+
160
+
161
+
122
162
  ## Development
123
163
  To contribute, clone the repository and install dependencies:
124
164
 
@@ -134,29 +174,17 @@ Build the library:
134
174
  npm run build-ngx-editor-js2
135
175
  ```
136
176
 
137
- Build Customs Blocks:
138
-
139
- ```sh
140
- npm run build-ngx-editor-js2-image
141
- // etc...
142
- ```
143
-
144
177
  Run the development server:
145
-
146
- ```sh
147
- npm run start-demo
148
- ```
149
-
150
178
  If you want to live reload the library, run the following commands in succession:
151
179
 
152
180
  ```sh
153
181
  npm run watch-ngx-editor-js2 // Important to run 1st
154
- npm run watch-ngx-editor-js2-image
155
- // etc...
156
-
157
182
  npm run start-demo
158
183
  ```
159
184
 
185
+ *Custom Block development should be done in the [Ngx-Editor-Js2-Blocks](https://github.com/Ba5ik7/ngx-editor-js2-blocks) MonoRepo.*
186
+
187
+
160
188
  ## Architecture Overview
161
189
  Ngx-EditorJs2 is built on Angular's reactive architecture, using RxJS to manage state and data streams. The library is composed of several Services and Directives that handle different aspects of the editor:
162
190
  ```mermaid
@@ -196,6 +224,8 @@ Each block in Ngx-EditorJs2 is part of a larger **`formGroup`**, allowing seamle
196
224
  - The **editor-level formGroup** acts as a centralized store, making it easier to retrieve or modify block data.
197
225
  - Blocks can **interact with services and directives**, enhancing their capabilities dynamically.
198
226
 
227
+ *Custom Block development should be done in the [Ngx-Editor-Js2-Blocks](https://github.com/Ba5ik7/ngx-editor-js2-blocks) MonoRepo.*
228
+
199
229
  ## License
200
230
  MIT License © 2025 [Wesley DuSell](https://github.com/ba5ik7)
201
231
 
@@ -1,17 +1,16 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, ElementRef, input, forwardRef, Directive, HostListener, output, Component, signal, Injectable, ViewContainerRef, effect, InjectionToken, viewChild, EventEmitter, Input, Output } from '@angular/core';
2
+ import { inject, ElementRef, input, forwardRef, Directive, HostListener, output, Component, signal, Injectable, ViewContainerRef, effect, InjectionToken, viewChild, EventEmitter, Renderer2, Output } from '@angular/core';
3
3
  import * as i2 from '@angular/forms';
4
4
  import { NG_VALUE_ACCESSOR, FormControl, ReactiveFormsModule, FormBuilder, FormsModule } from '@angular/forms';
5
5
  import { startWith, combineLatest, map, firstValueFrom, of, from, tap, filter, defaultIfEmpty, Observable, lastValueFrom, forkJoin, iif, switchMap, mergeMap, BehaviorSubject, distinctUntilChanged, delay, exhaustMap, merge, fromEvent, debounceTime } from 'rxjs';
6
- import * as i2$1 from '@angular/material/core';
7
- import { MatRipple, MatRippleModule } from '@angular/material/core';
6
+ import { MatRipple } from '@angular/material/core';
8
7
  import * as i1$1 from '@angular/cdk/drag-drop';
9
8
  import { CdkDragHandle, CdkDrag, CdkDropList } from '@angular/cdk/drag-drop';
10
9
  import * as i1 from '@angular/cdk/overlay';
11
10
  import { OverlayModule, Overlay } from '@angular/cdk/overlay';
12
11
  import * as i1$2 from '@angular/material/icon';
13
12
  import { MatIcon, MatIconModule } from '@angular/material/icon';
14
- import { AsyncPipe, NgSwitch, NgSwitchCase, NgTemplateOutlet, NgClass, NgIf } from '@angular/common';
13
+ import { AsyncPipe, NgSwitch, NgSwitchCase, NgTemplateOutlet, NgClass } from '@angular/common';
15
14
  import { toObservable } from '@angular/core/rxjs-interop';
16
15
  import { MatFormField, MatLabel } from '@angular/material/form-field';
17
16
  import { MatInput } from '@angular/material/input';
@@ -24,7 +23,7 @@ class ControlAccessorDirective {
24
23
  onChange = () => { };
25
24
  onTouched = () => { };
26
25
  writeValue() {
27
- this.elementRef.nativeElement.innerText = this.defaultValue() || '';
26
+ this.elementRef.nativeElement.innerHTML = this.defaultValue() || '';
28
27
  }
29
28
  registerOnChange(fn) {
30
29
  this.onChange = fn;
@@ -36,7 +35,7 @@ class ControlAccessorDirective {
36
35
  this.onTouched();
37
36
  }
38
37
  onInput() {
39
- this.onChange(this.elementRef.nativeElement.innerText);
38
+ this.onChange(this.elementRef.nativeElement.innerHTML);
40
39
  }
41
40
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: ControlAccessorDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
42
41
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.1.5", type: ControlAccessorDirective, isStandalone: true, selector: "[controlAccessor]", inputs: { defaultValue: { classPropertyName: "defaultValue", publicName: "defaultValue", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "blur": "onBlur()", "input": "onInput()" } }, providers: [
@@ -936,291 +935,134 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImpor
936
935
  }], ctorParameters: () => [] });
937
936
 
938
937
  class ToolbarInlineComponent {
939
- renderer;
940
- selection;
941
- closeInlineToobarOverlayEmitter = new EventEmitter();
938
+ // @Input() selection!: Selection;
939
+ selection = input.required();
940
+ closeOverlayEmitter = new EventEmitter();
941
+ renderer = inject(Renderer2);
942
942
  url = '';
943
- showURLInputField = false;
943
+ showURLInputField = signal(false);
944
944
  savedRanges = [];
945
- constructor(renderer) {
946
- this.renderer = renderer;
947
- }
948
- ngOnInit() { }
949
- closeInlineToobarOverlay() {
950
- this.closeInlineToobarOverlayEmitter.emit();
951
- }
952
- addInlineTag(tag, optionValue) {
945
+ options = [
946
+ { icon: 'format_bold', action: 'bold' },
947
+ { icon: 'format_italic', action: 'italic' },
948
+ { icon: 'format_underlined', action: 'underline' },
949
+ { icon: 'strikethrough_s', action: 'strikethrough' },
950
+ { icon: 'format_list_bulleted', action: 'insertUnorderedList' },
951
+ { icon: 'format_list_numbered', action: 'insertOrderedList' },
952
+ { icon: 'highlight', action: 'highlightColor' },
953
+ { icon: 'format_align_left', action: 'justifyLeft' },
954
+ { icon: 'format_align_center', action: 'justifyCenter' },
955
+ { icon: 'format_align_right', action: 'justifyRight' },
956
+ { icon: 'format_align_justify', action: 'justifyFull' },
957
+ ];
958
+ addInlineTag(tag) {
953
959
  // https://stackoverflow.com/questions/60581285/execcommand-is-now-obsolete-whats-the-alternative
954
- document.execCommand(tag, true, optionValue);
955
- this.closeInlineToobarOverlay();
960
+ document.execCommand(tag);
961
+ this.closeOverlayEmitter.emit();
956
962
  }
957
- addCustomInlineTag(tag, className) {
958
- const range = this.selection.getRangeAt(0);
963
+ addClassTag(tag, className) {
964
+ const range = this.selection().getRangeAt(0);
959
965
  const element = this.renderer.createElement(tag);
960
966
  element.className = className ?? '';
961
967
  element.innerHTML = range.toString();
962
968
  range.deleteContents();
963
969
  range.insertNode(element);
964
- this.closeInlineToobarOverlay();
970
+ this.closeOverlayEmitter.emit();
965
971
  }
966
972
  clearTags() {
967
973
  document.execCommand('removeFormat');
968
974
  document.execCommand('unlink');
969
- this.closeInlineToobarOverlay();
975
+ this.closeOverlayEmitter.emit();
970
976
  }
971
977
  openUrlInput() {
972
- this.savedRanges.push(this.selection.getRangeAt(0));
973
- this.showURLInputField = true;
978
+ this.savedRanges.push(this.selection().getRangeAt(0));
979
+ this.showURLInputField.set(true);
974
980
  }
975
981
  createLink() {
976
- this.selection.removeAllRanges();
977
- this.selection.addRange(this.savedRanges.pop());
982
+ this.selection().removeAllRanges();
983
+ this.selection().addRange(this.savedRanges.pop());
978
984
  document.execCommand('createLink', false, this.url);
979
- this.closeInlineToobarOverlay();
985
+ this.closeOverlayEmitter.emit();
980
986
  }
981
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: ToolbarInlineComponent, deps: [{ token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
982
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.5", type: ToolbarInlineComponent, isStandalone: true, selector: "toolbar-inline", inputs: { selection: "selection" }, outputs: { closeInlineToobarOverlayEmitter: "closeInlineToobarOverlay" }, ngImport: i0, template: `
983
- <div class="block-list-container mat-elevation-z8">
984
- <div class="block-option-list-panel">
985
- <div
986
- class="block-option-list-item"
987
- matRipple
988
- (click)="addInlineTag('bold')"
989
- >
990
- <mat-icon>format_bold</mat-icon>
991
- </div>
992
- <div
993
- class="block-option-list-item"
994
- matRipple
995
- (click)="addInlineTag('italic')"
996
- >
997
- <mat-icon>format_italic</mat-icon>
998
- </div>
999
- <div
1000
- class="block-option-list-item"
1001
- matRipple
1002
- (click)="addInlineTag('underlined')"
1003
- >
1004
- <mat-icon>format_underlined</mat-icon>
1005
- </div>
1006
- <div
1007
- class="block-option-list-item"
1008
- matRipple
1009
- (click)="addInlineTag('strikethrough')"
1010
- >
1011
- <mat-icon>strikethrough_s</mat-icon>
1012
- </div>
1013
- <!-- <div class="block-option-list-item"
1014
- matRipple
1015
- (click)="addInlineTag('hiliteColor', 'red')">
1016
- <mat-icon>highlight</mat-icon>
1017
- </div> -->
1018
- <div
1019
- class="block-option-list-item"
1020
- matRipple
1021
- (click)="addCustomInlineTag('code', 'inline-code-example')"
1022
- >
1023
- <mat-icon>code</mat-icon>
1024
- </div>
1025
- <div class="block-option-list-item" matRipple (click)="openUrlInput()">
1026
- <mat-icon>insert_link</mat-icon>
1027
- </div>
1028
- <div class="block-option-list-item" matRipple (click)="clearTags()">
1029
- <mat-icon>format_clear</mat-icon>
1030
- </div>
1031
-
1032
- <div
1033
- class="block-option-list-item"
1034
- matRipple
1035
- (click)="addInlineTag('justifyLeft')"
1036
- >
1037
- <mat-icon>format_align_left</mat-icon>
1038
- </div>
1039
- <div
1040
- class="block-option-list-item"
1041
- matRipple
1042
- (click)="addInlineTag('justifyCenter')"
1043
- >
1044
- <mat-icon>format_align_center</mat-icon>
1045
- </div>
1046
- <div
1047
- class="block-option-list-item"
1048
- matRipple
1049
- (click)="addInlineTag('justifyRight')"
1050
- >
1051
- <mat-icon>format_align_right</mat-icon>
1052
- </div>
1053
- <div
1054
- class="block-option-list-item"
1055
- matRipple
1056
- (click)="addInlineTag('justifyFull')"
1057
- >
1058
- <mat-icon>format_align_justify</mat-icon>
1059
- </div>
1060
- <div
1061
- class="block-option-list-item"
1062
- matRipple
1063
- (click)="addInlineTag('insertUnorderedList')"
1064
- >
1065
- <mat-icon>format_list_bulleted</mat-icon>
1066
- </div>
1067
- <div
1068
- class="block-option-list-item"
1069
- matRipple
1070
- (click)="addInlineTag('insertOrderedList')"
1071
- >
1072
- <mat-icon>format_list_numbered</mat-icon>
1073
- </div>
1074
- <div
1075
- class="block-option-list-item"
1076
- matRipple
1077
- (click)="addInlineTag('hiliteColor', 'yellow')"
1078
- >
1079
- <mat-icon>highlight</mat-icon>
1080
- </div>
987
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: ToolbarInlineComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
988
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.5", type: ToolbarInlineComponent, isStandalone: true, selector: "toolbar-inline", inputs: { selection: { classPropertyName: "selection", publicName: "selection", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { closeOverlayEmitter: "closeOverlay" }, host: { classAttribute: "mat-elevation-z24" }, ngImport: i0, template: `
989
+ <div class="panel">
990
+ @for (item of options; track $index) {
991
+ <div class="inline-option" (click)="addInlineTag(item.action)">
992
+ <mat-icon>{{ item.icon }}</mat-icon>
1081
993
  </div>
1082
- <div *ngIf="showURLInputField" class="block-option-list-panel">
1083
- <input
1084
- type="text"
1085
- placeholder="Enter URL"
1086
- class="block-option-input"
1087
- [(ngModel)]="url"
1088
- />
1089
- <div class="block-option-list-item" matRipple (click)="createLink()">
1090
- <mat-icon>add</mat-icon>
1091
- </div>
994
+ }
995
+ <div class="inline-option" (click)="addClassTag('code', 'inline-code')">
996
+ <mat-icon>code</mat-icon>
997
+ </div>
998
+ <div class="inline-option" (click)="openUrlInput()">
999
+ <mat-icon>insert_link</mat-icon>
1000
+ </div>
1001
+ <div class="inline-option" (click)="clearTags()">
1002
+ <mat-icon>format_clear</mat-icon>
1003
+ </div>
1004
+ </div>
1005
+
1006
+ @if(showURLInputField()) {
1007
+ <div class="panel">
1008
+ <input
1009
+ type="text"
1010
+ placeholder="Enter URL"
1011
+ class="block-option-input"
1012
+ [(ngModel)]="url"
1013
+ />
1014
+ <div class="inline-option" (click)="createLink()">
1015
+ <mat-icon>add</mat-icon>
1092
1016
  </div>
1093
1017
  </div>
1094
- `, isInline: true, styles: [":host{color:var(--mat-sys-on-secondary);background:var(--mat-sys-secondary)}:host .block-list-container{border-radius:4px}:host .block-option-list-panel{display:flex;width:230px;flex-direction:row;flex-wrap:wrap;gap:1px;border-radius:4px;overflow:auto}:host .block-option-list-item{cursor:pointer;width:32px;height:32px;display:flex;align-items:center;justify-content:center;border-radius:4px}:host .block-option-input{width:197px;height:32px;border:none;outline:none;background-color:transparent;color:#000;font-size:14px;font-weight:400;padding:0 0 0 5px;margin:0;display:flex;align-items:center;justify-content:center;border-radius:4px;box-sizing:border-box}:host .block-option-list-item-text{font-size:16px}:host .block-option-list-item-text{-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "ngmodule", type: MatListModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatRippleModule }, { kind: "directive", type: i2$1.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { 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: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
1018
+ }
1019
+ `, isInline: true, styles: [":host{color:var(--mat-sys-on-secondary);background:var(--mat-sys-secondary);border-radius:8px}:host .panel{display:flex;width:230px;flex-wrap:wrap;gap:1px}:host .inline-option{cursor:pointer;width:32px;height:32px;display:flex;align-items:center;justify-content:center}:host .block-option-input{width:197px;height:32px;border:none;outline:none;color:var(--mat-sys-on-secondary);background-color:transparent;box-sizing:border-box}\n"], dependencies: [{ kind: "ngmodule", type: MatListModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { 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: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
1095
1020
  }
1096
1021
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: ToolbarInlineComponent, decorators: [{
1097
1022
  type: Component,
1098
- args: [{ selector: 'toolbar-inline', imports: [MatListModule, MatIconModule, MatRippleModule, FormsModule, NgIf], template: `
1099
- <div class="block-list-container mat-elevation-z8">
1100
- <div class="block-option-list-panel">
1101
- <div
1102
- class="block-option-list-item"
1103
- matRipple
1104
- (click)="addInlineTag('bold')"
1105
- >
1106
- <mat-icon>format_bold</mat-icon>
1107
- </div>
1108
- <div
1109
- class="block-option-list-item"
1110
- matRipple
1111
- (click)="addInlineTag('italic')"
1112
- >
1113
- <mat-icon>format_italic</mat-icon>
1114
- </div>
1115
- <div
1116
- class="block-option-list-item"
1117
- matRipple
1118
- (click)="addInlineTag('underlined')"
1119
- >
1120
- <mat-icon>format_underlined</mat-icon>
1121
- </div>
1122
- <div
1123
- class="block-option-list-item"
1124
- matRipple
1125
- (click)="addInlineTag('strikethrough')"
1126
- >
1127
- <mat-icon>strikethrough_s</mat-icon>
1128
- </div>
1129
- <!-- <div class="block-option-list-item"
1130
- matRipple
1131
- (click)="addInlineTag('hiliteColor', 'red')">
1132
- <mat-icon>highlight</mat-icon>
1133
- </div> -->
1134
- <div
1135
- class="block-option-list-item"
1136
- matRipple
1137
- (click)="addCustomInlineTag('code', 'inline-code-example')"
1138
- >
1139
- <mat-icon>code</mat-icon>
1140
- </div>
1141
- <div class="block-option-list-item" matRipple (click)="openUrlInput()">
1142
- <mat-icon>insert_link</mat-icon>
1143
- </div>
1144
- <div class="block-option-list-item" matRipple (click)="clearTags()">
1145
- <mat-icon>format_clear</mat-icon>
1146
- </div>
1147
-
1148
- <div
1149
- class="block-option-list-item"
1150
- matRipple
1151
- (click)="addInlineTag('justifyLeft')"
1152
- >
1153
- <mat-icon>format_align_left</mat-icon>
1154
- </div>
1155
- <div
1156
- class="block-option-list-item"
1157
- matRipple
1158
- (click)="addInlineTag('justifyCenter')"
1159
- >
1160
- <mat-icon>format_align_center</mat-icon>
1161
- </div>
1162
- <div
1163
- class="block-option-list-item"
1164
- matRipple
1165
- (click)="addInlineTag('justifyRight')"
1166
- >
1167
- <mat-icon>format_align_right</mat-icon>
1168
- </div>
1169
- <div
1170
- class="block-option-list-item"
1171
- matRipple
1172
- (click)="addInlineTag('justifyFull')"
1173
- >
1174
- <mat-icon>format_align_justify</mat-icon>
1175
- </div>
1176
- <div
1177
- class="block-option-list-item"
1178
- matRipple
1179
- (click)="addInlineTag('insertUnorderedList')"
1180
- >
1181
- <mat-icon>format_list_bulleted</mat-icon>
1182
- </div>
1183
- <div
1184
- class="block-option-list-item"
1185
- matRipple
1186
- (click)="addInlineTag('insertOrderedList')"
1187
- >
1188
- <mat-icon>format_list_numbered</mat-icon>
1189
- </div>
1190
- <div
1191
- class="block-option-list-item"
1192
- matRipple
1193
- (click)="addInlineTag('hiliteColor', 'yellow')"
1194
- >
1195
- <mat-icon>highlight</mat-icon>
1196
- </div>
1023
+ args: [{ selector: 'toolbar-inline', imports: [MatListModule, MatIconModule, FormsModule], host: { class: 'mat-elevation-z24' }, template: `
1024
+ <div class="panel">
1025
+ @for (item of options; track $index) {
1026
+ <div class="inline-option" (click)="addInlineTag(item.action)">
1027
+ <mat-icon>{{ item.icon }}</mat-icon>
1197
1028
  </div>
1198
- <div *ngIf="showURLInputField" class="block-option-list-panel">
1199
- <input
1200
- type="text"
1201
- placeholder="Enter URL"
1202
- class="block-option-input"
1203
- [(ngModel)]="url"
1204
- />
1205
- <div class="block-option-list-item" matRipple (click)="createLink()">
1206
- <mat-icon>add</mat-icon>
1207
- </div>
1029
+ }
1030
+ <div class="inline-option" (click)="addClassTag('code', 'inline-code')">
1031
+ <mat-icon>code</mat-icon>
1032
+ </div>
1033
+ <div class="inline-option" (click)="openUrlInput()">
1034
+ <mat-icon>insert_link</mat-icon>
1035
+ </div>
1036
+ <div class="inline-option" (click)="clearTags()">
1037
+ <mat-icon>format_clear</mat-icon>
1208
1038
  </div>
1209
1039
  </div>
1210
- `, styles: [":host{color:var(--mat-sys-on-secondary);background:var(--mat-sys-secondary)}:host .block-list-container{border-radius:4px}:host .block-option-list-panel{display:flex;width:230px;flex-direction:row;flex-wrap:wrap;gap:1px;border-radius:4px;overflow:auto}:host .block-option-list-item{cursor:pointer;width:32px;height:32px;display:flex;align-items:center;justify-content:center;border-radius:4px}:host .block-option-input{width:197px;height:32px;border:none;outline:none;background-color:transparent;color:#000;font-size:14px;font-weight:400;padding:0 0 0 5px;margin:0;display:flex;align-items:center;justify-content:center;border-radius:4px;box-sizing:border-box}:host .block-option-list-item-text{font-size:16px}:host .block-option-list-item-text{-webkit-user-select:none;user-select:none}\n"] }]
1211
- }], ctorParameters: () => [{ type: i0.Renderer2 }], propDecorators: { selection: [{
1212
- type: Input
1213
- }], closeInlineToobarOverlayEmitter: [{
1040
+
1041
+ @if(showURLInputField()) {
1042
+ <div class="panel">
1043
+ <input
1044
+ type="text"
1045
+ placeholder="Enter URL"
1046
+ class="block-option-input"
1047
+ [(ngModel)]="url"
1048
+ />
1049
+ <div class="inline-option" (click)="createLink()">
1050
+ <mat-icon>add</mat-icon>
1051
+ </div>
1052
+ </div>
1053
+ }
1054
+ `, styles: [":host{color:var(--mat-sys-on-secondary);background:var(--mat-sys-secondary);border-radius:8px}:host .panel{display:flex;width:230px;flex-wrap:wrap;gap:1px}:host .inline-option{cursor:pointer;width:32px;height:32px;display:flex;align-items:center;justify-content:center}:host .block-option-input{width:197px;height:32px;border:none;outline:none;color:var(--mat-sys-on-secondary);background-color:transparent;box-sizing:border-box}\n"] }]
1055
+ }], propDecorators: { closeOverlayEmitter: [{
1214
1056
  type: Output,
1215
- args: ['closeInlineToobarOverlay']
1057
+ args: ['closeOverlay']
1216
1058
  }] } });
1217
1059
 
1218
1060
  class ToolbarInlineService {
1219
1061
  overlay = inject(Overlay);
1220
1062
  overlayRef;
1221
1063
  determineToDisplayInlineToolbarBlock(_event) {
1222
- this.overlayRef?.hasAttached() && this.overlayRef.dispose(); // So hacky
1223
- return of(window.getSelection()).pipe(filter((selection) => selection !== null), filter((selection) => selection.rangeCount > 0), filter((selection) => selection.toString().length > 0), filter((selection) => selection.toString() !== ''), map((selection) => ({
1064
+ return of(window.getSelection()).pipe(filter((selection) => selection !== null), filter((selection) => selection.rangeCount > 0), filter((selection) => selection.toString().length > 0), filter((selection) => selection.toString() !== ''), tap(() => this.overlayRef?.hasAttached() && this.overlayRef.dispose()), // So hacky tired to do this properly
1065
+ map((selection) => ({
1224
1066
  selection,
1225
1067
  parant: this.getSelectionParent(selection),
1226
1068
  })), filter(({ parant }) => this.isSelectionInABlock(parant)), exhaustMap(({ selection }) => this.attachInlineToolbar(selection)));
@@ -1232,17 +1074,25 @@ class ToolbarInlineService {
1232
1074
  : range.commonAncestorContainer.parentElement;
1233
1075
  }
1234
1076
  isSelectionInABlock(target) {
1235
- return !!target && target.closest('ngx-editor-js2') !== null;
1077
+ // ! TODO: This is a hacky way to determine if the selection is in a block
1078
+ // ! Need to also check if the block wants to display the inline toolbar
1079
+ return (!!target &&
1080
+ (target.closest('.no-toolbar-inline') !== null
1081
+ ? false
1082
+ : target.closest('ngx-editor-js2') !== null
1083
+ ? true
1084
+ : false));
1236
1085
  }
1237
1086
  attachInlineToolbar(selection) {
1238
- return of(selection.getRangeAt(0)).pipe(map((range) => range.getBoundingClientRect()), map((selectionRect) => this.createOverlay(selectionRect)), tap((overlayRef) => (this.overlayRef = overlayRef)), map((overlayRef) => {
1239
- // To tired to do this properly right now
1240
- // passing the refs down the pipe adds a bug
1241
- // user selects text with a drag
1242
- // (mousedown → mousemove → wait → mousemove → mouseup)
1243
- const { instance: inlineToolbar } = overlayRef.attach(new ComponentPortal(ToolbarInlineComponent));
1244
- inlineToolbar.selection = selection;
1245
- lastValueFrom(merge(overlayRef.backdropClick(), inlineToolbar.closeInlineToobarOverlayEmitter).pipe(tap(() => overlayRef.dispose()), tap(() => selection.removeAllRanges())));
1087
+ return of(selection.getRangeAt(0)).pipe(map((range) => range.getBoundingClientRect()), map((selectionRect) => this.createOverlay(selectionRect)),
1088
+ // So hacky tired to do this properly
1089
+ // passing the refs down the pipe adds a bug
1090
+ // user selects text with a drag
1091
+ // (mousedown → mousemove → wait → mousemove → mouseup)
1092
+ tap((overlayRef) => (this.overlayRef = overlayRef)), map((overlayRef) => {
1093
+ const inlineToolbar = overlayRef.attach(new ComponentPortal(ToolbarInlineComponent));
1094
+ inlineToolbar.setInput('selection', selection);
1095
+ lastValueFrom(merge(overlayRef.backdropClick(), inlineToolbar.instance.closeOverlayEmitter).pipe(tap(() => overlayRef.dispose()), tap(() => selection.removeAllRanges())));
1246
1096
  return true;
1247
1097
  }));
1248
1098
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tmdjr-ngx-editor-js2.mjs","sources":["../../../projects/ngx-editor-js2/src/lib/directives/control-accessor.directive.ts","../../../projects/ngx-editor-js2/src/lib/directives/autofocus.directive.ts","../../../projects/ngx-editor-js2/src/lib/ngx-editor-js2.interface.ts","../../../projects/ngx-editor-js2/src/lib/components/toolbar/toolbar-block-options.component.ts","../../../projects/ngx-editor-js2/src/lib/components/toolbar/toolbar-blocks.component.ts","../../../projects/ngx-editor-js2/src/lib/components/toolbar/toolbar.component.ts","../../../projects/ngx-editor-js2/src/lib/services/block-movement.service.ts","../../../projects/ngx-editor-js2/src/lib/services/editor-js.service.ts","../../../projects/ngx-editor-js2/src/lib/services/tool-fab.service.ts","../../../projects/ngx-editor-js2/src/lib/directives/toolbar-fab.directive.ts","../../../projects/ngx-editor-js2/src/lib/directives/clean-paste-data.directive.ts","../../../projects/ngx-editor-js2/src/lib/components/blocks/header-block.component.ts","../../../projects/ngx-editor-js2/src/lib/components/blocks/paragraph-block.component.ts","../../../projects/ngx-editor-js2/src/lib/services/ngx-editor-js2.service.ts","../../../projects/ngx-editor-js2/src/lib/components/editor-js.component.ts","../../../projects/ngx-editor-js2/src/lib/components/toolbar-inline/toolbar-inline.component.ts","../../../projects/ngx-editor-js2/src/lib/services/toolbar-inline.service.ts","../../../projects/ngx-editor-js2/src/lib/ngx-editor-js2.component.ts","../../../projects/ngx-editor-js2/src/public-api.ts","../../../projects/ngx-editor-js2/src/tmdjr-ngx-editor-js2.ts"],"sourcesContent":["import {\n Directive,\n ElementRef,\n forwardRef,\n HostListener,\n inject,\n input,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';\n\n@Directive({\n selector: '[controlAccessor]',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ControlAccessorDirective),\n multi: true,\n },\n ],\n})\nexport class ControlAccessorDirective implements ControlValueAccessor {\n elementRef = inject(ElementRef);\n\n defaultValue = input<string>();\n\n onChange: (value: any) => void = () => {};\n onTouched: () => void = () => {};\n\n writeValue(): void {\n this.elementRef.nativeElement.innerText = this.defaultValue() || '';\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n @HostListener('blur')\n onBlur(): void {\n this.onTouched();\n }\n\n @HostListener('input')\n onInput(): void {\n this.onChange(this.elementRef.nativeElement.innerText);\n }\n}\n","import {\n AfterContentInit,\n Directive,\n ElementRef,\n inject,\n input,\n} from '@angular/core';\n\n@Directive({\n selector: '[autofocus]',\n})\nexport class AutofocusDirective implements AfterContentInit {\n elementRef = inject(ElementRef);\n\n autofocus = input<boolean>(false);\n\n ngAfterContentInit() {\n this.autofocus() && this.elementRef.nativeElement.focus?.();\n }\n}\n","import { InjectionToken, InputSignal, Signal, Type } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { Observable } from 'rxjs';\n\nexport interface NgxEditorjsOptions {\n consumerSupportedBlocks?: SupportedBlock[];\n}\nexport interface SupportedBlock {\n name: string;\n componentInstanceName: string;\n component: Type<BlockComponent>;\n}\n\nexport interface NgxEditorJsBlock {\n blockId: string;\n sortIndex: number;\n componentInstanceName: string;\n dataClean: string;\n savedAction?: string;\n}\nexport interface NgxEditorJsBlockWithComponent extends NgxEditorJsBlock {\n component: Type<BlockComponent>;\n autofocus?: boolean;\n}\n\nexport interface BlockComponent {\n sortIndex: InputSignal<number>;\n componentInstanceName: string;\n formControlName: InputSignal<string>;\n formGroup: InputSignal<FormGroup>;\n blockOptionActions: InputSignal<BlockOptionAction[]>;\n savedAction: Signal<string>;\n actionCallback?: (string: string) => void;\n}\n\nexport interface BlockOptionAction {\n action: string;\n icon?: string;\n text?: string;\n}\n\nexport enum MovePositionActions {\n UP = 'UP',\n DOWN = 'DOWN',\n DELETE = 'DELETE',\n}\n\nexport type TAddBlockCallback = (\n block: Type<BlockComponent>,\n index: number\n) => Observable<unknown>;\n\nexport type TMoveBlockPositionCallback = (\n action: MovePositionActions,\n index: number\n) => Observable<unknown>;\n","import { Component, input, output } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatRipple } from '@angular/material/core';\nimport {\n BlockOptionAction,\n MovePositionActions,\n} from '../../ngx-editor-js2.interface';\n\n@Component({\n selector: 'toolbar-block-options',\n imports: [MatIcon, MatRipple],\n template: `\n <div class=\"actions-panel mat-elevation-z24\">\n <div class=\"action-btn\" matRipple (click)=\"movePosition(Position.UP)\">\n <mat-icon>arrow_upward</mat-icon>\n </div>\n <div class=\"action-btn\" matRipple (click)=\"movePosition(Position.DELETE)\">\n <mat-icon>delete</mat-icon>\n </div>\n <div class=\"action-btn\" matRipple (click)=\"movePosition(Position.DOWN)\">\n <mat-icon>arrow_downward</mat-icon>\n </div>\n @for(blockOptionAction of blockOptionActions(); track $index) {\n <div\n class=\"action-btn\"\n (click)=\"handleAction(blockOptionAction.action)\"\n matRipple\n >\n @if (blockOptionAction.text) {\n {{ blockOptionAction.text }}\n } @else {\n <mat-icon>{{ blockOptionAction.icon }}</mat-icon>\n }\n </div>\n }\n </div>\n `,\n styles: [\n `\n :host {\n .actions-panel {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n gap: 1px;\n width: 128px;\n max-height: 128px;\n border-radius: 4px;\n overflow: auto;\n background: var(--mat-sys-secondary);\n .action-btn {\n cursor: pointer;\n width: 42px;\n height: 42px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n\n color: var(--mat-sys-on-secondary);\n background: var(--mat-sys-secondary);\n &:hover,\n &:focus {\n color: var(--mat-sys-secondary);\n background: var(--mat-sys-on-secondary);\n }\n }\n }\n }\n `,\n ],\n})\nexport class ToolbarBlockOptionsComponent {\n readonly Position = MovePositionActions;\n\n blockOptionActions = input<BlockOptionAction[]>();\n\n handleActionEmitter = output<string>({ alias: 'handleAction' });\n moveBlockPositionEmitter = output<MovePositionActions>({\n alias: 'moveBlockPosition',\n });\n\n movePosition(action: MovePositionActions) {\n this.moveBlockPositionEmitter.emit(action);\n }\n\n handleAction(action: string) {\n this.handleActionEmitter.emit(action);\n }\n}\n","import { AsyncPipe } from '@angular/common';\nimport { Component, input, output, Type } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { MatRipple } from '@angular/material/core';\nimport { MatFormField, MatLabel } from '@angular/material/form-field';\nimport { MatInput } from '@angular/material/input';\nimport { MatList, MatListItem } from '@angular/material/list';\nimport { combineLatest, map, startWith } from 'rxjs';\nimport { BlockComponent, SupportedBlock } from '../../ngx-editor-js2.interface';\n\n@Component({\n selector: 'toolbar-blocks',\n imports: [\n MatFormField,\n MatInput,\n MatList,\n MatListItem,\n MatRipple,\n MatLabel,\n ReactiveFormsModule,\n AsyncPipe,\n ],\n template: `\n <div class=\"block-list-container mat-elevation-z24\">\n <mat-form-field appearance=\"fill\" color=\"accent\">\n <mat-label>Filter</mat-label>\n <input\n class=\"filter-text\"\n matInput\n [formControl]=\"blockCtrl\"\n [autofocus]=\"true\"\n />\n </mat-form-field>\n @if(filteredBlocks$ | async; as filteredBlocks) {\n <mat-list class=\"block-list-panel\">\n @if (filteredBlocks.length <= 0) {\n <mat-list-item matRipple mat-list-item> No Results </mat-list-item>\n } @else { @for(block of filteredBlocks; track $index) {\n <mat-list-item matRipple mat-list-item (click)=\"addBlock(block)\">\n {{ block.name }}\n </mat-list-item>\n } }\n </mat-list>\n }\n </div>\n `,\n styles: [\n `\n :host {\n .mat-mdc-list-base {\n padding-top: 0px;\n margin-top: -14px;\n }\n\n .block-list-container {\n background: var(--mat-sys-secondary-container);\n border-radius: 4px;\n }\n\n .block-list-panel {\n max-width: 280px;\n max-height: 240px;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n overflow: auto;\n color: var(--mat-sys-on-secondary-container);\n }\n\n mat-list-item {\n cursor: pointer;\n user-select: none;\n &:hover,\n &:focus {\n background: var(--mat-sys-surface-bright);\n }\n }\n }\n `,\n ],\n})\nexport class ToolbarBlocksComponent {\n addBlockEmitter = output<Type<BlockComponent>>({ alias: 'addBlock' });\n supportedBlocks = input<SupportedBlock[]>([]);\n supportedBlocks$ = toObservable(this.supportedBlocks);\n\n blockCtrl = new FormControl([]);\n filter$ = this.blockCtrl.valueChanges.pipe(startWith(''));\n\n filteredBlocks$ = combineLatest([this.supportedBlocks$, this.filter$]).pipe(\n map(([blocks, filterString]) => {\n if (typeof filterString !== 'string') filterString = '';\n filterString = filterString.replace(/\\\\/g, '');\n const pattern = filterString\n ?.split('')\n .map((v: string) => `(?=.*${v})`)\n .join('');\n const regex = new RegExp(`${pattern}`, 'gi');\n\n // return blocks.filter(block => regex.exec(block));\n return blocks.filter((block) => block.name.match(regex));\n })\n );\n\n addBlock(block: SupportedBlock) {\n this.addBlockEmitter.emit(block?.component);\n }\n}\n","import { Component, input, signal, Type } from '@angular/core';\nimport { MatRipple } from '@angular/material/core';\nimport { CdkDragHandle } from '@angular/cdk/drag-drop';\nimport { OverlayModule } from '@angular/cdk/overlay';\nimport { ToolbarBlockOptionsComponent } from './toolbar-block-options.component';\nimport { ToolbarBlocksComponent } from './toolbar-blocks.component';\nimport { firstValueFrom } from 'rxjs';\nimport {\n BlockComponent,\n BlockOptionAction,\n MovePositionActions,\n SupportedBlock,\n TAddBlockCallback,\n TMoveBlockPositionCallback,\n} from '../../ngx-editor-js2.interface';\n\n@Component({\n selector: 'toolbar',\n imports: [\n CdkDragHandle,\n MatRipple,\n OverlayModule,\n ToolbarBlockOptionsComponent,\n ToolbarBlocksComponent,\n ],\n template: `\n <div class=\"toolbar-buttons-container\">\n <div\n class=\"toolbar-buttons mat-elevation-z4\"\n #blockListTigger=\"cdkOverlayOrigin\"\n cdkOverlayOrigin\n matRipple\n (click)=\"openBlocksList()\"\n >\n <span class=\"material-icons\">add</span>\n </div>\n <div\n class=\"toolbar-buttons mat-elevation-z4\"\n #blockOptionListTigger=\"cdkOverlayOrigin\"\n cdkDragHandle\n cdkOverlayOrigin\n matRipple\n (click)=\"openBlockOptionList()\"\n >\n <span class=\"material-icons\">drag_indicator</span>\n </div>\n </div>\n\n <!-- Block type search list -->\n <ng-template\n cdkConnectedOverlay\n (overlayOutsideClick)=\"openBlocks.set(false)\"\n [cdkConnectedOverlayOrigin]=\"blockListTigger\"\n [cdkConnectedOverlayOpen]=\"openBlocks()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayOffsetY]=\"15\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n >\n <toolbar-blocks\n [supportedBlocks]=\"supportedBlocks()\"\n (addBlock)=\"addBlock($event)\"\n ></toolbar-blocks>\n </ng-template>\n\n <!-- Options List-->\n <ng-template\n cdkConnectedOverlay\n (overlayOutsideClick)=\"openBlocksOption.set(false)\"\n [cdkConnectedOverlayOrigin]=\"blockOptionListTigger\"\n [cdkConnectedOverlayOpen]=\"openBlocksOption()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayOffsetX]=\"-49\"\n [cdkConnectedOverlayOffsetY]=\"15\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n >\n <toolbar-block-options\n [blockOptionActions]=\"blockOptionActions()\"\n (handleAction)=\"handleAction($event)\"\n (moveBlockPosition)=\"moveBlockPosition($event)\"\n ></toolbar-block-options>\n </ng-template>\n `,\n styles: [\n `\n :host {\n .toolbar-buttons-container {\n position: relative;\n display: flex;\n gap: 10px;\n }\n .toolbar-buttons {\n cursor: pointer;\n width: 30px;\n height: 30px;\n display: flex;\n justify-content: center;\n align-items: center;\n border-radius: 4px;\n margin-bottom: 14px;\n user-select: none;\n color: var(--mat-sys-on-tertiary-container);\n background: var(--mat-sys-tertiary-container);\n }\n .toolbar-buttons {\n &:hover,\n &:focus {\n background: var(--mat-sys-surface-bright);\n }\n }\n }\n @media (min-width: 768px) {\n :host {\n position: absolute;\n margin-left: -80px;\n top: 0;\n }\n }\n `,\n ],\n})\nexport class ToolbarComponent {\n componentContextPositionIndex = input.required<number>();\n supportedBlocks = input.required<SupportedBlock[]>();\n blockOptionActions = input<BlockOptionAction[]>();\n actionCallback = input<(action: string) => void>(() => () => {});\n formControlName = input<string>();\n addBlockCallback = input.required<TAddBlockCallback>();\n moveBlockPositionCallback = input.required<TMoveBlockPositionCallback>();\n\n openBlocks = signal<boolean>(false);\n openBlocksOption = signal<boolean>(false);\n\n openBlocksList() {\n this.openBlocks.update((prev) => !prev);\n }\n\n openBlockOptionList() {\n this.openBlocksOption.update((prev) => !prev);\n }\n\n moveBlockPosition(action: MovePositionActions) {\n this.closeLists();\n this.moveBlockPositionCallback()(\n action,\n this.componentContextPositionIndex()\n );\n }\n\n handleAction(action: string) {\n this.closeLists();\n this.actionCallback()(action);\n }\n\n addBlock(block: Type<BlockComponent>) {\n this.closeLists();\n firstValueFrom(\n this.addBlockCallback()(block, this.componentContextPositionIndex())\n );\n }\n\n closeLists() {\n this.openBlocks.set(false);\n this.openBlocksOption.set(false);\n }\n}\n","import { ComponentRef, Injectable, ViewContainerRef } from '@angular/core';\nimport { defaultIfEmpty, filter, from, map, of, tap } from 'rxjs';\nimport {\n BlockComponent,\n MovePositionActions,\n} from '../ngx-editor-js2.interface';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class BlockMovementService {\n componentRefMap = new Map<object, ComponentRef<BlockComponent>>();\n\n clearComponentRefs() {\n this.componentRefMap.clear();\n }\n\n getNgxEditorJsBlocks() {\n return of(Array.from(this.componentRefMap.values()));\n }\n\n newComponentAttached(componentRef: ComponentRef<BlockComponent>) {\n this.componentRefMap.set(componentRef.instance, componentRef);\n }\n\n updateComponentIndices(ngxEditor: ViewContainerRef) {\n return from(this.componentRefMap.values()).pipe(\n tap((componentRef: any) =>\n componentRef.setInput(\n 'sortIndex',\n ngxEditor.indexOf(componentRef.hostView)\n )\n )\n );\n }\n\n moveBlockComponentPosition(\n ngxEditor: ViewContainerRef,\n action: MovePositionActions,\n index: number\n ) {\n return of(Array.from(this.componentRefMap.values())).pipe(\n map((componentRefs) =>\n componentRefs.find(\n (componentRef) =>\n ngxEditor.indexOf(componentRef.hostView) === index - 1\n )\n ),\n filter((componentRef) => !!componentRef),\n map((componentRef) => ({\n componentRef,\n totalComponents: ngxEditor.length - 1,\n currentIndex: ngxEditor.indexOf(componentRef.hostView),\n newIndex: (index: number) =>\n action === MovePositionActions.UP ? index - 1 : index + 1,\n })),\n map(({ componentRef, totalComponents, currentIndex, newIndex }) => ({\n componentRef,\n currentIndex,\n newIndex: Math.max(\n 0,\n Math.min(newIndex(currentIndex), totalComponents)\n ),\n })),\n filter(({ currentIndex, newIndex }) => currentIndex !== newIndex),\n tap(({ componentRef, newIndex }) => {\n ngxEditor.move(componentRef.hostView, newIndex);\n componentRef.setInput('sortIndex', newIndex);\n componentRef.setInput('autofocus', true);\n }),\n defaultIfEmpty(false)\n );\n }\n\n removeBlockComponent(\n ngxEditor: ViewContainerRef,\n index: number,\n clear = false\n ) {\n return of(Array.from(this.componentRefMap.values())).pipe(\n filter((componentRefs) => clear || componentRefs.length !== 1),\n map((componentRefs) =>\n componentRefs.find(\n (componentRef) =>\n ngxEditor.indexOf(componentRef.hostView) === index - 1\n )\n ),\n map((componentRef) =>\n this.componentRefMap.delete(componentRef?.instance ?? {})\n ),\n tap((successful) => successful && ngxEditor.remove(index - 1)),\n defaultIfEmpty(false)\n );\n }\n}\n","import { inject, Injectable, Type, ViewContainerRef } from '@angular/core';\nimport { FormBuilder } from '@angular/forms';\nimport {\n combineLatest,\n defaultIfEmpty,\n filter,\n forkJoin,\n iif,\n lastValueFrom,\n map,\n mergeMap,\n Observable,\n of,\n switchMap,\n tap,\n} from 'rxjs';\nimport {\n BlockComponent,\n MovePositionActions,\n NgxEditorJsBlock,\n NgxEditorJsBlockWithComponent,\n} from '../ngx-editor-js2.interface';\nimport { BlockMovementService } from './block-movement.service';\n\nconst createUID = () => Math.random().toString(36).substring(7);\n@Injectable({\n providedIn: 'root',\n})\nexport class EditorJsService {\n formBuilder = inject(FormBuilder);\n blockMovementService = inject(BlockMovementService);\n\n componentRefMap = new Map<object, unknown>();\n\n ngxEditor!: ViewContainerRef;\n formGroup = this.formBuilder.group({});\n\n // TODO - Handle this idiomatically\n setNgxEditor(ngxEditor: ViewContainerRef) {\n this.ngxEditor = ngxEditor;\n }\n\n getBlocks$(): Observable<NgxEditorJsBlock[]> {\n return new Observable<NgxEditorJsBlock[]>((observer) => {\n lastValueFrom(\n this.blockMovementService.getNgxEditorJsBlocks().pipe(\n map((componentRefs) =>\n componentRefs.map<NgxEditorJsBlock>(({ instance }) => ({\n blockId: instance.formControlName(),\n sortIndex: instance.sortIndex(),\n componentInstanceName: instance.componentInstanceName,\n savedAction: instance.savedAction(),\n dataClean: instance.formGroup().get(instance.formControlName())\n ?.value,\n }))\n ),\n map((blocks) => blocks.sort((a, b) => a.sortIndex - b.sortIndex))\n )\n ).then((blocks) => {\n observer.next(blocks);\n observer.complete();\n });\n });\n }\n\n createNgxEditorJsBlockWithComponent(\n blockComponent: Type<BlockComponent>,\n componentContextPositionIndex: number\n ) {\n return of<NgxEditorJsBlockWithComponent>({\n blockId: createUID(),\n sortIndex: componentContextPositionIndex,\n componentInstanceName: blockComponent.name,\n component: blockComponent,\n // TODO - Force content-type for dataClean? JSON, HTML, etc.\n // TODO - And maybe rename dataClean to just data?\n dataClean: '',\n autofocus: true,\n });\n }\n\n addBlockComponent(\n ngxEditorJsBlock: NgxEditorJsBlockWithComponent\n ): Observable<void> {\n return forkJoin([\n this.createFormGroupControl(ngxEditorJsBlock),\n this.attachComponent(ngxEditorJsBlock),\n this.blockMovementService.updateComponentIndices(this.ngxEditor),\n ]).pipe(map(() => void 0));\n }\n\n createFormGroupControl({\n blockId,\n dataClean,\n }: NgxEditorJsBlockWithComponent) {\n return of(this.formBuilder.control(dataClean, [])).pipe(\n tap((formControl) => this.formGroup.addControl(blockId, formControl))\n );\n }\n\n attachComponent({\n component,\n blockId,\n autofocus,\n savedAction,\n sortIndex: index,\n }: NgxEditorJsBlockWithComponent) {\n return of(blockId).pipe(\n map((controlName) => {\n const componentRef = this.ngxEditor.createComponent(component, {\n index,\n });\n componentRef.setInput('sortIndex', index);\n componentRef.setInput('formGroup', this.formGroup);\n componentRef.setInput('formControlName', controlName);\n componentRef.setInput('autofocus', autofocus);\n\n savedAction && componentRef.instance.actionCallback?.(savedAction);\n\n this.blockMovementService.newComponentAttached(componentRef);\n return componentRef;\n })\n );\n }\n\n determineMovePositionAction(\n action: MovePositionActions,\n index: number,\n formControlName: string\n ) {\n return iif(\n () => action === MovePositionActions.DELETE,\n this.removeBlockComponent(index, formControlName),\n this.blockMovementService.moveBlockComponentPosition(\n this.ngxEditor,\n action,\n index\n )\n ).pipe(\n switchMap(() =>\n this.blockMovementService.updateComponentIndices(this.ngxEditor)\n )\n );\n }\n\n moveBlockComponentPosition(previousIndex: number, currentIndex: number) {\n return of(this.ngxEditor.get(previousIndex)).pipe(\n filter((viewRef) => !!viewRef),\n tap((viewRef) => {\n this.ngxEditor.move(viewRef, currentIndex);\n }),\n switchMap(() =>\n this.blockMovementService.updateComponentIndices(this.ngxEditor)\n ),\n defaultIfEmpty(false)\n );\n }\n\n removeBlockComponent(index: number, formControlName: string, clear = false) {\n return combineLatest([\n this.blockMovementService.removeBlockComponent(\n this.ngxEditor,\n index,\n clear\n ),\n of(this.formGroup.removeControl(formControlName)),\n ]);\n }\n\n clearBlocks() {\n return this.blockMovementService.getNgxEditorJsBlocks().pipe(\n filter((componentRefs) => componentRefs.length > 0),\n map((componentRefs) =>\n componentRefs.sort(\n (a, b) => a.instance.sortIndex() - b.instance.sortIndex()\n )\n ),\n mergeMap((componentRefs) =>\n forkJoin(\n Array.from(componentRefs.values()).map((componentRef) =>\n this.removeBlockComponent(\n componentRef.instance.sortIndex() + 1,\n componentRef.instance.formControlName(),\n true\n )\n )\n )\n ),\n switchMap(() =>\n this.blockMovementService.updateComponentIndices(this.ngxEditor)\n ),\n tap(() => {\n this.blockMovementService.clearComponentRefs();\n this.ngxEditor.clear();\n }),\n defaultIfEmpty(false)\n );\n }\n}\n","import { inject, Injectable, Type, ViewContainerRef } from '@angular/core';\nimport {\n BehaviorSubject,\n combineLatest,\n distinctUntilChanged,\n filter,\n lastValueFrom,\n map,\n switchMap,\n tap,\n} from 'rxjs';\nimport { ToolbarComponent } from '../components/toolbar/toolbar.component';\nimport { EditorJsService } from './editor-js.service';\nimport { NgxEditorJs2Service } from './ngx-editor-js2.service';\nimport {\n BlockOptionAction,\n BlockComponent,\n MovePositionActions,\n} from '../ngx-editor-js2.interface';\n\ntype ComponentContext = {\n index: number;\n viewContainerRef: ViewContainerRef;\n blockOptionActions: BlockOptionAction[];\n actionCallback: (v: string) => void;\n formControlName: string;\n} | null;\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ToolFabService {\n ngxEditorJs2Service = inject(NgxEditorJs2Service);\n editorJsService = inject(EditorJsService);\n // I need to explain this in detail so the future me can understand this.\n componentContext = new BehaviorSubject<ComponentContext>(null);\n toolbarComponentRef$ = combineLatest({\n componentContext: this.componentContext.asObservable(),\n supportedBlocks: this.ngxEditorJs2Service.supportedBlocks$,\n }).pipe(\n filter(({ componentContext }) => componentContext !== null),\n distinctUntilChanged(\n ({ componentContext: previous }, { componentContext: current }) =>\n previous!.index !== current!.index ||\n previous!.viewContainerRef !== current!.viewContainerRef\n ? (previous!.viewContainerRef.clear(), false)\n : true\n ),\n map(({ componentContext, supportedBlocks }) => {\n const {\n index,\n viewContainerRef,\n blockOptionActions,\n actionCallback,\n formControlName,\n } = componentContext!;\n // TODO We will need to create a ToolbarBottomRailComponent to handle the mobile view\n const componentRef = viewContainerRef.createComponent(ToolbarComponent);\n componentRef.setInput('componentContextPositionIndex', index + 1);\n componentRef.setInput('supportedBlocks', supportedBlocks);\n componentRef.setInput('blockOptionActions', blockOptionActions);\n componentRef.setInput('actionCallback', actionCallback);\n componentRef.setInput('formControlName', formControlName);\n componentRef.setInput('addBlockCallback', this.addBlock.bind(this));\n componentRef.setInput(\n 'moveBlockPositionCallback',\n this.movePositionAction.bind(this)\n );\n return componentRef;\n }),\n );\n\n addBlock(block: Type<BlockComponent>, index: number) {\n return this.editorJsService\n .createNgxEditorJsBlockWithComponent(block, index)\n .pipe(\n switchMap((block) => this.editorJsService.addBlockComponent(block))\n );\n }\n\n movePositionAction(\n action: MovePositionActions,\n index: number,\n formControlName: string\n ) {\n return lastValueFrom(\n this.editorJsService.determineMovePositionAction(\n action,\n index,\n formControlName\n )\n );\n }\n}\n","import {\n ComponentRef,\n Directive,\n effect,\n HostListener,\n inject,\n input,\n ViewContainerRef,\n} from '@angular/core';\nimport { ToolFabService } from '../services/tool-fab.service';\nimport { Observable } from 'rxjs';\nimport { ToolbarComponent } from '../components/toolbar/toolbar.component';\nimport { BlockOptionAction } from '../ngx-editor-js2.interface';\n\nexport type ToolbarComponentRef = Observable<ComponentRef<ToolbarComponent>>;\n\n@Directive({\n selector: '[toolbarFab]',\n})\nexport class ToolbarFabDirective {\n toolFabService = inject(ToolFabService);\n viewContainerRef = inject(ViewContainerRef);\n\n autofocus = input<boolean>();\n blockOptionActions = input<BlockOptionAction[]>();\n actionCallback = input.required<(action: string) => void>();\n componentContextPositionIndex = input.required<number>();\n formControlName = input.required<string>();\n\n @HostListener('mouseenter') onMouseEnter() {\n this.toolFabService.componentContext.next({\n viewContainerRef: this.viewContainerRef,\n blockOptionActions: this.blockOptionActions() ?? [],\n actionCallback: this.actionCallback(),\n index: this.componentContextPositionIndex(),\n formControlName: this.formControlName(),\n });\n }\n\n constructor() {\n effect(() => {\n this.autofocus() && this.onMouseEnter();\n });\n }\n}\n","import {\n Directive,\n HostListener,\n} from '@angular/core';\n\n@Directive({\n selector: '[cleanPasteData]',\n})\nexport class CleanPasteDataDirective {\n @HostListener('paste', ['$event'])\n onPaste(event: Event) {\n event.preventDefault();\n const text = (event as ClipboardEvent).clipboardData?.getData('text/plain');\n document.execCommand('insertText', false, text);\n }\n}\n","import { Component, input, signal } from '@angular/core';\nimport { ControlAccessorDirective } from '../../directives/control-accessor.directive';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { AutofocusDirective } from '../../directives/autofocus.directive';\nimport { ToolbarFabDirective } from '../../directives/toolbar-fab.directive';\nimport { CleanPasteDataDirective } from '../../directives/clean-paste-data.directive';\nimport {\n BlockComponent,\n BlockOptionAction,\n} from '../../ngx-editor-js2.interface';\nimport { NgSwitch, NgSwitchCase, NgTemplateOutlet } from '@angular/common';\nimport { CdkDrag } from '@angular/cdk/drag-drop';\n\n@Component({\n selector: 'header-block',\n host: { class: 'cdk-drag-animating' },\n hostDirectives: [CdkDrag],\n imports: [\n ReactiveFormsModule,\n ControlAccessorDirective,\n AutofocusDirective,\n ToolbarFabDirective,\n CleanPasteDataDirective,\n NgSwitch,\n NgSwitchCase,\n NgTemplateOutlet,\n ],\n template: `\n <ng-container [ngSwitch]=\"savedAction()\">\n <h1 *ngSwitchCase=\"'h1'\">\n <ng-container *ngTemplateOutlet=\"sharedHeaderTemplate\"></ng-container>\n </h1>\n <h2 *ngSwitchCase=\"'h2'\">\n <ng-container *ngTemplateOutlet=\"sharedHeaderTemplate\"></ng-container>\n </h2>\n <h3 *ngSwitchCase=\"'h3'\">\n <ng-container *ngTemplateOutlet=\"sharedHeaderTemplate\"></ng-container>\n </h3>\n <h4 *ngSwitchCase=\"'h4'\">\n <ng-container *ngTemplateOutlet=\"sharedHeaderTemplate\"></ng-container>\n </h4>\n <h5 *ngSwitchCase=\"'h5'\">\n <ng-container *ngTemplateOutlet=\"sharedHeaderTemplate\"></ng-container>\n </h5>\n <h6 *ngSwitchCase=\"'h6'\">\n <ng-container *ngTemplateOutlet=\"sharedHeaderTemplate\"></ng-container>\n </h6>\n </ng-container>\n\n <ng-template [formGroup]=\"formGroup()\" #sharedHeaderTemplate>\n <span\n controlAccessor\n cleanPasteData\n contentEditable\n toolbarFab\n [defaultValue]=\"formGroup().get(formControlName())?.value\"\n [actionCallback]=\"actionCallbackBind\"\n [blockOptionActions]=\"blockOptionActions()\"\n [autofocus]=\"autofocus()\"\n [formControlName]=\"formControlName()\"\n [componentContextPositionIndex]=\"sortIndex()\"\n ></span>\n </ng-template>\n `,\n styles: [\n `\n :host {\n display: block;\n position: relative;\n :is(h1, h2, h3, h4, h5, h6) {\n margin: 0;\n span {\n display: block;\n line-height: inherit;\n }\n }\n\n h1 > * {\n font: var(--mat-sys-display-large);\n }\n h2 > * {\n font: var(--mat-sys-display-medium);\n }\n h3 > * {\n font: var(--mat-sys-display-small);\n }\n h4 > * {\n font: var(--mat-sys-headline-large);\n }\n h5 > * {\n font: var(--mat-sys-headline-medium);\n }\n h6 > * {\n font: var(--mat-sys-headline-small);\n }\n }\n `,\n ],\n})\nexport class HeaderBlockComponent implements BlockComponent {\n sortIndex = input<number>(0);\n componentInstanceName = 'HeaderBlockComponent';\n autofocus = input<boolean>(true);\n formGroup = input.required<FormGroup>();\n formControlName = input.required<string>();\n blockOptionActions = input<BlockOptionAction[]>([\n { action: 'h1', text: 'H1' },\n { action: 'h2', text: 'H2' },\n { action: 'h3', text: 'H3' },\n { action: 'h4', text: 'H4' },\n { action: 'h5', text: 'H5' },\n { action: 'h6', text: 'H6' },\n ]);\n\n savedAction = signal<string>('h1');\n actionCallbackBind = this.actionCallback.bind(this);\n\n actionCallback(selectedAction: string) {\n this.savedAction.set(selectedAction);\n }\n}\n","import { Component, input, signal } from '@angular/core';\nimport { ControlAccessorDirective } from '../../directives/control-accessor.directive';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { AutofocusDirective } from '../../directives/autofocus.directive';\nimport { ToolbarFabDirective } from '../../directives/toolbar-fab.directive';\nimport { CleanPasteDataDirective } from '../../directives/clean-paste-data.directive';\nimport {\n BlockComponent,\n BlockOptionAction,\n} from '../../ngx-editor-js2.interface';\nimport { NgClass } from '@angular/common';\nimport { CdkDrag } from '@angular/cdk/drag-drop';\n\n\n@Component({\n selector: 'paragraph-block',\n host: { class: 'cdk-drag-animating' },\n hostDirectives: [CdkDrag],\n imports: [\n ReactiveFormsModule,\n ControlAccessorDirective,\n AutofocusDirective,\n ToolbarFabDirective,\n CleanPasteDataDirective,\n NgClass,\n ],\n template: `\n <ng-container [formGroup]=\"formGroup()\">\n <p\n controlAccessor\n contentEditable\n toolbarFab\n cleanPasteData\n [ngClass]=\"savedAction()\"\n [defaultValue]=\"formGroup().get(formControlName())?.value\"\n [actionCallback]=\"actionCallbackBind\"\n [autofocus]=\"autofocus()\"\n [blockOptionActions]=\"blockOptionActions()\"\n [formControlName]=\"formControlName()\"\n [componentContextPositionIndex]=\"sortIndex()\"\n ></p>\n </ng-container>\n `,\n styles: [\n `\n :host {\n display: block;\n position: relative;\n .small {\n font: var(--mat-sys-body-small);\n }\n .medium {\n font: var(--mat-sys-body-medium);\n }\n .large {\n font: var(--mat-sys-body-large);\n }\n .title-small {\n font: var(--mat-sys-title-small);\n }\n .title-medium {\n font: var(--mat-sys-title-medium);\n }\n .title-large {\n font: var(--mat-sys-title-large);\n }\n }\n `,\n ],\n})\nexport class ParagraphBlockComponent implements BlockComponent {\n sortIndex = input<number>(0);\n componentInstanceName = 'ParagraphBlockComponent';\n autofocus = input<boolean>(true);\n formGroup = input.required<FormGroup>();\n formControlName = input.required<string>();\n blockOptionActions = input<BlockOptionAction[]>([\n { action: 'small', icon: 'density_small' },\n { action: 'medium', icon: 'density_medium' },\n { action: 'large', icon: 'density_large' },\n { action: 'title-small', text: 'TS' },\n { action: 'title-medium', text: 'TM' },\n { action: 'title-large', text: 'TL' },\n ]);\n\n savedAction = signal<string>('medium');\n actionCallbackBind = this.actionCallback.bind(this);\n\n actionCallback(action: string) {\n this.savedAction.update(() => action);\n }\n}\n","import { inject, Injectable, InjectionToken, Type } from '@angular/core';\nimport { HeaderBlockComponent } from '../components/blocks/header-block.component';\nimport { ParagraphBlockComponent } from '../components/blocks/paragraph-block.component';\nimport {\n BehaviorSubject,\n combineLatest,\n delay,\n exhaustMap,\n forkJoin,\n map,\n mergeMap,\n of,\n switchMap,\n} from 'rxjs';\nimport { EditorJsService } from './editor-js.service';\nimport {\n NgxEditorjsOptions,\n NgxEditorJsBlock,\n NgxEditorJsBlockWithComponent,\n SupportedBlock,\n BlockComponent,\n} from '../ngx-editor-js2.interface';\n\nexport const NGX_EDITORJS_OPTIONS = new InjectionToken<NgxEditorjsOptions>(\n 'NGX_EDITORJS_OPTIONS'\n);\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NgxEditorJs2Service {\n editorJsService = inject(EditorJsService);\n\n consumerSupportedBlocks = new BehaviorSubject<SupportedBlock[]>(\n inject(NGX_EDITORJS_OPTIONS, { optional: true })?.consumerSupportedBlocks ??\n []\n );\n\n internalSupportedBlocks = new BehaviorSubject<SupportedBlock[]>([\n {\n name: 'Paragraph',\n component: ParagraphBlockComponent,\n componentInstanceName: 'ParagraphBlockComponent',\n },\n {\n name: 'Header',\n component: HeaderBlockComponent,\n componentInstanceName: 'HeaderBlockComponent',\n },\n ]);\n\n supportedBlocks$ = combineLatest([\n this.internalSupportedBlocks.asObservable(),\n this.consumerSupportedBlocks.asObservable(),\n ]).pipe(map(([internal, consumer]) => [...internal, ...consumer]));\n\n blocksToLoad = new BehaviorSubject<NgxEditorJsBlock[]>([]);\n\n loadBlocks$ = this.blocksToLoad.asObservable().pipe(\n delay(0),\n exhaustMap((blocks) => this.clearBlocksFromEditorJs(blocks)),\n map(([blocks]) => this.determineToloadDefaultBlocks(blocks)),\n map((blocks) => this.removeDuplicateBlocksWithSameIds(blocks)),\n map((blocks) => this.sortBlocks(blocks)),\n switchMap((blocks) => this.combineSupportBlocks(blocks)),\n map(([blocks, supportedBlocks]) =>\n this.createALookupMapForSupportedBlocks(blocks, supportedBlocks)\n ),\n map(({ blocks, supportedBlocksMap }) =>\n this.findAndMarshalBlocksComponent(blocks, supportedBlocksMap)\n ),\n mergeMap((blocks) =>\n this.addBlocksToEditorJs(blocks).pipe(map(() => blocks))\n )\n );\n\n clearBlocksFromEditorJs(blocks: NgxEditorJsBlock[]) {\n return forkJoin([of(blocks), this.editorJsService.clearBlocks()]);\n }\n\n determineToloadDefaultBlocks(blocks: NgxEditorJsBlock[]) {\n return blocks.length > 0 ? blocks : this.loadDefaultBlocks();\n }\n\n loadDefaultBlocks() {\n return [\n {\n blockId: 'tmdjr',\n sortIndex: 0,\n componentInstanceName: 'HeaderBlockComponent',\n dataClean: \"Let's get started... 🚀\",\n savedAction: 'h1',\n },\n ];\n }\n\n removeDuplicateBlocksWithSameIds(blocks: NgxEditorJsBlock[]) {\n return Array.from(\n new Map(blocks.map((block) => [block.blockId, block])).values()\n );\n }\n\n sortBlocks(blocks: NgxEditorJsBlock[]) {\n return blocks.sort((a, b) => a.sortIndex - b.sortIndex);\n }\n\n combineSupportBlocks(blocks: NgxEditorJsBlock[]) {\n return combineLatest([of(blocks), this.supportedBlocks$]);\n }\n\n createALookupMapForSupportedBlocks(\n blocks: NgxEditorJsBlock[],\n supportedBlocks: SupportedBlock[]\n ) {\n return {\n blocks,\n supportedBlocksMap: new Map(\n supportedBlocks.map((sb) => [sb.componentInstanceName, sb.component])\n ),\n };\n }\n\n findAndMarshalBlocksComponent(\n blocks: NgxEditorJsBlock[],\n supportedBlocksMap: Map<string, Type<BlockComponent>>\n ) {\n return blocks.map((block) => ({\n ...block,\n component:\n supportedBlocksMap.get(block.componentInstanceName) ??\n HeaderBlockComponent,\n }));\n }\n\n addBlocksToEditorJs(blocks: NgxEditorJsBlockWithComponent[]) {\n return combineLatest(\n blocks.map((block: NgxEditorJsBlockWithComponent) =>\n this.editorJsService.addBlockComponent(block)\n )\n );\n }\n}\n","import {\n Component,\n effect,\n inject,\n input,\n viewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { EditorJsService } from '../services/editor-js.service';\nimport { NgxEditorJs2Service } from '../services/ngx-editor-js2.service';\nimport { NgxEditorJsBlock } from '../ngx-editor-js2.interface';\nimport { CdkDropList, CdkDragDrop } from '@angular/cdk/drag-drop';\nimport { lastValueFrom } from 'rxjs';\n\n@Component({\n selector: 'editor-js',\n imports: [CdkDropList],\n template: `\n <div cdkDropList class=\"block-list\" (cdkDropListDropped)=\"drop($event)\">\n <ng-container #ngxEditor></ng-container>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n .block-list {\n min-height: 60px;\n }\n }\n `,\n ],\n})\nexport class EditorJsComponent {\n editorJsService = inject(EditorJsService);\n ngxEditorJs2Service = inject(NgxEditorJs2Service);\n\n bootstrapEditorJs = input();\n blocks = input.required({\n transform: (value: NgxEditorJsBlock[]) =>\n this.ngxEditorJs2Service.blocksToLoad.next(value),\n });\n\n ngxEditor = viewChild.required('ngxEditor', { read: ViewContainerRef });\n\n constructor() {\n effect(() => {\n this.editorJsService.setNgxEditor(this.ngxEditor());\n });\n }\n\n // * DEBUGGING\n // ngOnInit() {\n // this.editorJsService.formGroup.valueChanges.subscribe((value) => {\n // console.log('[formGroup.value] : ', value);\n // });\n // this.editorJsService.blockComponents$.subscribe((components) => {\n // console.log('[components] : ', components);\n // });\n // }\n\n drop(event: CdkDragDrop<string[]>) {\n lastValueFrom(\n this.editorJsService.moveBlockComponentPosition(\n event.previousIndex,\n event.currentIndex\n )\n ).then(() => {\n // DRAG ANIMATION HOT FIX\n // Wait for Angular to update the DOM, then remove the animation class\n requestAnimationFrame(() => {\n document.querySelectorAll('.cdk-drag-animating').forEach((el) => {\n const element = el as HTMLElement;\n element.classList.remove('cdk-drag-animating'); // Ensure old class is removed\n void element.offsetWidth; // Force reflow\n element.classList.add('cdk-drag-animating'); // Re-add for next drag\n });\n });\n });\n }\n}\n","import { NgIf } from '@angular/common';\nimport { Component, EventEmitter, Input, Output, Renderer2 } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { MatRippleModule } from '@angular/material/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatListModule } from '@angular/material/list';\n\n@Component({\n selector: 'toolbar-inline',\n imports: [MatListModule, MatIconModule, MatRippleModule, FormsModule, NgIf],\n template: `\n <div class=\"block-list-container mat-elevation-z8\">\n <div class=\"block-option-list-panel\">\n <div\n class=\"block-option-list-item\"\n matRipple\n (click)=\"addInlineTag('bold')\"\n >\n <mat-icon>format_bold</mat-icon>\n </div>\n <div\n class=\"block-option-list-item\"\n matRipple\n (click)=\"addInlineTag('italic')\"\n >\n <mat-icon>format_italic</mat-icon>\n </div>\n <div\n class=\"block-option-list-item\"\n matRipple\n (click)=\"addInlineTag('underlined')\"\n >\n <mat-icon>format_underlined</mat-icon>\n </div>\n <div\n class=\"block-option-list-item\"\n matRipple\n (click)=\"addInlineTag('strikethrough')\"\n >\n <mat-icon>strikethrough_s</mat-icon>\n </div>\n <!-- <div class=\"block-option-list-item\"\n matRipple\n (click)=\"addInlineTag('hiliteColor', 'red')\">\n <mat-icon>highlight</mat-icon>\n </div> -->\n <div\n class=\"block-option-list-item\"\n matRipple\n (click)=\"addCustomInlineTag('code', 'inline-code-example')\"\n >\n <mat-icon>code</mat-icon>\n </div>\n <div class=\"block-option-list-item\" matRipple (click)=\"openUrlInput()\">\n <mat-icon>insert_link</mat-icon>\n </div>\n <div class=\"block-option-list-item\" matRipple (click)=\"clearTags()\">\n <mat-icon>format_clear</mat-icon>\n </div>\n\n <div\n class=\"block-option-list-item\"\n matRipple\n (click)=\"addInlineTag('justifyLeft')\"\n >\n <mat-icon>format_align_left</mat-icon>\n </div>\n <div\n class=\"block-option-list-item\"\n matRipple\n (click)=\"addInlineTag('justifyCenter')\"\n >\n <mat-icon>format_align_center</mat-icon>\n </div>\n <div\n class=\"block-option-list-item\"\n matRipple\n (click)=\"addInlineTag('justifyRight')\"\n >\n <mat-icon>format_align_right</mat-icon>\n </div>\n <div\n class=\"block-option-list-item\"\n matRipple\n (click)=\"addInlineTag('justifyFull')\"\n >\n <mat-icon>format_align_justify</mat-icon>\n </div>\n <div\n class=\"block-option-list-item\"\n matRipple\n (click)=\"addInlineTag('insertUnorderedList')\"\n >\n <mat-icon>format_list_bulleted</mat-icon>\n </div>\n <div\n class=\"block-option-list-item\"\n matRipple\n (click)=\"addInlineTag('insertOrderedList')\"\n >\n <mat-icon>format_list_numbered</mat-icon>\n </div>\n <div\n class=\"block-option-list-item\"\n matRipple\n (click)=\"addInlineTag('hiliteColor', 'yellow')\"\n >\n <mat-icon>highlight</mat-icon>\n </div>\n </div>\n <div *ngIf=\"showURLInputField\" class=\"block-option-list-panel\">\n <input\n type=\"text\"\n placeholder=\"Enter URL\"\n class=\"block-option-input\"\n [(ngModel)]=\"url\"\n />\n <div class=\"block-option-list-item\" matRipple (click)=\"createLink()\">\n <mat-icon>add</mat-icon>\n </div>\n </div>\n </div>\n `,\n styles: [\n `\n :host {\n color: var(--mat-sys-on-secondary);\n background: var(--mat-sys-secondary);\n .block-list-container {\n border-radius: 4px;\n }\n\n .block-option-list-panel {\n display: flex;\n width: 230px;\n flex-direction: row;\n flex-wrap: wrap;\n gap: 1px;\n border-radius: 4px;\n overflow: auto;\n }\n\n .block-option-list-item {\n cursor: pointer;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n }\n\n .block-option-input {\n width: 197px;\n height: 32px;\n border: none;\n outline: none;\n background-color: transparent;\n color: #000;\n font-size: 14px;\n font-weight: 400;\n padding: 0 0 0 5px;\n margin: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n box-sizing: border-box;\n }\n\n .block-option-list-item-text {\n font-size: 16px;\n }\n\n .block-option-list-item-text {\n user-select: none;\n }\n }\n `,\n ],\n})\nexport class ToolbarInlineComponent {\n @Input() selection!: Selection;\n\n @Output('closeInlineToobarOverlay') closeInlineToobarOverlayEmitter =\n new EventEmitter();\n\n url: string = '';\n showURLInputField: boolean = false;\n savedRanges: Range[] = [];\n\n constructor(private readonly renderer: Renderer2) {}\n\n ngOnInit(): void {}\n\n closeInlineToobarOverlay() {\n this.closeInlineToobarOverlayEmitter.emit();\n }\n\n addInlineTag(tag: string, optionValue?: string | null) {\n // https://stackoverflow.com/questions/60581285/execcommand-is-now-obsolete-whats-the-alternative\n document.execCommand(tag, true, optionValue!);\n this.closeInlineToobarOverlay();\n }\n\n addCustomInlineTag(tag: string, className?: string | null) {\n const range = this.selection.getRangeAt(0);\n const element = this.renderer.createElement(tag);\n element.className = className ?? '';\n element.innerHTML = range.toString();\n range.deleteContents();\n range.insertNode(element);\n this.closeInlineToobarOverlay();\n }\n\n clearTags() {\n document.execCommand('removeFormat');\n document.execCommand('unlink');\n this.closeInlineToobarOverlay();\n }\n\n openUrlInput() {\n this.savedRanges.push(this.selection.getRangeAt(0));\n this.showURLInputField = true;\n }\n\n createLink() {\n this.selection.removeAllRanges();\n this.selection.addRange(this.savedRanges.pop()!);\n document.execCommand('createLink', false, this.url);\n this.closeInlineToobarOverlay();\n }\n}\n","import { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { inject, Injectable } from '@angular/core';\nimport { exhaustMap, filter, lastValueFrom, map, merge, of, tap } from 'rxjs';\nimport { ToolbarInlineComponent } from '../components/toolbar-inline/toolbar-inline.component';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ToolbarInlineService {\n overlay = inject(Overlay);\n overlayRef!: OverlayRef;\n\n determineToDisplayInlineToolbarBlock(_event: Event) {\n this.overlayRef?.hasAttached() && this.overlayRef.dispose(); // So hacky\n return of(window.getSelection()).pipe(\n filter((selection) => selection !== null),\n filter((selection) => selection.rangeCount > 0),\n filter((selection) => selection.toString().length > 0),\n filter((selection) => selection.toString() !== ''),\n map((selection) => ({\n selection,\n parant: this.getSelectionParent(selection),\n })),\n filter(({ parant }) => this.isSelectionInABlock(parant as HTMLElement)),\n exhaustMap(({ selection }) => this.attachInlineToolbar(selection))\n );\n }\n\n getSelectionParent(selection: Selection): HTMLElement | null {\n const range = selection.getRangeAt(0);\n return range.commonAncestorContainer.nodeType === Node.ELEMENT_NODE\n ? (range.commonAncestorContainer as HTMLElement)\n : range.commonAncestorContainer.parentElement;\n }\n\n isSelectionInABlock(target: HTMLElement | null) {\n return !!target && target.closest('ngx-editor-js2') !== null;\n }\n\n attachInlineToolbar(selection: Selection) {\n return of(selection.getRangeAt(0)).pipe(\n map((range) => range.getBoundingClientRect()),\n map((selectionRect) => this.createOverlay(selectionRect)),\n tap((overlayRef) => (this.overlayRef = overlayRef)),\n map((overlayRef) => {\n // To tired to do this properly right now\n // passing the refs down the pipe adds a bug\n // user selects text with a drag\n // (mousedown → mousemove → wait → mousemove → mouseup)\n const { instance: inlineToolbar } = overlayRef.attach(\n new ComponentPortal(ToolbarInlineComponent)\n );\n inlineToolbar.selection = selection;\n lastValueFrom(\n merge(\n overlayRef.backdropClick(),\n inlineToolbar.closeInlineToobarOverlayEmitter\n ).pipe(\n tap(() => overlayRef.dispose()),\n tap(() => selection.removeAllRanges())\n )\n );\n return true;\n })\n );\n }\n\n createOverlay(selectionRect: DOMRect) {\n return this.overlay.create({\n hasBackdrop: true,\n backdropClass: 'cdk-overlay-transparent-backdrop',\n positionStrategy: this.overlay\n .position()\n .flexibleConnectedTo(selectionRect)\n .withPositions([\n {\n offsetY: 8,\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n },\n ]),\n });\n }\n}\n","import { Component, inject, input, output } from '@angular/core';\nimport { EditorJsComponent } from './components/editor-js.component';\nimport { AsyncPipe } from '@angular/common';\nimport {\n combineLatest,\n debounceTime,\n fromEvent,\n Observable,\n switchMap,\n} from 'rxjs';\nimport { ToolFabService } from './services/tool-fab.service';\nimport { NgxEditorJsBlock } from './ngx-editor-js2.interface';\nimport { ToolbarInlineService } from './services/toolbar-inline.service';\nimport { EditorJsService } from './services/editor-js.service';\nimport { NgxEditorJs2Service } from './services/ngx-editor-js2.service';\n\n@Component({\n selector: 'ngx-editor-js2',\n imports: [EditorJsComponent, AsyncPipe],\n template: `\n <editor-js\n [blocks]=\"blocks()\"\n [bootstrapEditorJs]=\"bootstrapEditorJs$ | async\"\n ></editor-js>\n `,\n})\nexport class NgxEditorJs2Component {\n inlineToolbarSerivce = inject(ToolbarInlineService);\n editorJsService = inject(EditorJsService);\n ngxEditorJs2Service = inject(NgxEditorJs2Service);\n\n blocks = input<NgxEditorJsBlock[]>([]);\n blocksRequested = output<Observable<NgxEditorJsBlock[]>>();\n requestBlocks = input.required({\n transform: (_v: unknown) =>\n this.blocksRequested.emit(this.editorJsService.getBlocks$()),\n });\n\n bootstrapEditorJs$ = combineLatest([\n inject(ToolFabService).toolbarComponentRef$,\n this.ngxEditorJs2Service.loadBlocks$,\n fromEvent(document, 'selectionchange').pipe(\n debounceTime(200),\n switchMap((event) =>\n this.inlineToolbarSerivce.determineToDisplayInlineToolbarBlock(event)\n )\n )\n ]);\n}\n","/*\n * Public API Surface of ngx-editor-js2\n */\n\nexport * from './lib/services/ngx-editor-js2.service';\nexport * from './lib/ngx-editor-js2.component';\nexport type * from './lib/ngx-editor-js2.interface';\nexport * from './lib/directives/autofocus.directive';\nexport * from './lib/directives/toolbar-fab.directive';\nexport * from './lib/directives/control-accessor.directive';\nexport * from './lib/directives/clean-paste-data.directive';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2"],"mappings":"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"}
1
+ {"version":3,"file":"tmdjr-ngx-editor-js2.mjs","sources":["../../../projects/ngx-editor-js2/src/lib/directives/control-accessor.directive.ts","../../../projects/ngx-editor-js2/src/lib/directives/autofocus.directive.ts","../../../projects/ngx-editor-js2/src/lib/ngx-editor-js2.interface.ts","../../../projects/ngx-editor-js2/src/lib/components/toolbar/toolbar-block-options.component.ts","../../../projects/ngx-editor-js2/src/lib/components/toolbar/toolbar-blocks.component.ts","../../../projects/ngx-editor-js2/src/lib/components/toolbar/toolbar.component.ts","../../../projects/ngx-editor-js2/src/lib/services/block-movement.service.ts","../../../projects/ngx-editor-js2/src/lib/services/editor-js.service.ts","../../../projects/ngx-editor-js2/src/lib/services/tool-fab.service.ts","../../../projects/ngx-editor-js2/src/lib/directives/toolbar-fab.directive.ts","../../../projects/ngx-editor-js2/src/lib/directives/clean-paste-data.directive.ts","../../../projects/ngx-editor-js2/src/lib/components/blocks/header-block.component.ts","../../../projects/ngx-editor-js2/src/lib/components/blocks/paragraph-block.component.ts","../../../projects/ngx-editor-js2/src/lib/services/ngx-editor-js2.service.ts","../../../projects/ngx-editor-js2/src/lib/components/editor-js.component.ts","../../../projects/ngx-editor-js2/src/lib/components/toolbar-inline/toolbar-inline.component.ts","../../../projects/ngx-editor-js2/src/lib/services/toolbar-inline.service.ts","../../../projects/ngx-editor-js2/src/lib/ngx-editor-js2.component.ts","../../../projects/ngx-editor-js2/src/public-api.ts","../../../projects/ngx-editor-js2/src/tmdjr-ngx-editor-js2.ts"],"sourcesContent":["import {\n Directive,\n ElementRef,\n forwardRef,\n HostListener,\n inject,\n input,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';\n\n@Directive({\n selector: '[controlAccessor]',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ControlAccessorDirective),\n multi: true,\n },\n ],\n})\nexport class ControlAccessorDirective implements ControlValueAccessor {\n elementRef = inject(ElementRef);\n\n defaultValue = input<string>();\n\n onChange: (value: any) => void = () => {};\n onTouched: () => void = () => {};\n\n writeValue(): void {\n this.elementRef.nativeElement.innerHTML = this.defaultValue() || '';\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n @HostListener('blur')\n onBlur(): void {\n this.onTouched();\n }\n\n @HostListener('input')\n onInput(): void {\n this.onChange(this.elementRef.nativeElement.innerHTML);\n }\n}\n","import {\n AfterContentInit,\n Directive,\n ElementRef,\n inject,\n input,\n} from '@angular/core';\n\n@Directive({\n selector: '[autofocus]',\n})\nexport class AutofocusDirective implements AfterContentInit {\n elementRef = inject(ElementRef);\n\n autofocus = input<boolean>(false);\n\n ngAfterContentInit() {\n this.autofocus() && this.elementRef.nativeElement.focus?.();\n }\n}\n","import { InjectionToken, InputSignal, Signal, Type } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { Observable } from 'rxjs';\n\nexport interface NgxEditorjsOptions {\n consumerSupportedBlocks?: SupportedBlock[];\n}\nexport interface SupportedBlock {\n name: string;\n componentInstanceName: string;\n component: Type<BlockComponent>;\n}\n\nexport interface NgxEditorJsBlock {\n blockId: string;\n sortIndex: number;\n componentInstanceName: string;\n dataClean: string;\n savedAction?: string;\n}\nexport interface NgxEditorJsBlockWithComponent extends NgxEditorJsBlock {\n component: Type<BlockComponent>;\n autofocus?: boolean;\n}\n\nexport interface BlockComponent {\n sortIndex: InputSignal<number>;\n componentInstanceName: string;\n formControlName: InputSignal<string>;\n formGroup: InputSignal<FormGroup>;\n blockOptionActions: InputSignal<BlockOptionAction[]>;\n savedAction: Signal<string>;\n actionCallback?: (string: string) => void;\n}\n\nexport interface BlockOptionAction {\n action: string;\n icon?: string;\n text?: string;\n}\n\nexport enum MovePositionActions {\n UP = 'UP',\n DOWN = 'DOWN',\n DELETE = 'DELETE',\n}\n\nexport type TAddBlockCallback = (\n block: Type<BlockComponent>,\n index: number\n) => Observable<unknown>;\n\nexport type TMoveBlockPositionCallback = (\n action: MovePositionActions,\n index: number\n) => Observable<unknown>;\n","import { Component, input, output } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatRipple } from '@angular/material/core';\nimport {\n BlockOptionAction,\n MovePositionActions,\n} from '../../ngx-editor-js2.interface';\n\n@Component({\n selector: 'toolbar-block-options',\n imports: [MatIcon, MatRipple],\n template: `\n <div class=\"actions-panel mat-elevation-z24\">\n <div class=\"action-btn\" matRipple (click)=\"movePosition(Position.UP)\">\n <mat-icon>arrow_upward</mat-icon>\n </div>\n <div class=\"action-btn\" matRipple (click)=\"movePosition(Position.DELETE)\">\n <mat-icon>delete</mat-icon>\n </div>\n <div class=\"action-btn\" matRipple (click)=\"movePosition(Position.DOWN)\">\n <mat-icon>arrow_downward</mat-icon>\n </div>\n @for(blockOptionAction of blockOptionActions(); track $index) {\n <div\n class=\"action-btn\"\n (click)=\"handleAction(blockOptionAction.action)\"\n matRipple\n >\n @if (blockOptionAction.text) {\n {{ blockOptionAction.text }}\n } @else {\n <mat-icon>{{ blockOptionAction.icon }}</mat-icon>\n }\n </div>\n }\n </div>\n `,\n styles: [\n `\n :host {\n .actions-panel {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n gap: 1px;\n width: 128px;\n max-height: 128px;\n border-radius: 4px;\n overflow: auto;\n background: var(--mat-sys-secondary);\n .action-btn {\n cursor: pointer;\n width: 42px;\n height: 42px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n\n color: var(--mat-sys-on-secondary);\n background: var(--mat-sys-secondary);\n &:hover,\n &:focus {\n color: var(--mat-sys-secondary);\n background: var(--mat-sys-on-secondary);\n }\n }\n }\n }\n `,\n ],\n})\nexport class ToolbarBlockOptionsComponent {\n readonly Position = MovePositionActions;\n\n blockOptionActions = input<BlockOptionAction[]>();\n\n handleActionEmitter = output<string>({ alias: 'handleAction' });\n moveBlockPositionEmitter = output<MovePositionActions>({\n alias: 'moveBlockPosition',\n });\n\n movePosition(action: MovePositionActions) {\n this.moveBlockPositionEmitter.emit(action);\n }\n\n handleAction(action: string) {\n this.handleActionEmitter.emit(action);\n }\n}\n","import { AsyncPipe } from '@angular/common';\nimport { Component, input, output, Type } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { MatRipple } from '@angular/material/core';\nimport { MatFormField, MatLabel } from '@angular/material/form-field';\nimport { MatInput } from '@angular/material/input';\nimport { MatList, MatListItem } from '@angular/material/list';\nimport { combineLatest, map, startWith } from 'rxjs';\nimport { BlockComponent, SupportedBlock } from '../../ngx-editor-js2.interface';\n\n@Component({\n selector: 'toolbar-blocks',\n imports: [\n MatFormField,\n MatInput,\n MatList,\n MatListItem,\n MatRipple,\n MatLabel,\n ReactiveFormsModule,\n AsyncPipe,\n ],\n template: `\n <div class=\"block-list-container mat-elevation-z24\">\n <mat-form-field appearance=\"fill\" color=\"accent\">\n <mat-label>Filter</mat-label>\n <input\n class=\"filter-text\"\n matInput\n [formControl]=\"blockCtrl\"\n [autofocus]=\"true\"\n />\n </mat-form-field>\n @if(filteredBlocks$ | async; as filteredBlocks) {\n <mat-list class=\"block-list-panel\">\n @if (filteredBlocks.length <= 0) {\n <mat-list-item matRipple mat-list-item> No Results </mat-list-item>\n } @else { @for(block of filteredBlocks; track $index) {\n <mat-list-item matRipple mat-list-item (click)=\"addBlock(block)\">\n {{ block.name }}\n </mat-list-item>\n } }\n </mat-list>\n }\n </div>\n `,\n styles: [\n `\n :host {\n .mat-mdc-list-base {\n padding-top: 0px;\n margin-top: -14px;\n }\n\n .block-list-container {\n background: var(--mat-sys-secondary-container);\n border-radius: 4px;\n }\n\n .block-list-panel {\n max-width: 280px;\n max-height: 240px;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n overflow: auto;\n color: var(--mat-sys-on-secondary-container);\n }\n\n mat-list-item {\n cursor: pointer;\n user-select: none;\n &:hover,\n &:focus {\n background: var(--mat-sys-surface-bright);\n }\n }\n }\n `,\n ],\n})\nexport class ToolbarBlocksComponent {\n addBlockEmitter = output<Type<BlockComponent>>({ alias: 'addBlock' });\n supportedBlocks = input<SupportedBlock[]>([]);\n supportedBlocks$ = toObservable(this.supportedBlocks);\n\n blockCtrl = new FormControl([]);\n filter$ = this.blockCtrl.valueChanges.pipe(startWith(''));\n\n filteredBlocks$ = combineLatest([this.supportedBlocks$, this.filter$]).pipe(\n map(([blocks, filterString]) => {\n if (typeof filterString !== 'string') filterString = '';\n filterString = filterString.replace(/\\\\/g, '');\n const pattern = filterString\n ?.split('')\n .map((v: string) => `(?=.*${v})`)\n .join('');\n const regex = new RegExp(`${pattern}`, 'gi');\n\n // return blocks.filter(block => regex.exec(block));\n return blocks.filter((block) => block.name.match(regex));\n })\n );\n\n addBlock(block: SupportedBlock) {\n this.addBlockEmitter.emit(block?.component);\n }\n}\n","import { Component, input, signal, Type } from '@angular/core';\nimport { MatRipple } from '@angular/material/core';\nimport { CdkDragHandle } from '@angular/cdk/drag-drop';\nimport { OverlayModule } from '@angular/cdk/overlay';\nimport { ToolbarBlockOptionsComponent } from './toolbar-block-options.component';\nimport { ToolbarBlocksComponent } from './toolbar-blocks.component';\nimport { firstValueFrom } from 'rxjs';\nimport {\n BlockComponent,\n BlockOptionAction,\n MovePositionActions,\n SupportedBlock,\n TAddBlockCallback,\n TMoveBlockPositionCallback,\n} from '../../ngx-editor-js2.interface';\n\n@Component({\n selector: 'toolbar',\n imports: [\n CdkDragHandle,\n MatRipple,\n OverlayModule,\n ToolbarBlockOptionsComponent,\n ToolbarBlocksComponent,\n ],\n template: `\n <div class=\"toolbar-buttons-container\">\n <div\n class=\"toolbar-buttons mat-elevation-z4\"\n #blockListTigger=\"cdkOverlayOrigin\"\n cdkOverlayOrigin\n matRipple\n (click)=\"openBlocksList()\"\n >\n <span class=\"material-icons\">add</span>\n </div>\n <div\n class=\"toolbar-buttons mat-elevation-z4\"\n #blockOptionListTigger=\"cdkOverlayOrigin\"\n cdkDragHandle\n cdkOverlayOrigin\n matRipple\n (click)=\"openBlockOptionList()\"\n >\n <span class=\"material-icons\">drag_indicator</span>\n </div>\n </div>\n\n <!-- Block type search list -->\n <ng-template\n cdkConnectedOverlay\n (overlayOutsideClick)=\"openBlocks.set(false)\"\n [cdkConnectedOverlayOrigin]=\"blockListTigger\"\n [cdkConnectedOverlayOpen]=\"openBlocks()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayOffsetY]=\"15\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n >\n <toolbar-blocks\n [supportedBlocks]=\"supportedBlocks()\"\n (addBlock)=\"addBlock($event)\"\n ></toolbar-blocks>\n </ng-template>\n\n <!-- Options List-->\n <ng-template\n cdkConnectedOverlay\n (overlayOutsideClick)=\"openBlocksOption.set(false)\"\n [cdkConnectedOverlayOrigin]=\"blockOptionListTigger\"\n [cdkConnectedOverlayOpen]=\"openBlocksOption()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayOffsetX]=\"-49\"\n [cdkConnectedOverlayOffsetY]=\"15\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n >\n <toolbar-block-options\n [blockOptionActions]=\"blockOptionActions()\"\n (handleAction)=\"handleAction($event)\"\n (moveBlockPosition)=\"moveBlockPosition($event)\"\n ></toolbar-block-options>\n </ng-template>\n `,\n styles: [\n `\n :host {\n .toolbar-buttons-container {\n position: relative;\n display: flex;\n gap: 10px;\n }\n .toolbar-buttons {\n cursor: pointer;\n width: 30px;\n height: 30px;\n display: flex;\n justify-content: center;\n align-items: center;\n border-radius: 4px;\n margin-bottom: 14px;\n user-select: none;\n color: var(--mat-sys-on-tertiary-container);\n background: var(--mat-sys-tertiary-container);\n }\n .toolbar-buttons {\n &:hover,\n &:focus {\n background: var(--mat-sys-surface-bright);\n }\n }\n }\n @media (min-width: 768px) {\n :host {\n position: absolute;\n margin-left: -80px;\n top: 0;\n }\n }\n `,\n ],\n})\nexport class ToolbarComponent {\n componentContextPositionIndex = input.required<number>();\n supportedBlocks = input.required<SupportedBlock[]>();\n blockOptionActions = input<BlockOptionAction[]>();\n actionCallback = input<(action: string) => void>(() => () => {});\n formControlName = input<string>();\n addBlockCallback = input.required<TAddBlockCallback>();\n moveBlockPositionCallback = input.required<TMoveBlockPositionCallback>();\n\n openBlocks = signal<boolean>(false);\n openBlocksOption = signal<boolean>(false);\n\n openBlocksList() {\n this.openBlocks.update((prev) => !prev);\n }\n\n openBlockOptionList() {\n this.openBlocksOption.update((prev) => !prev);\n }\n\n moveBlockPosition(action: MovePositionActions) {\n this.closeLists();\n this.moveBlockPositionCallback()(\n action,\n this.componentContextPositionIndex()\n );\n }\n\n handleAction(action: string) {\n this.closeLists();\n this.actionCallback()(action);\n }\n\n addBlock(block: Type<BlockComponent>) {\n this.closeLists();\n firstValueFrom(\n this.addBlockCallback()(block, this.componentContextPositionIndex())\n );\n }\n\n closeLists() {\n this.openBlocks.set(false);\n this.openBlocksOption.set(false);\n }\n}\n","import { ComponentRef, Injectable, ViewContainerRef } from '@angular/core';\nimport { defaultIfEmpty, filter, from, map, of, tap } from 'rxjs';\nimport {\n BlockComponent,\n MovePositionActions,\n} from '../ngx-editor-js2.interface';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class BlockMovementService {\n componentRefMap = new Map<object, ComponentRef<BlockComponent>>();\n\n clearComponentRefs() {\n this.componentRefMap.clear();\n }\n\n getNgxEditorJsBlocks() {\n return of(Array.from(this.componentRefMap.values()));\n }\n\n newComponentAttached(componentRef: ComponentRef<BlockComponent>) {\n this.componentRefMap.set(componentRef.instance, componentRef);\n }\n\n updateComponentIndices(ngxEditor: ViewContainerRef) {\n return from(this.componentRefMap.values()).pipe(\n tap((componentRef: any) =>\n componentRef.setInput(\n 'sortIndex',\n ngxEditor.indexOf(componentRef.hostView)\n )\n )\n );\n }\n\n moveBlockComponentPosition(\n ngxEditor: ViewContainerRef,\n action: MovePositionActions,\n index: number\n ) {\n return of(Array.from(this.componentRefMap.values())).pipe(\n map((componentRefs) =>\n componentRefs.find(\n (componentRef) =>\n ngxEditor.indexOf(componentRef.hostView) === index - 1\n )\n ),\n filter((componentRef) => !!componentRef),\n map((componentRef) => ({\n componentRef,\n totalComponents: ngxEditor.length - 1,\n currentIndex: ngxEditor.indexOf(componentRef.hostView),\n newIndex: (index: number) =>\n action === MovePositionActions.UP ? index - 1 : index + 1,\n })),\n map(({ componentRef, totalComponents, currentIndex, newIndex }) => ({\n componentRef,\n currentIndex,\n newIndex: Math.max(\n 0,\n Math.min(newIndex(currentIndex), totalComponents)\n ),\n })),\n filter(({ currentIndex, newIndex }) => currentIndex !== newIndex),\n tap(({ componentRef, newIndex }) => {\n ngxEditor.move(componentRef.hostView, newIndex);\n componentRef.setInput('sortIndex', newIndex);\n componentRef.setInput('autofocus', true);\n }),\n defaultIfEmpty(false)\n );\n }\n\n removeBlockComponent(\n ngxEditor: ViewContainerRef,\n index: number,\n clear = false\n ) {\n return of(Array.from(this.componentRefMap.values())).pipe(\n filter((componentRefs) => clear || componentRefs.length !== 1),\n map((componentRefs) =>\n componentRefs.find(\n (componentRef) =>\n ngxEditor.indexOf(componentRef.hostView) === index - 1\n )\n ),\n map((componentRef) =>\n this.componentRefMap.delete(componentRef?.instance ?? {})\n ),\n tap((successful) => successful && ngxEditor.remove(index - 1)),\n defaultIfEmpty(false)\n );\n }\n}\n","import { inject, Injectable, Type, ViewContainerRef } from '@angular/core';\nimport { FormBuilder } from '@angular/forms';\nimport {\n combineLatest,\n defaultIfEmpty,\n filter,\n forkJoin,\n iif,\n lastValueFrom,\n map,\n mergeMap,\n Observable,\n of,\n switchMap,\n tap,\n} from 'rxjs';\nimport {\n BlockComponent,\n MovePositionActions,\n NgxEditorJsBlock,\n NgxEditorJsBlockWithComponent,\n} from '../ngx-editor-js2.interface';\nimport { BlockMovementService } from './block-movement.service';\n\nconst createUID = () => Math.random().toString(36).substring(7);\n@Injectable({\n providedIn: 'root',\n})\nexport class EditorJsService {\n formBuilder = inject(FormBuilder);\n blockMovementService = inject(BlockMovementService);\n\n componentRefMap = new Map<object, unknown>();\n\n ngxEditor!: ViewContainerRef;\n formGroup = this.formBuilder.group({});\n\n // TODO - Handle this idiomatically\n setNgxEditor(ngxEditor: ViewContainerRef) {\n this.ngxEditor = ngxEditor;\n }\n\n getBlocks$(): Observable<NgxEditorJsBlock[]> {\n return new Observable<NgxEditorJsBlock[]>((observer) => {\n lastValueFrom(\n this.blockMovementService.getNgxEditorJsBlocks().pipe(\n map((componentRefs) =>\n componentRefs.map<NgxEditorJsBlock>(({ instance }) => ({\n blockId: instance.formControlName(),\n sortIndex: instance.sortIndex(),\n componentInstanceName: instance.componentInstanceName,\n savedAction: instance.savedAction(),\n dataClean: instance.formGroup().get(instance.formControlName())\n ?.value,\n }))\n ),\n map((blocks) => blocks.sort((a, b) => a.sortIndex - b.sortIndex))\n )\n ).then((blocks) => {\n observer.next(blocks);\n observer.complete();\n });\n });\n }\n\n createNgxEditorJsBlockWithComponent(\n blockComponent: Type<BlockComponent>,\n componentContextPositionIndex: number\n ) {\n return of<NgxEditorJsBlockWithComponent>({\n blockId: createUID(),\n sortIndex: componentContextPositionIndex,\n componentInstanceName: blockComponent.name,\n component: blockComponent,\n // TODO - Force content-type for dataClean? JSON, HTML, etc.\n // TODO - And maybe rename dataClean to just data?\n dataClean: '',\n autofocus: true,\n });\n }\n\n addBlockComponent(\n ngxEditorJsBlock: NgxEditorJsBlockWithComponent\n ): Observable<void> {\n return forkJoin([\n this.createFormGroupControl(ngxEditorJsBlock),\n this.attachComponent(ngxEditorJsBlock),\n this.blockMovementService.updateComponentIndices(this.ngxEditor),\n ]).pipe(map(() => void 0));\n }\n\n createFormGroupControl({\n blockId,\n dataClean,\n }: NgxEditorJsBlockWithComponent) {\n return of(this.formBuilder.control(dataClean, [])).pipe(\n tap((formControl) => this.formGroup.addControl(blockId, formControl))\n );\n }\n\n attachComponent({\n component,\n blockId,\n autofocus,\n savedAction,\n sortIndex: index,\n }: NgxEditorJsBlockWithComponent) {\n return of(blockId).pipe(\n map((controlName) => {\n const componentRef = this.ngxEditor.createComponent(component, {\n index,\n });\n componentRef.setInput('sortIndex', index);\n componentRef.setInput('formGroup', this.formGroup);\n componentRef.setInput('formControlName', controlName);\n componentRef.setInput('autofocus', autofocus);\n\n savedAction && componentRef.instance.actionCallback?.(savedAction);\n\n this.blockMovementService.newComponentAttached(componentRef);\n return componentRef;\n })\n );\n }\n\n determineMovePositionAction(\n action: MovePositionActions,\n index: number,\n formControlName: string\n ) {\n return iif(\n () => action === MovePositionActions.DELETE,\n this.removeBlockComponent(index, formControlName),\n this.blockMovementService.moveBlockComponentPosition(\n this.ngxEditor,\n action,\n index\n )\n ).pipe(\n switchMap(() =>\n this.blockMovementService.updateComponentIndices(this.ngxEditor)\n )\n );\n }\n\n moveBlockComponentPosition(previousIndex: number, currentIndex: number) {\n return of(this.ngxEditor.get(previousIndex)).pipe(\n filter((viewRef) => !!viewRef),\n tap((viewRef) => {\n this.ngxEditor.move(viewRef, currentIndex);\n }),\n switchMap(() =>\n this.blockMovementService.updateComponentIndices(this.ngxEditor)\n ),\n defaultIfEmpty(false)\n );\n }\n\n removeBlockComponent(index: number, formControlName: string, clear = false) {\n return combineLatest([\n this.blockMovementService.removeBlockComponent(\n this.ngxEditor,\n index,\n clear\n ),\n of(this.formGroup.removeControl(formControlName)),\n ]);\n }\n\n clearBlocks() {\n return this.blockMovementService.getNgxEditorJsBlocks().pipe(\n filter((componentRefs) => componentRefs.length > 0),\n map((componentRefs) =>\n componentRefs.sort(\n (a, b) => a.instance.sortIndex() - b.instance.sortIndex()\n )\n ),\n mergeMap((componentRefs) =>\n forkJoin(\n Array.from(componentRefs.values()).map((componentRef) =>\n this.removeBlockComponent(\n componentRef.instance.sortIndex() + 1,\n componentRef.instance.formControlName(),\n true\n )\n )\n )\n ),\n switchMap(() =>\n this.blockMovementService.updateComponentIndices(this.ngxEditor)\n ),\n tap(() => {\n this.blockMovementService.clearComponentRefs();\n this.ngxEditor.clear();\n }),\n defaultIfEmpty(false)\n );\n }\n}\n","import { inject, Injectable, Type, ViewContainerRef } from '@angular/core';\nimport {\n BehaviorSubject,\n combineLatest,\n distinctUntilChanged,\n filter,\n lastValueFrom,\n map,\n switchMap,\n tap,\n} from 'rxjs';\nimport { ToolbarComponent } from '../components/toolbar/toolbar.component';\nimport { EditorJsService } from './editor-js.service';\nimport { NgxEditorJs2Service } from './ngx-editor-js2.service';\nimport {\n BlockOptionAction,\n BlockComponent,\n MovePositionActions,\n} from '../ngx-editor-js2.interface';\n\ntype ComponentContext = {\n index: number;\n viewContainerRef: ViewContainerRef;\n blockOptionActions: BlockOptionAction[];\n actionCallback: (v: string) => void;\n formControlName: string;\n} | null;\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ToolFabService {\n ngxEditorJs2Service = inject(NgxEditorJs2Service);\n editorJsService = inject(EditorJsService);\n // I need to explain this in detail so the future me can understand this.\n componentContext = new BehaviorSubject<ComponentContext>(null);\n toolbarComponentRef$ = combineLatest({\n componentContext: this.componentContext.asObservable(),\n supportedBlocks: this.ngxEditorJs2Service.supportedBlocks$,\n }).pipe(\n filter(({ componentContext }) => componentContext !== null),\n distinctUntilChanged(\n ({ componentContext: previous }, { componentContext: current }) =>\n previous!.index !== current!.index ||\n previous!.viewContainerRef !== current!.viewContainerRef\n ? (previous!.viewContainerRef.clear(), false)\n : true\n ),\n map(({ componentContext, supportedBlocks }) => {\n const {\n index,\n viewContainerRef,\n blockOptionActions,\n actionCallback,\n formControlName,\n } = componentContext!;\n // TODO We will need to create a ToolbarBottomRailComponent to handle the mobile view\n const componentRef = viewContainerRef.createComponent(ToolbarComponent);\n componentRef.setInput('componentContextPositionIndex', index + 1);\n componentRef.setInput('supportedBlocks', supportedBlocks);\n componentRef.setInput('blockOptionActions', blockOptionActions);\n componentRef.setInput('actionCallback', actionCallback);\n componentRef.setInput('formControlName', formControlName);\n componentRef.setInput('addBlockCallback', this.addBlock.bind(this));\n componentRef.setInput(\n 'moveBlockPositionCallback',\n this.movePositionAction.bind(this)\n );\n return componentRef;\n }),\n );\n\n addBlock(block: Type<BlockComponent>, index: number) {\n return this.editorJsService\n .createNgxEditorJsBlockWithComponent(block, index)\n .pipe(\n switchMap((block) => this.editorJsService.addBlockComponent(block))\n );\n }\n\n movePositionAction(\n action: MovePositionActions,\n index: number,\n formControlName: string\n ) {\n return lastValueFrom(\n this.editorJsService.determineMovePositionAction(\n action,\n index,\n formControlName\n )\n );\n }\n}\n","import {\n ComponentRef,\n Directive,\n effect,\n HostListener,\n inject,\n input,\n ViewContainerRef,\n} from '@angular/core';\nimport { ToolFabService } from '../services/tool-fab.service';\nimport { Observable } from 'rxjs';\nimport { ToolbarComponent } from '../components/toolbar/toolbar.component';\nimport { BlockOptionAction } from '../ngx-editor-js2.interface';\n\nexport type ToolbarComponentRef = Observable<ComponentRef<ToolbarComponent>>;\n\n@Directive({\n selector: '[toolbarFab]',\n})\nexport class ToolbarFabDirective {\n toolFabService = inject(ToolFabService);\n viewContainerRef = inject(ViewContainerRef);\n\n autofocus = input<boolean>();\n blockOptionActions = input<BlockOptionAction[]>();\n actionCallback = input.required<(action: string) => void>();\n componentContextPositionIndex = input.required<number>();\n formControlName = input.required<string>();\n\n @HostListener('mouseenter') onMouseEnter() {\n this.toolFabService.componentContext.next({\n viewContainerRef: this.viewContainerRef,\n blockOptionActions: this.blockOptionActions() ?? [],\n actionCallback: this.actionCallback(),\n index: this.componentContextPositionIndex(),\n formControlName: this.formControlName(),\n });\n }\n\n constructor() {\n effect(() => {\n this.autofocus() && this.onMouseEnter();\n });\n }\n}\n","import {\n Directive,\n HostListener,\n} from '@angular/core';\n\n@Directive({\n selector: '[cleanPasteData]',\n})\nexport class CleanPasteDataDirective {\n @HostListener('paste', ['$event'])\n onPaste(event: Event) {\n event.preventDefault();\n const text = (event as ClipboardEvent).clipboardData?.getData('text/plain');\n document.execCommand('insertText', false, text);\n }\n}\n","import { Component, input, signal } from '@angular/core';\nimport { ControlAccessorDirective } from '../../directives/control-accessor.directive';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { AutofocusDirective } from '../../directives/autofocus.directive';\nimport { ToolbarFabDirective } from '../../directives/toolbar-fab.directive';\nimport { CleanPasteDataDirective } from '../../directives/clean-paste-data.directive';\nimport {\n BlockComponent,\n BlockOptionAction,\n} from '../../ngx-editor-js2.interface';\nimport { NgSwitch, NgSwitchCase, NgTemplateOutlet } from '@angular/common';\nimport { CdkDrag } from '@angular/cdk/drag-drop';\n\n@Component({\n selector: 'header-block',\n host: { class: 'cdk-drag-animating' },\n hostDirectives: [CdkDrag],\n imports: [\n ReactiveFormsModule,\n ControlAccessorDirective,\n AutofocusDirective,\n ToolbarFabDirective,\n CleanPasteDataDirective,\n NgSwitch,\n NgSwitchCase,\n NgTemplateOutlet,\n ],\n template: `\n <ng-container [ngSwitch]=\"savedAction()\">\n <h1 *ngSwitchCase=\"'h1'\">\n <ng-container *ngTemplateOutlet=\"sharedHeaderTemplate\"></ng-container>\n </h1>\n <h2 *ngSwitchCase=\"'h2'\">\n <ng-container *ngTemplateOutlet=\"sharedHeaderTemplate\"></ng-container>\n </h2>\n <h3 *ngSwitchCase=\"'h3'\">\n <ng-container *ngTemplateOutlet=\"sharedHeaderTemplate\"></ng-container>\n </h3>\n <h4 *ngSwitchCase=\"'h4'\">\n <ng-container *ngTemplateOutlet=\"sharedHeaderTemplate\"></ng-container>\n </h4>\n <h5 *ngSwitchCase=\"'h5'\">\n <ng-container *ngTemplateOutlet=\"sharedHeaderTemplate\"></ng-container>\n </h5>\n <h6 *ngSwitchCase=\"'h6'\">\n <ng-container *ngTemplateOutlet=\"sharedHeaderTemplate\"></ng-container>\n </h6>\n </ng-container>\n\n <ng-template [formGroup]=\"formGroup()\" #sharedHeaderTemplate>\n <span\n controlAccessor\n cleanPasteData\n contentEditable\n toolbarFab\n [defaultValue]=\"formGroup().get(formControlName())?.value\"\n [actionCallback]=\"actionCallbackBind\"\n [blockOptionActions]=\"blockOptionActions()\"\n [autofocus]=\"autofocus()\"\n [formControlName]=\"formControlName()\"\n [componentContextPositionIndex]=\"sortIndex()\"\n ></span>\n </ng-template>\n `,\n styles: [\n `\n :host {\n display: block;\n position: relative;\n :is(h1, h2, h3, h4, h5, h6) {\n margin: 0;\n span {\n display: block;\n line-height: inherit;\n }\n }\n\n h1 > * {\n font: var(--mat-sys-display-large);\n }\n h2 > * {\n font: var(--mat-sys-display-medium);\n }\n h3 > * {\n font: var(--mat-sys-display-small);\n }\n h4 > * {\n font: var(--mat-sys-headline-large);\n }\n h5 > * {\n font: var(--mat-sys-headline-medium);\n }\n h6 > * {\n font: var(--mat-sys-headline-small);\n }\n }\n `,\n ],\n})\nexport class HeaderBlockComponent implements BlockComponent {\n sortIndex = input<number>(0);\n componentInstanceName = 'HeaderBlockComponent';\n autofocus = input<boolean>(true);\n formGroup = input.required<FormGroup>();\n formControlName = input.required<string>();\n blockOptionActions = input<BlockOptionAction[]>([\n { action: 'h1', text: 'H1' },\n { action: 'h2', text: 'H2' },\n { action: 'h3', text: 'H3' },\n { action: 'h4', text: 'H4' },\n { action: 'h5', text: 'H5' },\n { action: 'h6', text: 'H6' },\n ]);\n\n savedAction = signal<string>('h1');\n actionCallbackBind = this.actionCallback.bind(this);\n\n actionCallback(selectedAction: string) {\n this.savedAction.set(selectedAction);\n }\n}\n","import { Component, input, signal } from '@angular/core';\nimport { ControlAccessorDirective } from '../../directives/control-accessor.directive';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { AutofocusDirective } from '../../directives/autofocus.directive';\nimport { ToolbarFabDirective } from '../../directives/toolbar-fab.directive';\nimport { CleanPasteDataDirective } from '../../directives/clean-paste-data.directive';\nimport {\n BlockComponent,\n BlockOptionAction,\n} from '../../ngx-editor-js2.interface';\nimport { NgClass } from '@angular/common';\nimport { CdkDrag } from '@angular/cdk/drag-drop';\n\n\n@Component({\n selector: 'paragraph-block',\n host: { class: 'cdk-drag-animating' },\n hostDirectives: [CdkDrag],\n imports: [\n ReactiveFormsModule,\n ControlAccessorDirective,\n AutofocusDirective,\n ToolbarFabDirective,\n CleanPasteDataDirective,\n NgClass,\n ],\n template: `\n <ng-container [formGroup]=\"formGroup()\">\n <p\n controlAccessor\n contentEditable\n toolbarFab\n cleanPasteData\n [ngClass]=\"savedAction()\"\n [defaultValue]=\"formGroup().get(formControlName())?.value\"\n [actionCallback]=\"actionCallbackBind\"\n [autofocus]=\"autofocus()\"\n [blockOptionActions]=\"blockOptionActions()\"\n [formControlName]=\"formControlName()\"\n [componentContextPositionIndex]=\"sortIndex()\"\n ></p>\n </ng-container>\n `,\n styles: [\n `\n :host {\n display: block;\n position: relative;\n .small {\n font: var(--mat-sys-body-small);\n }\n .medium {\n font: var(--mat-sys-body-medium);\n }\n .large {\n font: var(--mat-sys-body-large);\n }\n .title-small {\n font: var(--mat-sys-title-small);\n }\n .title-medium {\n font: var(--mat-sys-title-medium);\n }\n .title-large {\n font: var(--mat-sys-title-large);\n }\n }\n `,\n ],\n})\nexport class ParagraphBlockComponent implements BlockComponent {\n sortIndex = input<number>(0);\n componentInstanceName = 'ParagraphBlockComponent';\n autofocus = input<boolean>(true);\n formGroup = input.required<FormGroup>();\n formControlName = input.required<string>();\n blockOptionActions = input<BlockOptionAction[]>([\n { action: 'small', icon: 'density_small' },\n { action: 'medium', icon: 'density_medium' },\n { action: 'large', icon: 'density_large' },\n { action: 'title-small', text: 'TS' },\n { action: 'title-medium', text: 'TM' },\n { action: 'title-large', text: 'TL' },\n ]);\n\n savedAction = signal<string>('medium');\n actionCallbackBind = this.actionCallback.bind(this);\n\n actionCallback(action: string) {\n this.savedAction.update(() => action);\n }\n}\n","import { inject, Injectable, InjectionToken, Type } from '@angular/core';\nimport { HeaderBlockComponent } from '../components/blocks/header-block.component';\nimport { ParagraphBlockComponent } from '../components/blocks/paragraph-block.component';\nimport {\n BehaviorSubject,\n combineLatest,\n delay,\n exhaustMap,\n forkJoin,\n map,\n mergeMap,\n of,\n switchMap,\n} from 'rxjs';\nimport { EditorJsService } from './editor-js.service';\nimport {\n NgxEditorjsOptions,\n NgxEditorJsBlock,\n NgxEditorJsBlockWithComponent,\n SupportedBlock,\n BlockComponent,\n} from '../ngx-editor-js2.interface';\n\nexport const NGX_EDITORJS_OPTIONS = new InjectionToken<NgxEditorjsOptions>(\n 'NGX_EDITORJS_OPTIONS'\n);\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NgxEditorJs2Service {\n editorJsService = inject(EditorJsService);\n\n consumerSupportedBlocks = new BehaviorSubject<SupportedBlock[]>(\n inject(NGX_EDITORJS_OPTIONS, { optional: true })?.consumerSupportedBlocks ??\n []\n );\n\n internalSupportedBlocks = new BehaviorSubject<SupportedBlock[]>([\n {\n name: 'Paragraph',\n component: ParagraphBlockComponent,\n componentInstanceName: 'ParagraphBlockComponent',\n },\n {\n name: 'Header',\n component: HeaderBlockComponent,\n componentInstanceName: 'HeaderBlockComponent',\n },\n ]);\n\n supportedBlocks$ = combineLatest([\n this.internalSupportedBlocks.asObservable(),\n this.consumerSupportedBlocks.asObservable(),\n ]).pipe(map(([internal, consumer]) => [...internal, ...consumer]));\n\n blocksToLoad = new BehaviorSubject<NgxEditorJsBlock[]>([]);\n\n loadBlocks$ = this.blocksToLoad.asObservable().pipe(\n delay(0),\n exhaustMap((blocks) => this.clearBlocksFromEditorJs(blocks)),\n map(([blocks]) => this.determineToloadDefaultBlocks(blocks)),\n map((blocks) => this.removeDuplicateBlocksWithSameIds(blocks)),\n map((blocks) => this.sortBlocks(blocks)),\n switchMap((blocks) => this.combineSupportBlocks(blocks)),\n map(([blocks, supportedBlocks]) =>\n this.createALookupMapForSupportedBlocks(blocks, supportedBlocks)\n ),\n map(({ blocks, supportedBlocksMap }) =>\n this.findAndMarshalBlocksComponent(blocks, supportedBlocksMap)\n ),\n mergeMap((blocks) =>\n this.addBlocksToEditorJs(blocks).pipe(map(() => blocks))\n )\n );\n\n clearBlocksFromEditorJs(blocks: NgxEditorJsBlock[]) {\n return forkJoin([of(blocks), this.editorJsService.clearBlocks()]);\n }\n\n determineToloadDefaultBlocks(blocks: NgxEditorJsBlock[]) {\n return blocks.length > 0 ? blocks : this.loadDefaultBlocks();\n }\n\n loadDefaultBlocks() {\n return [\n {\n blockId: 'tmdjr',\n sortIndex: 0,\n componentInstanceName: 'HeaderBlockComponent',\n dataClean: \"Let's get started... 🚀\",\n savedAction: 'h1',\n },\n ];\n }\n\n removeDuplicateBlocksWithSameIds(blocks: NgxEditorJsBlock[]) {\n return Array.from(\n new Map(blocks.map((block) => [block.blockId, block])).values()\n );\n }\n\n sortBlocks(blocks: NgxEditorJsBlock[]) {\n return blocks.sort((a, b) => a.sortIndex - b.sortIndex);\n }\n\n combineSupportBlocks(blocks: NgxEditorJsBlock[]) {\n return combineLatest([of(blocks), this.supportedBlocks$]);\n }\n\n createALookupMapForSupportedBlocks(\n blocks: NgxEditorJsBlock[],\n supportedBlocks: SupportedBlock[]\n ) {\n return {\n blocks,\n supportedBlocksMap: new Map(\n supportedBlocks.map((sb) => [sb.componentInstanceName, sb.component])\n ),\n };\n }\n\n findAndMarshalBlocksComponent(\n blocks: NgxEditorJsBlock[],\n supportedBlocksMap: Map<string, Type<BlockComponent>>\n ) {\n return blocks.map((block) => ({\n ...block,\n component:\n supportedBlocksMap.get(block.componentInstanceName) ??\n HeaderBlockComponent,\n }));\n }\n\n addBlocksToEditorJs(blocks: NgxEditorJsBlockWithComponent[]) {\n return combineLatest(\n blocks.map((block: NgxEditorJsBlockWithComponent) =>\n this.editorJsService.addBlockComponent(block)\n )\n );\n }\n}\n","import {\n Component,\n effect,\n inject,\n input,\n viewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { EditorJsService } from '../services/editor-js.service';\nimport { NgxEditorJs2Service } from '../services/ngx-editor-js2.service';\nimport { NgxEditorJsBlock } from '../ngx-editor-js2.interface';\nimport { CdkDropList, CdkDragDrop } from '@angular/cdk/drag-drop';\nimport { lastValueFrom } from 'rxjs';\n\n@Component({\n selector: 'editor-js',\n imports: [CdkDropList],\n template: `\n <div cdkDropList class=\"block-list\" (cdkDropListDropped)=\"drop($event)\">\n <ng-container #ngxEditor></ng-container>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n .block-list {\n min-height: 60px;\n }\n }\n `,\n ],\n})\nexport class EditorJsComponent {\n editorJsService = inject(EditorJsService);\n ngxEditorJs2Service = inject(NgxEditorJs2Service);\n\n bootstrapEditorJs = input();\n blocks = input.required({\n transform: (value: NgxEditorJsBlock[]) =>\n this.ngxEditorJs2Service.blocksToLoad.next(value),\n });\n\n ngxEditor = viewChild.required('ngxEditor', { read: ViewContainerRef });\n\n constructor() {\n effect(() => {\n this.editorJsService.setNgxEditor(this.ngxEditor());\n });\n }\n\n // * DEBUGGING\n // ngOnInit() {\n // this.editorJsService.formGroup.valueChanges.subscribe((value) => {\n // console.log('[formGroup.value] : ', value);\n // });\n // this.editorJsService.blockComponents$.subscribe((components) => {\n // console.log('[components] : ', components);\n // });\n // }\n\n drop(event: CdkDragDrop<string[]>) {\n lastValueFrom(\n this.editorJsService.moveBlockComponentPosition(\n event.previousIndex,\n event.currentIndex\n )\n ).then(() => {\n // DRAG ANIMATION HOT FIX\n // Wait for Angular to update the DOM, then remove the animation class\n requestAnimationFrame(() => {\n document.querySelectorAll('.cdk-drag-animating').forEach((el) => {\n const element = el as HTMLElement;\n element.classList.remove('cdk-drag-animating'); // Ensure old class is removed\n void element.offsetWidth; // Force reflow\n element.classList.add('cdk-drag-animating'); // Re-add for next drag\n });\n });\n });\n }\n}\n","import {\n Component,\n EventEmitter,\n inject,\n input,\n Input,\n Output,\n Renderer2,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatListModule } from '@angular/material/list';\n\n@Component({\n selector: 'toolbar-inline',\n imports: [MatListModule, MatIconModule, FormsModule],\n host: { class: 'mat-elevation-z24' },\n template: `\n <div class=\"panel\">\n @for (item of options; track $index) {\n <div class=\"inline-option\" (click)=\"addInlineTag(item.action)\">\n <mat-icon>{{ item.icon }}</mat-icon>\n </div>\n }\n <div class=\"inline-option\" (click)=\"addClassTag('code', 'inline-code')\">\n <mat-icon>code</mat-icon>\n </div>\n <div class=\"inline-option\" (click)=\"openUrlInput()\">\n <mat-icon>insert_link</mat-icon>\n </div>\n <div class=\"inline-option\" (click)=\"clearTags()\">\n <mat-icon>format_clear</mat-icon>\n </div>\n </div>\n\n @if(showURLInputField()) {\n <div class=\"panel\">\n <input\n type=\"text\"\n placeholder=\"Enter URL\"\n class=\"block-option-input\"\n [(ngModel)]=\"url\"\n />\n <div class=\"inline-option\" (click)=\"createLink()\">\n <mat-icon>add</mat-icon>\n </div>\n </div>\n }\n `,\n styles: [\n `\n :host {\n color: var(--mat-sys-on-secondary);\n background: var(--mat-sys-secondary);\n border-radius: 8px;\n .panel {\n display: flex;\n width: 230px;\n flex-wrap: wrap;\n gap: 1px;\n }\n .inline-option {\n cursor: pointer;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .block-option-input {\n width: 197px;\n height: 32px;\n border: none;\n outline: none;\n color: var(--mat-sys-on-secondary);\n background-color: transparent;\n box-sizing: border-box;\n }\n }\n `,\n ],\n})\nexport class ToolbarInlineComponent {\n // @Input() selection!: Selection;\n selection = input.required<Selection>();\n @Output('closeOverlay') closeOverlayEmitter = new EventEmitter();\n\n renderer = inject(Renderer2);\n\n url = '';\n showURLInputField = signal(false);\n savedRanges: Range[] = [];\n options = [\n { icon: 'format_bold', action: 'bold' },\n { icon: 'format_italic', action: 'italic' },\n { icon: 'format_underlined', action: 'underline' },\n { icon: 'strikethrough_s', action: 'strikethrough' },\n { icon: 'format_list_bulleted', action: 'insertUnorderedList' },\n { icon: 'format_list_numbered', action: 'insertOrderedList' },\n { icon: 'highlight', action: 'highlightColor' },\n { icon: 'format_align_left', action: 'justifyLeft' },\n { icon: 'format_align_center', action: 'justifyCenter' },\n { icon: 'format_align_right', action: 'justifyRight' },\n { icon: 'format_align_justify', action: 'justifyFull' },\n ];\n\n addInlineTag(tag: string) {\n // https://stackoverflow.com/questions/60581285/execcommand-is-now-obsolete-whats-the-alternative\n document.execCommand(tag);\n this.closeOverlayEmitter.emit();\n }\n\n addClassTag(tag: string, className: string) {\n const range = this.selection().getRangeAt(0);\n const element = this.renderer.createElement(tag);\n element.className = className ?? '';\n element.innerHTML = range.toString();\n range.deleteContents();\n range.insertNode(element);\n this.closeOverlayEmitter.emit();\n }\n\n clearTags() {\n document.execCommand('removeFormat');\n document.execCommand('unlink');\n this.closeOverlayEmitter.emit();\n }\n\n openUrlInput() {\n this.savedRanges.push(this.selection().getRangeAt(0));\n this.showURLInputField.set(true);\n }\n\n createLink() {\n this.selection().removeAllRanges();\n this.selection().addRange(this.savedRanges.pop()!);\n document.execCommand('createLink', false, this.url);\n this.closeOverlayEmitter.emit();\n }\n}\n","import { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { inject, Injectable } from '@angular/core';\nimport { exhaustMap, filter, lastValueFrom, map, merge, of, tap } from 'rxjs';\nimport { ToolbarInlineComponent } from '../components/toolbar-inline/toolbar-inline.component';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ToolbarInlineService {\n overlay = inject(Overlay);\n overlayRef!: OverlayRef;\n\n determineToDisplayInlineToolbarBlock(_event: Event) {\n return of(window.getSelection()).pipe(\n filter((selection) => selection !== null),\n filter((selection) => selection.rangeCount > 0),\n filter((selection) => selection.toString().length > 0),\n filter((selection) => selection.toString() !== ''),\n tap(() => this.overlayRef?.hasAttached() && this.overlayRef.dispose()), // So hacky tired to do this properly\n map((selection) => ({\n selection,\n parant: this.getSelectionParent(selection),\n })),\n filter(({ parant }) => this.isSelectionInABlock(parant as HTMLElement)),\n exhaustMap(({ selection }) => this.attachInlineToolbar(selection))\n );\n }\n\n getSelectionParent(selection: Selection): HTMLElement | null {\n const range = selection.getRangeAt(0);\n return range.commonAncestorContainer.nodeType === Node.ELEMENT_NODE\n ? (range.commonAncestorContainer as HTMLElement)\n : range.commonAncestorContainer.parentElement;\n }\n\n isSelectionInABlock(target: HTMLElement | null) {\n // ! TODO: This is a hacky way to determine if the selection is in a block\n // ! Need to also check if the block wants to display the inline toolbar\n return (\n !!target &&\n (target.closest('.no-toolbar-inline') !== null\n ? false\n : target.closest('ngx-editor-js2') !== null\n ? true\n : false)\n );\n }\n\n attachInlineToolbar(selection: Selection) {\n return of(selection.getRangeAt(0)).pipe(\n map((range) => range.getBoundingClientRect()),\n map((selectionRect) => this.createOverlay(selectionRect)),\n // So hacky tired to do this properly\n // passing the refs down the pipe adds a bug\n // user selects text with a drag\n // (mousedown → mousemove → wait → mousemove → mouseup)\n tap((overlayRef) => (this.overlayRef = overlayRef)),\n map((overlayRef) => {\n const inlineToolbar = overlayRef.attach(\n new ComponentPortal(ToolbarInlineComponent)\n );\n inlineToolbar.setInput('selection', selection);\n\n lastValueFrom(\n merge(\n overlayRef.backdropClick(),\n inlineToolbar.instance.closeOverlayEmitter\n ).pipe(\n tap(() => overlayRef.dispose()),\n tap(() => selection.removeAllRanges())\n )\n );\n return true;\n })\n );\n }\n\n createOverlay(selectionRect: DOMRect) {\n return this.overlay.create({\n hasBackdrop: true,\n backdropClass: 'cdk-overlay-transparent-backdrop',\n positionStrategy: this.overlay\n .position()\n .flexibleConnectedTo(selectionRect)\n .withPositions([\n {\n offsetY: 8,\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n },\n ]),\n });\n }\n}\n","import { Component, inject, input, output } from '@angular/core';\nimport { EditorJsComponent } from './components/editor-js.component';\nimport { AsyncPipe } from '@angular/common';\nimport {\n combineLatest,\n debounceTime,\n fromEvent,\n Observable,\n switchMap,\n} from 'rxjs';\nimport { ToolFabService } from './services/tool-fab.service';\nimport { NgxEditorJsBlock } from './ngx-editor-js2.interface';\nimport { ToolbarInlineService } from './services/toolbar-inline.service';\nimport { EditorJsService } from './services/editor-js.service';\nimport { NgxEditorJs2Service } from './services/ngx-editor-js2.service';\n\n@Component({\n selector: 'ngx-editor-js2',\n imports: [EditorJsComponent, AsyncPipe],\n template: `\n <editor-js\n [blocks]=\"blocks()\"\n [bootstrapEditorJs]=\"bootstrapEditorJs$ | async\"\n ></editor-js>\n `,\n})\nexport class NgxEditorJs2Component {\n inlineToolbarSerivce = inject(ToolbarInlineService);\n editorJsService = inject(EditorJsService);\n ngxEditorJs2Service = inject(NgxEditorJs2Service);\n\n blocks = input<NgxEditorJsBlock[]>([]);\n blocksRequested = output<Observable<NgxEditorJsBlock[]>>();\n requestBlocks = input.required({\n transform: (_v: unknown) =>\n this.blocksRequested.emit(this.editorJsService.getBlocks$()),\n });\n\n bootstrapEditorJs$ = combineLatest([\n inject(ToolFabService).toolbarComponentRef$,\n this.ngxEditorJs2Service.loadBlocks$,\n fromEvent(document, 'selectionchange').pipe(\n debounceTime(200),\n switchMap((event) =>\n this.inlineToolbarSerivce.determineToDisplayInlineToolbarBlock(event)\n )\n )\n ]);\n}\n","/*\n * Public API Surface of ngx-editor-js2\n */\n\nexport * from './lib/services/ngx-editor-js2.service';\nexport * from './lib/ngx-editor-js2.component';\nexport type * from './lib/ngx-editor-js2.interface';\nexport * from './lib/directives/autofocus.directive';\nexport * from './lib/directives/toolbar-fab.directive';\nexport * from './lib/directives/control-accessor.directive';\nexport * from './lib/directives/clean-paste-data.directive';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
@@ -1,20 +1,21 @@
1
1
  import { EventEmitter, Renderer2 } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
3
  export declare class ToolbarInlineComponent {
4
- private readonly renderer;
5
- selection: Selection;
6
- closeInlineToobarOverlayEmitter: EventEmitter<any>;
4
+ selection: import("@angular/core").InputSignal<Selection>;
5
+ closeOverlayEmitter: EventEmitter<any>;
6
+ renderer: Renderer2;
7
7
  url: string;
8
- showURLInputField: boolean;
8
+ showURLInputField: import("@angular/core").WritableSignal<boolean>;
9
9
  savedRanges: Range[];
10
- constructor(renderer: Renderer2);
11
- ngOnInit(): void;
12
- closeInlineToobarOverlay(): void;
13
- addInlineTag(tag: string, optionValue?: string | null): void;
14
- addCustomInlineTag(tag: string, className?: string | null): void;
10
+ options: {
11
+ icon: string;
12
+ action: string;
13
+ }[];
14
+ addInlineTag(tag: string): void;
15
+ addClassTag(tag: string, className: string): void;
15
16
  clearTags(): void;
16
17
  openUrlInput(): void;
17
18
  createLink(): void;
18
19
  static ɵfac: i0.ɵɵFactoryDeclaration<ToolbarInlineComponent, never>;
19
- static ɵcmp: i0.ɵɵComponentDeclaration<ToolbarInlineComponent, "toolbar-inline", never, { "selection": { "alias": "selection"; "required": false; }; }, { "closeInlineToobarOverlayEmitter": "closeInlineToobarOverlay"; }, never, never, true, never>;
20
+ static ɵcmp: i0.ɵɵComponentDeclaration<ToolbarInlineComponent, "toolbar-inline", never, { "selection": { "alias": "selection"; "required": true; "isSignal": true; }; }, { "closeOverlayEmitter": "closeOverlay"; }, never, never, true, never>;
20
21
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tmdjr/ngx-editor-js2",
3
- "version": "0.0.7",
3
+ "version": "0.0.9",
4
4
  "peerDependencies": {
5
5
  "@angular/animations": "^19.0.0",
6
6
  "@angular/cdk": "^19.1.0",