@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.
Files changed (117) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +2 -2
  3. package/esm2022/flogeez-angular-tiptap-editor.mjs +5 -0
  4. package/esm2022/lib/ate-editor.provider.mjs +38 -0
  5. package/esm2022/lib/components/bubble-menus/base/ate-base-bubble-menu.mjs +207 -0
  6. package/esm2022/lib/components/bubble-menus/base/ate-base-sub-bubble-menu.mjs +137 -0
  7. package/esm2022/lib/components/bubble-menus/color/ate-color-bubble-menu.component.mjs +365 -0
  8. package/esm2022/lib/components/bubble-menus/image/ate-image-bubble-menu.component.mjs +309 -0
  9. package/esm2022/lib/components/bubble-menus/link/ate-link-bubble-menu.component.mjs +247 -0
  10. package/esm2022/lib/components/bubble-menus/table/ate-cell-bubble-menu.component.mjs +126 -0
  11. package/esm2022/lib/components/bubble-menus/table/ate-table-bubble-menu.component.mjs +271 -0
  12. package/esm2022/lib/components/bubble-menus/text/ate-bubble-menu.component.mjs +272 -0
  13. package/esm2022/lib/components/color-picker/ate-color-picker.component.mjs +123 -0
  14. package/esm2022/lib/components/edit-toggle/ate-edit-toggle.component.mjs +42 -0
  15. package/esm2022/lib/components/editor/angular-tiptap-editor.component.mjs +1032 -0
  16. package/esm2022/lib/components/editor/ate-block-controls.component.mjs +256 -0
  17. package/esm2022/lib/components/slash-commands/ate-slash-commands.component.mjs +328 -0
  18. package/esm2022/lib/components/toolbar/ate-toolbar.component.mjs +531 -0
  19. package/esm2022/lib/components/ui/ate-button.component.mjs +91 -0
  20. package/esm2022/lib/components/ui/ate-separator.component.mjs +11 -0
  21. package/esm2022/lib/config/ate-editor.config.mjs +133 -0
  22. package/esm2022/lib/config/ate-global-config.token.mjs +6 -0
  23. package/esm2022/lib/config/ate-slash-commands.config.mjs +130 -0
  24. package/esm2022/lib/directives/ate-noop-value-accessor.directive.mjs +40 -0
  25. package/esm2022/lib/directives/ate-tooltip.directive.mjs +138 -0
  26. package/esm2022/lib/extensions/ate-block-controls.extension.mjs +156 -0
  27. package/esm2022/lib/extensions/ate-link-click-behavior.extension.mjs +32 -0
  28. package/esm2022/lib/extensions/ate-resizable-image.extension.mjs +277 -0
  29. package/esm2022/lib/extensions/ate-table.extension.mjs +27 -0
  30. package/esm2022/lib/extensions/ate-tiptap-state.extension.mjs +85 -0
  31. package/esm2022/lib/extensions/ate-upload-progress.extension.mjs +195 -0
  32. package/esm2022/lib/extensions/calculators/ate-discovery.calculator.mjs +62 -0
  33. package/esm2022/lib/extensions/calculators/ate-image.calculator.mjs +8 -0
  34. package/esm2022/lib/extensions/calculators/ate-marks.calculator.mjs +75 -0
  35. package/esm2022/lib/extensions/calculators/ate-selection.calculator.mjs +35 -0
  36. package/esm2022/lib/extensions/calculators/ate-structure.calculator.mjs +34 -0
  37. package/esm2022/lib/extensions/calculators/ate-table.calculator.mjs +38 -0
  38. package/esm2022/lib/models/ate-bubble-menu.model.mjs +53 -0
  39. package/esm2022/lib/models/ate-editor-config.model.mjs +2 -0
  40. package/esm2022/lib/models/ate-editor-state.model.mjs +90 -0
  41. package/esm2022/lib/models/ate-image.model.mjs +2 -0
  42. package/esm2022/lib/models/ate-slash-command.model.mjs +2 -0
  43. package/esm2022/lib/models/ate-toolbar.model.mjs +35 -0
  44. package/esm2022/lib/node-view/ate-angular-node-view.mjs +97 -0
  45. package/esm2022/lib/node-view/ate-injector.registry.mjs +16 -0
  46. package/esm2022/lib/node-view/ate-node-view.factory.mjs +125 -0
  47. package/esm2022/lib/node-view/ate-node-view.models.mjs +2 -0
  48. package/esm2022/lib/node-view/ate-node-view.renderer.mjs +154 -0
  49. package/esm2022/lib/node-view/ate-register-angular-component.mjs +49 -0
  50. package/esm2022/lib/services/ate-color-picker.service.mjs +194 -0
  51. package/esm2022/lib/services/ate-editor-commands.service.mjs +507 -0
  52. package/esm2022/lib/services/ate-export.service.mjs +71 -0
  53. package/esm2022/lib/services/ate-i18n.service.mjs +449 -0
  54. package/esm2022/lib/services/ate-image.service.mjs +459 -0
  55. package/esm2022/lib/services/ate-link.service.mjs +99 -0
  56. package/esm2022/lib/utils/ate-color.utils.mjs +60 -0
  57. package/esm2022/lib/utils/ate-markdown.utils.mjs +179 -0
  58. package/esm2022/public-api.mjs +41 -0
  59. package/fesm2022/flogeez-angular-tiptap-editor.mjs +627 -354
  60. package/fesm2022/flogeez-angular-tiptap-editor.mjs.map +1 -1
  61. package/index.d.ts +3 -1734
  62. package/lib/ate-editor.provider.d.ts +21 -0
  63. package/lib/components/bubble-menus/base/ate-base-bubble-menu.d.ts +71 -0
  64. package/lib/components/bubble-menus/base/ate-base-sub-bubble-menu.d.ts +60 -0
  65. package/lib/components/bubble-menus/color/ate-color-bubble-menu.component.d.ts +77 -0
  66. package/lib/components/bubble-menus/image/ate-image-bubble-menu.component.d.ts +49 -0
  67. package/lib/components/bubble-menus/link/ate-link-bubble-menu.component.d.ts +55 -0
  68. package/lib/components/bubble-menus/table/ate-cell-bubble-menu.component.d.ts +16 -0
  69. package/lib/components/bubble-menus/table/ate-table-bubble-menu.component.d.ts +25 -0
  70. package/lib/components/bubble-menus/text/ate-bubble-menu.component.d.ts +53 -0
  71. package/lib/components/color-picker/ate-color-picker.component.d.ts +54 -0
  72. package/lib/components/edit-toggle/ate-edit-toggle.component.d.ts +13 -0
  73. package/lib/components/editor/angular-tiptap-editor.component.d.ts +242 -0
  74. package/lib/components/editor/ate-block-controls.component.d.ts +44 -0
  75. package/lib/components/slash-commands/ate-slash-commands.component.d.ts +34 -0
  76. package/lib/components/toolbar/ate-toolbar.component.d.ts +47 -0
  77. package/lib/components/ui/ate-button.component.d.ts +25 -0
  78. package/lib/components/ui/ate-separator.component.d.ts +5 -0
  79. package/lib/config/ate-editor.config.d.ts +19 -0
  80. package/lib/config/ate-global-config.token.d.ts +6 -0
  81. package/lib/config/ate-slash-commands.config.d.ts +41 -0
  82. package/lib/directives/ate-noop-value-accessor.directive.d.ts +13 -0
  83. package/lib/directives/ate-tooltip.directive.d.ts +30 -0
  84. package/lib/extensions/ate-block-controls.extension.d.ts +10 -0
  85. package/lib/extensions/ate-link-click-behavior.extension.d.ts +2 -0
  86. package/lib/extensions/ate-resizable-image.extension.d.ts +27 -0
  87. package/lib/extensions/ate-table.extension.d.ts +2 -0
  88. package/lib/extensions/ate-tiptap-state.extension.d.ts +7 -0
  89. package/lib/extensions/ate-upload-progress.extension.d.ts +7 -0
  90. package/lib/extensions/calculators/ate-discovery.calculator.d.ts +7 -0
  91. package/lib/extensions/calculators/ate-image.calculator.d.ts +2 -0
  92. package/lib/extensions/calculators/ate-marks.calculator.d.ts +2 -0
  93. package/lib/extensions/calculators/ate-selection.calculator.d.ts +2 -0
  94. package/lib/extensions/calculators/ate-structure.calculator.d.ts +2 -0
  95. package/lib/extensions/calculators/ate-table.calculator.d.ts +2 -0
  96. package/lib/models/ate-bubble-menu.model.d.ts +33 -0
  97. package/lib/models/ate-editor-config.model.d.ts +113 -0
  98. package/lib/models/ate-editor-state.model.d.ts +109 -0
  99. package/lib/models/ate-image.model.d.ts +104 -0
  100. package/lib/models/ate-slash-command.model.d.ts +17 -0
  101. package/lib/models/ate-toolbar.model.d.ts +18 -0
  102. package/lib/node-view/ate-angular-node-view.d.ts +115 -0
  103. package/lib/node-view/ate-injector.registry.d.ts +3 -0
  104. package/lib/node-view/ate-node-view.factory.d.ts +10 -0
  105. package/lib/node-view/ate-node-view.models.d.ts +138 -0
  106. package/lib/node-view/ate-node-view.renderer.d.ts +23 -0
  107. package/lib/node-view/ate-register-angular-component.d.ts +35 -0
  108. package/lib/services/ate-color-picker.service.d.ts +65 -0
  109. package/lib/services/ate-editor-commands.service.d.ts +89 -0
  110. package/lib/services/ate-export.service.d.ts +27 -0
  111. package/lib/services/ate-i18n.service.d.ts +432 -0
  112. package/lib/services/ate-image.service.d.ts +82 -0
  113. package/lib/services/ate-link.service.d.ts +42 -0
  114. package/lib/utils/ate-color.utils.d.ts +12 -0
  115. package/lib/utils/ate-markdown.utils.d.ts +4 -0
  116. package/package.json +3 -1
  117. 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, ChangeDetectionStrategy, Component, signal, Injectable, viewChild, ApplicationRef, EnvironmentInjector, createComponent, InjectionToken, DestroyRef, Injector, untracked, makeEnvironmentProviders, provideEnvironmentInitializer } from '@angular/core';
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, nodeInputRule, mergeAttributes, Extension, getAttributes, Editor } from '@tiptap/core';
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, ...(ngDevMode ? [{ debugName: "content", alias: "ateTooltip" }] : [{ alias: "ateTooltip" }]));
697
- this.placement = input("top", ...(ngDevMode ? [{ debugName: "placement", alias: "ateTooltipPlacement" }] : [{ alias: "ateTooltipPlacement" }]));
698
- this.delay = input([200, 50], ...(ngDevMode ? [{ debugName: "delay", alias: "ateTooltipDelay" }] : [{ alias: "ateTooltipDelay" }]));
699
- this.disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled", alias: "ateTooltipDisabled" }] : [{ alias: "ateTooltipDisabled" }]));
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
- }, ...(ngDevMode ? [{ debugName: "ariaShortcut" }] : []));
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
- }, ...(ngDevMode ? [{ debugName: "processedTooltip" }] : []));
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: "20.3.16", ngImport: i0, type: AteTooltipDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
811
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.16", 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 }); }
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: "20.3.16", ngImport: i0, type: AteTooltipDirective, decorators: [{
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: () => [], propDecorators: { content: [{ type: i0.Input, args: [{ isSignal: true, alias: "ateTooltip", required: false }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "ateTooltipPlacement", required: false }] }], delay: [{ type: i0.Input, args: [{ isSignal: true, alias: "ateTooltipDelay", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "ateTooltipDisabled", required: false }] }] } });
822
+ }], ctorParameters: () => [] });
823
823
 
