@esfaenza/text-editors 20.3.24 → 20.3.26
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 +122 -1
- package/fesm2022/esfaenza-text-editors.mjs +160 -15
- package/fesm2022/esfaenza-text-editors.mjs.map +1 -1
- package/index.d.ts +33 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1 +1,122 @@
|
|
|
1
|
-
# Text Editors
|
|
1
|
+
# Text Editors
|
|
2
|
+
|
|
3
|
+
Libreria che rende disponibile `<es-editor>`, un editor rich-text basato su [tiptap](https://tiptap.dev)
|
|
4
|
+
che produce il proprio valore in HTML, Markdown o testo semplice.
|
|
5
|
+
|
|
6
|
+
## Installazione
|
|
7
|
+
|
|
8
|
+
```
|
|
9
|
+
npm install @esfaenza/text-editors
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
Dipendenze: i pacchetti `@tiptap/*` (versione `3.17.1`), `@floating-ui/dom` e `marked` sono `peerDependencies`
|
|
13
|
+
a versione fissa: vedere `package.json` per l'elenco completo e installarli alle stesse versioni.
|
|
14
|
+
|
|
15
|
+
## Setup
|
|
16
|
+
|
|
17
|
+
Il componente è **standalone**: non c'è un modulo da configurare, basta importarlo dove serve.
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
import { EditorComponent } from "@esfaenza/text-editors";
|
|
21
|
+
|
|
22
|
+
@Component({
|
|
23
|
+
...,
|
|
24
|
+
imports: [FormsModule, EditorComponent]
|
|
25
|
+
})
|
|
26
|
+
export class MyComponent { }
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
In un modulo non standalone si aggiunge `EditorComponent` agli `imports` del modulo.
|
|
30
|
+
|
|
31
|
+
## Utilizzo
|
|
32
|
+
|
|
33
|
+
Il componente è un `ControlValueAccessor`: il valore si legge e si scrive tramite `ngModel` o un form reattivo.
|
|
34
|
+
|
|
35
|
+
```html
|
|
36
|
+
<es-editor Mode="html" name="body" [(ngModel)]="model.body"
|
|
37
|
+
[BulletListSupport]="true" [TablesSupport]="true"></es-editor>
|
|
38
|
+
|
|
39
|
+
<es-editor Mode="markdown" name="note" [(ngModel)]="model.note"
|
|
40
|
+
[MentionEntities]="users"></es-editor>
|
|
41
|
+
|
|
42
|
+
<es-editor readonly Mode="html" name="preview" [(ngModel)]="model.body"></es-editor>
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Input
|
|
46
|
+
|
|
47
|
+
| Input | Tipo | Default | Descrizione |
|
|
48
|
+
|---|---|---|---|
|
|
49
|
+
| `Mode` | `'html' \| 'markdown' \| 'text'` | — (obbligatorio) | Formato del valore prodotto e accettato dall'editor |
|
|
50
|
+
| `name` | `string` | — (obbligatorio) | Nome del controllo |
|
|
51
|
+
| `readonly` | `boolean` | `false` | Nasconde la toolbar e rende il contenuto non modificabile |
|
|
52
|
+
| `BulletListSupport` | `boolean` | `false` | Mostra il pulsante per gli elenchi puntati |
|
|
53
|
+
| `TablesSupport` | `boolean` | `false` | Abilita le tabelle e i relativi pulsanti (solo con `Mode="html"`) |
|
|
54
|
+
| `EmojiSupport` | `boolean` | `false` | Mostra il selettore di emoji |
|
|
55
|
+
| `MentionEntities` | `{ id: string, description: string }[]` | `[]` | Se valorizzato abilita le menzioni con `@` |
|
|
56
|
+
| `style` | `string` | `""` | Stile inline applicato al contenitore dell'editor |
|
|
57
|
+
|
|
58
|
+
`Mode`, `readonly`, `TablesSupport` e `MentionEntities` vengono letti **una sola volta**, all'inizializzazione
|
|
59
|
+
del componente: cambiarli in seguito non riconfigura l'editor. Per cambiarli va ricreato il componente
|
|
60
|
+
(ad esempio con un `@if`).
|
|
61
|
+
|
|
62
|
+
Gli input `disabled` e `required` e gli output `inputChange`, `inputFocus` e `inputFinalized` sono dichiarati
|
|
63
|
+
ma al momento non hanno alcun effetto.
|
|
64
|
+
|
|
65
|
+
### Comportamento come controllo di form
|
|
66
|
+
|
|
67
|
+
- Il caricamento di un valore (da `ngModel` o da `setValue`/`patchValue`) **non** emette un cambio di valore:
|
|
68
|
+
il controllo resta `pristine` finché l'utente non modifica il contenuto. Di conseguenza il valore nel modello
|
|
69
|
+
resta quello caricato (ad esempio senza la rimozione del prefisso descritta sotto) fino alla prima modifica.
|
|
70
|
+
- Il controllo diventa `touched` quando l'editor perde il focus.
|
|
71
|
+
|
|
72
|
+
### Modalità
|
|
73
|
+
|
|
74
|
+
- **`html`**: il valore è l'HTML generato dall'editor. Un editor vuoto produce `""` (non `<p></p>`).
|
|
75
|
+
La toolbar include la scelta del **carattere** (font "web safe": Arial, Verdana, Tahoma, Trebuchet MS,
|
|
76
|
+
Georgia, Times New Roman, Courier New) e della **dimensione** (da 10px a 32px), salvati come
|
|
77
|
+
`<span style="font-family: …; font-size: …">`. L'opzione vuota ("Carattere" / "Dimensione") rimuove lo stile.
|
|
78
|
+
Carattere e dimensione presenti nell'HTML caricato o incollato vengono mantenuti (i `pt` vengono convertiti in `px`).
|
|
79
|
+
- **`markdown`**: il valore è Markdown. Le immagini con larghezza o allineamento personalizzati vengono
|
|
80
|
+
salvate come tag `<img>` HTML all'interno del Markdown. Carattere, dimensione e colore del testo non sono
|
|
81
|
+
rappresentabili in Markdown: la toolbar non li offre e, se presenti nel testo incollato, vanno persi al salvataggio.
|
|
82
|
+
- **`text`**: il valore è il solo testo, senza formattazione.
|
|
83
|
+
|
|
84
|
+
Un valore `null` o `undefined` in ingresso viene trattato come stringa vuota. Un eventuale prefisso iniziale
|
|
85
|
+
`****** ` o `** ` viene rimosso.
|
|
86
|
+
|
|
87
|
+
### Menzioni
|
|
88
|
+
|
|
89
|
+
Con `MentionEntities` valorizzato, digitando `@` compare un elenco (massimo 5 voci) filtrato per inizio della
|
|
90
|
+
`description`; si naviga con le frecce e si conferma con Invio o con un click.
|
|
91
|
+
|
|
92
|
+
In Markdown una menzione viene salvata come `@<id>` e riconosciuta in rilettura **solo se l'`id` è composto
|
|
93
|
+
da esattamente 7 lettere** (come i codici utente, ad es. `@GHETTIE`). Menzioni con id diversi non
|
|
94
|
+
sopravvivono a un salvataggio e successivo caricamento in Markdown.
|
|
95
|
+
|
|
96
|
+
### Immagini
|
|
97
|
+
|
|
98
|
+
Le immagini incollate o trascinate nell'editor vengono **incorporate nel valore come data URI base64**:
|
|
99
|
+
tenerne conto per la dimensione dei dati salvati. Una volta inserita, un'immagine può essere ridimensionata
|
|
100
|
+
con la maniglia e allineata a sinistra, al centro o a destra.
|
|
101
|
+
|
|
102
|
+
### Stili
|
|
103
|
+
|
|
104
|
+
Il componente usa `ViewEncapsulation.None`: le sue regole CSS (`.editor-shell`, `.editor-toolbar`,
|
|
105
|
+
`.ProseMirror`, `.suggestion-popup`, …) sono globali e possono essere sovrascritte dall'applicazione
|
|
106
|
+
che lo ospita.
|
|
107
|
+
|
|
108
|
+
I colori della toolbar e dei controlli sulle immagini passano da custom property definite su `.editor-shell`,
|
|
109
|
+
sovrascrivibili senza toccare le regole:
|
|
110
|
+
|
|
111
|
+
```css
|
|
112
|
+
es-editor .editor-shell {
|
|
113
|
+
--es-editor-border: #e2e4e9; /* bordi, divisori */
|
|
114
|
+
--es-editor-toolbar-bg: #fafbfc; /* sfondo della toolbar */
|
|
115
|
+
--es-editor-text: #1f2328;
|
|
116
|
+
--es-editor-icon: #4b5563; /* icone dei pulsanti */
|
|
117
|
+
--es-editor-hover: #eef0f3; /* sfondo al passaggio del mouse */
|
|
118
|
+
--es-editor-accent: #2342c0; /* pulsante attivo, focus, selezione immagine */
|
|
119
|
+
--es-editor-accent-soft: #e5ebff; /* sfondo del pulsante attivo */
|
|
120
|
+
--es-editor-focus: rgba(35, 66, 192, 0.28);
|
|
121
|
+
}
|
|
122
|
+
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { CommonModule } from '@angular/common';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
|
-
import { viewChild, input, booleanAttribute, EventEmitter, forwardRef, Output, ViewEncapsulation, Component, InjectionToken } from '@angular/core';
|
|
3
|
+
import { viewChild, input, booleanAttribute, signal, EventEmitter, forwardRef, HostListener, Output, ViewEncapsulation, Component, InjectionToken } from '@angular/core';
|
|
4
4
|
import * as i1 from '@angular/forms';
|
|
5
5
|
import { FormsModule, NG_VALUE_ACCESSOR, NG_VALIDATORS } from '@angular/forms';
|
|
6
6
|
import { Extension, Editor } from '@tiptap/core';
|
|
@@ -163,7 +163,8 @@ const CustomImageWithView = CustomImage.extend({
|
|
|
163
163
|
let updateWrapper = (wrapper, node) => {
|
|
164
164
|
wrapper.draggable = true;
|
|
165
165
|
wrapper.contentEditable = "false";
|
|
166
|
-
|
|
166
|
+
// classList e non className: non deve cancellare "ProseMirror-selectednode" messa da ProseMirror sull'immagine selezionata
|
|
167
|
+
wrapper.classList.add(`img-wrapper`);
|
|
167
168
|
wrapper.style.float = node.attrs.float;
|
|
168
169
|
if (node.attrs.float === 'left' || node.attrs.float === 'right') {
|
|
169
170
|
wrapper.style.width = "auto";
|
|
@@ -180,17 +181,35 @@ const CustomImageWithView = CustomImage.extend({
|
|
|
180
181
|
updateImage(img, node);
|
|
181
182
|
const toolbar = document.createElement('div');
|
|
182
183
|
toolbar.className = `img-toolbar ${editor.isEditable ? '' : 'readonly'}`;
|
|
183
|
-
const btn = (
|
|
184
|
+
const btn = (title, icon, fn) => {
|
|
184
185
|
const b = document.createElement('button');
|
|
185
186
|
b.type = "button";
|
|
186
|
-
b.
|
|
187
|
+
b.title = title;
|
|
188
|
+
b.setAttribute("aria-label", title);
|
|
189
|
+
b.innerHTML = `<svg viewBox="0 0 24 24" aria-hidden="true"><path d="${icon}" /></svg>`;
|
|
187
190
|
b.onclick = fn;
|
|
188
191
|
return b;
|
|
189
192
|
};
|
|
190
|
-
|
|
193
|
+
const setFloat = (float) => editor.view.dispatch(editor.view.state.tr.setNodeMarkup(getPos(), undefined, { ...node.attrs, ...{ float } }));
|
|
194
|
+
// Pulsanti di allineamento, indicizzati per valore di "float" per evidenziare quello attivo
|
|
195
|
+
const alignButtons = {
|
|
196
|
+
left: btn('Allinea a sinistra', 'M15 12H3M17 18H3M21 6H3', () => setFloat('left')),
|
|
197
|
+
none: btn('Centra', 'M17 12H7M19 18H5M21 6H3', () => setFloat('none')),
|
|
198
|
+
right: btn('Allinea a destra', 'M21 12H9M21 18H7M21 6H3', () => setFloat('right')),
|
|
199
|
+
};
|
|
200
|
+
const separator = document.createElement('span');
|
|
201
|
+
separator.className = 'img-toolbar-divider';
|
|
202
|
+
const deleteButton = btn('Elimina immagine', 'M3 6h18M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2M10 11v6M14 11v6', () => {
|
|
191
203
|
const nodePos = getPos();
|
|
192
204
|
editor.view.dispatch(editor.view.state.tr.delete(nodePos, nodePos + node.nodeSize));
|
|
193
|
-
})
|
|
205
|
+
});
|
|
206
|
+
deleteButton.classList.add('danger');
|
|
207
|
+
toolbar.append(alignButtons['left'], alignButtons['none'], alignButtons['right'], separator, deleteButton);
|
|
208
|
+
const updateToolbar = (node) => {
|
|
209
|
+
const float = node.attrs.float === 'left' || node.attrs.float === 'right' ? node.attrs.float : 'none';
|
|
210
|
+
Object.entries(alignButtons).forEach(([key, b]) => b.classList.toggle('is-active', key === float));
|
|
211
|
+
};
|
|
212
|
+
updateToolbar(node);
|
|
194
213
|
// resize
|
|
195
214
|
let startX = 0;
|
|
196
215
|
let startW = 0;
|
|
@@ -232,6 +251,7 @@ const CustomImageWithView = CustomImage.extend({
|
|
|
232
251
|
node = updatedNode;
|
|
233
252
|
updateImage(img, node);
|
|
234
253
|
updateWrapper(wrapper, node);
|
|
254
|
+
updateToolbar(node);
|
|
235
255
|
return true;
|
|
236
256
|
},
|
|
237
257
|
};
|
|
@@ -416,9 +436,32 @@ class EditorComponent {
|
|
|
416
436
|
this.style = input("", ...(ngDevMode ? [{ debugName: "style" }] : []));
|
|
417
437
|
this.MentionEntities = input([], ...(ngDevMode ? [{ debugName: "MentionEntities" }] : []));
|
|
418
438
|
this.name = input.required(...(ngDevMode ? [{ debugName: "name" }] : []));
|
|
439
|
+
// Font disponibili nella toolbar (solo html): font "web safe", perché il valore viene visualizzato anche fuori dall'editor
|
|
440
|
+
this.FontFamilies = [
|
|
441
|
+
{ label: "Arial", value: "Arial, Helvetica, sans-serif" },
|
|
442
|
+
{ label: "Verdana", value: "Verdana, Geneva, sans-serif" },
|
|
443
|
+
{ label: "Tahoma", value: "Tahoma, Geneva, sans-serif" },
|
|
444
|
+
{ label: "Trebuchet MS", value: "'Trebuchet MS', Helvetica, sans-serif" },
|
|
445
|
+
{ label: "Georgia", value: "Georgia, serif" },
|
|
446
|
+
{ label: "Times New Roman", value: "'Times New Roman', Times, serif" },
|
|
447
|
+
{ label: "Courier New", value: "'Courier New', Courier, monospace" },
|
|
448
|
+
];
|
|
449
|
+
this.FontSizes = ["10px", "12px", "14px", "16px", "18px", "20px", "24px", "28px", "32px"];
|
|
450
|
+
// Stato della selezione corrente, per evidenziare/abilitare i comandi della toolbar. Aggiornato a ogni transazione
|
|
451
|
+
this.Toolbar = signal(EMPTY_TOOLBAR_STATE, ...(ngDevMode ? [{ debugName: "Toolbar" }] : []));
|
|
452
|
+
// Menu delle tabelle: menu custom e non <select>, perché su alcuni browser la select nativa usata come menu
|
|
453
|
+
// di azioni non permetteva di scegliere le voci. Posizione fixed calcolata dal pulsante: .editor-shell ha
|
|
454
|
+
// overflow hidden e taglierebbe un menu posizionato in absolute. null = chiuso
|
|
455
|
+
this.TableMenu = signal(null, ...(ngDevMode ? [{ debugName: "TableMenu" }] : []));
|
|
456
|
+
this.tableMenuRef = viewChild("tableMenu", ...(ngDevMode ? [{ debugName: "tableMenuRef" }] : []));
|
|
419
457
|
this.inputChange = new EventEmitter();
|
|
420
458
|
this.inputFocus = new EventEmitter();
|
|
421
459
|
this.inputFinalized = new EventEmitter();
|
|
460
|
+
this.positionTableMenu = () => {
|
|
461
|
+
const rect = this.tableMenuButton?.getBoundingClientRect();
|
|
462
|
+
if (rect)
|
|
463
|
+
this.TableMenu.set({ top: rect.bottom + 4, left: rect.left });
|
|
464
|
+
};
|
|
422
465
|
}
|
|
423
466
|
registerOnChange(fn) { this.onChange = fn; }
|
|
424
467
|
registerOnTouched(fn) { this.onTouched = fn; }
|
|
@@ -454,6 +497,8 @@ class EditorComponent {
|
|
|
454
497
|
element: this.element().nativeElement,
|
|
455
498
|
extensions: config,
|
|
456
499
|
editable: !this.readonly(),
|
|
500
|
+
onBlur: () => this.onTouched(),
|
|
501
|
+
onTransaction: () => this.updateToolbarState(),
|
|
457
502
|
onUpdate: (_) => {
|
|
458
503
|
let value = "";
|
|
459
504
|
switch (this.Mode()) {
|
|
@@ -482,13 +527,48 @@ class EditorComponent {
|
|
|
482
527
|
// normalizzazione per la firma di merda di CEA
|
|
483
528
|
this.value = this.value?.replace(/^\*\*\*\*\*\*\s\s/g, '') || "";
|
|
484
529
|
this.value = this.value?.replace(/^\*\*\s\s/g, '') || "";
|
|
485
|
-
|
|
530
|
+
// Il caricamento di un valore non è una modifica dell'utente: niente evento di update,
|
|
531
|
+
// quindi niente onChange e il controllo resta pristine
|
|
486
532
|
if (this.Mode() === "markdown")
|
|
487
|
-
this.EditorRef?.commands.setContent(this.value, { contentType: "markdown" });
|
|
533
|
+
this.EditorRef?.commands.setContent(this.value, { contentType: "markdown", emitUpdate: false });
|
|
488
534
|
else if (this.Mode() === "html")
|
|
489
|
-
this.EditorRef?.commands.setContent(this.value, { contentType: "html" });
|
|
535
|
+
this.EditorRef?.commands.setContent(this.value, { contentType: "html", emitUpdate: false });
|
|
536
|
+
else
|
|
537
|
+
this.EditorRef?.chain().setMeta("preventUpdate", true).clearContent(false).insertContent(this.value).run();
|
|
538
|
+
}
|
|
539
|
+
updateToolbarState() {
|
|
540
|
+
const editor = this.EditorRef;
|
|
541
|
+
if (!editor)
|
|
542
|
+
return;
|
|
543
|
+
const attrs = editor.getAttributes("textStyle");
|
|
544
|
+
const level = [1, 2, 3, 4, 5, 6].find(l => editor.isActive("heading", { level: l }));
|
|
545
|
+
this.Toolbar.set({
|
|
546
|
+
block: level ? `h${level}` : "paragraph",
|
|
547
|
+
// "" = predefinito, misto o non in elenco
|
|
548
|
+
fontFamily: this.FontFamilies.find(f => sameFontFamily(f.value, attrs["fontFamily"]))?.value || "",
|
|
549
|
+
fontSize: this.FontSizes.find(s => s === attrs["fontSize"]) || "",
|
|
550
|
+
bold: editor.isActive("bold"),
|
|
551
|
+
italic: editor.isActive("italic"),
|
|
552
|
+
underline: editor.isActive("underline"),
|
|
553
|
+
bulletList: editor.isActive("bulletList"),
|
|
554
|
+
inTable: this.TablesSupport() && editor.can().deleteTable(),
|
|
555
|
+
canUndo: editor.can().undo(),
|
|
556
|
+
canRedo: editor.can().redo(),
|
|
557
|
+
});
|
|
558
|
+
}
|
|
559
|
+
setFontFamily(selectElement) {
|
|
560
|
+
const value = selectElement.target.value;
|
|
561
|
+
if (value)
|
|
562
|
+
this.EditorRef?.chain().focus().setFontFamily(value).run();
|
|
563
|
+
else
|
|
564
|
+
this.EditorRef?.chain().focus().unsetFontFamily().run();
|
|
565
|
+
}
|
|
566
|
+
setFontSize(selectElement) {
|
|
567
|
+
const value = selectElement.target.value;
|
|
568
|
+
if (value)
|
|
569
|
+
this.EditorRef?.chain().focus().setFontSize(value).run();
|
|
490
570
|
else
|
|
491
|
-
this.EditorRef?.
|
|
571
|
+
this.EditorRef?.chain().focus().unsetFontSize().run();
|
|
492
572
|
}
|
|
493
573
|
setTypography(selectElement) {
|
|
494
574
|
const select = selectElement.target;
|
|
@@ -500,7 +580,6 @@ class EditorComponent {
|
|
|
500
580
|
this.EditorRef?.chain().focus().setHeading({ level: parseInt(select.value.charAt(1)) }).run();
|
|
501
581
|
break;
|
|
502
582
|
}
|
|
503
|
-
select.value = "";
|
|
504
583
|
}
|
|
505
584
|
setBold() {
|
|
506
585
|
this.EditorRef?.chain().focus().toggleBold().run();
|
|
@@ -538,30 +617,96 @@ class EditorComponent {
|
|
|
538
617
|
deleteColumn() {
|
|
539
618
|
this.EditorRef?.chain().focus().deleteColumn().run();
|
|
540
619
|
}
|
|
620
|
+
toggleTableMenu(button) {
|
|
621
|
+
if (this.TableMenu()) {
|
|
622
|
+
this.closeTableMenu();
|
|
623
|
+
return;
|
|
624
|
+
}
|
|
625
|
+
this.tableMenuButton = button;
|
|
626
|
+
this.positionTableMenu();
|
|
627
|
+
// Il menu segue il pulsante: scroll in capture per intercettare anche i contenitori scrollabili, non solo la pagina
|
|
628
|
+
window.addEventListener("scroll", this.positionTableMenu, true);
|
|
629
|
+
window.addEventListener("resize", this.positionTableMenu);
|
|
630
|
+
}
|
|
631
|
+
tableAction(action) {
|
|
632
|
+
this.closeTableMenu();
|
|
633
|
+
switch (action) {
|
|
634
|
+
case "insert":
|
|
635
|
+
this.addTable();
|
|
636
|
+
break;
|
|
637
|
+
case "addRow":
|
|
638
|
+
this.addRow();
|
|
639
|
+
break;
|
|
640
|
+
case "deleteRow":
|
|
641
|
+
this.deleteRow();
|
|
642
|
+
break;
|
|
643
|
+
case "addColumn":
|
|
644
|
+
this.addColumn();
|
|
645
|
+
break;
|
|
646
|
+
case "deleteColumn":
|
|
647
|
+
this.deleteColumn();
|
|
648
|
+
break;
|
|
649
|
+
case "delete":
|
|
650
|
+
this.deleteTable();
|
|
651
|
+
break;
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
// Chiusura del menu tabelle: click fuori o Esc
|
|
655
|
+
onDocumentMouseDown(event) {
|
|
656
|
+
if (this.TableMenu() && !this.tableMenuRef()?.nativeElement.contains(event.target))
|
|
657
|
+
this.closeTableMenu();
|
|
658
|
+
}
|
|
659
|
+
closeTableMenu() {
|
|
660
|
+
if (!this.TableMenu())
|
|
661
|
+
return;
|
|
662
|
+
this.TableMenu.set(null);
|
|
663
|
+
window.removeEventListener("scroll", this.positionTableMenu, true);
|
|
664
|
+
window.removeEventListener("resize", this.positionTableMenu);
|
|
665
|
+
}
|
|
666
|
+
ngOnDestroy() {
|
|
667
|
+
this.closeTableMenu();
|
|
668
|
+
}
|
|
541
669
|
setEmoji(selectElement) {
|
|
542
670
|
const select = selectElement.target;
|
|
543
671
|
this.EditorRef?.chain().focus().insertContent(select.value).run();
|
|
544
672
|
select.value = "";
|
|
545
673
|
}
|
|
546
674
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: EditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
547
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: EditorComponent, isStandalone: true, selector: "es-editor", inputs: { EmojiSupport: { classPropertyName: "EmojiSupport", publicName: "EmojiSupport", isSignal: true, isRequired: false, transformFunction: null }, BulletListSupport: { classPropertyName: "BulletListSupport", publicName: "BulletListSupport", isSignal: true, isRequired: false, transformFunction: null }, TablesSupport: { classPropertyName: "TablesSupport", publicName: "TablesSupport", isSignal: true, isRequired: false, transformFunction: null }, Mode: { classPropertyName: "Mode", publicName: "Mode", isSignal: true, isRequired: true, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, style: { classPropertyName: "style", publicName: "style", isSignal: true, isRequired: false, transformFunction: null }, MentionEntities: { classPropertyName: "MentionEntities", publicName: "MentionEntities", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { inputChange: "inputChange", inputFocus: "inputFocus", inputFinalized: "inputFinalized" }, providers: [
|
|
675
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: EditorComponent, isStandalone: true, selector: "es-editor", inputs: { EmojiSupport: { classPropertyName: "EmojiSupport", publicName: "EmojiSupport", isSignal: true, isRequired: false, transformFunction: null }, BulletListSupport: { classPropertyName: "BulletListSupport", publicName: "BulletListSupport", isSignal: true, isRequired: false, transformFunction: null }, TablesSupport: { classPropertyName: "TablesSupport", publicName: "TablesSupport", isSignal: true, isRequired: false, transformFunction: null }, Mode: { classPropertyName: "Mode", publicName: "Mode", isSignal: true, isRequired: true, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, style: { classPropertyName: "style", publicName: "style", isSignal: true, isRequired: false, transformFunction: null }, MentionEntities: { classPropertyName: "MentionEntities", publicName: "MentionEntities", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { inputChange: "inputChange", inputFocus: "inputFocus", inputFinalized: "inputFinalized" }, host: { listeners: { "document:mousedown": "onDocumentMouseDown($event)", "document:keydown.escape": "closeTableMenu()" } }, providers: [
|
|
548
676
|
{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => EditorComponent), multi: true },
|
|
549
677
|
{ provide: NG_VALIDATORS, useExisting: forwardRef(() => EditorComponent), multi: true }
|
|
550
|
-
], viewQueries: [{ propertyName: "element", first: true, predicate: ["element"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"editor-shell\" [class.readonly]=\"readonly()\" [attr.style]=\"style()\">\r\n @if(!readonly()){\r\n <div class=\"editor-toolbar\">\r\n\r\n <!-- Typography -->\r\n <select id=\"heading-select\" (change)=\"setTypography($event)\">\r\n <option value=\"\" selected hidden>Pragrafo</option>\r\n <option value=\"paragraph\">Pragrafo</option>\r\n <option value=\"h1\">Intestazione 1</option>\r\n <option value=\"h2\">Intestazione 2</option>\r\n <option value=\"h3\">Intestazione 3</option>\r\n <option value=\"h4\">Intestazione 4</option>\r\n <option value=\"h5\">Intestazione 5</option>\r\n <option value=\"h6\">Intestazione 6</option>\r\n </select>\r\n\r\n <div class=\"divider\"></div>\r\n\r\n <!-- Formatting -->\r\n <button type=\"button\" (click)=\"setBold()\"><b>B</b></button>\r\n <button type=\"button\" (click)=\"setItalic()\"><i>I</i></button>\r\n <button type=\"button\" (click)=\"setUnderlined()\"><u>U</u></button>\r\n\r\n <!-- Lists -->\r\n @if(BulletListSupport()){\r\n <button type=\"button\" (click)=\"setBulletList()\">\u2022 Lista</button>\r\n }\r\n\r\n <div class=\"divider\"></div>\r\n\r\n @if(Mode() == \"html\" && TablesSupport())\r\n {\r\n <button type=\"button\" (click)=\"addTable()\">\u229E<span style=\"font-size: 10px;\">\u271A</span></button>\r\n <button type=\"button\" (click)=\"deleteTable()\">\u229E<span style=\"font-size: 10px;\">\u25AC</span></button>\r\n <button type=\"button\" (click)=\"addRow()\">\uD83D\uDDA8<span style=\"font-size: 10px;\">\u271A</span></button>\r\n <button type=\"button\" (click)=\"deleteRow()\">\uD83D\uDDA8<span style=\"font-size: 10px;\">\u25AC</span></button>\r\n <button type=\"button\" (click)=\"addColumn()\">\uD83D\uDDC4<span style=\"font-size: 10px;\">\u271A</span></button>\r\n <button type=\"button\" (click)=\"deleteColumn()\">\uD83D\uDDC4<span style=\"font-size: 10px;\">\u25AC</span></button>\r\n <div class=\"divider\"></div>\r\n }\r\n\r\n <!-- History -->\r\n <button type=\"button\" (click)=\"undoAction()\">\u21B6</button>\r\n <button type=\"button\" (click)=\"redoAction()\">\u21B7</button>\r\n\r\n @if(EmojiSupport()){\r\n <select id=\"emoji-select\" (change)=\"setEmoji($event)\">\r\n <option value=\"\" hidden selected>\uD83D\uDE0A</option>\r\n <option value=\"\uD83D\uDE0A\">\uD83D\uDE0A</option>\r\n <option value=\"\uD83D\uDE00\">\uD83D\uDE00</option>\r\n <option value=\"\uD83D\uDE02\">\uD83D\uDE02</option>\r\n <option value=\"\uD83D\uDD25\">\uD83D\uDD25</option>\r\n <option value=\"\uD83C\uDF89\">\uD83C\uDF89</option>\r\n <option value=\"\uD83D\uDE80\">\uD83D\uDE80</option>\r\n <option value=\"\u2764\uFE0F\">\u2764\uFE0F</option>\r\n <option value=\"\uD83D\uDC4D\">\uD83D\uDC4D</option>\r\n </select>\r\n }\r\n </div>\r\n }\r\n <div #element></div>\r\n</div>", styles: [".editor-shell{border:1px solid #dcdcdc;border-radius:10px;background:#fff;overflow:hidden;isolation:isolate;box-shadow:0 1px 2px #0000000a,0 6px 24px #0000000d;font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}.editor-shell.readonly{border:none;overflow:visible;box-shadow:none}.editor-toolbar{display:flex;align-items:center;gap:4px;padding:4px;background:linear-gradient(to bottom,#fafafa,#f3f3f3);border-bottom:1px solid #e5e5e5;flex-wrap:wrap}.editor-toolbar button{display:inline-flex;align-items:center;justify-content:center;line-height:1;min-width:36px;height:36px;padding:0 12px;border:1px solid #ddd;border-radius:8px;background:transparent;color:#333;font-size:18px;font-weight:500;cursor:pointer;transition:background .12s ease,border-color .12s ease,color .12s ease}.editor-toolbar button:hover{background:#e9e9e9}.editor-toolbar button:active{transform:translateY(1px)}.editor-toolbar button.is-active{background:#dfe7ff;border-color:#c7d2fe;color:#2342c0}.editor-toolbar select{height:36px;padding:0 12px;border:1px solid #d6d6d6;border-radius:8px;background:#fff;font-size:14px;color:#222;cursor:pointer;transition:border-color .12s ease,box-shadow .12s ease,background .12s ease}.editor-toolbar select:hover{background:#fafafa}.editor-toolbar select:focus{outline:none;border-color:#8ba8ff;box-shadow:0 0 0 3px #6082ff26}.editor-toolbar .divider{width:1px;height:24px;background:#ddd;margin:0 2px}.ProseMirror{min-height:60px;padding:12px;outline:none;font-size:16px;line-height:1.7;color:#1f1f1f;caret-color:#2563eb}.ProseMirror h1,.ProseMirror h2,.ProseMirror h3{line-height:1.2;margin-top:.8em;margin-bottom:.4em;font-weight:700;letter-spacing:-.02em}.ProseMirror h1{font-size:2rem}.ProseMirror h2{font-size:1.5rem}.ProseMirror h3{font-size:1.25rem}.ProseMirror p{margin:0}.ProseMirror ul,.ProseMirror ol{padding-left:1.5rem;margin:5px 0}.ProseMirror li{margin:0}.ProseMirror blockquote{margin:1.4rem 0;padding-left:1rem;border-left:4px solid #c7d2fe;color:#555}.ProseMirror code{background:#f3f4f6;color:#d63384;padding:.15em .35em;border-radius:4px;font-size:.92em}.ProseMirror pre{background:#1f2937;color:#f9fafb;padding:16px 18px;border-radius:10px;overflow-x:auto;margin:1.2rem 0}.ProseMirror pre code{background:transparent;color:inherit;padding:0}.ProseMirror a{color:#2563eb;text-decoration:underline}.ProseMirror hr{border:none;border-top:1px solid #e2e2e2;margin:2rem 0}.ProseMirror table{width:100%;border-collapse:collapse;margin:1.2rem 0}.ProseMirror th,.ProseMirror td{border:1px solid #ddd;padding:5px;position:relative}.ProseMirror th{background:#f5f5f5;text-align:left}.ProseMirror .column-resize-handle{position:absolute;top:0;right:-2px;width:5px;height:100%;cursor:col-resize;background:transparent;z-index:20}.ProseMirror ::selection{background:#6082ff40}.suggestion-popup{display:flex;flex-direction:column;min-width:220px;padding:6px;background:#fff;z-index:99999999;border:1px solid #e5e5e5;border-radius:10px;box-shadow:0 12px 30px #00000014,0 2px 8px #0000000d}.suggestion-popup button{border:none;background:transparent;border-radius:8px;padding:8px 10px;text-align:left;cursor:pointer;font-size:14px}.suggestion-popup button:hover,.suggestion-popup button.is-selected{background:#eef2ff}.mention{display:inline-flex;align-items:center;background:#eef2ff;color:#304ffe;padding:2px 6px;border-radius:5px;font-weight:500}.img-wrapper{position:relative;display:inline-block;margin:12px 0}.img-wrapper img{max-width:100%;border-radius:10px;transition:opacity .2s ease}.img-toolbar{position:absolute;top:8px;left:8px;display:flex;gap:6px;background:#fffffff2;border:1px solid #e5e5e5;border-radius:8px;padding:4px;box-shadow:0 8px 20px #00000014}.img-toolbar.readonly{display:none}.img-toolbar button{border:none;background:transparent;padding:4px 6px;cursor:pointer;font-size:12px}.img-toolbar button:hover{background:#eef2ff;border-radius:6px}.img-resize-handle{position:absolute;right:0;bottom:0;width:12px;height:12px;background:#2563eb;border-radius:3px;cursor:se-resize}.img-resize-handle.readonly{display:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
678
|
+
], viewQueries: [{ propertyName: "element", first: true, predicate: ["element"], descendants: true, isSignal: true }, { propertyName: "tableMenuRef", first: true, predicate: ["tableMenu"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"editor-shell\" [class.readonly]=\"readonly()\" [attr.style]=\"style()\">\r\n @if(!readonly()){\r\n <!-- (mousedown) preventDefault sui pulsanti: il click non toglie il focus all'editor, quindi la selezione resta visibile -->\r\n <div class=\"editor-toolbar\" role=\"toolbar\" aria-label=\"Formattazione\">\r\n\r\n <!-- Typography -->\r\n <select class=\"heading-select\" title=\"Stile del paragrafo\" (change)=\"setTypography($event)\">\r\n <option value=\"paragraph\" [selected]=\"Toolbar().block == 'paragraph'\">Paragrafo</option>\r\n <option value=\"h1\" [selected]=\"Toolbar().block == 'h1'\">Intestazione 1</option>\r\n <option value=\"h2\" [selected]=\"Toolbar().block == 'h2'\">Intestazione 2</option>\r\n <option value=\"h3\" [selected]=\"Toolbar().block == 'h3'\">Intestazione 3</option>\r\n <option value=\"h4\" [selected]=\"Toolbar().block == 'h4'\">Intestazione 4</option>\r\n <option value=\"h5\" [selected]=\"Toolbar().block == 'h5'\">Intestazione 5</option>\r\n <option value=\"h6\" [selected]=\"Toolbar().block == 'h6'\">Intestazione 6</option>\r\n </select>\r\n\r\n <!-- Font: solo html, il markdown non ha una sintassi per rappresentarli -->\r\n @if(Mode() == \"html\"){\r\n <select class=\"font-family-select\" title=\"Carattere\" (change)=\"setFontFamily($event)\">\r\n <option value=\"\" [selected]=\"Toolbar().fontFamily == ''\">Carattere</option>\r\n @for(f of FontFamilies; track f.value){\r\n <option [value]=\"f.value\" [selected]=\"Toolbar().fontFamily == f.value\" [style.font-family]=\"f.value\">{{ f.label }}</option>\r\n }\r\n </select>\r\n <select class=\"font-size-select\" title=\"Dimensione\" (change)=\"setFontSize($event)\">\r\n <option value=\"\" [selected]=\"Toolbar().fontSize == ''\">Dimensione</option>\r\n @for(s of FontSizes; track s){\r\n <option [value]=\"s\" [selected]=\"Toolbar().fontSize == s\">{{ s }}</option>\r\n }\r\n </select>\r\n }\r\n\r\n <div class=\"divider\"></div>\r\n\r\n <!-- Formatting -->\r\n <button type=\"button\" class=\"tb-btn\" title=\"Grassetto\" aria-label=\"Grassetto\" [class.is-active]=\"Toolbar().bold\" [attr.aria-pressed]=\"Toolbar().bold\" (mousedown)=\"$event.preventDefault()\" (click)=\"setBold()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8\" /></svg>\r\n </button>\r\n <button type=\"button\" class=\"tb-btn\" title=\"Corsivo\" aria-label=\"Corsivo\" [class.is-active]=\"Toolbar().italic\" [attr.aria-pressed]=\"Toolbar().italic\" (mousedown)=\"$event.preventDefault()\" (click)=\"setItalic()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M19 4h-9M14 20H5M15 4 9 20\" /></svg>\r\n </button>\r\n <button type=\"button\" class=\"tb-btn\" title=\"Sottolineato\" aria-label=\"Sottolineato\" [class.is-active]=\"Toolbar().underline\" [attr.aria-pressed]=\"Toolbar().underline\" (mousedown)=\"$event.preventDefault()\" (click)=\"setUnderlined()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M6 4v6a6 6 0 0 0 12 0V4M4 20h16\" /></svg>\r\n </button>\r\n\r\n <!-- Lists -->\r\n @if(BulletListSupport()){\r\n <button type=\"button\" class=\"tb-btn\" title=\"Elenco puntato\" aria-label=\"Elenco puntato\" [class.is-active]=\"Toolbar().bulletList\" [attr.aria-pressed]=\"Toolbar().bulletList\" (mousedown)=\"$event.preventDefault()\" (click)=\"setBulletList()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M9 6h11M9 12h11M9 18h11M4 6h.01M4 12h.01M4 18h.01\" /></svg>\r\n </button>\r\n }\r\n\r\n <!-- Tables: un unico menu, le voci che agiscono su una tabella esistente sono attive solo con il cursore al suo interno -->\r\n @if(Mode() == \"html\" && TablesSupport()){\r\n <div class=\"divider\"></div>\r\n <div class=\"tb-dropdown\" #tableMenu>\r\n <button #tableMenuButton type=\"button\" class=\"tb-btn tb-btn-text\" title=\"Tabella\" aria-haspopup=\"menu\" [class.is-active]=\"!!TableMenu()\" [attr.aria-expanded]=\"!!TableMenu()\" (mousedown)=\"$event.preventDefault()\" (click)=\"toggleTableMenu(tableMenuButton)\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" /><path d=\"M3 9h18M3 15h18M12 3v18\" /></svg>\r\n <span>Tabella</span>\r\n <svg class=\"chevron\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"m6 9 6 6 6-6\" /></svg>\r\n </button>\r\n @if(TableMenu(); as pos){\r\n <div class=\"tb-dropdown-menu\" role=\"menu\" [style.top.px]=\"pos.top\" [style.left.px]=\"pos.left\">\r\n <button type=\"button\" role=\"menuitem\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('insert')\">Inserisci tabella</button>\r\n <div class=\"tb-dropdown-separator\"></div>\r\n <button type=\"button\" role=\"menuitem\" [disabled]=\"!Toolbar().inTable\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('addRow')\">Aggiungi riga sotto</button>\r\n <button type=\"button\" role=\"menuitem\" [disabled]=\"!Toolbar().inTable\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('addColumn')\">Aggiungi colonna a destra</button>\r\n <div class=\"tb-dropdown-separator\"></div>\r\n <button type=\"button\" role=\"menuitem\" class=\"danger\" [disabled]=\"!Toolbar().inTable\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('deleteRow')\">Elimina riga</button>\r\n <button type=\"button\" role=\"menuitem\" class=\"danger\" [disabled]=\"!Toolbar().inTable\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('deleteColumn')\">Elimina colonna</button>\r\n <button type=\"button\" role=\"menuitem\" class=\"danger\" [disabled]=\"!Toolbar().inTable\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('delete')\">Elimina tabella</button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"divider\"></div>\r\n\r\n <!-- History -->\r\n <button type=\"button\" class=\"tb-btn\" title=\"Annulla\" aria-label=\"Annulla\" [disabled]=\"!Toolbar().canUndo\" (mousedown)=\"$event.preventDefault()\" (click)=\"undoAction()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M9 14 4 9l5-5\" /><path d=\"M4 9h10.5a5.5 5.5 0 0 1 0 11H11\" /></svg>\r\n </button>\r\n <button type=\"button\" class=\"tb-btn\" title=\"Ripeti\" aria-label=\"Ripeti\" [disabled]=\"!Toolbar().canRedo\" (mousedown)=\"$event.preventDefault()\" (click)=\"redoAction()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"m15 14 5-5-5-5\" /><path d=\"M20 9H9.5a5.5 5.5 0 0 0 0 11H13\" /></svg>\r\n </button>\r\n\r\n @if(EmojiSupport()){\r\n <select class=\"emoji-select\" title=\"Emoji\" aria-label=\"Emoji\" (change)=\"setEmoji($event)\">\r\n <option value=\"\" hidden selected>\uD83D\uDE0A</option>\r\n <option value=\"\uD83D\uDE0A\">\uD83D\uDE0A</option>\r\n <option value=\"\uD83D\uDE00\">\uD83D\uDE00</option>\r\n <option value=\"\uD83D\uDE02\">\uD83D\uDE02</option>\r\n <option value=\"\uD83D\uDD25\">\uD83D\uDD25</option>\r\n <option value=\"\uD83C\uDF89\">\uD83C\uDF89</option>\r\n <option value=\"\uD83D\uDE80\">\uD83D\uDE80</option>\r\n <option value=\"\u2764\uFE0F\">\u2764\uFE0F</option>\r\n <option value=\"\uD83D\uDC4D\">\uD83D\uDC4D</option>\r\n </select>\r\n }\r\n </div>\r\n }\r\n <div #element></div>\r\n</div>\r\n", styles: [".editor-shell{--es-editor-border: #e2e4e9;--es-editor-toolbar-bg: #fafbfc;--es-editor-text: #1f2328;--es-editor-icon: #4b5563;--es-editor-hover: #eef0f3;--es-editor-accent: #2342c0;--es-editor-accent-soft: #e5ebff;--es-editor-focus: rgba(35, 66, 192, .28);border:1px solid var(--es-editor-border);border-radius:10px;background:#fff;overflow:hidden;isolation:isolate;box-shadow:0 1px 2px #0000000a,0 6px 24px #0000000d;font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}.editor-shell.readonly{border:none;overflow:visible;box-shadow:none}.editor-toolbar{display:flex;align-items:center;flex-wrap:wrap;gap:2px;padding:6px 8px;background:var(--es-editor-toolbar-bg);border-bottom:1px solid var(--es-editor-border);font-size:13px;color:var(--es-editor-text)}.editor-toolbar svg{width:18px;height:18px;flex:none;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.editor-toolbar .tb-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:none;border-radius:6px;background:transparent;color:var(--es-editor-icon);cursor:pointer;transition:background .12s ease,color .12s ease}.editor-toolbar .tb-btn:hover:not(:disabled){background:var(--es-editor-hover);color:var(--es-editor-text)}.editor-toolbar .tb-btn.is-active{background:var(--es-editor-accent-soft);color:var(--es-editor-accent)}.editor-toolbar .tb-btn:disabled{opacity:.35;cursor:default}.editor-toolbar .tb-btn:focus-visible{outline:none;box-shadow:0 0 0 3px var(--es-editor-focus)}.editor-toolbar select{height:32px;padding:0 28px 0 10px;border:1px solid var(--es-editor-border);border-radius:6px;appearance:none;background:#fff url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236b7280' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E\") no-repeat right 8px center/14px;font:inherit;color:var(--es-editor-text);cursor:pointer;transition:border-color .12s ease,box-shadow .12s ease}.editor-toolbar select:hover{border-color:#c9cdd4}.editor-toolbar select:focus-visible{outline:none;border-color:var(--es-editor-accent);box-shadow:0 0 0 3px var(--es-editor-focus)}.editor-toolbar .heading-select{width:136px}.editor-toolbar .font-family-select{width:148px;margin-left:4px}.editor-toolbar .font-size-select{width:112px;margin-left:4px}.editor-toolbar .emoji-select{width:44px;padding:0 0 0 10px;border-color:transparent;background:transparent;font-size:16px}.editor-toolbar .emoji-select:hover{border-color:transparent;background:var(--es-editor-hover)}.editor-toolbar .tb-btn.tb-btn-text{width:auto;gap:6px;padding:0 6px 0 8px;font:inherit}.editor-toolbar .tb-btn.tb-btn-text .chevron{width:14px;height:14px;opacity:.7}.editor-toolbar .tb-dropdown{display:inline-flex}.editor-toolbar .tb-dropdown-menu{position:fixed;z-index:1000;display:flex;flex-direction:column;min-width:210px;padding:4px;background:#fff;border:1px solid var(--es-editor-border);border-radius:8px;box-shadow:0 12px 30px #0000001a,0 2px 8px #0000000f}.editor-toolbar .tb-dropdown-menu button{padding:7px 10px;border:none;border-radius:6px;background:transparent;font:inherit;color:var(--es-editor-text);text-align:left;white-space:nowrap;cursor:pointer}.editor-toolbar .tb-dropdown-menu button:hover:not(:disabled),.editor-toolbar .tb-dropdown-menu button:focus-visible{outline:none;background:var(--es-editor-hover)}.editor-toolbar .tb-dropdown-menu button.danger:hover:not(:disabled){background:#fdecec;color:#c62828}.editor-toolbar .tb-dropdown-menu button:disabled{opacity:.4;cursor:default}.editor-toolbar .tb-dropdown-separator{height:1px;margin:4px 2px;background:var(--es-editor-border)}.editor-toolbar .divider{width:1px;height:20px;background:var(--es-editor-border);margin:0 6px}.ProseMirror{min-height:60px;padding:12px;outline:none;font-size:16px;line-height:1.7;color:#1f1f1f;caret-color:#2563eb}.ProseMirror h1,.ProseMirror h2,.ProseMirror h3{line-height:1.2;margin-top:.8em;margin-bottom:.4em;font-weight:700;letter-spacing:-.02em}.ProseMirror h1{font-size:2rem}.ProseMirror h2{font-size:1.5rem}.ProseMirror h3{font-size:1.25rem}.ProseMirror p{margin:0}.ProseMirror ul,.ProseMirror ol{padding-left:1.5rem;margin:5px 0;display:flow-root}.ProseMirror li{margin:0}.ProseMirror blockquote{margin:1.4rem 0;padding-left:1rem;border-left:4px solid #c7d2fe;color:#555}.ProseMirror code{background:#f3f4f6;color:#d63384;padding:.15em .35em;border-radius:4px;font-size:.92em}.ProseMirror pre{background:#1f2937;color:#f9fafb;padding:16px 18px;border-radius:10px;overflow-x:auto;margin:1.2rem 0}.ProseMirror pre code{background:transparent;color:inherit;padding:0}.ProseMirror a{color:#2563eb;text-decoration:underline}.ProseMirror hr{border:none;border-top:1px solid #e2e2e2;margin:2rem 0}.ProseMirror table{width:100%;border-collapse:collapse;margin:1.2rem 0}.ProseMirror th,.ProseMirror td{border:1px solid #ddd;padding:5px;position:relative}.ProseMirror th{background:#f5f5f5;text-align:left}.ProseMirror .column-resize-handle{position:absolute;top:0;right:-2px;width:5px;height:100%;cursor:col-resize;background:transparent;z-index:20}.ProseMirror ::selection{background:#6082ff40}.suggestion-popup{display:flex;flex-direction:column;min-width:220px;padding:6px;background:#fff;z-index:99999999;border:1px solid #e5e5e5;border-radius:10px;box-shadow:0 12px 30px #00000014,0 2px 8px #0000000d}.suggestion-popup button{border:none;background:transparent;border-radius:8px;padding:8px 10px;text-align:left;cursor:pointer;font-size:14px}.suggestion-popup button:hover,.suggestion-popup button.is-selected{background:#eef2ff}.mention{display:inline-flex;align-items:center;background:#eef2ff;color:#304ffe;padding:2px 6px;border-radius:5px;font-weight:500}.img-wrapper{position:relative;display:inline-block;margin:12px 0}.img-wrapper img{max-width:100%;border-radius:10px;transition:opacity .2s ease}.img-wrapper.ProseMirror-selectednode img{outline:2px solid var(--es-editor-accent, #2342c0);outline-offset:2px}.img-toolbar{position:absolute;top:8px;left:8px;display:flex;align-items:center;gap:2px;background:#fffffff5;border:1px solid var(--es-editor-border, #e2e4e9);border-radius:8px;padding:3px;box-shadow:0 8px 20px #00000014;opacity:0;pointer-events:none;transition:opacity .12s ease}.img-toolbar.readonly{display:none}.img-wrapper:hover .img-toolbar,.img-wrapper.ProseMirror-selectednode .img-toolbar{opacity:1;pointer-events:auto}.img-toolbar button{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:none;border-radius:6px;background:transparent;color:var(--es-editor-icon, #4b5563);cursor:pointer}.img-toolbar button:hover{background:var(--es-editor-hover, #eef0f3)}.img-toolbar button.is-active{background:var(--es-editor-accent-soft, #e5ebff);color:var(--es-editor-accent, #2342c0)}.img-toolbar button.danger:hover{background:#fdecec;color:#c62828}.img-toolbar svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.img-toolbar-divider{width:1px;height:16px;margin:0 3px;background:var(--es-editor-border, #e2e4e9)}.img-resize-handle{position:absolute;right:-5px;bottom:-5px;width:12px;height:12px;background:#fff;border:2px solid var(--es-editor-accent, #2342c0);border-radius:3px;box-shadow:0 1px 3px #0003;cursor:se-resize;opacity:0;transition:opacity .12s ease}.img-resize-handle.readonly{display:none}.img-wrapper:hover .img-resize-handle,.img-wrapper.ProseMirror-selectednode .img-resize-handle{opacity:1}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
551
679
|
}
|
|
552
680
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: EditorComponent, decorators: [{
|
|
553
681
|
type: Component,
|
|
554
682
|
args: [{ selector: "es-editor", standalone: true, imports: [CommonModule, FormsModule], encapsulation: ViewEncapsulation.None, providers: [
|
|
555
683
|
{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => EditorComponent), multi: true },
|
|
556
684
|
{ provide: NG_VALIDATORS, useExisting: forwardRef(() => EditorComponent), multi: true }
|
|
557
|
-
], template: "<div class=\"editor-shell\" [class.readonly]=\"readonly()\" [attr.style]=\"style()\">\r\n @if(!readonly()){\r\n <div class=\"editor-toolbar\">\r\n\r\n <!-- Typography -->\r\n <select id=\"heading-select\" (change)=\"setTypography($event)\">\r\n <option value=\"\" selected hidden>Pragrafo</option>\r\n <option value=\"paragraph\">Pragrafo</option>\r\n <option value=\"h1\">Intestazione 1</option>\r\n <option value=\"h2\">Intestazione 2</option>\r\n <option value=\"h3\">Intestazione 3</option>\r\n <option value=\"h4\">Intestazione 4</option>\r\n <option value=\"h5\">Intestazione 5</option>\r\n <option value=\"h6\">Intestazione 6</option>\r\n </select>\r\n\r\n <div class=\"divider\"></div>\r\n\r\n <!-- Formatting -->\r\n <button type=\"button\" (click)=\"setBold()\"><b>B</b></button>\r\n <button type=\"button\" (click)=\"setItalic()\"><i>I</i></button>\r\n <button type=\"button\" (click)=\"setUnderlined()\"><u>U</u></button>\r\n\r\n <!-- Lists -->\r\n @if(BulletListSupport()){\r\n <button type=\"button\" (click)=\"setBulletList()\">\u2022 Lista</button>\r\n }\r\n\r\n <div class=\"divider\"></div>\r\n\r\n @if(Mode() == \"html\" && TablesSupport())\r\n {\r\n <button type=\"button\" (click)=\"addTable()\">\u229E<span style=\"font-size: 10px;\">\u271A</span></button>\r\n <button type=\"button\" (click)=\"deleteTable()\">\u229E<span style=\"font-size: 10px;\">\u25AC</span></button>\r\n <button type=\"button\" (click)=\"addRow()\">\uD83D\uDDA8<span style=\"font-size: 10px;\">\u271A</span></button>\r\n <button type=\"button\" (click)=\"deleteRow()\">\uD83D\uDDA8<span style=\"font-size: 10px;\">\u25AC</span></button>\r\n <button type=\"button\" (click)=\"addColumn()\">\uD83D\uDDC4<span style=\"font-size: 10px;\">\u271A</span></button>\r\n <button type=\"button\" (click)=\"deleteColumn()\">\uD83D\uDDC4<span style=\"font-size: 10px;\">\u25AC</span></button>\r\n <div class=\"divider\"></div>\r\n }\r\n\r\n <!-- History -->\r\n <button type=\"button\" (click)=\"undoAction()\">\u21B6</button>\r\n <button type=\"button\" (click)=\"redoAction()\">\u21B7</button>\r\n\r\n @if(EmojiSupport()){\r\n <select id=\"emoji-select\" (change)=\"setEmoji($event)\">\r\n <option value=\"\" hidden selected>\uD83D\uDE0A</option>\r\n <option value=\"\uD83D\uDE0A\">\uD83D\uDE0A</option>\r\n <option value=\"\uD83D\uDE00\">\uD83D\uDE00</option>\r\n <option value=\"\uD83D\uDE02\">\uD83D\uDE02</option>\r\n <option value=\"\uD83D\uDD25\">\uD83D\uDD25</option>\r\n <option value=\"\uD83C\uDF89\">\uD83C\uDF89</option>\r\n <option value=\"\uD83D\uDE80\">\uD83D\uDE80</option>\r\n <option value=\"\u2764\uFE0F\">\u2764\uFE0F</option>\r\n <option value=\"\uD83D\uDC4D\">\uD83D\uDC4D</option>\r\n </select>\r\n }\r\n </div>\r\n }\r\n <div #element></div>\r\n</div>", styles: [".editor-shell{border:1px solid #dcdcdc;border-radius:10px;background:#fff;overflow:hidden;isolation:isolate;box-shadow:0 1px 2px #0000000a,0 6px 24px #0000000d;font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}.editor-shell.readonly{border:none;overflow:visible;box-shadow:none}.editor-toolbar{display:flex;align-items:center;gap:4px;padding:4px;background:linear-gradient(to bottom,#fafafa,#f3f3f3);border-bottom:1px solid #e5e5e5;flex-wrap:wrap}.editor-toolbar button{display:inline-flex;align-items:center;justify-content:center;line-height:1;min-width:36px;height:36px;padding:0 12px;border:1px solid #ddd;border-radius:8px;background:transparent;color:#333;font-size:18px;font-weight:500;cursor:pointer;transition:background .12s ease,border-color .12s ease,color .12s ease}.editor-toolbar button:hover{background:#e9e9e9}.editor-toolbar button:active{transform:translateY(1px)}.editor-toolbar button.is-active{background:#dfe7ff;border-color:#c7d2fe;color:#2342c0}.editor-toolbar select{height:36px;padding:0 12px;border:1px solid #d6d6d6;border-radius:8px;background:#fff;font-size:14px;color:#222;cursor:pointer;transition:border-color .12s ease,box-shadow .12s ease,background .12s ease}.editor-toolbar select:hover{background:#fafafa}.editor-toolbar select:focus{outline:none;border-color:#8ba8ff;box-shadow:0 0 0 3px #6082ff26}.editor-toolbar .divider{width:1px;height:24px;background:#ddd;margin:0 2px}.ProseMirror{min-height:60px;padding:12px;outline:none;font-size:16px;line-height:1.7;color:#1f1f1f;caret-color:#2563eb}.ProseMirror h1,.ProseMirror h2,.ProseMirror h3{line-height:1.2;margin-top:.8em;margin-bottom:.4em;font-weight:700;letter-spacing:-.02em}.ProseMirror h1{font-size:2rem}.ProseMirror h2{font-size:1.5rem}.ProseMirror h3{font-size:1.25rem}.ProseMirror p{margin:0}.ProseMirror ul,.ProseMirror ol{padding-left:1.5rem;margin:5px 0}.ProseMirror li{margin:0}.ProseMirror blockquote{margin:1.4rem 0;padding-left:1rem;border-left:4px solid #c7d2fe;color:#555}.ProseMirror code{background:#f3f4f6;color:#d63384;padding:.15em .35em;border-radius:4px;font-size:.92em}.ProseMirror pre{background:#1f2937;color:#f9fafb;padding:16px 18px;border-radius:10px;overflow-x:auto;margin:1.2rem 0}.ProseMirror pre code{background:transparent;color:inherit;padding:0}.ProseMirror a{color:#2563eb;text-decoration:underline}.ProseMirror hr{border:none;border-top:1px solid #e2e2e2;margin:2rem 0}.ProseMirror table{width:100%;border-collapse:collapse;margin:1.2rem 0}.ProseMirror th,.ProseMirror td{border:1px solid #ddd;padding:5px;position:relative}.ProseMirror th{background:#f5f5f5;text-align:left}.ProseMirror .column-resize-handle{position:absolute;top:0;right:-2px;width:5px;height:100%;cursor:col-resize;background:transparent;z-index:20}.ProseMirror ::selection{background:#6082ff40}.suggestion-popup{display:flex;flex-direction:column;min-width:220px;padding:6px;background:#fff;z-index:99999999;border:1px solid #e5e5e5;border-radius:10px;box-shadow:0 12px 30px #00000014,0 2px 8px #0000000d}.suggestion-popup button{border:none;background:transparent;border-radius:8px;padding:8px 10px;text-align:left;cursor:pointer;font-size:14px}.suggestion-popup button:hover,.suggestion-popup button.is-selected{background:#eef2ff}.mention{display:inline-flex;align-items:center;background:#eef2ff;color:#304ffe;padding:2px 6px;border-radius:5px;font-weight:500}.img-wrapper{position:relative;display:inline-block;margin:12px 0}.img-wrapper img{max-width:100%;border-radius:10px;transition:opacity .2s ease}.img-toolbar{position:absolute;top:8px;left:8px;display:flex;gap:6px;background:#fffffff2;border:1px solid #e5e5e5;border-radius:8px;padding:4px;box-shadow:0 8px 20px #00000014}.img-toolbar.readonly{display:none}.img-toolbar button{border:none;background:transparent;padding:4px 6px;cursor:pointer;font-size:12px}.img-toolbar button:hover{background:#eef2ff;border-radius:6px}.img-resize-handle{position:absolute;right:0;bottom:0;width:12px;height:12px;background:#2563eb;border-radius:3px;cursor:se-resize}.img-resize-handle.readonly{display:none}\n"] }]
|
|
558
|
-
}], propDecorators: { element: [{ type: i0.ViewChild, args: ["element", { isSignal: true }] }], EmojiSupport: [{ type: i0.Input, args: [{ isSignal: true, alias: "EmojiSupport", required: false }] }], BulletListSupport: [{ type: i0.Input, args: [{ isSignal: true, alias: "BulletListSupport", required: false }] }], TablesSupport: [{ type: i0.Input, args: [{ isSignal: true, alias: "TablesSupport", required: false }] }], Mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "Mode", required: true }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], style: [{ type: i0.Input, args: [{ isSignal: true, alias: "style", required: false }] }], MentionEntities: [{ type: i0.Input, args: [{ isSignal: true, alias: "MentionEntities", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: true }] }], inputChange: [{
|
|
685
|
+
], template: "<div class=\"editor-shell\" [class.readonly]=\"readonly()\" [attr.style]=\"style()\">\r\n @if(!readonly()){\r\n <!-- (mousedown) preventDefault sui pulsanti: il click non toglie il focus all'editor, quindi la selezione resta visibile -->\r\n <div class=\"editor-toolbar\" role=\"toolbar\" aria-label=\"Formattazione\">\r\n\r\n <!-- Typography -->\r\n <select class=\"heading-select\" title=\"Stile del paragrafo\" (change)=\"setTypography($event)\">\r\n <option value=\"paragraph\" [selected]=\"Toolbar().block == 'paragraph'\">Paragrafo</option>\r\n <option value=\"h1\" [selected]=\"Toolbar().block == 'h1'\">Intestazione 1</option>\r\n <option value=\"h2\" [selected]=\"Toolbar().block == 'h2'\">Intestazione 2</option>\r\n <option value=\"h3\" [selected]=\"Toolbar().block == 'h3'\">Intestazione 3</option>\r\n <option value=\"h4\" [selected]=\"Toolbar().block == 'h4'\">Intestazione 4</option>\r\n <option value=\"h5\" [selected]=\"Toolbar().block == 'h5'\">Intestazione 5</option>\r\n <option value=\"h6\" [selected]=\"Toolbar().block == 'h6'\">Intestazione 6</option>\r\n </select>\r\n\r\n <!-- Font: solo html, il markdown non ha una sintassi per rappresentarli -->\r\n @if(Mode() == \"html\"){\r\n <select class=\"font-family-select\" title=\"Carattere\" (change)=\"setFontFamily($event)\">\r\n <option value=\"\" [selected]=\"Toolbar().fontFamily == ''\">Carattere</option>\r\n @for(f of FontFamilies; track f.value){\r\n <option [value]=\"f.value\" [selected]=\"Toolbar().fontFamily == f.value\" [style.font-family]=\"f.value\">{{ f.label }}</option>\r\n }\r\n </select>\r\n <select class=\"font-size-select\" title=\"Dimensione\" (change)=\"setFontSize($event)\">\r\n <option value=\"\" [selected]=\"Toolbar().fontSize == ''\">Dimensione</option>\r\n @for(s of FontSizes; track s){\r\n <option [value]=\"s\" [selected]=\"Toolbar().fontSize == s\">{{ s }}</option>\r\n }\r\n </select>\r\n }\r\n\r\n <div class=\"divider\"></div>\r\n\r\n <!-- Formatting -->\r\n <button type=\"button\" class=\"tb-btn\" title=\"Grassetto\" aria-label=\"Grassetto\" [class.is-active]=\"Toolbar().bold\" [attr.aria-pressed]=\"Toolbar().bold\" (mousedown)=\"$event.preventDefault()\" (click)=\"setBold()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8\" /></svg>\r\n </button>\r\n <button type=\"button\" class=\"tb-btn\" title=\"Corsivo\" aria-label=\"Corsivo\" [class.is-active]=\"Toolbar().italic\" [attr.aria-pressed]=\"Toolbar().italic\" (mousedown)=\"$event.preventDefault()\" (click)=\"setItalic()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M19 4h-9M14 20H5M15 4 9 20\" /></svg>\r\n </button>\r\n <button type=\"button\" class=\"tb-btn\" title=\"Sottolineato\" aria-label=\"Sottolineato\" [class.is-active]=\"Toolbar().underline\" [attr.aria-pressed]=\"Toolbar().underline\" (mousedown)=\"$event.preventDefault()\" (click)=\"setUnderlined()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M6 4v6a6 6 0 0 0 12 0V4M4 20h16\" /></svg>\r\n </button>\r\n\r\n <!-- Lists -->\r\n @if(BulletListSupport()){\r\n <button type=\"button\" class=\"tb-btn\" title=\"Elenco puntato\" aria-label=\"Elenco puntato\" [class.is-active]=\"Toolbar().bulletList\" [attr.aria-pressed]=\"Toolbar().bulletList\" (mousedown)=\"$event.preventDefault()\" (click)=\"setBulletList()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M9 6h11M9 12h11M9 18h11M4 6h.01M4 12h.01M4 18h.01\" /></svg>\r\n </button>\r\n }\r\n\r\n <!-- Tables: un unico menu, le voci che agiscono su una tabella esistente sono attive solo con il cursore al suo interno -->\r\n @if(Mode() == \"html\" && TablesSupport()){\r\n <div class=\"divider\"></div>\r\n <div class=\"tb-dropdown\" #tableMenu>\r\n <button #tableMenuButton type=\"button\" class=\"tb-btn tb-btn-text\" title=\"Tabella\" aria-haspopup=\"menu\" [class.is-active]=\"!!TableMenu()\" [attr.aria-expanded]=\"!!TableMenu()\" (mousedown)=\"$event.preventDefault()\" (click)=\"toggleTableMenu(tableMenuButton)\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" /><path d=\"M3 9h18M3 15h18M12 3v18\" /></svg>\r\n <span>Tabella</span>\r\n <svg class=\"chevron\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"m6 9 6 6 6-6\" /></svg>\r\n </button>\r\n @if(TableMenu(); as pos){\r\n <div class=\"tb-dropdown-menu\" role=\"menu\" [style.top.px]=\"pos.top\" [style.left.px]=\"pos.left\">\r\n <button type=\"button\" role=\"menuitem\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('insert')\">Inserisci tabella</button>\r\n <div class=\"tb-dropdown-separator\"></div>\r\n <button type=\"button\" role=\"menuitem\" [disabled]=\"!Toolbar().inTable\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('addRow')\">Aggiungi riga sotto</button>\r\n <button type=\"button\" role=\"menuitem\" [disabled]=\"!Toolbar().inTable\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('addColumn')\">Aggiungi colonna a destra</button>\r\n <div class=\"tb-dropdown-separator\"></div>\r\n <button type=\"button\" role=\"menuitem\" class=\"danger\" [disabled]=\"!Toolbar().inTable\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('deleteRow')\">Elimina riga</button>\r\n <button type=\"button\" role=\"menuitem\" class=\"danger\" [disabled]=\"!Toolbar().inTable\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('deleteColumn')\">Elimina colonna</button>\r\n <button type=\"button\" role=\"menuitem\" class=\"danger\" [disabled]=\"!Toolbar().inTable\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('delete')\">Elimina tabella</button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"divider\"></div>\r\n\r\n <!-- History -->\r\n <button type=\"button\" class=\"tb-btn\" title=\"Annulla\" aria-label=\"Annulla\" [disabled]=\"!Toolbar().canUndo\" (mousedown)=\"$event.preventDefault()\" (click)=\"undoAction()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M9 14 4 9l5-5\" /><path d=\"M4 9h10.5a5.5 5.5 0 0 1 0 11H11\" /></svg>\r\n </button>\r\n <button type=\"button\" class=\"tb-btn\" title=\"Ripeti\" aria-label=\"Ripeti\" [disabled]=\"!Toolbar().canRedo\" (mousedown)=\"$event.preventDefault()\" (click)=\"redoAction()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"m15 14 5-5-5-5\" /><path d=\"M20 9H9.5a5.5 5.5 0 0 0 0 11H13\" /></svg>\r\n </button>\r\n\r\n @if(EmojiSupport()){\r\n <select class=\"emoji-select\" title=\"Emoji\" aria-label=\"Emoji\" (change)=\"setEmoji($event)\">\r\n <option value=\"\" hidden selected>\uD83D\uDE0A</option>\r\n <option value=\"\uD83D\uDE0A\">\uD83D\uDE0A</option>\r\n <option value=\"\uD83D\uDE00\">\uD83D\uDE00</option>\r\n <option value=\"\uD83D\uDE02\">\uD83D\uDE02</option>\r\n <option value=\"\uD83D\uDD25\">\uD83D\uDD25</option>\r\n <option value=\"\uD83C\uDF89\">\uD83C\uDF89</option>\r\n <option value=\"\uD83D\uDE80\">\uD83D\uDE80</option>\r\n <option value=\"\u2764\uFE0F\">\u2764\uFE0F</option>\r\n <option value=\"\uD83D\uDC4D\">\uD83D\uDC4D</option>\r\n </select>\r\n }\r\n </div>\r\n }\r\n <div #element></div>\r\n</div>\r\n", styles: [".editor-shell{--es-editor-border: #e2e4e9;--es-editor-toolbar-bg: #fafbfc;--es-editor-text: #1f2328;--es-editor-icon: #4b5563;--es-editor-hover: #eef0f3;--es-editor-accent: #2342c0;--es-editor-accent-soft: #e5ebff;--es-editor-focus: rgba(35, 66, 192, .28);border:1px solid var(--es-editor-border);border-radius:10px;background:#fff;overflow:hidden;isolation:isolate;box-shadow:0 1px 2px #0000000a,0 6px 24px #0000000d;font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}.editor-shell.readonly{border:none;overflow:visible;box-shadow:none}.editor-toolbar{display:flex;align-items:center;flex-wrap:wrap;gap:2px;padding:6px 8px;background:var(--es-editor-toolbar-bg);border-bottom:1px solid var(--es-editor-border);font-size:13px;color:var(--es-editor-text)}.editor-toolbar svg{width:18px;height:18px;flex:none;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.editor-toolbar .tb-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:none;border-radius:6px;background:transparent;color:var(--es-editor-icon);cursor:pointer;transition:background .12s ease,color .12s ease}.editor-toolbar .tb-btn:hover:not(:disabled){background:var(--es-editor-hover);color:var(--es-editor-text)}.editor-toolbar .tb-btn.is-active{background:var(--es-editor-accent-soft);color:var(--es-editor-accent)}.editor-toolbar .tb-btn:disabled{opacity:.35;cursor:default}.editor-toolbar .tb-btn:focus-visible{outline:none;box-shadow:0 0 0 3px var(--es-editor-focus)}.editor-toolbar select{height:32px;padding:0 28px 0 10px;border:1px solid var(--es-editor-border);border-radius:6px;appearance:none;background:#fff url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236b7280' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E\") no-repeat right 8px center/14px;font:inherit;color:var(--es-editor-text);cursor:pointer;transition:border-color .12s ease,box-shadow .12s ease}.editor-toolbar select:hover{border-color:#c9cdd4}.editor-toolbar select:focus-visible{outline:none;border-color:var(--es-editor-accent);box-shadow:0 0 0 3px var(--es-editor-focus)}.editor-toolbar .heading-select{width:136px}.editor-toolbar .font-family-select{width:148px;margin-left:4px}.editor-toolbar .font-size-select{width:112px;margin-left:4px}.editor-toolbar .emoji-select{width:44px;padding:0 0 0 10px;border-color:transparent;background:transparent;font-size:16px}.editor-toolbar .emoji-select:hover{border-color:transparent;background:var(--es-editor-hover)}.editor-toolbar .tb-btn.tb-btn-text{width:auto;gap:6px;padding:0 6px 0 8px;font:inherit}.editor-toolbar .tb-btn.tb-btn-text .chevron{width:14px;height:14px;opacity:.7}.editor-toolbar .tb-dropdown{display:inline-flex}.editor-toolbar .tb-dropdown-menu{position:fixed;z-index:1000;display:flex;flex-direction:column;min-width:210px;padding:4px;background:#fff;border:1px solid var(--es-editor-border);border-radius:8px;box-shadow:0 12px 30px #0000001a,0 2px 8px #0000000f}.editor-toolbar .tb-dropdown-menu button{padding:7px 10px;border:none;border-radius:6px;background:transparent;font:inherit;color:var(--es-editor-text);text-align:left;white-space:nowrap;cursor:pointer}.editor-toolbar .tb-dropdown-menu button:hover:not(:disabled),.editor-toolbar .tb-dropdown-menu button:focus-visible{outline:none;background:var(--es-editor-hover)}.editor-toolbar .tb-dropdown-menu button.danger:hover:not(:disabled){background:#fdecec;color:#c62828}.editor-toolbar .tb-dropdown-menu button:disabled{opacity:.4;cursor:default}.editor-toolbar .tb-dropdown-separator{height:1px;margin:4px 2px;background:var(--es-editor-border)}.editor-toolbar .divider{width:1px;height:20px;background:var(--es-editor-border);margin:0 6px}.ProseMirror{min-height:60px;padding:12px;outline:none;font-size:16px;line-height:1.7;color:#1f1f1f;caret-color:#2563eb}.ProseMirror h1,.ProseMirror h2,.ProseMirror h3{line-height:1.2;margin-top:.8em;margin-bottom:.4em;font-weight:700;letter-spacing:-.02em}.ProseMirror h1{font-size:2rem}.ProseMirror h2{font-size:1.5rem}.ProseMirror h3{font-size:1.25rem}.ProseMirror p{margin:0}.ProseMirror ul,.ProseMirror ol{padding-left:1.5rem;margin:5px 0;display:flow-root}.ProseMirror li{margin:0}.ProseMirror blockquote{margin:1.4rem 0;padding-left:1rem;border-left:4px solid #c7d2fe;color:#555}.ProseMirror code{background:#f3f4f6;color:#d63384;padding:.15em .35em;border-radius:4px;font-size:.92em}.ProseMirror pre{background:#1f2937;color:#f9fafb;padding:16px 18px;border-radius:10px;overflow-x:auto;margin:1.2rem 0}.ProseMirror pre code{background:transparent;color:inherit;padding:0}.ProseMirror a{color:#2563eb;text-decoration:underline}.ProseMirror hr{border:none;border-top:1px solid #e2e2e2;margin:2rem 0}.ProseMirror table{width:100%;border-collapse:collapse;margin:1.2rem 0}.ProseMirror th,.ProseMirror td{border:1px solid #ddd;padding:5px;position:relative}.ProseMirror th{background:#f5f5f5;text-align:left}.ProseMirror .column-resize-handle{position:absolute;top:0;right:-2px;width:5px;height:100%;cursor:col-resize;background:transparent;z-index:20}.ProseMirror ::selection{background:#6082ff40}.suggestion-popup{display:flex;flex-direction:column;min-width:220px;padding:6px;background:#fff;z-index:99999999;border:1px solid #e5e5e5;border-radius:10px;box-shadow:0 12px 30px #00000014,0 2px 8px #0000000d}.suggestion-popup button{border:none;background:transparent;border-radius:8px;padding:8px 10px;text-align:left;cursor:pointer;font-size:14px}.suggestion-popup button:hover,.suggestion-popup button.is-selected{background:#eef2ff}.mention{display:inline-flex;align-items:center;background:#eef2ff;color:#304ffe;padding:2px 6px;border-radius:5px;font-weight:500}.img-wrapper{position:relative;display:inline-block;margin:12px 0}.img-wrapper img{max-width:100%;border-radius:10px;transition:opacity .2s ease}.img-wrapper.ProseMirror-selectednode img{outline:2px solid var(--es-editor-accent, #2342c0);outline-offset:2px}.img-toolbar{position:absolute;top:8px;left:8px;display:flex;align-items:center;gap:2px;background:#fffffff5;border:1px solid var(--es-editor-border, #e2e4e9);border-radius:8px;padding:3px;box-shadow:0 8px 20px #00000014;opacity:0;pointer-events:none;transition:opacity .12s ease}.img-toolbar.readonly{display:none}.img-wrapper:hover .img-toolbar,.img-wrapper.ProseMirror-selectednode .img-toolbar{opacity:1;pointer-events:auto}.img-toolbar button{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:none;border-radius:6px;background:transparent;color:var(--es-editor-icon, #4b5563);cursor:pointer}.img-toolbar button:hover{background:var(--es-editor-hover, #eef0f3)}.img-toolbar button.is-active{background:var(--es-editor-accent-soft, #e5ebff);color:var(--es-editor-accent, #2342c0)}.img-toolbar button.danger:hover{background:#fdecec;color:#c62828}.img-toolbar svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.img-toolbar-divider{width:1px;height:16px;margin:0 3px;background:var(--es-editor-border, #e2e4e9)}.img-resize-handle{position:absolute;right:-5px;bottom:-5px;width:12px;height:12px;background:#fff;border:2px solid var(--es-editor-accent, #2342c0);border-radius:3px;box-shadow:0 1px 3px #0003;cursor:se-resize;opacity:0;transition:opacity .12s ease}.img-resize-handle.readonly{display:none}.img-wrapper:hover .img-resize-handle,.img-wrapper.ProseMirror-selectednode .img-resize-handle{opacity:1}\n"] }]
|
|
686
|
+
}], propDecorators: { element: [{ type: i0.ViewChild, args: ["element", { isSignal: true }] }], EmojiSupport: [{ type: i0.Input, args: [{ isSignal: true, alias: "EmojiSupport", required: false }] }], BulletListSupport: [{ type: i0.Input, args: [{ isSignal: true, alias: "BulletListSupport", required: false }] }], TablesSupport: [{ type: i0.Input, args: [{ isSignal: true, alias: "TablesSupport", required: false }] }], Mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "Mode", required: true }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], style: [{ type: i0.Input, args: [{ isSignal: true, alias: "style", required: false }] }], MentionEntities: [{ type: i0.Input, args: [{ isSignal: true, alias: "MentionEntities", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: true }] }], tableMenuRef: [{ type: i0.ViewChild, args: ["tableMenu", { isSignal: true }] }], inputChange: [{
|
|
559
687
|
type: Output
|
|
560
688
|
}], inputFocus: [{
|
|
561
689
|
type: Output
|
|
562
690
|
}], inputFinalized: [{
|
|
563
691
|
type: Output
|
|
692
|
+
}], onDocumentMouseDown: [{
|
|
693
|
+
type: HostListener,
|
|
694
|
+
args: ["document:mousedown", ["$event"]]
|
|
695
|
+
}], closeTableMenu: [{
|
|
696
|
+
type: HostListener,
|
|
697
|
+
args: ["document:keydown.escape"]
|
|
564
698
|
}] } });
|
|
699
|
+
const EMPTY_TOOLBAR_STATE = {
|
|
700
|
+
block: "paragraph", fontFamily: "", fontSize: "",
|
|
701
|
+
bold: false, italic: false, underline: false, bulletList: false,
|
|
702
|
+
inTable: false, canUndo: false, canRedo: false,
|
|
703
|
+
};
|
|
704
|
+
// Confronta due font-family sul primo font dell'elenco: il browser riscrive le virgolette
|
|
705
|
+
// in fase di parsing ('Times New Roman' -> "Times New Roman"), quindi le stringhe intere non coincidono
|
|
706
|
+
function sameFontFamily(a, b) {
|
|
707
|
+
const first = (f) => (f || "").split(",")[0].trim().replace(/^['"]|['"]$/g, "").toLowerCase();
|
|
708
|
+
return !!first(a) && first(a) === first(b);
|
|
709
|
+
}
|
|
565
710
|
|
|
566
711
|
const TXE_DEBUG = new InjectionToken('TXE_DEBUG');
|
|
567
712
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"esfaenza-text-editors.mjs","sources":["../../../projects/text-editors/src/lib/editor/extensions/CustomMention.ts","../../../projects/text-editors/src/lib/editor/extensions/CustomeImageWithView.ts","../../../projects/text-editors/src/lib/editor/extensions/FontFamily.ts","../../../projects/text-editors/src/lib/editor/extensions/LineHeight.ts","../../../projects/text-editors/src/lib/editor/extensions/Suggestion.ts","../../../projects/text-editors/src/lib/editor/extensions/FontSize.ts","../../../projects/text-editors/src/lib/editor/editor.component.ts","../../../projects/text-editors/src/lib/editor/editor.component.html","../../../projects/text-editors/src/lib/tokens.ts","../../../projects/text-editors/src/public-api.ts","../../../projects/text-editors/src/esfaenza-text-editors.ts"],"sourcesContent":["import Mention from '@tiptap/extension-mention'\r\nimport { marked } from 'marked'\r\n\r\nexport const CustomMention = Mention.extend({\r\n renderMarkdown(node) { return `@${node.attrs?.id || node.attrs?.label}` },\r\n parseMarkdown(token) { return { type: token.type, attrs: { id: token.text, label: token.text } } },\r\n});\r\n\r\nmarked.use({\r\n extensions: [\r\n {\r\n name: 'mention',\r\n level: 'inline',\r\n\r\n start(src) {\r\n const match = /(^|\\s)@/.exec(src)\r\n return match ? match.index + match[1].length : undefined\r\n },\r\n\r\n tokenizer(src) {\r\n const match = /^@([a-zA-Z]+)(?=\\s|:|$)/.exec(src)\r\n if (match && match[1].length == 7)\r\n return { type: 'mention', raw: match[0], text: match[1] }\r\n },\r\n\r\n renderer(token) { return token.raw },\r\n },\r\n ],\r\n})\r\n\r\nexport const mymarked = marked;\r\n","import { Image } from '@tiptap/extension-image'\r\nimport { Plugin } from '@tiptap/pm/state'\r\n\r\nlet handleFiles = async (view: any, files: FileList | undefined) => {\r\n\r\n const file = Array.from(files || []).find(f => f.type.startsWith('image/'));\r\n\r\n if (!file) return;\r\n\r\n const reader = new FileReader();\r\n\r\n reader.onload = () => {\r\n\r\n const base64 = reader.result as string;\r\n const img = new window.Image();\r\n img.onload = () => {\r\n const { schema } = view.state;\r\n const node = schema.nodes.image.create({ src: base64, width: img.naturalWidth, float: \"none\" });\r\n const tr = view.state.tr.replaceSelectionWith(node);\r\n view.dispatch(tr);\r\n }\r\n img.src = base64;\r\n };\r\n\r\n reader.readAsDataURL(file);\r\n}\r\n\r\nconst CustomImage = Image.extend({\r\n draggable: true,\r\n selectable: true,\r\n addAttributes() {\r\n return {\r\n ...this.parent?.(),\r\n width: { default: null, },\r\n float: { default: \"none\" }, // 'left' | 'right' | 'none'\r\n src: {\r\n default: null,\r\n parseHTML: element => { return element.getAttribute('src') },\r\n renderHTML: attributes => { return { src: attributes.src, } },\r\n },\r\n };\r\n },\r\n renderMarkdown(node, _) {\r\n const src = node.attrs?.src\r\n const width = node.attrs?.width\r\n const float = node.attrs?.float\r\n\r\n // fallback to normal markdown when possible\r\n if ((!width || width === 'auto') && float === 'none') {\r\n return ``\r\n }\r\n\r\n // otherwise emit raw HTML\r\n const style = float === 'left' ? 'float:left; margin-right:10px;' : float === 'right' ? 'float:right; margin-left:10px;' : '';\r\n return `<img src=\"${src}\" width=\"${width || ''}\" style=\"${style}\" />`\r\n },\r\n\r\n parseMarkdown(token, helpers) {\r\n return helpers.createNode(\"image\", { src: token[\"href\"] || token[\"src\"], alt: token.content, float: token['float'] || 'none' })\r\n },\r\n renderHTML({ HTMLAttributes }) {\r\n const { float } = HTMLAttributes\r\n let style = ''\r\n if (float === 'left')\r\n style = 'float:left; display:block; margin-right: 10px'\r\n else if (float === 'right')\r\n style = 'float:right; display:block; margin-left: 10px'\r\n else\r\n style = `display: inline-block; float: none; vertical-align: middle;`\r\n\r\n return ['img', { ...HTMLAttributes, style }]\r\n },\r\n parseHTML() {\r\n return [\r\n {\r\n tag: 'img[src]',\r\n getAttrs: element => {\r\n const el = element as HTMLImageElement;\r\n const src = el.getAttribute('src')\r\n\r\n if (!src) return false\r\n\r\n // allow both normal URLs AND base64\r\n if (src.startsWith('http') || src.startsWith('data:image'))\r\n return { src, float: el.style.float || null, width: el.style.width ? parseInt(el.style.width) : null, }\r\n\r\n return false\r\n },\r\n },\r\n ]\r\n },\r\n addProseMirrorPlugins: () => {\r\n return [\r\n new Plugin({\r\n props: {\r\n handleDrop: (view, event) => {\r\n const files = event.dataTransfer?.files;\r\n if (!files?.length) return false;\r\n\r\n handleFiles(view, files);\r\n\r\n return true;\r\n },\r\n\r\n handlePaste: (view, event) => {\r\n const files = event.clipboardData?.files;\r\n if (!files?.length) return false;\r\n\r\n handleFiles(view, files);\r\n\r\n return true;\r\n },\r\n },\r\n })\r\n ]\r\n },\r\n});\r\n\r\nconst CustomImageWithView = CustomImage.extend({\r\n addNodeView: () => {\r\n return ({ node, getPos, editor }) => {\r\n\r\n let updateImage = (img: HTMLImageElement, node: any) => {\r\n img.draggable = false;\r\n img.src = node.attrs.src\r\n img.style.width = node.attrs.width ? `${node.attrs.width}px` : '';\r\n if (node.attrs.float === 'left' || node.attrs.float === 'right') {\r\n img.style.display = 'block'\r\n if (node.attrs.float === 'left')\r\n img.style.margin = \"0 10px 0 0\";\r\n else if (node.attrs.float === 'right')\r\n img.style.margin = \"0 0 0 10px\"\r\n } else {\r\n img.style.display = 'inline-block'\r\n img.style.verticalAlign = 'middle'\r\n }\r\n };\r\n\r\n let updateWrapper = (wrapper: HTMLDivElement, node: any) => {\r\n wrapper.draggable = true;\r\n wrapper.contentEditable = \"false\";\r\n\r\n wrapper.className = `img-wrapper`;\r\n wrapper.style.float = node.attrs.float;\r\n\r\n if (node.attrs.float === 'left' || node.attrs.float === 'right') {\r\n wrapper.style.width = \"auto\";\r\n wrapper.style.textAlign = \"auto\";\r\n }\r\n else {\r\n wrapper.style.width = \"100%\";\r\n wrapper.style.textAlign = \"center\";\r\n }\r\n }\r\n\r\n const wrapper = document.createElement('div')\r\n updateWrapper(wrapper, node);\r\n\r\n const img = document.createElement('img')\r\n updateImage(img, node);\r\n\r\n const toolbar = document.createElement('div')\r\n toolbar.className = `img-toolbar ${editor.isEditable ? '' : 'readonly'}`;\r\n\r\n const btn = (t: any, fn: any) => {\r\n const b = document.createElement('button');\r\n b.type = \"button\";\r\n b.textContent = t;\r\n b.onclick = fn;\r\n return b;\r\n }\r\n\r\n toolbar.append(\r\n\r\n btn('Centro', () => editor.view.dispatch(editor.view.state.tr.setNodeMarkup(getPos()!, undefined, { ...node.attrs, ...{ float: 'none' } }))),\r\n btn('Sinistra', () => editor.view.dispatch(editor.view.state.tr.setNodeMarkup(getPos()!, undefined, { ...node.attrs, ...{ float: 'left' } }))),\r\n btn('Destra', () => editor.view.dispatch(editor.view.state.tr.setNodeMarkup(getPos()!, undefined, { ...node.attrs, ...{ float: 'right' } }))),\r\n\r\n btn('Elimina', () => {\r\n const nodePos = getPos()!;\r\n editor.view.dispatch(editor.view.state.tr.delete(nodePos, nodePos + node.nodeSize))\r\n }));\r\n\r\n // resize\r\n let startX = 0;\r\n let startW = 0;\r\n\r\n const handle = document.createElement('div');\r\n handle.className = `img-resize-handle ${editor.isEditable ? '' : 'readonly'}`;\r\n\r\n handle.onmousedown = (e) => {\r\n startX = e.clientX\r\n startW = img.offsetWidth\r\n\r\n let latestWidth: number | null = null\r\n let ticking = false\r\n\r\n const move = (e: any) => {\r\n latestWidth = Math.max(80, startW + (e.clientX - startX));\r\n\r\n if (!ticking) {\r\n ticking = true\r\n\r\n requestAnimationFrame(() => {\r\n const nodePos = getPos()!;\r\n editor.view.dispatch(editor.view.state.tr.setNodeMarkup(nodePos, undefined, { ...node.attrs, width: latestWidth }))\r\n ticking = false\r\n });\r\n }\r\n }\r\n\r\n const up = () => {\r\n window.removeEventListener('mousemove', move);\r\n window.removeEventListener('mouseup', up);\r\n }\r\n\r\n window.addEventListener('mousemove', move);\r\n window.addEventListener('mouseup', up);\r\n\r\n // Per evitare che si attivi il drag dell'elemento sotto. Dal resizer si usa solo il resizer\r\n e.preventDefault();\r\n }\r\n\r\n wrapper.append(img, toolbar, handle);\r\n\r\n return {\r\n dom: wrapper,\r\n destroy() { wrapper.remove() },\r\n update(updatedNode) {\r\n\r\n // different node type -> recreate NodeView\r\n if (updatedNode.type !== node.type)\r\n return false\r\n\r\n node = updatedNode\r\n updateImage(img, node);\r\n updateWrapper(wrapper, node);\r\n\r\n return true\r\n },\r\n };\r\n }\r\n },\r\n});\r\n\r\nexport default CustomImageWithView;","import { Extension } from \"@tiptap/core\";\r\n\r\nconst FontFamily = Extension.create({\r\n name: 'fontFamily',\r\n\r\n addGlobalAttributes() {\r\n return [\r\n {\r\n types: ['textStyle'],\r\n attributes: {\r\n fontFamily: {\r\n default: null,\r\n parseHTML: element => element.style.fontFamily,\r\n renderHTML: attributes => {\r\n if (!attributes.fontFamily) return {};\r\n return { style: `font-family: ${attributes.fontFamily}` };\r\n },\r\n },\r\n },\r\n },\r\n ]\r\n },\r\n addCommands() {\r\n return {\r\n setFontFamily: (fontFamily: string) => ({ chain }) => { return chain().setMark('textStyle', { fontFamily }).run(); },\r\n unsetFontFamily: () => ({ chain }) => { return chain().setMark('textStyle', { fontFamily: null, }).removeEmptyTextStyle().run() },\r\n }\r\n },\r\n});\r\n\r\nexport default FontFamily;","import { Extension } from \"@tiptap/core\";\r\n\r\nconst LineHeight = Extension.create({\r\n name: 'lineHeight',\r\n\r\n addGlobalAttributes() {\r\n return [\r\n {\r\n types: ['paragraph', 'heading'],\r\n attributes: {\r\n lineHeight: {\r\n default: null,\r\n parseHTML: element => element.style.lineHeight,\r\n renderHTML: attributes => {\r\n if (!attributes.lineHeight) return {};\r\n return { style: `line-height: ${attributes.lineHeight}` };\r\n },\r\n },\r\n },\r\n },\r\n ]\r\n },\r\n addCommands() {\r\n return {\r\n setLineHeight: (lineHeight: string) => ({ commands }) => { return commands.updateAttributes('paragraph', { lineHeight }) },\r\n unsetLineHeight: () => ({ commands }) => { return commands.updateAttributes('paragraph', { lineHeight: null }) },\r\n }\r\n },\r\n});\r\n\r\nexport default LineHeight;","let Suggestion = (choiches: { id: string, description: string }[]) => {\r\n \r\n\r\n return {\r\n char: '@',\r\n\r\n items: ({ query }: { query: string }) => {\r\n return choiches.filter(item => item.description.toLowerCase().startsWith(query.toLowerCase())).slice(0, 5);\r\n },\r\n\r\n render: () => {\r\n let popup: HTMLDivElement;\r\n let selectedIndex = 0\r\n let currentProps: any\r\n\r\n return {\r\n onStart: (props: any) => {\r\n popup = document.createElement('div')\r\n popup.classList.add('suggestion-popup')\r\n\r\n document.body.appendChild(popup)\r\n\r\n currentProps = props;\r\n updatePopup();\r\n },\r\n onKeyDown(props: any) {\r\n if (props.event.key === 'ArrowUp') {\r\n selectedIndex = (selectedIndex + currentProps.items.length - 1) % currentProps.items.length\r\n updatePopup()\r\n return true\r\n }\r\n\r\n if (props.event.key === 'ArrowDown') {\r\n selectedIndex = (selectedIndex + 1) % currentProps.items.length\r\n updatePopup()\r\n return true\r\n }\r\n\r\n if (props.event.key === 'Enter') {\r\n selectItem()\r\n return true\r\n }\r\n\r\n return false\r\n },\r\n onUpdate(props: any) { \r\n currentProps = props;\r\n updatePopup();\r\n },\r\n onExit() { popup.remove(); },\r\n }\r\n\r\n function updatePopup() {\r\n if (!currentProps.clientRect)\r\n return\r\n\r\n popup.innerHTML = '';\r\n\r\n currentProps.items.forEach((item: { id: string, description: string }, index: number) => {\r\n const button = document.createElement('button')\r\n\r\n button.textContent = item.description\r\n\r\n if (index === selectedIndex)\r\n button.classList.add('is-selected')\r\n\r\n button.addEventListener('click', () => {\r\n selectedIndex = index\r\n selectItem()\r\n })\r\n\r\n popup.appendChild(button)\r\n });\r\n\r\n const rect = currentProps.clientRect();\r\n popup.style.position = 'fixed'\r\n popup.style.left = `${rect.left}px`\r\n popup.style.top = `${rect.bottom + 5}px`\r\n }\r\n\r\n function selectItem() {\r\n const item = currentProps.items[selectedIndex]\r\n\r\n if (item)\r\n currentProps.command({ id: item.id, description: item.description, });\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default Suggestion;","import { Extension } from \"@tiptap/core\";\r\n\r\nconst FontSize = Extension.create({\r\n name: 'fontSize',\r\n\r\n addGlobalAttributes() {\r\n return [\r\n {\r\n types: ['textStyle'],\r\n attributes: {\r\n fontSize: {\r\n default: null,\r\n parseHTML: element => {\r\n const size = element.style.fontSize;\r\n if (!size) return null;\r\n // normalize pt → px\r\n if (size.endsWith('pt'))\r\n return `${Math.round(parseFloat(size) * 1.333)}px`;\r\n return size;\r\n },\r\n renderHTML: attributes => {\r\n if (!attributes.fontSize) return {};\r\n\r\n return { style: `font-size: ${attributes.fontSize}` }\r\n },\r\n },\r\n },\r\n },\r\n ]\r\n },\r\n addCommands() {\r\n return {\r\n setFontSize: (fontSize: string) => ({ chain }) => { return chain().setMark('textStyle', { fontSize }).run() },\r\n unsetFontSize: () => ({ chain }) => { return chain().setMark('textStyle', { fontSize: null }).removeEmptyTextStyle().run() },\r\n }\r\n },\r\n})\r\n\r\nexport default FontSize;","import { CommonModule } from \"@angular/common\";\r\nimport { booleanAttribute, Component, ElementRef, EventEmitter, forwardRef, input, Output, viewChild, ViewEncapsulation } from \"@angular/core\";\r\nimport { AbstractControl, ControlValueAccessor, FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR, ValidationErrors, Validator } from \"@angular/forms\";\r\n\r\nimport { Editor } from '@tiptap/core'\r\nimport { Markdown } from '@tiptap/markdown'\r\nimport { StarterKit } from '@tiptap/starter-kit'\r\nimport { TextStyle } from '@tiptap/extension-text-style'\r\nimport { Color } from '@tiptap/extension-color'\r\nimport { Table } from '@tiptap/extension-table'\r\nimport { TableRow } from '@tiptap/extension-table-row'\r\nimport { TableCell } from '@tiptap/extension-table-cell'\r\nimport { TableHeader } from '@tiptap/extension-table-header'\r\nimport { TextAlign } from '@tiptap/extension-text-align'\r\n\r\nimport { CustomMention, mymarked } from \"./extensions/CustomMention\";\r\nimport CustomImageWithView from \"./extensions/CustomeImageWithView\";\r\nimport FontFamily from \"./extensions/FontFamily\";\r\nimport LineHeight from \"./extensions/LineHeight\";\r\nimport Suggestion from \"./extensions/Suggestion\";\r\nimport FontSize from \"./extensions/FontSize\";\r\n\r\n@Component({\r\n selector: \"es-editor\",\r\n templateUrl: \"./editor.component.html\",\r\n styleUrls: [\"./editor.component.scss\"],\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => EditorComponent), multi: true },\r\n { provide: NG_VALIDATORS, useExisting: forwardRef(() => EditorComponent), multi: true }\r\n ]\r\n})\r\nexport class EditorComponent implements ControlValueAccessor, Validator {\r\n\r\n protected onChange = (_: any) => { };\r\n public onTouched = () => { };\r\n public registerOnChange(fn: any): void { this.onChange = fn; }\r\n public registerOnTouched(fn: any): void { this.onTouched = fn; }\r\n\r\n validate(_: AbstractControl): ValidationErrors | null {\r\n return null;\r\n }\r\n\r\n private element = viewChild.required<ElementRef<HTMLDivElement>>(\"element\");\r\n\r\n public EmojiSupport = input<boolean>(false);\r\n public BulletListSupport = input<boolean>(false);\r\n public TablesSupport = input<boolean>(false);\r\n public Mode = input.required<'html' | 'markdown' | 'text'>();\r\n public readonly = input(false, { transform: booleanAttribute });\r\n public disabled = input(false, { transform: booleanAttribute });\r\n public required = input(false, { transform: booleanAttribute });\r\n public style = input(\"\");\r\n\r\n public MentionEntities = input<{ id: string, description: string }[]>([]);\r\n\r\n public name = input.required<string>();\r\n\r\n private EditorRef?: Editor;\r\n public value: any;\r\n\r\n @Output() inputChange: EventEmitter<string> = new EventEmitter<string>();\r\n @Output() inputFocus: EventEmitter<any> = new EventEmitter<any>();\r\n @Output() inputFinalized: EventEmitter<string> = new EventEmitter<string>();\r\n\r\n ngOnInit() {\r\n let config = [];\r\n\r\n config.push(...[\r\n StarterKit,\r\n TextStyle,\r\n Color,\r\n FontSize,\r\n FontFamily,\r\n LineHeight,\r\n TextAlign.configure({ types: ['heading', 'paragraph'] }),\r\n CustomImageWithView\r\n ]);\r\n\r\n if (this.Mode() == \"markdown\")\r\n config.push(Markdown.configure({ marked: mymarked }));\r\n\r\n if (this.Mode() == \"html\") {\r\n if (this.TablesSupport())\r\n config.push(...[Table.configure({ lastColumnResizable: true, resizable: true }), TableRow, TableHeader, TableCell]);\r\n }\r\n\r\n if ((this.MentionEntities()?.length || 0) > 0)\r\n config.push(CustomMention.configure({\r\n deleteTriggerWithBackspace: true,\r\n HTMLAttributes: { class: 'mention' },\r\n renderText({ options, node }) { return `${options.suggestion.char}${node.attrs.description ?? node.attrs.id}` },\r\n suggestion: Suggestion(this.MentionEntities()),\r\n }),);\r\n\r\n this.EditorRef = new Editor({\r\n element: this.element().nativeElement,\r\n extensions: config,\r\n editable: !this.readonly(),\r\n onUpdate: (_) => {\r\n let value = \"\";\r\n switch (this.Mode()) {\r\n case \"html\":\r\n value = this.EditorRef?.getHTML() || \"\";\r\n // Emissione del valore vuoto trimmato per bene\r\n if (value.trim() === \"<p></p>\")\r\n value = \"\";\r\n break;\r\n case \"markdown\": value = this.EditorRef?.getMarkdown() || \"\"; break;\r\n case \"text\": value = this.EditorRef?.getText() || \"\"; break;\r\n }\r\n\r\n this.onChange(value);\r\n }\r\n });\r\n }\r\n\r\n public async writeValue(obj: any): Promise<void> {\r\n // Coercizione di tutti i valori \"vuoti\" all'unico \"null\"\r\n if (obj === null || obj === undefined) obj = null;\r\n\r\n this.value = obj;\r\n\r\n // normalizzazione per la firma di merda di CEA\r\n this.value = this.value?.replace(/^\\*\\*\\*\\*\\*\\*\\s\\s/g, '') || \"\"\r\n this.value = this.value?.replace(/^\\*\\*\\s\\s/g, '') || \"\"\r\n\r\n this.EditorRef?.commands.clearContent();\r\n if (this.Mode() === \"markdown\")\r\n this.EditorRef?.commands.setContent(this.value, { contentType: \"markdown\" });\r\n else if (this.Mode() === \"html\")\r\n this.EditorRef?.commands.setContent(this.value, { contentType: \"html\" });\r\n else\r\n this.EditorRef?.commands.insertContent(this.value);\r\n }\r\n\r\n setTypography(selectElement: Event) {\r\n const select = selectElement.target as HTMLSelectElement\r\n switch (select.value) {\r\n case \"paragraph\": this.EditorRef?.chain().focus().setParagraph().run(); break;\r\n default: this.EditorRef?.chain().focus().setHeading({ level: parseInt(select.value.charAt(1)) as any }).run(); break;\r\n }\r\n select.value = \"\";\r\n }\r\n setBold() {\r\n this.EditorRef?.chain().focus().toggleBold().run();\r\n }\r\n setItalic() {\r\n this.EditorRef?.chain().focus().toggleItalic().run();\r\n }\r\n setUnderlined() {\r\n this.EditorRef?.chain().focus().toggleUnderline().run();\r\n }\r\n setBulletList() {\r\n this.EditorRef?.chain().focus().toggleBulletList().run();\r\n }\r\n undoAction() {\r\n this.EditorRef?.chain().focus().undo().run();\r\n }\r\n redoAction() {\r\n this.EditorRef?.chain().focus().redo().run();\r\n }\r\n addTable() {\r\n this.EditorRef?.chain().focus().insertTable({ rows: 1, cols: 2, withHeaderRow: false }).run()\r\n }\r\n deleteTable() {\r\n this.EditorRef?.chain().focus().deleteTable().run();\r\n }\r\n addRow() {\r\n this.EditorRef?.chain().focus().addRowAfter().run();\r\n }\r\n deleteRow() {\r\n this.EditorRef?.chain().focus().deleteRow().run();\r\n }\r\n addColumn() {\r\n this.EditorRef?.chain().focus().addColumnAfter().run();\r\n }\r\n deleteColumn() {\r\n this.EditorRef?.chain().focus().deleteColumn().run();\r\n }\r\n setEmoji(selectElement: Event) {\r\n const select = selectElement.target as HTMLSelectElement;\r\n this.EditorRef?.chain().focus().insertContent(select.value).run();\r\n select.value = \"\";\r\n }\r\n}","<div class=\"editor-shell\" [class.readonly]=\"readonly()\" [attr.style]=\"style()\">\r\n @if(!readonly()){\r\n <div class=\"editor-toolbar\">\r\n\r\n <!-- Typography -->\r\n <select id=\"heading-select\" (change)=\"setTypography($event)\">\r\n <option value=\"\" selected hidden>Pragrafo</option>\r\n <option value=\"paragraph\">Pragrafo</option>\r\n <option value=\"h1\">Intestazione 1</option>\r\n <option value=\"h2\">Intestazione 2</option>\r\n <option value=\"h3\">Intestazione 3</option>\r\n <option value=\"h4\">Intestazione 4</option>\r\n <option value=\"h5\">Intestazione 5</option>\r\n <option value=\"h6\">Intestazione 6</option>\r\n </select>\r\n\r\n <div class=\"divider\"></div>\r\n\r\n <!-- Formatting -->\r\n <button type=\"button\" (click)=\"setBold()\"><b>B</b></button>\r\n <button type=\"button\" (click)=\"setItalic()\"><i>I</i></button>\r\n <button type=\"button\" (click)=\"setUnderlined()\"><u>U</u></button>\r\n\r\n <!-- Lists -->\r\n @if(BulletListSupport()){\r\n <button type=\"button\" (click)=\"setBulletList()\">• Lista</button>\r\n }\r\n\r\n <div class=\"divider\"></div>\r\n\r\n @if(Mode() == \"html\" && TablesSupport())\r\n {\r\n <button type=\"button\" (click)=\"addTable()\">⊞<span style=\"font-size: 10px;\">✚</span></button>\r\n <button type=\"button\" (click)=\"deleteTable()\">⊞<span style=\"font-size: 10px;\">▬</span></button>\r\n <button type=\"button\" (click)=\"addRow()\">🖨<span style=\"font-size: 10px;\">✚</span></button>\r\n <button type=\"button\" (click)=\"deleteRow()\">🖨<span style=\"font-size: 10px;\">▬</span></button>\r\n <button type=\"button\" (click)=\"addColumn()\">🗄<span style=\"font-size: 10px;\">✚</span></button>\r\n <button type=\"button\" (click)=\"deleteColumn()\">🗄<span style=\"font-size: 10px;\">▬</span></button>\r\n <div class=\"divider\"></div>\r\n }\r\n\r\n <!-- History -->\r\n <button type=\"button\" (click)=\"undoAction()\">↶</button>\r\n <button type=\"button\" (click)=\"redoAction()\">↷</button>\r\n\r\n @if(EmojiSupport()){\r\n <select id=\"emoji-select\" (change)=\"setEmoji($event)\">\r\n <option value=\"\" hidden selected>😊</option>\r\n <option value=\"😊\">😊</option>\r\n <option value=\"😀\">😀</option>\r\n <option value=\"😂\">😂</option>\r\n <option value=\"🔥\">🔥</option>\r\n <option value=\"🎉\">🎉</option>\r\n <option value=\"🚀\">🚀</option>\r\n <option value=\"❤️\">❤️</option>\r\n <option value=\"👍\">👍</option>\r\n </select>\r\n }\r\n </div>\r\n }\r\n <div #element></div>\r\n</div>","import { InjectionToken } from \"@angular/core\";\r\n\r\nexport const TXE_DEBUG = new InjectionToken<boolean>('TXE_DEBUG');","/*\r\n * Public API Surface of text-editors\r\n */\r\n\r\nexport * from './lib/editor/editor.component';\r\n\r\nexport * from \"./lib/tokens\"","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"esfaenza-text-editors.mjs","sources":["../../../projects/text-editors/src/lib/editor/extensions/CustomMention.ts","../../../projects/text-editors/src/lib/editor/extensions/CustomeImageWithView.ts","../../../projects/text-editors/src/lib/editor/extensions/FontFamily.ts","../../../projects/text-editors/src/lib/editor/extensions/LineHeight.ts","../../../projects/text-editors/src/lib/editor/extensions/Suggestion.ts","../../../projects/text-editors/src/lib/editor/extensions/FontSize.ts","../../../projects/text-editors/src/lib/editor/editor.component.ts","../../../projects/text-editors/src/lib/editor/editor.component.html","../../../projects/text-editors/src/lib/tokens.ts","../../../projects/text-editors/src/public-api.ts","../../../projects/text-editors/src/esfaenza-text-editors.ts"],"sourcesContent":["import Mention from '@tiptap/extension-mention'\r\nimport { marked } from 'marked'\r\n\r\nexport const CustomMention = Mention.extend({\r\n renderMarkdown(node) { return `@${node.attrs?.id || node.attrs?.label}` },\r\n parseMarkdown(token) { return { type: token.type, attrs: { id: token.text, label: token.text } } },\r\n});\r\n\r\nmarked.use({\r\n extensions: [\r\n {\r\n name: 'mention',\r\n level: 'inline',\r\n\r\n start(src) {\r\n const match = /(^|\\s)@/.exec(src)\r\n return match ? match.index + match[1].length : undefined\r\n },\r\n\r\n tokenizer(src) {\r\n const match = /^@([a-zA-Z]+)(?=\\s|:|$)/.exec(src)\r\n if (match && match[1].length == 7)\r\n return { type: 'mention', raw: match[0], text: match[1] }\r\n },\r\n\r\n renderer(token) { return token.raw },\r\n },\r\n ],\r\n})\r\n\r\nexport const mymarked = marked;\r\n","import { Image } from '@tiptap/extension-image'\r\nimport { Plugin } from '@tiptap/pm/state'\r\n\r\nlet handleFiles = async (view: any, files: FileList | undefined) => {\r\n\r\n const file = Array.from(files || []).find(f => f.type.startsWith('image/'));\r\n\r\n if (!file) return;\r\n\r\n const reader = new FileReader();\r\n\r\n reader.onload = () => {\r\n\r\n const base64 = reader.result as string;\r\n const img = new window.Image();\r\n img.onload = () => {\r\n const { schema } = view.state;\r\n const node = schema.nodes.image.create({ src: base64, width: img.naturalWidth, float: \"none\" });\r\n const tr = view.state.tr.replaceSelectionWith(node);\r\n view.dispatch(tr);\r\n }\r\n img.src = base64;\r\n };\r\n\r\n reader.readAsDataURL(file);\r\n}\r\n\r\nconst CustomImage = Image.extend({\r\n draggable: true,\r\n selectable: true,\r\n addAttributes() {\r\n return {\r\n ...this.parent?.(),\r\n width: { default: null, },\r\n float: { default: \"none\" }, // 'left' | 'right' | 'none'\r\n src: {\r\n default: null,\r\n parseHTML: element => { return element.getAttribute('src') },\r\n renderHTML: attributes => { return { src: attributes.src, } },\r\n },\r\n };\r\n },\r\n renderMarkdown(node, _) {\r\n const src = node.attrs?.src\r\n const width = node.attrs?.width\r\n const float = node.attrs?.float\r\n\r\n // fallback to normal markdown when possible\r\n if ((!width || width === 'auto') && float === 'none') {\r\n return ``\r\n }\r\n\r\n // otherwise emit raw HTML\r\n const style = float === 'left' ? 'float:left; margin-right:10px;' : float === 'right' ? 'float:right; margin-left:10px;' : '';\r\n return `<img src=\"${src}\" width=\"${width || ''}\" style=\"${style}\" />`\r\n },\r\n\r\n parseMarkdown(token, helpers) {\r\n return helpers.createNode(\"image\", { src: token[\"href\"] || token[\"src\"], alt: token.content, float: token['float'] || 'none' })\r\n },\r\n renderHTML({ HTMLAttributes }) {\r\n const { float } = HTMLAttributes\r\n let style = ''\r\n if (float === 'left')\r\n style = 'float:left; display:block; margin-right: 10px'\r\n else if (float === 'right')\r\n style = 'float:right; display:block; margin-left: 10px'\r\n else\r\n style = `display: inline-block; float: none; vertical-align: middle;`\r\n\r\n return ['img', { ...HTMLAttributes, style }]\r\n },\r\n parseHTML() {\r\n return [\r\n {\r\n tag: 'img[src]',\r\n getAttrs: element => {\r\n const el = element as HTMLImageElement;\r\n const src = el.getAttribute('src')\r\n\r\n if (!src) return false\r\n\r\n // allow both normal URLs AND base64\r\n if (src.startsWith('http') || src.startsWith('data:image'))\r\n return { src, float: el.style.float || null, width: el.style.width ? parseInt(el.style.width) : null, }\r\n\r\n return false\r\n },\r\n },\r\n ]\r\n },\r\n addProseMirrorPlugins: () => {\r\n return [\r\n new Plugin({\r\n props: {\r\n handleDrop: (view, event) => {\r\n const files = event.dataTransfer?.files;\r\n if (!files?.length) return false;\r\n\r\n handleFiles(view, files);\r\n\r\n return true;\r\n },\r\n\r\n handlePaste: (view, event) => {\r\n const files = event.clipboardData?.files;\r\n if (!files?.length) return false;\r\n\r\n handleFiles(view, files);\r\n\r\n return true;\r\n },\r\n },\r\n })\r\n ]\r\n },\r\n});\r\n\r\nconst CustomImageWithView = CustomImage.extend({\r\n addNodeView: () => {\r\n return ({ node, getPos, editor }) => {\r\n\r\n let updateImage = (img: HTMLImageElement, node: any) => {\r\n img.draggable = false;\r\n img.src = node.attrs.src\r\n img.style.width = node.attrs.width ? `${node.attrs.width}px` : '';\r\n if (node.attrs.float === 'left' || node.attrs.float === 'right') {\r\n img.style.display = 'block'\r\n if (node.attrs.float === 'left')\r\n img.style.margin = \"0 10px 0 0\";\r\n else if (node.attrs.float === 'right')\r\n img.style.margin = \"0 0 0 10px\"\r\n } else {\r\n img.style.display = 'inline-block'\r\n img.style.verticalAlign = 'middle'\r\n }\r\n };\r\n\r\n let updateWrapper = (wrapper: HTMLDivElement, node: any) => {\r\n wrapper.draggable = true;\r\n wrapper.contentEditable = \"false\";\r\n\r\n // classList e non className: non deve cancellare \"ProseMirror-selectednode\" messa da ProseMirror sull'immagine selezionata\r\n wrapper.classList.add(`img-wrapper`);\r\n wrapper.style.float = node.attrs.float;\r\n\r\n if (node.attrs.float === 'left' || node.attrs.float === 'right') {\r\n wrapper.style.width = \"auto\";\r\n wrapper.style.textAlign = \"auto\";\r\n }\r\n else {\r\n wrapper.style.width = \"100%\";\r\n wrapper.style.textAlign = \"center\";\r\n }\r\n }\r\n\r\n const wrapper = document.createElement('div')\r\n updateWrapper(wrapper, node);\r\n\r\n const img = document.createElement('img')\r\n updateImage(img, node);\r\n\r\n const toolbar = document.createElement('div')\r\n toolbar.className = `img-toolbar ${editor.isEditable ? '' : 'readonly'}`;\r\n\r\n const btn = (title: string, icon: string, fn: any) => {\r\n const b = document.createElement('button');\r\n b.type = \"button\";\r\n b.title = title;\r\n b.setAttribute(\"aria-label\", title);\r\n b.innerHTML = `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"${icon}\" /></svg>`;\r\n b.onclick = fn;\r\n return b;\r\n }\r\n\r\n const setFloat = (float: string) => editor.view.dispatch(editor.view.state.tr.setNodeMarkup(getPos()!, undefined, { ...node.attrs, ...{ float } }));\r\n\r\n // Pulsanti di allineamento, indicizzati per valore di \"float\" per evidenziare quello attivo\r\n const alignButtons: Record<string, HTMLButtonElement> = {\r\n left: btn('Allinea a sinistra', 'M15 12H3M17 18H3M21 6H3', () => setFloat('left')),\r\n none: btn('Centra', 'M17 12H7M19 18H5M21 6H3', () => setFloat('none')),\r\n right: btn('Allinea a destra', 'M21 12H9M21 18H7M21 6H3', () => setFloat('right')),\r\n };\r\n\r\n const separator = document.createElement('span');\r\n separator.className = 'img-toolbar-divider';\r\n\r\n const deleteButton = btn('Elimina immagine', 'M3 6h18M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2M10 11v6M14 11v6', () => {\r\n const nodePos = getPos()!;\r\n editor.view.dispatch(editor.view.state.tr.delete(nodePos, nodePos + node.nodeSize))\r\n });\r\n deleteButton.classList.add('danger');\r\n\r\n toolbar.append(alignButtons['left'], alignButtons['none'], alignButtons['right'], separator, deleteButton);\r\n\r\n const updateToolbar = (node: any) => {\r\n const float = node.attrs.float === 'left' || node.attrs.float === 'right' ? node.attrs.float : 'none';\r\n Object.entries(alignButtons).forEach(([key, b]) => b.classList.toggle('is-active', key === float));\r\n }\r\n updateToolbar(node);\r\n\r\n // resize\r\n let startX = 0;\r\n let startW = 0;\r\n\r\n const handle = document.createElement('div');\r\n handle.className = `img-resize-handle ${editor.isEditable ? '' : 'readonly'}`;\r\n\r\n handle.onmousedown = (e) => {\r\n startX = e.clientX\r\n startW = img.offsetWidth\r\n\r\n let latestWidth: number | null = null\r\n let ticking = false\r\n\r\n const move = (e: any) => {\r\n latestWidth = Math.max(80, startW + (e.clientX - startX));\r\n\r\n if (!ticking) {\r\n ticking = true\r\n\r\n requestAnimationFrame(() => {\r\n const nodePos = getPos()!;\r\n editor.view.dispatch(editor.view.state.tr.setNodeMarkup(nodePos, undefined, { ...node.attrs, width: latestWidth }))\r\n ticking = false\r\n });\r\n }\r\n }\r\n\r\n const up = () => {\r\n window.removeEventListener('mousemove', move);\r\n window.removeEventListener('mouseup', up);\r\n }\r\n\r\n window.addEventListener('mousemove', move);\r\n window.addEventListener('mouseup', up);\r\n\r\n // Per evitare che si attivi il drag dell'elemento sotto. Dal resizer si usa solo il resizer\r\n e.preventDefault();\r\n }\r\n\r\n wrapper.append(img, toolbar, handle);\r\n\r\n return {\r\n dom: wrapper,\r\n destroy() { wrapper.remove() },\r\n update(updatedNode) {\r\n\r\n // different node type -> recreate NodeView\r\n if (updatedNode.type !== node.type)\r\n return false\r\n\r\n node = updatedNode\r\n updateImage(img, node);\r\n updateWrapper(wrapper, node);\r\n updateToolbar(node);\r\n\r\n return true\r\n },\r\n };\r\n }\r\n },\r\n});\r\n\r\nexport default CustomImageWithView;","import { Extension } from \"@tiptap/core\";\r\n\r\nconst FontFamily = Extension.create({\r\n name: 'fontFamily',\r\n\r\n addGlobalAttributes() {\r\n return [\r\n {\r\n types: ['textStyle'],\r\n attributes: {\r\n fontFamily: {\r\n default: null,\r\n parseHTML: element => element.style.fontFamily,\r\n renderHTML: attributes => {\r\n if (!attributes.fontFamily) return {};\r\n return { style: `font-family: ${attributes.fontFamily}` };\r\n },\r\n },\r\n },\r\n },\r\n ]\r\n },\r\n addCommands() {\r\n return {\r\n setFontFamily: (fontFamily: string) => ({ chain }) => { return chain().setMark('textStyle', { fontFamily }).run(); },\r\n unsetFontFamily: () => ({ chain }) => { return chain().setMark('textStyle', { fontFamily: null, }).removeEmptyTextStyle().run() },\r\n }\r\n },\r\n});\r\n\r\nexport default FontFamily;","import { Extension } from \"@tiptap/core\";\r\n\r\nconst LineHeight = Extension.create({\r\n name: 'lineHeight',\r\n\r\n addGlobalAttributes() {\r\n return [\r\n {\r\n types: ['paragraph', 'heading'],\r\n attributes: {\r\n lineHeight: {\r\n default: null,\r\n parseHTML: element => element.style.lineHeight,\r\n renderHTML: attributes => {\r\n if (!attributes.lineHeight) return {};\r\n return { style: `line-height: ${attributes.lineHeight}` };\r\n },\r\n },\r\n },\r\n },\r\n ]\r\n },\r\n addCommands() {\r\n return {\r\n setLineHeight: (lineHeight: string) => ({ commands }) => { return commands.updateAttributes('paragraph', { lineHeight }) },\r\n unsetLineHeight: () => ({ commands }) => { return commands.updateAttributes('paragraph', { lineHeight: null }) },\r\n }\r\n },\r\n});\r\n\r\nexport default LineHeight;","let Suggestion = (choiches: { id: string, description: string }[]) => {\r\n \r\n\r\n return {\r\n char: '@',\r\n\r\n items: ({ query }: { query: string }) => {\r\n return choiches.filter(item => item.description.toLowerCase().startsWith(query.toLowerCase())).slice(0, 5);\r\n },\r\n\r\n render: () => {\r\n let popup: HTMLDivElement;\r\n let selectedIndex = 0\r\n let currentProps: any\r\n\r\n return {\r\n onStart: (props: any) => {\r\n popup = document.createElement('div')\r\n popup.classList.add('suggestion-popup')\r\n\r\n document.body.appendChild(popup)\r\n\r\n currentProps = props;\r\n updatePopup();\r\n },\r\n onKeyDown(props: any) {\r\n if (props.event.key === 'ArrowUp') {\r\n selectedIndex = (selectedIndex + currentProps.items.length - 1) % currentProps.items.length\r\n updatePopup()\r\n return true\r\n }\r\n\r\n if (props.event.key === 'ArrowDown') {\r\n selectedIndex = (selectedIndex + 1) % currentProps.items.length\r\n updatePopup()\r\n return true\r\n }\r\n\r\n if (props.event.key === 'Enter') {\r\n selectItem()\r\n return true\r\n }\r\n\r\n return false\r\n },\r\n onUpdate(props: any) { \r\n currentProps = props;\r\n updatePopup();\r\n },\r\n onExit() { popup.remove(); },\r\n }\r\n\r\n function updatePopup() {\r\n if (!currentProps.clientRect)\r\n return\r\n\r\n popup.innerHTML = '';\r\n\r\n currentProps.items.forEach((item: { id: string, description: string }, index: number) => {\r\n const button = document.createElement('button')\r\n\r\n button.textContent = item.description\r\n\r\n if (index === selectedIndex)\r\n button.classList.add('is-selected')\r\n\r\n button.addEventListener('click', () => {\r\n selectedIndex = index\r\n selectItem()\r\n })\r\n\r\n popup.appendChild(button)\r\n });\r\n\r\n const rect = currentProps.clientRect();\r\n popup.style.position = 'fixed'\r\n popup.style.left = `${rect.left}px`\r\n popup.style.top = `${rect.bottom + 5}px`\r\n }\r\n\r\n function selectItem() {\r\n const item = currentProps.items[selectedIndex]\r\n\r\n if (item)\r\n currentProps.command({ id: item.id, description: item.description, });\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default Suggestion;","import { Extension } from \"@tiptap/core\";\r\n\r\nconst FontSize = Extension.create({\r\n name: 'fontSize',\r\n\r\n addGlobalAttributes() {\r\n return [\r\n {\r\n types: ['textStyle'],\r\n attributes: {\r\n fontSize: {\r\n default: null,\r\n parseHTML: element => {\r\n const size = element.style.fontSize;\r\n if (!size) return null;\r\n // normalize pt → px\r\n if (size.endsWith('pt'))\r\n return `${Math.round(parseFloat(size) * 1.333)}px`;\r\n return size;\r\n },\r\n renderHTML: attributes => {\r\n if (!attributes.fontSize) return {};\r\n\r\n return { style: `font-size: ${attributes.fontSize}` }\r\n },\r\n },\r\n },\r\n },\r\n ]\r\n },\r\n addCommands() {\r\n return {\r\n setFontSize: (fontSize: string) => ({ chain }) => { return chain().setMark('textStyle', { fontSize }).run() },\r\n unsetFontSize: () => ({ chain }) => { return chain().setMark('textStyle', { fontSize: null }).removeEmptyTextStyle().run() },\r\n }\r\n },\r\n})\r\n\r\nexport default FontSize;","import { CommonModule } from \"@angular/common\";\r\nimport { booleanAttribute, Component, ElementRef, EventEmitter, forwardRef, HostListener, input, Output, signal, viewChild, ViewEncapsulation } from \"@angular/core\";\r\nimport { AbstractControl, ControlValueAccessor, FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR, ValidationErrors, Validator } from \"@angular/forms\";\r\n\r\nimport { Editor } from '@tiptap/core'\r\nimport { Markdown } from '@tiptap/markdown'\r\nimport { StarterKit } from '@tiptap/starter-kit'\r\nimport { TextStyle } from '@tiptap/extension-text-style'\r\nimport { Color } from '@tiptap/extension-color'\r\nimport { Table } from '@tiptap/extension-table'\r\nimport { TableRow } from '@tiptap/extension-table-row'\r\nimport { TableCell } from '@tiptap/extension-table-cell'\r\nimport { TableHeader } from '@tiptap/extension-table-header'\r\nimport { TextAlign } from '@tiptap/extension-text-align'\r\n\r\nimport { CustomMention, mymarked } from \"./extensions/CustomMention\";\r\nimport CustomImageWithView from \"./extensions/CustomeImageWithView\";\r\nimport FontFamily from \"./extensions/FontFamily\";\r\nimport LineHeight from \"./extensions/LineHeight\";\r\nimport Suggestion from \"./extensions/Suggestion\";\r\nimport FontSize from \"./extensions/FontSize\";\r\n\r\n@Component({\r\n selector: \"es-editor\",\r\n templateUrl: \"./editor.component.html\",\r\n styleUrls: [\"./editor.component.scss\"],\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => EditorComponent), multi: true },\r\n { provide: NG_VALIDATORS, useExisting: forwardRef(() => EditorComponent), multi: true }\r\n ]\r\n})\r\nexport class EditorComponent implements ControlValueAccessor, Validator {\r\n\r\n protected onChange = (_: any) => { };\r\n public onTouched = () => { };\r\n public registerOnChange(fn: any): void { this.onChange = fn; }\r\n public registerOnTouched(fn: any): void { this.onTouched = fn; }\r\n\r\n validate(_: AbstractControl): ValidationErrors | null {\r\n return null;\r\n }\r\n\r\n private element = viewChild.required<ElementRef<HTMLDivElement>>(\"element\");\r\n\r\n public EmojiSupport = input<boolean>(false);\r\n public BulletListSupport = input<boolean>(false);\r\n public TablesSupport = input<boolean>(false);\r\n public Mode = input.required<'html' | 'markdown' | 'text'>();\r\n public readonly = input(false, { transform: booleanAttribute });\r\n public disabled = input(false, { transform: booleanAttribute });\r\n public required = input(false, { transform: booleanAttribute });\r\n public style = input(\"\");\r\n\r\n public MentionEntities = input<{ id: string, description: string }[]>([]);\r\n\r\n public name = input.required<string>();\r\n\r\n private EditorRef?: Editor;\r\n public value: any;\r\n\r\n // Font disponibili nella toolbar (solo html): font \"web safe\", perché il valore viene visualizzato anche fuori dall'editor\r\n public readonly FontFamilies: { label: string, value: string }[] = [\r\n { label: \"Arial\", value: \"Arial, Helvetica, sans-serif\" },\r\n { label: \"Verdana\", value: \"Verdana, Geneva, sans-serif\" },\r\n { label: \"Tahoma\", value: \"Tahoma, Geneva, sans-serif\" },\r\n { label: \"Trebuchet MS\", value: \"'Trebuchet MS', Helvetica, sans-serif\" },\r\n { label: \"Georgia\", value: \"Georgia, serif\" },\r\n { label: \"Times New Roman\", value: \"'Times New Roman', Times, serif\" },\r\n { label: \"Courier New\", value: \"'Courier New', Courier, monospace\" },\r\n ];\r\n public readonly FontSizes: string[] = [\"10px\", \"12px\", \"14px\", \"16px\", \"18px\", \"20px\", \"24px\", \"28px\", \"32px\"];\r\n\r\n // Stato della selezione corrente, per evidenziare/abilitare i comandi della toolbar. Aggiornato a ogni transazione\r\n public Toolbar = signal<ToolbarState>(EMPTY_TOOLBAR_STATE);\r\n\r\n // Menu delle tabelle: menu custom e non <select>, perché su alcuni browser la select nativa usata come menu\r\n // di azioni non permetteva di scegliere le voci. Posizione fixed calcolata dal pulsante: .editor-shell ha\r\n // overflow hidden e taglierebbe un menu posizionato in absolute. null = chiuso\r\n public TableMenu = signal<{ top: number, left: number } | null>(null);\r\n private tableMenuRef = viewChild<ElementRef<HTMLElement>>(\"tableMenu\");\r\n\r\n @Output() inputChange: EventEmitter<string> = new EventEmitter<string>();\r\n @Output() inputFocus: EventEmitter<any> = new EventEmitter<any>();\r\n @Output() inputFinalized: EventEmitter<string> = new EventEmitter<string>();\r\n\r\n ngOnInit() {\r\n let config = [];\r\n\r\n config.push(...[\r\n StarterKit,\r\n TextStyle,\r\n Color,\r\n FontSize,\r\n FontFamily,\r\n LineHeight,\r\n TextAlign.configure({ types: ['heading', 'paragraph'] }),\r\n CustomImageWithView\r\n ]);\r\n\r\n if (this.Mode() == \"markdown\")\r\n config.push(Markdown.configure({ marked: mymarked }));\r\n\r\n if (this.Mode() == \"html\") {\r\n if (this.TablesSupport())\r\n config.push(...[Table.configure({ lastColumnResizable: true, resizable: true }), TableRow, TableHeader, TableCell]);\r\n }\r\n\r\n if ((this.MentionEntities()?.length || 0) > 0)\r\n config.push(CustomMention.configure({\r\n deleteTriggerWithBackspace: true,\r\n HTMLAttributes: { class: 'mention' },\r\n renderText({ options, node }) { return `${options.suggestion.char}${node.attrs.description ?? node.attrs.id}` },\r\n suggestion: Suggestion(this.MentionEntities()),\r\n }),);\r\n\r\n this.EditorRef = new Editor({\r\n element: this.element().nativeElement,\r\n extensions: config,\r\n editable: !this.readonly(),\r\n onBlur: () => this.onTouched(),\r\n onTransaction: () => this.updateToolbarState(),\r\n onUpdate: (_) => {\r\n let value = \"\";\r\n switch (this.Mode()) {\r\n case \"html\":\r\n value = this.EditorRef?.getHTML() || \"\";\r\n // Emissione del valore vuoto trimmato per bene\r\n if (value.trim() === \"<p></p>\")\r\n value = \"\";\r\n break;\r\n case \"markdown\": value = this.EditorRef?.getMarkdown() || \"\"; break;\r\n case \"text\": value = this.EditorRef?.getText() || \"\"; break;\r\n }\r\n\r\n this.onChange(value);\r\n }\r\n });\r\n }\r\n\r\n public async writeValue(obj: any): Promise<void> {\r\n // Coercizione di tutti i valori \"vuoti\" all'unico \"null\"\r\n if (obj === null || obj === undefined) obj = null;\r\n\r\n this.value = obj;\r\n\r\n // normalizzazione per la firma di merda di CEA\r\n this.value = this.value?.replace(/^\\*\\*\\*\\*\\*\\*\\s\\s/g, '') || \"\"\r\n this.value = this.value?.replace(/^\\*\\*\\s\\s/g, '') || \"\"\r\n\r\n // Il caricamento di un valore non è una modifica dell'utente: niente evento di update,\r\n // quindi niente onChange e il controllo resta pristine\r\n if (this.Mode() === \"markdown\")\r\n this.EditorRef?.commands.setContent(this.value, { contentType: \"markdown\", emitUpdate: false });\r\n else if (this.Mode() === \"html\")\r\n this.EditorRef?.commands.setContent(this.value, { contentType: \"html\", emitUpdate: false });\r\n else\r\n this.EditorRef?.chain().setMeta(\"preventUpdate\", true).clearContent(false).insertContent(this.value).run();\r\n }\r\n\r\n private updateToolbarState() {\r\n const editor = this.EditorRef;\r\n if (!editor) return;\r\n\r\n const attrs = editor.getAttributes(\"textStyle\");\r\n const level = [1, 2, 3, 4, 5, 6].find(l => editor.isActive(\"heading\", { level: l }));\r\n\r\n this.Toolbar.set({\r\n block: level ? `h${level}` : \"paragraph\",\r\n // \"\" = predefinito, misto o non in elenco\r\n fontFamily: this.FontFamilies.find(f => sameFontFamily(f.value, attrs[\"fontFamily\"]))?.value || \"\",\r\n fontSize: this.FontSizes.find(s => s === attrs[\"fontSize\"]) || \"\",\r\n bold: editor.isActive(\"bold\"),\r\n italic: editor.isActive(\"italic\"),\r\n underline: editor.isActive(\"underline\"),\r\n bulletList: editor.isActive(\"bulletList\"),\r\n inTable: this.TablesSupport() && editor.can().deleteTable(),\r\n canUndo: editor.can().undo(),\r\n canRedo: editor.can().redo(),\r\n });\r\n }\r\n\r\n setFontFamily(selectElement: Event) {\r\n const value = (selectElement.target as HTMLSelectElement).value;\r\n if (value) this.EditorRef?.chain().focus().setFontFamily(value).run();\r\n else this.EditorRef?.chain().focus().unsetFontFamily().run();\r\n }\r\n setFontSize(selectElement: Event) {\r\n const value = (selectElement.target as HTMLSelectElement).value;\r\n if (value) this.EditorRef?.chain().focus().setFontSize(value).run();\r\n else this.EditorRef?.chain().focus().unsetFontSize().run();\r\n }\r\n\r\n setTypography(selectElement: Event) {\r\n const select = selectElement.target as HTMLSelectElement\r\n switch (select.value) {\r\n case \"paragraph\": this.EditorRef?.chain().focus().setParagraph().run(); break;\r\n default: this.EditorRef?.chain().focus().setHeading({ level: parseInt(select.value.charAt(1)) as any }).run(); break;\r\n }\r\n }\r\n setBold() {\r\n this.EditorRef?.chain().focus().toggleBold().run();\r\n }\r\n setItalic() {\r\n this.EditorRef?.chain().focus().toggleItalic().run();\r\n }\r\n setUnderlined() {\r\n this.EditorRef?.chain().focus().toggleUnderline().run();\r\n }\r\n setBulletList() {\r\n this.EditorRef?.chain().focus().toggleBulletList().run();\r\n }\r\n undoAction() {\r\n this.EditorRef?.chain().focus().undo().run();\r\n }\r\n redoAction() {\r\n this.EditorRef?.chain().focus().redo().run();\r\n }\r\n addTable() {\r\n this.EditorRef?.chain().focus().insertTable({ rows: 1, cols: 2, withHeaderRow: false }).run()\r\n }\r\n deleteTable() {\r\n this.EditorRef?.chain().focus().deleteTable().run();\r\n }\r\n addRow() {\r\n this.EditorRef?.chain().focus().addRowAfter().run();\r\n }\r\n deleteRow() {\r\n this.EditorRef?.chain().focus().deleteRow().run();\r\n }\r\n addColumn() {\r\n this.EditorRef?.chain().focus().addColumnAfter().run();\r\n }\r\n deleteColumn() {\r\n this.EditorRef?.chain().focus().deleteColumn().run();\r\n }\r\n toggleTableMenu(button: HTMLElement) {\r\n if (this.TableMenu()) {\r\n this.closeTableMenu();\r\n return;\r\n }\r\n this.tableMenuButton = button;\r\n this.positionTableMenu();\r\n // Il menu segue il pulsante: scroll in capture per intercettare anche i contenitori scrollabili, non solo la pagina\r\n window.addEventListener(\"scroll\", this.positionTableMenu, true);\r\n window.addEventListener(\"resize\", this.positionTableMenu);\r\n }\r\n private tableMenuButton?: HTMLElement;\r\n private readonly positionTableMenu = () => {\r\n const rect = this.tableMenuButton?.getBoundingClientRect();\r\n if (rect)\r\n this.TableMenu.set({ top: rect.bottom + 4, left: rect.left });\r\n }\r\n tableAction(action: \"insert\" | \"addRow\" | \"deleteRow\" | \"addColumn\" | \"deleteColumn\" | \"delete\") {\r\n this.closeTableMenu();\r\n switch (action) {\r\n case \"insert\": this.addTable(); break;\r\n case \"addRow\": this.addRow(); break;\r\n case \"deleteRow\": this.deleteRow(); break;\r\n case \"addColumn\": this.addColumn(); break;\r\n case \"deleteColumn\": this.deleteColumn(); break;\r\n case \"delete\": this.deleteTable(); break;\r\n }\r\n }\r\n\r\n // Chiusura del menu tabelle: click fuori o Esc\r\n @HostListener(\"document:mousedown\", [\"$event\"])\r\n onDocumentMouseDown(event: MouseEvent) {\r\n if (this.TableMenu() && !this.tableMenuRef()?.nativeElement.contains(event.target as Node))\r\n this.closeTableMenu();\r\n }\r\n @HostListener(\"document:keydown.escape\")\r\n closeTableMenu() {\r\n if (!this.TableMenu()) return;\r\n this.TableMenu.set(null);\r\n window.removeEventListener(\"scroll\", this.positionTableMenu, true);\r\n window.removeEventListener(\"resize\", this.positionTableMenu);\r\n }\r\n\r\n ngOnDestroy() {\r\n this.closeTableMenu();\r\n }\r\n setEmoji(selectElement: Event) {\r\n const select = selectElement.target as HTMLSelectElement;\r\n this.EditorRef?.chain().focus().insertContent(select.value).run();\r\n select.value = \"\";\r\n }\r\n}\r\n\r\ninterface ToolbarState {\r\n block: string;\r\n fontFamily: string;\r\n fontSize: string;\r\n bold: boolean;\r\n italic: boolean;\r\n underline: boolean;\r\n bulletList: boolean;\r\n inTable: boolean;\r\n canUndo: boolean;\r\n canRedo: boolean;\r\n}\r\n\r\nconst EMPTY_TOOLBAR_STATE: ToolbarState = {\r\n block: \"paragraph\", fontFamily: \"\", fontSize: \"\",\r\n bold: false, italic: false, underline: false, bulletList: false,\r\n inTable: false, canUndo: false, canRedo: false,\r\n};\r\n\r\n// Confronta due font-family sul primo font dell'elenco: il browser riscrive le virgolette\r\n// in fase di parsing ('Times New Roman' -> \"Times New Roman\"), quindi le stringhe intere non coincidono\r\nfunction sameFontFamily(a?: string | null, b?: string | null): boolean {\r\n const first = (f?: string | null) => (f || \"\").split(\",\")[0].trim().replace(/^['\"]|['\"]$/g, \"\").toLowerCase();\r\n return !!first(a) && first(a) === first(b);\r\n}\r\n","<div class=\"editor-shell\" [class.readonly]=\"readonly()\" [attr.style]=\"style()\">\r\n @if(!readonly()){\r\n <!-- (mousedown) preventDefault sui pulsanti: il click non toglie il focus all'editor, quindi la selezione resta visibile -->\r\n <div class=\"editor-toolbar\" role=\"toolbar\" aria-label=\"Formattazione\">\r\n\r\n <!-- Typography -->\r\n <select class=\"heading-select\" title=\"Stile del paragrafo\" (change)=\"setTypography($event)\">\r\n <option value=\"paragraph\" [selected]=\"Toolbar().block == 'paragraph'\">Paragrafo</option>\r\n <option value=\"h1\" [selected]=\"Toolbar().block == 'h1'\">Intestazione 1</option>\r\n <option value=\"h2\" [selected]=\"Toolbar().block == 'h2'\">Intestazione 2</option>\r\n <option value=\"h3\" [selected]=\"Toolbar().block == 'h3'\">Intestazione 3</option>\r\n <option value=\"h4\" [selected]=\"Toolbar().block == 'h4'\">Intestazione 4</option>\r\n <option value=\"h5\" [selected]=\"Toolbar().block == 'h5'\">Intestazione 5</option>\r\n <option value=\"h6\" [selected]=\"Toolbar().block == 'h6'\">Intestazione 6</option>\r\n </select>\r\n\r\n <!-- Font: solo html, il markdown non ha una sintassi per rappresentarli -->\r\n @if(Mode() == \"html\"){\r\n <select class=\"font-family-select\" title=\"Carattere\" (change)=\"setFontFamily($event)\">\r\n <option value=\"\" [selected]=\"Toolbar().fontFamily == ''\">Carattere</option>\r\n @for(f of FontFamilies; track f.value){\r\n <option [value]=\"f.value\" [selected]=\"Toolbar().fontFamily == f.value\" [style.font-family]=\"f.value\">{{ f.label }}</option>\r\n }\r\n </select>\r\n <select class=\"font-size-select\" title=\"Dimensione\" (change)=\"setFontSize($event)\">\r\n <option value=\"\" [selected]=\"Toolbar().fontSize == ''\">Dimensione</option>\r\n @for(s of FontSizes; track s){\r\n <option [value]=\"s\" [selected]=\"Toolbar().fontSize == s\">{{ s }}</option>\r\n }\r\n </select>\r\n }\r\n\r\n <div class=\"divider\"></div>\r\n\r\n <!-- Formatting -->\r\n <button type=\"button\" class=\"tb-btn\" title=\"Grassetto\" aria-label=\"Grassetto\" [class.is-active]=\"Toolbar().bold\" [attr.aria-pressed]=\"Toolbar().bold\" (mousedown)=\"$event.preventDefault()\" (click)=\"setBold()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8\" /></svg>\r\n </button>\r\n <button type=\"button\" class=\"tb-btn\" title=\"Corsivo\" aria-label=\"Corsivo\" [class.is-active]=\"Toolbar().italic\" [attr.aria-pressed]=\"Toolbar().italic\" (mousedown)=\"$event.preventDefault()\" (click)=\"setItalic()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M19 4h-9M14 20H5M15 4 9 20\" /></svg>\r\n </button>\r\n <button type=\"button\" class=\"tb-btn\" title=\"Sottolineato\" aria-label=\"Sottolineato\" [class.is-active]=\"Toolbar().underline\" [attr.aria-pressed]=\"Toolbar().underline\" (mousedown)=\"$event.preventDefault()\" (click)=\"setUnderlined()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M6 4v6a6 6 0 0 0 12 0V4M4 20h16\" /></svg>\r\n </button>\r\n\r\n <!-- Lists -->\r\n @if(BulletListSupport()){\r\n <button type=\"button\" class=\"tb-btn\" title=\"Elenco puntato\" aria-label=\"Elenco puntato\" [class.is-active]=\"Toolbar().bulletList\" [attr.aria-pressed]=\"Toolbar().bulletList\" (mousedown)=\"$event.preventDefault()\" (click)=\"setBulletList()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M9 6h11M9 12h11M9 18h11M4 6h.01M4 12h.01M4 18h.01\" /></svg>\r\n </button>\r\n }\r\n\r\n <!-- Tables: un unico menu, le voci che agiscono su una tabella esistente sono attive solo con il cursore al suo interno -->\r\n @if(Mode() == \"html\" && TablesSupport()){\r\n <div class=\"divider\"></div>\r\n <div class=\"tb-dropdown\" #tableMenu>\r\n <button #tableMenuButton type=\"button\" class=\"tb-btn tb-btn-text\" title=\"Tabella\" aria-haspopup=\"menu\" [class.is-active]=\"!!TableMenu()\" [attr.aria-expanded]=\"!!TableMenu()\" (mousedown)=\"$event.preventDefault()\" (click)=\"toggleTableMenu(tableMenuButton)\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" /><path d=\"M3 9h18M3 15h18M12 3v18\" /></svg>\r\n <span>Tabella</span>\r\n <svg class=\"chevron\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"m6 9 6 6 6-6\" /></svg>\r\n </button>\r\n @if(TableMenu(); as pos){\r\n <div class=\"tb-dropdown-menu\" role=\"menu\" [style.top.px]=\"pos.top\" [style.left.px]=\"pos.left\">\r\n <button type=\"button\" role=\"menuitem\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('insert')\">Inserisci tabella</button>\r\n <div class=\"tb-dropdown-separator\"></div>\r\n <button type=\"button\" role=\"menuitem\" [disabled]=\"!Toolbar().inTable\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('addRow')\">Aggiungi riga sotto</button>\r\n <button type=\"button\" role=\"menuitem\" [disabled]=\"!Toolbar().inTable\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('addColumn')\">Aggiungi colonna a destra</button>\r\n <div class=\"tb-dropdown-separator\"></div>\r\n <button type=\"button\" role=\"menuitem\" class=\"danger\" [disabled]=\"!Toolbar().inTable\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('deleteRow')\">Elimina riga</button>\r\n <button type=\"button\" role=\"menuitem\" class=\"danger\" [disabled]=\"!Toolbar().inTable\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('deleteColumn')\">Elimina colonna</button>\r\n <button type=\"button\" role=\"menuitem\" class=\"danger\" [disabled]=\"!Toolbar().inTable\" (mousedown)=\"$event.preventDefault()\" (click)=\"tableAction('delete')\">Elimina tabella</button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"divider\"></div>\r\n\r\n <!-- History -->\r\n <button type=\"button\" class=\"tb-btn\" title=\"Annulla\" aria-label=\"Annulla\" [disabled]=\"!Toolbar().canUndo\" (mousedown)=\"$event.preventDefault()\" (click)=\"undoAction()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M9 14 4 9l5-5\" /><path d=\"M4 9h10.5a5.5 5.5 0 0 1 0 11H11\" /></svg>\r\n </button>\r\n <button type=\"button\" class=\"tb-btn\" title=\"Ripeti\" aria-label=\"Ripeti\" [disabled]=\"!Toolbar().canRedo\" (mousedown)=\"$event.preventDefault()\" (click)=\"redoAction()\">\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"m15 14 5-5-5-5\" /><path d=\"M20 9H9.5a5.5 5.5 0 0 0 0 11H13\" /></svg>\r\n </button>\r\n\r\n @if(EmojiSupport()){\r\n <select class=\"emoji-select\" title=\"Emoji\" aria-label=\"Emoji\" (change)=\"setEmoji($event)\">\r\n <option value=\"\" hidden selected>😊</option>\r\n <option value=\"😊\">😊</option>\r\n <option value=\"😀\">😀</option>\r\n <option value=\"😂\">😂</option>\r\n <option value=\"🔥\">🔥</option>\r\n <option value=\"🎉\">🎉</option>\r\n <option value=\"🚀\">🚀</option>\r\n <option value=\"❤️\">❤️</option>\r\n <option value=\"👍\">👍</option>\r\n </select>\r\n }\r\n </div>\r\n }\r\n <div #element></div>\r\n</div>\r\n","import { InjectionToken } from \"@angular/core\";\r\n\r\nexport const TXE_DEBUG = new InjectionToken<boolean>('TXE_DEBUG');","/*\r\n * Public API Surface of text-editors\r\n */\r\n\r\nexport * from './lib/editor/editor.component';\r\n\r\nexport * from \"./lib/tokens\"","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAGO,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;AACxC,IAAA,cAAc,CAAC,IAAI,EAAA,EAAI,OAAO,CAAA,CAAA,EAAI,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,CAAA,CAAE,CAAA,CAAC,CAAC;AACzE,IAAA,aAAa,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,CAAA,CAAC,CAAC;AACrG,CAAA,CAAC;AAEF,MAAM,CAAC,GAAG,CAAC;AACP,IAAA,UAAU,EAAE;AACR,QAAA;AACI,YAAA,IAAI,EAAE,SAAS;AACf,YAAA,KAAK,EAAE,QAAQ;AAEf,YAAA,KAAK,CAAC,GAAG,EAAA;gBACL,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;AACjC,gBAAA,OAAO,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,SAAS;YAC5D,CAAC;AAED,YAAA,SAAS,CAAC,GAAG,EAAA;gBACT,MAAM,KAAK,GAAG,yBAAyB,CAAC,IAAI,CAAC,GAAG,CAAC;gBACjD,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC;AAC7B,oBAAA,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE;YACjE,CAAC;YAED,QAAQ,CAAC,KAAK,EAAA,EAAI,OAAO,KAAK,CAAC,GAAG,CAAA,CAAC,CAAC;AACvC,SAAA;AACJ,KAAA;AACJ,CAAA,CAAC;AAEK,MAAM,QAAQ,GAAG,MAAM;;AC3B9B,IAAI,WAAW,GAAG,OAAO,IAAS,EAAE,KAA2B,KAAI;IAE/D,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AAE3E,IAAA,IAAI,CAAC,IAAI;QAAE;AAEX,IAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE;AAE/B,IAAA,MAAM,CAAC,MAAM,GAAG,MAAK;AAEjB,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAgB;AACtC,QAAA,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,KAAK,EAAE;AAC9B,QAAA,GAAG,CAAC,MAAM,GAAG,MAAK;AACd,YAAA,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK;YAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC/F,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC;AACnD,YAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;AACrB,QAAA,CAAC;AACD,QAAA,GAAG,CAAC,GAAG,GAAG,MAAM;AACpB,IAAA,CAAC;AAED,IAAA,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC;AAC9B,CAAC;AAED,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;AAC7B,IAAA,SAAS,EAAE,IAAI;AACf,IAAA,UAAU,EAAE,IAAI;IAChB,aAAa,GAAA;QACT,OAAO;AACH,YAAA,GAAG,IAAI,CAAC,MAAM,IAAI;AAClB,YAAA,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,GAAG;AACzB,YAAA,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;AAC1B,YAAA,GAAG,EAAE;AACD,gBAAA,OAAO,EAAE,IAAI;AACb,gBAAA,SAAS,EAAE,OAAO,MAAM,OAAO,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA,CAAC,CAAC;AAC5D,gBAAA,UAAU,EAAE,UAAU,MAAM,OAAO,EAAE,GAAG,EAAE,UAAU,CAAC,GAAG,GAAG,CAAA,CAAC,CAAC;AAChE,aAAA;SACJ;IACL,CAAC;IACD,cAAc,CAAC,IAAI,EAAE,CAAC,EAAA;AAClB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG;AAC3B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK;AAC/B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK;;AAG/B,QAAA,IAAI,CAAC,CAAC,KAAK,IAAI,KAAK,KAAK,MAAM,KAAK,KAAK,KAAK,MAAM,EAAE;YAClD,OAAO,CAAA,SAAA,EAAY,GAAG,CAAA,CAAA,CAAG;QAC7B;;QAGA,MAAM,KAAK,GAAG,KAAK,KAAK,MAAM,GAAG,gCAAgC,GAAG,KAAK,KAAK,OAAO,GAAG,gCAAgC,GAAG,EAAE;QAC7H,OAAO,CAAA,UAAA,EAAa,GAAG,CAAA,SAAA,EAAY,KAAK,IAAI,EAAE,CAAA,SAAA,EAAY,KAAK,CAAA,IAAA,CAAM;IACzE,CAAC;IAED,aAAa,CAAC,KAAK,EAAE,OAAO,EAAA;AACxB,QAAA,OAAO,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,MAAM,EAAE,CAAC;IACnI,CAAC;IACD,UAAU,CAAC,EAAE,cAAc,EAAE,EAAA;AACzB,QAAA,MAAM,EAAE,KAAK,EAAE,GAAG,cAAc;QAChC,IAAI,KAAK,GAAG,EAAE;QACd,IAAI,KAAK,KAAK,MAAM;YAChB,KAAK,GAAG,+CAA+C;aACtD,IAAI,KAAK,KAAK,OAAO;YACtB,KAAK,GAAG,+CAA+C;;YAEvD,KAAK,GAAG,6DAA6D;QAEzE,OAAO,CAAC,KAAK,EAAE,EAAE,GAAG,cAAc,EAAE,KAAK,EAAE,CAAC;IAChD,CAAC;IACD,SAAS,GAAA;QACL,OAAO;AACH,YAAA;AACI,gBAAA,GAAG,EAAE,UAAU;gBACf,QAAQ,EAAE,OAAO,IAAG;oBAChB,MAAM,EAAE,GAAG,OAA2B;oBACtC,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC;AAElC,oBAAA,IAAI,CAAC,GAAG;AAAE,wBAAA,OAAO,KAAK;;AAGtB,oBAAA,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC;AACtD,wBAAA,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG;AAE3G,oBAAA,OAAO,KAAK;gBAChB,CAAC;AACJ,aAAA;SACJ;IACL,CAAC;IACD,qBAAqB,EAAE,MAAK;QACxB,OAAO;AACH,YAAA,IAAI,MAAM,CAAC;AACP,gBAAA,KAAK,EAAE;AACH,oBAAA,UAAU,EAAE,CAAC,IAAI,EAAE,KAAK,KAAI;AACxB,wBAAA,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,EAAE,KAAK;wBACvC,IAAI,CAAC,KAAK,EAAE,MAAM;AAAE,4BAAA,OAAO,KAAK;AAEhC,wBAAA,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC;AAExB,wBAAA,OAAO,IAAI;oBACf,CAAC;AAED,oBAAA,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,KAAI;AACzB,wBAAA,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,EAAE,KAAK;wBACxC,IAAI,CAAC,KAAK,EAAE,MAAM;AAAE,4BAAA,OAAO,KAAK;AAEhC,wBAAA,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC;AAExB,wBAAA,OAAO,IAAI;oBACf,CAAC;AACJ,iBAAA;aACJ;SACJ;IACL,CAAC;AACJ,CAAA,CAAC;AAEF,MAAM,mBAAmB,GAAG,WAAW,CAAC,MAAM,CAAC;IAC3C,WAAW,EAAE,MAAK;QACd,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAI;AAEhC,YAAA,IAAI,WAAW,GAAG,CAAC,GAAqB,EAAE,IAAS,KAAI;AACnD,gBAAA,GAAG,CAAC,SAAS,GAAG,KAAK;gBACrB,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG;gBACxB,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,GAAG,EAAE;AACjE,gBAAA,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,OAAO,EAAE;AAC7D,oBAAA,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO;AAC3B,oBAAA,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM;AAC3B,wBAAA,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,YAAY;AAC9B,yBAAA,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,OAAO;AACjC,wBAAA,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,YAAY;gBACvC;qBAAO;AACH,oBAAA,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,cAAc;AAClC,oBAAA,GAAG,CAAC,KAAK,CAAC,aAAa,GAAG,QAAQ;gBACtC;AACJ,YAAA,CAAC;AAED,YAAA,IAAI,aAAa,GAAG,CAAC,OAAuB,EAAE,IAAS,KAAI;AACvD,gBAAA,OAAO,CAAC,SAAS,GAAG,IAAI;AACxB,gBAAA,OAAO,CAAC,eAAe,GAAG,OAAO;;AAGjC,gBAAA,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA,WAAA,CAAa,CAAC;gBACpC,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK;AAEtC,gBAAA,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,OAAO,EAAE;AAC7D,oBAAA,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;AAC5B,oBAAA,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,MAAM;gBACpC;qBACK;AACD,oBAAA,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;AAC5B,oBAAA,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,QAAQ;gBACtC;AACJ,YAAA,CAAC;YAED,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC7C,YAAA,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC;YAE5B,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACzC,YAAA,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC;YAEtB,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC7C,YAAA,OAAO,CAAC,SAAS,GAAG,CAAA,YAAA,EAAe,MAAM,CAAC,UAAU,GAAG,EAAE,GAAG,UAAU,EAAE;YAExE,MAAM,GAAG,GAAG,CAAC,KAAa,EAAE,IAAY,EAAE,EAAO,KAAI;gBACjD,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AAC1C,gBAAA,CAAC,CAAC,IAAI,GAAG,QAAQ;AACjB,gBAAA,CAAC,CAAC,KAAK,GAAG,KAAK;AACf,gBAAA,CAAC,CAAC,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC;AACnC,gBAAA,CAAC,CAAC,SAAS,GAAG,CAAA,qDAAA,EAAwD,IAAI,YAAY;AACtF,gBAAA,CAAC,CAAC,OAAO,GAAG,EAAE;AACd,gBAAA,OAAO,CAAC;AACZ,YAAA,CAAC;AAED,YAAA,MAAM,QAAQ,GAAG,CAAC,KAAa,KAAK,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,MAAM,EAAG,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;;AAGnJ,YAAA,MAAM,YAAY,GAAsC;AACpD,gBAAA,IAAI,EAAE,GAAG,CAAC,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;AAClF,gBAAA,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,yBAAyB,EAAE,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;AACtE,gBAAA,KAAK,EAAE,GAAG,CAAC,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;aACrF;YAED,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;AAChD,YAAA,SAAS,CAAC,SAAS,GAAG,qBAAqB;YAE3C,MAAM,YAAY,GAAG,GAAG,CAAC,kBAAkB,EAAE,uGAAuG,EAAE,MAAK;AACvJ,gBAAA,MAAM,OAAO,GAAG,MAAM,EAAG;gBACzB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;AACvF,YAAA,CAAC,CAAC;AACF,YAAA,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;YAEpC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,YAAY,CAAC;AAE1G,YAAA,MAAM,aAAa,GAAG,CAAC,IAAS,KAAI;AAChC,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;AACrG,gBAAA,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,KAAK,KAAK,CAAC,CAAC;AACtG,YAAA,CAAC;YACD,aAAa,CAAC,IAAI,CAAC;;YAGnB,IAAI,MAAM,GAAG,CAAC;YACd,IAAI,MAAM,GAAG,CAAC;YAEd,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC5C,YAAA,MAAM,CAAC,SAAS,GAAG,CAAA,kBAAA,EAAqB,MAAM,CAAC,UAAU,GAAG,EAAE,GAAG,UAAU,EAAE;AAE7E,YAAA,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,KAAI;AACvB,gBAAA,MAAM,GAAG,CAAC,CAAC,OAAO;AAClB,gBAAA,MAAM,GAAG,GAAG,CAAC,WAAW;gBAExB,IAAI,WAAW,GAAkB,IAAI;gBACrC,IAAI,OAAO,GAAG,KAAK;AAEnB,gBAAA,MAAM,IAAI,GAAG,CAAC,CAAM,KAAI;AACpB,oBAAA,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,IAAI,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC;oBAEzD,IAAI,CAAC,OAAO,EAAE;wBACV,OAAO,GAAG,IAAI;wBAEd,qBAAqB,CAAC,MAAK;AACvB,4BAAA,MAAM,OAAO,GAAG,MAAM,EAAG;AACzB,4BAAA,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;4BACnH,OAAO,GAAG,KAAK;AACnB,wBAAA,CAAC,CAAC;oBACN;AACJ,gBAAA,CAAC;gBAED,MAAM,EAAE,GAAG,MAAK;AACZ,oBAAA,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC;AAC7C,oBAAA,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,EAAE,CAAC;AAC7C,gBAAA,CAAC;AAED,gBAAA,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC;AAC1C,gBAAA,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,EAAE,CAAC;;gBAGtC,CAAC,CAAC,cAAc,EAAE;AACtB,YAAA,CAAC;YAED,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC;YAEpC,OAAO;AACH,gBAAA,GAAG,EAAE,OAAO;AACZ,gBAAA,OAAO,KAAK,OAAO,CAAC,MAAM,EAAE,CAAA,CAAC,CAAC;AAC9B,gBAAA,MAAM,CAAC,WAAW,EAAA;;AAGd,oBAAA,IAAI,WAAW,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;AAC9B,wBAAA,OAAO,KAAK;oBAEhB,IAAI,GAAG,WAAW;AAClB,oBAAA,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC;AACtB,oBAAA,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC;oBAC5B,aAAa,CAAC,IAAI,CAAC;AAEnB,oBAAA,OAAO,IAAI;gBACf,CAAC;aACJ;AACL,QAAA,CAAC;IACL,CAAC;AACJ,CAAA,CAAC;;ACpQF,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC;AAChC,IAAA,IAAI,EAAE,YAAY;IAElB,mBAAmB,GAAA;QACf,OAAO;AACH,YAAA;gBACI,KAAK,EAAE,CAAC,WAAW,CAAC;AACpB,gBAAA,UAAU,EAAE;AACR,oBAAA,UAAU,EAAE;AACR,wBAAA,OAAO,EAAE,IAAI;wBACb,SAAS,EAAE,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,UAAU;wBAC9C,UAAU,EAAE,UAAU,IAAG;4BACrB,IAAI,CAAC,UAAU,CAAC,UAAU;AAAE,gCAAA,OAAO,EAAE;4BACrC,OAAO,EAAE,KAAK,EAAE,CAAA,aAAA,EAAgB,UAAU,CAAC,UAAU,CAAA,CAAE,EAAE;wBAC7D,CAAC;AACJ,qBAAA;AACJ,iBAAA;AACJ,aAAA;SACJ;IACL,CAAC;IACD,WAAW,GAAA;QACP,OAAO;AACH,YAAA,aAAa,EAAE,CAAC,UAAkB,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,OAAO,KAAK,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AACpH,YAAA,eAAe,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,KAAI,EAAG,OAAO,KAAK,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,IAAI,GAAG,CAAC,CAAC,oBAAoB,EAAE,CAAC,GAAG,EAAE,CAAA,CAAC,CAAC;SACpI;IACL,CAAC;AACJ,CAAA,CAAC;;AC1BF,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC;AAChC,IAAA,IAAI,EAAE,YAAY;IAElB,mBAAmB,GAAA;QACf,OAAO;AACH,YAAA;AACI,gBAAA,KAAK,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC;AAC/B,gBAAA,UAAU,EAAE;AACR,oBAAA,UAAU,EAAE;AACR,wBAAA,OAAO,EAAE,IAAI;wBACb,SAAS,EAAE,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,UAAU;wBAC9C,UAAU,EAAE,UAAU,IAAG;4BACrB,IAAI,CAAC,UAAU,CAAC,UAAU;AAAE,gCAAA,OAAO,EAAE;4BACrC,OAAO,EAAE,KAAK,EAAE,CAAA,aAAA,EAAgB,UAAU,CAAC,UAAU,CAAA,CAAE,EAAE;wBAC7D,CAAC;AACJ,qBAAA;AACJ,iBAAA;AACJ,aAAA;SACJ;IACL,CAAC;IACD,WAAW,GAAA;QACP,OAAO;YACH,aAAa,EAAE,CAAC,UAAkB,KAAK,CAAC,EAAE,QAAQ,EAAE,KAAI,EAAG,OAAO,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,CAAC,CAAA,CAAC,CAAC;YAC1H,eAAe,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAI,EAAG,OAAO,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAA,CAAC,CAAC;SACnH;IACL,CAAC;AACJ,CAAA,CAAC;;AC5BF,IAAI,UAAU,GAAG,CAAC,QAA+C,KAAI;IAGjE,OAAO;AACH,QAAA,IAAI,EAAE,GAAG;AAET,QAAA,KAAK,EAAE,CAAC,EAAE,KAAK,EAAqB,KAAI;AACpC,YAAA,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9G,CAAC;QAED,MAAM,EAAE,MAAK;AACT,YAAA,IAAI,KAAqB;YACzB,IAAI,aAAa,GAAG,CAAC;AACrB,YAAA,IAAI,YAAiB;YAErB,OAAO;AACH,gBAAA,OAAO,EAAE,CAAC,KAAU,KAAI;AACpB,oBAAA,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACrC,oBAAA,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,kBAAkB,CAAC;AAEvC,oBAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;oBAEhC,YAAY,GAAG,KAAK;AACpB,oBAAA,WAAW,EAAE;gBACjB,CAAC;AACD,gBAAA,SAAS,CAAC,KAAU,EAAA;oBAChB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE;AAC/B,wBAAA,aAAa,GAAG,CAAC,aAAa,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM;AAC3F,wBAAA,WAAW,EAAE;AACb,wBAAA,OAAO,IAAI;oBACf;oBAEA,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE;AACjC,wBAAA,aAAa,GAAG,CAAC,aAAa,GAAG,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM;AAC/D,wBAAA,WAAW,EAAE;AACb,wBAAA,OAAO,IAAI;oBACf;oBAEA,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;AAC7B,wBAAA,UAAU,EAAE;AACZ,wBAAA,OAAO,IAAI;oBACf;AAEA,oBAAA,OAAO,KAAK;gBAChB,CAAC;AACD,gBAAA,QAAQ,CAAC,KAAU,EAAA;oBACf,YAAY,GAAG,KAAK;AACpB,oBAAA,WAAW,EAAE;gBAChB,CAAC;AACF,gBAAA,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;aAC/B;AAED,YAAA,SAAS,WAAW,GAAA;gBAChB,IAAI,CAAC,YAAY,CAAC,UAAU;oBACxB;AAEJ,gBAAA,KAAK,CAAC,SAAS,GAAG,EAAE;gBAEpB,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAyC,EAAE,KAAa,KAAI;oBACpF,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AAE/C,oBAAA,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW;oBAErC,IAAI,KAAK,KAAK,aAAa;AACvB,wBAAA,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC;AAEvC,oBAAA,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAK;wBAClC,aAAa,GAAG,KAAK;AACrB,wBAAA,UAAU,EAAE;AAChB,oBAAA,CAAC,CAAC;AAEF,oBAAA,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC;AAC7B,gBAAA,CAAC,CAAC;AAEF,gBAAA,MAAM,IAAI,GAAG,YAAY,CAAC,UAAU,EAAE;AACtC,gBAAA,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO;gBAC9B,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,CAAA,EAAA,CAAI;AACnC,gBAAA,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA,EAAA,CAAI;YAC5C;AAEA,YAAA,SAAS,UAAU,GAAA;gBACf,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,aAAa,CAAC;AAE9C,gBAAA,IAAI,IAAI;AACJ,oBAAA,YAAY,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,GAAG,CAAC;YAC7E;QACJ;KACH;AACL,CAAC;;ACtFD,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC;AAC9B,IAAA,IAAI,EAAE,UAAU;IAEhB,mBAAmB,GAAA;QACf,OAAO;AACH,YAAA;gBACI,KAAK,EAAE,CAAC,WAAW,CAAC;AACpB,gBAAA,UAAU,EAAE;AACR,oBAAA,QAAQ,EAAE;AACN,wBAAA,OAAO,EAAE,IAAI;wBACb,SAAS,EAAE,OAAO,IAAG;AACjB,4BAAA,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ;AACnC,4BAAA,IAAI,CAAC,IAAI;AAAE,gCAAA,OAAO,IAAI;;AAEtB,4BAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AACnB,gCAAA,OAAO,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI;AACtD,4BAAA,OAAO,IAAI;wBACf,CAAC;wBACD,UAAU,EAAE,UAAU,IAAG;4BACrB,IAAI,CAAC,UAAU,CAAC,QAAQ;AAAE,gCAAA,OAAO,EAAE;4BAEnC,OAAO,EAAE,KAAK,EAAE,CAAA,WAAA,EAAc,UAAU,CAAC,QAAQ,CAAA,CAAE,EAAE;wBACzD,CAAC;AACJ,qBAAA;AACJ,iBAAA;AACJ,aAAA;SACJ;IACL,CAAC;IACD,WAAW,GAAA;QACP,OAAO;AACH,YAAA,WAAW,EAAE,CAAC,QAAgB,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,OAAO,KAAK,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAE,CAAA,CAAC,CAAC;AAC7G,YAAA,aAAa,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,KAAI,EAAG,OAAO,KAAK,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,oBAAoB,EAAE,CAAC,GAAG,EAAE,CAAA,CAAC,CAAC;SAC/H;IACL,CAAC;AACJ,CAAA,CAAC;;MCFW,eAAe,CAAA;AAZ5B,IAAA,WAAA,GAAA;AAcc,QAAA,IAAA,CAAA,QAAQ,GAAG,CAAC,CAAM,KAAI,EAAG,CAAC;AAC7B,QAAA,IAAA,CAAA,SAAS,GAAG,MAAK,EAAG,CAAC;AAQpB,QAAA,IAAA,CAAA,OAAO,GAAG,SAAS,CAAC,QAAQ,CAA6B,SAAS,CAAC;AAEpE,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAU,KAAK,wDAAC;AACpC,QAAA,IAAA,CAAA,iBAAiB,GAAG,KAAK,CAAU,KAAK,6DAAC;AACzC,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAU,KAAK,yDAAC;AACrC,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,+CAAgC;AACrD,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,4CAAI,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAA7B,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAC;AACxD,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,4CAAI,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAA7B,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAC;AACxD,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,4CAAI,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAA7B,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAC;AACxD,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,EAAE,iDAAC;AAEjB,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAwC,EAAE,2DAAC;AAElE,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,+CAAU;;AAMtB,QAAA,IAAA,CAAA,YAAY,GAAuC;AAC/D,YAAA,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,8BAA8B,EAAE;AACzD,YAAA,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,6BAA6B,EAAE;AAC1D,YAAA,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,4BAA4B,EAAE;AACxD,YAAA,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,uCAAuC,EAAE;AACzE,YAAA,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,gBAAgB,EAAE;AAC7C,YAAA,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,iCAAiC,EAAE;AACtE,YAAA,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,mCAAmC,EAAE;SACvE;QACe,IAAA,CAAA,SAAS,GAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;;AAGvG,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAe,mBAAmB,mDAAC;;;;AAKnD,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAuC,IAAI,qDAAC;AAC7D,QAAA,IAAA,CAAA,YAAY,GAAG,SAAS,CAA0B,WAAW,wDAAC;AAE5D,QAAA,IAAA,CAAA,WAAW,GAAyB,IAAI,YAAY,EAAU;AAC9D,QAAA,IAAA,CAAA,UAAU,GAAsB,IAAI,YAAY,EAAO;AACvD,QAAA,IAAA,CAAA,cAAc,GAAyB,IAAI,YAAY,EAAU;QAoK1D,IAAA,CAAA,iBAAiB,GAAG,MAAK;YACtC,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE,qBAAqB,EAAE;AAC1D,YAAA,IAAI,IAAI;gBACJ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;AACrE,QAAA,CAAC;AAmCJ,IAAA;IA3PU,gBAAgB,CAAC,EAAO,EAAA,EAAU,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;IACtD,iBAAiB,CAAC,EAAO,EAAA,EAAU,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;AAE/D,IAAA,QAAQ,CAAC,CAAkB,EAAA;AACvB,QAAA,OAAO,IAAI;IACf;IA6CA,QAAQ,GAAA;QACJ,IAAI,MAAM,GAAG,EAAE;QAEf,MAAM,CAAC,IAAI,CAAC,GAAG;YACX,UAAU;YACV,SAAS;YACT,KAAK;YACL,QAAQ;YACR,UAAU;YACV,UAAU;AACV,YAAA,SAAS,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,CAAC;YACxD;AACH,SAAA,CAAC;AAEF,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,UAAU;AACzB,YAAA,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;AAEzD,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,MAAM,EAAE;YACvB,IAAI,IAAI,CAAC,aAAa,EAAE;gBACpB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QAC3H;QAEA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC;AACzC,YAAA,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC;AAChC,gBAAA,0BAA0B,EAAE,IAAI;AAChC,gBAAA,cAAc,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;AACpC,gBAAA,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAA,EAAI,OAAO,CAAA,EAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAA,CAAE,CAAA,CAAC,CAAC;AAC/G,gBAAA,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;AACjD,aAAA,CAAC,CAAE;AAER,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,MAAM,CAAC;AACxB,YAAA,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,aAAa;AACrC,YAAA,UAAU,EAAE,MAAM;AAClB,YAAA,QAAQ,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE;AAC1B,YAAA,MAAM,EAAE,MAAM,IAAI,CAAC,SAAS,EAAE;AAC9B,YAAA,aAAa,EAAE,MAAM,IAAI,CAAC,kBAAkB,EAAE;AAC9C,YAAA,QAAQ,EAAE,CAAC,CAAC,KAAI;gBACZ,IAAI,KAAK,GAAG,EAAE;AACd,gBAAA,QAAQ,IAAI,CAAC,IAAI,EAAE;AACf,oBAAA,KAAK,MAAM;wBACP,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE;;AAEvC,wBAAA,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,SAAS;4BAC1B,KAAK,GAAG,EAAE;wBACd;AACJ,oBAAA,KAAK,UAAU;wBAAE,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE;wBAAE;AAC9D,oBAAA,KAAK,MAAM;wBAAE,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE;wBAAE;;AAG1D,gBAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YACxB;AACH,SAAA,CAAC;IACN;IAEO,MAAM,UAAU,CAAC,GAAQ,EAAA;;AAE5B,QAAA,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;YAAE,GAAG,GAAG,IAAI;AAEjD,QAAA,IAAI,CAAC,KAAK,GAAG,GAAG;;AAGhB,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,IAAI,EAAE;AAChE,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,IAAI,EAAE;;;AAIxD,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,UAAU;YAC1B,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AAC9F,aAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,MAAM;YAC3B,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;;YAE3F,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE;IAClH;IAEQ,kBAAkB,GAAA;AACtB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS;AAC7B,QAAA,IAAI,CAAC,MAAM;YAAE;QAEb,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC;AAC/C,QAAA,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;AAEpF,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;YACb,KAAK,EAAE,KAAK,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,GAAG,WAAW;;YAExC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE;AAClG,YAAA,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE;AACjE,YAAA,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC7B,YAAA,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;AACjC,YAAA,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;AACvC,YAAA,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC;AACzC,YAAA,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;AAC3D,YAAA,OAAO,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE;AAC5B,YAAA,OAAO,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE;AAC/B,SAAA,CAAC;IACN;AAEA,IAAA,aAAa,CAAC,aAAoB,EAAA;AAC9B,QAAA,MAAM,KAAK,GAAI,aAAa,CAAC,MAA4B,CAAC,KAAK;AAC/D,QAAA,IAAI,KAAK;AAAE,YAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE;;AAChE,YAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,eAAe,EAAE,CAAC,GAAG,EAAE;IAChE;AACA,IAAA,WAAW,CAAC,aAAoB,EAAA;AAC5B,QAAA,MAAM,KAAK,GAAI,aAAa,CAAC,MAA4B,CAAC,KAAK;AAC/D,QAAA,IAAI,KAAK;AAAE,YAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE;;AAC9D,YAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE;IAC9D;AAEA,IAAA,aAAa,CAAC,aAAoB,EAAA;AAC9B,QAAA,MAAM,MAAM,GAAG,aAAa,CAAC,MAA2B;AACxD,QAAA,QAAQ,MAAM,CAAC,KAAK;AAChB,YAAA,KAAK,WAAW;AAAE,gBAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,YAAY,EAAE,CAAC,GAAG,EAAE;gBAAE;AACxE,YAAA;AAAS,gBAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAQ,EAAE,CAAC,CAAC,GAAG,EAAE;gBAAE;;IAEvH;IACA,OAAO,GAAA;AACH,QAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE;IACtD;IACA,SAAS,GAAA;AACL,QAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,YAAY,EAAE,CAAC,GAAG,EAAE;IACxD;IACA,aAAa,GAAA;AACT,QAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,eAAe,EAAE,CAAC,GAAG,EAAE;IAC3D;IACA,aAAa,GAAA;AACT,QAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,gBAAgB,EAAE,CAAC,GAAG,EAAE;IAC5D;IACA,UAAU,GAAA;AACN,QAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE;IAChD;IACA,UAAU,GAAA;AACN,QAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE;IAChD;IACA,QAAQ,GAAA;AACJ,QAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE;IACjG;IACA,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE;IACvD;IACA,MAAM,GAAA;AACF,QAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE;IACvD;IACA,SAAS,GAAA;AACL,QAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE;IACrD;IACA,SAAS,GAAA;AACL,QAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,cAAc,EAAE,CAAC,GAAG,EAAE;IAC1D;IACA,YAAY,GAAA;AACR,QAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,YAAY,EAAE,CAAC,GAAG,EAAE;IACxD;AACA,IAAA,eAAe,CAAC,MAAmB,EAAA;AAC/B,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YAClB,IAAI,CAAC,cAAc,EAAE;YACrB;QACJ;AACA,QAAA,IAAI,CAAC,eAAe,GAAG,MAAM;QAC7B,IAAI,CAAC,iBAAiB,EAAE;;QAExB,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC;QAC/D,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,iBAAiB,CAAC;IAC7D;AAOA,IAAA,WAAW,CAAC,MAAmF,EAAA;QAC3F,IAAI,CAAC,cAAc,EAAE;QACrB,QAAQ,MAAM;AACV,YAAA,KAAK,QAAQ;gBAAE,IAAI,CAAC,QAAQ,EAAE;gBAAE;AAChC,YAAA,KAAK,QAAQ;gBAAE,IAAI,CAAC,MAAM,EAAE;gBAAE;AAC9B,YAAA,KAAK,WAAW;gBAAE,IAAI,CAAC,SAAS,EAAE;gBAAE;AACpC,YAAA,KAAK,WAAW;gBAAE,IAAI,CAAC,SAAS,EAAE;gBAAE;AACpC,YAAA,KAAK,cAAc;gBAAE,IAAI,CAAC,YAAY,EAAE;gBAAE;AAC1C,YAAA,KAAK,QAAQ;gBAAE,IAAI,CAAC,WAAW,EAAE;gBAAE;;IAE3C;;AAIA,IAAA,mBAAmB,CAAC,KAAiB,EAAA;AACjC,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC;YACtF,IAAI,CAAC,cAAc,EAAE;IAC7B;IAEA,cAAc,GAAA;AACV,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE;AACvB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;QACxB,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC;QAClE,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,iBAAiB,CAAC;IAChE;IAEA,WAAW,GAAA;QACP,IAAI,CAAC,cAAc,EAAE;IACzB;AACA,IAAA,QAAQ,CAAC,aAAoB,EAAA;AACzB,QAAA,MAAM,MAAM,GAAG,aAAa,CAAC,MAA2B;AACxD,QAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE;AACjE,QAAA,MAAM,CAAC,KAAK,GAAG,EAAE;IACrB;+GA9PS,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAf,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,oBAAA,EAAA,6BAAA,EAAA,yBAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,SAAA,EALb;AACP,YAAA,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,CAAC,MAAM,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;AAC3F,YAAA,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,CAAC,MAAM,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI;AACxF,SAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,SAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,WAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChCL,62PAuGA,EAAA,MAAA,EAAA,CAAA,q7OAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED5Ec,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;4FAO1B,eAAe,EAAA,UAAA,EAAA,CAAA;kBAZ3B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,EAAA,UAAA,EAGT,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,WAAW,CAAC,EAAA,aAAA,EACrB,iBAAiB,CAAC,IAAI,EAAA,SAAA,EAC1B;AACP,wBAAA,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,CAAC,qBAAqB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;AAC3F,wBAAA,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,CAAC,qBAAqB,CAAC,EAAE,KAAK,EAAE,IAAI;AACxF,qBAAA,EAAA,QAAA,EAAA,62PAAA,EAAA,MAAA,EAAA,CAAA,q7OAAA,CAAA,EAAA;AAagE,SAAA,CAAA,EAAA,cAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,SAAS,giCAqChB,WAAW,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA;sBAEpE;;sBACA;;sBACA;;sBAsLA,YAAY;uBAAC,oBAAoB,EAAE,CAAC,QAAQ,CAAC;;sBAK7C,YAAY;uBAAC,yBAAyB;;AA+B3C,MAAM,mBAAmB,GAAiB;IACtC,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE;AAChD,IAAA,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK;IAC/D,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK;CACjD;AAED;AACA;AACA,SAAS,cAAc,CAAC,CAAiB,EAAE,CAAiB,EAAA;AACxD,IAAA,MAAM,KAAK,GAAG,CAAC,CAAiB,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE;AAC7G,IAAA,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC;AAC9C;;MEzTa,SAAS,GAAG,IAAI,cAAc,CAAU,WAAW;;ACFhE;;AAEG;;ACFH;;AAEG;;;;"}
|
package/index.d.ts
CHANGED
|
@@ -24,11 +24,25 @@ declare class EditorComponent implements ControlValueAccessor, Validator {
|
|
|
24
24
|
name: _angular_core.InputSignal<string>;
|
|
25
25
|
private EditorRef?;
|
|
26
26
|
value: any;
|
|
27
|
+
readonly FontFamilies: {
|
|
28
|
+
label: string;
|
|
29
|
+
value: string;
|
|
30
|
+
}[];
|
|
31
|
+
readonly FontSizes: string[];
|
|
32
|
+
Toolbar: _angular_core.WritableSignal<ToolbarState>;
|
|
33
|
+
TableMenu: _angular_core.WritableSignal<{
|
|
34
|
+
top: number;
|
|
35
|
+
left: number;
|
|
36
|
+
}>;
|
|
37
|
+
private tableMenuRef;
|
|
27
38
|
inputChange: EventEmitter<string>;
|
|
28
39
|
inputFocus: EventEmitter<any>;
|
|
29
40
|
inputFinalized: EventEmitter<string>;
|
|
30
41
|
ngOnInit(): void;
|
|
31
42
|
writeValue(obj: any): Promise<void>;
|
|
43
|
+
private updateToolbarState;
|
|
44
|
+
setFontFamily(selectElement: Event): void;
|
|
45
|
+
setFontSize(selectElement: Event): void;
|
|
32
46
|
setTypography(selectElement: Event): void;
|
|
33
47
|
setBold(): void;
|
|
34
48
|
setItalic(): void;
|
|
@@ -42,10 +56,29 @@ declare class EditorComponent implements ControlValueAccessor, Validator {
|
|
|
42
56
|
deleteRow(): void;
|
|
43
57
|
addColumn(): void;
|
|
44
58
|
deleteColumn(): void;
|
|
59
|
+
toggleTableMenu(button: HTMLElement): void;
|
|
60
|
+
private tableMenuButton?;
|
|
61
|
+
private readonly positionTableMenu;
|
|
62
|
+
tableAction(action: "insert" | "addRow" | "deleteRow" | "addColumn" | "deleteColumn" | "delete"): void;
|
|
63
|
+
onDocumentMouseDown(event: MouseEvent): void;
|
|
64
|
+
closeTableMenu(): void;
|
|
65
|
+
ngOnDestroy(): void;
|
|
45
66
|
setEmoji(selectElement: Event): void;
|
|
46
67
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<EditorComponent, never>;
|
|
47
68
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<EditorComponent, "es-editor", never, { "EmojiSupport": { "alias": "EmojiSupport"; "required": false; "isSignal": true; }; "BulletListSupport": { "alias": "BulletListSupport"; "required": false; "isSignal": true; }; "TablesSupport": { "alias": "TablesSupport"; "required": false; "isSignal": true; }; "Mode": { "alias": "Mode"; "required": true; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "style": { "alias": "style"; "required": false; "isSignal": true; }; "MentionEntities": { "alias": "MentionEntities"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": true; "isSignal": true; }; }, { "inputChange": "inputChange"; "inputFocus": "inputFocus"; "inputFinalized": "inputFinalized"; }, never, never, true, never>;
|
|
48
69
|
}
|
|
70
|
+
interface ToolbarState {
|
|
71
|
+
block: string;
|
|
72
|
+
fontFamily: string;
|
|
73
|
+
fontSize: string;
|
|
74
|
+
bold: boolean;
|
|
75
|
+
italic: boolean;
|
|
76
|
+
underline: boolean;
|
|
77
|
+
bulletList: boolean;
|
|
78
|
+
inTable: boolean;
|
|
79
|
+
canUndo: boolean;
|
|
80
|
+
canRedo: boolean;
|
|
81
|
+
}
|
|
49
82
|
|
|
50
83
|
declare const TXE_DEBUG: InjectionToken<boolean>;
|
|
51
84
|
|