@flogeez/angular-tiptap-editor 2.4.0 → 2.4.1

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 (104) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/esm2022/flogeez-angular-tiptap-editor.mjs +5 -0
  3. package/esm2022/lib/ate-editor.provider.mjs +38 -0
  4. package/esm2022/lib/components/bubble-menus/base/ate-base-bubble-menu.mjs +207 -0
  5. package/esm2022/lib/components/bubble-menus/base/ate-base-sub-bubble-menu.mjs +133 -0
  6. package/esm2022/lib/components/bubble-menus/color/ate-color-bubble-menu.component.mjs +365 -0
  7. package/esm2022/lib/components/bubble-menus/image/ate-image-bubble-menu.component.mjs +226 -0
  8. package/esm2022/lib/components/bubble-menus/link/ate-link-bubble-menu.component.mjs +247 -0
  9. package/esm2022/lib/components/bubble-menus/table/ate-cell-bubble-menu.component.mjs +121 -0
  10. package/esm2022/lib/components/bubble-menus/table/ate-table-bubble-menu.component.mjs +266 -0
  11. package/esm2022/lib/components/bubble-menus/text/ate-bubble-menu.component.mjs +294 -0
  12. package/esm2022/lib/components/color-picker/ate-color-picker.component.mjs +122 -0
  13. package/esm2022/lib/components/edit-toggle/ate-edit-toggle.component.mjs +42 -0
  14. package/esm2022/lib/components/editor/angular-tiptap-editor.component.mjs +953 -0
  15. package/esm2022/lib/components/slash-commands/ate-slash-commands.component.mjs +329 -0
  16. package/esm2022/lib/components/toolbar/ate-toolbar.component.mjs +531 -0
  17. package/esm2022/lib/components/ui/ate-button.component.mjs +90 -0
  18. package/esm2022/lib/components/ui/ate-separator.component.mjs +31 -0
  19. package/esm2022/lib/config/ate-editor.config.mjs +76 -0
  20. package/esm2022/lib/config/ate-global-config.token.mjs +6 -0
  21. package/esm2022/lib/config/ate-slash-commands.config.mjs +130 -0
  22. package/esm2022/lib/directives/ate-noop-value-accessor.directive.mjs +40 -0
  23. package/esm2022/lib/extensions/ate-link-click-behavior.extension.mjs +32 -0
  24. package/esm2022/lib/extensions/ate-resizable-image.extension.mjs +270 -0
  25. package/esm2022/lib/extensions/ate-table.extension.mjs +29 -0
  26. package/esm2022/lib/extensions/ate-tiptap-state.extension.mjs +85 -0
  27. package/esm2022/lib/extensions/ate-upload-progress.extension.mjs +195 -0
  28. package/esm2022/lib/extensions/calculators/ate-discovery.calculator.mjs +62 -0
  29. package/esm2022/lib/extensions/calculators/ate-image.calculator.mjs +8 -0
  30. package/esm2022/lib/extensions/calculators/ate-marks.calculator.mjs +75 -0
  31. package/esm2022/lib/extensions/calculators/ate-selection.calculator.mjs +35 -0
  32. package/esm2022/lib/extensions/calculators/ate-structure.calculator.mjs +34 -0
  33. package/esm2022/lib/extensions/calculators/ate-table.calculator.mjs +38 -0
  34. package/esm2022/lib/models/ate-bubble-menu.model.mjs +49 -0
  35. package/esm2022/lib/models/ate-editor-config.model.mjs +2 -0
  36. package/esm2022/lib/models/ate-editor-state.model.mjs +90 -0
  37. package/esm2022/lib/models/ate-image.model.mjs +2 -0
  38. package/esm2022/lib/models/ate-toolbar.model.mjs +35 -0
  39. package/esm2022/lib/node-view/ate-angular-node-view.mjs +97 -0
  40. package/esm2022/lib/node-view/ate-injector.registry.mjs +16 -0
  41. package/esm2022/lib/node-view/ate-node-view.factory.mjs +125 -0
  42. package/esm2022/lib/node-view/ate-node-view.models.mjs +2 -0
  43. package/esm2022/lib/node-view/ate-node-view.renderer.mjs +154 -0
  44. package/esm2022/lib/node-view/ate-register-angular-component.mjs +49 -0
  45. package/esm2022/lib/services/ate-color-picker.service.mjs +193 -0
  46. package/esm2022/lib/services/ate-editor-commands.service.mjs +465 -0
  47. package/esm2022/lib/services/ate-i18n.service.mjs +410 -0
  48. package/esm2022/lib/services/ate-image.service.mjs +368 -0
  49. package/esm2022/lib/services/ate-link.service.mjs +97 -0
  50. package/esm2022/lib/utils/ate-color.utils.mjs +60 -0
  51. package/esm2022/public-api.mjs +93 -0
  52. package/fesm2022/flogeez-angular-tiptap-editor.mjs +313 -346
  53. package/fesm2022/flogeez-angular-tiptap-editor.mjs.map +1 -1
  54. package/index.d.ts +3 -1673
  55. package/lib/ate-editor.provider.d.ts +21 -0
  56. package/lib/components/bubble-menus/base/ate-base-bubble-menu.d.ts +71 -0
  57. package/lib/components/bubble-menus/base/ate-base-sub-bubble-menu.d.ts +60 -0
  58. package/lib/components/bubble-menus/color/ate-color-bubble-menu.component.d.ts +77 -0
  59. package/lib/components/bubble-menus/image/ate-image-bubble-menu.component.d.ts +52 -0
  60. package/lib/components/bubble-menus/link/ate-link-bubble-menu.component.d.ts +55 -0
  61. package/lib/components/bubble-menus/table/ate-cell-bubble-menu.component.d.ts +12 -0
  62. package/lib/components/bubble-menus/table/ate-table-bubble-menu.component.d.ts +24 -0
  63. package/lib/components/bubble-menus/text/ate-bubble-menu.component.d.ts +53 -0
  64. package/lib/components/color-picker/ate-color-picker.component.d.ts +54 -0
  65. package/lib/components/edit-toggle/ate-edit-toggle.component.d.ts +13 -0
  66. package/lib/components/editor/angular-tiptap-editor.component.d.ts +235 -0
  67. package/lib/components/slash-commands/ate-slash-commands.component.d.ts +43 -0
  68. package/lib/components/toolbar/ate-toolbar.component.d.ts +47 -0
  69. package/lib/components/ui/ate-button.component.d.ts +25 -0
  70. package/lib/components/ui/ate-separator.component.d.ts +7 -0
  71. package/lib/config/ate-editor.config.d.ts +7 -0
  72. package/lib/config/ate-global-config.token.d.ts +6 -0
  73. package/lib/config/ate-slash-commands.config.d.ts +41 -0
  74. package/lib/directives/ate-noop-value-accessor.directive.d.ts +13 -0
  75. package/lib/extensions/ate-link-click-behavior.extension.d.ts +2 -0
  76. package/lib/extensions/ate-resizable-image.extension.d.ts +27 -0
  77. package/lib/extensions/ate-table.extension.d.ts +2 -0
  78. package/lib/extensions/ate-tiptap-state.extension.d.ts +7 -0
  79. package/lib/extensions/ate-upload-progress.extension.d.ts +7 -0
  80. package/lib/extensions/calculators/ate-discovery.calculator.d.ts +7 -0
  81. package/lib/extensions/calculators/ate-image.calculator.d.ts +2 -0
  82. package/lib/extensions/calculators/ate-marks.calculator.d.ts +2 -0
  83. package/lib/extensions/calculators/ate-selection.calculator.d.ts +2 -0
  84. package/lib/extensions/calculators/ate-structure.calculator.d.ts +2 -0
  85. package/lib/extensions/calculators/ate-table.calculator.d.ts +2 -0
  86. package/lib/models/ate-bubble-menu.model.d.ts +33 -0
  87. package/lib/models/ate-editor-config.model.d.ts +100 -0
  88. package/lib/models/ate-editor-state.model.d.ts +109 -0
  89. package/lib/models/ate-image.model.d.ts +104 -0
  90. package/lib/models/ate-toolbar.model.d.ts +18 -0
  91. package/lib/node-view/ate-angular-node-view.d.ts +115 -0
  92. package/lib/node-view/ate-injector.registry.d.ts +3 -0
  93. package/lib/node-view/ate-node-view.factory.d.ts +10 -0
  94. package/lib/node-view/ate-node-view.models.d.ts +138 -0
  95. package/lib/node-view/ate-node-view.renderer.d.ts +23 -0
  96. package/lib/node-view/ate-register-angular-component.d.ts +35 -0
  97. package/lib/services/ate-color-picker.service.d.ts +65 -0
  98. package/lib/services/ate-editor-commands.service.d.ts +72 -0
  99. package/lib/services/ate-i18n.service.d.ts +394 -0
  100. package/lib/services/ate-image.service.d.ts +71 -0
  101. package/lib/services/ate-link.service.d.ts +42 -0
  102. package/lib/utils/ate-color.utils.d.ts +12 -0
  103. package/package.json +3 -1
  104. package/public-api.d.ts +112 -0