824
824
  class AteButtonComponent {
825
825
  constructor() {
826
826
  // Inputs
827
- this.icon = input("", ...(ngDevMode ? [{ debugName: "icon" }] : []));
828
- this.title = input.required(...(ngDevMode ? [{ debugName: "title" }] : []));
829
- this.active = input(false, ...(ngDevMode ? [{ debugName: "active" }] : []));
830
- this.disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
831
- this.color = input(...(ngDevMode ? [undefined, { debugName: "color" }] : []));
832
- this.backgroundColor = input(...(ngDevMode ? [undefined, { debugName: "backgroundColor" }] : []));
833
- this.variant = input("default", ...(ngDevMode ? [{ debugName: "variant" }] : []));
834
- this.size = input("medium", ...(ngDevMode ? [{ debugName: "size" }] : []));
835
- this.iconSize = input("medium", ...(ngDevMode ? [{ debugName: "iconSize" }] : []));
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: "20.3.16", ngImport: i0, type: AteButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
843
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", 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: `
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: "20.3.16", ngImport: i0, type: AteButtonComponent, decorators: [{
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
- }], propDecorators: { icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], active: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], backgroundColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "backgroundColor", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], iconSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconSize", required: false }] }], buttonClick: [{ type: i0.Output, args: ["buttonClick"] }] } });
910
+ }] });
911
911
 
