@mrakomor/core 0.0.5 → 0.0.7
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.
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../node_modules/@esmj/signals/node_modules/@esmj/observable/dist/index.mjs", "../../../node_modules/@esmj/signals/dist/chunk-L7HTRZX7.mjs", "../../../node_modules/easy-uid/es/index.js", "../../../node_modules/@esmj/dom/dist/index.mjs", "merkur-custom-element-css-bundle:@merkur/integration-custom-element/cssBundle", "../../../node_modules/@esmj/schema/dist/chunk-67WNOIG5.mjs", "../../../src/dom.mjs", "../../../src/namespaces.mjs", "../../../src/component/editorContext.mjs", "../../../src/component/AbstractComponent.mjs", "../../../src/component/block/helpers.mjs", "../../../src/component/block/BlockComponent.mjs", "../../../src/component/block/ExternalComponent.mjs", "../../../src/component/block/Figure.mjs", "../../../src/schema.mjs", "../../../src/component/block/Headline.mjs", "../../../src/component/block/Paragraph.mjs", "../../../src/component/block/UnknownComponent.mjs", "../../../src/component/Editor.mjs", "../../../src/component/entityRange/EntityRangeElement.mjs", "../../../src/plugin/linkEntity/LinkEntity.mjs", "../../../src/plugin/tts/TtsHeadline.mjs", "../../../src/plugin/tts/TtsParagraph.mjs", "../../../src/plugin/tts/TtsVoice.mjs", "../../../node_modules/@esmj/emitter/dist/index.mjs", "../../../src/emitter.mjs", "../../../src/plugin/default/defaultMrakomorPlugin.mjs", "../../../src/component/inlineStyle/InlineElement.mjs", "../../../src/component/inlineStyle/Bold.mjs", "../../../src/component/inlineStyle/Italic.mjs", "../../../src/component/inlineStyle/Underline.mjs", "../../../src/component/inlineStyle/Superscript.mjs", "../../../src/component/inlineStyle/Subscript.mjs", "../../../src/plugin/dialog/Dialog.mjs", "../../../src/plugin/tooltip/Tooltip.mjs", "../../../src/plugin/blockChrome/BlockChrome.mjs", "../../../src/plugin/blockInsertMenu/BlockInsertMenu.mjs", "../../../src/plugin/list/listHelpers.mjs", "../../../src/plugin/list/List.mjs", "../../../src/plugin/clipboard/clipboardHelpers.mjs", "../../../src/plugin/clipboard/clipboardPlugin.mjs", "../../../src/Mrakomor.mjs", "../../../src/plugin/tts/TtsList.mjs", "../../../src/article.json", "../../../src/article-original.json", "../../../src/playground.mjs"],
|
|
4
|
-
"sourcesContent": ["// src/index.ts\nvar Observer = class {\n next(...rest) {\n }\n // eslint-disable-line @typescript-eslint/no-unused-vars\n error(...rest) {\n }\n // eslint-disable-line @typescript-eslint/no-unused-vars\n complete(...rest) {\n }\n // eslint-disable-line @typescript-eslint/no-unused-vars\n};\nvar Observable = class {\n #observers = /* @__PURE__ */ new Set();\n pipe(...operations) {\n return operations.reduce((result, operation) => operation(result), this);\n }\n next(...rest) {\n Array.from(this.#observers).forEach((observer) => {\n typeof observer === \"function\" ? observer(...rest) : observer.next(...rest);\n });\n }\n error(...rest) {\n Array.from(this.#observers).forEach((observer) => {\n observer?.error?.(...rest);\n this.unsubscribe(observer);\n });\n }\n complete(...rest) {\n Array.from(this.#observers).forEach((observer) => {\n observer?.complete?.(...rest);\n this.unsubscribe(observer);\n });\n }\n subscribe(observer) {\n this.#observers.add(observer);\n return {\n unsubscribe: () => {\n this.unsubscribe(observer);\n }\n };\n }\n unsubscribe(observer) {\n this.#observers.delete(observer);\n }\n};\nfunction pipe(...operations) {\n return (input) => {\n return operations.reduce((result, operation) => operation(result), input);\n };\n}\nexport {\n Observable,\n Observer,\n pipe\n};\n", "import {Observable,Observer}from'@esmj/observable';var C=Symbol(\"@esmj/signals:type\"),b=Symbol(\"@esmj/signals:name\"),f=null;function T(s){f=s;}var r=null,d=0,w=new Set,m=false,R=[];function a(s){let t=r;r=null;let e=s();return r=t,e}function D(){m=false;let s=q();for(let e of s)e.get();let t=R;R=[];for(let e of t)e();}function k(){m||(m=true,queueMicrotask(D));}function M(s){R.push(s),k();}function U(){return new Promise(s=>M(s))}function B(s){d++;try{s();}finally{if(d--,d===0){let t=w;w=new Set;for(let e of t)e.next();k();}}}var E=Symbol(\"@esmj/signals:internal observable\"),u=Symbol(\"@esmj/signals:original function\"),y=class extends Observable{#t=new Set;#n=null;constructor(t){super(),this.#n=t,this.pipe(e=>{let n=e.subscribe.bind(e),o=e.unsubscribe.bind(e);return e.subscribe=i=>{n(i),this.#t.add(i);},e.unsubscribe=i=>{o(i),this.#t.delete(i);},e});}watch(t){if(typeof t.next!=\"function\"&&(t.next=()=>a(()=>{this.#t.add(t),this.#n();}),t.next[u]=void 0),t instanceof g&&t.next[u]===void 0){let e=t.next.bind(t);t.next=()=>a(()=>{this.#t.add(t),e(),this.#n();}),t.next[u]=e;}return this.subscribe(t)}getPending(){let t=[];for(let e of this.#t){if(!e.get[u]){let n=e.get,o=n.bind(e);e.get=()=>a(()=>(this.#t.delete(e),o())),e.get[u]=n;}t.push(e);}return t}unwatch(t){return t.next=t.next[u]?t.next[u]:t.next,t.get=t.get[u]?t.get[u]:t.get,this.#t.delete(t),this.unsubscribe(t)}},p=null;function j(s){p=new y(s);}j(()=>{k();});function q(){return p.getPending()}function I(s){return p.watch(s)}function A(s){return p.unwatch(s)}var h=Symbol(\"@esmj/signals:no error\"),g=class s extends Observer{#t=true;#n=false;#s=null;#i=this.#d();#h=null;#u=null;#o=0;#r=new Map;#e=h;constructor(t,e){super(),this.#h=t,this.#u=e,this.debug=e?.debug,this[C]=\"computed\",this[b]=e?.debug??null,this.get=this.get.bind(this),f?.onComputedCreate?.(this);}#f(){for(let{unsubscribe:t}of this.#i.dependencies.values())t();this.#i.dependencies.clear();}#d(){return {dependencies:new Map,sourceRevisions:new Map,observer:this}}getRevision(){return this.#o}getDebugInfo(){return {name:this[b],dirty:this.#t,revision:this.#o,sourceDependencies:[...this.#r.keys()]}}#l(){for(let[t,e]of this.#r)if(t instanceof s&&a(()=>t.get()),t.getRevision()!==e)return true;return false}next(){this.#t=true,this.#s[E].next();}get(){if(this.#n)throw new Error(\"Cycle detected in computed signal\");if(this.#s||(this.#s=S(this.#c(),this.#u)),(this.#t||this.#e!==h)&&(this.#r.size===0||this.#l()?this.#c():this.#t=false),r&&r.sourceRevisions.set(this,this.#o),this.#e!==h)throw this.#e;return this.#s.get()}peek(){if(this.#s||(this.#s=S(this.#c(),this.#u)),(this.#t||this.#e!==h)&&(this.#r.size===0||this.#l()?this.#c():this.#t=false),this.#e!==h)throw this.#e;return this.#s.peek()}#c(){this.#n=true,this.#t=false,this.#e=h,f?.onComputedRun?.(this),this.#f(),this.#i.sourceRevisions.clear();let t=r;r=this.#i;let e;try{e=this.#h();}catch(n){this.#e=n;}return r=t,this.#r=this.#i.sourceRevisions,this.#i.sourceRevisions=new Map,this.#n=false,e instanceof Promise&&(e=e.then(n=>{this.#e=h,this.#s.set(n);}).catch(n=>{this.#e=n;})),this.#e===h&&this.#s&&this.#s.set(e),this.#o++,e}destroy(){this.#f(),this.#r.clear(),this.#t=true,this.#e=h;}};function F(s,t){return new g(s,t)}function L(s,t){let e,{debug:n,...o}=t??{},i=F(()=>{e?.(),e=s();},{equals:()=>false,...o});i.get(),I(i);let c=()=>{e?.(),i.destroy(),A(i);};return c[Symbol.dispose]=c,c[C]=\"effect\",c[b]=n??null,c.__RX_COMPUTED__=i,f?.onEffectCreate?.(c),c}function S(s,t={}){let e=t?.equals??Object.is,n=0,o=new Observable;function i(){return r&&(r.dependencies.set(o,o.subscribe(r.observer)),r.sourceRevisions.set(l,n)),s}function c(){return s}function O(x){if(!e(s,x)){let P=s;s=x,n++,f?.onSignalSet?.(l,P,x),d>0?w.add(o):o.next();}return s}function N(){return n}let l={get:i,set:O,peek:c,getRevision:N,[E]:o,[C]:\"signal\",[b]:t?.debug??null};return f?.onSignalCreate?.(l),l}var X=S;export{C as a,b,T as c,a as d,M as e,U as f,B as g,j as h,q as i,I as j,A as k,F as l,L as m,S as n,X as o};", "function t(){return Date.now().toString(32).substring(5)+Math.random().toString(32).substring(2)}export{t as default};\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJtYXBwaW5ncyI6IkEifQ==", "import {computed,createSignal,onFlush,effect,untrack}from'@esmj/signals';import it from'easy-uid';var D=class{constructor(e){this.props=e;}};var F=Symbol(\"node-component\"),M=Symbol(\"node-internal\"),V=Symbol(\"keep-literal\");function ct(t){let e=()=>t;return e[V]=true,e}function ut(t){let e=null,n=()=>e,o=s=>(e=s??null,typeof t==\"function\"&&t(e),e),r={get:n,set:o,[Symbol.toPrimitive](){return e?String(e):\"\"}};return Object.defineProperty(r,\"current\",{get(){return e},set(s){o(s);},enumerable:true,configurable:false}),new Proxy(r,{get(s,i,c){if(Reflect.has(s,i))return Reflect.get(s,i,c);if(!e)return;let f=e[i];return typeof f==\"function\"?f.bind(e):f},set(s,i,c,f){return Reflect.has(s,i)||!e?Reflect.set(s,i,c,f):(e[i]=c,true)},has(s,i){return Reflect.has(s,i)||!!e&&i in e}})}var v=null;function a(){return v}function k(t){v=t;}function _(t){return t[F]||null}function W(t,e){t[F]=e;}function R(t,e={disposers:[],id:it()}){return t?.[M]?t[M]:(t&&(t[M]=e),e)}function ft(t){return t[M]}function m(t,e){let n=ft(t);n||(n=R(t)),n.disposers.push(e);}function N(t,e,n){t.has(e)||t.set(e,[]),t.get(e).push(n);}function E(t,e){let n=a();k(t);try{return e()}finally{k(n);}}var T=new Map,w=new Map,O=new Map;function B(t){let e=Object.create(null);for(let n of Object.keys(t)){let o=t[n];n===\"children\"?e[n]=o:o?.[V]?e[n]=o():o!=null&&typeof o.get==\"function\"?e[n]=o:typeof o==\"function\"?e[n]=computed(o):e[n]=createSignal(o);}return e}function H(t,e){if(t===e)return true;if(t==null||e==null||typeof t!=\"object\"||typeof e!=\"object\")return false;let n=Object.keys(t),o=Object.keys(e);return n.length!==o.length?false:n.every(r=>{let s=Object.getOwnPropertyDescriptor(t,r),i=Object.getOwnPropertyDescriptor(e,r);if(!s||!i)return false;let c=\"value\"in s?s.value:s.get?.call(t),f=\"value\"in i?i.value:i.get?.call(e);return H(c,f)})}function lt(t){return {id:Symbol(\"context-id\"),defaultValue:t}}function at(t,e){let n=a();n&&n.contexts.set(t.id,e);}function pt(t){let e=a();return e?.contexts?.has(t.id)?e.contexts.get(t.id):t.defaultValue}function mt(t,e){let n=e;for(;n;){let o=n[M];if(o?.contexts?.has(t.id))return o.contexts.get(t.id);n=n.parentElement;}return t.defaultValue}function xt(t){let e=a();if(!e){console.warn(\"onMount called outside of a component context\");return}N(T,e.id,t);}function gt(t){let e=a();if(!e){console.warn(\"onUnmount called outside of a component context\");return}N(w,e.id,t);}function yt(t){let e=a();if(!e){console.warn(\"onEffect called outside of a component context\");return}ht(e.id,t);}function Ct(t){onFlush(()=>{setTimeout(t,0);});}function ht(t,e){N(O,t,e);}function C(t){let e=t.componentId,n=T.get(e);if(n){T.delete(e);for(let o of n){let r=o();typeof r==\"function\"&&N(w,e,r);}}}function Et(t){let e=w.get(t);if(e){w.delete(t);for(let n of e)n();}}function Nt(t){let e=O.get(t);if(e){O.delete(t);for(let n of e)n();}}function h(t){if(!t)return;let e=R(t);if(e?.disposers?.length){for(let o of e.disposers)try{o();}catch(r){console.error(\"[esmj-dom] cleanupTree: disposer threw, cleanup continues\",r);}e.disposers=[];}let n=_(t);if(n&&(Et(n.componentId),Nt(n.componentId)),t.childNodes){let o=t.firstChild;for(;o;){let r=o.nextSibling;h(o),o=r;}}}function d(t){return t!=null&&typeof t==\"object\"&&typeof t.$constructor==\"function\"}function It(t){return typeof t==\"function\"&&typeof t.prototype?.render==\"function\"}function Y(t,e,n){let o=it(),r={componentId:o,$children:n,element:null,classInstance:null,$constructor(){let s={...B(e??{}),children:n},i=a(),c={disposers:[],id:o,contexts:new Map(i?.contexts)};k(c);let f;if(It(t)){r.ClassConstructor=t;let p=new t(s);r.classInstance=p,typeof p.onMount==\"function\"&&N(T,o,()=>{p.onMount?.();}),typeof p.onUnmount==\"function\"&&N(w,o,()=>{p.onUnmount?.();}),f=p.render();}else f=t(s);k(i);let x=St(f);return r.element=x,R(x,c),x instanceof Node&&W(x,r),x}};return r}function j(t,e){let n=e.$constructor();n instanceof Node&&t.appendChild(n),queueMicrotask(()=>{C(e);});}function St(t){return t instanceof Node?t:d(t)?t.$constructor():typeof t==\"string\"||typeof t==\"number\"?document.createTextNode(String(t)):document.createTextNode(\"\")}var G={className:\"class\",htmlFor:\"for\"},J=new Set([\"value\",\"defaultValue\",\"checked\",\"selected\",\"indeterminate\"]),Tt=new Set([\"srcdoc\"]),bt=new Set([\"href\",\"src\",\"action\",\"formaction\",\"xlink:href\"]),Mt=new Set([\"securitypolicyviolation\"]),kt=new Set([\"contenteditable\",\"draggable\",\"spellcheck\"]);function L(t){return t!=null&&typeof t==\"object\"&&typeof t.get==\"function\"&&!(t instanceof Node)}function Rt(t,e,n){if(typeof t==\"function\")return Y(t,e||{},n);typeof t!=\"string\"&&(n=e,e=t,t=\"div\"),e=e||{};let o=document.createElement(t);return e.id&&o.setAttribute(\"id\",e.id),Ht(o,e),tt(o,jt(n)),o}function U(t,e){e instanceof DocumentFragment?t.replaceChildren(e):t.innerHTML=e??\"\";}function At(t){return typeof t!=\"string\"?false:t.replace(/[\\p{White_Space}\\p{Cc}]+/gu,\"\").toLowerCase().startsWith(\"javascript:\")}function Lt(t,e){if(typeof t!=\"string\")return false;let n=t.toLowerCase();return Tt.has(n)?true:bt.has(n)&&e!==null&&e!==void 0&&At(String(e))}function Z(t){return typeof t!=\"string\"?t:G[t]?G[t]:t}function Ot(t,e){let n=Z(t),o=typeof n==\"string\"?n.toLowerCase():String(n).toLowerCase();return kt.has(o)&&(e===true||e===false||e===\"true\"||e===\"false\")?String(e):e==null||e===false?null:e}function Q(t,e,n){let o=Ot(e,n);if(o===null){t.removeAttribute(e);return}if(Lt(e,o)){t.removeAttribute(e),console.warn(`[esmj-dom] Blocked unsafe attribute \"${String(e)}\" on <${t.tagName.toLowerCase()}>`);return}t.setAttribute(e,o);}function Ht(t,e){let n=a();for(let[o,r]of Reflect.ownKeys(e).map(s=>[s,e[s]]))if(o!==\"id\"){if(o=Z(o),o===\"$ref\"){typeof r==\"function\"?r(t):typeof r==\"object\"&&r!==null&&(r.current=t);continue}if(o===\"$dangerouslySetInnerHTML\"){if(L(r)){let s=effect(()=>{E(n,()=>{U(t,r.get());});});m(t,s);}else if(typeof r==\"function\"){let s=effect(()=>{E(n,()=>{U(t,r());});});m(t,s);}else U(t,r);continue}if(o===\"style\"){if(L(r)){let s=effect(()=>{E(n,()=>{Object.assign(t.style,r.get());});});m(t,s);}else typeof r==\"object\"&&r!==null?Object.assign(t.style,r):t.setAttribute(\"style\",r);continue}if(typeof o==\"string\"&&o.startsWith(\"on\")&&typeof r==\"function\"){let s=o.slice(2).toLowerCase();if(Mt.has(s)){console.warn(`[esmj-dom] Blocked unsafe event binding \"${o}\" on <${t.tagName.toLowerCase()}>`);continue}t.addEventListener(s,r);continue}if(L(r)||typeof r==\"function\"){let s=o,i=effect(()=>{E(n,()=>{let c=typeof r==\"function\"?r():r.get();J.has(s)?t[s]=c??\"\":Q(t,s,c);});});m(t,i);continue}J.has(o)||typeof o==\"symbol\"?t[o]=r??\"\":Q(t,o,r);}}function jt(t){return t==null?[]:Array.isArray(t)?t.flat(Number.POSITIVE_INFINITY):[t]}function tt(t,e){for(let n of e)et(t,n);}function et(t,e){if(!(e==null||e===false||e===true)){if(e instanceof Node){t.appendChild(e);return}if(typeof e==\"string\"||typeof e==\"number\"){t.appendChild(document.createTextNode(String(e)));return}if(typeof e==\"function\"){X(t,e);return}if(d(e)){j(t,e);return}if(L(e)){X(t,()=>e.get());return}if(Array.isArray(e)){tt(t,e);return}t.appendChild(document.createTextNode(String(e)));}}function X(t,e){let n=a(),o=document.createComment(\"\");t.appendChild(o);let r=null,s=effect(()=>{E(n,()=>{let i=e(),c,f=null;i instanceof Node?c=i:d(i)?(c=i.$constructor(),f=i,c instanceof Node||(c=null)):i==null||i===!1||i===!0?c=null:c=document.createTextNode(String(i)),r&&(h(r),r.remove()),c&&(o.after(c),f&&queueMicrotask(()=>C(f))),r=c??null;});});m(t,s);}function Bt(t,e,n){let o=document.createElement(\"span\");o.style.display=\"contents\",o.setAttribute(\"data-each\",it());let r=a(),s=[],i=new Map,c=computed(()=>t()),f=effect(()=>{let x=c.get(),p=[],g=[],I=new Set;for(let u=0;u<x.length;u++){let l=x[u],y=e(l,u);if(I.has(y)){console.error(`Each: duplicate key \"${String(y)}\" detected; ignoring later item at index ${u}`);continue}I.add(y),p.push(l),g.push(y);}let P=new Map(s.map(u=>[u.key,u])),b=[];for(let u=0;u<p.length;u++){let l=g[u],y=p[u],q=P.get(l);if(q)i.get(l).set(y),b.push(q),P.delete(l);else {let z=createSignal(y,{equals:H});i.set(l,z);let ot={...z,set(){}},$={key:l,element:null},S;E(r,()=>{if(S=n(ot,u),S instanceof Node)$.element=S;else if(d(S)){let K=S.$constructor();$.element=K instanceof Node?K:null,queueMicrotask(()=>C(S));}}),b.push($);}}for(let[u,l]of P)l.element&&(h(l.element),l.element.remove()),i.delete(u);let nt=o.childNodes;for(let u=0;u<b.length;u++){let l=b[u];if(!l.element)continue;let y=nt[u];y!==l.element&&o.insertBefore(l.element,y||null);}s=b;});return m(o,f),o}function Ft(t,e,n){let o=document.createElement(\"span\");o.style.display=\"contents\",o.setAttribute(\"data-if\",it());let r=null,s=null,i=false,c=computed(()=>!!t()),f=effect(()=>{let x=c.get(),p=x?\"then\":\"else\";if(p===r)return;r=p,s&&(i&&h(s),s.remove(),s=null,i=false);let g=x?e:n;g!=null&&untrack(()=>{if(d(g)){let I=g.$constructor();I instanceof Node&&(o.appendChild(I),s=I,i=true),queueMicrotask(()=>C(g));}else g instanceof Node&&(o.appendChild(g),s=g,i=false);});});return m(o,f),o}function Vt(t,e){if(typeof t==\"string\"&&(t=document.querySelector(t)),!t)throw new Error(\"mount: container not found\");t instanceof DocumentFragment||(h(t),t.innerHTML=\"\"),d(e)?j(t,e):e instanceof Node?t.appendChild(e):t.appendChild(document.createTextNode(String(e)));}function vt(t){if(typeof t==\"string\"&&(t=document.querySelector(t)),!t)throw new Error(\"unmount: container not found\");h(t),t.innerHTML=\"\";}function Gt(t,e){let n=null;if(d(e)?(n=e.$constructor(),queueMicrotask(()=>C(e))):e instanceof Node?n=e:n=document.createTextNode(String(e)),n instanceof HTMLElement){let o=computed(()=>!!t()),r=effect(()=>{n.style.display=o.get()?\"\":\"none\";});m(n,r);}return n}export{D as Component,Bt as Each,Ft as If,Gt as Show,Ct as afterRender,lt as createContext,Rt as createElement,H as deepEqual,pt as getContext,mt as getContextFromElement,_ as getNodeComponent,L as isSignalLike,ct as keepLiteral,Vt as mount,B as normalizeProps,yt as onEffect,xt as onMount,gt as onUnmount,et as renderChild,at as setContext,vt as unmount,ut as useRef,E as withContext};", "var STYLE={__bundle__:\"\"}; export default STYLE;", "var A={abortEarly:true};function k(e,a){if(a===void 0)return e;let n=e?.cause?.key?`${a}.${e.cause.key}`:`${a}`;return {message:`Error parsing key \"${n}\": ${e.message}`,cause:{key:n}}}function j(e,a,n){if(e.errors?.length)for(let t=0;t<e.errors.length;t++)a.push(k(e.errors[t],n));}function E(e,a,n,t){if(n!==false){let s=k(e.error,a);return {success:false,error:s,errors:[s]}}j(e,t,a);}function g(e){return e?.abortEarly!==void 0?e:A}function b(e,a){h(e,\"_parse\",(n,t,s)=>{let u=n(t,s);return !u.success&&a(t)?{success:true,data:t}:u});}var S=e=>typeof e==\"string\"||e instanceof String,T=e=>(typeof e==\"number\"||e instanceof Number)&&!Number.isNaN(e),O=e=>e===true||e===false,F=e=>e instanceof Date&&!Number.isNaN(e.getTime()),C=e=>typeof e==\"function\",V=e=>Array.isArray(e),_=e=>typeof e==\"object\"&&e!==null&&!Array.isArray(e);function M(e,a){let n=l(_,{...a,type:\"object\"});return n._getDescription=()=>`object({ ${Object.entries(e).map(([s,u])=>`${s}: ${u._getDescription()}`).join(\", \")} })`,h(n,\"_parse\",(t,s,u)=>{let r=t(s,u),{abortEarly:i}=g(u);if(r.success===false)return r;let c={},p=[];for(let o in e){let m=e[o]._parse(r.data[o],u);if(m.success)c[o]=m.data;else {let f=E(m,o,i,p);if(f)return f}}return p.length>0?{success:false,error:p[0],errors:p}:{success:true,data:c}}),n}function $(e){return l(S,{...e,type:\"string\"})}function D(e){return l(T,{...e,type:\"number\"})}function N(e){return l(O,{...e,type:\"boolean\"})}function R(e){return l(F,{...e,type:\"date\"})}function L(e){return l(C,{...e,type:\"function\"})}function B(e,a){let n=r=>e.includes(r),t=r=>`Invalid ${s} value. Expected ${e.map(i=>`\"${i}\"`).join(\" | \")}, received \"${r}\".`,s=\"enum\",u=l(n,{message:t,...a,type:s});return u._getDescription=()=>`enum(${e.map(r=>`\"${r}\"`).join(\" | \")})`,u}function v(e,a){let n=l(V,{...a,type:\"array\"});return n._getDescription=()=>`array(${e._getDescription()})`,h(n,\"_parse\",(t,s,u)=>{let r=t(s,u),{abortEarly:i}=g(u);if(r.success===false)return r;let c=[],p=[];for(let o=0;o<r.data.length;o++){let m=e._parse(r.data[o],u);if(m.success)c.push(m.data);else {let f=E(m,o,i,p);if(f)return f}}return p.length>0?{success:false,error:p[0],errors:p}:{success:true,data:c}}),n}function U(){return l(()=>true)}function y(e,a){return h(a,\"_parse\",(n,t,s)=>(t=e(t),n(t,s))),a}function J(e,a){let n=s=>`Invalid union value. Expected the value to match one of the schemas:${e.map((u,r)=>` ${r+1}. ${u._getDescription()}`).join(\",\")} but received \"${typeof s}\" with value: ${_(s)?JSON.stringify(s):`\"${s}\"`}`,t=l(()=>false,{message:n,...a,type:\"union\"});return h(t,\"_parse\",(s,u,r)=>{let i=r,c=[];for(let f=0;f<e.length;f++){let I=e[f]._parse(u,i);if(I.success)return I;c.push(I);}let{abortEarly:p}=g(i),o={message:typeof n==\"function\"?n(u):n};if(p!==false)return {success:false,error:o,errors:[o]};let m=[];for(let f=0;f<c.length;f++){let I=c[f].errors;if(I?.length)for(let d=0;d<I.length;d++)I[d].cause?.key&&m.push(k(I[d],`branch ${f}`));}return m.length===0&&m.push(o),{success:false,error:m[0],errors:m}}),t}function q(e,a){let s=l(u=>u===e,{message:u=>a?.message?typeof a.message==\"function\"?a.message(u):a.message:`Expected literal value \"${e}\", received \"${u}\"`,name:a?.name,type:\"literal\"});return s._getDescription=()=>`literal(\"${e}\")`,s}var z={boolean(e){let a=e?.message??(n=>`Cannot cast \"${n}\" to boolean. Accepted: true/false, 1/0, yes/no, on/off.`);return y(n=>{let t;return S(n)&&(t=n.toLowerCase()),t===\"true\"||t===\"yes\"||t===\"on\"||t===\"1\"||n===1?true:t===\"false\"||t===\"no\"||t===\"off\"||t===\"0\"||n===0?false:n},N({...e,message:a}))},number(e){let a=e?.message??(n=>`Cannot cast \"${n}\" to a number. Expected a numeric string or number.`);return y(n=>{if(O(n))return Number(n);if(S(n)){let t=n.trim();if(t===\"\")return n;let s=Number(t);if(Number.isFinite(s))return s}return n},D({...e,message:a}))},string(e){let a=e?.message??(n=>`Cannot cast \"${n}\" to string. Expected a string, number, or boolean.`);return y(n=>O(n)||T(n)&&Number.isFinite(n)?String(n):n,$({...e,message:a}))},date(e){let a=e?.message??(n=>`Cannot cast \"${n}\" to a valid date.`);return y(n=>{let t;return S(n)&&(t=n.trim()),T(n)&&Number.isFinite(n)||t?new Date(t??n):n},R({...e,message:a}))},json(e,a){let n=a?.message??(t=>`Cannot parse \"${t}\" as JSON.`);return h(e,\"_parse\",(t,s,u)=>{if(S(s))try{s=JSON.parse(s);}catch{let r={message:typeof n==\"function\"?n(s):n};return {success:false,error:r,errors:[r]}}return t(s,u)}),e}},G={},Q={object:M,string:$,number:D,boolean:N,date:R,function:L,enum:B,array:v,any:U,preprocess:y,union:J,literal:q,coerce:G,cast:z};function P(e){return a=>`The value \"${a}\" must be type of ${e} but is type of \"${typeof a}\".`}function h(e,a,n){let t=e[a];e[a]=(...s)=>n(t,...s);}function l(e,{type:a=\"any\",name:n,message:t}={}){t=t||P(a);let s={name:n,message:t,type:a},u={_getName(){return n},_getType(){return a},_getDescription(){return this._getName()??this._getType()},_parse(r,i){let c=e(r);if(c===true)return {success:true,data:r};if(typeof c==\"object\"&&c?.success===true)return c;let p={message:typeof t==\"function\"?t(r):t};return {success:false,error:p,errors:[p]}},parse(r,i){let c=this._parse(r,i);if(!c.success)throw c=c,new Error(c.error.message,{cause:c.error.cause});return c.data},safeParse(r,i){return this._parse(r,i)},transform(r){return h(this,\"_parse\",(i,c,p)=>{let o=i(c,p);return o.success&&(o.data=r(o.data)),o}),this},optional(){return b(this,r=>r===void 0),this},nullable(){return b(this,r=>r===null),this},nullish(){return b(this,r=>r==null),this},default(r){return h(this,\"_parse\",(i,c,p)=>(c===void 0&&(c=typeof r==\"function\"?r():r),i(c,p))),this},catch(r){return h(this,\"_parse\",(i,c,p)=>{let o=i(c,p);return o.success?o:{success:true,data:typeof r==\"function\"?r({input:c,error:o.error}):r}}),this},pipe(r){return h(this,\"_parse\",(i,c,p)=>{let o=i(c,p);return o.success?r._parse(o.data,p):o}),this},refine(r,{message:i,type:c}={}){return c&&(i=i||P(c),a=c),h(this,\"_parse\",(p,o,m)=>{let f=p(o,m),{abortEarly:I}=g(m);if(!f.success)return f;let d=r(f.data);if(d===true||typeof d==\"object\"&&d?.success===true)return f;let w={message:typeof i==\"function\"?i(o):i};return {success:false,error:w,errors:[w]}}),this},clone(){return {...this}}};return x.length>0?x.reduce((r,i)=>i(r,e,s)??r,u):u}var x=[];function W(e){if(typeof e!=\"function\")throw new TypeError(\"extend() requires a function argument\");x.push(e);}export{M as a,$ as b,D as c,N as d,R as e,L as f,B as g,v as h,U as i,y as j,J as k,q as l,z as m,G as n,Q as o,h as p,W as q};", "import { getNodeComponent } from '@esmj/dom';\n\nconst MACHINE_ID = randomNumber();\nlet objectIdIndex = randomNumber();\nconst PID = randomNumber();\n\nconst hexTable = Array.from({ length: 256 }, (_, i) =>\n (i <= 15 ? '0' : '') + i.toString(16),\n);\n\n/** @returns {number} 24-bit random integer */\nfunction randomNumber() {\n return Math.floor(Math.random() * 0xffffff);\n}\n\n/** @returns {number} next BSON-style object-id counter (wraps at 0xffffff) */\nfunction nextObjectIdCounter() {\n objectIdIndex = (objectIdIndex + 1) % 0xffffff;\n return objectIdIndex;\n}\n\n/**\n * BSON ObjectId-style 24-char lowercase hex id (timestamp + machine + pid + counter).\n * @returns {string}\n */\nfunction createComponentId() {\n let time = Math.floor(Date.now() / 1000);\n time = parseInt(time, 10) % 0xffffffff;\n\n const inc = nextObjectIdCounter();\n\n const id = String.fromCharCode(\n (time >> 24) & 0xff,\n (time >> 16) & 0xff,\n (time >> 8) & 0xff,\n time & 0xff,\n (MACHINE_ID >> 16) & 0xff,\n (MACHINE_ID >> 8) & 0xff,\n MACHINE_ID & 0xff,\n (PID >> 8) & 0xff,\n PID & 0xff,\n (inc >> 16) & 0xff,\n (inc >> 8) & 0xff,\n inc & 0xff,\n );\n\n let hexString = '';\n\n for (let i = 0; i < id.length; i++) {\n hexString += hexTable[id.charCodeAt(i)];\n }\n return hexString;\n}\n\nconst BLOCK_ELEMENT = Symbol('block-element');\nconst BLOCK_ELEMENT_BODY = Symbol('block-element-body');\n/** Marks the DOM node selection offsets are relative to (e.g. <p>, <li>). */\nconst SELECTABLE_ELEMENT = Symbol('selectable-element');\n\n/**\n * Walk up from `node` to the nearest ancestor that has `symbol` set.\n * @param {Node | null | undefined} node\n * @param {symbol} symbol\n * @returns {Element | null}\n */\nfunction closestMarked(node, symbol) {\n let current = node;\n if (current?.nodeType === Node.TEXT_NODE) {\n current = current.parentElement;\n }\n\n while (current && current[symbol] === undefined) {\n current = current.parentElement;\n }\n\n return current ?? null;\n}\n\n/**\n * Block wrapper (`.mrakomor-block-element`) that contains the range start.\n * @param {Range | null | undefined} range\n * @returns {Element | null}\n */\nfunction getBlockElementByRange(range) {\n if (!range) {\n return null;\n }\n\n return closestMarked(range.startContainer, BLOCK_ELEMENT);\n}\n\n/**\n * Block wrapper that contains `child`.\n * @param {Node | null | undefined} child\n * @returns {Element | null}\n */\nfunction getBlockElementByChild(child) {\n return closestMarked(child, BLOCK_ELEMENT);\n}\n\n/**\n * Walk up from the range to the nearest selectable content root.\n * Prefer this over tag checks (e.g. closest('li')) so blocks can opt in.\n * @param {Range | null | undefined} range\n * @returns {Element | null}\n */\nfunction getSelectableElementByRange(range) {\n if (!range) {\n return null;\n }\n\n return closestMarked(range.startContainer, SELECTABLE_ELEMENT);\n}\n\n/**\n * Selectable root that contains `child`.\n * @param {Node | null | undefined} child\n * @returns {Element | null}\n */\nfunction getSelectableElementByChild(child) {\n return closestMarked(child, SELECTABLE_ELEMENT);\n}\n\n/** @returns {Selection} */\nfunction getSelection() {\n return window.getSelection();\n}\n\n/**\n * Clone of the live selection range, or `null` if there is none.\n * @returns {Range | null}\n */\nfunction getRange() {\n const selection = getSelection();\n\n if (selection.rangeCount > 0) {\n return selection.getRangeAt(0).cloneRange();\n }\n\n return null;\n}\n\n/**\n * Collapsed caret offset within the selectable root (or block content root).\n * @returns {number}\n */\nfunction getCursorPosition() {\n const range = getRange();\n if (!range) {\n return 0;\n }\n\n range.collapse(true);\n\n const selectable = getSelectableElementByRange(range);\n const element = getBlockElementByRange(range);\n const contentRoot = selectable ?? getBlockContentRoot(element);\n\n return getOffsetInSelectable(\n contentRoot,\n range.startContainer,\n range.startOffset,\n );\n}\n\nlet globalSelectionState = null;\n\n/** Snapshot the current selection for dialog/tooltip restore. */\nfunction storeGlobalSelectionState() {\n globalSelectionState = getSelectionState();\n}\n\n/** Restore the last stored selection, if any. */\nfunction restoreGlobalSelectionState() {\n if (globalSelectionState) {\n restoreSelectionState(globalSelectionState);\n }\n}\n\n/** Drop the stored selection snapshot. */\nfunction clearGlobalSelectionState() {\n globalSelectionState = null;\n}\n\n/** Collapse the stored snapshot to its end offset and apply it. */\nfunction collapseGlobalSelectionState() {\n if (!globalSelectionState) {\n return;\n }\n\n globalSelectionState = {\n start: globalSelectionState.end,\n end: globalSelectionState.end,\n element: globalSelectionState.element,\n };\n restoreGlobalSelectionState();\n}\n\n/**\n * Prefer SELECTABLE_ELEMENT (marked by blocks) over the block content root \u2014\n * lists mark each <li>, paragraphs mark <p>, so tooltip restore stays correct\n * even when Each wraps children in a display:contents span.\n * @param {Element | null} blockElement\n * @param {Range | null} range\n * @returns {Node | null}\n */\nfunction resolveSelectableElement(blockElement, range) {\n const selectable = getSelectableElementByRange(range);\n if (selectable) {\n return selectable;\n }\n\n return (\n getBlockContentRoot(blockElement) ?? blockElement?.childNodes?.[0] ?? null\n );\n}\n\n/**\n * Character offset of `(container, offset)` relative to `selectableElement` text.\n * @param {Node | null | undefined} selectableElement\n * @param {Node} container\n * @param {number} offset\n * @returns {number}\n */\nfunction getOffsetInSelectable(selectableElement, container, offset) {\n if (!selectableElement) {\n return 0;\n }\n\n if (container === selectableElement) {\n if (container.nodeType === Node.TEXT_NODE) {\n return offset;\n }\n\n let chars = 0;\n const children = selectableElement.childNodes;\n const limit = Math.min(offset, children.length);\n for (let i = 0; i < limit; i++) {\n chars += children[i].textContent.length;\n }\n return chars;\n }\n\n if (\n container.nodeType === Node.ELEMENT_NODE &&\n !selectableElement.contains(container)\n ) {\n return 0;\n }\n\n let chars = 0;\n const walker = document.createTreeWalker(\n selectableElement,\n NodeFilter.SHOW_TEXT,\n );\n let node = walker.nextNode();\n while (node) {\n if (node === container) {\n return chars + offset;\n }\n chars += node.textContent.length;\n node = walker.nextNode();\n }\n\n return chars;\n}\n\n/**\n * Selection offsets that survive remount, scoped to the selectable root.\n * @returns {import('#src/types.mjs').SelectionState | null}\n */\nfunction getSelectionState() {\n const range = getRange();\n if (!range) {\n return null;\n }\n\n const element = getBlockElementByRange(range);\n const selectableElement = resolveSelectableElement(element, range);\n\n return {\n start: getOffsetInSelectable(\n selectableElement,\n range.startContainer,\n range.startOffset,\n ),\n end: getOffsetInSelectable(\n selectableElement,\n range.endContainer,\n range.endOffset,\n ),\n element,\n selectableElement,\n };\n}\n\n/**\n * Resolve a non-collapsed selection that may span multiple blocks.\n * Offsets are character indexes within each block's selectable root.\n * @param {Range | null} [range]\n * @returns {import('#src/types.mjs').CrossBlockSelectionState | null}\n */\nfunction getCrossBlockSelectionState(range = getRange()) {\n if (!range || range.collapsed) {\n return null;\n }\n\n const startBlock = getBlockElementByChild(range.startContainer);\n const endBlock = getBlockElementByChild(range.endContainer);\n\n if (!startBlock || !endBlock) {\n return null;\n }\n\n const startSelectable =\n getSelectableElementByChild(range.startContainer) ??\n getBlockContentRoot(startBlock);\n const endSelectable =\n getSelectableElementByChild(range.endContainer) ??\n getBlockContentRoot(endBlock);\n\n return {\n startBlock,\n endBlock,\n startOffset: getOffsetInSelectable(\n startSelectable,\n range.startContainer,\n range.startOffset,\n ),\n endOffset: getOffsetInSelectable(\n endSelectable,\n range.endContainer,\n range.endOffset,\n ),\n };\n}\n\n/**\n * Apply a `getSelectionState()` snapshot to the live DOM.\n * @param {import('#src/types.mjs').SelectionState | null | undefined} state\n */\nfunction restoreSelectionState(state) {\n if (!state) {\n return;\n }\n\n const { start, end, element, selectableElement } = state;\n const target =\n (selectableElement?.isConnected && selectableElement) ||\n getBlockContentRoot(element) ||\n element?.childNodes?.[0];\n\n if (!target) {\n return;\n }\n\n const startRange = createRange(target, start);\n const endRange = createRange(target, end);\n\n const range = document.createRange();\n range.setStart(startRange.startContainer, startRange.startOffset);\n range.setEnd(endRange.endContainer, endRange.endOffset);\n\n const selection = getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n}\n\n/**\n * Collapsed Range at a character offset inside `node`.\n * @param {Node | null | undefined} node\n * @param {number} targetPosition\n * @returns {Range}\n */\nfunction createRange(node, targetPosition) {\n const range = document.createRange();\n\n if (!node) {\n return range;\n }\n\n // Empty contenteditables often only contain <br> (no text nodes). Place the\n // caret at the start of the element instead of after its children.\n if (targetPosition <= 0) {\n range.setStart(node, 0);\n range.collapse(true);\n return range;\n }\n\n let pos = 0;\n const stack = [node];\n while (stack.length > 0) {\n const current = stack.pop();\n\n if (current.nodeType === Node.TEXT_NODE) {\n const len = current.textContent.length;\n if (pos + len >= targetPosition) {\n range.setEnd(current, targetPosition - pos);\n range.setStart(current, targetPosition - pos);\n return range;\n }\n pos += len;\n } else if (current.childNodes && current.childNodes.length > 0) {\n for (let i = current.childNodes.length - 1; i >= 0; i--) {\n stack.push(current.childNodes[i]);\n }\n }\n }\n\n // The target position is greater than the\n // length of the contenteditable element.\n range.setEnd(node, node.childNodes.length);\n range.setStart(node, node.childNodes.length);\n return range;\n}\n\n/**\n * Place the caret at a character offset inside `contentEle`.\n * @param {Node} contentEle\n * @param {number} targetPosition\n */\nfunction setCursorPosition(contentEle, targetPosition) {\n const range = createRange(contentEle, targetPosition);\n const selection = getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n}\n\n/**\n * Block body first child \u2014 the contenteditable root (`<p>`, `<ul>`, \u2026).\n * @param {Element | null | undefined} element block wrapper\n * @returns {Node | null}\n */\nfunction getBlockContentRoot(element) {\n if (!element) {\n return null;\n }\n\n const body = getBlockElementBody(element);\n return body?.firstElementChild ?? body?.firstChild;\n}\n\n/**\n * Block component instance mounted inside the wrapper.\n * @param {Element | null | undefined} element\n * @returns {import('#src/types.mjs').BlockInstance | null}\n */\nfunction getBlockElementInstance(element) {\n if (!element || !element[BLOCK_ELEMENT]) {\n return null;\n }\n\n return getNodeComponent(getBlockContentRoot(element))?.classInstance;\n}\n\n/**\n * Child of the block wrapper marked `BLOCK_ELEMENT_BODY`.\n * @param {Element | null | undefined} element\n * @returns {Element | null}\n */\nfunction getBlockElementBody(element) {\n if (!element) return null;\n for (const child of element.children) {\n if (child[BLOCK_ELEMENT_BODY]) return child;\n }\n return null;\n}\n\n/**\n * Position an overlay above an anchor, coordinates relative to the editor root.\n * @param {Element} root\n * @param {Element | DOMRect | { left: number, top: number }} anchor\n * @param {Element | null | undefined} overlayEl\n * @param {number} [offsetY]\n * @returns {{ x: number, y: number }}\n */\nfunction positionAboveAnchor(root, anchor, overlayEl, offsetY = 12) {\n const rootRect = root.getBoundingClientRect();\n const elRect =\n typeof anchor?.getBoundingClientRect === 'function'\n ? anchor.getBoundingClientRect()\n : (anchor ?? { left: 0, top: 0 });\n const height = overlayEl?.offsetHeight ?? 40;\n\n return {\n x: elRect.left - rootRect.left,\n y: elRect.top - rootRect.top - height - offsetY,\n };\n}\n\nexport {\n storeGlobalSelectionState,\n restoreGlobalSelectionState,\n collapseGlobalSelectionState,\n clearGlobalSelectionState,\n createComponentId,\n getBlockElementInstance,\n getBlockContentRoot,\n getBlockElementByChild,\n getBlockElementBody,\n setCursorPosition,\n getSelectionState,\n getCrossBlockSelectionState,\n restoreSelectionState,\n getCursorPosition,\n getOffsetInSelectable,\n getRange,\n BLOCK_ELEMENT,\n BLOCK_ELEMENT_BODY,\n SELECTABLE_ELEMENT,\n getBlockElementByRange,\n getSelectableElementByRange,\n positionAboveAnchor,\n};\n", "/**\n * Leaf block-namespace IDs.\n * Safe to import from helpers/config without pulling component classes\n * (avoids circular imports such as helpers \u2194 Paragraph).\n */\n\n/** Default body text block; Enter after atomic blocks, unwraps, clipboard fallback. */\nexport const PARAGRAPH_NAMESPACE = 'molecule.paragraph.Paragraph';\n\nexport const LIST_NAMESPACE = 'molecule.list.List';\n\nexport const EXTERNAL_NAMESPACE = 'molecule.external.ExternalComponent';\n\nexport const UNKNOWN_NAMESPACE = 'namespace.unknown.UnknownComponent';\n\nexport const HEADLINE_H1_NAMESPACE = 'molecule.headline.H1';\nexport const HEADLINE_H2_NAMESPACE = 'molecule.headline.H2';\nexport const HEADLINE_H3_NAMESPACE = 'molecule.headline.H3';\nexport const HEADLINE_H4_NAMESPACE = 'molecule.headline.H4';\nexport const HEADLINE_H5_NAMESPACE = 'molecule.headline.H5';\n\n/** Prefix used by isTextBlock checks for any headline level. */\nexport const HEADLINE_NAMESPACE_PREFIX = 'molecule.headline.';\n", "import { createContext } from '@esmj/dom';\n\nexport const EditorContext = createContext();\n", "import { Component, getContext, useRef } from '@esmj/dom';\nimport { s } from '@esmj/schema';\nimport { createSignal } from '@esmj/signals';\n\nimport { EditorContext } from './editorContext.mjs';\n\nexport class AbstractComponent extends Component {\n /** @type {import('#src/types.mjs').Signal<import('#src/types.mjs').BlockState>} */\n state;\n /** @type {Element | null} */\n element;\n /** @type {import('#src/types.mjs').Mrakomor} */\n mrakomor;\n\n constructor(props) {\n super(props);\n const { state: initialState, observeDOMChanges = true } = props ?? {};\n\n this.state = initialState;\n this.element = null;\n this.mrakomor = getContext(EditorContext);\n\n this._stale = false;\n this._observer = null;\n this._observeDOMChanges = observeDOMChanges;\n }\n\n static get NAMESPACE() {\n return 'namespace.AbstractComponent';\n }\n\n static getStateSchema() {\n return s\n .object({\n component: s.string().default(this.NAMESPACE),\n properties: s.object().default({}),\n settings: s.object().default({}),\n })\n .default({});\n }\n\n static getPropsSchema() {\n return s\n .object({\n state: this.getStateSchema(),\n observeDOMChanges: s.boolean().default(true),\n })\n .default({});\n }\n\n /**\n * Validate newState through the schema and write it to the signal.\n * Always call this instead of writing to this.state directly.\n */\n // setState(newState) {\n // this.state.set(this.getStateSchema().parse(newState));\n // }\n\n parseFromHTML(node) {\n const newState = this.constructor.getStateSchema(node).parse();\n\n return newState;\n }\n\n getState() {\n if (this._stale) {\n const node = this.element;\n const newState = this.parseFromHTML(node);\n\n return newState;\n }\n\n return this.state.peek();\n }\n\n // /**\n // * Read the current DOM and push the result back into the state signal.\n // * Call this manually before reading the editor content (e.g. on save).\n // */\n // syncFromDOM() {\n // if (this.element) {\n // console.log('setState from DOM', this.constructor.NAMESPACE, this.parseFromHTML(this.element));\n // this.setState(this.parseFromHTML(this.element));\n // this._stale = false;\n // }\n // }\n\n onMount() {\n if (this.element && this._observeDOMChanges) {\n this._observer = new MutationObserver(() => {\n this._stale = true;\n //this.syncFromDOM();\n });\n this._observer.observe(this.element, {\n subtree: true,\n characterData: true,\n characterDataOldValue: true,\n childList: true,\n attributes: true,\n attributeOldValue: true,\n });\n }\n }\n\n onUnmount() {\n if (this._observer) {\n this._observer.disconnect();\n this._observer = null;\n this._stale = false;\n }\n }\n}\n\n// Keep the old name as an alias so existing code importing SAbstractComponent keeps working.\nexport { AbstractComponent as SAbstractComponent };\n", "import { createElement, mount } from '@esmj/dom';\n\nimport {\n createComponentId,\n getCursorPosition,\n getOffsetInSelectable,\n getRange,\n} from '#src/dom.mjs';\nimport { PARAGRAPH_NAMESPACE, HEADLINE_NAMESPACE_PREFIX } from '#src/namespaces.mjs';\n\n/**\n * @typedef {import('#src/types.mjs').BlockState} BlockState\n * @typedef {import('#src/types.mjs').RichTextState} RichTextState\n * @typedef {import('#src/types.mjs').InlineStyleRange} InlineStyleRange\n * @typedef {import('#src/types.mjs').EntityRange} EntityRange\n * @typedef {import('#src/types.mjs').RichTextComponents} RichTextComponents\n * @typedef {import('#src/types.mjs').SplitBlockResult} SplitBlockResult\n * @typedef {import('#src/types.mjs').ContentMutation} ContentMutation\n * @typedef {import('#src/types.mjs').ClipboardSelection} ClipboardSelection\n * @typedef {import('#src/types.mjs').RichTextBlockInstance} RichTextBlockInstance\n * @typedef {import('#src/types.mjs').RangeMeta} RangeMeta\n */\n\n/**\n * Empty contenteditable often serializes as a lone newline; treat that as `''`.\n * @param {string | null | undefined} text\n * @returns {string}\n */\nexport function normalizeBlockText(text) {\n return text === '\\n' || text === '\\r\\n' ? '' : (text ?? '');\n}\n\n/**\n * Paragraph or headline \u2014 blocks with `properties.text`.\n * @param {BlockState} state\n * @returns {boolean}\n */\nexport function isTextBlock(state) {\n const component = state?.component ?? '';\n return (\n component === PARAGRAPH_NAMESPACE ||\n component.startsWith(HEADLINE_NAMESPACE_PREFIX)\n );\n}\n\n/**\n * List block \u2014 `properties.items` is an array.\n * @param {BlockState} state\n * @returns {boolean}\n */\nexport function isListBlock(state) {\n return Array.isArray(state?.properties?.items);\n}\n\n/**\n * Two text blocks of the same component can merge on paste/delete.\n * @param {BlockState} left\n * @param {BlockState} right\n * @returns {boolean}\n */\nexport function canMergeBlocks(left, right) {\n return (\n isTextBlock(left) &&\n isTextBlock(right) &&\n left.component === right.component\n );\n}\n\n/**\n * Sorted unique offsets that bound every inline/entity range inside `textLength`.\n * @param {Array<{ offset: number, length: number }>} ranges\n * @param {number} textLength\n * @returns {number[]}\n */\nfunction collectRangeBreakpoints(ranges, textLength) {\n const breakpoints = new Set([0, textLength]);\n\n for (const range of ranges) {\n breakpoints.add(range.offset);\n breakpoints.add(range.offset + range.length);\n }\n\n return [...breakpoints].sort((a, b) => a - b);\n}\n\n/**\n * Ranges that fully cover the `[start, end)` text segment.\n * @template {{ offset: number, length: number }} Range\n * @param {Range[]} ranges\n * @param {number} start\n * @param {number} end\n * @returns {Range[]}\n */\nfunction getRangesCoveringSegment(ranges, start, end) {\n return ranges.filter(\n (range) => range.offset <= start && range.offset + range.length >= end,\n );\n}\n\n/**\n * Nested vDOM for one text segment with all active inline styles and entity\n * ranges applied (entity wraps inline).\n *\n * @param {string} substring\n * @param {InlineStyleRange[]} inlineRanges\n * @param {EntityRange[]} entityRanges\n * @param {RichTextComponents} components\n * @returns {string | Node | object}\n */\nexport function buildRichTextSegment(\n substring,\n inlineRanges,\n entityRanges,\n { inlineStyleComponents, entityRangeComponents },\n) {\n let content = substring;\n\n for (const range of inlineRanges) {\n const InlineStyle = inlineStyleComponents.find((Component) =>\n Component.match(range),\n );\n if (InlineStyle) {\n content = createElement(InlineStyle, {}, content);\n }\n }\n\n for (const range of entityRanges) {\n const EntityRange = entityRangeComponents.find((Component) =>\n Component.match(range),\n );\n if (EntityRange) {\n content = createElement(EntityRange, range, content);\n }\n }\n\n return content;\n}\n\n/**\n * Render paragraph rich text without duplicating overlapping ranges.\n *\n * @param {RichTextState} state block state with `properties.text` / ranges\n * @param {RichTextComponents} components\n * @returns {DocumentFragment}\n */\nexport function buildRichTextFragment(\n state,\n { inlineStyleComponents, entityRangeComponents },\n) {\n const fragment = document.createDocumentFragment();\n const text = normalizeBlockText(state.properties.text);\n const inlineStyleRanges = state.properties.inlineStyleRanges ?? [];\n const entityRanges = state.properties.entityRanges ?? [];\n\n if (!text) {\n return fragment;\n }\n\n const breakpoints = collectRangeBreakpoints(\n [...inlineStyleRanges, ...entityRanges],\n text.length,\n );\n\n for (let index = 0; index < breakpoints.length - 1; index += 1) {\n const start = breakpoints[index];\n const end = breakpoints[index + 1];\n\n if (start >= end) {\n continue;\n }\n\n const substring = text.slice(start, end);\n const segmentNode = buildRichTextSegment(\n substring,\n getRangesCoveringSegment(inlineStyleRanges, start, end),\n getRangesCoveringSegment(entityRanges, start, end),\n { inlineStyleComponents, entityRangeComponents },\n );\n\n mount(fragment, segmentNode);\n }\n\n return fragment;\n}\n\n/**\n * Walk block child nodes and collect inline/entity ranges with correct offsets.\n * Recurses into matched inline/entity elements so nested markup round-trips.\n *\n * @param {NodeList | Node[]} childNodes\n * @param {RichTextState} state mutated; ranges are pushed onto `properties`\n * @param {number} offset starting character index\n * @param {RichTextComponents} components\n * @returns {number} character index after the last consumed node\n */\nexport function parseRichTextChildNodes(\n childNodes,\n state,\n offset,\n { inlineStyleComponents, entityRangeComponents },\n) {\n let cursor = offset;\n\n for (const child of childNodes) {\n if (child.nodeType === Node.TEXT_NODE) {\n cursor += child.textContent.length;\n continue;\n }\n\n if (child.nodeType !== Node.ELEMENT_NODE) {\n continue;\n }\n\n if (child.nodeName === 'BR') {\n continue;\n }\n\n const inlineStyle = inlineStyleComponents.find((Component) =>\n Component.match(child),\n );\n\n if (inlineStyle) {\n const length = child.textContent.length;\n state.properties.inlineStyleRanges.push({\n style: inlineStyle.style,\n offset: cursor,\n length,\n });\n cursor = parseRichTextChildNodes(child.childNodes, state, cursor, {\n inlineStyleComponents,\n entityRangeComponents,\n });\n continue;\n }\n\n const entityRange = entityRangeComponents.find((Component) =>\n Component.match(child),\n );\n\n if (entityRange) {\n const length = child.textContent.length;\n state.properties.entityRanges.push({\n ...entityRange.getStateSchema(child).parse(),\n offset: cursor,\n length,\n });\n cursor = parseRichTextChildNodes(child.childNodes, state, cursor, {\n inlineStyleComponents,\n entityRangeComponents,\n });\n continue;\n }\n\n cursor = parseRichTextChildNodes(child.childNodes, state, cursor, {\n inlineStyleComponents,\n entityRangeComponents,\n });\n }\n\n return cursor;\n}\n\n/**\n * Concatenate two text-block states: `original` text then `newData` text,\n * shifting `newData` ranges by the original length.\n *\n * @param {RichTextState} original\n * @param {RichTextState} newData\n * @returns {{ state: RichTextState, cursor: number }} merged state and caret at the join\n */\nexport function deepMergeBlockState(original, newData) {\n const originalText = normalizeBlockText(original.properties.text);\n const newText = normalizeBlockText(newData.properties.text);\n\n return {\n state: {\n ...original,\n properties: {\n ...newData.properties,\n ...original.properties,\n text: originalText + newText,\n inlineStyleRanges: [\n ...(original.properties.inlineStyleRanges ?? []),\n ...(newData.properties.inlineStyleRanges ?? []).map(\n (inlineStyleRange) => {\n return {\n ...inlineStyleRange,\n offset: inlineStyleRange.offset + originalText.length,\n };\n },\n ),\n ],\n entityRanges: [\n ...(original.properties.entityRanges ?? []),\n ...(newData.properties.entityRanges ?? []).map((entityRange) => {\n return {\n ...entityRange,\n offset: entityRange.offset + originalText.length,\n };\n }),\n ],\n },\n settings: {\n ...newData.settings,\n ...original.settings,\n },\n },\n cursor: originalText.length,\n };\n}\n\n/**\n * Trim selection across blocks and merge remnants into one block.\n * Keeps the start block's identity; removes indexes startIndex..endIndex.\n *\n * @param {BlockState[]} content\n * @param {ClipboardSelection} selection\n * @returns {ContentMutation}\n */\nexport function mergeBlocksAcrossSelection(\n content,\n { startIndex, endIndex, startOffset, endOffset },\n) {\n const next = [...content];\n const startState = next[startIndex];\n const endState = next[endIndex];\n\n const { originalLineState: leftKeep } = splitStateByCursor(\n startState,\n startOffset,\n );\n const { newLineState: rightKeep } = splitStateByCursor(endState, endOffset);\n const { state, cursor } = deepMergeBlockState(leftKeep, rightKeep);\n\n next.splice(startIndex, endIndex - startIndex + 1, state);\n\n return {\n content: next,\n cursor,\n resultIndex: startIndex,\n };\n}\n\n/**\n * Split a text block at `cursor`: before keeps the original `componentId`,\n * after gets a new one. Inline and entity ranges are clipped/shifted.\n *\n * @param {RichTextState} state\n * @param {number} cursor\n * @returns {SplitBlockResult}\n */\nexport function splitStateByCursor(state, cursor) {\n const before = structuredClone(state);\n const after = structuredClone(state);\n\n before.properties.text = state.properties.text.slice(0, cursor);\n after.properties.text = state.properties.text.slice(cursor);\n\n before.properties.inlineStyleRanges = (\n state.properties.inlineStyleRanges ?? []\n )\n .filter((r) => r.offset < cursor)\n .map((r) => ({ ...r, length: Math.min(r.length, cursor - r.offset) }));\n\n after.properties.inlineStyleRanges = (\n state.properties.inlineStyleRanges ?? []\n )\n .filter((r) => r.offset + r.length > cursor)\n .map((r) => ({\n ...r,\n offset: Math.max(0, r.offset - cursor),\n length: r.offset + r.length - Math.max(r.offset, cursor),\n }));\n\n before.properties.entityRanges = (state.properties.entityRanges ?? [])\n .filter((r) => r.offset < cursor)\n .map((r) => ({ ...r, length: Math.min(r.length, cursor - r.offset) }));\n\n after.properties.entityRanges = (state.properties.entityRanges ?? [])\n .filter((r) => r.offset + r.length > cursor)\n .map((r) => ({\n ...r,\n offset: Math.max(0, r.offset - cursor),\n length: r.offset + r.length - Math.max(r.offset, cursor),\n }));\n\n after.componentId = createComponentId();\n\n return { originalLineState: before, newLineState: after };\n}\n\n/**\n * Split a text block at the caret and insert the remainder as a new block.\n * Used by Paragraph and Headline on Enter \u2014 not a BlockComponent protocol.\n *\n * @param {RichTextBlockInstance} block\n * @param {import('#src/types.mjs').KeydownEvent} event\n * @param {{ namespace?: string }} [options]\n * @returns {boolean} whether Enter was handled\n */\nexport function splitAtCursorAndInsert(\n block,\n event,\n { namespace = block.constructor.NAMESPACE } = {},\n) {\n if (event.key !== 'Enter') {\n return false;\n }\n\n event.preventDefault();\n\n const { originalLineState, newLineState } = splitStateByCursor(\n block.getState(),\n getCursorPosition(block.element),\n );\n\n block.mrakomor.command.insertBlockElement({\n range: getRange(),\n cursor: 0,\n newLineState,\n originalLineState,\n namespace,\n });\n\n return true;\n}\n\n/**\n * Insert an empty paragraph below the current selection (non-splitting blocks).\n * @param {{ mrakomor: import('#src/types.mjs').Mrakomor }} block\n * @param {import('#src/types.mjs').KeydownEvent} event\n * @returns {boolean} whether Enter was handled\n */\nexport function insertEmptyParagraphBelow(block, event) {\n if (event.key !== 'Enter') {\n return false;\n }\n\n event.preventDefault();\n\n const namespace = PARAGRAPH_NAMESPACE;\n const Constructor = block.mrakomor.resolveComponentConstructor(namespace);\n\n block.mrakomor.command.insertBlockElement({\n range: getRange(),\n cursor: 0,\n newLineState: block.mrakomor.normalizeComponentState(\n Constructor.getStateSchema().parse({}),\n ),\n namespace,\n });\n\n return true;\n}\n\n/**\n * Parse a rich-text block from DOM: schema defaults plus inline/entity ranges\n * from child nodes.\n *\n * @param {RichTextBlockInstance} block\n * @param {Element | null | undefined} node\n * @returns {RichTextState}\n */\nexport function parseRichTextBlock(block, node) {\n const Constructor =\n /** @type {import('#src/types.mjs').BlockConstructor} */ (\n block.constructor\n );\n\n if (!node) {\n return /** @type {RichTextState} */ (\n Constructor.getStateSchema(node).parse()\n );\n }\n\n const newState = /** @type {RichTextState} */ (\n structuredClone(Constructor.getStateSchema(node).parse())\n );\n\n parseRichTextChildNodes(node.childNodes, newState, 0, {\n inlineStyleComponents: block.getInlineStyleComponents(),\n entityRangeComponents: block.getEntityRangeComponents(),\n });\n\n newState.properties.text = normalizeBlockText(newState.properties.text);\n\n return newState;\n}\n\n/**\n * Formatting target for a block whose ranges live on `state.properties`.\n *\n * @param {Element | null | undefined} element\n * @returns {import('#src/types.mjs').FormattingTarget<import('#src/types.mjs').TextBlockState> | null}\n */\nexport function blockPropertiesFormattingTarget(element) {\n if (!element) {\n return null;\n }\n\n return {\n element,\n read(state) {\n return {\n inlineStyleRanges: state.properties?.inlineStyleRanges,\n entityRanges: state.properties?.entityRanges,\n };\n },\n write(state, { inlineStyleRanges, entityRanges }) {\n if (inlineStyleRanges !== undefined) {\n state.properties.inlineStyleRanges = inlineStyleRanges;\n }\n if (entityRanges !== undefined) {\n state.properties.entityRanges = entityRanges;\n }\n },\n };\n}\n\n/**\n * Computes text-range metadata (`offset` and `length`) for a DOM `Range`\n * relative to the concatenated text content of a root element.\n *\n * @function getEntityRangeMeta\n * @param {Element} element - Root element used as the text traversal boundary.\n * @param {Range} range - DOM Range whose start position is used to compute the offset.\n * @returns {RangeMeta} Range metadata:\n * - `offset`: zero-based character index from the start of `element` text content to `range.startContainer + range.startOffset`\n * - `length`: selected character count (`range.endOffset - range.startOffset`)\n *\n */\nexport function getEntityRangeMeta(element, range) {\n const offset = getOffsetInSelectable(\n element,\n range.startContainer,\n range.startOffset,\n );\n const end = getOffsetInSelectable(\n element,\n range.endContainer,\n range.endOffset,\n );\n\n return {\n offset,\n length: Math.max(0, end - offset),\n };\n}\n\n/**\n * Toggle an inline style over a selection: remove a covering same-style range,\n * otherwise append a new range.\n * @param {InlineStyleRange[]} ranges\n * @param {InlineStyleRange} next\n * @returns {InlineStyleRange[]}\n */\nexport function toggleInlineStyleRange(ranges, { style, offset, length }) {\n const list = ranges ?? [];\n const selEnd = offset + length;\n const existing = list.find(\n (r) =>\n r.style === style &&\n r.offset <= offset &&\n r.offset + r.length >= selEnd,\n );\n\n if (existing) {\n return list.filter((r) => r !== existing);\n }\n\n return [...list, { style, offset, length }];\n}\n\n/**\n * Toggle an entity range: remove a covering same-type entity, otherwise push.\n * Returns `null` when length is 0 or a different-type entity covers the selection.\n * @param {EntityRange[]} ranges\n * @param {EntityRange} entityRangeState\n * @returns {EntityRange[] | null}\n */\nexport function toggleEntityRange(ranges, entityRangeState) {\n const list = ranges ?? [];\n const length = entityRangeState?.length ?? 0;\n const offset = entityRangeState?.offset ?? 0;\n const type = entityRangeState?.entity?.type;\n const newEnd = offset + length;\n\n const collision = list.find((entityRange) => {\n const start = entityRange.offset;\n const end = entityRange.offset + entityRange.length;\n return offset >= start && newEnd <= end;\n });\n\n if (collision) {\n if (collision.entity?.type === type) {\n return list.filter((r) => r !== collision);\n }\n return null;\n }\n\n if (length === 0) {\n return null;\n }\n\n return [...list, entityRangeState];\n}\n\n/**\n * Apply inline-style toggle onto a block state via a formatting target.\n * Mutates `blockState` (caller should clone). Returns the state or null.\n */\nexport function applyInlineStyleRange(blockState, target, { style, range }) {\n if (!blockState || !target?.element || !range) {\n return null;\n }\n\n const current = target.read(blockState);\n if (current?.inlineStyleRanges === undefined) {\n return null;\n }\n\n const { offset, length } = getEntityRangeMeta(target.element, range);\n if (length === 0) {\n return null;\n }\n\n target.write(blockState, {\n inlineStyleRanges: toggleInlineStyleRange(current.inlineStyleRanges ?? [], {\n style,\n offset,\n length,\n }),\n });\n\n return blockState;\n}\n\n/**\n * Apply entity-range toggle onto a block state via a formatting target.\n * Mutates `blockState` (caller should clone). Returns the state or null.\n */\nexport function applyEntityRange(\n blockState,\n target,\n { state, namespace, range },\n) {\n if (!blockState || !target?.element || !range) {\n return null;\n }\n\n const current = target.read(blockState);\n if (current?.entityRanges === undefined) {\n return null;\n }\n\n const entityRangeState = {\n ...state,\n entity: {\n type: namespace,\n ...state?.entity,\n },\n ...getEntityRangeMeta(target.element, range),\n };\n\n const nextRanges = toggleEntityRange(\n current.entityRanges ?? [],\n entityRangeState,\n );\n\n if (nextRanges === null) {\n return null;\n }\n\n target.write(blockState, { entityRanges: nextRanges });\n return blockState;\n}\n", "import { afterRender } from '@esmj/dom';\n\nimport { AbstractComponent } from '../AbstractComponent.mjs';\nimport { normalizeBlockText } from './helpers.mjs';\nimport { setCursorPosition } from '#src/dom.mjs';\n\n/**\n * Base class for content blocks (paragraph, headline, list, figure, \u2026).\n * Subclasses override `onKeydown` for block-owned keys and may override\n * `setCursor` / `isAtomic` for neighbor Backspace behavior.\n */\nexport class BlockComponent extends AbstractComponent {\n /**\n * Dotted component namespace for this block type.\n * @returns {string}\n */\n static get NAMESPACE() {\n return 'namespace.block.BlockComponent';\n }\n\n /**\n * Visual label for insert menus / tooltip toolbar (string or renderable).\n * @returns {string | Function}\n */\n static get LABEL() {\n return '';\n }\n\n /**\n * Whether Backspace on an empty neighbor should remove this block.\n * Non-atomic blocks receive the cursor via `setCursor` instead.\n * @returns {boolean}\n */\n isAtomic() {\n return false;\n }\n\n /**\n * Place the cursor in this block\u2019s selectable root.\n * Omitting `cursor` places it at the end of `properties.text`.\n * Restores immediately and again in `afterRender`.\n * @param {number} [cursor] character offset in the selectable root\n * @returns {void}\n */\n setCursor(cursor) {\n const restore = () => {\n if (!this.element?.isConnected) {\n return;\n }\n\n const offset =\n typeof cursor === 'number'\n ? cursor\n : normalizeBlockText(this.getState()?.properties?.text).length;\n\n setCursorPosition(this.element, offset);\n };\n\n restore();\n afterRender(restore);\n }\n\n /**\n * Handle keydown while this block is focused. Override in subclasses.\n * Call `event.preventDefault()` when the block owns the key so default\n * Backspace merge / insert is skipped (`unlessPrevented`).\n * @param {import('#src/types.mjs').KeydownEvent} event\n * @returns {void}\n */\n onKeydown(_event) {}\n\n /**\n * Target for standard INSERT_INLINE_STYLE_RANGE / INSERT_ENTITY_RANGE.\n * Default `null` means the block does not use the shared range path.\n * @param {Range | null} _range\n * @returns {import('#src/types.mjs').FormattingTarget<*> | null}\n */\n getFormattingTarget(_range) {\n return null;\n }\n}\n", "import { createElement } from '@esmj/dom';\nimport { s } from '@esmj/schema';\nimport { createComponentId, SELECTABLE_ELEMENT } from '#src/dom.mjs';\nimport { EXTERNAL_NAMESPACE } from '#src/namespaces.mjs';\nimport { BlockComponent } from './BlockComponent.mjs';\nimport { insertEmptyParagraphBelow } from './helpers.mjs';\n\n/**\n * Non-text embed block (CMS external widget). Hosts opaque content in\n * `this.root` and a thin contenteditable strip so the block can take focus.\n * Atomic: empty neighbor Backspace removes this block.\n */\nexport class ExternalComponent extends BlockComponent {\n /**\n * Dotted component namespace for external embeds.\n * @returns {string}\n */\n static get NAMESPACE() {\n return EXTERNAL_NAMESPACE;\n }\n\n /**\n * Schema for external block state (`component`, `componentId`, empty props/settings).\n * @param {Element | null | undefined} node\n * @returns {*}\n */\n static getStateSchema(node) {\n return s\n .object({\n component: s.string().default(this.NAMESPACE),\n componentId: s\n .string()\n .default(\n node?.getAttribute('data-componentid') || createComponentId(),\n ),\n properties: s.object({}).default({}),\n settings: s.object({}).default({}),\n })\n .default({});\n }\n\n /**\n * @param {object} props\n */\n constructor(props) {\n super(props);\n\n /** @type {Element | null} host for embed content */\n this.root = null;\n }\n\n /**\n * Current signal value (external blocks do not re-parse from DOM).\n * @returns {import('#src/types.mjs').BlockState}\n */\n getState() {\n return this.state.peek();\n }\n\n /**\n * External / figure blocks are removed when Backspace hits an empty neighbor.\n * @returns {boolean}\n */\n isAtomic() {\n return true;\n }\n\n /**\n * Hook for subclasses to mount embed UI into `this.root`.\n * @returns {void}\n */\n onMount() {}\n\n /**\n * Hook for subclasses to tear down embed UI.\n * @returns {void}\n */\n onUnmount() {}\n\n /**\n * Opaque container plus a focusable strip for selection / Enter.\n * @returns {*}\n */\n render() {\n const className = this.constructor.NAMESPACE.toLowerCase().replaceAll(\n '.',\n '-',\n );\n const element = createElement(\n 'div',\n {\n className,\n contentEditable: false,\n style: 'position: relative;',\n $ref: this.element,\n 'data-state': () => JSON.stringify(this.state.get()),\n 'data-componentid': this.state.peek().componentId,\n },\n [\n createElement('div', {\n $ref: (el) => {\n this.root = el;\n },\n style: 'display: block;',\n contentEditable: false,\n }),\n createElement(\n 'span',\n {\n style:\n 'position: absolute; bottom: 0; right: 0; width: 10px; height: 100%; outline: none;',\n contentEditable: true,\n [SELECTABLE_ELEMENT]: true,\n },\n document.createTextNode('\\u00A0'),\n ),\n ],\n );\n\n return element;\n }\n\n /**\n * Suppress most typing; Enter inserts an empty paragraph below.\n * @param {import('#src/types.mjs').KeydownEvent} event\n * @returns {void}\n */\n onKeydown(event) {\n if (\n event.key !== 'Backspace' &&\n event.key !== 'ArrowUp' &&\n event.key !== 'ArrowDown'\n ) {\n event.preventDefault();\n }\n\n insertEmptyParagraphBelow(this, event);\n }\n}\n", "import { createElement, mount } from '@esmj/dom';\nimport { s } from '@esmj/schema';\nimport { createComponentId } from '#src/dom.mjs';\n\nimport { ExternalComponent } from './ExternalComponent.mjs';\n\nexport class Figure extends ExternalComponent {\n static get NAMESPACE() {\n return 'molecule.figure.Figure';\n }\n\n static get LABEL() {\n return 'Figure';\n }\n\n static getStateSchema(node) {\n return s\n .object({\n component: s.string().default(this.NAMESPACE),\n componentId: s\n .string()\n .default(node?.getAttribute('data-componentid') || createComponentId()),\n properties: s\n .object({\n media: s.string().default(''),\n text: s.string().default(''),\n })\n .default({}),\n settings: s\n .object({\n trim: s.string().default('original'),\n })\n .default({}),\n })\n .default({});\n }\n\n onMount() {\n const figure = createElement('img', {\n src: this.state.peek().properties.media,\n alt: this.state.peek().properties.text,\n style: 'max-width: 100%; height: auto;',\n });\n\n mount(this.root, figure);\n }\n\n onUnmount() {\n this.root.innerHTML = '';\n }\n}\n\n/**\n * Registers the Figure block type.\n * @returns {import('#src/types.mjs').Plugin}\n */\nexport function figurePlugin() {\n return {\n resolveConfig: (config) => {\n config.blockComponents.push(Figure);\n return config;\n },\n resolveComponent: (namespace) => {\n if (namespace === Figure.NAMESPACE) {\n return Figure;\n }\n },\n };\n}\n", "import { s } from '@esmj/schema';\n\nimport { createComponentId } from '#src/dom.mjs';\n\n/**\n * Whether `value` is a DOM Element (jsdom / browser).\n * @param {*} value\n * @returns {boolean}\n */\nfunction isDomElement(value) {\n return (\n value != null &&\n typeof value === 'object' &&\n (typeof Element === 'undefined'\n ? value.nodeType === 1\n : value instanceof Element)\n );\n}\n\n/**\n * Public `createMrakomor(config)` input. Call `.parse(config)` to throw on invalid values.\n * Parse for validation only \u2014 merge the original `config` afterward so unknown keys are kept.\n * @returns {*} `@esmj/schema` object schema\n */\nexport function createMrakomorConfigSchema() {\n return s.object({\n root: s.any().refine(isDomElement, {\n message: 'root must be a DOM Element',\n }),\n id: s.string().optional(),\n debug: s.boolean().optional(),\n content: s.array(s.any()).optional(),\n plugins: s.array(s.function()).optional(),\n blockComponents: s.array(s.function()).optional(),\n inlineStyles: s.array(s.function()).optional(),\n entityRanges: s.array(s.function()).optional(),\n insertableBlocks: s.array(s.string()).optional(),\n blockInsertVariants: s\n .array(\n s.object({\n namespace: s.string(),\n label: s.string(),\n settings: s.object({}).optional(),\n }),\n )\n .optional(),\n tooltip: s.any().optional(),\n });\n}\n\n/**\n * Schema for one inline style range: `{ length, offset, style }`.\n * @returns {*} `@esmj/schema` object schema\n */\nexport function inlineStyleRangeSchema() {\n return s.object({\n length: s.number(),\n offset: s.number(),\n style: s.string(),\n });\n}\n\n/**\n * One entity range: `{ entity: { type, data }, length, offset }`.\n *\n * @param {import('#src/types.mjs').EntityRangeSchemaOptions} [options]\n */\nexport function entityRangeSchema({\n type,\n data = s.any(),\n length,\n offset,\n} = {}) {\n const isEntityClass = type != null;\n const entitySchema = s.object({\n type: isEntityClass ? s.string().default(type) : s.string(),\n data,\n });\n const lengthDefault = length ?? (isEntityClass ? 0 : undefined);\n const offsetDefault = offset ?? (isEntityClass ? 0 : undefined);\n\n return s.object({\n entity: isEntityClass ? entitySchema.default({}) : entitySchema,\n length: lengthDefault == null ? s.number() : s.number().default(lengthDefault),\n offset: offsetDefault == null ? s.number() : s.number().default(offsetDefault),\n });\n}\n\n/**\n * `entityRanges` array that keeps only `atom.tts.Voice` entries.\n * @returns {*} `@esmj/schema` array schema\n */\nexport function ttsVoiceEntityRangesSchema() {\n return s\n .array(entityRangeSchema())\n .transform((ranges) =>\n ranges.filter((range) => range.entity.type === 'atom.tts.Voice'),\n )\n .default([]);\n}\n\n/**\n * Shared `{ component, componentId, properties, settings }` block envelope.\n *\n * @param {Element | null | undefined} node HTML used to seed `componentId` / text defaults\n * @param {import('#src/types.mjs').BlockStateSchemaSpec} spec\n * @returns {*} `@esmj/schema` object schema\n */\nexport function blockStateSchema(\n node,\n {\n component,\n properties,\n settings = s.object({}).default({}),\n },\n) {\n return s\n .object({\n component: s.string().default(component),\n componentId: s\n .string()\n .default(node?.getAttribute('data-componentid') || createComponentId()),\n properties: s.object(properties).default({}),\n settings,\n })\n .default({});\n}\n", "import { afterRender, createElement } from '@esmj/dom';\nimport { s } from '@esmj/schema';\nimport { untrack } from '@esmj/signals';\nimport {\n getRange,\n getBlockElementByChild,\n getBlockContentRoot,\n setCursorPosition,\n SELECTABLE_ELEMENT,\n} from '#src/dom.mjs';\nimport { blockStateSchema } from '#src/schema.mjs';\nimport {\n HEADLINE_H1_NAMESPACE,\n HEADLINE_H2_NAMESPACE,\n HEADLINE_H3_NAMESPACE,\n HEADLINE_H4_NAMESPACE,\n HEADLINE_H5_NAMESPACE,\n PARAGRAPH_NAMESPACE,\n} from '#src/namespaces.mjs';\nimport { BlockComponent } from './BlockComponent.mjs';\nimport { normalizeBlockText, splitAtCursorAndInsert } from './helpers.mjs';\n\nexport class HeadlineComponent extends BlockComponent {\n constructor(props) {\n super(props);\n this._level = 1;\n }\n\n static getStateSchema(node) {\n return blockStateSchema(node, {\n component: this.NAMESPACE,\n properties: {\n text: s\n .string()\n .default(node?.textContent ?? node?.innerText ?? ''),\n },\n });\n }\n\n parseFromHTML(node) {\n if (!node) {\n return this.constructor.getStateSchema(node).parse();\n }\n\n const newState = structuredClone(\n this.constructor.getStateSchema(node).parse(),\n );\n newState.properties.text = normalizeBlockText(newState.properties.text);\n return newState;\n }\n\n _buildContent(state) {\n return state.properties?.text ?? '';\n }\n\n render() {\n const className = this.constructor.NAMESPACE.toLowerCase().replaceAll(\n '.',\n '-',\n );\n\n return createElement(`h${this._level}`, {\n className,\n 'data-componentid': this.state.peek().componentId,\n contentEditable: true,\n [SELECTABLE_ELEMENT]: true,\n $ref: (el) => {\n this.element = el;\n },\n $dangerouslySetInnerHTML: () => {\n const state = this.state.get();\n const text = state.properties?.text ?? '';\n\n if (!normalizeBlockText(text)) {\n return '<br>';\n }\n\n return untrack(() => this._buildContent(state));\n },\n });\n }\n\n onKeydown(event) {\n if (event.key === 'Backspace') {\n this.#onBackspace(event);\n return;\n }\n\n splitAtCursorAndInsert(this, event, { namespace: PARAGRAPH_NAMESPACE });\n }\n\n #onBackspace(event) {\n const range = getRange();\n if (!range?.collapsed) {\n return;\n }\n\n const blockElement = getBlockElementByChild(this.element);\n if (blockElement?.previousElementSibling) {\n return;\n }\n\n if (normalizeBlockText(this.getState()?.properties?.text)) {\n return;\n }\n\n event.preventDefault();\n\n this.mrakomor.command.transformBlockElement({\n blockElement,\n namespace: PARAGRAPH_NAMESPACE,\n });\n\n /** Place caret in the demoted first paragraph after remount. */\n const restoreCaret = () => {\n const firstBlock = this.mrakomor\n .getRoot()\n ?.querySelector('.mrakomor-content .mrakomor-block-element');\n const restoreRoot = getBlockContentRoot(firstBlock);\n if (restoreRoot?.isConnected) {\n setCursorPosition(restoreRoot, 0);\n }\n };\n\n restoreCaret();\n afterRender(restoreCaret);\n }\n}\n\nexport class Headline1 extends HeadlineComponent {\n static get NAMESPACE() {\n return HEADLINE_H1_NAMESPACE;\n }\n\n static get LABEL() {\n return 'H1';\n }\n\n constructor(props) {\n super(props);\n this._level = 1;\n }\n}\n\nexport class Headline2 extends HeadlineComponent {\n static get NAMESPACE() {\n return HEADLINE_H2_NAMESPACE;\n }\n\n static get LABEL() {\n return 'H2';\n }\n\n constructor(props) {\n super(props);\n this._level = 2;\n }\n}\n\nexport class Headline3 extends HeadlineComponent {\n static get NAMESPACE() {\n return HEADLINE_H3_NAMESPACE;\n }\n\n static get LABEL() {\n return 'H3';\n }\n\n constructor(props) {\n super(props);\n this._level = 3;\n }\n}\n\nexport class Headline4 extends HeadlineComponent {\n static get NAMESPACE() {\n return HEADLINE_H4_NAMESPACE;\n }\n\n static get LABEL() {\n return 'H4';\n }\n\n constructor(props) {\n super(props);\n this._level = 4;\n }\n}\n\nexport class Headline5 extends HeadlineComponent {\n static get NAMESPACE() {\n return HEADLINE_H5_NAMESPACE;\n }\n\n static get LABEL() {\n return 'H5';\n }\n\n constructor(props) {\n super(props);\n this._level = 5;\n }\n}\n\n/**\n * Registers H1\u2013H5 headline blocks.\n * @returns {import('#src/types.mjs').Plugin}\n */\nexport function headlinePlugin() {\n return {\n resolveConfig: (config) => {\n config.blockComponents.push(Headline1, Headline2, Headline3, Headline4, Headline5);\n return config;\n },\n resolveComponent: (namespace) => {\n if (namespace === Headline1.NAMESPACE) {\n return Headline1;\n }\n if (namespace === Headline2.NAMESPACE) {\n return Headline2;\n }\n if (namespace === Headline3.NAMESPACE) {\n return Headline3;\n }\n if (namespace === Headline4.NAMESPACE) {\n return Headline4;\n }\n if (namespace === Headline5.NAMESPACE) {\n return Headline5;\n }\n }, \n };\n}\n", "import {\n createElement,\n mount,\n getContextFromElement,\n withContext,\n} from '@esmj/dom';\nimport { s } from '@esmj/schema';\nimport { untrack } from '@esmj/signals';\nimport { SELECTABLE_ELEMENT } from '#src/dom.mjs';\nimport { PARAGRAPH_NAMESPACE } from '#src/namespaces.mjs';\nimport {\n blockStateSchema,\n entityRangeSchema,\n inlineStyleRangeSchema,\n} from '#src/schema.mjs';\nimport { BlockComponent } from './BlockComponent.mjs';\nimport {\n buildRichTextFragment,\n parseRichTextBlock,\n blockPropertiesFormattingTarget,\n normalizeBlockText,\n splitAtCursorAndInsert,\n} from './helpers.mjs';\n\n// ---------------------------------------------------------------------------\n// Paragraph component\n// ---------------------------------------------------------------------------\n\nexport class Paragraph extends BlockComponent {\n static get NAMESPACE() {\n return PARAGRAPH_NAMESPACE;\n }\n\n static get LABEL() {\n return 'P';\n }\n\n constructor(props) {\n super(props);\n }\n\n getInlineStyleComponents() {\n return (\n this.props?.inlineStyles?.get() ??\n this.mrakomor.getConfig()?.inlineStyles ??\n []\n );\n }\n\n getEntityRangeComponents() {\n return (\n this.props?.entityRanges?.get() ??\n this.mrakomor.getConfig()?.entityRanges ??\n []\n );\n }\n\n static getStateSchema(node) {\n return blockStateSchema(node, {\n component: this.NAMESPACE,\n properties: {\n entityRanges: s.array(entityRangeSchema()).default([]),\n inlineStyleRanges: s.array(inlineStyleRangeSchema()).default([]),\n text: s\n .string()\n .default(node?.innerText ?? node?.textContent ?? ''),\n },\n });\n }\n\n parseFromHTML(node) {\n return parseRichTextBlock(this, node);\n }\n\n _buildContent(state) {\n return buildRichTextFragment(state, {\n inlineStyleComponents: this.getInlineStyleComponents(),\n entityRangeComponents: this.getEntityRangeComponents(),\n });\n }\n\n // ---------------------------------------------------------------------------\n // Lifecycle\n // ---------------------------------------------------------------------------\n\n render() {\n const className = this.constructor.NAMESPACE.toLowerCase().replaceAll(\n '.',\n '-',\n );\n\n return createElement('p', {\n className,\n 'data-componentid': this.state.peek().componentId,\n //'data-state': () => JSON.stringify(this.state.get()),\n contentEditable: true,\n [SELECTABLE_ELEMENT]: true,\n $ref: (el) => {\n this.element = el;\n },\n $dangerouslySetInnerHTML: () => {\n const state = this.state.get();\n const text = state.properties?.text ?? '';\n\n if (!normalizeBlockText(text)) {\n return '<br>';\n }\n\n return untrack(() => this._buildContent(state));\n },\n });\n }\n\n /**\n * @param {Range | null} [_range]\n * @returns {import('#src/types.mjs').FormattingTarget<import('#src/types.mjs').TextBlockState> | null}\n */\n getFormattingTarget(_range) {\n return blockPropertiesFormattingTarget(this.element);\n }\n\n onKeydown(event) {\n splitAtCursorAndInsert(this, event);\n }\n}\n\n/**\n * Registers the paragraph block type.\n * @returns {import('#src/types.mjs').Plugin}\n */\nexport function paragraphPlugin() {\n return {\n resolveConfig: (config) => {\n config.blockComponents.push(Paragraph);\n\n return config;\n },\n resolveComponent: (namespace) => {\n if (namespace === Paragraph.NAMESPACE) {\n return Paragraph;\n }\n },\n };\n}\n", "import { createElement, mount } from '@esmj/dom';\n\nimport { UNKNOWN_NAMESPACE } from '#src/namespaces.mjs';\nimport { ExternalComponent } from './ExternalComponent.mjs';\n\nexport class UnknownComponent extends ExternalComponent {\n static get NAMESPACE() {\n return UNKNOWN_NAMESPACE;\n }\n\n onMount() {\n const label = createElement(\n 'div',\n {\n style: 'user-select: none;',\n contentEditable: false,\n },\n () => `Unknown component: ${this.state.get().component}`,\n );\n\n mount(this.root, label);\n }\n\n onUnmount() {\n this.root.innerHTML = '';\n }\n}\n", "import {\n createElement,\n Each,\n onMount,\n onUnmount,\n setContext,\n getNodeComponent,\n} from '@esmj/dom';\n\nimport { BLOCK_ELEMENT, getBlockContentRoot } from '../dom.mjs';\nimport { EditorContext } from './editorContext.mjs';\n\n/**\n * Editor shell: tools overlay + keyed block list (`Each` by `componentId`).\n * @param {{ mrakomor: import('#src/types.mjs').Signal<import('#src/types.mjs').Mrakomor> }} props\n * @returns {*}\n */\nexport function Editor({ mrakomor: mrakomorSignal }) {\n const mrakomor = mrakomorSignal.get();\n setContext(EditorContext, mrakomor);\n\n onMount(() => {\n mrakomor._onMount();\n });\n\n onUnmount(() => {\n mrakomor._onUnmount();\n });\n\n return createElement(\n 'div',\n {\n id: mrakomor._id,\n className: 'mrakomor-editor',\n contentEditable: true,\n },\n [\n createElement('div', {\n className: 'mrakomor-tools-container',\n style: { width: '100%', height: '100%' },\n }),\n createElement(\n 'div',\n {\n className: 'mrakomor-content',\n style: {\n spellcheck: true,\n outline: 'none',\n },\n },\n [\n Each(\n () => mrakomor._getContentState(),\n (item) => item.componentId,\n (item, index) => {\n return createElement(() => {\n let element;\n\n onMount(() => {\n element.getNodeComponent = () => {\n return getNodeComponent(getBlockContentRoot(element));\n\n //return getNodeComponent(getBlockElementBody(element));\n };\n mrakomor._setBlockElement(element, index);\n });\n onUnmount(() => {\n mrakomor._removeBlockElement(element);\n });\n\n const Component = mrakomor.resolveComponent(\n item.get().component,\n item,\n );\n const blockChildren = mrakomor.wrapBlockElement(Component);\n\n return createElement(\n 'div',\n {\n className: 'mrakomor-block-element',\n [BLOCK_ELEMENT]: true,\n $ref: (el) => {\n element = el;\n },\n },\n blockChildren,\n );\n });\n },\n ),\n ],\n ),\n ],\n );\n}\n", "import { createElement, Component, getContext, useRef } from '@esmj/dom';\nimport { s } from '@esmj/schema';\n\nimport { EditorContext } from '../editorContext.mjs';\n\nexport class EntityRangeElement extends Component {\n static get nodeName() {\n return 'span';\n }\n\n static get NAMESPACE() {\n return 'namespace.EntityRangeElement';\n }\n\n static match(node) {\n if (node?.nodeName === this.nodeName.toUpperCase()) {\n return true;\n }\n\n if (node?.entity?.type === this.NAMESPACE) {\n return true;\n }\n\n return false;\n }\n\n static getStateSchema(node) {\n return s.any();\n }\n\n constructor(props) {\n super(props);\n\n this.mrakomor = getContext(EditorContext);\n\n this.element = useRef(null);\n }\n\n render() {\n return createElement(this.constructor.nodeName, {}, this.props.children);\n }\n}\n", "import { afterRender, createElement, useRef } from '@esmj/dom';\nimport { computed, createSignal } from '@esmj/signals';\nimport { s } from '@esmj/schema';\n\nimport { EntityRangeElement } from '../../component/entityRange/EntityRangeElement.mjs';\nimport { entityRangeSchema } from '#src/schema.mjs';\n\nimport { getBlockElementByChild, setCursorPosition, storeGlobalSelectionState } from '#src/dom.mjs';\nimport './LinkEntity.css';\n\n// cspell:ignore mrakomor\n\nconst ICON_COPY = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"/><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"/></svg>`;\nconst ICON_EDIT = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"/><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"/></svg>`;\nconst ICON_TRASH = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2\"/></svg>`;\nconst ICON_BACK = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 18 9 12 15 6\"/></svg>`;\n\n\n\nexport class LinkEntity extends EntityRangeElement {\n static get nodeName() {\n return 'a';\n }\n\n static get NAMESPACE() {\n return 'atom.link.Link';\n }\n \n\n static getStateSchema(node) {\n let parsed;\n if (node && node.getAttribute('data-state')) {\n try {\n parsed = JSON.parse(node.getAttribute('data-state'));\n } catch {}\n }\n\n return entityRangeSchema({\n type: this.NAMESPACE,\n data: s\n .object({\n href: s\n .string()\n .default(parsed?.entity?.data?.href ?? node?.href ?? ''),\n target: s\n .string()\n .default(parsed?.entity?.data?.target ?? node?.target ?? ''),\n })\n .default({}),\n length: parsed?.length ?? 0,\n offset: parsed?.offset ?? 0,\n }).default({});\n }\n\n constructor(props) {\n super(props);\n\n this.input = useRef((element) => afterRender(() => { element.focus(); }));\n }\n\n #buildDialog({ entity, length, offset }) {\n return createElement('div', { className: 'link-toolbar' }, [\n // \u2500\u2500 Preview row \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n createElement('div', { className: 'link-toolbar__row', style: { display: 'flex'} }, [\n createElement('button', {\n className: 'link-toolbar__btn',\n title: 'Copy URL',\n $dangerouslySetInnerHTML: ICON_COPY,\n onClick: () =>\n navigator.clipboard?.writeText(entity.peek()?.data?.href ?? ''),\n }),\n createElement('input', {\n type: 'text',\n $ref: this.input,\n value: entity.peek()?.data?.href ?? '',\n defaultValue: entity.peek()?.data?.href ?? '',\n onKeyDown: (e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n e.stopPropagation();\n this.mrakomor.command.closeDialog();\n }\n },\n onInput: (e) => {\n const newHref = e.currentTarget.value;\n entity.set({\n ...entity.peek(),\n data: { ...entity.peek()?.data, href: newHref },\n });\n },\n }),\n createElement(\n 'select',\n {\n value: entity.peek()?.data?.target ?? '',\n onChange: (e) => {\n entity.set({\n ...entity.peek(),\n data: {\n ...entity.peek()?.data,\n target: e.currentTarget.value,\n },\n });\n },\n },\n [\n createElement(\n 'option',\n { value: '', selected: entity.peek()?.data?.target === '' },\n '',\n ),\n createElement(\n 'option',\n {\n value: '_self',\n selected: entity.peek()?.data?.target === '_self',\n },\n '_self',\n ),\n createElement(\n 'option',\n {\n value: '_blank',\n selected: entity.peek()?.data?.target === '_blank',\n },\n '_blank',\n ),\n createElement(\n 'option',\n {\n value: '_parent',\n selected: entity.peek()?.data?.target === '_parent',\n },\n '_parent',\n ),\n createElement(\n 'option',\n {\n value: '_top',\n selected: entity.peek()?.data?.target === '_top',\n },\n '_top',\n ),\n ],\n ),\n createElement('span', { className: 'link-toolbar__sep' }),\n createElement('button', {\n className: 'link-toolbar__btn link-toolbar__btn--danger',\n title: 'Remove link',\n $dangerouslySetInnerHTML: ICON_TRASH,\n onClick: () => {\n this.mrakomor.command.removeEntityRange?.({ state: { entity: entity.peek(), length: length.peek(), offset: offset.peek() }, blockElement: getBlockElementByChild(this.element) });\n },\n }),\n ]),\n ]);\n }\n\n onMount() {\n const { entity } = this.props;\n if (!entity.peek()?.data?.href) {\n this.mrakomor.command.openDialog({\n element: this.element,\n children: this.#buildDialog(this.props),\n });\n }\n }\n\n\n render() {\n const { entity, length, offset, children } = this.props;\n\n return createElement(\n 'a',\n {\n href: () => entity.get()?.data?.href ?? '',\n target: () => entity.get()?.data?.target || null,\n $ref: this.element,\n onClick: (e) => {\n // Allow Ctrl/Cmd+Click to follow the link natively\n if (e.ctrlKey || e.metaKey) {\n // TOODO open with JS\n return;\n }\n //e.preventDefault();\n\n afterRender(() => {\n storeGlobalSelectionState();\n this.mrakomor.command.openDialog({\n element: this.element,\n children: this.#buildDialog({ entity, length, offset }),\n });\n });\n },\n 'data-state': () => JSON.stringify({\n entity: entity.get(),\n length: length.get(),\n offset: offset.get(),\n }),\n },\n children,\n );\n }\n}\n\n/**\n * Registers the link entity and Cmd/Ctrl+K insert shortcut.\n * @param {import('#src/types.mjs').PluginContext} options\n * @returns {import('#src/types.mjs').Plugin}\n */\nexport function linkEntityPlugin({ mrakomor }) {\n return {\n resolveConfig: (config) => {\n config.entityRanges.push(LinkEntity);\n return config;\n },\n resolveComponent: (namespace) => {\n if (namespace === LinkEntity.NAMESPACE) {\n return LinkEntity;\n }\n },\n onKeyDown(event) {\n if (event.key === 'k' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault();\n mrakomor.command.insertEntityRange({\n namespace: LinkEntity.NAMESPACE,\n });\n }\n },\n };\n}\n", "import { s } from '@esmj/schema';\n\nimport { HeadlineComponent } from '#src/component/block/Headline.mjs';\nimport {\n parseRichTextBlock,\n blockPropertiesFormattingTarget,\n buildRichTextFragment,\n} from '#src/component/block/helpers.mjs';\nimport {\n HEADLINE_H1_NAMESPACE,\n HEADLINE_H2_NAMESPACE,\n HEADLINE_H3_NAMESPACE,\n HEADLINE_H4_NAMESPACE,\n HEADLINE_H5_NAMESPACE,\n} from '#src/namespaces.mjs';\nimport {\n blockStateSchema,\n ttsVoiceEntityRangesSchema,\n} from '#src/schema.mjs';\n\nexport class TtsHeadlineComponent extends HeadlineComponent {\n static getStateSchema(node) {\n return blockStateSchema(node, {\n component: this.NAMESPACE,\n properties: {\n text: s\n .string()\n .default(node?.textContent ?? node?.innerText ?? ''),\n entityRanges: ttsVoiceEntityRangesSchema(),\n },\n });\n }\n\n getInlineStyleComponents() {\n return [];\n }\n\n getEntityRangeComponents() {\n return (\n this.props?.entityRanges?.get() ??\n this.mrakomor.getConfig()?.entityRanges ??\n []\n );\n }\n\n parseFromHTML(node) {\n return parseRichTextBlock(this, node);\n }\n\n _buildContent(state) {\n return buildRichTextFragment(state, {\n inlineStyleComponents: this.getInlineStyleComponents(),\n entityRangeComponents: this.getEntityRangeComponents(),\n });\n }\n\n /**\n * @param {Range | null} [_range]\n * @returns {import('#src/types.mjs').FormattingTarget<import('#src/types.mjs').TextBlockState> | null}\n */\n getFormattingTarget(_range) {\n return blockPropertiesFormattingTarget(this.element);\n }\n}\n\nexport class TtsHeadline1 extends TtsHeadlineComponent {\n static get NAMESPACE() {\n return HEADLINE_H1_NAMESPACE;\n }\n\n static get LABEL() {\n return 'H1';\n }\n\n constructor(props) {\n super(props);\n this._level = 1;\n }\n}\n\nexport class TtsHeadline2 extends TtsHeadlineComponent {\n static get NAMESPACE() {\n return HEADLINE_H2_NAMESPACE;\n }\n\n static get LABEL() {\n return 'H2';\n }\n\n constructor(props) {\n super(props);\n this._level = 2;\n }\n}\n\nexport class TtsHeadline3 extends TtsHeadlineComponent {\n static get NAMESPACE() {\n return HEADLINE_H3_NAMESPACE;\n }\n\n static get LABEL() {\n return 'H3';\n }\n\n constructor(props) {\n super(props);\n this._level = 3;\n }\n}\n\nexport class TtsHeadline4 extends TtsHeadlineComponent {\n static get NAMESPACE() {\n return HEADLINE_H4_NAMESPACE;\n }\n\n static get LABEL() {\n return 'H4';\n }\n\n constructor(props) {\n super(props);\n this._level = 4;\n }\n}\n\nexport class TtsHeadline5 extends TtsHeadlineComponent {\n static get NAMESPACE() {\n return HEADLINE_H5_NAMESPACE;\n }\n\n static get LABEL() {\n return 'H5';\n }\n\n constructor(props) {\n super(props);\n this._level = 5;\n }\n}\n\n/**\n * Registers TTS headline blocks (voice entity ranges on H1\u2013H5).\n * @returns {import('#src/types.mjs').Plugin}\n */\nexport function ttsHeadlinePlugin() {\n return {\n resolveConfig: (config) => {\n config.blockComponents.push(\n TtsHeadline1,\n TtsHeadline2,\n TtsHeadline3,\n TtsHeadline4,\n TtsHeadline5,\n );\n return config;\n },\n resolveComponent: (namespace) => {\n if (namespace === TtsHeadline1.NAMESPACE) {\n return TtsHeadline1;\n }\n if (namespace === TtsHeadline2.NAMESPACE) {\n return TtsHeadline2;\n }\n if (namespace === TtsHeadline3.NAMESPACE) {\n return TtsHeadline3;\n }\n if (namespace === TtsHeadline4.NAMESPACE) {\n return TtsHeadline4;\n }\n if (namespace === TtsHeadline5.NAMESPACE) {\n return TtsHeadline5;\n }\n },\n };\n}\n", "import { s } from '@esmj/schema';\n\nimport { Paragraph } from '#src/component/block/Paragraph.mjs';\nimport {\n blockStateSchema,\n ttsVoiceEntityRangesSchema,\n} from '#src/schema.mjs';\n\nexport class TtsParagraph extends Paragraph {\n static getStateSchema(node) {\n return blockStateSchema(node, {\n component: this.NAMESPACE,\n properties: {\n entityRanges: ttsVoiceEntityRangesSchema(),\n text: s\n .string()\n .default(node?.innerText ?? node?.textContent ?? ''),\n },\n });\n }\n\n getInlineStyleComponents() {\n return [];\n }\n}\n\n/**\n * Registers the TTS paragraph (voice ranges only, no inline styles).\n * @returns {import('#src/types.mjs').Plugin}\n */\nexport function ttsParagraphPlugin() {\n return {\n resolveConfig: (config) => {\n config.blockComponents.push(TtsParagraph);\n return config;\n },\n resolveComponent: (namespace) => {\n if (namespace === TtsParagraph.NAMESPACE) {\n return TtsParagraph;\n }\n },\n };\n}\n", "import { createElement } from '@esmj/dom';\nimport { s } from '@esmj/schema';\n\nimport { EntityRangeElement } from '../../component/entityRange/EntityRangeElement.mjs';\nimport { entityRangeSchema } from '#src/schema.mjs';\n\nimport { getBlockElementByChild } from '#src/dom.mjs';\nimport './TtsVoice.css';\n\n// cspell:ignore mrakomor\n\nexport const VOICES = [\n { id: \"Jarda\", label: \"Voice Jarda\", gender: \"man\" }, { id: \"Pavel\", label: \"Voice Pavel\", gender: \"man\" }, { id: \"Radek\", label: \"Voice Radek\", gender: \"man\" }, { id: \"Magda\", label: \"Voice Magda\", gender: \"woman\" }, { id: \"Marketa\", label: \"Voice Marketa\", gender: \"woman\" }, { id: \"Silva\", label: \"Voice Silva\", gender: \"woman\" }\n];\n\nconst ICON_TRASH = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2\"/></svg>`;\n\n/**\n * Voice metadata for a TTS id, or the first voice if unknown.\n * @param {string} voiceId\n * @returns {{ id: string, label: string, gender: string }}\n */\nexport function getVoice(voiceId) {\n return VOICES.find((voice) => voice.id === voiceId) ?? VOICES[0];\n}\n\nexport class TtsVoice extends EntityRangeElement {\n static get NAMESPACE() {\n return 'atom.tts.Voice';\n }\n\n static get LABEL() {\n return 'VOICE';\n }\n\n static match(node) {\n if (node?.entity?.type === this.NAMESPACE) {\n return true;\n }\n\n if (\n node?.nodeName === 'SPAN' &&\n node?.getAttribute?.('data-entity-type') === this.NAMESPACE\n ) {\n return true;\n }\n\n return false;\n }\n\n static getStateSchema(node) {\n let parsed;\n if (node?.getAttribute?.('data-state')) {\n try {\n parsed = JSON.parse(node.getAttribute('data-state'));\n } catch { }\n }\n\n const voice =\n parsed?.entity?.data?.voice ??\n node?.getAttribute?.('data-voice') ??\n '';\n\n return entityRangeSchema({\n type: this.NAMESPACE,\n data: s\n .object({\n voice: s.string().default(voice),\n })\n .default({}),\n length: parsed?.length ?? 0,\n offset: parsed?.offset ?? 0,\n }).default({});\n }\n\n #buildDialog({ entity, length, offset }) {\n const currentVoice = entity.peek()?.data?.voice ?? '';\n\n return createElement('div', { className: 'tts-voice-toolbar' }, [\n createElement('div', { className: 'tts-voice-toolbar__row' }, [\n ...VOICES.map((voice) =>\n createElement(\n 'button',\n {\n type: 'button',\n className: `tts-voice-toolbar__voice tts-voice-toolbar__voice--${voice.gender}${currentVoice === voice.id\n ? ' tts-voice-toolbar__voice--active'\n : ''\n }`,\n title: voice.label,\n onClick: () => {\n entity.set({\n ...entity.peek(),\n data: { voice: voice.id },\n });\n this.mrakomor.command.closeDialog();\n },\n },\n voice.label,\n ),\n ),\n createElement('span', { className: 'tts-voice-toolbar__sep' }),\n createElement('button', {\n type: 'button',\n className: 'tts-voice-toolbar__btn tts-voice-toolbar__btn--danger',\n title: 'Remove TTS voice',\n $dangerouslySetInnerHTML: ICON_TRASH,\n onClick: () => {\n this.mrakomor.command.removeEntityRange?.({\n state: {\n entity: entity.peek(),\n length: length.peek(),\n offset: offset.peek(),\n },\n blockElement: getBlockElementByChild(this.element),\n });\n },\n }),\n ]),\n ]);\n }\n\n #openDialog(props) {\n this.mrakomor.command.openDialog({\n element: this.element,\n children: this.#buildDialog(props),\n });\n }\n\n onMount() {\n const { entity } = this.props;\n if (!entity.peek()?.data?.voice) {\n this.#openDialog(this.props);\n }\n }\n\n render() {\n const { entity, length, offset, children } = this.props;\n\n return createElement(\n 'span',\n {\n className: () => {\n const voiceId = entity.get()?.data?.voice ?? '';\n const voice = getVoice(voiceId || 'man1');\n return `atom-tts-voice tts-voice--${voice.gender}`;\n },\n 'data-entity-type': this.constructor.NAMESPACE,\n 'data-voice': () => entity.get()?.data?.voice ?? '',\n 'data-voice-label': () => {\n const voiceId = entity.get()?.data?.voice ?? '';\n return voiceId ? getVoice(voiceId).label : '';\n },\n $ref: this.element,\n onClick: (e) => {\n e.preventDefault();\n this.#openDialog({ entity, length, offset });\n },\n 'data-state': () =>\n JSON.stringify({\n entity: entity.get(),\n length: length.get(),\n offset: offset.get(),\n }),\n },\n children,\n );\n }\n}\n\n/**\n * Registers the TTS voice entity range.\n * @returns {import('#src/types.mjs').Plugin}\n */\nexport function ttsVoicePlugin() {\n return {\n resolveConfig: (config) => {\n config.entityRanges.push(TtsVoice);\n return config;\n },\n resolveComponent: (namespace) => {\n if (namespace === TtsVoice.NAMESPACE) {\n return TtsVoice;\n }\n },\n };\n}\n", "const RESULT_KEY = Symbol('result-key');\nconst STOPPED_EVENT = Symbol('stopped-event');\n\nfunction createEvent(name, data) {\n const isDataEvent = !!data.name;\n const resultKey = data[RESULT_KEY] || 'result';\n const isNamepace = resultKey.includes('.');\n\n const event = {\n error: null,\n context: {},\n [RESULT_KEY]: resultKey,\n ...data,\n [resultKey]: isDataEvent ? undefined : getValue(data, resultKey),\n name,\n [STOPPED_EVENT]: false,\n defaultPrevented: false,\n };\n\n if (isNamepace) {\n createPath(event, resultKey);\n\n event[resultKey] = isDataEvent ? undefined : getValue(data, resultKey);\n }\n\n event.stopPropagation = () => {\n event[STOPPED_EVENT] = true;\n };\n\n event.preventDefault = () => {\n event.defaultPrevented = true;\n };\n\n return event;\n}\n\nfunction getValue(source, path) {\n if (path === '') {\n return source;\n }\n\n const keys = path.split('.');\n\n return keys.reduce((result, key) => {\n return result?.[key] ?? undefined;\n }, source);\n}\n\nfunction setValue(source, path, value) {\n const keys = path.split('.');\n const key = keys.pop();\n\n const result = getValue(source, keys.join('.'));\n\n return (result[key] = value);\n}\n\nfunction createPath(source, path) {\n const keys = path.split('.');\n keys.pop();\n\n keys.reduce((result, key) => {\n return (result[key] = result[key] ?? {});\n }, source);\n}\n\nclass Emitter {\n constructor({ logger, debug } = {}) {\n this._logger = logger ?? console;\n this._debug = debug ?? false;\n\n this._events = new Map();\n\n // ALIASES\n this.addListener = this.on;\n this.removeListener = this.off;\n }\n\n emit(eventName, data = {}) {\n const methods = this.listeners(eventName);\n const event = createEvent(eventName, data);\n let promise = null;\n let result = null;\n\n if (this._debug) {\n typeof this._debug === 'function'\n ? this._debug(eventName, event)\n : this._logger.debug(`Event name: ${eventName}, event: ${event}`);\n }\n\n for (const method of methods) {\n if (promise) {\n promise = promise.then((result) => {\n setValue(\n event,\n event[RESULT_KEY],\n result ?? getValue(event, event[RESULT_KEY])\n );\n if (event[STOPPED_EVENT]) {\n return getValue(event, event[RESULT_KEY]);\n }\n\n return method(event);\n });\n }\n\n if (!promise) {\n if (event[STOPPED_EVENT]) {\n return event;\n }\n\n result = method(event);\n }\n\n if (result instanceof Promise && !promise) {\n promise = result;\n } else {\n setValue(\n event,\n event[RESULT_KEY],\n result ?? getValue(event, event[RESULT_KEY])\n );\n }\n }\n\n if (promise) {\n return promise.then((result) => {\n setValue(\n event,\n event[RESULT_KEY],\n result ?? getValue(event, event[RESULT_KEY])\n );\n\n return event;\n });\n }\n\n return event;\n }\n\n emitParallel(eventName, data = {}) {\n const methods = this.listeners(eventName);\n const event = createEvent(eventName, data);\n\n return Promise.all(methods.map(async (method) => await method(event)))\n .then((results) => {\n event[event[RESULT_KEY]] = results;\n\n return event;\n })\n .catch((error) => {\n event.error = error;\n\n throw error;\n });\n }\n\n listeners(eventName) {\n if (!this._events.has(eventName)) {\n return [];\n }\n\n return [...this._events.get(eventName)];\n }\n\n removeAllListeners(eventName) {\n if (!eventName) {\n return Array.from(this._events.keys()).forEach((eventName) =>\n this.removeAllListeners(eventName)\n );\n }\n\n return this.listeners(eventName).forEach((handler) =>\n this.off(eventName, handler)\n );\n }\n\n _addListener(eventName, method, action) {\n if (!this._events.has(eventName)) {\n this._events.set(eventName, []);\n }\n\n const methods = this._events.get(eventName);\n methods[action](method);\n\n return () => {\n this.off(eventName, method);\n };\n }\n\n on(eventName, method) {\n if (typeof method !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n return this._addListener(eventName, method, 'push');\n }\n\n prependListener(eventName, method) {\n return this._addListener(eventName, method, 'unshift');\n }\n\n _addListenerOnce(eventName, method, action) {\n let removeMethod = this[action](eventName, (event) => {\n removeMethod();\n return method(event);\n });\n }\n\n once(eventName, method) {\n return this._addListenerOnce(eventName, method, 'on');\n }\n\n prependOnceListener(eventName, method) {\n return this._addListenerOnce(eventName, method, 'prependListener');\n }\n\n off(eventName, method) {\n if (this._events.has(eventName)) {\n const methods = this._events.get(eventName);\n const index = methods.indexOf(method);\n\n methods.splice(index, 1);\n }\n }\n}\n\nexport { Emitter, RESULT_KEY, createEvent };\n", "import { Emitter } from '@esmj/emitter';\n\nconst EVENT = {\n INSERT_BLOCK_ELEMENT: 'mrakomor:insert-block-component',\n REPLACE_BLOCK_ELEMENT: 'mrakomor:replace-block-component',\n REMOVE_BLOCK_ELEMENT: 'mrakomor:remove-block-component',\n MERGE_BLOCK_ELEMENT: 'mrakomor:merge-block-component',\n INSERT_ENTITY_RANGE: 'mrakomor:insert-entity-range',\n REMOVE_ENTITY_RANGE: 'mrakomor:remove-entity-range',\n INSERT_INLINE_STYLE_RANGE: 'mrakomor:insert-inline-style-range',\n KEYDOWN: 'mrakomor:keydown',\n CLICK: 'mrakomor:click',\n FOCUSIN: 'mrakomor:focusin',\n FOCUSOUT: 'mrakomor:focusout',\n SELECTION_CHANGE: 'mrakomor:selection-change',\n CONTENT_CHANGE: 'mrakomor:content-change',\n TRANSFORM_BLOCK_ELEMENT: 'mrakomor:transform-block-element',\n MOVE_BLOCK_ELEMENT: 'mrakomor:move-block-element',\n};\n\n/**\n * Skip the handler when a previous listener called `preventDefault()`.\n * @param {Function} handler\n * @returns {Function}\n */\nfunction unlessPrevented(handler) {\n return (event) => {\n if (event.defaultPrevented) {\n return;\n }\n return handler(event);\n };\n}\n\n/**\n * Command bus bound to a Mrakomor instance.\n * Each `command.*` method emits the matching `EVENT` via `mrakomor.emit`.\n *\n * @param {{ mrakomor?: import('#src/types.mjs').Mrakomor }} [options]\n * @returns {{ emitter: import('@esmj/emitter').Emitter, command: import('#src/types.mjs').MrakomorCommand }}\n */\nfunction createCommands({ mrakomor } = {}) {\n const emitter = mrakomor?.emitter ?? new Emitter();\n\n /**\n * Emit via `mrakomor.emit` when present so `event.mrakomor` is set.\n * @param {string} eventName\n * @param {object} [payload] event-specific fields\n */\n function emit(eventName, payload = {}) {\n if (typeof mrakomor?.emit === 'function') {\n return mrakomor.emit(eventName, payload);\n }\n return emitter.emit(eventName, { ...payload, mrakomor });\n }\n\n return {\n emitter,\n command: {\n // TODO rename molecule argument\n insertBlockElement(molecule, options) {\n emit(EVENT.INSERT_BLOCK_ELEMENT, { ...molecule, options });\n },\n replaceBlockElement(molecule, options) {\n emit(EVENT.REPLACE_BLOCK_ELEMENT, { ...molecule, options });\n },\n removeBlockElement(molecule, options) {\n emit(EVENT.REMOVE_BLOCK_ELEMENT, { ...molecule, options });\n },\n mergeBlockElement(molecule, options) {\n emit(EVENT.MERGE_BLOCK_ELEMENT, { ...molecule, options });\n },\n insertEntityRange(entityRange, options) {\n emit(EVENT.INSERT_ENTITY_RANGE, { ...entityRange, options });\n },\n removeEntityRange(entityRange, options) {\n emit(EVENT.REMOVE_ENTITY_RANGE, { ...entityRange, options });\n },\n insertInlineStyleRange(inlineStyle, options) {\n emit(EVENT.INSERT_INLINE_STYLE_RANGE, {\n ...inlineStyle,\n options,\n });\n },\n transformBlockElement(transform, options) {\n emit(EVENT.TRANSFORM_BLOCK_ELEMENT, { ...transform, options });\n },\n moveBlockElement(move, options) {\n emit(EVENT.MOVE_BLOCK_ELEMENT, { ...move, options });\n },\n },\n };\n}\n\nexport { EVENT, createCommands, unlessPrevented };\n", "import { afterRender } from '@esmj/dom';\nimport { untrack } from '@esmj/signals';\n\nimport { ExternalComponent } from '#src/component/block/ExternalComponent.mjs';\nimport {\n deepMergeBlockState,\n mergeBlocksAcrossSelection,\n applyInlineStyleRange,\n applyEntityRange,\n isTextBlock,\n normalizeBlockText,\n} from '#src/component/block/helpers.mjs';\nimport { UnknownComponent } from '#src/component/block/UnknownComponent.mjs';\nimport {\n getBlockElementBody,\n getCursorPosition,\n setCursorPosition,\n getBlockElementByRange,\n getRange,\n getBlockElementInstance,\n getCrossBlockSelectionState,\n createComponentId,\n getBlockContentRoot,\n} from '#src/dom.mjs';\nimport { EVENT, unlessPrevented } from '#src/emitter.mjs';\n\n/**\n * Replace one block in content by DOM element index.\n * @param {import('#src/types.mjs').Mrakomor} mrakomor\n * @param {Element} blockElement\n * @param {import('#src/types.mjs').ComponentStateInput} nextState\n * @returns {boolean}\n */\nfunction updateBlockAt(mrakomor, blockElement, nextState) {\n const index = mrakomor._getBlockElementIndex(blockElement);\n if (index === -1) {\n return false;\n }\n\n const content = mrakomor.getContent();\n content.splice(index, 1, mrakomor.normalizeComponentState(nextState));\n mrakomor._setContentState(content);\n return true;\n}\n\n/**\n * Shared escape-hatch + standard path for entity/inline range insertion.\n * @param {import('#src/types.mjs').EmitterEvent} event\n * @param {{\n * customHook: string,\n * applyFn: function(\n * import('#src/types.mjs').ComponentState,\n * import('#src/types.mjs').FormattingTarget,\n * object\n * ): (import('#src/types.mjs').ComponentStateInput | null | undefined),\n * applyArgs: object,\n * resolveRange?: boolean,\n * }} options\n */\nfunction applyFormatting(event, { customHook, applyFn, applyArgs, resolveRange = true }) {\n const { mrakomor } = event;\n let { blockElement, range } = event;\n\n if (resolveRange) {\n range = range ?? getRange();\n blockElement = blockElement ?? getBlockElementByRange(range);\n }\n\n const instance = getBlockElementInstance(blockElement);\n const customState = instance?.[customHook]?.(event);\n\n if (event.defaultPrevented) {\n if (customState) {\n updateBlockAt(mrakomor, blockElement, customState);\n }\n return;\n }\n\n const target = instance?.getFormattingTarget?.(range);\n if (!target) {\n return;\n }\n\n const index = mrakomor._getBlockElementIndex(blockElement);\n if (index === -1) {\n return;\n }\n\n const content = mrakomor.getContent();\n const nextState = applyFn(structuredClone(content[index]), target, {\n ...applyArgs,\n range,\n });\n if (!nextState) {\n return;\n }\n\n updateBlockAt(mrakomor, blockElement, nextState);\n}\n\n/**\n * Insert a block after an anchor block or range.\n * @param {import('#src/types.mjs').EmitterEvent} event\n */\nfunction onInsertBlockElement(event) {\n const { mrakomor } = event;\n const {\n blockElement,\n range,\n newLineState,\n originalLineState,\n namespace,\n position,\n cursor,\n } = event;\n\n let originalIndex;\n let newIndex;\n\n // Position-based insert is not implemented.\n if (position) {\n return;\n }\n\n if (blockElement) {\n originalIndex = mrakomor._getBlockElementIndex(blockElement);\n } else if (range) {\n originalIndex = mrakomor._getBlockElementIndex(\n getBlockElementByRange(range),\n );\n }\n\n if (originalIndex === undefined || originalIndex === -1) {\n return;\n }\n\n newIndex = originalIndex + 1;\n\n const content = mrakomor.getContent();\n\n if (originalLineState) {\n content.splice(\n originalIndex,\n 1,\n mrakomor.normalizeComponentState(originalLineState),\n );\n }\n\n if (newLineState) {\n newLineState.component = namespace;\n content.splice(newIndex, 0, mrakomor.normalizeComponentState(newLineState));\n }\n\n mrakomor._setContentState(content);\n\n afterRender(() => {\n if (typeof cursor === 'number' && cursor === 0) {\n const restoreRoot = getBlockContentRoot(\n mrakomor._getBlockElements()[newIndex],\n );\n if (restoreRoot?.isConnected) {\n setCursorPosition(restoreRoot, cursor);\n }\n }\n });\n}\n\n/**\n * Replace one block with one or more normalized blocks.\n * @param {import('#src/types.mjs').EmitterEvent} event\n */\nfunction onReplaceBlockElement(event) {\n const { mrakomor } = event;\n const {\n blockElement,\n range,\n blocks,\n cursor,\n cursorBlockIndex = 0,\n } = event;\n\n if (!Array.isArray(blocks) || blocks.length === 0) {\n return;\n }\n\n const target =\n blockElement ?? (range ? getBlockElementByRange(range) : null);\n const index = mrakomor._getBlockElementIndex(target);\n if (index === -1) {\n return;\n }\n\n const content = mrakomor.getContent();\n content.splice(\n index,\n 1,\n ...blocks.map((block) => mrakomor.normalizeComponentState(block)),\n );\n mrakomor._setContentState(content);\n\n afterRender(() => {\n if (typeof cursor !== 'number') {\n return;\n }\n\n mrakomor._syncBlockElementsFromDom();\n const restoreRoot = getBlockContentRoot(\n mrakomor._getBlockElements()[index + cursorBlockIndex],\n );\n if (restoreRoot?.isConnected) {\n setCursorPosition(restoreRoot, cursor);\n }\n });\n}\n\n/**\n * Change a block's component namespace (keeps properties, new componentId).\n * @param {import('#src/types.mjs').EmitterEvent} event\n */\nfunction onTransformBlockElement(event) {\n const { mrakomor, blockElement, namespace } = event;\n const index = mrakomor._getBlockElementIndex(blockElement);\n if (index === -1) {\n return;\n }\n\n const current = mrakomor.getContent()[index];\n updateBlockAt(mrakomor, blockElement, {\n ...current,\n component: namespace,\n componentId: createComponentId(),\n });\n}\n\n/**\n * Reorder a block using the signal snapshot (avoids re-reading dirty DOM).\n * @param {import('#src/types.mjs').EmitterEvent} event\n */\nfunction onMoveBlockElement(event) {\n const { mrakomor, blockElement, targetIndex } = event;\n const fromIndex = mrakomor._getBlockElementIndex(blockElement);\n\n if (fromIndex === -1 || typeof targetIndex !== 'number') {\n return;\n }\n\n const adjustedTarget =\n targetIndex > fromIndex ? targetIndex - 1 : targetIndex;\n\n if (adjustedTarget === fromIndex) {\n return;\n }\n\n const content = [...mrakomor._getContentState()];\n const [moved] = content.splice(fromIndex, 1);\n content.splice(adjustedTarget, 0, moved);\n mrakomor._setContentState(content);\n}\n\n/**\n * Remove a block and place the caret in the block under `range`.\n * @param {import('#src/types.mjs').EmitterEvent} event\n */\nfunction onRemoveBlockElement(event) {\n const { mrakomor, blockElement, range } = event;\n const removedIndex = mrakomor._getBlockElementIndex(blockElement);\n\n if (removedIndex !== -1) {\n const content = mrakomor.getContent();\n content.splice(removedIndex, 1);\n mrakomor._setContentState(content);\n }\n\n afterRender(() => {\n const cursorBlockElement = getBlockElementByRange(range);\n setCursorPosition(getBlockContentRoot(cursorBlockElement), 0);\n });\n}\n\n/**\n * Drop a matching entity range from a block and close the dialog.\n * @param {import('#src/types.mjs').EmitterEvent} event\n */\nfunction onRemoveEntityRange(event) {\n const { mrakomor, state, blockElement } = event;\n const index = mrakomor._getBlockElementIndex(blockElement);\n if (index === -1) {\n return;\n }\n\n const blockContent = structuredClone(mrakomor.getContent()[index]);\n const targetOffset = state?.offset;\n const targetLength = state?.length;\n const targetType = state?.entity?.type;\n\n blockContent.properties.entityRanges = (\n blockContent.properties.entityRanges ?? []\n ).filter((entityRange) => {\n const isMatch =\n entityRange?.offset === targetOffset &&\n entityRange?.length === targetLength &&\n entityRange?.entity?.type === targetType;\n\n return !isMatch;\n });\n\n updateBlockAt(mrakomor, blockElement, blockContent);\n mrakomor.command.closeDialog?.();\n}\n\n/**\n * Insert or toggle an entity range on the formatting target.\n * @param {import('#src/types.mjs').EmitterEvent} event\n */\nfunction onInsertEntityRange(event) {\n applyFormatting(event, {\n customHook: 'insertEntityRange',\n applyFn: applyEntityRange,\n applyArgs: {\n state: event.state,\n namespace: event.namespace,\n },\n });\n}\n\n/**\n * Insert or toggle an inline style range on the formatting target.\n * @param {import('#src/types.mjs').EmitterEvent} event\n */\nfunction onInsertInlineStyleRange(event) {\n applyFormatting(event, {\n customHook: 'insertInlineStyleRange',\n applyFn: applyInlineStyleRange,\n applyArgs: { style: event.style },\n });\n}\n\n/**\n * Merge a block into the previous block and restore the caret.\n * @param {import('#src/types.mjs').EmitterEvent} event\n */\nfunction onMergeBlockElement(event) {\n const { mrakomor, blockElement, previousBlockElement } = event;\n\n const resultIndex = mrakomor._getBlockElementIndex(previousBlockElement);\n const removedIndex = mrakomor._getBlockElementIndex(blockElement);\n if (resultIndex === -1 || removedIndex === -1) {\n return;\n }\n\n const content = mrakomor.getContent();\n const removedItem = content[removedIndex];\n const previousItem = content[resultIndex];\n const result = deepMergeBlockState(previousItem, removedItem);\n\n content.splice(removedIndex, 1);\n content.splice(resultIndex, 1, mrakomor.normalizeComponentState(result.state));\n mrakomor._setContentState(content);\n\n /** Restore caret after merge (`afterRender` is a macrotask). */\n const restoreCaret = () => {\n if (typeof result.cursor !== 'number') {\n return;\n }\n\n const resultBlock =\n mrakomor._getBlockElements()[resultIndex] ?? previousBlockElement;\n const restoreRoot = getBlockContentRoot(resultBlock);\n if (!restoreRoot?.isConnected) {\n return;\n }\n\n setCursorPosition(restoreRoot, result.cursor);\n };\n\n restoreCaret();\n afterRender(restoreCaret);\n}\n\n/**\n * Commit live DOM into `#content` when focus left the editor and any block was reparsed.\n * `===` is same-object identity: `getState()` returns `state.peek()` when not stale\n * and a new parse when `_stale`. Not a deep-equal of block contents.\n * @param {import('#src/types.mjs').EmitterEvent} event\n */\nfunction onEditorFocusOut(event) {\n const { mrakomor } = event;\n const root = mrakomor.getRoot();\n const stillInside =\n event.relatedTarget instanceof Node && root.contains(event.relatedTarget);\n if (stillInside) {\n return;\n }\n\n const [live, current] = untrack(() => [\n mrakomor.getContent(),\n mrakomor._getContentState(),\n ]);\n const unchanged =\n live.length === current.length &&\n live.every((block, i) => block === current[i]);\n if (unchanged) {\n return;\n }\n\n mrakomor.setContent(live);\n}\n\n/**\n * Forward KEYDOWN to the focused block's `onKeydown`.\n * @param {import('#src/types.mjs').EmitterEvent} event\n */\nfunction onBlockKeydown(event) {\n const range = getRange();\n const blockElement = getBlockElementByRange(range);\n\n return blockElement\n ?.getNodeComponent?.()\n ?.classInstance?.onKeydown?.(event);\n}\n\n/**\n * Place the cursor at the end of a block via its instance `setCursor`.\n * @param {Element} blockElement\n */\nfunction restoreCursorAtEndOfBlock(blockElement) {\n getBlockElementInstance(blockElement)?.setCursor?.();\n}\n\n/**\n * Default Backspace: cross-block delete, remove atomic previous, or merge.\n * @param {import('#src/types.mjs').EmitterEvent} event\n */\nfunction onBackspaceKeydown(event) {\n if (event.key !== 'Backspace') {\n return;\n }\n\n const { mrakomor } = event;\n const range = getRange();\n if (!range) {\n return;\n }\n\n const blockElement = getBlockElementByRange(range);\n if (!blockElement) {\n return;\n }\n\n const blockElementBody = getBlockElementBody(blockElement);\n const previousBlockElement = blockElement?.previousSibling;\n const previousBlockElementBody = getBlockElementBody(previousBlockElement);\n const previousContentEditable =\n previousBlockElementBody?.childNodes?.[0]?.contentEditable === 'true';\n const currentContentEditable =\n blockElementBody?.childNodes?.[0]?.contentEditable === 'true';\n const contentRoot = getBlockContentRoot(blockElement);\n const contentIsEmpty = !normalizeBlockText(contentRoot?.textContent);\n const atBlockStart =\n range.collapsed &&\n (range.startOffset === 0 || getCursorPosition() === 0 || contentIsEmpty);\n\n if (!range.collapsed) {\n const cross = getCrossBlockSelectionState(range);\n if (cross && cross.startBlock !== cross.endBlock) {\n const blockElements = mrakomor._getBlockElements();\n const startIndex = blockElements.indexOf(cross.startBlock);\n const endIndex = blockElements.indexOf(cross.endBlock);\n const content = mrakomor.getContent();\n const startState = content[startIndex];\n const endState = content[endIndex];\n const canMerge =\n startIndex >= 0 &&\n endIndex > startIndex &&\n typeof startState?.properties?.text === 'string' &&\n typeof endState?.properties?.text === 'string';\n\n if (canMerge) {\n event.preventDefault();\n\n const {\n content: next,\n cursor,\n resultIndex,\n } = mergeBlocksAcrossSelection(content, {\n startIndex,\n endIndex,\n startOffset: cross.startOffset,\n endOffset: cross.endOffset,\n });\n\n mrakomor._setContentState(\n next.map((item) => mrakomor.normalizeComponentState(item)),\n );\n\n afterRender(() => {\n const resultBlock = mrakomor._getBlockElements()[resultIndex];\n if (resultBlock && typeof cursor === 'number') {\n setCursorPosition(getBlockContentRoot(resultBlock), cursor);\n }\n });\n }\n }\n return;\n }\n\n if (!atBlockStart) {\n return;\n }\n\n const index = mrakomor._getBlockElementIndex(blockElement);\n const previousIndex = previousBlockElement\n ? mrakomor._getBlockElementIndex(previousBlockElement)\n : -1;\n const content = mrakomor.getContent();\n const currentState = index >= 0 ? content[index] : null;\n const previousState = previousIndex >= 0 ? content[previousIndex] : null;\n const previousInstance = previousBlockElement\n ? getBlockElementInstance(previousBlockElement)\n : null;\n\n // Text blocks: merge into the previous block (keeps previous component type).\n // Same-component-only `canMergeBlocks` is for paste; Backspace absorbs across\n // paragraph/headline so split-then-Backspace restores the original block.\n if (\n previousBlockElement &&\n previousState &&\n currentState &&\n isTextBlock(previousState) &&\n isTextBlock(currentState)\n ) {\n event.preventDefault();\n mrakomor.command.mergeBlockElement({\n blockElement,\n previousBlockElement,\n range,\n });\n return;\n }\n\n // Empty after a non-atomic, non-text previous (e.g. list): drop the empty\n // block and move the cursor into the previous block.\n if (\n contentIsEmpty &&\n previousBlockElement &&\n previousState &&\n index >= 0 &&\n previousInstance &&\n !previousInstance.isAtomic?.()\n ) {\n event.preventDefault();\n content.splice(index, 1);\n mrakomor._setContentState(content);\n restoreCursorAtEndOfBlock(previousBlockElement);\n return;\n }\n\n // Atomic previous (figure, \u2026): remove the previous block.\n if (\n (!previousContentEditable && range.startOffset === 0) ||\n (blockElement?.textContent === '\\u00A0' && !currentContentEditable)\n ) {\n event.preventDefault();\n\n mrakomor.command.removeBlockElement({\n blockElement: previousBlockElement,\n range,\n });\n }\n}\n\n/**\n * Core editor defaults: External/Unknown resolve, command handlers, KEYDOWN,\n * and the native DOM \u2192 emitter bridge. Always appended last by Mrakomor.\n *\n * @param {import('#src/types.mjs').PluginContext} [_options]\n * @returns {import('#src/types.mjs').Plugin}\n */\nexport function defaultMrakomorPlugin(_options) {\n return {\n resolveComponent: (namespace) => {\n if (namespace === ExternalComponent.NAMESPACE) {\n return ExternalComponent;\n }\n\n return UnknownComponent;\n },\n\n registerCommands(mrakomor) {\n mrakomor.emitter.on(\n EVENT.INSERT_BLOCK_ELEMENT,\n unlessPrevented(onInsertBlockElement),\n );\n mrakomor.emitter.on(\n EVENT.REPLACE_BLOCK_ELEMENT,\n unlessPrevented(onReplaceBlockElement),\n );\n mrakomor.emitter.on(\n EVENT.TRANSFORM_BLOCK_ELEMENT,\n unlessPrevented(onTransformBlockElement),\n );\n mrakomor.emitter.on(\n EVENT.MOVE_BLOCK_ELEMENT,\n unlessPrevented(onMoveBlockElement),\n );\n mrakomor.emitter.on(\n EVENT.REMOVE_BLOCK_ELEMENT,\n unlessPrevented(onRemoveBlockElement),\n );\n mrakomor.emitter.on(\n EVENT.REMOVE_ENTITY_RANGE,\n unlessPrevented(onRemoveEntityRange),\n );\n mrakomor.emitter.on(\n EVENT.INSERT_ENTITY_RANGE,\n unlessPrevented(onInsertEntityRange),\n );\n mrakomor.emitter.on(\n EVENT.INSERT_INLINE_STYLE_RANGE,\n unlessPrevented(onInsertInlineStyleRange),\n );\n mrakomor.emitter.on(\n EVENT.MERGE_BLOCK_ELEMENT,\n unlessPrevented(onMergeBlockElement),\n );\n },\n\n registerHandlers(mrakomor) {\n mrakomor.emitter.on(EVENT.FOCUSOUT, onEditorFocusOut);\n mrakomor.emitter.on(EVENT.KEYDOWN, unlessPrevented(onBlockKeydown));\n mrakomor.emitter.on(EVENT.KEYDOWN, unlessPrevented(onBackspaceKeydown));\n },\n\n registerListeners(mrakomor) {\n const root = mrakomor.getRoot();\n const { signal } = mrakomor.listenerAbortController;\n\n root.addEventListener(\n 'keydown',\n (event) => mrakomor.emitDomEvent(EVENT.KEYDOWN, event),\n { signal },\n );\n root.addEventListener(\n 'focusin',\n (event) => mrakomor.emitDomEvent(EVENT.FOCUSIN, event),\n { signal },\n );\n root.addEventListener(\n 'focusout',\n (event) => mrakomor.emitDomEvent(EVENT.FOCUSOUT, event),\n { signal },\n );\n root.addEventListener(\n 'click',\n (event) => mrakomor.emitDomEvent(EVENT.CLICK, event),\n { signal },\n );\n document.addEventListener(\n 'selectionchange',\n (event) => mrakomor.emitDomEvent(EVENT.SELECTION_CHANGE, event),\n { signal },\n );\n },\n };\n}\n", "import { createElement, Component } from '@esmj/dom';\n\nexport class InlineElement extends Component {\n static get nodeName() {\n return 'span';\n }\n\n static get style() {\n return 'SPAN';\n }\n\n static match(node) {\n if (node.nodeName === this.nodeName.toUpperCase()) {\n return true;\n }\n\n if (node.style === this.style) {\n return true;\n }\n\n return false;\n }\n\n getState() {\n return { style: this.constructor.style };\n }\n\n render() {\n const element = createElement(\n this.constructor.nodeName,\n {},\n this.props.children,\n );\n\n return element;\n }\n}\n", "import { createElement } from '@esmj/dom';\nimport { InlineElement } from './InlineElement.mjs';\n\nexport class Bold extends InlineElement {\n static get nodeName() {\n return 'b';\n }\n\n static get style() {\n return 'BOLD';\n }\n\n static get LABEL() {\n return createElement('b', {}, 'B');\n }\n\n static match(node) {\n if (node.nodeName === 'strong') {\n return true;\n }\n\n return super.match(node);\n }\n}\n", "import { createElement } from '@esmj/dom';\nimport { InlineElement } from './InlineElement.mjs';\n\nexport class Italic extends InlineElement {\n static get nodeName() {\n return 'i';\n }\n\n static get style() {\n return 'ITALIC';\n }\n\n static get LABEL() {\n return createElement('i', {}, 'I');\n }\n}\n", "import { createElement } from '@esmj/dom';\nimport { InlineElement } from './InlineElement.mjs';\n\nexport class Underline extends InlineElement {\n static get nodeName() {\n return 'u';\n }\n\n static get style() {\n return 'UNDERLINE';\n }\n\n static get LABEL() {\n return createElement('u', {}, 'U');\n }\n}\n", "import { createElement } from '@esmj/dom';\nimport { InlineElement } from './InlineElement.mjs';\n\nexport class Superscript extends InlineElement {\n static get nodeName() {\n return 'sup';\n }\n\n static get style() {\n return 'SUPERSCRIPT';\n }\n\n static get LABEL() {\n return createElement('sup', {}, 'Sup');\n }\n}\n", "import { createElement } from '@esmj/dom';\nimport { InlineElement } from './InlineElement.mjs';\n\nexport class Subscript extends InlineElement {\n static get nodeName() {\n return 'sub';\n }\n\n static get style() {\n return 'SUBSCRIPT';\n }\n\n static get LABEL() {\n return createElement('sub', {}, 'Sub');\n }\n}\n", "import {\n createElement,\n Show,\n mount,\n afterRender,\n useRef,\n} from '@esmj/dom';\nimport { computed, createSignal } from '@esmj/signals';\n\nimport { collapseGlobalSelectionState, positionAboveAnchor } from '#src/dom.mjs';\nimport { EVENT } from '../../emitter.mjs';\n\nexport const DIALOG_NAMESPACE = 'mrakomor.dialog.Dialog';\n\n/**\n * Floating dialog overlay.\n * @param {{ open: import('#src/types.mjs').Signal<boolean>, positionX: import('#src/types.mjs').Signal<number>, positionY: import('#src/types.mjs').Signal<number>, block: import('#src/types.mjs').Signal<*>, dialogRef: import('#src/types.mjs').ElementRef }} props\n * @returns {*}\n */\nexport function Dialog({ open, positionX, positionY, block, dialogRef }) {\n const style = computed(() => ({\n position: 'absolute',\n zIndex: '9000',\n top: `${positionY.get()}px`,\n left: `${positionX.get()}px`,\n background: '#fff',\n border: '1px solid #ccc',\n borderRadius: '4px',\n padding: '8px 10px',\n boxShadow: '0 2px 8px rgba(0,0,0,.15)',\n minWidth: '220px',\n }));\n\n return Show(\n () => open.get(),\n createElement(\n 'div',\n {\n className: 'mrakomor-dialog-container',\n contenteditable: false,\n style,\n $ref: dialogRef,\n },\n () => block.get(),\n ),\n );\n}\n\nDialog.NAMESPACE = DIALOG_NAMESPACE;\n\n/**\n * Registers `command.openDialog` / `closeDialog` and mounts the dialog overlay.\n * @param {import('#src/types.mjs').PluginContext} options\n * @returns {import('#src/types.mjs').Plugin}\n */\nexport function dialogPlugin({ mrakomor }) {\n let mountDisposer = null;\n\n const rendered = createSignal(false);\n const open = createSignal(false);\n const positionX = createSignal(0);\n const positionY = createSignal(0);\n const block = createSignal(null);\n\n let anchorElement = useRef(null);\n let dialogElement = useRef(null);\n\n /** Hide the dialog and collapse the stored selection. */\n function closeDialogState() {\n open.set(false);\n collapseGlobalSelectionState();\n anchorElement.set(null);\n\n afterRender(() => {\n rendered.set(false);\n });\n }\n\n return {\n resolveComponent(namespace) {\n if (namespace === DIALOG_NAMESPACE) {\n return Dialog;\n }\n },\n\n registerEvents() {\n EVENT.OPEN_DIALOG = 'mrakomor:open-dialog';\n EVENT.CLOSE_DIALOG = 'mrakomor:close-dialog';\n },\n\n registerCommands(m) {\n m.command.openDialog = (dialog, options) => {\n m.emit(EVENT.OPEN_DIALOG, { ...dialog, options });\n };\n m.command.closeDialog = () => {\n m.emit(EVENT.CLOSE_DIALOG);\n };\n },\n\n registerHandlers() {\n mrakomor.emitter.on(\n EVENT.OPEN_DIALOG,\n ({ children, element: el }) => {\n block.set(children ?? createElement('div', {}, 'Empty dialog'));\n open.set(true);\n anchorElement.set(el);\n\n afterRender(() => {\n const { x, y } = positionAboveAnchor(\n mrakomor.getRoot(),\n el ?? { left: 0, top: 0 },\n dialogElement,\n );\n positionX.set(x);\n positionY.set(y);\n rendered.set(true);\n });\n },\n );\n\n mrakomor.emitter.on(EVENT.CLOSE_DIALOG, closeDialogState);\n\n mrakomor.emitter.on(EVENT.KEYDOWN, (e) => {\n if (e.key === 'Escape' && open.peek() === true) {\n mrakomor.command.closeDialog();\n }\n });\n\n mrakomor.emitter.on(EVENT.CLICK, (e) => {\n if (\n open.peek() === true &&\n rendered.peek() === true &&\n (dialogElement &&\n !dialogElement.contains(e.target) &&\n (anchorElement &&\n !anchorElement.contains(e.target)))\n ) {\n mrakomor.command.closeDialog();\n }\n });\n },\n\n onMount() {\n const toolsContainer = mrakomor\n .getRoot()\n ?.querySelector('.mrakomor-tools-container');\n\n if (!toolsContainer) {\n return;\n }\n\n const pluginContainer = document.createElement('div');\n pluginContainer.className = 'mrakomor-dialog-plugin-container';\n toolsContainer.append(pluginContainer);\n\n mountDisposer = mount(\n pluginContainer,\n createElement(Dialog, {\n open,\n positionX,\n positionY,\n block,\n dialogRef: dialogElement,\n }),\n );\n },\n\n onUnmount() {\n mountDisposer?.();\n mountDisposer = null;\n },\n };\n}\n", "import {\n createElement,\n Show,\n mount,\n onMount,\n keepLiteral,\n afterRender,\n useRef,\n} from '@esmj/dom';\nimport { computed, createSignal } from '@esmj/signals';\n\nimport {\n getBlockElementByRange,\n getBlockElementInstance,\n getSelectionState,\n restoreSelectionState,\n storeGlobalSelectionState,\n restoreGlobalSelectionState,\n positionAboveAnchor,\n} from '#src/dom.mjs';\nimport { EVENT } from '../../emitter.mjs';\nimport { getEntityRangeMeta } from '../../component/block/helpers.mjs';\n\n/**\n * Floating selection tooltip.\n * @param {{ mrakomor: import('#src/types.mjs').Mrakomor, open: import('#src/types.mjs').Signal<boolean>, tooltipElement: import('#src/types.mjs').ElementRef }} props\n * @returns {*}\n */\nexport function Tooltip({ mrakomor, open, tooltipElement }) {\n const positionX = createSignal(0);\n const positionY = createSignal(0);\n const actions = createSignal([]);\n\n let anchorElement = null;\n let savedSelection = null;\n\n /** Hide the tooltip and drop the saved selection. */\n function close() {\n open.set(false);\n anchorElement = null;\n savedSelection = null;\n }\n\n onMount(() => {\n const unsubscribeOpen = mrakomor.emitter.on(\n EVENT.OPEN_TOOLTIP,\n ({ element, actions: newActions }) => {\n anchorElement = element;\n savedSelection = getSelectionState();\n actions.set(newActions ?? []);\n open.set(true);\n\n afterRender(() => {\n const { x, y } = positionAboveAnchor(\n mrakomor.getRoot(),\n element,\n tooltipElement,\n );\n positionX.set(x);\n positionY.set(y);\n });\n },\n );\n\n const unsubscribeClose = mrakomor.emitter.on(EVENT.CLOSE_TOOLTIP, close);\n\n const unsubscribeKeydown = mrakomor.emitter.on(EVENT.KEYDOWN, () => {\n if (open.peek() === true) {\n close();\n }\n });\n\n const unsubscribeClick = mrakomor.emitter.on(EVENT.CLICK, (e) => {\n if (\n open.peek() === true &&\n tooltipElement.current &&\n !tooltipElement.current.contains(e.target) &&\n anchorElement &&\n !anchorElement.contains(e.target)\n ) {\n close();\n }\n });\n\n return () => {\n unsubscribeOpen();\n unsubscribeClose();\n unsubscribeKeydown();\n unsubscribeClick();\n };\n });\n\n const style = computed(() => ({\n left: `${positionX.get()}px`,\n top: `${positionY.get()}px`,\n }));\n\n return Show(\n () => open.get(),\n createElement(\n 'div',\n {\n className: 'mrakomor-tooltip',\n contenteditable: false,\n style,\n $ref: tooltipElement,\n },\n () => buildButtons(actions.get(), mrakomor, savedSelection),\n ),\n );\n}\n\n/**\n * Tooltip action buttons; restores the saved selection before `onAction`.\n * @param {import('#src/types.mjs').TooltipAction[]} actionList\n * @param {import('#src/types.mjs').Mrakomor} mrakomor\n * @param {import('#src/types.mjs').SelectionState | null} savedSelection\n * @returns {object | null}\n */\nfunction buildButtons(actionList, mrakomor, savedSelection) {\n if (!actionList.length) {\n return null;\n }\n\n let lastGroup = null;\n const children = [];\n\n for (const action of actionList) {\n if (lastGroup !== null && action.group !== lastGroup) {\n children.push(\n createElement('span', { className: 'mrakomor-tooltip__separator' }),\n );\n }\n lastGroup = action.group;\n\n const label = action.label;\n // label can be: a string, a component constructor (function), or an already-created vnode (object)\n const labelNode =\n typeof label === 'string'\n ? label\n : typeof label === 'function'\n ? createElement(label, {})\n : label;\n\n children.push(\n createElement(\n 'button',\n {\n type: 'button',\n className: [\n 'mrakomor-tooltip__btn',\n action.active?.() ? 'mrakomor-tooltip__btn--active' : '',\n ]\n .filter(Boolean)\n .join(' '),\n title: action.title ?? '',\n onClick: (e) => {\n e.preventDefault();\n\n // Restore the text selection that was active when the tooltip\n // opened \u2014 clicking the button cleared it.\n // restore selection has problem with inserted entity ranges \n restoreSelectionState(savedSelection);\n action.onAction(mrakomor);\n },\n },\n labelNode,\n ),\n );\n }\n\n // @esmj/dom does not support array returns from reactive children \u2014\n // wrap in a display:contents span so the flex layout is unaffected.\n return createElement('span', { style: 'display: contents' }, children);\n}\n\n/**\n * Selection-driven formatting tooltip.\n * @param {import('#src/types.mjs').PluginContext} options\n * @returns {import('#src/types.mjs').Plugin}\n */\nexport function tooltipPlugin({ mrakomor }) {\n let removeSelectionListener = null;\n let dialogOpen = false;\n\n const open = createSignal(false);\n const tooltipElement = useRef(null);\n\n // \u2500\u2500 helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * Inline styles / entity ranges / block transforms from editor config.\n * @returns {{ inlineStyles: Function[], entityRanges: Function[], blockTransforms: Function[] }}\n */\n function resolveTooltipConfig() {\n const config = mrakomor.getConfig();\n\n return {\n inlineStyles: config.inlineStyles,\n entityRanges: config.entityRanges,\n blockTransforms: config.blockComponents,\n };\n }\n\n /**\n * Toggle actions for inline styles and entity ranges on the current selection.\n * @returns {import('#src/types.mjs').TooltipAction[]}\n */\n function buildInlineActions(config, blockState, blockElement, range, formattingTarget) {\n const actions = [];\n const globalInlineStyles = mrakomor.getConfig()?.inlineStyles ?? [];\n const globalEntityRanges = mrakomor.getConfig()?.entityRanges ?? [];\n\n const ranges =\n formattingTarget?.read?.(blockState) ?? {\n inlineStyleRanges: blockState?.properties?.inlineStyleRanges,\n entityRanges: blockState?.properties?.entityRanges,\n };\n const contentElement =\n formattingTarget?.element ?? blockElement;\n const inlineStyleRanges = ranges?.inlineStyleRanges ?? [];\n\n // Compute which text offsets are selected so we can check real overlap\n const { offset: selStart, length: selLength } = getEntityRangeMeta(\n contentElement,\n range,\n );\n const selEnd = selStart + selLength;\n\n for (const inlineStyle of config.inlineStyles) {\n const styleKey = typeof inlineStyle === 'string' ? inlineStyle : inlineStyle.style;\n const Constructor = globalInlineStyles.find((C) => C.style === styleKey);\n if (!Constructor) {\n continue;\n }\n // active = at least one inlineStyleRange with this style overlaps the selection\n const active = inlineStyleRanges.some(\n (r) =>\n r.style === styleKey &&\n r.offset < selEnd &&\n r.offset + r.length > selStart,\n );\n actions.push({\n label: Constructor.LABEL ?? styleKey,\n title: styleKey.charAt(0) + styleKey.slice(1).toLowerCase(),\n group: 'inline',\n active: () => active,\n onAction: (m) => {\n\n //TODO maybe mobe restoring selection to command directly\n storeGlobalSelectionState();\n m.command.insertInlineStyleRange({ style: Constructor.style });\n afterRender(() => {\n restoreGlobalSelectionState();\n });\n },\n });\n }\n\n for (const entityRange of config.entityRanges) {\n const namespace = typeof entityRange === 'string' ? entityRange : entityRange.NAMESPACE;\n const Constructor = globalEntityRanges.find(\n (C) => C.NAMESPACE === namespace,\n );\n if (!Constructor) {\n continue;\n }\n // Capture selection data at action-build time so clicking the button\n // (which clears the selection) doesn't break the insertion.\n actions.push({\n label: Constructor.LABEL ?? '\uD83D\uDD17',\n title: Constructor.NAMESPACE,\n group: 'inline',\n active: () => false,\n onAction: (m) => {\n storeGlobalSelectionState();\n m.command.insertEntityRange({\n namespace: Constructor.NAMESPACE,\n blockElement\n });\n },\n });\n }\n\n return actions;\n }\n\n /**\n * No-op toolbar item showing the current block type.\n * @param {import('#src/types.mjs').BlockConstructor} Constructor\n * @returns {import('#src/types.mjs').TooltipAction}\n */\n function buildCurrentBlockAction(Constructor) {\n return {\n label: Constructor.LABEL ?? Constructor.NAMESPACE,\n title: Constructor.LABEL ?? Constructor.NAMESPACE,\n group: 'transform',\n active: () => true,\n onAction: () => {}, // no-op \u2014 already this type\n };\n }\n\n /**\n * Convert-to-block-type actions (skips the current type).\n * @returns {import('#src/types.mjs').TooltipAction[]}\n */\n function buildTransformActions(config, blockElement, CurrentConstructor) {\n const actions = [];\n\n for (const transform of config.blockTransforms) {\n const namespace = typeof transform === 'string' ? transform : transform.NAMESPACE;\n\n // skip self \u2014 it is already shown as the active current-block button\n if (namespace === CurrentConstructor.NAMESPACE) {\n continue;\n }\n const Constructor = mrakomor.resolveComponentConstructor(namespace);\n if (!Constructor) {\n continue;\n }\n actions.push({\n label: Constructor.LABEL ?? namespace,\n title: `Convert to ${Constructor.LABEL ?? namespace}`,\n group: 'transform',\n active: () => false,\n onAction: (m) => {\n m.command.transformBlockElement({ blockElement, namespace });\n },\n });\n }\n\n return actions;\n }\n\n /** Show or hide the tooltip from the live selection. */\n function onSelectionChange() {\n if (dialogOpen) {\n return;\n }\n\n const selection = window.getSelection();\n const root = mrakomor.getRoot();\n\n if (!selection || selection.rangeCount === 0) {\n mrakomor.command.closeTooltip();\n return;\n }\n\n const range = selection.getRangeAt(0);\n\n if (!root.contains(range.commonAncestorContainer)) {\n mrakomor.command.closeTooltip();\n return;\n }\n\n if (range.startContainer === tooltipElement.current && open.peek() === true) {\n return;\n }\n \n \n const blockElement = getBlockElementByRange(range);\n if (!blockElement) {\n mrakomor.command.closeTooltip();\n return;\n }\n\n const instance = getBlockElementInstance(blockElement);\n if (!instance) {\n mrakomor.command.closeTooltip();\n return;\n }\n\n const Constructor = instance.constructor;\n const config = resolveTooltipConfig();\n const blockState = instance.getState();\n const formattingTarget = instance.getFormattingTarget?.(range) ?? null;\n\n let actions;\n if (range.collapsed) {\n return;\n // Caret only \u2192 block transforms\n actions = [\n buildCurrentBlockAction(Constructor),\n ...buildTransformActions(config, blockElement, Constructor),\n ];\n } else {\n // Text selected \u2192 current block type + transforms + inline formatting\n actions = [\n buildCurrentBlockAction(Constructor),\n ...buildTransformActions(config, blockElement, Constructor),\n ...buildInlineActions(\n config,\n blockState,\n blockElement,\n range,\n formattingTarget,\n ),\n ];\n }\n\n if (actions.length === 0) {\n mrakomor.command.closeTooltip();\n return;\n }\n\n mrakomor.command.openTooltip({ element: blockElement, actions });\n }\n\n // \u2500\u2500 plugin interface \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n return {\n registerEvents() {\n EVENT.OPEN_TOOLTIP = 'mrakomor:open-tooltip';\n EVENT.CLOSE_TOOLTIP = 'mrakomor:close-tooltip';\n },\n\n registerCommands(m) {\n m.command.openTooltip = (tooltip, options) => {\n m.emit(EVENT.OPEN_TOOLTIP, { ...tooltip, options });\n };\n m.command.closeTooltip = (options) => {\n m.emit(EVENT.CLOSE_TOOLTIP, { options });\n };\n },\n\n registerListeners() {\n mrakomor.emitter.on(EVENT.SELECTION_CHANGE, onSelectionChange);\n if (EVENT.OPEN_DIALOG) {\n mrakomor.emitter.on(EVENT.OPEN_DIALOG, () => {\n dialogOpen = true;\n if (open.peek() === true) {\n mrakomor.command.closeTooltip();\n }\n });\n }\n if (EVENT.CLOSE_DIALOG) {\n mrakomor.emitter.on(EVENT.CLOSE_DIALOG, () => {\n dialogOpen = false;\n });\n }\n },\n\n onMount() {\n const toolsContainer = mrakomor\n .getRoot()\n .querySelector('.mrakomor-tools-container');\n\n if (!toolsContainer) return;\n\n const pluginContainer = document.createElement('div');\n pluginContainer.className = 'mrakomor-tooltip-plugin-container';\n toolsContainer.append(pluginContainer);\n\n mount(\n pluginContainer,\n createElement(Tooltip, {\n mrakomor: keepLiteral(mrakomor),\n tooltipElement,\n open,\n }),\n );\n },\n };\n}\n", "import { createElement } from '@esmj/dom';\n\nimport { BLOCK_ELEMENT_BODY } from '../../dom.mjs';\nimport { EVENT } from '../../emitter.mjs';\n\nconst DRAG_HANDLE_ICON = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"currentColor\" aria-hidden=\"true\"><circle cx=\"4\" cy=\"3\" r=\"1.2\"/><circle cx=\"10\" cy=\"3\" r=\"1.2\"/><circle cx=\"4\" cy=\"7\" r=\"1.2\"/><circle cx=\"10\" cy=\"7\" r=\"1.2\"/><circle cx=\"4\" cy=\"11\" r=\"1.2\"/><circle cx=\"10\" cy=\"11\" r=\"1.2\"/></svg>`;\n\n/**\n * Drop index from pointer Y: first block whose midline is below `clientY`.\n * @param {number} clientY\n * @param {Element[]} blockElements\n * @returns {number}\n */\nfunction computeTargetIndex(clientY, blockElements) {\n for (let i = 0; i < blockElements.length; i++) {\n const rect = blockElements[i].getBoundingClientRect();\n if (clientY < rect.top + rect.height / 2) {\n return i;\n }\n }\n\n return blockElements.length;\n}\n\n/**\n * Position the drop indicator line relative to the content root.\n * @param {HTMLElement | null} indicator\n * @param {Element} contentRoot\n * @param {number} targetIndex\n * @param {Element[]} blockElements\n */\nfunction updateDropIndicator(indicator, contentRoot, targetIndex, blockElements) {\n if (!indicator || !contentRoot) {\n return;\n }\n\n if (targetIndex >= blockElements.length) {\n const last = blockElements[blockElements.length - 1];\n if (!last) {\n indicator.style.display = 'none';\n return;\n }\n\n const contentRect = contentRoot.getBoundingClientRect();\n const lastRect = last.getBoundingClientRect();\n indicator.style.display = 'block';\n indicator.style.top = `${lastRect.bottom - contentRect.top}px`;\n return;\n }\n\n const target = blockElements[targetIndex];\n const contentRect = contentRoot.getBoundingClientRect();\n const targetRect = target.getBoundingClientRect();\n\n indicator.style.display = 'block';\n indicator.style.top = `${targetRect.top - contentRect.top}px`;\n}\n\n/**\n * Gutter UI: insert (+) and drag handle.\n * @returns {*}\n */\nexport function BlockChrome() {\n return createElement(\n 'div',\n {\n className: 'mrakomor-block-gutter',\n contentEditable: false,\n },\n [\n createElement(\n 'button',\n {\n type: 'button',\n className: 'mrakomor-block-add',\n 'aria-label': 'Insert block',\n contentEditable: false,\n },\n '+',\n ),\n createElement('button', {\n type: 'button',\n className: 'mrakomor-block-drag',\n 'aria-label': 'Drag to reorder',\n contentEditable: false,\n $dangerouslySetInnerHTML: DRAG_HANDLE_ICON,\n }),\n ],\n );\n}\n\n/**\n * Block gutter: insert (+) and drag-to-reorder.\n * @param {import('#src/types.mjs').PluginContext} options\n * @returns {import('#src/types.mjs').Plugin}\n */\nexport function blockChromePlugin({ mrakomor }) {\n let dropIndicator = null;\n let dragState = null;\n\n /** End a gutter drag: classes, pointer capture, indicator. */\n function cleanupDrag() {\n if (dragState?.blockElement) {\n dragState.blockElement.classList.remove(\n 'mrakomor-block-element--active',\n 'mrakomor-block-element--dragging',\n );\n }\n\n if (dragState?.handle) {\n dragState.handle.releasePointerCapture?.(dragState.pointerId);\n }\n\n if (dropIndicator) {\n dropIndicator.style.display = 'none';\n }\n\n document.body.classList.remove('mrakomor-block-drag-active');\n dragState = null;\n }\n\n /** Update drop target while dragging. */\n function onPointerMove(e) {\n if (!dragState || e.pointerId !== dragState.pointerId) {\n return;\n }\n\n const contentRoot = mrakomor.getRoot()?.querySelector('.mrakomor-content');\n if (!contentRoot) {\n return;\n }\n\n const blockElements = [\n ...contentRoot.querySelectorAll('.mrakomor-block-element'),\n ];\n const targetIndex = computeTargetIndex(e.clientY, blockElements);\n dragState.targetIndex = targetIndex;\n\n updateDropIndicator(\n dropIndicator,\n contentRoot,\n targetIndex,\n blockElements,\n );\n }\n\n /** Drop: `moveBlockElement` then cleanup. */\n function onPointerUp(e) {\n if (!dragState || e.pointerId !== dragState.pointerId) {\n return;\n }\n\n const { blockElement, targetIndex } = dragState;\n cleanupDrag();\n mrakomor.command.moveBlockElement({ blockElement, targetIndex });\n }\n\n /** Start a gutter drag from the handle. */\n function onDragPointerDown(e) {\n const handle = e.target.closest?.('.mrakomor-block-drag');\n if (!handle) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n const blockElement = handle.closest('.mrakomor-block-element');\n if (!blockElement) {\n return;\n }\n\n if (dragState) {\n cleanupDrag();\n }\n\n const fromIndex = mrakomor._getBlockElementIndex(blockElement);\n if (fromIndex === -1) {\n return;\n }\n\n const pointerId = e.pointerId ?? 1;\n handle.setPointerCapture?.(pointerId);\n\n blockElement.classList.add(\n 'mrakomor-block-element--active',\n 'mrakomor-block-element--dragging',\n );\n\n document.body.classList.add('mrakomor-block-drag-active');\n\n dragState = {\n blockElement,\n pointerId,\n handle,\n fromIndex,\n targetIndex: fromIndex,\n };\n }\n\n /** Document-level move while a drag is active. */\n function onDocumentMove(e) {\n onPointerMove({\n pointerId: dragState?.pointerId ?? 1,\n clientY: e.clientY,\n });\n }\n\n /** Document-level pointerup while a drag is active. */\n function onDocumentUp(e) {\n onPointerUp({\n pointerId: dragState?.pointerId ?? 1,\n });\n }\n\n return {\n wrapBlockElement(blockComponent) {\n return [\n createElement(BlockChrome),\n createElement(\n 'div',\n { className: 'mrakomor-block-body', [BLOCK_ELEMENT_BODY]: true },\n blockComponent,\n ),\n ];\n },\n\n registerHandlers() {\n mrakomor.emitter.on(EVENT.CLICK, (e) => {\n const addButton = e.target?.closest?.('.mrakomor-block-add');\n if (!addButton) {\n return;\n }\n\n e.preventDefault?.();\n e.stopPropagation?.();\n\n const blockElement = addButton.closest('.mrakomor-block-element');\n if (!blockElement) {\n return;\n }\n\n mrakomor.command.openBlockInsertMenu({\n blockElement,\n anchorRect: addButton.getBoundingClientRect(),\n });\n });\n\n mrakomor.emitter.on(EVENT.KEYDOWN, (e) => {\n if (e.key === 'Escape' && dragState) {\n cleanupDrag();\n }\n });\n },\n\n onMount() {\n const { signal } = mrakomor.listenerAbortController;\n\n document.addEventListener('pointerdown', onDragPointerDown, {\n capture: true,\n signal,\n });\n document.addEventListener('mousedown', onDragPointerDown, {\n capture: true,\n signal,\n });\n\n const contentRoot = mrakomor\n .getRoot()\n ?.querySelector('.mrakomor-content');\n\n if (contentRoot) {\n dropIndicator = document.createElement('div');\n dropIndicator.className = 'mrakomor-block-drop-indicator';\n dropIndicator.style.display = 'none';\n contentRoot.append(dropIndicator);\n }\n\n document.addEventListener('pointermove', onPointerMove, { signal });\n document.addEventListener('pointerup', onPointerUp, { signal });\n document.addEventListener('pointercancel', onPointerUp, { signal });\n document.addEventListener('mousemove', onDocumentMove, { signal });\n document.addEventListener('mouseup', onDocumentUp, { signal });\n },\n\n onUnmount() {\n cleanupDrag();\n dropIndicator?.remove();\n dropIndicator = null;\n },\n };\n}\n", "import {\n createElement,\n Show,\n mount,\n afterRender,\n useRef,\n} from '@esmj/dom';\nimport { computed, createSignal } from '@esmj/signals';\nimport { createComponentId, positionAboveAnchor } from '../../dom.mjs';\nimport { EVENT } from '../../emitter.mjs';\nimport {\n HEADLINE_H1_NAMESPACE,\n HEADLINE_H2_NAMESPACE,\n HEADLINE_H3_NAMESPACE,\n HEADLINE_H4_NAMESPACE,\n HEADLINE_H5_NAMESPACE,\n PARAGRAPH_NAMESPACE,\n} from '../../namespaces.mjs';\n\nconst DEFAULT_INSERTABLE_BLOCKS = [\n PARAGRAPH_NAMESPACE,\n HEADLINE_H1_NAMESPACE,\n HEADLINE_H2_NAMESPACE,\n HEADLINE_H3_NAMESPACE,\n HEADLINE_H4_NAMESPACE,\n HEADLINE_H5_NAMESPACE,\n 'molecule.figure.Figure',\n];\n\n/**\n * Insert-menu entries from `insertableBlocks`, `blockComponents`, and `blockInsertVariants`.\n * @param {import('#src/types.mjs').Mrakomor} mrakomor\n * @returns {import('#src/types.mjs').BlockInsertItem[]}\n */\nfunction buildInsertItems(mrakomor) {\n const namespaces = mrakomor.getConfig()?.insertableBlocks ?? [];\n const extra = (mrakomor.getConfig()?.blockComponents ?? []).map(\n (C) => C.NAMESPACE,\n );\n const variants = mrakomor.getConfig()?.blockInsertVariants ?? [];\n const variantNamespaces = new Set(variants.map((v) => v.namespace));\n const seen = new Set();\n const items = [];\n\n for (const variant of variants) {\n items.push({\n namespace: variant.namespace,\n label: variant.label,\n settings: variant.settings,\n });\n }\n\n for (const namespace of [...namespaces, ...extra]) {\n if (seen.has(namespace) || variantNamespaces.has(namespace)) {\n continue;\n }\n seen.add(namespace);\n\n const Constructor = mrakomor.resolveComponentConstructor(namespace);\n if (!Constructor) {\n continue;\n }\n\n items.push({\n namespace,\n label: Constructor.LABEL ?? namespace,\n });\n }\n\n return items;\n}\n\n/**\n * Buttons for the insert menu (wrapped in display:contents).\n * @param {import('#src/types.mjs').BlockInsertItem[]} items\n * @returns {object | null}\n */\nfunction buildMenuItems(items) {\n if (!items.length) {\n return null;\n }\n\n const children = items.map((item) =>\n createElement(\n 'button',\n {\n type: 'button',\n className: 'mrakomor-block-insert-menu__item',\n title: item.label,\n 'data-namespace': item.namespace,\n 'data-settings': item.settings\n ? JSON.stringify(item.settings)\n : undefined,\n },\n item.label,\n ),\n );\n\n return createElement('span', { style: 'display: contents' }, children);\n}\n\n/**\n * Floating block-insert menu overlay.\n * @param {{ open: import('#src/types.mjs').Signal<boolean>, positionX: import('#src/types.mjs').Signal<number>, positionY: import('#src/types.mjs').Signal<number>, items: import('#src/types.mjs').Signal<import('#src/types.mjs').BlockInsertItem[]>, menuRef: import('#src/types.mjs').ElementRef }} props\n * @returns {*}\n */\nexport function BlockInsertMenu({ open, positionX, positionY, items, menuRef }) {\n const style = computed(() => ({\n left: `${positionX.get()}px`,\n top: `${positionY.get()}px`,\n }));\n\n return Show(\n () => open.get(),\n createElement(\n 'div',\n {\n className: 'mrakomor-block-insert-menu',\n contenteditable: false,\n style,\n $ref: menuRef,\n },\n () => buildMenuItems(items.get()),\n ),\n );\n}\n\n/**\n * Slash / plus insert menu for new blocks.\n * @param {import('#src/types.mjs').PluginContext} options\n * @returns {import('#src/types.mjs').Plugin}\n */\nexport function blockInsertMenuPlugin({ mrakomor }) {\n let mountDisposer = null;\n const menuElement = useRef(null);\n let anchorBlockElement = null;\n\n const rendered = createSignal(false);\n const open = createSignal(false);\n const positionX = createSignal(0);\n const positionY = createSignal(0);\n const items = createSignal([]);\n\n /** Close the menu and clear the active block highlight. */\n function close() {\n open.set(false);\n if (anchorBlockElement) {\n anchorBlockElement.classList.remove('mrakomor-block-element--active');\n }\n anchorBlockElement = null;\n\n afterRender(() => {\n rendered.set(false);\n });\n }\n\n /**\n * Namespace for an insert-menu button (`data-namespace` or label match).\n * @param {HTMLElement} button\n * @returns {string | undefined}\n */\n function resolveNamespaceFromButton(button) {\n const fromDataset = button.dataset.namespace;\n if (fromDataset) {\n return fromDataset;\n }\n\n const label = button.textContent.trim();\n const namespaces = mrakomor.getConfig()?.insertableBlocks ?? [];\n\n return namespaces.find((ns) => {\n const Constructor = mrakomor.resolveComponentConstructor(ns);\n return (Constructor?.LABEL ?? ns) === label;\n });\n }\n\n return {\n resolveConfig(config) {\n return {\n ...config,\n insertableBlocks:\n config.insertableBlocks ?? DEFAULT_INSERTABLE_BLOCKS,\n };\n },\n\n registerEvents() {\n EVENT.OPEN_BLOCK_INSERT_MENU = 'mrakomor:open-block-insert-menu';\n EVENT.CLOSE_BLOCK_INSERT_MENU = 'mrakomor:close-block-insert-menu';\n },\n\n registerCommands(m) {\n m.command.openBlockInsertMenu = ({ blockElement, anchorRect }) => {\n m.emit(EVENT.OPEN_BLOCK_INSERT_MENU, {\n blockElement,\n anchorRect,\n });\n };\n m.command.closeBlockInsertMenu = () => {\n m.emit(EVENT.CLOSE_BLOCK_INSERT_MENU);\n };\n },\n\n registerHandlers() {\n mrakomor.emitter.on(\n EVENT.OPEN_BLOCK_INSERT_MENU,\n ({ blockElement, anchorRect }) => {\n if (anchorBlockElement) {\n anchorBlockElement.classList.remove(\n 'mrakomor-block-element--active',\n );\n }\n\n anchorBlockElement = blockElement;\n blockElement?.classList.add('mrakomor-block-element--active');\n items.set(buildInsertItems(mrakomor));\n open.set(true);\n\n afterRender(() => {\n const root = mrakomor.getRoot();\n const menuHeight = menuElement?.offsetHeight ?? 200;\n const rootRect = root.getBoundingClientRect();\n const anchorTop = anchorRect.top - rootRect.top;\n\n if (anchorTop > menuHeight + 8) {\n const { x, y } = positionAboveAnchor(\n root,\n anchorRect,\n { offsetHeight: menuHeight },\n 4,\n );\n positionX.set(x);\n positionY.set(y);\n } else {\n positionX.set(anchorRect.left - rootRect.left);\n positionY.set(anchorRect.bottom - rootRect.top + 4);\n }\n\n rendered.set(true);\n });\n },\n );\n\n mrakomor.emitter.on(\n EVENT.CLOSE_BLOCK_INSERT_MENU,\n close,\n );\n\n mrakomor.emitter.on(EVENT.KEYDOWN, (e) => {\n if (e.key === 'Escape' && open.peek() === true) {\n close();\n }\n });\n\n mrakomor.emitter.on(EVENT.CLICK, (e) => {\n if (\n open.peek() === true &&\n rendered.peek() === true &&\n menuElement &&\n !menuElement.contains(e.target)\n ) {\n close();\n }\n });\n\n mrakomor.emitter.on(EVENT.CLICK, (e) => {\n const button = e.target?.closest?.('.mrakomor-block-insert-menu__item');\n if (!button || !anchorBlockElement) {\n return;\n }\n\n e.preventDefault?.();\n e.stopPropagation?.();\n\n const namespace = resolveNamespaceFromButton(button);\n if (!namespace) {\n return;\n }\n\n const Constructor = mrakomor.resolveComponentConstructor(namespace);\n if (!Constructor) {\n return;\n }\n\n let settings;\n if (button.dataset.settings) {\n try {\n settings = JSON.parse(button.dataset.settings);\n } catch {\n settings = undefined;\n }\n }\n\n const newLineState = Constructor.getStateSchema().parse({\n componentId: createComponentId(),\n component: namespace,\n ...(settings ? { settings } : {}),\n });\n\n mrakomor.command.insertBlockElement({\n blockElement: anchorBlockElement,\n namespace,\n newLineState,\n cursor: 0,\n });\n\n mrakomor.command.closeBlockInsertMenu();\n });\n },\n\n onMount() {\n const toolsContainer = mrakomor\n .getRoot()\n ?.querySelector('.mrakomor-tools-container');\n\n if (!toolsContainer) {\n return;\n }\n\n const pluginContainer = document.createElement('div');\n pluginContainer.className = 'mrakomor-block-insert-menu-container';\n toolsContainer.append(pluginContainer);\n\n mountDisposer = mount(\n pluginContainer,\n createElement(BlockInsertMenu, {\n open,\n positionX,\n positionY,\n items,\n menuRef: menuElement,\n }),\n );\n },\n\n onUnmount() {\n mountDisposer?.();\n mountDisposer = null;\n menuElement.current = null;\n anchorBlockElement = null;\n },\n };\n}\n", "import { PARAGRAPH_NAMESPACE } from '#src/namespaces.mjs';\nimport {\n buildRichTextFragment,\n parseRichTextChildNodes,\n splitStateByCursor,\n normalizeBlockText,\n} from '#src/component/block/helpers.mjs';\nimport { createComponentId, getOffsetInSelectable } from '#src/dom.mjs';\n\n/**\n * @typedef {import('#src/types.mjs').ListItem} ListItem\n * @typedef {import('#src/types.mjs').ListBlockState} ListBlockState\n * @typedef {import('#src/types.mjs').RichTextComponents} RichTextComponents\n * @typedef {import('#src/types.mjs').UnwrapListResult} UnwrapListResult\n */\n\n/**\n * Ensure Each keys stay unique even if CMS/DOM already duplicated ids.\n * @param {ListItem[]} [items]\n * @returns {ListItem[]}\n */\nexport function ensureUniqueListItemIds(items = []) {\n const seen = new Set();\n return items.map((item) => {\n if (item?.componentId && !seen.has(item.componentId)) {\n seen.add(item.componentId);\n return item;\n }\n const componentId = createComponentId();\n seen.add(componentId);\n return { ...item, componentId };\n });\n}\n\n/**\n * Find the <li> that contains the selection range within a list root.\n * @param {Element} listRoot\n * @param {Range | null} range\n * @returns {HTMLLIElement | null}\n */\nexport function getActiveListItem(listRoot, range) {\n if (!listRoot || !range) {\n return null;\n }\n\n let node = range.startContainer;\n if (node.nodeType === Node.TEXT_NODE) {\n node = node.parentElement;\n }\n\n while (node && node !== listRoot) {\n if (node.nodeName === 'LI' && listRoot.contains(node)) {\n return node;\n }\n node = node.parentElement;\n }\n\n return null;\n}\n\n/**\n * Map a list item DOM node to its index in properties.items.\n * @param {Element} listRoot\n * @param {Element} li\n * @returns {number}\n */\nexport function getListItemIndex(listRoot, li) {\n if (!li) {\n return -1;\n }\n\n const fromAttr = li.getAttribute?.('data-item-index');\n if (fromAttr != null && fromAttr !== '') {\n const parsed = Number(fromAttr);\n if (!Number.isNaN(parsed)) {\n return parsed;\n }\n }\n\n return [...listRoot.querySelectorAll('li')].indexOf(li);\n}\n\n/**\n * Character offset of the caret within a single list item.\n * @param {Element} li\n * @param {Range | null} range\n * @returns {number}\n */\nexport function getCursorInListItem(li, range) {\n if (!li || !range) {\n return 0;\n }\n\n return getOffsetInSelectable(\n li,\n range.startContainer,\n range.startOffset,\n );\n}\n\n/**\n * Split a list item state at cursor (item shape, not full block state).\n * @param {ListItem} itemState\n * @param {number} cursor\n * @returns {{ before: ListItem, after: ListItem }}\n */\nexport function splitListItemByCursor(itemState, cursor) {\n const wrapped = {\n properties: {\n text: itemState.text ?? '',\n inlineStyleRanges: itemState.inlineStyleRanges ?? [],\n entityRanges: itemState.entityRanges ?? [],\n },\n };\n\n const { originalLineState, newLineState } = splitStateByCursor(\n wrapped,\n cursor,\n );\n\n return {\n before: {\n componentId: itemState.componentId,\n depth: itemState.depth ?? 0,\n text: originalLineState.properties.text,\n inlineStyleRanges: originalLineState.properties.inlineStyleRanges ?? [],\n entityRanges: originalLineState.properties.entityRanges ?? [],\n },\n after: {\n componentId: createComponentId(),\n depth: itemState.depth ?? 0,\n text: newLineState.properties.text,\n inlineStyleRanges: newLineState.properties.inlineStyleRanges ?? [],\n entityRanges: newLineState.properties.entityRanges ?? [],\n },\n };\n}\n\n/**\n * Lift one list item to a paragraph, splitting the list around it.\n * @param {ListBlockState} listState\n * @param {number} itemIndex\n * @returns {UnwrapListResult}\n */\nexport function unwrapListItem(listState, itemIndex) {\n const items = listState.properties?.items ?? [];\n const item = items[itemIndex];\n if (!item) {\n return { blocks: [listState], paragraphIndex: 0 };\n }\n\n const before = items.slice(0, itemIndex);\n const after = items.slice(itemIndex + 1);\n const paragraph = {\n component: PARAGRAPH_NAMESPACE,\n componentId: createComponentId(),\n properties: {\n text: item.text ?? '',\n inlineStyleRanges: item.inlineStyleRanges ?? [],\n entityRanges: item.entityRanges ?? [],\n },\n settings: {},\n };\n\n const blocks = [];\n if (before.length) {\n blocks.push({\n ...listState,\n properties: {\n ...listState.properties,\n items: before,\n },\n });\n }\n\n blocks.push(paragraph);\n\n if (after.length) {\n blocks.push({\n ...listState,\n componentId: before.length\n ? createComponentId()\n : listState.componentId,\n properties: {\n ...listState.properties,\n items: after,\n },\n });\n }\n\n return {\n blocks,\n paragraphIndex: before.length ? 1 : 0,\n };\n}\n\n/**\n * Build rich-text DOM fragment for one list item.\n * @param {ListItem} item\n * @param {RichTextComponents} components\n * @returns {DocumentFragment}\n */\nexport function buildListItemContent(item, components) {\n return buildRichTextFragment(\n {\n properties: {\n text: item?.text ?? '',\n inlineStyleRanges: item?.inlineStyleRanges ?? [],\n entityRanges: item?.entityRanges ?? [],\n },\n },\n components,\n );\n}\n\n/**\n * Parse one <li> into a list item state object.\n * @param {Element} li\n * @param {RichTextComponents} components\n * @returns {ListItem}\n */\nexport function parseListItemFromHTML(li, components) {\n const depth = Number(li.getAttribute('data-depth') ?? 0) || 0;\n const wrapper = {\n properties: {\n text: normalizeBlockText(li.innerText ?? li.textContent ?? ''),\n inlineStyleRanges: [],\n entityRanges: [],\n },\n };\n\n parseRichTextChildNodes(li.childNodes, wrapper, 0, components);\n\n return {\n componentId: li.getAttribute('data-componentid') || undefined,\n depth,\n text: normalizeBlockText(wrapper.properties.text),\n inlineStyleRanges: wrapper.properties.inlineStyleRanges,\n entityRanges: wrapper.properties.entityRanges,\n };\n}\n", "import { afterRender, createElement, Each } from '@esmj/dom';\nimport { s } from '@esmj/schema';\nimport { untrack } from '@esmj/signals';\n\nimport { BlockComponent } from '#src/component/block/BlockComponent.mjs';\nimport {\n createComponentId,\n getRange,\n getBlockElementByChild,\n setCursorPosition,\n SELECTABLE_ELEMENT,\n} from '#src/dom.mjs';\n\nimport { LIST_NAMESPACE } from '#src/namespaces.mjs';\nimport { normalizeBlockText } from '#src/component/block/helpers.mjs';\nimport { entityRangeSchema, inlineStyleRangeSchema } from '#src/schema.mjs';\nimport {\n buildListItemContent,\n ensureUniqueListItemIds,\n getActiveListItem,\n getCursorInListItem,\n getListItemIndex,\n parseListItemFromHTML,\n splitListItemByCursor,\n unwrapListItem,\n} from './listHelpers.mjs';\n\n/**\n * Schema for one list item. `componentId` default is a factory so each parse gets a unique id.\n * @param {Element | null | undefined} node\n * @returns {*}\n */\nconst LIST_ITEM_SCHEMA = (node) =>\n s\n .object({\n // Factory default: eager createComponentId() would reuse one id for every\n // item missing componentId, which breaks Each keys and duplicates <li>s.\n componentId: s\n .string()\n .default(\n () => node?.getAttribute?.('data-componentid') || createComponentId(),\n ),\n depth: s.number().default(0),\n text: s.string().default(''),\n inlineStyleRanges: s.array(inlineStyleRangeSchema()).default([]),\n entityRanges: s.array(entityRangeSchema()).default([]),\n })\n .default({});\n\nexport class List extends BlockComponent {\n static get NAMESPACE() {\n return LIST_NAMESPACE;\n }\n\n static get LABEL() {\n return 'List';\n }\n\n getInlineStyleComponents() {\n return (\n this.props?.inlineStyles?.get() ??\n this.mrakomor.getConfig()?.inlineStyles ??\n []\n );\n }\n\n getEntityRangeComponents() {\n return (\n this.props?.entityRanges?.get() ??\n this.mrakomor.getConfig()?.entityRanges ??\n []\n );\n }\n\n static getStateSchema(node) {\n const tagStyle =\n node?.nodeName === 'OL'\n ? 'ORDERED'\n : node?.nodeName === 'UL'\n ? 'UNORDERED'\n : undefined;\n\n return s\n .object({\n component: s.string().default(this.NAMESPACE),\n componentId: s\n .string()\n .default(\n node?.getAttribute('data-componentid') || createComponentId(),\n ),\n properties: s\n .object({\n items: s\n .array(LIST_ITEM_SCHEMA())\n .default([LIST_ITEM_SCHEMA().parse()])\n .transform(ensureUniqueListItemIds),\n })\n .default({}),\n settings: s\n .object({\n style: s\n .enum(['ORDERED', 'UNORDERED'])\n .default(tagStyle ?? 'UNORDERED'),\n })\n .default({}),\n })\n .default({});\n }\n\n parseFromHTML(node) {\n if (!node) {\n return this.constructor.getStateSchema(node).parse();\n }\n\n const newState = structuredClone(\n this.constructor.getStateSchema(node).parse(),\n );\n\n const components = {\n inlineStyleComponents: this.getInlineStyleComponents(),\n entityRangeComponents: this.getEntityRangeComponents(),\n };\n\n const lis = [...node.querySelectorAll('li')];\n newState.properties.items = lis.length\n ? lis.map((li) =>\n LIST_ITEM_SCHEMA(li).parse(parseListItemFromHTML(li, components)),\n )\n : [LIST_ITEM_SCHEMA().parse()];\n\n newState.settings = {\n ...newState.settings,\n style:\n node.nodeName === 'OL'\n ? 'ORDERED'\n : node.nodeName === 'UL'\n ? 'UNORDERED'\n : (this.state?.peek()?.settings?.style ??\n newState.settings?.style ??\n 'UNORDERED'),\n };\n\n return newState;\n }\n\n /**\n * @param {Range | null} [range]\n * @returns {import('#src/types.mjs').FormattingTarget<import('#src/types.mjs').ListBlockState> | null}\n */\n getFormattingTarget(range) {\n const activeRange = range ?? getRange();\n const li = getActiveListItem(this.element, activeRange);\n if (!li) {\n return null;\n }\n\n const itemIndex = getListItemIndex(this.element, li);\n if (itemIndex < 0) {\n return null;\n }\n\n return {\n element: li,\n read(state) {\n const item = state.properties?.items?.[itemIndex];\n return {\n inlineStyleRanges: item?.inlineStyleRanges,\n entityRanges: item?.entityRanges,\n };\n },\n write(state, { inlineStyleRanges, entityRanges }) {\n const item = state.properties?.items?.[itemIndex];\n if (!item) {\n return;\n }\n if (inlineStyleRanges !== undefined) {\n item.inlineStyleRanges = inlineStyleRanges;\n }\n if (entityRanges !== undefined) {\n item.entityRanges = entityRanges;\n }\n },\n };\n }\n\n _commitState(newState) {\n const content = this.mrakomor.getContent();\n const index = content.findIndex(\n (block) => block.componentId === newState.componentId,\n );\n\n if (index === -1) {\n return;\n }\n\n content.splice(index, 1, newState);\n this.mrakomor.setContent(content);\n }\n\n _buildItemContent(item) {\n return buildListItemContent(item, {\n inlineStyleComponents: this.getInlineStyleComponents(),\n entityRangeComponents: this.getEntityRangeComponents(),\n });\n }\n\n render() {\n const className = this.constructor.NAMESPACE.toLowerCase().replaceAll(\n '.',\n '-',\n );\n const peek = this.state.peek();\n const tag =\n peek.settings?.style === 'ORDERED' ? 'ol' : 'ul';\n\n return createElement(\n tag,\n {\n className,\n 'data-componentid': peek.componentId,\n $ref: (el) => {\n this.element = el;\n },\n },\n Each(\n () => this.state.get().properties?.items ?? [],\n (item, index) => item.componentId ?? String(index),\n (itemSignal, index) =>\n createElement('li', {\n contentEditable: true,\n [SELECTABLE_ELEMENT]: true,\n 'data-componentid': () => itemSignal.get().componentId,\n 'data-item-index': () => {\n const id = itemSignal.get()?.componentId;\n const items = this.state.get().properties?.items ?? [];\n const i = items.findIndex((it) => it.componentId === id);\n return String(i >= 0 ? i : index);\n },\n 'data-depth': () => String(itemSignal.get()?.depth ?? 0),\n $dangerouslySetInnerHTML: () => {\n const item = itemSignal.get();\n const text = item?.text ?? '';\n\n if (!normalizeBlockText(text)) {\n return '<br>';\n }\n\n return untrack(() => this._buildItemContent(item));\n },\n }),\n ),\n );\n }\n\n onKeydown(event) {\n if (event.key === 'Enter') {\n this.#onEnter(event);\n return;\n }\n\n if (event.key === 'Backspace') {\n this.#onBackspace(event);\n }\n }\n\n /**\n * Place the cursor in a list item. Omit `cursor` for the end of the last item.\n * @param {number} [cursor] character offset within the target item\n */\n setCursor(cursor) {\n const items = this.getState()?.properties?.items ?? [];\n const lastIndex = items.length - 1;\n if (lastIndex < 0) {\n return;\n }\n\n const offset =\n typeof cursor === 'number'\n ? cursor\n : normalizeBlockText(items[lastIndex]?.text).length;\n\n const restore = () => {\n const lastLi = this.element?.querySelector(\n `li[data-item-index=\"${lastIndex}\"]`,\n );\n if (lastLi?.isConnected) {\n setCursorPosition(lastLi, offset);\n }\n };\n\n restore();\n afterRender(restore);\n }\n\n /**\n * Outdent a nested item, or unwrap it to a paragraph (Notion exit / Backspace at start).\n * @param {number} itemIndex\n */\n #liftOrOutdentItem(itemIndex) {\n const state = this.getState();\n const items = [...(state.properties.items ?? [])];\n const current = items[itemIndex];\n\n if (!current) {\n return;\n }\n\n if ((current.depth ?? 0) > 0) {\n items[itemIndex] = { ...current, depth: current.depth - 1 };\n this._commitState({\n ...state,\n properties: {\n ...state.properties,\n items,\n },\n });\n\n const restoreCaret = () => {\n const sameLi = this.element?.querySelector(\n `li[data-item-index=\"${itemIndex}\"]`,\n );\n if (sameLi?.isConnected) {\n setCursorPosition(sameLi, 0);\n }\n };\n restoreCaret();\n afterRender(restoreCaret);\n return;\n }\n\n const { blocks, paragraphIndex } = unwrapListItem(state, itemIndex);\n this.mrakomor.command.replaceBlockElement({\n blockElement: getBlockElementByChild(this.element),\n blocks,\n cursor: 0,\n cursorBlockIndex: paragraphIndex,\n });\n }\n\n // TODO rewrite to not use internal\n #onEnter(event) {\n event.preventDefault();\n\n const range = getRange();\n const li = getActiveListItem(this.element, range);\n if (!li) {\n return;\n }\n\n const itemIndex = getListItemIndex(this.element, li);\n const cursor = getCursorInListItem(li, range);\n const state = this.getState();\n const items = [...(state.properties.items ?? [])];\n const current = items[itemIndex];\n\n if (!current) {\n return;\n }\n\n if (!normalizeBlockText(current.text)) {\n this.#liftOrOutdentItem(itemIndex);\n return;\n }\n\n const { before, after } = splitListItemByCursor(current, cursor);\n items.splice(itemIndex, 1, before, after);\n\n this._commitState({\n ...state,\n properties: {\n ...state.properties,\n items,\n },\n });\n\n afterRender(() => {\n const newLi = this.element?.querySelector(\n `li[data-item-index=\"${itemIndex + 1}\"]`,\n );\n if (newLi) {\n setCursorPosition(newLi, 0);\n }\n });\n }\n\n // TODO rewrite to not use internal\n #onBackspace(event) {\n const range = getRange();\n const li = getActiveListItem(this.element, range);\n if (!li) {\n return;\n }\n\n if (!range.collapsed) {\n return;\n }\n\n const itemIndex = getListItemIndex(this.element, li);\n const cursor = getCursorInListItem(li, range);\n\n if (cursor !== 0) {\n return;\n }\n\n event.preventDefault();\n this.#liftOrOutdentItem(itemIndex);\n }\n}\n/**\n * Registers the list block (UL/OL insert-menu variants).\n * @returns {import('#src/types.mjs').Plugin}\n */\nexport function listPlugin() {\n return {\n resolveConfig: (config) => {\n config.blockComponents.push(List);\n config.blockInsertVariants = [\n ...(config.blockInsertVariants ?? []),\n {\n label: 'UL',\n namespace: List.NAMESPACE,\n settings: { style: 'UNORDERED' },\n },\n {\n label: 'OL',\n namespace: List.NAMESPACE,\n settings: { style: 'ORDERED' },\n },\n ];\n\n return config;\n },\n resolveComponent: (namespace) => {\n if (namespace === List.NAMESPACE) {\n return List;\n }\n },\n };\n}\n", "import {\n canMergeBlocks,\n deepMergeBlockState,\n isListBlock,\n isTextBlock,\n mergeBlocksAcrossSelection,\n normalizeBlockText,\n splitStateByCursor,\n} from '#src/component/block/helpers.mjs';\nimport { createComponentId } from '#src/dom.mjs';\nimport { PARAGRAPH_NAMESPACE } from '#src/namespaces.mjs';\n\n/**\n * @typedef {import('#src/types.mjs').BlockState} BlockState\n * @typedef {import('#src/types.mjs').ListItem} ListItem\n * @typedef {import('#src/types.mjs').ListBlockState} ListBlockState\n * @typedef {import('#src/types.mjs').ClipboardSelection} ClipboardSelection\n * @typedef {import('#src/types.mjs').ContentMutation} ContentMutation\n */\n\nexport const CLIPBOARD_MIME = 'application/x-mrakomor-blocks+json';\nexport const CLIPBOARD_PAYLOAD_VERSION = 1;\n\n/**\n * Normalized text length for a text block; `0` otherwise.\n * @param {BlockState} state\n * @returns {number}\n */\nexport function textLength(state) {\n if (!isTextBlock(state)) {\n return 0;\n }\n\n return normalizeBlockText(state.properties?.text).length;\n}\n\n/**\n * Slice a text block to `[start, end)`, clipping inline/entity ranges.\n * @param {BlockState} state\n * @param {number} start\n * @param {number} end\n * @returns {BlockState}\n */\nexport function sliceStateByRange(state, start, end) {\n const text = state?.properties?.text ?? '';\n const from = Math.max(0, Math.min(start, text.length));\n const to = Math.max(from, Math.min(end, text.length));\n const { originalLineState } = splitStateByCursor(state, to);\n const { newLineState } = splitStateByCursor(originalLineState, from);\n return newLineState;\n}\n\n/**\n * Wrap a sliced list item as a paragraph (copy/paste of a list selection).\n * @param {ListItem} item\n * @param {number} start\n * @param {number} end\n * @returns {BlockState}\n */\nexport function listItemToParagraph(item, start, end) {\n const wrapped = {\n component: PARAGRAPH_NAMESPACE,\n properties: {\n text: item?.text ?? '',\n inlineStyleRanges: item?.inlineStyleRanges ?? [],\n entityRanges: item?.entityRanges ?? [],\n },\n settings: {},\n };\n\n return sliceStateByRange(wrapped, start, end);\n}\n\n/**\n * Blocks to write to the clipboard for the current selection.\n * A selection inside one list item copies as a paragraph.\n *\n * @param {BlockState[]} content\n * @param {ClipboardSelection} selection\n * @returns {BlockState[]}\n */\nexport function copyBlocksFromSelection(content, selection) {\n const {\n startIndex,\n endIndex,\n startOffset,\n endOffset,\n listItemIndex = -1,\n } = selection;\n\n if (startIndex < 0 || endIndex < 0 || startIndex > endIndex) {\n return [];\n }\n\n if (startIndex === endIndex) {\n const block = content[startIndex];\n if (isListBlock(block) && listItemIndex >= 0) {\n const item = block.properties.items[listItemIndex];\n if (!item) {\n return [structuredClone(block)];\n }\n return [listItemToParagraph(item, startOffset, endOffset)];\n }\n if (isTextBlock(block)) {\n return [sliceStateByRange(block, startOffset, endOffset)];\n }\n return [structuredClone(block)];\n }\n\n const blocks = [];\n for (let index = startIndex; index <= endIndex; index += 1) {\n const block = content[index];\n if (index === startIndex && isTextBlock(block)) {\n blocks.push(sliceStateByRange(block, startOffset, textLength(block)));\n } else if (index === endIndex && isTextBlock(block)) {\n blocks.push(sliceStateByRange(block, 0, endOffset));\n } else {\n blocks.push(structuredClone(block));\n }\n }\n\n return blocks;\n}\n\n/**\n * Delete `[startOffset, endOffset)` inside one list item.\n * @param {ListBlockState} listState\n * @param {number} itemIndex\n * @param {number} startOffset\n * @param {number} endOffset\n * @returns {ListBlockState}\n */\nexport function deleteListItemRange(listState, itemIndex, startOffset, endOffset) {\n const next = structuredClone(listState);\n const item = next.properties?.items?.[itemIndex];\n if (!item) {\n return next;\n }\n\n const wrapped = {\n properties: {\n text: item.text ?? '',\n inlineStyleRanges: item.inlineStyleRanges ?? [],\n entityRanges: item.entityRanges ?? [],\n },\n };\n const { originalLineState: left } = splitStateByCursor(wrapped, startOffset);\n const { newLineState: right } = splitStateByCursor(wrapped, endOffset);\n const { state } = deepMergeBlockState(left, right);\n\n next.properties.items[itemIndex] = {\n ...item,\n text: state.properties.text,\n inlineStyleRanges: state.properties.inlineStyleRanges,\n entityRanges: state.properties.entityRanges,\n };\n\n return next;\n}\n\n/**\n * Delete the selection: same-block trim, list-item range, or cross-block merge.\n *\n * @param {BlockState[]} content\n * @param {ClipboardSelection} selection\n * @returns {ContentMutation}\n */\nexport function deleteSelection(content, selection) {\n const {\n startIndex,\n endIndex,\n startOffset,\n endOffset,\n listItemIndex = -1,\n } = selection;\n const next = [...content];\n\n if (startIndex === endIndex) {\n const block = next[startIndex];\n if (isListBlock(block) && listItemIndex >= 0) {\n next[startIndex] = deleteListItemRange(\n block,\n listItemIndex,\n startOffset,\n endOffset,\n );\n return { content: next, resultIndex: startIndex, cursor: startOffset };\n }\n if (isTextBlock(block)) {\n const { originalLineState: left } = splitStateByCursor(block, startOffset);\n const { newLineState: right } = splitStateByCursor(block, endOffset);\n const { state, cursor } = deepMergeBlockState(left, right);\n next[startIndex] = state;\n return { content: next, resultIndex: startIndex, cursor };\n }\n\n next.splice(startIndex, 1);\n const resultIndex = Math.min(startIndex, Math.max(0, next.length - 1));\n return { content: next, resultIndex, cursor: 0 };\n }\n\n if (isTextBlock(next[startIndex]) && isTextBlock(next[endIndex])) {\n return mergeBlocksAcrossSelection(next, {\n startIndex,\n endIndex,\n startOffset,\n endOffset,\n });\n }\n\n const pieces = [];\n if (isTextBlock(next[startIndex])) {\n pieces.push(\n splitStateByCursor(next[startIndex], startOffset).originalLineState,\n );\n }\n if (isTextBlock(next[endIndex])) {\n pieces.push(splitStateByCursor(next[endIndex], endOffset).newLineState);\n }\n\n let replacement = pieces;\n let cursor = 0;\n if (pieces.length === 2) {\n const merged = deepMergeBlockState(pieces[0], pieces[1]);\n replacement = [merged.state];\n cursor = merged.cursor;\n } else if (pieces.length === 1) {\n cursor = textLength(pieces[0]);\n }\n\n next.splice(startIndex, endIndex - startIndex + 1, ...replacement);\n\n return {\n content: next,\n resultIndex: replacement.length ? startIndex : Math.max(0, startIndex - 1),\n cursor,\n };\n}\n\n/**\n * Insert `blocks` after `index`.\n * @param {BlockState[]} content\n * @param {number} index\n * @param {BlockState[]} blocks\n * @returns {ContentMutation}\n */\nfunction insertBlocksAfter(content, index, blocks) {\n const next = [...content];\n next.splice(index + 1, 0, ...blocks);\n const last = blocks[blocks.length - 1];\n return {\n content: next,\n resultIndex: index + blocks.length,\n cursor: textLength(last),\n listItemIndex: -1,\n };\n}\n\n/**\n * Paste into a list: a single paragraph merges into the item; otherwise insert after the list.\n *\n * @param {BlockState[]} content\n * @param {{ listIndex: number, itemIndex: number, offset: number, blocks: BlockState[] }} payload\n * @returns {ContentMutation}\n */\nfunction applyPasteToListItem(content, { listIndex, itemIndex, offset, blocks }) {\n const listState = structuredClone(content[listIndex]);\n const item = listState.properties?.items?.[itemIndex];\n const singleParagraph =\n blocks.length === 1 && blocks[0]?.component === PARAGRAPH_NAMESPACE;\n\n if (!item || !singleParagraph) {\n return insertBlocksAfter(content, listIndex, blocks);\n }\n\n const wrapped = {\n properties: {\n text: item.text ?? '',\n inlineStyleRanges: item.inlineStyleRanges ?? [],\n entityRanges: item.entityRanges ?? [],\n },\n };\n const inserted = {\n properties: {\n text: blocks[0].properties?.text ?? '',\n inlineStyleRanges: blocks[0].properties?.inlineStyleRanges ?? [],\n entityRanges: blocks[0].properties?.entityRanges ?? [],\n },\n };\n\n const { originalLineState: left, newLineState: right } = splitStateByCursor(\n wrapped,\n offset,\n );\n const { state: head } = deepMergeBlockState(left, inserted);\n const { state: merged, cursor } = deepMergeBlockState(head, right);\n\n listState.properties.items[itemIndex] = {\n ...item,\n text: merged.properties.text,\n inlineStyleRanges: merged.properties.inlineStyleRanges,\n entityRanges: merged.properties.entityRanges,\n };\n\n const next = [...content];\n next[listIndex] = listState;\n return {\n content: next,\n resultIndex: listIndex,\n cursor,\n listItemIndex: itemIndex,\n };\n}\n\n/**\n * Insert clipboard `blocks` at a caret (or after a list/atomic block).\n *\n * @param {BlockState[]} content\n * @param {{ index: number, offset: number, blocks: BlockState[], listItemIndex?: number }} payload\n * @returns {ContentMutation}\n */\nexport function applyPaste(content, { index, offset, blocks, listItemIndex = -1 }) {\n const next = [...content];\n if (!blocks?.length) {\n return {\n content: next,\n resultIndex: Math.max(0, index),\n cursor: offset ?? 0,\n };\n }\n\n if (index < 0 || index >= next.length) {\n next.push(...blocks);\n const last = blocks[blocks.length - 1];\n return {\n content: next,\n resultIndex: next.length - 1,\n cursor: textLength(last),\n };\n }\n\n const target = next[index];\n if (isListBlock(target) && listItemIndex >= 0) {\n return applyPasteToListItem(next, {\n listIndex: index,\n itemIndex: listItemIndex,\n offset: offset ?? 0,\n blocks,\n });\n }\n\n if (!isTextBlock(target)) {\n return insertBlocksAfter(next, index, blocks);\n }\n\n const { originalLineState: left, newLineState: right } = splitStateByCursor(\n target,\n offset ?? 0,\n );\n\n const first = blocks[0];\n const lastClipboard = blocks[blocks.length - 1];\n const pieces = [];\n\n if (canMergeBlocks(left, first)) {\n pieces.push(deepMergeBlockState(left, first).state);\n } else {\n if (textLength(left) > 0) {\n pieces.push(left);\n }\n pieces.push(first);\n }\n\n if (blocks.length > 1) {\n pieces.push(...blocks.slice(1, -1));\n if (canMergeBlocks(lastClipboard, right)) {\n pieces.push(deepMergeBlockState(lastClipboard, right).state);\n } else {\n pieces.push(lastClipboard);\n if (textLength(right) > 0) {\n pieces.push(right);\n }\n }\n } else {\n const head = pieces[pieces.length - 1];\n if (canMergeBlocks(head, right)) {\n const { state, cursor } = deepMergeBlockState(head, right);\n pieces[pieces.length - 1] = state;\n next.splice(index, 1, ...pieces);\n return { content: next, resultIndex: index + pieces.length - 1, cursor };\n }\n if (textLength(right) > 0) {\n pieces.push(right);\n }\n }\n\n next.splice(index, 1, ...pieces);\n const mergedLastIntoRight =\n blocks.length > 1 && canMergeBlocks(lastClipboard, right);\n const lastPastedIndex =\n index + pieces.length - 1 - (mergedLastIntoRight || textLength(right) === 0 ? 0 : 1);\n\n return {\n content: next,\n resultIndex: Math.max(index, lastPastedIndex),\n cursor: textLength(lastClipboard),\n };\n}\n\n/**\n * Parse the custom MIME JSON envelope; `null` if invalid.\n * @param {string} text\n * @returns {BlockState[] | null}\n */\nexport function parseClipboardPayload(text) {\n if (!text) {\n return null;\n }\n\n try {\n const data = JSON.parse(text);\n if (\n data &&\n data.v === CLIPBOARD_PAYLOAD_VERSION &&\n Array.isArray(data.blocks)\n ) {\n return data.blocks;\n }\n } catch {\n return null;\n }\n\n return null;\n}\n\n/**\n * Strip HTML to text via `DOMParser`.\n * @param {string} html\n * @returns {string}\n */\nexport function htmlToPlainText(html) {\n const doc = new DOMParser().parseFromString(html, 'text/html');\n return doc.body?.textContent ?? '';\n}\n\n/**\n * Split plain text on newlines into paragraph states.\n * @param {string} text\n * @param {string} [namespace]\n * @returns {BlockState[]}\n */\nexport function textToParagraphs(text, namespace = PARAGRAPH_NAMESPACE) {\n const lines = String(text).split(/\\r\\n|\\n|\\r/);\n return lines.map((line) => ({\n component: namespace,\n properties: {\n text: line,\n inlineStyleRanges: [],\n entityRanges: [],\n },\n settings: {},\n }));\n}\n\n/**\n * Human-readable text for one block (list items joined by newlines).\n * @param {BlockState} block\n * @returns {string}\n */\nexport function blockToPlainText(block) {\n if (isListBlock(block)) {\n return (block.properties.items ?? []).map((item) => item.text ?? '').join('\\n');\n }\n if (isTextBlock(block)) {\n return normalizeBlockText(block.properties?.text);\n }\n return '';\n}\n\n/**\n * Join blocks with newlines for `text/plain`.\n * @param {BlockState[]} blocks\n * @returns {string}\n */\nexport function blocksToPlainText(blocks) {\n return blocks.map(blockToPlainText).join('\\n');\n}\n\n/**\n * JSON envelope written to the custom clipboard MIME.\n * @param {BlockState[]} blocks\n * @returns {{ v: number, blocks: BlockState[] }}\n */\nexport function createClipboardPayload(blocks) {\n return {\n v: CLIPBOARD_PAYLOAD_VERSION,\n blocks: blocks.map((block) => structuredClone(block)),\n };\n}\n\n/**\n * Write custom MIME JSON and `text/plain` onto a `DataTransfer`.\n * @param {DataTransfer} clipboardData\n * @param {BlockState[]} blocks\n */\nexport function writeClipboardData(clipboardData, blocks) {\n const payload = createClipboardPayload(blocks);\n clipboardData.setData(CLIPBOARD_MIME, JSON.stringify(payload));\n clipboardData.setData('text/plain', blocksToPlainText(blocks));\n}\n\n/**\n * Read blocks from clipboard: custom MIME, then JSON in `text/plain`, then plain/HTML text.\n * @param {DataTransfer | null | undefined} clipboardData\n * @param {string} [paragraphNamespace]\n * @returns {BlockState[]}\n */\nexport function readClipboardBlocks(\n clipboardData,\n paragraphNamespace = PARAGRAPH_NAMESPACE,\n) {\n if (!clipboardData) {\n return [];\n }\n\n const fromMime = parseClipboardPayload(clipboardData.getData(CLIPBOARD_MIME));\n if (fromMime) {\n return fromMime;\n }\n\n const plain = clipboardData.getData('text/plain') ?? '';\n const fromPlain = parseClipboardPayload(plain);\n if (fromPlain) {\n return fromPlain;\n }\n\n if (plain) {\n return textToParagraphs(plain, paragraphNamespace);\n }\n\n const html = clipboardData.getData('text/html') ?? '';\n if (html) {\n return textToParagraphs(htmlToPlainText(html), paragraphNamespace);\n }\n\n return [];\n}\n\n/**\n * Fresh `componentId`s for a pasted block (and its list items).\n * @param {BlockState} block\n * @returns {BlockState}\n */\nexport function assignNewComponentIds(block) {\n const clone = structuredClone(block);\n clone.componentId = createComponentId();\n if (Array.isArray(clone.properties?.items)) {\n clone.properties.items = clone.properties.items.map((item) => ({\n ...item,\n componentId: createComponentId(),\n }));\n }\n return clone;\n}\n", "import { afterRender } from '@esmj/dom';\n\nimport {\n getActiveListItem,\n getListItemIndex,\n} from '#src/plugin/list/listHelpers.mjs';\nimport {\n getBlockContentRoot,\n getBlockElementByChild,\n getBlockElementByRange,\n getBlockElementInstance,\n getCrossBlockSelectionState,\n getRange,\n getSelectionState,\n setCursorPosition,\n} from '#src/dom.mjs';\nimport { EVENT } from '#src/emitter.mjs';\nimport { isListBlock } from '#src/component/block/helpers.mjs';\nimport { PARAGRAPH_NAMESPACE } from '#src/namespaces.mjs';\n\nimport {\n applyPaste,\n assignNewComponentIds,\n copyBlocksFromSelection,\n deleteSelection,\n readClipboardBlocks,\n writeClipboardData,\n} from './clipboardHelpers.mjs';\n\n/**\n * True when the event target is inside `.mrakomor-content`.\n * @param {Event} event\n * @returns {boolean}\n */\nfunction isInEditorContent(event) {\n return Boolean(event.target?.closest?.('.mrakomor-content'));\n}\n\n/**\n * Index of a block wrapper in editor content.\n * @param {import('#src/types.mjs').Mrakomor} mrakomor\n * @param {Element} blockElement\n * @returns {number}\n */\nfunction getBlockIndex(mrakomor, blockElement) {\n if (!blockElement) {\n return -1;\n }\n\n const fromMap = mrakomor._getBlockElementIndex?.(blockElement);\n if (typeof fromMap === 'number' && fromMap >= 0) {\n return fromMap;\n }\n\n const id = getBlockElementInstance(blockElement)?.getState?.()?.componentId;\n if (!id) {\n return -1;\n }\n\n return mrakomor.getContent().findIndex((block) => block.componentId === id);\n}\n\n/**\n * @param {Node | null | undefined} node\n * @returns {boolean}\n */\nfunction isListDomRoot(node) {\n return node?.nodeName === 'UL' || node?.nodeName === 'OL';\n}\n\n/**\n * `<ul>` / `<ol>` inside a list block wrapper.\n * @param {Element} blockElement\n * @returns {Element | Node | null | undefined}\n */\nfunction getListRoot(blockElement) {\n const fromInstance = getBlockElementInstance(blockElement)?.element;\n if (isListDomRoot(fromInstance)) {\n return fromInstance;\n }\n\n const contentRoot = getBlockContentRoot(blockElement);\n if (isListDomRoot(contentRoot)) {\n return contentRoot;\n }\n\n return contentRoot?.querySelector?.('ul, ol') ?? fromInstance ?? contentRoot;\n}\n\n/**\n * List item index when the range stays inside one `<li>`; otherwise `-1`.\n * @param {Element} blockElement\n * @param {Range} range\n * @returns {number}\n */\nfunction getListItemIndexForRange(blockElement, range) {\n const listRoot = getListRoot(blockElement);\n const startLi = getActiveListItem(listRoot, range);\n const endLi = getActiveListItem(listRoot, {\n startContainer: range.endContainer,\n });\n\n if (!startLi || startLi !== endLi) {\n return -1;\n }\n\n return getListItemIndex(listRoot, startLi);\n}\n\n/**\n * Copy/cut/paste selection: block indexes, offsets, optional list item.\n * @param {import('#src/types.mjs').Mrakomor} mrakomor\n * @returns {import('#src/types.mjs').ClipboardSelection | null}\n */\nfunction getSelectionContext(mrakomor) {\n const range = getRange();\n if (!range) {\n return null;\n }\n\n const startBlock =\n getBlockElementByChild(range.startContainer) ??\n getBlockElementByRange(range);\n if (!startBlock) {\n return null;\n }\n\n const startIndex = getBlockIndex(mrakomor, startBlock);\n if (startIndex < 0) {\n return null;\n }\n\n const content = mrakomor.getContent();\n\n if (range.collapsed) {\n const sel = getSelectionState();\n return {\n collapsed: true,\n startIndex,\n endIndex: startIndex,\n startOffset: sel?.start ?? 0,\n endOffset: sel?.start ?? 0,\n listItemIndex: isListBlock(content[startIndex])\n ? getListItemIndexForRange(startBlock, range)\n : -1,\n };\n }\n\n const cross = getCrossBlockSelectionState(range);\n const endIndex = getBlockIndex(mrakomor, cross.endBlock);\n let listItemIndex = -1;\n\n if (startIndex === endIndex && isListBlock(content[startIndex])) {\n listItemIndex = getListItemIndexForRange(startBlock, range);\n }\n\n return {\n collapsed: false,\n startIndex,\n endIndex,\n startOffset: cross.startOffset,\n endOffset: cross.endOffset,\n listItemIndex,\n };\n}\n\n/**\n * Restore caret after setContent (macrotask). List pastes target the `<li>`.\n * @param {import('#src/types.mjs').Mrakomor} mrakomor\n * @param {number} resultIndex\n * @param {number} cursor\n * @param {number} [listItemIndex]\n */\nfunction restoreCaret(mrakomor, resultIndex, cursor, listItemIndex = -1) {\n afterRender(() => {\n const root = mrakomor.getRoot();\n const block = root?.querySelectorAll?.(\n '.mrakomor-content .mrakomor-block-element',\n )?.[resultIndex];\n let target = getBlockContentRoot(block);\n if (listItemIndex >= 0) {\n const listRoot = getListRoot(block);\n target =\n listRoot?.querySelector?.(`li[data-item-index=\"${listItemIndex}\"]`) ??\n listRoot?.querySelectorAll?.('li')?.[listItemIndex] ??\n target;\n }\n if (target?.isConnected) {\n setCursorPosition(target, cursor);\n }\n });\n}\n\n/**\n * Schema-parse clipboard blocks and assign new ids; drop invalid ones.\n * @param {import('#src/types.mjs').Mrakomor} mrakomor\n * @param {import('#src/types.mjs').BlockState[]} blocks\n * @returns {import('#src/types.mjs').BlockState[]}\n */\nfunction normalizeBlocks(mrakomor, blocks) {\n return blocks\n .map((block) => {\n try {\n return mrakomor.normalizeComponentState(assignNewComponentIds(block));\n } catch {\n return null;\n }\n })\n .filter(Boolean);\n}\n\n/**\n * `setContent` then restore caret. Drops blocks that fail schema parse.\n * @param {import('#src/types.mjs').Mrakomor} mrakomor\n * @param {import('#src/types.mjs').BlockState[]} next\n * @param {number} resultIndex\n * @param {number} cursor\n * @param {number} [listItemIndex]\n */\nfunction applyContent(mrakomor, next, resultIndex, cursor, listItemIndex = -1) {\n const normalized = next\n .map((item) => {\n try {\n return mrakomor.normalizeComponentState(item);\n } catch {\n return null;\n }\n })\n .filter(Boolean);\n mrakomor.setContent(normalized);\n restoreCaret(mrakomor, resultIndex, cursor, listItemIndex);\n}\n\n/**\n * Native copy: write selected blocks to the clipboard.\n * @param {Event} event\n */\nfunction onCopy(event) {\n const mrakomor = event.mrakomor;\n if (!mrakomor || !isInEditorContent(event) || !event.clipboardData) {\n return;\n }\n\n const target = getSelectionContext(mrakomor);\n if (!target || target.collapsed) {\n return;\n }\n\n const blocks = copyBlocksFromSelection(mrakomor.getContent(), target);\n if (!blocks.length) {\n return;\n }\n\n event.preventDefault();\n writeClipboardData(event.clipboardData, blocks);\n}\n\n/**\n * Native cut: copy then delete the selection (`setContent`).\n * @param {Event} event\n */\nfunction onCut(event) {\n const mrakomor = event.mrakomor;\n if (!mrakomor || !isInEditorContent(event) || !event.clipboardData) {\n return;\n }\n\n const target = getSelectionContext(mrakomor);\n if (!target || target.collapsed) {\n return;\n }\n\n const content = mrakomor.getContent();\n const blocks = copyBlocksFromSelection(content, target);\n if (!blocks.length) {\n return;\n }\n\n event.preventDefault();\n writeClipboardData(event.clipboardData, blocks);\n\n const deleted = deleteSelection(content, target);\n applyContent(\n mrakomor,\n deleted.content,\n deleted.resultIndex,\n deleted.cursor,\n target.listItemIndex,\n );\n}\n\n/**\n * Native paste: replace a selection if needed, then `applyPaste`.\n * @param {Event} event\n */\nfunction onPaste(event) {\n const mrakomor = event.mrakomor;\n if (!mrakomor) {\n return;\n }\n\n if (event.target && !isInEditorContent(event)) {\n return;\n }\n\n event.preventDefault();\n\n const blocks = normalizeBlocks(\n mrakomor,\n readClipboardBlocks(event.clipboardData, PARAGRAPH_NAMESPACE),\n );\n if (!blocks.length) {\n return;\n }\n\n const content = mrakomor.getContent();\n const target = getSelectionContext(mrakomor);\n if (!target) {\n return;\n }\n\n let working = content;\n let index = target.startIndex;\n let offset = target.startOffset;\n\n if (!target.collapsed) {\n const deleted = deleteSelection(working, target);\n working = deleted.content;\n index = deleted.resultIndex;\n offset = deleted.cursor;\n }\n\n const pasted = applyPaste(working, {\n index,\n offset,\n blocks,\n listItemIndex: target.listItemIndex,\n });\n applyContent(\n mrakomor,\n pasted.content,\n pasted.resultIndex,\n pasted.cursor,\n pasted.listItemIndex ?? target.listItemIndex,\n );\n}\n\n/**\n * Copy / cut / paste: native listeners + `command.copy|cut|paste`.\n * @param {import('#src/types.mjs').PluginContext} options\n * @returns {import('#src/types.mjs').Plugin}\n */\nexport function clipboardPlugin({ root, mrakomor }) {\n return {\n registerEvents() {\n EVENT.COPY = 'mrakomor:copy';\n EVENT.CUT = 'mrakomor:cut';\n EVENT.PASTE = 'mrakomor:paste';\n },\n\n registerCommands(m) {\n m.command.copy = (payload = {}) => {\n m.emitDomEvent(EVENT.COPY, payload);\n };\n m.command.cut = (payload = {}) => {\n m.emitDomEvent(EVENT.CUT, payload);\n };\n m.command.paste = (payload = {}) => {\n m.emitDomEvent(EVENT.PASTE, payload);\n };\n },\n\n registerListeners() {\n const { signal } = mrakomor.listenerAbortController;\n const target = root ?? mrakomor.getRoot();\n\n target.addEventListener(\n 'copy',\n (event) => mrakomor.emitDomEvent(EVENT.COPY, event),\n { signal },\n );\n target.addEventListener(\n 'cut',\n (event) => mrakomor.emitDomEvent(EVENT.CUT, event),\n { signal },\n );\n target.addEventListener(\n 'paste',\n (event) => mrakomor.emitDomEvent(EVENT.PASTE, event),\n { signal },\n );\n\n mrakomor.emitter.on(EVENT.COPY, onCopy);\n mrakomor.emitter.on(EVENT.CUT, onCut);\n mrakomor.emitter.on(EVENT.PASTE, onPaste);\n },\n };\n}\n", "import {\n createElement,\n mount,\n unmount,\n afterRender,\n} from '@esmj/dom';\nimport {\n createSignal,\n} from '@esmj/signals';\nimport cssBundle from '@merkur/integration-custom-element/cssBundle';\n\nimport { figurePlugin } from './component/block/Figure.mjs';\nimport {\n headlinePlugin,\n} from './component/block/Headline.mjs';\nimport { paragraphPlugin } from './component/block/Paragraph.mjs';\nimport { UnknownComponent } from './component/block/UnknownComponent.mjs';\nimport { Editor } from './component/Editor.mjs';\nimport { linkEntityPlugin } from './plugin/linkEntity/LinkEntity.mjs';\nimport { ttsHeadlinePlugin } from './plugin/tts/TtsHeadline.mjs';\nimport { ttsParagraphPlugin } from './plugin/tts/TtsParagraph.mjs';\nimport { ttsVoicePlugin } from './plugin/tts/TtsVoice.mjs';\nimport { defaultMrakomorPlugin } from './plugin/default/defaultMrakomorPlugin.mjs';\nimport {\n Bold,\n Italic,\n Underline,\n Subscript,\n Superscript,\n} from './component/inlineStyle/index.mjs';\nimport {\n getBlockElementInstance,\n createComponentId,\n} from './dom.mjs';\nimport { EVENT, createCommands } from './emitter.mjs';\nimport { dialogPlugin } from './plugin/dialog/Dialog.mjs';\nimport { tooltipPlugin } from './plugin/tooltip/Tooltip.mjs';\nimport { blockChromePlugin } from './plugin/blockChrome/BlockChrome.mjs';\nimport { blockInsertMenuPlugin } from './plugin/blockInsertMenu/BlockInsertMenu.mjs';\nimport { listPlugin } from './plugin/list/List.mjs';\nimport { clipboardPlugin } from './plugin/clipboard/clipboardPlugin.mjs';\nimport { createMrakomorConfigSchema } from './schema.mjs';\n\n/**\n * Keep `defaultMrakomorPlugin` last (and present once), even when omitted from config.\n * @param {import('#src/types.mjs').PluginFactory[]} plugins\n * @returns {import('#src/types.mjs').PluginFactory[]}\n */\nfunction withDefaultMrakomorPluginLast(plugins) {\n return [\n ...plugins.filter((plugin) => plugin !== defaultMrakomorPlugin),\n defaultMrakomorPlugin,\n ];\n}\n\n/**\n * Create and boot a Mrakomor editor. Injects bundled CSS once per document\n * (`style[data-mrakomor-css]`). Validates `config` with `createMrakomorConfigSchema`,\n * then always appends `defaultMrakomorPlugin` last.\n * @public\n * @param {import('#src/types.mjs').CreateMrakomorConfig} config\n * @returns {import('#src/types.mjs').Mrakomor}\n */\nexport function createMrakomor(config) {\n createMrakomorConfigSchema().parse(config);\n\n const defaultConfig = {\n debug: false,\n content: [],\n plugins: [\n ttsVoicePlugin,\n //ttsParagraphPlugin,\n //ttsHeadlinePlugin,\n paragraphPlugin,\n headlinePlugin,\n figurePlugin,\n listPlugin,\n dialogPlugin,\n tooltipPlugin,\n linkEntityPlugin,\n blockChromePlugin,\n blockInsertMenuPlugin,\n clipboardPlugin,\n ],\n blockComponents: [],\n inlineStyles: [Bold, Italic, Underline, Subscript, Superscript],\n entityRanges: [],\n tooltip: {},\n };\n\n /** @type {import('#src/types.mjs').MrakomorConfig} */\n const resolvedConfig = {\n ...defaultConfig,\n ...config,\n plugins: withDefaultMrakomorPluginLast(\n (config.plugins ?? defaultConfig.plugins),\n ),\n };\n\n const mrakomor = new Mrakomor(resolvedConfig);\n\n mrakomor._init();\n\n if (!document.head.querySelector('style[data-mrakomor-css]')) {\n const style = createElement('style', {}, `${cssBundle}`);\n style.setAttribute('data-mrakomor-css', '');\n document.head.appendChild(style);\n }\n\n return mrakomor;\n}\n\nexport class Mrakomor {\n #id = createComponentId();\n /** @type {Element} */\n #root;\n /** @type {import('#src/types.mjs').Plugin[]} */\n #plugins = [];\n /** @type {Element[]} */\n #blockElements = [];\n /** @type {import('#src/types.mjs').MrakomorConfig} */\n #config;\n #mounted = false;\n #mountDisposer = null;\n listenerAbortController = new AbortController();\n /** @type {import('#src/types.mjs').Signal<import('#src/types.mjs').BlockState[]>} */\n #content = createSignal(\n /** @type {import('#src/types.mjs').BlockState[]} */ ([]),\n { debug: 'content' },\n );\n /** @type {import('#src/types.mjs').BlockStateInput[]} */\n #originalContent = [];\n /** @type {import('#src/types.mjs').MrakomorCommand} */\n command;\n /** @type {import('@esmj/emitter').Emitter} */\n emitter;\n\n /**\n * @public\n * @param {import('#src/types.mjs').MrakomorConfig} config\n */\n constructor(config) {\n const { root, id, content } = config;\n this.#id = id || this.#id;\n this.#root = root;\n\n this.#originalContent = content;\n this.#blockElements = [];\n\n this.#config = {\n ...config,\n plugins: withDefaultMrakomorPluginLast(config.plugins ?? []),\n };\n\n const { emitter, command } = createCommands({ mrakomor: this });\n this.command = command;\n this.emitter = emitter;\n }\n\n /**\n * Boot plugins and the content signal.\n * @internal\n */\n _init() {\n this.#bootPlugins();\n\n this.#content = createSignal(this._normalizeContentState(this.#originalContent), { debug: 'content' });\n }\n\n /**\n * Instantiate plugins, reduce `resolveConfig`, then register\n * events \u2192 commands \u2192 onKeyDown \u2192 handlers \u2192 listeners.\n */\n #bootPlugins() {\n this.#plugins =\n this.#config.plugins.map((plugin) => {\n return plugin?.({\n config: this.#config,\n root: this.#root,\n mrakomor: this,\n });\n }) ?? [];\n\n this.#config = this.#plugins.reduce((config, plugin) => {\n return plugin?.resolveConfig?.(config) ?? config;\n }, this.#config);\n\n this.#plugins.forEach((plugin) => {\n plugin?.registerEvents?.(this);\n });\n\n this.#plugins.forEach((plugin) => {\n plugin?.registerCommands?.(this);\n });\n\n this.#plugins.forEach((plugin) => {\n this.emitter.on(EVENT.KEYDOWN, (event) => {\n return plugin?.onKeyDown?.(event);\n });\n });\n\n this.#plugins.forEach((plugin) => {\n plugin?.registerHandlers?.(this);\n });\n\n this.#plugins.forEach((plugin) => {\n plugin?.registerListeners?.(this);\n });\n }\n\n /**\n * Emit on the editor bus with `event.mrakomor` set. Always use this, not `emitter.emit`.\n * @public\n * @param {string} eventName\n * @param {object} [payload] event-specific fields\n * @returns {import('#src/types.mjs').EmitterEvent}\n */\n emit(eventName, payload = {}) {\n return this.emitter.emit(eventName, { ...payload, mrakomor: this });\n }\n\n /**\n * Subscribe to an editor bus event. Same as `emitter.on`; prefer this from host code.\n * @public\n * @param {string} eventName\n * @param {function(import('#src/types.mjs').EmitterEvent): void} handler\n * @returns {function(): void} unsubscribe\n */\n on(eventName, handler) {\n return this.emitter.on(eventName, handler);\n }\n\n /**\n * Subscribe to `EVENT.CONTENT_CHANGE`. Same as `on(EVENT.CONTENT_CHANGE, handler)`.\n * @public\n * @param {function(import('#src/types.mjs').EmitterEvent): void} handler\n * @returns {function(): void} unsubscribe\n */\n onChangeContent(handler) {\n return this.on(EVENT.CONTENT_CHANGE, handler);\n }\n\n /**\n * Bridge a native DOM event onto the emitter; sync `preventDefault` back to the native event.\n * @public\n * @param {string} eventName\n * @param {Event} event\n * @returns {boolean} whether the emitter event was `defaultPrevented`\n */\n emitDomEvent(eventName, event) {\n const {\n clipboardData,\n metaKey,\n altKey,\n code,\n ctrlKey,\n key,\n isComposing,\n repeat,\n button,\n shiftKey,\n which,\n detail,\n isTrusted,\n target,\n relatedTarget,\n } = event ?? {};\n\n const { defaultPrevented } = this.emit(eventName, {\n clipboardData,\n metaKey,\n altKey,\n code,\n ctrlKey,\n key,\n isComposing,\n repeat,\n button,\n shiftKey,\n which,\n detail,\n isTrusted,\n target,\n relatedTarget,\n });\n\n if (defaultPrevented) {\n event?.preventDefault?.();\n }\n\n return defaultPrevented;\n }\n\n /**\n * Resolved editor config after plugin `resolveConfig`.\n * @public\n * @returns {import('#src/types.mjs').MrakomorConfig}\n */\n getConfig() {\n return this.#config;\n }\n\n /**\n * Let plugins wrap a block vnode (gutter chrome). First non-null wrapper wins.\n * @public\n * @param {*} blockComponent\n * @returns {*}\n */\n wrapBlockElement(blockComponent) {\n for (const plugin of this.#plugins) {\n const wrapped = plugin.wrapBlockElement?.(blockComponent);\n if (wrapped) {\n return wrapped;\n }\n }\n\n return blockComponent;\n }\n\n /**\n * Mount root element.\n * @public\n * @returns {Element | null}\n */\n getRoot() {\n return this.#root;\n }\n\n /**\n * Generated editor DOM id used by the Editor component.\n * @internal\n * @returns {string}\n */\n get _id() {\n return this.#id;\n }\n\n /**\n * Live block states from the DOM (`getState()` per block).\n * @public\n * @returns {import('#src/types.mjs').BlockState[]}\n */\n getContent() {\n const content = this.#blockElements.map((blockElement) => {\n return getBlockElementInstance(blockElement)?.getState();\n });\n\n return content;\n }\n\n /**\n * Replace editor content (normalized through each block schema).\n * @public\n * @param {import('#src/types.mjs').BlockStateInput[]} [content]\n */\n setContent(content = []) {\n this._setContentState(this._normalizeContentState(content));\n }\n\n /**\n * Re-read `.mrakomor-block-element` nodes after render. Do not treat as source of truth.\n * @internal\n */\n _syncBlockElementsFromDom() {\n const contentRoot = this.#root?.querySelector?.('.mrakomor-content');\n if (!contentRoot) {\n return;\n }\n\n this.#blockElements = [\n ...contentRoot.querySelectorAll('.mrakomor-block-element'),\n ];\n }\n\n /**\n * Live block wrapper nodes (parallel to content). Not source of truth.\n * @internal\n * @returns {Element[]}\n */\n _getBlockElements() {\n return this.#blockElements;\n }\n\n /**\n * Content signal (subscribes in render).\n * @internal\n * @returns {import('#src/types.mjs').BlockState[]}\n */\n _getContentState() {\n return this.#content.get();\n }\n\n /**\n * Write the content signal, emit `CONTENT_CHANGE`, then sync `#blockElements` in `afterRender`.\n * Listeners must use `event.content`; `getContent()` can still see old block nodes until after render.\n * @internal\n * @param {import('#src/types.mjs').BlockState[]} [content]\n */\n _setContentState(content = []) {\n this.#content.set(content);\n this.emit(EVENT.CONTENT_CHANGE, { content });\n\n afterRender(() => {\n this._syncBlockElementsFromDom();\n });\n }\n\n /**\n * Schema-parse every block (clone).\n * @internal\n * @param {import('#src/types.mjs').BlockStateInput[]} [content]\n * @returns {import('#src/types.mjs').BlockState[]}\n */\n _normalizeContentState(content = []) {\n return content.map((item) => {\n return /** @type {import('#src/types.mjs').BlockState} */ (\n structuredClone(this.normalizeComponentState(item))\n );\n }) ?? [];\n }\n\n /**\n * Register a block wrapper node (Editor Each `onMount`).\n * @internal\n * @param {Element} blockElement\n * @param {number} [index]\n */\n _setBlockElement(blockElement, index = this.#blockElements.length) {\n this.#blockElements.splice(index, 0, blockElement);\n }\n\n /**\n * Drop a block wrapper (Editor Each `onUnmount`).\n * @internal\n * @param {Element} blockElement\n */\n _removeBlockElement(blockElement) {\n this.#blockElements = this.#blockElements.filter(\n (el) => el !== blockElement,\n );\n }\n\n /**\n * Index of a block wrapper in `#blockElements`.\n * @internal\n * @param {Element} blockElement\n * @returns {number}\n */\n _getBlockElementIndex(blockElement) {\n return this.#blockElements.indexOf(blockElement);\n }\n\n /**\n * Mount the editor into `#root`.\n * @public\n * @returns {*}\n */\n mount() {\n const result = mount(\n this.#root,\n createElement(Editor, { mrakomor: this }),\n );\n this.#mounted = true;\n return result;\n }\n\n /**\n * Unmount the editor tree.\n * @public\n */\n unmount() {\n if (!this.#mounted) {\n return;\n }\n this.#mounted = false;\n unmount(this.#root);\n }\n\n /**\n * Abort DOM listeners, plugin `onUnmount`, and clear the emitter.\n * @internal\n */\n _onUnmount() {\n this.listenerAbortController.abort();\n this.#plugins.forEach((plugin) => {\n plugin?.onUnmount?.(this);\n });\n this.emitter.removeAllListeners();\n }\n\n /**\n * Plugin `onMount`, then sync `#blockElements` in `afterRender`.\n * @internal\n */\n _onMount() {\n this.#plugins.forEach((plugin) => {\n plugin?.onMount?.(this);\n });\n\n afterRender(() => {\n this._syncBlockElementsFromDom();\n });\n }\n\n /**\n * Vnode for a content block (`UnknownComponent` if the namespace is missing).\n * @public\n * @param {string} namespace\n * @param {import('#src/types.mjs').Signal<import('#src/types.mjs').BlockState>} stateSignal\n * @returns {*}\n */\n resolveComponent(namespace, stateSignal) {\n const Constructor = this.resolveComponentConstructor(namespace);\n\n if (Constructor) {\n return createElement(Constructor, { state: stateSignal });\n }\n\n return createElement(UnknownComponent, { state: stateSignal });\n }\n\n /**\n * Component constructor for a namespace (`config.blockComponents`, then plugins).\n * @public\n * @param {string} namespace\n * @returns {import('#src/types.mjs').ComponentConstructor | undefined}\n */\n resolveComponentConstructor(namespace) {\n /** @type {import('#src/types.mjs').ComponentConstructor | undefined} */\n let Constructor = this.#config.blockComponents.find(\n (Component) => Component.NAMESPACE === namespace,\n );\n\n if (!Constructor) {\n for (let plugin of this.#plugins) {\n Constructor = plugin?.resolveComponent?.(namespace);\n if (Constructor) {\n break;\n }\n }\n }\n\n return Constructor;\n }\n\n /**\n * `Constructor.getStateSchema().parse(state)` for a block or entity namespace.\n * @public\n * @param {import('#src/types.mjs').ComponentStateInput} state\n * @returns {import('#src/types.mjs').ComponentState | undefined}\n */\n normalizeComponentState(state) {\n const namespace =\n 'component' in state ? state.component : state.entity.type;\n\n return this.resolveComponentConstructor(namespace)\n ?.getStateSchema()\n ?.parse(state);\n }\n}\n", "import { s } from '@esmj/schema';\n\nimport { createComponentId } from '#src/dom.mjs';\nimport { ttsVoiceEntityRangesSchema } from '#src/schema.mjs';\nimport { List } from '#src/plugin/list/List.mjs';\nimport { ensureUniqueListItemIds } from '#src/plugin/list/listHelpers.mjs';\n\n/**\n * Schema for one TTS list item (voice ranges only, no inline styles).\n * @param {Element | null | undefined} node\n * @returns {*}\n */\nconst TTS_LIST_ITEM_SCHEMA = (node) =>\n s\n .object({\n componentId: s\n .string()\n .default(\n () => node?.getAttribute?.('data-componentid') || createComponentId(),\n ),\n depth: s.number().default(0),\n text: s.string().default(''),\n entityRanges: ttsVoiceEntityRangesSchema(),\n })\n .default({});\n\n/**\n * List block for TTS: same namespace/behavior as {@link List}, but items keep\n * only `atom.tts.Voice` entity ranges and drop inline styles.\n */\nexport class TtsList extends List {\n static getStateSchema(node) {\n const tagStyle =\n node?.nodeName === 'OL'\n ? 'ORDERED'\n : node?.nodeName === 'UL'\n ? 'UNORDERED'\n : undefined;\n\n return s\n .object({\n component: s.string().default(this.NAMESPACE),\n componentId: s\n .string()\n .default(\n node?.getAttribute('data-componentid') || createComponentId(),\n ),\n properties: s\n .object({\n items: s\n .array(TTS_LIST_ITEM_SCHEMA())\n .default([TTS_LIST_ITEM_SCHEMA().parse()])\n .transform(ensureUniqueListItemIds),\n })\n .default({}),\n settings: s\n .object({\n style: s\n .enum(['ORDERED', 'UNORDERED'])\n .default(tagStyle ?? 'UNORDERED'),\n })\n .default({}),\n })\n .default({});\n }\n\n getInlineStyleComponents() {\n return [];\n }\n\n /**\n * @param {Element | null | undefined} node\n * @returns {import('#src/types.mjs').ListBlockState}\n */\n parseFromHTML(node) {\n return this.constructor.getStateSchema(node).parse(super.parseFromHTML(node));\n }\n}\n\n/**\n * Registers the TTS list block (voice ranges on items, no inline styles).\n * Use instead of `listPlugin` for TTS editor presets.\n * @returns {import('#src/types.mjs').Plugin}\n */\nexport function ttsListPlugin() {\n return {\n resolveConfig: (config) => {\n config.blockComponents.push(TtsList);\n config.blockInsertVariants = [\n ...(config.blockInsertVariants ?? []),\n {\n label: 'UL',\n namespace: TtsList.NAMESPACE,\n settings: { style: 'UNORDERED' },\n },\n {\n label: 'OL',\n namespace: TtsList.NAMESPACE,\n settings: { style: 'ORDERED' },\n },\n ];\n\n return config;\n },\n resolveComponent: (namespace) => {\n if (namespace === TtsList.NAMESPACE) {\n return TtsList;\n }\n },\n };\n}\n", "{\n \"_cls\": \"Article\",\n \"_created\": \"2024-04-03 10:38:18\",\n \"_createdByGroups\": [\n \"673456f59e73c6551b2689ec\"\n ],\n \"_createdByUser\": \"625517d93c4ba02267a6ff89\",\n \"_fromVersionId\": \"668cf354dd309856005420e2\",\n \"_id\": \"668cf39add309856005420e5\",\n \"_ownedByGroups\": [\n \"673456f59e73c6551b2689ec\"\n ],\n \"_ownedByUser\": \"625517d93c4ba02267a6ff89\",\n \"_updated\": \"2024-07-09 10:23:54\",\n \"_updatedByGroups\": [\n \"673456f59e73c6551b2689ec\"\n ],\n \"_updatedByUser\": \"65fd41f5af2864ac7dfc8dc4\",\n \"adKeywords\": [],\n \"authors\": [\n \"6662dac5ee01784b357d6189\"\n ],\n \"autoSlug\": true,\n \"caption\": \"668cf29ec87a78bdd0157fad\",\n \"captionEmbed\": null,\n \"captionTitle\": \"P\u00E9\u010De o n\u00E1bytek je d\u016Fle\u017Eit\u00E1.\",\n \"changeFreq\": \"hourly\",\n \"content\": [\n {\n \"_cls\": \"HeadlineH2Molecule\",\n \"component\": \"molecule.headline.H2\",\n \"componentId\": \"668cf2690e403c8a2871530c\",\n \"properties\": {\n \"_cls\": \"_HeadlineMoleculeProperties\",\n \"text\": \"Vyv\u00E1\u017Een\u00E1 strava\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"ParagraphMolecule\",\n \"component\": \"molecule.paragraph.Paragraph\",\n \"componentId\": \"668cf2690e403c8a2871530d\",\n \"properties\": {\n \"_cls\": \"_ParagraphMoleculeProperties\",\n \"entityRanges\": [\n {\n \"_cls\": \"_EntityRange\",\n \"entity\": {\n \"_cls\": \"_LinkEntity\",\n \"data\": {\n \"_cls\": \"_LinkEntityData\",\n \"href\": \"https://seznam.cz\",\n \"target\": \"_blank\"\n },\n \"mutability\": \"MUTABLE\",\n \"type\": \"atom.link.Link\"\n },\n \"length\": 32,\n \"offset\": 183\n }\n ],\n \"inlineStyleRanges\": [\n {\n \"_cls\": \"_InlineStyleRange\",\n \"length\": 18,\n \"offset\": 111,\n \"style\": \"BOLD\"\n },\n {\n \"_cls\": \"_InlineStyleRange\",\n \"length\": 15,\n \"offset\": 132,\n \"style\": \"BOLD\"\n },\n {\n \"_cls\": \"_InlineStyleRange\",\n \"length\": 3,\n \"offset\": 23,\n \"style\": \"SUBSCRIPT\"\n },\n {\n \"_cls\": \"_InlineStyleRange\",\n \"length\": 3,\n \"offset\": 26,\n \"style\": \"SUPERSCRIPT\"\n }\n ],\n \"text\": \"Zdrav\u00FD \u017Eivotn\u00ED styl je kl\u00ED\u010Dem k dlouh\u00E9mu a kvalitn\u00EDmu \u017Eivotu. Jeho z\u00E1klady spo\u010D\u00EDvaj\u00ED v rovnov\u00E1ze mezi stravou, fyzickou aktivitou a du\u0161evn\u00ED pohodou. Tento \u010Dl\u00E1nek se zam\u011B\u0159uje na r\u016Fzn\u00E9 aspekty zdrav\u00E9ho \u017Eivotn\u00EDho stylu a jeho v\u00FDznam pro na\u0161i celkovou pohodu.\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"ParagraphMolecule\",\n \"component\": \"molecule.paragraph.Paragraph\",\n \"componentId\": \"668cf2690e403c8a2871530e\",\n \"properties\": {\n \"_cls\": \"_ParagraphMoleculeProperties\",\n \"entityRanges\": [],\n \"inlineStyleRanges\": [\n {\n \"_cls\": \"_InlineStyleRange\",\n \"length\": 27,\n \"offset\": 89,\n \"style\": \"ITALIC\"\n }\n ],\n \"text\": \"Prvn\u00EDm a nejd\u016Fle\u017Eit\u011Bj\u0161\u00EDm krokem k zdrav\u00E9mu \u017Eivotn\u00EDmu stylu je vyv\u00E1\u017Een\u00E1 strava. Konzumace dostate\u010Dn\u00E9ho mno\u017Estv\u00ED ovoce, zeleniny, celozrnn\u00FDch produkt\u016F a b\u00EDlkovin je z\u00E1kladem spr\u00E1vn\u00E9 v\u00FD\u017Eivy. Omezen\u00ED p\u0159\u00EDjmu cukru, soli a nasycen\u00FDch tuk\u016F m\u016F\u017Ee p\u0159isp\u011Bt k prevenci mnoha chronick\u00FDch onemocn\u011Bn\u00ED, jako jsou srde\u010Dn\u00ED choroby a cukrovka.\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"EmbedMolecule\",\n \"component\": \"molecule.embed.Embed\",\n \"componentId\": \"6654bca7be8fa5e598d295a7\",\n \"properties\": {\n \"_cls\": \"_EmbedMoleculeProperties\",\n \"height\": \"315\",\n \"url\": \"https://www.youtube.com/embed/CwzjlmBLfrQ?si=I_FcpHTM1ngW0ic0\",\n \"width\": \"560\"\n },\n \"settings\": {\n \"_cls\": \"_EmbedMoleculeSettings\",\n \"loginRestrictedContent\": false\n }\n },\n {\n \"_cls\": \"HeadlineH3Molecule\",\n \"component\": \"molecule.headline.H3\",\n \"componentId\": \"6613ea3326555fd47dd26751\",\n \"properties\": {\n \"_cls\": \"_HeadlineMoleculeProperties\",\n \"text\": \"Tady taky m\u016F\u017Ee b\u00FDt n\u011Bjak\u00FD mezititulek h3\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"ParagraphMolecule\",\n \"component\": \"molecule.paragraph.Paragraph\",\n \"componentId\": \"668cf2690e403c8a2871530f\",\n \"properties\": {\n \"_cls\": \"_ParagraphMoleculeProperties\",\n \"entityRanges\": [],\n \"inlineStyleRanges\": [],\n \"text\": \"Dal\u0161\u00EDm d\u016Fle\u017Eit\u00FDm prvkem zdrav\u00E9ho \u017Eivotn\u00EDho stylu je pravideln\u00E1 fyzick\u00E1 aktivita. Ka\u017Edodenn\u00ED pohyb, a\u0165 u\u017E ve form\u011B ch\u016Fze, b\u011Bhu, j\u00EDzdy na kole nebo cvi\u010Den\u00ED v posilovn\u011B, pom\u00E1h\u00E1 udr\u017Eovat t\u011Blo v kondici a zlep\u0161uje kardiovaskul\u00E1rn\u00ED zdrav\u00ED. Fyzick\u00E1 aktivita tak\u00E9 p\u0159isp\u00EDv\u00E1 k udr\u017Eov\u00E1n\u00ED zdrav\u00E9 hmotnosti a zlep\u0161uje n\u00E1ladu.\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"ParagraphMolecule\",\n \"component\": \"molecule.paragraph.Paragraph\",\n \"componentId\": \"668cf2690e403c8a28715310\",\n \"properties\": {\n \"_cls\": \"_ParagraphMoleculeProperties\",\n \"entityRanges\": [],\n \"inlineStyleRanges\": [],\n \"text\": \"Krom\u011B stravy a fyzick\u00E9 aktivity je nezbytn\u00E9 db\u00E1t na dostate\u010Dn\u00FD sp\u00E1nek. Kvalitn\u00ED sp\u00E1nek je d\u016Fle\u017Eit\u00FD pro regeneraci t\u011Bla a mysli. Doporu\u010Duje se sp\u00E1t 7 a\u017E 9 hodin denn\u011B. Nedostatek sp\u00E1nku m\u016F\u017Ee v\u00E9st k \u00FAnav\u011B, sn\u00ED\u017Een\u00E9 koncentraci a zv\u00FD\u0161en\u00E9mu riziku r\u016Fzn\u00FDch zdravotn\u00EDch probl\u00E9m\u016F.\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"FigureMolecule\",\n \"component\": \"molecule.figure.Figure\",\n \"componentId\": \"6613e99f26555fd47dd265ca\",\n \"properties\": {\n \"_cls\": \"_FigureMoleculeProperties\",\n \"media\": \"https://d39-a.sdn.cz/d_39/c_img_QP_n/IP6HG/shutterstock-383850691.jpeg?fl=cro,0,347,4800,2700%7Cres,480,,1%7Cwebp,75\",\n \"text\": \"Pravideln\u00E1 fyzick\u00E1 aktivita\"\n },\n \"settings\": {\n \"_cls\": \"_FigureMoleculeSettings\",\n \"trim\": \"original\"\n }\n },\n {\n \"_cls\": \"HeadlineH2Molecule\",\n \"component\": \"molecule.headline.H2\",\n \"componentId\": \"6613db554cb93821a8a107ac\",\n \"properties\": {\n \"_cls\": \"_HeadlineMoleculeProperties\",\n \"text\": \"Metody pro zakryt\u00ED \u0161kr\u00E1banc\u016F na n\u00E1bytku\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"ParagraphMolecule\",\n \"component\": \"molecule.paragraph.Paragraph\",\n \"componentId\": \"668cf2690e403c8a28715311\",\n \"properties\": {\n \"_cls\": \"_ParagraphMoleculeProperties\",\n \"entityRanges\": [],\n \"inlineStyleRanges\": [],\n \"text\": \"Du\u0161evn\u00ED pohoda je dal\u0161\u00EDm kl\u00ED\u010Dov\u00FDm aspektem zdrav\u00E9ho \u017Eivotn\u00EDho stylu. Stres, \u00FAzkost a deprese mohou m\u00EDt negativn\u00ED dopad na na\u0161e zdrav\u00ED. Praktiky jako meditace, j\u00F3ga nebo prost\u00E9 tr\u00E1ven\u00ED \u010Dasu s rodinou a p\u0159\u00E1teli mohou pomoci udr\u017Eet na\u0161i mysl v rovnov\u00E1ze a zlep\u0161it na\u0161i celkovou pohodu.\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n }\n ],\n \"dateOfLastUpdate\": \"2024-06-04 00:00:00\",\n \"dateOfPublication\": \"2024-06-04 00:00:00\",\n \"dateOfUnpublication\": \"2024-07-04 15:35:25\",\n \"discussionStatus\": true,\n \"geoCoordinates\": {\n \"_cls\": \"GeoCoordinates\"\n },\n \"layout\": \"660bb0c0dce3f06097285867\",\n \"metaKeywords\": [],\n \"metaRobots\": [\n \"all\"\n ],\n \"perex\": \"N\u00E1bytek mus\u00EDte jednou za \u010Das po\u0159\u00E1dn\u011B vy\u010Distit a tak\u00E9 ho zbavit \u0161kr\u00E1banc\u016F, kter\u00E9 se na n\u011Bm mohou objevit kdykoli. Nez\u00E1le\u017E\u00ED na tom, jestli m\u00E1te doma mal\u00E9 d\u011Bti nebo ne. Dosp\u011Bl\u00FDm se tak\u00E9 snadno poda\u0159\u00ED, \u017Ee n\u011B\u010D\u00EDm po\u0161kr\u00E1bou n\u00E1bytek. \",\n \"priority\": 0.8,\n \"protoSlug\": \"test-document-1\",\n \"recommendDays\": 7,\n \"recommendUntilDate\": \"2024-06-11 00:00:00\",\n \"relatedDocuments\": [],\n \"retargetingUrls\": [],\n \"searchString\": \"vyznam zdraveho zivotniho stylu nabytek musite jednou za cas poradne vycistit a take ho zbavit skrabancu, ktere se na nem mohou objevit kdykoli. nezalezi na tom, jestli mate doma male deti nebo ne. dospelym se take snadno podari, ze necim poskrabou nabytek.\",\n \"sections\": [\n \"660d1514677d382bbf45cbea\"\n ],\n \"showMinistryOfFinanceWarning\": false,\n \"slug\": \"test-section-1-test-document-1\",\n \"sources\": [],\n \"status\": \"testing\",\n \"suggestionUpdated\": \"2024-06-25 09:01:14\",\n \"sznPreviewType\": \"common\",\n \"tags\": [],\n \"textCorrection\": true,\n \"title\": \"V\u00FDznam zdrav\u00E9ho \u017Eivotn\u00EDho stylu\",\n \"totalPageViews\": 0,\n \"uid\": 1,\n \"useDefaults\": true,\n \"versionNote\": \"\",\n \"versionStatus\": \"testing\",\n \"videoportalTags\": [],\n \"workflowLabels\": [],\n \"yesterdayPageViews\": 0\n}", "{\n \"_cls\": \"Article\",\n \"_created\": \"2024-04-03 10:38:18\",\n \"_createdByGroups\": [\n \"673456f59e73c6551b2689ec\"\n ],\n \"_createdByUser\": \"625517d93c4ba02267a6ff89\",\n \"_fromVersionId\": \"668cf354dd309856005420e2\",\n \"_id\": \"668cf39add309856005420e5\",\n \"_ownedByGroups\": [\n \"673456f59e73c6551b2689ec\"\n ],\n \"_ownedByUser\": \"625517d93c4ba02267a6ff89\",\n \"_updated\": \"2024-07-09 10:23:54\",\n \"_updatedByGroups\": [\n \"673456f59e73c6551b2689ec\"\n ],\n \"_updatedByUser\": \"65fd41f5af2864ac7dfc8dc4\",\n \"adKeywords\": [],\n \"authors\": [\n \"6662dac5ee01784b357d6189\"\n ],\n \"autoSlug\": true,\n \"caption\": \"668cf29ec87a78bdd0157fad\",\n \"captionEmbed\": null,\n \"captionTitle\": \"P\u00E9\u010De o n\u00E1bytek je d\u016Fle\u017Eit\u00E1.\",\n \"changeFreq\": \"hourly\",\n \"content\": [\n {\n \"_cls\": \"HeadlineH2Molecule\",\n \"component\": \"molecule.headline.H2\",\n \"componentId\": \"668cf2690e403c8a2871530c\",\n \"properties\": {\n \"_cls\": \"_HeadlineMoleculeProperties\",\n \"text\": \"Vyv\u00E1\u017Een\u00E1 strava\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"ParagraphMolecule\",\n \"component\": \"molecule.paragraph.Paragraph\",\n \"componentId\": \"668cf2690e403c8a2871530d\",\n \"properties\": {\n \"_cls\": \"_ParagraphMoleculeProperties\",\n \"entityRanges\": [\n {\n \"_cls\": \"_EntityRange\",\n \"entity\": {\n \"_cls\": \"_LinkEntity\",\n \"data\": {\n \"_cls\": \"_LinkEntityData\",\n \"href\": \"https://seznam.cz\",\n \"target\": \"_blank\"\n },\n \"mutability\": \"MUTABLE\",\n \"type\": \"atom.link.Link\"\n },\n \"length\": 32,\n \"offset\": 183\n }\n ],\n \"inlineStyleRanges\": [\n {\n \"_cls\": \"_InlineStyleRange\",\n \"length\": 18,\n \"offset\": 111,\n \"style\": \"BOLD\"\n },\n {\n \"_cls\": \"_InlineStyleRange\",\n \"length\": 15,\n \"offset\": 132,\n \"style\": \"BOLD\"\n },\n {\n \"_cls\": \"_InlineStyleRange\",\n \"length\": 3,\n \"offset\": 23,\n \"style\": \"SUBSCRIPT\"\n },\n {\n \"_cls\": \"_InlineStyleRange\",\n \"length\": 3,\n \"offset\": 26,\n \"style\": \"SUPERSCRIPT\"\n }\n ],\n \"text\": \"Zdrav\u00FD \u017Eivotn\u00ED styl je kl\u00ED\u010Dem k dlouh\u00E9mu a kvalitn\u00EDmu \u017Eivotu. Jeho z\u00E1klady spo\u010D\u00EDvaj\u00ED v rovnov\u00E1ze mezi stravou, fyzickou aktivitou a du\u0161evn\u00ED pohodou. Tento \u010Dl\u00E1nek se zam\u011B\u0159uje na r\u016Fzn\u00E9 aspekty zdrav\u00E9ho \u017Eivotn\u00EDho stylu a jeho v\u00FDznam pro na\u0161i celkovou pohodu.\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"ParagraphMolecule\",\n \"component\": \"molecule.paragraph.Paragraph\",\n \"componentId\": \"668cf2690e403c8a2871530e\",\n \"properties\": {\n \"_cls\": \"_ParagraphMoleculeProperties\",\n \"entityRanges\": [],\n \"inlineStyleRanges\": [\n {\n \"_cls\": \"_InlineStyleRange\",\n \"length\": 27,\n \"offset\": 89,\n \"style\": \"ITALIC\"\n }\n ],\n \"text\": \"Prvn\u00EDm a nejd\u016Fle\u017Eit\u011Bj\u0161\u00EDm krokem k zdrav\u00E9mu \u017Eivotn\u00EDmu stylu je vyv\u00E1\u017Een\u00E1 strava. Konzumace dostate\u010Dn\u00E9ho mno\u017Estv\u00ED ovoce, zeleniny, celozrnn\u00FDch produkt\u016F a b\u00EDlkovin je z\u00E1kladem spr\u00E1vn\u00E9 v\u00FD\u017Eivy. Omezen\u00ED p\u0159\u00EDjmu cukru, soli a nasycen\u00FDch tuk\u016F m\u016F\u017Ee p\u0159isp\u011Bt k prevenci mnoha chronick\u00FDch onemocn\u011Bn\u00ED, jako jsou srde\u010Dn\u00ED choroby a cukrovka.\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"EmbedMolecule\",\n \"component\": \"molecule.embed.Embed\",\n \"componentId\": \"6654bca7be8fa5e598d295a7\",\n \"properties\": {\n \"_cls\": \"_EmbedMoleculeProperties\",\n \"height\": \"315\",\n \"url\": \"https://www.youtube.com/embed/CwzjlmBLfrQ?si=I_FcpHTM1ngW0ic0\",\n \"width\": \"560\"\n },\n \"settings\": {\n \"_cls\": \"_EmbedMoleculeSettings\",\n \"loginRestrictedContent\": false\n }\n },\n {\n \"_cls\": \"HeadlineH3Molecule\",\n \"component\": \"molecule.headline.H3\",\n \"componentId\": \"6613ea3326555fd47dd26751\",\n \"properties\": {\n \"_cls\": \"_HeadlineMoleculeProperties\",\n \"text\": \"Tady taky m\u016F\u017Ee b\u00FDt n\u011Bjak\u00FD mezititulek h3\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"ParagraphMolecule\",\n \"component\": \"molecule.paragraph.Paragraph\",\n \"componentId\": \"668cf2690e403c8a2871530f\",\n \"properties\": {\n \"_cls\": \"_ParagraphMoleculeProperties\",\n \"entityRanges\": [],\n \"inlineStyleRanges\": [],\n \"text\": \"Dal\u0161\u00EDm d\u016Fle\u017Eit\u00FDm prvkem zdrav\u00E9ho \u017Eivotn\u00EDho stylu je pravideln\u00E1 fyzick\u00E1 aktivita. Ka\u017Edodenn\u00ED pohyb, a\u0165 u\u017E ve form\u011B ch\u016Fze, b\u011Bhu, j\u00EDzdy na kole nebo cvi\u010Den\u00ED v posilovn\u011B, pom\u00E1h\u00E1 udr\u017Eovat t\u011Blo v kondici a zlep\u0161uje kardiovaskul\u00E1rn\u00ED zdrav\u00ED. Fyzick\u00E1 aktivita tak\u00E9 p\u0159isp\u00EDv\u00E1 k udr\u017Eov\u00E1n\u00ED zdrav\u00E9 hmotnosti a zlep\u0161uje n\u00E1ladu.\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"ParagraphMolecule\",\n \"component\": \"molecule.paragraph.Paragraph\",\n \"componentId\": \"668cf2690e403c8a28715310\",\n \"properties\": {\n \"_cls\": \"_ParagraphMoleculeProperties\",\n \"entityRanges\": [],\n \"inlineStyleRanges\": [],\n \"text\": \"Krom\u011B stravy a fyzick\u00E9 aktivity je nezbytn\u00E9 db\u00E1t na dostate\u010Dn\u00FD sp\u00E1nek. Kvalitn\u00ED sp\u00E1nek je d\u016Fle\u017Eit\u00FD pro regeneraci t\u011Bla a mysli. Doporu\u010Duje se sp\u00E1t 7 a\u017E 9 hodin denn\u011B. Nedostatek sp\u00E1nku m\u016F\u017Ee v\u00E9st k \u00FAnav\u011B, sn\u00ED\u017Een\u00E9 koncentraci a zv\u00FD\u0161en\u00E9mu riziku r\u016Fzn\u00FDch zdravotn\u00EDch probl\u00E9m\u016F.\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"FigureMolecule\",\n \"component\": \"molecule.figure.Figure\",\n \"componentId\": \"6613e99f26555fd47dd265ca\",\n \"properties\": {\n \"_cls\": \"_FigureMoleculeProperties\",\n \"media\": \"668cf29f71afc3abbf67cce1\",\n \"text\": \"Pravideln\u00E1 fyzick\u00E1 aktivita\"\n },\n \"settings\": {\n \"_cls\": \"_FigureMoleculeSettings\",\n \"trim\": \"original\"\n }\n },\n {\n \"_cls\": \"HeadlineH2Molecule\",\n \"component\": \"molecule.headline.H2\",\n \"componentId\": \"6613db554cb93821a8a107ac\",\n \"properties\": {\n \"_cls\": \"_HeadlineMoleculeProperties\",\n \"text\": \"Metody pro zakryt\u00ED \u0161kr\u00E1banc\u016F na n\u00E1bytku\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"ParagraphMolecule\",\n \"component\": \"molecule.paragraph.Paragraph\",\n \"componentId\": \"668cf2690e403c8a28715311\",\n \"properties\": {\n \"_cls\": \"_ParagraphMoleculeProperties\",\n \"entityRanges\": [],\n \"inlineStyleRanges\": [],\n \"text\": \"Du\u0161evn\u00ED pohoda je dal\u0161\u00EDm kl\u00ED\u010Dov\u00FDm aspektem zdrav\u00E9ho \u017Eivotn\u00EDho stylu. Stres, \u00FAzkost a deprese mohou m\u00EDt negativn\u00ED dopad na na\u0161e zdrav\u00ED. Praktiky jako meditace, j\u00F3ga nebo prost\u00E9 tr\u00E1ven\u00ED \u010Dasu s rodinou a p\u0159\u00E1teli mohou pomoci udr\u017Eet na\u0161i mysl v rovnov\u00E1ze a zlep\u0161it na\u0161i celkovou pohodu.\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"ListMolecule\",\n \"component\": \"molecule.list.List\",\n \"componentId\": \"6613ea3326555fd47dd26752\",\n \"properties\": {\n \"_cls\": \"_ListMoleculeProperties\",\n \"items\": [\n {\n \"_cls\": \"_ListMoleculeItem\",\n \"depth\": 0,\n \"entityRanges\": [],\n \"inlineStyleRanges\": [],\n \"text\": \"Odr\u00E1\u017Eky, to je u\u017Eite\u010Dn\u00E1 v\u011Bc\"\n },\n {\n \"_cls\": \"_ListMoleculeItem\",\n \"depth\": 0,\n \"entityRanges\": [],\n \"inlineStyleRanges\": [],\n \"text\": \"I dal\u0161\u00ED odr\u00E1\u017Eka tu m\u016F\u017Ee b\u00FDt\"\n },\n {\n \"_cls\": \"_ListMoleculeItem\",\n \"depth\": 0,\n \"entityRanges\": [],\n \"inlineStyleRanges\": [],\n \"text\": \"A co teprve t\u0159et\u00ED\"\n }\n ]\n },\n \"settings\": {\n \"_cls\": \"_ListMoleculeSettings\",\n \"style\": \"UNORDERED\"\n }\n },\n {\n \"_cls\": \"ParagraphMolecule\",\n \"component\": \"molecule.paragraph.Paragraph\",\n \"componentId\": \"668cf2690e403c8a28715312\",\n \"properties\": {\n \"_cls\": \"_ParagraphMoleculeProperties\",\n \"entityRanges\": [],\n \"inlineStyleRanges\": [],\n \"text\": \"Hydratace je \u010Dasto opom\u00EDjen\u00FDm, ale velmi d\u016Fle\u017Eit\u00FDm aspektem zdrav\u00ED. P\u00EDt dostatek vody ka\u017Ed\u00FD den pom\u00E1h\u00E1 udr\u017Eovat spr\u00E1vnou funkci org\u00E1n\u016F, podporuje tr\u00E1ven\u00ED a zlep\u0161uje ple\u0165. Doporu\u010Duje se vyp\u00EDt alespo\u0148 osm sklenic vody denn\u011B, a v\u00EDce pokud jsme fyzicky aktivn\u00ED.\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"ListMolecule\",\n \"component\": \"molecule.list.List\",\n \"componentId\": \"6613ea3326555fd47dd26753\",\n \"properties\": {\n \"_cls\": \"_ListMoleculeProperties\",\n \"items\": [\n {\n \"_cls\": \"_ListMoleculeItem\",\n \"depth\": 0,\n \"entityRanges\": [],\n \"inlineStyleRanges\": [],\n \"text\": \"Odr\u00E1\u017Eky, to je u\u017Eite\u010Dn\u00E1 v\u011Bc\"\n },\n {\n \"_cls\": \"_ListMoleculeItem\",\n \"depth\": 0,\n \"entityRanges\": [],\n \"inlineStyleRanges\": [],\n \"text\": \"I dal\u0161\u00ED odr\u00E1\u017Eka tu m\u016F\u017Ee b\u00FDt\"\n },\n {\n \"_cls\": \"_ListMoleculeItem\",\n \"depth\": 0,\n \"entityRanges\": [],\n \"inlineStyleRanges\": [],\n \"text\": \"A co teprve t\u0159et\u00ED\"\n }\n ]\n },\n \"settings\": {\n \"_cls\": \"_ListMoleculeSettings\",\n \"style\": \"ORDERED\"\n }\n },\n {\n \"_cls\": \"ParagraphMolecule\",\n \"component\": \"molecule.paragraph.Paragraph\",\n \"componentId\": \"668cf2690e403c8a28715313\",\n \"properties\": {\n \"_cls\": \"_ParagraphMoleculeProperties\",\n \"entityRanges\": [],\n \"inlineStyleRanges\": [],\n \"text\": \"Prevence je lep\u0161\u00ED ne\u017E l\u00E9\u010Dba, a proto je d\u016Fle\u017Eit\u00E9 pravideln\u011B nav\u0161t\u011Bvovat l\u00E9ka\u0159e na preventivn\u00ED prohl\u00EDdky. V\u010Dasn\u00E9 odhalen\u00ED zdravotn\u00EDch probl\u00E9m\u016F m\u016F\u017Ee v\u00FDznamn\u011B zv\u00FD\u0161it \u0161ance na jejich \u00FAsp\u011B\u0161n\u00E9 l\u00E9\u010Den\u00ED. Nezapom\u00EDnejme tak\u00E9 na o\u010Dkov\u00E1n\u00ED, kter\u00E9 n\u00E1s chr\u00E1n\u00ED p\u0159ed mnoha nebezpe\u010Dn\u00FDmi nemocemi.\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"GalleryMolecule\",\n \"component\": \"molecule.gallery.Gallery\",\n \"componentId\": \"6613ec9e1563b96478df5c0d\",\n \"properties\": {\n \"_cls\": \"_GalleryMoleculeProperties\",\n \"gallery\": \"668cf321c87a78bdd0157fb2\"\n },\n \"settings\": {\n \"_cls\": \"_GalleryMoleculeSettings\",\n \"loginRestrictedContent\": false\n }\n },\n {\n \"_cls\": \"ParagraphMolecule\",\n \"component\": \"molecule.paragraph.Paragraph\",\n \"componentId\": \"668cf2690e403c8a28715314\",\n \"properties\": {\n \"_cls\": \"_ParagraphMoleculeProperties\",\n \"entityRanges\": [],\n \"inlineStyleRanges\": [],\n \"text\": \"Kou\u0159en\u00ED a nadm\u011Brn\u00E1 konzumace alkoholu jsou faktory, kter\u00E9 v\u00FDrazn\u011B negativn\u011B ovliv\u0148uj\u00ED na\u0161e zdrav\u00ED. Odvyk\u00E1n\u00ED kou\u0159en\u00ED a omezen\u00ED alkoholu m\u016F\u017Ee v\u00E9st k v\u00FDznamn\u00E9mu zlep\u0161en\u00ED celkov\u00E9ho zdrav\u00ED a sn\u00ED\u017Een\u00ED rizika vzniku mnoha onemocn\u011Bn\u00ED.\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"ParagraphMolecule\",\n \"component\": \"molecule.paragraph.Paragraph\",\n \"componentId\": \"668cf2690e403c8a28715315\",\n \"properties\": {\n \"_cls\": \"_ParagraphMoleculeProperties\",\n \"entityRanges\": [],\n \"inlineStyleRanges\": [],\n \"text\": \"Zdrav\u00FD \u017Eivotn\u00ED styl tak\u00E9 zahrnuje p\u00E9\u010Di o na\u0161e vztahy a soci\u00E1ln\u00ED \u017Eivot. Siln\u00E9 a zdrav\u00E9 vztahy s rodinou, p\u0159\u00E1teli a kolegy mohou poskytnout podporu a zlep\u0161it na\u0161i du\u0161evn\u00ED pohodu. Soci\u00E1ln\u00ED interakce a podpora jsou d\u016Fle\u017Eit\u00E9 pro na\u0161e emo\u010Dn\u00ED zdrav\u00ED.\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"LinkBoxMolecule\",\n \"component\": \"molecule.linkBox.LinkBox\",\n \"componentId\": \"6613ec9e1563b96478df5c0f\",\n \"properties\": {\n \"_cls\": \"_LinkBoxMoleculeProperties\",\n \"links\": [\n {\n \"_cls\": \"LinkBoxItem\",\n \"text\": \"Partner si m\u016F\u017Ee linknout sv\u016Fj web p\u0159es linkbox\",\n \"url\": \"https://seznam.cz\"\n },\n {\n \"_cls\": \"LinkBoxItem\",\n \"text\": \"Rovnou m\u016F\u017Ee promovat druhou v\u011Bc\",\n \"url\": \"https://seznam.cz\"\n },\n {\n \"_cls\": \"LinkBoxItem\",\n \"text\": \"A t\u0159et\u00ED \u010Dl\u00E1nek taky\",\n \"url\": \"https://seznam.cz\"\n }\n ]\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"ParagraphMolecule\",\n \"component\": \"molecule.paragraph.Paragraph\",\n \"componentId\": \"668cf2690e403c8a28715316\",\n \"properties\": {\n \"_cls\": \"_ParagraphMoleculeProperties\",\n \"entityRanges\": [],\n \"inlineStyleRanges\": [],\n \"text\": \"Nakonec, zdrav\u00FD \u017Eivotn\u00ED styl je cestou, kter\u00E1 vy\u017Eaduje \u00FAsil\u00ED a z\u00E1vazek, ale v\u00FDhody, kter\u00E9 p\u0159in\u00E1\u0161\u00ED, jsou nezm\u011Brn\u00E9. Za\u010D\u00EDt m\u016F\u017Eeme mal\u00FDmi kroky, postupn\u011B m\u011Bnit sv\u00E9 n\u00E1vyky a sledovat, jak se na\u0161e t\u011Blo a mysl m\u011Bn\u00ED k lep\u0161\u00EDmu. Pamatujme, \u017Ee investice do na\u0161eho zdrav\u00ED je tou nejlep\u0161\u00ED investic\u00ED, kterou m\u016F\u017Eeme ud\u011Blat.\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"InfoboxMolecule\",\n \"component\": \"molecule.infobox.Infobox\",\n \"componentId\": \"6613eeea1563b96478df6dbb\",\n \"properties\": {\n \"_cls\": \"_InfoboxMoleculeProperties\",\n \"infobox\": \"6613ed1b3d6c992b901f7f33\"\n },\n \"settings\": {\n \"_cls\": \"_InfoboxMoleculeSettings\",\n \"loginRestrictedContent\": false\n }\n },\n {\n \"_cls\": \"ParagraphMolecule\",\n \"component\": \"molecule.paragraph.Paragraph\",\n \"componentId\": \"668cf2690e403c8a28715317\",\n \"properties\": {\n \"_cls\": \"_ParagraphMoleculeProperties\",\n \"entityRanges\": [],\n \"inlineStyleRanges\": [],\n \"text\": \"P\u0159i \u00FAklidu si d\u00E1vejte pozor na to, abyste nem\u011Bli had\u0159\u00EDk p\u0159\u00EDli\u0161 vlhk\u00FD. Mus\u00ED b\u00FDt jen vlhk\u00FD, proto\u017Ee n\u011Bkter\u00E9 materi\u00E1ly (hlavn\u011B d\u0159evo) jsou citliv\u00E9 na vysokou vlhkost a mohli byste si n\u00E1bytek zni\u010Dit. Nakonec nechte n\u00E1bytek vyschnout nebo pou\u017Eijte such\u00FD had\u0159\u00EDk, abyste tento proces urychlili. Nav\u00EDc such\u00FDm had\u0159\u00EDkem m\u016F\u017Eete povrchu tak\u00E9 trochu vyle\u0161tit, jestli m\u00E1te doma sklo nebo kov.\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"QuoteMolecule\",\n \"component\": \"molecule.quote.Quote\",\n \"componentId\": \"6613eeea1563b96478df6dbd\",\n \"properties\": {\n \"_cls\": \"_QuoteMoleculeProperties\",\n \"author\": \"Pepa V\u00E1pno\",\n \"cite\": \"\u00DAdr\u017Eba d\u0159ev\u011Bn\u00E9ho n\u00E1bytku \u0161et\u0159\u00ED na\u0161e lesy.\",\n \"date\": \"2024-04-08 00:00:00\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"ParagraphMolecule\",\n \"component\": \"molecule.paragraph.Paragraph\",\n \"componentId\": \"668cf2690e403c8a28715318\",\n \"properties\": {\n \"_cls\": \"_ParagraphMoleculeProperties\",\n \"entityRanges\": [],\n \"inlineStyleRanges\": [],\n \"text\": \"P\u0159i \u00FAklidu si d\u00E1vejte pozor na to, abyste nem\u011Bli had\u0159\u00EDk p\u0159\u00EDli\u0161 vlhk\u00FD. Mus\u00ED b\u00FDt jen vlhk\u00FD, proto\u017Ee n\u011Bkter\u00E9 materi\u00E1ly (hlavn\u011B d\u0159evo) jsou citliv\u00E9 na vysokou vlhkost a mohli byste si n\u00E1bytek zni\u010Dit. Nakonec nechte n\u00E1bytek vyschnout nebo pou\u017Eijte such\u00FD had\u0159\u00EDk, abyste tento proces urychlili. Nav\u00EDc such\u00FDm had\u0159\u00EDkem m\u016F\u017Eete povrchu tak\u00E9 trochu vyle\u0161tit, jestli m\u00E1te doma sklo nebo kov.\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"BannerMolecule\",\n \"component\": \"molecule.banner.Banner\",\n \"componentId\": \"6613eeea1563b96478df6dbf\",\n \"properties\": {\n \"_cls\": \"_BannerMoleculeProperties\",\n \"href\": \"https://seznam.cz\",\n \"isCommercial\": false,\n \"media\": \"668cf2a3dd309856005420e0\",\n \"target\": \"_blank\",\n \"text\": \"P\u00E9\u010De o soci\u00E1ln\u00ED vztahy\"\n },\n \"settings\": {\n \"_cls\": \"_BannerMoleculeSettings\",\n \"trim\": \"original\"\n }\n },\n {\n \"_cls\": \"ParagraphMolecule\",\n \"component\": \"molecule.paragraph.Paragraph\",\n \"componentId\": \"668cf2690e403c8a28715319\",\n \"properties\": {\n \"_cls\": \"_ParagraphMoleculeProperties\",\n \"entityRanges\": [],\n \"inlineStyleRanges\": [],\n \"text\": \"P\u0159i \u00FAklidu si d\u00E1vejte pozor na to, abyste nem\u011Bli had\u0159\u00EDk p\u0159\u00EDli\u0161 vlhk\u00FD. Mus\u00ED b\u00FDt jen vlhk\u00FD, proto\u017Ee n\u011Bkter\u00E9 materi\u00E1ly (hlavn\u011B d\u0159evo) jsou citliv\u00E9 na vysokou vlhkost a mohli byste si n\u00E1bytek zni\u010Dit. Nakonec nechte n\u00E1bytek vyschnout nebo pou\u017Eijte such\u00FD had\u0159\u00EDk, abyste tento proces urychlili. Nav\u00EDc such\u00FDm had\u0159\u00EDkem m\u016F\u017Eete povrchu tak\u00E9 trochu vyle\u0161tit, jestli m\u00E1te doma sklo nebo kov.\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"PollMolecule\",\n \"component\": \"molecule.poll.Poll\",\n \"componentId\": \"6613eeea1563b96478df6dc1\",\n \"properties\": {\n \"_cls\": \"_PollMoleculeProperties\",\n \"poll\": \"6613eddd3d6c992b901f7f35\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"ParagraphMolecule\",\n \"component\": \"molecule.paragraph.Paragraph\",\n \"componentId\": \"668cf2690e403c8a2871531a\",\n \"properties\": {\n \"_cls\": \"_ParagraphMoleculeProperties\",\n \"entityRanges\": [],\n \"inlineStyleRanges\": [],\n \"text\": \"P\u0159i \u00FAklidu si d\u00E1vejte pozor na to, abyste nem\u011Bli had\u0159\u00EDk p\u0159\u00EDli\u0161 vlhk\u00FD. Mus\u00ED b\u00FDt jen vlhk\u00FD, proto\u017Ee n\u011Bkter\u00E9 materi\u00E1ly (hlavn\u011B d\u0159evo) jsou citliv\u00E9 na vysokou vlhkost a mohli byste si n\u00E1bytek zni\u010Dit. Nakonec nechte n\u00E1bytek vyschnout nebo pou\u017Eijte such\u00FD had\u0159\u00EDk, abyste tento proces urychlili. Nav\u00EDc such\u00FDm had\u0159\u00EDkem m\u016F\u017Eete povrchu tak\u00E9 trochu vyle\u0161tit, jestli m\u00E1te doma sklo nebo kov.\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"TweetMolecule\",\n \"component\": \"molecule.twitter.tweet.Tweet\",\n \"componentId\": \"6645c45c5ff29b3235e8deab\",\n \"properties\": {\n \"_cls\": \"_TweetMoleculeProperties\",\n \"html\": \"<blockquote class=\\\"twitter-tweet\\\"><p lang=\\\"cs\\\" dir=\\\"ltr\\\">V m\u00E9 bublin\u011B asi unpopular opinion, ale "platba za mobily s internetem" nen\u00ED koncesion\u00E1\u0159sk\u00FD poplatek, ale da\u0148. A\u0165 na to kouk\u00E1te z kter\u00E9koli str\u00E1nky. <br><br>To, \u017Ee n\u011Bco takov\u00E9ho prob\u011Bhlo bez rozs\u00E1hl\u00E9 debaty o tom, co vlastn\u011B televize ve\u0159ejn\u00E9 slu\u017Eby je a pro\u010D ji a jak a kolik j\u00ED m\u00E1me\u2026 <a href=\\\"https://t.co/WiKuz8piSD\\\">pic.twitter.com/WiKuz8piSD</a></p>— Ludek Stanek (@LudekStanek) <a href=\\\"https://twitter.com/LudekStanek/status/1790982420067414336?ref_src=twsrc%5Etfw\\\">May 16, 2024</a></blockquote>\\n\\n\",\n \"id\": \"1790982420067414336\",\n \"signature\": \"lH6NQ2iiElOwrTNuOY29Cg==\",\n \"url\": \"https://twitter.com/LudekStanek/status/1790982420067414336\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"ParagraphMolecule\",\n \"component\": \"molecule.paragraph.Paragraph\",\n \"componentId\": \"668cf2690e403c8a2871531b\",\n \"properties\": {\n \"_cls\": \"_ParagraphMoleculeProperties\",\n \"entityRanges\": [],\n \"inlineStyleRanges\": [],\n \"text\": \"P\u0159i \u00FAklidu si d\u00E1vejte pozor na to, abyste nem\u011Bli had\u0159\u00EDk p\u0159\u00EDli\u0161 vlhk\u00FD. Mus\u00ED b\u00FDt jen vlhk\u00FD, proto\u017Ee n\u011Bkter\u00E9 materi\u00E1ly (hlavn\u011B d\u0159evo) jsou citliv\u00E9 na vysokou vlhkost a mohli byste si n\u00E1bytek zni\u010Dit. Nakonec nechte n\u00E1bytek vyschnout nebo pou\u017Eijte such\u00FD had\u0159\u00EDk, abyste tento proces urychlili. Nav\u00EDc such\u00FDm had\u0159\u00EDkem m\u016F\u017Eete povrchu tak\u00E9 trochu vyle\u0161tit, jestli m\u00E1te doma sklo nebo kov.\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"TikTokPostMolecule\",\n \"component\": \"molecule.tiktok.post.Post\",\n \"componentId\": \"6645c45c5ff29b3235e8dead\",\n \"properties\": {\n \"_cls\": \"_TikTokPostMoleculeProperties\",\n \"html\": \"<blockquote class=\\\"tiktok-embed\\\" cite=\\\"https://www.tiktok.com/@gordonramsayofficial/video/7257953990191729946\\\" data-video-id=\\\"7257953990191729946\\\" data-embed-from=\\\"oembed\\\" style=\\\"max-width:605px; min-width:325px;\\\"> <section> <a target=\\\"_blank\\\" title=\\\"@gordonramsayofficial\\\" href=\\\"https://www.tiktok.com/@gordonramsayofficial?refer=embed\\\">@gordonramsayofficial</a> <p><a title=\\\"duet\\\" target=\\\"_blank\\\" href=\\\"https://www.tiktok.com/tag/duet?refer=embed\\\">#duet</a> with @\u30D0\u30E4\u30B7\uD83E\uDD51Bayashi You\u2019re doing an injustice to my <a title=\\\"beefwellington\\\" target=\\\"_blank\\\" href=\\\"https://www.tiktok.com/tag/beefwellington?refer=embed\\\">#beefwellington</a> !! Seriously ?!? C\u2019mon @nick.digiovanni <a title=\\\"ramsayreacts\\\" target=\\\"_blank\\\" href=\\\"https://www.tiktok.com/tag/ramsayreacts?refer=embed\\\">#ramsayreacts</a> <a title=\\\"tiktokfood\\\" target=\\\"_blank\\\" href=\\\"https://www.tiktok.com/tag/tiktokfood?refer=embed\\\">#TikTokFood</a> </p> <a target=\\\"_blank\\\" title=\\\"\u266C original sound - Gordon Ramsay\\\" href=\\\"https://www.tiktok.com/music/original-sound-7257953964024400666?refer=embed\\\">\u266C original sound - Gordon Ramsay</a> </section> </blockquote>\",\n \"signature\": \"6Tz7F+dhk/4Fz+nzIb8t1Q==\",\n \"url\": \"https://www.tiktok.com/@gordonramsayofficial/video/7257953990191729946?is_from_webapp=1&sender_device=pc\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"ParagraphMolecule\",\n \"component\": \"molecule.paragraph.Paragraph\",\n \"componentId\": \"668cf2690e403c8a2871531c\",\n \"properties\": {\n \"_cls\": \"_ParagraphMoleculeProperties\",\n \"entityRanges\": [],\n \"inlineStyleRanges\": [],\n \"text\": \"P\u0159i \u00FAklidu si d\u00E1vejte pozor na to, abyste nem\u011Bli had\u0159\u00EDk p\u0159\u00EDli\u0161 vlhk\u00FD. Mus\u00ED b\u00FDt jen vlhk\u00FD, proto\u017Ee n\u011Bkter\u00E9 materi\u00E1ly (hlavn\u011B d\u0159evo) jsou citliv\u00E9 na vysokou vlhkost a mohli byste si n\u00E1bytek zni\u010Dit. Nakonec nechte n\u00E1bytek vyschnout nebo pou\u017Eijte such\u00FD had\u0159\u00EDk, abyste tento proces urychlili. Nav\u00EDc such\u00FDm had\u0159\u00EDkem m\u016F\u017Eete povrchu tak\u00E9 trochu vyle\u0161tit, jestli m\u00E1te doma sklo nebo kov.\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"ParagraphMolecule\",\n \"component\": \"molecule.paragraph.Paragraph\",\n \"componentId\": \"668cf2690e403c8a2871531d\",\n \"properties\": {\n \"_cls\": \"_ParagraphMoleculeProperties\",\n \"entityRanges\": [],\n \"inlineStyleRanges\": [],\n \"text\": \"P\u0159i \u00FAklidu si d\u00E1vejte pozor na to, abyste nem\u011Bli had\u0159\u00EDk p\u0159\u00EDli\u0161 vlhk\u00FD. Mus\u00ED b\u00FDt jen vlhk\u00FD, proto\u017Ee n\u011Bkter\u00E9 materi\u00E1ly (hlavn\u011B d\u0159evo) jsou citliv\u00E9 na vysokou vlhkost a mohli byste si n\u00E1bytek zni\u010Dit. Nakonec nechte n\u00E1bytek vyschnout nebo pou\u017Eijte such\u00FD had\u0159\u00EDk, abyste tento proces urychlili. Nav\u00EDc such\u00FDm had\u0159\u00EDkem m\u016F\u017Eete povrchu tak\u00E9 trochu vyle\u0161tit, jestli m\u00E1te doma sklo nebo kov.\"\n },\n \"settings\": {\n \"_cls\": \"BaseMoleculeSettings\"\n }\n },\n {\n \"_cls\": \"ListMolecule\",\n \"component\": \"molecule.list.List\",\n \"componentId\": \"6613db554cb93821a8a107af\",\n \"properties\": {\n \"_cls\": \"_ListMoleculeProperties\",\n \"items\": [\n {\n \"_cls\": \"_ListMoleculeItem\",\n \"depth\": 0,\n \"entityRanges\": [],\n \"inlineStyleRanges\": [\n {\n \"_cls\": \"_InlineStyleRange\",\n \"length\": 24,\n \"offset\": 0,\n \"style\": \"ITALIC\"\n }\n ],\n \"text\": \"Zdroj: https://seznam.cz\"\n }\n ]\n },\n \"settings\": {\n \"_cls\": \"_ListMoleculeSettings\",\n \"style\": \"UNORDERED\"\n }\n }\n ],\n \"dateOfLastUpdate\": \"2024-06-04 00:00:00\",\n \"dateOfPublication\": \"2024-06-04 00:00:00\",\n \"dateOfUnpublication\": \"2024-07-04 15:35:25\",\n \"discussionStatus\": true,\n \"geoCoordinates\": {\n \"_cls\": \"GeoCoordinates\"\n },\n \"layout\": \"660bb0c0dce3f06097285867\",\n \"metaKeywords\": [],\n \"metaRobots\": [\n \"all\"\n ],\n \"perex\": \"N\u00E1bytek mus\u00EDte jednou za \u010Das po\u0159\u00E1dn\u011B vy\u010Distit a tak\u00E9 ho zbavit \u0161kr\u00E1banc\u016F, kter\u00E9 se na n\u011Bm mohou objevit kdykoli. Nez\u00E1le\u017E\u00ED na tom, jestli m\u00E1te doma mal\u00E9 d\u011Bti nebo ne. Dosp\u011Bl\u00FDm se tak\u00E9 snadno poda\u0159\u00ED, \u017Ee n\u011B\u010D\u00EDm po\u0161kr\u00E1bou n\u00E1bytek. \",\n \"priority\": 0.8,\n \"protoSlug\": \"test-document-1\",\n \"recommendDays\": 7,\n \"recommendUntilDate\": \"2024-06-11 00:00:00\",\n \"relatedDocuments\": [],\n \"retargetingUrls\": [],\n \"searchString\": \"vyznam zdraveho zivotniho stylu nabytek musite jednou za cas poradne vycistit a take ho zbavit skrabancu, ktere se na nem mohou objevit kdykoli. nezalezi na tom, jestli mate doma male deti nebo ne. dospelym se take snadno podari, ze necim poskrabou nabytek.\",\n \"sections\": [\n \"660d1514677d382bbf45cbea\"\n ],\n \"showMinistryOfFinanceWarning\": false,\n \"slug\": \"test-section-1-test-document-1\",\n \"sources\": [],\n \"status\": \"testing\",\n \"suggestionUpdated\": \"2024-06-25 09:01:14\",\n \"sznPreviewType\": \"common\",\n \"tags\": [],\n \"textCorrection\": true,\n \"title\": \"V\u00FDznam zdrav\u00E9ho \u017Eivotn\u00EDho stylu\",\n \"totalPageViews\": 0,\n \"uid\": 1,\n \"useDefaults\": true,\n \"versionNote\": \"\",\n \"versionStatus\": \"testing\",\n \"videoportalTags\": [],\n \"workflowLabels\": [],\n \"yesterdayPageViews\": 0\n}", "import { createMrakomor, LinkEntity, ttsHeadlinePlugin, ttsParagraphPlugin, ttsListPlugin, ttsVoicePlugin, dialogPlugin, tooltipPlugin, blockChromePlugin, blockInsertMenuPlugin, headlinePlugin, paragraphPlugin, figurePlugin, listPlugin, linkEntityPlugin, clipboardPlugin } from './index.mjs';\n\nimport Article from './article.json';\nimport ArticleOriginal from './article-original.json';\n\n//installDebug();\n\nconst unorderedList = ArticleOriginal.content.find(\n (block) =>\n block.component === 'molecule.list.List' &&\n block.settings?.style === 'UNORDERED',\n);\nconst orderedList = ArticleOriginal.content.find(\n (block) =>\n block.component === 'molecule.list.List' &&\n block.settings?.style === 'ORDERED',\n);\n\nconst preset = new URLSearchParams(location.search).get('preset');\nconst isTtsPreset = preset === 'tts';\n\nconst editor = createMrakomor({\n root: document.getElementById('container'),\n plugins: [\n ...(isTtsPreset\n ? [ttsHeadlinePlugin, ttsParagraphPlugin, ttsListPlugin, ttsVoicePlugin]\n : [headlinePlugin, paragraphPlugin]),\n figurePlugin,\n ...(!isTtsPreset ? [listPlugin] : []),\n ...(!isTtsPreset ? [linkEntityPlugin] : []),\n dialogPlugin,\n tooltipPlugin,\n blockChromePlugin,\n blockInsertMenuPlugin,\n clipboardPlugin,\n ],\n ...(isTtsPreset ? { \n inlineStyles: [],\n entityRanges: [],\n } : {}),\n content: [\n Article.content[0],\n Article.content[1],\n Article.content[2],\n //Article.content[3],\n // {\n // componentId: 'external-1',\n // component: 'molecule.external.ExternalComponent',\n // properties: {},\n // settings: {},\n // },\n Article.content[4],\n Article.content[5],\n Article.content[6],\n Article.content[7],\n unorderedList,\n orderedList,\n ].filter(Boolean),\n});\n\neditor.mount();\nglobalThis.mrakomor = editor;\n\ndocument.getElementById('a').addEventListener('click', () => {\n editor.command.insertEntityRange({\n namespace: LinkEntity.NAMESPACE,\n url: 'https://www.seznam.cz',\n });\n});\n\ndocument.getElementById('state').addEventListener('click', () => {\n //editor.setState(Article.content);\n //console.log(mrakomor.getState());\n mrakomor.setContent(mrakomor.getContent());\n});\n\nwindow.addEventListener('keydown', (e) => {\n if (e.key === 's' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n mrakomor.setContent(mrakomor.getContent());\n }\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["s", "t", "l", "O", "x", "P", "N", "D", "F", "M", "t", "s", "r", "f", "a", "k", "R", "m", "E", "T", "w", "B", "C", "h", "d", "p", "x", "j", "L", "U", "X", "g", "I", "u", "l", "y", "P", "b", "q", "z", "$", "S", "A", "k", "a", "j", "t", "E", "s", "g", "b", "h", "u", "S", "T", "O", "F", "C", "V", "_", "M", "r", "p", "m", "f", "D", "N", "R", "L", "B", "v", "U", "y", "J", "I", "d", "q", "G", "Q", "w", "W", "_", "chars", "D", "Q", "textLength", "a", "b", "r", "Q", "Q", "Q", "Q", "restoreCaret", "Q", "mrakomor", "D", "Q", "Q", "mrakomor", "Q", "Q", "ICON_TRASH", "Q", "result", "eventName", "mrakomor", "mrakomor", "restoreCaret", "content", "D", "mrakomor", "m", "x", "y", "mrakomor", "x", "y", "C", "r", "m", "contentRect", "mrakomor", "mrakomor", "C", "v", "m", "x", "y", "Q", "restoreCaret", "cursor", "mrakomor", "m", "mrakomor", "Q"]
|
|
7
|
-
}
|