@@ -0,0 +1,49 @@
1
+ import { createAngularComponentExtension } from "./ate-node-view.factory";
2
+ import { getGlobalInjector } from "./ate-injector.registry";
3
+ /**
4
+ * Registers ANY Angular component as a TipTap node extension.
5
+ *
6
+ * This function is the single public entry point for adding custom components.
7
+ * It supports two distinct modes:
8
+ *
9
+ * 1. **TipTap-Aware Mode** (the component extends `AteAngularNodeView`):
10
+ * Grants direct access to the TipTap API (`editor`, `node`, `updateAttributes`, etc.) within the component.
11
+ *
12
+ * 2. **Standard Mode** (library or legacy components):
13
+ * Allows using any existing Angular component. Its `@Input()` properties are automatically
14
+ * synchronized with TipTap node attributes.
15
+ *
16
+ * @param injectorOrOptions - The Angular Injector OR the configuration options
17
+ * @param maybeOptions - Configuration options (if the first param was an injector)
18
+ * @returns A TipTap Node extension ready to be used
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * // Modern way (requires provideAteEditor())
23
+ * registerAngularComponent({
24
+ * component: MyComponent,
25
+ * name: 'myComponent'
26
+ * });
27
+ *
28
+ * // Classic way
29
+ * registerAngularComponent(injector, {
30
+ * component: MyComponent
31
+ * });
32
+ * ```
33
+ */
34
+ export function registerAngularComponent(injectorOrOptions, maybeOptions) {
35
+ let injector;
36
+ let options;
37
+ // Duck-typing check: Injectors have a 'get' method
38
+ const isInjector = (obj) => obj !== null && typeof obj === "object" && typeof obj.get === "function";
39
+ if (isInjector(injectorOrOptions)) {
40
+ injector = injectorOrOptions;
41
+ options = maybeOptions;
42
+ }
43
+ else {
44
+ injector = getGlobalInjector();
45
+ options = injectorOrOptions;
46
+ }
47
+ return createAngularComponentExtension(injector, options);
48
+ }
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRlLXJlZ2lzdGVyLWFuZ3VsYXItY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci10aXB0YXAtZWRpdG9yL3NyYy9saWIvbm9kZS12aWV3L2F0ZS1yZWdpc3Rlci1hbmd1bGFyLWNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU1RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOEJHO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUN0QyxpQkFBZ0UsRUFDaEUsWUFBaUQ7SUFFakQsSUFBSSxRQUFrQixDQUFDO0lBQ3ZCLElBQUksT0FBMkMsQ0FBQztJQUVoRCxtREFBbUQ7SUFDbkQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFZLEVBQW1CLEVBQUUsQ0FDbkQsR0FBRyxLQUFLLElBQUksSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksT0FBUSxHQUFnQixDQUFDLEdBQUcsS0FBSyxVQUFVLENBQUM7SUFFekYsSUFBSSxVQUFVLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO1FBQ2xDLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQztRQUM3QixPQUFPLEdBQUcsWUFBYSxDQUFDO0lBQzFCLENBQUM7U0FBTSxDQUFDO1FBQ04sUUFBUSxHQUFHLGlCQUFpQixFQUFFLENBQUM7UUFDL0IsT0FBTyxHQUFHLGlCQUF1RCxDQUFDO0lBQ3BFLENBQUM7SUFFRCxPQUFPLCtCQUErQixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUM1RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0b3IgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgTm9kZSB9IGZyb20gXCJAdGlwdGFwL2NvcmVcIjtcbmltcG9ydCB7IFJlZ2lzdGVyQW5ndWxhckNvbXBvbmVudE9wdGlvbnMgfSBmcm9tIFwiLi9hdGUtbm9kZS12aWV3Lm1vZGVsc1wiO1xuaW1wb3J0IHsgY3JlYXRlQW5ndWxhckNvbXBvbmVudEV4dGVuc2lvbiB9IGZyb20gXCIuL2F0ZS1ub2RlLXZpZXcuZmFjdG9yeVwiO1xuaW1wb3J0IHsgZ2V0R2xvYmFsSW5qZWN0b3IgfSBmcm9tIFwiLi9hdGUtaW5qZWN0b3IucmVnaXN0cnlcIjtcblxuLyoqXG4gKiBSZWdpc3RlcnMgQU5ZIEFuZ3VsYXIgY29tcG9uZW50IGFzIGEgVGlwVGFwIG5vZGUgZXh0ZW5zaW9uLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIHNpbmdsZSBwdWJsaWMgZW50cnkgcG9pbnQgZm9yIGFkZGluZyBjdXN0b20gY29tcG9uZW50cy5cbiAqIEl0IHN1cHBvcnRzIHR3byBkaXN0aW5jdCBtb2RlczpcbiAqXG4gKiAxLiAqKlRpcFRhcC1Bd2FyZSBNb2RlKiogKHRoZSBjb21wb25lbnQgZXh0ZW5kcyBgQXRlQW5ndWxhck5vZGVWaWV3YCk6XG4gKiAgICBHcmFudHMgZGlyZWN0IGFjY2VzcyB0byB0aGUgVGlwVGFwIEFQSSAoYGVkaXRvcmAsIGBub2RlYCwgYHVwZGF0ZUF0dHJpYnV0ZXNgLCBldGMuKSB3aXRoaW4gdGhlIGNvbXBvbmVudC5cbiAqXG4gKiAyLiAqKlN0YW5kYXJkIE1vZGUqKiAobGlicmFyeSBvciBsZWdhY3kgY29tcG9uZW50cyk6XG4gKiAgICBBbGxvd3MgdXNpbmcgYW55IGV4aXN0aW5nIEFuZ3VsYXIgY29tcG9uZW50LiBJdHMgYEBJbnB1dCgpYCBwcm9wZXJ0aWVzIGFyZSBhdXRvbWF0aWNhbGx5XG4gKiAgICBzeW5jaHJvbml6ZWQgd2l0aCBUaXBUYXAgbm9kZSBhdHRyaWJ1dGVzLlxuICpcbiAqIEBwYXJhbSBpbmplY3Rvck9yT3B0aW9ucyAtIFRoZSBBbmd1bGFyIEluamVjdG9yIE9SIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAqIEBwYXJhbSBtYXliZU9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgKGlmIHRoZSBmaXJzdCBwYXJhbSB3YXMgYW4gaW5qZWN0b3IpXG4gKiBAcmV0dXJucyBBIFRpcFRhcCBOb2RlIGV4dGVuc2lvbiByZWFkeSB0byBiZSB1c2VkXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIE1vZGVybiB3YXkgKHJlcXVpcmVzIHByb3ZpZGVBdGVFZGl0b3IoKSlcbiAqIHJlZ2lzdGVyQW5ndWxhckNvbXBvbmVudCh7XG4gKiAgIGNvbXBvbmVudDogTXlDb21wb25lbnQsXG4gKiAgIG5hbWU6ICdteUNvbXBvbmVudCdcbiAqIH0pO1xuICpcbiAqIC8vIENsYXNzaWMgd2F5XG4gKiByZWdpc3RlckFuZ3VsYXJDb21wb25lbnQoaW5qZWN0b3IsIHtcbiAqICAgY29tcG9uZW50OiBNeUNvbXBvbmVudFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQW5ndWxhckNvbXBvbmVudDxUID0gdW5rbm93bj4oXG4gIGluamVjdG9yT3JPcHRpb25zOiBJbmplY3RvciB8IFJlZ2lzdGVyQW5ndWxhckNvbXBvbmVudE9wdGlvbnM8VD4sXG4gIG1heWJlT3B0aW9ucz86IFJlZ2lzdGVyQW5ndWxhckNvbXBvbmVudE9wdGlvbnM8VD5cbik6IE5vZGUge1xuICBsZXQgaW5qZWN0b3I6IEluamVjdG9yO1xuICBsZXQgb3B0aW9uczogUmVnaXN0ZXJBbmd1bGFyQ29tcG9uZW50T3B0aW9uczxUPjtcblxuICAvLyBEdWNrLXR5cGluZyBjaGVjazogSW5qZWN0b3JzIGhhdmUgYSAnZ2V0JyBtZXRob2RcbiAgY29uc3QgaXNJbmplY3RvciA9IChvYmo6IHVua25vd24pOiBvYmogaXMgSW5qZWN0b3IgPT5cbiAgICBvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgKG9iaiBhcyBJbmplY3RvcikuZ2V0ID09PSBcImZ1bmN0aW9uXCI7XG5cbiAgaWYgKGlzSW5qZWN0b3IoaW5qZWN0b3JPck9wdGlvbnMpKSB7XG4gICAgaW5qZWN0b3IgPSBpbmplY3Rvck9yT3B0aW9ucztcbiAgICBvcHRpb25zID0gbWF5YmVPcHRpb25zITtcbiAgfSBlbHNlIHtcbiAgICBpbmplY3RvciA9IGdldEdsb2JhbEluamVjdG9yKCk7XG4gICAgb3B0aW9ucyA9IGluamVjdG9yT3JPcHRpb25zIGFzIFJlZ2lzdGVyQW5ndWxhckNvbXBvbmVudE9wdGlvbnM8VD47XG4gIH1cblxuICByZXR1cm4gY3JlYXRlQW5ndWxhckNvbXBvbmVudEV4dGVuc2lvbihpbmplY3Rvciwgb3B0aW9ucyk7XG59XG4iXX0=
@@ -0,0 +1,193 @@
1
+ import { Injectable, signal } from "@angular/core";
2
+ import { normalizeColor, getLuminance, getContrastColor } from "../utils/ate-color.utils";
3
+ import * as i0 from "@angular/core";
4
+ export class AteColorPickerService {
5
+ constructor() {
6
+ this.storedSelection = null;
7
+ // ============================================
8
+ // State Signals (owned by this service)
9
+ // ============================================
10
+ /** Current edit mode: null when closed, 'text' or 'highlight' when open */
11
+ this.editMode = signal(null);
12
+ /** Reference to the element that triggered the menu (for anchoring) */
13
+ this.menuTrigger = signal(null);
14
+ /** Whether the user is currently interacting with the picker UI (e.g. typing) */
15
+ this.isInteracting = signal(false);
16
+ }
17
+ // ============================================
18
+ // Menu Lifecycle Methods
19
+ // ============================================
20
+ /**
21
+ * Open the color picker menu in the specified mode.
22
+ */
23
+ open(mode, trigger) {
24
+ this.menuTrigger.set(trigger || null);
25
+ this.editMode.set(mode);
26
+ }
27
+ /**
28
+ * Close the color picker menu.
29
+ */
30
+ close() {
31
+ this.editMode.set(null);
32
+ this.isInteracting.set(false);
33
+ }
34
+ /**
35
+ * Set interaction state (prevents premature closing when blurring editor)
36
+ */
37
+ setInteracting(value) {
38
+ this.isInteracting.set(value);
39
+ }
40
+ /**
41
+ * Toggle color picker from UI (extracts trigger from event).
42
+ */
43
+ toggle(editor, mode, event) {
44
+ if (!editor) {
45
+ return;
46
+ }
47
+ let trigger;
48
+ if (event && typeof event !== "string") {
49
+ const target = event.target;
50
+ trigger = event.currentTarget || target?.closest("button") || target;
51
+ }
52
+ this.open(mode, trigger);
53
+ }
54
+ // ============================================
55
+ // Selection Capture (for reliable color application)
56
+ // ============================================
57
+ /**
58
+ * Capture current editor selection.
59
+ */
60
+ captureSelection(editor) {
61
+ if (!editor) {
62
+ return;
63
+ }
64
+ this.storedSelection = {
65
+ from: editor.state.selection.from,
66
+ to: editor.state.selection.to,
67
+ };
68
+ }
69
+ /**
70
+ * Get last captured selection.
71
+ */
72
+ getStoredSelection() {
73
+ return this.storedSelection;
74
+ }
75
+ /**
76
+ * Clear captured selection.
77
+ */
78
+ done() {
79
+ this.storedSelection = null;
80
+ this.menuTrigger.set(null);
81
+ }
82
+ // ============================================
83
+ // Color Application Commands
84
+ // ============================================
85
+ /**
86
+ * Apply text color to selection.
87
+ */
88
+ applyColor(editor, color, addToHistory = true, focus = true) {
89
+ if (!editor) {
90
+ return;
91
+ }
92
+ const stored = this.storedSelection;
93
+ let chain = editor.chain();
94
+ if (focus) {
95
+ chain = chain.focus();
96
+ }
97
+ if (stored && (editor.state.selection.empty || !editor.isFocused)) {
98
+ chain = chain.setTextSelection(stored);
99
+ }
100
+ else if (editor.state.selection.empty && !stored) {
101
+ chain = chain.extendMarkRange("textStyle");
102
+ }
103
+ chain.setColor(color);
104
+ if (addToHistory === false) {
105
+ chain = chain.setMeta("addToHistory", false);
106
+ }
107
+ chain.run();
108
+ }
109
+ /**
110
+ * Remove text color from selection.
111
+ */
112
+ unsetColor(editor, focus = true) {
113
+ if (!editor) {
114
+ return;
115
+ }
116
+ const stored = this.storedSelection;
117
+ let chain = editor.chain();
118
+ if (focus) {
119
+ chain = chain.focus();
120
+ }
121
+ if (stored) {
122
+ chain = chain.setTextSelection(stored);
123
+ }
124
+ else if (editor.state.selection.empty) {
125
+ chain = chain.extendMarkRange("textStyle");
126
+ }
127
+ chain.unsetColor();
128
+ chain.run();
129
+ }
130
+ /**
131
+ * Apply highlight color to selection.
132
+ */
133
+ applyHighlight(editor, color, addToHistory = true, focus = true) {
134
+ if (!editor) {
135
+ return;
136
+ }
137
+ const stored = this.storedSelection;
138
+ let chain = editor.chain();
139
+ if (focus) {
140
+ chain = chain.focus();
141
+ }
142
+ if (stored && (editor.state.selection.empty || !editor.isFocused)) {
143
+ chain = chain.setTextSelection(stored);
144
+ }
145
+ else if (editor.state.selection.empty && !stored) {
146
+ chain = chain.extendMarkRange("highlight");
147
+ }
148
+ chain.setHighlight({ color });
149
+ if (addToHistory === false) {
150
+ chain = chain.setMeta("addToHistory", false);
151
+ }
152
+ chain.run();
153
+ }
154
+ /**
155
+ * Remove highlight from selection.
156
+ */
157
+ unsetHighlight(editor, focus = true) {
158
+ if (!editor) {
159
+ return;
160
+ }
161
+ const stored = this.storedSelection;
162
+ let chain = editor.chain();
163
+ if (focus) {
164
+ chain = chain.focus();
165
+ }
166
+ if (stored) {
167
+ chain = chain.setTextSelection(stored);
168
+ }
169
+ else if (editor.state.selection.empty) {
170
+ chain = chain.extendMarkRange("highlight");
171
+ }
172
+ chain.unsetHighlight();
173
+ chain.run();
174
+ }
175
+ // ============================================
176
+ // Color Utilities (Delegated to color.utils.ts)
177
+ // ============================================
178
+ normalizeColor(color) {
179
+ return normalizeColor(color) || "#000000";
180
+ }
181
+ getLuminance(color) {
182
+ return getLuminance(color);
183
+ }
184
+ getContrastColor(color) {
185
+ return getContrastColor(color);
186
+ }
187
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteColorPickerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
188
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteColorPickerService }); }
189
+ }
190
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteColorPickerService, decorators: [{
191
+ type: Injectable
192
+ }] });
193
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRlLWNvbG9yLXBpY2tlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci10aXB0YXAtZWRpdG9yL3NyYy9saWIvc2VydmljZXMvYXRlLWNvbG9yLXBpY2tlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7O0FBVTFGLE1BQU0sT0FBTyxxQkFBcUI7SUFEbEM7UUFFVSxvQkFBZSxHQUFtQyxJQUFJLENBQUM7UUFFL0QsK0NBQStDO1FBQy9DLHdDQUF3QztRQUN4QywrQ0FBK0M7UUFFL0MsMkVBQTJFO1FBQ2xFLGFBQVEsR0FBRyxNQUFNLENBQTBCLElBQUksQ0FBQyxDQUFDO1FBRTFELHVFQUF1RTtRQUM5RCxnQkFBVyxHQUFHLE1BQU0sQ0FBcUIsSUFBSSxDQUFDLENBQUM7UUFFeEQsaUZBQWlGO1FBQ3hFLGtCQUFhLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0tBeU1qRDtJQXZNQywrQ0FBK0M7SUFDL0MseUJBQXlCO0lBQ3pCLCtDQUErQztJQUUvQzs7T0FFRztJQUNILElBQUksQ0FBQyxJQUFzQixFQUFFLE9BQXFCO1FBQ2hELElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLO1FBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFD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QUFHLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFRCwrQ0FBK0M7SUFDL0MsZ0RBQWdEO0lBQ2hELCtDQUErQztJQUUvQyxjQUFjLENBQUMsS0FBZ0M7UUFDN0MsT0FBTyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksU0FBUyxDQUFDO0lBQzVDLENBQUM7SUFFRCxZQUFZLENBQUMsS0FBYTtRQUN4QixPQUFPLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBYTtRQUM1QixPQUFPLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7K0dBdE5VLHFCQUFxQjttSEFBckIscUJBQXFCOzs0RkFBckIscUJBQXFCO2tCQURqQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgc2lnbmFsIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB0eXBlIHsgRWRpdG9yIH0gZnJvbSBcIkB0aXB0YXAvY29yZVwiO1xuaW1wb3J0IHsgbm9ybWFsaXplQ29sb3IsIGdldEx1bWluYW5jZSwgZ2V0Q29udHJhc3RDb2xvciB9IGZyb20gXCIuLi91dGlscy9hdGUtY29sb3IudXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBBdGVDb2xvclBpY2tlclNlbGVjdGlvbiB7XG4gIGZyb206IG51bWJlcjtcbiAgdG86IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgQXRlQ29sb3JFZGl0TW9kZSA9IFwidGV4dFwiIHwgXCJoaWdobGlnaHRcIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEF0ZUNvbG9yUGlja2VyU2VydmljZSB7XG4gIHByaXZhdGUgc3RvcmVkU2VsZWN0aW9uOiBBdGVDb2xvclBpY2tlclNlbGVjdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFN0YXRlIFNpZ25hbHMgKG93bmVkIGJ5IHRoaXMgc2VydmljZSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogQ3VycmVudCBlZGl0IG1vZGU6IG51bGwgd2hlbiBjbG9zZWQsICd0ZXh0JyBvciAnaGlnaGxpZ2h0JyB3aGVuIG9wZW4gKi9cbiAgcmVhZG9ubHkgZWRpdE1vZGUgPSBzaWduYWw8QXRlQ29sb3JFZGl0TW9kZSB8IG51bGw+KG51bGwpO1xuXG4gIC8qKiBSZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIG1lbnUgKGZvciBhbmNob3JpbmcpICovXG4gIHJlYWRvbmx5IG1lbnVUcmlnZ2VyID0gc2lnbmFsPEhUTUxFbGVtZW50IHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHVzZXIgaXMgY3VycmVudGx5IGludGVyYWN0aW5nIHdpdGggdGhlIHBpY2tlciBVSSAoZS5nLiB0eXBpbmcpICovXG4gIHJlYWRvbmx5IGlzSW50ZXJhY3RpbmcgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE1lbnUgTGlmZWN5Y2xlIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogT3BlbiB0aGUgY29sb3IgcGlja2VyIG1lbnUgaW4gdGhlIHNwZWNpZmllZCBtb2RlLlxuICAgKi9cbiAgb3Blbihtb2RlOiBBdGVDb2xvckVkaXRNb2RlLCB0cmlnZ2VyPzogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLm1lbnVUcmlnZ2VyLnNldCh0cmlnZ2VyIHx8IG51bGwpO1xuICAgIHRoaXMuZWRpdE1vZGUuc2V0KG1vZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSBjb2xvciBwaWNrZXIgbWVudS5cbiAgICovXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdE1vZGUuc2V0KG51bGwpO1xuICAgIHRoaXMuaXNJbnRlcmFjdGluZy5zZXQoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBpbnRlcmFjdGlvbiBzdGF0ZSAocHJldmVudHMgcHJlbWF0dXJlIGNsb3Npbmcgd2hlbiBibHVycmluZyBlZGl0b3IpXG4gICAqL1xuICBzZXRJbnRlcmFjdGluZyh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaXNJbnRlcmFjdGluZy5zZXQodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBjb2xvciBwaWNrZXIgZnJvbSBVSSAoZXh0cmFjdHMgdHJpZ2dlciBmcm9tIGV2ZW50KS5cbiAgICovXG4gIHRvZ2dsZShlZGl0b3I6IEVkaXRvciwgbW9kZTogQXRlQ29sb3JFZGl0TW9kZSwgZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHRyaWdnZXI6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgIGlmIChldmVudCAmJiB0eXBlb2YgZXZlbnQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIHRyaWdnZXIgPSAoZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCkgfHwgdGFyZ2V0Py5jbG9zZXN0KFwiYnV0dG9uXCIpIHx8IHRhcmdldDtcbiAgICB9XG5cbiAgICB0aGlzLm9wZW4obW9kZSwgdHJpZ2dlcik7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTZWxlY3Rpb24gQ2FwdHVyZSAoZm9yIHJlbGlhYmxlIGNvbG9yIGFwcGxpY2F0aW9uKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBDYXB0dXJlIGN1cnJlbnQgZWRpdG9yIHNlbGVjdGlvbi5cbiAgICovXG4gIGNhcHR1cmVTZWxlY3Rpb24oZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0b3JlZFNlbGVjdGlvbiA9IHtcbiAgICAgIGZyb206IGVkaXRvci5zdGF0ZS5zZWxlY3Rpb24uZnJvbSxcbiAgICAgIHRvOiBlZGl0b3Iuc3RhdGUuc2VsZWN0aW9uLnRvLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxhc3QgY2FwdHVyZWQgc2VsZWN0aW9uLlxuICAgKi9cbiAgZ2V0U3RvcmVkU2VsZWN0aW9uKCk6IEF0ZUNvbG9yUGlja2VyU2VsZWN0aW9uIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmVkU2VsZWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGNhcHR1cmVkIHNlbGVjdGlvbi5cbiAgICovXG4gIGRvbmUoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZWRTZWxlY3Rpb24gPSBudWxsO1xuICAgIHRoaXMubWVudVRyaWdnZXIuc2V0KG51bGwpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29sb3IgQXBwbGljYXRpb24gQ29tbWFuZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQXBwbHkgdGV4dCBjb2xvciB0byBzZWxlY3Rpb24uXG4gICAqL1xuICBhcHBseUNvbG9yKGVkaXRvcjogRWRpdG9yLCBjb2xvcjogc3RyaW5nLCBhZGRUb0hpc3RvcnkgPSB0cnVlLCBmb2N1cyA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0b3JlZCA9IHRoaXMuc3RvcmVkU2VsZWN0aW9uO1xuICAgIGxldCBjaGFpbiA9IGVkaXRvci5jaGFpbigpO1xuICAgIGlmIChmb2N1cykge1xuICAgICAgY2hhaW4gPSBjaGFpbi5mb2N1cygpO1xuICAgIH1cblxuICAgIGlmIChzdG9yZWQgJiYgKGVkaXRvci5zdGF0ZS5zZWxlY3Rpb24uZW1wdHkgfHwgIWVkaXRvci5pc0ZvY3VzZWQpKSB7XG4gICAgICBjaGFpbiA9IGNoYWluLnNldFRleHRTZWxlY3Rpb24oc3RvcmVkKTtcbiAgICB9IGVsc2UgaWYgKGVkaXRvci5zdGF0ZS5zZWxlY3Rpb24uZW1wdHkgJiYgIXN0b3JlZCkge1xuICAgICAgY2hhaW4gPSBjaGFpbi5leHRlbmRNYXJrUmFuZ2UoXCJ0ZXh0U3R5bGVcIik7XG4gICAgfVxuXG4gICAgY2hhaW4uc2V0Q29sb3IoY29sb3IpO1xuXG4gICAgaWYgKGFkZFRvSGlzdG9yeSA9PT0gZmFsc2UpIHtcbiAgICAgIGNoYWluID0gY2hhaW4uc2V0TWV0YShcImFkZFRvSGlzdG9yeVwiLCBmYWxzZSk7XG4gICAgfVxuICAgIGNoYWluLnJ1bigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0ZXh0IGNvbG9yIGZyb20gc2VsZWN0aW9uLlxuICAgKi9cbiAgdW5zZXRDb2xvcihlZGl0b3I6IEVkaXRvciwgZm9jdXMgPSB0cnVlKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdG9yZWQgPSB0aGlzLnN0b3JlZFNlbGVjdGlvbjtcbiAgICBsZXQgY2hhaW4gPSBlZGl0b3IuY2hhaW4oKTtcbiAgICBpZiAoZm9jdXMpIHtcbiAgICAgIGNoYWluID0gY2hhaW4uZm9jdXMoKTtcbiAgICB9XG5cbiAgICBpZiAoc3RvcmVkKSB7XG4gICAgICBjaGFpbiA9IGNoYWluLnNldFRleHRTZWxlY3Rpb24oc3RvcmVkKTtcbiAgICB9IGVsc2UgaWYgKGVkaXRvci5zdGF0ZS5zZWxlY3Rpb24uZW1wdHkpIHtcbiAgICAgIGNoYWluID0gY2hhaW4uZXh0ZW5kTWFya1JhbmdlKFwidGV4dFN0eWxlXCIpO1xuICAgIH1cblxuICAgIGNoYWluLnVuc2V0Q29sb3IoKTtcbiAgICBjaGFpbi5ydW4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBoaWdobGlnaHQgY29sb3IgdG8gc2VsZWN0aW9uLlxuICAgKi9cbiAgYXBwbHlIaWdobGlnaHQoZWRpdG9yOiBFZGl0b3IsIGNvbG9yOiBzdHJpbmcsIGFkZFRvSGlzdG9yeSA9IHRydWUsIGZvY3VzID0gdHJ1ZSk6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RvcmVkID0gdGhpcy5zdG9yZWRTZWxlY3Rpb247XG4gICAgbGV0IGNoYWluID0gZWRpdG9yLmNoYWluKCk7XG4gICAgaWYgKGZvY3VzKSB7XG4gICAgICBjaGFpbiA9IGNoYWluLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgaWYgKHN0b3JlZCAmJiAoZWRpdG9yLnN0YXRlLnNlbGVjdGlvbi5lbXB0eSB8fCAhZWRpdG9yLmlzRm9jdXNlZCkpIHtcbiAgICAgIGNoYWluID0gY2hhaW4uc2V0VGV4dFNlbGVjdGlvbihzdG9yZWQpO1xuICAgIH0gZWxzZSBpZiAoZWRpdG9yLnN0YXRlLnNlbGVjdGlvbi5lbXB0eSAmJiAhc3RvcmVkKSB7XG4gICAgICBjaGFpbiA9IGNoYWluLmV4dGVuZE1hcmtSYW5nZShcImhpZ2hsaWdodFwiKTtcbiAgICB9XG5cbiAgICBjaGFpbi5zZXRIaWdobGlnaHQoeyBjb2xvciB9KTtcblxuICAgIGlmIChhZGRUb0hpc3RvcnkgPT09IGZhbHNlKSB7XG4gICAgICBjaGFpbiA9IGNoYWluLnNldE1ldGEoXCJhZGRUb0hpc3RvcnlcIiwgZmFsc2UpO1xuICAgIH1cbiAgICBjaGFpbi5ydW4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgaGlnaGxpZ2h0IGZyb20gc2VsZWN0aW9uLlxuICAgKi9cbiAgdW5zZXRIaWdobGlnaHQoZWRpdG9yOiBFZGl0b3IsIGZvY3VzID0gdHJ1ZSk6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RvcmVkID0gdGhpcy5zdG9yZWRTZWxlY3Rpb247XG4gICAgbGV0IGNoYWluID0gZWRpdG9yLmNoYWluKCk7XG4gICAgaWYgKGZvY3VzKSB7XG4gICAgICBjaGFpbiA9IGNoYWluLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgaWYgKHN0b3JlZCkge1xuICAgICAgY2hhaW4gPSBjaGFpbi5zZXRUZXh0U2VsZWN0aW9uKHN0b3JlZCk7XG4gICAgfSBlbHNlIGlmIChlZGl0b3Iuc3RhdGUuc2VsZWN0aW9uLmVtcHR5KSB7XG4gICAgICBjaGFpbiA9IGNoYWluLmV4dGVuZE1hcmtSYW5nZShcImhpZ2hsaWdodFwiKTtcbiAgICB9XG5cbiAgICBjaGFpbi51bnNldEhpZ2hsaWdodCgpO1xuICAgIGNoYWluLnJ1bigpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29sb3IgVXRpbGl0aWVzIChEZWxlZ2F0ZWQgdG8gY29sb3IudXRpbHMudHMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgbm9ybWFsaXplQ29sb3IoY29sb3I6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIHJldHVybiBub3JtYWxpemVDb2xvcihjb2xvcikgfHwgXCIjMDAwMDAwXCI7XG4gIH1cblxuICBnZXRMdW1pbmFuY2UoY29sb3I6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIGdldEx1bWluYW5jZShjb2xvcik7XG4gIH1cblxuICBnZXRDb250cmFzdENvbG9yKGNvbG9yOiBzdHJpbmcpOiBcImJsYWNrXCIgfCBcIndoaXRlXCIge1xuICAgIHJldHVybiBnZXRDb250cmFzdENvbG9yKGNvbG9yKTtcbiAgfVxufVxuIl19