Current section

Files

Jump to
ckeditor5_phoenix dist index.cjs
Raw

dist/index.cjs

"use strict";var at=Object.create;var H=Object.defineProperty;var nt=Object.getOwnPropertyDescriptor;var it=Object.getOwnPropertyNames;var ot=Object.getPrototypeOf,st=Object.prototype.hasOwnProperty;var ct=(r,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of it(t))!st.call(r,i)&&i!==e&&H(r,i,{get:()=>t[i],enumerable:!(n=nt(t,i))||n.enumerable});return r};var a=(r,t,e)=>(e=r!=null?at(ot(r)):{},ct(t||!r||!r.__esModule?H(e,"default",{value:r,enumerable:!0}):e,r));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function q(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 K{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),o=this.initializationErrors.get(t);return o?(n?.(o),Promise.reject(o)):i?Promise.resolve(e(i)):new Promise((c,u)=>{const s=this.getPendingCallbacks(t);s.success.push(async l=>{c(await e(l))}),n?s.error.push(n):s.error.push(u)})}mountEffect(t,e){let n,i,o=!1;const c=this.watch(u=>{const s=u.get(t);if(s!==i&&(n?.(),n=void 0,i=s,!!s))try{const l=e(s);o?(l?.(),c()):n=l}catch(l){throw console.error(l),l}});return()=>{o=!0,i&&(c(),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(){q(this.lastNotifiedItems,this.items)&&q(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 ut(r){return r.replace(/[-_\s]+(.)?/g,(t,e)=>e?e.toUpperCase():"").replace(/^./,t=>t.toLowerCase())}function P(r,t){let e=null;return(...n)=>{e&&clearTimeout(e),e=setTimeout(()=>{t(...n)},r)}}function lt(r){if(Object.prototype.toString.call(r)!=="[object Object]")return!1;const t=Object.getPrototypeOf(r);return t===Object.prototype||t===null}function T(r){if(Array.isArray(r))return r.map(T);if(lt(r)){const t=Object.create(null);for(const[e,n]of Object.entries(r))t[ut(e)]=T(n);return t}return r}function dt(){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 O{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 D(r){return{async mounted(){const t=new r;this.el.instance=t,t.el=this.el,t.pushEvent=(n,i,o)=>this.pushEvent?.(n,i,o),t.pushEventTo=(n,i,o,c)=>this.pushEventTo?.(n,i,o,c),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 Y(r){return Object.keys(r).length===0&&r.constructor===Object}function mt(r){return r==null}function ht(r,t){const e=Object.entries(r).map(([n,i])=>[n,t(i,n)]);return Object.fromEntries(e)}function B(r){if(r===null)return null;const t=Number.parseInt(r,10);return Number.isNaN(t)?null:t}function pt(r){return r==null||r.trim()===""?null:JSON.parse(r)}function ft(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 wt(){return Math.random().toString(36).substring(2)}function gt(r,{timeOutAfter:t=500,retryAfter:e=100}={}){return new Promise((n,i)=>{const o=Date.now();let c=null;const u=setTimeout(()=>{i(c??new Error("Timeout"))},t),s=async()=>{try{const l=await r();clearTimeout(u),n(l)}catch(l){c=l,Date.now()-o>t?i(l):setTimeout(s,e)}};s()})}function yt(r,t,e){const n=!r.editorName||r.editorName==="ClassicEditor",i=new Set([...Object.keys(t),...Object.keys(e.roots??{})]),o=Array.from(i).reduce((u,s)=>({...u,[s]:{...e.roots?.[s],...s==="main"?e.root:{},...s in t?{initialData:t[s].initialValue,modelElement:t[s].modelElement||"$root",...!n&&{element:t[s].content}}:{}}}),{...e.roots||{}}),c={...e,roots:o,...n&&{attachTo:t.main?.content}};return delete c.root,c}function bt(r){const t=[r.ui?.element,r.ui?.view?.toolbar?.element,r.ui?.view?.menuBarView?.element].filter(Boolean);for(const o of t)i(o);const e=r.ui?.view?.body?._bodyCollectionContainer;e?.isConnected&&i(e);const n=r.editing?.view;if(n)for(const o of n.domRoots.values())o instanceof HTMLElement&&(o.removeAttribute("contenteditable"),o.removeAttribute("role"),o.removeAttribute("aria-label"),o.removeAttribute("aria-multiline"),o.removeAttribute("spellcheck"),o.classList.remove("ck","ck-content","ck-editor__editable","ck-rounded-corners","ck-editor__editable_inline","ck-blurred","ck-focused"),i(o));function i(o){o.hasAttribute("data-cke-controlled")?o.innerHTML="":o.remove()}}const $=Symbol.for("context-editor-watchdog");async function kt({context:r,creator:t,config:e}){const n=wt();await r.add({creator:t.create.bind(t),id:n,type:"editor",config:e});const i=r.getItem(n),o={state:"available",editorContextId:n,context:r};i[$]=o;const c=r.destroy.bind(r);return r.destroy=async()=>(o.state="unavailable",c()),{...o,editor:i}}function J(r){return $ in r?r[$]:null}function F(r){return"addEditable"in r.ui}function R(r){return["inline","classic","balloon","decoupled"].includes(r)}async function Et(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 S{static the=new S;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 G(r){const t=await import("ckeditor5");let e=null;const n=r.map(async i=>{const o=await S.the.get(i);if(o)return o;const{[i]:c}=t;if(c)return c;if(!e)try{e=await import("ckeditor5-premium-features")}catch(s){console.error(`Failed to load premium package: ${s}`)}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 X(r,t){const e=[r.ui,r.content];return await Promise.all([W("ckeditor5",e),t&&W("ckeditor5-premium-features",e)].filter(i=>!!i)).then(i=>i.flat())}async function W(r,t){return await Promise.all(t.filter(e=>e!=="en").map(async e=>{const n=await vt(r,e);return n?.default??n}).filter(Boolean))}async function vt(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 Q(r){return ht(r,t=>({dictionary:t}))}function Z(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,s)=>{const l=s.getAttribute("data-cke-editable-root-name"),m=s.getAttribute("data-cke-editable-root-model-element-name")||null,d=s.getAttribute("data-cke-editable-initial-value")||"",f=s.querySelector("[data-cke-editable-content]");return!l||!f?u:{...u,[l]:{content:f,initialValue:d,modelElement:m}}},Object.create(null)),n=document.querySelector(`[phx-hook="CKEditor5"][id="${r}"]`);if(!n)return e;const i=n.getAttribute("data-cke-root-model-element-name"),o=n.getAttribute("data-cke-initial-value")||"";if(e.main)return{...e,main:{...e.main,modelElement:e.main.modelElement||i,initialValue:e.main.initialValue||o}};const c=n.querySelector(`#${r}_editor `);return c?{...e,main:{content:c,initialValue:o,modelElement:n.getAttribute("data-cke-root-model-element-name")||"$root"}}:e}const L=["inline","classic","balloon","decoupled","multiroot"];function Ct(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:o,...c}=JSON.parse(t);if(!e||!n||!i)throw new Error('CKEditor5 hook configuration must include "editor", "config", and "license" properties.');if(!L.includes(e))throw new Error(`Invalid editor type: ${e}. Must be one of: ${L.join(", ")}.`);return{type:e,license:i,watchdog:o,config:T(n),customTranslations:c.customTranslations||c.custom_translations}}function I(r){if(!r||typeof r!="object")return r;if(Array.isArray(r))return r.map(n=>I(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]=I(i);return e}function x(r,t,e){if(!e||typeof e!="object")return e;if(Array.isArray(e))return e.map(o=>x(r,t,o));const n=e;if(n.$translation&&typeof n.$translation=="string"){const o=n.$translation,c=At(r,o,t);return c===void 0&&console.warn(`Translation not found for key: ${o}`),c!==void 0?c:null}const i=Object.create(null);for(const[o,c]of Object.entries(e))i[o]=x(r,t,c);return i}function At(r,t,e){for(const n of r){const i=n[e];if(i?.dictionary&&t in i.dictionary)return i.dictionary[t]}}function Pt(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 Tt(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 tt(r){return U in r?r[U]:null}class y extends K{static the=new y}function It(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:T(e),customTranslations:n.customTranslations||n.custom_translations,watchdogConfig:n.watchdogConfig||n.watchdog_config}}class xt extends O{contextPromise=null;get attrs(){const t=n=>this.el.getAttribute(n)||null,e={id:this.el.id,config:It(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:o,...c}}=this.attrs.config,{loadedPlugins:u,hasPremium:s}=await G(o??[]),m=[...await X(e,s),Q(n?.dictionary||{})].filter(p=>!Y(p));let d=I(c);d=x([...m].reverse(),e.ui,d),this.contextPromise=(async()=>{const{ContextWatchdog:p,Context:E}=await import("ckeditor5"),b=new p(E,{crashNumberLimit:10,...i});return await b.create({...d,language:e,plugins:u,...m.length&&{translations:m}}),b.on("itemError",(...v)=>{console.error("Context item error:",...v)}),b})();const f=await this.contextPromise;this.isBeingDestroyed()||y.the.register(t,f)}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 Ot(r){return r.hasAttribute("data-cke-context")}function Dt(r){let t=r;for(;t;){if(Ot(t))return t;t=t.parentElement}return null}async function St(r){const t=Dt(r);return t?y.the.waitFor(t.id):null}const Nt=D(xt);function Rt(r,t){const e=new Set;return n=>{let i=!1;return r.model.enqueueChange({isUndoable:!1},o=>{const c=r.model.document.getRoot(t);if(c){for(const u of e)n&&u in n||(o.removeAttribute(u,c),e.delete(u),i=!0);for(const[u,s]of Object.entries(n??{}))o.setAttribute(u,s,c),e.add(u),i=!0}}),i}}async function Vt(){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:o}=n,c=o.get("phoenixUpload.url");if(!c||i.has("SimpleUploadAdapter")||i.has("Base64UploadAdapter")||i.has("CKFinderUploadAdapter"))return;const u=i.get(t);u.createUploadAdapter=s=>new $t(s,c)}}}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 n={},i=dt();i&&(n["X-CSRF-Token"]=i);try{const o=await fetch(this.uploadUrl,{method:"POST",headers:n,body:e,signal:this.abortController.signal});if(!o.ok){let u="Couldn't upload file!";try{const s=await o.json();s?.error?.message&&(u=s.error.message)}catch{}throw new Error(u)}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 Ut({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",P(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 M=Symbol("suppress-phoenix-sync");async function Mt(r){const{Plugin:t}=await import("ckeditor5"),{editorId:e,saveDebounceMs:n,events:i,pushEvent:o,handleEvent:c}=r;return class extends t{static get pluginName(){return"SyncEditorWithPhoenix"}init(){const{editor:s}=this;i.change&&this.setupTypingContentPush(),i.blur&&this.setupEventPush("blur"),i.focus&&this.setupEventPush("focus"),i.ready&&this.editor.once("ready",()=>{o("ckeditor5:ready",{editorId:e,data:V(s)})}),c("ckeditor5:set-data",({editorId:l,data:m})=>{(mt(l)||l===e)&&s.setData(m)})}setupTypingContentPush(){const{editor:s}=this;let l=null,m=!1;const d=()=>{if(m)return;const p=V(s);(!l||!ft(l,p))&&(o("ckeditor5:change",{editorId:e,data:p}),l=p)},f=P(n,d);s.model.document.on("change:data",P(10,p=>{if(_t(p)){l=null;return}s.ui.focusTracker.isFocused?f():d()})),s.once("ready",d),s.once("destroy",()=>{m=!0})}setupEventPush(s){const{editor:l}=this,m=()=>{const{isFocused:d}=l.ui.focusTracker;(d?"focus":"blur")===s&&o(`ckeditor5:${s}`,{editorId:e,data:V(l)})};l.ui.focusTracker.on("change:isFocused",m)}}}function V(r){return r.model.document.getRootNames().reduce((e,n)=>(e[n]=r.getData({rootName:n}),e),Object.create(null))}function _t(r){const t=r[M];return delete r[M],!!t}function zt(r){let t=!1;const e=n=>{t||(n[M]=!0)};return r.model.document.once("change:data",e,{priority:"highest"}),()=>{t=!0,r.model.document.off("change:data",e)}}class et{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:o="data-cke-root-attrs"}){this.el=t,this.editor=e,this.rootName=n,this.valueAttrName=i,this.rootAttrsAttrName=o;const{value:c}=this.attrs;this.previousValue=c,this.setupSyncHandlers(e,this.rootName)}get attrs(){return{rootAttributes:pt(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 o=this.attrsUpdater?.(n);e!==this.previousValue&&(this.previousValue=e,t.ui.focusTracker.isFocused?this.pendingValue=e:(this.setRootValue(t,this.rootName,e),o=!0)),o&&(i=zt(t))}),i()}setupSyncHandlers(t,e){this.attrsUpdater=Rt(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 h extends K{static the=new h}class jt extends O{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:Ct(t),editableHeight:B(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:B(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;h.the.resetErrors(t);try{const e=await this.createEditor();if(this.isBeingDestroyed())return;const n=h.the.mountEffect(t,i=>(i.once("destroy",()=>{h.the.unregister(t,!1)},{priority:"highest"}),this.sentinel=new et({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()=>{h.the.unregister(t),n();const i=J(e),o=tt(e);i?i.state!=="unavailable"&&await i.context.remove(i.editorContextId):o?await o.destroy():await e.destroy()}),h.the.register(t,e)}catch(e){console.error(e),h.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:o,saveDebounceMs:c,language:u,watchdog:s}=this.attrs,{customTranslations:l,type:m,license:d,config:{plugins:f,...p}}=t,E=await Et(m),b=await(n?y.the.waitFor(n):St(this.el)),v=async()=>{const{loadedPlugins:w,hasPremium:C}=await G(f);R(m)&&w.push(await Ut({editorId:e,saveDebounceMs:c})),w.push(...await Promise.all([Mt({editorId:e,saveDebounceMs:c,events:o,pushEvent:this.pushEvent.bind(this),handleEvent:this.handleEvent.bind(this)}),Vt()]));const k=[...await X(u,C),Q(l?.dictionary||{})].filter(j=>!Y(j));let A=Z(e);const N=Object.keys(A);R(m)&&N.push("main"),rt(A,N)||(A=await Ht(e,N));let g={...p,licenseKey:d.key,plugins:w,language:u,...k.length&&{translations:k}};g=I(g),g=x([...k].reverse(),u.ui,g),g=yt(E,A,g);const z=await(async()=>b?(await kt({context:b,creator:E,config:g})).editor:E.create(g))();return R(m)&&i&&Pt(z,i),z};if(s&&!b){const w=await Tt(v,t.watchdog);return w.on("error",(C,{causesRestart:_})=>{if(_){const k=h.the.getItem(e);k&&(bt(k),h.the.unregister(e))}}),w.on("restart",()=>{const C=w.editor;h.the.register(e,C)}),await w.create({}),w.editor}return v()}}function rt(r,t){return t.every(e=>r[e])}async function Ht(r,t){return gt(()=>{const e=Z(r);if(!rt(e,t))throw new Error(`It looks like not all required root elements are present yet.
* If you want to wait for them, ensure they are registered before editor initialization.
* If you want lazy initialize roots, consider removing root values from the \`initialData\` config and assign initial data in editable components.
Missing roots: ${t.filter(n=>!e[n]).join(", ")}.`);return e},{timeOutAfter:2e3,retryAfter:100})}const qt=D(jt);class Bt extends O{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"),modelElement:this.el.getAttribute("data-cke-editable-root-model-element-name")||null,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,modelElement:o}=this.attrs,c=h.the.mountEffect(e,u=>{const s=this.el.querySelector("[data-cke-editable-content]");if(this.isBeingDestroyed())return;const l=this.el.querySelector(`#${t}_input`);if(F(u)&&!u.model.document.getRoot(n)){const{ui:d,editing:f}=u;u.addRoot(n,{isUndoable:!1,initialData:i,modelElement:o||"$root"});const p=d.view.createEditable(n,s);d.addEditable(p),f.view.forceRender()}this.sentinel=new et({el:this.el,editor:u,rootName:n,valueAttrName:"data-cke-editable-initial-value",rootAttrsAttrName:"data-cke-editable-root-attrs"});const m=l?Wt(l,u,n):null;return()=>{if(m?.(),this.sentinel?.destroy(),this.sentinel=null,u.state!=="destroyed"){const d=u.model.document.getRoot(n);d&&F(u)&&(u.ui.view.editables[n]&&u.detachEditable(d),d.isAttached()&&u.detachRoot(n,!1))}}});this.onBeforeDestroy(()=>{this.el.style.display="none",c()})}async updated(){this.sentinel?.updated()}}const Ft=D(Bt);function Wt(r,t,e){const n=()=>{r.value=t.getData({rootName:e})},i=P(200,n);return t.model.document.on("change:data",i),n(),()=>{t.model.document.off("change:data",i)}}class Lt extends O{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=h.the.mountEffect(t,i=>{if(this.isBeingDestroyed())return;const{ui:o}=i,c=Kt(e),u=o.view[c];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 Kt(r){switch(r){case"toolbar":return"toolbar";case"menubar":return"menuBarView";default:return null}}const Yt=D(Lt),Jt={CKEditor5:qt,CKEditable:Ft,CKUIPart:Yt,CKContext:Nt};exports.ContextsRegistry=y;exports.CustomEditorPluginsRegistry=S;exports.EditorsRegistry=h;exports.Hooks=Jt;exports.unwrapEditorContext=J;exports.unwrapEditorWatchdog=tt;
//# sourceMappingURL=index.cjs.map