912
912
  class AteSeparatorComponent {
913
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AteSeparatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
914
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", 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 }); }
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: "20.3.16", ngImport: i0, type: AteSeparatorComponent, decorators: [{
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", ...(ngDevMode ? [{ debugName: "_currentLocale" }] : []));
1295
+ this._currentLocale = signal("en");
1270
1296
  this._translations = signal({
1271
1297
  en: ENGLISH_TRANSLATIONS,
1272
1298
  fr: FRENCH_TRANSLATIONS,
1273
- }, ...(ngDevMode ? [{ debugName: "_translations" }] : []));
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()], ...(ngDevMode ? [{ debugName: "translations" }] : []));
1304
+ this.translations = computed(() => this._translations()[this._currentLocale()]);
1279
1305
  // Fast translation methods
1280
- this.t = computed(() => this.translations(), ...(ngDevMode ? [{ debugName: "t" }] : []));
1281
- this.toolbar = computed(() => this.translations().toolbar, ...(ngDevMode ? [{ debugName: "toolbar" }] : []));
1282
- this.bubbleMenu = computed(() => this.translations().bubbleMenu, ...(ngDevMode ? [{ debugName: "bubbleMenu" }] : []));
1283
- this.slashCommands = computed(() => this.translations().slashCommands, ...(ngDevMode ? [{ debugName: "slashCommands" }] : []));
1284
- this.table = computed(() => this.translations().table, ...(ngDevMode ? [{ debugName: "table" }] : []));
1285
- this.imageUpload = computed(() => this.translations().imageUpload, ...(ngDevMode ? [{ debugName: "imageUpload" }] : []));
1286
- this.editor = computed(() => this.translations().editor, ...(ngDevMode ? [{ debugName: "editor" }] : []));
1287
- this.common = computed(() => this.translations().common, ...(ngDevMode ? [{ debugName: "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: "20.3.16", ngImport: i0, type: AteI18nService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1332
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AteI18nService, providedIn: "root" }); }
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: "20.3.16", ngImport: i0, type: AteI18nService, decorators: [{
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, ...(ngDevMode ? [{ debugName: "selectedImage" }] : []));
1345
- this.isImageSelected = computed(() => this.selectedImage() !== null, ...(ngDevMode ? [{ debugName: "isImageSelected" }] : []));
1371
+ this.selectedImage = signal(null);
1372
+ this.isImageSelected = computed(() => this.selectedImage() !== null);
1346
1373
  /** Resizing state */
1347
- this.isResizing = signal(false, ...(ngDevMode ? [{ debugName: "isResizing" }] : []));
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, ...(ngDevMode ? [{ debugName: "isUploading" }] : []));
1352
- this.uploadProgress = signal(0, ...(ngDevMode ? [{ debugName: "uploadProgress" }] : []));
1353
- this.uploadMessage = signal("", ...(ngDevMode ? [{ debugName: "uploadMessage" }] : []));
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: "20.3.16", ngImport: i0, type: AteImageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1790
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AteImageService }); }
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: "20.3.16", ngImport: i0, type: AteImageService, decorators: [{
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, ...(ngDevMode ? [{ debugName: "editMode" }] : []));
1890
+ this.editMode = signal(null);
1864
1891
  /** Reference to the element that triggered the menu (for anchoring) */
1865
- this.menuTrigger = signal(null, ...(ngDevMode ? [{ debugName: "menuTrigger" }] : []));
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, ...(ngDevMode ? [{ debugName: "isInteracting" }] : []));
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: "20.3.16", ngImport: i0, type: AteColorPickerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2041
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AteColorPickerService }); }
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: "20.3.16", ngImport: i0, type: AteColorPickerService, decorators: [{
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, ...(ngDevMode ? [{ debugName: "editMode" }] : []));
2080
+ this.editMode = signal(false);
2054
2081
  /** Reference to the element that triggered the menu (for anchoring) */
2055
- this.menuTrigger = signal(null, ...(ngDevMode ? [{ debugName: "menuTrigger" }] : []));
2082
+ this.menuTrigger = signal(null);
2056
2083
  /** Whether the user is currently interacting with the link UI (input focus) */
2057
- this.isInteracting = signal(false, ...(ngDevMode ? [{ debugName: "isInteracting" }] : []));
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: "20.3.16", ngImport: i0, type: AteLinkService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2138
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AteLinkService }); }
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: "20.3.16", ngImport: i0, type: AteLinkService, decorators: [{
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 `![${alt}](${src})`;
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._editorState = signal(ATE_INITIAL_EDITOR_STATE, ...(ngDevMode ? [{ debugName: "_editorState", equal: (a, b) => {
2150
- // 1. Primitive global states
2151
- if (a.isFocused !== b.isFocused || a.isEditable !== b.isEditable) {
2152
- return false;
2153
- }
2154
- // 2. Detailed selection comparison
2155
- if (a.selection.from !== b.selection.from ||
2156
- a.selection.to !== b.selection.to ||
2157
- a.selection.type !== b.selection.type ||
2158
- a.selection.empty !== b.selection.empty ||
2159
- a.selection.isSingleCell !== b.selection.isSingleCell) {
2160
- return false;
2161
- }
2162
- // Helper for object comparison
2163
- const isRecordEqual = (objA, objB) => {
2164
- const keysA = Object.keys(objA);
2165
- const keysB = Object.keys(objB);
2166
- if (keysA.length !== keysB.length) {
2167
- return false;
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 true;
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, ...(ngDevMode ? [{ debugName: "_isToolbarInteracting" }] : []));
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: "20.3.16", ngImport: i0, type: AteEditorCommandsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2643
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AteEditorCommandsService }); }
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: "20.3.16", ngImport: i0, type: AteEditorCommandsService, decorators: [{
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(...(ngDevMode ? [{ debugName: "editor" }] : []));
2652
- this.mode = input("text", ...(ngDevMode ? [{ debugName: "mode" }] : []));
2653
- this.disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
2654
- this.anchorToText = input(false, ...(ngDevMode ? [{ debugName: "anchorToText" }] : []));
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
- }, ...(ngDevMode ? [{ debugName: "currentColor" }] : []));
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
- }, ...(ngDevMode ? [{ debugName: "hasColorApplied" }] : []));
2937
+ });
2669
2938
  this.buttonIcon = computed(() => {
2670
2939
  return this.mode() === "text" ? "format_color_text" : "format_color_fill";
2671
- }, ...(ngDevMode ? [{ debugName: "buttonIcon" }] : []));
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
- }, ...(ngDevMode ? [{ debugName: "buttonBgColor" }] : []));
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
- }, ...(ngDevMode ? [{ debugName: "buttonTextColor" }] : []));
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: "20.3.16", ngImport: i0, type: AteColorPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2711
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", 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: `
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: "20.3.16", ngImport: i0, type: AteColorPickerComponent, decorators: [{
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
- }], propDecorators: { editor: [{ type: i0.Input, args: [{ isSignal: true, alias: "editor", required: true }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], anchorToText: [{ type: i0.Input, args: [{ isSignal: true, alias: "anchorToText", required: false }] }] } });
3031
+ }] });
2763
3032
 
