@flogeez/angular-tiptap-editor 3.1.3 → 3.1.5
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/CHANGELOG.md +24 -0
- package/README.md +2 -2
- package/esm2022/flogeez-angular-tiptap-editor.mjs +5 -0
- package/esm2022/lib/ate-editor.provider.mjs +38 -0
- package/esm2022/lib/components/bubble-menus/base/ate-base-bubble-menu.mjs +207 -0
- package/esm2022/lib/components/bubble-menus/base/ate-base-sub-bubble-menu.mjs +137 -0
- package/esm2022/lib/components/bubble-menus/color/ate-color-bubble-menu.component.mjs +365 -0
- package/esm2022/lib/components/bubble-menus/image/ate-image-bubble-menu.component.mjs +309 -0
- package/esm2022/lib/components/bubble-menus/link/ate-link-bubble-menu.component.mjs +247 -0
- package/esm2022/lib/components/bubble-menus/table/ate-cell-bubble-menu.component.mjs +126 -0
- package/esm2022/lib/components/bubble-menus/table/ate-table-bubble-menu.component.mjs +271 -0
- package/esm2022/lib/components/bubble-menus/text/ate-bubble-menu.component.mjs +272 -0
- package/esm2022/lib/components/color-picker/ate-color-picker.component.mjs +123 -0
- package/esm2022/lib/components/edit-toggle/ate-edit-toggle.component.mjs +42 -0
- package/esm2022/lib/components/editor/angular-tiptap-editor.component.mjs +1032 -0
- package/esm2022/lib/components/editor/ate-block-controls.component.mjs +256 -0
- package/esm2022/lib/components/slash-commands/ate-slash-commands.component.mjs +328 -0
- package/esm2022/lib/components/toolbar/ate-toolbar.component.mjs +531 -0
- package/esm2022/lib/components/ui/ate-button.component.mjs +91 -0
- package/esm2022/lib/components/ui/ate-separator.component.mjs +11 -0
- package/esm2022/lib/config/ate-editor.config.mjs +133 -0
- package/esm2022/lib/config/ate-global-config.token.mjs +6 -0
- package/esm2022/lib/config/ate-slash-commands.config.mjs +130 -0
- package/esm2022/lib/directives/ate-noop-value-accessor.directive.mjs +40 -0
- package/esm2022/lib/directives/ate-tooltip.directive.mjs +138 -0
- package/esm2022/lib/extensions/ate-block-controls.extension.mjs +156 -0
- package/esm2022/lib/extensions/ate-link-click-behavior.extension.mjs +32 -0
- package/esm2022/lib/extensions/ate-resizable-image.extension.mjs +277 -0
- package/esm2022/lib/extensions/ate-table.extension.mjs +27 -0
- package/esm2022/lib/extensions/ate-tiptap-state.extension.mjs +85 -0
- package/esm2022/lib/extensions/ate-upload-progress.extension.mjs +195 -0
- package/esm2022/lib/extensions/calculators/ate-discovery.calculator.mjs +62 -0
- package/esm2022/lib/extensions/calculators/ate-image.calculator.mjs +8 -0
- package/esm2022/lib/extensions/calculators/ate-marks.calculator.mjs +75 -0
- package/esm2022/lib/extensions/calculators/ate-selection.calculator.mjs +35 -0
- package/esm2022/lib/extensions/calculators/ate-structure.calculator.mjs +34 -0
- package/esm2022/lib/extensions/calculators/ate-table.calculator.mjs +38 -0
- package/esm2022/lib/models/ate-bubble-menu.model.mjs +53 -0
- package/esm2022/lib/models/ate-editor-config.model.mjs +2 -0
- package/esm2022/lib/models/ate-editor-state.model.mjs +90 -0
- package/esm2022/lib/models/ate-image.model.mjs +2 -0
- package/esm2022/lib/models/ate-slash-command.model.mjs +2 -0
- package/esm2022/lib/models/ate-toolbar.model.mjs +35 -0
- package/esm2022/lib/node-view/ate-angular-node-view.mjs +97 -0
- package/esm2022/lib/node-view/ate-injector.registry.mjs +16 -0
- package/esm2022/lib/node-view/ate-node-view.factory.mjs +125 -0
- package/esm2022/lib/node-view/ate-node-view.models.mjs +2 -0
- package/esm2022/lib/node-view/ate-node-view.renderer.mjs +154 -0
- package/esm2022/lib/node-view/ate-register-angular-component.mjs +49 -0
- package/esm2022/lib/services/ate-color-picker.service.mjs +194 -0
- package/esm2022/lib/services/ate-editor-commands.service.mjs +507 -0
- package/esm2022/lib/services/ate-export.service.mjs +71 -0
- package/esm2022/lib/services/ate-i18n.service.mjs +449 -0
- package/esm2022/lib/services/ate-image.service.mjs +459 -0
- package/esm2022/lib/services/ate-link.service.mjs +99 -0
- package/esm2022/lib/utils/ate-color.utils.mjs +60 -0
- package/esm2022/lib/utils/ate-markdown.utils.mjs +179 -0
- package/esm2022/public-api.mjs +41 -0
- package/fesm2022/flogeez-angular-tiptap-editor.mjs +627 -354
- package/fesm2022/flogeez-angular-tiptap-editor.mjs.map +1 -1
- package/index.d.ts +3 -1734
- package/lib/ate-editor.provider.d.ts +21 -0
- package/lib/components/bubble-menus/base/ate-base-bubble-menu.d.ts +71 -0
- package/lib/components/bubble-menus/base/ate-base-sub-bubble-menu.d.ts +60 -0
- package/lib/components/bubble-menus/color/ate-color-bubble-menu.component.d.ts +77 -0
- package/lib/components/bubble-menus/image/ate-image-bubble-menu.component.d.ts +49 -0
- package/lib/components/bubble-menus/link/ate-link-bubble-menu.component.d.ts +55 -0
- package/lib/components/bubble-menus/table/ate-cell-bubble-menu.component.d.ts +16 -0
- package/lib/components/bubble-menus/table/ate-table-bubble-menu.component.d.ts +25 -0
- package/lib/components/bubble-menus/text/ate-bubble-menu.component.d.ts +53 -0
- package/lib/components/color-picker/ate-color-picker.component.d.ts +54 -0
- package/lib/components/edit-toggle/ate-edit-toggle.component.d.ts +13 -0
- package/lib/components/editor/angular-tiptap-editor.component.d.ts +242 -0
- package/lib/components/editor/ate-block-controls.component.d.ts +44 -0
- package/lib/components/slash-commands/ate-slash-commands.component.d.ts +34 -0
- package/lib/components/toolbar/ate-toolbar.component.d.ts +47 -0
- package/lib/components/ui/ate-button.component.d.ts +25 -0
- package/lib/components/ui/ate-separator.component.d.ts +5 -0
- package/lib/config/ate-editor.config.d.ts +19 -0
- package/lib/config/ate-global-config.token.d.ts +6 -0
- package/lib/config/ate-slash-commands.config.d.ts +41 -0
- package/lib/directives/ate-noop-value-accessor.directive.d.ts +13 -0
- package/lib/directives/ate-tooltip.directive.d.ts +30 -0
- package/lib/extensions/ate-block-controls.extension.d.ts +10 -0
- package/lib/extensions/ate-link-click-behavior.extension.d.ts +2 -0
- package/lib/extensions/ate-resizable-image.extension.d.ts +27 -0
- package/lib/extensions/ate-table.extension.d.ts +2 -0
- package/lib/extensions/ate-tiptap-state.extension.d.ts +7 -0
- package/lib/extensions/ate-upload-progress.extension.d.ts +7 -0
- package/lib/extensions/calculators/ate-discovery.calculator.d.ts +7 -0
- package/lib/extensions/calculators/ate-image.calculator.d.ts +2 -0
- package/lib/extensions/calculators/ate-marks.calculator.d.ts +2 -0
- package/lib/extensions/calculators/ate-selection.calculator.d.ts +2 -0
- package/lib/extensions/calculators/ate-structure.calculator.d.ts +2 -0
- package/lib/extensions/calculators/ate-table.calculator.d.ts +2 -0
- package/lib/models/ate-bubble-menu.model.d.ts +33 -0
- package/lib/models/ate-editor-config.model.d.ts +113 -0
- package/lib/models/ate-editor-state.model.d.ts +109 -0
- package/lib/models/ate-image.model.d.ts +104 -0
- package/lib/models/ate-slash-command.model.d.ts +17 -0
- package/lib/models/ate-toolbar.model.d.ts +18 -0
- package/lib/node-view/ate-angular-node-view.d.ts +115 -0
- package/lib/node-view/ate-injector.registry.d.ts +3 -0
- package/lib/node-view/ate-node-view.factory.d.ts +10 -0
- package/lib/node-view/ate-node-view.models.d.ts +138 -0
- package/lib/node-view/ate-node-view.renderer.d.ts +23 -0
- package/lib/node-view/ate-register-angular-component.d.ts +35 -0
- package/lib/services/ate-color-picker.service.d.ts +65 -0
- package/lib/services/ate-editor-commands.service.d.ts +89 -0
- package/lib/services/ate-export.service.d.ts +27 -0
- package/lib/services/ate-i18n.service.d.ts +432 -0
- package/lib/services/ate-image.service.d.ts +82 -0
- package/lib/services/ate-link.service.d.ts +42 -0
- package/lib/utils/ate-color.utils.d.ts +12 -0
- package/lib/utils/ate-markdown.utils.d.ts +4 -0
- package/package.json +3 -1
- package/public-api.d.ts +32 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { inject, ElementRef, input, computed, effect, Directive, output,
|
|
2
|
+
import { inject, ElementRef, input, computed, effect, Directive, output, Component, ChangeDetectionStrategy, signal, Injectable, viewChild, ApplicationRef, EnvironmentInjector, createComponent, InjectionToken, DestroyRef, Injector, untracked, makeEnvironmentProviders, APP_INITIALIZER } from '@angular/core';
|
|
3
3
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
|
-
import { Node as Node$1,
|
|
4
|
+
import { Node as Node$1, mergeAttributes, nodeInputRule, Extension, getAttributes, Editor } from '@tiptap/core';
|
|
5
5
|
import StarterKit from '@tiptap/starter-kit';
|
|
6
6
|
import { Placeholder, CharacterCount } from '@tiptap/extensions';
|
|
7
7
|
import { Superscript } from '@tiptap/extension-superscript';
|
|
@@ -693,10 +693,10 @@ class AteTooltipDirective {
|
|
|
693
693
|
this.el = inject(ElementRef);
|
|
694
694
|
this.tippyInstance = null;
|
|
695
695
|
// Signal Inputs
|
|
696
|
-
this.content = input(null,
|
|
697
|
-
this.placement = input("top",
|
|
698
|
-
this.delay = input([200, 50],
|
|
699
|
-
this.disabled = input(false,
|
|
696
|
+
this.content = input(null, { alias: "ateTooltip" });
|
|
697
|
+
this.placement = input("top", { alias: "ateTooltipPlacement" });
|
|
698
|
+
this.delay = input([200, 50], { alias: "ateTooltipDelay" });
|
|
699
|
+
this.disabled = input(false, { alias: "ateTooltipDisabled" });
|
|
700
700
|
/**
|
|
701
701
|
* Computed logic for ARIA shortcuts.
|
|
702
702
|
*/
|
|
@@ -706,7 +706,7 @@ class AteTooltipDirective {
|
|
|
706
706
|
return null;
|
|
707
707
|
}
|
|
708
708
|
return text.split("\n")[1].replace(/\+/g, " ");
|
|
709
|
-
}
|
|
709
|
+
});
|
|
710
710
|
/**
|
|
711
711
|
* Computed logic for Tippy content.
|
|
712
712
|
* Includes strict escaping of dynamic content to prevent XSS.
|
|
@@ -734,7 +734,7 @@ class AteTooltipDirective {
|
|
|
734
734
|
}
|
|
735
735
|
// No newline? Keep it as plain text (Tippy handles string as text by default)
|
|
736
736
|
return { content: text, isHTML: false };
|
|
737
|
-
}
|
|
737
|
+
});
|
|
738
738
|
effect(() => {
|
|
739
739
|
const { content, isHTML } = this.processedTooltip();
|
|
740
740
|
const placement = this.placement();
|
|
@@ -807,10 +807,10 @@ class AteTooltipDirective {
|
|
|
807
807
|
this.tippyInstance = null;
|
|
808
808
|
}
|
|
809
809
|
}
|
|
810
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
811
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "
|
|
810
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteTooltipDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
811
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.14", type: AteTooltipDirective, isStandalone: true, selector: "[ateTooltip]", inputs: { content: { classPropertyName: "content", publicName: "ateTooltip", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "ateTooltipPlacement", isSignal: true, isRequired: false, transformFunction: null }, delay: { classPropertyName: "delay", publicName: "ateTooltipDelay", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "ateTooltipDisabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.aria-keyshortcuts": "ariaShortcut()" } }, ngImport: i0 }); }
|
|
812
812
|
}
|
|
813
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
813
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteTooltipDirective, decorators: [{
|
|
814
814
|
type: Directive,
|
|
815
815
|
args: [{
|
|
816
816
|
selector: "[ateTooltip]",
|
|
@@ -819,28 +819,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
|
|
|
819
819
|
"[attr.aria-keyshortcuts]": "ariaShortcut()",
|
|
820
820
|
},
|
|
821
821
|
}]
|
|
822
|
-
}], ctorParameters: () => []
|
|
822
|
+
}], ctorParameters: () => [] });
|
|
823
823
|
|
|
824
824
|
class AteButtonComponent {
|
|
825
825
|
constructor() {
|
|
826
826
|
// Inputs
|
|
827
|
-
this.icon = input(""
|
|
828
|
-
this.title = input.required(
|
|
829
|
-
this.active = input(false
|
|
830
|
-
this.disabled = input(false
|
|
831
|
-
this.color = input(
|
|
832
|
-
this.backgroundColor = input(
|
|
833
|
-
this.variant = input("default"
|
|
834
|
-
this.size = input("medium"
|
|
835
|
-
this.iconSize = input("medium"
|
|
827
|
+
this.icon = input("");
|
|
828
|
+
this.title = input.required();
|
|
829
|
+
this.active = input(false);
|
|
830
|
+
this.disabled = input(false);
|
|
831
|
+
this.color = input();
|
|
832
|
+
this.backgroundColor = input();
|
|
833
|
+
this.variant = input("default");
|
|
834
|
+
this.size = input("medium");
|
|
835
|
+
this.iconSize = input("medium");
|
|
836
836
|
// Outputs
|
|
837
837
|
this.buttonClick = output();
|
|
838
838
|
}
|
|
839
839
|
onMouseDown(event) {
|
|
840
840
|
event.preventDefault();
|
|
841
841
|
}
|
|
842
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
843
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
842
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
843
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AteButtonComponent, isStandalone: true, selector: "ate-button", inputs: { icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, backgroundColor: { classPropertyName: "backgroundColor", publicName: "backgroundColor", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, iconSize: { classPropertyName: "iconSize", publicName: "iconSize", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { buttonClick: "buttonClick" }, ngImport: i0, template: `
|
|
844
844
|
<button
|
|
845
845
|
class="ate-button"
|
|
846
846
|
[class.is-active]="active()"
|
|
@@ -873,7 +873,7 @@ class AteButtonComponent {
|
|
|
873
873
|
</button>
|
|
874
874
|
`, isInline: true, styles: [".ate-button{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:transparent;border-radius:var(--ate-sub-border-radius, 8px);cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);color:var(--ate-toolbar-button-color, var(--ate-text-secondary));position:relative;overflow:hidden}.ate-button:before{content:\"\";position:absolute;inset:0;background:var(--ate-primary);opacity:0;transition:opacity .2s ease;border-radius:var(--ate-sub-border-radius, 8px)}.ate-button:hover:not(.has-custom-color){color:var(--ate-toolbar-button-active-color, var(--ate-primary));background:var(--ate-toolbar-button-hover-background, transparent);transform:translateY(-1px)}.ate-button.has-custom-color:hover:not(.has-custom-bg){background:var(--ate-toolbar-button-hover-background, transparent);transform:translateY(-1px)}.ate-button.has-custom-bg:hover{transform:translateY(-1px);filter:brightness(.9)}.ate-button:hover:before{opacity:.1}.ate-button:active{transform:translateY(0)}.ate-button.is-active:not(.has-custom-color){color:var(--ate-toolbar-button-active-color, var(--ate-primary));background:var(--ate-toolbar-button-active-background, var(--ate-primary-light))}.ate-button.is-active.has-custom-color{background:var(--ate-toolbar-button-active-background, var(--ate-primary-light))}.ate-button:disabled{opacity:.4;cursor:not-allowed;pointer-events:none}.ate-button .material-symbols-outlined{font-size:20px;position:relative;z-index:1}.ate-button .material-symbols-outlined.icon-small{font-size:16px}.ate-button .material-symbols-outlined.icon-medium{font-size:20px}.ate-button .material-symbols-outlined.icon-large{font-size:24px}.ate-button.text-button{width:auto;padding:0 12px;font-size:14px;font-weight:500;gap:8px}.ate-button.color-button{width:28px;height:28px;border-radius:50%;border:2px solid transparent;transition:all .2s ease}.ate-button.color-button:hover{border-color:var(--ate-border);transform:scale(1.1)}.ate-button.color-button.is-active{border-color:var(--ate-primary);box-shadow:0 0 0 2px var(--ate-primary-light)}.ate-button.danger{color:var(--ate-error-color, #ef4444)}.ate-button.danger:hover{color:var(--ate-error-color, #ef4444);background:var(--ate-error-bg, rgba(239, 68, 68, .1))}.ate-button.danger:before{background:var(--ate-error-color, #ef4444)}.ate-button.small{width:24px;height:24px}.ate-button.medium{width:32px;height:32px}.ate-button.large{width:40px;height:40px}@keyframes pulse{0%,to{box-shadow:0 0 0 0 var(--ate-primary-light-alpha)}50%{box-shadow:0 0 0 4px transparent}}.ate-button.is-active.pulse{animation:pulse 2s infinite}@media (max-width: 768px){.ate-button{width:32px;height:32px}.ate-button .material-symbols-outlined{font-size:18px}.ate-button.text-button{padding:0 8px;font-size:13px}}\n"], dependencies: [{ kind: "directive", type: AteTooltipDirective, selector: "[ateTooltip]", inputs: ["ateTooltip", "ateTooltipPlacement", "ateTooltipDelay", "ateTooltipDisabled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
875
875
|
}
|
|
876
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
876
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteButtonComponent, decorators: [{
|
|
877
877
|
type: Component,
|
|
878
878
|
args: [{ selector: "ate-button", standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [AteTooltipDirective], template: `
|
|
879
879
|
<button
|
|
@@ -907,13 +907,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
|
|
|
907
907
|
<ng-content></ng-content>
|
|
908
908
|
</button>
|
|
909
909
|
`, styles: [".ate-button{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:transparent;border-radius:var(--ate-sub-border-radius, 8px);cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);color:var(--ate-toolbar-button-color, var(--ate-text-secondary));position:relative;overflow:hidden}.ate-button:before{content:\"\";position:absolute;inset:0;background:var(--ate-primary);opacity:0;transition:opacity .2s ease;border-radius:var(--ate-sub-border-radius, 8px)}.ate-button:hover:not(.has-custom-color){color:var(--ate-toolbar-button-active-color, var(--ate-primary));background:var(--ate-toolbar-button-hover-background, transparent);transform:translateY(-1px)}.ate-button.has-custom-color:hover:not(.has-custom-bg){background:var(--ate-toolbar-button-hover-background, transparent);transform:translateY(-1px)}.ate-button.has-custom-bg:hover{transform:translateY(-1px);filter:brightness(.9)}.ate-button:hover:before{opacity:.1}.ate-button:active{transform:translateY(0)}.ate-button.is-active:not(.has-custom-color){color:var(--ate-toolbar-button-active-color, var(--ate-primary));background:var(--ate-toolbar-button-active-background, var(--ate-primary-light))}.ate-button.is-active.has-custom-color{background:var(--ate-toolbar-button-active-background, var(--ate-primary-light))}.ate-button:disabled{opacity:.4;cursor:not-allowed;pointer-events:none}.ate-button .material-symbols-outlined{font-size:20px;position:relative;z-index:1}.ate-button .material-symbols-outlined.icon-small{font-size:16px}.ate-button .material-symbols-outlined.icon-medium{font-size:20px}.ate-button .material-symbols-outlined.icon-large{font-size:24px}.ate-button.text-button{width:auto;padding:0 12px;font-size:14px;font-weight:500;gap:8px}.ate-button.color-button{width:28px;height:28px;border-radius:50%;border:2px solid transparent;transition:all .2s ease}.ate-button.color-button:hover{border-color:var(--ate-border);transform:scale(1.1)}.ate-button.color-button.is-active{border-color:var(--ate-primary);box-shadow:0 0 0 2px var(--ate-primary-light)}.ate-button.danger{color:var(--ate-error-color, #ef4444)}.ate-button.danger:hover{color:var(--ate-error-color, #ef4444);background:var(--ate-error-bg, rgba(239, 68, 68, .1))}.ate-button.danger:before{background:var(--ate-error-color, #ef4444)}.ate-button.small{width:24px;height:24px}.ate-button.medium{width:32px;height:32px}.ate-button.large{width:40px;height:40px}@keyframes pulse{0%,to{box-shadow:0 0 0 0 var(--ate-primary-light-alpha)}50%{box-shadow:0 0 0 4px transparent}}.ate-button.is-active.pulse{animation:pulse 2s infinite}@media (max-width: 768px){.ate-button{width:32px;height:32px}.ate-button .material-symbols-outlined{font-size:18px}.ate-button.text-button{padding:0 8px;font-size:13px}}\n"] }]
|
|
910
|
-
}]
|
|
910
|
+
}] });
|
|
911
911
|
|
|
912
912
|
class AteSeparatorComponent {
|
|
913
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
914
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
|
|
913
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteSeparatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
914
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AteSeparatorComponent, isStandalone: true, selector: "ate-separator", ngImport: i0, template: `<div class="ate-separator"></div>`, isInline: true, styles: [".ate-separator{width:1px;height:24px;background-color:var(--ate-border, #e2e8f0);margin:0 var(--ate-menu-gap, 2px);flex-shrink:0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
915
915
|
}
|
|
916
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
916
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteSeparatorComponent, decorators: [{
|
|
917
917
|
type: Component,
|
|
918
918
|
args: [{ selector: "ate-separator", standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `<div class="ate-separator"></div>`, styles: [".ate-separator{width:1px;height:24px;background-color:var(--ate-border, #e2e8f0);margin:0 var(--ate-menu-gap, 2px);flex-shrink:0}\n"] }]
|
|
919
919
|
}] });
|
|
@@ -1090,6 +1090,19 @@ const ENGLISH_TRANSLATIONS = {
|
|
|
1090
1090
|
error: "Error",
|
|
1091
1091
|
success: "Success",
|
|
1092
1092
|
},
|
|
1093
|
+
export: {
|
|
1094
|
+
export: "Export",
|
|
1095
|
+
html: "HTML",
|
|
1096
|
+
markdown: "Markdown",
|
|
1097
|
+
text: "Plain Text",
|
|
1098
|
+
copyHtml: "Copy as HTML",
|
|
1099
|
+
copyMarkdown: "Copy as Markdown",
|
|
1100
|
+
copyText: "Copy as plain text",
|
|
1101
|
+
downloadHtml: "Download .html",
|
|
1102
|
+
downloadMarkdown: "Download .md",
|
|
1103
|
+
downloadText: "Download .txt",
|
|
1104
|
+
copiedSuccess: "Copied to clipboard!",
|
|
1105
|
+
},
|
|
1093
1106
|
};
|
|
1094
1107
|
const FRENCH_TRANSLATIONS = {
|
|
1095
1108
|
toolbar: {
|
|
@@ -1263,28 +1276,42 @@ const FRENCH_TRANSLATIONS = {
|
|
|
1263
1276
|
error: "Erreur",
|
|
1264
1277
|
success: "Succès",
|
|
1265
1278
|
},
|
|
1279
|
+
export: {
|
|
1280
|
+
export: "Exporter",
|
|
1281
|
+
html: "HTML",
|
|
1282
|
+
markdown: "Markdown",
|
|
1283
|
+
text: "Texte brut",
|
|
1284
|
+
copyHtml: "Copier en HTML",
|
|
1285
|
+
copyMarkdown: "Copier en Markdown",
|
|
1286
|
+
copyText: "Copier en texte brut",
|
|
1287
|
+
downloadHtml: "Télécharger .html",
|
|
1288
|
+
downloadMarkdown: "Télécharger .md",
|
|
1289
|
+
downloadText: "Télécharger .txt",
|
|
1290
|
+
copiedSuccess: "Copié dans le presse-papiers !",
|
|
1291
|
+
},
|
|
1266
1292
|
};
|
|
1267
1293
|
class AteI18nService {
|
|
1268
1294
|
constructor() {
|
|
1269
|
-
this._currentLocale = signal("en"
|
|
1295
|
+
this._currentLocale = signal("en");
|
|
1270
1296
|
this._translations = signal({
|
|
1271
1297
|
en: ENGLISH_TRANSLATIONS,
|
|
1272
1298
|
fr: FRENCH_TRANSLATIONS,
|
|
1273
|
-
}
|
|
1299
|
+
});
|
|
1274
1300
|
// Public signals
|
|
1275
1301
|
this.currentLocale = this._currentLocale.asReadonly();
|
|
1276
1302
|
/** All loaded translations (useful for dynamic key access) */
|
|
1277
1303
|
this.allTranslations = this._translations.asReadonly();
|
|
1278
|
-
this.translations = computed(() => this._translations()[this._currentLocale()]
|
|
1304
|
+
this.translations = computed(() => this._translations()[this._currentLocale()]);
|
|
1279
1305
|
// Fast translation methods
|
|
1280
|
-
this.t = computed(() => this.translations()
|
|
1281
|
-
this.toolbar = computed(() => this.translations().toolbar
|
|
1282
|
-
this.bubbleMenu = computed(() => this.translations().bubbleMenu
|
|
1283
|
-
this.slashCommands = computed(() => this.translations().slashCommands
|
|
1284
|
-
this.table = computed(() => this.translations().table
|
|
1285
|
-
this.imageUpload = computed(() => this.translations().imageUpload
|
|
1286
|
-
this.editor = computed(() => this.translations().editor
|
|
1287
|
-
this.common = computed(() => this.translations().common
|
|
1306
|
+
this.t = computed(() => this.translations());
|
|
1307
|
+
this.toolbar = computed(() => this.translations().toolbar);
|
|
1308
|
+
this.bubbleMenu = computed(() => this.translations().bubbleMenu);
|
|
1309
|
+
this.slashCommands = computed(() => this.translations().slashCommands);
|
|
1310
|
+
this.table = computed(() => this.translations().table);
|
|
1311
|
+
this.imageUpload = computed(() => this.translations().imageUpload);
|
|
1312
|
+
this.editor = computed(() => this.translations().editor);
|
|
1313
|
+
this.common = computed(() => this.translations().common);
|
|
1314
|
+
this.export = computed(() => this.translations().export);
|
|
1288
1315
|
// Automatically detect browser language
|
|
1289
1316
|
this.detectBrowserLanguage();
|
|
1290
1317
|
}
|
|
@@ -1328,10 +1355,10 @@ class AteI18nService {
|
|
|
1328
1355
|
getSlashCommand(key) {
|
|
1329
1356
|
return this.translations().slashCommands[key];
|
|
1330
1357
|
}
|
|
1331
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1332
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
1358
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteI18nService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1359
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteI18nService, providedIn: "root" }); }
|
|
1333
1360
|
}
|
|
1334
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1361
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteI18nService, decorators: [{
|
|
1335
1362
|
type: Injectable,
|
|
1336
1363
|
args: [{
|
|
1337
1364
|
providedIn: "root",
|
|
@@ -1341,16 +1368,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
|
|
|
1341
1368
|
class AteImageService {
|
|
1342
1369
|
constructor() {
|
|
1343
1370
|
/** Signals for image state */
|
|
1344
|
-
this.selectedImage = signal(null
|
|
1345
|
-
this.isImageSelected = computed(() => this.selectedImage() !== null
|
|
1371
|
+
this.selectedImage = signal(null);
|
|
1372
|
+
this.isImageSelected = computed(() => this.selectedImage() !== null);
|
|
1346
1373
|
/** Resizing state */
|
|
1347
|
-
this.isResizing = signal(false
|
|
1374
|
+
this.isResizing = signal(false);
|
|
1348
1375
|
this.i18n = inject(AteI18nService);
|
|
1349
1376
|
this.t = this.i18n.imageUpload;
|
|
1350
1377
|
/** Upload state signals */
|
|
1351
|
-
this.isUploading = signal(false
|
|
1352
|
-
this.uploadProgress = signal(0
|
|
1353
|
-
this.uploadMessage = signal(""
|
|
1378
|
+
this.isUploading = signal(false);
|
|
1379
|
+
this.uploadProgress = signal(0);
|
|
1380
|
+
this.uploadMessage = signal("");
|
|
1354
1381
|
/**
|
|
1355
1382
|
* Custom upload handler.
|
|
1356
1383
|
* If set, this handler replaces the default base64 conversion.
|
|
@@ -1786,10 +1813,10 @@ class AteImageService {
|
|
|
1786
1813
|
void this.uploadAndInsertImage(editor, imageFile, options);
|
|
1787
1814
|
return true;
|
|
1788
1815
|
}
|
|
1789
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1790
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
1816
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteImageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1817
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteImageService }); }
|
|
1791
1818
|
}
|
|
1792
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1819
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteImageService, decorators: [{
|
|
1793
1820
|
type: Injectable
|
|
1794
1821
|
}] });
|
|
1795
1822
|
|
|
@@ -1860,11 +1887,11 @@ class AteColorPickerService {
|
|
|
1860
1887
|
// State Signals (owned by this service)
|
|
1861
1888
|
// ============================================
|
|
1862
1889
|
/** Current edit mode: null when closed, 'text' or 'highlight' when open */
|
|
1863
|
-
this.editMode = signal(null
|
|
1890
|
+
this.editMode = signal(null);
|
|
1864
1891
|
/** Reference to the element that triggered the menu (for anchoring) */
|
|
1865
|
-
this.menuTrigger = signal(null
|
|
1892
|
+
this.menuTrigger = signal(null);
|
|
1866
1893
|
/** Whether the user is currently interacting with the picker UI (e.g. typing) */
|
|
1867
|
-
this.isInteracting = signal(false
|
|
1894
|
+
this.isInteracting = signal(false);
|
|
1868
1895
|
}
|
|
1869
1896
|
// ============================================
|
|
1870
1897
|
// Menu Lifecycle Methods
|
|
@@ -2037,10 +2064,10 @@ class AteColorPickerService {
|
|
|
2037
2064
|
getContrastColor(color) {
|
|
2038
2065
|
return getContrastColor(color);
|
|
2039
2066
|
}
|
|
2040
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
2041
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
2067
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteColorPickerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
2068
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteColorPickerService }); }
|
|
2042
2069
|
}
|
|
2043
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
2070
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteColorPickerService, decorators: [{
|
|
2044
2071
|
type: Injectable
|
|
2045
2072
|
}] });
|
|
2046
2073
|
|
|
@@ -2050,11 +2077,11 @@ class AteLinkService {
|
|
|
2050
2077
|
// State Signals (owned by this service)
|
|
2051
2078
|
// ============================================
|
|
2052
2079
|
/** Whether link edit mode is active */
|
|
2053
|
-
this.editMode = signal(false
|
|
2080
|
+
this.editMode = signal(false);
|
|
2054
2081
|
/** Reference to the element that triggered the menu (for anchoring) */
|
|
2055
|
-
this.menuTrigger = signal(null
|
|
2082
|
+
this.menuTrigger = signal(null);
|
|
2056
2083
|
/** Whether the user is currently interacting with the link UI (input focus) */
|
|
2057
|
-
this.isInteracting = signal(false
|
|
2084
|
+
this.isInteracting = signal(false);
|
|
2058
2085
|
}
|
|
2059
2086
|
// ============================================
|
|
2060
2087
|
// Menu Lifecycle Methods
|
|
@@ -2134,10 +2161,257 @@ class AteLinkService {
|
|
|
2134
2161
|
editor.chain().focus().extendMarkRange("link").unsetLink().run();
|
|
2135
2162
|
this.close();
|
|
2136
2163
|
}
|
|
2137
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
2138
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
2164
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteLinkService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
2165
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteLinkService }); }
|
|
2139
2166
|
}
|
|
2140
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
2167
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteLinkService, decorators: [{
|
|
2168
|
+
type: Injectable
|
|
2169
|
+
}] });
|
|
2170
|
+
|
|
2171
|
+
/**
|
|
2172
|
+
* HTML to Markdown converter utility (no external dependencies).
|
|
2173
|
+
*/
|
|
2174
|
+
function htmlToMarkdown(html) {
|
|
2175
|
+
const parser = new DOMParser();
|
|
2176
|
+
const doc = parser.parseFromString(html, "text/html");
|
|
2177
|
+
const result = convertNode(doc.body, { listDepth: 0, listType: null });
|
|
2178
|
+
// Normalize multiple blank lines to max two
|
|
2179
|
+
return result.replace(/\n{3,}/g, "\n\n").trim();
|
|
2180
|
+
}
|
|
2181
|
+
function convertNode(node, ctx) {
|
|
2182
|
+
if (node.nodeType === Node.TEXT_NODE) {
|
|
2183
|
+
return node.textContent || "";
|
|
2184
|
+
}
|
|
2185
|
+
if (node.nodeType !== Node.ELEMENT_NODE) {
|
|
2186
|
+
return "";
|
|
2187
|
+
}
|
|
2188
|
+
const el = node;
|
|
2189
|
+
const tag = el.tagName.toLowerCase();
|
|
2190
|
+
const children = Array.from(el.childNodes);
|
|
2191
|
+
const inner = (overrideCtx) => children.map(c => convertNode(c, { ...ctx, ...overrideCtx })).join("");
|
|
2192
|
+
// ── Block-level elements ──────────────────────────────────
|
|
2193
|
+
if (tag === "br") {
|
|
2194
|
+
return "\n";
|
|
2195
|
+
}
|
|
2196
|
+
if (tag === "hr") {
|
|
2197
|
+
return "\n\n---\n\n";
|
|
2198
|
+
}
|
|
2199
|
+
if (/^h[1-6]$/.test(tag)) {
|
|
2200
|
+
const level = parseInt(tag[1], 10);
|
|
2201
|
+
const prefix = "#".repeat(level);
|
|
2202
|
+
return `\n\n${prefix} ${inner().trim()}\n\n`;
|
|
2203
|
+
}
|
|
2204
|
+
if (tag === "p") {
|
|
2205
|
+
const content = inner().trim();
|
|
2206
|
+
if (!content) {
|
|
2207
|
+
return "";
|
|
2208
|
+
}
|
|
2209
|
+
return `\n\n${content}\n\n`;
|
|
2210
|
+
}
|
|
2211
|
+
if (tag === "blockquote") {
|
|
2212
|
+
const content = inner()
|
|
2213
|
+
.trim()
|
|
2214
|
+
.split("\n")
|
|
2215
|
+
.map(line => `> ${line}`)
|
|
2216
|
+
.join("\n");
|
|
2217
|
+
return `\n\n${content}\n\n`;
|
|
2218
|
+
}
|
|
2219
|
+
if (tag === "pre") {
|
|
2220
|
+
// Extract language from code class e.g. "language-typescript"
|
|
2221
|
+
const codeEl = el.querySelector("code");
|
|
2222
|
+
const lang = codeEl
|
|
2223
|
+
? (codeEl.className.match(/language-(\S+)/) || [])[1] || ""
|
|
2224
|
+
: "";
|
|
2225
|
+
const code = codeEl ? codeEl.textContent || "" : el.textContent || "";
|
|
2226
|
+
return `\n\n\`\`\`${lang}\n${code}\n\`\`\`\n\n`;
|
|
2227
|
+
}
|
|
2228
|
+
if (tag === "ul" || tag === "ol") {
|
|
2229
|
+
const isTaskList = el.getAttribute("data-type") === "taskList";
|
|
2230
|
+
const items = children
|
|
2231
|
+
.filter(c => c.tagName?.toLowerCase() === "li")
|
|
2232
|
+
.map((li, idx) => convertListItem(li, {
|
|
2233
|
+
listDepth: ctx.listDepth + 1,
|
|
2234
|
+
listType: tag === "ul" ? "ul" : "ol",
|
|
2235
|
+
orderedIndex: idx + 1,
|
|
2236
|
+
isTaskList,
|
|
2237
|
+
}))
|
|
2238
|
+
.join("\n");
|
|
2239
|
+
const block = `\n\n${items}\n\n`;
|
|
2240
|
+
// Only add surrounding newlines for root-level lists
|
|
2241
|
+
return ctx.listDepth === 0 ? block : `\n${items}`;
|
|
2242
|
+
}
|
|
2243
|
+
if (tag === "table") {
|
|
2244
|
+
return convertTable(el);
|
|
2245
|
+
}
|
|
2246
|
+
// ── Inline elements ──────────────────────────────────────
|
|
2247
|
+
if (tag === "strong" || tag === "b") {
|
|
2248
|
+
const content = inner();
|
|
2249
|
+
return content ? `**${content}**` : "";
|
|
2250
|
+
}
|
|
2251
|
+
if (tag === "em" || tag === "i") {
|
|
2252
|
+
const content = inner();
|
|
2253
|
+
return content ? `*${content}*` : "";
|
|
2254
|
+
}
|
|
2255
|
+
if (tag === "s" || tag === "del" || tag === "strike") {
|
|
2256
|
+
const content = inner();
|
|
2257
|
+
return content ? `~~${content}~~` : "";
|
|
2258
|
+
}
|
|
2259
|
+
if (tag === "u") {
|
|
2260
|
+
// No standard Markdown for underline — use HTML passthrough
|
|
2261
|
+
const content = inner();
|
|
2262
|
+
return content ? `<u>${content}</u>` : "";
|
|
2263
|
+
}
|
|
2264
|
+
if (tag === "code") {
|
|
2265
|
+
// Inline code (not inside pre)
|
|
2266
|
+
const content = el.textContent || "";
|
|
2267
|
+
return content ? `\`${content}\`` : "";
|
|
2268
|
+
}
|
|
2269
|
+
if (tag === "a") {
|
|
2270
|
+
const href = el.getAttribute("href") || "";
|
|
2271
|
+
const content = inner().trim();
|
|
2272
|
+
if (!content && !href) {
|
|
2273
|
+
return "";
|
|
2274
|
+
}
|
|
2275
|
+
if (!content) {
|
|
2276
|
+
return href;
|
|
2277
|
+
}
|
|
2278
|
+
return `[${content}](${href})`;
|
|
2279
|
+
}
|
|
2280
|
+
if (tag === "img") {
|
|
2281
|
+
const src = el.getAttribute("src") || "";
|
|
2282
|
+
const alt = el.getAttribute("alt") || "";
|
|
2283
|
+
return ``;
|
|
2284
|
+
}
|
|
2285
|
+
// ── Wrapper / Unknown elements → recurse ─────────────────
|
|
2286
|
+
return inner();
|
|
2287
|
+
}
|
|
2288
|
+
function convertListItem(li, ctx) {
|
|
2289
|
+
const indent = " ".repeat(ctx.listDepth - 1);
|
|
2290
|
+
// Task list item
|
|
2291
|
+
if (ctx.isTaskList) {
|
|
2292
|
+
const checked = li.getAttribute("data-checked") === "true";
|
|
2293
|
+
const checkMark = checked ? "[x]" : "[ ]";
|
|
2294
|
+
const content = Array.from(li.childNodes)
|
|
2295
|
+
.map(c => convertNode(c, { listDepth: ctx.listDepth, listType: ctx.listType }))
|
|
2296
|
+
.join("")
|
|
2297
|
+
.trim();
|
|
2298
|
+
return `${indent}- ${checkMark} ${content}`;
|
|
2299
|
+
}
|
|
2300
|
+
// Normal list item
|
|
2301
|
+
const bullet = ctx.listType === "ol" ? `${ctx.orderedIndex}.` : "-";
|
|
2302
|
+
// Check if li contains nested lists
|
|
2303
|
+
const nestedListNodes = Array.from(li.childNodes).filter(c => c.tagName?.toLowerCase() === "ul" ||
|
|
2304
|
+
c.tagName?.toLowerCase() === "ol");
|
|
2305
|
+
const textNodes = Array.from(li.childNodes).filter(c => !["ul", "ol"].includes(c.tagName?.toLowerCase()));
|
|
2306
|
+
const textContent = textNodes
|
|
2307
|
+
.map(c => convertNode(c, { listDepth: ctx.listDepth, listType: ctx.listType }))
|
|
2308
|
+
.join("")
|
|
2309
|
+
.trim();
|
|
2310
|
+
const nestedContent = nestedListNodes
|
|
2311
|
+
.map(c => convertNode(c, { listDepth: ctx.listDepth, listType: ctx.listType }))
|
|
2312
|
+
.join("")
|
|
2313
|
+
.trimEnd();
|
|
2314
|
+
return `${indent}${bullet} ${textContent}${nestedContent}`;
|
|
2315
|
+
}
|
|
2316
|
+
function convertTable(table) {
|
|
2317
|
+
const rows = Array.from(table.querySelectorAll("tr"));
|
|
2318
|
+
if (rows.length === 0) {
|
|
2319
|
+
return "";
|
|
2320
|
+
}
|
|
2321
|
+
const tableData = rows.map(row => Array.from(row.querySelectorAll("th, td")).map(cell => cell.textContent?.replace(/\n/g, " ").trim() || ""));
|
|
2322
|
+
if (tableData.length === 0) {
|
|
2323
|
+
return "";
|
|
2324
|
+
}
|
|
2325
|
+
const colCount = Math.max(...tableData.map(r => r.length));
|
|
2326
|
+
// Pad rows to same width
|
|
2327
|
+
const normalized = tableData.map(row => {
|
|
2328
|
+
while (row.length < colCount) {
|
|
2329
|
+
row.push("");
|
|
2330
|
+
}
|
|
2331
|
+
return row;
|
|
2332
|
+
});
|
|
2333
|
+
// Calculate column widths
|
|
2334
|
+
const colWidths = Array.from({ length: colCount }, (_, i) => Math.max(...normalized.map(r => (r[i] || "").length), 3));
|
|
2335
|
+
const pad = (str, len) => str.padEnd(len, " ");
|
|
2336
|
+
const separator = colWidths.map(w => "-".repeat(w)).join(" | ");
|
|
2337
|
+
// Build rows
|
|
2338
|
+
const lines = [];
|
|
2339
|
+
normalized.forEach((row, rowIdx) => {
|
|
2340
|
+
const line = row.map((cell, i) => pad(cell, colWidths[i])).join(" | ");
|
|
2341
|
+
lines.push(`| ${line} |`);
|
|
2342
|
+
// Add separator after header row (first row)
|
|
2343
|
+
if (rowIdx === 0) {
|
|
2344
|
+
lines.push(`| ${separator} |`);
|
|
2345
|
+
}
|
|
2346
|
+
});
|
|
2347
|
+
return `\n\n${lines.join("\n")}\n\n`;
|
|
2348
|
+
}
|
|
2349
|
+
|
|
2350
|
+
class AteExportService {
|
|
2351
|
+
// ============================================================
|
|
2352
|
+
// Public Content Getters
|
|
2353
|
+
// ============================================================
|
|
2354
|
+
/** Returns the editor content as HTML string. */
|
|
2355
|
+
getHtml(editor) {
|
|
2356
|
+
return editor.getHTML();
|
|
2357
|
+
}
|
|
2358
|
+
/** Returns the editor content as plain text. */
|
|
2359
|
+
getText(editor) {
|
|
2360
|
+
return editor.getText();
|
|
2361
|
+
}
|
|
2362
|
+
/** Returns the editor content converted to Markdown. */
|
|
2363
|
+
getMarkdown(editor) {
|
|
2364
|
+
const html = editor.getHTML();
|
|
2365
|
+
return htmlToMarkdown(html);
|
|
2366
|
+
}
|
|
2367
|
+
/** Returns the editor content in the specified format. */
|
|
2368
|
+
getContent(editor, format) {
|
|
2369
|
+
switch (format) {
|
|
2370
|
+
case "html":
|
|
2371
|
+
return this.getHtml(editor);
|
|
2372
|
+
case "markdown":
|
|
2373
|
+
return this.getMarkdown(editor);
|
|
2374
|
+
case "text":
|
|
2375
|
+
return this.getText(editor);
|
|
2376
|
+
}
|
|
2377
|
+
}
|
|
2378
|
+
// ============================================================
|
|
2379
|
+
// Export Methods
|
|
2380
|
+
// ============================================================
|
|
2381
|
+
/** Copies the editor content to the clipboard. */
|
|
2382
|
+
async exportToClipboard(editor, format) {
|
|
2383
|
+
const content = this.getContent(editor, format);
|
|
2384
|
+
await navigator.clipboard.writeText(content);
|
|
2385
|
+
}
|
|
2386
|
+
/** Downloads the editor content as a file. */
|
|
2387
|
+
exportToFile(editor, format, options) {
|
|
2388
|
+
const content = this.getContent(editor, format);
|
|
2389
|
+
const baseName = options?.filename || "document";
|
|
2390
|
+
const extensions = {
|
|
2391
|
+
html: "html",
|
|
2392
|
+
markdown: "md",
|
|
2393
|
+
text: "txt",
|
|
2394
|
+
};
|
|
2395
|
+
const mimeTypes = {
|
|
2396
|
+
html: "text/html;charset=utf-8",
|
|
2397
|
+
markdown: "text/markdown;charset=utf-8",
|
|
2398
|
+
text: "text/plain;charset=utf-8",
|
|
2399
|
+
};
|
|
2400
|
+
const filename = `${baseName}.${extensions[format]}`;
|
|
2401
|
+
const blob = new Blob([content], { type: mimeTypes[format] });
|
|
2402
|
+
const url = URL.createObjectURL(blob);
|
|
2403
|
+
const link = document.createElement("a");
|
|
2404
|
+
link.href = url;
|
|
2405
|
+
link.download = filename;
|
|
2406
|
+
document.body.appendChild(link);
|
|
2407
|
+
link.click();
|
|
2408
|
+
document.body.removeChild(link);
|
|
2409
|
+
URL.revokeObjectURL(url);
|
|
2410
|
+
}
|
|
2411
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteExportService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
2412
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteExportService }); }
|
|
2413
|
+
}
|
|
2414
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteExportService, decorators: [{
|
|
2141
2415
|
type: Injectable
|
|
2142
2416
|
}] });
|
|
2143
2417
|
|
|
@@ -2146,90 +2420,54 @@ class AteEditorCommandsService {
|
|
|
2146
2420
|
this.imageService = inject(AteImageService);
|
|
2147
2421
|
this.colorPickerSvc = inject(AteColorPickerService);
|
|
2148
2422
|
this.linkSvc = inject(AteLinkService);
|
|
2149
|
-
this.
|
|
2150
|
-
|
|
2151
|
-
|
|
2152
|
-
|
|
2153
|
-
|
|
2154
|
-
|
|
2155
|
-
|
|
2156
|
-
|
|
2157
|
-
|
|
2158
|
-
|
|
2159
|
-
|
|
2160
|
-
|
|
2161
|
-
|
|
2162
|
-
|
|
2163
|
-
|
|
2164
|
-
|
|
2165
|
-
|
|
2166
|
-
|
|
2167
|
-
|
|
2168
|
-
|
|
2169
|
-
return keysA.every(key => objA[key] === objB[key]);
|
|
2170
|
-
};
|
|
2171
|
-
// 3. Compare sub-states (marks, can, nodes)
|
|
2172
|
-
if (!isRecordEqual(a.marks, b.marks)) {
|
|
2173
|
-
return false;
|
|
2174
|
-
}
|
|
2175
|
-
if (!isRecordEqual(a.can, b.can)) {
|
|
2176
|
-
return false;
|
|
2177
|
-
}
|
|
2178
|
-
if (!isRecordEqual(a.nodes, b.nodes)) {
|
|
2179
|
-
return false;
|
|
2180
|
-
}
|
|
2181
|
-
// 4. Compare custom extension states
|
|
2182
|
-
if (!isRecordEqual(a.custom, b.custom)) {
|
|
2183
|
-
return false;
|
|
2184
|
-
}
|
|
2185
|
-
return true;
|
|
2186
|
-
} }] : [{
|
|
2187
|
-
equal: (a, b) => {
|
|
2188
|
-
// 1. Primitive global states
|
|
2189
|
-
if (a.isFocused !== b.isFocused || a.isEditable !== b.isEditable) {
|
|
2190
|
-
return false;
|
|
2191
|
-
}
|
|
2192
|
-
// 2. Detailed selection comparison
|
|
2193
|
-
if (a.selection.from !== b.selection.from ||
|
|
2194
|
-
a.selection.to !== b.selection.to ||
|
|
2195
|
-
a.selection.type !== b.selection.type ||
|
|
2196
|
-
a.selection.empty !== b.selection.empty ||
|
|
2197
|
-
a.selection.isSingleCell !== b.selection.isSingleCell) {
|
|
2198
|
-
return false;
|
|
2199
|
-
}
|
|
2200
|
-
// Helper for object comparison
|
|
2201
|
-
const isRecordEqual = (objA, objB) => {
|
|
2202
|
-
const keysA = Object.keys(objA);
|
|
2203
|
-
const keysB = Object.keys(objB);
|
|
2204
|
-
if (keysA.length !== keysB.length) {
|
|
2205
|
-
return false;
|
|
2206
|
-
}
|
|
2207
|
-
return keysA.every(key => objA[key] === objB[key]);
|
|
2208
|
-
};
|
|
2209
|
-
// 3. Compare sub-states (marks, can, nodes)
|
|
2210
|
-
if (!isRecordEqual(a.marks, b.marks)) {
|
|
2211
|
-
return false;
|
|
2212
|
-
}
|
|
2213
|
-
if (!isRecordEqual(a.can, b.can)) {
|
|
2214
|
-
return false;
|
|
2215
|
-
}
|
|
2216
|
-
if (!isRecordEqual(a.nodes, b.nodes)) {
|
|
2217
|
-
return false;
|
|
2218
|
-
}
|
|
2219
|
-
// 4. Compare custom extension states
|
|
2220
|
-
if (!isRecordEqual(a.custom, b.custom)) {
|
|
2423
|
+
this.exportSvc = inject(AteExportService);
|
|
2424
|
+
this._editorState = signal(ATE_INITIAL_EDITOR_STATE, {
|
|
2425
|
+
equal: (a, b) => {
|
|
2426
|
+
// 1. Primitive global states
|
|
2427
|
+
if (a.isFocused !== b.isFocused || a.isEditable !== b.isEditable) {
|
|
2428
|
+
return false;
|
|
2429
|
+
}
|
|
2430
|
+
// 2. Detailed selection comparison
|
|
2431
|
+
if (a.selection.from !== b.selection.from ||
|
|
2432
|
+
a.selection.to !== b.selection.to ||
|
|
2433
|
+
a.selection.type !== b.selection.type ||
|
|
2434
|
+
a.selection.empty !== b.selection.empty ||
|
|
2435
|
+
a.selection.isSingleCell !== b.selection.isSingleCell) {
|
|
2436
|
+
return false;
|
|
2437
|
+
}
|
|
2438
|
+
// Helper for object comparison
|
|
2439
|
+
const isRecordEqual = (objA, objB) => {
|
|
2440
|
+
const keysA = Object.keys(objA);
|
|
2441
|
+
const keysB = Object.keys(objB);
|
|
2442
|
+
if (keysA.length !== keysB.length) {
|
|
2221
2443
|
return false;
|
|
2222
2444
|
}
|
|
2223
|
-
return
|
|
2224
|
-
}
|
|
2225
|
-
|
|
2445
|
+
return keysA.every(key => objA[key] === objB[key]);
|
|
2446
|
+
};
|
|
2447
|
+
// 3. Compare sub-states (marks, can, nodes)
|
|
2448
|
+
if (!isRecordEqual(a.marks, b.marks)) {
|
|
2449
|
+
return false;
|
|
2450
|
+
}
|
|
2451
|
+
if (!isRecordEqual(a.can, b.can)) {
|
|
2452
|
+
return false;
|
|
2453
|
+
}
|
|
2454
|
+
if (!isRecordEqual(a.nodes, b.nodes)) {
|
|
2455
|
+
return false;
|
|
2456
|
+
}
|
|
2457
|
+
// 4. Compare custom extension states
|
|
2458
|
+
if (!isRecordEqual(a.custom, b.custom)) {
|
|
2459
|
+
return false;
|
|
2460
|
+
}
|
|
2461
|
+
return true;
|
|
2462
|
+
},
|
|
2463
|
+
});
|
|
2226
2464
|
/** Exposed editor state as a readonly signal */
|
|
2227
2465
|
this.editorState = this._editorState.asReadonly();
|
|
2228
2466
|
// ============================================
|
|
2229
2467
|
// Toolbar Interaction State
|
|
2230
2468
|
// ============================================
|
|
2231
2469
|
/** Signal to track when the toolbar is being hovered/interacted with */
|
|
2232
|
-
this._isToolbarInteracting = signal(false
|
|
2470
|
+
this._isToolbarInteracting = signal(false);
|
|
2233
2471
|
this.isToolbarInteracting = this._isToolbarInteracting.asReadonly();
|
|
2234
2472
|
// Access to ImageService states as readonly signals for UI binding
|
|
2235
2473
|
this.isUploading = this.imageService.isUploading.asReadonly();
|
|
@@ -2390,6 +2628,9 @@ class AteEditorCommandsService {
|
|
|
2390
2628
|
case "clearContent":
|
|
2391
2629
|
this.clearContent(editor);
|
|
2392
2630
|
break;
|
|
2631
|
+
case "exportAs":
|
|
2632
|
+
void this.exportAs(editor, args[0], args[1], args[2]);
|
|
2633
|
+
break;
|
|
2393
2634
|
}
|
|
2394
2635
|
}
|
|
2395
2636
|
// --- Formatting Commands ---
|
|
@@ -2582,6 +2823,34 @@ class AteEditorCommandsService {
|
|
|
2582
2823
|
}
|
|
2583
2824
|
editor.commands.clearContent(true);
|
|
2584
2825
|
}
|
|
2826
|
+
// --- Export Commands ---
|
|
2827
|
+
/**
|
|
2828
|
+
* Returns the editor content in the given format.
|
|
2829
|
+
* @param format 'html' | 'markdown' | 'text'
|
|
2830
|
+
*/
|
|
2831
|
+
getContent(editor, format) {
|
|
2832
|
+
if (!editor) {
|
|
2833
|
+
return "";
|
|
2834
|
+
}
|
|
2835
|
+
return this.exportSvc.getContent(editor, format);
|
|
2836
|
+
}
|
|
2837
|
+
/**
|
|
2838
|
+
* Exports the editor content.
|
|
2839
|
+
* @param format 'html' | 'markdown' | 'text'
|
|
2840
|
+
* @param method 'clipboard' | 'download'
|
|
2841
|
+
* @param options Optional filename for download
|
|
2842
|
+
*/
|
|
2843
|
+
async exportAs(editor, format, method, options) {
|
|
2844
|
+
if (!editor) {
|
|
2845
|
+
return;
|
|
2846
|
+
}
|
|
2847
|
+
if (method === "clipboard") {
|
|
2848
|
+
await this.exportSvc.exportToClipboard(editor, format);
|
|
2849
|
+
}
|
|
2850
|
+
else {
|
|
2851
|
+
this.exportSvc.exportToFile(editor, format, options);
|
|
2852
|
+
}
|
|
2853
|
+
}
|
|
2585
2854
|
focus(editor) {
|
|
2586
2855
|
if (!editor) {
|
|
2587
2856
|
return;
|
|
@@ -2639,19 +2908,19 @@ class AteEditorCommandsService {
|
|
|
2639
2908
|
handleImagePaste(editor, event, options) {
|
|
2640
2909
|
return this.imageService.handlePaste(editor, event, options);
|
|
2641
2910
|
}
|
|
2642
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
2643
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
2911
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteEditorCommandsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
2912
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteEditorCommandsService }); }
|
|
2644
2913
|
}
|
|
2645
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
2914
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteEditorCommandsService, decorators: [{
|
|
2646
2915
|
type: Injectable
|
|
2647
2916
|
}] });
|
|
2648
2917
|
|
|
2649
2918
|
class AteColorPickerComponent {
|
|
2650
2919
|
constructor() {
|
|
2651
|
-
this.editor = input.required(
|
|
2652
|
-
this.mode = input("text"
|
|
2653
|
-
this.disabled = input(false
|
|
2654
|
-
this.anchorToText = input(false
|
|
2920
|
+
this.editor = input.required();
|
|
2921
|
+
this.mode = input("text");
|
|
2922
|
+
this.disabled = input(false);
|
|
2923
|
+
this.anchorToText = input(false);
|
|
2655
2924
|
this.colorPickerSvc = inject(AteColorPickerService);
|
|
2656
2925
|
this.i18nService = inject(AteI18nService);
|
|
2657
2926
|
this.editorCommands = inject(AteEditorCommandsService);
|
|
@@ -2661,14 +2930,14 @@ class AteColorPickerComponent {
|
|
|
2661
2930
|
const marks = this.state().marks;
|
|
2662
2931
|
const color = this.mode() === "text" ? marks.computedColor : marks.computedBackground;
|
|
2663
2932
|
return color || (this.mode() === "text" ? "#000000" : "#ffff00");
|
|
2664
|
-
}
|
|
2933
|
+
});
|
|
2665
2934
|
this.hasColorApplied = computed(() => {
|
|
2666
2935
|
const marks = this.state().marks;
|
|
2667
2936
|
return (this.mode() === "text" ? marks.color : marks.background) !== null;
|
|
2668
|
-
}
|
|
2937
|
+
});
|
|
2669
2938
|
this.buttonIcon = computed(() => {
|
|
2670
2939
|
return this.mode() === "text" ? "format_color_text" : "format_color_fill";
|
|
2671
|
-
}
|
|
2940
|
+
});
|
|
2672
2941
|
this.buttonBgColor = computed(() => {
|
|
2673
2942
|
const color = this.currentColor();
|
|
2674
2943
|
if (this.mode() === "highlight") {
|
|
@@ -2679,7 +2948,7 @@ class AteColorPickerComponent {
|
|
|
2679
2948
|
return "#030617";
|
|
2680
2949
|
}
|
|
2681
2950
|
return "";
|
|
2682
|
-
}
|
|
2951
|
+
});
|
|
2683
2952
|
this.buttonTextColor = computed(() => {
|
|
2684
2953
|
const color = this.currentColor();
|
|
2685
2954
|
if (this.mode() === "text") {
|
|
@@ -2689,7 +2958,7 @@ class AteColorPickerComponent {
|
|
|
2689
2958
|
return this.colorPickerSvc.getLuminance(color) > 128 ? "#000000" : "#ffffff";
|
|
2690
2959
|
}
|
|
2691
2960
|
return "var(--ate-text-secondary)";
|
|
2692
|
-
}
|
|
2961
|
+
});
|
|
2693
2962
|
}
|
|
2694
2963
|
onToggle(event) {
|
|
2695
2964
|
// If anchorToText is true, we don't pass the event so it defaults to text selection anchoring
|
|
@@ -2707,8 +2976,8 @@ class AteColorPickerComponent {
|
|
|
2707
2976
|
}
|
|
2708
2977
|
this.colorPickerSvc.close();
|
|
2709
2978
|
}
|
|
2710
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
2711
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
2979
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteColorPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2980
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AteColorPickerComponent, isStandalone: true, selector: "ate-color-picker", inputs: { editor: { classPropertyName: "editor", publicName: "editor", isSignal: true, isRequired: true, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, anchorToText: { classPropertyName: "anchorToText", publicName: "anchorToText", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
2712
2981
|
<div class="color-picker-wrapper">
|
|
2713
2982
|
<div class="color-picker-container" [class.is-highlight]="mode() === 'highlight'">
|
|
2714
2983
|
<ate-button
|
|
@@ -2733,7 +3002,7 @@ class AteColorPickerComponent {
|
|
|
2733
3002
|
</div>
|
|
2734
3003
|
`, isInline: true, styles: [".color-picker-wrapper{position:relative;display:inline-block}.color-picker-container{position:relative;display:inline-flex;align-items:center}.btn-clear-badge{position:absolute;top:-4px;right:-4px;width:14px;height:14px;padding:0;border:none;border-radius:999px;background:#0f172abf;color:#fff;display:flex;align-items:center;justify-content:center;z-index:10;opacity:0;pointer-events:none;transition:opacity .12s ease}.color-picker-container:hover .btn-clear-badge{opacity:1;pointer-events:auto}.btn-clear-badge .material-symbols-outlined{font-size:10px;line-height:1}\n"], dependencies: [{ kind: "component", type: AteButtonComponent, selector: "ate-button", inputs: ["icon", "title", "active", "disabled", "color", "backgroundColor", "variant", "size", "iconSize"], outputs: ["buttonClick"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: AteTooltipDirective, selector: "[ateTooltip]", inputs: ["ateTooltip", "ateTooltipPlacement", "ateTooltipDelay", "ateTooltipDisabled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
2735
3004
|
}
|
|
2736
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
3005
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteColorPickerComponent, decorators: [{
|
|
2737
3006
|
type: Component,
|
|
2738
3007
|
args: [{ selector: "ate-color-picker", standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [AteButtonComponent, CommonModule, AteTooltipDirective], template: `
|
|
2739
3008
|
<div class="color-picker-wrapper">
|
|
@@ -2759,14 +3028,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
|
|
|
2759
3028
|
</div>
|
|
2760
3029
|
</div>
|
|
2761
3030
|
`, styles: [".color-picker-wrapper{position:relative;display:inline-block}.color-picker-container{position:relative;display:inline-flex;align-items:center}.btn-clear-badge{position:absolute;top:-4px;right:-4px;width:14px;height:14px;padding:0;border:none;border-radius:999px;background:#0f172abf;color:#fff;display:flex;align-items:center;justify-content:center;z-index:10;opacity:0;pointer-events:none;transition:opacity .12s ease}.color-picker-container:hover .btn-clear-badge{opacity:1;pointer-events:auto}.btn-clear-badge .material-symbols-outlined{font-size:10px;line-height:1}\n"] }]
|
|
2762
|
-
}]
|
|
3031
|
+
}] });
|
|
2763
3032
|
|
|
2764
3033
|
class AteToolbarComponent {
|
|
2765
3034
|
constructor() {
|
|
2766
|
-
this.editor = input.required(
|
|
2767
|
-
this.config = input.required(
|
|
2768
|
-
this.imageUpload = input({}
|
|
2769
|
-
this.floating = input(false
|
|
3035
|
+
this.editor = input.required();
|
|
3036
|
+
this.config = input.required();
|
|
3037
|
+
this.imageUpload = input({});
|
|
3038
|
+
this.floating = input(false);
|
|
2770
3039
|
this.i18nService = inject(AteI18nService);
|
|
2771
3040
|
this.editorCommands = inject(AteEditorCommandsService);
|
|
2772
3041
|
this.t = this.i18nService.toolbar;
|
|
@@ -2779,8 +3048,8 @@ class AteToolbarComponent {
|
|
|
2779
3048
|
}
|
|
2780
3049
|
this.editorCommands.execute(editor, command, ...args);
|
|
2781
3050
|
}
|
|
2782
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
2783
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
3051
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
3052
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AteToolbarComponent, isStandalone: true, selector: "ate-toolbar", inputs: { editor: { classPropertyName: "editor", publicName: "editor", isSignal: true, isRequired: true, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null }, imageUpload: { classPropertyName: "imageUpload", publicName: "imageUpload", isSignal: true, isRequired: false, transformFunction: null }, floating: { classPropertyName: "floating", publicName: "floating", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
2784
3053
|
<div class="ate-toolbar" [class.floating]="floating()">
|
|
2785
3054
|
@if (config().bold) {
|
|
2786
3055
|
<ate-button
|
|
@@ -3031,7 +3300,7 @@ class AteToolbarComponent {
|
|
|
3031
3300
|
</div>
|
|
3032
3301
|
`, isInline: true, styles: [":host{display:block;transition:opacity .3s ease}:host-context(.floating-toolbar){position:sticky;top:3rem;left:0;right:0;z-index:100;display:flex;height:0;overflow:visible;pointer-events:none;opacity:0}:host-context(.floating-toolbar:focus-within),:host-context(.floating-toolbar:hover){opacity:1}.ate-toolbar{display:flex;align-items:center;gap:var(--ate-toolbar-gap);padding:var(--ate-toolbar-padding);background:var(--ate-toolbar-background);border-bottom:1px solid var(--ate-toolbar-border-color);flex-wrap:wrap;min-height:32px;position:relative;z-index:50;border-top-left-radius:calc(var(--ate-menu-border-radius, 12px) - var(--ate-border-width, 2px));border-top-right-radius:calc(var(--ate-menu-border-radius, 12px) - var(--ate-border-width, 2px))}.ate-toolbar.floating{pointer-events:auto;border-radius:var(--ate-menu-border-radius, 12px);border:1px solid var(--ate-menu-border)!important;box-shadow:var(--ate-menu-shadow)!important;background:var(--ate-menu-bg)!important;padding:var(--ate-menu-padding)!important;flex-wrap:nowrap;overflow-x:auto;max-width:95vw;scrollbar-width:none;transform:translateY(0);transition:transform .3s cubic-bezier(.4,0,.2,1)}.ate-toolbar.floating::-webkit-scrollbar{display:none}:host-context(.floating-toolbar:focus-within) .ate-toolbar.floating,:host-context(.floating-toolbar:hover) .ate-toolbar.floating{transform:translateY(-2rem)}@keyframes toolbarSlideIn{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.ate-toolbar{animation:toolbarSlideIn .3s cubic-bezier(.4,0,.2,1)}\n"], dependencies: [{ kind: "component", type: AteButtonComponent, selector: "ate-button", inputs: ["icon", "title", "active", "disabled", "color", "backgroundColor", "variant", "size", "iconSize"], outputs: ["buttonClick"] }, { kind: "component", type: AteSeparatorComponent, selector: "ate-separator" }, { kind: "component", type: AteColorPickerComponent, selector: "ate-color-picker", inputs: ["editor", "mode", "disabled", "anchorToText"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
3033
3302
|
}
|
|
3034
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
3303
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteToolbarComponent, decorators: [{
|
|
3035
3304
|
type: Component,
|
|
3036
3305
|
args: [{ selector: "ate-toolbar", standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [AteButtonComponent, AteSeparatorComponent, AteColorPickerComponent], template: `
|
|
3037
3306
|
<div class="ate-toolbar" [class.floating]="floating()">
|
|
@@ -3283,7 +3552,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
|
|
|
3283
3552
|
}
|
|
3284
3553
|
</div>
|
|
3285
3554
|
`, styles: [":host{display:block;transition:opacity .3s ease}:host-context(.floating-toolbar){position:sticky;top:3rem;left:0;right:0;z-index:100;display:flex;height:0;overflow:visible;pointer-events:none;opacity:0}:host-context(.floating-toolbar:focus-within),:host-context(.floating-toolbar:hover){opacity:1}.ate-toolbar{display:flex;align-items:center;gap:var(--ate-toolbar-gap);padding:var(--ate-toolbar-padding);background:var(--ate-toolbar-background);border-bottom:1px solid var(--ate-toolbar-border-color);flex-wrap:wrap;min-height:32px;position:relative;z-index:50;border-top-left-radius:calc(var(--ate-menu-border-radius, 12px) - var(--ate-border-width, 2px));border-top-right-radius:calc(var(--ate-menu-border-radius, 12px) - var(--ate-border-width, 2px))}.ate-toolbar.floating{pointer-events:auto;border-radius:var(--ate-menu-border-radius, 12px);border:1px solid var(--ate-menu-border)!important;box-shadow:var(--ate-menu-shadow)!important;background:var(--ate-menu-bg)!important;padding:var(--ate-menu-padding)!important;flex-wrap:nowrap;overflow-x:auto;max-width:95vw;scrollbar-width:none;transform:translateY(0);transition:transform .3s cubic-bezier(.4,0,.2,1)}.ate-toolbar.floating::-webkit-scrollbar{display:none}:host-context(.floating-toolbar:focus-within) .ate-toolbar.floating,:host-context(.floating-toolbar:hover) .ate-toolbar.floating{transform:translateY(-2rem)}@keyframes toolbarSlideIn{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.ate-toolbar{animation:toolbarSlideIn .3s cubic-bezier(.4,0,.2,1)}\n"] }]
|
|
3286
|
-
}]
|
|
3555
|
+
}] });
|
|
3287
3556
|
|
|
3288
3557
|
// Default toolbar configuration
|
|
3289
3558
|
const ATE_DEFAULT_TOOLBAR_CONFIG = {
|
|
@@ -3427,7 +3696,7 @@ class AteBaseBubbleMenu {
|
|
|
3427
3696
|
this.i18nService = inject(AteI18nService);
|
|
3428
3697
|
this.editorCommands = inject(AteEditorCommandsService);
|
|
3429
3698
|
// Core Inputs
|
|
3430
|
-
this.editor = input.required(
|
|
3699
|
+
this.editor = input.required();
|
|
3431
3700
|
// Required viewChild for the menu container
|
|
3432
3701
|
this.menuRef = viewChild.required("menuRef");
|
|
3433
3702
|
// Internal State
|
|
@@ -3471,7 +3740,7 @@ class AteBaseBubbleMenu {
|
|
|
3471
3740
|
this.editorCommands.linkEditMode();
|
|
3472
3741
|
this.editorCommands.colorEditMode();
|
|
3473
3742
|
this.updateMenu();
|
|
3474
|
-
});
|
|
3743
|
+
}, { allowSignalWrites: true });
|
|
3475
3744
|
}
|
|
3476
3745
|
ngAfterViewInit() {
|
|
3477
3746
|
this.initTippy();
|
|
@@ -3613,12 +3882,12 @@ class AteBaseBubbleMenu {
|
|
|
3613
3882
|
onTippyHide(_instance) {
|
|
3614
3883
|
/* empty */
|
|
3615
3884
|
}
|
|
3616
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
3617
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "
|
|
3885
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteBaseBubbleMenu, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
3886
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "18.2.14", type: AteBaseBubbleMenu, inputs: { editor: { classPropertyName: "editor", publicName: "editor", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "menuRef", first: true, predicate: ["menuRef"], descendants: true, isSignal: true }], ngImport: i0 }); }
|
|
3618
3887
|
}
|
|
3619
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
3888
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteBaseBubbleMenu, decorators: [{
|
|
3620
3889
|
type: Directive
|
|
3621
|
-
}], ctorParameters: () => []
|
|
3890
|
+
}], ctorParameters: () => [] });
|
|
3622
3891
|
|
|
3623
3892
|
class AteBubbleMenuComponent extends AteBaseBubbleMenu {
|
|
3624
3893
|
constructor() {
|
|
@@ -3627,11 +3896,11 @@ class AteBubbleMenuComponent extends AteBaseBubbleMenu {
|
|
|
3627
3896
|
this.onMouseDown = () => {
|
|
3628
3897
|
this.hideTippy();
|
|
3629
3898
|
};
|
|
3630
|
-
this.config = input(ATE_DEFAULT_BUBBLE_MENU_CONFIG
|
|
3899
|
+
this.config = input(ATE_DEFAULT_BUBBLE_MENU_CONFIG);
|
|
3631
3900
|
this.bubbleMenuConfig = computed(() => ({
|
|
3632
3901
|
...ATE_DEFAULT_BUBBLE_MENU_CONFIG,
|
|
3633
3902
|
...this.config(),
|
|
3634
|
-
})
|
|
3903
|
+
}));
|
|
3635
3904
|
}
|
|
3636
3905
|
ngOnInit() {
|
|
3637
3906
|
const ed = this.editor();
|
|
@@ -3678,8 +3947,8 @@ class AteBubbleMenuComponent extends AteBaseBubbleMenu {
|
|
|
3678
3947
|
// Sub-menus now manage their own state. Clearing them here causes
|
|
3679
3948
|
// premature closing when clicking between 'sibling' menu instances.
|
|
3680
3949
|
}
|
|
3681
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
3682
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
3950
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteBubbleMenuComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
3951
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AteBubbleMenuComponent, isStandalone: true, selector: "ate-bubble-menu", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: `
|
|
3683
3952
|
<div #menuRef class="bubble-menu" (mousedown)="$event.preventDefault()">
|
|
3684
3953
|
@if (bubbleMenuConfig().bold) {
|
|
3685
3954
|
<ate-button
|
|
@@ -3778,7 +4047,7 @@ class AteBubbleMenuComponent extends AteBaseBubbleMenu {
|
|
|
3778
4047
|
</div>
|
|
3779
4048
|
`, isInline: true, dependencies: [{ kind: "component", type: AteButtonComponent, selector: "ate-button", inputs: ["icon", "title", "active", "disabled", "color", "backgroundColor", "variant", "size", "iconSize"], outputs: ["buttonClick"] }, { kind: "component", type: AteColorPickerComponent, selector: "ate-color-picker", inputs: ["editor", "mode", "disabled", "anchorToText"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
3780
4049
|
}
|
|
3781
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
4050
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteBubbleMenuComponent, decorators: [{
|
|
3782
4051
|
type: Component,
|
|
3783
4052
|
args: [{
|
|
3784
4053
|
selector: "ate-bubble-menu",
|
|
@@ -3884,7 +4153,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
|
|
|
3884
4153
|
</div>
|
|
3885
4154
|
`,
|
|
3886
4155
|
}]
|
|
3887
|
-
}]
|
|
4156
|
+
}] });
|
|
3888
4157
|
|
|
3889
4158
|
/**
|
|
3890
4159
|
* Clés des options du menu bulle de texte
|
|
@@ -3944,8 +4213,8 @@ class AteImageBubbleMenuComponent extends AteBaseBubbleMenu {
|
|
|
3944
4213
|
super(...arguments);
|
|
3945
4214
|
this.t = this.i18nService.imageUpload;
|
|
3946
4215
|
this.imageService = inject(AteImageService);
|
|
3947
|
-
this.config = input(ATE_DEFAULT_IMAGE_BUBBLE_MENU_CONFIG
|
|
3948
|
-
this.imageUpload = input({}
|
|
4216
|
+
this.config = input(ATE_DEFAULT_IMAGE_BUBBLE_MENU_CONFIG);
|
|
4217
|
+
this.imageUpload = input({});
|
|
3949
4218
|
this.imageBubbleMenuConfig = computed(() => {
|
|
3950
4219
|
const c = this.config();
|
|
3951
4220
|
const result = {};
|
|
@@ -3953,14 +4222,14 @@ class AteImageBubbleMenuComponent extends AteBaseBubbleMenu {
|
|
|
3953
4222
|
result[key] = c[key] ?? true;
|
|
3954
4223
|
});
|
|
3955
4224
|
return result;
|
|
3956
|
-
}
|
|
4225
|
+
});
|
|
3957
4226
|
this.hasAlignmentButtons = computed(() => this.imageBubbleMenuConfig().alignLeft ||
|
|
3958
4227
|
this.imageBubbleMenuConfig().alignCenter ||
|
|
3959
|
-
this.imageBubbleMenuConfig().alignRight
|
|
4228
|
+
this.imageBubbleMenuConfig().alignRight);
|
|
3960
4229
|
this.hasResizeButtons = computed(() => {
|
|
3961
4230
|
const c = this.imageBubbleMenuConfig();
|
|
3962
4231
|
return c.resizeSmall || c.resizeMedium || c.resizeLarge || c.resizeOriginal;
|
|
3963
|
-
}
|
|
4232
|
+
});
|
|
3964
4233
|
}
|
|
3965
4234
|
shouldShow() {
|
|
3966
4235
|
const { nodes, isEditable, isFocused, selection } = this.state();
|
|
@@ -4058,8 +4327,8 @@ class AteImageBubbleMenuComponent extends AteBaseBubbleMenu {
|
|
|
4058
4327
|
ed.chain().focus().deleteSelection().run();
|
|
4059
4328
|
}
|
|
4060
4329
|
}
|
|
4061
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
4062
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
4330
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteImageBubbleMenuComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
4331
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AteImageBubbleMenuComponent, isStandalone: true, selector: "ate-image-bubble-menu", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, imageUpload: { classPropertyName: "imageUpload", publicName: "imageUpload", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: `
|
|
4063
4332
|
<div #menuRef class="bubble-menu" (mousedown)="$event.preventDefault()">
|
|
4064
4333
|
@if (imageBubbleMenuConfig().changeImage && editor().isEditable) {
|
|
4065
4334
|
<ate-button
|
|
@@ -4145,7 +4414,7 @@ class AteImageBubbleMenuComponent extends AteBaseBubbleMenu {
|
|
|
4145
4414
|
</div>
|
|
4146
4415
|
`, isInline: true, dependencies: [{ kind: "component", type: AteButtonComponent, selector: "ate-button", inputs: ["icon", "title", "active", "disabled", "color", "backgroundColor", "variant", "size", "iconSize"], outputs: ["buttonClick"] }, { kind: "component", type: AteSeparatorComponent, selector: "ate-separator" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
4147
4416
|
}
|
|
4148
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
4417
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteImageBubbleMenuComponent, decorators: [{
|
|
4149
4418
|
type: Component,
|
|
4150
4419
|
args: [{
|
|
4151
4420
|
selector: "ate-image-bubble-menu",
|
|
@@ -4238,14 +4507,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
|
|
|
4238
4507
|
</div>
|
|
4239
4508
|
`,
|
|
4240
4509
|
}]
|
|
4241
|
-
}]
|
|
4510
|
+
}] });
|
|
4242
4511
|
|
|
4243
4512
|
class AteTableBubbleMenuComponent extends AteBaseBubbleMenu {
|
|
4244
4513
|
constructor() {
|
|
4245
4514
|
super(...arguments);
|
|
4246
4515
|
// Alias for template
|
|
4247
4516
|
this.t = this.i18nService.table;
|
|
4248
|
-
this.config = input(ATE_DEFAULT_TABLE_MENU_CONFIG
|
|
4517
|
+
this.config = input(ATE_DEFAULT_TABLE_MENU_CONFIG);
|
|
4249
4518
|
this.tableBubbleMenuConfig = computed(() => {
|
|
4250
4519
|
const c = this.config();
|
|
4251
4520
|
const result = {};
|
|
@@ -4253,7 +4522,7 @@ class AteTableBubbleMenuComponent extends AteBaseBubbleMenu {
|
|
|
4253
4522
|
result[key] = c[key] ?? true;
|
|
4254
4523
|
});
|
|
4255
4524
|
return result;
|
|
4256
|
-
}
|
|
4525
|
+
});
|
|
4257
4526
|
}
|
|
4258
4527
|
shouldShow() {
|
|
4259
4528
|
const { selection, nodes, isEditable, isFocused } = this.state();
|
|
@@ -4311,8 +4580,8 @@ class AteTableBubbleMenuComponent extends AteBaseBubbleMenu {
|
|
|
4311
4580
|
executeCommand(editor, command, ...args) {
|
|
4312
4581
|
this.editorCommands.execute(editor, command, ...args);
|
|
4313
4582
|
}
|
|
4314
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
4315
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
4583
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteTableBubbleMenuComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
4584
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AteTableBubbleMenuComponent, isStandalone: true, selector: "ate-table-bubble-menu", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: `
|
|
4316
4585
|
<div #menuRef class="bubble-menu" (mousedown)="$event.preventDefault()">
|
|
4317
4586
|
<!-- Row actions -->
|
|
4318
4587
|
@if (tableBubbleMenuConfig().addRowBefore !== false) {
|
|
@@ -4403,7 +4672,7 @@ class AteTableBubbleMenuComponent extends AteBaseBubbleMenu {
|
|
|
4403
4672
|
</div>
|
|
4404
4673
|
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AteButtonComponent, selector: "ate-button", inputs: ["icon", "title", "active", "disabled", "color", "backgroundColor", "variant", "size", "iconSize"], outputs: ["buttonClick"] }, { kind: "component", type: AteSeparatorComponent, selector: "ate-separator" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
4405
4674
|
}
|
|
4406
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
4675
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteTableBubbleMenuComponent, decorators: [{
|
|
4407
4676
|
type: Component,
|
|
4408
4677
|
args: [{
|
|
4409
4678
|
selector: "ate-table-bubble-menu",
|
|
@@ -4501,17 +4770,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
|
|
|
4501
4770
|
</div>
|
|
4502
4771
|
`,
|
|
4503
4772
|
}]
|
|
4504
|
-
}]
|
|
4773
|
+
}] });
|
|
4505
4774
|
|
|
4506
4775
|
class AteCellBubbleMenuComponent extends AteBaseBubbleMenu {
|
|
4507
4776
|
constructor() {
|
|
4508
4777
|
super(...arguments);
|
|
4509
4778
|
// Inputs
|
|
4510
|
-
this.config = input(ATE_DEFAULT_CELL_MENU_CONFIG
|
|
4779
|
+
this.config = input(ATE_DEFAULT_CELL_MENU_CONFIG);
|
|
4511
4780
|
this.cellBubbleMenuConfig = computed(() => ({
|
|
4512
4781
|
mergeCells: this.config().mergeCells ?? true,
|
|
4513
4782
|
splitCell: this.config().splitCell ?? true,
|
|
4514
|
-
})
|
|
4783
|
+
}));
|
|
4515
4784
|
// Signals
|
|
4516
4785
|
this.i18n = () => this.i18nService;
|
|
4517
4786
|
}
|
|
@@ -4573,8 +4842,8 @@ class AteCellBubbleMenuComponent extends AteBaseBubbleMenu {
|
|
|
4573
4842
|
executeCommand(editor, command, ...args) {
|
|
4574
4843
|
this.editorCommands.execute(editor, command, ...args);
|
|
4575
4844
|
}
|
|
4576
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
4577
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
4845
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteCellBubbleMenuComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
4846
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AteCellBubbleMenuComponent, isStandalone: true, selector: "ate-cell-bubble-menu", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: `
|
|
4578
4847
|
<div #menuRef class="bubble-menu" (mousedown)="$event.preventDefault()">
|
|
4579
4848
|
<!-- Cell specific actions -->
|
|
4580
4849
|
@if (cellBubbleMenuConfig().mergeCells !== false && !state().selection.isSingleCell) {
|
|
@@ -4594,7 +4863,7 @@ class AteCellBubbleMenuComponent extends AteBaseBubbleMenu {
|
|
|
4594
4863
|
</div>
|
|
4595
4864
|
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AteButtonComponent, selector: "ate-button", inputs: ["icon", "title", "active", "disabled", "color", "backgroundColor", "variant", "size", "iconSize"], outputs: ["buttonClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
4596
4865
|
}
|
|
4597
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
4866
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteCellBubbleMenuComponent, decorators: [{
|
|
4598
4867
|
type: Component,
|
|
4599
4868
|
args: [{
|
|
4600
4869
|
selector: "ate-cell-bubble-menu",
|
|
@@ -4621,7 +4890,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
|
|
|
4621
4890
|
</div>
|
|
4622
4891
|
`,
|
|
4623
4892
|
}]
|
|
4624
|
-
}]
|
|
4893
|
+
}] });
|
|
4625
4894
|
|
|
4626
4895
|
/**
|
|
4627
4896
|
* Base abstract class for Sub-Bubble Menus (Link, Color).
|
|
@@ -4632,7 +4901,7 @@ class AteBaseSubBubbleMenu {
|
|
|
4632
4901
|
this.i18nService = inject(AteI18nService);
|
|
4633
4902
|
this.editorCommands = inject(AteEditorCommandsService);
|
|
4634
4903
|
// Core Inputs
|
|
4635
|
-
this.editor = input.required(
|
|
4904
|
+
this.editor = input.required();
|
|
4636
4905
|
// Required viewChild for the menu container
|
|
4637
4906
|
this.menuRef = viewChild.required("menuRef");
|
|
4638
4907
|
// Internal State
|
|
@@ -4662,7 +4931,7 @@ class AteBaseSubBubbleMenu {
|
|
|
4662
4931
|
this.state();
|
|
4663
4932
|
this.onStateChange();
|
|
4664
4933
|
this.updateMenu();
|
|
4665
|
-
});
|
|
4934
|
+
}, { allowSignalWrites: true });
|
|
4666
4935
|
}
|
|
4667
4936
|
ngAfterViewInit() {
|
|
4668
4937
|
this.initTippy();
|
|
@@ -4748,12 +5017,12 @@ class AteBaseSubBubbleMenu {
|
|
|
4748
5017
|
onTippyHide(_instance) {
|
|
4749
5018
|
/* empty */
|
|
4750
5019
|
}
|
|
4751
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
4752
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "
|
|
5020
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteBaseSubBubbleMenu, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
5021
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "18.2.14", type: AteBaseSubBubbleMenu, inputs: { editor: { classPropertyName: "editor", publicName: "editor", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "menuRef", first: true, predicate: ["menuRef"], descendants: true, isSignal: true }], ngImport: i0 }); }
|
|
4753
5022
|
}
|
|
4754
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
5023
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteBaseSubBubbleMenu, decorators: [{
|
|
4755
5024
|
type: Directive
|
|
4756
|
-
}], ctorParameters: () => []
|
|
5025
|
+
}], ctorParameters: () => [] });
|
|
4757
5026
|
|
|
4758
5027
|
class AteLinkBubbleMenuComponent extends AteBaseSubBubbleMenu {
|
|
4759
5028
|
constructor() {
|
|
@@ -4761,8 +5030,8 @@ class AteLinkBubbleMenuComponent extends AteBaseSubBubbleMenu {
|
|
|
4761
5030
|
this.linkSvc = inject(AteLinkService);
|
|
4762
5031
|
this.t = this.i18nService.bubbleMenu;
|
|
4763
5032
|
this.common = this.i18nService.common;
|
|
4764
|
-
this.linkInput = viewChild("linkInput"
|
|
4765
|
-
this.editUrl = signal(""
|
|
5033
|
+
this.linkInput = viewChild("linkInput");
|
|
5034
|
+
this.editUrl = signal("");
|
|
4766
5035
|
// Reactive effect for URL sync
|
|
4767
5036
|
effect(() => {
|
|
4768
5037
|
const state = this.state();
|
|
@@ -4774,7 +5043,7 @@ class AteLinkBubbleMenuComponent extends AteBaseSubBubbleMenu {
|
|
|
4774
5043
|
if (!isInteracting) {
|
|
4775
5044
|
this.editUrl.set(currentLinkHref);
|
|
4776
5045
|
}
|
|
4777
|
-
});
|
|
5046
|
+
}, { allowSignalWrites: true });
|
|
4778
5047
|
}
|
|
4779
5048
|
onStateChange() {
|
|
4780
5049
|
this.linkSvc.editMode();
|
|
@@ -4890,8 +5159,8 @@ class AteLinkBubbleMenuComponent extends AteBaseSubBubbleMenu {
|
|
|
4890
5159
|
this.linkSvc.close();
|
|
4891
5160
|
this.hideTippy();
|
|
4892
5161
|
}
|
|
4893
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
4894
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "
|
|
5162
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteLinkBubbleMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5163
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.14", type: AteLinkBubbleMenuComponent, isStandalone: true, selector: "ate-link-bubble-menu", viewQueries: [{ propertyName: "linkInput", first: true, predicate: ["linkInput"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
|
|
4895
5164
|
<div
|
|
4896
5165
|
#menuRef
|
|
4897
5166
|
class="bubble-menu"
|
|
@@ -4941,7 +5210,7 @@ class AteLinkBubbleMenuComponent extends AteBaseSubBubbleMenu {
|
|
|
4941
5210
|
</div>
|
|
4942
5211
|
`, isInline: true, styles: [".link-input-row{display:flex;align-items:center;gap:6px}.url-input-container{flex:1;display:flex;align-items:center;background:var(--ate-surface-secondary, #f8fafc);border:1px solid var(--ate-border, #e2e8f0);border-radius:8px;padding:0 10px;height:32px;transition:all .15s ease}.url-input-container:focus-within{border-color:var(--ate-primary, #3b82f6);background:var(--ate-surface, #ffffff);box-shadow:0 0 0 2px var(--ate-primary-light, rgba(59, 130, 246, .1))}.icon-link{font-size:16px;color:var(--ate-text-muted, #94a3b8);margin-right:6px}.url-field{background:transparent;border:none;outline:none;color:var(--ate-text, #1e293b);font-size:13px;width:100%;font-family:inherit}.action-buttons{display:flex;align-items:center;gap:2px}\n"], dependencies: [{ kind: "component", type: AteButtonComponent, selector: "ate-button", inputs: ["icon", "title", "active", "disabled", "color", "backgroundColor", "variant", "size", "iconSize"], outputs: ["buttonClick"] }, { kind: "component", type: AteSeparatorComponent, selector: "ate-separator" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
4943
5212
|
}
|
|
4944
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
5213
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteLinkBubbleMenuComponent, decorators: [{
|
|
4945
5214
|
type: Component,
|
|
4946
5215
|
args: [{ selector: "ate-link-bubble-menu", standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [AteButtonComponent, AteSeparatorComponent, FormsModule], template: `
|
|
4947
5216
|
<div
|
|
@@ -4992,7 +5261,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
|
|
|
4992
5261
|
</div>
|
|
4993
5262
|
</div>
|
|
4994
5263
|
`, styles: [".link-input-row{display:flex;align-items:center;gap:6px}.url-input-container{flex:1;display:flex;align-items:center;background:var(--ate-surface-secondary, #f8fafc);border:1px solid var(--ate-border, #e2e8f0);border-radius:8px;padding:0 10px;height:32px;transition:all .15s ease}.url-input-container:focus-within{border-color:var(--ate-primary, #3b82f6);background:var(--ate-surface, #ffffff);box-shadow:0 0 0 2px var(--ate-primary-light, rgba(59, 130, 246, .1))}.icon-link{font-size:16px;color:var(--ate-text-muted, #94a3b8);margin-right:6px}.url-field{background:transparent;border:none;outline:none;color:var(--ate-text, #1e293b);font-size:13px;width:100%;font-family:inherit}.action-buttons{display:flex;align-items:center;gap:2px}\n"] }]
|
|
4995
|
-
}], ctorParameters: () => []
|
|
5264
|
+
}], ctorParameters: () => [] });
|
|
4996
5265
|
|
|
4997
5266
|
const PRESET_COLORS = [
|
|
4998
5267
|
"#000000",
|
|
@@ -5015,21 +5284,21 @@ class AteColorBubbleMenuComponent extends AteBaseSubBubbleMenu {
|
|
|
5015
5284
|
this.t = this.i18nService.toolbar;
|
|
5016
5285
|
this.common = this.i18nService.common;
|
|
5017
5286
|
this.presets = PRESET_COLORS;
|
|
5018
|
-
this.colorInputRef = viewChild("colorInput"
|
|
5287
|
+
this.colorInputRef = viewChild("colorInput");
|
|
5019
5288
|
/**
|
|
5020
5289
|
* LOCAL MODE: We lock the mode when the menu is shown to avoid race conditions
|
|
5021
5290
|
* where the parent (bubble menu) clears the global signal before we apply the color.
|
|
5022
5291
|
*/
|
|
5023
|
-
this.activeMode = signal("text"
|
|
5292
|
+
this.activeMode = signal("text");
|
|
5024
5293
|
this.currentColor = computed(() => {
|
|
5025
5294
|
const marks = this.state().marks;
|
|
5026
5295
|
const color = this.activeMode() === "text" ? marks.computedColor : marks.computedBackground;
|
|
5027
5296
|
return color || (this.activeMode() === "text" ? "#000000" : "#ffff00");
|
|
5028
|
-
}
|
|
5297
|
+
});
|
|
5029
5298
|
this.hexValue = computed(() => {
|
|
5030
5299
|
const color = this.currentColor();
|
|
5031
5300
|
return color.replace("#", "").toUpperCase();
|
|
5032
|
-
}
|
|
5301
|
+
});
|
|
5033
5302
|
}
|
|
5034
5303
|
onStateChange() {
|
|
5035
5304
|
this.colorPickerSvc.editMode();
|
|
@@ -5187,8 +5456,8 @@ class AteColorBubbleMenuComponent extends AteBaseSubBubbleMenu {
|
|
|
5187
5456
|
this.updateMenu();
|
|
5188
5457
|
}, 150);
|
|
5189
5458
|
}
|
|
5190
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
5191
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
5459
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteColorBubbleMenuComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
5460
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AteColorBubbleMenuComponent, isStandalone: true, selector: "ate-color-bubble-menu", viewQueries: [{ propertyName: "colorInputRef", first: true, predicate: ["colorInput"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
|
|
5192
5461
|
<div
|
|
5193
5462
|
#menuRef
|
|
5194
5463
|
class="bubble-menu color-bubble-menu"
|
|
@@ -5268,7 +5537,7 @@ class AteColorBubbleMenuComponent extends AteBaseSubBubbleMenu {
|
|
|
5268
5537
|
</div>
|
|
5269
5538
|
`, isInline: true, styles: [".color-picker-container{display:flex;flex-direction:column;gap:8px}.dropdown-row{display:flex;align-items:center;width:100%}.dropdown-row.presets{justify-content:center}.dropdown-row.controls{gap:8px;justify-content:space-between;padding-top:4px;border-top:1px solid var(--ate-border, #e2e8f0)}.color-grid{display:grid;grid-template-columns:repeat(12,1fr);gap:4px;width:100%}:host ::ng-deep .color-swatch-btn .ate-button{width:100%;aspect-ratio:1;height:auto;border-radius:4px;border:1px solid rgba(0,0,0,.1);padding:0}:host ::ng-deep .color-swatch-btn .ate-button.is-active{border-color:var(--ate-primary, #3b82f6);box-shadow:0 0 0 2px #3b82f64d}:host ::ng-deep .btn-native-picker-trigger .ate-button{color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.2)}.divider-v{width:1px;height:24px;background:var(--ate-border, #e2e8f0)}.hex-input-wrapper{flex:1;display:flex;align-items:center;background:var(--ate-surface-secondary, #f8fafc);border:1px solid var(--ate-border, #e2e8f0);border-radius:8px;padding:0 10px;height:32px;transition:border-color .15s ease}.hex-input-wrapper:focus-within{border-color:var(--ate-primary, #3b82f6);background:var(--ate-menu-bg, #ffffff)}.hex-hash{color:var(--ate-text-muted, #94a3b8);font-family:monospace;font-size:.875rem}.hex-input{background:transparent;border:none;outline:none;color:var(--ate-text, #1e293b);font-family:monospace;font-size:.875rem;width:100%;padding-left:4px}.native-trigger-wrapper{position:relative;width:32px;height:32px}.hidden-native-input{position:absolute;inset:0;opacity:0;width:100%;height:100%;cursor:pointer}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: AteButtonComponent, selector: "ate-button", inputs: ["icon", "title", "active", "disabled", "color", "backgroundColor", "variant", "size", "iconSize"], outputs: ["buttonClick"] }, { kind: "component", type: AteSeparatorComponent, selector: "ate-separator" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
5270
5539
|
}
|
|
5271
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
5540
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteColorBubbleMenuComponent, decorators: [{
|
|
5272
5541
|
type: Component,
|
|
5273
5542
|
args: [{ selector: "ate-color-bubble-menu", standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, FormsModule, AteButtonComponent, AteSeparatorComponent], template: `
|
|
5274
5543
|
<div
|
|
@@ -5349,7 +5618,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
|
|
|
5349
5618
|
</div>
|
|
5350
5619
|
</div>
|
|
5351
5620
|
`, styles: [".color-picker-container{display:flex;flex-direction:column;gap:8px}.dropdown-row{display:flex;align-items:center;width:100%}.dropdown-row.presets{justify-content:center}.dropdown-row.controls{gap:8px;justify-content:space-between;padding-top:4px;border-top:1px solid var(--ate-border, #e2e8f0)}.color-grid{display:grid;grid-template-columns:repeat(12,1fr);gap:4px;width:100%}:host ::ng-deep .color-swatch-btn .ate-button{width:100%;aspect-ratio:1;height:auto;border-radius:4px;border:1px solid rgba(0,0,0,.1);padding:0}:host ::ng-deep .color-swatch-btn .ate-button.is-active{border-color:var(--ate-primary, #3b82f6);box-shadow:0 0 0 2px #3b82f64d}:host ::ng-deep .btn-native-picker-trigger .ate-button{color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.2)}.divider-v{width:1px;height:24px;background:var(--ate-border, #e2e8f0)}.hex-input-wrapper{flex:1;display:flex;align-items:center;background:var(--ate-surface-secondary, #f8fafc);border:1px solid var(--ate-border, #e2e8f0);border-radius:8px;padding:0 10px;height:32px;transition:border-color .15s ease}.hex-input-wrapper:focus-within{border-color:var(--ate-primary, #3b82f6);background:var(--ate-menu-bg, #ffffff)}.hex-hash{color:var(--ate-text-muted, #94a3b8);font-family:monospace;font-size:.875rem}.hex-input{background:transparent;border:none;outline:none;color:var(--ate-text, #1e293b);font-family:monospace;font-size:.875rem;width:100%;padding-left:4px}.native-trigger-wrapper{position:relative;width:32px;height:32px}.hidden-native-input{position:absolute;inset:0;opacity:0;width:100%;height:100%;cursor:pointer}\n"] }]
|
|
5352
|
-
}]
|
|
5621
|
+
}] });
|
|
5353
5622
|
|
|
5354
5623
|
/**
|
|
5355
5624
|
* Clés des commandes natives dans l'ordre d'affichage
|
|
@@ -5485,17 +5754,17 @@ function filterSlashCommands(config, i18n, commands, imageOptions) {
|
|
|
5485
5754
|
class AteSlashCommandsComponent {
|
|
5486
5755
|
constructor() {
|
|
5487
5756
|
this.i18nService = inject(AteI18nService);
|
|
5488
|
-
this.editor = input.required(
|
|
5489
|
-
this.config = input(undefined
|
|
5757
|
+
this.editor = input.required();
|
|
5758
|
+
this.config = input(undefined);
|
|
5490
5759
|
this.menuRef = viewChild.required("menuRef");
|
|
5491
5760
|
this.tippyInstance = null;
|
|
5492
5761
|
this.editorCommands = inject(AteEditorCommandsService);
|
|
5493
5762
|
// Local state
|
|
5494
5763
|
this.isActive = false;
|
|
5495
|
-
this.currentQuery = signal(""
|
|
5764
|
+
this.currentQuery = signal("");
|
|
5496
5765
|
this.slashRange = null;
|
|
5497
5766
|
// Signal for selected index
|
|
5498
|
-
this.selectedIndex = signal(0
|
|
5767
|
+
this.selectedIndex = signal(0);
|
|
5499
5768
|
// Toolbar interaction state (from centralized service)
|
|
5500
5769
|
this.isToolbarInteracting = this.editorCommands.isToolbarInteracting;
|
|
5501
5770
|
this.commands = computed(() => {
|
|
@@ -5505,7 +5774,7 @@ class AteSlashCommandsComponent {
|
|
|
5505
5774
|
}
|
|
5506
5775
|
// Fallback to default native commands
|
|
5507
5776
|
return createDefaultSlashCommands(this.i18nService, this.editorCommands);
|
|
5508
|
-
}
|
|
5777
|
+
});
|
|
5509
5778
|
this.filteredCommands = computed(() => {
|
|
5510
5779
|
const query = this.currentQuery().toLowerCase();
|
|
5511
5780
|
const commands = this.commands();
|
|
@@ -5515,7 +5784,7 @@ class AteSlashCommandsComponent {
|
|
|
5515
5784
|
return commands.filter(command => command.title.toLowerCase().includes(query) ||
|
|
5516
5785
|
command.description.toLowerCase().includes(query) ||
|
|
5517
5786
|
command.keywords.some(keyword => keyword.toLowerCase().includes(query)));
|
|
5518
|
-
}
|
|
5787
|
+
});
|
|
5519
5788
|
this.updateMenu = () => {
|
|
5520
5789
|
const ed = this.editor();
|
|
5521
5790
|
if (!ed) {
|
|
@@ -5571,7 +5840,7 @@ class AteSlashCommandsComponent {
|
|
|
5571
5840
|
// Use ProseMirror plugin system to intercept keys
|
|
5572
5841
|
this.addKeyboardPlugin(ed);
|
|
5573
5842
|
// updateMenu() will be called automatically when editor is ready
|
|
5574
|
-
});
|
|
5843
|
+
}, { allowSignalWrites: true });
|
|
5575
5844
|
}
|
|
5576
5845
|
ngAfterViewInit() {
|
|
5577
5846
|
this.initTippy();
|
|
@@ -5758,8 +6027,8 @@ class AteSlashCommandsComponent {
|
|
|
5758
6027
|
plugins: [keyboardPlugin, ...ed.view.state.plugins],
|
|
5759
6028
|
}));
|
|
5760
6029
|
}
|
|
5761
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
5762
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
6030
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteSlashCommandsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
6031
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AteSlashCommandsComponent, isStandalone: true, selector: "ate-slash-commands", inputs: { editor: { classPropertyName: "editor", publicName: "editor", isSignal: true, isRequired: true, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "menuRef", first: true, predicate: ["menuRef"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
5763
6032
|
<div #menuRef class="slash-commands-menu">
|
|
5764
6033
|
@for (command of filteredCommands(); track command.title) {
|
|
5765
6034
|
<div
|
|
@@ -5779,7 +6048,7 @@ class AteSlashCommandsComponent {
|
|
|
5779
6048
|
</div>
|
|
5780
6049
|
`, isInline: true, styles: [".slash-commands-menu{background:var(--ate-menu-bg);border:1px solid var(--ate-menu-border);border-radius:var(--ate-menu-border-radius, 12px);box-shadow:var(--ate-menu-shadow);padding:var(--ate-menu-padding);max-height:320px;overflow-y:auto;min-width:280px;outline:none;animation:slashMenuFadeIn .2s cubic-bezier(0,0,.2,1);scrollbar-width:thin;scrollbar-color:var(--ate-scrollbar-thumb) var(--ate-scrollbar-track)}.slash-commands-menu::-webkit-scrollbar{width:var(--ate-scrollbar-width)}.slash-commands-menu::-webkit-scrollbar-track{background:var(--ate-scrollbar-track)}.slash-commands-menu::-webkit-scrollbar-thumb{background:var(--ate-scrollbar-thumb);border:3px solid transparent;background-clip:content-box;border-radius:10px}.slash-commands-menu::-webkit-scrollbar-thumb:hover{background:var(--ate-scrollbar-thumb-hover);background-clip:content-box}@keyframes slashMenuFadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.slash-command-item{display:flex;align-items:center;gap:12px;padding:var(--ate-menu-padding);border-radius:var(--ate-menu-border-radius, 8px);cursor:pointer;transition:all .15s ease;border:var(--ate-border-width, 1px) solid transparent;outline:none;margin-bottom:2px}.slash-command-item:last-child{margin-bottom:0}.slash-command-item:hover{background:var(--ate-surface-secondary)}.slash-command-item.selected{background:var(--ate-primary-light);border-color:var(--ate-primary-light-alpha)}.slash-command-icon{display:flex;align-items:center;justify-content:center;width:32px;height:32px;background:var(--ate-surface-tertiary);border-radius:var(--ate-sub-border-radius, 8px);color:var(--ate-primary);flex-shrink:0;transition:all .15s ease}.slash-command-item.selected .slash-command-icon{background:var(--ate-primary);color:var(--ate-primary-contrast, #ffffff)}.slash-command-icon .material-symbols-outlined{font-size:18px}.slash-command-content{flex:1;min-width:0}.slash-command-title{font-weight:500;color:var(--ate-text);font-size:14px;margin-bottom:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.slash-command-description{color:var(--ate-text-secondary);font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
5781
6050
|
}
|
|
5782
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
6051
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteSlashCommandsComponent, decorators: [{
|
|
5783
6052
|
type: Component,
|
|
5784
6053
|
args: [{ selector: "ate-slash-commands", standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
5785
6054
|
<div #menuRef class="slash-commands-menu">
|
|
@@ -5800,7 +6069,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
|
|
|
5800
6069
|
}
|
|
5801
6070
|
</div>
|
|
5802
6071
|
`, styles: [".slash-commands-menu{background:var(--ate-menu-bg);border:1px solid var(--ate-menu-border);border-radius:var(--ate-menu-border-radius, 12px);box-shadow:var(--ate-menu-shadow);padding:var(--ate-menu-padding);max-height:320px;overflow-y:auto;min-width:280px;outline:none;animation:slashMenuFadeIn .2s cubic-bezier(0,0,.2,1);scrollbar-width:thin;scrollbar-color:var(--ate-scrollbar-thumb) var(--ate-scrollbar-track)}.slash-commands-menu::-webkit-scrollbar{width:var(--ate-scrollbar-width)}.slash-commands-menu::-webkit-scrollbar-track{background:var(--ate-scrollbar-track)}.slash-commands-menu::-webkit-scrollbar-thumb{background:var(--ate-scrollbar-thumb);border:3px solid transparent;background-clip:content-box;border-radius:10px}.slash-commands-menu::-webkit-scrollbar-thumb:hover{background:var(--ate-scrollbar-thumb-hover);background-clip:content-box}@keyframes slashMenuFadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.slash-command-item{display:flex;align-items:center;gap:12px;padding:var(--ate-menu-padding);border-radius:var(--ate-menu-border-radius, 8px);cursor:pointer;transition:all .15s ease;border:var(--ate-border-width, 1px) solid transparent;outline:none;margin-bottom:2px}.slash-command-item:last-child{margin-bottom:0}.slash-command-item:hover{background:var(--ate-surface-secondary)}.slash-command-item.selected{background:var(--ate-primary-light);border-color:var(--ate-primary-light-alpha)}.slash-command-icon{display:flex;align-items:center;justify-content:center;width:32px;height:32px;background:var(--ate-surface-tertiary);border-radius:var(--ate-sub-border-radius, 8px);color:var(--ate-primary);flex-shrink:0;transition:all .15s ease}.slash-command-item.selected .slash-command-icon{background:var(--ate-primary);color:var(--ate-primary-contrast, #ffffff)}.slash-command-icon .material-symbols-outlined{font-size:18px}.slash-command-content{flex:1;min-width:0}.slash-command-title{font-weight:500;color:var(--ate-text);font-size:14px;margin-bottom:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.slash-command-description{color:var(--ate-text-secondary);font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n"] }]
|
|
5803
|
-
}], ctorParameters: () => []
|
|
6072
|
+
}], ctorParameters: () => [] });
|
|
5804
6073
|
|
|
5805
6074
|
/**
|
|
5806
6075
|
* Component providing Notion-like block controls (Plus button and Drag Handle).
|
|
@@ -5808,10 +6077,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
|
|
|
5808
6077
|
class AteBlockControlsComponent {
|
|
5809
6078
|
constructor() {
|
|
5810
6079
|
this.i18n = inject(AteI18nService);
|
|
5811
|
-
this.editor = input.required(
|
|
5812
|
-
this.hoveredData = input(null
|
|
6080
|
+
this.editor = input.required();
|
|
6081
|
+
this.hoveredData = input(null);
|
|
5813
6082
|
this.menuRef = viewChild.required("menuRef");
|
|
5814
|
-
this.isInteracting = signal(false
|
|
6083
|
+
this.isInteracting = signal(false);
|
|
5815
6084
|
this.lastValidData = null;
|
|
5816
6085
|
this.lastValidRect = null;
|
|
5817
6086
|
this.tippyInstance = null;
|
|
@@ -5993,8 +6262,8 @@ class AteBlockControlsComponent {
|
|
|
5993
6262
|
onDragEnd() {
|
|
5994
6263
|
this.isInteracting.set(false);
|
|
5995
6264
|
}
|
|
5996
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
5997
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "
|
|
6265
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteBlockControlsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
6266
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.14", type: AteBlockControlsComponent, isStandalone: true, selector: "ate-block-controls", inputs: { editor: { classPropertyName: "editor", publicName: "editor", isSignal: true, isRequired: true, transformFunction: null }, hoveredData: { classPropertyName: "hoveredData", publicName: "hoveredData", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "menuRef", first: true, predicate: ["menuRef"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
5998
6267
|
<div
|
|
5999
6268
|
#menuRef
|
|
6000
6269
|
class="ate-block-controls"
|
|
@@ -6022,7 +6291,7 @@ class AteBlockControlsComponent {
|
|
|
6022
6291
|
</div>
|
|
6023
6292
|
`, isInline: true, styles: [".ate-block-controls{display:flex;align-items:center;gap:2px;padding:4px;pointer-events:auto;will-change:transform}.ate-control-btn{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:4px;border:none;background:transparent;color:var(--ate-text-secondary);cursor:pointer;transition:all .15s ease}.ate-control-btn:hover{background:var(--ate-surface-tertiary);color:var(--ate-text)}.ate-control-btn .material-symbols-outlined{font-size:18px}@media (max-width: 768px){:host{display:none!important}}\n"], dependencies: [{ kind: "directive", type: AteTooltipDirective, selector: "[ateTooltip]", inputs: ["ateTooltip", "ateTooltipPlacement", "ateTooltipDelay", "ateTooltipDisabled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
6024
6293
|
}
|
|
6025
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
6294
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteBlockControlsComponent, decorators: [{
|
|
6026
6295
|
type: Component,
|
|
6027
6296
|
args: [{ selector: "ate-block-controls", standalone: true, imports: [AteTooltipDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
6028
6297
|
<div
|
|
@@ -6051,7 +6320,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
|
|
|
6051
6320
|
</div>
|
|
6052
6321
|
</div>
|
|
6053
6322
|
`, styles: [".ate-block-controls{display:flex;align-items:center;gap:2px;padding:4px;pointer-events:auto;will-change:transform}.ate-control-btn{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:4px;border:none;background:transparent;color:var(--ate-text-secondary);cursor:pointer;transition:all .15s ease}.ate-control-btn:hover{background:var(--ate-surface-tertiary);color:var(--ate-text)}.ate-control-btn .material-symbols-outlined{font-size:18px}@media (max-width: 768px){:host{display:none!important}}\n"] }]
|
|
6054
|
-
}], ctorParameters: () => []
|
|
6323
|
+
}], ctorParameters: () => [] });
|
|
6055
6324
|
|
|
6056
6325
|
/**
|
|
6057
6326
|
* Edit Toggle Component
|
|
@@ -6059,12 +6328,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
|
|
|
6059
6328
|
*/
|
|
6060
6329
|
class AteEditToggleComponent {
|
|
6061
6330
|
constructor() {
|
|
6062
|
-
this.editable = input.required(
|
|
6063
|
-
this.translations = input.required(
|
|
6331
|
+
this.editable = input.required();
|
|
6332
|
+
this.translations = input.required();
|
|
6064
6333
|
this.editToggle = output();
|
|
6065
6334
|
}
|
|
6066
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
6067
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "
|
|
6335
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteEditToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
6336
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: AteEditToggleComponent, isStandalone: true, selector: "ate-edit-toggle", inputs: { editable: { classPropertyName: "editable", publicName: "editable", isSignal: true, isRequired: true, transformFunction: null }, translations: { classPropertyName: "translations", publicName: "translations", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { editToggle: "editToggle" }, ngImport: i0, template: `
|
|
6068
6337
|
<div class="ate-edit-toggle-container" [class.is-editable]="editable()">
|
|
6069
6338
|
<ate-button
|
|
6070
6339
|
[icon]="editable() ? 'visibility' : 'edit'"
|
|
@@ -6076,7 +6345,7 @@ class AteEditToggleComponent {
|
|
|
6076
6345
|
</div>
|
|
6077
6346
|
`, isInline: true, styles: [".ate-edit-toggle-container{position:absolute;margin-top:16px;right:16px;z-index:50}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AteButtonComponent, selector: "ate-button", inputs: ["icon", "title", "active", "disabled", "color", "backgroundColor", "variant", "size", "iconSize"], outputs: ["buttonClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
6078
6347
|
}
|
|
6079
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
6348
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteEditToggleComponent, decorators: [{
|
|
6080
6349
|
type: Component,
|
|
6081
6350
|
args: [{ selector: "ate-edit-toggle", standalone: true, imports: [CommonModule, AteButtonComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
6082
6351
|
<div class="ate-edit-toggle-container" [class.is-editable]="editable()">
|
|
@@ -6089,7 +6358,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
|
|
|
6089
6358
|
backgroundColor="var(--ate-primary-lighter)" />
|
|
6090
6359
|
</div>
|
|
6091
6360
|
`, styles: [".ate-edit-toggle-container{position:absolute;margin-top:16px;right:16px;z-index:50}\n"] }]
|
|
6092
|
-
}]
|
|
6361
|
+
}] });
|
|
6093
6362
|
|
|
6094
6363
|
/**
|
|
6095
6364
|
* Noop Value Accessor Directive
|
|
@@ -6105,8 +6374,8 @@ class AteNoopValueAccessorDirective {
|
|
|
6105
6374
|
registerOnTouched(_fn) {
|
|
6106
6375
|
/* empty */
|
|
6107
6376
|
}
|
|
6108
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
6109
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
6377
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteNoopValueAccessorDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
6378
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: AteNoopValueAccessorDirective, isStandalone: true, providers: [
|
|
6110
6379
|
{
|
|
6111
6380
|
provide: NG_VALUE_ACCESSOR,
|
|
6112
6381
|
multi: true,
|
|
@@ -6114,7 +6383,7 @@ class AteNoopValueAccessorDirective {
|
|
|
6114
6383
|
},
|
|
6115
6384
|
], ngImport: i0 }); }
|
|
6116
6385
|
}
|
|
6117
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
6386
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteNoopValueAccessorDirective, decorators: [{
|
|
6118
6387
|
type: Directive,
|
|
6119
6388
|
args: [{
|
|
6120
6389
|
standalone: true,
|
|
@@ -6161,11 +6430,11 @@ class AteAngularNodeView {
|
|
|
6161
6430
|
*/
|
|
6162
6431
|
_initNodeView(props) {
|
|
6163
6432
|
// Create signals from the props
|
|
6164
|
-
const editorSignal = signal(props.editor
|
|
6165
|
-
const nodeSignal = signal(props.node
|
|
6166
|
-
const decorationsSignal = signal(props.decorations
|
|
6167
|
-
const selectedSignal = signal(props.selected
|
|
6168
|
-
const extensionSignal = signal(props.extension
|
|
6433
|
+
const editorSignal = signal(props.editor);
|
|
6434
|
+
const nodeSignal = signal(props.node);
|
|
6435
|
+
const decorationsSignal = signal(props.decorations);
|
|
6436
|
+
const selectedSignal = signal(props.selected);
|
|
6437
|
+
const extensionSignal = signal(props.extension);
|
|
6169
6438
|
// Assign to the component
|
|
6170
6439
|
this.editor = editorSignal.asReadonly();
|
|
6171
6440
|
this.node = nodeSignal.asReadonly();
|
|
@@ -6216,10 +6485,10 @@ class AteAngularNodeView {
|
|
|
6216
6485
|
this._writableSignals.selected.set(false);
|
|
6217
6486
|
}
|
|
6218
6487
|
}
|
|
6219
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
6220
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
6488
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteAngularNodeView, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
6489
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: AteAngularNodeView, ngImport: i0 }); }
|
|
6221
6490
|
}
|
|
6222
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
6491
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteAngularNodeView, decorators: [{
|
|
6223
6492
|
type: Directive
|
|
6224
6493
|
}] });
|
|
6225
6494
|
|
|
@@ -7017,51 +7286,51 @@ class AngularTiptapEditorComponent {
|
|
|
7017
7286
|
}
|
|
7018
7287
|
constructor() {
|
|
7019
7288
|
/** Configuration globale de l'éditeur */
|
|
7020
|
-
this.config = input({}
|
|
7021
|
-
this.content = input(""
|
|
7022
|
-
this.placeholder = input(undefined
|
|
7023
|
-
this.editable = input(undefined
|
|
7024
|
-
this.disabled = input(undefined
|
|
7025
|
-
this.minHeight = input(undefined
|
|
7026
|
-
this.height = input(undefined
|
|
7027
|
-
this.maxHeight = input(undefined
|
|
7028
|
-
this.fillContainer = input(undefined
|
|
7029
|
-
this.showToolbar = input(undefined
|
|
7030
|
-
this.showFooter = input(undefined
|
|
7031
|
-
this.showCharacterCount = input(undefined
|
|
7032
|
-
this.showWordCount = input(undefined
|
|
7033
|
-
this.maxCharacters = input(undefined
|
|
7034
|
-
this.enableOfficePaste = input(undefined
|
|
7035
|
-
this.enableSlashCommands = input(undefined
|
|
7036
|
-
this.slashCommands = input(undefined
|
|
7037
|
-
this.customSlashCommands = input(undefined
|
|
7038
|
-
this.blockControls = input(
|
|
7039
|
-
this.locale = input(undefined
|
|
7040
|
-
this.autofocus = input(undefined
|
|
7041
|
-
this.seamless = input(undefined
|
|
7042
|
-
this.floatingToolbar = input(undefined
|
|
7043
|
-
this.showEditToggle = input(undefined
|
|
7044
|
-
this.spellcheck = input(undefined
|
|
7045
|
-
this.tiptapExtensions = input(undefined
|
|
7046
|
-
this.tiptapOptions = input(undefined
|
|
7289
|
+
this.config = input({});
|
|
7290
|
+
this.content = input("");
|
|
7291
|
+
this.placeholder = input(undefined);
|
|
7292
|
+
this.editable = input(undefined);
|
|
7293
|
+
this.disabled = input(undefined);
|
|
7294
|
+
this.minHeight = input(undefined);
|
|
7295
|
+
this.height = input(undefined);
|
|
7296
|
+
this.maxHeight = input(undefined);
|
|
7297
|
+
this.fillContainer = input(undefined);
|
|
7298
|
+
this.showToolbar = input(undefined);
|
|
7299
|
+
this.showFooter = input(undefined);
|
|
7300
|
+
this.showCharacterCount = input(undefined);
|
|
7301
|
+
this.showWordCount = input(undefined);
|
|
7302
|
+
this.maxCharacters = input(undefined);
|
|
7303
|
+
this.enableOfficePaste = input(undefined);
|
|
7304
|
+
this.enableSlashCommands = input(undefined);
|
|
7305
|
+
this.slashCommands = input(undefined);
|
|
7306
|
+
this.customSlashCommands = input(undefined);
|
|
7307
|
+
this.blockControls = input();
|
|
7308
|
+
this.locale = input(undefined);
|
|
7309
|
+
this.autofocus = input(undefined);
|
|
7310
|
+
this.seamless = input(undefined);
|
|
7311
|
+
this.floatingToolbar = input(undefined);
|
|
7312
|
+
this.showEditToggle = input(undefined);
|
|
7313
|
+
this.spellcheck = input(undefined);
|
|
7314
|
+
this.tiptapExtensions = input(undefined);
|
|
7315
|
+
this.tiptapOptions = input(undefined);
|
|
7047
7316
|
// Nouveaux inputs pour les bubble menus
|
|
7048
|
-
this.showBubbleMenu = input(undefined
|
|
7049
|
-
this.bubbleMenu = input(undefined
|
|
7050
|
-
this.showImageBubbleMenu = input(undefined
|
|
7051
|
-
this.imageBubbleMenu = input(undefined
|
|
7317
|
+
this.showBubbleMenu = input(undefined);
|
|
7318
|
+
this.bubbleMenu = input(undefined);
|
|
7319
|
+
this.showImageBubbleMenu = input(undefined);
|
|
7320
|
+
this.imageBubbleMenu = input(undefined);
|
|
7052
7321
|
// Configuration de la toolbar
|
|
7053
|
-
this.toolbar = input(undefined
|
|
7322
|
+
this.toolbar = input(undefined);
|
|
7054
7323
|
// Configuration des menus de table
|
|
7055
|
-
this.showTableBubbleMenu = input(undefined
|
|
7056
|
-
this.tableBubbleMenu = input(undefined
|
|
7057
|
-
this.showCellBubbleMenu = input(undefined
|
|
7058
|
-
this.cellBubbleMenu = input(undefined
|
|
7324
|
+
this.showTableBubbleMenu = input(undefined);
|
|
7325
|
+
this.tableBubbleMenu = input(undefined);
|
|
7326
|
+
this.showCellBubbleMenu = input(undefined);
|
|
7327
|
+
this.cellBubbleMenu = input(undefined);
|
|
7059
7328
|
/**
|
|
7060
7329
|
* Additionnal state calculators to extend the reactive editor state.
|
|
7061
7330
|
*/
|
|
7062
|
-
this.stateCalculators = input(undefined
|
|
7331
|
+
this.stateCalculators = input(undefined);
|
|
7063
7332
|
// Nouveau input pour la configuration de l'upload d'images
|
|
7064
|
-
this.imageUpload = input(undefined
|
|
7333
|
+
this.imageUpload = input(undefined);
|
|
7065
7334
|
/**
|
|
7066
7335
|
* Custom handler for image uploads.
|
|
7067
7336
|
* When provided, images will be processed through this handler instead of being converted to base64.
|
|
@@ -7081,7 +7350,7 @@ class AngularTiptapEditorComponent {
|
|
|
7081
7350
|
* // <angular-tiptap-editor [imageUploadHandler]="myUploadHandler" />
|
|
7082
7351
|
* ```
|
|
7083
7352
|
*/
|
|
7084
|
-
this.imageUploadHandler = input(undefined
|
|
7353
|
+
this.imageUploadHandler = input(undefined);
|
|
7085
7354
|
// Nouveaux outputs
|
|
7086
7355
|
this.contentChange = output();
|
|
7087
7356
|
this.editorCreated = output();
|
|
@@ -7092,12 +7361,12 @@ class AngularTiptapEditorComponent {
|
|
|
7092
7361
|
// ViewChild with signal
|
|
7093
7362
|
this.editorElement = viewChild.required("editorElement");
|
|
7094
7363
|
// Private signals for internal state
|
|
7095
|
-
this._editor = signal(null
|
|
7096
|
-
this._characterCount = signal(0
|
|
7097
|
-
this._wordCount = signal(0
|
|
7098
|
-
this._isDragOver = signal(false
|
|
7099
|
-
this._editorFullyInitialized = signal(false
|
|
7100
|
-
this._hoveredBlock = signal(null
|
|
7364
|
+
this._editor = signal(null);
|
|
7365
|
+
this._characterCount = signal(0);
|
|
7366
|
+
this._wordCount = signal(0);
|
|
7367
|
+
this._isDragOver = signal(false);
|
|
7368
|
+
this._editorFullyInitialized = signal(false);
|
|
7369
|
+
this._hoveredBlock = signal(null);
|
|
7101
7370
|
// Anti-echo: track last emitted HTML to prevent cursor reset on parent echo
|
|
7102
7371
|
this.lastEmittedHtml = null;
|
|
7103
7372
|
// Read-only access to signals
|
|
@@ -7107,12 +7376,12 @@ class AngularTiptapEditorComponent {
|
|
|
7107
7376
|
this.isDragOver = this._isDragOver.asReadonly();
|
|
7108
7377
|
this.editorFullyInitialized = this._editorFullyInitialized.asReadonly();
|
|
7109
7378
|
this.hoveredBlock = this._hoveredBlock.asReadonly();
|
|
7110
|
-
this._isFormControlDisabled = signal(false
|
|
7379
|
+
this._isFormControlDisabled = signal(false);
|
|
7111
7380
|
this.isFormControlDisabled = this._isFormControlDisabled.asReadonly();
|
|
7112
7381
|
// Combined disabled state (Input + FormControl)
|
|
7113
|
-
this.mergedDisabled = computed(() => (this.disabled() ?? this.effectiveConfig().disabled) || this.isFormControlDisabled()
|
|
7382
|
+
this.mergedDisabled = computed(() => (this.disabled() ?? this.effectiveConfig().disabled) || this.isFormControlDisabled());
|
|
7114
7383
|
// Computed for editor states
|
|
7115
|
-
this.isEditorReady = computed(() => this.editor() !== null
|
|
7384
|
+
this.isEditorReady = computed(() => this.editor() !== null);
|
|
7116
7385
|
// ============================================
|
|
7117
7386
|
// UNIFIED CONFIGURATION COMPUTED PROPERTIES
|
|
7118
7387
|
// ============================================
|
|
@@ -7124,30 +7393,30 @@ class AngularTiptapEditorComponent {
|
|
|
7124
7393
|
}
|
|
7125
7394
|
const fromConfig = this.effectiveConfig().mode;
|
|
7126
7395
|
return fromConfig === "seamless";
|
|
7127
|
-
}
|
|
7128
|
-
this.finalEditable = computed(() => this.editable() ?? this.effectiveConfig().editable ?? true
|
|
7396
|
+
});
|
|
7397
|
+
this.finalEditable = computed(() => this.editable() ?? this.effectiveConfig().editable ?? true);
|
|
7129
7398
|
this.finalPlaceholder = computed(() => this.placeholder() ??
|
|
7130
7399
|
this.effectiveConfig().placeholder ??
|
|
7131
|
-
this.currentTranslations().editor.placeholder
|
|
7132
|
-
this.finalFillContainer = computed(() => this.fillContainer() ?? this.effectiveConfig().fillContainer
|
|
7133
|
-
this.finalShowFooter = computed(() => this.showFooter() ?? this.effectiveConfig().showFooter ?? true
|
|
7134
|
-
this.finalShowEditToggle = computed(() => this.showEditToggle() ?? this.effectiveConfig().showEditToggle ?? false
|
|
7400
|
+
this.currentTranslations().editor.placeholder);
|
|
7401
|
+
this.finalFillContainer = computed(() => this.fillContainer() ?? this.effectiveConfig().fillContainer);
|
|
7402
|
+
this.finalShowFooter = computed(() => this.showFooter() ?? this.effectiveConfig().showFooter ?? true);
|
|
7403
|
+
this.finalShowEditToggle = computed(() => this.showEditToggle() ?? this.effectiveConfig().showEditToggle ?? false);
|
|
7135
7404
|
this.finalHeight = computed(() => {
|
|
7136
7405
|
const h = this.height() ?? this.effectiveConfig().height;
|
|
7137
7406
|
return typeof h === "number" ? `${h}px` : h;
|
|
7138
|
-
}
|
|
7407
|
+
});
|
|
7139
7408
|
this.finalMinHeight = computed(() => {
|
|
7140
7409
|
const mh = this.minHeight() ?? this.effectiveConfig().minHeight;
|
|
7141
7410
|
return typeof mh === "number" ? `${mh}px` : mh;
|
|
7142
|
-
}
|
|
7411
|
+
});
|
|
7143
7412
|
this.finalMaxHeight = computed(() => {
|
|
7144
7413
|
const mh = this.maxHeight() ?? this.effectiveConfig().maxHeight;
|
|
7145
7414
|
return typeof mh === "number" ? `${mh}px` : mh;
|
|
7146
|
-
}
|
|
7147
|
-
this.finalSpellcheck = computed(() => this.spellcheck() ?? this.effectiveConfig().spellcheck ?? true
|
|
7148
|
-
this.finalEnableOfficePaste = computed(() => this.enableOfficePaste() ?? this.effectiveConfig().enableOfficePaste ?? true
|
|
7415
|
+
});
|
|
7416
|
+
this.finalSpellcheck = computed(() => this.spellcheck() ?? this.effectiveConfig().spellcheck ?? true);
|
|
7417
|
+
this.finalEnableOfficePaste = computed(() => this.enableOfficePaste() ?? this.effectiveConfig().enableOfficePaste ?? true);
|
|
7149
7418
|
// Features
|
|
7150
|
-
this.finalShowToolbar = computed(() => this.showToolbar() ?? this.effectiveConfig().showToolbar ?? true
|
|
7419
|
+
this.finalShowToolbar = computed(() => this.showToolbar() ?? this.effectiveConfig().showToolbar ?? true);
|
|
7151
7420
|
this.finalToolbarConfig = computed(() => {
|
|
7152
7421
|
const fromInput = this.toolbar();
|
|
7153
7422
|
const fromConfig = this.effectiveConfig().toolbar;
|
|
@@ -7159,9 +7428,9 @@ class AngularTiptapEditorComponent {
|
|
|
7159
7428
|
return { ...base, ...fromConfig };
|
|
7160
7429
|
}
|
|
7161
7430
|
return base;
|
|
7162
|
-
}
|
|
7163
|
-
this.finalFloatingToolbar = computed(() => this.floatingToolbar() ?? this.effectiveConfig().floatingToolbar ?? false
|
|
7164
|
-
this.finalShowBubbleMenu = computed(() => this.showBubbleMenu() ?? this.effectiveConfig().showBubbleMenu ?? true
|
|
7431
|
+
});
|
|
7432
|
+
this.finalFloatingToolbar = computed(() => this.floatingToolbar() ?? this.effectiveConfig().floatingToolbar ?? false);
|
|
7433
|
+
this.finalShowBubbleMenu = computed(() => this.showBubbleMenu() ?? this.effectiveConfig().showBubbleMenu ?? true);
|
|
7165
7434
|
this.finalBubbleMenuConfig = computed(() => {
|
|
7166
7435
|
const fromInput = this.bubbleMenu();
|
|
7167
7436
|
const fromConfig = this.effectiveConfig().bubbleMenu;
|
|
@@ -7173,8 +7442,8 @@ class AngularTiptapEditorComponent {
|
|
|
7173
7442
|
return { ...base, ...fromConfig };
|
|
7174
7443
|
}
|
|
7175
7444
|
return base;
|
|
7176
|
-
}
|
|
7177
|
-
this.finalShowImageBubbleMenu = computed(() => this.showImageBubbleMenu() ?? this.effectiveConfig().showImageBubbleMenu ?? true
|
|
7445
|
+
});
|
|
7446
|
+
this.finalShowImageBubbleMenu = computed(() => this.showImageBubbleMenu() ?? this.effectiveConfig().showImageBubbleMenu ?? true);
|
|
7178
7447
|
this.finalImageBubbleMenuConfig = computed(() => {
|
|
7179
7448
|
const fromInput = this.imageBubbleMenu();
|
|
7180
7449
|
const fromConfig = this.effectiveConfig().imageBubbleMenu;
|
|
@@ -7186,8 +7455,8 @@ class AngularTiptapEditorComponent {
|
|
|
7186
7455
|
return { ...base, ...fromConfig };
|
|
7187
7456
|
}
|
|
7188
7457
|
return base;
|
|
7189
|
-
}
|
|
7190
|
-
this.finalShowTableBubbleMenu = computed(() => this.showTableBubbleMenu() ?? this.effectiveConfig().showTableMenu ?? true
|
|
7458
|
+
});
|
|
7459
|
+
this.finalShowTableBubbleMenu = computed(() => this.showTableBubbleMenu() ?? this.effectiveConfig().showTableMenu ?? true);
|
|
7191
7460
|
this.finalTableBubbleMenuConfig = computed(() => {
|
|
7192
7461
|
const fromInput = this.tableBubbleMenu();
|
|
7193
7462
|
const fromConfig = this.effectiveConfig().tableBubbleMenu;
|
|
@@ -7199,8 +7468,8 @@ class AngularTiptapEditorComponent {
|
|
|
7199
7468
|
return { ...base, ...fromConfig };
|
|
7200
7469
|
}
|
|
7201
7470
|
return base;
|
|
7202
|
-
}
|
|
7203
|
-
this.finalShowCellBubbleMenu = computed(() => this.showCellBubbleMenu() ?? this.effectiveConfig().showCellMenu ?? true
|
|
7471
|
+
});
|
|
7472
|
+
this.finalShowCellBubbleMenu = computed(() => this.showCellBubbleMenu() ?? this.effectiveConfig().showCellMenu ?? true);
|
|
7204
7473
|
this.finalCellBubbleMenuConfig = computed(() => {
|
|
7205
7474
|
const fromInput = this.cellBubbleMenu();
|
|
7206
7475
|
const fromConfig = this.effectiveConfig().cellBubbleMenu;
|
|
@@ -7212,8 +7481,8 @@ class AngularTiptapEditorComponent {
|
|
|
7212
7481
|
return { ...base, ...fromConfig };
|
|
7213
7482
|
}
|
|
7214
7483
|
return base;
|
|
7215
|
-
}
|
|
7216
|
-
this.finalEnableSlashCommands = computed(() => this.enableSlashCommands() ?? this.effectiveConfig().enableSlashCommands ?? true
|
|
7484
|
+
});
|
|
7485
|
+
this.finalEnableSlashCommands = computed(() => this.enableSlashCommands() ?? this.effectiveConfig().enableSlashCommands ?? true);
|
|
7217
7486
|
this.finalSlashCommandsConfig = computed(() => {
|
|
7218
7487
|
const fromInputComponent = this.customSlashCommands();
|
|
7219
7488
|
const fromConfigComponent = this.effectiveConfig().customSlashCommands;
|
|
@@ -7229,19 +7498,19 @@ class AngularTiptapEditorComponent {
|
|
|
7229
7498
|
return {
|
|
7230
7499
|
commands: filterSlashCommands(baseConfig || {}, this.i18nService, this.editorCommandsService, this.finalImageUploadConfig()),
|
|
7231
7500
|
};
|
|
7232
|
-
}
|
|
7501
|
+
});
|
|
7233
7502
|
// Behavior
|
|
7234
|
-
this.finalAutofocus = computed(() => this.autofocus() ?? this.effectiveConfig().autofocus
|
|
7235
|
-
this.finalMaxCharacters = computed(() => this.maxCharacters() ?? this.effectiveConfig().maxCharacters
|
|
7236
|
-
this.finalBlockControls = computed(() => this.blockControls() ?? this.effectiveConfig().blockControls ?? "none"
|
|
7237
|
-
this.finalShowCharacterCount = computed(() => this.showCharacterCount() ?? this.effectiveConfig().showCharacterCount ?? true
|
|
7238
|
-
this.finalShowWordCount = computed(() => this.showWordCount() ?? this.effectiveConfig().showWordCount ?? true
|
|
7239
|
-
this.finalLocale = computed(() => this.locale() ?? this.effectiveConfig().locale
|
|
7503
|
+
this.finalAutofocus = computed(() => this.autofocus() ?? this.effectiveConfig().autofocus);
|
|
7504
|
+
this.finalMaxCharacters = computed(() => this.maxCharacters() ?? this.effectiveConfig().maxCharacters);
|
|
7505
|
+
this.finalBlockControls = computed(() => this.blockControls() ?? this.effectiveConfig().blockControls ?? "none");
|
|
7506
|
+
this.finalShowCharacterCount = computed(() => this.showCharacterCount() ?? this.effectiveConfig().showCharacterCount ?? true);
|
|
7507
|
+
this.finalShowWordCount = computed(() => this.showWordCount() ?? this.effectiveConfig().showWordCount ?? true);
|
|
7508
|
+
this.finalLocale = computed(() => this.locale() ?? this.effectiveConfig().locale);
|
|
7240
7509
|
// Extensions & Options
|
|
7241
|
-
this.finalTiptapExtensions = computed(() => this.tiptapExtensions() ?? this.effectiveConfig().tiptapExtensions ?? []
|
|
7242
|
-
this.finalTiptapOptions = computed(() => this.tiptapOptions() ?? this.effectiveConfig().tiptapOptions ?? {}
|
|
7243
|
-
this.finalStateCalculators = computed(() => this.stateCalculators() ?? this.effectiveConfig().stateCalculators ?? []
|
|
7244
|
-
this.finalAngularNodesConfig = computed(() => this.effectiveConfig().angularNodes ?? []
|
|
7510
|
+
this.finalTiptapExtensions = computed(() => this.tiptapExtensions() ?? this.effectiveConfig().tiptapExtensions ?? []);
|
|
7511
|
+
this.finalTiptapOptions = computed(() => this.tiptapOptions() ?? this.effectiveConfig().tiptapOptions ?? {});
|
|
7512
|
+
this.finalStateCalculators = computed(() => this.stateCalculators() ?? this.effectiveConfig().stateCalculators ?? []);
|
|
7513
|
+
this.finalAngularNodesConfig = computed(() => this.effectiveConfig().angularNodes ?? []);
|
|
7245
7514
|
// Image Upload
|
|
7246
7515
|
this.finalImageUploadConfig = computed(() => {
|
|
7247
7516
|
const fromInput = this.imageUpload();
|
|
@@ -7256,8 +7525,8 @@ class AngularTiptapEditorComponent {
|
|
|
7256
7525
|
...merged,
|
|
7257
7526
|
maxSize: (merged.maxSize ?? 5) * 1024 * 1024, // Convert MB to bytes for internal service
|
|
7258
7527
|
};
|
|
7259
|
-
}
|
|
7260
|
-
this.finalImageUploadHandler = computed(() => this.imageUploadHandler() ?? this.effectiveConfig().imageUpload?.handler
|
|
7528
|
+
});
|
|
7529
|
+
this.finalImageUploadHandler = computed(() => this.imageUploadHandler() ?? this.effectiveConfig().imageUpload?.handler);
|
|
7261
7530
|
// Computed for current translations (allows per-instance override via config or input)
|
|
7262
7531
|
this.currentTranslations = computed(() => {
|
|
7263
7532
|
const localeOverride = this.finalLocale();
|
|
@@ -7266,7 +7535,7 @@ class AngularTiptapEditorComponent {
|
|
|
7266
7535
|
return allTranslations[localeOverride] || this.i18nService.translations();
|
|
7267
7536
|
}
|
|
7268
7537
|
return this.i18nService.translations();
|
|
7269
|
-
}
|
|
7538
|
+
});
|
|
7270
7539
|
this._destroyRef = inject(DestroyRef);
|
|
7271
7540
|
// NgControl for management of FormControls
|
|
7272
7541
|
this.ngControl = inject(NgControl, { self: true, optional: true });
|
|
@@ -7284,7 +7553,7 @@ class AngularTiptapEditorComponent {
|
|
|
7284
7553
|
const fromInput = this.config();
|
|
7285
7554
|
const fromGlobal = this.globalConfig || {};
|
|
7286
7555
|
return { ...ATE_DEFAULT_CONFIG, ...fromGlobal, ...fromInput };
|
|
7287
|
-
}
|
|
7556
|
+
});
|
|
7288
7557
|
// Effect to update editor content (with anti-echo)
|
|
7289
7558
|
effect(() => {
|
|
7290
7559
|
const content = this.content(); // Sole reactive dependency
|
|
@@ -7308,7 +7577,7 @@ class AngularTiptapEditorComponent {
|
|
|
7308
7577
|
}
|
|
7309
7578
|
editor.commands.setContent(content, { emitUpdate: false });
|
|
7310
7579
|
});
|
|
7311
|
-
});
|
|
7580
|
+
}, { allowSignalWrites: true });
|
|
7312
7581
|
// Effect to update height properties
|
|
7313
7582
|
effect(() => {
|
|
7314
7583
|
const minHeight = this.finalMinHeight();
|
|
@@ -7323,7 +7592,7 @@ class AngularTiptapEditorComponent {
|
|
|
7323
7592
|
element.style.setProperty("--editor-max-height", maxHeight ?? "none");
|
|
7324
7593
|
element.style.setProperty("--editor-overflow", needsScroll ? "auto" : "visible");
|
|
7325
7594
|
}
|
|
7326
|
-
});
|
|
7595
|
+
}, { allowSignalWrites: true });
|
|
7327
7596
|
// Effect to monitor editability changes
|
|
7328
7597
|
effect(() => {
|
|
7329
7598
|
const currentEditor = this.editor();
|
|
@@ -7334,12 +7603,12 @@ class AngularTiptapEditorComponent {
|
|
|
7334
7603
|
if (currentEditor) {
|
|
7335
7604
|
this.editorCommandsService.setEditable(currentEditor, isEditable);
|
|
7336
7605
|
}
|
|
7337
|
-
});
|
|
7606
|
+
}, { allowSignalWrites: true });
|
|
7338
7607
|
// Effect to synchronize image upload handler with the service
|
|
7339
7608
|
effect(() => {
|
|
7340
7609
|
const handler = this.finalImageUploadHandler();
|
|
7341
7610
|
this.editorCommandsService.uploadHandler = handler || null;
|
|
7342
|
-
});
|
|
7611
|
+
}, { allowSignalWrites: true });
|
|
7343
7612
|
// Effect to update character count limit dynamically
|
|
7344
7613
|
effect(() => {
|
|
7345
7614
|
const editor = this.editor();
|
|
@@ -7350,7 +7619,7 @@ class AngularTiptapEditorComponent {
|
|
|
7350
7619
|
characterCountExtension.options.limit = limit;
|
|
7351
7620
|
}
|
|
7352
7621
|
}
|
|
7353
|
-
});
|
|
7622
|
+
}, { allowSignalWrites: true });
|
|
7354
7623
|
// Effect to re-initialize editor when technical configuration changes
|
|
7355
7624
|
effect(() => {
|
|
7356
7625
|
// Monitor technical dependencies
|
|
@@ -7369,7 +7638,7 @@ class AngularTiptapEditorComponent {
|
|
|
7369
7638
|
}
|
|
7370
7639
|
}
|
|
7371
7640
|
});
|
|
7372
|
-
});
|
|
7641
|
+
}, { allowSignalWrites: true });
|
|
7373
7642
|
}
|
|
7374
7643
|
ngAfterViewInit() {
|
|
7375
7644
|
// La vue est déjà complètement initialisée dans ngAfterViewInit
|
|
@@ -7693,8 +7962,8 @@ class AngularTiptapEditorComponent {
|
|
|
7693
7962
|
}, 0);
|
|
7694
7963
|
}
|
|
7695
7964
|
}
|
|
7696
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
7697
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
7965
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AngularTiptapEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
7966
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AngularTiptapEditorComponent, isStandalone: true, selector: "angular-tiptap-editor", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, editable: { classPropertyName: "editable", publicName: "editable", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, minHeight: { classPropertyName: "minHeight", publicName: "minHeight", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, maxHeight: { classPropertyName: "maxHeight", publicName: "maxHeight", isSignal: true, isRequired: false, transformFunction: null }, fillContainer: { classPropertyName: "fillContainer", publicName: "fillContainer", isSignal: true, isRequired: false, transformFunction: null }, showToolbar: { classPropertyName: "showToolbar", publicName: "showToolbar", isSignal: true, isRequired: false, transformFunction: null }, showFooter: { classPropertyName: "showFooter", publicName: "showFooter", isSignal: true, isRequired: false, transformFunction: null }, showCharacterCount: { classPropertyName: "showCharacterCount", publicName: "showCharacterCount", isSignal: true, isRequired: false, transformFunction: null }, showWordCount: { classPropertyName: "showWordCount", publicName: "showWordCount", isSignal: true, isRequired: false, transformFunction: null }, maxCharacters: { classPropertyName: "maxCharacters", publicName: "maxCharacters", isSignal: true, isRequired: false, transformFunction: null }, enableOfficePaste: { classPropertyName: "enableOfficePaste", publicName: "enableOfficePaste", isSignal: true, isRequired: false, transformFunction: null }, enableSlashCommands: { classPropertyName: "enableSlashCommands", publicName: "enableSlashCommands", isSignal: true, isRequired: false, transformFunction: null }, slashCommands: { classPropertyName: "slashCommands", publicName: "slashCommands", isSignal: true, isRequired: false, transformFunction: null }, customSlashCommands: { classPropertyName: "customSlashCommands", publicName: "customSlashCommands", isSignal: true, isRequired: false, transformFunction: null }, blockControls: { classPropertyName: "blockControls", publicName: "blockControls", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, autofocus: { classPropertyName: "autofocus", publicName: "autofocus", isSignal: true, isRequired: false, transformFunction: null }, seamless: { classPropertyName: "seamless", publicName: "seamless", isSignal: true, isRequired: false, transformFunction: null }, floatingToolbar: { classPropertyName: "floatingToolbar", publicName: "floatingToolbar", isSignal: true, isRequired: false, transformFunction: null }, showEditToggle: { classPropertyName: "showEditToggle", publicName: "showEditToggle", isSignal: true, isRequired: false, transformFunction: null }, spellcheck: { classPropertyName: "spellcheck", publicName: "spellcheck", isSignal: true, isRequired: false, transformFunction: null }, tiptapExtensions: { classPropertyName: "tiptapExtensions", publicName: "tiptapExtensions", isSignal: true, isRequired: false, transformFunction: null }, tiptapOptions: { classPropertyName: "tiptapOptions", publicName: "tiptapOptions", isSignal: true, isRequired: false, transformFunction: null }, showBubbleMenu: { classPropertyName: "showBubbleMenu", publicName: "showBubbleMenu", isSignal: true, isRequired: false, transformFunction: null }, bubbleMenu: { classPropertyName: "bubbleMenu", publicName: "bubbleMenu", isSignal: true, isRequired: false, transformFunction: null }, showImageBubbleMenu: { classPropertyName: "showImageBubbleMenu", publicName: "showImageBubbleMenu", isSignal: true, isRequired: false, transformFunction: null }, imageBubbleMenu: { classPropertyName: "imageBubbleMenu", publicName: "imageBubbleMenu", isSignal: true, isRequired: false, transformFunction: null }, toolbar: { classPropertyName: "toolbar", publicName: "toolbar", isSignal: true, isRequired: false, transformFunction: null }, showTableBubbleMenu: { classPropertyName: "showTableBubbleMenu", publicName: "showTableBubbleMenu", isSignal: true, isRequired: false, transformFunction: null }, tableBubbleMenu: { classPropertyName: "tableBubbleMenu", publicName: "tableBubbleMenu", isSignal: true, isRequired: false, transformFunction: null }, showCellBubbleMenu: { classPropertyName: "showCellBubbleMenu", publicName: "showCellBubbleMenu", isSignal: true, isRequired: false, transformFunction: null }, cellBubbleMenu: { classPropertyName: "cellBubbleMenu", publicName: "cellBubbleMenu", isSignal: true, isRequired: false, transformFunction: null }, stateCalculators: { classPropertyName: "stateCalculators", publicName: "stateCalculators", isSignal: true, isRequired: false, transformFunction: null }, imageUpload: { classPropertyName: "imageUpload", publicName: "imageUpload", isSignal: true, isRequired: false, transformFunction: null }, imageUploadHandler: { classPropertyName: "imageUploadHandler", publicName: "imageUploadHandler", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { contentChange: "contentChange", editorCreated: "editorCreated", editorUpdate: "editorUpdate", editorFocus: "editorFocus", editorBlur: "editorBlur", editableChange: "editableChange" }, host: { properties: { "class.fill-container": "finalFillContainer()", "class.floating-toolbar": "finalFloatingToolbar()", "class.is-readonly": "!finalEditable() && !mergedDisabled()", "class.is-disabled": "mergedDisabled()", "style.--ate-border-width": "finalSeamless() || mergedDisabled() ? '0' : null", "style.--ate-background": "finalSeamless() ? 'transparent' : (mergedDisabled() ? 'var(--ate-surface-tertiary)' : null)", "style.--ate-toolbar-border-color": "finalSeamless() ? 'transparent' : null", "style.--ate-counter-background": "finalSeamless() ? 'transparent' : null", "style.--ate-counter-border-color": "finalSeamless() ? 'transparent' : null", "class.dark": "config().theme === 'dark'", "class.ate-blocks-inside": "finalBlockControls() === 'inside'", "class.ate-blocks-outside": "finalBlockControls() === 'outside'", "attr.data-theme": "config().theme" } }, providers: [AteEditorCommandsService, AteImageService, AteColorPickerService, AteLinkService, AteExportService], viewQueries: [{ propertyName: "editorElement", first: true, predicate: ["editorElement"], descendants: true, isSignal: true }], hostDirectives: [{ directive: AteNoopValueAccessorDirective }], ngImport: i0, template: `
|
|
7698
7967
|
<div class="ate-editor">
|
|
7699
7968
|
<!-- Toolbar -->
|
|
7700
7969
|
@if (finalEditable() && !mergedDisabled() && finalShowToolbar() && editor()) {
|
|
@@ -7822,7 +8091,7 @@ class AngularTiptapEditorComponent {
|
|
|
7822
8091
|
</div>
|
|
7823
8092
|
`, isInline: true, styles: [":host{--ate-primary: #2563eb;--ate-primary-hover: #153ca9;--ate-primary-contrast: #ffffff;--ate-primary-light: color-mix(in srgb, var(--ate-primary), transparent 90%);--ate-primary-lighter: color-mix(in srgb, var(--ate-primary), transparent 95%);--ate-primary-light-alpha: color-mix(in srgb, var(--ate-primary), transparent 85%);--ate-surface: #ffffff;--ate-surface-secondary: #f8f9fa;--ate-surface-tertiary: #f1f5f9;--ate-text: #2d3748;--ate-text-secondary: #64748b;--ate-text-muted: #a0aec0;--ate-border: #e2e8f0;--ate-highlight-bg: #fef08a;--ate-highlight-color: #854d0e;--ate-button-hover: #f1f5f9;--ate-button-active: #e2e8f0;--ate-selection-bg: var(--ate-primary-light-alpha);--ate-error-color: #c53030;--ate-error-bg: #fed7d7;--ate-error-border: #feb2b2;--ate-border-color: var(--ate-border);--ate-border-width: 2px;--ate-border-radius: 12px;--ate-focus-color: var(--ate-primary);--ate-background: var(--ate-surface);--ate-sub-border-radius: 8px;--ate-text-color: var(--ate-text);--ate-placeholder-color: var(--ate-text-muted);--ate-line-height: 1.6;--ate-content-padding-block: 16px;--ate-content-padding-inline: 16px;--ate-content-gutter: 0px;--ate-menu-bg: var(--ate-surface);--ate-menu-border-radius: var(--ate-border-radius);--ate-menu-border: var(--ate-border);--ate-menu-shadow: 0 10px 15px -3px rgba(0, 0, 0, .1), 0 4px 6px -2px rgba(0, 0, 0, .05);--ate-menu-padding: 4px;--ate-menu-gap: 2px;--ate-toolbar-padding: var(--ate-menu-padding);--ate-toolbar-gap: var(--ate-menu-gap);--ate-toolbar-background: var(--ate-surface-secondary);--ate-toolbar-border-color: var(--ate-border);--ate-toolbar-button-color: var(--ate-text-secondary);--ate-toolbar-button-hover-background: transparent;--ate-toolbar-button-active-background: var(--ate-primary-light);--ate-toolbar-button-active-color: var(--ate-primary);--ate-counter-color: var(--ate-text-secondary);--ate-counter-background: var(--ate-surface-secondary);--ate-counter-border-color: var(--ate-border);--ate-drag-background: #f0f8ff;--ate-drag-border-color: var(--ate-primary);--ate-blockquote-border-color: var(--ate-border);--ate-blockquote-background: var(--ate-surface-secondary);--ate-code-background: var(--ate-surface-secondary);--ate-code-color: var(--ate-text);--ate-code-border-color: var(--ate-border);--ate-code-block-background: #0f172a;--ate-code-block-color: #e2e8f0;--ate-code-block-border-color: var(--ate-border);--ate-image-border-radius: 16px;--ate-image-selected-color: var(--ate-primary);--ate-scrollbar-width: 10px;--ate-scrollbar-thumb: var(--ate-border);--ate-scrollbar-thumb-hover: var(--ate-text-muted);--ate-scrollbar-track: transparent;--ate-table-border-color: var(--ate-border);--ate-table-header-background: var(--ate-surface-secondary);--ate-table-header-color: var(--ate-text);--ate-table-cell-background: var(--ate-surface);--ate-table-cell-selected-background: var(--ate-primary-light);--ate-table-resize-handle-color: var(--ate-primary);--ate-table-row-hover-background: var(--ate-primary-lighter);--ate-tooltip-bg: var(--ate-code-block-background, #0f172a);--ate-tooltip-color: var(--ate-code-block-color, #e2e8f0)}:host(.dark),:host([data-theme=\"dark\"]){--ate-primary: #3b82f6;--ate-primary-contrast: #ffffff;--ate-primary-light: color-mix(in srgb, var(--ate-primary), transparent 85%);--ate-primary-lighter: color-mix(in srgb, var(--ate-primary), transparent 92%);--ate-primary-light-alpha: color-mix(in srgb, var(--ate-primary), transparent 80%);--ate-surface: #020617;--ate-surface-secondary: #0f172a;--ate-surface-tertiary: #1e293b;--ate-text: #f8fafc;--ate-text-secondary: #94a3b8;--ate-text-muted: #64748b;--ate-border: #1e293b;--ate-highlight-bg: #854d0e;--ate-highlight-color: #fef08a;--ate-button-hover: #1e293b;--ate-button-active: #0f172a;--ate-menu-border: rgba(255, 255, 255, .1);--ate-menu-shadow: 0 20px 25px -5px rgba(0, 0, 0, .3), 0 10px 10px -5px rgba(0, 0, 0, .2);--ate-error-color: #f87171;--ate-error-bg: #450a0a;--ate-error-border: #7f1d1d;--ate-drag-background: var(--ate-surface-tertiary);--ate-drag-border-color: var(--ate-primary);--ate-blockquote-border-color: var(--ate-primary);--ate-toolbar-button-active-background: var(--ate-primary-light);--ate-toolbar-button-active-color: var(--ate-primary);--ate-button-hover: var(--ate-surface-tertiary);--ate-button-active: var(--ate-surface-secondary);--ate-scrollbar-thumb: var(--ate-surface-tertiary);--ate-scrollbar-thumb-hover: var(--ate-text-muted)}:host(.fill-container){display:block;height:100%}.ate-editor{border:var(--ate-border-width) solid var(--ate-border-color);border-radius:var(--ate-border-radius);background:var(--ate-background);overflow:visible;transition:border-color .2s ease;position:relative}:host(.floating-toolbar) .ate-editor{overflow:visible}:host(.fill-container) .ate-editor{display:flex;flex-direction:column;height:100%}:host(.fill-container) .ate-content-wrapper{flex:1;min-height:0}:host(.fill-container) .ate-content{flex:1;min-height:0;overflow-y:auto}.ate-editor:focus-within{border-color:var(--ate-focus-color)}.ate-content{min-height:var(--editor-min-height, 200px);height:var(--editor-height, auto);max-height:var(--editor-max-height, none);overflow-y:var(--editor-overflow, visible);outline:none;position:relative;scrollbar-width:thin;scrollbar-color:var(--ate-scrollbar-thumb) var(--ate-scrollbar-track)}:host(.is-disabled) .ate-content{cursor:not-allowed;opacity:.7;-webkit-user-select:none;user-select:none;pointer-events:none;background-color:var(--ate-surface-tertiary)}:host(.is-readonly) .ate-content{cursor:default;-webkit-user-select:text;user-select:text}:host(.is-readonly) .ate-content ::ng-deep .ate-link{cursor:pointer;pointer-events:auto}.ate-content::-webkit-scrollbar{width:var(--ate-scrollbar-width)}.ate-content-wrapper{position:relative;display:flex;flex-direction:column;min-height:0}.ate-content-wrapper .ate-content{flex:1}.ate-content::-webkit-scrollbar-track{background:var(--ate-scrollbar-track)}.ate-content::-webkit-scrollbar-thumb{background:var(--ate-scrollbar-thumb);border:3px solid transparent;background-clip:content-box;border-radius:10px}.ate-content::-webkit-scrollbar-thumb:hover{background:var(--ate-scrollbar-thumb-hover);background-clip:content-box}.ate-content.drag-over{background:var(--ate-drag-background);border:2px dashed var(--ate-drag-border-color)}.character-count{padding:6px 8px;font-size:12px;color:var(--ate-counter-color);text-align:right;border-top:1px solid var(--ate-counter-border-color);background:var(--ate-counter-background);transition:color .2s ease;border-bottom-left-radius:calc(var(--ate-border-radius) - var(--ate-border-width));border-bottom-right-radius:calc(var(--ate-border-radius) - var(--ate-border-width))}.character-count.limit-reached{color:var(--ate-error-color, #ef4444);font-weight:600}:host.ate-blocks-inside{--ate-content-gutter: 54px}@media (max-width: 768px){:host.ate-blocks-inside{--ate-content-gutter: 0px}ate-block-controls{display:none!important}}:host ::ng-deep .ProseMirror{padding-inline:calc(var(--ate-content-padding-inline) + var(--ate-content-gutter));padding-block:var(--ate-content-padding-block);outline:none;line-height:var(--ate-line-height);color:var(--ate-text-color);min-height:100%;height:100%;word-wrap:break-word;overflow-wrap:break-word}:host ::ng-deep .ProseMirror ::selection{background-color:var(--ate-selection-bg);color:inherit}:host ::ng-deep .ProseMirror ::-moz-selection{background-color:var(--ate-selection-bg);color:inherit}:host ::ng-deep .ProseMirror h1{font-size:2em;font-weight:700;margin-top:0;margin-bottom:.5em}:host ::ng-deep .ProseMirror h2{font-size:1.5em;font-weight:700;margin-top:1em;margin-bottom:.5em}:host ::ng-deep .ProseMirror h3{font-size:1.25em;font-weight:700;margin-top:1em;margin-bottom:.5em}:host ::ng-deep .ProseMirror p{margin:.5em 0}:host ::ng-deep .ProseMirror ul,:host ::ng-deep .ProseMirror ol{padding-left:2em;margin:.5em 0}:host ::ng-deep .ProseMirror blockquote{border-left:4px solid var(--ate-blockquote-border-color);margin:1em 0;background:var(--ate-blockquote-background);padding:.5em 1em;border-radius:0 4px 4px 0}:host ::ng-deep .ProseMirror code{background:var(--ate-code-background);color:var(--ate-code-color);border:1px solid var(--ate-code-border-color);padding:.15em .4em;border-radius:4px;font-family:JetBrains Mono,Fira Code,Monaco,Consolas,monospace;font-size:.85em;font-weight:500}:host ::ng-deep .ProseMirror pre{background:var(--ate-code-block-background);color:var(--ate-code-block-color);border:1px solid var(--ate-code-block-border-color);padding:1em;border-radius:var(--ate-border-radius);overflow-x:auto;margin:1em 0}:host ::ng-deep .ProseMirror pre code{background:none;color:inherit;border:none;padding:0}:host ::ng-deep .ProseMirror p.is-editor-empty:first-child:before{content:attr(data-placeholder);color:var(--ate-placeholder-color);pointer-events:none;float:left;height:0}:host ::ng-deep .ProseMirror[contenteditable=false] img{cursor:pointer}:host ::ng-deep .ProseMirror[contenteditable=false] a{cursor:pointer}:host ::ng-deep .ProseMirror[contenteditable=false] img:hover{transform:none;box-shadow:0 2px 8px #0000001a}:host ::ng-deep .ProseMirror[contenteditable=false] img.ProseMirror-selectednode{outline:none}:host ::ng-deep .ProseMirror img{position:relative;display:inline-block;max-width:100%;height:auto;cursor:pointer;transition:all .2s ease;border:2px solid transparent;border-radius:var(--ate-image-border-radius)}:host ::ng-deep .ProseMirror img:hover{border-color:var(--ate-border-color);box-shadow:0 2px 4px #0000001a}:host ::ng-deep .ProseMirror img.ProseMirror-selectednode,:host ::ng-deep .resizable-image-container.selected img{border-color:var(--ate-image-selected-color);transition:all .2s ease}:host ::ng-deep .ProseMirror [data-text-align=center],:host ::ng-deep .ProseMirror [data-align=center]{text-align:center}:host ::ng-deep .ProseMirror [data-text-align=right],:host ::ng-deep .ProseMirror [data-align=right]{text-align:right}:host ::ng-deep .ProseMirror [data-text-align=left],:host ::ng-deep .ProseMirror [data-align=left]{text-align:left}:host ::ng-deep .resizable-image-wrapper{display:block;width:100%;margin:.5em 0}:host ::ng-deep .resizable-image-container{position:relative;display:inline-block;max-width:100%}:host ::ng-deep .resize-controls{position:absolute;inset:0;pointer-events:none;z-index:1000;opacity:0;transition:opacity .2s ease}:host:not(.is-readonly):not(.is-disabled) ::ng-deep .resizable-image-container:hover .resize-controls,:host:not(.is-readonly):not(.is-disabled) ::ng-deep body.resizing .resize-controls{opacity:1}:host ::ng-deep .resize-handle{position:absolute;width:.35rem;height:2rem;background:var(--ate-primary);border:2px solid var(--ate-surface);border-radius:var(--ate-border-radius);pointer-events:all;cursor:pointer;z-index:1001;transition:all .15s ease;box-shadow:0 2px 6px #0003}:host ::ng-deep .resize-handle:hover{background:var(--ate-primary);box-shadow:0 3px 8px #0000004d}:host ::ng-deep .resize-handle:active{background:var(--ate-primary)}:host ::ng-deep .resize-handle-w:hover,:host ::ng-deep .resize-handle-e:hover{background:var(--ate-primary-hover)}:host ::ng-deep .resize-handle-w:active,:host ::ng-deep .resize-handle-e:active{transform:translateY(-50%) scale(.9);background:var(--ate-primary-hover)}:host ::ng-deep .resize-handle-w{top:50%;left:.35rem;transform:translateY(-50%);cursor:w-resize}:host ::ng-deep .resize-handle-e{top:50%;right:.35rem;transform:translateY(-50%);cursor:e-resize}:host ::ng-deep body.resizing{-webkit-user-select:none;user-select:none;cursor:crosshair}:host ::ng-deep body.resizing .ProseMirror{pointer-events:none}:host ::ng-deep body.resizing .ProseMirror .resizable-image-container{pointer-events:none}:host ::ng-deep .image-size-info{position:absolute;bottom:-20px;left:50%;transform:translate(-50%);background:#000c;color:#fff;padding:2px 6px;border-radius:3px;font-size:11px;white-space:nowrap;opacity:0;transition:opacity .2s ease}:host ::ng-deep .resizable-image-container:hover .image-size-info{opacity:1}:host ::ng-deep .ProseMirror table{border-collapse:separate;border-spacing:0;margin:0;table-layout:fixed;width:100%;border-radius:8px;overflow:hidden}:host ::ng-deep .ProseMirror table td,:host ::ng-deep .ProseMirror table th{border:none;border-right:1px solid var(--ate-table-border-color);border-bottom:1px solid var(--ate-table-border-color);box-sizing:border-box;min-width:1em;padding:8px 12px;position:relative;vertical-align:top;text-align:left}:host ::ng-deep .ProseMirror table td{background:var(--ate-table-cell-background)}:host ::ng-deep .ProseMirror table td:first-child,:host ::ng-deep .ProseMirror table th:first-child{border-left:1px solid var(--ate-table-border-color)}:host ::ng-deep .ProseMirror table tr:first-child td,:host ::ng-deep .ProseMirror table tr:first-child th{border-top:1px solid var(--ate-table-border-color)}:host ::ng-deep .ProseMirror table tr:first-child th:first-child{border-top-left-radius:8px}:host ::ng-deep .ProseMirror table tr:first-child th:last-child{border-top-right-radius:8px}:host ::ng-deep .ProseMirror table tr:last-child td:first-child{border-bottom-left-radius:8px}:host ::ng-deep .ProseMirror table tr:last-child td:last-child{border-bottom-right-radius:8px}:host ::ng-deep .ProseMirror table th{background:var(--ate-table-header-background);font-weight:600;color:var(--ate-table-header-color)}:host ::ng-deep .ProseMirror table .selectedCell:after{background:var(--ate-table-cell-selected-background);content:\"\";inset:0;pointer-events:none;position:absolute;z-index:2}:host ::ng-deep .ProseMirror table .column-resize-handle{position:absolute;right:-2px;top:0;bottom:0;width:4px;background-color:var(--ate-table-resize-handle-color);opacity:0;transition:opacity .2s ease}:host ::ng-deep .ProseMirror table:hover .column-resize-handle{opacity:1}:host ::ng-deep .ProseMirror table .column-resize-handle:hover{background-color:var(--ate-focus-color)}:host ::ng-deep .ProseMirror .tableWrapper{overflow-x:auto;margin:1em 0;border-radius:8px}:host ::ng-deep .ProseMirror .tableWrapper table{margin:0;border-radius:8px;min-width:600px;overflow:hidden}:host ::ng-deep .ProseMirror table p{margin:0}:host ::ng-deep .ProseMirror table tbody tr:hover td{background-color:var(--ate-table-row-hover-background)}\n"], dependencies: [{ kind: "component", type: AteToolbarComponent, selector: "ate-toolbar", inputs: ["editor", "config", "imageUpload", "floating"] }, { kind: "component", type: AteBubbleMenuComponent, selector: "ate-bubble-menu", inputs: ["config"] }, { kind: "component", type: AteImageBubbleMenuComponent, selector: "ate-image-bubble-menu", inputs: ["config", "imageUpload"] }, { kind: "component", type: AteTableBubbleMenuComponent, selector: "ate-table-bubble-menu", inputs: ["config"] }, { kind: "component", type: AteCellBubbleMenuComponent, selector: "ate-cell-bubble-menu", inputs: ["config"] }, { kind: "component", type: AteSlashCommandsComponent, selector: "ate-slash-commands", inputs: ["editor", "config"] }, { kind: "component", type: AteLinkBubbleMenuComponent, selector: "ate-link-bubble-menu" }, { kind: "component", type: AteColorBubbleMenuComponent, selector: "ate-color-bubble-menu" }, { kind: "component", type: AteEditToggleComponent, selector: "ate-edit-toggle", inputs: ["editable", "translations"], outputs: ["editToggle"] }, { kind: "component", type: AteBlockControlsComponent, selector: "ate-block-controls", inputs: ["editor", "hoveredData"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
7824
8093
|
}
|
|
7825
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
8094
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AngularTiptapEditorComponent, decorators: [{
|
|
7826
8095
|
type: Component,
|
|
7827
8096
|
args: [{ selector: "angular-tiptap-editor", standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, hostDirectives: [AteNoopValueAccessorDirective], host: {
|
|
7828
8097
|
"[class.fill-container]": "finalFillContainer()",
|
|
@@ -7849,7 +8118,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
|
|
|
7849
8118
|
AteColorBubbleMenuComponent,
|
|
7850
8119
|
AteEditToggleComponent,
|
|
7851
8120
|
AteBlockControlsComponent,
|
|
7852
|
-
], providers: [AteEditorCommandsService, AteImageService, AteColorPickerService, AteLinkService], template: `
|
|
8121
|
+
], providers: [AteEditorCommandsService, AteImageService, AteColorPickerService, AteLinkService, AteExportService], template: `
|
|
7853
8122
|
<div class="ate-editor">
|
|
7854
8123
|
<!-- Toolbar -->
|
|
7855
8124
|
@if (finalEditable() && !mergedDisabled() && finalShowToolbar() && editor()) {
|
|
@@ -7976,7 +8245,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
|
|
|
7976
8245
|
}
|
|
7977
8246
|
</div>
|
|
7978
8247
|
`, styles: [":host{--ate-primary: #2563eb;--ate-primary-hover: #153ca9;--ate-primary-contrast: #ffffff;--ate-primary-light: color-mix(in srgb, var(--ate-primary), transparent 90%);--ate-primary-lighter: color-mix(in srgb, var(--ate-primary), transparent 95%);--ate-primary-light-alpha: color-mix(in srgb, var(--ate-primary), transparent 85%);--ate-surface: #ffffff;--ate-surface-secondary: #f8f9fa;--ate-surface-tertiary: #f1f5f9;--ate-text: #2d3748;--ate-text-secondary: #64748b;--ate-text-muted: #a0aec0;--ate-border: #e2e8f0;--ate-highlight-bg: #fef08a;--ate-highlight-color: #854d0e;--ate-button-hover: #f1f5f9;--ate-button-active: #e2e8f0;--ate-selection-bg: var(--ate-primary-light-alpha);--ate-error-color: #c53030;--ate-error-bg: #fed7d7;--ate-error-border: #feb2b2;--ate-border-color: var(--ate-border);--ate-border-width: 2px;--ate-border-radius: 12px;--ate-focus-color: var(--ate-primary);--ate-background: var(--ate-surface);--ate-sub-border-radius: 8px;--ate-text-color: var(--ate-text);--ate-placeholder-color: var(--ate-text-muted);--ate-line-height: 1.6;--ate-content-padding-block: 16px;--ate-content-padding-inline: 16px;--ate-content-gutter: 0px;--ate-menu-bg: var(--ate-surface);--ate-menu-border-radius: var(--ate-border-radius);--ate-menu-border: var(--ate-border);--ate-menu-shadow: 0 10px 15px -3px rgba(0, 0, 0, .1), 0 4px 6px -2px rgba(0, 0, 0, .05);--ate-menu-padding: 4px;--ate-menu-gap: 2px;--ate-toolbar-padding: var(--ate-menu-padding);--ate-toolbar-gap: var(--ate-menu-gap);--ate-toolbar-background: var(--ate-surface-secondary);--ate-toolbar-border-color: var(--ate-border);--ate-toolbar-button-color: var(--ate-text-secondary);--ate-toolbar-button-hover-background: transparent;--ate-toolbar-button-active-background: var(--ate-primary-light);--ate-toolbar-button-active-color: var(--ate-primary);--ate-counter-color: var(--ate-text-secondary);--ate-counter-background: var(--ate-surface-secondary);--ate-counter-border-color: var(--ate-border);--ate-drag-background: #f0f8ff;--ate-drag-border-color: var(--ate-primary);--ate-blockquote-border-color: var(--ate-border);--ate-blockquote-background: var(--ate-surface-secondary);--ate-code-background: var(--ate-surface-secondary);--ate-code-color: var(--ate-text);--ate-code-border-color: var(--ate-border);--ate-code-block-background: #0f172a;--ate-code-block-color: #e2e8f0;--ate-code-block-border-color: var(--ate-border);--ate-image-border-radius: 16px;--ate-image-selected-color: var(--ate-primary);--ate-scrollbar-width: 10px;--ate-scrollbar-thumb: var(--ate-border);--ate-scrollbar-thumb-hover: var(--ate-text-muted);--ate-scrollbar-track: transparent;--ate-table-border-color: var(--ate-border);--ate-table-header-background: var(--ate-surface-secondary);--ate-table-header-color: var(--ate-text);--ate-table-cell-background: var(--ate-surface);--ate-table-cell-selected-background: var(--ate-primary-light);--ate-table-resize-handle-color: var(--ate-primary);--ate-table-row-hover-background: var(--ate-primary-lighter);--ate-tooltip-bg: var(--ate-code-block-background, #0f172a);--ate-tooltip-color: var(--ate-code-block-color, #e2e8f0)}:host(.dark),:host([data-theme=\"dark\"]){--ate-primary: #3b82f6;--ate-primary-contrast: #ffffff;--ate-primary-light: color-mix(in srgb, var(--ate-primary), transparent 85%);--ate-primary-lighter: color-mix(in srgb, var(--ate-primary), transparent 92%);--ate-primary-light-alpha: color-mix(in srgb, var(--ate-primary), transparent 80%);--ate-surface: #020617;--ate-surface-secondary: #0f172a;--ate-surface-tertiary: #1e293b;--ate-text: #f8fafc;--ate-text-secondary: #94a3b8;--ate-text-muted: #64748b;--ate-border: #1e293b;--ate-highlight-bg: #854d0e;--ate-highlight-color: #fef08a;--ate-button-hover: #1e293b;--ate-button-active: #0f172a;--ate-menu-border: rgba(255, 255, 255, .1);--ate-menu-shadow: 0 20px 25px -5px rgba(0, 0, 0, .3), 0 10px 10px -5px rgba(0, 0, 0, .2);--ate-error-color: #f87171;--ate-error-bg: #450a0a;--ate-error-border: #7f1d1d;--ate-drag-background: var(--ate-surface-tertiary);--ate-drag-border-color: var(--ate-primary);--ate-blockquote-border-color: var(--ate-primary);--ate-toolbar-button-active-background: var(--ate-primary-light);--ate-toolbar-button-active-color: var(--ate-primary);--ate-button-hover: var(--ate-surface-tertiary);--ate-button-active: var(--ate-surface-secondary);--ate-scrollbar-thumb: var(--ate-surface-tertiary);--ate-scrollbar-thumb-hover: var(--ate-text-muted)}:host(.fill-container){display:block;height:100%}.ate-editor{border:var(--ate-border-width) solid var(--ate-border-color);border-radius:var(--ate-border-radius);background:var(--ate-background);overflow:visible;transition:border-color .2s ease;position:relative}:host(.floating-toolbar) .ate-editor{overflow:visible}:host(.fill-container) .ate-editor{display:flex;flex-direction:column;height:100%}:host(.fill-container) .ate-content-wrapper{flex:1;min-height:0}:host(.fill-container) .ate-content{flex:1;min-height:0;overflow-y:auto}.ate-editor:focus-within{border-color:var(--ate-focus-color)}.ate-content{min-height:var(--editor-min-height, 200px);height:var(--editor-height, auto);max-height:var(--editor-max-height, none);overflow-y:var(--editor-overflow, visible);outline:none;position:relative;scrollbar-width:thin;scrollbar-color:var(--ate-scrollbar-thumb) var(--ate-scrollbar-track)}:host(.is-disabled) .ate-content{cursor:not-allowed;opacity:.7;-webkit-user-select:none;user-select:none;pointer-events:none;background-color:var(--ate-surface-tertiary)}:host(.is-readonly) .ate-content{cursor:default;-webkit-user-select:text;user-select:text}:host(.is-readonly) .ate-content ::ng-deep .ate-link{cursor:pointer;pointer-events:auto}.ate-content::-webkit-scrollbar{width:var(--ate-scrollbar-width)}.ate-content-wrapper{position:relative;display:flex;flex-direction:column;min-height:0}.ate-content-wrapper .ate-content{flex:1}.ate-content::-webkit-scrollbar-track{background:var(--ate-scrollbar-track)}.ate-content::-webkit-scrollbar-thumb{background:var(--ate-scrollbar-thumb);border:3px solid transparent;background-clip:content-box;border-radius:10px}.ate-content::-webkit-scrollbar-thumb:hover{background:var(--ate-scrollbar-thumb-hover);background-clip:content-box}.ate-content.drag-over{background:var(--ate-drag-background);border:2px dashed var(--ate-drag-border-color)}.character-count{padding:6px 8px;font-size:12px;color:var(--ate-counter-color);text-align:right;border-top:1px solid var(--ate-counter-border-color);background:var(--ate-counter-background);transition:color .2s ease;border-bottom-left-radius:calc(var(--ate-border-radius) - var(--ate-border-width));border-bottom-right-radius:calc(var(--ate-border-radius) - var(--ate-border-width))}.character-count.limit-reached{color:var(--ate-error-color, #ef4444);font-weight:600}:host.ate-blocks-inside{--ate-content-gutter: 54px}@media (max-width: 768px){:host.ate-blocks-inside{--ate-content-gutter: 0px}ate-block-controls{display:none!important}}:host ::ng-deep .ProseMirror{padding-inline:calc(var(--ate-content-padding-inline) + var(--ate-content-gutter));padding-block:var(--ate-content-padding-block);outline:none;line-height:var(--ate-line-height);color:var(--ate-text-color);min-height:100%;height:100%;word-wrap:break-word;overflow-wrap:break-word}:host ::ng-deep .ProseMirror ::selection{background-color:var(--ate-selection-bg);color:inherit}:host ::ng-deep .ProseMirror ::-moz-selection{background-color:var(--ate-selection-bg);color:inherit}:host ::ng-deep .ProseMirror h1{font-size:2em;font-weight:700;margin-top:0;margin-bottom:.5em}:host ::ng-deep .ProseMirror h2{font-size:1.5em;font-weight:700;margin-top:1em;margin-bottom:.5em}:host ::ng-deep .ProseMirror h3{font-size:1.25em;font-weight:700;margin-top:1em;margin-bottom:.5em}:host ::ng-deep .ProseMirror p{margin:.5em 0}:host ::ng-deep .ProseMirror ul,:host ::ng-deep .ProseMirror ol{padding-left:2em;margin:.5em 0}:host ::ng-deep .ProseMirror blockquote{border-left:4px solid var(--ate-blockquote-border-color);margin:1em 0;background:var(--ate-blockquote-background);padding:.5em 1em;border-radius:0 4px 4px 0}:host ::ng-deep .ProseMirror code{background:var(--ate-code-background);color:var(--ate-code-color);border:1px solid var(--ate-code-border-color);padding:.15em .4em;border-radius:4px;font-family:JetBrains Mono,Fira Code,Monaco,Consolas,monospace;font-size:.85em;font-weight:500}:host ::ng-deep .ProseMirror pre{background:var(--ate-code-block-background);color:var(--ate-code-block-color);border:1px solid var(--ate-code-block-border-color);padding:1em;border-radius:var(--ate-border-radius);overflow-x:auto;margin:1em 0}:host ::ng-deep .ProseMirror pre code{background:none;color:inherit;border:none;padding:0}:host ::ng-deep .ProseMirror p.is-editor-empty:first-child:before{content:attr(data-placeholder);color:var(--ate-placeholder-color);pointer-events:none;float:left;height:0}:host ::ng-deep .ProseMirror[contenteditable=false] img{cursor:pointer}:host ::ng-deep .ProseMirror[contenteditable=false] a{cursor:pointer}:host ::ng-deep .ProseMirror[contenteditable=false] img:hover{transform:none;box-shadow:0 2px 8px #0000001a}:host ::ng-deep .ProseMirror[contenteditable=false] img.ProseMirror-selectednode{outline:none}:host ::ng-deep .ProseMirror img{position:relative;display:inline-block;max-width:100%;height:auto;cursor:pointer;transition:all .2s ease;border:2px solid transparent;border-radius:var(--ate-image-border-radius)}:host ::ng-deep .ProseMirror img:hover{border-color:var(--ate-border-color);box-shadow:0 2px 4px #0000001a}:host ::ng-deep .ProseMirror img.ProseMirror-selectednode,:host ::ng-deep .resizable-image-container.selected img{border-color:var(--ate-image-selected-color);transition:all .2s ease}:host ::ng-deep .ProseMirror [data-text-align=center],:host ::ng-deep .ProseMirror [data-align=center]{text-align:center}:host ::ng-deep .ProseMirror [data-text-align=right],:host ::ng-deep .ProseMirror [data-align=right]{text-align:right}:host ::ng-deep .ProseMirror [data-text-align=left],:host ::ng-deep .ProseMirror [data-align=left]{text-align:left}:host ::ng-deep .resizable-image-wrapper{display:block;width:100%;margin:.5em 0}:host ::ng-deep .resizable-image-container{position:relative;display:inline-block;max-width:100%}:host ::ng-deep .resize-controls{position:absolute;inset:0;pointer-events:none;z-index:1000;opacity:0;transition:opacity .2s ease}:host:not(.is-readonly):not(.is-disabled) ::ng-deep .resizable-image-container:hover .resize-controls,:host:not(.is-readonly):not(.is-disabled) ::ng-deep body.resizing .resize-controls{opacity:1}:host ::ng-deep .resize-handle{position:absolute;width:.35rem;height:2rem;background:var(--ate-primary);border:2px solid var(--ate-surface);border-radius:var(--ate-border-radius);pointer-events:all;cursor:pointer;z-index:1001;transition:all .15s ease;box-shadow:0 2px 6px #0003}:host ::ng-deep .resize-handle:hover{background:var(--ate-primary);box-shadow:0 3px 8px #0000004d}:host ::ng-deep .resize-handle:active{background:var(--ate-primary)}:host ::ng-deep .resize-handle-w:hover,:host ::ng-deep .resize-handle-e:hover{background:var(--ate-primary-hover)}:host ::ng-deep .resize-handle-w:active,:host ::ng-deep .resize-handle-e:active{transform:translateY(-50%) scale(.9);background:var(--ate-primary-hover)}:host ::ng-deep .resize-handle-w{top:50%;left:.35rem;transform:translateY(-50%);cursor:w-resize}:host ::ng-deep .resize-handle-e{top:50%;right:.35rem;transform:translateY(-50%);cursor:e-resize}:host ::ng-deep body.resizing{-webkit-user-select:none;user-select:none;cursor:crosshair}:host ::ng-deep body.resizing .ProseMirror{pointer-events:none}:host ::ng-deep body.resizing .ProseMirror .resizable-image-container{pointer-events:none}:host ::ng-deep .image-size-info{position:absolute;bottom:-20px;left:50%;transform:translate(-50%);background:#000c;color:#fff;padding:2px 6px;border-radius:3px;font-size:11px;white-space:nowrap;opacity:0;transition:opacity .2s ease}:host ::ng-deep .resizable-image-container:hover .image-size-info{opacity:1}:host ::ng-deep .ProseMirror table{border-collapse:separate;border-spacing:0;margin:0;table-layout:fixed;width:100%;border-radius:8px;overflow:hidden}:host ::ng-deep .ProseMirror table td,:host ::ng-deep .ProseMirror table th{border:none;border-right:1px solid var(--ate-table-border-color);border-bottom:1px solid var(--ate-table-border-color);box-sizing:border-box;min-width:1em;padding:8px 12px;position:relative;vertical-align:top;text-align:left}:host ::ng-deep .ProseMirror table td{background:var(--ate-table-cell-background)}:host ::ng-deep .ProseMirror table td:first-child,:host ::ng-deep .ProseMirror table th:first-child{border-left:1px solid var(--ate-table-border-color)}:host ::ng-deep .ProseMirror table tr:first-child td,:host ::ng-deep .ProseMirror table tr:first-child th{border-top:1px solid var(--ate-table-border-color)}:host ::ng-deep .ProseMirror table tr:first-child th:first-child{border-top-left-radius:8px}:host ::ng-deep .ProseMirror table tr:first-child th:last-child{border-top-right-radius:8px}:host ::ng-deep .ProseMirror table tr:last-child td:first-child{border-bottom-left-radius:8px}:host ::ng-deep .ProseMirror table tr:last-child td:last-child{border-bottom-right-radius:8px}:host ::ng-deep .ProseMirror table th{background:var(--ate-table-header-background);font-weight:600;color:var(--ate-table-header-color)}:host ::ng-deep .ProseMirror table .selectedCell:after{background:var(--ate-table-cell-selected-background);content:\"\";inset:0;pointer-events:none;position:absolute;z-index:2}:host ::ng-deep .ProseMirror table .column-resize-handle{position:absolute;right:-2px;top:0;bottom:0;width:4px;background-color:var(--ate-table-resize-handle-color);opacity:0;transition:opacity .2s ease}:host ::ng-deep .ProseMirror table:hover .column-resize-handle{opacity:1}:host ::ng-deep .ProseMirror table .column-resize-handle:hover{background-color:var(--ate-focus-color)}:host ::ng-deep .ProseMirror .tableWrapper{overflow-x:auto;margin:1em 0;border-radius:8px}:host ::ng-deep .ProseMirror .tableWrapper table{margin:0;border-radius:8px;min-width:600px;overflow:hidden}:host ::ng-deep .ProseMirror table p{margin:0}:host ::ng-deep .ProseMirror table tbody tr:hover td{background-color:var(--ate-table-row-hover-background)}\n"] }]
|
|
7979
|
-
}], ctorParameters: () => []
|
|
8248
|
+
}], ctorParameters: () => [] });
|
|
7980
8249
|
|
|
7981
8250
|
/**
|
|
7982
8251
|
* Provides the necessary configuration and initialization for the Angular TipTap Editor.
|
|
@@ -8002,10 +8271,14 @@ function provideAteEditor(config) {
|
|
|
8002
8271
|
provide: ATE_GLOBAL_CONFIG,
|
|
8003
8272
|
useValue: config || {},
|
|
8004
8273
|
},
|
|
8005
|
-
|
|
8006
|
-
|
|
8007
|
-
|
|
8008
|
-
|
|
8274
|
+
{
|
|
8275
|
+
provide: APP_INITIALIZER,
|
|
8276
|
+
useFactory: (injector) => () => {
|
|
8277
|
+
setGlobalInjector(injector);
|
|
8278
|
+
},
|
|
8279
|
+
deps: [Injector],
|
|
8280
|
+
multi: true,
|
|
8281
|
+
},
|
|
8009
8282
|
]);
|
|
8010
8283
|
}
|
|
8011
8284
|
|
|
@@ -8053,5 +8326,5 @@ const ATE_TOOLBAR_KEYS = [
|
|
|
8053
8326
|
* Generated bundle index. Do not edit.
|
|
8054
8327
|
*/
|
|
8055
8328
|
|
|
8056
|
-
export { ATE_BUBBLE_MENU_KEYS, ATE_CELL_BUBBLE_MENU_KEYS, ATE_DEFAULT_BUBBLE_MENU_CONFIG, ATE_DEFAULT_CELL_MENU_CONFIG, ATE_DEFAULT_CONFIG, ATE_DEFAULT_IMAGE_BUBBLE_MENU_CONFIG, ATE_DEFAULT_IMAGE_UPLOAD_CONFIG, ATE_DEFAULT_SLASH_COMMANDS_CONFIG, ATE_DEFAULT_TABLE_MENU_CONFIG, ATE_DEFAULT_TOOLBAR_CONFIG, ATE_GLOBAL_CONFIG, ATE_IMAGE_BUBBLE_MENU_KEYS, ATE_INITIAL_EDITOR_STATE, ATE_SLASH_COMMAND_KEYS, ATE_TABLE_BUBBLE_MENU_KEYS, ATE_TOOLBAR_KEYS, AngularTiptapEditorComponent, AteAngularNodeView, AteColorPickerService, AteDiscoveryCalculator, AteEditorCommandsService, AteI18nService, AteImageCalculator, AteImageService, AteLinkService, AteMarksCalculator, AteNodeViewRenderer, AteNoopValueAccessorDirective, AteSelectionCalculator, AteStructureCalculator, AteTableCalculator, AteTooltipDirective, createAngularComponentExtension, createDefaultSlashCommands, filterSlashCommands, provideAteEditor, registerAngularComponent };
|
|
8329
|
+
export { ATE_BUBBLE_MENU_KEYS, ATE_CELL_BUBBLE_MENU_KEYS, ATE_DEFAULT_BUBBLE_MENU_CONFIG, ATE_DEFAULT_CELL_MENU_CONFIG, ATE_DEFAULT_CONFIG, ATE_DEFAULT_IMAGE_BUBBLE_MENU_CONFIG, ATE_DEFAULT_IMAGE_UPLOAD_CONFIG, ATE_DEFAULT_SLASH_COMMANDS_CONFIG, ATE_DEFAULT_TABLE_MENU_CONFIG, ATE_DEFAULT_TOOLBAR_CONFIG, ATE_GLOBAL_CONFIG, ATE_IMAGE_BUBBLE_MENU_KEYS, ATE_INITIAL_EDITOR_STATE, ATE_SLASH_COMMAND_KEYS, ATE_TABLE_BUBBLE_MENU_KEYS, ATE_TOOLBAR_KEYS, AngularTiptapEditorComponent, AteAngularNodeView, AteColorPickerService, AteDiscoveryCalculator, AteEditorCommandsService, AteExportService, AteI18nService, AteImageCalculator, AteImageService, AteLinkService, AteMarksCalculator, AteNodeViewRenderer, AteNoopValueAccessorDirective, AteSelectionCalculator, AteStructureCalculator, AteTableCalculator, AteTooltipDirective, createAngularComponentExtension, createDefaultSlashCommands, filterSlashCommands, provideAteEditor, registerAngularComponent };
|
|
8057
8330
|
//# sourceMappingURL=flogeez-angular-tiptap-editor.mjs.map
|