@notectl/angular 0.0.2

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.
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Angular directive for NotectlEditor (optional alternative to component)
3
+ */
4
+ import { Directive, EventEmitter, Input, Output, forwardRef, } from '@angular/core';
5
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
6
+ import * as i0 from "@angular/core";
7
+ /**
8
+ * Directive to use NotectlEditor on any element
9
+ * Usage: <div notectl-editor [content]="content"></div>
10
+ */
11
+ export class NotectlEditorDirective {
12
+ elementRef;
13
+ debug;
14
+ content;
15
+ placeholder;
16
+ readOnly;
17
+ accessibility;
18
+ i18n;
19
+ theme;
20
+ contentChange = new EventEmitter();
21
+ selectionChange = new EventEmitter();
22
+ editorFocus = new EventEmitter();
23
+ editorBlur = new EventEmitter();
24
+ ready = new EventEmitter();
25
+ error = new EventEmitter();
26
+ editor = null;
27
+ onChange = () => { };
28
+ onTouched = () => { };
29
+ constructor(elementRef) {
30
+ this.elementRef = elementRef;
31
+ }
32
+ ngOnInit() {
33
+ this.initEditor();
34
+ }
35
+ ngOnDestroy() {
36
+ this.destroyEditor();
37
+ }
38
+ initEditor() {
39
+ const hostElement = this.elementRef.nativeElement;
40
+ // Create editor instance
41
+ this.editor = document.createElement('notectl-editor');
42
+ // Configure editor
43
+ const config = {
44
+ debug: this.debug,
45
+ content: this.content,
46
+ placeholder: this.placeholder,
47
+ readOnly: this.readOnly,
48
+ accessibility: this.accessibility,
49
+ i18n: this.i18n,
50
+ theme: this.theme,
51
+ };
52
+ this.editor.configure(config);
53
+ // Attach event listeners
54
+ this.editor.on('content-change', (data) => {
55
+ const eventData = data;
56
+ const content = eventData.content;
57
+ this.contentChange.emit(content);
58
+ this.onChange(content);
59
+ });
60
+ this.editor.on('selection-change', (data) => {
61
+ const eventData = data;
62
+ this.selectionChange.emit(eventData.selection);
63
+ });
64
+ this.editor.on('focus', () => {
65
+ this.editorFocus.emit();
66
+ this.onTouched();
67
+ });
68
+ this.editor.on('blur', () => {
69
+ this.editorBlur.emit();
70
+ });
71
+ this.editor.on('ready', () => {
72
+ this.ready.emit(this.getEditorAPI());
73
+ });
74
+ this.editor.on('error', (data) => {
75
+ const eventData = data;
76
+ if (eventData.error) {
77
+ this.error.emit(eventData.error);
78
+ }
79
+ });
80
+ // Mount editor
81
+ hostElement.appendChild(this.editor);
82
+ }
83
+ destroyEditor() {
84
+ if (this.editor) {
85
+ this.editor.destroy();
86
+ const hostElement = this.elementRef.nativeElement;
87
+ if (hostElement.contains(this.editor)) {
88
+ hostElement.removeChild(this.editor);
89
+ }
90
+ this.editor = null;
91
+ }
92
+ }
93
+ getEditorAPI() {
94
+ if (!this.editor) {
95
+ throw new Error('Editor not initialized');
96
+ }
97
+ return this.editor;
98
+ }
99
+ // ControlValueAccessor implementation
100
+ writeValue(value) {
101
+ if (this.editor && typeof value === 'string') {
102
+ this.editor.setContent(value);
103
+ }
104
+ }
105
+ registerOnChange(fn) {
106
+ this.onChange = fn;
107
+ }
108
+ registerOnTouched(fn) {
109
+ this.onTouched = fn;
110
+ }
111
+ setDisabledState(isDisabled) {
112
+ if (this.editor) {
113
+ this.editor.configure({ readOnly: isDisabled });
114
+ }
115
+ }
116
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NotectlEditorDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
117
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: NotectlEditorDirective, selector: "[notectl-editor]", inputs: { debug: "debug", content: "content", placeholder: "placeholder", readOnly: "readOnly", accessibility: "accessibility", i18n: "i18n", theme: "theme" }, outputs: { contentChange: "contentChange", selectionChange: "selectionChange", editorFocus: "editorFocus", editorBlur: "editorBlur", ready: "ready", error: "error" }, providers: [
118
+ {
119
+ provide: NG_VALUE_ACCESSOR,
120
+ useExisting: forwardRef(() => NotectlEditorDirective),
121
+ multi: true,
122
+ },
123
+ ], ngImport: i0 });
124
+ }
125
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NotectlEditorDirective, decorators: [{
126
+ type: Directive,
127
+ args: [{
128
+ selector: '[notectl-editor]',
129
+ providers: [
130
+ {
131
+ provide: NG_VALUE_ACCESSOR,
132
+ useExisting: forwardRef(() => NotectlEditorDirective),
133
+ multi: true,
134
+ },
135
+ ],
136
+ }]
137
+ }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { debug: [{
138
+ type: Input
139
+ }], content: [{
140
+ type: Input
141
+ }], placeholder: [{
142
+ type: Input
143
+ }], readOnly: [{
144
+ type: Input
145
+ }], accessibility: [{
146
+ type: Input
147
+ }], i18n: [{
148
+ type: Input
149
+ }], theme: [{
150
+ type: Input
151
+ }], contentChange: [{
152
+ type: Output
153
+ }], selectionChange: [{
154
+ type: Output
155
+ }], editorFocus: [{
156
+ type: Output
157
+ }], editorBlur: [{
158
+ type: Output
159
+ }], ready: [{
160
+ type: Output
161
+ }], error: [{
162
+ type: Output
163
+ }] } });
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90ZWN0bC1lZGl0b3IuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9ub3RlY3RsLWVkaXRvci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEVBQ0wsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLFVBQVUsR0FDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBSXpFOzs7R0FHRztBQVdILE1BQU0sT0FBTyxzQkFBc0I7SUFvQmI7SUFuQlgsS0FBSyxDQUFXO0lBQ2hCLE9BQU8sQ0FBbUI7SUFDMUIsV0FBVyxDQUFVO0lBQ3JCLFFBQVEsQ0FBVztJQUNuQixhQUFhLENBQWlDO0lBQzlDLElBQUksQ0FBd0I7SUFDNUIsS0FBSyxDQUF5QjtJQUU3QixhQUFhLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztJQUM1QyxlQUFlLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztJQUM5QyxXQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUN2QyxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUN0QyxLQUFLLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztJQUN0QyxLQUFLLEdBQUcsSUFBSSxZQUFZLEVBQVMsQ0FBQztJQUVwQyxNQUFNLEdBQTZCLElBQUksQ0FBQztJQUN4QyxRQUFRLEdBQTZCLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztJQUM5QyxTQUFTLEdBQWUsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0lBRXpDLFlBQW9CLFVBQW1DO1FBQW5DLGVBQVUsR0FBVixVQUFVLENBQXlCO0lBQUcsQ0FBQztJQUUzRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFD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NEZBRVUsc0JBQXNCO2tCQVZsQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFNBQVMsRUFBRTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSx1QkFBdUIsQ0FBQzs0QkFDckQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7aUJBQ0Y7K0VBRVUsS0FBSztzQkFBYixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUVJLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csS0FBSztzQkFBZCxNQUFNO2dCQUNHLEtBQUs7c0JBQWQsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQW5ndWxhciBkaXJlY3RpdmUgZm9yIE5vdGVjdGxFZGl0b3IgKG9wdGlvbmFsIGFsdGVybmF0aXZlIHRvIGNvbXBvbmVudClcbiAqL1xuXG5pbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIGZvcndhcmRSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTm90ZWN0bEVkaXRvciBhcyBOb3RlY3RsRWRpdG9yQ29yZSB9IGZyb20gJ0Bub3RlY3RsL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBFZGl0b3JDb25maWcsIEVkaXRvckFQSSB9IGZyb20gJ0Bub3RlY3RsL2NvcmUnO1xuXG4vKipcbiAqIERpcmVjdGl2ZSB0byB1c2UgTm90ZWN0bEVkaXRvciBvbiBhbnkgZWxlbWVudFxuICogVXNhZ2U6IDxkaXYgbm90ZWN0bC1lZGl0b3IgW2NvbnRlbnRdPVwiY29udGVudFwiPjwvZGl2PlxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbm90ZWN0bC1lZGl0b3JdJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOb3RlY3RsRWRpdG9yRGlyZWN0aXZlKSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIE5vdGVjdGxFZGl0b3JEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBASW5wdXQoKSBkZWJ1Zz86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGNvbnRlbnQ/OiBzdHJpbmcgfCBvYmplY3Q7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICBASW5wdXQoKSByZWFkT25seT86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGFjY2Vzc2liaWxpdHk/OiBFZGl0b3JDb25maWdbJ2FjY2Vzc2liaWxpdHknXTtcbiAgQElucHV0KCkgaTE4bj86IEVkaXRvckNvbmZpZ1snaTE4biddO1xuICBASW5wdXQoKSB0aGVtZT86IEVkaXRvckNvbmZpZ1sndGhlbWUnXTtcblxuICBAT3V0cHV0KCkgY29udGVudENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8dW5rbm93bj4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8dW5rbm93bj4oKTtcbiAgQE91dHB1dCgpIGVkaXRvckZvY3VzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgZWRpdG9yQmx1ciA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcjxFZGl0b3JBUEk+KCk7XG4gIEBPdXRwdXQoKSBlcnJvciA9IG5ldyBFdmVudEVtaXR0ZXI8RXJyb3I+KCk7XG5cbiAgcHJpdmF0ZSBlZGl0b3I6IE5vdGVjdGxFZGl0b3JDb3JlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgb25DaGFuZ2U6ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZCA9ICgpID0+IHt9O1xuICBwcml2YXRlIG9uVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0RWRpdG9yKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3lFZGl0b3IoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdEVkaXRvcigpOiB2b2lkIHtcbiAgICBjb25zdCBob3N0RWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuXG4gICAgLy8gQ3JlYXRlIGVkaXRvciBpbnN0YW5jZVxuICAgIHRoaXMuZWRpdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbm90ZWN0bC1lZGl0b3InKSBhcyBOb3RlY3RsRWRpdG9yQ29yZTtcblxuICAgIC8vIENvbmZpZ3VyZSBlZGl0b3JcbiAgICBjb25zdCBjb25maWc6IEVkaXRvckNvbmZpZyA9IHtcbiAgICAgIGRlYnVnOiB0aGlzLmRlYnVnLFxuICAgICAgY29udGVudDogdGhpcy5jb250ZW50LFxuICAgICAgcGxhY2Vob2xkZXI6IHRoaXMucGxhY2Vob2xkZXIsXG4gICAgICByZWFkT25seTogdGhpcy5yZWFkT25seSxcbiAgICAgIGFjY2Vzc2liaWxpdHk6IHRoaXMuYWNjZXNzaWJpbGl0eSxcbiAgICAgIGkxOG46IHRoaXMuaTE4bixcbiAgICAgIHRoZW1lOiB0aGlzLnRoZW1lLFxuICAgIH07XG4gICAgdGhpcy5lZGl0b3IuY29uZmlndXJlKGNvbmZpZyk7XG5cbiAgICAvLyBBdHRhY2ggZXZlbnQgbGlzdGVuZXJzXG4gICAgdGhpcy5lZGl0b3Iub24oJ2NvbnRlbnQtY2hhbmdlJywgKGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGRhdGEgYXMgeyBjb250ZW50PzogdW5rbm93biB9O1xuICAgICAgY29uc3QgY29udGVudCA9IGV2ZW50RGF0YS5jb250ZW50O1xuICAgICAgdGhpcy5jb250ZW50Q2hhbmdlLmVtaXQoY29udGVudCk7XG4gICAgICB0aGlzLm9uQ2hhbmdlKGNvbnRlbnQpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5lZGl0b3Iub24oJ3NlbGVjdGlvbi1jaGFuZ2UnLCAoZGF0YSkgPT4ge1xuICAgICAgY29uc3QgZXZlbnREYXRhID0gZGF0YSBhcyB7IHNlbGVjdGlvbj86IHVua25vd24gfTtcbiAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoZXZlbnREYXRhLnNlbGVjdGlvbik7XG4gICAgfSk7XG5cbiAgICB0aGlzLmVkaXRvci5vbignZm9jdXMnLCAoKSA9PiB7XG4gICAgICB0aGlzLmVkaXRvckZvY3VzLmVtaXQoKTtcbiAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmVkaXRvci5vbignYmx1cicsICgpID0+IHtcbiAgICAgIHRoaXMuZWRpdG9yQmx1ci5lbWl0KCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmVkaXRvci5vbigncmVhZHknLCAoKSA9PiB7XG4gICAgICB0aGlzLnJlYWR5LmVtaXQodGhpcy5nZXRFZGl0b3JBUEkoKSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmVkaXRvci5vbignZXJyb3InLCAoZGF0YSkgPT4ge1xuICAgICAgY29uc3QgZXZlbnREYXRhID0gZGF0YSBhcyB7IGVycm9yPzogRXJyb3IgfTtcbiAgICAgIGlmIChldmVudERhdGEuZXJyb3IpIHtcbiAgICAgICAgdGhpcy5lcnJvci5lbWl0KGV2ZW50RGF0YS5lcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBNb3VudCBlZGl0b3JcbiAgICBob3N0RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmVkaXRvcik7XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lFZGl0b3IoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZWRpdG9yKSB7XG4gICAgICB0aGlzLmVkaXRvci5kZXN0cm95KCk7XG4gICAgICBjb25zdCBob3N0RWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKGhvc3RFbGVtZW50LmNvbnRhaW5zKHRoaXMuZWRpdG9yKSkge1xuICAgICAgICBob3N0RWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzLmVkaXRvcik7XG4gICAgICB9XG4gICAgICB0aGlzLmVkaXRvciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRFZGl0b3JBUEkoKTogRWRpdG9yQVBJIHtcbiAgICBpZiAoIXRoaXMuZWRpdG9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VkaXRvciBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yIGFzIEVkaXRvckFQSTtcbiAgfVxuXG4gIC8vIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGltcGxlbWVudGF0aW9uXG4gIHdyaXRlVmFsdWUodmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lZGl0b3IgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5lZGl0b3Iuc2V0Q29udGVudCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiB1bmtub3duKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZWRpdG9yKSB7XG4gICAgICB0aGlzLmVkaXRvci5jb25maWd1cmUoeyByZWFkT25seTogaXNEaXNhYmxlZCB9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Angular module for NotectlEditor
3
+ */
4
+ import { NgModule } from '@angular/core';
5
+ import { CommonModule } from '@angular/common';
6
+ import { NotectlEditorComponent } from './notectl-editor.component';
7
+ import * as i0 from "@angular/core";
8
+ export class NotectlEditorModule {
9
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NotectlEditorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
10
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: NotectlEditorModule, declarations: [NotectlEditorComponent], imports: [CommonModule], exports: [NotectlEditorComponent] });
11
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NotectlEditorModule, imports: [CommonModule] });
12
+ }
13
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NotectlEditorModule, decorators: [{
14
+ type: NgModule,
15
+ args: [{
16
+ declarations: [NotectlEditorComponent],
17
+ imports: [CommonModule],
18
+ exports: [NotectlEditorComponent],
19
+ }]
20
+ }] });
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90ZWN0bC1lZGl0b3IubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9ub3RlY3RsLWVkaXRvci5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUFPcEUsTUFBTSxPQUFPLG1CQUFtQjt3R0FBbkIsbUJBQW1CO3lHQUFuQixtQkFBbUIsaUJBSmYsc0JBQXNCLGFBQzNCLFlBQVksYUFDWixzQkFBc0I7eUdBRXJCLG1CQUFtQixZQUhwQixZQUFZOzs0RkFHWCxtQkFBbUI7a0JBTC9CLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFLENBQUMsc0JBQXNCLENBQUM7b0JBQ3RDLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztvQkFDdkIsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7aUJBQ2xDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBbmd1bGFyIG1vZHVsZSBmb3IgTm90ZWN0bEVkaXRvclxuICovXG5cbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTm90ZWN0bEVkaXRvckNvbXBvbmVudCB9IGZyb20gJy4vbm90ZWN0bC1lZGl0b3IuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbTm90ZWN0bEVkaXRvckNvbXBvbmVudF0sXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBleHBvcnRzOiBbTm90ZWN0bEVkaXRvckNvbXBvbmVudF0sXG59KVxuZXhwb3J0IGNsYXNzIE5vdGVjdGxFZGl0b3JNb2R1bGUge31cbiJdfQ==
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90ZWN0bC1hbmd1bGFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25vdGVjdGwtYW5ndWxhci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Public API surface of @notectl/angular
3
+ */
4
+ export * from './lib/notectl-editor.component';
5
+ export * from './lib/notectl-editor.module';
6
+ export * from './lib/notectl-editor.directive';
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsZ0NBQWdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFB1YmxpYyBBUEkgc3VyZmFjZSBvZiBAbm90ZWN0bC9hbmd1bGFyXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9saWIvbm90ZWN0bC1lZGl0b3IuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL25vdGVjdGwtZWRpdG9yLm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9ub3RlY3RsLWVkaXRvci5kaXJlY3RpdmUnO1xuIl19
@@ -0,0 +1,439 @@
1
+ import * as i0 from '@angular/core';
2
+ import { EventEmitter, forwardRef, Output, Input, ViewChild, ViewEncapsulation, Component, NgModule, Directive } from '@angular/core';
3
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
+ import { CommonModule } from '@angular/common';
5
+
6
+ /**
7
+ * Angular component wrapper for NotectlEditor
8
+ */
9
+ /**
10
+ * NotectlEditor Angular component
11
+ */
12
+ class NotectlEditorComponent {
13
+ containerRef;
14
+ /** Debug mode */
15
+ debug;
16
+ /** Initial content */
17
+ content;
18
+ /** Placeholder text */
19
+ placeholder;
20
+ /** Read-only mode */
21
+ readOnly;
22
+ /** Accessibility configuration */
23
+ accessibility;
24
+ /** Internationalization configuration */
25
+ i18n;
26
+ /** Theme configuration */
27
+ theme;
28
+ /** Custom class name */
29
+ className;
30
+ /** Emitted when content changes */
31
+ contentChange = new EventEmitter();
32
+ /** Emitted when selection changes */
33
+ selectionChange = new EventEmitter();
34
+ /** Emitted when editor gains focus */
35
+ editorFocus = new EventEmitter();
36
+ /** Emitted when editor loses focus */
37
+ editorBlur = new EventEmitter();
38
+ /** Emitted when editor is ready */
39
+ ready = new EventEmitter();
40
+ /** Emitted when an error occurs */
41
+ error = new EventEmitter();
42
+ editor = null;
43
+ onChange = () => { };
44
+ onTouched = () => { };
45
+ ngOnInit() {
46
+ this.initEditor();
47
+ }
48
+ ngOnDestroy() {
49
+ this.destroyEditor();
50
+ }
51
+ /**
52
+ * Initialize the editor instance
53
+ */
54
+ initEditor() {
55
+ if (!this.containerRef?.nativeElement) {
56
+ console.error('NotectlEditor: Container element not found');
57
+ return;
58
+ }
59
+ // Create editor instance
60
+ this.editor = document.createElement('notectl-editor');
61
+ // Configure editor
62
+ const config = {
63
+ debug: this.debug,
64
+ content: this.content,
65
+ placeholder: this.placeholder,
66
+ readOnly: this.readOnly,
67
+ accessibility: this.accessibility,
68
+ i18n: this.i18n,
69
+ theme: this.theme,
70
+ };
71
+ this.editor.configure(config);
72
+ // Attach event listeners
73
+ this.editor.on('content-change', (data) => {
74
+ const eventData = data;
75
+ const content = eventData.content;
76
+ this.contentChange.emit(content);
77
+ this.onChange(content);
78
+ });
79
+ this.editor.on('selection-change', (data) => {
80
+ const eventData = data;
81
+ this.selectionChange.emit(eventData.selection);
82
+ });
83
+ this.editor.on('focus', () => {
84
+ this.editorFocus.emit();
85
+ this.onTouched();
86
+ });
87
+ this.editor.on('blur', () => {
88
+ this.editorBlur.emit();
89
+ });
90
+ this.editor.on('ready', () => {
91
+ this.ready.emit(this.getEditorAPI());
92
+ });
93
+ this.editor.on('error', (data) => {
94
+ const eventData = data;
95
+ if (eventData.error) {
96
+ this.error.emit(eventData.error);
97
+ }
98
+ });
99
+ // Mount editor
100
+ this.containerRef.nativeElement.appendChild(this.editor);
101
+ }
102
+ /**
103
+ * Destroy the editor instance
104
+ */
105
+ destroyEditor() {
106
+ if (this.editor) {
107
+ this.editor.destroy();
108
+ if (this.containerRef?.nativeElement?.contains(this.editor)) {
109
+ this.containerRef.nativeElement.removeChild(this.editor);
110
+ }
111
+ this.editor = null;
112
+ }
113
+ }
114
+ /**
115
+ * Update editor configuration
116
+ */
117
+ updateConfig() {
118
+ if (!this.editor)
119
+ return;
120
+ const config = {
121
+ debug: this.debug,
122
+ content: this.content,
123
+ placeholder: this.placeholder,
124
+ readOnly: this.readOnly,
125
+ accessibility: this.accessibility,
126
+ i18n: this.i18n,
127
+ theme: this.theme,
128
+ };
129
+ this.editor.configure(config);
130
+ }
131
+ /**
132
+ * Get editor API
133
+ */
134
+ getEditorAPI() {
135
+ if (!this.editor) {
136
+ throw new Error('Editor not initialized');
137
+ }
138
+ return this.editor;
139
+ }
140
+ // ControlValueAccessor implementation
141
+ writeValue(value) {
142
+ if (this.editor && typeof value === 'string') {
143
+ this.editor.setContent(value);
144
+ }
145
+ }
146
+ registerOnChange(fn) {
147
+ this.onChange = fn;
148
+ }
149
+ registerOnTouched(fn) {
150
+ this.onTouched = fn;
151
+ }
152
+ setDisabledState(isDisabled) {
153
+ if (this.editor) {
154
+ this.editor.configure({ readOnly: isDisabled });
155
+ }
156
+ }
157
+ // Public API methods
158
+ /**
159
+ * Get current editor content
160
+ */
161
+ getContent() {
162
+ return this.editor?.getContent();
163
+ }
164
+ /**
165
+ * Set editor content
166
+ */
167
+ setContent(content) {
168
+ if (this.editor && typeof content === 'string') {
169
+ this.editor.setContent(content);
170
+ }
171
+ }
172
+ /**
173
+ * Get current editor state
174
+ */
175
+ getState() {
176
+ return this.editor?.getState();
177
+ }
178
+ /**
179
+ * Execute an editor command
180
+ */
181
+ executeCommand(command, ...args) {
182
+ this.editor?.executeCommand(command, ...args);
183
+ }
184
+ /**
185
+ * Register a plugin
186
+ */
187
+ registerPlugin(plugin) {
188
+ this.editor?.registerPlugin(plugin);
189
+ }
190
+ /**
191
+ * Unregister a plugin
192
+ */
193
+ unregisterPlugin(pluginId) {
194
+ this.editor?.unregisterPlugin(pluginId);
195
+ }
196
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NotectlEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
197
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: NotectlEditorComponent, selector: "notectl-editor", inputs: { debug: "debug", content: "content", placeholder: "placeholder", readOnly: "readOnly", accessibility: "accessibility", i18n: "i18n", theme: "theme", className: "className" }, outputs: { contentChange: "contentChange", selectionChange: "selectionChange", editorFocus: "editorFocus", editorBlur: "editorBlur", ready: "ready", error: "error" }, providers: [
198
+ {
199
+ provide: NG_VALUE_ACCESSOR,
200
+ useExisting: forwardRef(() => NotectlEditorComponent),
201
+ multi: true,
202
+ },
203
+ ], viewQueries: [{ propertyName: "containerRef", first: true, predicate: ["container"], descendants: true, static: true }], ngImport: i0, template: '<div #container [attr.data-notectl-angular-wrapper]="true"></div>', isInline: true, styles: [":host{display:block}\n"], encapsulation: i0.ViewEncapsulation.None });
204
+ }
205
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NotectlEditorComponent, decorators: [{
206
+ type: Component,
207
+ args: [{ selector: 'notectl-editor', template: '<div #container [attr.data-notectl-angular-wrapper]="true"></div>', encapsulation: ViewEncapsulation.None, providers: [
208
+ {
209
+ provide: NG_VALUE_ACCESSOR,
210
+ useExisting: forwardRef(() => NotectlEditorComponent),
211
+ multi: true,
212
+ },
213
+ ], styles: [":host{display:block}\n"] }]
214
+ }], propDecorators: { containerRef: [{
215
+ type: ViewChild,
216
+ args: ['container', { static: true }]
217
+ }], debug: [{
218
+ type: Input
219
+ }], content: [{
220
+ type: Input
221
+ }], placeholder: [{
222
+ type: Input
223
+ }], readOnly: [{
224
+ type: Input
225
+ }], accessibility: [{
226
+ type: Input
227
+ }], i18n: [{
228
+ type: Input
229
+ }], theme: [{
230
+ type: Input
231
+ }], className: [{
232
+ type: Input
233
+ }], contentChange: [{
234
+ type: Output
235
+ }], selectionChange: [{
236
+ type: Output
237
+ }], editorFocus: [{
238
+ type: Output
239
+ }], editorBlur: [{
240
+ type: Output
241
+ }], ready: [{
242
+ type: Output
243
+ }], error: [{
244
+ type: Output
245
+ }] } });
246
+
247
+ /**
248
+ * Angular module for NotectlEditor
249
+ */
250
+ class NotectlEditorModule {
251
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NotectlEditorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
252
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: NotectlEditorModule, declarations: [NotectlEditorComponent], imports: [CommonModule], exports: [NotectlEditorComponent] });
253
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NotectlEditorModule, imports: [CommonModule] });
254
+ }
255
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NotectlEditorModule, decorators: [{
256
+ type: NgModule,
257
+ args: [{
258
+ declarations: [NotectlEditorComponent],
259
+ imports: [CommonModule],
260
+ exports: [NotectlEditorComponent],
261
+ }]
262
+ }] });
263
+
264
+ /**
265
+ * Angular directive for NotectlEditor (optional alternative to component)
266
+ */
267
+ /**
268
+ * Directive to use NotectlEditor on any element
269
+ * Usage: <div notectl-editor [content]="content"></div>
270
+ */
271
+ class NotectlEditorDirective {
272
+ elementRef;
273
+ debug;
274
+ content;
275
+ placeholder;
276
+ readOnly;
277
+ accessibility;
278
+ i18n;
279
+ theme;
280
+ contentChange = new EventEmitter();
281
+ selectionChange = new EventEmitter();
282
+ editorFocus = new EventEmitter();
283
+ editorBlur = new EventEmitter();
284
+ ready = new EventEmitter();
285
+ error = new EventEmitter();
286
+ editor = null;
287
+ onChange = () => { };
288
+ onTouched = () => { };
289
+ constructor(elementRef) {
290
+ this.elementRef = elementRef;
291
+ }
292
+ ngOnInit() {
293
+ this.initEditor();
294
+ }
295
+ ngOnDestroy() {
296
+ this.destroyEditor();
297
+ }
298
+ initEditor() {
299
+ const hostElement = this.elementRef.nativeElement;
300
+ // Create editor instance
301
+ this.editor = document.createElement('notectl-editor');
302
+ // Configure editor
303
+ const config = {
304
+ debug: this.debug,
305
+ content: this.content,
306
+ placeholder: this.placeholder,
307
+ readOnly: this.readOnly,
308
+ accessibility: this.accessibility,
309
+ i18n: this.i18n,
310
+ theme: this.theme,
311
+ };
312
+ this.editor.configure(config);
313
+ // Attach event listeners
314
+ this.editor.on('content-change', (data) => {
315
+ const eventData = data;
316
+ const content = eventData.content;
317
+ this.contentChange.emit(content);
318
+ this.onChange(content);
319
+ });
320
+ this.editor.on('selection-change', (data) => {
321
+ const eventData = data;
322
+ this.selectionChange.emit(eventData.selection);
323
+ });
324
+ this.editor.on('focus', () => {
325
+ this.editorFocus.emit();
326
+ this.onTouched();
327
+ });
328
+ this.editor.on('blur', () => {
329
+ this.editorBlur.emit();
330
+ });
331
+ this.editor.on('ready', () => {
332
+ this.ready.emit(this.getEditorAPI());
333
+ });
334
+ this.editor.on('error', (data) => {
335
+ const eventData = data;
336
+ if (eventData.error) {
337
+ this.error.emit(eventData.error);
338
+ }
339
+ });
340
+ // Mount editor
341
+ hostElement.appendChild(this.editor);
342
+ }
343
+ destroyEditor() {
344
+ if (this.editor) {
345
+ this.editor.destroy();
346
+ const hostElement = this.elementRef.nativeElement;
347
+ if (hostElement.contains(this.editor)) {
348
+ hostElement.removeChild(this.editor);
349
+ }
350
+ this.editor = null;
351
+ }
352
+ }
353
+ getEditorAPI() {
354
+ if (!this.editor) {
355
+ throw new Error('Editor not initialized');
356
+ }
357
+ return this.editor;
358
+ }
359
+ // ControlValueAccessor implementation
360
+ writeValue(value) {
361
+ if (this.editor && typeof value === 'string') {
362
+ this.editor.setContent(value);
363
+ }
364
+ }
365
+ registerOnChange(fn) {
366
+ this.onChange = fn;
367
+ }
368
+ registerOnTouched(fn) {
369
+ this.onTouched = fn;
370
+ }
371
+ setDisabledState(isDisabled) {
372
+ if (this.editor) {
373
+ this.editor.configure({ readOnly: isDisabled });
374
+ }
375
+ }
376
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NotectlEditorDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
377
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: NotectlEditorDirective, selector: "[notectl-editor]", inputs: { debug: "debug", content: "content", placeholder: "placeholder", readOnly: "readOnly", accessibility: "accessibility", i18n: "i18n", theme: "theme" }, outputs: { contentChange: "contentChange", selectionChange: "selectionChange", editorFocus: "editorFocus", editorBlur: "editorBlur", ready: "ready", error: "error" }, providers: [
378
+ {
379
+ provide: NG_VALUE_ACCESSOR,
380
+ useExisting: forwardRef(() => NotectlEditorDirective),
381
+ multi: true,
382
+ },
383
+ ], ngImport: i0 });
384
+ }
385
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NotectlEditorDirective, decorators: [{
386
+ type: Directive,
387
+ args: [{
388
+ selector: '[notectl-editor]',
389
+ providers: [
390
+ {
391
+ provide: NG_VALUE_ACCESSOR,
392
+ useExisting: forwardRef(() => NotectlEditorDirective),
393
+ multi: true,
394
+ },
395
+ ],
396
+ }]
397
+ }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { debug: [{
398
+ type: Input
399
+ }], content: [{
400
+ type: Input
401
+ }], placeholder: [{
402
+ type: Input
403
+ }], readOnly: [{
404
+ type: Input
405
+ }], accessibility: [{
406
+ type: Input
407
+ }], i18n: [{
408
+ type: Input
409
+ }], theme: [{
410
+ type: Input
411
+ }], contentChange: [{
412
+ type: Output
413
+ }], selectionChange: [{
414
+ type: Output
415
+ }], editorFocus: [{
416
+ type: Output
417
+ }], editorBlur: [{
418
+ type: Output
419
+ }], ready: [{
420
+ type: Output
421
+ }], error: [{
422
+ type: Output
423
+ }] } });
424
+
425
+ /**
426
+ * Public API surface of @notectl/angular
427
+ */
428
+
429
+ /**
430
+ * @notectl/angular - Angular adapter for NotectlEditor
431
+ * @packageDocumentation
432
+ */
433
+
434
+ /**
435
+ * Generated bundle index. Do not edit.
436
+ */
437
+
438
+ export { NotectlEditorComponent, NotectlEditorDirective, NotectlEditorModule };
439
+ //# sourceMappingURL=notectl-angular.mjs.map