2764
3033
  class AteToolbarComponent {
2765
3034
  constructor() {
2766
- this.editor = input.required(...(ngDevMode ? [{ debugName: "editor" }] : []));
2767
- this.config = input.required(...(ngDevMode ? [{ debugName: "config" }] : []));
2768
- this.imageUpload = input({}, ...(ngDevMode ? [{ debugName: "imageUpload" }] : []));
2769
- this.floating = input(false, ...(ngDevMode ? [{ debugName: "floating" }] : []));
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: "20.3.16", ngImport: i0, type: AteToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2783
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", 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: `
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: "20.3.16", ngImport: i0, type: AteToolbarComponent, decorators: [{
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
- }], propDecorators: { editor: [{ type: i0.Input, args: [{ isSignal: true, alias: "editor", required: true }] }], config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: true }] }], imageUpload: [{ type: i0.Input, args: [{ isSignal: true, alias: "imageUpload", required: false }] }], floating: [{ type: i0.Input, args: [{ isSignal: true, alias: "floating", required: false }] }] } });
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(...(ngDevMode ? [{ debugName: "editor" }] : []));
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: "20.3.16", ngImport: i0, type: AteBaseBubbleMenu, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
3617
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "20.3.16", type: AteBaseBubbleMenu, isStandalone: true, 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 }); }
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: "20.3.16", ngImport: i0, type: AteBaseBubbleMenu, decorators: [{
3888
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteBaseBubbleMenu, decorators: [{
3620
3889
  type: Directive
3621
- }], ctorParameters: () => [], propDecorators: { editor: [{ type: i0.Input, args: [{ isSignal: true, alias: "editor", required: true }] }], menuRef: [{ type: i0.ViewChild, args: ["menuRef", { isSignal: true }] }] } });
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, ...(ngDevMode ? [{ debugName: "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
- }), ...(ngDevMode ? [{ debugName: "bubbleMenuConfig" }] : []));
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: "20.3.16", ngImport: i0, type: AteBubbleMenuComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
3682
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", 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: `
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: "20.3.16", ngImport: i0, type: AteBubbleMenuComponent, decorators: [{
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
- }], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: false }] }] } });
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, ...(ngDevMode ? [{ debugName: "config" }] : []));
3948
- this.imageUpload = input({}, ...(ngDevMode ? [{ debugName: "imageUpload" }] : []));
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
- }, ...(ngDevMode ? [{ debugName: "imageBubbleMenuConfig" }] : []));
4225
+ });
3957
4226
  this.hasAlignmentButtons = computed(() => this.imageBubbleMenuConfig().alignLeft ||
3958
4227
  this.imageBubbleMenuConfig().alignCenter ||
3959
- this.imageBubbleMenuConfig().alignRight, ...(ngDevMode ? [{ debugName: "hasAlignmentButtons" }] : []));
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
- }, ...(ngDevMode ? [{ debugName: "hasResizeButtons" }] : []));
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: "20.3.16", ngImport: i0, type: AteImageBubbleMenuComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
4062
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", 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: `
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: "20.3.16", ngImport: i0, type: AteImageBubbleMenuComponent, decorators: [{
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
- }], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: false }] }], imageUpload: [{ type: i0.Input, args: [{ isSignal: true, alias: "imageUpload", required: false }] }] } });
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, ...(ngDevMode ? [{ debugName: "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
- }, ...(ngDevMode ? [{ debugName: "tableBubbleMenuConfig" }] : []));
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: "20.3.16", ngImport: i0, type: AteTableBubbleMenuComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
4315
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", 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: `
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: "20.3.16", ngImport: i0, type: AteTableBubbleMenuComponent, decorators: [{
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
- }], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: false }] }] } });
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, ...(ngDevMode ? [{ debugName: "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
- }), ...(ngDevMode ? [{ debugName: "cellBubbleMenuConfig" }] : []));
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: "20.3.16", ngImport: i0, type: AteCellBubbleMenuComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
4577
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", 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: `
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: "20.3.16", ngImport: i0, type: AteCellBubbleMenuComponent, decorators: [{
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
- }], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: false }] }] } });
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(...(ngDevMode ? [{ debugName: "editor" }] : []));
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: "20.3.16", ngImport: i0, type: AteBaseSubBubbleMenu, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
4752
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "20.3.16", type: AteBaseSubBubbleMenu, isStandalone: true, 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 }); }
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: "20.3.16", ngImport: i0, type: AteBaseSubBubbleMenu, decorators: [{
5023
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteBaseSubBubbleMenu, decorators: [{
4755
5024
  type: Directive
4756
- }], ctorParameters: () => [], propDecorators: { editor: [{ type: i0.Input, args: [{ isSignal: true, alias: "editor", required: true }] }], menuRef: [{ type: i0.ViewChild, args: ["menuRef", { isSignal: true }] }] } });
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", ...(ngDevMode ? [{ debugName: "linkInput" }] : []));
4765
- this.editUrl = signal("", ...(ngDevMode ? [{ debugName: "editUrl" }] : []));
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: "20.3.16", ngImport: i0, type: AteLinkBubbleMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
4894
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.3.16", 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: `
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: "20.3.16", ngImport: i0, type: AteLinkBubbleMenuComponent, decorators: [{
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: () => [], propDecorators: { linkInput: [{ type: i0.ViewChild, args: ["linkInput", { isSignal: true }] }] } });
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", ...(ngDevMode ? [{ debugName: "colorInputRef" }] : []));
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", ...(ngDevMode ? [{ debugName: "activeMode" }] : []));
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
- }, ...(ngDevMode ? [{ debugName: "currentColor" }] : []));
5297
+ });
5029
5298
  this.hexValue = computed(() => {
5030
5299
  const color = this.currentColor();
5031
5300
  return color.replace("#", "").toUpperCase();
5032
- }, ...(ngDevMode ? [{ debugName: "hexValue" }] : []));
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: "20.3.16", ngImport: i0, type: AteColorBubbleMenuComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
5191
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", 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: `
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: "20.3.16", ngImport: i0, type: AteColorBubbleMenuComponent, decorators: [{
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
- }], propDecorators: { colorInputRef: [{ type: i0.ViewChild, args: ["colorInput", { isSignal: true }] }] } });
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(...(ngDevMode ? [{ debugName: "editor" }] : []));
5489
- this.config = input(undefined, ...(ngDevMode ? [{ debugName: "config" }] : []));
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("", ...(ngDevMode ? [{ debugName: "currentQuery" }] : []));
5764
+ this.currentQuery = signal("");
5496
5765
  this.slashRange = null;
