ckeditor5-phoenix 1.24.1 → 1.25.0

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 (50) hide show
  1. package/dist/hooks/editable.d.ts.map +1 -1
  2. package/dist/hooks/editor/editor.d.ts.map +1 -1
  3. package/dist/hooks/editor/typings.d.ts +5 -0
  4. package/dist/hooks/editor/typings.d.ts.map +1 -1
  5. package/dist/hooks/editor/utils/cleanup-orphan-editor-elements.d.ts +8 -0
  6. package/dist/hooks/editor/utils/cleanup-orphan-editor-elements.d.ts.map +1 -0
  7. package/dist/hooks/editor/utils/create-editor-in-context.d.ts +6 -1
  8. package/dist/hooks/editor/utils/create-editor-in-context.d.ts.map +1 -1
  9. package/dist/hooks/editor/utils/index.d.ts +2 -0
  10. package/dist/hooks/editor/utils/index.d.ts.map +1 -1
  11. package/dist/hooks/editor/utils/is-multiroot-editor-instance.d.ts +6 -0
  12. package/dist/hooks/editor/utils/is-multiroot-editor-instance.d.ts.map +1 -0
  13. package/dist/hooks/editor/utils/read-preset-or-throw.d.ts.map +1 -1
  14. package/dist/hooks/editor/utils/wrap-with-watchdog.d.ts +7 -16
  15. package/dist/hooks/editor/utils/wrap-with-watchdog.d.ts.map +1 -1
  16. package/dist/hooks/root-value-sentinel/root-value-sentinel.d.ts +6 -11
  17. package/dist/hooks/root-value-sentinel/root-value-sentinel.d.ts.map +1 -1
  18. package/dist/hooks/ui-part.d.ts.map +1 -1
  19. package/dist/index.cjs +2 -2
  20. package/dist/index.cjs.map +1 -1
  21. package/dist/index.mjs +534 -451
  22. package/dist/index.mjs.map +1 -1
  23. package/dist/shared/are-maps-equal.d.ts +11 -0
  24. package/dist/shared/are-maps-equal.d.ts.map +1 -0
  25. package/dist/shared/async-registry.d.ts +43 -10
  26. package/dist/shared/async-registry.d.ts.map +1 -1
  27. package/package.json +1 -1
  28. package/src/hooks/context/context.test.ts +1 -1
  29. package/src/hooks/editable.test.ts +1 -1
  30. package/src/hooks/editable.ts +45 -56
  31. package/src/hooks/editor/editor.test.ts +7 -17
  32. package/src/hooks/editor/editor.ts +148 -112
  33. package/src/hooks/editor/typings.ts +7 -0
  34. package/src/hooks/editor/utils/cleanup-orphan-editor-elements.test.ts +285 -0
  35. package/src/hooks/editor/utils/cleanup-orphan-editor-elements.ts +60 -0
  36. package/src/hooks/editor/utils/create-editor-in-context.ts +7 -2
  37. package/src/hooks/editor/utils/index.ts +2 -0
  38. package/src/hooks/editor/utils/is-multiroot-editor-instance.ts +8 -0
  39. package/src/hooks/editor/utils/read-preset-or-throw.ts +2 -1
  40. package/src/hooks/editor/utils/wrap-with-watchdog.test.ts +34 -14
  41. package/src/hooks/editor/utils/wrap-with-watchdog.ts +15 -25
  42. package/src/hooks/root-value-sentinel/root-value-sentinel.test.ts +5 -33
  43. package/src/hooks/root-value-sentinel/root-value-sentinel.ts +8 -25
  44. package/src/hooks/ui-part.test.ts +1 -1
  45. package/src/hooks/ui-part.ts +11 -22
  46. package/src/shared/are-maps-equal.test.ts +56 -0
  47. package/src/shared/are-maps-equal.ts +22 -0
  48. package/src/shared/async-registry.test.ts +212 -31
  49. package/src/shared/async-registry.ts +177 -61
  50. package/test-utils/editor/create-editor-preset.ts +4 -0
