@malva-ui/editor 0.1.13 → 0.1.14
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 +5 -5
- package/fesm2022/malva-ui-editor-ai.mjs +17 -0
- package/fesm2022/malva-ui-editor-ai.mjs.map +1 -0
- package/fesm2022/malva-ui-editor.mjs +10227 -0
- package/fesm2022/malva-ui-editor.mjs.map +1 -0
- package/package.json +35 -26
- package/types/malva-ui-editor-ai.d.ts +1 -0
- package/types/malva-ui-editor.d.ts +2995 -0
- package/ai/index.d.ts +0 -12
- package/ai/malva-ui-editor-ai.d.ts +0 -5
- package/esm2022/ai/index.js +0 -12
- package/esm2022/ai/index.js.map +0 -1
- package/esm2022/ai/malva-ui-editor-ai.js +0 -5
- package/esm2022/ai/malva-ui-editor-ai.js.map +0 -1
- package/esm2022/index.js +0 -37
- package/esm2022/index.js.map +0 -1
- package/esm2022/lib/ai/editor-ai-actions.js +0 -69
- package/esm2022/lib/ai/editor-ai-actions.js.map +0 -1
- package/esm2022/lib/ai/editor-ai-context.js +0 -612
- package/esm2022/lib/ai/editor-ai-context.js.map +0 -1
- package/esm2022/lib/ai/editor-ai-menu.js +0 -288
- package/esm2022/lib/ai/editor-ai-menu.js.map +0 -1
- package/esm2022/lib/ai/editor-ai-review-bar.js +0 -223
- package/esm2022/lib/ai/editor-ai-review-bar.js.map +0 -1
- package/esm2022/lib/ai/editor-ai-stream.js +0 -677
- package/esm2022/lib/ai/editor-ai-stream.js.map +0 -1
- package/esm2022/lib/ai/editor-ai-suggestions.js +0 -751
- package/esm2022/lib/ai/editor-ai-suggestions.js.map +0 -1
- package/esm2022/lib/ai/editor-ai.tokens.js +0 -10
- package/esm2022/lib/ai/editor-ai.tokens.js.map +0 -1
- package/esm2022/lib/ai/editor-ai.types.js +0 -1
- package/esm2022/lib/ai/editor-ai.types.js.map +0 -1
- package/esm2022/lib/editor/editor.js +0 -985
- package/esm2022/lib/editor/editor.js.map +0 -1
- package/esm2022/lib/editor-extension-preflight.js +0 -83
- package/esm2022/lib/editor-extension-preflight.js.map +0 -1
- package/esm2022/lib/editor-serialization.js +0 -152
- package/esm2022/lib/editor-serialization.js.map +0 -1
- package/esm2022/lib/editor-toolbar-context.js +0 -259
- package/esm2022/lib/editor-toolbar-context.js.map +0 -1
- package/esm2022/lib/editor.tokens.js +0 -10
- package/esm2022/lib/editor.tokens.js.map +0 -1
- package/esm2022/lib/editor.types.js +0 -48
- package/esm2022/lib/editor.types.js.map +0 -1
- package/esm2022/lib/extensions/editor-block-handle.js +0 -760
- package/esm2022/lib/extensions/editor-block-handle.js.map +0 -1
- package/esm2022/lib/extensions/editor-extensions.js +0 -321
- package/esm2022/lib/extensions/editor-extensions.js.map +0 -1
- package/esm2022/lib/extensions/editor-markdown-compatibility.js +0 -162
- package/esm2022/lib/extensions/editor-markdown-compatibility.js.map +0 -1
- package/esm2022/lib/extensions/editor-upload-placeholder.js +0 -156
- package/esm2022/lib/extensions/editor-upload-placeholder.js.map +0 -1
- package/esm2022/lib/status/editor-status.js +0 -64
- package/esm2022/lib/status/editor-status.js.map +0 -1
- package/esm2022/lib/toolbar/editor-alignment.js +0 -203
- package/esm2022/lib/toolbar/editor-alignment.js.map +0 -1
- package/esm2022/lib/toolbar/editor-block-insert.js +0 -101
- package/esm2022/lib/toolbar/editor-block-insert.js.map +0 -1
- package/esm2022/lib/toolbar/editor-color-control.js +0 -71
- package/esm2022/lib/toolbar/editor-color-control.js.map +0 -1
- package/esm2022/lib/toolbar/editor-command-button.js +0 -115
- package/esm2022/lib/toolbar/editor-command-button.js.map +0 -1
- package/esm2022/lib/toolbar/editor-heading.js +0 -266
- package/esm2022/lib/toolbar/editor-heading.js.map +0 -1
- package/esm2022/lib/toolbar/editor-highlight.js +0 -84
- package/esm2022/lib/toolbar/editor-highlight.js.map +0 -1
- package/esm2022/lib/toolbar/editor-image-upload-dialog.js +0 -289
- package/esm2022/lib/toolbar/editor-image-upload-dialog.js.map +0 -1
- package/esm2022/lib/toolbar/editor-image-upload.js +0 -315
- package/esm2022/lib/toolbar/editor-image-upload.js.map +0 -1
- package/esm2022/lib/toolbar/editor-inline-marks.js +0 -124
- package/esm2022/lib/toolbar/editor-inline-marks.js.map +0 -1
- package/esm2022/lib/toolbar/editor-link.js +0 -265
- package/esm2022/lib/toolbar/editor-link.js.map +0 -1
- package/esm2022/lib/toolbar/editor-list.js +0 -249
- package/esm2022/lib/toolbar/editor-list.js.map +0 -1
- package/esm2022/lib/toolbar/editor-table.js +0 -292
- package/esm2022/lib/toolbar/editor-table.js.map +0 -1
- package/esm2022/lib/toolbar/editor-text-color.js +0 -82
- package/esm2022/lib/toolbar/editor-text-color.js.map +0 -1
- package/esm2022/lib/toolbar/editor-toolbar-widget.js +0 -41
- package/esm2022/lib/toolbar/editor-toolbar-widget.js.map +0 -1
- package/esm2022/lib/toolbar/editor-toolbar.defs.js +0 -60
- package/esm2022/lib/toolbar/editor-toolbar.defs.js.map +0 -1
- package/esm2022/lib/toolbar/editor-toolbar.js +0 -826
- package/esm2022/lib/toolbar/editor-toolbar.js.map +0 -1
- package/esm2022/lib/toolbar/editor-undo-redo.js +0 -72
- package/esm2022/lib/toolbar/editor-undo-redo.js.map +0 -1
- package/esm2022/lib/toolbar/editor-zoom.js +0 -330
- package/esm2022/lib/toolbar/editor-zoom.js.map +0 -1
- package/esm2022/lib/upload/editor-image-upload-coordinator.js +0 -480
- package/esm2022/lib/upload/editor-image-upload-coordinator.js.map +0 -1
- package/esm2022/malva-ui-editor.js +0 -5
- package/esm2022/malva-ui-editor.js.map +0 -1
- package/index.d.ts +0 -35
- package/lib/ai/editor-ai-actions.d.ts +0 -27
- package/lib/ai/editor-ai-context.d.ts +0 -307
- package/lib/ai/editor-ai-menu.d.ts +0 -142
- package/lib/ai/editor-ai-review-bar.d.ts +0 -116
- package/lib/ai/editor-ai-stream.d.ts +0 -207
- package/lib/ai/editor-ai-suggestions.d.ts +0 -219
- package/lib/ai/editor-ai.tokens.d.ts +0 -10
- package/lib/ai/editor-ai.types.d.ts +0 -176
- package/lib/editor/editor.d.ts +0 -243
- package/lib/editor-extension-preflight.d.ts +0 -23
- package/lib/editor-serialization.d.ts +0 -74
- package/lib/editor-toolbar-context.d.ts +0 -116
- package/lib/editor.tokens.d.ts +0 -6
- package/lib/editor.types.d.ts +0 -194
- package/lib/extensions/editor-block-handle.d.ts +0 -59
- package/lib/extensions/editor-extensions.d.ts +0 -165
- package/lib/extensions/editor-markdown-compatibility.d.ts +0 -11
- package/lib/extensions/editor-upload-placeholder.d.ts +0 -75
- package/lib/status/editor-status.d.ts +0 -24
- package/lib/toolbar/editor-alignment.d.ts +0 -61
- package/lib/toolbar/editor-block-insert.d.ts +0 -26
- package/lib/toolbar/editor-color-control.d.ts +0 -32
- package/lib/toolbar/editor-command-button.d.ts +0 -29
- package/lib/toolbar/editor-heading.d.ts +0 -68
- package/lib/toolbar/editor-highlight.d.ts +0 -21
- package/lib/toolbar/editor-image-upload-dialog.d.ts +0 -96
- package/lib/toolbar/editor-image-upload.d.ts +0 -71
- package/lib/toolbar/editor-inline-marks.d.ts +0 -30
- package/lib/toolbar/editor-link.d.ts +0 -78
- package/lib/toolbar/editor-list.d.ts +0 -67
- package/lib/toolbar/editor-table.d.ts +0 -133
- package/lib/toolbar/editor-text-color.d.ts +0 -21
- package/lib/toolbar/editor-toolbar-widget.d.ts +0 -19
- package/lib/toolbar/editor-toolbar.d.ts +0 -157
- package/lib/toolbar/editor-toolbar.defs.d.ts +0 -35
- package/lib/toolbar/editor-undo-redo.d.ts +0 -26
- package/lib/toolbar/editor-zoom.d.ts +0 -108
- package/lib/upload/editor-image-upload-coordinator.d.ts +0 -55
- package/malva-ui-editor.d.ts +0 -5
|
@@ -1,292 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, computed, ElementRef, effect, inject, signal, viewChild, viewChildren, ViewEncapsulation, } from '@angular/core';
|
|
2
|
-
import { LucideTable2 } from '@lucide/angular';
|
|
3
|
-
import { MlvButton, MlvButtonIcon, MlvButtonToggle, } from '@malva-ui/core/button';
|
|
4
|
-
import { MlvPopup, MlvPopupContent, MlvPopupTrigger, } from '@malva-ui/core/popup';
|
|
5
|
-
import { MLV_EDITOR_I18N } from '@malva-ui/i18n';
|
|
6
|
-
import { MlvTooltip } from '@malva-ui/core/tooltip';
|
|
7
|
-
import { MLV_EDITOR_OVERLAY_REGISTRY, MLV_EDITOR_TOOLBAR_CONTEXT, MLV_EDITOR_TOOLBAR_REVISION, } from '../editor-toolbar-context';
|
|
8
|
-
import { MlvEditorToolbarWidget } from './editor-toolbar-widget';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
const TABLE_GRID_BOUNDARY = 10;
|
|
11
|
-
/** Resizable table insertion and contextual command control. */
|
|
12
|
-
export class MlvEditorTable {
|
|
13
|
-
/** @protected Editor-scoped command and form state. */
|
|
14
|
-
_context = inject(MLV_EDITOR_TOOLBAR_CONTEXT);
|
|
15
|
-
/** @private Transaction and selection invalidation bridge. */
|
|
16
|
-
_revision = inject(MLV_EDITOR_TOOLBAR_REVISION, {
|
|
17
|
-
optional: true,
|
|
18
|
-
});
|
|
19
|
-
/** @private Detached popup ownership for composite editor focus. */
|
|
20
|
-
_overlays = inject(MLV_EDITOR_OVERLAY_REGISTRY);
|
|
21
|
-
/** @private Optional localized editor copy. */
|
|
22
|
-
_i18n = inject(MLV_EDITOR_I18N, { optional: true });
|
|
23
|
-
/** @protected Popup controller owned by the table trigger. */
|
|
24
|
-
_popup = viewChild.required('_popup', /* @ts-ignore */
|
|
25
|
-
...(ngDevMode ? [{ debugName: "_popup" }] : /* istanbul ignore next */ []));
|
|
26
|
-
/** @protected Connected popup trigger. */
|
|
27
|
-
_trigger = viewChild.required('_trigger', /* @ts-ignore */
|
|
28
|
-
...(ngDevMode ? [{ debugName: "_trigger" }] : /* istanbul ignore next */ []));
|
|
29
|
-
/** @protected Native trigger restored after final popup teardown. */
|
|
30
|
-
_triggerElement = viewChild.required('_triggerElement', {
|
|
31
|
-
read: ElementRef,
|
|
32
|
-
});
|
|
33
|
-
/** @private Detached popup panel used by the overlay focus registry. */
|
|
34
|
-
_panel = viewChild('_panel', /* @ts-ignore */
|
|
35
|
-
...(ngDevMode ? [{ debugName: "_panel" }] : /* istanbul ignore next */ []));
|
|
36
|
-
/** @protected First contextual action focused when a table popup opens. */
|
|
37
|
-
_firstAction = viewChild('_firstAction', {
|
|
38
|
-
read: ElementRef,
|
|
39
|
-
});
|
|
40
|
-
/** @private Native insertion-grid buttons in row-major order. */
|
|
41
|
-
_gridCells = viewChildren('_gridCell', {
|
|
42
|
-
read: ElementRef,
|
|
43
|
-
});
|
|
44
|
-
/** @protected Fixed row and column choices exposed by the grid. */
|
|
45
|
-
_gridRows = Array.from({ length: TABLE_GRID_BOUNDARY }, (_, rowIndex) => Array.from({ length: TABLE_GRID_BOUNDARY }, (_, columnIndex) => ({
|
|
46
|
-
rows: rowIndex + 1,
|
|
47
|
-
cols: columnIndex + 1,
|
|
48
|
-
})));
|
|
49
|
-
/** @protected Currently selected insertion dimensions. */
|
|
50
|
-
_selectedSize = signal({
|
|
51
|
-
rows: 3,
|
|
52
|
-
cols: 3,
|
|
53
|
-
}, /* @ts-ignore */
|
|
54
|
-
...(ngDevMode ? [{ debugName: "_selectedSize" }] : /* istanbul ignore next */ []));
|
|
55
|
-
/** @protected Whether insertion creates a header first row. */
|
|
56
|
-
_withHeaderRow = signal(true, /* @ts-ignore */
|
|
57
|
-
...(ngDevMode ? [{ debugName: "_withHeaderRow" }] : /* istanbul ignore next */ []));
|
|
58
|
-
/** @protected Reactive localized copy for the trigger and insertion panel. */
|
|
59
|
-
_copy = computed(() => {
|
|
60
|
-
const copy = this._i18n?.();
|
|
61
|
-
return {
|
|
62
|
-
table: copy?.table ?? 'Table',
|
|
63
|
-
insertTable: copy?.insertTable ?? 'Insert table',
|
|
64
|
-
addRowBefore: copy?.addRowBefore ?? 'Add row before',
|
|
65
|
-
addRowAfter: copy?.addRowAfter ?? 'Add row after',
|
|
66
|
-
deleteRow: copy?.deleteRow ?? 'Delete row',
|
|
67
|
-
addColumnBefore: copy?.addColumnBefore ?? 'Add column before',
|
|
68
|
-
addColumnAfter: copy?.addColumnAfter ?? 'Add column after',
|
|
69
|
-
deleteColumn: copy?.deleteColumn ?? 'Delete column',
|
|
70
|
-
mergeCells: copy?.mergeCells ?? 'Merge cells',
|
|
71
|
-
splitCell: copy?.splitCell ?? 'Split cell',
|
|
72
|
-
toggleHeaderRow: copy?.toggleHeaderRow ?? 'Toggle header row',
|
|
73
|
-
toggleHeaderColumn: copy?.toggleHeaderColumn ?? 'Toggle header column',
|
|
74
|
-
toggleHeaderCell: copy?.toggleHeaderCell ?? 'Toggle header cell',
|
|
75
|
-
deleteTable: copy?.deleteTable ?? 'Delete table',
|
|
76
|
-
};
|
|
77
|
-
}, /* @ts-ignore */
|
|
78
|
-
...(ngDevMode ? [{ debugName: "_copy" }] : /* istanbul ignore next */ []));
|
|
79
|
-
/** @protected Whether the current editor registered table commands. */
|
|
80
|
-
_supported = computed(() => {
|
|
81
|
-
this._revision?.();
|
|
82
|
-
const commands = this._context.editor()?.commands;
|
|
83
|
-
return typeof commands?.['insertTable'] === 'function';
|
|
84
|
-
}, /* @ts-ignore */
|
|
85
|
-
...(ngDevMode ? [{ debugName: "_supported" }] : /* istanbul ignore next */ []));
|
|
86
|
-
/** @protected Whether the retained selection is inside a table. */
|
|
87
|
-
_active = computed(() => {
|
|
88
|
-
this._revision?.();
|
|
89
|
-
return this._context.isActive('table');
|
|
90
|
-
}, /* @ts-ignore */
|
|
91
|
-
...(ngDevMode ? [{ debugName: "_active" }] : /* istanbul ignore next */ []));
|
|
92
|
-
/** @protected Whether editor form state blocks the complete control. */
|
|
93
|
-
_disabled = computed(() => this._context.disabled() || this._context.readonly(), /* @ts-ignore */
|
|
94
|
-
...(ngDevMode ? [{ debugName: "_disabled" }] : /* istanbul ignore next */ []));
|
|
95
|
-
/** @protected Adds a row before the selected cell. */
|
|
96
|
-
_addRowBefore = (editor) => editor.chain().addRowBefore().run();
|
|
97
|
-
/** @protected Adds a row after the selected cell. */
|
|
98
|
-
_addRowAfter = (editor) => editor.chain().addRowAfter().run();
|
|
99
|
-
/** @protected Deletes the selected row. */
|
|
100
|
-
_deleteRow = (editor) => editor.chain().deleteRow().run();
|
|
101
|
-
/** @protected Adds a column before the selected cell. */
|
|
102
|
-
_addColumnBefore = (editor) => editor.chain().addColumnBefore().run();
|
|
103
|
-
/** @protected Adds a column after the selected cell. */
|
|
104
|
-
_addColumnAfter = (editor) => editor.chain().addColumnAfter().run();
|
|
105
|
-
/** @protected Deletes the selected column. */
|
|
106
|
-
_deleteColumn = (editor) => editor.chain().deleteColumn().run();
|
|
107
|
-
/** @protected Merges the selected rectangular cell range. */
|
|
108
|
-
_mergeCells = (editor) => editor.chain().mergeCells().run();
|
|
109
|
-
/** @protected Splits the current merged cell. */
|
|
110
|
-
_splitCell = (editor) => editor.chain().splitCell().run();
|
|
111
|
-
/** @protected Toggles header nodes across the first row. */
|
|
112
|
-
_toggleHeaderRow = (editor) => editor.chain().toggleHeaderRow().run();
|
|
113
|
-
/** @protected Toggles header nodes down the first column. */
|
|
114
|
-
_toggleHeaderColumn = (editor) => editor.chain().toggleHeaderColumn().run();
|
|
115
|
-
/** @protected Toggles the selected table cell's header node type. */
|
|
116
|
-
_toggleHeaderCell = (editor) => editor.chain().toggleHeaderCell().run();
|
|
117
|
-
/** @protected Deletes the complete active table. */
|
|
118
|
-
_deleteTable = (editor) => editor.chain().deleteTable().run();
|
|
119
|
-
/** @protected Non-dispatching add-row-before capability check. */
|
|
120
|
-
_canAddRowBefore = (editor) => editor.can().chain().addRowBefore().run();
|
|
121
|
-
/** @protected Non-dispatching add-row-after capability check. */
|
|
122
|
-
_canAddRowAfter = (editor) => editor.can().chain().addRowAfter().run();
|
|
123
|
-
/** @protected Non-dispatching delete-row capability check. */
|
|
124
|
-
_canDeleteRow = (editor) => editor.can().chain().deleteRow().run();
|
|
125
|
-
/** @protected Non-dispatching add-column-before capability check. */
|
|
126
|
-
_canAddColumnBefore = (editor) => editor.can().chain().addColumnBefore().run();
|
|
127
|
-
/** @protected Non-dispatching add-column-after capability check. */
|
|
128
|
-
_canAddColumnAfter = (editor) => editor.can().chain().addColumnAfter().run();
|
|
129
|
-
/** @protected Non-dispatching delete-column capability check. */
|
|
130
|
-
_canDeleteColumn = (editor) => editor.can().chain().deleteColumn().run();
|
|
131
|
-
/** @protected Non-dispatching merge capability check. */
|
|
132
|
-
_canMergeCells = (editor) => editor.can().chain().mergeCells().run();
|
|
133
|
-
/** @protected Non-dispatching split capability check. */
|
|
134
|
-
_canSplitCell = (editor) => editor.can().chain().splitCell().run();
|
|
135
|
-
/** @protected Non-dispatching header-row capability check. */
|
|
136
|
-
_canToggleHeaderRow = (editor) => editor.can().chain().toggleHeaderRow().run();
|
|
137
|
-
/** @protected Non-dispatching header-column capability check. */
|
|
138
|
-
_canToggleHeaderColumn = (editor) => editor.can().chain().toggleHeaderColumn().run();
|
|
139
|
-
/** @protected Non-dispatching header-cell capability check. */
|
|
140
|
-
_canToggleHeaderCell = (editor) => editor.can().chain().toggleHeaderCell().run();
|
|
141
|
-
/** @protected Non-dispatching table-deletion capability check. */
|
|
142
|
-
_canDeleteTable = (editor) => editor.can().chain().deleteTable().run();
|
|
143
|
-
constructor() {
|
|
144
|
-
effect(() => {
|
|
145
|
-
if (this._disabled() && this._popup().opened()) {
|
|
146
|
-
this._popup().opened.set(false);
|
|
147
|
-
}
|
|
148
|
-
});
|
|
149
|
-
effect((onCleanup) => {
|
|
150
|
-
const panel = this._panel()?.nativeElement;
|
|
151
|
-
if (!panel)
|
|
152
|
-
return;
|
|
153
|
-
const unregister = this._overlays.register(panel, () => this._popup().opened.set(false));
|
|
154
|
-
onCleanup(unregister);
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
/** @protected Initializes and focuses the default insertion-grid choice. */
|
|
158
|
-
_onOpened() {
|
|
159
|
-
if (this._disabled()) {
|
|
160
|
-
this._popup().opened.set(false);
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
if (!this._active()) {
|
|
164
|
-
this._selectedSize.set({ rows: 3, cols: 3 });
|
|
165
|
-
this._withHeaderRow.set(true);
|
|
166
|
-
queueMicrotask(() => this._focusSelectedCell());
|
|
167
|
-
}
|
|
168
|
-
else {
|
|
169
|
-
queueMicrotask(() => this._firstAction()?.nativeElement.focus());
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
/** @protected Restores the connected toolbar trigger after final teardown. */
|
|
173
|
-
_onClosed() {
|
|
174
|
-
if (!this._disabled() && this._triggerElement().nativeElement.isConnected) {
|
|
175
|
-
this._triggerElement().nativeElement.focus();
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
/** @protected Names an exact insertion size from localized table copy. */
|
|
179
|
-
_sizeLabel(size) {
|
|
180
|
-
return `${this._copy().insertTable}: ${size.rows} × ${size.cols}`;
|
|
181
|
-
}
|
|
182
|
-
/** @protected Whether a grid cell belongs to the selected dimensions. */
|
|
183
|
-
_sizeSelected(size) {
|
|
184
|
-
const selected = this._selectedSize();
|
|
185
|
-
return size.rows <= selected.rows && size.cols <= selected.cols;
|
|
186
|
-
}
|
|
187
|
-
/** @protected Updates the current pointer/focus-selected dimensions. */
|
|
188
|
-
_selectSize(size) {
|
|
189
|
-
this._selectedSize.set(size);
|
|
190
|
-
}
|
|
191
|
-
/** @protected Executes insertion for a selected pointer cell. */
|
|
192
|
-
_insertSize(size) {
|
|
193
|
-
this._selectedSize.set(size);
|
|
194
|
-
const inserted = this._context.run((editor) => editor
|
|
195
|
-
.chain()
|
|
196
|
-
.focus()
|
|
197
|
-
.insertTable({
|
|
198
|
-
rows: size.rows,
|
|
199
|
-
cols: size.cols,
|
|
200
|
-
withHeaderRow: this._withHeaderRow(),
|
|
201
|
-
})
|
|
202
|
-
.run());
|
|
203
|
-
if (inserted)
|
|
204
|
-
this._trigger().close();
|
|
205
|
-
}
|
|
206
|
-
/** @protected Whether current selection and form state block an action. */
|
|
207
|
-
_commandDisabled(command) {
|
|
208
|
-
this._revision?.();
|
|
209
|
-
if (this._disabled())
|
|
210
|
-
return true;
|
|
211
|
-
return !this._context.can(command);
|
|
212
|
-
}
|
|
213
|
-
/** @protected Executes one contextual mutation through the public guard. */
|
|
214
|
-
_run(command, closeAfter = false) {
|
|
215
|
-
const applied = this._context.run(command);
|
|
216
|
-
if (applied && closeAfter)
|
|
217
|
-
this._trigger().close();
|
|
218
|
-
}
|
|
219
|
-
/** @protected Handles bounded grid navigation and keyboard insertion. */
|
|
220
|
-
_onGridKeydown(event) {
|
|
221
|
-
const current = this._selectedSize();
|
|
222
|
-
let next = current;
|
|
223
|
-
switch (event.key) {
|
|
224
|
-
case 'ArrowLeft':
|
|
225
|
-
next = { ...current, cols: Math.max(1, current.cols - 1) };
|
|
226
|
-
break;
|
|
227
|
-
case 'ArrowRight':
|
|
228
|
-
next = {
|
|
229
|
-
...current,
|
|
230
|
-
cols: Math.min(TABLE_GRID_BOUNDARY, current.cols + 1),
|
|
231
|
-
};
|
|
232
|
-
break;
|
|
233
|
-
case 'ArrowUp':
|
|
234
|
-
next = { ...current, rows: Math.max(1, current.rows - 1) };
|
|
235
|
-
break;
|
|
236
|
-
case 'ArrowDown':
|
|
237
|
-
next = {
|
|
238
|
-
...current,
|
|
239
|
-
rows: Math.min(TABLE_GRID_BOUNDARY, current.rows + 1),
|
|
240
|
-
};
|
|
241
|
-
break;
|
|
242
|
-
case 'Home':
|
|
243
|
-
next = { rows: 1, cols: 1 };
|
|
244
|
-
break;
|
|
245
|
-
case 'End':
|
|
246
|
-
next = { rows: TABLE_GRID_BOUNDARY, cols: TABLE_GRID_BOUNDARY };
|
|
247
|
-
break;
|
|
248
|
-
case 'Enter':
|
|
249
|
-
case ' ':
|
|
250
|
-
event.preventDefault();
|
|
251
|
-
this._insertSize(current);
|
|
252
|
-
return;
|
|
253
|
-
default:
|
|
254
|
-
return;
|
|
255
|
-
}
|
|
256
|
-
event.preventDefault();
|
|
257
|
-
this._selectedSize.set(next);
|
|
258
|
-
queueMicrotask(() => this._focusSelectedCell());
|
|
259
|
-
}
|
|
260
|
-
/** @private Focuses the single row-major button matching selected dimensions. */
|
|
261
|
-
_focusSelectedCell() {
|
|
262
|
-
const selected = this._selectedSize();
|
|
263
|
-
const index = (selected.rows - 1) * TABLE_GRID_BOUNDARY + (selected.cols - 1);
|
|
264
|
-
this._gridCells()[index]?.nativeElement.focus();
|
|
265
|
-
}
|
|
266
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvEditorTable, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
267
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: MlvEditorTable, isStandalone: true, selector: "mlv-editor-table", host: { properties: { "hidden": "!_supported()" }, classAttribute: "mlv-editor-table" }, viewQueries: [{ propertyName: "_popup", first: true, predicate: ["_popup"], descendants: true, isSignal: true }, { propertyName: "_trigger", first: true, predicate: ["_trigger"], descendants: true, isSignal: true }, { propertyName: "_triggerElement", first: true, predicate: ["_triggerElement"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "_panel", first: true, predicate: ["_panel"], descendants: true, isSignal: true }, { propertyName: "_firstAction", first: true, predicate: ["_firstAction"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "_gridCells", predicate: ["_gridCell"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "<button\n #_trigger=\"mlvPopupTrigger\"\n #_triggerElement\n mlvButton\n mlvEditorToolbarWidget\n type=\"button\"\n shape=\"square\"\n mlvDensity=\"tight\"\n variant=\"transparent\"\n [disabled]=\"_disabled()\"\n [mlvPopupTrigger]=\"_popup\"\n [ariaHasPopup]=\"'dialog'\"\n [attr.aria-label]=\"_copy().table\"\n [attr.aria-pressed]=\"_active()\"\n [mlvTooltip]=\"_copy().table\"\n>\n <svg mlvButtonIcon lucideTable2 aria-hidden=\"true\" />\n</button>\n\n<mlv-popup\n #_popup\n panelRole=\"dialog\"\n [modal]=\"true\"\n [ariaLabel]=\"_copy().table\"\n (afterOpened)=\"_onOpened()\"\n (afterClosed)=\"_onClosed()\"\n>\n <ng-template mlvPopupContent>\n <div #_panel class=\"mlv-editor-table__panel\">\n @if (_active()) {\n <div class=\"mlv-editor-table__actions\">\n <button\n #_firstAction\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canAddRowBefore)\"\n (click)=\"_run(_addRowBefore)\"\n >\n {{ _copy().addRowBefore }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canAddRowAfter)\"\n (click)=\"_run(_addRowAfter)\"\n >\n {{ _copy().addRowAfter }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canDeleteRow)\"\n (click)=\"_run(_deleteRow)\"\n >\n {{ _copy().deleteRow }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canAddColumnBefore)\"\n (click)=\"_run(_addColumnBefore)\"\n >\n {{ _copy().addColumnBefore }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canAddColumnAfter)\"\n (click)=\"_run(_addColumnAfter)\"\n >\n {{ _copy().addColumnAfter }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canDeleteColumn)\"\n (click)=\"_run(_deleteColumn)\"\n >\n {{ _copy().deleteColumn }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canMergeCells)\"\n (click)=\"_run(_mergeCells)\"\n >\n {{ _copy().mergeCells }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canSplitCell)\"\n (click)=\"_run(_splitCell)\"\n >\n {{ _copy().splitCell }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canToggleHeaderRow)\"\n (click)=\"_run(_toggleHeaderRow)\"\n >\n {{ _copy().toggleHeaderRow }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canToggleHeaderColumn)\"\n (click)=\"_run(_toggleHeaderColumn)\"\n >\n {{ _copy().toggleHeaderColumn }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canToggleHeaderCell)\"\n (click)=\"_run(_toggleHeaderCell)\"\n >\n {{ _copy().toggleHeaderCell }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canDeleteTable)\"\n (click)=\"_run(_deleteTable, true)\"\n >\n {{ _copy().deleteTable }}\n </button>\n </div>\n } @else {\n <div\n class=\"mlv-editor-table__grid\"\n role=\"grid\"\n tabindex=\"-1\"\n [attr.aria-label]=\"_copy().insertTable\"\n (keydown)=\"_onGridKeydown($event)\"\n >\n @for (row of _gridRows; track $index) {\n <div class=\"mlv-editor-table__grid-row\" role=\"row\">\n @for (size of row; track size.cols) {\n <button\n #_gridCell\n mlvButton\n class=\"mlv-editor-table__grid-cell\"\n type=\"button\"\n variant=\"secondary\"\n role=\"gridcell\"\n [class.mlv-editor-table__grid-cell--selected]=\"_sizeSelected(size)\"\n [attr.aria-label]=\"_sizeLabel(size)\"\n [attr.aria-selected]=\"_sizeSelected(size)\"\n [attr.tabindex]=\"\n size.rows === _selectedSize().rows &&\n size.cols === _selectedSize().cols\n ? 0\n : -1\n \"\n [disabled]=\"_disabled()\"\n (focus)=\"_selectSize(size)\"\n (mouseenter)=\"_selectSize(size)\"\n (click)=\"_insertSize(size)\"\n ></button>\n }\n </div>\n }\n </div>\n\n <mlv-button-toggle\n [pressed]=\"_withHeaderRow()\"\n [disabled]=\"_disabled()\"\n (pressedChange)=\"_withHeaderRow.set($event)\"\n >\n {{ _copy().toggleHeaderRow }}\n </mlv-button-toggle>\n }\n </div>\n </ng-template>\n</mlv-popup>\n", styles: [".mlv-editor-table{box-sizing:border-box;padding:0;margin:0;font-family:var(--mlv-typography-family-text);font-size:var(--mlv-font-size-m)}.mlv-editor-table *{box-sizing:border-box}.mlv-editor-table{display:inline-flex}.mlv-editor-table__panel{display:grid;width:min(24rem,100vw - 3.5rem);gap:var(--mlv-spacing-1-5)}.mlv-editor-table__actions{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--mlv-spacing-2)}.mlv-editor-table__grid{display:grid;grid-template-columns:1fr;gap:.125rem}.mlv-editor-table__grid-row{display:grid;grid-template-columns:repeat(10,1.25rem);gap:.125rem}.mlv-editor-table__grid-cell{min-width:1.25rem;width:1.25rem;min-height:1.25rem;height:1.25rem;padding:0;border:var(--mlv-stroke-width) solid var(--mlv-border-normal);border-radius:var(--mlv-radius-xs);background:var(--mlv-background-base)}.mlv-editor-table__grid-cell--selected{border-color:var(--mlv-border-focus);background:var(--mlv-background-accent-1-pale)}.mlv-editor-table__grid-cell:focus-visible{outline:var(--mlv-stroke-width) solid var(--mlv-border-focus);outline-offset:.125rem}\n"], dependencies: [{ kind: "component", type: MlvButton, selector: "button[mlvButton], a[mlvButton]", inputs: ["variant", "shape", "disabled", "loading"] }, { kind: "directive", type: MlvButtonIcon, selector: "[mlvButtonIcon]" }, { kind: "component", type: MlvButtonToggle, selector: "mlv-button-toggle", inputs: ["pressed", "disabled", "variant", "shape", "mlvDensity", "ariaLabel", "ariaLabelledBy"], outputs: ["pressedChange"] }, { kind: "directive", type: MlvTooltip, selector: "[mlvTooltip]", inputs: ["mlvTooltip", "tooltipPlacement", "tooltipTone", "tooltipDelay", "tooltipDisabled", "tooltipArrow"] }, { kind: "component", type: LucideTable2, selector: "svg[lucideTable2]" }, { kind: "directive", type: MlvEditorToolbarWidget, selector: "[mlvEditorToolbarWidget]" }, { kind: "component", type: MlvPopup, selector: "mlv-popup", inputs: ["position", "positions", "width", "height", "minWidth", "minHeight", "maxWidth", "maxHeight", "hasArrow", "hasShadow", "class", "mlvDensity", "flexibleDimensions", "scrollStrategy", "hasBackdrop", "restrictPosition", "panelRole", "modal", "ariaLabel", "dismissExcludeElements", "mobileMode", "mobileBreakpoint", "mobileTitle", "mobileCloseLabel", "opened"], outputs: ["openedChange", "afterOpened", "afterClosed"] }, { kind: "directive", type: MlvPopupContent, selector: "[mlvPopupContent]" }, { kind: "directive", type: MlvPopupTrigger, selector: "[mlvPopupTrigger]", inputs: ["mlvPopupTrigger", "triggerOn", "ariaHasPopup"], exportAs: ["mlvPopupTrigger"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
268
|
-
}
|
|
269
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvEditorTable, decorators: [{
|
|
270
|
-
type: Component,
|
|
271
|
-
args: [{ selector: 'mlv-editor-table', imports: [
|
|
272
|
-
MlvButton,
|
|
273
|
-
MlvButtonIcon,
|
|
274
|
-
MlvButtonToggle,
|
|
275
|
-
MlvTooltip,
|
|
276
|
-
LucideTable2,
|
|
277
|
-
MlvEditorToolbarWidget,
|
|
278
|
-
MlvPopup,
|
|
279
|
-
MlvPopupContent,
|
|
280
|
-
MlvPopupTrigger,
|
|
281
|
-
], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
282
|
-
class: 'mlv-editor-table',
|
|
283
|
-
'[hidden]': '!_supported()',
|
|
284
|
-
}, template: "<button\n #_trigger=\"mlvPopupTrigger\"\n #_triggerElement\n mlvButton\n mlvEditorToolbarWidget\n type=\"button\"\n shape=\"square\"\n mlvDensity=\"tight\"\n variant=\"transparent\"\n [disabled]=\"_disabled()\"\n [mlvPopupTrigger]=\"_popup\"\n [ariaHasPopup]=\"'dialog'\"\n [attr.aria-label]=\"_copy().table\"\n [attr.aria-pressed]=\"_active()\"\n [mlvTooltip]=\"_copy().table\"\n>\n <svg mlvButtonIcon lucideTable2 aria-hidden=\"true\" />\n</button>\n\n<mlv-popup\n #_popup\n panelRole=\"dialog\"\n [modal]=\"true\"\n [ariaLabel]=\"_copy().table\"\n (afterOpened)=\"_onOpened()\"\n (afterClosed)=\"_onClosed()\"\n>\n <ng-template mlvPopupContent>\n <div #_panel class=\"mlv-editor-table__panel\">\n @if (_active()) {\n <div class=\"mlv-editor-table__actions\">\n <button\n #_firstAction\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canAddRowBefore)\"\n (click)=\"_run(_addRowBefore)\"\n >\n {{ _copy().addRowBefore }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canAddRowAfter)\"\n (click)=\"_run(_addRowAfter)\"\n >\n {{ _copy().addRowAfter }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canDeleteRow)\"\n (click)=\"_run(_deleteRow)\"\n >\n {{ _copy().deleteRow }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canAddColumnBefore)\"\n (click)=\"_run(_addColumnBefore)\"\n >\n {{ _copy().addColumnBefore }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canAddColumnAfter)\"\n (click)=\"_run(_addColumnAfter)\"\n >\n {{ _copy().addColumnAfter }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canDeleteColumn)\"\n (click)=\"_run(_deleteColumn)\"\n >\n {{ _copy().deleteColumn }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canMergeCells)\"\n (click)=\"_run(_mergeCells)\"\n >\n {{ _copy().mergeCells }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canSplitCell)\"\n (click)=\"_run(_splitCell)\"\n >\n {{ _copy().splitCell }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canToggleHeaderRow)\"\n (click)=\"_run(_toggleHeaderRow)\"\n >\n {{ _copy().toggleHeaderRow }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canToggleHeaderColumn)\"\n (click)=\"_run(_toggleHeaderColumn)\"\n >\n {{ _copy().toggleHeaderColumn }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canToggleHeaderCell)\"\n (click)=\"_run(_toggleHeaderCell)\"\n >\n {{ _copy().toggleHeaderCell }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canDeleteTable)\"\n (click)=\"_run(_deleteTable, true)\"\n >\n {{ _copy().deleteTable }}\n </button>\n </div>\n } @else {\n <div\n class=\"mlv-editor-table__grid\"\n role=\"grid\"\n tabindex=\"-1\"\n [attr.aria-label]=\"_copy().insertTable\"\n (keydown)=\"_onGridKeydown($event)\"\n >\n @for (row of _gridRows; track $index) {\n <div class=\"mlv-editor-table__grid-row\" role=\"row\">\n @for (size of row; track size.cols) {\n <button\n #_gridCell\n mlvButton\n class=\"mlv-editor-table__grid-cell\"\n type=\"button\"\n variant=\"secondary\"\n role=\"gridcell\"\n [class.mlv-editor-table__grid-cell--selected]=\"_sizeSelected(size)\"\n [attr.aria-label]=\"_sizeLabel(size)\"\n [attr.aria-selected]=\"_sizeSelected(size)\"\n [attr.tabindex]=\"\n size.rows === _selectedSize().rows &&\n size.cols === _selectedSize().cols\n ? 0\n : -1\n \"\n [disabled]=\"_disabled()\"\n (focus)=\"_selectSize(size)\"\n (mouseenter)=\"_selectSize(size)\"\n (click)=\"_insertSize(size)\"\n ></button>\n }\n </div>\n }\n </div>\n\n <mlv-button-toggle\n [pressed]=\"_withHeaderRow()\"\n [disabled]=\"_disabled()\"\n (pressedChange)=\"_withHeaderRow.set($event)\"\n >\n {{ _copy().toggleHeaderRow }}\n </mlv-button-toggle>\n }\n </div>\n </ng-template>\n</mlv-popup>\n", styles: [".mlv-editor-table{box-sizing:border-box;padding:0;margin:0;font-family:var(--mlv-typography-family-text);font-size:var(--mlv-font-size-m)}.mlv-editor-table *{box-sizing:border-box}.mlv-editor-table{display:inline-flex}.mlv-editor-table__panel{display:grid;width:min(24rem,100vw - 3.5rem);gap:var(--mlv-spacing-1-5)}.mlv-editor-table__actions{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--mlv-spacing-2)}.mlv-editor-table__grid{display:grid;grid-template-columns:1fr;gap:.125rem}.mlv-editor-table__grid-row{display:grid;grid-template-columns:repeat(10,1.25rem);gap:.125rem}.mlv-editor-table__grid-cell{min-width:1.25rem;width:1.25rem;min-height:1.25rem;height:1.25rem;padding:0;border:var(--mlv-stroke-width) solid var(--mlv-border-normal);border-radius:var(--mlv-radius-xs);background:var(--mlv-background-base)}.mlv-editor-table__grid-cell--selected{border-color:var(--mlv-border-focus);background:var(--mlv-background-accent-1-pale)}.mlv-editor-table__grid-cell:focus-visible{outline:var(--mlv-stroke-width) solid var(--mlv-border-focus);outline-offset:.125rem}\n"] }]
|
|
285
|
-
}], ctorParameters: () => [], propDecorators: { _popup: [{ type: i0.ViewChild, args: ['_popup', { isSignal: true }] }], _trigger: [{ type: i0.ViewChild, args: ['_trigger', { isSignal: true }] }], _triggerElement: [{ type: i0.ViewChild, args: ['_triggerElement', { ...{
|
|
286
|
-
read: ElementRef,
|
|
287
|
-
}, isSignal: true }] }], _panel: [{ type: i0.ViewChild, args: ['_panel', { isSignal: true }] }], _firstAction: [{ type: i0.ViewChild, args: ['_firstAction', { ...{
|
|
288
|
-
read: ElementRef,
|
|
289
|
-
}, isSignal: true }] }], _gridCells: [{ type: i0.ViewChildren, args: ['_gridCell', { ...{
|
|
290
|
-
read: ElementRef,
|
|
291
|
-
}, isSignal: true }] }] } });
|
|
292
|
-
//# sourceMappingURL=editor-table.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"editor-table.js","sourceRoot":"","sources":["../../../../../../libs/editor/src/lib/toolbar/editor-table.ts","../../../../../../libs/editor/src/lib/toolbar/editor-table.html"],"names":[],"mappings":"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","sourcesContent":["import type { Signal } from '@angular/core';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n effect,\n inject,\n signal,\n viewChild,\n viewChildren,\n ViewEncapsulation,\n} from '@angular/core';\nimport type { Editor } from '@tiptap/core';\nimport { LucideTable2 } from '@lucide/angular';\nimport {\n MlvButton,\n MlvButtonIcon,\n MlvButtonToggle,\n} from '@malva-ui/core/button';\nimport {\n MlvPopup,\n MlvPopupContent,\n MlvPopupTrigger,\n} from '@malva-ui/core/popup';\nimport { MLV_EDITOR_I18N } from '@malva-ui/i18n';\nimport { MlvTooltip } from '@malva-ui/core/tooltip';\nimport {\n MLV_EDITOR_OVERLAY_REGISTRY,\n MLV_EDITOR_TOOLBAR_CONTEXT,\n MLV_EDITOR_TOOLBAR_REVISION,\n} from '../editor-toolbar-context';\nimport { MlvEditorToolbarWidget } from './editor-toolbar-widget';\n\ninterface EditorTableSize {\n readonly rows: number;\n readonly cols: number;\n}\n\nconst TABLE_GRID_BOUNDARY = 10;\n\n/** Resizable table insertion and contextual command control. */\n@Component({\n selector: 'mlv-editor-table',\n imports: [\n MlvButton,\n MlvButtonIcon,\n MlvButtonToggle,\n MlvTooltip,\n LucideTable2,\n MlvEditorToolbarWidget,\n MlvPopup,\n MlvPopupContent,\n MlvPopupTrigger,\n ],\n templateUrl: './editor-table.html',\n styleUrl: './editor-table.scss',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mlv-editor-table',\n '[hidden]': '!_supported()',\n },\n})\nexport class MlvEditorTable {\n /** @protected Editor-scoped command and form state. */\n protected readonly _context = inject(MLV_EDITOR_TOOLBAR_CONTEXT);\n\n /** @private Transaction and selection invalidation bridge. */\n private readonly _revision = inject(MLV_EDITOR_TOOLBAR_REVISION, {\n optional: true,\n });\n\n /** @private Detached popup ownership for composite editor focus. */\n private readonly _overlays = inject(MLV_EDITOR_OVERLAY_REGISTRY);\n\n /** @private Optional localized editor copy. */\n private readonly _i18n = inject(MLV_EDITOR_I18N, { optional: true });\n\n /** @protected Popup controller owned by the table trigger. */\n protected readonly _popup = viewChild.required<MlvPopup>('_popup');\n\n /** @protected Connected popup trigger. */\n protected readonly _trigger = viewChild.required<MlvPopupTrigger>('_trigger');\n\n /** @protected Native trigger restored after final popup teardown. */\n protected readonly _triggerElement = viewChild.required('_triggerElement', {\n read: ElementRef,\n }) as Signal<ElementRef<HTMLButtonElement>>;\n\n /** @private Detached popup panel used by the overlay focus registry. */\n private readonly _panel = viewChild<ElementRef<HTMLElement>>('_panel');\n\n /** @protected First contextual action focused when a table popup opens. */\n protected readonly _firstAction = viewChild('_firstAction', {\n read: ElementRef,\n }) as Signal<ElementRef<HTMLButtonElement> | undefined>;\n\n /** @private Native insertion-grid buttons in row-major order. */\n private readonly _gridCells = viewChildren('_gridCell', {\n read: ElementRef,\n }) as Signal<readonly ElementRef<HTMLButtonElement>[]>;\n\n /** @protected Fixed row and column choices exposed by the grid. */\n protected readonly _gridRows: readonly (readonly EditorTableSize[])[] =\n Array.from({ length: TABLE_GRID_BOUNDARY }, (_, rowIndex) =>\n Array.from({ length: TABLE_GRID_BOUNDARY }, (_, columnIndex) => ({\n rows: rowIndex + 1,\n cols: columnIndex + 1,\n })),\n );\n\n /** @protected Currently selected insertion dimensions. */\n protected readonly _selectedSize = signal<EditorTableSize>({\n rows: 3,\n cols: 3,\n });\n\n /** @protected Whether insertion creates a header first row. */\n protected readonly _withHeaderRow = signal(true);\n\n /** @protected Reactive localized copy for the trigger and insertion panel. */\n protected readonly _copy = computed(() => {\n const copy = this._i18n?.();\n return {\n table: copy?.table ?? 'Table',\n insertTable: copy?.insertTable ?? 'Insert table',\n addRowBefore: copy?.addRowBefore ?? 'Add row before',\n addRowAfter: copy?.addRowAfter ?? 'Add row after',\n deleteRow: copy?.deleteRow ?? 'Delete row',\n addColumnBefore: copy?.addColumnBefore ?? 'Add column before',\n addColumnAfter: copy?.addColumnAfter ?? 'Add column after',\n deleteColumn: copy?.deleteColumn ?? 'Delete column',\n mergeCells: copy?.mergeCells ?? 'Merge cells',\n splitCell: copy?.splitCell ?? 'Split cell',\n toggleHeaderRow: copy?.toggleHeaderRow ?? 'Toggle header row',\n toggleHeaderColumn: copy?.toggleHeaderColumn ?? 'Toggle header column',\n toggleHeaderCell: copy?.toggleHeaderCell ?? 'Toggle header cell',\n deleteTable: copy?.deleteTable ?? 'Delete table',\n };\n });\n\n /** @protected Whether the current editor registered table commands. */\n protected readonly _supported = computed(() => {\n this._revision?.();\n const commands = this._context.editor()?.commands as\n | Record<string, unknown>\n | undefined;\n return typeof commands?.['insertTable'] === 'function';\n });\n\n /** @protected Whether the retained selection is inside a table. */\n protected readonly _active = computed(() => {\n this._revision?.();\n return this._context.isActive('table');\n });\n\n /** @protected Whether editor form state blocks the complete control. */\n protected readonly _disabled = computed(\n () => this._context.disabled() || this._context.readonly(),\n );\n\n /** @protected Adds a row before the selected cell. */\n protected readonly _addRowBefore = (editor: Editor): boolean =>\n editor.chain().addRowBefore().run();\n\n /** @protected Adds a row after the selected cell. */\n protected readonly _addRowAfter = (editor: Editor): boolean =>\n editor.chain().addRowAfter().run();\n\n /** @protected Deletes the selected row. */\n protected readonly _deleteRow = (editor: Editor): boolean =>\n editor.chain().deleteRow().run();\n\n /** @protected Adds a column before the selected cell. */\n protected readonly _addColumnBefore = (editor: Editor): boolean =>\n editor.chain().addColumnBefore().run();\n\n /** @protected Adds a column after the selected cell. */\n protected readonly _addColumnAfter = (editor: Editor): boolean =>\n editor.chain().addColumnAfter().run();\n\n /** @protected Deletes the selected column. */\n protected readonly _deleteColumn = (editor: Editor): boolean =>\n editor.chain().deleteColumn().run();\n\n /** @protected Merges the selected rectangular cell range. */\n protected readonly _mergeCells = (editor: Editor): boolean =>\n editor.chain().mergeCells().run();\n\n /** @protected Splits the current merged cell. */\n protected readonly _splitCell = (editor: Editor): boolean =>\n editor.chain().splitCell().run();\n\n /** @protected Toggles header nodes across the first row. */\n protected readonly _toggleHeaderRow = (editor: Editor): boolean =>\n editor.chain().toggleHeaderRow().run();\n\n /** @protected Toggles header nodes down the first column. */\n protected readonly _toggleHeaderColumn = (editor: Editor): boolean =>\n editor.chain().toggleHeaderColumn().run();\n\n /** @protected Toggles the selected table cell's header node type. */\n protected readonly _toggleHeaderCell = (editor: Editor): boolean =>\n editor.chain().toggleHeaderCell().run();\n\n /** @protected Deletes the complete active table. */\n protected readonly _deleteTable = (editor: Editor): boolean =>\n editor.chain().deleteTable().run();\n\n /** @protected Non-dispatching add-row-before capability check. */\n protected readonly _canAddRowBefore = (editor: Editor): boolean =>\n editor.can().chain().addRowBefore().run();\n\n /** @protected Non-dispatching add-row-after capability check. */\n protected readonly _canAddRowAfter = (editor: Editor): boolean =>\n editor.can().chain().addRowAfter().run();\n\n /** @protected Non-dispatching delete-row capability check. */\n protected readonly _canDeleteRow = (editor: Editor): boolean =>\n editor.can().chain().deleteRow().run();\n\n /** @protected Non-dispatching add-column-before capability check. */\n protected readonly _canAddColumnBefore = (editor: Editor): boolean =>\n editor.can().chain().addColumnBefore().run();\n\n /** @protected Non-dispatching add-column-after capability check. */\n protected readonly _canAddColumnAfter = (editor: Editor): boolean =>\n editor.can().chain().addColumnAfter().run();\n\n /** @protected Non-dispatching delete-column capability check. */\n protected readonly _canDeleteColumn = (editor: Editor): boolean =>\n editor.can().chain().deleteColumn().run();\n\n /** @protected Non-dispatching merge capability check. */\n protected readonly _canMergeCells = (editor: Editor): boolean =>\n editor.can().chain().mergeCells().run();\n\n /** @protected Non-dispatching split capability check. */\n protected readonly _canSplitCell = (editor: Editor): boolean =>\n editor.can().chain().splitCell().run();\n\n /** @protected Non-dispatching header-row capability check. */\n protected readonly _canToggleHeaderRow = (editor: Editor): boolean =>\n editor.can().chain().toggleHeaderRow().run();\n\n /** @protected Non-dispatching header-column capability check. */\n protected readonly _canToggleHeaderColumn = (editor: Editor): boolean =>\n editor.can().chain().toggleHeaderColumn().run();\n\n /** @protected Non-dispatching header-cell capability check. */\n protected readonly _canToggleHeaderCell = (editor: Editor): boolean =>\n editor.can().chain().toggleHeaderCell().run();\n\n /** @protected Non-dispatching table-deletion capability check. */\n protected readonly _canDeleteTable = (editor: Editor): boolean =>\n editor.can().chain().deleteTable().run();\n\n constructor() {\n effect(() => {\n if (this._disabled() && this._popup().opened()) {\n this._popup().opened.set(false);\n }\n });\n\n effect((onCleanup) => {\n const panel = this._panel()?.nativeElement;\n if (!panel) return;\n const unregister = this._overlays.register(panel, () =>\n this._popup().opened.set(false),\n );\n onCleanup(unregister);\n });\n }\n\n /** @protected Initializes and focuses the default insertion-grid choice. */\n protected _onOpened(): void {\n if (this._disabled()) {\n this._popup().opened.set(false);\n return;\n }\n if (!this._active()) {\n this._selectedSize.set({ rows: 3, cols: 3 });\n this._withHeaderRow.set(true);\n queueMicrotask(() => this._focusSelectedCell());\n } else {\n queueMicrotask(() => this._firstAction()?.nativeElement.focus());\n }\n }\n\n /** @protected Restores the connected toolbar trigger after final teardown. */\n protected _onClosed(): void {\n if (!this._disabled() && this._triggerElement().nativeElement.isConnected) {\n this._triggerElement().nativeElement.focus();\n }\n }\n\n /** @protected Names an exact insertion size from localized table copy. */\n protected _sizeLabel(size: EditorTableSize): string {\n return `${this._copy().insertTable}: ${size.rows} × ${size.cols}`;\n }\n\n /** @protected Whether a grid cell belongs to the selected dimensions. */\n protected _sizeSelected(size: EditorTableSize): boolean {\n const selected = this._selectedSize();\n return size.rows <= selected.rows && size.cols <= selected.cols;\n }\n\n /** @protected Updates the current pointer/focus-selected dimensions. */\n protected _selectSize(size: EditorTableSize): void {\n this._selectedSize.set(size);\n }\n\n /** @protected Executes insertion for a selected pointer cell. */\n protected _insertSize(size: EditorTableSize): void {\n this._selectedSize.set(size);\n const inserted = this._context.run((editor) =>\n editor\n .chain()\n .focus()\n .insertTable({\n rows: size.rows,\n cols: size.cols,\n withHeaderRow: this._withHeaderRow(),\n })\n .run(),\n );\n if (inserted) this._trigger().close();\n }\n\n /** @protected Whether current selection and form state block an action. */\n protected _commandDisabled(command: (editor: Editor) => boolean): boolean {\n this._revision?.();\n if (this._disabled()) return true;\n return !this._context.can(command);\n }\n\n /** @protected Executes one contextual mutation through the public guard. */\n protected _run(\n command: (editor: Editor) => boolean,\n closeAfter = false,\n ): void {\n const applied = this._context.run(command);\n if (applied && closeAfter) this._trigger().close();\n }\n\n /** @protected Handles bounded grid navigation and keyboard insertion. */\n protected _onGridKeydown(event: KeyboardEvent): void {\n const current = this._selectedSize();\n let next = current;\n switch (event.key) {\n case 'ArrowLeft':\n next = { ...current, cols: Math.max(1, current.cols - 1) };\n break;\n case 'ArrowRight':\n next = {\n ...current,\n cols: Math.min(TABLE_GRID_BOUNDARY, current.cols + 1),\n };\n break;\n case 'ArrowUp':\n next = { ...current, rows: Math.max(1, current.rows - 1) };\n break;\n case 'ArrowDown':\n next = {\n ...current,\n rows: Math.min(TABLE_GRID_BOUNDARY, current.rows + 1),\n };\n break;\n case 'Home':\n next = { rows: 1, cols: 1 };\n break;\n case 'End':\n next = { rows: TABLE_GRID_BOUNDARY, cols: TABLE_GRID_BOUNDARY };\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n this._insertSize(current);\n return;\n default:\n return;\n }\n event.preventDefault();\n this._selectedSize.set(next);\n queueMicrotask(() => this._focusSelectedCell());\n }\n\n /** @private Focuses the single row-major button matching selected dimensions. */\n private _focusSelectedCell(): void {\n const selected = this._selectedSize();\n const index =\n (selected.rows - 1) * TABLE_GRID_BOUNDARY + (selected.cols - 1);\n this._gridCells()[index]?.nativeElement.focus();\n }\n}\n","<button\n #_trigger=\"mlvPopupTrigger\"\n #_triggerElement\n mlvButton\n mlvEditorToolbarWidget\n type=\"button\"\n shape=\"square\"\n mlvDensity=\"tight\"\n variant=\"transparent\"\n [disabled]=\"_disabled()\"\n [mlvPopupTrigger]=\"_popup\"\n [ariaHasPopup]=\"'dialog'\"\n [attr.aria-label]=\"_copy().table\"\n [attr.aria-pressed]=\"_active()\"\n [mlvTooltip]=\"_copy().table\"\n>\n <svg mlvButtonIcon lucideTable2 aria-hidden=\"true\" />\n</button>\n\n<mlv-popup\n #_popup\n panelRole=\"dialog\"\n [modal]=\"true\"\n [ariaLabel]=\"_copy().table\"\n (afterOpened)=\"_onOpened()\"\n (afterClosed)=\"_onClosed()\"\n>\n <ng-template mlvPopupContent>\n <div #_panel class=\"mlv-editor-table__panel\">\n @if (_active()) {\n <div class=\"mlv-editor-table__actions\">\n <button\n #_firstAction\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canAddRowBefore)\"\n (click)=\"_run(_addRowBefore)\"\n >\n {{ _copy().addRowBefore }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canAddRowAfter)\"\n (click)=\"_run(_addRowAfter)\"\n >\n {{ _copy().addRowAfter }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canDeleteRow)\"\n (click)=\"_run(_deleteRow)\"\n >\n {{ _copy().deleteRow }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canAddColumnBefore)\"\n (click)=\"_run(_addColumnBefore)\"\n >\n {{ _copy().addColumnBefore }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canAddColumnAfter)\"\n (click)=\"_run(_addColumnAfter)\"\n >\n {{ _copy().addColumnAfter }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canDeleteColumn)\"\n (click)=\"_run(_deleteColumn)\"\n >\n {{ _copy().deleteColumn }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canMergeCells)\"\n (click)=\"_run(_mergeCells)\"\n >\n {{ _copy().mergeCells }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canSplitCell)\"\n (click)=\"_run(_splitCell)\"\n >\n {{ _copy().splitCell }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canToggleHeaderRow)\"\n (click)=\"_run(_toggleHeaderRow)\"\n >\n {{ _copy().toggleHeaderRow }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canToggleHeaderColumn)\"\n (click)=\"_run(_toggleHeaderColumn)\"\n >\n {{ _copy().toggleHeaderColumn }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canToggleHeaderCell)\"\n (click)=\"_run(_toggleHeaderCell)\"\n >\n {{ _copy().toggleHeaderCell }}\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"_commandDisabled(_canDeleteTable)\"\n (click)=\"_run(_deleteTable, true)\"\n >\n {{ _copy().deleteTable }}\n </button>\n </div>\n } @else {\n <div\n class=\"mlv-editor-table__grid\"\n role=\"grid\"\n tabindex=\"-1\"\n [attr.aria-label]=\"_copy().insertTable\"\n (keydown)=\"_onGridKeydown($event)\"\n >\n @for (row of _gridRows; track $index) {\n <div class=\"mlv-editor-table__grid-row\" role=\"row\">\n @for (size of row; track size.cols) {\n <button\n #_gridCell\n mlvButton\n class=\"mlv-editor-table__grid-cell\"\n type=\"button\"\n variant=\"secondary\"\n role=\"gridcell\"\n [class.mlv-editor-table__grid-cell--selected]=\"_sizeSelected(size)\"\n [attr.aria-label]=\"_sizeLabel(size)\"\n [attr.aria-selected]=\"_sizeSelected(size)\"\n [attr.tabindex]=\"\n size.rows === _selectedSize().rows &&\n size.cols === _selectedSize().cols\n ? 0\n : -1\n \"\n [disabled]=\"_disabled()\"\n (focus)=\"_selectSize(size)\"\n (mouseenter)=\"_selectSize(size)\"\n (click)=\"_insertSize(size)\"\n ></button>\n }\n </div>\n }\n </div>\n\n <mlv-button-toggle\n [pressed]=\"_withHeaderRow()\"\n [disabled]=\"_disabled()\"\n (pressedChange)=\"_withHeaderRow.set($event)\"\n >\n {{ _copy().toggleHeaderRow }}\n </mlv-button-toggle>\n }\n </div>\n </ng-template>\n</mlv-popup>\n"]}
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, computed, inject, ViewEncapsulation, } from '@angular/core';
|
|
2
|
-
import { LucideType } from '@lucide/angular';
|
|
3
|
-
import { MlvButtonIcon } from '@malva-ui/core/button';
|
|
4
|
-
import { MlvColorPickerPopup } from '@malva-ui/core/color-picker';
|
|
5
|
-
import { MLV_EDITOR_I18N } from '@malva-ui/i18n';
|
|
6
|
-
import { MlvEditorColorControl } from './editor-color-control';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
/** Foreground-colour toolbar control backed by the reusable swatch picker. */
|
|
9
|
-
export class MlvEditorTextColor extends MlvEditorColorControl {
|
|
10
|
-
/** @private Optional localized editor labels. */
|
|
11
|
-
_i18n = inject(MLV_EDITOR_I18N, { optional: true });
|
|
12
|
-
/** @protected Localized accessible trigger and dialog label. */
|
|
13
|
-
_label = computed(() => this._i18n?.().textColor ?? 'Text color', /* @ts-ignore */
|
|
14
|
-
...(ngDevMode ? [{ debugName: "_label" }] : /* istanbul ignore next */ []));
|
|
15
|
-
/** @protected Exact command-presence capability without command execution. */
|
|
16
|
-
_supported = computed(() => {
|
|
17
|
-
this._revision?.();
|
|
18
|
-
const commands = this._context.editor()?.commands;
|
|
19
|
-
return (typeof commands?.['setColor'] === 'function' &&
|
|
20
|
-
typeof commands['unsetColor'] === 'function');
|
|
21
|
-
}, /* @ts-ignore */
|
|
22
|
-
...(ngDevMode ? [{ debugName: "_supported" }] : /* istanbul ignore next */ []));
|
|
23
|
-
/** @protected Active foreground colour rendered by the swatch. */
|
|
24
|
-
_activeColor = computed(() => {
|
|
25
|
-
this._revision?.();
|
|
26
|
-
const color = this._context.editor()?.getAttributes('textStyle')['color'];
|
|
27
|
-
return typeof color === 'string' && color ? color : '#000000';
|
|
28
|
-
}, /* @ts-ignore */
|
|
29
|
-
...(ngDevMode ? [{ debugName: "_activeColor" }] : /* istanbul ignore next */ []));
|
|
30
|
-
/** @protected Applies or clears foreground colour without focusing Tiptap. */
|
|
31
|
-
_run(editor, selection, color) {
|
|
32
|
-
const chain = editor.chain().setTextSelection(selection);
|
|
33
|
-
return color ? chain.setColor(color).run() : chain.unsetColor().run();
|
|
34
|
-
}
|
|
35
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvEditorTextColor, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
36
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.7", type: MlvEditorTextColor, isStandalone: true, selector: "mlv-editor-text-color", host: { properties: { "hidden": "!_supported()" }, classAttribute: "mlv-editor-text-color" }, usesInheritance: true, ngImport: i0, template: `
|
|
37
|
-
<mlv-color-picker-popup
|
|
38
|
-
#picker
|
|
39
|
-
presentation="icon"
|
|
40
|
-
clearable
|
|
41
|
-
live
|
|
42
|
-
[ariaLabel]="_label()"
|
|
43
|
-
[value]="_activeColor()"
|
|
44
|
-
[disabled]="_context.disabled()"
|
|
45
|
-
[readonly]="_context.readonly()"
|
|
46
|
-
(openedChange)="_onOpenedChange($event)"
|
|
47
|
-
(colorChange)="_apply($event)"
|
|
48
|
-
>
|
|
49
|
-
<svg mlvButtonIcon lucideType aria-hidden="true" />
|
|
50
|
-
</mlv-color-picker-popup>
|
|
51
|
-
`, isInline: true, dependencies: [{ kind: "component", type: MlvColorPickerPopup, selector: "mlv-color-picker-popup", inputs: ["value", "presentation", "opened", "showOpacity", "defaultMode", "supportedFormats", "live"], outputs: ["valueChange", "openedChange", "afterOpened", "afterClosed", "colorChange"] }, { kind: "directive", type: MlvButtonIcon, selector: "[mlvButtonIcon]" }, { kind: "component", type: LucideType, selector: "svg[lucideType]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
52
|
-
}
|
|
53
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvEditorTextColor, decorators: [{
|
|
54
|
-
type: Component,
|
|
55
|
-
args: [{
|
|
56
|
-
selector: 'mlv-editor-text-color',
|
|
57
|
-
imports: [MlvColorPickerPopup, MlvButtonIcon, LucideType],
|
|
58
|
-
template: `
|
|
59
|
-
<mlv-color-picker-popup
|
|
60
|
-
#picker
|
|
61
|
-
presentation="icon"
|
|
62
|
-
clearable
|
|
63
|
-
live
|
|
64
|
-
[ariaLabel]="_label()"
|
|
65
|
-
[value]="_activeColor()"
|
|
66
|
-
[disabled]="_context.disabled()"
|
|
67
|
-
[readonly]="_context.readonly()"
|
|
68
|
-
(openedChange)="_onOpenedChange($event)"
|
|
69
|
-
(colorChange)="_apply($event)"
|
|
70
|
-
>
|
|
71
|
-
<svg mlvButtonIcon lucideType aria-hidden="true" />
|
|
72
|
-
</mlv-color-picker-popup>
|
|
73
|
-
`,
|
|
74
|
-
encapsulation: ViewEncapsulation.None,
|
|
75
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
76
|
-
host: {
|
|
77
|
-
class: 'mlv-editor-text-color',
|
|
78
|
-
'[hidden]': '!_supported()',
|
|
79
|
-
},
|
|
80
|
-
}]
|
|
81
|
-
}] });
|
|
82
|
-
//# sourceMappingURL=editor-text-color.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"editor-text-color.js","sourceRoot":"","sources":["../../../../../../libs/editor/src/lib/toolbar/editor-text-color.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,SAAS,EACT,QAAQ,EACR,MAAM,EACN,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;;AAE/D,8EAA8E;AA2B9E,MAAM,OAAO,kBAAmB,SAAQ,qBAAqB;IAC3D,iDAAiD;IAChC,KAAK,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAErE,gEAAgE;IAC7C,MAAM,GAAG,QAAQ,CAClC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,IAAI,YAAY;+EAC/C,CAAC;IAEF,8EAA8E;IAC3D,UAAU,GAAG,QAAQ,CAAC,GAAG,EAAE;QAC5C,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,QAE5B,CAAC;QACd,OAAO,CACL,OAAO,QAAQ,EAAE,CAAC,UAAU,CAAC,KAAK,UAAU;YAC5C,OAAO,QAAQ,CAAC,YAAY,CAAC,KAAK,UAAU,CAC7C,CAAC;IACJ,CAAC;mFAAC,CAAC;IAEH,kEAAkE;IAC/C,YAAY,GAAG,QAAQ,CAAC,GAAG,EAAE;QAC9C,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC;QAC1E,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,CAAC;qFAAC,CAAC;IAEH,8EAA8E;IAC3D,IAAI,CACrB,MAAc,EACd,SAAyD,EACzD,KAAa;QAEb,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACzD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,CAAC;IACxE,CAAC;uGApCU,kBAAkB;2FAAlB,kBAAkB,sMAvBnB;;;;;;;;;;;;;;;GAeT,4DAhBS,mBAAmB,iQAAE,aAAa,4DAAE,UAAU;;2FAwB7C,kBAAkB;kBA1B9B,SAAS;mBAAC;oBACT,QAAQ,EAAE,uBAAuB;oBACjC,OAAO,EAAE,CAAC,mBAAmB,EAAE,aAAa,EAAE,UAAU,CAAC;oBACzD,QAAQ,EAAE;;;;;;;;;;;;;;;GAeT;oBACD,aAAa,EAAE,iBAAiB,CAAC,IAAI;oBACrC,eAAe,EAAE,uBAAuB,CAAC,MAAM;oBAC/C,IAAI,EAAE;wBACJ,KAAK,EAAE,uBAAuB;wBAC9B,UAAU,EAAE,eAAe;qBAC5B;iBACF","sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n ViewEncapsulation,\n} from '@angular/core';\nimport type { Editor } from '@tiptap/core';\nimport { LucideType } from '@lucide/angular';\nimport { MlvButtonIcon } from '@malva-ui/core/button';\nimport { MlvColorPickerPopup } from '@malva-ui/core/color-picker';\nimport { MLV_EDITOR_I18N } from '@malva-ui/i18n';\nimport { MlvEditorColorControl } from './editor-color-control';\n\n/** Foreground-colour toolbar control backed by the reusable swatch picker. */\n@Component({\n selector: 'mlv-editor-text-color',\n imports: [MlvColorPickerPopup, MlvButtonIcon, LucideType],\n template: `\n <mlv-color-picker-popup\n #picker\n presentation=\"icon\"\n clearable\n live\n [ariaLabel]=\"_label()\"\n [value]=\"_activeColor()\"\n [disabled]=\"_context.disabled()\"\n [readonly]=\"_context.readonly()\"\n (openedChange)=\"_onOpenedChange($event)\"\n (colorChange)=\"_apply($event)\"\n >\n <svg mlvButtonIcon lucideType aria-hidden=\"true\" />\n </mlv-color-picker-popup>\n `,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mlv-editor-text-color',\n '[hidden]': '!_supported()',\n },\n})\nexport class MlvEditorTextColor extends MlvEditorColorControl {\n /** @private Optional localized editor labels. */\n private readonly _i18n = inject(MLV_EDITOR_I18N, { optional: true });\n\n /** @protected Localized accessible trigger and dialog label. */\n protected readonly _label = computed(\n () => this._i18n?.().textColor ?? 'Text color',\n );\n\n /** @protected Exact command-presence capability without command execution. */\n protected readonly _supported = computed(() => {\n this._revision?.();\n const commands = this._context.editor()?.commands as\n | Record<string, unknown>\n | undefined;\n return (\n typeof commands?.['setColor'] === 'function' &&\n typeof commands['unsetColor'] === 'function'\n );\n });\n\n /** @protected Active foreground colour rendered by the swatch. */\n protected readonly _activeColor = computed(() => {\n this._revision?.();\n const color = this._context.editor()?.getAttributes('textStyle')['color'];\n return typeof color === 'string' && color ? color : '#000000';\n });\n\n /** @protected Applies or clears foreground colour without focusing Tiptap. */\n protected override _run(\n editor: Editor,\n selection: { readonly from: number; readonly to: number },\n color: string,\n ): boolean {\n const chain = editor.chain().setTextSelection(selection);\n return color ? chain.setColor(color).run() : chain.unsetColor().run();\n }\n}\n"]}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { Directive, DestroyRef, ElementRef, computed, inject, } from '@angular/core';
|
|
2
|
-
import { MLV_EDITOR_TOOLBAR_ROVING } from '../editor-toolbar-context';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
/** Marks a projected or built-in editor control as one editor-toolbar roving widget. */
|
|
5
|
-
export class MlvEditorToolbarWidget {
|
|
6
|
-
/** @internal Native widget registered with the enclosing toolbar. */
|
|
7
|
-
_element = inject(ElementRef).nativeElement;
|
|
8
|
-
/** @internal Editor-scoped roving-focus coordinator. */
|
|
9
|
-
_registry = inject(MLV_EDITOR_TOOLBAR_ROVING);
|
|
10
|
-
/** @internal Widget lifecycle for deregistration. */
|
|
11
|
-
_destroyRef = inject(DestroyRef);
|
|
12
|
-
/** @internal Derived tab stop for roving keyboard navigation. */
|
|
13
|
-
_tabIndex = computed(() => this._registry.isActive(this._element) ? 0 : -1, /* @ts-ignore */
|
|
14
|
-
...(ngDevMode ? [{ debugName: "_tabIndex" }] : /* istanbul ignore next */ []));
|
|
15
|
-
constructor() {
|
|
16
|
-
const unregister = this._registry.register(this._element);
|
|
17
|
-
this._destroyRef.onDestroy(unregister);
|
|
18
|
-
}
|
|
19
|
-
/** @internal Promotes this widget when it receives focus. */
|
|
20
|
-
_activate() {
|
|
21
|
-
this._registry.activate(this._element);
|
|
22
|
-
}
|
|
23
|
-
/** @internal Promotes this widget before pointer activation. */
|
|
24
|
-
_activateOnPointerDown() {
|
|
25
|
-
this._registry.activate(this._element);
|
|
26
|
-
}
|
|
27
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvEditorToolbarWidget, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
28
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: MlvEditorToolbarWidget, isStandalone: true, selector: "[mlvEditorToolbarWidget]", host: { listeners: { "focus": "_activate()", "pointerdown": "_activateOnPointerDown()" }, properties: { "attr.tabindex": "_tabIndex()" } }, ngImport: i0 });
|
|
29
|
-
}
|
|
30
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvEditorToolbarWidget, decorators: [{
|
|
31
|
-
type: Directive,
|
|
32
|
-
args: [{
|
|
33
|
-
selector: '[mlvEditorToolbarWidget]',
|
|
34
|
-
host: {
|
|
35
|
-
'[attr.tabindex]': '_tabIndex()',
|
|
36
|
-
'(focus)': '_activate()',
|
|
37
|
-
'(pointerdown)': '_activateOnPointerDown()',
|
|
38
|
-
},
|
|
39
|
-
}]
|
|
40
|
-
}], ctorParameters: () => [] });
|
|
41
|
-
//# sourceMappingURL=editor-toolbar-widget.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"editor-toolbar-widget.js","sourceRoot":"","sources":["../../../../../../libs/editor/src/lib/toolbar/editor-toolbar-widget.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,UAAU,EACV,UAAU,EACV,QAAQ,EACR,MAAM,GACP,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;;AAEtE,wFAAwF;AASxF,MAAM,OAAO,sBAAsB;IACjC,qEAAqE;IACpD,QAAQ,GACvB,MAAM,CAA0B,UAAU,CAAC,CAAC,aAAa,CAAC;IAC5D,wDAAwD;IACvC,SAAS,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAC;IAC/D,qDAAqD;IACpC,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAClD,iEAAiE;IAC9C,SAAS,GAAG,QAAQ,CAAC,GAAG,EAAE,CAC3C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;kFAChD,CAAC;IAEF;QACE,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1D,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;IAED,6DAA6D;IACnD,SAAS;QACjB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,gEAAgE;IACtD,sBAAsB;QAC9B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;uGA1BU,sBAAsB;2FAAtB,sBAAsB;;2FAAtB,sBAAsB;kBARlC,SAAS;mBAAC;oBACT,QAAQ,EAAE,0BAA0B;oBACpC,IAAI,EAAE;wBACJ,iBAAiB,EAAE,aAAa;wBAChC,SAAS,EAAE,aAAa;wBACxB,eAAe,EAAE,0BAA0B;qBAC5C;iBACF","sourcesContent":["import {\n Directive,\n DestroyRef,\n ElementRef,\n computed,\n inject,\n} from '@angular/core';\nimport { MLV_EDITOR_TOOLBAR_ROVING } from '../editor-toolbar-context';\n\n/** Marks a projected or built-in editor control as one editor-toolbar roving widget. */\n@Directive({\n selector: '[mlvEditorToolbarWidget]',\n host: {\n '[attr.tabindex]': '_tabIndex()',\n '(focus)': '_activate()',\n '(pointerdown)': '_activateOnPointerDown()',\n },\n})\nexport class MlvEditorToolbarWidget {\n /** @internal Native widget registered with the enclosing toolbar. */\n private readonly _element =\n inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n /** @internal Editor-scoped roving-focus coordinator. */\n private readonly _registry = inject(MLV_EDITOR_TOOLBAR_ROVING);\n /** @internal Widget lifecycle for deregistration. */\n private readonly _destroyRef = inject(DestroyRef);\n /** @internal Derived tab stop for roving keyboard navigation. */\n protected readonly _tabIndex = computed(() =>\n this._registry.isActive(this._element) ? 0 : -1,\n );\n\n constructor() {\n const unregister = this._registry.register(this._element);\n this._destroyRef.onDestroy(unregister);\n }\n\n /** @internal Promotes this widget when it receives focus. */\n protected _activate(): void {\n this._registry.activate(this._element);\n }\n\n /** @internal Promotes this widget before pointer activation. */\n protected _activateOnPointerDown(): void {\n this._registry.activate(this._element);\n }\n}\n"]}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import { Directive, TemplateRef, inject } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
/** Complete replacement template for an editor's built-in toolbar. */
|
|
4
|
-
export class MlvEditorToolbarDef {
|
|
5
|
-
/** The projected template, whose implicit context is `MlvEditorToolbarContext`. */
|
|
6
|
-
templateRef = inject(TemplateRef, {
|
|
7
|
-
optional: true,
|
|
8
|
-
});
|
|
9
|
-
/** Narrows `let-context` to the editor toolbar context. */
|
|
10
|
-
static ngTemplateContextGuard(_dir, _context) {
|
|
11
|
-
return true;
|
|
12
|
-
}
|
|
13
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvEditorToolbarDef, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
14
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: MlvEditorToolbarDef, isStandalone: true, selector: "[mlvEditorToolbar]", ngImport: i0 });
|
|
15
|
-
}
|
|
16
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvEditorToolbarDef, decorators: [{
|
|
17
|
-
type: Directive,
|
|
18
|
-
args: [{
|
|
19
|
-
selector: '[mlvEditorToolbar]',
|
|
20
|
-
}]
|
|
21
|
-
}] });
|
|
22
|
-
/** Template rendered before the built-in toolbar groups. */
|
|
23
|
-
export class MlvEditorToolbarStartDef {
|
|
24
|
-
/** The projected template, whose implicit context is `MlvEditorToolbarContext`. */
|
|
25
|
-
templateRef = inject(TemplateRef, {
|
|
26
|
-
optional: true,
|
|
27
|
-
});
|
|
28
|
-
/** Narrows `let-context` to the editor toolbar context. */
|
|
29
|
-
static ngTemplateContextGuard(_dir, _context) {
|
|
30
|
-
return true;
|
|
31
|
-
}
|
|
32
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvEditorToolbarStartDef, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
33
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: MlvEditorToolbarStartDef, isStandalone: true, selector: "[mlvEditorToolbarStart]", ngImport: i0 });
|
|
34
|
-
}
|
|
35
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvEditorToolbarStartDef, decorators: [{
|
|
36
|
-
type: Directive,
|
|
37
|
-
args: [{
|
|
38
|
-
selector: '[mlvEditorToolbarStart]',
|
|
39
|
-
}]
|
|
40
|
-
}] });
|
|
41
|
-
/** Template rendered after the built-in toolbar groups. */
|
|
42
|
-
export class MlvEditorToolbarEndDef {
|
|
43
|
-
/** The projected template, whose implicit context is `MlvEditorToolbarContext`. */
|
|
44
|
-
templateRef = inject(TemplateRef, {
|
|
45
|
-
optional: true,
|
|
46
|
-
});
|
|
47
|
-
/** Narrows `let-context` to the editor toolbar context. */
|
|
48
|
-
static ngTemplateContextGuard(_dir, _context) {
|
|
49
|
-
return true;
|
|
50
|
-
}
|
|
51
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvEditorToolbarEndDef, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
52
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: MlvEditorToolbarEndDef, isStandalone: true, selector: "[mlvEditorToolbarEnd]", ngImport: i0 });
|
|
53
|
-
}
|
|
54
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvEditorToolbarEndDef, decorators: [{
|
|
55
|
-
type: Directive,
|
|
56
|
-
args: [{
|
|
57
|
-
selector: '[mlvEditorToolbarEnd]',
|
|
58
|
-
}]
|
|
59
|
-
}] });
|
|
60
|
-
//# sourceMappingURL=editor-toolbar.defs.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"editor-toolbar.defs.js","sourceRoot":"","sources":["../../../../../../libs/editor/src/lib/toolbar/editor-toolbar.defs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;;AAQ/D,sEAAsE;AAItE,MAAM,OAAO,mBAAmB;IAC9B,mFAAmF;IAC1E,WAAW,GAAG,MAAM,CAC3B,WAAW,EACX;QACE,QAAQ,EAAE,IAAI;KACf,CACF,CAAC;IAEF,2DAA2D;IAC3D,MAAM,CAAC,sBAAsB,CAC3B,IAAyB,EACzB,QAAiB;QAEjB,OAAO,IAAI,CAAC;IACd,CAAC;uGAfU,mBAAmB;2FAAnB,mBAAmB;;2FAAnB,mBAAmB;kBAH/B,SAAS;mBAAC;oBACT,QAAQ,EAAE,oBAAoB;iBAC/B;;AAmBD,4DAA4D;AAI5D,MAAM,OAAO,wBAAwB;IACnC,mFAAmF;IAC1E,WAAW,GAAG,MAAM,CAC3B,WAAW,EACX;QACE,QAAQ,EAAE,IAAI;KACf,CACF,CAAC;IAEF,2DAA2D;IAC3D,MAAM,CAAC,sBAAsB,CAC3B,IAA8B,EAC9B,QAAiB;QAEjB,OAAO,IAAI,CAAC;IACd,CAAC;uGAfU,wBAAwB;2FAAxB,wBAAwB;;2FAAxB,wBAAwB;kBAHpC,SAAS;mBAAC;oBACT,QAAQ,EAAE,yBAAyB;iBACpC;;AAmBD,2DAA2D;AAI3D,MAAM,OAAO,sBAAsB;IACjC,mFAAmF;IAC1E,WAAW,GAAG,MAAM,CAC3B,WAAW,EACX;QACE,QAAQ,EAAE,IAAI;KACf,CACF,CAAC;IAEF,2DAA2D;IAC3D,MAAM,CAAC,sBAAsB,CAC3B,IAA4B,EAC5B,QAAiB;QAEjB,OAAO,IAAI,CAAC;IACd,CAAC;uGAfU,sBAAsB;2FAAtB,sBAAsB;;2FAAtB,sBAAsB;kBAHlC,SAAS;mBAAC;oBACT,QAAQ,EAAE,uBAAuB;iBAClC","sourcesContent":["import { Directive, TemplateRef, inject } from '@angular/core';\nimport type { MlvEditorToolbarContext } from '../editor-toolbar-context';\n\n/** @internal Template context supplied to replaceable toolbar definitions. */\ninterface MlvEditorToolbarTemplateContext {\n readonly $implicit: MlvEditorToolbarContext;\n}\n\n/** Complete replacement template for an editor's built-in toolbar. */\n@Directive({\n selector: '[mlvEditorToolbar]',\n})\nexport class MlvEditorToolbarDef {\n /** The projected template, whose implicit context is `MlvEditorToolbarContext`. */\n readonly templateRef = inject<TemplateRef<MlvEditorToolbarTemplateContext>>(\n TemplateRef,\n {\n optional: true,\n },\n );\n\n /** Narrows `let-context` to the editor toolbar context. */\n static ngTemplateContextGuard(\n _dir: MlvEditorToolbarDef,\n _context: unknown,\n ): _context is MlvEditorToolbarTemplateContext {\n return true;\n }\n}\n\n/** Template rendered before the built-in toolbar groups. */\n@Directive({\n selector: '[mlvEditorToolbarStart]',\n})\nexport class MlvEditorToolbarStartDef {\n /** The projected template, whose implicit context is `MlvEditorToolbarContext`. */\n readonly templateRef = inject<TemplateRef<MlvEditorToolbarTemplateContext>>(\n TemplateRef,\n {\n optional: true,\n },\n );\n\n /** Narrows `let-context` to the editor toolbar context. */\n static ngTemplateContextGuard(\n _dir: MlvEditorToolbarStartDef,\n _context: unknown,\n ): _context is MlvEditorToolbarTemplateContext {\n return true;\n }\n}\n\n/** Template rendered after the built-in toolbar groups. */\n@Directive({\n selector: '[mlvEditorToolbarEnd]',\n})\nexport class MlvEditorToolbarEndDef {\n /** The projected template, whose implicit context is `MlvEditorToolbarContext`. */\n readonly templateRef = inject<TemplateRef<MlvEditorToolbarTemplateContext>>(\n TemplateRef,\n {\n optional: true,\n },\n );\n\n /** Narrows `let-context` to the editor toolbar context. */\n static ngTemplateContextGuard(\n _dir: MlvEditorToolbarEndDef,\n _context: unknown,\n ): _context is MlvEditorToolbarTemplateContext {\n return true;\n }\n}\n"]}
|