5497
5766
  // Signal for selected index
5498
- this.selectedIndex = signal(0, ...(ngDevMode ? [{ debugName: "selectedIndex" }] : []));
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
- }, ...(ngDevMode ? [{ debugName: "commands" }] : []));
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
- }, ...(ngDevMode ? [{ debugName: "filteredCommands" }] : []));
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: "20.3.16", ngImport: i0, type: AteSlashCommandsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5762
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", 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: `
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: "20.3.16", ngImport: i0, type: AteSlashCommandsComponent, decorators: [{
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: () => [], propDecorators: { editor: [{ type: i0.Input, args: [{ isSignal: true, alias: "editor", required: true }] }], config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: false }] }], menuRef: [{ type: i0.ViewChild, args: ["menuRef", { isSignal: true }] }] } });
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(...(ngDevMode ? [{ debugName: "editor" }] : []));
5812
- this.hoveredData = input(null, ...(ngDevMode ? [{ debugName: "hoveredData" }] : []));
6080
+ this.editor = input.required();
6081
+ this.hoveredData = input(null);
5813
6082
  this.menuRef = viewChild.required("menuRef");
5814
- this.isInteracting = signal(false, ...(ngDevMode ? [{ debugName: "isInteracting" }] : []));
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: "20.3.16", ngImport: i0, type: AteBlockControlsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5997
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.3.16", 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: `
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: "20.3.16", ngImport: i0, type: AteBlockControlsComponent, decorators: [{
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: () => [], propDecorators: { editor: [{ type: i0.Input, args: [{ isSignal: true, alias: "editor", required: true }] }], hoveredData: [{ type: i0.Input, args: [{ isSignal: true, alias: "hoveredData", required: false }] }], menuRef: [{ type: i0.ViewChild, args: ["menuRef", { isSignal: true }] }] } });
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(...(ngDevMode ? [{ debugName: "editable" }] : []));
6063
- this.translations = input.required(...(ngDevMode ? [{ debugName: "translations" }] : []));
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: "20.3.16", ngImport: i0, type: AteEditToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6067
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.16", 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: `
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: "20.3.16", ngImport: i0, type: AteEditToggleComponent, decorators: [{
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
- }], propDecorators: { editable: [{ type: i0.Input, args: [{ isSignal: true, alias: "editable", required: true }] }], translations: [{ type: i0.Input, args: [{ isSignal: true, alias: "translations", required: true }] }], editToggle: [{ type: i0.Output, args: ["editToggle"] }] } });
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: "20.3.16", ngImport: i0, type: AteNoopValueAccessorDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
6109
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.16", type: AteNoopValueAccessorDirective, isStandalone: true, providers: [
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: "20.3.16", ngImport: i0, type: AteNoopValueAccessorDirective, decorators: [{
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, ...(ngDevMode ? [{ debugName: "editorSignal" }] : []));
6165
- const nodeSignal = signal(props.node, ...(ngDevMode ? [{ debugName: "nodeSignal" }] : []));
6166
- const decorationsSignal = signal(props.decorations, ...(ngDevMode ? [{ debugName: "decorationsSignal" }] : []));
6167
- const selectedSignal = signal(props.selected, ...(ngDevMode ? [{ debugName: "selectedSignal" }] : []));
6168
- const extensionSignal = signal(props.extension, ...(ngDevMode ? [{ debugName: "extensionSignal" }] : []));
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: "20.3.16", ngImport: i0, type: AteAngularNodeView, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
6220
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.16", type: AteAngularNodeView, isStandalone: true, ngImport: i0 }); }
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: "20.3.16", ngImport: i0, type: AteAngularNodeView, decorators: [{
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({}, ...(ngDevMode ? [{ debugName: "config" }] : []));
7021
- this.content = input("", ...(ngDevMode ? [{ debugName: "content" }] : []));
7022
- this.placeholder = input(undefined, ...(ngDevMode ? [{ debugName: "placeholder" }] : []));
7023
- this.editable = input(undefined, ...(ngDevMode ? [{ debugName: "editable" }] : []));
7024
- this.disabled = input(undefined, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
7025
- this.minHeight = input(undefined, ...(ngDevMode ? [{ debugName: "minHeight" }] : []));
7026
- this.height = input(undefined, ...(ngDevMode ? [{ debugName: "height" }] : []));
7027
- this.maxHeight = input(undefined, ...(ngDevMode ? [{ debugName: "maxHeight" }] : []));
7028
- this.fillContainer = input(undefined, ...(ngDevMode ? [{ debugName: "fillContainer" }] : []));
7029
- this.showToolbar = input(undefined, ...(ngDevMode ? [{ debugName: "showToolbar" }] : []));
7030
- this.showFooter = input(undefined, ...(ngDevMode ? [{ debugName: "showFooter" }] : []));
7031
- this.showCharacterCount = input(undefined, ...(ngDevMode ? [{ debugName: "showCharacterCount" }] : []));
7032
- this.showWordCount = input(undefined, ...(ngDevMode ? [{ debugName: "showWordCount" }] : []));
7033
- this.maxCharacters = input(undefined, ...(ngDevMode ? [{ debugName: "maxCharacters" }] : []));
7034
- this.enableOfficePaste = input(undefined, ...(ngDevMode ? [{ debugName: "enableOfficePaste" }] : []));
7035
- this.enableSlashCommands = input(undefined, ...(ngDevMode ? [{ debugName: "enableSlashCommands" }] : []));
7036
- this.slashCommands = input(undefined, ...(ngDevMode ? [{ debugName: "slashCommands" }] : []));
7037
- this.customSlashCommands = input(undefined, ...(ngDevMode ? [{ debugName: "customSlashCommands" }] : []));
7038
- this.blockControls = input(...(ngDevMode ? [undefined, { debugName: "blockControls" }] : []));
7039
- this.locale = input(undefined, ...(ngDevMode ? [{ debugName: "locale" }] : []));
7040
- this.autofocus = input(undefined, ...(ngDevMode ? [{ debugName: "autofocus" }] : []));
7041
- this.seamless = input(undefined, ...(ngDevMode ? [{ debugName: "seamless" }] : []));
7042
- this.floatingToolbar = input(undefined, ...(ngDevMode ? [{ debugName: "floatingToolbar" }] : []));
7043
- this.showEditToggle = input(undefined, ...(ngDevMode ? [{ debugName: "showEditToggle" }] : []));
7044
- this.spellcheck = input(undefined, ...(ngDevMode ? [{ debugName: "spellcheck" }] : []));
7045
- this.tiptapExtensions = input(undefined, ...(ngDevMode ? [{ debugName: "tiptapExtensions" }] : []));
7046
- this.tiptapOptions = input(undefined, ...(ngDevMode ? [{ debugName: "tiptapOptions" }] : []));
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, ...(ngDevMode ? [{ debugName: "showBubbleMenu" }] : []));
7049
- this.bubbleMenu = input(undefined, ...(ngDevMode ? [{ debugName: "bubbleMenu" }] : []));
7050
- this.showImageBubbleMenu = input(undefined, ...(ngDevMode ? [{ debugName: "showImageBubbleMenu" }] : []));
7051
- this.imageBubbleMenu = input(undefined, ...(ngDevMode ? [{ debugName: "imageBubbleMenu" }] : []));
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, ...(ngDevMode ? [{ debugName: "toolbar" }] : []));
7322
+ this.toolbar = input(undefined);
7054
7323
  // Configuration des menus de table
7055
- this.showTableBubbleMenu = input(undefined, ...(ngDevMode ? [{ debugName: "showTableBubbleMenu" }] : []));
7056
- this.tableBubbleMenu = input(undefined, ...(ngDevMode ? [{ debugName: "tableBubbleMenu" }] : []));
7057
- this.showCellBubbleMenu = input(undefined, ...(ngDevMode ? [{ debugName: "showCellBubbleMenu" }] : []));
7058
- this.cellBubbleMenu = input(undefined, ...(ngDevMode ? [{ debugName: "cellBubbleMenu" }] : []));
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, ...(ngDevMode ? [{ debugName: "stateCalculators" }] : []));
7331
+ this.stateCalculators = input(undefined);
7063
7332
  // Nouveau input pour la configuration de l'upload d'images
7064
- this.imageUpload = input(undefined, ...(ngDevMode ? [{ debugName: "imageUpload" }] : []));
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, ...(ngDevMode ? [{ debugName: "imageUploadHandler" }] : []));
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, ...(ngDevMode ? [{ debugName: "_editor" }] : []));
7096
- this._characterCount = signal(0, ...(ngDevMode ? [{ debugName: "_characterCount" }] : []));
7097
- this._wordCount = signal(0, ...(ngDevMode ? [{ debugName: "_wordCount" }] : []));
7098
- this._isDragOver = signal(false, ...(ngDevMode ? [{ debugName: "_isDragOver" }] : []));
7099
- this._editorFullyInitialized = signal(false, ...(ngDevMode ? [{ debugName: "_editorFullyInitialized" }] : []));
7100
- this._hoveredBlock = signal(null, ...(ngDevMode ? [{ debugName: "_hoveredBlock" }] : []));
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, ...(ngDevMode ? [{ debugName: "_isFormControlDisabled" }] : []));
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(), ...(ngDevMode ? [{ debugName: "mergedDisabled" }] : []));
7382
+ this.mergedDisabled = computed(() => (this.disabled() ?? this.effectiveConfig().disabled) || this.isFormControlDisabled());
7114
7383
  // Computed for editor states
