Packages
ckeditor5_phoenix
1.4.1
1.28.2
1.28.1
1.28.0
1.27.2
1.27.1
1.27.0
1.26.0
1.25.1
1.25.0
1.24.2
1.24.1
1.24.0
1.23.0
1.22.0
1.21.0
1.20.0
1.19.0
1.18.0
1.17.2
1.17.1
1.17.0
1.16.1
1.16.0
1.15.8
1.15.7
1.15.6
1.15.5
1.15.4
1.15.3
1.15.2
1.15.1
1.15.0
1.14.2
1.14.1
1.14.0
1.13.0
1.12.0
1.11.0
1.10.2
1.10.1
1.10.0
1.9.0
1.8.0
1.7.0
1.6.0
1.5.0
1.4.1
1.4.0
1.3.0
1.2.1
1.2.0
1.1.0
1.0.8
1.0.7
CKEditor 5 integration for Phoenix Framework
Current section
Files
Jump to
Current section
Files
dist/index.cjs
"use strict";var S=Object.create;var P=Object.defineProperty;var V=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var O=Object.getPrototypeOf,N=Object.prototype.hasOwnProperty;var M=(i,e,r,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of D(e))!N.call(i,n)&&n!==r&&P(i,n,{get:()=>e[n],enumerable:!(a=V(e,n))||a.enumerable});return i};var t=(i,e,r)=>(r=i!=null?S(O(i)):{},M(e||!i||!i.__esModule?P(r,"default",{value:i,enumerable:!0}):r,i));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function b(i,e){let r=null;return(...a)=>{r&&clearTimeout(r),r=setTimeout(()=>{e(...a)},i)}}class f{el;liveSocket;pushEvent;pushEventTo;handleEvent}function g(i){return{mounted(){const e=new i;return this.el.instance=e,e.el=this.el,e.liveSocket=this.liveSocket,e.pushEvent=(r,a,n)=>this.pushEvent?.(r,a,n),e.pushEventTo=(r,a,n,o)=>this.pushEventTo?.(r,a,n,o),e.handleEvent=(r,a)=>this.handleEvent?.(r,a),e.mounted?.()},beforeUpdate(){this.el.instance.beforeUpdate?.()},destroyed(){this.el.instance.destroyed?.()},disconnected(){this.el.instance.disconnected?.()},reconnected(){this.el.instance.reconnected?.()}}}function C(i,e){const r=Object.entries(i).map(([a,n])=>[a,e(n,a)]);return Object.fromEntries(r)}function A(i){if(i===null)return null;const e=Number.parseInt(i,10);return Number.isNaN(e)?null:e}class l{static the=new l;editors=new Map;callbacks=new Map;constructor(){}execute(e,r){const{callbacks:a,editors:n}=this,o=n.get(e);return o?Promise.resolve(r(o)):new Promise(s=>{const c=async m=>s(await r(m));this.callbacks.has(e)||a.set(e,[]),a.set(e,[...a.get(e),c])})}register(e,r){const{editors:a,callbacks:n}=this,o=n.get(e);if(a.has(e))throw new Error(`Editor with ID "${e}" is already registered.`);a.set(e,r),o&&(o.forEach(s=>s(r)),n.delete(e)),this.editors.size===1&&this.register(null,r)}unregister(e){const{editors:r,callbacks:a}=this;if(!r.has(e))throw new Error(`Editor with ID "${e}" is not registered.`);e&&this.editors.get(null)===r.get(e)&&this.unregister(null),r.delete(e),a.delete(e)}getEditors(){return Array.from(this.editors.values())}hasEditor(e){return this.editors.has(e)}waitForEditor(e){return this.execute(e,r=>r)}async destroyAllEditors(){const e=Array.from(this.editors.values()).map(r=>r.destroy());this.editors.clear(),this.callbacks.clear(),await Promise.all(e)}}class U extends f{mountedPromise=null;get attrs(){const e={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:e,writable:!1,configurable:!1,enumerable:!0}),e}async mounted(){const{editableId:e,editorId:r,rootName:a,initialValue:n}=this.attrs,o=this.el.querySelector(`#${e}_input`);this.mountedPromise=l.the.execute(r,s=>{const{ui:c,editing:m,model:p}=s;if(p.document.getRoot(a))return;s.addRoot(a,{isUndoable:!1,data:n});const w=this.el.querySelector("[data-cke-editable-content]"),h=c.view.createEditable(a,w);c.addEditable(h),m.view.forceRender(),o&&x(o,s,a)})}async destroyed(){const{editorId:e,rootName:r}=this.attrs;this.el.style.display="none",await this.mountedPromise,this.mountedPromise=null,await l.the.execute(e,a=>{const n=a.model.document.getRoot(r);n&&(a.detachEditable(n),a.detachRoot(r,!1))})}}const q=g(U);function x(i,e,r){const a=()=>{i.value=e.getData({rootName:r})};e.model.document.on("change:data",b(100,a)),a()}function E(i){return["inline","classic","balloon","decoupled"].includes(i)}async function z(i){const e=await import("ckeditor5"),a={inline:e.InlineEditor,balloon:e.BalloonEditor,classic:e.ClassicEditor,decoupled:e.DecoupledEditor,multiroot:e.MultiRootEditor}[i];if(!a)throw new Error(`Unsupported editor type: ${i}`);return a}async function K(i){const e=await import("ckeditor5");let r=null;const a=i.map(async n=>{const{[n]:o}=e;if(o)return o;if(!r)try{r=await import("ckeditor5-premium-features")}catch(c){console.error(`Failed to load premium package: ${c}`)}const{[n]:s}=r||{};if(s)return s;throw new Error(`Plugin "${n}" not found in base or premium packages.`)});return{loadedPlugins:await Promise.all(a),hasPremium:!!r}}async function I(i,e){return await Promise.all(e.filter(r=>r!=="en").map(async r=>{const a=await B(i,r);return a?.default??a}).filter(Boolean))}async function B(i,e){try{if(i==="ckeditor5")switch(e){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 ${e} not found in ckeditor5 translations`),null}else switch(e){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 ${e} not found in premium translations`),await import("ckeditor5-premium-features/translations/en.js")}}catch(r){return console.error(`Failed to load translation for ${i}/${e}:`,r),null}}function k(i){const e=document.querySelectorAll([`[data-cke-editor-id="${i}"][data-cke-editable-root-name]`,"[data-cke-editable-root-name]:not([data-cke-editor-id])"].join(", "));return Array.from(e).reduce((r,a)=>{const n=a.getAttribute("data-cke-editable-root-name"),o=a.getAttribute("data-cke-editable-initial-value")||"",s=a.querySelector("[data-cke-editable-content]");return!n||!s?r:{...r,[n]:{content:s,initialValue:o}}},Object.create({}))}const $=["inline","classic","balloon","decoupled","multiroot"];function F(i){const e=i.getAttribute("cke-preset");if(!e)throw new Error('CKEditor5 hook requires a "cke-preset" attribute on the element.');const{type:r,config:a,license:n}=JSON.parse(e);if(!r||!a||!n)throw new Error('CKEditor5 hook configuration must include "editor", "config", and "license" properties.');if(!$.includes(r))throw new Error(`Invalid editor type: ${r}. Must be one of: ${$.join(", ")}.`);return{type:r,config:a,license:n}}function L(i,e){const{editing:r}=i;r.view.change(a=>{a.setStyle("height",`${e}px`,r.view.document.getRoot())})}class _ extends f{editorPromise=null;get attrs(){const e={editorId:this.el.getAttribute("id"),preset:F(this.el),editableHeight:A(this.el.getAttribute("cke-editable-height")),changeEvent:this.el.getAttribute("cke-change-event")!==null,saveDebounceMs:A(this.el.getAttribute("cke-save-debounce-ms"))??400,language:{ui:this.el.getAttribute("cke-language")||"en",content:this.el.getAttribute("cke-content-language")||"en"}};return Object.defineProperty(this,"attrs",{value:e,writable:!1,configurable:!1,enumerable:!0}),e}async mounted(){return this.editorPromise=this.createEditor(),l.the.register(this.attrs.editorId,await this.editorPromise),this}async destroyed(){this.el.style.display="none",(await this.editorPromise)?.destroy(),this.editorPromise=null,l.the.unregister(this.attrs.editorId)}async createEditor(){const{preset:e,editorId:r,editableHeight:a,changeEvent:n,saveDebounceMs:o,language:s}=this.attrs,{type:c,license:m,config:{plugins:p,...w}}=e,h=await z(c),j=Q(r,c),{loadedPlugins:H,hasPremium:R}=await K(p),y=[s.ui,s.content],v=await Promise.all([I("ckeditor5",y),R&&I("ckeditor5-premium-features",y)].filter(u=>!!u)).then(u=>u.flat()),d=await h.create(j,{...w,initialData:W(r,c),licenseKey:m.key,plugins:H,language:s,...v.length&&{translations:v}});if(n&&this.setupContentPush(r,d,o),this.handleEvent("ckeditor5:set-data",({data:u})=>{d.setData(u)}),E(c)){const u=document.getElementById(`${r}_input`);u&&J(u,d,o),a&&L(d,a)}return d}setupContentPush(e,r,a){const n=()=>{this.pushEvent("ckeditor5:change",{editorId:e,data:G(r)})};r.model.document.on("change:data",b(a,n)),n()}}function G(i){return i.model.document.getRootNames().reduce((r,a)=>(r[a]=i.getData({rootName:a}),r),Object.create({}))}function J(i,e,r){const a=()=>{const n=e.getData();i.value=n,i.dispatchEvent(new Event("input",{bubbles:!0}))};e.model.document.on("change:data",b(r,a)),Y(i)?.addEventListener("submit",a),a()}function Y(i){return i.closest("form")}function Q(i,e){if(e==="decoupled"){const{content:a}=T(i);return a}if(E(e))return document.getElementById(`${i}_editor`);const r=k(i);return C(r,({content:a})=>a)}function W(i,e){if(e==="decoupled"){const{initialValue:a}=T(i);if(a)return a}if(E(e))return document.getElementById(i)?.getAttribute("cke-initial-value")||"";const r=k(i);return C(r,({initialValue:a})=>a)}function T(i){const e=k(i).main;if(!e)throw new Error(`No "main" editable found for editor with ID "${i}".`);return e}const X=g(_);class Z extends f{mountedPromise=null;get attrs(){const e={editorId:this.el.getAttribute("data-cke-editor-id")||null,name:this.el.getAttribute("data-cke-ui-part-name")};return Object.defineProperty(this,"attrs",{value:e,writable:!1,configurable:!1,enumerable:!0}),e}async mounted(){const{editorId:e,name:r}=this.attrs;this.mountedPromise=l.the.execute(e,a=>{const{ui:n}=a,o=tt(r),s=n.view[o];if(!s){console.error(`Unknown UI part name: "${r}". Supported names are "toolbar" and "menubar".`);return}this.el.appendChild(s.element)})}async destroyed(){this.el.style.display="none",await this.mountedPromise,this.mountedPromise=null,this.el.innerHTML=""}}function tt(i){switch(i){case"toolbar":return"toolbar";case"menubar":return"menuBarView";default:return null}}const et=g(Z),rt={CKEditor5:X,CKEditable:q,CKUIPart:et};exports.EditorsRegistry=l;exports.Hooks=rt;
//# sourceMappingURL=index.cjs.map