@@ -1 +1 @@
1
- {"version":3,"file":"editable.d.ts","sourceRoot":"","sources":["../../src/hooks/editable.ts"],"names":[],"mappings":"AAiIA;;GAEG;AACH,eAAO,MAAM,YAAY,4GAA6B,CAAC"}
1
+ {"version":3,"file":"editable.d.ts","sourceRoot":"","sources":["../../src/hooks/editable.ts"],"names":[],"mappings":"AAkHA;;GAEG;AACH,eAAO,MAAM,YAAY,4GAA6B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../../src/hooks/editor/editor.ts"],"names":[],"mappings":"AAiWA;;GAEG;AACH,eAAO,MAAM,UAAU,+GAA2B,CAAC"}
1
+ {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../../src/hooks/editor/editor.ts"],"names":[],"mappings":"AAqYA;;GAEG;AACH,eAAO,MAAM,UAAU,+GAA2B,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { WatchdogConfig } from 'ckeditor5';
1
2
  /**
2
3
  * List of supported CKEditor5 editor types.
3
4
  */
@@ -49,6 +50,10 @@ export type EditorPreset = {
49
50
  * This should match the configuration expected by CKEditor5.
50
51
  */
51
52
  config: EditorConfig;
53
+ /**
54
+ * Editor watchdog configuration.
55
+ */
56
+ watchdog: WatchdogConfig | null;
52
57
  /**
53
58
  * The license key for CKEditor5.
54
59
  * This is required for using CKEditor5 with a valid license.
@@ -1 +1 @@
1
- {"version":3,"file":"typings.d.ts","sourceRoot":"","sources":["../../../src/hooks/editor/typings.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,YAAY,qEAAsE,CAAC;AAEhG;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAE9B;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC;AAElC;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB;;OAEG;IACH,OAAO,EAAE,YAAY,EAAE,CAAC;IAExB;;OAEG;IACH,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB;;;OAGG;IACH,IAAI,EAAE,UAAU,CAAC;IAEjB;;;OAGG;IACH,MAAM,EAAE,YAAY,CAAC;IAErB;;;OAGG;IACH,OAAO,EAAE,aAAa,CAAC;IAEvB;;;OAGG;IACH,kBAAkB,CAAC,EAAE;QACnB,UAAU,EAAE,kCAAkC,CAAC;KAChD,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,kCAAkC,GAAG;IAC/C,CAAC,QAAQ,EAAE,MAAM,GAAG;QAClB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;KAC/C,CAAC;CACH,CAAC"}
1
+ {"version":3,"file":"typings.d.ts","sourceRoot":"","sources":["../../../src/hooks/editor/typings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD;;GAEG;AACH,eAAO,MAAM,YAAY,qEAAsE,CAAC;AAEhG;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAE9B;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC;AAElC;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB;;OAEG;IACH,OAAO,EAAE,YAAY,EAAE,CAAC;IAExB;;OAEG;IACH,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB;;;OAGG;IACH,IAAI,EAAE,UAAU,CAAC;IAEjB;;;OAGG;IACH,MAAM,EAAE,YAAY,CAAC;IAErB;;OAEG;IACH,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAC;IAEhC;;;OAGG;IACH,OAAO,EAAE,aAAa,CAAC;IAEvB;;;OAGG;IACH,kBAAkB,CAAC,EAAE;QACnB,UAAU,EAAE,kCAAkC,CAAC;KAChD,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,kCAAkC,GAAG;IAC/C,CAAC,QAAQ,EAAE,MAAM,GAAG;QAClB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;KAC/C,CAAC;CACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { Editor } from 'ckeditor5';
2
+ /**
3
+ * Removes all DOM elements injected by a specific CKEditor instance.
4
+ * Call this before assigning a new instance (e.g. in the 'restart' watchdog handler),
5
+ * because the watchdog does not clean up the previous editor's DOM on its own.
6
+ */
7
+ export declare function cleanupOrphanEditorElements(editor: Editor): void;
8
+ //# sourceMappingURL=cleanup-orphan-editor-elements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanup-orphan-editor-elements.d.ts","sourceRoot":"","sources":["../../../../src/hooks/editor/utils/cleanup-orphan-editor-elements.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAoDhE"}
@@ -1,5 +1,4 @@
1
1
  import { Context, ContextWatchdog, Editor, EditorConfig } from 'ckeditor5';
2
- import { EditorCreator } from './wrap-with-watchdog';
3
2
  /**
4
3
  * Creates a CKEditor 5 editor instance within a given context watchdog.
5
4
  *
@@ -40,5 +39,11 @@ type EditorContextDescriptor = {
40
39
  editorContextId: string;
41
40
  context: ContextWatchdog<Context>;
42
41
  };
42
+ /**
43
+ * Type representing an Editor creator with a create method.
44
+ */
45
+ type EditorCreator = {
46
+ create: (...args: any) => Promise<Editor>;
47
+ };
43
48
  export {};
44
49
  //# sourceMappingURL=create-editor-in-context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-editor-in-context.d.ts","sourceRoot":"","sources":["../../../../src/hooks/editor/utils/create-editor-in-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEhF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAU1D;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK;;WAgE/E,WAAW,GAAG,aAAa;qBACjB,MAAM;aACd,eAAe,CAAC,OAAO,CAAC;GAhClC;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,uBAAuB,GAAG,IAAI,CAMlF;AAED;;GAEG;AACH,KAAK,KAAK,GAAG;IACX,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,YAAY,CAAC;CACtB,CAAC;AAEF;;GAEG;AACH,KAAK,uBAAuB,GAAG;IAC7B,KAAK,EAAE,WAAW,GAAG,aAAa,CAAC;IACnC,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;CACnC,CAAC"}
1
+ {"version":3,"file":"create-editor-in-context.d.ts","sourceRoot":"","sources":["../../../../src/hooks/editor/utils/create-editor-in-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAUhF;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK;;WAgE/E,WAAW,GAAG,aAAa;qBACjB,MAAM;aACd,eAAe,CAAC,OAAO,CAAC;GAhClC;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,uBAAuB,GAAG,IAAI,CAMlF;AAED;;GAEG;AACH,KAAK,KAAK,GAAG;IACX,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,YAAY,CAAC;CACtB,CAAC;AAEF;;GAEG;AACH,KAAK,uBAAuB,GAAG;IAC7B,KAAK,EAAE,WAAW,GAAG,aAAa,CAAC;IACnC,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;CACnC,CAAC;AAEF;;GAEG;AACH,KAAK,aAAa,GAAG;IACnB,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3C,CAAC"}
@@ -1,4 +1,6 @@
1
+ export * from './cleanup-orphan-editor-elements';
1
2
  export * from './create-editor-in-context';
3
+ export * from './is-multiroot-editor-instance';
2
4
  export * from './is-single-root-editor';
3
5
  export * from './load-editor-constructor';
4
6
  export * from './load-editor-plugins';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/hooks/editor/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC;AACvC,cAAc,6CAA6C,CAAC;AAC5D,cAAc,sCAAsC,CAAC;AACrD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/hooks/editor/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAC;AACjD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC;AACvC,cAAc,6CAA6C,CAAC;AAC5D,cAAc,sCAAsC,CAAC;AACrD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Editor, MultiRootEditor } from 'ckeditor5';
2
+ /**
3
+ * Check if passed editor is multiroot editor.
4
+ */
5
+ export declare function isMultirootEditorInstance(editor: Editor): editor is MultiRootEditor;
6
+ //# sourceMappingURL=is-multiroot-editor-instance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-multiroot-editor-instance.d.ts","sourceRoot":"","sources":["../../../../src/hooks/editor/utils/is-multiroot-editor-instance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEzD;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,IAAI,eAAe,CAEnF"}
@@ -1 +1 @@
1
- {"version":3,"file":"read-preset-or-throw.d.ts","sourceRoot":"","sources":["../../../../src/hooks/editor/utils/read-preset-or-throw.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAK/C;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,YAAY,CAuBpE"}
1
+ {"version":3,"file":"read-preset-or-throw.d.ts","sourceRoot":"","sources":["../../../../src/hooks/editor/utils/read-preset-or-throw.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAK/C;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,YAAY,CAwBpE"}
@@ -1,24 +1,15 @@
1
- import { Editor, EditorWatchdog } from 'ckeditor5';
1
+ import { Editor, EditorWatchdog, WatchdogConfig } from 'ckeditor5';
2
2
  /**
3
- * Wraps an Editor creator with a watchdog for automatic recovery.
3
+ * Wraps an editor factory with a watchdog for automatic recovery.
4
+ * The factory is invoked on each (re)start, so configuration is rebuilt every time.
4
5
  *
5
- * @param Editor - The Editor creator to wrap.
6
- * @returns The Editor creator wrapped with a watchdog.
6
+ * @param factory Async function that creates and returns an Editor instance.
7
+ * @param watchdogConfig Configuration of the watchdog.
8
+ * @returns The watchdog instance.
7
9
  */
8
- export declare function wrapWithWatchdog(Editor: EditorCreator): Promise<{
9
- watchdog: EditorWatchdog<Editor>;
10
- Constructor: {
11
- create: (...args: Parameters<(typeof Editor)["create"]>) => Promise<Editor>;
12
- };
13
- }>;
10
+ export declare function wrapWithWatchdog(factory: () => Promise<Editor>, watchdogConfig: WatchdogConfig | null): Promise<EditorWatchdog<Editor>>;
14
11
  /**
15
12
  * Unwraps the EditorWatchdog from the editor instance.
16
13
  */
17
14
  export declare function unwrapEditorWatchdog(editor: Editor): EditorWatchdog | null;
18
- /**
19
- * Type representing an Editor creator with a create method.
20
- */
21
- export type EditorCreator = {
22
- create: (...args: any) => Promise<Editor>;
23
- };
24
15
  //# sourceMappingURL=wrap-with-watchdog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wrap-with-watchdog.d.ts","sourceRoot":"","sources":["../../../../src/hooks/editor/utils/wrap-with-watchdog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAIxD;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,aAAa;;;0BAe9B,UAAU,CAAC,CAAA,OAAO,MAAM,EAAC,QAAQ,CAAC,CAAC;;GAOhE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAM1E;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3C,CAAC"}
1
+ {"version":3,"file":"wrap-with-watchdog.d.ts","sourceRoot":"","sources":["../../../../src/hooks/editor/utils/wrap-with-watchdog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAIxE;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,cAAc,GAAG,IAAI,mCAiB3G;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAM1E"}
@@ -1,12 +1,9 @@
1
+ import { Editor } from 'ckeditor5';
1
2
  export declare class RootValueSentinel {
2
3
  /**
3
4
  * The DOM element being observed for attribute changes.
4
5
  */
5
6
  private el;
6
- /**
7
- * The unique identifier of the editor instance this sentinel is attached to.
8
- */
9
- private readonly editorId;
10
7
  /**
11
8
  * The name of the specific root in a multi-root editor setup.
12
9
  */
@@ -28,11 +25,9 @@ export declare class RootValueSentinel {
28
25
  */
29
26
  private cleanupCallbacks;
30
27
  /**
31
- * The promise that resolves to the editor instance once it's registered.
32
- * It can be either a MultiRootEditor or a DecoupledEditor, depending on the type of editor being used.
33
- * It will be null if the editor is not registered yet or if the hook is being destroyed before the editor is registered.
28
+ * The editor instance.
34
29
  */
35
- private editorPromise;
30
+ private editor;
36
31
  /**
37
32
  * When the editor is focused and the value attribute changes, we want to wait until it blurs to
38
33
  * avoid disrupting the user while typing. This variable holds the pending value that should be applied
@@ -56,7 +51,7 @@ export declare class RootValueSentinel {
56
51
  * When the hook is mounted, we will wait for the editor to be registered and then set the initial value of the root.
57
52
  * Accepts an options object to configure element, identifiers, and custom attribute names.
58
53
  */
59
- constructor({ el, editorId, rootName, valueAttrName, rootAttrsAttrName, }: RootValueSentinelOptions);
54
+ constructor({ el, editor, rootName, valueAttrName, rootAttrsAttrName, }: RootValueSentinelOptions);
60
55
  /**
61
56
  * Helper to read and parse attributes from the element.
62
57
  * It uses dynamically provided attribute names.
@@ -88,9 +83,9 @@ export type RootValueSentinelOptions = {
88
83
  */
89
84
  el: HTMLElement;
90
85
  /**
91
- * The unique identifier of the editor instance this sentinel is attached to.
86
+ * Editor instance.
92
87
  */
93
- editorId: string | null;
88
+ editor: Editor;
94
89
  /**
95
90
  * The name of the specific root in a multi-root editor setup.
96
91
  */
@@ -1 +1 @@
1
- {"version":3,"file":"root-value-sentinel.d.ts","sourceRoot":"","sources":["../../../src/hooks/root-value-sentinel/root-value-sentinel.ts"],"names":[],"mappings":"AAUA,qBAAa,iBAAiB;IAC5B;;OAEG;IACH,OAAO,CAAC,EAAE,CAAc;IAExB;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAE3C;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAEvC;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAE3C;;OAEG;IACH,OAAO,CAAC,WAAW,CAAkB;IAErC;;OAEG;IACH,OAAO,CAAC,gBAAgB,CAAyB;IAEjD;;;;OAIG;IACH,OAAO,CAAC,aAAa,CAAuC;IAE5D;;;;;OAKG;IACH,OAAO,CAAC,YAAY,CAAuB;IAE3C;;;;OAIG;IACH,OAAO,CAAC,aAAa,CAAuB;IAE5C;;;;OAIG;IACH,OAAO,CAAC,YAAY,CAAsC;IAE1D;;;OAGG;gBAED,EACE,EAAE,EACF,QAAQ,EACR,QAAQ,EACR,aAAgC,EAChC,iBAAyC,GAC1C,EAAE,wBAAwB;IAsB7B;;;OAGG;IACH,OAAO,KAAK,KAAK,GAKhB;IAED;;;OAGG;IACG,OAAO;IAmCb;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAwBzB;;OAEG;IACH,OAAO,CAAC,YAAY;IAQpB;;;OAGG;IACI,OAAO;CAMf;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC;;OAEG;IACH,EAAE,EAAE,WAAW,CAAC;IAEhB;;OAEG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAExB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC"}
1
+ {"version":3,"file":"root-value-sentinel.d.ts","sourceRoot":"","sources":["../../../src/hooks/root-value-sentinel/root-value-sentinel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAQxC,qBAAa,iBAAiB;IAC5B;;OAEG;IACH,OAAO,CAAC,EAAE,CAAc;IAExB;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAEvC;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAE3C;;OAEG;IACH,OAAO,CAAC,WAAW,CAAkB;IAErC;;OAEG;IACH,OAAO,CAAC,gBAAgB,CAAyB;IAEjD;;OAEG;IACH,OAAO,CAAC,MAAM,CAAS;IAEvB;;;;;OAKG;IACH,OAAO,CAAC,YAAY,CAAuB;IAE3C;;;;OAIG;IACH,OAAO,CAAC,aAAa,CAAuB;IAE5C;;;;OAIG;IACH,OAAO,CAAC,YAAY,CAAsC;IAE1D;;;OAGG;gBAED,EACE,EAAE,EACF,MAAM,EACN,QAAQ,EACR,aAAgC,EAChC,iBAAyC,GAC1C,EAAE,wBAAwB;IAc7B;;;OAGG;IACH,OAAO,KAAK,KAAK,GAKhB;IAED;;;OAGG;IACG,OAAO;IAmCb;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAwBzB;;OAEG;IACH,OAAO,CAAC,YAAY;IAQpB;;;OAGG;IACI,OAAO;CAMf;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC;;OAEG;IACH,EAAE,EAAE,WAAW,CAAC;IAEhB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ui-part.d.ts","sourceRoot":"","sources":["../../src/hooks/ui-part.ts"],"names":[],"mappings":"AA0FA;;GAEG;AACH,eAAO,MAAM,UAAU,4GAA2B,CAAC"}
1
+ {"version":3,"file":"ui-part.d.ts","sourceRoot":"","sources":["../../src/hooks/ui-part.ts"],"names":[],"mappings":"AA+EA;;GAEG;AACH,eAAO,MAAM,UAAU,4GAA2B,CAAC"}
package/dist/index.cjs CHANGED
@@ -1,5 +1,5 @@
1
- "use strict";var at=Object.create;var z=Object.defineProperty;var it=Object.getOwnPropertyDescriptor;var nt=Object.getOwnPropertyNames;var st=Object.getPrototypeOf,ot=Object.prototype.hasOwnProperty;var ct=(a,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of nt(t))!ot.call(a,n)&&n!==e&&z(a,n,{get:()=>t[n],enumerable:!(i=it(t,n))||i.enumerable});return a};var r=(a,t,e)=>(e=a!=null?at(st(a)):{},ct(t||!a||!a.__esModule?z(e,"default",{value:a,enumerable:!0}):e,a));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});class B{items=new Map;initializationErrors=new Map;pendingCallbacks=new Map;watchers=new Set;execute(t,e,i){const n=this.items.get(t),s=this.initializationErrors.get(t);return s?(i?.(s),Promise.reject(s)):n?Promise.resolve(e(n)):new Promise((o,u)=>{const c=this.getPendingCallbacks(t);c.success.push(async l=>{o(await e(l))}),i?c.error.push(i):c.error.push(u)})}register(t,e){if(this.items.has(t))throw new Error(`Item with ID "${t}" is already registered.`);this.resetErrors(t),this.items.set(t,e);const i=this.pendingCallbacks.get(t);i&&(i.success.forEach(n=>n(e)),this.pendingCallbacks.delete(t)),this.registerAsDefault(t,e),this.notifyWatchers()}error(t,e){this.items.delete(t),this.initializationErrors.set(t,e);const i=this.pendingCallbacks.get(t);i&&(i.error.forEach(n=>n(e)),this.pendingCallbacks.delete(t)),this.initializationErrors.size===1&&!this.items.size&&this.error(null,e),this.notifyWatchers()}resetErrors(t){const{initializationErrors:e}=this;e.has(null)&&e.get(null)===e.get(t)&&e.delete(null),e.delete(t)}unregister(t){if(!this.items.has(t))throw new Error(`Item with ID "${t}" is not registered.`);t&&this.items.get(null)===this.items.get(t)&&this.unregister(null),this.items.delete(t),this.pendingCallbacks.delete(t),this.notifyWatchers()}getItems(){return Array.from(this.items.values())}hasItem(t){return this.items.has(t)}waitFor(t){return new Promise((e,i)=>{this.execute(t,e,i)})}async destroyAll(){const t=Array.from(new Set(this.items.values())).map(e=>e.destroy());this.items.clear(),this.pendingCallbacks.clear(),await Promise.all(t),this.notifyWatchers()}watch(t){return this.watchers.add(t),t(new Map(this.items),new Map(this.initializationErrors)),this.unwatch.bind(this,t)}unwatch(t){this.watchers.delete(t)}notifyWatchers(){this.watchers.forEach(t=>t(new Map(this.items),new Map(this.initializationErrors)))}getPendingCallbacks(t){let e=this.pendingCallbacks.get(t);return e||(e={success:[],error:[]},this.pendingCallbacks.set(t,e)),e}registerAsDefault(t,e){this.items.size===1&&t!==null&&this.register(null,e)}}function ut(a){return a.replace(/[-_\s]+(.)?/g,(t,e)=>e?e.toUpperCase():"").replace(/^./,t=>t.toLowerCase())}function C(a,t){let e=null;return(...i)=>{e&&clearTimeout(e),e=setTimeout(()=>{t(...i)},a)}}function lt(a){if(Object.prototype.toString.call(a)!=="[object Object]")return!1;const t=Object.getPrototypeOf(a);return t===Object.prototype||t===null}function A(a){if(Array.isArray(a))return a.map(A);if(lt(a)){const t=Object.create(null);for(const[e,i]of Object.entries(a))t[ut(e)]=A(i);return t}return a}function dt(a,t){const e=Object.entries(a).filter(([i,n])=>t(n,i));return Object.fromEntries(e)}function ht(){const a=document.querySelector('meta[name="csrf-token"]');if(a)return a.getAttribute("content");const t=document.cookie.match(/(?:^|; )_csrf_token=([^;]*)/);return t?decodeURIComponent(t[1]):null}class x{state="mounting";el;_beforeDestroyCallbacks=[];onBeforeDestroy(t){this._beforeDestroyCallbacks.push(t)}pushEvent;pushEventTo;handleEvent;mounted(){}destroyed(){}updated(){}isBeingDestroyed(){return this.state==="destroyed"||this.state==="destroying"}_runBeforeDestroyCallbacks(){for(const t of this._beforeDestroyCallbacks.reverse())t();this._beforeDestroyCallbacks=[]}}function O(a){return{async mounted(){const t=new a;this.el.instance=t,t.el=this.el,t.pushEvent=(i,n,s)=>this.pushEvent?.(i,n,s),t.pushEventTo=(i,n,s,o)=>this.pushEventTo?.(i,n,s,o),t.handleEvent=(i,n)=>this.handleEvent?.(i,n),t.state="mounting";const e=await t.mounted?.();return t.state="mounted",e},beforeUpdate(){this.el.instance.beforeUpdate?.()},async destroyed(){const{instance:t}=this.el;t.state="destroying",t._runBeforeDestroyCallbacks(),await t.destroyed?.(),t.state="destroyed"},disconnected(){this.el.instance.disconnected?.()},reconnected(){this.el.instance.reconnected?.()},updated(){return this.el.instance.updated?.()}}}function L(a){return Object.keys(a).length===0&&a.constructor===Object}function mt(a){return a==null}function $(a,t){const e=Object.entries(a).map(([i,n])=>[i,t(n,i)]);return Object.fromEntries(e)}function _(a){if(a===null)return null;const t=Number.parseInt(a,10);return Number.isNaN(t)?null:t}function pt(a){return a==null||a.trim()===""?null:JSON.parse(a)}function ft(a,t){if(a===t)return!0;const e=Object.keys(a),i=Object.keys(t);if(e.length!==i.length)return!1;for(const n of e)if(a[n]!==t[n]||!Object.prototype.hasOwnProperty.call(t,n))return!1;return!0}function wt(){return Math.random().toString(36).substring(2)}function gt(a,{timeOutAfter:t=500,retryAfter:e=100}={}){return new Promise((i,n)=>{const s=Date.now();let o=null;const u=setTimeout(()=>{n(o??new Error("Timeout"))},t),c=async()=>{try{const l=await a();clearTimeout(u),i(l)}catch(l){o=l,Date.now()-s>t?n(l):setTimeout(c,e)}};c()})}const R=Symbol.for("context-editor-watchdog");async function yt({element:a,context:t,creator:e,config:i}){const n=wt();await t.add({creator:(c,l)=>e.create(c,l),id:n,sourceElementOrData:a,type:"editor",config:i});const s=t.getItem(n),o={state:"available",editorContextId:n,context:t};s[R]=o;const u=t.destroy.bind(t);return t.destroy=async()=>(o.state="unavailable",u()),{...o,editor:s}}function K(a){return R in a?a[R]:null}function P(a){return["inline","classic","balloon","decoupled"].includes(a)}async function bt(a){const t=await import("ckeditor5"),i={inline:t.InlineEditor,balloon:t.BalloonEditor,classic:t.ClassicEditor,decoupled:t.DecoupledEditor,multiroot:t.MultiRootEditor}[a];if(!i)throw new Error(`Unsupported editor type: ${a}`);return i}class D{static the=new D;plugins=new Map;constructor(){}register(t,e){if(this.plugins.has(t))throw new Error(`Plugin with name "${t}" is already registered.`);return this.plugins.set(t,e),this.unregister.bind(this,t)}unregister(t){if(!this.plugins.has(t))throw new Error(`Plugin with name "${t}" is not registered.`);this.plugins.delete(t)}unregisterAll(){this.plugins.clear()}async get(t){return this.plugins.get(t)?.()}has(t){return this.plugins.has(t)}}async function Y(a){const t=await import("ckeditor5");let e=null;const i=a.map(async n=>{const s=await D.the.get(n);if(s)return s;const{[n]:o}=t;if(o)return o;if(!e)try{e=await import("ckeditor5-premium-features")}catch(c){console.error(`Failed to load premium package: ${c}`)}const{[n]:u}=e||{};if(u)return u;throw new Error(`Plugin "${n}" not found in base or premium packages.`)});return{loadedPlugins:await Promise.all(i),hasPremium:!!e}}async function J(a,t){const e=[a.ui,a.content];return await Promise.all([q("ckeditor5",e),t&&q("ckeditor5-premium-features",e)].filter(n=>!!n)).then(n=>n.flat())}async function q(a,t){return await Promise.all(t.filter(e=>e!=="en").map(async e=>{const i=await kt(a,e);return i?.default??i}).filter(Boolean))}async function kt(a,t){try{if(a==="ckeditor5")switch(t){case"af":return await import("ckeditor5/translations/af.js");case"ar":return await import("ckeditor5/translations/ar.js");case"ast":return await import("ckeditor5/translations/ast.js");case"az":return await import("ckeditor5/translations/az.js");case"bg":return await import("ckeditor5/translations/bg.js");case"bn":return await import("ckeditor5/translations/bn.js");case"bs":return await import("ckeditor5/translations/bs.js");case"ca":return await import("ckeditor5/translations/ca.js");case"cs":return await import("ckeditor5/translations/cs.js");case"da":return await import("ckeditor5/translations/da.js");case"de":return await import("ckeditor5/translations/de.js");case"de-ch":return await import("ckeditor5/translations/de-ch.js");case"el":return await import("ckeditor5/translations/el.js");case"en":return await import("ckeditor5/translations/en.js");case"en-au":return await import("ckeditor5/translations/en-au.js");case"en-gb":return await import("ckeditor5/translations/en-gb.js");case"eo":return await import("ckeditor5/translations/eo.js");case"es":return await import("ckeditor5/translations/es.js");case"es-co":return await import("ckeditor5/translations/es-co.js");case"et":return await import("ckeditor5/translations/et.js");case"eu":return await import("ckeditor5/translations/eu.js");case"fa":return await import("ckeditor5/translations/fa.js");case"fi":return await import("ckeditor5/translations/fi.js");case"fr":return await import("ckeditor5/translations/fr.js");case"gl":return await import("ckeditor5/translations/gl.js");case"gu":return await import("ckeditor5/translations/gu.js");case"he":return await import("ckeditor5/translations/he.js");case"hi":return await import("ckeditor5/translations/hi.js");case"hr":return await import("ckeditor5/translations/hr.js");case"hu":return await import("ckeditor5/translations/hu.js");case"hy":return await import("ckeditor5/translations/hy.js");case"id":return await import("ckeditor5/translations/id.js");case"it":return await import("ckeditor5/translations/it.js");case"ja":return await import("ckeditor5/translations/ja.js");case"jv":return await import("ckeditor5/translations/jv.js");case"kk":return await import("ckeditor5/translations/kk.js");case"km":return await import("ckeditor5/translations/km.js");case"kn":return await import("ckeditor5/translations/kn.js");case"ko":return await import("ckeditor5/translations/ko.js");case"ku":return await import("ckeditor5/translations/ku.js");case"lt":return await import("ckeditor5/translations/lt.js");case"lv":return await import("ckeditor5/translations/lv.js");case"ms":return await import("ckeditor5/translations/ms.js");case"nb":return await import("ckeditor5/translations/nb.js");case"ne":return await import("ckeditor5/translations/ne.js");case"nl":return await import("ckeditor5/translations/nl.js");case"no":return await import("ckeditor5/translations/no.js");case"oc":return await import("ckeditor5/translations/oc.js");case"pl":return await import("ckeditor5/translations/pl.js");case"pt":return await import("ckeditor5/translations/pt.js");case"pt-br":return await import("ckeditor5/translations/pt-br.js");case"ro":return await import("ckeditor5/translations/ro.js");case"ru":return await import("ckeditor5/translations/ru.js");case"si":return await import("ckeditor5/translations/si.js");case"sk":return await import("ckeditor5/translations/sk.js");case"sl":return await import("ckeditor5/translations/sl.js");case"sq":return await import("ckeditor5/translations/sq.js");case"sr":return await import("ckeditor5/translations/sr.js");case"sr-latn":return await import("ckeditor5/translations/sr-latn.js");case"sv":return await import("ckeditor5/translations/sv.js");case"th":return await import("ckeditor5/translations/th.js");case"tk":return await import("ckeditor5/translations/tk.js");case"tr":return await import("ckeditor5/translations/tr.js");case"tt":return await import("ckeditor5/translations/tt.js");case"ug":return await import("ckeditor5/translations/ug.js");case"uk":return await import("ckeditor5/translations/uk.js");case"ur":return await import("ckeditor5/translations/ur.js");case"uz":return await import("ckeditor5/translations/uz.js");case"vi":return await import("ckeditor5/translations/vi.js");case"zh":return await import("ckeditor5/translations/zh.js");case"zh-cn":return await import("ckeditor5/translations/zh-cn.js");default:return console.warn(`Language ${t} not found in ckeditor5 translations`),null}else switch(t){case"af":return await import("ckeditor5-premium-features/translations/af.js");case"ar":return await import("ckeditor5-premium-features/translations/ar.js");case"ast":return await import("ckeditor5-premium-features/translations/ast.js");case"az":return await import("ckeditor5-premium-features/translations/az.js");case"bg":return await import("ckeditor5-premium-features/translations/bg.js");case"bn":return await import("ckeditor5-premium-features/translations/bn.js");case"bs":return await import("ckeditor5-premium-features/translations/bs.js");case"ca":return await import("ckeditor5-premium-features/translations/ca.js");case"cs":return await import("ckeditor5-premium-features/translations/cs.js");case"da":return await import("ckeditor5-premium-features/translations/da.js");case"de":return await import("ckeditor5-premium-features/translations/de.js");case"de-ch":return await import("ckeditor5-premium-features/translations/de-ch.js");case"el":return await import("ckeditor5-premium-features/translations/el.js");case"en":return await import("ckeditor5-premium-features/translations/en.js");case"en-au":return await import("ckeditor5-premium-features/translations/en-au.js");case"en-gb":return await import("ckeditor5-premium-features/translations/en-gb.js");case"eo":return await import("ckeditor5-premium-features/translations/eo.js");case"es":return await import("ckeditor5-premium-features/translations/es.js");case"es-co":return await import("ckeditor5-premium-features/translations/es-co.js");case"et":return await import("ckeditor5-premium-features/translations/et.js");case"eu":return await import("ckeditor5-premium-features/translations/eu.js");case"fa":return await import("ckeditor5-premium-features/translations/fa.js");case"fi":return await import("ckeditor5-premium-features/translations/fi.js");case"fr":return await import("ckeditor5-premium-features/translations/fr.js");case"gl":return await import("ckeditor5-premium-features/translations/gl.js");case"gu":return await import("ckeditor5-premium-features/translations/gu.js");case"he":return await import("ckeditor5-premium-features/translations/he.js");case"hi":return await import("ckeditor5-premium-features/translations/hi.js");case"hr":return await import("ckeditor5-premium-features/translations/hr.js");case"hu":return await import("ckeditor5-premium-features/translations/hu.js");case"hy":return await import("ckeditor5-premium-features/translations/hy.js");case"id":return await import("ckeditor5-premium-features/translations/id.js");case"it":return await import("ckeditor5-premium-features/translations/it.js");case"ja":return await import("ckeditor5-premium-features/translations/ja.js");case"jv":return await import("ckeditor5-premium-features/translations/jv.js");case"kk":return await import("ckeditor5-premium-features/translations/kk.js");case"km":return await import("ckeditor5-premium-features/translations/km.js");case"kn":return await import("ckeditor5-premium-features/translations/kn.js");case"ko":return await import("ckeditor5-premium-features/translations/ko.js");case"ku":return await import("ckeditor5-premium-features/translations/ku.js");case"lt":return await import("ckeditor5-premium-features/translations/lt.js");case"lv":return await import("ckeditor5-premium-features/translations/lv.js");case"ms":return await import("ckeditor5-premium-features/translations/ms.js");case"nb":return await import("ckeditor5-premium-features/translations/nb.js");case"ne":return await import("ckeditor5-premium-features/translations/ne.js");case"nl":return await import("ckeditor5-premium-features/translations/nl.js");case"no":return await import("ckeditor5-premium-features/translations/no.js");case"oc":return await import("ckeditor5-premium-features/translations/oc.js");case"pl":return await import("ckeditor5-premium-features/translations/pl.js");case"pt":return await import("ckeditor5-premium-features/translations/pt.js");case"pt-br":return await import("ckeditor5-premium-features/translations/pt-br.js");case"ro":return await import("ckeditor5-premium-features/translations/ro.js");case"ru":return await import("ckeditor5-premium-features/translations/ru.js");case"si":return await import("ckeditor5-premium-features/translations/si.js");case"sk":return await import("ckeditor5-premium-features/translations/sk.js");case"sl":return await import("ckeditor5-premium-features/translations/sl.js");case"sq":return await import("ckeditor5-premium-features/translations/sq.js");case"sr":return await import("ckeditor5-premium-features/translations/sr.js");case"sr-latn":return await import("ckeditor5-premium-features/translations/sr-latn.js");case"sv":return await import("ckeditor5-premium-features/translations/sv.js");case"th":return await import("ckeditor5-premium-features/translations/th.js");case"tk":return await import("ckeditor5-premium-features/translations/tk.js");case"tr":return await import("ckeditor5-premium-features/translations/tr.js");case"tt":return await import("ckeditor5-premium-features/translations/tt.js");case"ug":return await import("ckeditor5-premium-features/translations/ug.js");case"uk":return await import("ckeditor5-premium-features/translations/uk.js");case"ur":return await import("ckeditor5-premium-features/translations/ur.js");case"uz":return await import("ckeditor5-premium-features/translations/uz.js");case"vi":return await import("ckeditor5-premium-features/translations/vi.js");case"zh":return await import("ckeditor5-premium-features/translations/zh.js");case"zh-cn":return await import("ckeditor5-premium-features/translations/zh-cn.js");default:return console.warn(`Language ${t} not found in premium translations`),await import("ckeditor5-premium-features/translations/en.js")}}catch(e){return console.error(`Failed to load translation for ${a}/${t}:`,e),null}}function G(a){return $(a,t=>({dictionary:t}))}function X(a){const t=Q(a);return $(t,({content:e})=>e)}function F(a){const t=Q(a),e=$(t,({initialValue:i})=>i);return dt(e,i=>typeof i=="string")}function Q(a){const t=document.querySelectorAll([`[data-cke-editor-id="${a}"][data-cke-editable-root-name]`,"[data-cke-editable-root-name]:not([data-cke-editor-id])"].join(", ")),e=Array.from(t).reduce((u,c)=>{const l=c.getAttribute("data-cke-editable-root-name"),d=c.getAttribute("data-cke-editable-initial-value")||"",h=c.querySelector("[data-cke-editable-content]");return!l||!h?u:{...u,[l]:{content:h,initialValue:d}}},Object.create({})),i=document.querySelector(`[phx-hook="CKEditor5"][id="${a}"]`);if(!i)return e;const n=i.getAttribute("data-cke-initial-value")||"",s=i.querySelector(`#${a}_editor `),o=e.main;return o?{...e,main:{...o,initialValue:o.initialValue||n}}:s?{...e,main:{content:s,initialValue:n}}:e}const W=["inline","classic","balloon","decoupled","multiroot"];function Et(a){const t=a.getAttribute("data-cke-preset");if(!t)throw new Error('CKEditor5 hook requires a "cke-preset" attribute on the element.');const{type:e,config:i,license:n,...s}=JSON.parse(t);if(!e||!i||!n)throw new Error('CKEditor5 hook configuration must include "editor", "config", and "license" properties.');if(!W.includes(e))throw new Error(`Invalid editor type: ${e}. Must be one of: ${W.join(", ")}.`);return{type:e,license:n,config:A(i),customTranslations:s.customTranslations||s.custom_translations}}function T(a){if(!a||typeof a!="object")return a;if(Array.isArray(a))return a.map(i=>T(i));const t=a;if(t.$element&&typeof t.$element=="string"){const i=document.querySelector(t.$element);return i||console.warn(`Element not found for selector: ${t.$element}`),i||null}const e=Object.create(null);for(const[i,n]of Object.entries(a))e[i]=T(n);return e}function I(a,t,e){if(!e||typeof e!="object")return e;if(Array.isArray(e))return e.map(s=>I(a,t,s));const i=e;if(i.$translation&&typeof i.$translation=="string"){const s=i.$translation,o=vt(a,s,t);return o===void 0&&console.warn(`Translation not found for key: ${s}`),o!==void 0?o:null}const n=Object.create(null);for(const[s,o]of Object.entries(e))n[s]=I(a,t,o);return n}function vt(a,t,e){for(const i of a){const n=i[e];if(n?.dictionary&&t in n.dictionary)return n.dictionary[t]}}function Pt(a,t){const{editing:e}=a;e.view.change(i=>{i.setStyle("height",`${t}px`,e.view.document.getRoot())})}const V=Symbol.for("elixir-editor-watchdog");async function Ct(a){const{EditorWatchdog:t}=await import("ckeditor5"),e=new t(a);return e.setCreator(async(...i)=>{const n=await a.create(...i);return n[V]=e,n}),{watchdog:e,Constructor:{create:async(...i)=>(await e.create(...i),e.editor)}}}function Z(a){return V in a?a[V]:null}class w extends B{static the=new w}function At(a){const t=a.getAttribute("data-cke-context");if(!t)throw new Error('CKEditor5 hook requires a "data-cke-context" attribute on the element.');const{config:e,...i}=JSON.parse(t);return{config:A(e),customTranslations:i.customTranslations||i.custom_translations,watchdogConfig:i.watchdogConfig||i.watchdog_config}}class Tt extends x{contextPromise=null;get attrs(){const t=i=>this.el.getAttribute(i)||null,e={id:this.el.id,config:At(this.el),language:{ui:t("data-cke-language")||"en",content:t("data-cke-content-language")||"en"}};return Object.defineProperty(this,"attrs",{value:e,writable:!1,configurable:!1,enumerable:!0}),e}async mounted(){const{id:t,language:e}=this.attrs,{customTranslations:i,watchdogConfig:n,config:{plugins:s,...o}}=this.attrs.config,{loadedPlugins:u,hasPremium:c}=await Y(s??[]),d=[...await J(e,c),G(i?.dictionary||{})].filter(f=>!L(f));let h=T(o);h=I([...d].reverse(),e.ui,h),this.contextPromise=(async()=>{const{ContextWatchdog:f,Context:b}=await import("ckeditor5"),g=new f(b,{crashNumberLimit:10,...n});return await g.create({...h,language:e,plugins:u,...d.length&&{translations:d}}),g.on("itemError",(...E)=>{console.error("Context item error:",...E)}),g})();const y=await this.contextPromise;this.isBeingDestroyed()||w.the.register(t,y)}async destroyed(){const{id:t}=this.attrs;this.el.style.display="none";try{await(await this.contextPromise)?.destroy()}finally{this.contextPromise=null,w.the.hasItem(t)&&w.the.unregister(t)}}}function It(a){return a.hasAttribute("data-cke-context")}function xt(a){let t=a;for(;t;){if(It(t))return t;t=t.parentElement}return null}async function Ot(a){const t=xt(a);return t?w.the.waitFor(t.id):null}const Dt=O(Tt);class p extends B{static the=new p}function St(a,t){const e=new Set;return i=>{let n=!1;return a.model.enqueueChange({isUndoable:!1},s=>{const o=a.model.document.getRoot(t);if(o){for(const u of e)i&&u in i||(s.removeAttribute(u,o),e.delete(u),n=!0);for(const[u,c]of Object.entries(i??{}))s.setAttribute(u,c,o),e.add(u),n=!0}}),n}}async function Nt(){const{Plugin:a,FileRepository:t}=await import("ckeditor5");return class extends a{static get pluginName(){return"PhoenixUploadAdapter"}static get requires(){return[t]}init(){const{editor:i}=this,{plugins:n,config:s}=i,o=s.get("phoenixUpload.url");if(!o||n.has("SimpleUploadAdapter")||n.has("Base64UploadAdapter")||n.has("CKFinderUploadAdapter"))return;const u=n.get(t);u.createUploadAdapter=c=>new Rt(c,o)}}}class Rt{loader;uploadUrl;abortController=null;constructor(t,e){this.loader=t,this.uploadUrl=e}async upload(){const t=await this.loader.file;this.abortController=new AbortController;const e=new FormData;e.append("file",t),t.size&&(this.loader.uploadTotal=t.size,this.loader.uploaded=0);const i={},n=ht();n&&(i["X-CSRF-Token"]=n);try{const s=await fetch(this.uploadUrl,{method:"POST",headers:i,body:e,signal:this.abortController.signal});if(!s.ok){let u="Couldn't upload file!";try{const c=await s.json();c?.error?.message&&(u=c.error.message)}catch{}throw new Error(u)}return this.loader.uploaded=this.loader.uploadTotal,{default:(await s.json()).url}}catch(s){throw s.name==="AbortError"?s:s.message||"Couldn't upload file!"}}abort(){this.abortController?.abort(),this.abortController=null}}async function Vt({editorId:a,saveDebounceMs:t}){const{Plugin:e}=await import("ckeditor5");return class extends e{input=null;form=null;static get pluginName(){return"SyncEditorWithInput"}afterInit(){const{editor:n}=this;this.input=document.getElementById(`${a}_input`),this.input&&(n.model.document.on("change:data",C(t,()=>this.sync())),n.once("ready",this.sync),this.form=this.input.closest("form"),this.form?.addEventListener("submit",this.sync))}sync=()=>{const n=this.editor.getData();this.input.value=n,this.input.dispatchEvent(new Event("input",{bubbles:!0}))};destroy(){this.form&&this.form.removeEventListener("submit",this.sync),this.input=null,this.form=null}}}const U=Symbol("suppress-phoenix-sync");async function Ut(a){const{Plugin:t}=await import("ckeditor5"),{editorId:e,saveDebounceMs:i,events:n,pushEvent:s,handleEvent:o}=a;return class extends t{static get pluginName(){return"SyncEditorWithPhoenix"}init(){const{editor:c}=this;n.change&&this.setupTypingContentPush(),n.blur&&this.setupEventPush("blur"),n.focus&&this.setupEventPush("focus"),n.ready&&this.editor.once("ready",()=>{s("ckeditor5:ready",{editorId:e,data:N(c)})}),o("ckeditor5:set-data",({editorId:l,data:d})=>{(mt(l)||l===e)&&c.setData(d)})}setupTypingContentPush(){const{editor:c}=this;let l=null,d=!1;const h=()=>{if(d)return;const f=N(c);(!l||!ft(l,f))&&(s("ckeditor5:change",{editorId:e,data:f}),l=f)},y=C(i,h);c.model.document.on("change:data",C(10,f=>{if($t(f)){l=null;return}c.ui.focusTracker.isFocused?y():h()})),c.once("ready",h),c.once("destroy",()=>{d=!0})}setupEventPush(c){const{editor:l}=this,d=()=>{const{isFocused:h}=l.ui.focusTracker;(h?"focus":"blur")===c&&s(`ckeditor5:${c}`,{editorId:e,data:N(l)})};l.ui.focusTracker.on("change:isFocused",d)}}}function N(a){return a.model.document.getRootNames().reduce((e,i)=>(e[i]=a.getData({rootName:i}),e),Object.create({}))}function $t(a){const t=a[U];return delete a[U],!!t}function jt(a){let t=!1;const e=i=>{t||(i[U]=!0)};return a.model.document.once("change:data",e,{priority:"highest"}),()=>{t=!0,a.model.document.off("change:data",e)}}class tt{el;editorId;rootName;valueAttrName;rootAttrsAttrName;isDestroyed=!1;cleanupCallbacks=[];editorPromise=null;pendingValue=null;previousValue=null;attrsUpdater=null;constructor({el:t,editorId:e,rootName:i,valueAttrName:n="data-cke-value",rootAttrsAttrName:s="data-cke-root-attrs"}){this.el=t,this.editorId=e,this.rootName=i,this.valueAttrName=n,this.rootAttrsAttrName=s;const{value:o}=this.attrs;this.previousValue=o,this.editorPromise=p.the.execute(this.editorId,u=>this.isDestroyed?null:(this.setupSyncHandlers(u,this.rootName),u))}get attrs(){return{rootAttributes:pt(this.el.getAttribute(this.rootAttrsAttrName)),value:this.el.getAttribute(this.valueAttrName)}}async updated(){const{value:t,rootAttributes:e}=this.attrs,i=await this.editorPromise;if(!i||i.state==="destroyed"||this.isDestroyed)return;let n=()=>{};i.model.enqueueChange({isUndoable:!1},()=>{let s=this.attrsUpdater?.(e);t!==this.previousValue&&(this.previousValue=t,i.ui.focusTracker.isFocused?this.pendingValue=t:(this.setRootValue(i,this.rootName,t),s=!0)),s&&(n=jt(i))}),n()}setupSyncHandlers(t,e){this.attrsUpdater=St(t,e),this.attrsUpdater(this.attrs.rootAttributes);const i=()=>{this.pendingValue=null},n=()=>{!t.ui.focusTracker.isFocused&&this.pendingValue!==null&&(this.setRootValue(t,e,this.pendingValue),this.pendingValue=null)};t.model.document.on("change:data",i),t.ui.focusTracker.on("change:isFocused",n),this.cleanupCallbacks.push(()=>{t.model.document.off("change:data",i),t.ui.focusTracker.off("change:isFocused",n)})}setRootValue(t,e,i){t.getData({rootName:e})!==i&&t.setData({[e]:i})}destroy(){this.isDestroyed=!0,this.cleanupCallbacks.forEach(t=>t()),this.cleanupCallbacks=[]}}class Mt extends x{editorPromise=null;sentinel=null;get attrs(){const t={editableId:this.el.getAttribute("id"),editorId:this.el.getAttribute("data-cke-editor-id")||null,rootName:this.el.getAttribute("data-cke-editable-root-name"),initialValue:this.el.getAttribute("data-cke-editable-initial-value")||""};return Object.defineProperty(this,"attrs",{value:t,writable:!1,configurable:!1,enumerable:!0}),t}async mounted(){const{editableId:t,editorId:e,rootName:i,initialValue:n}=this.attrs,s=this.el.querySelector(`#${t}_input`);this.editorPromise=p.the.execute(e,async o=>{if(this.isBeingDestroyed())return null;const{ui:u,editing:c,model:l}=o;if(!l.document.getRoot(i)){o.addRoot(i,{isUndoable:!1,data:n});const d=this.el.querySelector("[data-cke-editable-content]"),h=u.view.createEditable(i,d);u.addEditable(h),c.view.forceRender()}if(this.sentinel=new tt({el:this.el,valueAttrName:"data-cke-editable-initial-value",rootAttrsAttrName:"data-cke-editable-root-attrs",editorId:e,rootName:i}),s){const d=zt(s,o,i);this.onBeforeDestroy(d)}return o})}async updated(){this.sentinel?.updated()}async destroyed(){const{rootName:t}=this.attrs;this.el.style.display="none",this.sentinel?.destroy(),this.sentinel=null;const e=await this.editorPromise;if(this.editorPromise=null,e&&e.state!=="destroyed"){const i=e.model.document.getRoot(t);i&&"detachEditable"in e&&(e.ui.view.editables[t]&&e.detachEditable(i),i.isAttached()&&e.detachRoot(t,!1))}}}const Ht=O(Mt);function zt(a,t,e){const i=()=>{a.value=t.getData({rootName:e})},n=C(200,i);return t.model.document.on("change:data",n),i(),()=>{t.model.document.off("change:data",n)}}class _t extends x{editorPromise=null;sentinel=null;get attrs(){const{el:t}=this,e=t.getAttribute.bind(t),i=t.hasAttribute.bind(t),n={editorId:e("id"),contextId:e("data-cke-context-id"),preset:Et(t),editableHeight:_(e("data-cke-editable-height")),watchdog:i("data-cke-watchdog"),events:{change:i("data-cke-change-event"),blur:i("data-cke-blur-event"),focus:i("data-cke-focus-event"),ready:i("data-cke-ready-event")},saveDebounceMs:_(e("data-cke-save-debounce-ms"))??400,language:{ui:e("data-cke-language")||"en",content:e("data-cke-content-language")||"en"}};return Object.defineProperty(this,"attrs",{value:n,writable:!1,configurable:!1,enumerable:!0}),n}async mounted(){const{editorId:t}=this.attrs;p.the.resetErrors(t);try{this.editorPromise=this.createEditor();const e=await this.editorPromise;this.isBeingDestroyed()||(p.the.register(t,e),e.once("destroy",()=>{p.the.hasItem(t)&&p.the.unregister(t)}),this.sentinel=new tt({editorId:t,el:this.el,rootName:"main",valueAttrName:"data-cke-initial-value",rootAttrsAttrName:"data-cke-root-attrs"}))}catch(e){this.editorPromise=null,p.the.error(t,e)}return this}async updated(){this.sentinel?.updated()}async destroyed(){this.el.style.display="none",this.sentinel?.destroy(),this.sentinel=null;try{const t=await this.editorPromise;if(!t)return;const e=K(t),i=Z(t);e?e.state!=="unavailable"&&await e.context.remove(e.editorContextId):i?await i.destroy():await t.destroy()}finally{this.editorPromise=null}}async createEditor(){const{preset:t,editorId:e,contextId:i,editableHeight:n,events:s,saveDebounceMs:o,language:u,watchdog:c}=this.attrs,{customTranslations:l,type:d,license:h,config:{plugins:y,...f}}=t;let b=await bt(d);const g=await(i?w.the.waitFor(i):Ot(this.el));if(c&&!g){const m=await Ct(b);({Constructor:b}=m),m.watchdog.on("restart",()=>{const k=m.watchdog.editor;this.editorPromise=Promise.resolve(k),p.the.register(e,k)})}const{loadedPlugins:E,hasPremium:rt}=await Y(y);P(d)&&E.push(await Vt({editorId:e,saveDebounceMs:o})),E.push(...await Promise.all([Ut({editorId:e,saveDebounceMs:o,events:s,pushEvent:this.pushEvent.bind(this),handleEvent:this.handleEvent.bind(this)}),Nt()]));const S=[...await J(u,rt),G(l?.dictionary||{})].filter(m=>!L(m));let v=F(e);P(d)&&(v=v.main||"");const j=await(async()=>{let m=X(e);if(!(m instanceof HTMLElement)&&!("main"in m)){const H=d==="decoupled"?["main"]:Object.keys(v);et(m,H)||(m=await qt(e,H),v=F(e))}P(d)&&"main"in m&&(m=m.main);let k=T(f);k=I([...S].reverse(),u.ui,k);const M={...k,initialData:v,licenseKey:h.key,plugins:E,language:u,...S.length&&{translations:S}};return!g||!(m instanceof HTMLElement)?b.create(m,M):(await yt({context:g,element:m,creator:b,config:M})).editor})();return P(d)&&n&&Pt(j,n),j}}function et(a,t){return t.every(e=>a[e])}async function qt(a,t){return gt(()=>{const e=X(a);if(!et(e,t))throw new Error(`It looks like not all required root elements are present yet.
1
+ "use strict";var ot=Object.create;var F=Object.defineProperty;var ct=Object.getOwnPropertyDescriptor;var ut=Object.getOwnPropertyNames;var lt=Object.getPrototypeOf,dt=Object.prototype.hasOwnProperty;var ht=(r,t,e,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of ut(t))!dt.call(r,i)&&i!==e&&F(r,i,{get:()=>t[i],enumerable:!(a=ct(t,i))||a.enumerable});return r};var n=(r,t,e)=>(e=r!=null?ot(lt(r)):{},ht(t||!r||!r.__esModule?F(e,"default",{value:r,enumerable:!0}):e,r));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function B(r,t){if(!r||r.size!==t.size)return!1;for(const[e,a]of r)if(!t.has(e)||t.get(e)!==a)return!1;return!0}class G{items=new Map;initializationErrors=new Map;pendingCallbacks=new Map;watchers=new Set;batchDepth=0;lastNotifiedItems=null;lastNotifiedErrors=null;execute(t,e,a){const i=this.items.get(t),s=this.initializationErrors.get(t);return s?(a?.(s),Promise.reject(s)):i?Promise.resolve(e(i)):new Promise((o,u)=>{const c=this.getPendingCallbacks(t);c.success.push(async l=>{o(await e(l))}),a?c.error.push(a):c.error.push(u)})}mountEffect(t,e){let a,i,s=!1;const o=this.watch(u=>{const c=u.get(t);if(c!==i&&(a?.(),a=void 0,i=c,!!c))try{const l=e(c);s?(l?.(),o()):a=l}catch(l){throw console.error(l),l}});return()=>{s=!0,i&&(o(),a?.(),a=void 0)}}register(t,e){this.batch(()=>{if(this.items.has(t))throw new Error(`Item with ID "${t}" is already registered.`);this.resetErrors(t),this.items.set(t,e);const a=this.pendingCallbacks.get(t);a&&(a.success.forEach(i=>i(e)),this.pendingCallbacks.delete(t)),this.items.size===1&&t!==null&&this.register(null,e)})}error(t,e){this.batch(()=>{this.items.delete(t),this.initializationErrors.set(t,e);const a=this.pendingCallbacks.get(t);a&&(a.error.forEach(i=>i(e)),this.pendingCallbacks.delete(t)),this.initializationErrors.size===1&&!this.items.size&&this.error(null,e)})}resetErrors(t){const{initializationErrors:e}=this;e.has(null)&&e.get(null)===e.get(t)&&e.delete(null),e.delete(t)}unregister(t,e=!0){this.batch(()=>{t&&this.items.get(null)===this.items.get(t)&&this.unregister(null,!1),this.items.delete(t),e&&this.pendingCallbacks.delete(t),this.resetErrors(t)})}getItems(){return Array.from(this.items.values())}getItem(t){return this.items.get(t)}hasItem(t){return this.items.has(t)}waitFor(t){return new Promise((e,a)=>{this.execute(t,e,a)})}async destroyAll(){const t=Array.from(new Set(this.items.values())).map(e=>e.destroy());this.items.clear(),this.pendingCallbacks.clear(),await Promise.all(t),this.flushWatchers()}async reset(){await this.destroyAll(),this.watchers.clear()}batch(t){this.batchDepth++;try{return t()}finally{this.batchDepth--,this.batchDepth===0&&this.flushWatchers()}}watch(t){return this.watchers.add(t),t(new Map(this.items),new Map(this.initializationErrors)),this.unwatch.bind(this,t)}unwatch(t){this.watchers.delete(t)}flushWatchers(){B(this.lastNotifiedItems,this.items)&&B(this.lastNotifiedErrors,this.initializationErrors)||(this.lastNotifiedItems=new Map(this.items),this.lastNotifiedErrors=new Map(this.initializationErrors),this.watchers.forEach(t=>t(new Map(this.items),new Map(this.initializationErrors))))}getPendingCallbacks(t){let e=this.pendingCallbacks.get(t);return e||(e={success:[],error:[]},this.pendingCallbacks.set(t,e)),e}}function mt(r){return r.replace(/[-_\s]+(.)?/g,(t,e)=>e?e.toUpperCase():"").replace(/^./,t=>t.toLowerCase())}function I(r,t){let e=null;return(...a)=>{e&&clearTimeout(e),e=setTimeout(()=>{t(...a)},r)}}function pt(r){if(Object.prototype.toString.call(r)!=="[object Object]")return!1;const t=Object.getPrototypeOf(r);return t===Object.prototype||t===null}function x(r){if(Array.isArray(r))return r.map(x);if(pt(r)){const t=Object.create(null);for(const[e,a]of Object.entries(r))t[mt(e)]=x(a);return t}return r}function ft(r,t){const e=Object.entries(r).filter(([a,i])=>t(i,a));return Object.fromEntries(e)}function wt(){const r=document.querySelector('meta[name="csrf-token"]');if(r)return r.getAttribute("content");const t=document.cookie.match(/(?:^|; )_csrf_token=([^;]*)/);return t?decodeURIComponent(t[1]):null}class S{state="mounting";el;_beforeDestroyCallbacks=[];onBeforeDestroy(t){this._beforeDestroyCallbacks.push(t)}pushEvent;pushEventTo;handleEvent;mounted(){}destroyed(){}updated(){}isBeingDestroyed(){return this.state==="destroyed"||this.state==="destroying"}_runBeforeDestroyCallbacks(){for(const t of this._beforeDestroyCallbacks.reverse())t();this._beforeDestroyCallbacks=[]}}function N(r){return{async mounted(){const t=new r;this.el.instance=t,t.el=this.el,t.pushEvent=(a,i,s)=>this.pushEvent?.(a,i,s),t.pushEventTo=(a,i,s,o)=>this.pushEventTo?.(a,i,s,o),t.handleEvent=(a,i)=>this.handleEvent?.(a,i),t.state="mounting";const e=await t.mounted?.();return t.state="mounted",e},beforeUpdate(){this.el.instance.beforeUpdate?.()},async destroyed(){const{instance:t}=this.el;t.state="destroying",t._runBeforeDestroyCallbacks(),await t.destroyed?.(),t.state="destroyed"},disconnected(){this.el.instance.disconnected?.()},reconnected(){this.el.instance.reconnected?.()},updated(){return this.el.instance.updated?.()}}}function X(r){return Object.keys(r).length===0&&r.constructor===Object}function gt(r){return r==null}function z(r,t){const e=Object.entries(r).map(([a,i])=>[a,t(i,a)]);return Object.fromEntries(e)}function L(r){if(r===null)return null;const t=Number.parseInt(r,10);return Number.isNaN(t)?null:t}function yt(r){return r==null||r.trim()===""?null:JSON.parse(r)}function bt(r,t){if(r===t)return!0;const e=Object.keys(r),a=Object.keys(t);if(e.length!==a.length)return!1;for(const i of e)if(r[i]!==t[i]||!Object.prototype.hasOwnProperty.call(t,i))return!1;return!0}function kt(){return Math.random().toString(36).substring(2)}function Et(r,{timeOutAfter:t=500,retryAfter:e=100}={}){return new Promise((a,i)=>{const s=Date.now();let o=null;const u=setTimeout(()=>{i(o??new Error("Timeout"))},t),c=async()=>{try{const l=await r();clearTimeout(u),a(l)}catch(l){o=l,Date.now()-s>t?i(l):setTimeout(c,e)}};c()})}function vt(r){const t=[r.ui?.element,r.ui?.view?.toolbar?.element,r.ui?.view?.menuBarView?.element].filter(Boolean);for(const s of t)i(s);const e=r.ui?.view?.body?._bodyCollectionContainer;e?.isConnected&&i(e);const a=r.editing?.view;if(a)for(const s of a.domRoots.values())s instanceof HTMLElement&&(s.removeAttribute("contenteditable"),s.removeAttribute("role"),s.removeAttribute("aria-label"),s.removeAttribute("aria-multiline"),s.removeAttribute("spellcheck"),s.classList.remove("ck","ck-content","ck-editor__editable","ck-rounded-corners","ck-editor__editable_inline","ck-blurred","ck-focused"),i(s));function i(s){s.hasAttribute("data-cke-controlled")?s.innerHTML="":s.remove()}}const U=Symbol.for("context-editor-watchdog");async function Ct({element:r,context:t,creator:e,config:a}){const i=kt();await t.add({creator:(c,l)=>e.create(c,l),id:i,sourceElementOrData:r,type:"editor",config:a});const s=t.getItem(i),o={state:"available",editorContextId:i,context:t};s[U]=o;const u=t.destroy.bind(t);return t.destroy=async()=>(o.state="unavailable",u()),{...o,editor:s}}function Q(r){return U in r?r[U]:null}function W(r){return"addEditable"in r.ui}function T(r){return["inline","classic","balloon","decoupled"].includes(r)}async function Pt(r){const t=await import("ckeditor5"),a={inline:t.InlineEditor,balloon:t.BalloonEditor,classic:t.ClassicEditor,decoupled:t.DecoupledEditor,multiroot:t.MultiRootEditor}[r];if(!a)throw new Error(`Unsupported editor type: ${r}`);return a}class R{static the=new R;plugins=new Map;constructor(){}register(t,e){if(this.plugins.has(t))throw new Error(`Plugin with name "${t}" is already registered.`);return this.plugins.set(t,e),this.unregister.bind(this,t)}unregister(t){if(!this.plugins.has(t))throw new Error(`Plugin with name "${t}" is not registered.`);this.plugins.delete(t)}unregisterAll(){this.plugins.clear()}async get(t){return this.plugins.get(t)?.()}has(t){return this.plugins.has(t)}}async function Z(r){const t=await import("ckeditor5");let e=null;const a=r.map(async i=>{const s=await R.the.get(i);if(s)return s;const{[i]:o}=t;if(o)return o;if(!e)try{e=await import("ckeditor5-premium-features")}catch(c){console.error(`Failed to load premium package: ${c}`)}const{[i]:u}=e||{};if(u)return u;throw new Error(`Plugin "${i}" not found in base or premium packages.`)});return{loadedPlugins:await Promise.all(a),hasPremium:!!e}}async function tt(r,t){const e=[r.ui,r.content];return await Promise.all([K("ckeditor5",e),t&&K("ckeditor5-premium-features",e)].filter(i=>!!i)).then(i=>i.flat())}async function K(r,t){return await Promise.all(t.filter(e=>e!=="en").map(async e=>{const a=await At(r,e);return a?.default??a}).filter(Boolean))}async function At(r,t){try{if(r==="ckeditor5")switch(t){case"af":return await import("ckeditor5/translations/af.js");case"ar":return await import("ckeditor5/translations/ar.js");case"ast":return await import("ckeditor5/translations/ast.js");case"az":return await import("ckeditor5/translations/az.js");case"bg":return await import("ckeditor5/translations/bg.js");case"bn":return await import("ckeditor5/translations/bn.js");case"bs":return await import("ckeditor5/translations/bs.js");case"ca":return await import("ckeditor5/translations/ca.js");case"cs":return await import("ckeditor5/translations/cs.js");case"da":return await import("ckeditor5/translations/da.js");case"de":return await import("ckeditor5/translations/de.js");case"de-ch":return await import("ckeditor5/translations/de-ch.js");case"el":return await import("ckeditor5/translations/el.js");case"en":return await import("ckeditor5/translations/en.js");case"en-au":return await import("ckeditor5/translations/en-au.js");case"en-gb":return await import("ckeditor5/translations/en-gb.js");case"eo":return await import("ckeditor5/translations/eo.js");case"es":return await import("ckeditor5/translations/es.js");case"es-co":return await import("ckeditor5/translations/es-co.js");case"et":return await import("ckeditor5/translations/et.js");case"eu":return await import("ckeditor5/translations/eu.js");case"fa":return await import("ckeditor5/translations/fa.js");case"fi":return await import("ckeditor5/translations/fi.js");case"fr":return await import("ckeditor5/translations/fr.js");case"gl":return await import("ckeditor5/translations/gl.js");case"gu":return await import("ckeditor5/translations/gu.js");case"he":return await import("ckeditor5/translations/he.js");case"hi":return await import("ckeditor5/translations/hi.js");case"hr":return await import("ckeditor5/translations/hr.js");case"hu":return await import("ckeditor5/translations/hu.js");case"hy":return await import("ckeditor5/translations/hy.js");case"id":return await import("ckeditor5/translations/id.js");case"it":return await import("ckeditor5/translations/it.js");case"ja":return await import("ckeditor5/translations/ja.js");case"jv":return await import("ckeditor5/translations/jv.js");case"kk":return await import("ckeditor5/translations/kk.js");case"km":return await import("ckeditor5/translations/km.js");case"kn":return await import("ckeditor5/translations/kn.js");case"ko":return await import("ckeditor5/translations/ko.js");case"ku":return await import("ckeditor5/translations/ku.js");case"lt":return await import("ckeditor5/translations/lt.js");case"lv":return await import("ckeditor5/translations/lv.js");case"ms":return await import("ckeditor5/translations/ms.js");case"nb":return await import("ckeditor5/translations/nb.js");case"ne":return await import("ckeditor5/translations/ne.js");case"nl":return await import("ckeditor5/translations/nl.js");case"no":return await import("ckeditor5/translations/no.js");case"oc":return await import("ckeditor5/translations/oc.js");case"pl":return await import("ckeditor5/translations/pl.js");case"pt":return await import("ckeditor5/translations/pt.js");case"pt-br":return await import("ckeditor5/translations/pt-br.js");case"ro":return await import("ckeditor5/translations/ro.js");case"ru":return await import("ckeditor5/translations/ru.js");case"si":return await import("ckeditor5/translations/si.js");case"sk":return await import("ckeditor5/translations/sk.js");case"sl":return await import("ckeditor5/translations/sl.js");case"sq":return await import("ckeditor5/translations/sq.js");case"sr":return await import("ckeditor5/translations/sr.js");case"sr-latn":return await import("ckeditor5/translations/sr-latn.js");case"sv":return await import("ckeditor5/translations/sv.js");case"th":return await import("ckeditor5/translations/th.js");case"tk":return await import("ckeditor5/translations/tk.js");case"tr":return await import("ckeditor5/translations/tr.js");case"tt":return await import("ckeditor5/translations/tt.js");case"ug":return await import("ckeditor5/translations/ug.js");case"uk":return await import("ckeditor5/translations/uk.js");case"ur":return await import("ckeditor5/translations/ur.js");case"uz":return await import("ckeditor5/translations/uz.js");case"vi":return await import("ckeditor5/translations/vi.js");case"zh":return await import("ckeditor5/translations/zh.js");case"zh-cn":return await import("ckeditor5/translations/zh-cn.js");default:return console.warn(`Language ${t} not found in ckeditor5 translations`),null}else switch(t){case"af":return await import("ckeditor5-premium-features/translations/af.js");case"ar":return await import("ckeditor5-premium-features/translations/ar.js");case"ast":return await import("ckeditor5-premium-features/translations/ast.js");case"az":return await import("ckeditor5-premium-features/translations/az.js");case"bg":return await import("ckeditor5-premium-features/translations/bg.js");case"bn":return await import("ckeditor5-premium-features/translations/bn.js");case"bs":return await import("ckeditor5-premium-features/translations/bs.js");case"ca":return await import("ckeditor5-premium-features/translations/ca.js");case"cs":return await import("ckeditor5-premium-features/translations/cs.js");case"da":return await import("ckeditor5-premium-features/translations/da.js");case"de":return await import("ckeditor5-premium-features/translations/de.js");case"de-ch":return await import("ckeditor5-premium-features/translations/de-ch.js");case"el":return await import("ckeditor5-premium-features/translations/el.js");case"en":return await import("ckeditor5-premium-features/translations/en.js");case"en-au":return await import("ckeditor5-premium-features/translations/en-au.js");case"en-gb":return await import("ckeditor5-premium-features/translations/en-gb.js");case"eo":return await import("ckeditor5-premium-features/translations/eo.js");case"es":return await import("ckeditor5-premium-features/translations/es.js");case"es-co":return await import("ckeditor5-premium-features/translations/es-co.js");case"et":return await import("ckeditor5-premium-features/translations/et.js");case"eu":return await import("ckeditor5-premium-features/translations/eu.js");case"fa":return await import("ckeditor5-premium-features/translations/fa.js");case"fi":return await import("ckeditor5-premium-features/translations/fi.js");case"fr":return await import("ckeditor5-premium-features/translations/fr.js");case"gl":return await import("ckeditor5-premium-features/translations/gl.js");case"gu":return await import("ckeditor5-premium-features/translations/gu.js");case"he":return await import("ckeditor5-premium-features/translations/he.js");case"hi":return await import("ckeditor5-premium-features/translations/hi.js");case"hr":return await import("ckeditor5-premium-features/translations/hr.js");case"hu":return await import("ckeditor5-premium-features/translations/hu.js");case"hy":return await import("ckeditor5-premium-features/translations/hy.js");case"id":return await import("ckeditor5-premium-features/translations/id.js");case"it":return await import("ckeditor5-premium-features/translations/it.js");case"ja":return await import("ckeditor5-premium-features/translations/ja.js");case"jv":return await import("ckeditor5-premium-features/translations/jv.js");case"kk":return await import("ckeditor5-premium-features/translations/kk.js");case"km":return await import("ckeditor5-premium-features/translations/km.js");case"kn":return await import("ckeditor5-premium-features/translations/kn.js");case"ko":return await import("ckeditor5-premium-features/translations/ko.js");case"ku":return await import("ckeditor5-premium-features/translations/ku.js");case"lt":return await import("ckeditor5-premium-features/translations/lt.js");case"lv":return await import("ckeditor5-premium-features/translations/lv.js");case"ms":return await import("ckeditor5-premium-features/translations/ms.js");case"nb":return await import("ckeditor5-premium-features/translations/nb.js");case"ne":return await import("ckeditor5-premium-features/translations/ne.js");case"nl":return await import("ckeditor5-premium-features/translations/nl.js");case"no":return await import("ckeditor5-premium-features/translations/no.js");case"oc":return await import("ckeditor5-premium-features/translations/oc.js");case"pl":return await import("ckeditor5-premium-features/translations/pl.js");case"pt":return await import("ckeditor5-premium-features/translations/pt.js");case"pt-br":return await import("ckeditor5-premium-features/translations/pt-br.js");case"ro":return await import("ckeditor5-premium-features/translations/ro.js");case"ru":return await import("ckeditor5-premium-features/translations/ru.js");case"si":return await import("ckeditor5-premium-features/translations/si.js");case"sk":return await import("ckeditor5-premium-features/translations/sk.js");case"sl":return await import("ckeditor5-premium-features/translations/sl.js");case"sq":return await import("ckeditor5-premium-features/translations/sq.js");case"sr":return await import("ckeditor5-premium-features/translations/sr.js");case"sr-latn":return await import("ckeditor5-premium-features/translations/sr-latn.js");case"sv":return await import("ckeditor5-premium-features/translations/sv.js");case"th":return await import("ckeditor5-premium-features/translations/th.js");case"tk":return await import("ckeditor5-premium-features/translations/tk.js");case"tr":return await import("ckeditor5-premium-features/translations/tr.js");case"tt":return await import("ckeditor5-premium-features/translations/tt.js");case"ug":return await import("ckeditor5-premium-features/translations/ug.js");case"uk":return await import("ckeditor5-premium-features/translations/uk.js");case"ur":return await import("ckeditor5-premium-features/translations/ur.js");case"uz":return await import("ckeditor5-premium-features/translations/uz.js");case"vi":return await import("ckeditor5-premium-features/translations/vi.js");case"zh":return await import("ckeditor5-premium-features/translations/zh.js");case"zh-cn":return await import("ckeditor5-premium-features/translations/zh-cn.js");default:return console.warn(`Language ${t} not found in premium translations`),await import("ckeditor5-premium-features/translations/en.js")}}catch(e){return console.error(`Failed to load translation for ${r}/${t}:`,e),null}}function et(r){return z(r,t=>({dictionary:t}))}function rt(r){const t=at(r);return z(t,({content:e})=>e)}function Y(r){const t=at(r),e=z(t,({initialValue:a})=>a);return ft(e,a=>typeof a=="string")}function at(r){const t=document.querySelectorAll([`[data-cke-editor-id="${r}"][data-cke-editable-root-name]`,"[data-cke-editable-root-name]:not([data-cke-editor-id])"].join(", ")),e=Array.from(t).reduce((u,c)=>{const l=c.getAttribute("data-cke-editable-root-name"),d=c.getAttribute("data-cke-editable-initial-value")||"",h=c.querySelector("[data-cke-editable-content]");return!l||!h?u:{...u,[l]:{content:h,initialValue:d}}},Object.create({})),a=document.querySelector(`[phx-hook="CKEditor5"][id="${r}"]`);if(!a)return e;const i=a.getAttribute("data-cke-initial-value")||"",s=a.querySelector(`#${r}_editor `),o=e.main;return o?{...e,main:{...o,initialValue:o.initialValue||i}}:s?{...e,main:{content:s,initialValue:i}}:e}const J=["inline","classic","balloon","decoupled","multiroot"];function Tt(r){const t=r.getAttribute("data-cke-preset");if(!t)throw new Error('CKEditor5 hook requires a "cke-preset" attribute on the element.');const{type:e,config:a,license:i,watchdog:s,...o}=JSON.parse(t);if(!e||!a||!i)throw new Error('CKEditor5 hook configuration must include "editor", "config", and "license" properties.');if(!J.includes(e))throw new Error(`Invalid editor type: ${e}. Must be one of: ${J.join(", ")}.`);return{type:e,license:i,watchdog:s,config:x(a),customTranslations:o.customTranslations||o.custom_translations}}function O(r){if(!r||typeof r!="object")return r;if(Array.isArray(r))return r.map(a=>O(a));const t=r;if(t.$element&&typeof t.$element=="string"){const a=document.querySelector(t.$element);return a||console.warn(`Element not found for selector: ${t.$element}`),a||null}const e=Object.create(null);for(const[a,i]of Object.entries(r))e[a]=O(i);return e}function D(r,t,e){if(!e||typeof e!="object")return e;if(Array.isArray(e))return e.map(s=>D(r,t,s));const a=e;if(a.$translation&&typeof a.$translation=="string"){const s=a.$translation,o=It(r,s,t);return o===void 0&&console.warn(`Translation not found for key: ${s}`),o!==void 0?o:null}const i=Object.create(null);for(const[s,o]of Object.entries(e))i[s]=D(r,t,o);return i}function It(r,t,e){for(const a of r){const i=a[e];if(i?.dictionary&&t in i.dictionary)return i.dictionary[t]}}function xt(r,t){const{editing:e}=r;e.view.change(a=>{a.setStyle("height",`${t}px`,e.view.document.getRoot())})}const $=Symbol.for("elixir-editor-watchdog");async function Ot(r,t){const{EditorWatchdog:e}=await import("ckeditor5"),a=new e(null,t??{crashNumberLimit:10,minimumNonErrorTimePeriod:5e3});return a.setCreator(async()=>{const i=await r();return i[$]=a,i}),a}function nt(r){return $ in r?r[$]:null}class y extends G{static the=new y}function Dt(r){const t=r.getAttribute("data-cke-context");if(!t)throw new Error('CKEditor5 hook requires a "data-cke-context" attribute on the element.');const{config:e,...a}=JSON.parse(t);return{config:x(e),customTranslations:a.customTranslations||a.custom_translations,watchdogConfig:a.watchdogConfig||a.watchdog_config}}class St extends S{contextPromise=null;get attrs(){const t=a=>this.el.getAttribute(a)||null,e={id:this.el.id,config:Dt(this.el),language:{ui:t("data-cke-language")||"en",content:t("data-cke-content-language")||"en"}};return Object.defineProperty(this,"attrs",{value:e,writable:!1,configurable:!1,enumerable:!0}),e}async mounted(){const{id:t,language:e}=this.attrs,{customTranslations:a,watchdogConfig:i,config:{plugins:s,...o}}=this.attrs.config,{loadedPlugins:u,hasPremium:c}=await Z(s??[]),d=[...await tt(e,c),et(a?.dictionary||{})].filter(p=>!X(p));let h=O(o);h=D([...d].reverse(),e.ui,h),this.contextPromise=(async()=>{const{ContextWatchdog:p,Context:C}=await import("ckeditor5"),b=new p(C,{crashNumberLimit:10,...i});return await b.create({...h,language:e,plugins:u,...d.length&&{translations:d}}),b.on("itemError",(...P)=>{console.error("Context item error:",...P)}),b})();const g=await this.contextPromise;this.isBeingDestroyed()||y.the.register(t,g)}async destroyed(){const{id:t}=this.attrs;this.el.style.display="none";try{await(await this.contextPromise)?.destroy()}finally{this.contextPromise=null,y.the.hasItem(t)&&y.the.unregister(t)}}}function Nt(r){return r.hasAttribute("data-cke-context")}function Rt(r){let t=r;for(;t;){if(Nt(t))return t;t=t.parentElement}return null}async function Vt(r){const t=Rt(r);return t?y.the.waitFor(t.id):null}const Mt=N(St);function Ut(r,t){const e=new Set;return a=>{let i=!1;return r.model.enqueueChange({isUndoable:!1},s=>{const o=r.model.document.getRoot(t);if(o){for(const u of e)a&&u in a||(s.removeAttribute(u,o),e.delete(u),i=!0);for(const[u,c]of Object.entries(a??{}))s.setAttribute(u,c,o),e.add(u),i=!0}}),i}}async function $t(){const{Plugin:r,FileRepository:t}=await import("ckeditor5");return class extends r{static get pluginName(){return"PhoenixUploadAdapter"}static get requires(){return[t]}init(){const{editor:a}=this,{plugins:i,config:s}=a,o=s.get("phoenixUpload.url");if(!o||i.has("SimpleUploadAdapter")||i.has("Base64UploadAdapter")||i.has("CKFinderUploadAdapter"))return;const u=i.get(t);u.createUploadAdapter=c=>new _t(c,o)}}}class _t{loader;uploadUrl;abortController=null;constructor(t,e){this.loader=t,this.uploadUrl=e}async upload(){const t=await this.loader.file;this.abortController=new AbortController;const e=new FormData;e.append("file",t),t.size&&(this.loader.uploadTotal=t.size,this.loader.uploaded=0);const a={},i=wt();i&&(a["X-CSRF-Token"]=i);try{const s=await fetch(this.uploadUrl,{method:"POST",headers:a,body:e,signal:this.abortController.signal});if(!s.ok){let u="Couldn't upload file!";try{const c=await s.json();c?.error?.message&&(u=c.error.message)}catch{}throw new Error(u)}return this.loader.uploaded=this.loader.uploadTotal,{default:(await s.json()).url}}catch(s){throw s.name==="AbortError"?s:s.message||"Couldn't upload file!"}}abort(){this.abortController?.abort(),this.abortController=null}}async function zt({editorId:r,saveDebounceMs:t}){const{Plugin:e}=await import("ckeditor5");return class extends e{input=null;form=null;static get pluginName(){return"SyncEditorWithInput"}afterInit(){const{editor:i}=this;this.input=document.getElementById(`${r}_input`),this.input&&(i.model.document.on("change:data",I(t,()=>this.sync())),i.once("ready",this.sync),this.form=this.input.closest("form"),this.form?.addEventListener("submit",this.sync))}sync=()=>{const i=this.editor.getData();this.input.value=i,this.input.dispatchEvent(new Event("input",{bubbles:!0}))};destroy(){this.form&&this.form.removeEventListener("submit",this.sync),this.input=null,this.form=null}}}const _=Symbol("suppress-phoenix-sync");async function Ht(r){const{Plugin:t}=await import("ckeditor5"),{editorId:e,saveDebounceMs:a,events:i,pushEvent:s,handleEvent:o}=r;return class extends t{static get pluginName(){return"SyncEditorWithPhoenix"}init(){const{editor:c}=this;i.change&&this.setupTypingContentPush(),i.blur&&this.setupEventPush("blur"),i.focus&&this.setupEventPush("focus"),i.ready&&this.editor.once("ready",()=>{s("ckeditor5:ready",{editorId:e,data:M(c)})}),o("ckeditor5:set-data",({editorId:l,data:d})=>{(gt(l)||l===e)&&c.setData(d)})}setupTypingContentPush(){const{editor:c}=this;let l=null,d=!1;const h=()=>{if(d)return;const p=M(c);(!l||!bt(l,p))&&(s("ckeditor5:change",{editorId:e,data:p}),l=p)},g=I(a,h);c.model.document.on("change:data",I(10,p=>{if(jt(p)){l=null;return}c.ui.focusTracker.isFocused?g():h()})),c.once("ready",h),c.once("destroy",()=>{d=!0})}setupEventPush(c){const{editor:l}=this,d=()=>{const{isFocused:h}=l.ui.focusTracker;(h?"focus":"blur")===c&&s(`ckeditor5:${c}`,{editorId:e,data:M(l)})};l.ui.focusTracker.on("change:isFocused",d)}}}function M(r){return r.model.document.getRootNames().reduce((e,a)=>(e[a]=r.getData({rootName:a}),e),Object.create({}))}function jt(r){const t=r[_];return delete r[_],!!t}function qt(r){let t=!1;const e=a=>{t||(a[_]=!0)};return r.model.document.once("change:data",e,{priority:"highest"}),()=>{t=!0,r.model.document.off("change:data",e)}}class it{el;rootName;valueAttrName;rootAttrsAttrName;isDestroyed=!1;cleanupCallbacks=[];editor;pendingValue=null;previousValue=null;attrsUpdater=null;constructor({el:t,editor:e,rootName:a,valueAttrName:i="data-cke-value",rootAttrsAttrName:s="data-cke-root-attrs"}){this.el=t,this.editor=e,this.rootName=a,this.valueAttrName=i,this.rootAttrsAttrName=s;const{value:o}=this.attrs;this.previousValue=o,this.setupSyncHandlers(e,this.rootName)}get attrs(){return{rootAttributes:yt(this.el.getAttribute(this.rootAttrsAttrName)),value:this.el.getAttribute(this.valueAttrName)}}async updated(){const{editor:t}=this,{value:e,rootAttributes:a}=this.attrs;if(!t||t.state==="destroyed"||this.isDestroyed)return;let i=()=>{};t.model.enqueueChange({isUndoable:!1},()=>{let s=this.attrsUpdater?.(a);e!==this.previousValue&&(this.previousValue=e,t.ui.focusTracker.isFocused?this.pendingValue=e:(this.setRootValue(t,this.rootName,e),s=!0)),s&&(i=qt(t))}),i()}setupSyncHandlers(t,e){this.attrsUpdater=Ut(t,e),this.attrsUpdater(this.attrs.rootAttributes);const a=()=>{this.pendingValue=null},i=()=>{!t.ui.focusTracker.isFocused&&this.pendingValue!==null&&(this.setRootValue(t,e,this.pendingValue),this.pendingValue=null)};t.model.document.on("change:data",a),t.ui.focusTracker.on("change:isFocused",i),this.cleanupCallbacks.push(()=>{t.model.document.off("change:data",a),t.ui.focusTracker.off("change:isFocused",i)})}setRootValue(t,e,a){t.getData({rootName:e})!==a&&t.setData({[e]:a})}destroy(){this.isDestroyed=!0,this.cleanupCallbacks.forEach(t=>t()),this.cleanupCallbacks=[]}}class m extends G{static the=new m}class Ft extends S{sentinel=null;get attrs(){const{el:t}=this,e=t.getAttribute.bind(t),a=t.hasAttribute.bind(t),i={editorId:e("id"),contextId:e("data-cke-context-id"),preset:Tt(t),editableHeight:L(e("data-cke-editable-height")),watchdog:a("data-cke-watchdog"),events:{change:a("data-cke-change-event"),blur:a("data-cke-blur-event"),focus:a("data-cke-focus-event"),ready:a("data-cke-ready-event")},saveDebounceMs:L(e("data-cke-save-debounce-ms"))??400,language:{ui:e("data-cke-language")||"en",content:e("data-cke-content-language")||"en"}};return Object.defineProperty(this,"attrs",{value:i,writable:!1,configurable:!1,enumerable:!0}),i}async mounted(){const{editorId:t}=this.attrs;m.the.resetErrors(t);try{const e=await this.createEditor();if(this.isBeingDestroyed())return;const a=m.the.mountEffect(t,i=>(i.once("destroy",()=>{m.the.unregister(t,!1)},{priority:"highest"}),this.sentinel=new it({editor:i,el:this.el,rootName:"main",valueAttrName:"data-cke-initial-value",rootAttrsAttrName:"data-cke-root-attrs"}),()=>{this.sentinel?.destroy(),this.sentinel=null}));this.onBeforeDestroy(a),m.the.register(t,e)}catch(e){console.error(e),m.the.error(t,e)}return this}async updated(){this.sentinel?.updated()}async destroyed(){const{editorId:t}=this.attrs;this.el.style.display="none";const e=await m.the.waitFor(t);if(!e)return;m.the.unregister(t);const a=Q(e),i=nt(e);a?a.state!=="unavailable"&&await a.context.remove(a.editorContextId):i?await i.destroy():await e.destroy()}async createEditor(){const{preset:t,editorId:e,contextId:a,editableHeight:i,events:s,saveDebounceMs:o,language:u,watchdog:c}=this.attrs,{customTranslations:l,type:d,license:h,config:{plugins:g,...p}}=t,C=await Pt(d),b=await(a?y.the.waitFor(a):Vt(this.el)),P=async()=>{const{loadedPlugins:w,hasPremium:A}=await Z(g);T(d)&&w.push(await zt({editorId:e,saveDebounceMs:o})),w.push(...await Promise.all([Ht({editorId:e,saveDebounceMs:o,events:s,pushEvent:this.pushEvent.bind(this),handleEvent:this.handleEvent.bind(this)}),$t()]));const k=[...await tt(u,A),et(l?.dictionary||{})].filter(v=>!X(v));let E=Y(e);T(d)&&(E=E.main||"");let f=rt(e);if(!(f instanceof HTMLElement)&&!("main"in f)){const v=d==="decoupled"?["main"]:Object.keys(E);st(f,v)||(f=await Bt(e,v),E=Y(e))}T(d)&&"main"in f&&(f=f.main);let V=O(p);V=D([...k].reverse(),u.ui,V);const j={...V,initialData:E,licenseKey:h.key,plugins:w,language:u,...k.length&&{translations:k}},q=await(async()=>!b||!(f instanceof HTMLElement)?C.create(f,j):(await Ct({context:b,element:f,creator:C,config:j})).editor)();return T(d)&&i&&xt(q,i),q};if(c&&!b){const w=await Ot(P,t.watchdog);return w.on("error",(A,{causesRestart:H})=>{if(H){const k=m.the.getItem(e);k&&(vt(k),m.the.unregister(e))}}),w.on("restart",()=>{const A=w.editor;m.the.register(e,A)}),await w.create({}),w.editor}return P()}}function st(r,t){return t.every(e=>r[e])}async function Bt(r,t){return Et(()=>{const e=rt(r);if(!st(e,t))throw new Error(`It looks like not all required root elements are present yet.
2
2
  * If you want to wait for them, ensure they are registered before editor initialization.
3
3
  * If you want lazy initialize roots, consider removing root values from the \`initialData\` config and assign initial data in editable components.
4
- Missing roots: ${t.filter(i=>!e[i]).join(", ")}.`);return e},{timeOutAfter:2e3,retryAfter:100})}const Ft=O(_t);class Wt extends x{mountedPromise=null;get attrs(){const t={editorId:this.el.getAttribute("data-cke-editor-id")||null,name:this.el.getAttribute("data-cke-ui-part-name")};return Object.defineProperty(this,"attrs",{value:t,writable:!1,configurable:!1,enumerable:!0}),t}async mounted(){const{editorId:t,name:e}=this.attrs;this.mountedPromise=p.the.execute(t,i=>{if(this.isBeingDestroyed())return;const{ui:n}=i,s=Bt(e),o=n.view[s];if(!o){console.error(`Unknown UI part name: "${e}". Supported names are "toolbar" and "menubar".`);return}this.el.appendChild(o.element)})}async destroyed(){this.el.style.display="none",await this.mountedPromise,this.mountedPromise=null,this.el.innerHTML=""}}function Bt(a){switch(a){case"toolbar":return"toolbar";case"menubar":return"menuBarView";default:return null}}const Lt=O(Wt),Kt={CKEditor5:Ft,CKEditable:Ht,CKUIPart:Lt,CKContext:Dt};exports.ContextsRegistry=w;exports.CustomEditorPluginsRegistry=D;exports.EditorsRegistry=p;exports.Hooks=Kt;exports.unwrapEditorContext=K;exports.unwrapEditorWatchdog=Z;
4
+ Missing roots: ${t.filter(a=>!e[a]).join(", ")}.`);return e},{timeOutAfter:2e3,retryAfter:100})}const Lt=N(Ft);class Wt extends S{sentinel=null;get attrs(){const t={editableId:this.el.getAttribute("id"),editorId:this.el.getAttribute("data-cke-editor-id")||null,rootName:this.el.getAttribute("data-cke-editable-root-name"),initialValue:this.el.getAttribute("data-cke-editable-initial-value")||""};return Object.defineProperty(this,"attrs",{value:t,writable:!1,configurable:!1,enumerable:!0}),t}mounted(){const{editableId:t,editorId:e,rootName:a,initialValue:i}=this.attrs,s=m.the.mountEffect(e,o=>{const u=this.el.querySelector("[data-cke-editable-content]");if(this.isBeingDestroyed())return;const c=this.el.querySelector(`#${t}_input`);if(W(o)&&!o.model.document.getRoot(a)){const{ui:d,editing:h}=o;o.addRoot(a,{isUndoable:!1,data:i});const g=d.view.createEditable(a,u);d.addEditable(g),h.view.forceRender()}this.sentinel=new it({el:this.el,editor:o,rootName:a,valueAttrName:"data-cke-editable-initial-value",rootAttrsAttrName:"data-cke-editable-root-attrs"});const l=c?Yt(c,o,a):null;return()=>{if(l?.(),this.sentinel?.destroy(),this.sentinel=null,o.state!=="destroyed"){const d=o.model.document.getRoot(a);d&&W(o)&&(o.ui.view.editables[a]&&o.detachEditable(d),d.isAttached()&&o.detachRoot(a,!1))}}});this.onBeforeDestroy(()=>{this.el.style.display="none",s()})}async updated(){this.sentinel?.updated()}}const Kt=N(Wt);function Yt(r,t,e){const a=()=>{r.value=t.getData({rootName:e})},i=I(200,a);return t.model.document.on("change:data",i),a(),()=>{t.model.document.off("change:data",i)}}class Jt extends S{get attrs(){const t={editorId:this.el.getAttribute("data-cke-editor-id")||null,name:this.el.getAttribute("data-cke-ui-part-name")};return Object.defineProperty(this,"attrs",{value:t,writable:!1,configurable:!1,enumerable:!0}),t}mounted(){const{editorId:t,name:e}=this.attrs,a=m.the.mountEffect(t,i=>{if(this.isBeingDestroyed())return;const{ui:s}=i,o=Gt(e),u=s.view[o];if(!u){console.error(`Unknown UI part name: "${e}". Supported names are "toolbar" and "menubar".`);return}return this.el.appendChild(u.element),()=>{this.el.innerHTML=""}});this.onBeforeDestroy(()=>{this.el.style.display="none",a()})}}function Gt(r){switch(r){case"toolbar":return"toolbar";case"menubar":return"menuBarView";default:return null}}const Xt=N(Jt),Qt={CKEditor5:Lt,CKEditable:Kt,CKUIPart:Xt,CKContext:Mt};exports.ContextsRegistry=y;exports.CustomEditorPluginsRegistry=R;exports.EditorsRegistry=m;exports.Hooks=Qt;exports.unwrapEditorContext=Q;exports.unwrapEditorWatchdog=nt;
5
5
  //# sourceMappingURL=index.cjs.map