@notectl/angular 2.0.2 → 2.0.4
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 +258 -123
- package/dist/fesm2022/notectl-angular.mjs +41 -41
- package/dist/fesm2022/notectl-angular.mjs.map +1 -1
- package/package.json +10 -10
package/README.md
CHANGED
|
@@ -4,12 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
# notectl
|
|
6
6
|
|
|
7
|
-
###
|
|
7
|
+
### Rich text editing as a Web Component
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
React, Vue, Angular, Svelte, or plain HTML. Zero config, full power.
|
|
11
|
-
|
|
12
|
-
<br />
|
|
9
|
+
Build a real editor in plain HTML, React, Vue, Svelte, or Angular without locking yourself into a framework-specific editor runtime.
|
|
13
10
|
|
|
14
11
|
[](https://www.typescriptlang.org/)
|
|
15
12
|
[](https://developer.mozilla.org/en-US/docs/Web/API/Web_components)
|
|
@@ -23,187 +20,325 @@ React, Vue, Angular, Svelte, or plain HTML. Zero config, full power.
|
|
|
23
20
|
|
|
24
21
|
<br />
|
|
25
22
|
|
|
26
|
-
[
|
|
23
|
+
[Documentation](https://samyssmile.github.io/notectl/) ·
|
|
24
|
+
[Playground](https://samyssmile.github.io/notectl/playground/) ·
|
|
25
|
+
[npm: @notectl/core](https://www.npmjs.com/package/@notectl/core) ·
|
|
26
|
+
[npm: @notectl/angular](https://www.npmjs.com/package/@notectl/angular)
|
|
27
27
|
|
|
28
28
|
</div>
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
## What you get
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
- A framework-agnostic editor shipped as the `notectl-editor` custom element
|
|
33
|
+
- Immutable editor state and transaction-based updates
|
|
34
|
+
- A plugin system for headings, lists, links, tables, code blocks, images, fonts, and more
|
|
35
|
+
- CSP-safe styling with `adoptedStyleSheets`
|
|
36
|
+
- A fast path for "just give me a full editor" and a granular path for "I only want these plugins"
|
|
37
|
+
|
|
38
|
+
## Install
|
|
33
39
|
|
|
34
40
|
```bash
|
|
35
41
|
npm install @notectl/core
|
|
36
42
|
```
|
|
37
43
|
|
|
38
|
-
|
|
44
|
+
Requirements:
|
|
45
|
+
|
|
46
|
+
- Modern browser with Custom Elements support
|
|
47
|
+
- Node.js 18+ for build tooling
|
|
48
|
+
- Angular 21+ if you use `@notectl/angular`
|
|
49
|
+
|
|
50
|
+
## Quick start
|
|
51
|
+
|
|
52
|
+
The normal way to embed notectl is to create the Web Component with `createEditor(...)` and mount it into your app.
|
|
53
|
+
|
|
54
|
+
### 1. Add a host element
|
|
55
|
+
|
|
56
|
+
```html
|
|
57
|
+
<div id="app"></div>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 2. Create the editor
|
|
61
|
+
|
|
62
|
+
Start with one of the shipped presets:
|
|
63
|
+
|
|
64
|
+
Minimal preset:
|
|
39
65
|
|
|
40
66
|
```ts
|
|
41
|
-
import { createEditor
|
|
42
|
-
import {
|
|
43
|
-
import { createFullPreset } from '@notectl/core/presets';
|
|
67
|
+
import { createEditor } from '@notectl/core';
|
|
68
|
+
import { createMinimalPreset } from '@notectl/core/presets/minimal';
|
|
44
69
|
|
|
45
70
|
const editor = await createEditor({
|
|
46
|
-
...
|
|
47
|
-
theme: ThemePreset.Light,
|
|
71
|
+
...createMinimalPreset(),
|
|
48
72
|
placeholder: 'Start typing...',
|
|
73
|
+
autofocus: true,
|
|
49
74
|
});
|
|
50
75
|
|
|
51
|
-
document.
|
|
76
|
+
document.getElementById('app')!.appendChild(editor);
|
|
52
77
|
```
|
|
53
78
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
### Custom — pick exactly what you need
|
|
79
|
+
Full preset (toolbar, headings, lists, links, tables, code blocks, images, fonts, and more):
|
|
57
80
|
|
|
58
81
|
```ts
|
|
59
|
-
import {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
} from '@notectl/core';
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
import { TextFormattingPlugin } from '@notectl/core/plugins/text-formatting';
|
|
82
|
+
import { ThemePreset, createEditor } from '@notectl/core';
|
|
83
|
+
import { STARTER_FONTS } from '@notectl/core/fonts';
|
|
84
|
+
import { ToolbarOverflowBehavior } from '@notectl/core/plugins/toolbar';
|
|
85
|
+
import { createFullPreset } from '@notectl/core/presets/full';
|
|
86
|
+
|
|
87
|
+
const preset = createFullPreset({
|
|
88
|
+
font: { fonts: STARTER_FONTS },
|
|
89
|
+
});
|
|
68
90
|
|
|
69
91
|
const editor = await createEditor({
|
|
92
|
+
...preset,
|
|
93
|
+
toolbar: {
|
|
94
|
+
groups: preset.toolbar,
|
|
95
|
+
overflow: ToolbarOverflowBehavior.Flow,
|
|
96
|
+
},
|
|
70
97
|
theme: ThemePreset.Light,
|
|
71
|
-
toolbar: [
|
|
72
|
-
[new TextFormattingPlugin({ bold: true, italic: true, underline: true })],
|
|
73
|
-
[new HeadingPlugin()],
|
|
74
|
-
[new ListPlugin()],
|
|
75
|
-
[new LinkPlugin(), new TablePlugin()],
|
|
76
|
-
],
|
|
77
98
|
placeholder: 'Start typing...',
|
|
78
99
|
autofocus: true,
|
|
79
100
|
});
|
|
80
101
|
|
|
81
|
-
document.
|
|
102
|
+
document.getElementById('app')!.appendChild(editor);
|
|
82
103
|
```
|
|
83
104
|
|
|
84
|
-
|
|
105
|
+
Use `createMinimalPreset()` when you want a lean starting point. Use `createFullPreset()` when you want the standard toolbar and plugin set immediately, including responsive toolbar overflow.
|
|
106
|
+
|
|
107
|
+
## Add notectl to your app
|
|
108
|
+
|
|
109
|
+
### Plain HTML / Vite / Vanilla JS
|
|
110
|
+
|
|
111
|
+
```html
|
|
112
|
+
<!doctype html>
|
|
113
|
+
<html lang="en">
|
|
114
|
+
<head>
|
|
115
|
+
<meta charset="UTF-8" />
|
|
116
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
117
|
+
<title>My editor</title>
|
|
118
|
+
<style>
|
|
119
|
+
#app {
|
|
120
|
+
max-width: 800px;
|
|
121
|
+
margin: 2rem auto;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
notectl-editor {
|
|
125
|
+
--notectl-content-min-height: 320px;
|
|
126
|
+
}
|
|
127
|
+
</style>
|
|
128
|
+
</head>
|
|
129
|
+
<body>
|
|
130
|
+
<div id="app"></div>
|
|
131
|
+
|
|
132
|
+
<script type="module">
|
|
133
|
+
import { createEditor } from '@notectl/core';
|
|
134
|
+
import { createMinimalPreset } from '@notectl/core/presets/minimal';
|
|
135
|
+
|
|
136
|
+
const editor = await createEditor({
|
|
137
|
+
...createMinimalPreset(),
|
|
138
|
+
placeholder: 'Write something...',
|
|
139
|
+
autofocus: true,
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
document.getElementById('app').appendChild(editor);
|
|
143
|
+
</script>
|
|
144
|
+
</body>
|
|
145
|
+
</html>
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### React
|
|
85
149
|
|
|
86
|
-
|
|
150
|
+
```tsx
|
|
151
|
+
import { useEffect, useRef } from 'react';
|
|
152
|
+
import { createEditor, type NotectlEditor } from '@notectl/core';
|
|
87
153
|
|
|
88
|
-
|
|
89
|
-
<
|
|
90
|
-
<
|
|
154
|
+
export function Editor() {
|
|
155
|
+
const containerRef = useRef<HTMLDivElement>(null);
|
|
156
|
+
const editorRef = useRef<NotectlEditor | null>(null);
|
|
91
157
|
|
|
92
|
-
|
|
158
|
+
useEffect(() => {
|
|
159
|
+
let mounted = true;
|
|
93
160
|
|
|
94
|
-
|
|
161
|
+
createEditor({
|
|
162
|
+
placeholder: 'Start typing...',
|
|
163
|
+
autofocus: true,
|
|
164
|
+
}).then((editor) => {
|
|
165
|
+
if (!mounted || !containerRef.current) return;
|
|
166
|
+
containerRef.current.appendChild(editor);
|
|
167
|
+
editorRef.current = editor;
|
|
168
|
+
});
|
|
95
169
|
|
|
96
|
-
|
|
97
|
-
|
|
170
|
+
return () => {
|
|
171
|
+
mounted = false;
|
|
172
|
+
void editorRef.current?.destroy();
|
|
173
|
+
};
|
|
174
|
+
}, []);
|
|
175
|
+
|
|
176
|
+
return <div ref={containerRef} />;
|
|
177
|
+
}
|
|
178
|
+
```
|
|
98
179
|
|
|
99
|
-
|
|
180
|
+
Vue and Svelte use the same pattern: create the editor on mount, append it to a host element, and call `destroy()` on unmount.
|
|
100
181
|
|
|
101
|
-
|
|
182
|
+
### Angular
|
|
102
183
|
|
|
103
|
-
|
|
104
|
-
</tr>
|
|
105
|
-
<tr>
|
|
106
|
-
<td>
|
|
184
|
+
Use the Angular wrapper if you want template bindings, forms integration, and DI-based defaults.
|
|
107
185
|
|
|
108
|
-
|
|
186
|
+
```bash
|
|
187
|
+
npm install @notectl/core @notectl/angular
|
|
188
|
+
```
|
|
109
189
|
|
|
110
|
-
|
|
190
|
+
```ts
|
|
191
|
+
// app.config.ts
|
|
192
|
+
import { type ApplicationConfig } from '@angular/core';
|
|
193
|
+
import { provideNotectl } from '@notectl/angular';
|
|
111
194
|
|
|
112
|
-
|
|
113
|
-
|
|
195
|
+
export const appConfig: ApplicationConfig = {
|
|
196
|
+
providers: [provideNotectl()],
|
|
197
|
+
};
|
|
198
|
+
```
|
|
114
199
|
|
|
115
|
-
|
|
200
|
+
```ts
|
|
201
|
+
// editor.component.ts
|
|
202
|
+
import { ChangeDetectionStrategy, Component, signal } from '@angular/core';
|
|
203
|
+
import {
|
|
204
|
+
NotectlEditorComponent,
|
|
205
|
+
type Plugin,
|
|
206
|
+
HeadingPlugin,
|
|
207
|
+
LinkPlugin,
|
|
208
|
+
ListPlugin,
|
|
209
|
+
TextFormattingPlugin,
|
|
210
|
+
ThemePreset,
|
|
211
|
+
} from '@notectl/angular';
|
|
212
|
+
|
|
213
|
+
@Component({
|
|
214
|
+
selector: 'app-editor',
|
|
215
|
+
standalone: true,
|
|
216
|
+
imports: [NotectlEditorComponent],
|
|
217
|
+
template: `
|
|
218
|
+
<ntl-editor
|
|
219
|
+
[toolbar]="toolbar"
|
|
220
|
+
[theme]="theme()"
|
|
221
|
+
[autofocus]="true"
|
|
222
|
+
/>
|
|
223
|
+
`,
|
|
224
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
225
|
+
})
|
|
226
|
+
export class EditorComponent {
|
|
227
|
+
protected readonly theme = signal<ThemePreset>(ThemePreset.Light);
|
|
228
|
+
|
|
229
|
+
protected readonly toolbar: ReadonlyArray<ReadonlyArray<Plugin>> = [
|
|
230
|
+
[new TextFormattingPlugin({ bold: true, italic: true, underline: true })],
|
|
231
|
+
[new HeadingPlugin()],
|
|
232
|
+
[new ListPlugin()],
|
|
233
|
+
[new LinkPlugin()],
|
|
234
|
+
];
|
|
235
|
+
}
|
|
236
|
+
```
|
|
116
237
|
|
|
117
|
-
|
|
238
|
+
Full Angular guide: https://samyssmile.github.io/notectl/guides/angular/
|
|
118
239
|
|
|
119
|
-
|
|
120
|
-
</tr>
|
|
121
|
-
</table>
|
|
240
|
+
## Build your own toolbar
|
|
122
241
|
|
|
123
|
-
|
|
242
|
+
If you only want a small editor, import the plugins you need and group them in the toolbar:
|
|
124
243
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
| **StrikethroughPlugin** | ~~Strikethrough~~ text |
|
|
133
|
-
| **SuperSubPlugin** | Superscript and subscript |
|
|
134
|
-
| **HeadingPlugin** | H1 – H6 headings with block type picker |
|
|
135
|
-
| **BlockquotePlugin** | Block quotes |
|
|
136
|
-
| **ListPlugin** | Bullet, ordered, and checklists |
|
|
137
|
-
| **LinkPlugin** | Hyperlink insertion and editing |
|
|
138
|
-
| **TablePlugin** | Full table support with row/column controls |
|
|
139
|
-
| **CodeBlockPlugin** | Code blocks with syntax highlighting |
|
|
140
|
-
| **ImagePlugin** | Image upload, resize, and drag-and-drop |
|
|
141
|
-
| **TextColorPlugin** | Text color picker |
|
|
142
|
-
| **HighlightPlugin** | Text highlighting / background color |
|
|
143
|
-
| **AlignmentPlugin** | Left, center, right, justify |
|
|
144
|
-
| **FontPlugin** | Font family selection with custom web fonts |
|
|
145
|
-
| **FontSizePlugin** | Configurable font sizes |
|
|
146
|
-
| **HorizontalRulePlugin** | Horizontal dividers |
|
|
147
|
-
| **PrintPlugin** | Print editor content with configurable paper sizes |
|
|
148
|
-
|
|
149
|
-
See the [plugin documentation](https://samyssmile.github.io/notectl/plugins/overview/) for configuration and examples.
|
|
244
|
+
```ts
|
|
245
|
+
import { ThemePreset, createEditor } from '@notectl/core';
|
|
246
|
+
import { HeadingPlugin } from '@notectl/core/plugins/heading';
|
|
247
|
+
import { LinkPlugin } from '@notectl/core/plugins/link';
|
|
248
|
+
import { ListPlugin } from '@notectl/core/plugins/list';
|
|
249
|
+
import { TablePlugin } from '@notectl/core/plugins/table';
|
|
250
|
+
import { TextFormattingPlugin } from '@notectl/core/plugins/text-formatting';
|
|
150
251
|
|
|
151
|
-
|
|
252
|
+
const editor = await createEditor({
|
|
253
|
+
theme: ThemePreset.Light,
|
|
254
|
+
toolbar: [
|
|
255
|
+
[new TextFormattingPlugin({ bold: true, italic: true, underline: true })],
|
|
256
|
+
[new HeadingPlugin()],
|
|
257
|
+
[new ListPlugin()],
|
|
258
|
+
[new LinkPlugin(), new TablePlugin()],
|
|
259
|
+
],
|
|
260
|
+
placeholder: 'Start typing...',
|
|
261
|
+
autofocus: true,
|
|
262
|
+
});
|
|
263
|
+
```
|
|
152
264
|
|
|
153
|
-
|
|
265
|
+
Each inner array is one visible toolbar group.
|
|
154
266
|
|
|
155
|
-
|
|
156
|
-
- **i18n** — 9 languages: English, German, Spanish, French, Chinese, Russian, Arabic, Hindi, Portuguese + auto-detect via `Locale.BROWSER`
|
|
157
|
-
- **Paper sizes** — DIN A4, DIN A5, US Letter, US Legal for WYSIWYG page layout
|
|
158
|
-
- **CSP-compliant** — Style delivery via `adoptedStyleSheets`, no inline styles required
|
|
159
|
-
- **Markdown shortcuts** — `#` → H1, `##` → H2, `-` → bullet list, `1.` → ordered list, `>` → blockquote
|
|
160
|
-
- **Syntax highlighting** — Pluggable highlighter for code blocks
|
|
267
|
+
## Read and write content
|
|
161
268
|
|
|
162
|
-
|
|
269
|
+
```ts
|
|
270
|
+
await editor.setContentHTML('<p>Hello <strong>world</strong></p>');
|
|
163
271
|
|
|
164
|
-
|
|
272
|
+
const html = await editor.getContentHTML();
|
|
273
|
+
const json = editor.getJSON();
|
|
274
|
+
const text = editor.getText();
|
|
275
|
+
const empty = editor.isEmpty();
|
|
276
|
+
```
|
|
165
277
|
|
|
166
|
-
|
|
278
|
+
You can also react to lifecycle and state events:
|
|
167
279
|
|
|
168
280
|
```ts
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
editor.
|
|
174
|
-
|
|
281
|
+
editor.on('ready', () => {
|
|
282
|
+
console.log('Editor is ready');
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
editor.on('stateChange', ({ newState }) => {
|
|
286
|
+
console.log('Document changed:', newState.doc);
|
|
287
|
+
});
|
|
175
288
|
```
|
|
176
289
|
|
|
177
|
-
|
|
290
|
+
## Built-in plugins
|
|
178
291
|
|
|
179
|
-
|
|
292
|
+
notectl ships plugins for:
|
|
180
293
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
294
|
+
- Text formatting
|
|
295
|
+
- Headings
|
|
296
|
+
- Blockquotes
|
|
297
|
+
- Bullet, ordered, and checklist lists
|
|
298
|
+
- Links
|
|
299
|
+
- Tables
|
|
300
|
+
- Code blocks
|
|
301
|
+
- Images
|
|
302
|
+
- Text color and highlight
|
|
303
|
+
- Alignment and text direction
|
|
304
|
+
- Fonts and font sizes
|
|
305
|
+
- Horizontal rules
|
|
306
|
+
- Print layouts
|
|
185
307
|
|
|
186
|
-
|
|
308
|
+
Full plugin reference: https://samyssmile.github.io/notectl/plugins/overview/
|
|
187
309
|
|
|
188
|
-
|
|
310
|
+
## Why teams pick notectl
|
|
189
311
|
|
|
190
|
-
|
|
312
|
+
- Works across frameworks because the editor is a Web Component at the core
|
|
313
|
+
- Strong default path for quick setup, without giving up fine-grained plugin control later
|
|
314
|
+
- CSP-friendly by design, without relying on inline styles
|
|
315
|
+
- Single production dependency: `dompurify`
|
|
316
|
+
- Immutable state and transaction-based updates make behavior predictable and testable
|
|
191
317
|
|
|
192
|
-
|
|
193
|
-
git clone https://github.com/Samyssmile/notectl.git
|
|
194
|
-
cd notectl && pnpm install
|
|
195
|
-
pnpm build # build all packages
|
|
196
|
-
pnpm test # run unit tests
|
|
197
|
-
pnpm test:e2e # run e2e tests
|
|
198
|
-
pnpm lint # lint
|
|
199
|
-
```
|
|
318
|
+
## Examples
|
|
200
319
|
|
|
201
|
-
|
|
320
|
+
- Vanilla example: https://github.com/Samyssmile/notectl/tree/main/examples/vanillajs
|
|
321
|
+
- Angular example: https://github.com/Samyssmile/notectl/tree/main/examples/angular
|
|
202
322
|
|
|
203
|
-
|
|
323
|
+
## Documentation
|
|
204
324
|
|
|
205
|
-
|
|
325
|
+
- Getting started: https://samyssmile.github.io/notectl/getting-started/installation/
|
|
326
|
+
- Quick start: https://samyssmile.github.io/notectl/getting-started/quick-start/
|
|
327
|
+
- Angular guide: https://samyssmile.github.io/notectl/guides/angular/
|
|
328
|
+
- Plugin docs: https://samyssmile.github.io/notectl/plugins/overview/
|
|
329
|
+
- Architecture overview: https://samyssmile.github.io/notectl/architecture/overview/
|
|
206
330
|
|
|
207
|
-
|
|
331
|
+
## Development
|
|
208
332
|
|
|
209
|
-
|
|
333
|
+
```bash
|
|
334
|
+
pnpm install
|
|
335
|
+
pnpm build
|
|
336
|
+
pnpm test
|
|
337
|
+
pnpm test:e2e
|
|
338
|
+
pnpm lint
|
|
339
|
+
pnpm typecheck
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
## License
|
|
343
|
+
|
|
344
|
+
MIT
|
|
@@ -214,25 +214,25 @@ class NotectlEditorComponent {
|
|
|
214
214
|
destroyRef = inject(DestroyRef);
|
|
215
215
|
defaultConfig = inject(NOTECTL_DEFAULT_CONFIG, { optional: true });
|
|
216
216
|
contentFormat = inject(NOTECTL_CONTENT_FORMAT, { optional: true }) ?? 'json';
|
|
217
|
-
plugins = input(undefined, ...(ngDevMode ? [{ debugName: "plugins" }] : []));
|
|
218
|
-
toolbar = input(undefined, ...(ngDevMode ? [{ debugName: "toolbar" }] : []));
|
|
219
|
-
features = input(undefined, ...(ngDevMode ? [{ debugName: "features" }] : []));
|
|
220
|
-
placeholder = input(undefined, ...(ngDevMode ? [{ debugName: "placeholder" }] : []));
|
|
221
|
-
readonlyMode = input(undefined, ...(ngDevMode ? [{ debugName: "readonlyMode" }] : []));
|
|
222
|
-
autofocus = input(undefined, ...(ngDevMode ? [{ debugName: "autofocus" }] : []));
|
|
223
|
-
maxHistoryDepth = input(undefined, ...(ngDevMode ? [{ debugName: "maxHistoryDepth" }] : []));
|
|
224
|
-
theme = input(undefined, ...(ngDevMode ? [{ debugName: "theme" }] : []));
|
|
225
|
-
paperSize = input(undefined, ...(ngDevMode ? [{ debugName: "paperSize" }] : []));
|
|
226
|
-
dir = input(undefined, ...(ngDevMode ? [{ debugName: "dir" }] : []));
|
|
227
|
-
locale = input(undefined, ...(ngDevMode ? [{ debugName: "locale" }] : []));
|
|
228
|
-
styleNonce = input(undefined, ...(ngDevMode ? [{ debugName: "styleNonce" }] : []));
|
|
229
|
-
content = model(undefined, ...(ngDevMode ? [{ debugName: "content" }] : []));
|
|
217
|
+
plugins = input(undefined, ...(ngDevMode ? [{ debugName: "plugins" }] : /* istanbul ignore next */ []));
|
|
218
|
+
toolbar = input(undefined, ...(ngDevMode ? [{ debugName: "toolbar" }] : /* istanbul ignore next */ []));
|
|
219
|
+
features = input(undefined, ...(ngDevMode ? [{ debugName: "features" }] : /* istanbul ignore next */ []));
|
|
220
|
+
placeholder = input(undefined, ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
|
|
221
|
+
readonlyMode = input(undefined, ...(ngDevMode ? [{ debugName: "readonlyMode" }] : /* istanbul ignore next */ []));
|
|
222
|
+
autofocus = input(undefined, ...(ngDevMode ? [{ debugName: "autofocus" }] : /* istanbul ignore next */ []));
|
|
223
|
+
maxHistoryDepth = input(undefined, ...(ngDevMode ? [{ debugName: "maxHistoryDepth" }] : /* istanbul ignore next */ []));
|
|
224
|
+
theme = input(undefined, ...(ngDevMode ? [{ debugName: "theme" }] : /* istanbul ignore next */ []));
|
|
225
|
+
paperSize = input(undefined, ...(ngDevMode ? [{ debugName: "paperSize" }] : /* istanbul ignore next */ []));
|
|
226
|
+
dir = input(undefined, ...(ngDevMode ? [{ debugName: "dir" }] : /* istanbul ignore next */ []));
|
|
227
|
+
locale = input(undefined, ...(ngDevMode ? [{ debugName: "locale" }] : /* istanbul ignore next */ []));
|
|
228
|
+
styleNonce = input(undefined, ...(ngDevMode ? [{ debugName: "styleNonce" }] : /* istanbul ignore next */ []));
|
|
229
|
+
content = model(undefined, ...(ngDevMode ? [{ debugName: "content" }] : /* istanbul ignore next */ []));
|
|
230
230
|
stateChange = output();
|
|
231
231
|
selectionChange = output();
|
|
232
232
|
editorFocus = output();
|
|
233
233
|
editorBlur = output();
|
|
234
234
|
ready = output();
|
|
235
|
-
editorState = signal(null, ...(ngDevMode ? [{ debugName: "editorState" }] : []));
|
|
235
|
+
editorState = signal(null, ...(ngDevMode ? [{ debugName: "editorState" }] : /* istanbul ignore next */ []));
|
|
236
236
|
isEmpty = computed(() => {
|
|
237
237
|
const state = this.editorState();
|
|
238
238
|
if (!state)
|
|
@@ -246,23 +246,23 @@ class NotectlEditorComponent {
|
|
|
246
246
|
if (!block)
|
|
247
247
|
return true;
|
|
248
248
|
return block.type === 'paragraph' && block.children.length === 0;
|
|
249
|
-
}, ...(ngDevMode ? [{ debugName: "isEmpty" }] : []));
|
|
250
|
-
resolvedPlugins = computed(() => this.plugins() ?? this.defaultConfig?.plugins ?? [], ...(ngDevMode ? [{ debugName: "resolvedPlugins" }] : []));
|
|
251
|
-
resolvedToolbar = computed(() => this.toolbar() ?? this.defaultConfig?.toolbar, ...(ngDevMode ? [{ debugName: "resolvedToolbar" }] : []));
|
|
252
|
-
resolvedFeatures = computed(() => this.features() ?? this.defaultConfig?.features, ...(ngDevMode ? [{ debugName: "resolvedFeatures" }] : []));
|
|
253
|
-
resolvedPlaceholder = computed(() => this.placeholder() ?? this.defaultConfig?.placeholder ?? 'Start typing...', ...(ngDevMode ? [{ debugName: "resolvedPlaceholder" }] : []));
|
|
254
|
-
resolvedReadonlyMode = computed(() => this.readonlyMode() ?? this.defaultConfig?.readonly ?? false, ...(ngDevMode ? [{ debugName: "resolvedReadonlyMode" }] : []));
|
|
255
|
-
resolvedAutofocus = computed(() => this.autofocus() ?? this.defaultConfig?.autofocus ?? false, ...(ngDevMode ? [{ debugName: "resolvedAutofocus" }] : []));
|
|
256
|
-
resolvedMaxHistoryDepth = computed(() => this.maxHistoryDepth() ?? this.defaultConfig?.maxHistoryDepth, ...(ngDevMode ? [{ debugName: "resolvedMaxHistoryDepth" }] : []));
|
|
257
|
-
resolvedTheme = computed(() => this.theme() ?? this.defaultConfig?.theme ?? ThemePreset.Light, ...(ngDevMode ? [{ debugName: "resolvedTheme" }] : []));
|
|
258
|
-
resolvedPaperSize = computed(() => this.paperSize() ?? this.defaultConfig?.paperSize, ...(ngDevMode ? [{ debugName: "resolvedPaperSize" }] : []));
|
|
259
|
-
resolvedDir = computed(() => this.dir() ?? this.defaultConfig?.dir, ...(ngDevMode ? [{ debugName: "resolvedDir" }] : []));
|
|
260
|
-
resolvedLocale = computed(() => this.locale() ?? this.defaultConfig?.locale, ...(ngDevMode ? [{ debugName: "resolvedLocale" }] : []));
|
|
261
|
-
resolvedStyleNonce = computed(() => this.styleNonce() ?? this.defaultConfig?.styleNonce, ...(ngDevMode ? [{ debugName: "resolvedStyleNonce" }] : []));
|
|
262
|
-
effectiveReadonly = computed(() => this.disabledByForms() || this.resolvedReadonlyMode(), ...(ngDevMode ? [{ debugName: "effectiveReadonly" }] : []));
|
|
249
|
+
}, ...(ngDevMode ? [{ debugName: "isEmpty" }] : /* istanbul ignore next */ []));
|
|
250
|
+
resolvedPlugins = computed(() => this.plugins() ?? this.defaultConfig?.plugins ?? [], ...(ngDevMode ? [{ debugName: "resolvedPlugins" }] : /* istanbul ignore next */ []));
|
|
251
|
+
resolvedToolbar = computed(() => this.toolbar() ?? this.defaultConfig?.toolbar, ...(ngDevMode ? [{ debugName: "resolvedToolbar" }] : /* istanbul ignore next */ []));
|
|
252
|
+
resolvedFeatures = computed(() => this.features() ?? this.defaultConfig?.features, ...(ngDevMode ? [{ debugName: "resolvedFeatures" }] : /* istanbul ignore next */ []));
|
|
253
|
+
resolvedPlaceholder = computed(() => this.placeholder() ?? this.defaultConfig?.placeholder ?? 'Start typing...', ...(ngDevMode ? [{ debugName: "resolvedPlaceholder" }] : /* istanbul ignore next */ []));
|
|
254
|
+
resolvedReadonlyMode = computed(() => this.readonlyMode() ?? this.defaultConfig?.readonly ?? false, ...(ngDevMode ? [{ debugName: "resolvedReadonlyMode" }] : /* istanbul ignore next */ []));
|
|
255
|
+
resolvedAutofocus = computed(() => this.autofocus() ?? this.defaultConfig?.autofocus ?? false, ...(ngDevMode ? [{ debugName: "resolvedAutofocus" }] : /* istanbul ignore next */ []));
|
|
256
|
+
resolvedMaxHistoryDepth = computed(() => this.maxHistoryDepth() ?? this.defaultConfig?.maxHistoryDepth, ...(ngDevMode ? [{ debugName: "resolvedMaxHistoryDepth" }] : /* istanbul ignore next */ []));
|
|
257
|
+
resolvedTheme = computed(() => this.theme() ?? this.defaultConfig?.theme ?? ThemePreset.Light, ...(ngDevMode ? [{ debugName: "resolvedTheme" }] : /* istanbul ignore next */ []));
|
|
258
|
+
resolvedPaperSize = computed(() => this.paperSize() ?? this.defaultConfig?.paperSize, ...(ngDevMode ? [{ debugName: "resolvedPaperSize" }] : /* istanbul ignore next */ []));
|
|
259
|
+
resolvedDir = computed(() => this.dir() ?? this.defaultConfig?.dir, ...(ngDevMode ? [{ debugName: "resolvedDir" }] : /* istanbul ignore next */ []));
|
|
260
|
+
resolvedLocale = computed(() => this.locale() ?? this.defaultConfig?.locale, ...(ngDevMode ? [{ debugName: "resolvedLocale" }] : /* istanbul ignore next */ []));
|
|
261
|
+
resolvedStyleNonce = computed(() => this.styleNonce() ?? this.defaultConfig?.styleNonce, ...(ngDevMode ? [{ debugName: "resolvedStyleNonce" }] : /* istanbul ignore next */ []));
|
|
262
|
+
effectiveReadonly = computed(() => this.disabledByForms() || this.resolvedReadonlyMode(), ...(ngDevMode ? [{ debugName: "effectiveReadonly" }] : /* istanbul ignore next */ []));
|
|
263
263
|
hostRef = viewChild.required('host');
|
|
264
|
-
initialized = signal(false, ...(ngDevMode ? [{ debugName: "initialized" }] : []));
|
|
265
|
-
disabledByForms = signal(false, ...(ngDevMode ? [{ debugName: "disabledByForms" }] : []));
|
|
264
|
+
initialized = signal(false, ...(ngDevMode ? [{ debugName: "initialized" }] : /* istanbul ignore next */ []));
|
|
265
|
+
disabledByForms = signal(false, ...(ngDevMode ? [{ debugName: "disabledByForms" }] : /* istanbul ignore next */ []));
|
|
266
266
|
valueController = new EditorValueController({
|
|
267
267
|
emitControlValue: (value) => this.onChange(value),
|
|
268
268
|
getEditor: () => this.editorRef,
|
|
@@ -496,8 +496,8 @@ class NotectlEditorComponent {
|
|
|
496
496
|
}
|
|
497
497
|
return editor;
|
|
498
498
|
}
|
|
499
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
500
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.
|
|
499
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: NotectlEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
500
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.4", type: NotectlEditorComponent, isStandalone: true, selector: "ntl-editor", inputs: { plugins: { classPropertyName: "plugins", publicName: "plugins", isSignal: true, isRequired: false, transformFunction: null }, toolbar: { classPropertyName: "toolbar", publicName: "toolbar", isSignal: true, isRequired: false, transformFunction: null }, features: { classPropertyName: "features", publicName: "features", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, readonlyMode: { classPropertyName: "readonlyMode", publicName: "readonlyMode", isSignal: true, isRequired: false, transformFunction: null }, autofocus: { classPropertyName: "autofocus", publicName: "autofocus", isSignal: true, isRequired: false, transformFunction: null }, maxHistoryDepth: { classPropertyName: "maxHistoryDepth", publicName: "maxHistoryDepth", isSignal: true, isRequired: false, transformFunction: null }, theme: { classPropertyName: "theme", publicName: "theme", isSignal: true, isRequired: false, transformFunction: null }, paperSize: { classPropertyName: "paperSize", publicName: "paperSize", isSignal: true, isRequired: false, transformFunction: null }, dir: { classPropertyName: "dir", publicName: "dir", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, styleNonce: { classPropertyName: "styleNonce", publicName: "styleNonce", isSignal: true, isRequired: false, transformFunction: null }, content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { content: "contentChange", stateChange: "stateChange", selectionChange: "selectionChange", editorFocus: "editorFocus", editorBlur: "editorBlur", ready: "ready" }, host: { properties: { "attr.aria-disabled": "effectiveReadonly() ? \"true\" : null", "class.ntl-editor-disabled": "effectiveReadonly()" } }, providers: [
|
|
501
501
|
{
|
|
502
502
|
provide: NG_VALUE_ACCESSOR,
|
|
503
503
|
useExisting: forwardRef(() => NotectlEditorComponent),
|
|
@@ -505,7 +505,7 @@ class NotectlEditorComponent {
|
|
|
505
505
|
},
|
|
506
506
|
], viewQueries: [{ propertyName: "hostRef", first: true, predicate: ["host"], descendants: true, isSignal: true }], ngImport: i0, template: '<div #host></div>', isInline: true, styles: [":host{display:block}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
507
507
|
}
|
|
508
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
508
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: NotectlEditorComponent, decorators: [{
|
|
509
509
|
type: Component,
|
|
510
510
|
args: [{ selector: 'ntl-editor', standalone: true, template: '<div #host></div>', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
|
|
511
511
|
{
|
|
@@ -526,10 +526,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
|
|
|
526
526
|
* but it no longer participates in value accessor registration.
|
|
527
527
|
*/
|
|
528
528
|
class NotectlValueAccessorDirective {
|
|
529
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
530
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.
|
|
529
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: NotectlValueAccessorDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
530
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.4", type: NotectlValueAccessorDirective, isStandalone: true, selector: "ntl-editor[formControl], ntl-editor[formControlName], ntl-editor[ngModel]", ngImport: i0 });
|
|
531
531
|
}
|
|
532
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
532
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: NotectlValueAccessorDirective, decorators: [{
|
|
533
533
|
type: Directive,
|
|
534
534
|
args: [{
|
|
535
535
|
selector: 'ntl-editor[formControl], ntl-editor[formControlName], ntl-editor[ngModel]',
|
|
@@ -569,10 +569,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
|
|
|
569
569
|
*/
|
|
570
570
|
class NotectlEditorService {
|
|
571
571
|
destroyRef = inject(DestroyRef);
|
|
572
|
-
editorRef = signal(null, ...(ngDevMode ? [{ debugName: "editorRef" }] : []));
|
|
572
|
+
editorRef = signal(null, ...(ngDevMode ? [{ debugName: "editorRef" }] : /* istanbul ignore next */ []));
|
|
573
573
|
stateChangeSubject = new Subject();
|
|
574
574
|
/** Whether an editor is currently registered with this service. */
|
|
575
|
-
hasEditor = computed(() => this.editorRef() !== null, ...(ngDevMode ? [{ debugName: "hasEditor" }] : []));
|
|
575
|
+
hasEditor = computed(() => this.editorRef() !== null, ...(ngDevMode ? [{ debugName: "hasEditor" }] : /* istanbul ignore next */ []));
|
|
576
576
|
/** Observable stream of state change events from the editor. */
|
|
577
577
|
stateChanges$ = this.stateChangeSubject.asObservable();
|
|
578
578
|
stateChangeSub = null;
|
|
@@ -619,10 +619,10 @@ class NotectlEditorService {
|
|
|
619
619
|
dispatch(tr) {
|
|
620
620
|
this.editorRef()?.dispatch(tr);
|
|
621
621
|
}
|
|
622
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
623
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
622
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: NotectlEditorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
623
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: NotectlEditorService });
|
|
624
624
|
}
|
|
625
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
625
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: NotectlEditorService, decorators: [{
|
|
626
626
|
type: Injectable
|
|
627
627
|
}], ctorParameters: () => [] });
|
|
628
628
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notectl-angular.mjs","sources":["../../src/lib/value-interop.ts","../../src/lib/EditorValueController.ts","../../src/lib/tokens.ts","../../src/lib/notectl-editor.component.ts","../../src/lib/value-accessor.directive.ts","../../src/lib/notectl-editor.service.ts","../../src/public-api.ts","../../src/notectl-angular.ts"],"sourcesContent":["import type { Document } from '@notectl/core';\n\nimport type { ContentFormat } from './tokens';\nimport type { NotectlValue } from './types';\n\ninterface EditorContentApi {\n\tgetContentHTML(): Promise<string>;\n\tgetJSON(): Document;\n\tgetText(): string;\n\tsetContentHTML(html: string): Promise<void>;\n\tsetJSON(doc: Document): void;\n}\n\nconst EMPTY_HTML = '<p></p>';\n\n/** Escapes HTML special characters before inserting plain text. */\nfunction escapeHtml(text: string): string {\n\treturn text\n\t\t.replace(/&/g, '&')\n\t\t.replace(/</g, '<')\n\t\t.replace(/>/g, '>')\n\t\t.replace(/\"/g, '"')\n\t\t.replace(/'/g, ''');\n}\n\nfunction isDocumentValue(value: NotectlValue): value is Document {\n\treturn typeof value === 'object' && value !== null;\n}\n\nexport async function readEditorValue(\n\teditor: EditorContentApi,\n\tformat: ContentFormat,\n): Promise<NotectlValue> {\n\tswitch (format) {\n\t\tcase 'html':\n\t\t\treturn editor.getContentHTML();\n\t\tcase 'text':\n\t\t\treturn editor.getText();\n\t\tdefault:\n\t\t\treturn editor.getJSON();\n\t}\n}\n\nexport async function writeEditorValue(\n\teditor: EditorContentApi,\n\tformat: ContentFormat,\n\tvalue: NotectlValue,\n): Promise<void> {\n\tif (value === null || value === '') {\n\t\tawait editor.setContentHTML(EMPTY_HTML);\n\t\treturn;\n\t}\n\n\tif (format === 'json' && isDocumentValue(value)) {\n\t\teditor.setJSON(value);\n\t\treturn;\n\t}\n\n\tif (format === 'text' && typeof value === 'string') {\n\t\tawait editor.setContentHTML(`<p>${escapeHtml(value)}</p>`);\n\t\treturn;\n\t}\n\n\tif (typeof value === 'string') {\n\t\tawait editor.setContentHTML(value);\n\t\treturn;\n\t}\n\n\teditor.setJSON(value);\n}\n","import type { Document, NotectlEditor } from '@notectl/core';\n\nimport type { ContentFormat } from './tokens';\nimport type { NotectlValue } from './types';\nimport { readEditorValue, writeEditorValue } from './value-interop';\n\ninterface EditorValueControllerOptions {\n\treadonly getEditor: () => NotectlEditor | null;\n\treadonly getFormat: () => ContentFormat;\n\treadonly whenReady: () => Promise<void>;\n\treadonly updateContent: (doc: Document) => void;\n\treadonly emitControlValue: (value: NotectlValue) => void;\n}\n\nexport class EditorValueController {\n\tprivate readonly options: EditorValueControllerOptions;\n\tprivate lastDocument: Document | undefined;\n\tprivate mutedControlChanges = 0;\n\tprivate serializedReadVersion = 0;\n\tprivate writeQueue: Promise<void> = Promise.resolve();\n\n\tconstructor(options: EditorValueControllerOptions) {\n\t\tthis.options = options;\n\t}\n\n\treset(): void {\n\t\tthis.lastDocument = undefined;\n\t\tthis.serializedReadVersion++;\n\t}\n\n\thandleEditorStateChange(doc: Document): void {\n\t\tthis.lastDocument = doc;\n\t\tthis.options.updateContent(doc);\n\n\t\tif (this.mutedControlChanges > 0) return;\n\n\t\tconst readVersion = ++this.serializedReadVersion;\n\t\tvoid this.readCurrentValue().then((value: NotectlValue) => {\n\t\t\tif (readVersion !== this.serializedReadVersion) return;\n\t\t\tthis.options.emitControlValue(value);\n\t\t});\n\t}\n\n\tsyncExternalContent(doc: Document): void {\n\t\tif (doc === this.lastDocument) return;\n\t\tthis.lastDocument = doc;\n\t\tvoid this.enqueueSilent(async (editor: NotectlEditor) => {\n\t\t\teditor.setJSON(doc);\n\t\t});\n\t}\n\n\twriteControlValue(value: NotectlValue): void {\n\t\tvoid this.enqueueSilent(async (editor: NotectlEditor) => {\n\t\t\tawait writeEditorValue(editor, this.options.getFormat(), value);\n\t\t});\n\t}\n\n\tsetDocument(doc: Document): Promise<void> {\n\t\tthis.lastDocument = doc;\n\t\treturn this.enqueueInteractive(async (editor: NotectlEditor) => {\n\t\t\teditor.setJSON(doc);\n\t\t});\n\t}\n\n\tsetSerializedValue(value: NotectlValue): Promise<void> {\n\t\treturn this.enqueueInteractive(async (editor: NotectlEditor) => {\n\t\t\tawait writeEditorValue(editor, this.options.getFormat(), value);\n\t\t});\n\t}\n\n\tapplyInitialDocument(editor: NotectlEditor, doc: Document): Promise<void> {\n\t\tthis.lastDocument = doc;\n\t\treturn this.runSilent(async () => {\n\t\t\teditor.setJSON(doc);\n\t\t});\n\t}\n\n\tprivate async readCurrentValue(): Promise<NotectlValue> {\n\t\tconst editor: NotectlEditor | null = this.options.getEditor();\n\t\tif (!editor) return null;\n\t\treturn readEditorValue(editor, this.options.getFormat());\n\t}\n\n\tprivate enqueueSilent(task: (editor: NotectlEditor) => Promise<void>): Promise<void> {\n\t\treturn this.enqueue(task, true);\n\t}\n\n\tprivate enqueueInteractive(task: (editor: NotectlEditor) => Promise<void>): Promise<void> {\n\t\treturn this.enqueue(task, false);\n\t}\n\n\tprivate enqueue(task: (editor: NotectlEditor) => Promise<void>, silent: boolean): Promise<void> {\n\t\tconst next = this.writeQueue.then(async () => {\n\t\t\tawait this.options.whenReady();\n\t\t\tconst editor: NotectlEditor | null = this.options.getEditor();\n\t\t\tif (!editor) return;\n\n\t\t\tif (silent) {\n\t\t\t\tawait this.runSilent(() => task(editor));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait task(editor);\n\t\t});\n\n\t\tthis.writeQueue = next.catch(() => undefined);\n\t\treturn next;\n\t}\n\n\tprivate async runSilent(task: () => Promise<void>): Promise<void> {\n\t\tthis.mutedControlChanges++;\n\t\ttry {\n\t\t\tawait task();\n\t\t} finally {\n\t\t\tthis.mutedControlChanges--;\n\t\t}\n\t}\n}\n","import { type EnvironmentProviders, InjectionToken, makeEnvironmentProviders } from '@angular/core';\nimport type { NotectlEditorConfig } from '@notectl/core';\n\n/**\n * Default configuration applied to all `<notectl-editor>` instances within\n * the injector scope. Component-level inputs override these defaults.\n */\nexport const NOTECTL_DEFAULT_CONFIG: InjectionToken<Partial<NotectlEditorConfig>> =\n\tnew InjectionToken<Partial<NotectlEditorConfig>>('notectl-default-config');\n\n/**\n * Content format used by the `ControlValueAccessor` for forms integration.\n * Determines how editor content is serialized when reading/writing form values.\n *\n * - `'json'` — `Document` objects (default)\n * - `'html'` — sanitized HTML strings\n * - `'text'` — plain text strings\n */\nexport const NOTECTL_CONTENT_FORMAT: InjectionToken<ContentFormat> =\n\tnew InjectionToken<ContentFormat>('notectl-content-format');\n\n/** Supported content serialization formats for forms integration. */\nexport type ContentFormat = 'json' | 'html' | 'text';\n\n/** Options for `provideNotectl()`. */\nexport interface NotectlProviderOptions {\n\t/** Default editor configuration applied to all instances. */\n\treadonly config?: Partial<NotectlEditorConfig>;\n\t/** Content serialization format for forms integration. Defaults to `'json'`. */\n\treadonly contentFormat?: ContentFormat;\n}\n\n/**\n * Configures the notectl editor at the environment injector level.\n *\n * @example\n * ```typescript\n * bootstrapApplication(App, {\n * providers: [\n * provideNotectl({\n * config: { theme: ThemePreset.Light, placeholder: 'Start typing...' },\n * contentFormat: 'json',\n * }),\n * ],\n * });\n * ```\n */\nexport function provideNotectl(options: NotectlProviderOptions = {}): EnvironmentProviders {\n\tconst providers = [];\n\n\tif (options.config) {\n\t\tproviders.push({ provide: NOTECTL_DEFAULT_CONFIG, useValue: options.config });\n\t}\n\n\tif (options.contentFormat) {\n\t\tproviders.push({ provide: NOTECTL_CONTENT_FORMAT, useValue: options.contentFormat });\n\t}\n\n\treturn makeEnvironmentProviders(providers);\n}\n","import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tDestroyRef,\n\ttype ElementRef,\n\ttype ModelSignal,\n\tafterNextRender,\n\tcomputed,\n\teffect,\n\tforwardRef,\n\tinject,\n\tinput,\n\tmodel,\n\toutput,\n\tsignal,\n\tviewChild,\n} from '@angular/core';\nimport { type ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport type {\n\tDocument,\n\tEditorSelection,\n\tEditorState,\n\tNotectlEditorConfig,\n\tPaperSize,\n\tPlugin,\n\tPluginConfig,\n\tStateChangeEvent,\n\tTheme,\n\tTransaction,\n} from '@notectl/core';\nimport { NotectlEditor, ThemePreset } from '@notectl/core';\nimport type { Locale } from '@notectl/core';\nimport type { TextFormattingConfig } from '@notectl/core/plugins/text-formatting';\n\nimport { EditorValueController } from './EditorValueController';\nimport { type ContentFormat, NOTECTL_CONTENT_FORMAT, NOTECTL_DEFAULT_CONFIG } from './tokens';\nimport type { NotectlValue, SelectionChangeEvent } from './types';\n\ninterface InitConfigSnapshot {\n\treadonly autofocus: boolean;\n\treadonly features: Partial<TextFormattingConfig> | undefined;\n\treadonly locale: Locale | undefined;\n\treadonly maxHistoryDepth: number | undefined;\n\treadonly plugins: readonly Plugin[];\n\treadonly styleNonce: string | undefined;\n\treadonly toolbar: NotectlEditorConfig['toolbar'];\n}\n\nfunction initConfigEquals(a: InitConfigSnapshot, b: InitConfigSnapshot): boolean {\n\treturn (\n\t\ta.plugins === b.plugins &&\n\t\ta.toolbar === b.toolbar &&\n\t\ta.features === b.features &&\n\t\ta.autofocus === b.autofocus &&\n\t\ta.maxHistoryDepth === b.maxHistoryDepth &&\n\t\ta.locale === b.locale &&\n\t\ta.styleNonce === b.styleNonce\n\t);\n}\n\n@Component({\n\tselector: 'ntl-editor',\n\tstandalone: true,\n\ttemplate: '<div #host></div>',\n\tstyles: ':host { display: block; }',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\tproviders: [\n\t\t{\n\t\t\tprovide: NG_VALUE_ACCESSOR,\n\t\t\tuseExisting: forwardRef(() => NotectlEditorComponent),\n\t\t\tmulti: true,\n\t\t},\n\t],\n\thost: {\n\t\t'[attr.aria-disabled]': 'effectiveReadonly() ? \"true\" : null',\n\t\t'[class.ntl-editor-disabled]': 'effectiveReadonly()',\n\t},\n})\nexport class NotectlEditorComponent implements ControlValueAccessor {\n\tprivate readonly destroyRef: DestroyRef = inject(DestroyRef);\n\tprivate readonly defaultConfig: Partial<NotectlEditorConfig> | null = inject(\n\t\tNOTECTL_DEFAULT_CONFIG,\n\t\t{ optional: true },\n\t);\n\tprivate readonly contentFormat: ContentFormat =\n\t\tinject(NOTECTL_CONTENT_FORMAT, { optional: true }) ?? 'json';\n\n\treadonly plugins = input<readonly Plugin[] | undefined>(undefined);\n\treadonly toolbar = input<NotectlEditorConfig['toolbar']>(undefined);\n\treadonly features = input<Partial<TextFormattingConfig> | undefined>(undefined);\n\treadonly placeholder = input<string | undefined>(undefined);\n\treadonly readonlyMode = input<boolean | undefined>(undefined);\n\treadonly autofocus = input<boolean | undefined>(undefined);\n\treadonly maxHistoryDepth = input<number | undefined>(undefined);\n\treadonly theme = input<ThemePreset | Theme | undefined>(undefined);\n\treadonly paperSize = input<PaperSize | undefined>(undefined);\n\treadonly dir = input<'ltr' | 'rtl' | undefined>(undefined);\n\treadonly locale = input<Locale | undefined>(undefined);\n\treadonly styleNonce = input<string | undefined>(undefined);\n\n\treadonly content: ModelSignal<Document | undefined> = model<Document | undefined>(undefined);\n\n\treadonly stateChange = output<StateChangeEvent>();\n\treadonly selectionChange = output<SelectionChangeEvent>();\n\treadonly editorFocus = output<void>();\n\treadonly editorBlur = output<void>();\n\treadonly ready = output<void>();\n\n\treadonly editorState = signal<EditorState | null>(null);\n\treadonly isEmpty = computed<boolean>(() => {\n\t\tconst state: EditorState | null = this.editorState();\n\t\tif (!state) return true;\n\t\tconst doc: Document = state.doc;\n\t\tif (doc.children.length === 0) return true;\n\t\tif (doc.children.length > 1) return false;\n\t\tconst block = doc.children[0];\n\t\tif (!block) return true;\n\t\treturn block.type === 'paragraph' && block.children.length === 0;\n\t});\n\n\tprivate readonly resolvedPlugins = computed<readonly Plugin[]>(\n\t\t() => this.plugins() ?? this.defaultConfig?.plugins ?? [],\n\t);\n\tprivate readonly resolvedToolbar = computed<NotectlEditorConfig['toolbar']>(\n\t\t() => this.toolbar() ?? this.defaultConfig?.toolbar,\n\t);\n\tprivate readonly resolvedFeatures = computed<Partial<TextFormattingConfig> | undefined>(\n\t\t() => this.features() ?? this.defaultConfig?.features,\n\t);\n\tprivate readonly resolvedPlaceholder = computed<string>(\n\t\t() => this.placeholder() ?? this.defaultConfig?.placeholder ?? 'Start typing...',\n\t);\n\tprivate readonly resolvedReadonlyMode = computed<boolean>(\n\t\t() => this.readonlyMode() ?? this.defaultConfig?.readonly ?? false,\n\t);\n\tprivate readonly resolvedAutofocus = computed<boolean>(\n\t\t() => this.autofocus() ?? this.defaultConfig?.autofocus ?? false,\n\t);\n\tprivate readonly resolvedMaxHistoryDepth = computed<number | undefined>(\n\t\t() => this.maxHistoryDepth() ?? this.defaultConfig?.maxHistoryDepth,\n\t);\n\tprivate readonly resolvedTheme = computed<ThemePreset | Theme>(\n\t\t() => this.theme() ?? this.defaultConfig?.theme ?? ThemePreset.Light,\n\t);\n\tprivate readonly resolvedPaperSize = computed<PaperSize | undefined>(\n\t\t() => this.paperSize() ?? this.defaultConfig?.paperSize,\n\t);\n\tprivate readonly resolvedDir = computed<'ltr' | 'rtl' | undefined>(\n\t\t() => this.dir() ?? this.defaultConfig?.dir,\n\t);\n\tprivate readonly resolvedLocale = computed<Locale | undefined>(\n\t\t() => this.locale() ?? this.defaultConfig?.locale,\n\t);\n\tprivate readonly resolvedStyleNonce = computed<string | undefined>(\n\t\t() => this.styleNonce() ?? this.defaultConfig?.styleNonce,\n\t);\n\n\treadonly effectiveReadonly = computed<boolean>(\n\t\t() => this.disabledByForms() || this.resolvedReadonlyMode(),\n\t);\n\n\tprivate readonly hostRef = viewChild.required<ElementRef<HTMLDivElement>>('host');\n\tprivate readonly initialized = signal(false);\n\tprivate readonly disabledByForms = signal(false);\n\n\tprivate readonly valueController = new EditorValueController({\n\t\temitControlValue: (value: NotectlValue) => this.onChange(value),\n\t\tgetEditor: () => this.editorRef,\n\t\tgetFormat: () => this.contentFormat,\n\t\tupdateContent: (doc: Document) => this.content.set(doc),\n\t\twhenReady: () => this.readyPromise,\n\t});\n\n\tprivate editorRef: NotectlEditor | null = null;\n\tprivate readyResolve: (() => void) | null = null;\n\tprivate readyPromise!: Promise<void>;\n\tprivate lastInitConfig: InitConfigSnapshot | null = null;\n\tprivate queuedInitConfig: InitConfigSnapshot | null = null;\n\tprivate reinitializePromise: Promise<void> | null = null;\n\tprivate pendingInitialDocument: Document | undefined;\n\tprivate onChange: (value: NotectlValue) => void = () => {};\n\tprivate onTouched: () => void = () => {};\n\n\tconstructor() {\n\t\tthis.resetReadyPromise();\n\n\t\tafterNextRender(() => {\n\t\t\tthis.initEditor(this.captureInitConfig());\n\t\t});\n\n\t\teffect(() => {\n\t\t\tconst editor: NotectlEditor | null = this.editorRef;\n\t\t\tif (!this.initialized() || !editor) return;\n\n\t\t\teditor.setTheme(this.resolvedTheme());\n\t\t\teditor.configure({\n\t\t\t\tdir: this.resolvedDir(),\n\t\t\t\tpaperSize: this.resolvedPaperSize(),\n\t\t\t\tplaceholder: this.resolvedPlaceholder(),\n\t\t\t\treadonly: this.effectiveReadonly(),\n\t\t\t});\n\t\t});\n\n\t\teffect(() => {\n\t\t\tconst doc: Document | undefined = this.content();\n\t\t\tif (!doc) return;\n\t\t\tthis.valueController.syncExternalContent(doc);\n\t\t});\n\n\t\teffect(() => {\n\t\t\tthis.scheduleReinitialization(this.captureInitConfig());\n\t\t});\n\n\t\tthis.destroyRef.onDestroy(() => {\n\t\t\tvoid this.destroyEditor();\n\t\t});\n\t}\n\n\tgetJSON(): Document {\n\t\treturn this.requireEditor().getJSON();\n\t}\n\n\tsetJSON(doc: Document): void {\n\t\tvoid this.valueController.setDocument(doc);\n\t}\n\n\tasync getContentHTML(): Promise<string> {\n\t\treturn this.requireEditor().getContentHTML();\n\t}\n\n\tasync setContentHTML(html: string): Promise<void> {\n\t\tawait this.valueController.setSerializedValue(html);\n\t}\n\n\tgetText(): string {\n\t\treturn this.requireEditor().getText();\n\t}\n\n\tget commands(): NotectlEditor['commands'] {\n\t\treturn this.requireEditor().commands;\n\t}\n\n\tcan(): ReturnType<NotectlEditor['can']> {\n\t\treturn this.requireEditor().can();\n\t}\n\n\texecuteCommand(name: string): boolean {\n\t\treturn this.editorRef?.executeCommand(name) ?? false;\n\t}\n\n\tconfigurePlugin(pluginId: string, config: PluginConfig): void {\n\t\tthis.editorRef?.configurePlugin(pluginId, config);\n\t}\n\n\tdispatch(tr: Transaction): void {\n\t\tthis.editorRef?.dispatch(tr);\n\t}\n\n\tgetState(): EditorState {\n\t\treturn this.requireEditor().getState();\n\t}\n\n\tsetTheme(theme: ThemePreset | Theme): void {\n\t\tthis.editorRef?.setTheme(theme);\n\t}\n\n\tgetTheme(): ThemePreset | Theme {\n\t\treturn this.editorRef?.getTheme() ?? this.resolvedTheme();\n\t}\n\n\tsetReadonly(readonlyState: boolean): void {\n\t\tthis.editorRef?.configure({ readonly: readonlyState });\n\t}\n\n\twhenReady(): Promise<void> {\n\t\treturn this.readyPromise;\n\t}\n\n\tfocus(options?: FocusOptions): void {\n\t\tconst editor: NotectlEditor | null = this.editorRef;\n\t\tif (!editor) return;\n\n\t\tconst focusTarget =\n\t\t\teditor.shadowRoot?.querySelector<HTMLElement>('[contenteditable]') ?? editor;\n\t\tfocusTarget.focus(options);\n\t}\n\n\twriteValue(value: NotectlValue): void {\n\t\tthis.valueController.writeControlValue(value);\n\t}\n\n\tregisterOnChange(fn: (value: NotectlValue) => void): void {\n\t\tthis.onChange = fn;\n\t}\n\n\tregisterOnTouched(fn: () => void): void {\n\t\tthis.onTouched = fn;\n\t}\n\n\tsetDisabledState(isDisabled: boolean): void {\n\t\tthis.disabledByForms.set(isDisabled);\n\t}\n\n\tprivate resetReadyPromise(): void {\n\t\tthis.readyPromise = new Promise<void>((resolve) => {\n\t\t\tthis.readyResolve = resolve;\n\t\t});\n\t}\n\n\tprivate initEditor(snapshot: InitConfigSnapshot): void {\n\t\tconst hostElement: HTMLDivElement = this.hostRef().nativeElement;\n\t\tconst editor = new NotectlEditor();\n\t\tthis.editorRef = editor;\n\t\tthis.lastInitConfig = snapshot;\n\t\tthis.valueController.reset();\n\n\t\teditor.on('stateChange', (event: StateChangeEvent) => {\n\t\t\tthis.editorState.set(event.newState);\n\t\t\tthis.valueController.handleEditorStateChange(event.newState.doc);\n\t\t\tthis.stateChange.emit(event);\n\t\t});\n\n\t\teditor.on('selectionChange', (event: { selection: EditorSelection }) => {\n\t\t\tthis.selectionChange.emit(event);\n\t\t});\n\n\t\teditor.on('focus', () => {\n\t\t\tthis.editorFocus.emit();\n\t\t});\n\n\t\teditor.on('blur', () => {\n\t\t\tthis.onTouched();\n\t\t\tthis.editorBlur.emit();\n\t\t});\n\n\t\teditor.on('ready', () => {\n\t\t\tthis.initialized.set(true);\n\t\t\tthis.editorState.set(editor.getState());\n\t\t\tvoid this.applyInitialContent(editor).finally(() => {\n\t\t\t\tthis.readyResolve?.();\n\t\t\t\tthis.ready.emit();\n\t\t\t});\n\t\t});\n\n\t\teditor.init(this.buildConfig());\n\t\thostElement.appendChild(editor);\n\t}\n\n\tprivate async applyInitialContent(editor: NotectlEditor): Promise<void> {\n\t\tconst currentContent: Document | undefined = this.content();\n\t\tconst initialContent = currentContent ?? this.pendingInitialDocument;\n\t\tthis.pendingInitialDocument = undefined;\n\n\t\tif (!initialContent) return;\n\t\tawait this.valueController.applyInitialDocument(editor, initialContent);\n\t}\n\n\tprivate buildConfig(): NotectlEditorConfig {\n\t\tconst config: NotectlEditorConfig = {\n\t\t\t...this.defaultConfig,\n\t\t\tautofocus: this.resolvedAutofocus(),\n\t\t\tdir: this.resolvedDir(),\n\t\t\tlocale: this.resolvedLocale(),\n\t\t\tmaxHistoryDepth: this.resolvedMaxHistoryDepth(),\n\t\t\tpaperSize: this.resolvedPaperSize(),\n\t\t\tplaceholder: this.resolvedPlaceholder(),\n\t\t\tplugins: this.resolvedPlugins(),\n\t\t\treadonly: this.effectiveReadonly(),\n\t\t\tstyleNonce: this.resolvedStyleNonce(),\n\t\t\ttheme: this.resolvedTheme(),\n\t\t};\n\n\t\tconst toolbar = this.resolvedToolbar();\n\t\tif (toolbar !== undefined) {\n\t\t\tconfig.toolbar = toolbar;\n\t\t}\n\n\t\tconst features = this.resolvedFeatures();\n\t\tif (features !== undefined) {\n\t\t\tconfig.features = features;\n\t\t}\n\n\t\treturn config;\n\t}\n\n\tprivate captureInitConfig(): InitConfigSnapshot {\n\t\treturn {\n\t\t\tautofocus: this.resolvedAutofocus(),\n\t\t\tfeatures: this.resolvedFeatures(),\n\t\t\tlocale: this.resolvedLocale(),\n\t\t\tmaxHistoryDepth: this.resolvedMaxHistoryDepth(),\n\t\t\tplugins: this.resolvedPlugins(),\n\t\t\tstyleNonce: this.resolvedStyleNonce(),\n\t\t\ttoolbar: this.resolvedToolbar(),\n\t\t};\n\t}\n\n\tprivate scheduleReinitialization(snapshot: InitConfigSnapshot): void {\n\t\tif (!this.initialized() || !this.lastInitConfig) return;\n\t\tif (initConfigEquals(snapshot, this.lastInitConfig)) return;\n\n\t\tthis.queuedInitConfig = snapshot;\n\t\tif (this.reinitializePromise) return;\n\n\t\tthis.reinitializePromise = (async () => {\n\t\t\twhile (this.queuedInitConfig) {\n\t\t\t\tconst nextSnapshot = this.queuedInitConfig;\n\t\t\t\tthis.queuedInitConfig = null;\n\t\t\t\tthis.pendingInitialDocument = this.editorRef?.getJSON();\n\t\t\t\tthis.resetReadyPromise();\n\t\t\t\tthis.initialized.set(false);\n\t\t\t\tawait this.destroyEditor();\n\t\t\t\tthis.initEditor(nextSnapshot);\n\t\t\t\tawait this.readyPromise;\n\t\t\t}\n\t\t})().finally(() => {\n\t\t\tthis.reinitializePromise = null;\n\t\t});\n\t}\n\n\tprivate async destroyEditor(): Promise<void> {\n\t\tconst editor: NotectlEditor | null = this.editorRef;\n\t\tif (!editor) {\n\t\t\tthis.initialized.set(false);\n\t\t\tthis.editorState.set(null);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.editorRef = null;\n\t\teditor.remove();\n\t\tawait editor.destroy();\n\t\tthis.initialized.set(false);\n\t\tthis.editorState.set(null);\n\t}\n\n\tprivate requireEditor(): NotectlEditor {\n\t\tconst editor: NotectlEditor | null = this.editorRef;\n\t\tif (!editor || !this.initialized()) {\n\t\t\tthrow new Error('NotectlEditor is not initialized. Await whenReady() first.');\n\t\t}\n\t\treturn editor;\n\t}\n}\n","import { Directive } from '@angular/core';\n\n/**\n * @deprecated Angular Forms support is built into `NotectlEditorComponent`.\n *\n * This directive remains as a compatibility shim so existing imports do not break,\n * but it no longer participates in value accessor registration.\n */\n@Directive({\n\tselector: 'ntl-editor[formControl], ntl-editor[formControlName], ntl-editor[ngModel]',\n\tstandalone: true,\n})\nexport class NotectlValueAccessorDirective {}\n","import { DestroyRef, Injectable, computed, inject, signal } from '@angular/core';\nimport type { EditorState, StateChangeEvent, Transaction } from '@notectl/core';\nimport { type Observable, Subject } from 'rxjs';\n\nimport type { NotectlEditorComponent } from './notectl-editor.component';\n\n/**\n * Optional injectable service for programmatic editor access via DI.\n *\n * Useful when a toolbar or other component needs to interact with\n * the editor without a direct template reference.\n *\n * The service must be provided at a shared injector level and\n * connected to the editor component via `register()`.\n *\n * @example\n * ```typescript\n * @Component({\n * providers: [NotectlEditorService],\n * template: `\n * <app-toolbar />\n * <ntl-editor #editor [plugins]=\"plugins\" />\n * `,\n * })\n * export class EditorPage {\n * private readonly editor = viewChild.required<NotectlEditorComponent>('editor');\n * private readonly service = inject(NotectlEditorService);\n *\n * constructor() {\n * afterNextRender(() => {\n * this.service.register(this.editor());\n * });\n * }\n * }\n * ```\n */\n@Injectable()\nexport class NotectlEditorService {\n\tprivate readonly destroyRef: DestroyRef = inject(DestroyRef);\n\tprivate readonly editorRef = signal<NotectlEditorComponent | null>(null);\n\tprivate readonly stateChangeSubject = new Subject<StateChangeEvent>();\n\n\t/** Whether an editor is currently registered with this service. */\n\treadonly hasEditor = computed<boolean>(() => this.editorRef() !== null);\n\n\t/** Observable stream of state change events from the editor. */\n\treadonly stateChanges$: Observable<StateChangeEvent> = this.stateChangeSubject.asObservable();\n\n\tprivate stateChangeSub: { unsubscribe(): void } | null = null;\n\n\tconstructor() {\n\t\tthis.destroyRef.onDestroy(() => {\n\t\t\tthis.unregister();\n\t\t\tthis.stateChangeSubject.complete();\n\t\t});\n\t}\n\n\t/** Registers an editor component with this service. */\n\tregister(editor: NotectlEditorComponent): void {\n\t\tthis.unregister();\n\t\tthis.editorRef.set(editor);\n\n\t\tthis.stateChangeSub = editor.stateChange.subscribe((event: StateChangeEvent) => {\n\t\t\tthis.stateChangeSubject.next(event);\n\t\t});\n\t}\n\n\t/** Unregisters the current editor from this service. */\n\tunregister(): void {\n\t\tthis.stateChangeSub?.unsubscribe();\n\t\tthis.stateChangeSub = null;\n\t\tthis.editorRef.set(null);\n\t}\n\n\t/** Executes a named command on the registered editor. */\n\texecuteCommand(name: string): boolean {\n\t\tconst editor: NotectlEditorComponent | null = this.editorRef();\n\t\tif (!editor) return false;\n\t\treturn editor.executeCommand(name);\n\t}\n\n\t/** Returns the current editor state, or `null` if no editor is registered. */\n\tgetState(): EditorState | null {\n\t\tconst editor: NotectlEditorComponent | null = this.editorRef();\n\t\tif (!editor) return null;\n\t\ttry {\n\t\t\treturn editor.getState();\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/** Dispatches a transaction on the registered editor. */\n\tdispatch(tr: Transaction): void {\n\t\tthis.editorRef()?.dispatch(tr);\n\t}\n}\n","/**\n * @notectl/angular — Angular integration for the notectl rich text editor.\n * @packageDocumentation\n */\n\n// --- Angular Bindings ---\nexport { NotectlEditorComponent } from './lib/notectl-editor.component';\nexport { NotectlValueAccessorDirective } from './lib/value-accessor.directive';\nexport { NotectlEditorService } from './lib/notectl-editor.service';\n\n// --- Provider Function ---\nexport {\n\tprovideNotectl,\n\ttype NotectlProviderOptions,\n} from './lib/tokens';\n\n// --- Injection Tokens ---\nexport {\n\tNOTECTL_DEFAULT_CONFIG,\n\tNOTECTL_CONTENT_FORMAT,\n\ttype ContentFormat,\n} from './lib/tokens';\n\n// --- Angular-specific Types ---\nexport type { NotectlValue, SelectionChangeEvent } from './lib/types';\n\n// --- Re-exports from @notectl/core (convenience) ---\n\n// Model types\nexport type {\n\tDocument,\n\tBlockNode,\n\tTextNode,\n\tInlineNode,\n\tMark,\n\tBlockAttrs,\n} from '@notectl/core';\n\n// Selection types\nexport type { EditorSelection, Position, Selection } from '@notectl/core';\n\n// State types\nexport type {\n\tEditorState,\n\tTransaction,\n\tTransactionMetadata,\n\tStateChangeEvent,\n} from '@notectl/core';\n\n// Plugin types\nexport type { Plugin, PluginConfig, PluginContext } from '@notectl/core';\n\n// Theme types\nexport type { Theme, PartialTheme, ThemePrimitives } from '@notectl/core';\nexport { ThemePreset, LIGHT_THEME, DARK_THEME, createTheme } from '@notectl/core';\n\n// Editor config\nexport type { NotectlEditorConfig } from '@notectl/core';\n\n// Plugin config types (from sub-path exports)\nexport type { TextFormattingConfig } from '@notectl/core/plugins/text-formatting';\nexport type { FontDefinition } from '@notectl/core/plugins/font';\n\n// Starter fonts\n/** @deprecated Import from '@notectl/core/fonts' instead. */\nexport { STARTER_FONTS } from '@notectl/core/fonts';\n\n// Plugins (tree-shakable re-exports from sub-paths)\nexport { TextFormattingPlugin } from '@notectl/core/plugins/text-formatting';\nexport { HeadingPlugin } from '@notectl/core/plugins/heading';\nexport { ListPlugin } from '@notectl/core/plugins/list';\nexport { LinkPlugin } from '@notectl/core/plugins/link';\nexport { BlockquotePlugin } from '@notectl/core/plugins/blockquote';\nexport { CodeBlockPlugin } from '@notectl/core/plugins/code-block';\nexport { TablePlugin } from '@notectl/core/plugins/table';\nexport { ImagePlugin } from '@notectl/core/plugins/image';\nexport { HorizontalRulePlugin } from '@notectl/core/plugins/horizontal-rule';\nexport { HardBreakPlugin } from '@notectl/core/plugins/hard-break';\nexport { StrikethroughPlugin } from '@notectl/core/plugins/strikethrough';\nexport { HighlightPlugin } from '@notectl/core/plugins/highlight';\nexport { TextColorPlugin } from '@notectl/core/plugins/text-color';\nexport { FontPlugin } from '@notectl/core/plugins/font';\nexport { FontSizePlugin } from '@notectl/core/plugins/font-size';\nexport { AlignmentPlugin } from '@notectl/core/plugins/alignment';\nexport { TextDirectionPlugin } from '@notectl/core/plugins/text-direction';\nexport { SuperSubPlugin } from '@notectl/core/plugins/super-sub';\nexport { ToolbarPlugin } from '@notectl/core/plugins/toolbar';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"notectl-angular.mjs","sources":["../../src/lib/value-interop.ts","../../src/lib/EditorValueController.ts","../../src/lib/tokens.ts","../../src/lib/notectl-editor.component.ts","../../src/lib/value-accessor.directive.ts","../../src/lib/notectl-editor.service.ts","../../src/public-api.ts","../../src/notectl-angular.ts"],"sourcesContent":["import type { Document } from '@notectl/core';\n\nimport type { ContentFormat } from './tokens';\nimport type { NotectlValue } from './types';\n\ninterface EditorContentApi {\n\tgetContentHTML(): Promise<string>;\n\tgetJSON(): Document;\n\tgetText(): string;\n\tsetContentHTML(html: string): Promise<void>;\n\tsetJSON(doc: Document): void;\n}\n\nconst EMPTY_HTML = '<p></p>';\n\n/** Escapes HTML special characters before inserting plain text. */\nfunction escapeHtml(text: string): string {\n\treturn text\n\t\t.replace(/&/g, '&')\n\t\t.replace(/</g, '<')\n\t\t.replace(/>/g, '>')\n\t\t.replace(/\"/g, '"')\n\t\t.replace(/'/g, ''');\n}\n\nfunction isDocumentValue(value: NotectlValue): value is Document {\n\treturn typeof value === 'object' && value !== null;\n}\n\nexport async function readEditorValue(\n\teditor: EditorContentApi,\n\tformat: ContentFormat,\n): Promise<NotectlValue> {\n\tswitch (format) {\n\t\tcase 'html':\n\t\t\treturn editor.getContentHTML();\n\t\tcase 'text':\n\t\t\treturn editor.getText();\n\t\tdefault:\n\t\t\treturn editor.getJSON();\n\t}\n}\n\nexport async function writeEditorValue(\n\teditor: EditorContentApi,\n\tformat: ContentFormat,\n\tvalue: NotectlValue,\n): Promise<void> {\n\tif (value === null || value === '') {\n\t\tawait editor.setContentHTML(EMPTY_HTML);\n\t\treturn;\n\t}\n\n\tif (format === 'json' && isDocumentValue(value)) {\n\t\teditor.setJSON(value);\n\t\treturn;\n\t}\n\n\tif (format === 'text' && typeof value === 'string') {\n\t\tawait editor.setContentHTML(`<p>${escapeHtml(value)}</p>`);\n\t\treturn;\n\t}\n\n\tif (typeof value === 'string') {\n\t\tawait editor.setContentHTML(value);\n\t\treturn;\n\t}\n\n\teditor.setJSON(value);\n}\n","import type { Document, NotectlEditor } from '@notectl/core';\n\nimport type { ContentFormat } from './tokens';\nimport type { NotectlValue } from './types';\nimport { readEditorValue, writeEditorValue } from './value-interop';\n\ninterface EditorValueControllerOptions {\n\treadonly getEditor: () => NotectlEditor | null;\n\treadonly getFormat: () => ContentFormat;\n\treadonly whenReady: () => Promise<void>;\n\treadonly updateContent: (doc: Document) => void;\n\treadonly emitControlValue: (value: NotectlValue) => void;\n}\n\nexport class EditorValueController {\n\tprivate readonly options: EditorValueControllerOptions;\n\tprivate lastDocument: Document | undefined;\n\tprivate mutedControlChanges = 0;\n\tprivate serializedReadVersion = 0;\n\tprivate writeQueue: Promise<void> = Promise.resolve();\n\n\tconstructor(options: EditorValueControllerOptions) {\n\t\tthis.options = options;\n\t}\n\n\treset(): void {\n\t\tthis.lastDocument = undefined;\n\t\tthis.serializedReadVersion++;\n\t}\n\n\thandleEditorStateChange(doc: Document): void {\n\t\tthis.lastDocument = doc;\n\t\tthis.options.updateContent(doc);\n\n\t\tif (this.mutedControlChanges > 0) return;\n\n\t\tconst readVersion = ++this.serializedReadVersion;\n\t\tvoid this.readCurrentValue().then((value: NotectlValue) => {\n\t\t\tif (readVersion !== this.serializedReadVersion) return;\n\t\t\tthis.options.emitControlValue(value);\n\t\t});\n\t}\n\n\tsyncExternalContent(doc: Document): void {\n\t\tif (doc === this.lastDocument) return;\n\t\tthis.lastDocument = doc;\n\t\tvoid this.enqueueSilent(async (editor: NotectlEditor) => {\n\t\t\teditor.setJSON(doc);\n\t\t});\n\t}\n\n\twriteControlValue(value: NotectlValue): void {\n\t\tvoid this.enqueueSilent(async (editor: NotectlEditor) => {\n\t\t\tawait writeEditorValue(editor, this.options.getFormat(), value);\n\t\t});\n\t}\n\n\tsetDocument(doc: Document): Promise<void> {\n\t\tthis.lastDocument = doc;\n\t\treturn this.enqueueInteractive(async (editor: NotectlEditor) => {\n\t\t\teditor.setJSON(doc);\n\t\t});\n\t}\n\n\tsetSerializedValue(value: NotectlValue): Promise<void> {\n\t\treturn this.enqueueInteractive(async (editor: NotectlEditor) => {\n\t\t\tawait writeEditorValue(editor, this.options.getFormat(), value);\n\t\t});\n\t}\n\n\tapplyInitialDocument(editor: NotectlEditor, doc: Document): Promise<void> {\n\t\tthis.lastDocument = doc;\n\t\treturn this.runSilent(async () => {\n\t\t\teditor.setJSON(doc);\n\t\t});\n\t}\n\n\tprivate async readCurrentValue(): Promise<NotectlValue> {\n\t\tconst editor: NotectlEditor | null = this.options.getEditor();\n\t\tif (!editor) return null;\n\t\treturn readEditorValue(editor, this.options.getFormat());\n\t}\n\n\tprivate enqueueSilent(task: (editor: NotectlEditor) => Promise<void>): Promise<void> {\n\t\treturn this.enqueue(task, true);\n\t}\n\n\tprivate enqueueInteractive(task: (editor: NotectlEditor) => Promise<void>): Promise<void> {\n\t\treturn this.enqueue(task, false);\n\t}\n\n\tprivate enqueue(task: (editor: NotectlEditor) => Promise<void>, silent: boolean): Promise<void> {\n\t\tconst next = this.writeQueue.then(async () => {\n\t\t\tawait this.options.whenReady();\n\t\t\tconst editor: NotectlEditor | null = this.options.getEditor();\n\t\t\tif (!editor) return;\n\n\t\t\tif (silent) {\n\t\t\t\tawait this.runSilent(() => task(editor));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait task(editor);\n\t\t});\n\n\t\tthis.writeQueue = next.catch(() => undefined);\n\t\treturn next;\n\t}\n\n\tprivate async runSilent(task: () => Promise<void>): Promise<void> {\n\t\tthis.mutedControlChanges++;\n\t\ttry {\n\t\t\tawait task();\n\t\t} finally {\n\t\t\tthis.mutedControlChanges--;\n\t\t}\n\t}\n}\n","import { type EnvironmentProviders, InjectionToken, makeEnvironmentProviders } from '@angular/core';\nimport type { NotectlEditorConfig } from '@notectl/core';\n\n/**\n * Default configuration applied to all `<notectl-editor>` instances within\n * the injector scope. Component-level inputs override these defaults.\n */\nexport const NOTECTL_DEFAULT_CONFIG: InjectionToken<Partial<NotectlEditorConfig>> =\n\tnew InjectionToken<Partial<NotectlEditorConfig>>('notectl-default-config');\n\n/**\n * Content format used by the `ControlValueAccessor` for forms integration.\n * Determines how editor content is serialized when reading/writing form values.\n *\n * - `'json'` — `Document` objects (default)\n * - `'html'` — sanitized HTML strings\n * - `'text'` — plain text strings\n */\nexport const NOTECTL_CONTENT_FORMAT: InjectionToken<ContentFormat> =\n\tnew InjectionToken<ContentFormat>('notectl-content-format');\n\n/** Supported content serialization formats for forms integration. */\nexport type ContentFormat = 'json' | 'html' | 'text';\n\n/** Options for `provideNotectl()`. */\nexport interface NotectlProviderOptions {\n\t/** Default editor configuration applied to all instances. */\n\treadonly config?: Partial<NotectlEditorConfig>;\n\t/** Content serialization format for forms integration. Defaults to `'json'`. */\n\treadonly contentFormat?: ContentFormat;\n}\n\n/**\n * Configures the notectl editor at the environment injector level.\n *\n * @example\n * ```typescript\n * bootstrapApplication(App, {\n * providers: [\n * provideNotectl({\n * config: { theme: ThemePreset.Light, placeholder: 'Start typing...' },\n * contentFormat: 'json',\n * }),\n * ],\n * });\n * ```\n */\nexport function provideNotectl(options: NotectlProviderOptions = {}): EnvironmentProviders {\n\tconst providers = [];\n\n\tif (options.config) {\n\t\tproviders.push({ provide: NOTECTL_DEFAULT_CONFIG, useValue: options.config });\n\t}\n\n\tif (options.contentFormat) {\n\t\tproviders.push({ provide: NOTECTL_CONTENT_FORMAT, useValue: options.contentFormat });\n\t}\n\n\treturn makeEnvironmentProviders(providers);\n}\n","import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tDestroyRef,\n\ttype ElementRef,\n\ttype ModelSignal,\n\tafterNextRender,\n\tcomputed,\n\teffect,\n\tforwardRef,\n\tinject,\n\tinput,\n\tmodel,\n\toutput,\n\tsignal,\n\tviewChild,\n} from '@angular/core';\nimport { type ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport type {\n\tDocument,\n\tEditorSelection,\n\tEditorState,\n\tNotectlEditorConfig,\n\tPaperSize,\n\tPlugin,\n\tPluginConfig,\n\tStateChangeEvent,\n\tTheme,\n\tTransaction,\n} from '@notectl/core';\nimport { NotectlEditor, ThemePreset } from '@notectl/core';\nimport type { Locale } from '@notectl/core';\nimport type { TextFormattingConfig } from '@notectl/core/plugins/text-formatting';\n\nimport { EditorValueController } from './EditorValueController';\nimport { type ContentFormat, NOTECTL_CONTENT_FORMAT, NOTECTL_DEFAULT_CONFIG } from './tokens';\nimport type { NotectlValue, SelectionChangeEvent } from './types';\n\ninterface InitConfigSnapshot {\n\treadonly autofocus: boolean;\n\treadonly features: Partial<TextFormattingConfig> | undefined;\n\treadonly locale: Locale | undefined;\n\treadonly maxHistoryDepth: number | undefined;\n\treadonly plugins: readonly Plugin[];\n\treadonly styleNonce: string | undefined;\n\treadonly toolbar: NotectlEditorConfig['toolbar'];\n}\n\nfunction initConfigEquals(a: InitConfigSnapshot, b: InitConfigSnapshot): boolean {\n\treturn (\n\t\ta.plugins === b.plugins &&\n\t\ta.toolbar === b.toolbar &&\n\t\ta.features === b.features &&\n\t\ta.autofocus === b.autofocus &&\n\t\ta.maxHistoryDepth === b.maxHistoryDepth &&\n\t\ta.locale === b.locale &&\n\t\ta.styleNonce === b.styleNonce\n\t);\n}\n\n@Component({\n\tselector: 'ntl-editor',\n\tstandalone: true,\n\ttemplate: '<div #host></div>',\n\tstyles: ':host { display: block; }',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\tproviders: [\n\t\t{\n\t\t\tprovide: NG_VALUE_ACCESSOR,\n\t\t\tuseExisting: forwardRef(() => NotectlEditorComponent),\n\t\t\tmulti: true,\n\t\t},\n\t],\n\thost: {\n\t\t'[attr.aria-disabled]': 'effectiveReadonly() ? \"true\" : null',\n\t\t'[class.ntl-editor-disabled]': 'effectiveReadonly()',\n\t},\n})\nexport class NotectlEditorComponent implements ControlValueAccessor {\n\tprivate readonly destroyRef: DestroyRef = inject(DestroyRef);\n\tprivate readonly defaultConfig: Partial<NotectlEditorConfig> | null = inject(\n\t\tNOTECTL_DEFAULT_CONFIG,\n\t\t{ optional: true },\n\t);\n\tprivate readonly contentFormat: ContentFormat =\n\t\tinject(NOTECTL_CONTENT_FORMAT, { optional: true }) ?? 'json';\n\n\treadonly plugins = input<readonly Plugin[] | undefined>(undefined);\n\treadonly toolbar = input<NotectlEditorConfig['toolbar']>(undefined);\n\treadonly features = input<Partial<TextFormattingConfig> | undefined>(undefined);\n\treadonly placeholder = input<string | undefined>(undefined);\n\treadonly readonlyMode = input<boolean | undefined>(undefined);\n\treadonly autofocus = input<boolean | undefined>(undefined);\n\treadonly maxHistoryDepth = input<number | undefined>(undefined);\n\treadonly theme = input<ThemePreset | Theme | undefined>(undefined);\n\treadonly paperSize = input<PaperSize | undefined>(undefined);\n\treadonly dir = input<'ltr' | 'rtl' | undefined>(undefined);\n\treadonly locale = input<Locale | undefined>(undefined);\n\treadonly styleNonce = input<string | undefined>(undefined);\n\n\treadonly content: ModelSignal<Document | undefined> = model<Document | undefined>(undefined);\n\n\treadonly stateChange = output<StateChangeEvent>();\n\treadonly selectionChange = output<SelectionChangeEvent>();\n\treadonly editorFocus = output<void>();\n\treadonly editorBlur = output<void>();\n\treadonly ready = output<void>();\n\n\treadonly editorState = signal<EditorState | null>(null);\n\treadonly isEmpty = computed<boolean>(() => {\n\t\tconst state: EditorState | null = this.editorState();\n\t\tif (!state) return true;\n\t\tconst doc: Document = state.doc;\n\t\tif (doc.children.length === 0) return true;\n\t\tif (doc.children.length > 1) return false;\n\t\tconst block = doc.children[0];\n\t\tif (!block) return true;\n\t\treturn block.type === 'paragraph' && block.children.length === 0;\n\t});\n\n\tprivate readonly resolvedPlugins = computed<readonly Plugin[]>(\n\t\t() => this.plugins() ?? this.defaultConfig?.plugins ?? [],\n\t);\n\tprivate readonly resolvedToolbar = computed<NotectlEditorConfig['toolbar']>(\n\t\t() => this.toolbar() ?? this.defaultConfig?.toolbar,\n\t);\n\tprivate readonly resolvedFeatures = computed<Partial<TextFormattingConfig> | undefined>(\n\t\t() => this.features() ?? this.defaultConfig?.features,\n\t);\n\tprivate readonly resolvedPlaceholder = computed<string>(\n\t\t() => this.placeholder() ?? this.defaultConfig?.placeholder ?? 'Start typing...',\n\t);\n\tprivate readonly resolvedReadonlyMode = computed<boolean>(\n\t\t() => this.readonlyMode() ?? this.defaultConfig?.readonly ?? false,\n\t);\n\tprivate readonly resolvedAutofocus = computed<boolean>(\n\t\t() => this.autofocus() ?? this.defaultConfig?.autofocus ?? false,\n\t);\n\tprivate readonly resolvedMaxHistoryDepth = computed<number | undefined>(\n\t\t() => this.maxHistoryDepth() ?? this.defaultConfig?.maxHistoryDepth,\n\t);\n\tprivate readonly resolvedTheme = computed<ThemePreset | Theme>(\n\t\t() => this.theme() ?? this.defaultConfig?.theme ?? ThemePreset.Light,\n\t);\n\tprivate readonly resolvedPaperSize = computed<PaperSize | undefined>(\n\t\t() => this.paperSize() ?? this.defaultConfig?.paperSize,\n\t);\n\tprivate readonly resolvedDir = computed<'ltr' | 'rtl' | undefined>(\n\t\t() => this.dir() ?? this.defaultConfig?.dir,\n\t);\n\tprivate readonly resolvedLocale = computed<Locale | undefined>(\n\t\t() => this.locale() ?? this.defaultConfig?.locale,\n\t);\n\tprivate readonly resolvedStyleNonce = computed<string | undefined>(\n\t\t() => this.styleNonce() ?? this.defaultConfig?.styleNonce,\n\t);\n\n\treadonly effectiveReadonly = computed<boolean>(\n\t\t() => this.disabledByForms() || this.resolvedReadonlyMode(),\n\t);\n\n\tprivate readonly hostRef = viewChild.required<ElementRef<HTMLDivElement>>('host');\n\tprivate readonly initialized = signal(false);\n\tprivate readonly disabledByForms = signal(false);\n\n\tprivate readonly valueController = new EditorValueController({\n\t\temitControlValue: (value: NotectlValue) => this.onChange(value),\n\t\tgetEditor: () => this.editorRef,\n\t\tgetFormat: () => this.contentFormat,\n\t\tupdateContent: (doc: Document) => this.content.set(doc),\n\t\twhenReady: () => this.readyPromise,\n\t});\n\n\tprivate editorRef: NotectlEditor | null = null;\n\tprivate readyResolve: (() => void) | null = null;\n\tprivate readyPromise!: Promise<void>;\n\tprivate lastInitConfig: InitConfigSnapshot | null = null;\n\tprivate queuedInitConfig: InitConfigSnapshot | null = null;\n\tprivate reinitializePromise: Promise<void> | null = null;\n\tprivate pendingInitialDocument: Document | undefined;\n\tprivate onChange: (value: NotectlValue) => void = () => {};\n\tprivate onTouched: () => void = () => {};\n\n\tconstructor() {\n\t\tthis.resetReadyPromise();\n\n\t\tafterNextRender(() => {\n\t\t\tthis.initEditor(this.captureInitConfig());\n\t\t});\n\n\t\teffect(() => {\n\t\t\tconst editor: NotectlEditor | null = this.editorRef;\n\t\t\tif (!this.initialized() || !editor) return;\n\n\t\t\teditor.setTheme(this.resolvedTheme());\n\t\t\teditor.configure({\n\t\t\t\tdir: this.resolvedDir(),\n\t\t\t\tpaperSize: this.resolvedPaperSize(),\n\t\t\t\tplaceholder: this.resolvedPlaceholder(),\n\t\t\t\treadonly: this.effectiveReadonly(),\n\t\t\t});\n\t\t});\n\n\t\teffect(() => {\n\t\t\tconst doc: Document | undefined = this.content();\n\t\t\tif (!doc) return;\n\t\t\tthis.valueController.syncExternalContent(doc);\n\t\t});\n\n\t\teffect(() => {\n\t\t\tthis.scheduleReinitialization(this.captureInitConfig());\n\t\t});\n\n\t\tthis.destroyRef.onDestroy(() => {\n\t\t\tvoid this.destroyEditor();\n\t\t});\n\t}\n\n\tgetJSON(): Document {\n\t\treturn this.requireEditor().getJSON();\n\t}\n\n\tsetJSON(doc: Document): void {\n\t\tvoid this.valueController.setDocument(doc);\n\t}\n\n\tasync getContentHTML(): Promise<string> {\n\t\treturn this.requireEditor().getContentHTML();\n\t}\n\n\tasync setContentHTML(html: string): Promise<void> {\n\t\tawait this.valueController.setSerializedValue(html);\n\t}\n\n\tgetText(): string {\n\t\treturn this.requireEditor().getText();\n\t}\n\n\tget commands(): NotectlEditor['commands'] {\n\t\treturn this.requireEditor().commands;\n\t}\n\n\tcan(): ReturnType<NotectlEditor['can']> {\n\t\treturn this.requireEditor().can();\n\t}\n\n\texecuteCommand(name: string): boolean {\n\t\treturn this.editorRef?.executeCommand(name) ?? false;\n\t}\n\n\tconfigurePlugin(pluginId: string, config: PluginConfig): void {\n\t\tthis.editorRef?.configurePlugin(pluginId, config);\n\t}\n\n\tdispatch(tr: Transaction): void {\n\t\tthis.editorRef?.dispatch(tr);\n\t}\n\n\tgetState(): EditorState {\n\t\treturn this.requireEditor().getState();\n\t}\n\n\tsetTheme(theme: ThemePreset | Theme): void {\n\t\tthis.editorRef?.setTheme(theme);\n\t}\n\n\tgetTheme(): ThemePreset | Theme {\n\t\treturn this.editorRef?.getTheme() ?? this.resolvedTheme();\n\t}\n\n\tsetReadonly(readonlyState: boolean): void {\n\t\tthis.editorRef?.configure({ readonly: readonlyState });\n\t}\n\n\twhenReady(): Promise<void> {\n\t\treturn this.readyPromise;\n\t}\n\n\tfocus(options?: FocusOptions): void {\n\t\tconst editor: NotectlEditor | null = this.editorRef;\n\t\tif (!editor) return;\n\n\t\tconst focusTarget =\n\t\t\teditor.shadowRoot?.querySelector<HTMLElement>('[contenteditable]') ?? editor;\n\t\tfocusTarget.focus(options);\n\t}\n\n\twriteValue(value: NotectlValue): void {\n\t\tthis.valueController.writeControlValue(value);\n\t}\n\n\tregisterOnChange(fn: (value: NotectlValue) => void): void {\n\t\tthis.onChange = fn;\n\t}\n\n\tregisterOnTouched(fn: () => void): void {\n\t\tthis.onTouched = fn;\n\t}\n\n\tsetDisabledState(isDisabled: boolean): void {\n\t\tthis.disabledByForms.set(isDisabled);\n\t}\n\n\tprivate resetReadyPromise(): void {\n\t\tthis.readyPromise = new Promise<void>((resolve) => {\n\t\t\tthis.readyResolve = resolve;\n\t\t});\n\t}\n\n\tprivate initEditor(snapshot: InitConfigSnapshot): void {\n\t\tconst hostElement: HTMLDivElement = this.hostRef().nativeElement;\n\t\tconst editor = new NotectlEditor();\n\t\tthis.editorRef = editor;\n\t\tthis.lastInitConfig = snapshot;\n\t\tthis.valueController.reset();\n\n\t\teditor.on('stateChange', (event: StateChangeEvent) => {\n\t\t\tthis.editorState.set(event.newState);\n\t\t\tthis.valueController.handleEditorStateChange(event.newState.doc);\n\t\t\tthis.stateChange.emit(event);\n\t\t});\n\n\t\teditor.on('selectionChange', (event: { selection: EditorSelection }) => {\n\t\t\tthis.selectionChange.emit(event);\n\t\t});\n\n\t\teditor.on('focus', () => {\n\t\t\tthis.editorFocus.emit();\n\t\t});\n\n\t\teditor.on('blur', () => {\n\t\t\tthis.onTouched();\n\t\t\tthis.editorBlur.emit();\n\t\t});\n\n\t\teditor.on('ready', () => {\n\t\t\tthis.initialized.set(true);\n\t\t\tthis.editorState.set(editor.getState());\n\t\t\tvoid this.applyInitialContent(editor).finally(() => {\n\t\t\t\tthis.readyResolve?.();\n\t\t\t\tthis.ready.emit();\n\t\t\t});\n\t\t});\n\n\t\teditor.init(this.buildConfig());\n\t\thostElement.appendChild(editor);\n\t}\n\n\tprivate async applyInitialContent(editor: NotectlEditor): Promise<void> {\n\t\tconst currentContent: Document | undefined = this.content();\n\t\tconst initialContent = currentContent ?? this.pendingInitialDocument;\n\t\tthis.pendingInitialDocument = undefined;\n\n\t\tif (!initialContent) return;\n\t\tawait this.valueController.applyInitialDocument(editor, initialContent);\n\t}\n\n\tprivate buildConfig(): NotectlEditorConfig {\n\t\tconst config: NotectlEditorConfig = {\n\t\t\t...this.defaultConfig,\n\t\t\tautofocus: this.resolvedAutofocus(),\n\t\t\tdir: this.resolvedDir(),\n\t\t\tlocale: this.resolvedLocale(),\n\t\t\tmaxHistoryDepth: this.resolvedMaxHistoryDepth(),\n\t\t\tpaperSize: this.resolvedPaperSize(),\n\t\t\tplaceholder: this.resolvedPlaceholder(),\n\t\t\tplugins: this.resolvedPlugins(),\n\t\t\treadonly: this.effectiveReadonly(),\n\t\t\tstyleNonce: this.resolvedStyleNonce(),\n\t\t\ttheme: this.resolvedTheme(),\n\t\t};\n\n\t\tconst toolbar = this.resolvedToolbar();\n\t\tif (toolbar !== undefined) {\n\t\t\tconfig.toolbar = toolbar;\n\t\t}\n\n\t\tconst features = this.resolvedFeatures();\n\t\tif (features !== undefined) {\n\t\t\tconfig.features = features;\n\t\t}\n\n\t\treturn config;\n\t}\n\n\tprivate captureInitConfig(): InitConfigSnapshot {\n\t\treturn {\n\t\t\tautofocus: this.resolvedAutofocus(),\n\t\t\tfeatures: this.resolvedFeatures(),\n\t\t\tlocale: this.resolvedLocale(),\n\t\t\tmaxHistoryDepth: this.resolvedMaxHistoryDepth(),\n\t\t\tplugins: this.resolvedPlugins(),\n\t\t\tstyleNonce: this.resolvedStyleNonce(),\n\t\t\ttoolbar: this.resolvedToolbar(),\n\t\t};\n\t}\n\n\tprivate scheduleReinitialization(snapshot: InitConfigSnapshot): void {\n\t\tif (!this.initialized() || !this.lastInitConfig) return;\n\t\tif (initConfigEquals(snapshot, this.lastInitConfig)) return;\n\n\t\tthis.queuedInitConfig = snapshot;\n\t\tif (this.reinitializePromise) return;\n\n\t\tthis.reinitializePromise = (async () => {\n\t\t\twhile (this.queuedInitConfig) {\n\t\t\t\tconst nextSnapshot = this.queuedInitConfig;\n\t\t\t\tthis.queuedInitConfig = null;\n\t\t\t\tthis.pendingInitialDocument = this.editorRef?.getJSON();\n\t\t\t\tthis.resetReadyPromise();\n\t\t\t\tthis.initialized.set(false);\n\t\t\t\tawait this.destroyEditor();\n\t\t\t\tthis.initEditor(nextSnapshot);\n\t\t\t\tawait this.readyPromise;\n\t\t\t}\n\t\t})().finally(() => {\n\t\t\tthis.reinitializePromise = null;\n\t\t});\n\t}\n\n\tprivate async destroyEditor(): Promise<void> {\n\t\tconst editor: NotectlEditor | null = this.editorRef;\n\t\tif (!editor) {\n\t\t\tthis.initialized.set(false);\n\t\t\tthis.editorState.set(null);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.editorRef = null;\n\t\teditor.remove();\n\t\tawait editor.destroy();\n\t\tthis.initialized.set(false);\n\t\tthis.editorState.set(null);\n\t}\n\n\tprivate requireEditor(): NotectlEditor {\n\t\tconst editor: NotectlEditor | null = this.editorRef;\n\t\tif (!editor || !this.initialized()) {\n\t\t\tthrow new Error('NotectlEditor is not initialized. Await whenReady() first.');\n\t\t}\n\t\treturn editor;\n\t}\n}\n","import { Directive } from '@angular/core';\n\n/**\n * @deprecated Angular Forms support is built into `NotectlEditorComponent`.\n *\n * This directive remains as a compatibility shim so existing imports do not break,\n * but it no longer participates in value accessor registration.\n */\n@Directive({\n\tselector: 'ntl-editor[formControl], ntl-editor[formControlName], ntl-editor[ngModel]',\n\tstandalone: true,\n})\nexport class NotectlValueAccessorDirective {}\n","import { DestroyRef, Injectable, computed, inject, signal } from '@angular/core';\nimport type { EditorState, StateChangeEvent, Transaction } from '@notectl/core';\nimport { type Observable, Subject } from 'rxjs';\n\nimport type { NotectlEditorComponent } from './notectl-editor.component';\n\n/**\n * Optional injectable service for programmatic editor access via DI.\n *\n * Useful when a toolbar or other component needs to interact with\n * the editor without a direct template reference.\n *\n * The service must be provided at a shared injector level and\n * connected to the editor component via `register()`.\n *\n * @example\n * ```typescript\n * @Component({\n * providers: [NotectlEditorService],\n * template: `\n * <app-toolbar />\n * <ntl-editor #editor [plugins]=\"plugins\" />\n * `,\n * })\n * export class EditorPage {\n * private readonly editor = viewChild.required<NotectlEditorComponent>('editor');\n * private readonly service = inject(NotectlEditorService);\n *\n * constructor() {\n * afterNextRender(() => {\n * this.service.register(this.editor());\n * });\n * }\n * }\n * ```\n */\n@Injectable()\nexport class NotectlEditorService {\n\tprivate readonly destroyRef: DestroyRef = inject(DestroyRef);\n\tprivate readonly editorRef = signal<NotectlEditorComponent | null>(null);\n\tprivate readonly stateChangeSubject = new Subject<StateChangeEvent>();\n\n\t/** Whether an editor is currently registered with this service. */\n\treadonly hasEditor = computed<boolean>(() => this.editorRef() !== null);\n\n\t/** Observable stream of state change events from the editor. */\n\treadonly stateChanges$: Observable<StateChangeEvent> = this.stateChangeSubject.asObservable();\n\n\tprivate stateChangeSub: { unsubscribe(): void } | null = null;\n\n\tconstructor() {\n\t\tthis.destroyRef.onDestroy(() => {\n\t\t\tthis.unregister();\n\t\t\tthis.stateChangeSubject.complete();\n\t\t});\n\t}\n\n\t/** Registers an editor component with this service. */\n\tregister(editor: NotectlEditorComponent): void {\n\t\tthis.unregister();\n\t\tthis.editorRef.set(editor);\n\n\t\tthis.stateChangeSub = editor.stateChange.subscribe((event: StateChangeEvent) => {\n\t\t\tthis.stateChangeSubject.next(event);\n\t\t});\n\t}\n\n\t/** Unregisters the current editor from this service. */\n\tunregister(): void {\n\t\tthis.stateChangeSub?.unsubscribe();\n\t\tthis.stateChangeSub = null;\n\t\tthis.editorRef.set(null);\n\t}\n\n\t/** Executes a named command on the registered editor. */\n\texecuteCommand(name: string): boolean {\n\t\tconst editor: NotectlEditorComponent | null = this.editorRef();\n\t\tif (!editor) return false;\n\t\treturn editor.executeCommand(name);\n\t}\n\n\t/** Returns the current editor state, or `null` if no editor is registered. */\n\tgetState(): EditorState | null {\n\t\tconst editor: NotectlEditorComponent | null = this.editorRef();\n\t\tif (!editor) return null;\n\t\ttry {\n\t\t\treturn editor.getState();\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/** Dispatches a transaction on the registered editor. */\n\tdispatch(tr: Transaction): void {\n\t\tthis.editorRef()?.dispatch(tr);\n\t}\n}\n","/**\n * @notectl/angular — Angular integration for the notectl rich text editor.\n * @packageDocumentation\n */\n\n// --- Angular Bindings ---\nexport { NotectlEditorComponent } from './lib/notectl-editor.component';\nexport { NotectlValueAccessorDirective } from './lib/value-accessor.directive';\nexport { NotectlEditorService } from './lib/notectl-editor.service';\n\n// --- Provider Function ---\nexport {\n\tprovideNotectl,\n\ttype NotectlProviderOptions,\n} from './lib/tokens';\n\n// --- Injection Tokens ---\nexport {\n\tNOTECTL_DEFAULT_CONFIG,\n\tNOTECTL_CONTENT_FORMAT,\n\ttype ContentFormat,\n} from './lib/tokens';\n\n// --- Angular-specific Types ---\nexport type { NotectlValue, SelectionChangeEvent } from './lib/types';\n\n// --- Re-exports from @notectl/core (convenience) ---\n\n// Model types\nexport type {\n\tDocument,\n\tBlockNode,\n\tTextNode,\n\tInlineNode,\n\tMark,\n\tBlockAttrs,\n} from '@notectl/core';\n\n// Selection types\nexport type { EditorSelection, Position, Selection } from '@notectl/core';\n\n// State types\nexport type {\n\tEditorState,\n\tTransaction,\n\tTransactionMetadata,\n\tStateChangeEvent,\n} from '@notectl/core';\n\n// Plugin types\nexport type { Plugin, PluginConfig, PluginContext } from '@notectl/core';\n\n// Theme types\nexport type { Theme, PartialTheme, ThemePrimitives } from '@notectl/core';\nexport { ThemePreset, LIGHT_THEME, DARK_THEME, createTheme } from '@notectl/core';\n\n// Editor config\nexport type { NotectlEditorConfig } from '@notectl/core';\n\n// Plugin config types (from sub-path exports)\nexport type { TextFormattingConfig } from '@notectl/core/plugins/text-formatting';\nexport type { FontDefinition } from '@notectl/core/plugins/font';\n\n// Starter fonts\n/** @deprecated Import from '@notectl/core/fonts' instead. */\nexport { STARTER_FONTS } from '@notectl/core/fonts';\n\n// Plugins (tree-shakable re-exports from sub-paths)\nexport { TextFormattingPlugin } from '@notectl/core/plugins/text-formatting';\nexport { HeadingPlugin } from '@notectl/core/plugins/heading';\nexport { ListPlugin } from '@notectl/core/plugins/list';\nexport { LinkPlugin } from '@notectl/core/plugins/link';\nexport { BlockquotePlugin } from '@notectl/core/plugins/blockquote';\nexport { CodeBlockPlugin } from '@notectl/core/plugins/code-block';\nexport { TablePlugin } from '@notectl/core/plugins/table';\nexport { ImagePlugin } from '@notectl/core/plugins/image';\nexport { HorizontalRulePlugin } from '@notectl/core/plugins/horizontal-rule';\nexport { HardBreakPlugin } from '@notectl/core/plugins/hard-break';\nexport { StrikethroughPlugin } from '@notectl/core/plugins/strikethrough';\nexport { HighlightPlugin } from '@notectl/core/plugins/highlight';\nexport { TextColorPlugin } from '@notectl/core/plugins/text-color';\nexport { FontPlugin } from '@notectl/core/plugins/font';\nexport { FontSizePlugin } from '@notectl/core/plugins/font-size';\nexport { AlignmentPlugin } from '@notectl/core/plugins/alignment';\nexport { TextDirectionPlugin } from '@notectl/core/plugins/text-direction';\nexport { SuperSubPlugin } from '@notectl/core/plugins/super-sub';\nexport { ToolbarPlugin } from '@notectl/core/plugins/toolbar';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@notectl/angular",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.4",
|
|
4
4
|
"description": "Angular integration for the notectl rich text editor. Provides a standalone component, reactive forms support, and DI service.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -43,20 +43,20 @@
|
|
|
43
43
|
"peerDependencies": {
|
|
44
44
|
"@angular/core": ">=21.0.0",
|
|
45
45
|
"@angular/forms": ">=21.0.0",
|
|
46
|
-
"@notectl/core": "^2.0.
|
|
46
|
+
"@notectl/core": "^2.0.4",
|
|
47
47
|
"rxjs": ">=7.0.0"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
|
-
"@angular/compiler": "^21.2.
|
|
51
|
-
"@angular/compiler-cli": "^21.2.
|
|
52
|
-
"@angular/core": "^21.2.
|
|
53
|
-
"@angular/forms": "^21.2.
|
|
54
|
-
"@angular/platform-browser": "^21.2.
|
|
55
|
-
"@angular/platform-browser-dynamic": "^21.2.
|
|
50
|
+
"@angular/compiler": "^21.2.4",
|
|
51
|
+
"@angular/compiler-cli": "^21.2.4",
|
|
52
|
+
"@angular/core": "^21.2.4",
|
|
53
|
+
"@angular/forms": "^21.2.4",
|
|
54
|
+
"@angular/platform-browser": "^21.2.4",
|
|
55
|
+
"@angular/platform-browser-dynamic": "^21.2.4",
|
|
56
56
|
"@notectl/core": "workspace:*",
|
|
57
57
|
"ng-packagr": "^21.2.0",
|
|
58
58
|
"rxjs": "~7.8.2",
|
|
59
|
-
"vite": "^
|
|
60
|
-
"vitest": "^4.0
|
|
59
|
+
"vite": "^8.0.0",
|
|
60
|
+
"vitest": "^4.1.0"
|
|
61
61
|
}
|
|
62
62
|
}
|