ckeditor5-phoenix 1.26.0 → 1.27.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/editor/editor.d.ts.map +1 -1
- package/dist/hooks/editor/types/editor-relaxed-constructor.type.d.ts +6 -0
- package/dist/hooks/editor/types/editor-relaxed-constructor.type.d.ts.map +1 -0
- package/dist/hooks/editor/types/index.d.ts +2 -0
- package/dist/hooks/editor/types/index.d.ts.map +1 -0
- package/dist/hooks/editor/utils/assign-initial-data-to-editor-config.d.ts +10 -0
- package/dist/hooks/editor/utils/assign-initial-data-to-editor-config.d.ts.map +1 -0
- package/dist/hooks/editor/utils/assign-source-elements-to-editor-config.d.ts +12 -0
- package/dist/hooks/editor/utils/assign-source-elements-to-editor-config.d.ts.map +1 -0
- package/dist/hooks/editor/utils/create-editor-in-context.d.ts +1 -3
- package/dist/hooks/editor/utils/create-editor-in-context.d.ts.map +1 -1
- package/dist/hooks/editor/utils/index.d.ts +2 -0
- package/dist/hooks/editor/utils/index.d.ts.map +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +346 -296
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/hooks/editable.ts +1 -1
- package/src/hooks/editor/editor.ts +9 -6
- package/src/hooks/editor/types/editor-relaxed-constructor.type.ts +6 -0
- package/src/hooks/editor/types/index.ts +1 -0
- package/src/hooks/editor/utils/assign-initial-data-to-editor-config.ts +47 -0
- package/src/hooks/editor/utils/assign-source-elements-to-editor-config.ts +60 -0
- package/src/hooks/editor/utils/create-editor-in-context.ts +2 -5
- package/src/hooks/editor/utils/index.ts +2 -0
|
@@ -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":"AA+XA;;GAEG;AACH,eAAO,MAAM,UAAU,+GAA2B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor-relaxed-constructor.type.d.ts","sourceRoot":"","sources":["../../../../src/hooks/editor/types/editor-relaxed-constructor.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,MAAM,wBAAwB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,IAAI;IACtE,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/hooks/editor/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,mCAAmC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { EditorConfig } from 'ckeditor5';
|
|
2
|
+
/**
|
|
3
|
+
* Assigns initial data to specified editor config.
|
|
4
|
+
*
|
|
5
|
+
* @param dataOrMap Initial data to be assigned to config.
|
|
6
|
+
* @param config Config of the editor.
|
|
7
|
+
* @returns The updated configuration object.
|
|
8
|
+
*/
|
|
9
|
+
export declare function assignInitialDataToEditorConfig<C extends EditorConfig>(dataOrMap: string | Record<string, string>, config: C): C;
|
|
10
|
+
//# sourceMappingURL=assign-initial-data-to-editor-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assign-initial-data-to-editor-config.d.ts","sourceRoot":"","sources":["../../../../src/hooks/editor/utils/assign-initial-data-to-editor-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAAC,CAAC,SAAS,YAAY,EACpE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1C,MAAM,EAAE,CAAC,GACR,CAAC,CA8BH"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { EditorConfig } from 'ckeditor5';
|
|
2
|
+
import { EditorRelaxedConstructor } from '../types/editor-relaxed-constructor.type';
|
|
3
|
+
/**
|
|
4
|
+
* Assigns a DOM element to the editor configuration in a way that is compatible with the specific editor type.
|
|
5
|
+
*
|
|
6
|
+
* @param Editor Constructor of the editor used to determine the location of element config entry.
|
|
7
|
+
* @param elementOrMap Element to be assigned to config.
|
|
8
|
+
* @param config Config of the editor.
|
|
9
|
+
* @returns The updated configuration object.
|
|
10
|
+
*/
|
|
11
|
+
export declare function assignSourceElementsToEditorConfig<C extends EditorConfig>(Editor: EditorRelaxedConstructor, elementOrMap: HTMLElement | Record<string, HTMLElement>, config: C): C;
|
|
12
|
+
//# sourceMappingURL=assign-source-elements-to-editor-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assign-source-elements-to-editor-config.d.ts","sourceRoot":"","sources":["../../../../src/hooks/editor/utils/assign-source-elements-to-editor-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AAEzF;;;;;;;GAOG;AACH,wBAAgB,kCAAkC,CAAC,CAAC,SAAS,YAAY,EACvE,MAAM,EAAE,wBAAwB,EAChC,YAAY,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EACvD,MAAM,EAAE,CAAC,GACR,CAAC,CAuCH"}
|
|
@@ -3,13 +3,12 @@ import { Context, ContextWatchdog, Editor, EditorConfig } from 'ckeditor5';
|
|
|
3
3
|
* Creates a CKEditor 5 editor instance within a given context watchdog.
|
|
4
4
|
*
|
|
5
5
|
* @param params Parameters for editor creation.
|
|
6
|
-
* @param params.element The DOM element or data for the editor.
|
|
7
6
|
* @param params.context The context watchdog instance.
|
|
8
7
|
* @param params.creator The editor creator utility.
|
|
9
8
|
* @param params.config The editor configuration object.
|
|
10
9
|
* @returns The created editor instance.
|
|
11
10
|
*/
|
|
12
|
-
export declare function createEditorInContext({
|
|
11
|
+
export declare function createEditorInContext({ context, creator, config }: Attrs): Promise<{
|
|
13
12
|
editor: Editor;
|
|
14
13
|
state: "available" | "unavailable";
|
|
15
14
|
editorContextId: string;
|
|
@@ -28,7 +27,6 @@ export declare function unwrapEditorContext(editor: Editor): EditorContextDescri
|
|
|
28
27
|
type Attrs = {
|
|
29
28
|
context: ContextWatchdog<Context>;
|
|
30
29
|
creator: EditorCreator;
|
|
31
|
-
element: HTMLElement;
|
|
32
30
|
config: EditorConfig;
|
|
33
31
|
};
|
|
34
32
|
/**
|
|
@@ -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;AAUhF
|
|
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;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK;;WA8DtE,WAAW,GAAG,aAAa;qBACjB,MAAM;aACd,eAAe,CAAC,OAAO,CAAC;GA/BlC;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,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 +1 @@
|
|
|
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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/hooks/editor/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,wCAAwC,CAAC;AACvD,cAAc,2CAA2C,CAAC;AAC1D,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"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
"use strict";var ot=Object.create;var B=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&&B(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?B(e,"default",{value:r,enumerable:!0}):e,r));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function F(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(){F(this.lastNotifiedItems,this.items)&&F(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=nt(r);return z(t,({content:e})=>e)}function Y(r){const t=nt(r),e=z(t,({initialValue:a})=>a);return ft(e,a=>typeof a=="string")}function nt(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 at(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 Bt 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(async()=>{m.the.unregister(t),a();const i=Q(e),s=at(e);i?i.state!=="unavailable"&&await i.context.remove(i.editorContextId):s?await s.destroy():await e.destroy()}),m.the.register(t,e)}catch(e){console.error(e),m.the.error(t,e)}return this}async updated(){this.sentinel?.updated()}async destroyed(){this.el.style.display="none"}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 Ft(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 Ft(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.
|
|
1
|
+
"use strict";var ot=Object.create;var B=Object.defineProperty;var ct=Object.getOwnPropertyDescriptor;var ut=Object.getOwnPropertyNames;var lt=Object.getPrototypeOf,dt=Object.prototype.hasOwnProperty;var ht=(r,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of ut(t))!dt.call(r,i)&&i!==e&&B(r,i,{get:()=>t[i],enumerable:!(n=ct(t,i))||n.enumerable});return r};var a=(r,t,e)=>(e=r!=null?ot(lt(r)):{},ht(t||!r||!r.__esModule?B(e,"default",{value:r,enumerable:!0}):e,r));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function F(r,t){if(!r||r.size!==t.size)return!1;for(const[e,n]of r)if(!t.has(e)||t.get(e)!==n)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,n){const i=this.items.get(t),s=this.initializationErrors.get(t);return s?(n?.(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))}),n?c.error.push(n):c.error.push(u)})}mountEffect(t,e){let n,i,s=!1;const o=this.watch(u=>{const c=u.get(t);if(c!==i&&(n?.(),n=void 0,i=c,!!c))try{const l=e(c);s?(l?.(),o()):n=l}catch(l){throw console.error(l),l}});return()=>{s=!0,i&&(o(),n?.(),n=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 n=this.pendingCallbacks.get(t);n&&(n.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 n=this.pendingCallbacks.get(t);n&&(n.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,n)=>{this.execute(t,e,n)})}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(){F(this.lastNotifiedItems,this.items)&&F(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 O(r,t){let e=null;return(...n)=>{e&&clearTimeout(e),e=setTimeout(()=>{t(...n)},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,n]of Object.entries(r))t[mt(e)]=x(n);return t}return r}function ft(r,t){const e=Object.entries(r).filter(([n,i])=>t(i,n));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 N{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 R(r){return{async mounted(){const t=new r;this.el.instance=t,t.el=this.el,t.pushEvent=(n,i,s)=>this.pushEvent?.(n,i,s),t.pushEventTo=(n,i,s,o)=>this.pushEventTo?.(n,i,s,o),t.handleEvent=(n,i)=>this.handleEvent?.(n,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 _(r,t){const e=Object.entries(r).map(([n,i])=>[n,t(i,n)]);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 bt(r){return r==null||r.trim()===""?null:JSON.parse(r)}function yt(r,t){if(r===t)return!0;const e=Object.keys(r),n=Object.keys(t);if(e.length!==n.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((n,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),n(l)}catch(l){o=l,Date.now()-s>t?i(l):setTimeout(c,e)}};c()})}function vt(r,t){const e=Ct(r),n=new Set([...Object.keys(e),...Object.keys(t.roots??{})]),i=Array.from(n).reduce((o,u)=>({...o,[u]:{...t.roots?.[u],...u==="main"?t.root:{},...u in e?{initialData:e[u]}:{}}}),Object.create(t.roots||{})),s={...t,roots:i};return delete s.root,s}function Ct(r){return typeof r=="string"?{main:r}:{...r}}function Pt(r,t,e){const n=At(t);if(!r.editorName||r.editorName==="ClassicEditor")return{...e,attachTo:n.main};const i=new Set([...Object.keys(n),...Object.keys(e.roots??{})]),s=Array.from(i).reduce((u,c)=>({...u,[c]:{...e.roots?.[c],...c==="main"?e.root:{},...c in n?{element:n[c]}:{}}}),Object.create(e.roots||{})),o={...e,roots:s};return delete o.root,o}function At(r){return r instanceof HTMLElement?{main:r}:{...r}}function Tt(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 n=r.editing?.view;if(n)for(const s of n.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 j=Symbol.for("context-editor-watchdog");async function It({context:r,creator:t,config:e}){const n=kt();await r.add({creator:t.create.bind(t),id:n,type:"editor",config:e});const i=r.getItem(n),s={state:"available",editorContextId:n,context:r};i[j]=s;const o=r.destroy.bind(r);return r.destroy=async()=>(s.state="unavailable",o()),{...s,editor:i}}function Q(r){return j in r?r[j]:null}function W(r){return"addEditable"in r.ui}function I(r){return["inline","classic","balloon","decoupled"].includes(r)}async function Ot(r){const t=await import("ckeditor5"),n={inline:t.InlineEditor,balloon:t.BalloonEditor,classic:t.ClassicEditor,decoupled:t.DecoupledEditor,multiroot:t.MultiRootEditor}[r];if(!n)throw new Error(`Unsupported editor type: ${r}`);return n}class M{static the=new M;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 n=r.map(async i=>{const s=await M.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(n),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 n=await xt(r,e);return n?.default??n}).filter(Boolean))}async function xt(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 _(r,t=>({dictionary:t}))}function rt(r){const t=nt(r);return _(t,({content:e})=>e)}function Y(r){const t=nt(r),e=_(t,({initialValue:n})=>n);return ft(e,n=>typeof n=="string")}function nt(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({})),n=document.querySelector(`[phx-hook="CKEditor5"][id="${r}"]`);if(!n)return e;const i=n.getAttribute("data-cke-initial-value")||"",s=n.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 Dt(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:n,license:i,watchdog:s,...o}=JSON.parse(t);if(!e||!n||!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(n),customTranslations:o.customTranslations||o.custom_translations}}function D(r){if(!r||typeof r!="object")return r;if(Array.isArray(r))return r.map(n=>D(n));const t=r;if(t.$element&&typeof t.$element=="string"){const n=document.querySelector(t.$element);return n||console.warn(`Element not found for selector: ${t.$element}`),n||null}const e=Object.create(null);for(const[n,i]of Object.entries(r))e[n]=D(i);return e}function S(r,t,e){if(!e||typeof e!="object")return e;if(Array.isArray(e))return e.map(s=>S(r,t,s));const n=e;if(n.$translation&&typeof n.$translation=="string"){const s=n.$translation,o=St(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]=S(r,t,o);return i}function St(r,t,e){for(const n of r){const i=n[e];if(i?.dictionary&&t in i.dictionary)return i.dictionary[t]}}function Nt(r,t){const{editing:e}=r;e.view.change(n=>{n.setStyle("height",`${t}px`,e.view.document.getRoot())})}const U=Symbol.for("elixir-editor-watchdog");async function Rt(r,t){const{EditorWatchdog:e}=await import("ckeditor5"),n=new e(null,t??{crashNumberLimit:10,minimumNonErrorTimePeriod:5e3});return n.setCreator(async()=>{const i=await r();return i[U]=n,i}),n}function at(r){return U in r?r[U]:null}class y extends G{static the=new y}function Mt(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,...n}=JSON.parse(t);return{config:x(e),customTranslations:n.customTranslations||n.custom_translations,watchdogConfig:n.watchdogConfig||n.watchdog_config}}class Vt extends N{contextPromise=null;get attrs(){const t=n=>this.el.getAttribute(n)||null,e={id:this.el.id,config:Mt(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:n,watchdogConfig:i,config:{plugins:s,...o}}=this.attrs.config,{loadedPlugins:u,hasPremium:c}=await Z(s??[]),d=[...await tt(e,c),et(n?.dictionary||{})].filter(p=>!X(p));let h=D(o);h=S([...d].reverse(),e.ui,h),this.contextPromise=(async()=>{const{ContextWatchdog:p,Context:v}=await import("ckeditor5"),k=new p(v,{crashNumberLimit:10,...i});return await k.create({...h,language:e,plugins:u,...d.length&&{translations:d}}),k.on("itemError",(...A)=>{console.error("Context item error:",...A)}),k})();const b=await this.contextPromise;this.isBeingDestroyed()||y.the.register(t,b)}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 jt(r){return r.hasAttribute("data-cke-context")}function Ut(r){let t=r;for(;t;){if(jt(t))return t;t=t.parentElement}return null}async function $t(r){const t=Ut(r);return t?y.the.waitFor(t.id):null}const _t=R(Vt);function zt(r,t){const e=new Set;return n=>{let i=!1;return r.model.enqueueChange({isUndoable:!1},s=>{const o=r.model.document.getRoot(t);if(o){for(const u of e)n&&u in n||(s.removeAttribute(u,o),e.delete(u),i=!0);for(const[u,c]of Object.entries(n??{}))s.setAttribute(u,c,o),e.add(u),i=!0}}),i}}async function Ht(){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:n}=this,{plugins:i,config:s}=n,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 qt(c,o)}}}class qt{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 n={},i=wt();i&&(n["X-CSRF-Token"]=i);try{const s=await fetch(this.uploadUrl,{method:"POST",headers:n,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 Bt({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",O(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 Ft(r){const{Plugin:t}=await import("ckeditor5"),{editorId:e,saveDebounceMs:n,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:V(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=V(c);(!l||!yt(l,p))&&(s("ckeditor5:change",{editorId:e,data:p}),l=p)},b=O(n,h);c.model.document.on("change:data",O(10,p=>{if(Lt(p)){l=null;return}c.ui.focusTracker.isFocused?b():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:V(l)})};l.ui.focusTracker.on("change:isFocused",d)}}}function V(r){return r.model.document.getRootNames().reduce((e,n)=>(e[n]=r.getData({rootName:n}),e),Object.create({}))}function Lt(r){const t=r[$];return delete r[$],!!t}function Wt(r){let t=!1;const e=n=>{t||(n[$]=!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:n,valueAttrName:i="data-cke-value",rootAttrsAttrName:s="data-cke-root-attrs"}){this.el=t,this.editor=e,this.rootName=n,this.valueAttrName=i,this.rootAttrsAttrName=s;const{value:o}=this.attrs;this.previousValue=o,this.setupSyncHandlers(e,this.rootName)}get attrs(){return{rootAttributes:bt(this.el.getAttribute(this.rootAttrsAttrName)),value:this.el.getAttribute(this.valueAttrName)}}async updated(){const{editor:t}=this,{value:e,rootAttributes:n}=this.attrs;if(!t||t.state==="destroyed"||this.isDestroyed)return;let i=()=>{};t.model.enqueueChange({isUndoable:!1},()=>{let s=this.attrsUpdater?.(n);e!==this.previousValue&&(this.previousValue=e,t.ui.focusTracker.isFocused?this.pendingValue=e:(this.setRootValue(t,this.rootName,e),s=!0)),s&&(i=Wt(t))}),i()}setupSyncHandlers(t,e){this.attrsUpdater=zt(t,e),this.attrsUpdater(this.attrs.rootAttributes);const n=()=>{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",n),t.ui.focusTracker.on("change:isFocused",i),this.cleanupCallbacks.push(()=>{t.model.document.off("change:data",n),t.ui.focusTracker.off("change:isFocused",i)})}setRootValue(t,e,n){t.getData({rootName:e})!==n&&t.setData({[e]:n})}destroy(){this.isDestroyed=!0,this.cleanupCallbacks.forEach(t=>t()),this.cleanupCallbacks=[]}}class m extends G{static the=new m}class Kt extends N{sentinel=null;get attrs(){const{el:t}=this,e=t.getAttribute.bind(t),n=t.hasAttribute.bind(t),i={editorId:e("id"),contextId:e("data-cke-context-id"),preset:Dt(t),editableHeight:L(e("data-cke-editable-height")),watchdog:n("data-cke-watchdog"),events:{change:n("data-cke-change-event"),blur:n("data-cke-blur-event"),focus:n("data-cke-focus-event"),ready:n("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 n=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(async()=>{m.the.unregister(t),n();const i=Q(e),s=at(e);i?i.state!=="unavailable"&&await i.context.remove(i.editorContextId):s?await s.destroy():await e.destroy()}),m.the.register(t,e)}catch(e){console.error(e),m.the.error(t,e)}return this}async updated(){this.sentinel?.updated()}async destroyed(){this.el.style.display="none"}async createEditor(){const{preset:t,editorId:e,contextId:n,editableHeight:i,events:s,saveDebounceMs:o,language:u,watchdog:c}=this.attrs,{customTranslations:l,type:d,license:h,config:{plugins:b,...p}}=t,v=await Ot(d),k=await(n?y.the.waitFor(n):$t(this.el)),A=async()=>{const{loadedPlugins:f,hasPremium:T}=await Z(b);I(d)&&f.push(await Bt({editorId:e,saveDebounceMs:o})),f.push(...await Promise.all([Ft({editorId:e,saveDebounceMs:o,events:s,pushEvent:this.pushEvent.bind(this),handleEvent:this.handleEvent.bind(this)}),Ht()]));const E=[...await tt(u,T),et(l?.dictionary||{})].filter(P=>!X(P));let C=Y(e);I(d)&&(C=C.main||"");let w=rt(e);if(!(w instanceof HTMLElement)&&!("main"in w)){const P=d==="decoupled"?["main"]:Object.keys(C);st(w,P)||(w=await Yt(e,P),C=Y(e))}I(d)&&"main"in w&&(w=w.main);let g={...p};g=D(g),g=S([...E].reverse(),u.ui,g),g=Pt(v,w,g),g=vt(C,g);const H={...g,licenseKey:h.key,plugins:f,language:u,...E.length&&{translations:E}},q=await(async()=>!k||!(w instanceof HTMLElement)?v.create(H):(await It({context:k,creator:v,config:H})).editor)();return I(d)&&i&&Nt(q,i),q};if(c&&!k){const f=await Rt(A,t.watchdog);return f.on("error",(T,{causesRestart:z})=>{if(z){const E=m.the.getItem(e);E&&(Tt(E),m.the.unregister(e))}}),f.on("restart",()=>{const T=f.editor;m.the.register(e,T)}),await f.create({}),f.editor}return A()}}function st(r,t){return t.every(e=>r[e])}async function Yt(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(
|
|
4
|
+
Missing roots: ${t.filter(n=>!e[n]).join(", ")}.`);return e},{timeOutAfter:2e3,retryAfter:100})}const Jt=R(Kt);class Gt extends N{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:n,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(n)){const{ui:d,editing:h}=o;o.addRoot(n,{isUndoable:!1,initialData:i});const b=d.view.createEditable(n,u);d.addEditable(b),h.view.forceRender()}this.sentinel=new it({el:this.el,editor:o,rootName:n,valueAttrName:"data-cke-editable-initial-value",rootAttrsAttrName:"data-cke-editable-root-attrs"});const l=c?Qt(c,o,n):null;return()=>{if(l?.(),this.sentinel?.destroy(),this.sentinel=null,o.state!=="destroyed"){const d=o.model.document.getRoot(n);d&&W(o)&&(o.ui.view.editables[n]&&o.detachEditable(d),d.isAttached()&&o.detachRoot(n,!1))}}});this.onBeforeDestroy(()=>{this.el.style.display="none",s()})}async updated(){this.sentinel?.updated()}}const Xt=R(Gt);function Qt(r,t,e){const n=()=>{r.value=t.getData({rootName:e})},i=O(200,n);return t.model.document.on("change:data",i),n(),()=>{t.model.document.off("change:data",i)}}class Zt extends N{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,n=m.the.mountEffect(t,i=>{if(this.isBeingDestroyed())return;const{ui:s}=i,o=te(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",n()})}}function te(r){switch(r){case"toolbar":return"toolbar";case"menubar":return"menuBarView";default:return null}}const ee=R(Zt),re={CKEditor5:Jt,CKEditable:Xt,CKUIPart:ee,CKContext:_t};exports.ContextsRegistry=y;exports.CustomEditorPluginsRegistry=M;exports.EditorsRegistry=m;exports.Hooks=re;exports.unwrapEditorContext=Q;exports.unwrapEditorWatchdog=at;
|
|
5
5
|
//# sourceMappingURL=index.cjs.map
|