ckeditor5-phoenix 1.17.2 → 1.19.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.
- package/dist/hooks/context/context.d.ts +1 -1
- package/dist/hooks/context/context.d.ts.map +1 -1
- package/dist/hooks/editable.d.ts +1 -1
- package/dist/hooks/editable.d.ts.map +1 -1
- package/dist/hooks/editor/editor.d.ts +1 -1
- package/dist/hooks/editor/editor.d.ts.map +1 -1
- package/dist/hooks/editor/plugins/sync-editor-with-phoenix.d.ts +10 -1
- package/dist/hooks/editor/plugins/sync-editor-with-phoenix.d.ts.map +1 -1
- package/dist/hooks/index.d.ts +5 -4
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/root-value-sentinel.d.ts +2 -0
- package/dist/hooks/root-value-sentinel.d.ts.map +1 -0
- package/dist/hooks/ui-part.d.ts +1 -1
- package/dist/hooks/ui-part.d.ts.map +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +460 -322
- package/dist/index.mjs.map +1 -1
- package/dist/shared/hook.d.ts +19 -5
- package/dist/shared/hook.d.ts.map +1 -1
- package/dist/shared/index.d.ts +1 -0
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/shallow-equal.d.ts +9 -0
- package/dist/shared/shallow-equal.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/hooks/context/context.test.ts +4 -4
- package/src/hooks/context/context.ts +3 -3
- package/src/hooks/context/utils/read-context-config-or-throw.test.ts +1 -1
- package/src/hooks/context/utils/read-context-config-or-throw.ts +2 -2
- package/src/hooks/editable.test.ts +18 -12
- package/src/hooks/editable.ts +18 -5
- package/src/hooks/editor/editor.test.ts +48 -2
- package/src/hooks/editor/editor.ts +10 -9
- package/src/hooks/editor/plugins/sync-editor-with-phoenix.ts +37 -10
- package/src/hooks/editor/utils/query-all-editor-editables.ts +1 -1
- package/src/hooks/editor/utils/read-preset-or-throw.test.ts +12 -12
- package/src/hooks/editor/utils/read-preset-or-throw.ts +1 -1
- package/src/hooks/index.ts +2 -0
- package/src/hooks/root-value-sentinel.test.ts +227 -0
- package/src/hooks/root-value-sentinel.ts +125 -0
- package/src/shared/hook.test.ts +32 -4
- package/src/shared/hook.ts +38 -6
- package/src/shared/index.ts +1 -0
- package/src/shared/shallow-equal.test.ts +51 -0
- package/src/shared/shallow-equal.ts +30 -0
- package/test-utils/editor/create-context-html-element.ts +3 -3
- package/test-utils/editor/create-editor-html-element.ts +16 -11
- package/test-utils/editor/create-root-value-sentinel-element.ts +23 -0
- package/test-utils/editor/index.ts +1 -0
|
@@ -6,5 +6,5 @@ export declare function getNearestContextParentPromise(el: HTMLElement): Promise
|
|
|
6
6
|
/**
|
|
7
7
|
* Phoenix LiveView hook for CKEditor 5 context elements.
|
|
8
8
|
*/
|
|
9
|
-
export declare const ContextHook: import('../../types').RequiredBy<import('phoenix_live_view').Hook<any
|
|
9
|
+
export declare const ContextHook: import('../../types').RequiredBy<import('phoenix_live_view').Hook<any>, "mounted" | "destroyed">;
|
|
10
10
|
//# sourceMappingURL=context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/hooks/context/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AA4I1D;;GAEG;AACH,wBAAsB,8BAA8B,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAQ9G;AAED;;GAEG;AACH,eAAO,MAAM,WAAW
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/hooks/context/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AA4I1D;;GAEG;AACH,wBAAsB,8BAA8B,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAQ9G;AAED;;GAEG;AACH,eAAO,MAAM,WAAW,kGAA4B,CAAC"}
|
package/dist/hooks/editable.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Phoenix LiveView hook for CKEditor 5 editable elements.
|
|
3
3
|
*/
|
|
4
|
-
export declare const EditableHook: import('../types').RequiredBy<import('phoenix_live_view').Hook<any
|
|
4
|
+
export declare const EditableHook: import('../types').RequiredBy<import('phoenix_live_view').Hook<any>, "mounted" | "destroyed">;
|
|
5
5
|
//# sourceMappingURL=editable.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editable.d.ts","sourceRoot":"","sources":["../../src/hooks/editable.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"editable.d.ts","sourceRoot":"","sources":["../../src/hooks/editable.ts"],"names":[],"mappings":"AA0GA;;GAEG;AACH,eAAO,MAAM,YAAY,+FAA6B,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Phoenix LiveView hook for CKEditor 5.
|
|
3
3
|
*/
|
|
4
|
-
export declare const EditorHook: import('../../types').RequiredBy<import('phoenix_live_view').Hook<any
|
|
4
|
+
export declare const EditorHook: import('../../types').RequiredBy<import('phoenix_live_view').Hook<any>, "mounted" | "destroyed">;
|
|
5
5
|
//# sourceMappingURL=editor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../../src/hooks/editor/editor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../../src/hooks/editor/editor.ts"],"names":[],"mappings":"AA8TA;;GAEG;AACH,eAAO,MAAM,UAAU,kGAA2B,CAAC"}
|
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
import { PluginConstructor } from 'ckeditor5';
|
|
2
2
|
import { EditorId } from '../typings';
|
|
3
3
|
/**
|
|
4
|
-
* Creates a SyncEditorWithPhoenix plugin class.
|
|
4
|
+
* Creates a SyncEditorWithPhoenix plugin class. It's not two way binding, but
|
|
5
|
+
* it allows you to push editor data to Phoenix on change, focus and blur events, and
|
|
6
|
+
* also to set editor data from Phoenix.
|
|
7
|
+
*
|
|
8
|
+
* In order to debug two-way binding, check `EditorRootValueSentinel` component, which is used
|
|
9
|
+
* to assign the value to the editor based on modification of the Elixir component's assigns.
|
|
10
|
+
*
|
|
11
|
+
* @param options The options for the plugin, including editorId, debounce time, events to listen to, and pushEvent/handleEvent functions.
|
|
12
|
+
* @returns A Promise that resolves to the SyncEditorWithPhoenix plugin constructor.
|
|
5
13
|
*/
|
|
6
14
|
export declare function createSyncEditorWithPhoenixPlugin(options: Attrs): Promise<PluginConstructor>;
|
|
7
15
|
type Attrs = {
|
|
@@ -11,6 +19,7 @@ type Attrs = {
|
|
|
11
19
|
change: boolean;
|
|
12
20
|
focus: boolean;
|
|
13
21
|
blur: boolean;
|
|
22
|
+
ready: boolean;
|
|
14
23
|
};
|
|
15
24
|
pushEvent: (event: string, payload: any) => void;
|
|
16
25
|
handleEvent: (event: string, callback: (payload: any) => void) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-editor-with-phoenix.d.ts","sourceRoot":"","sources":["../../../../src/hooks/editor/plugins/sync-editor-with-phoenix.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C
|
|
1
|
+
{"version":3,"file":"sync-editor-with-phoenix.d.ts","sourceRoot":"","sources":["../../../../src/hooks/editor/plugins/sync-editor-with-phoenix.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C;;;;;;;;;;GAUG;AACH,wBAAsB,iCAAiC,CAAC,OAAO,EAAE,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAqGlG;AAED,KAAK,KAAK,GAAG;IACX,QAAQ,EAAE,QAAQ,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE;QACN,MAAM,EAAE,OAAO,CAAC;QAChB,KAAK,EAAE,OAAO,CAAC;QACf,IAAI,EAAE,OAAO,CAAC;QACd,KAAK,EAAE,OAAO,CAAC;KAChB,CAAC;IACF,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IACjD,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,KAAK,IAAI,CAAC;CACxE,CAAC"}
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
export declare const Hooks: {
|
|
2
|
-
CKEditor5: import('../types').RequiredBy<import('phoenix_live_view').Hook<any
|
|
3
|
-
CKEditable: import('../types').RequiredBy<import('phoenix_live_view').Hook<any
|
|
4
|
-
CKUIPart: import('../types').RequiredBy<import('phoenix_live_view').Hook<any
|
|
5
|
-
CKContext: import('../types').RequiredBy<import('phoenix_live_view').Hook<any
|
|
2
|
+
CKEditor5: import('../types').RequiredBy<import('phoenix_live_view').Hook<any>, "mounted" | "destroyed">;
|
|
3
|
+
CKEditable: import('../types').RequiredBy<import('phoenix_live_view').Hook<any>, "mounted" | "destroyed">;
|
|
4
|
+
CKUIPart: import('../types').RequiredBy<import('phoenix_live_view').Hook<any>, "mounted" | "destroyed">;
|
|
5
|
+
CKContext: import('../types').RequiredBy<import('phoenix_live_view').Hook<any>, "mounted" | "destroyed">;
|
|
6
|
+
CKRootValueSentinel: import('../types').RequiredBy<import('phoenix_live_view').Hook<any>, "mounted" | "destroyed">;
|
|
6
7
|
};
|
|
7
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,KAAK;;;;;;CAMjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root-value-sentinel.d.ts","sourceRoot":"","sources":["../../src/hooks/root-value-sentinel.ts"],"names":[],"mappings":"AA4HA,eAAO,MAAM,qBAAqB,+FAA8B,CAAC"}
|
package/dist/hooks/ui-part.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Phoenix LiveView hook for CKEditor 5 UI parts.
|
|
3
3
|
*/
|
|
4
|
-
export declare const UIPartHook: import('../types').RequiredBy<import('phoenix_live_view').Hook<any
|
|
4
|
+
export declare const UIPartHook: import('../types').RequiredBy<import('phoenix_live_view').Hook<any>, "mounted" | "destroyed">;
|
|
5
5
|
//# sourceMappingURL=ui-part.d.ts.map
|
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"ui-part.d.ts","sourceRoot":"","sources":["../../src/hooks/ui-part.ts"],"names":[],"mappings":"AA0FA;;GAEG;AACH,eAAO,MAAM,UAAU,+FAA2B,CAAC"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
"use strict";var Z=Object.create;var z=Object.defineProperty;var tt=Object.getOwnPropertyDescriptor;var et=Object.getOwnPropertyNames;var rt=Object.getPrototypeOf,it=Object.prototype.hasOwnProperty;var at=(i,t,e,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of et(t))!it.call(i,n)&&n!==e&&z(i,n,{get:()=>t[n],enumerable:!(a=tt(t,n))||a.enumerable});return i};var r=(i,t,e)=>(e=i!=null?Z(rt(i)):{},at(t||!i||!i.__esModule?z(e,"default",{value:i,enumerable:!0}):e,i));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});class V{items=new Map;initializationErrors=new Map;pendingCallbacks=new Map;watchers=new Set;execute(t,e,a){const n=this.items.get(t),o=this.initializationErrors.get(t);return o?(a?.(o),Promise.reject(o)):n?Promise.resolve(e(n)):new Promise((s,l)=>{const c=this.getPendingCallbacks(t);c.success.push(async u=>{s(await e(u))}),a?c.error.push(a):c.error.push(l)})}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 a=this.pendingCallbacks.get(t);a&&(a.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 a=this.pendingCallbacks.get(t);a&&(a.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,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.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 nt(i){return i.replace(/[-_\s]+(.)?/g,(t,e)=>e?e.toUpperCase():"").replace(/^./,t=>t.toLowerCase())}function j(i,t){let e=null;return(...a)=>{e&&clearTimeout(e),e=setTimeout(()=>{t(...a)},i)}}function ot(i){if(Object.prototype.toString.call(i)!=="[object Object]")return!1;const t=Object.getPrototypeOf(i);return t===Object.prototype||t===null}function P(i){if(Array.isArray(i))return i.map(P);if(ot(i)){const t=Object.create(null);for(const[e,a]of Object.entries(i))t[nt(e)]=P(a);return t}return i}function st(i,t){const e=Object.entries(i).filter(([a,n])=>t(n,a));return Object.fromEntries(e)}function ct(){const i=document.querySelector('meta[name="csrf-token"]');if(i)return i.getAttribute("content");const t=document.cookie.match(/(?:^|; )_csrf_token=([^;]*)/);return t?decodeURIComponent(t[1]):null}class C{state="mounting";el;liveSocket;pushEvent;pushEventTo;handleEvent;isBeingDestroyed(){return this.state==="destroyed"||this.state==="destroying"}}function v(i){return{async mounted(){const t=new i;this.el.instance=t,t.el=this.el,t.liveSocket=this.liveSocket,t.pushEvent=(a,n,o)=>this.pushEvent?.(a,n,o),t.pushEventTo=(a,n,o,s)=>this.pushEventTo?.(a,n,o,s),t.handleEvent=(a,n)=>this.handleEvent?.(a,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",await t.destroyed?.(),t.state="destroyed"},disconnected(){this.el.instance.disconnected?.()},reconnected(){this.el.instance.reconnected?.()}}}function B(i){return Object.keys(i).length===0&&i.constructor===Object}function ut(i){return i==null}function D(i,t){const e=Object.entries(i).map(([a,n])=>[a,t(n,a)]);return Object.fromEntries(e)}function U(i){if(i===null)return null;const t=Number.parseInt(i,10);return Number.isNaN(t)?null:t}function lt(){return Math.random().toString(36).substring(2)}function dt(i,{timeOutAfter:t=500,retryAfter:e=100}={}){return new Promise((a,n)=>{const o=Date.now();let s=null;const l=setTimeout(()=>{n(s??new Error("Timeout"))},t),c=async()=>{try{const u=await i();clearTimeout(l),a(u)}catch(u){s=u,Date.now()-o>t?n(u):setTimeout(c,e)}};c()})}const A=Symbol.for("context-editor-watchdog");async function mt({element:i,context:t,creator:e,config:a}){const n=lt();await t.add({creator:(c,u)=>e.create(c,u),id:n,sourceElementOrData:i,type:"editor",config:a});const o=t.getItem(n),s={state:"available",editorContextId:n,context:t};o[A]=s;const l=t.destroy.bind(t);return t.destroy=async()=>(s.state="unavailable",l()),{...s,editor:o}}function F(i){return A in i?i[A]:null}function k(i){return["inline","classic","balloon","decoupled"].includes(i)}async function ht(i){const t=await import("ckeditor5"),a={inline:t.InlineEditor,balloon:t.BalloonEditor,classic:t.ClassicEditor,decoupled:t.DecoupledEditor,multiroot:t.MultiRootEditor}[i];if(!a)throw new Error(`Unsupported editor type: ${i}`);return a}class T{static the=new T;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 _(i){const t=await import("ckeditor5");let e=null;const a=i.map(async n=>{const o=await T.the.get(n);if(o)return o;const{[n]:s}=t;if(s)return s;if(!e)try{e=await import("ckeditor5-premium-features")}catch(c){console.error(`Failed to load premium package: ${c}`)}const{[n]:l}=e||{};if(l)return l;throw new Error(`Plugin "${n}" not found in base or premium packages.`)});return{loadedPlugins:await Promise.all(a),hasPremium:!!e}}async function K(i,t){const e=[i.ui,i.content];return await Promise.all([H("ckeditor5",e),t&&H("ckeditor5-premium-features",e)].filter(n=>!!n)).then(n=>n.flat())}async function H(i,t){return await Promise.all(t.filter(e=>e!=="en").map(async e=>{const a=await pt(i,e);return a?.default??a}).filter(Boolean))}async function pt(i,t){try{if(i==="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 ${i}/${t}:`,e),null}}function L(i){return D(i,t=>({dictionary:t}))}function G(i){const t=Y(i);return D(t,({content:e})=>e)}function N(i){const t=Y(i),e=D(t,({initialValue:a})=>a);return st(e,a=>typeof a=="string")}function Y(i){const t=document.querySelectorAll([`[data-cke-editor-id="${i}"][data-cke-editable-root-name]`,"[data-cke-editable-root-name]:not([data-cke-editor-id])"].join(", ")),e=Array.from(t).reduce((l,c)=>{const u=c.getAttribute("data-cke-editable-root-name"),d=c.getAttribute("data-cke-editable-initial-value")||"",p=c.querySelector("[data-cke-editable-content]");return!u||!p?l:{...l,[u]:{content:p,initialValue:d}}},Object.create({})),a=document.querySelector(`[phx-hook="CKEditor5"][id="${i}"]`);if(!a)return e;const n=a.getAttribute("cke-initial-value")||"",o=a.querySelector(`#${i}_editor `),s=e.main;return s?{...e,main:{...s,initialValue:s.initialValue||n}}:o?{...e,main:{content:o,initialValue:n}}:e}const W=["inline","classic","balloon","decoupled","multiroot"];function wt(i){const t=i.getAttribute("cke-preset");if(!t)throw new Error('CKEditor5 hook requires a "cke-preset" attribute on the element.');const{type:e,config:a,license:n,...o}=JSON.parse(t);if(!e||!a||!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:P(a),customTranslations:o.customTranslations||o.custom_translations}}function O(i){if(!i||typeof i!="object")return i;if(Array.isArray(i))return i.map(a=>O(a));const t=i;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,n]of Object.entries(i))e[a]=O(n);return e}function ft(i,t){const{editing:e}=i;e.view.change(a=>{a.setStyle("height",`${t}px`,e.view.document.getRoot())})}const S=Symbol.for("elixir-editor-watchdog");async function gt(i){const{EditorWatchdog:t}=await import("ckeditor5"),e=new t(i);return e.setCreator(async(...a)=>{const n=await i.create(...a);return n[S]=e,n}),{watchdog:e,Constructor:{create:async(...a)=>(await e.create(...a),e.editor)}}}function J(i){return S in i?i[S]:null}class f extends V{static the=new f}function yt(i){const t=i.getAttribute("cke-context");if(!t)throw new Error('CKEditor5 hook requires a "cke-context" attribute on the element.');const{config:e,...a}=JSON.parse(t);return{config:P(e),customTranslations:a.customTranslations||a.custom_translations,watchdogConfig:a.watchdogConfig||a.watchdog_config}}class bt extends C{contextPromise=null;get attrs(){const t=a=>this.el.getAttribute(a)||null,e={id:this.el.id,config:yt(this.el),language:{ui:t("cke-language")||"en",content:t("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:n,config:{plugins:o,...s}}=this.attrs.config,{loadedPlugins:l,hasPremium:c}=await _(o??[]),d=[...await K(e,c),L(a?.dictionary||{})].filter(g=>!B(g));this.contextPromise=(async()=>{const{ContextWatchdog:g,Context:x}=await import("ckeditor5"),w=new g(x,{crashNumberLimit:10,...n});return await w.create({...s,language:e,plugins:l,...d.length&&{translations:d}}),w.on("itemError",(...y)=>{console.error("Context item error:",...y)}),w})();const p=await this.contextPromise;this.isBeingDestroyed()||f.the.register(t,p)}async destroyed(){const{id:t}=this.attrs;this.el.style.display="none";try{await(await this.contextPromise)?.destroy()}finally{this.contextPromise=null,f.the.hasItem(t)&&f.the.unregister(t)}}}function Et(i){return i.hasAttribute("cke-context")}function kt(i){let t=i;for(;t;){if(Et(t))return t;t=t.parentElement}return null}async function Pt(i){const t=kt(i);return t?f.the.waitFor(t.id):null}const Ct=v(bt);class h extends V{static the=new h}class vt extends C{editorPromise=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:a,initialValue:n}=this.attrs,o=this.el.querySelector(`#${t}_input`);this.editorPromise=h.the.execute(e,s=>{if(this.isBeingDestroyed())return null;const{ui:l,editing:c,model:u}=s;if(u.document.getRoot(a))return s;s.addRoot(a,{isUndoable:!1,data:n});const d=this.el.querySelector("[data-cke-editable-content]"),p=l.view.createEditable(a,d);return l.addEditable(p),c.view.forceRender(),o&&xt(o,s,a),s})}async destroyed(){const{rootName:t}=this.attrs;this.el.style.display="none";const e=await this.editorPromise;if(this.editorPromise=null,e&&e.state!=="destroyed"){const a=e.model.document.getRoot(t);a&&"detachEditable"in e&&(e.detachEditable(a),e.detachRoot(t,!1))}}}const Tt=v(vt);function xt(i,t,e){const a=()=>{i.value=t.getData({rootName:e})};t.model.document.on("change:data",j(100,a)),a()}async function It(){const{Plugin:i,FileRepository:t}=await import("ckeditor5");return class extends i{static get pluginName(){return"PhoenixUploadAdapter"}static get requires(){return[t]}init(){const{editor:a}=this,{plugins:n,config:o}=a,s=o.get("phoenixUpload.url");if(!s||n.has("SimpleUploadAdapter")||n.has("Base64UploadAdapter")||n.has("CKFinderUploadAdapter"))return;const l=n.get(t);l.createUploadAdapter=c=>new At(c,s)}}}class At{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={},n=ct();n&&(a["X-CSRF-Token"]=n);try{const o=await fetch(this.uploadUrl,{method:"POST",headers:a,body:e,signal:this.abortController.signal});if(!o.ok){let l="Couldn't upload file!";try{const c=await o.json();c?.error?.message&&(l=c.error.message)}catch{}throw new Error(l)}return this.loader.uploaded=this.loader.uploadTotal,{default:(await o.json()).url}}catch(o){throw o.name==="AbortError"?o:o.message||"Couldn't upload file!"}}abort(){this.abortController?.abort(),this.abortController=null}}async function Ot({editorId:i,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(`${i}_input`),this.input&&(n.model.document.on("change:data",j(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}}}async function St(i){const{Plugin:t}=await import("ckeditor5"),{editorId:e,saveDebounceMs:a,events:n,pushEvent:o,handleEvent:s}=i;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"),s("ckeditor5:set-data",({editorId:u,data:d})=>{(ut(u)||u===e)&&c.setData(d)})}setupTypingContentPush(){const{editor:c}=this,u=()=>{o("ckeditor5:change",{editorId:e,data:q(this.editor)})};c.model.document.on("change:data",j(a,u)),c.once("ready",u)}setupEventPush(c){const{editor:u}=this,d=()=>{const{isFocused:p}=u.ui.focusTracker;(p?"focus":"blur")===c&&o(`ckeditor5:${c}`,{editorId:e,data:q(u)})};u.ui.focusTracker.on("change:isFocused",d)}}}function q(i){return i.model.document.getRootNames().reduce((e,a)=>(e[a]=i.getData({rootName:a}),e),Object.create({}))}class jt extends C{editorPromise=null;get attrs(){const{el:t}=this,e=t.getAttribute.bind(t),a=t.hasAttribute.bind(t),n={editorId:e("id"),contextId:e("cke-context-id"),preset:wt(t),editableHeight:U(e("cke-editable-height")),watchdog:a("cke-watchdog"),events:{change:a("cke-change-event"),blur:a("cke-blur-event"),focus:a("cke-focus-event")},saveDebounceMs:U(e("cke-save-debounce-ms"))??400,language:{ui:e("cke-language")||"en",content:e("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;h.the.resetErrors(t);try{this.editorPromise=this.createEditor();const e=await this.editorPromise;this.isBeingDestroyed()||(h.the.register(t,e),e.once("destroy",()=>{h.the.hasItem(t)&&h.the.unregister(t)}))}catch(e){this.editorPromise=null,h.the.error(t,e)}return this}async destroyed(){this.el.style.display="none";try{const t=await this.editorPromise;if(!t)return;const e=F(t),a=J(t);e?e.state!=="unavailable"&&await e.context.remove(e.editorContextId):a?await a.destroy():await t.destroy()}finally{this.editorPromise=null}}async createEditor(){const{preset:t,editorId:e,contextId:a,editableHeight:n,events:o,saveDebounceMs:s,language:l,watchdog:c}=this.attrs,{customTranslations:u,type:d,license:p,config:{plugins:g,...x}}=t;let w=await ht(d);const y=await(a?f.the.waitFor(a):Pt(this.el));if(c&&!y){const m=await gt(w);({Constructor:w}=m),m.watchdog.on("restart",()=>{const E=m.watchdog.editor;this.editorPromise=Promise.resolve(E),h.the.register(e,E)})}const{loadedPlugins:I,hasPremium:Q}=await _(g);k(d)&&I.push(await Ot({editorId:e,saveDebounceMs:s})),I.push(...await Promise.all([St({editorId:e,saveDebounceMs:s,events:o,pushEvent:this.pushEvent.bind(this),handleEvent:this.handleEvent.bind(this)}),It()]));const $=[...await K(l,Q),L(u?.dictionary||{})].filter(m=>!B(m));let b=N(e);k(d)&&(b=b.main||"");const M=await(async()=>{let m=G(e);if(!(m instanceof HTMLElement)&&!("main"in m)){const R=d==="decoupled"?["main"]:Object.keys(b);X(m,R)||(m=await Dt(e,R),b=N(e))}k(d)&&"main"in m&&(m=m.main);const E={...O(x),initialData:b,licenseKey:p.key,plugins:I,language:l,...$.length&&{translations:$}};return!y||!(m instanceof HTMLElement)?w.create(m,E):(await mt({context:y,element:m,creator:w,config:E})).editor})();return k(d)&&n&&ft(M,n),M}}function X(i,t){return t.every(e=>i[e])}async function Dt(i,t){return dt(()=>{const e=G(i);if(!X(e,t))throw new Error(`It looks like not all required root elements are present yet.
|
|
1
|
+
"use strict";var Z=Object.create;var H=Object.defineProperty;var tt=Object.getOwnPropertyDescriptor;var et=Object.getOwnPropertyNames;var rt=Object.getPrototypeOf,at=Object.prototype.hasOwnProperty;var it=(i,t,e,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of et(t))!at.call(i,n)&&n!==e&&H(i,n,{get:()=>t[n],enumerable:!(a=tt(t,n))||a.enumerable});return i};var r=(i,t,e)=>(e=i!=null?Z(rt(i)):{},it(t||!i||!i.__esModule?H(e,"default",{value:i,enumerable:!0}):e,i));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});class _{items=new Map;initializationErrors=new Map;pendingCallbacks=new Map;watchers=new Set;execute(t,e,a){const n=this.items.get(t),o=this.initializationErrors.get(t);return o?(a?.(o),Promise.reject(o)):n?Promise.resolve(e(n)):new Promise((s,l)=>{const c=this.getPendingCallbacks(t);c.success.push(async u=>{s(await e(u))}),a?c.error.push(a):c.error.push(l)})}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 a=this.pendingCallbacks.get(t);a&&(a.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 a=this.pendingCallbacks.get(t);a&&(a.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,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.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 nt(i){return i.replace(/[-_\s]+(.)?/g,(t,e)=>e?e.toUpperCase():"").replace(/^./,t=>t.toLowerCase())}function V(i,t){let e=null;return(...a)=>{e&&clearTimeout(e),e=setTimeout(()=>{t(...a)},i)}}function ot(i){if(Object.prototype.toString.call(i)!=="[object Object]")return!1;const t=Object.getPrototypeOf(i);return t===Object.prototype||t===null}function v(i){if(Array.isArray(i))return i.map(v);if(ot(i)){const t=Object.create(null);for(const[e,a]of Object.entries(i))t[nt(e)]=v(a);return t}return i}function st(i,t){const e=Object.entries(i).filter(([a,n])=>t(n,a));return Object.fromEntries(e)}function ct(){const i=document.querySelector('meta[name="csrf-token"]');if(i)return i.getAttribute("content");const t=document.cookie.match(/(?:^|; )_csrf_token=([^;]*)/);return t?decodeURIComponent(t[1]):null}class E{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 P(i){return{async mounted(){const t=new i;this.el.instance=t,t.el=this.el,t.pushEvent=(a,n,o)=>this.pushEvent?.(a,n,o),t.pushEventTo=(a,n,o,s)=>this.pushEventTo?.(a,n,o,s),t.handleEvent=(a,n)=>this.handleEvent?.(a,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(){this.el.instance.updated?.()}}}function q(i){return Object.keys(i).length===0&&i.constructor===Object}function ut(i){return i==null}function R(i,t){const e=Object.entries(i).map(([a,n])=>[a,t(n,a)]);return Object.fromEntries(e)}function z(i){if(i===null)return null;const t=Number.parseInt(i,10);return Number.isNaN(t)?null:t}function lt(i,t){if(i===t)return!0;const e=Object.keys(i),a=Object.keys(t);if(e.length!==a.length)return!1;for(const n of e)if(i[n]!==t[n]||!Object.prototype.hasOwnProperty.call(t,n))return!1;return!0}function dt(){return Math.random().toString(36).substring(2)}function mt(i,{timeOutAfter:t=500,retryAfter:e=100}={}){return new Promise((a,n)=>{const o=Date.now();let s=null;const l=setTimeout(()=>{n(s??new Error("Timeout"))},t),c=async()=>{try{const u=await i();clearTimeout(l),a(u)}catch(u){s=u,Date.now()-o>t?n(u):setTimeout(c,e)}};c()})}const O=Symbol.for("context-editor-watchdog");async function ht({element:i,context:t,creator:e,config:a}){const n=dt();await t.add({creator:(c,u)=>e.create(c,u),id:n,sourceElementOrData:i,type:"editor",config:a});const o=t.getItem(n),s={state:"available",editorContextId:n,context:t};o[O]=s;const l=t.destroy.bind(t);return t.destroy=async()=>(s.state="unavailable",l()),{...s,editor:o}}function F(i){return O in i?i[O]:null}function C(i){return["inline","classic","balloon","decoupled"].includes(i)}async function pt(i){const t=await import("ckeditor5"),a={inline:t.InlineEditor,balloon:t.BalloonEditor,classic:t.ClassicEditor,decoupled:t.DecoupledEditor,multiroot:t.MultiRootEditor}[i];if(!a)throw new Error(`Unsupported editor type: ${i}`);return a}class T{static the=new T;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 B(i){const t=await import("ckeditor5");let e=null;const a=i.map(async n=>{const o=await T.the.get(n);if(o)return o;const{[n]:s}=t;if(s)return s;if(!e)try{e=await import("ckeditor5-premium-features")}catch(c){console.error(`Failed to load premium package: ${c}`)}const{[n]:l}=e||{};if(l)return l;throw new Error(`Plugin "${n}" not found in base or premium packages.`)});return{loadedPlugins:await Promise.all(a),hasPremium:!!e}}async function K(i,t){const e=[i.ui,i.content];return await Promise.all([U("ckeditor5",e),t&&U("ckeditor5-premium-features",e)].filter(n=>!!n)).then(n=>n.flat())}async function U(i,t){return await Promise.all(t.filter(e=>e!=="en").map(async e=>{const a=await wt(i,e);return a?.default??a}).filter(Boolean))}async function wt(i,t){try{if(i==="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 ${i}/${t}:`,e),null}}function L(i){return R(i,t=>({dictionary:t}))}function G(i){const t=Y(i);return R(t,({content:e})=>e)}function N(i){const t=Y(i),e=R(t,({initialValue:a})=>a);return st(e,a=>typeof a=="string")}function Y(i){const t=document.querySelectorAll([`[data-cke-editor-id="${i}"][data-cke-editable-root-name]`,"[data-cke-editable-root-name]:not([data-cke-editor-id])"].join(", ")),e=Array.from(t).reduce((l,c)=>{const u=c.getAttribute("data-cke-editable-root-name"),d=c.getAttribute("data-cke-editable-initial-value")||"",h=c.querySelector("[data-cke-editable-content]");return!u||!h?l:{...l,[u]:{content:h,initialValue:d}}},Object.create({})),a=document.querySelector(`[phx-hook="CKEditor5"][id="${i}"]`);if(!a)return e;const n=a.getAttribute("data-cke-initial-value")||"",o=a.querySelector(`#${i}_editor `),s=e.main;return s?{...e,main:{...s,initialValue:s.initialValue||n}}:o?{...e,main:{content:o,initialValue:n}}:e}const W=["inline","classic","balloon","decoupled","multiroot"];function ft(i){const t=i.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:n,...o}=JSON.parse(t);if(!e||!a||!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:v(a),customTranslations:o.customTranslations||o.custom_translations}}function D(i){if(!i||typeof i!="object")return i;if(Array.isArray(i))return i.map(a=>D(a));const t=i;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,n]of Object.entries(i))e[a]=D(n);return e}function gt(i,t){const{editing:e}=i;e.view.change(a=>{a.setStyle("height",`${t}px`,e.view.document.getRoot())})}const S=Symbol.for("elixir-editor-watchdog");async function yt(i){const{EditorWatchdog:t}=await import("ckeditor5"),e=new t(i);return e.setCreator(async(...a)=>{const n=await i.create(...a);return n[S]=e,n}),{watchdog:e,Constructor:{create:async(...a)=>(await e.create(...a),e.editor)}}}function J(i){return S in i?i[S]:null}class g extends _{static the=new g}function bt(i){const t=i.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:v(e),customTranslations:a.customTranslations||a.custom_translations,watchdogConfig:a.watchdogConfig||a.watchdog_config}}class kt extends E{contextPromise=null;get attrs(){const t=a=>this.el.getAttribute(a)||null,e={id:this.el.id,config:bt(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:n,config:{plugins:o,...s}}=this.attrs.config,{loadedPlugins:l,hasPremium:c}=await B(o??[]),d=[...await K(e,c),L(a?.dictionary||{})].filter(p=>!q(p));this.contextPromise=(async()=>{const{ContextWatchdog:p,Context:x}=await import("ckeditor5"),f=new p(x,{crashNumberLimit:10,...n});return await f.create({...s,language:e,plugins:l,...d.length&&{translations:d}}),f.on("itemError",(...y)=>{console.error("Context item error:",...y)}),f})();const h=await this.contextPromise;this.isBeingDestroyed()||g.the.register(t,h)}async destroyed(){const{id:t}=this.attrs;this.el.style.display="none";try{await(await this.contextPromise)?.destroy()}finally{this.contextPromise=null,g.the.hasItem(t)&&g.the.unregister(t)}}}function Et(i){return i.hasAttribute("data-cke-context")}function Pt(i){let t=i;for(;t;){if(Et(t))return t;t=t.parentElement}return null}async function Ct(i){const t=Pt(i);return t?g.the.waitFor(t.id):null}const vt=P(kt);class w extends _{static the=new w}class Tt extends E{editorPromise=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:a,initialValue:n}=this.attrs,o=this.el.querySelector(`#${t}_input`);this.editorPromise=w.the.execute(e,s=>{if(this.isBeingDestroyed())return null;const{ui:l,editing:c,model:u}=s;if(u.document.getRoot(a))return s;s.addRoot(a,{isUndoable:!1,data:n});const d=this.el.querySelector("[data-cke-editable-content]"),h=l.view.createEditable(a,d);if(l.addEditable(h),c.view.forceRender(),o){const p=It(o,s,a);this.onBeforeDestroy(p)}return s})}async destroyed(){const{rootName:t}=this.attrs;this.el.style.display="none";const e=await this.editorPromise;if(this.editorPromise=null,e&&e.state!=="destroyed"){const a=e.model.document.getRoot(t);a&&"detachEditable"in e&&(e.ui.view.editables[t]&&e.detachEditable(a),a.isAttached()&&e.detachRoot(t,!1))}}}const xt=P(Tt);function It(i,t,e){const a=()=>{i.value=t.getData({rootName:e})},n=V(200,a);return t.model.document.on("change:data",n),a(),()=>{t.model.document.off("change:data",n)}}async function At(){const{Plugin:i,FileRepository:t}=await import("ckeditor5");return class extends i{static get pluginName(){return"PhoenixUploadAdapter"}static get requires(){return[t]}init(){const{editor:a}=this,{plugins:n,config:o}=a,s=o.get("phoenixUpload.url");if(!s||n.has("SimpleUploadAdapter")||n.has("Base64UploadAdapter")||n.has("CKFinderUploadAdapter"))return;const l=n.get(t);l.createUploadAdapter=c=>new Ot(c,s)}}}class Ot{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={},n=ct();n&&(a["X-CSRF-Token"]=n);try{const o=await fetch(this.uploadUrl,{method:"POST",headers:a,body:e,signal:this.abortController.signal});if(!o.ok){let l="Couldn't upload file!";try{const c=await o.json();c?.error?.message&&(l=c.error.message)}catch{}throw new Error(l)}return this.loader.uploaded=this.loader.uploadTotal,{default:(await o.json()).url}}catch(o){throw o.name==="AbortError"?o:o.message||"Couldn't upload file!"}}abort(){this.abortController?.abort(),this.abortController=null}}async function Dt({editorId:i,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(`${i}_input`),this.input&&(n.model.document.on("change:data",V(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}}}async function St(i){const{Plugin:t}=await import("ckeditor5"),{editorId:e,saveDebounceMs:a,events:n,pushEvent:o,handleEvent:s}=i;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",()=>{o("ckeditor5:ready",{editorId:e,data:A(c)})}),s("ckeditor5:set-data",({editorId:u,data:d})=>{(ut(u)||u===e)&&c.setData(d)})}setupTypingContentPush(){const{editor:c}=this;let u=null;const d=()=>{const p=A(c);(!u||!lt(u,p))&&(o("ckeditor5:change",{editorId:e,data:p}),u=p)},h=V(a,d);c.model.document.on("change:data",h),c.once("ready",d)}setupEventPush(c){const{editor:u}=this,d=()=>{const{isFocused:h}=u.ui.focusTracker;(h?"focus":"blur")===c&&o(`ckeditor5:${c}`,{editorId:e,data:A(u)})};u.ui.focusTracker.on("change:isFocused",d)}}}function A(i){return i.model.document.getRootNames().reduce((e,a)=>(e[a]=i.getData({rootName:a}),e),Object.create({}))}class Vt extends E{editorPromise=null;get attrs(){const{el:t}=this,e=t.getAttribute.bind(t),a=t.hasAttribute.bind(t),n={editorId:e("id"),contextId:e("data-cke-context-id"),preset:ft(t),editableHeight:z(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:z(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;w.the.resetErrors(t);try{this.editorPromise=this.createEditor();const e=await this.editorPromise;this.isBeingDestroyed()||(w.the.register(t,e),e.once("destroy",()=>{w.the.hasItem(t)&&w.the.unregister(t)}))}catch(e){this.editorPromise=null,w.the.error(t,e)}return this}async destroyed(){this.el.style.display="none";try{const t=await this.editorPromise;if(!t)return;const e=F(t),a=J(t);e?e.state!=="unavailable"&&await e.context.remove(e.editorContextId):a?await a.destroy():await t.destroy()}finally{this.editorPromise=null}}async createEditor(){const{preset:t,editorId:e,contextId:a,editableHeight:n,events:o,saveDebounceMs:s,language:l,watchdog:c}=this.attrs,{customTranslations:u,type:d,license:h,config:{plugins:p,...x}}=t;let f=await pt(d);const y=await(a?g.the.waitFor(a):Ct(this.el));if(c&&!y){const m=await yt(f);({Constructor:f}=m),m.watchdog.on("restart",()=>{const k=m.watchdog.editor;this.editorPromise=Promise.resolve(k),w.the.register(e,k)})}const{loadedPlugins:I,hasPremium:Q}=await B(p);C(d)&&I.push(await Dt({editorId:e,saveDebounceMs:s})),I.push(...await Promise.all([St({editorId:e,saveDebounceMs:s,events:o,pushEvent:this.pushEvent.bind(this),handleEvent:this.handleEvent.bind(this)}),At()]));const j=[...await K(l,Q),L(u?.dictionary||{})].filter(m=>!q(m));let b=N(e);C(d)&&(b=b.main||"");const $=await(async()=>{let m=G(e);if(!(m instanceof HTMLElement)&&!("main"in m)){const M=d==="decoupled"?["main"]:Object.keys(b);X(m,M)||(m=await Rt(e,M),b=N(e))}C(d)&&"main"in m&&(m=m.main);const k={...D(x),initialData:b,licenseKey:h.key,plugins:I,language:l,...j.length&&{translations:j}};return!y||!(m instanceof HTMLElement)?f.create(m,k):(await ht({context:y,element:m,creator:f,config:k})).editor})();return C(d)&&n&>($,n),$}}function X(i,t){return t.every(e=>i[e])}async function Rt(i,t){return mt(()=>{const e=G(i);if(!X(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(a=>!e[a]).join(", ")}.`);return e},{timeOutAfter:2e3,retryAfter:100})}const $t=
|
|
4
|
+
Missing roots: ${t.filter(a=>!e[a]).join(", ")}.`);return e},{timeOutAfter:2e3,retryAfter:100})}const jt=P(Vt);class $t extends E{editorPromise=null;pendingValue=null;previousValue=null;get attrs(){return{editorId:this.el.getAttribute("data-cke-editor-id"),rootName:this.el.getAttribute("data-cke-root-name"),value:this.el.getAttribute("data-cke-value")}}async mounted(){const{editorId:t,value:e,rootName:a}=this.attrs;this.previousValue=e,this.editorPromise=w.the.execute(t,n=>this.isBeingDestroyed()?null:(this.setupSyncHandlers(n,a),n))}async updated(){const{rootName:t,value:e}=this.attrs;if(e===this.previousValue)return;this.previousValue=e;const a=await this.editorPromise;!a||a.state==="destroyed"||(a.ui.focusTracker.isFocused?this.pendingValue=e:this.setRootValue(a,t,e))}setupSyncHandlers(t,e){const a=()=>{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",a),t.ui.focusTracker.on("change:isFocused",n),this.onBeforeDestroy(()=>{t.model.document.off("change:data",a),t.ui.focusTracker.off("change:isFocused",n)})}setRootValue(t,e,a){t.getData({rootName:e})!==a&&t.setData({[e]:a})}}const Mt=P($t);class Ht extends E{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=w.the.execute(t,a=>{if(this.isBeingDestroyed())return;const{ui:n}=a,o=zt(e),s=n.view[o];if(!s){console.error(`Unknown UI part name: "${e}". Supported names are "toolbar" and "menubar".`);return}this.el.appendChild(s.element)})}async destroyed(){this.el.style.display="none",await this.mountedPromise,this.mountedPromise=null,this.el.innerHTML=""}}function zt(i){switch(i){case"toolbar":return"toolbar";case"menubar":return"menuBarView";default:return null}}const Ut=P(Ht),Nt={CKEditor5:jt,CKEditable:xt,CKUIPart:Ut,CKContext:vt,CKRootValueSentinel:Mt};exports.ContextsRegistry=g;exports.CustomEditorPluginsRegistry=T;exports.EditorsRegistry=w;exports.Hooks=Nt;exports.unwrapEditorContext=F;exports.unwrapEditorWatchdog=J;
|
|
5
5
|
//# sourceMappingURL=index.cjs.map
|