7115
- this.isEditorReady = computed(() => this.editor() !== null, ...(ngDevMode ? [{ debugName: "isEditorReady" }] : []));
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
- }, ...(ngDevMode ? [{ debugName: "finalSeamless" }] : []));
7128
- this.finalEditable = computed(() => this.editable() ?? this.effectiveConfig().editable ?? true, ...(ngDevMode ? [{ debugName: "finalEditable" }] : []));
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, ...(ngDevMode ? [{ debugName: "finalPlaceholder" }] : []));
7132
- this.finalFillContainer = computed(() => this.fillContainer() ?? this.effectiveConfig().fillContainer, ...(ngDevMode ? [{ debugName: "finalFillContainer" }] : []));
7133
- this.finalShowFooter = computed(() => this.showFooter() ?? this.effectiveConfig().showFooter ?? true, ...(ngDevMode ? [{ debugName: "finalShowFooter" }] : []));
7134
- this.finalShowEditToggle = computed(() => this.showEditToggle() ?? this.effectiveConfig().showEditToggle ?? false, ...(ngDevMode ? [{ debugName: "finalShowEditToggle" }] : []));
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
- }, ...(ngDevMode ? [{ debugName: "finalHeight" }] : []));
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
- }, ...(ngDevMode ? [{ debugName: "finalMinHeight" }] : []));
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
- }, ...(ngDevMode ? [{ debugName: "finalMaxHeight" }] : []));
7147
- this.finalSpellcheck = computed(() => this.spellcheck() ?? this.effectiveConfig().spellcheck ?? true, ...(ngDevMode ? [{ debugName: "finalSpellcheck" }] : []));
7148
- this.finalEnableOfficePaste = computed(() => this.enableOfficePaste() ?? this.effectiveConfig().enableOfficePaste ?? true, ...(ngDevMode ? [{ debugName: "finalEnableOfficePaste" }] : []));
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, ...(ngDevMode ? [{ debugName: "finalShowToolbar" }] : []));
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
- }, ...(ngDevMode ? [{ debugName: "finalToolbarConfig" }] : []));
7163
- this.finalFloatingToolbar = computed(() => this.floatingToolbar() ?? this.effectiveConfig().floatingToolbar ?? false, ...(ngDevMode ? [{ debugName: "finalFloatingToolbar" }] : []));
7164
- this.finalShowBubbleMenu = computed(() => this.showBubbleMenu() ?? this.effectiveConfig().showBubbleMenu ?? true, ...(ngDevMode ? [{ debugName: "finalShowBubbleMenu" }] : []));
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
- }, ...(ngDevMode ? [{ debugName: "finalBubbleMenuConfig" }] : []));
7177
- this.finalShowImageBubbleMenu = computed(() => this.showImageBubbleMenu() ?? this.effectiveConfig().showImageBubbleMenu ?? true, ...(ngDevMode ? [{ debugName: "finalShowImageBubbleMenu" }] : []));
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
- }, ...(ngDevMode ? [{ debugName: "finalImageBubbleMenuConfig" }] : []));
7190
- this.finalShowTableBubbleMenu = computed(() => this.showTableBubbleMenu() ?? this.effectiveConfig().showTableMenu ?? true, ...(ngDevMode ? [{ debugName: "finalShowTableBubbleMenu" }] : []));
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
- }, ...(ngDevMode ? [{ debugName: "finalTableBubbleMenuConfig" }] : []));
7203
- this.finalShowCellBubbleMenu = computed(() => this.showCellBubbleMenu() ?? this.effectiveConfig().showCellMenu ?? true, ...(ngDevMode ? [{ debugName: "finalShowCellBubbleMenu" }] : []));
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
- }, ...(ngDevMode ? [{ debugName: "finalCellBubbleMenuConfig" }] : []));
7216
- this.finalEnableSlashCommands = computed(() => this.enableSlashCommands() ?? this.effectiveConfig().enableSlashCommands ?? true, ...(ngDevMode ? [{ debugName: "finalEnableSlashCommands" }] : []));
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
- }, ...(ngDevMode ? [{ debugName: "finalSlashCommandsConfig" }] : []));
7501
+ });
7233
7502
  // Behavior
7234
- this.finalAutofocus = computed(() => this.autofocus() ?? this.effectiveConfig().autofocus, ...(ngDevMode ? [{ debugName: "finalAutofocus" }] : []));
7235
- this.finalMaxCharacters = computed(() => this.maxCharacters() ?? this.effectiveConfig().maxCharacters, ...(ngDevMode ? [{ debugName: "finalMaxCharacters" }] : []));
7236
- this.finalBlockControls = computed(() => this.blockControls() ?? this.effectiveConfig().blockControls ?? "none", ...(ngDevMode ? [{ debugName: "finalBlockControls" }] : []));
7237
- this.finalShowCharacterCount = computed(() => this.showCharacterCount() ?? this.effectiveConfig().showCharacterCount ?? true, ...(ngDevMode ? [{ debugName: "finalShowCharacterCount" }] : []));
7238
- this.finalShowWordCount = computed(() => this.showWordCount() ?? this.effectiveConfig().showWordCount ?? true, ...(ngDevMode ? [{ debugName: "finalShowWordCount" }] : []));
7239
- this.finalLocale = computed(() => this.locale() ?? this.effectiveConfig().locale, ...(ngDevMode ? [{ debugName: "finalLocale" }] : []));
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 ?? [], ...(ngDevMode ? [{ debugName: "finalTiptapExtensions" }] : []));
7242
- this.finalTiptapOptions = computed(() => this.tiptapOptions() ?? this.effectiveConfig().tiptapOptions ?? {}, ...(ngDevMode ? [{ debugName: "finalTiptapOptions" }] : []));
7243
- this.finalStateCalculators = computed(() => this.stateCalculators() ?? this.effectiveConfig().stateCalculators ?? [], ...(ngDevMode ? [{ debugName: "finalStateCalculators" }] : []));
7244
- this.finalAngularNodesConfig = computed(() => this.effectiveConfig().angularNodes ?? [], ...(ngDevMode ? [{ debugName: "finalAngularNodesConfig" }] : []));
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
- }, ...(ngDevMode ? [{ debugName: "finalImageUploadConfig" }] : []));
7260
- this.finalImageUploadHandler = computed(() => this.imageUploadHandler() ?? this.effectiveConfig().imageUpload?.handler, ...(ngDevMode ? [{ debugName: "finalImageUploadHandler" }] : []));
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
- }, ...(ngDevMode ? [{ debugName: "currentTranslations" }] : []));
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
- }, ...(ngDevMode ? [{ debugName: "effectiveConfig" }] : []));
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: "20.3.16", ngImport: i0, type: AngularTiptapEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
7697
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", 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], viewQueries: [{ propertyName: "editorElement", first: true, predicate: ["editorElement"], descendants: true, isSignal: true }], hostDirectives: [{ directive: AteNoopValueAccessorDirective }], ngImport: i0, template: `
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: "20.3.16", ngImport: i0, type: AngularTiptapEditorComponent, decorators: [{
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: () => [], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: false }] }], content: [{ type: i0.Input, args: [{ isSignal: true, alias: "content", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], editable: [{ type: i0.Input, args: [{ isSignal: true, alias: "editable", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], minHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "minHeight", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], maxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxHeight", required: false }] }], fillContainer: [{ type: i0.Input, args: [{ isSignal: true, alias: "fillContainer", required: false }] }], showToolbar: [{ type: i0.Input, args: [{ isSignal: true, alias: "showToolbar", required: false }] }], showFooter: [{ type: i0.Input, args: [{ isSignal: true, alias: "showFooter", required: false }] }], showCharacterCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "showCharacterCount", required: false }] }], showWordCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "showWordCount", required: false }] }], maxCharacters: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxCharacters", required: false }] }], enableOfficePaste: [{ type: i0.Input, args: [{ isSignal: true, alias: "enableOfficePaste", required: false }] }], enableSlashCommands: [{ type: i0.Input, args: [{ isSignal: true, alias: "enableSlashCommands", required: false }] }], slashCommands: [{ type: i0.Input, args: [{ isSignal: true, alias: "slashCommands", required: false }] }], customSlashCommands: [{ type: i0.Input, args: [{ isSignal: true, alias: "customSlashCommands", required: false }] }], blockControls: [{ type: i0.Input, args: [{ isSignal: true, alias: "blockControls", required: false }] }], locale: [{ type: i0.Input, args: [{ isSignal: true, alias: "locale", required: false }] }], autofocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "autofocus", required: false }] }], seamless: [{ type: i0.Input, args: [{ isSignal: true, alias: "seamless", required: false }] }], floatingToolbar: [{ type: i0.Input, args: [{ isSignal: true, alias: "floatingToolbar", required: false }] }], showEditToggle: [{ type: i0.Input, args: [{ isSignal: true, alias: "showEditToggle", required: false }] }], spellcheck: [{ type: i0.Input, args: [{ isSignal: true, alias: "spellcheck", required: false }] }], tiptapExtensions: [{ type: i0.Input, args: [{ isSignal: true, alias: "tiptapExtensions", required: false }] }], tiptapOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "tiptapOptions", required: false }] }], showBubbleMenu: [{ type: i0.Input, args: [{ isSignal: true, alias: "showBubbleMenu", required: false }] }], bubbleMenu: [{ type: i0.Input, args: [{ isSignal: true, alias: "bubbleMenu", required: false }] }], showImageBubbleMenu: [{ type: i0.Input, args: [{ isSignal: true, alias: "showImageBubbleMenu", required: false }] }], imageBubbleMenu: [{ type: i0.Input, args: [{ isSignal: true, alias: "imageBubbleMenu", required: false }] }], toolbar: [{ type: i0.Input, args: [{ isSignal: true, alias: "toolbar", required: false }] }], showTableBubbleMenu: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTableBubbleMenu", required: false }] }], tableBubbleMenu: [{ type: i0.Input, args: [{ isSignal: true, alias: "tableBubbleMenu", required: false }] }], showCellBubbleMenu: [{ type: i0.Input, args: [{ isSignal: true, alias: "showCellBubbleMenu", required: false }] }], cellBubbleMenu: [{ type: i0.Input, args: [{ isSignal: true, alias: "cellBubbleMenu", required: false }] }], stateCalculators: [{ type: i0.Input, args: [{ isSignal: true, alias: "stateCalculators", required: false }] }], imageUpload: [{ type: i0.Input, args: [{ isSignal: true, alias: "imageUpload", required: false }] }], imageUploadHandler: [{ type: i0.Input, args: [{ isSignal: true, alias: "imageUploadHandler", required: false }] }], contentChange: [{ type: i0.Output, args: ["contentChange"] }], editorCreated: [{ type: i0.Output, args: ["editorCreated"] }], editorUpdate: [{ type: i0.Output, args: ["editorUpdate"] }], editorFocus: [{ type: i0.Output, args: ["editorFocus"] }], editorBlur: [{ type: i0.Output, args: ["editorBlur"] }], editableChange: [{ type: i0.Output, args: ["editableChange"] }], editorElement: [{ type: i0.ViewChild, args: ["editorElement", { isSignal: true }] }] } });
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
- provideEnvironmentInitializer(() => {
8006
- const injector = inject(Injector);
8007
- setGlobalInjector(injector);
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