/var/www/vhosts/bsbdokum.com.tr/httpdocs/admin/assets/plugins/custom/tinymce
NameSizeModeActions
icons/-0755rm
plugins/-0755rm
skins/-0755rm
tinymce.bundle.js19463600644editdlrm
Edit: /var/www/vhosts/bsbdokum.com.tr/httpdocs/admin/assets/plugins/custom/tinymce/tinymce.bundle.js (1946360B)
/** * Copyright (c) Tiny Technologies, Inc. All rights reserved. * Licensed under the LGPL or a commercial license. * For LGPL see License.txt in the project root for license information. * For commercial licenses see https://www.tiny.cloud/ * * Version: 5.8.2 (2021-06-23) */ !function(){"use strict";var r=function(e){if(null===e)return"null";if(e===undefined)return"undefined";var t=typeof e;return"object"==t&&(Array.prototype.isPrototypeOf(e)||e.constructor&&"Array"===e.constructor.name)?"array":"object"==t&&(String.prototype.isPrototypeOf(e)||e.constructor&&"String"===e.constructor.name)?"string":t},t=function(e){return{eq:e}},s=t(function(e,t){return e===t}),i=function(o){return t(function(e,t){if(e.length!==t.length)return!1;for(var n=e.length,r=0;r=r.length&&n.substr(o,o+r.length)===r;var n,r,o},$e=function(t){return function(e){return e.replace(t,"")}},We=$e(/^\s+|\s+$/g),Ke=$e(/^\s+/g),Xe=$e(/\s+$/g),Ye=function(e){return 0=a.length&&r(o)}))})})},br=function(n){return{is:function(e){return n===e},isValue:R,isError:A,getOr:E(n),getOrThunk:E(n),getOrDie:E(n),or:function(e){return br(n)},orThunk:function(e){return br(n)},fold:function(e,t){return t(n)},map:function(e){return br(e(n))},mapError:function(e){return br(n)},each:function(e){e(n)},bind:function(e){return e(n)},exists:function(e){return e(n)},forall:function(e){return e(n)},toOptional:function(){return U.some(n)}}},Cr=function(n){return{is:A,isValue:A,isError:R,getOr:g,getOrThunk:function(e){return e()},getOrDie:function(){return b(String(n))()},or:function(e){return e},orThunk:function(e){return e()},fold:function(e,t){return e(n)},map:function(e){return Cr(n)},mapError:function(e){return Cr(e(n))},each:te,bind:function(e){return Cr(n)},exists:A,forall:R,toOptional:U.none}},wr={value:br,error:Cr,fromOption:function(e,t){return e.fold(function(){return Cr(t)},br)}},xr=function(a){if(!S(a))throw new Error("cases must be an array");if(0===a.length)throw new Error("there must be at least one case");var u=[],n={};return Y(a,function(e,r){var t=ae(e);if(1!==t.length)throw new Error("one and only one name per case");var o=t[0],i=e[o];if(n[o]!==undefined)throw new Error("duplicate key detected:"+o);if("cata"===o)throw new Error("cannot have a case named cata (sorry)");if(!S(i))throw new Error("case arguments must be an array");u.push(o),n[o]=function(){for(var n=[],e=0;e\"\u0060\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,ei=/[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,ti=/[<>&\"\']/g,ni=/&#([a-z0-9]+);?|&([a-z0-9]+);/gi,ri={128:"\u20ac",130:"\u201a",131:"\u0192",132:"\u201e",133:"\u2026",134:"\u2020",135:"\u2021",136:"\u02c6",137:"\u2030",138:"\u0160",139:"\u2039",140:"\u0152",142:"\u017d",145:"\u2018",146:"\u2019",147:"\u201c",148:"\u201d",149:"\u2022",150:"\u2013",151:"\u2014",152:"\u02dc",153:"\u2122",154:"\u0161",155:"\u203a",156:"\u0153",158:"\u017e",159:"\u0178"},oi={'"':""","'":"'","<":"<",">":">","&":"&","`":"`"},ii={"<":"<",">":">","&":"&",""":'"',"'":"'"},ai=function(e,t){var n,r,o,i={};if(e){for(e=e.split(","),t=t||10,n=0;n>10),56320+(1023&t))):ri[t]||String.fromCharCode(t):ii[e]||ui[e]||(n=e,(r=Tt.fromTag("div").dom).innerHTML=n,r.textContent||r.innerText||n);var n,r})}},di={},mi={},gi=At.makeMap,pi=At.each,hi=At.extend,vi=At.explode,yi=At.inArray,bi=function(e,t){return(e=At.trim(e))?e.split(t||" "):[]},Ci=function(e,n){var r;return e&&(r={},"string"==typeof e&&(e={"*":e}),pi(e,function(e,t){r[t]=r[t.toUpperCase()]=("map"===n?gi:vi)(e,/[, ]/)})),r},wi=function(i){var e,s,t,n,r,o,a,c,u,l,S={},f={},N=[],d={},m={},g=function(e,t,n){var r=i[e];return r?r=gi(r,/[, ]/,gi(r.toUpperCase(),/[, ]/)):(r=di[e])||(r=gi(t," ",gi(t.toUpperCase()," ")),r=hi(r,n),di[e]=r),r},p=(e=(i=i||{}).schema,c={},u=function(e,t,n){var r,o,i=function(e,t){for(var n={},r=0,o=e.length;r
').css(n).appendTo(i)[0];return s.set(U.some({caret:o,element:e,before:t})),s.get().each(function(e){t&&hu(e.caret).addClass("mce-visual-caret-before")}),f(),(r=e.ownerDocument.createRange()).setStart(u,0),r.setEnd(u,0),r},hide:l,getCss:function(){return".mce-visual-caret {position: absolute;background-color: black;background-color: currentcolor;}.mce-visual-caret-hidden {display: none;}*[data-mce-caret] {position: absolute;left: -1000px;right: auto;top: 0;margin: 0;padding: 0;}"},reposition:function(){s.get().each(function(e){var t=Fc(i,e.element,e.before);hu(e.caret).css(_e({},t))})},destroy:function(){return Kr.clearInterval(n)}}},zc=function(){return Pc.isIE()||Pc.isEdge()||Pc.isFirefox()},jc=function(e){return Lc(e)||Ic(e)},Hc=function(e){return jc(e)||Ln(e)&&zc()},Vc=$n,qc=Kn,$c=On("display","block table table-cell table-caption list-item"),Wc=wo,Kc=bo,Xc=Tn,Yc=Mo,Gc=function(e,t){for(var n;n=e(t);)if(!Kc(n))return n;return null},Jc=function(e,t,n,r,o){var i=new Gr(e,r),a=Vc(e)||Kc(e);if(t<0){if(a&&n(e=Gc(i.prev.bind(i),!0)))return e;for(;e=Gc(i.prev.bind(i),o);)if(n(e))return e}if(0=u.data.length-1)return 1===e&&(r=a(u))?rl(r):n;if(ko(u)&&s<=1)return-1===e&&(r=i(u))?ol(r):n;if(s===u.data.length)return(r=a(u))?rl(r):n;if(0===s)return(r=i(u))?ol(r):n}return n},al=function(e,t){return U.from(el(e?0:-1,t)).filter(Vc)},ul=function(e,t,n){var r=il(e,t,n);return-1===e?Ms.fromRangeStart(r):Ms.fromRangeEnd(r)},sl=function(e){return U.from(e.getNode()).map(Tt.fromDom)},cl=function(e,t){for(;t=e(t);)if(t.isVisible())return t;return t},ll=function(e,t){var n=Zc(e,t);return!(n||!Hn(e.getNode()))||n};(Us=Fs=Fs||{})[Us.Backwards=-1]="Backwards",Us[Us.Forwards=1]="Forwards";var fl,dl,ml,gl,pl=$n,hl=Fn,vl=Tn,yl=Hn,bl=Mo,Cl=function(e){return Po(e)||!!Fo(t=e)&&!0!==$(ie(t.getElementsByTagName("*")),function(e,t){return e||Ro(t)},!1);var t},wl=Uo,xl=function(e,t){return e.hasChildNodes()&&tu.length-1)return!!Hl(c,i,r)||function(e,t){return Ml(e).fold(A,function(e){return t.setStart(e.container(),e.offset()),t.setEnd(e.container(),e.offset()),!0})}(i,r);i=u[s[o]]}3===i.nodeType&&(a=Math.min(s[0],i.nodeValue.length)),1===i.nodeType&&(a=Math.min(s[0],i.childNodes.length)),t?r.setStart(i,a):r.setEnd(i,a)}return!0},ql=function(e){return Fn(e)&&0=n.length?t=n.length-1:t<0&&(t=0),n[t]||e},Bf=function(e,t,u){var n=t.startContainer,r=t.startOffset,o=t.endContainer,i=t.endOffset,s=function(e){var t=e[0];return 3===t.nodeType&&t===n&&r>=t.nodeValue.length&&e.splice(0,1),t=e[e.length-1],0===i&&0T(c)?(x=D(w*b),w=D(x/b)):(w=D(x/b),x=D(w*b))),F(d,w,x),t=0<(t=g.startPos.x+s)?t:0,n=0<(n=g.startPos.y+c)?n:0,k.setStyles(m,{left:t,top:n,display:"block"}),m.innerHTML=w+" × "+x,g[2]<0&&d.clientWidth<=w&&k.setStyle(d,"left",void 0+(v-w)),g[3]<0&&d.clientHeight<=x&&k.setStyle(d,"top",void 0+(y-x)),(s=O.scrollWidth-S)+(c=O.scrollHeight-N)!==0&&k.setStyles(m,{left:t-s,top:n-c}),C||(r=l,o=f,i=v,a=y,u="corner-"+g.name,r.fire("ObjectResizeStart",{target:o,width:i,height:a,origin:u}),C=!0)},z=function(){var e,t,n,r,o,i=C;C=!1,i&&(a(f,"width",w),a(f,"height",x)),k.unbind(A,"mousemove",U),k.unbind(A,"mouseup",z),R!==A&&(k.unbind(R,"mousemove",U),k.unbind(R,"mouseup",z)),k.remove(d),k.remove(m),k.remove(c),u(f),i&&(e=l,t=f,n=w,r=x,o="corner-"+g.name,e.fire("ObjectResized",{target:t,width:n,height:r,origin:o}),k.setAttrib(f,"style",k.getAttrib(f,"style"))),l.nodeChanged()},u=function(e){H();var t=k.getPos(e,O),i=t.x,a=t.y,n=e.getBoundingClientRect(),u=n.width||n.right-n.left,s=n.height||n.bottom-n.top;f!==e&&(j(),f=e,w=x=0);var r=l.fire("ObjectSelected",{target:e}),o=k.getAttrib(f,E,"1");M(e)&&!r.isDefaultPrevented()?_(B,function(r,o){var t=function(e){var t,n=I(f)[0];p=e.screenX,h=e.screenY,v=n.clientWidth,y=n.clientHeight,b=y/v,(g=r).name=o,g.startPos={x:u*r[0]+i,y:s*r[1]+a},S=O.scrollWidth,N=O.scrollHeight,c=k.add(O,"div",{"class":"mce-resize-backdrop"}),k.setStyles(c,{position:"fixed",left:"0",top:"0",width:"100%",height:"100%"}),d=L(t=f)?k.create("img",{src:St.transparentSrc}):t.cloneNode(!0),k.addClass(d,"mce-clonedresizable"),k.setAttrib(d,"data-mce-bogus","all"),d.contentEditable="false",k.setStyles(d,{left:i,top:a,margin:0}),F(d,u,s),d.removeAttribute(E),O.appendChild(d),k.bind(A,"mousemove",U),k.bind(A,"mouseup",z),R!==A&&(k.bind(R,"mousemove",U),k.bind(R,"mouseup",z)),m=k.add(O,"div",{"class":"mce-resize-helper","data-mce-bogus":"all"},v+" × "+y)},e=k.get("mceResizeHandle"+o);e&&k.remove(e),e=k.add(O,"div",{id:"mceResizeHandle"+o,"data-mce-bogus":"all","class":"mce-resizehandle",unselectable:!0,style:"cursor:"+o+"-resize; margin:0; padding:0"}),11===St.ie&&(e.contentEditable=!1),k.bind(e,"mousedown",function(e){e.stopImmediatePropagation(),e.preventDefault(),t(e)}),r.elm=e,k.setStyles(e,{left:u*r[0]+i-e.offsetWidth/2,top:s*r[1]+a-e.offsetHeight/2})}):j(),k.getAttrib(f,E)||f.setAttribute(E,o)},j=function(){H(),f&&f.removeAttribute(E),se(B,function(e,t){var n=k.get("mceResizeHandle"+t);n&&(k.unbind(n),k.remove(n))})},o=function(e){var t,n=function(e,t){if(e)do{if(e===t)return!0}while(e=e.parentNode)};C||l.removed||(_(k.select("img[data-mce-selected],hr[data-mce-selected]"),function(e){e.removeAttribute(E)}),t="mousedown"===e.type?e.target:r.getNode(),n(t=k.$(t).closest("table,img,figure.image,hr,video,span.mce-preview-object")[0],O)&&(s(),n(r.getStart(!0),t)&&n(r.getEnd(!0),t))?u(t):j())},i=function(e){return rd(Zf(l.getBody(),e))},H=function(){se(B,function(e){e.elm&&(k.unbind(e.elm),delete e.elm)})},s=function(){try{l.getDoc().execCommand("enableObjectResizing",!1,"false")}catch(e){}};l.on("init",function(){var e;s(),(St.browser.isIE()||St.browser.isEdge())&&(l.on("mousedown click",function(e){var t=e.target,n=t.nodeName;C||!/^(TABLE|IMG|HR)$/.test(n)||i(t)||(2!==e.button&&l.selection.select(t,"TABLE"===n),"mousedown"===e.type&&l.nodeChanged())}),e=function(e){var t=function(e){Kr.setEditorTimeout(l,function(){return l.selection.select(e)})};if(i(e.target)||Kn(e.target))return e.preventDefault(),void t(e.target);/^(TABLE|IMG|HR)$/.test(e.target.nodeName)&&(e.preventDefault(),"IMG"===e.target.tagName&&t(e.target))},k.bind(O,"mscontrolselect",e),l.on("remove",function(){return k.unbind(O,"mscontrolselect",e)}));var t=Kr.throttle(function(e){l.composing||o(e)});l.on("nodechange ResizeEditor ResizeWindow ResizeContent drop FullscreenStateChanged",t),l.on("keyup compositionend",function(e){f&&"TABLE"===f.nodeName&&t(e)}),l.on("hide blur",j),l.on("contextmenu longpress",n,!0)}),l.on("remove",H);return{isResizable:M,showResizeRect:u,hideResizeRect:j,updateResizeRect:o,destroy:function(){f=d=c=null}}},id=function(e){return qn(e)||$n(e)},ad=function(e,t,n){var r,o,i,a,u,s=n;if(s.caretPositionFromPoint)(o=s.caretPositionFromPoint(e,t))&&((r=n.createRange()).setStart(o.offsetNode,o.offset),r.collapse(!0));else if(n.caretRangeFromPoint)r=n.caretRangeFromPoint(e,t);else if(s.body.createTextRange){r=s.body.createTextRange();try{r.moveToPoint(e,t),r.collapse(!0)}catch(c){r=function(e,n,t){var r,o=t.elementFromPoint(e,n),i=t.body.createTextRange();if(o&&"HTML"!==o.tagName||(o=t.body),i.moveToElementText(o),0<(r=(r=At.toArray(i.getClientRects())).sort(function(e,t){return(e=Math.abs(Math.max(e.top-n,e.bottom-n)))-(t=Math.abs(Math.max(t.top-n,t.bottom-n)))})).length){n=(r[0].bottom+r[0].top)/2;try{return i.moveToPoint(e,n),i.collapse(!0),i}catch(a){}}return null}(e,t,n)}return i=r,a=n.body,u=i&&i.parentElement?i.parentElement():null,$n(function(e,t,n){for(;e&&e!==t;){if(n(e))return e;e=e.parentNode}return null}(u,a,id))?null:i}return r},ud=function(e,t){return e&&t&&e.startContainer===t.startContainer&&e.startOffset===t.startOffset&&e.endContainer===t.endContainer&&e.endOffset===t.endOffset},sd=function(e,t,n){return null!==function(e,t,n){for(;e&&e!==t;){if(n(e))return e;e=e.parentNode}return null}(e,t,n)},cd=function(e){return e&&"TABLE"===e.nodeName},ld=function(e,t,n){for(var r=new Gr(t,e.getParent(t.parentNode,e.isBlock)||e.getRoot());t=r[n?"prev":"next"]();)if(Hn(t))return!0},fd=function(e,t,n,r,o){var i,a,u=e.getRoot(),s=e.schema.getNonEmptyElements(),c=e.getParent(o.parentNode,e.isBlock)||u;if(r&&Hn(o)&&t&&e.isEmpty(c))return U.some(Ms(o.parentNode,e.nodeIndex(o)));for(var l,f,d=new Gr(o,c);a=d[r?"prev":"next"]();){if("false"===e.getContentEditableParent(a)||(f=u,wo(l=a)&&!1===sd(l,f,Ul)))return U.none();if(Fn(a)&&0l.childNodes.length-1&&(g=!1),zn(l)&&(l=s,f=0),l===s){if(g&&(o=l.childNodes[0\ufeff');return ln(n.element,r),_d(r,function(){return hn(r)})},Rd=function(n,r,o,i){Bd(n,function(e,t){return Dd(n,r,o,i)},o)},Td=function(e,t,n,r,o){var i,a,u={elm:r.element.dom,alignToTop:o};i=u,e.fire("ScrollIntoView",i).isDefaultPrevented()||(n(t,Sn(t).top,r,o),a=u,e.fire("AfterScrollIntoView",a))},Dd=function(e,t,n,r){var o=Tt.fromDom(e.getBody()),i=Tt.fromDom(e.getDoc());o.dom.offsetWidth;var a=Ad(Tt.fromDom(n.startContainer),n.startOffset);Td(e,i,t,a,r),a.cleanup()},Od=function(e,t,n,r){var o,i=Tt.fromDom(e.getDoc());Td(e,i,n,(o=t,_d(Tt.fromDom(o),te)),r)},Bd=function(e,t,n){var r=n.startContainer,o=n.startOffset,i=n.endContainer,a=n.endOffset;t(Tt.fromDom(r),Tt.fromDom(i));var u=e.dom.createRng();u.setStart(r,o),u.setEnd(i,a),e.selection.setRng(n)},Pd=function(e,t,n,r){var o,i=e.pos;n?Nn(i.left,i.top,r):(o=i.top-t+e.height,Nn(i.left,o,r))},Ld=function(e,t,n,r,o){var i=n+t,a=r.pos.top,u=r.bottom,s=n<=u-a;aa.bottom&&En(n.element,!0===r)},Fd=function(e,t,n){return Rd(e,Id,t,n)},Ud=function(e,t,n){return Od(e,t,Id,n)},zd=function(e,t,n){return Rd(e,Md,t,n)},jd=function(e,t,n){return Od(e,t,Md,n)},Hd=function(e,t,n){(e.inline?Fd:zd)(e,t,n)},Vd=function(e){var t=an(e).dom;return e.dom===t.activeElement},qd=function(e){return void 0===e&&(e=Tt.fromDom(document)),U.from(e.dom.activeElement).map(Tt.fromDom)},$d=function(e,t,n,r){return{start:e,soffset:t,finish:n,foffset:r}},Wd=xr([{before:["element"]},{on:["element","offset"]},{after:["element"]}]),Kd=(Wd.before,Wd.on,Wd.after,function(e){return e.fold(g,g,g)}),Xd=xr([{domRange:["rng"]},{relative:["startSitu","finishSitu"]},{exact:["start","soffset","finish","foffset"]}]),Yd={domRange:Xd.domRange,relative:Xd.relative,exact:Xd.exact,exactFromRange:function(e){return Xd.exact(e.start,e.soffset,e.finish,e.foffset)},getWin:function(e){var t=e.match({domRange:function(e){return Tt.fromDom(e.startContainer)},relative:function(e,t){return Kd(e)},exact:function(e,t,n,r){return e}});return Wt(t)},range:$d},Gd=gt().browser,Jd=function(e,t){var n=jt(t)?Wf(t).length:Qt(t).length+1;return n]+(?:"[^"]*"|'[^']*'))*[^"'>]*(?:"[^">]*|'[^'>]*)?|\s*|\/)>/g;for(u.lastIndex=r=n;o=u.exec(t);){if(r=u.lastIndex,"/"===o[1])i--;else if(!o[1]){if(o[2]in a)continue;i++}if(0===i)break}return r},Im=function(W,K){void 0===K&&(K=wi()),!1!==(W=W||{}).fix_self_closing&&(W.fix_self_closing=!0);var X=W.comment?W.comment:te,Y=W.cdata?W.cdata:te,G=W.text?W.text:te,J=W.start?W.start:te,Q=W.end?W.end:te,Z=W.pi?W.pi:te,ee=W.doctype?W.doctype:te,n=function(f,e){void 0===e&&(e="html");for(var t,i,n,d,r,o,a,m,u,s,c,l,g,p,h,v,y,b,C,w=f.html,x=0,S=[],N=0,E=fi.decode,k=At.makeMap("src,href,data,background,action,formaction,poster,xlink:href"),_=/((java|vb)script|mhtml):/i,A="html"===e?0:1,R=function(e){for(var t,n=S.length;n--&&S[n].name!==e;);if(0<=n){for(t=S.length-1;n<=t;t--)(e=S[t]).valid&&Q(e.name);S.length=n}},T=function(e,t){return G(Om(e,f),t)},D=function(e){""!==e&&(">"===e.charAt(0)&&(e=" "+e),W.allow_conditional_comments||"[if"!==e.substr(0,3).toLowerCase()||(e=" "+e),X(Om(e,f)))},O=function(e,t){var n=e||"",r=!qe(n,"--"),o=function(e,t,n){void 0===n&&(n=0);var r=e.toLowerCase();if(-1!==r.indexOf("[if ",n)&&(u=n,/^\s*\[if [\w\W]+\]>.*/.test(r.substr(u)))){var o=r.indexOf("[endif]",n);return r.indexOf(">",o)}if(t){var i=r.indexOf(">",n);return-1!==i?i:r.length}var a=/--!?>/g;a.lastIndex=n;var u,s=a.exec(e);return s?s.index+s[0].length:r.length}(w,r,t);return e=w.substr(t,o-t),D(r?n+e:e),o+1},B=function(e,t,n,r,o){var i,a,u,s;if(t=t.toLowerCase(),u=t in F?t:E(n||r||o||""),n=Om(u,f),U&&!m&&!1==(0===(s=t).indexOf("data-")||0===s.indexOf("aria-"))){if(!(i=p[t])&&h){for(a=h.length;a--&&!(i=h[a]).pattern.test(t););-1===a&&(i=null)}if(!i)return;if(i.validValues&&!(n in i.validValues))return}if(k[t]&&!W.allow_script_urls){var c=n.replace(/[\s\u0000-\u001F]+/g,"");try{c=decodeURIComponent(c)}catch(l){c=unescape(c)}if(_.test(c))return;if(Pm(W,c,e))return}m&&(t in k||0===t.indexOf("on"))||(d.map[t]=n,d.push({name:t,value:n}))},P=new RegExp("<(?:(?:!--([\\w\\W]*?)--!?>)|(?:!\\[CDATA\\[([\\w\\W]*?)\\]\\]>)|(?:![Dd][Oo][Cc][Tt][Yy][Pp][Ee]([\\w\\W]*?)>)|(?:!(--)?)|(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|(?:\\/([A-Za-z][A-Za-z0-9\\-_\\:\\.]*)>)|(?:([A-Za-z][A-Za-z0-9\\-_:.]*)(\\s(?:[^'\">]+(?:\"[^\"]*\"|'[^']*'))*[^\"'>]*(?:\"[^\">]*|'[^'>]*)?|\\s*|\\/)>))","g"),L=/([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:[^\"])*)\")|(?:\'((?:[^\'])*)\')|([^>\s]+)))?/g,I=K.getShortEndedElements(),M=W.self_closing_elements||K.getSelfClosingElements(),F=K.getBoolAttrs(),U=W.validate,z=W.remove_internals,j=W.fix_self_closing,H=K.getSpecialElements(),V=w+">";t=P.exec(V);){var q=t[0];if(xw.length){T(E(w.substr(t.index))),x=t.index+q.length;continue}":"===(i=i.toLowerCase()).charAt(0)&&(i=i.substr(1)),u=i in I,j&&M[i]&&0]*data-mce-bogus="all"[^>]*>/g,f=e.schema;a=e.getTempAttrs(),u=c,s=new RegExp(["\\s?("+a.join("|")+')="[^"]+"'].join("|"),"gi"),c=u.replace(s,"");for(var d=f.getShortEndedElements();i=l.exec(c);)r=l.lastIndex,o=i[0].length,n=d[i[1]]?r:Im.findEndTag(f,c,r),c=c.substring(0,r-o)+c.substring(n),l.lastIndex=r-o;return ho(c)},Fm=Mm,Um=function(e,t,n,r){var o,i,a,u,s;return t.format=n,t.get=!0,t.getInner=!0,t.no_events||e.fire("BeforeGetContent",t),o="raw"===t.format?At.trim(Fm(e.serializer,r.innerHTML)):"text"===t.format?e.dom.isEmpty(r)?"":ho(r.innerText||r.textContent):"tree"===t.format?e.serializer.serialize(r,t):(a=(i=e).serializer.serialize(r,t),u=fc(i),s=new RegExp("^(<"+u+"[^>]*>( | |\\s|\xa0|
|)<\\/"+u+">[\r\n]*|
[\r\n]*)$"),a.replace(s,"")),M(["text","tree"],t.format)||lo(Tt.fromDom(r))?t.content=o:t.content=At.trim(o),t.no_events||e.fire("GetContent",t),t.content},zm=At.each,jm=function(o){return{compare:function(e,t){if(e.nodeName!==t.nodeName)return!1;var n=function(n){var r={};return zm(o.getAttribs(n),function(e){var t=e.nodeName.toLowerCase();0!==t.indexOf("_")&&"style"!==t&&0!==t.indexOf("data-")&&(r[t]=o.getAttrib(n,t))}),r},r=function(e,t){var n,r;for(r in e)if(e.hasOwnProperty(r)){if(void 0===(n=t[r]))return!1;if(e[r]!==n)return!1;delete t[r]}for(r in t)if(t.hasOwnProperty(r))return!1;return!0};return!!r(n(e),n(t))&&(!!r(o.parseStyle(o.getAttrib(e,"style")),o.parseStyle(o.getAttrib(t,"style")))&&(!Yl(e)&&!Yl(t)))}}},Hm=At.makeMap,Vm=function(e){var u=[],s=(e=e||{}).indent,c=Hm(e.indent_before||""),l=Hm(e.indent_after||""),f=fi.getEncodeFunc(e.entity_encoding||"raw",e.entities),d="html"===e.element_format;return{start:function(e,t,n){var r,o,i,a;if(s&&c[e]&&0":" />",n&&s&&l[e]&&0"),s&&l[e]&&0")},comment:function(e){u.push("\x3c!--",e,"--\x3e")},pi:function(e,t){t?u.push(""):u.push(""),s&&u.push("\n")},doctype:function(e){u.push("",s?"\n":"")},reset:function(){u.length=0},getContent:function(){return u.join("").replace(/\n$/,"")}}},qm=function(t,g){void 0===g&&(g=wi());var p=Vm(t);(t=t||{}).validate=!("validate"in t)||t.validate;return{serialize:function(e){var f=t.validate,d={3:function(e){p.text(e.value,e.raw)},8:function(e){p.comment(e.value)},7:function(e){p.pi(e.name,e.value)},10:function(e){p.doctype(e.value)},4:function(e){p.cdata(e.value)},11:function(e){if(e=e.firstChild)for(;m(e),e=e.next;);}};p.reset();var m=function(e){var t,n,r,o,i,a,u,s,c,l=d[e.type];if(l)l(e);else{if(t=e.name,n=e.shortEnded,r=e.attributes,f&&r&&1'))},pg=function(n){tn(n).each(function(t){Xt(t).each(function(e){no(n)&&oo(t)&&no(e)&&hn(t)})})},hg=function(e,t,n){return It(t,e)?function(e,t){for(var n=m(t)?t:A,r=e.dom,o=[];null!==r.parentNode&&r.parentNode!==undefined;){var i=r.parentNode,a=Tt.fromDom(i);if(o.push(a),!0===n(a))break;r=i}return o}(e,function(e){return n(e)||Pt(e,t)}).slice(0,-1):[]},vg=function(e,t){return hg(e,t,A)},yg=function(e,t){return[e].concat(vg(e,t))},bg=function(e,t,n){return Ol(e,t,n,tg)},Cg=function(e,t){return W(yg(Tt.fromDom(t.container()),e),no)},wg=function(e,n,r){return bg(e,n.dom,r).forall(function(t){return Cg(n,r).fold(function(){return!1===Zc(t,r,n.dom)},function(e){return!1===Zc(t,r,n.dom)&&It(e,Tt.fromDom(t.container()))})})},xg=function(t,n,r){return Cg(n,r).fold(function(){return bg(t,n.dom,r).forall(function(e){return!1===Zc(e,r,n.dom)})},function(e){return bg(t,e.dom,r).isNone()})},Sg=k(xg,!1),Ng=k(xg,!0),Eg=k(wg,!1),kg=k(wg,!0),_g=function(e){return sl(e).exists(oo)},Ag=function(e,t,n){var r=H(yg(Tt.fromDom(n.container()),t),no),o=re(r).getOr(t);return Tl(e,o.dom,n).filter(_g)},Rg=function(e,t){return sl(t).exists(oo)||Ag(!0,e,t).isSome()},Tg=function(e,t){return n=t,U.from(n.getNode(!0)).map(Tt.fromDom).exists(oo)||Ag(!1,e,t).isSome();var n},Dg=k(Ag,!1),Og=k(Ag,!0),Bg=function(e){return Ms.isTextPosition(e)&&!e.isAtStart()&&!e.isAtEnd()},Pg=function(e,t){var n=H(yg(Tt.fromDom(t.container()),e),no);return re(n).getOr(e)},Lg=function(e,t){return Bg(t)?eg(t):eg(t)||Ll(Pg(e,t).dom,t).exists(eg)},Ig=function(e,t){return Bg(t)?Zm(t):Zm(t)||Pl(Pg(e,t).dom,t).exists(Zm)},Mg=function(e){return sl(e).bind(function(e){return Or(e,zt)}).exists(function(e){return t=nr(e,"white-space"),M(["pre","pre-wrap"],t);var t})},Fg=function(e,t){return r=t,Ll(e.dom,r).isNone()||(n=t,Pl(e.dom,n).isNone())||Sg(e,t)||Ng(e,t)||Tg(e,t)||Rg(e,t);var n,r},Ug=function(e,t){return!Mg(t)&&(Sg(e,t)||Eg(e,t)||Tg(e,t)||Lg(e,t))},zg=function(e,t){return!Mg(t)&&(Ng(e,t)||kg(e,t)||Rg(e,t)||Ig(e,t))},jg=function(e,t){return Ug(e,t)||zg(e,(r=(n=t).container(),o=n.offset(),Fn(r)&&o=e.data.length&&zg(o,Ms(e,e.data.length)),u=0===t&&Ug(o,Ms(e,0)),e.replaceData(t,n,(c=u,l=a,$(s=i,function(e,t){return Jl(t)||Gl(t)?e.previousCharIsSpace||""===e.str&&c||e.str.length===s.length-1&&l?{previousCharIsSpace:!1,str:e.str+mo}:{previousCharIsSpace:!0,str:e.str+" "}:{previousCharIsSpace:!1,str:e.str+t}},{previousCharIsSpace:!1,str:""}).str)))},Xg=function(e,t){var n=e.data.slice(t),r=n.length-Ke(n).length;return Kg(e,t,r)},Yg=function(e,t){var n=e.data.slice(0,t),r=n.length-Xe(n).length;return Kg(e,t-r,r)},Gg=function(e,t,n,r){void 0===r&&(r=!0);var o=Xe(e.data).length,i=r?e:t,a=r?t:e;return r?i.appendData(a.data):i.insertData(0,a.data),hn(Tt.fromDom(a)),n&&Xg(i,o),i},Jg=function(e,t){return r=e,o=(n=t).container(),i=n.offset(),!1===Ms.isTextPosition(n)&&o===r.parentNode&&i>Ms.before(r).offset()?Ms(t.container(),t.offset()-1):t;var n,r,o,i},Qg=function(e){return Mo(e.previousSibling)?U.some((t=e.previousSibling,Fn(t)?Ms(t,t.data.length):Ms.after(t))):e.previousSibling?Ml(e.previousSibling):U.none();var t},Zg=function(e){return Mo(e.nextSibling)?U.some((t=e.nextSibling,Fn(t)?Ms(t,0):Ms.before(t))):e.nextSibling?Il(e.nextSibling):U.none();var t},ep=function(r,o){return Qg(o).orThunk(function(){return Zg(o)}).orThunk(function(){return e=r,t=o,n=Ms.before(t.previousSibling?t.previousSibling:t.parentNode),Ll(e,n).fold(function(){return Pl(e,Ms.after(t))},U.some);var e,t,n})},tp=function(n,r){return Zg(r).orThunk(function(){return Qg(r)}).orThunk(function(){return t=r,Pl(e=n,Ms.after(t)).fold(function(){return Ll(e,Ms.before(t))},U.some);var e,t})},np=function(e,t,n){return(e?tp:ep)(t,n).map(k(Jg,n))},rp=function(t,n,e){e.fold(function(){t.focus()},function(e){t.selection.setRng(e.toRange(),n)})},op=function(e,t){return t&&ve(e.schema.getBlockElements(),Mt(t))},ip=function(e){if(Ko(e)){var t=Tt.fromHtml('
');return pn(e),mn(e,t),U.some(Ms.before(t.dom))}return U.none()},ap=function(e,t,a){var n,r,o,i,u=Xt(e).filter(jt),s=Yt(e).filter(jt);return hn(e),r=s,o=t,i=function(e,t,n){var r=e.dom,o=t.dom,i=r.data.length;return Gg(r,o,a),n.container()===o?Ms(r,i):n},((n=u).isSome()&&r.isSome()&&o.isSome()?U.some(i(n.getOrDie(),r.getOrDie(),o.getOrDie())):U.none()).orThunk(function(){return a&&(u.each(function(e){return Yg(e.dom,e.dom.length)}),s.each(function(e){return Xg(e.dom,0)})),t})},up=function(t,n,e,r){void 0===r&&(r=!0);var o,i,a=np(n,t.getBody(),e.dom),u=Dr(e,k(op,t),(o=t.getBody(),function(e){return e.dom===o})),s=ap(e,a,(i=e,ve(t.schema.getTextInlineElements(),Mt(i))));t.dom.isEmpty(t.getBody())?(t.setContent(""),t.selection.setCursorLocation()):u.bind(ip).fold(function(){r&&rp(t,n,s)},function(e){r&&rp(t,n,U.some(e))})},sp=function(e,t){return{start:e,end:t}},cp=xr([{removeTable:["element"]},{emptyCells:["cells"]},{deleteCellSelection:["rng","cell"]}]),lp=function(e,t){return Ir(Tt.fromDom(e),"td,th",t)},fp=function(e,t){return Pr(e,"table",t)},dp=function(e){return!Pt(e.start,e.end)},mp=function(e,t){return fp(e.start,t).bind(function(r){return fp(e.end,t).bind(function(e){return t=Pt(r,e),n=r,t?U.some(n):U.none();var t,n})})},gp=function(e){return $u(e,"td,th")},pp=function(r,e){var t=lp(e.startContainer,r),n=lp(e.endContainer,r);return e.collapsed?U.none():us(t,n,sp).fold(function(){return t.fold(function(){return n.bind(function(t){return fp(t,r).bind(function(e){return re(gp(e)).map(function(e){return sp(e,t)})})})},function(t){return fp(t,r).bind(function(e){return oe(gp(e)).map(function(e){return sp(t,e)})})})},function(e){return hp(r,e)?U.none():(n=r,fp((t=e).start,n).bind(function(e){return oe(gp(e)).map(function(e){return sp(t.start,e)})}));var t,n})},hp=function(e,t){return mp(t,e).isSome()},vp=function(e,t,n){return e.filter(function(e){return dp(e)&&hp(n,e)}).orThunk(function(){return pp(n,t)}).bind(function(e){return mp(t=e,n).map(function(e){return{rng:t,table:e,cells:gp(e)}});var t})},yp=function(e,t){return G(e,function(e){return Pt(e,t)})},bp=function(e,r,o){return e.filter(function(e){return n=o,!dp(t=e)&&mp(t,n).exists(function(e){var t=e.dom.rows;return 1===t.length&&1===t[0].cells.length})&&zf(e.start,r);var t,n}).map(function(e){return e.start})},Cp=function(n){return us(yp((r=n).cells,r.rng.start),yp(r.cells,r.rng.end),function(e,t){return r.cells.slice(e,t+1)}).map(function(e){var t=n.cells;return e.length===t.length?cp.removeTable(n.table):cp.emptyCells(e)});var r},wp=function(e,t){var n,r,o,i,a,u=(n=e,function(e){return Pt(n,e)}),s=(o=u,i=lp((r=t).startContainer,o),a=lp(r.endContainer,o),us(i,a,sp));return bp(s,t,u).map(function(e){return cp.deleteCellSelection(t,e)}).orThunk(function(){return vp(s,t,u).bind(Cp)})},xp=function(e){var t;return(8===Ft(t=e)||"#comment"===Mt(t)?Xt:tn)(e).bind(xp).orThunk(function(){return U.some(e)})},Sp=function(e,t){return Y(t,gg),e.selection.setCursorLocation(t[0].dom,0),!0},Np=function(e,t,n){t.deleteContents();var r,o,i=xp(n).getOr(n),a=Tt.fromDom(e.dom.getParent(i.dom,e.dom.isBlock));return Ko(a)&&(gg(a),e.selection.setCursorLocation(a.dom,0)),Pt(n,a)||(r=Kt(a).is(n)?[]:Kt(o=a).map(Qt).map(function(e){return H(e,function(e){return!Pt(o,e)})}).getOr([]),Y(r.concat(Qt(n)),function(e){Pt(e,a)||It(e,a)||hn(e)})),!0},Ep=function(e,t){return up(e,!1,t),!0},kp=function(n,e,r,t){return Ap(e,t).fold(function(){return t=n,wp(e,r).map(function(e){return e.fold(k(Ep,t),k(Sp,t),k(Np,t))});var t},function(e){return Rp(n,e)}).getOr(!1)},_p=function(e,t){return W(yg(t,e),co)},Ap=function(e,t){return W(yg(t,e),function(e){return"caption"===Mt(e)})},Rp=function(e,t){return gg(t),e.selection.setCursorLocation(t.dom,0),U.some(!0)},Tp=function(u,s,c,l,f){return Dl(c,u.getBody(),f).bind(function(e){return o=c,i=f,a=e,Il((r=l).dom).bind(function(t){return Ml(r.dom).map(function(e){return o?i.isEqual(t)&&a.isEqual(e):i.isEqual(e)&&a.isEqual(t)})}).getOr(!0)?Rp(u,l):(t=l,n=e,Ap(s,Tt.fromDom(n.getNode())).map(function(e){return!1===Pt(e,t)}));var t,n,r,o,i,a}).or(U.some(!0))},Dp=function(o,i,a,e){var u=Ms.fromRangeStart(o.selection.getRng());return _p(a,e).bind(function(e){return Ko(e)?Rp(o,e):(t=a,n=e,r=u,Dl(i,o.getBody(),r).bind(function(e){return _p(t,Tt.fromDom(e.getNode())).map(function(e){return!1===Pt(e,n)})}));var t,n,r}).getOr(!1)},Op=function(e,t){return(e?cg:lg)(t)},Bp=function(a,u,r){var s=Tt.fromDom(a.getBody());return Ap(s,r).fold(function(){return Dp(a,u,s,r)||(e=a,t=u,n=Ms.fromRangeStart(e.selection.getRng()),Op(t,n)||Tl(t,e.getBody(),n).exists(function(e){return Op(t,e)}));var e,t,n},function(e){return t=a,n=u,r=s,o=e,i=Ms.fromRangeStart(t.selection.getRng()),(Ko(o)?Rp(t,o):Tp(t,r,n,o,i)).getOr(!1);var t,n,r,o,i})},Pp=function(e,t){var n,r,o,i,a,u=Tt.fromDom(e.selection.getStart(!0)),s=Mf(e);return e.selection.isCollapsed()&&0===s.length?Bp(e,t,u):(n=e,r=u,o=Tt.fromDom(n.getBody()),i=n.selection.getRng(),0!==(a=Mf(n)).length?Sp(n,a):kp(n,o,i,r))},Lp=function(a){var u=Ms.fromRangeStart(a),s=Ms.fromRangeEnd(a),c=a.commonAncestorContainer;return Tl(!1,c,s).map(function(e){return!Zc(u,s,c)&&Zc(u,e,c)?(t=u.container(),n=u.offset(),r=e.container(),o=e.offset(),(i=document.createRange()).setStart(t,n),i.setEnd(r,o),i):a;var t,n,r,o,i}).getOr(a)},Ip=function(e){return e.collapsed?e:Lp(e)},Mp=function(e,t){var n,r;return e.getBlockElements()[t.name]&&((r=t).firstChild&&r.firstChild===r.lastChild)&&("br"===(n=t.firstChild).name||n.value===mo)},Fp=function(e,t){var n,r,o,i=t.firstChild,a=t.lastChild;return i&&"meta"===i.name&&(i=i.next),a&&"mce_marker"===a.attr("id")&&(a=a.prev),r=a,o=(n=e).getNonEmptyElements(),r&&(r.isEmpty(o)||Mp(n,r))&&(a=a.prev),!(!i||i!==a)&&("ul"===i.name||"ol"===i.name)},Up=function(e){return e&&e.firstChild&&e.firstChild===e.lastChild&&((t=e.firstChild).data===mo||Hn(t));var t},zp=function(e){return 0)?$/," "):l.replace(/ ()?$/," "));var g=e.parser,p=n.merge,h=qm({validate:e.getParam("validate")},e.schema),v='',y={content:t,format:"html",selection:!0,paste:n.paste};if((y=e.fire("BeforeSetContent",y)).isDefaultPrevented())e.fire("SetContent",{content:y.content,format:"html",selection:!0,paste:n.paste});else{-1===(t=y.content).indexOf("{$caret}")&&(t+="{$caret}"),t=t.replace(/\{\$caret\}/,v);var b,C,w=(a=d.getRng()).startContainer||(a.parentElement?a.parentElement():null),x=e.getBody();w===x&&d.isCollapsed()&&m.isBlock(x.firstChild)&&(b=e,(C=x.firstChild)&&!b.schema.getShortEndedElements()[C.nodeName])&&m.isEmpty(x.firstChild)&&((a=m.createRng()).setStart(x.firstChild,0),a.setEnd(x.firstChild,0),d.setRng(a)),d.isCollapsed()||Wp(e);var S,N,E,k,_,A,R,T,D,O,B,P,L,I,M={context:(r=d.getNode()).nodeName.toLowerCase(),data:n.data,insert:!0},F=g.parse(t,M);if(!0===n.paste&&Fp(e.schema,F)&&jp(m,r))return a=qp(h,m,d.getRng(),F),d.setRng(a),void e.fire("SetContent",y);if(!function(e){for(var t=e;t=t.walk();)1===t.type&&t.attr("data-mce-fragment","1")}(F),"mce_marker"===(u=F.lastChild).attr("id"))for(u=(i=u).prev;u;u=u.walk(!0))if(3===u.type||!m.isBlock(u.name)){e.schema.isValidChild(u.parent.name,"span")&&u.parent.insert(i,u,"br"===u.name);break}if(e._selectionOverrides.showBlockCaretContainer(r),M.invalid){for(e.selection.setContent(v),r=d.getNode(),o=e.getBody(),9===r.nodeType?r=u=o:u=r;u!==o;)u=(r=u).parentNode;t=r===o?o.innerHTML:m.getOuterHTML(r),t=h.serialize(g.parse(t.replace(//i,function(){return h.serialize(F)}))),r===o?m.setHTML(o,t):m.setOuterHTML(r,t)}else t=h.serialize(F),S=e,N=t,"all"===(E=r).getAttribute("data-mce-bogus")?E.parentNode.insertBefore(S.dom.createFragment(N),E):(k=E.firstChild,_=E.lastChild,!k||k===_&&"BR"===k.nodeName?S.dom.setHTML(E,N):S.selection.setContent(N));R=p,O=(A=e).schema.getTextInlineElements(),B=A.dom,R&&(T=A.getBody(),D=jm(B),At.each(B.select("*[data-mce-fragment]"),function(e){if(V(O[e.nodeName.toLowerCase()])&&Gm(B,e))for(var t=e.parentNode;V(t)&&t!==T;t=t.parentNode){if(Jm(B,e,t))break;if(D.compare(t,e)){B.remove(e,!0);break}}})),function(n,e){var t,r,o=n.dom,i=n.selection;if(e){i.scrollIntoView(e);var a=function(e){for(var t=n.getBody();e&&e!==t;e=e.parentNode)if("false"===o.getContentEditable(e))return e;return null}(e);if(a)return o.remove(e),i.select(a);var u=o.createRng(),s=e.previousSibling;s&&3===s.nodeType?(u.setStart(s,s.nodeValue.length),St.ie||(r=e.nextSibling)&&3===r.nodeType&&(s.appendData(r.data),r.parentNode.removeChild(r))):(u.setStartBefore(e),u.setEndBefore(e));var c=o.getParent(e,o.isBlock);o.remove(e),c&&o.isEmpty(c)&&(n.$(c).empty(),u.setStart(c,0),u.setEnd(c,0),$p(c)||c.getAttribute("data-mce-fragment")||!(t=function(e){var t=Ms.fromRangeStart(e);if(t=El(n.getBody()).next(t))return t.toRange()}(u))?o.add(c,o.create("br",{"data-mce-bogus":"1"})):(u=t,o.remove(c))),i.setRng(u)}}(e,m.get("mce_marker")),P=e.getBody(),At.each(P.getElementsByTagName("*"),function(e){e.removeAttribute("data-mce-fragment")}),L=m,I=d.getStart(),U.from(L.getParent(I,"td,th")).map(Tt.fromDom).each(pg),e.fire("SetContent",y),e.addVisual()}},Xp=function(e,t){t(e),e.firstChild&&Xp(e.firstChild,t),e.next&&Xp(e.next,t)},Yp=function(e,t,n){var r=function(e,n,t){var r={},o={},i=[];for(var a in t.firstChild&&Xp(t.firstChild,function(t){Y(e,function(e){e.name===t.name&&(r[e.name]?r[e.name].nodes.push(t):r[e.name]={filter:e,nodes:[t]})}),Y(n,function(e){"string"==typeof t.attr(e.name)&&(o[e.name]?o[e.name].nodes.push(t):o[e.name]={filter:e,nodes:[t]})})}),r)r.hasOwnProperty(a)&&i.push(r[a]);for(var u in o)o.hasOwnProperty(u)&&i.push(o[u]);return i}(e,t,n);Y(r,function(t){Y(t.filter.callbacks,function(e){e(t.nodes,t.filter.name,{})})})},Gp=function(e){return e instanceof Tm},Jp=function(e,t){var r;e.dom.setHTML(e.getBody(),t),bm(r=e)&&Il(r.getBody()).each(function(e){var t=e.getNode(),n=Ln(t)?Il(t).getOr(e):e;r.selection.setRng(n.toRange())})},Qp=function(u,s,c){return c.format=c.format?c.format:"html",c.set=!0,c.content=Gp(s)?"":s,c.no_events||u.fire("BeforeSetContent",c),Gp(s)||(s=c.content),U.from(u.getBody()).fold(E(s),function(e){return Gp(s)?function(e,t,n,r){Yp(e.parser.getNodeFilters(),e.parser.getAttributeFilters(),n);var o=qm({validate:e.validate},e.schema).serialize(n);return r.content=lo(Tt.fromDom(t))?o:At.trim(o),Jp(e,r.content),r.no_events||e.fire("SetContent",r),n}(u,e,s,c):(t=u,n=e,o=c,0===(r=s).length||/^\s+$/.test(r)?(a='
',"TABLE"===n.nodeName?r=""+a+"":/^(UL|OL)$/.test(n.nodeName)&&(r="
  • "+a+"
  • "),r=(i=fc(t))&&t.schema.isValidChild(n.nodeName.toLowerCase(),i.toLowerCase())?(r=a,t.dom.createHTML(i,dc(t),r)):r||'
    ',Jp(t,r),t.fire("SetContent",o)):("raw"!==o.format&&(r=qm({validate:t.validate},t.schema).serialize(t.parser.parse(r,{isRootContent:!0,insert:!0}))),o.content=lo(Tt.fromDom(n))?r:At.trim(r),Jp(t,o.content),o.no_events||t.fire("SetContent",o)),o.content);var t,n,r,o,i,a})},Zp=function(e,t){return r=t,((o=(n=e).dom).parentNode?Br(Tt.fromDom(o.parentNode),function(e){return!Pt(n,e)&&r(e)}):U.none()).isSome();var n,r,o},eh=function(e){return m(e)?e:A},th=function(e,t,n){var r=t(e),o=eh(n);return r.orThunk(function(){return o(e)?U.none():function(e,t,n){for(var r=e.dom,o=eh(n);r.parentNode;){r=r.parentNode;var i=Tt.fromDom(r),a=t(i);if(a.isSome())return a;if(o(i))break}return U.none()}(e,t,o)})},nh=uf,rh=function(e,t,n){var r=e.formatter.get(n);if(r)for(var o=0;o
    ").append(n.childNodes)}))},Sh[Wm="pre"]||(Sh[Wm]=[]),Sh[Wm].push(Km);var kh=At.each,_h=function(e){return Tn(e)&&!Yl(e)&&!Ul(e)&&!Pn(e)},Ah=function(e,t){for(var n=e;n;n=n[t]){if(Fn(n)&&0!==n.nodeValue.length)return e;if(Tn(n)&&!Yl(n))return n}return e},Rh=function(e,t,n){var r,o,i=jm(e);if(t&&n&&(t=Ah(t,"previousSibling"),n=Ah(n,"nextSibling"),i.compare(t,n))){for(r=t.nextSibling;r&&r!==n;)r=(o=r).nextSibling,t.appendChild(o);return e.remove(n),At.each(At.grep(n.childNodes),function(e){t.appendChild(e)}),t}return n},Th=function(e,t,n,r){var o;r&&!1!==t.merge_siblings&&(o=Rh(e,tf(r),r),Rh(e,o,tf(o,!0)))},Dh=function(e,t,n){kh(e.childNodes,function(e){_h(e)&&(t(e)&&n(e),e.hasChildNodes()&&Dh(e,t,n))})},Oh=function(t,n){return function(e){return!(!e||!cf(t,e,n))}},Bh=function(r,o,i){return function(e){var t,n;r.setStyle(e,o,i),""===e.getAttribute("style")&&e.removeAttribute("style"),t=r,"SPAN"===(n=e).nodeName&&0===t.getAttribs(n).length&&t.remove(n,!0)}},Ph=xr([{keep:[]},{rename:["name"]},{removed:[]}]),Lh=/^(src|href|style)$/,Ih=At.each,Mh=uf,Fh=function(e,t,n){return e.isChildOf(t,n)&&t!==n&&!e.isBlock(n)},Uh=function(e,t,n){var r,o=t[n?"startContainer":"endContainer"],i=t[n?"startOffset":"endOffset"];return Tn(o)&&(r=o.childNodes.length-1,!n&&i&&i--,o=o.childNodes[r=o.nodeValue.length&&(o=new Gr(o,e.getBody()).next()||o),Fn(o)&&!n&&0===i&&(o=new Gr(o,e.getBody()).prev()||o),o},zh=function(e,t){var n=t?"firstChild":"lastChild";if(/^(TR|TH|TD)$/.test(e.nodeName)&&e[n]){var r=e[n];return"TR"===e.nodeName&&r[n]||r}return e},jh=function(e,t,n,r){var o=e.create(n,r);return t.parentNode.insertBefore(o,t),o.appendChild(t),o},Hh=function(e,t,n,r,o){var i=Tt.fromDom(t),a=Tt.fromDom(e.create(r,o)),u=(n?Jt:Gt)(i);return gn(a,u),n?(ln(i,a),dn(a,i)):(fn(i,a),mn(a,i)),a.dom},Vh=function(e,t,n,r){return!(t=tf(t,n,r))||"BR"===t.nodeName||e.isBlock(t)},qh=function(e,r,o,t,i){var n,a,u,s,c,l=e.dom;if(u=l,!(Mh(s=t,(c=r).inline)||Mh(s,c.block)||c.selector&&(Tn(s)&&u.is(s,c.selector))||(a=t,r.links&&"A"===a.nodeName)))return Ph.keep();var f,d,m,g,p,h,v,y=t;if(r.inline&&"all"===r.remove&&S(r.preserve_attributes)){var b=H(l.getAttribs(y),function(e){return M(r.preserve_attributes,e.name.toLowerCase())});if(l.removeAllAttribs(y),Y(b,function(e){return l.setAttrib(y,e.name,e.value)}),0e?t.cells.length:e},0)},uv=function(e,t){for(var n=e.rows,r=0;r")?{type:"fragmented",fragments:r,content:"",bookmark:null,beforeBookmark:null}:{type:"complete",fragments:null,content:o,bookmark:null,beforeBookmark:null}},Av=function(e,t,n){"fragmented"===t.type?Ev(t.fragments,e.getBody()):e.setContent(t.content,{format:"raw"}),e.selection.moveToBookmark(n?t.beforeBookmark:t.bookmark)},Rv=function(e){return"fragmented"===e.type?e.fragments.join(""):e.content},Tv=function(e){var t=Tt.fromTag("body",kv.get().getOrThunk(function(){var e=document.implementation.createHTMLDocument("undo");return kv.set(U.some(e)),e}));return ts(t,Rv(e)),Y($u(t,"*[data-mce-bogus]"),vn),t.dom.innerHTML},Dv=function(e,t){return!(!e||!t)&&(r=t,Rv(e)===Rv(r)||(n=t,Tv(e)===Tv(n)));var n,r},Ov=function(e){return 0===e.get()},Bv=function(e,t,n){Ov(n)&&(e.typing=t)},Pv=function(e,t){e.typing&&(Bv(e,!1,t),e.add())},Lv=function(f){return{undoManager:{beforeChange:function(e,t){return n=f,r=t,void(Ov(e)&&r.set(U.some(uc(n.selection))));var n,r},addUndoLevel:function(e,t,n,r,o,i){return function(e,t,n,r,o,i,a){var u=_v(e);if(i=i||{},i=At.extend(i,u),!1===Ov(r)||e.removed)return null;var s=t.data[n.get()];if(e.fire("BeforeAddUndo",{level:i,lastLevel:s,originalEvent:a}).isDefaultPrevented())return null;if(s&&Dv(s,i))return null;t.data[n.get()]&&o.get().each(function(e){t.data[n.get()].beforeBookmark=e});var c=e.getParam("custom_undo_redo_levels",0,"number");if(c&&t.data.length>c){for(var l=0;lt.clientHeight){e=t;break}t=t.parentNode}return e},scrollIntoView:function(e,t){return r=e,o=t,void((n=c).inline?Ud:jd)(n,r,o);var n,r,o},placeCaretAt:function(e,t){return p(ad(e,t,c.getDoc()))},getBoundingClientRect:function(){var e=g();return e.collapsed?Ms.fromRangeStart(e).getClientRects()[0]:e.getBoundingClientRect()},destroy:function(){s=l=f=null,b.destroy()}},y=Qf(v),b=od(v,c);return v.bookmarkManager=y,v.controlSelection=b,v},Gv=function(e,a,u){e.addNodeFilter("font",function(e){Y(e,function(e){var t,n=a.parse(e.attr("style")),r=e.attr("color"),o=e.attr("face"),i=e.attr("size");r&&(n.color=r),o&&(n["font-family"]=o),i&&(n["font-size"]=u[parseInt(e.attr("size"),10)-1]),e.name="span",e.attr("style",a.serialize(n)),t=e,Y(["color","face","size"],function(e){t.attr(e,null)})})})},Jv=function(e,t){var n,r=Si();t.convert_fonts_to_spans&&Gv(e,r,At.explode(t.font_size_legacy_values)),n=r,e.addNodeFilter("strike",function(e){Y(e,function(e){var t=n.parse(e.attr("style"));t["text-decoration"]="line-through",e.name="span",e.attr("style",n.serialize(t))})})},Qv=function(e){var t,n=decodeURIComponent(e).split(","),r=/data:([^;]+)/.exec(n[0]);return r&&(t=r[1]),{type:t,data:n[1]}},Zv=function(e,t){var n;try{n=atob(t)}catch(zk){return U.none()}for(var r=new Uint8Array(n.length),o=0;o)/g,"\n").replace(/^[\r\n]*|[\r\n]*$/g,"").replace(/^\s*(()?|\s*\/\/\s*\]\]>(-->)?|\/\/\s*(-->)?|\]\]>|\/\*\s*-->\s*\*\/|\s*-->\s*)\s*$/g,"")};i--;)r=(n=e[i]).firstChild?n.firstChild.value:"","script"===t?((o=n.attr("type"))&&n.attr("type","mce-no/type"===o?null:o.replace(/^mce\-/,"")),"xhtml"===s.element_format&&0")):"xhtml"===s.element_format&&0",visual:!0,font_size_legacy_values:"xx-small,small,medium,large,x-large,xx-large,300%",forced_root_block:"p",hidden_input:!0,inline_styles:!0,convert_fonts_to_spans:!0,indent:!0,indent_before:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,summary,article,hgroup,aside,figure,figcaption,option,optgroup,datalist",indent_after:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,summary,article,hgroup,aside,figure,figcaption,option,optgroup,datalist",entity_encoding:"named",url_converter:u.convertURL,url_converter_scope:u},_e(_e({},s),a?By:{}));return zy(Ty||Dy,Ty,c,r,o)},Hy=function(e,t,n){return U.from(t.settings[n]).filter(e)},Vy=function(e,t,n,r){var o,i,a,u=t in e.settings?e.settings[t]:n;return"hash"===r?(a={},"string"==typeof(i=u)?Y(0)\s*/g,"$1"),At.map(c.split(/(?:>|\s+(?![^\[\]]+\]))/),function(e){var t=At.map(e.split(/(?:~\+|~|\+)/),Eb),n=t.pop();return t.length&&(n.siblings=t),n}).reverse()):[],f=l.length?(l[0].name||(l[0].name=t),t=e.selector,Nb(l,n)):Nb([t],n),d=Sb.select(t,f)[0]||f.firstChild;return xb(e.styles,function(e,t){var n=u(e);n&&Sb.setStyle(d,t,n)}),xb(e.attributes,function(e,t){var n=u(e);n&&Sb.setAttrib(d,t,n)}),xb(e.classes,function(e){var t=u(e);Sb.hasClass(d,t)||Sb.addClass(d,t)}),n.fire("PreviewFormats"),Sb.setStyles(f,{position:"absolute",left:-65535}),n.getBody().appendChild(f),r=Sb.getStyle(n.getBody(),"fontSize",!0),r=/px$/.test(r)?parseInt(r,10):0,xb(a.split(" "),function(e){var t=Sb.getStyle(d,e,!0);if(!("background-color"===e&&/transparent|rgba\s*\([^)]+,\s*0\)/.test(t)&&(t=Sb.getStyle(n.getBody(),e,!0),"#ffffff"===Sb.toHex(t).toLowerCase())||"color"===e&&"#000000"===Sb.toHex(t).toLowerCase())){if("font-size"===e&&/em|%$/.test(t)){if(0===r)return;t=parseFloat(t)/(/%$/.test(t)?100:1)*r+"px"}"border"===e&&t&&(i+="padding:0 2px;"),i+=e+":"+t+";"}}),n.fire("AfterPreviewFormats"),Sb.remove(f),i},_b=function(s){var e=wb(s),u=Ru(null);return function(e){e.addShortcut("meta+b","","Bold"),e.addShortcut("meta+i","","Italic"),e.addShortcut("meta+u","","Underline");for(var t=1;t<=6;t++)e.addShortcut("access+"+t,"",["FormatBlock",!1,"h"+t]);e.addShortcut("access+7","",["FormatBlock",!1,"p"]),e.addShortcut("access+8","",["FormatBlock",!1,"div"]),e.addShortcut("access+9","",["FormatBlock",!1,"address"])}(s),wh(s),{get:e.get,has:e.has,register:e.register,unregister:e.unregister,apply:function(e,t,n){var r,o,i;r=e,o=t,i=n,Uv(s).formatter.apply(r,o,i)},remove:function(e,t,n,r){var o,i,a,u;o=e,i=t,a=n,u=r,Uv(s).formatter.remove(o,i,a,u)},toggle:function(e,t,n){var r,o,i;r=e,o=t,i=n,Uv(s).formatter.toggle(r,o,i)},match:function(e,t,n){return r=e,o=t,i=n,Uv(s).formatter.match(r,o,i);var r,o,i},closest:function(e){return t=e,Uv(s).formatter.closest(t);var t},matchAll:function(e,t){return n=e,r=t,Uv(s).formatter.matchAll(n,r);var n,r},matchNode:function(e,t,n,r){return o=e,i=t,a=n,u=r,Uv(s).formatter.matchNode(o,i,a,u);var o,i,a,u},canApply:function(e){return t=e,Uv(s).formatter.canApply(t);var t},formatChanged:function(e,t,n){return r=u,o=e,i=t,void 0===(a=n)&&(a=!1),Uv(s).formatter.formatChanged(r,o,i,a);var r,o,i,a},getCssText:k(kb,s)}},Ab=function(n,r,o){var i=Ru(!1),a=function(e){Bv(r,!1,o),r.add({},e)};n.on("init",function(){r.add()}),n.on("BeforeExecCommand",function(e){var t=e.command.toLowerCase();"undo"!==t&&"redo"!==t&&"mcerepaint"!==t&&(Pv(r,o),r.beforeChange())}),n.on("ExecCommand",function(e){var t=e.command.toLowerCase();"undo"!==t&&"redo"!==t&&"mcerepaint"!==t&&a(e)}),n.on("ObjectResizeStart cut",function(){r.beforeChange()}),n.on("SaveContent ObjectResized blur",a),n.on("dragend",a),n.on("keyup",function(e){var t=e.keyCode;e.isDefaultPrevented()||((33<=t&&t<=36||37<=t&&t<=40||45===t||e.ctrlKey)&&(a(),n.nodeChanged()),46!==t&&8!==t||n.nodeChanged(),i.get()&&r.typing&&!1===Dv(_v(n),r.data[0])&&(!1===n.isDirty()&&(n.setDirty(!0),n.fire("change",{level:r.data[0],lastLevel:null})),n.fire("TypingUndo"),i.set(!1),n.nodeChanged()))}),n.on("keydown",function(e){var t,n=e.keyCode;e.isDefaultPrevented()||(33<=n&&n<=36||37<=n&&n<=40||45===n?r.typing&&a(e):(t=e.ctrlKey&&!e.altKey||e.metaKey,!(n<16||20t;var t}},Cw=function(n){return function(e){return t=n,e.line===t;var t}},ww=$n,xw=Jc,Sw=function(e,t){return Math.abs(e.left-t)},Nw=function(e,t){return Math.abs(e.right-t)},Ew=function(e,t){return e>=t.left&&e<=t.right},kw=function(e,t){return e>=t.top&&e<=t.bottom},_w=function(e,o){return Ne(e,function(e,t){var n=Math.min(Sw(e,o),Nw(e,o)),r=Math.min(Sw(t,o),Nw(t,o));return Ew(o,t)||!Ew(o,e)&&(r===n&&ww(t.node)||r'),u=o,1===t?e.$(s).after(u):e.$(s).before(u),e.selection.select(u,!0),e.selection.collapse())}},bx=function(e,t){var n=t?Fs.Forwards:Fs.Backwards,r=e.selection.getRng();return Ow(e,n,r,fg,dg,vx).orThunk(function(){return yx(e,n,r),U.none()})},Cx=function(e,t){var n=t?1:-1,r=e.selection.getRng();return Bw(e,n,r,function(e){return fg(e)||cg(e)},function(e){return dg(e)||lg(e)},vx).orThunk(function(){return yx(e,n,r),U.none()})},wx=function(t,e){return bx(t,e).exists(function(e){return Tw(t,e),!0})},xx=function(t,e){return Cx(t,e).exists(function(e){return Tw(t,e),!0})},Sx=function(e,t){return Lw(e,t,t?dg:fg)},Nx=function(e){return M(["figcaption"],Mt(e))},Ex=function(e){var t=document.createRange();return t.setStartBefore(e.dom),t.setEndBefore(e.dom),t},kx=function(e,t,n){(n?mn:dn)(e,t)},_x=function(e,t,n,r){return""===t?(l=e,f=r,d=Tt.fromTag("br"),kx(l,d,f),Ex(d)):(o=e,i=r,a=t,u=n,s=Tt.fromTag(a),c=Tt.fromTag("br"),Jn(s,u),mn(s,c),kx(o,s,i),Ex(c));var o,i,a,u,s,c,l,f,d},Ax=function(e,t,n){return t?(o=e.dom,fw(o,n).breakAt.isNone()):(r=e.dom,lw(r,n).breakAt.isNone());var r,o},Rx=function(t,n){var e,r,o=Tt.fromDom(t.getBody()),i=Ms.fromRangeStart(t.selection.getRng()),a=fc(t),u=dc(t);return e=i,r=k(Pt,o),Or(Tt.fromDom(e.container()),no,r).filter(Nx).exists(function(){if(Ax(o,n,i)){var e=_x(o,a,u,n);return t.selection.setRng(e),!0}return!1})},Tx=function(e,t){return!!e.selection.isCollapsed()&&Rx(e,t)},Dx=function(e,r){return J(z(e,function(e){return _e({shiftKey:!1,altKey:!1,ctrlKey:!1,metaKey:!1,keyCode:0,action:te},e)}),function(e){return t=e,(n=r).keyCode===t.keyCode&&n.shiftKey===t.shiftKey&&n.altKey===t.altKey&&n.ctrlKey===t.ctrlKey&&n.metaKey===t.metaKey?[e]:[];var t,n})},Ox=function(e){for(var t=[],n=1;nt}),jx=function(t,n){return re(n.getClientRects()).bind(function(e){return Ux(t,e.left,e.top)}).bind(function(e){return cw(Ml(t=e).map(function(e){return lw(t,e).positions.concat(e)}).getOr([]),n);var t})},Hx=function(t,n){return oe(n.getClientRects()).bind(function(e){return zx(t,e.left,e.top)}).bind(function(e){return cw(Il(t=e).map(function(e){return[e].concat(fw(t,e).positions)}).getOr([]),n);var t})},Vx=function(e,t,n){var r,o,i,a,u=e(t,n);return(a=u).breakType===nb.Wrap&&0===a.positions.length||!Hn(n.getNode())&&((i=u).breakType===nb.Br&&1===i.positions.length)?(r=e,o=t,!u.breakAt.exists(function(e){return r(o,e).breakAt.isSome()})):u.breakAt.isNone()},qx=k(Vx,lw),$x=k(Vx,fw),Wx=function(t,e,n,r){var o,i,a,u,s=t.selection.getRng(),c=e?1:-1;return!(!zc()||(o=e,i=s,a=n,u=Ms.fromRangeStart(i),!Bl(!o,a).exists(function(e){return e.isEqual(u)})))&&(sC(c,t,n,!e,!1).each(function(e){Tw(t,e)}),!0)},Kx=function(e,t){var n=t.getNode(e);return Tn(n)&&"TABLE"===n.nodeName?U.some(n):U.none()},Xx=function(u,s,c){var e=Kx(!!s,c),t=!1===s;e.fold(function(){return Tw(u,c.toRange())},function(a){return Bl(t,u.getBody()).filter(function(e){return e.isEqual(c)}).fold(function(){return Tw(u,c.toRange())},function(e){return n=s,o=a,t=c,void((i=fc(r=u))?r.undoManager.transact(function(){var e=Tt.fromTag(i);Jn(e,dc(r)),mn(e,Tt.fromTag("br")),(n?fn:ln)(Tt.fromDom(o),e);var t=r.dom.createRng();t.setStart(e.dom,0),t.setEnd(e.dom,0),Tw(r,t)}):Tw(r,t.toRange()));var n,r,o,t,i})})},Yx=function(e,t,n,r){var o,i,a,u,s,c,l=e.selection.getRng(),f=Ms.fromRangeStart(l),d=e.getBody();if(!t&&qx(r,f)){var m=(u=d,jx(s=n,c=f).orThunk(function(){return re(c.getClientRects()).bind(function(e){return sw(dw(u,Ms.before(s)),e.left)})}).getOr(Ms.before(s)));return Xx(e,t,m),!0}if(t&&$x(r,f)){m=(o=d,Hx(i=n,a=f).orThunk(function(){return re(a.getClientRects()).bind(function(e){return sw(mw(o,Ms.after(i)),e.left)})}).getOr(Ms.after(i)));return Xx(e,t,m),!0}return!1},Gx=function(n,r,o){return U.from(n.dom.getParent(n.selection.getNode(),"td,th")).bind(function(t){return U.from(n.dom.getParent(t,"table")).map(function(e){return o(n,r,e,t)})}).getOr(!1)},Jx=function(e,t){return Gx(e,t,Wx)},Qx=function(e,t){return Gx(e,t,Yx)},Zx=function(i,a){i.on("keydown",function(e){var t,n,r,o;!1===e.isDefaultPrevented()&&(t=i,n=a,r=e,o=gt().os,Bx([{keyCode:nd.RIGHT,action:Ox(wx,t,!0)},{keyCode:nd.LEFT,action:Ox(wx,t,!1)},{keyCode:nd.UP,action:Ox(xx,t,!1)},{keyCode:nd.DOWN,action:Ox(xx,t,!0)},{keyCode:nd.RIGHT,action:Ox(Jx,t,!0)},{keyCode:nd.LEFT,action:Ox(Jx,t,!1)},{keyCode:nd.UP,action:Ox(Qx,t,!1)},{keyCode:nd.DOWN,action:Ox(Qx,t,!0)},{keyCode:nd.RIGHT,action:Ox(Px,t,!0)},{keyCode:nd.LEFT,action:Ox(Px,t,!1)},{keyCode:nd.UP,action:Ox(Lx,t,!1)},{keyCode:nd.DOWN,action:Ox(Lx,t,!0)},{keyCode:nd.RIGHT,action:Ox(zw,t,n,!0)},{keyCode:nd.LEFT,action:Ox(zw,t,n,!1)},{keyCode:nd.RIGHT,ctrlKey:!o.isOSX(),altKey:o.isOSX(),action:Ox(Vw,t,n)},{keyCode:nd.LEFT,ctrlKey:!o.isOSX(),altKey:o.isOSX(),action:Ox(qw,t,n)},{keyCode:nd.UP,action:Ox(Tx,t,!1)},{keyCode:nd.DOWN,action:Ox(Tx,t,!0)}],r).each(function(e){r.preventDefault()}))})},eS=function(o,i){o.on("keydown",function(e){var t,n,r;!1===e.isDefaultPrevented()&&(t=o,n=i,r=e,Bx([{keyCode:nd.BACKSPACE,action:Ox(sx,t,!1)},{keyCode:nd.BACKSPACE,action:Ox(NC,t,!1)},{keyCode:nd.DELETE,action:Ox(NC,t,!0)},{keyCode:nd.BACKSPACE,action:Ox(pC,t,!1)},{keyCode:nd.DELETE,action:Ox(pC,t,!0)},{keyCode:nd.BACKSPACE,action:Ox(Yw,t,n,!1)},{keyCode:nd.DELETE,action:Ox(Yw,t,n,!0)},{keyCode:nd.BACKSPACE,action:Ox(Pp,t,!1)},{keyCode:nd.DELETE,action:Ox(Pp,t,!0)},{keyCode:nd.BACKSPACE,action:Ox(EC,t,!1)},{keyCode:nd.DELETE,action:Ox(EC,t,!0)},{keyCode:nd.BACKSPACE,action:Ox(tx,t,!1)},{keyCode:nd.DELETE,action:Ox(tx,t,!0)},{keyCode:nd.BACKSPACE,action:Ox(iC,t,!1)},{keyCode:nd.DELETE,action:Ox(iC,t,!0)},{keyCode:nd.BACKSPACE,action:Ox(tC,t,!1)},{keyCode:nd.DELETE,action:Ox(tC,t,!0)},{keyCode:nd.BACKSPACE,action:Ox(Zw,t,!1)},{keyCode:nd.DELETE,action:Ox(Zw,t,!0)}],r).each(function(e){r.preventDefault()}))}),o.on("keyup",function(e){var t,n;!1===e.isDefaultPrevented()&&(t=o,n=e,Bx([{keyCode:nd.BACKSPACE,action:Ox(SC,t)},{keyCode:nd.DELETE,action:Ox(SC,t)}],n))})},tS=function(e,t){var n,r,o=t,i=e.dom,a=e.schema.getMoveCaretBeforeOnEnterElements();if(t){!/^(LI|DT|DD)$/.test(t.nodeName)||(r=function(e){for(;e;){if(1===e.nodeType||3===e.nodeType&&e.data&&/[\r\n\s]/.test(e.data))return e;e=e.nextSibling}}(t.firstChild))&&/^(UL|OL|DL)$/.test(r.nodeName)&&t.insertBefore(i.doc.createTextNode(mo),t.firstChild);var u=i.createRng();if(t.normalize(),t.hasChildNodes()){for(var s=new Gr(t,t);n=s.current();){if(Fn(n)){u.setStart(n,0),u.setEnd(n,0);break}if(a[n.nodeName.toLowerCase()]){u.setStartBefore(n),u.setEndBefore(n);break}o=n,n=s.next()}n||(u.setStart(o,0),u.setEnd(o,0))}else Hn(t)?t.nextSibling&&i.isBlock(t.nextSibling)?(u.setStartBefore(t),u.setEndBefore(t)):(u.setStartAfter(t),u.setEndAfter(t)):(u.setStart(t,0),u.setEnd(t,0));e.selection.setRng(u),Hd(e,u)}},nS=function(e){return U.from(e.dom.getParent(e.selection.getStart(!0),e.dom.isBlock))},rS=function(e,t){return e&&e.parentNode&&e.parentNode.nodeName===t},oS=function(e){return e&&/^(OL|UL|LI)$/.test(e.nodeName)},iS=function(e){var t=e.parentNode;return/^(LI|DT|DD)$/.test(t.nodeName)?t:e},aS=function(e,t,n){for(var r=e[n?"firstChild":"lastChild"];r&&!Tn(r);)r=r[n?"nextSibling":"previousSibling"];return r===t},uS=function(e,t,n,r,o){var i,a,u,s,c,l,f,d,m,g=e.dom,p=e.selection.getRng();n!==e.getBody()&&(oS(i=n)&&oS(i.parentNode)&&(o="LI"),a=o?t(o):g.create("BR"),aS(n,r,!0)&&aS(n,r,!1)?rS(n,"LI")?(u=iS(n),g.insertAfter(a,u),(null===(m=(d=n).parentNode)||void 0===m?void 0:m.firstChild)===d?g.remove(u):g.remove(n)):g.replace(a,n):(aS(n,r,!0)?rS(n,"LI")?(g.insertAfter(a,iS(n)),a.appendChild(g.doc.createTextNode(" ")),a.appendChild(n)):n.parentNode.insertBefore(a,n):aS(n,r,!1)?g.insertAfter(a,iS(n)):(n=iS(n),(s=p.cloneRange()).setStartAfter(r),s.setEndAfter(n),c=s.extractContents(),"LI"===o&&(f="LI",(l=c).firstChild&&l.firstChild.nodeName===f)?(a=c.firstChild,g.insertAfter(c,n)):(g.insertAfter(c,n),g.insertAfter(a,n))),g.remove(r)),tS(e,a))},sS=function(e){e.innerHTML='
    '},cS=function(e,t){return e.nodeName===t||e.previousSibling&&e.previousSibling.nodeName===t},lS=function(e,t){return t&&e.isBlock(t)&&!/^(TD|TH|CAPTION|FORM)$/.test(t.nodeName)&&!/^(fixed|absolute)/i.test(t.style.position)&&"true"!==e.getContentEditable(t)},fS=function(e,t,n){return!1===Fn(t)?n:e?1===n&&t.data.charAt(n-1)===go?0:n:n===t.data.length-1&&t.data.charAt(n)===go?t.data.length:n},dS=function(e,t){for(var n,r=e.getRoot(),o=t;o!==r&&"false"!==e.getContentEditable(o);)"true"===e.getContentEditable(o)&&(n=o),o=o.parentNode;return o!==r?n:r},mS=function(e,t){var n=fc(e);n&&n.toLowerCase()===t.tagName.toLowerCase()&&function(e,o,t){var i=e.dom;U.from(t.style).map(i.parseStyle).each(function(e){var t=ir(Tt.fromDom(o)),n=_e(_e({},t),e);i.setStyles(o,n)});var n=U.from(t["class"]).map(function(e){return e.split(/\s+/)}),r=U.from(o.className).map(function(e){return H(e.split(/\s+/),function(e){return""!==e})});us(n,r,function(t,e){var n=H(e,function(e){return!M(t,e)}),r=Ae(t,n);i.setAttrib(o,"class",r.join(" "))});var a=["style","class"],u=ge(t,function(e,t){return!M(a,t)});i.setAttribs(o,u)}(e,t,dc(e))},gS=function(a,e){var t,u,i,s,n,r,o,c,l,f=a.dom,d=a.schema,m=d.getNonEmptyElements(),g=a.selection.getRng(),p=function(e){var t,n=u,r=d.getTextInlineElements(),o=e||"TABLE"===c||"HR"===c?f.create(e||N):s.cloneNode(!1),i=o;if(!1===a.getParam("keep_styles",!0))f.setAttrib(o,"style",null),f.setAttrib(o,"class",null);else do{if(r[n.nodeName]){if(Ul(n)||Yl(n))continue;t=n.cloneNode(!1),f.setAttrib(t,"id",""),o.hasChildNodes()?t.appendChild(o.firstChild):i=t,o.appendChild(t)}}while((n=n.parentNode)&&n!==E);return mS(a,o),sS(i),o},h=function(e){var t,n,r=fS(e,u,i);if(Fn(u)&&(e?0u.childNodes.length-1,u=u.childNodes[Math.min(i,u.childNodes.length-1)]||u,i=l&&Fn(u)?u.nodeValue.length:0);var C,w,x,S,N,E=dS(f,u);E&&((N&&!y||!N&&y)&&(u=function(e,t,n,r,o){var i,a,u,s,c,l,f=t||"P",d=e.dom,m=dS(d,r),g=d.getParent(r,d.isBlock);if(!g||!lS(d,g)){if(c=(g=g||m)===e.getBody()||(l=g)&&/^(TD|TH|CAPTION)$/.test(l.nodeName)?g.nodeName.toLowerCase():g.parentNode.nodeName.toLowerCase(),!g.hasChildNodes())return i=d.create(f),mS(e,i),g.appendChild(i),n.setStart(i,0),n.setEnd(i,0),i;for(u=r;u.parentNode!==g;)u=u.parentNode;for(;u&&!d.isBlock(u);)u=(a=u).previousSibling;if(a&&e.schema.isValidChild(c,f.toLowerCase())){for(i=d.create(f),mS(e,i),a.parentNode.insertBefore(i,a),u=a;u&&!d.isBlock(u);)s=u.nextSibling,i.appendChild(u),u=s;n.setStart(r,o),n.setEnd(r,o)}}return r}(a,N,g,u,i)),s=f.getParent(u,f.isBlock),o=s?f.getParent(s.parentNode,f.isBlock):null,c=s?s.nodeName.toUpperCase():"","LI"!==(C=o?o.nodeName.toUpperCase():"")||b||(o=(s=o).parentNode,c=C),/^(LI|DT|DD)$/.test(c)&&f.isEmpty(s)?uS(a,p,o,s,N):N&&s===a.getBody()||(N=N||"P",bo(s)?(n=Ao(s),f.isEmpty(s)&&sS(s),mS(a,n),tS(a,n)):h()?v():h(!0)?(n=s.parentNode.insertBefore(p(),s),tS(a,cS(s,"HR")?n:s)):((S=(x=g).cloneRange()).setStart(x.startContainer,fS(!0,x.startContainer,x.startOffset)),S.setEnd(x.endContainer,fS(!1,x.endContainer,x.endOffset)),(t=S.cloneRange()).setEndAfter(s),r=t.extractContents(),w=r,Y(qu(Tt.fromDom(w),jt),function(e){var t=e.dom;t.nodeValue=ho(t.nodeValue)}),function(e){for(;Fn(e)&&(e.nodeValue=e.nodeValue.replace(/^[\r\n]+/,"")),e=e.firstChild;);}(r),n=r.firstChild,f.insertAfter(r,s),function(e,t,n){var r,o,i,a=n,u=[];if(a){for(;a=a.firstChild;){if(e.isBlock(a))return;Tn(a)&&!t[a.nodeName.toLowerCase()]&&u.push(a)}for(r=u.length;r--;)!(a=u[r]).hasChildNodes()||a.firstChild===a.lastChild&&""===a.firstChild.nodeValue?e.remove(a):(o=e,(i=a)&&"A"===i.nodeName&&o.isEmpty(i)&&e.remove(a))}}(f,m,n),function(e,t){t.normalize();var n=t.lastChild;n&&!/^(left|right)$/gi.test(e.getStyle(n,"float",!0))||e.add(t,"br")}(f,s),f.isEmpty(s)&&sS(s),n.normalize(),f.isEmpty(n)?(f.remove(n),v()):(mS(a,n),tS(a,n))),f.setAttrib(n,"id",""),a.fire("NewBlock",{newBlock:n})))},pS=function(e,t,n){var r=e.dom.createRng();n?(r.setStartBefore(t),r.setEndBefore(t)):(r.setStartAfter(t),r.setEndAfter(t)),e.selection.setRng(r),Hd(e,r)},hS=function(e,t){var n,r,o=e.selection,i=e.dom,a=o.getRng();md(i,a).each(function(e){a.setStart(e.startContainer,e.startOffset),a.setEnd(e.endContainer,e.endOffset)});var u,s=a.startOffset,c=a.startContainer;1===c.nodeType&&c.hasChildNodes()&&(u=s>c.childNodes.length-1,c=c.childNodes[Math.min(s,c.childNodes.length-1)]||c,s=u&&3===c.nodeType?c.nodeValue.length:0);var l=i.getParent(c,i.isBlock),f=l?i.getParent(l.parentNode,i.isBlock):null,d=f?f.nodeName.toUpperCase():"",m=!(!t||!t.ctrlKey);"LI"!==d||m||(l=f),c&&3===c.nodeType&&s>=c.nodeValue.length&&!function(e,t,n){for(var r,o=new Gr(t,n),i=e.getNonEmptyElements();r=o.next();)if(i[r.nodeName.toLowerCase()]||0a&&(s=r.pageX+o-a),r.pageY+i>u&&(c=r.pageY+i-u),n.style.width=o-s+"px",n.style.height=i-c+"px",v(p.clientX,p.clientY))})}},dN=function(e,l){return function(c){e.on(function(e){var t,n,r,o,i,a,u,s;e.dragging&&(u=(o=l).selection,s=u.getSel().getRangeAt(0).startContainer,i=3===s.nodeType?s.parentNode:s,a=e.element,i===a||o.dom.isChildOf(i,a)||uN(i)||(n=e.element,(r=n.cloneNode(!0)).removeAttribute("data-mce-selected"),t=r,l.fire("drop",{clientX:c.clientX,clientY:c.clientY}).isDefaultPrevented()||l.undoManager.transact(function(){cN(e.element),l.insertContent(l.dom.getOuterHTML(t)),l._selectionOverrides.hideFakeCaret()})))}),mN(e)}},mN=function(e){e.on(function(e){cN(e.ghost)}),e.clear()},gN=function(e){var t,n,r,o=(t=Ru(U.none()),{clear:function(){return t.set(U.none())},set:function(e){return t.set(U.some(e))},isSet:function(){return t.get().isSome()},on:function(e){return t.get().each(e)}}),i=Su.DOM,a=document,u=lN(o,e),s=fN(o,e),c=dN(o,e),l=(n=o,function(){n.on(function(e){e.dragging&&r.fire("dragend")}),mN(n)});(r=e).on("mousedown",u),e.on("mousemove",s),e.on("mouseup",c),i.bind(a,"mousemove",s),i.bind(a,"mouseup",l),e.on("remove",function(){i.unbind(a,"mousemove",s),i.unbind(a,"mouseup",l)})},pN=function(e){var n,i,a,u,t;gN(e),(n=e).on("drop",function(e){var t="undefined"!=typeof e.clientX?n.getDoc().elementFromPoint(e.clientX,e.clientY):null;!uN(t)&&"false"!==n.dom.getContentEditableParent(t)||e.preventDefault()}),e.getParam("block_unsupported_drop",!0,"boolean")&&(a=function(e){var t;e.isDefaultPrevented()||(t=e.dataTransfer)&&(M(t.types,"Files")||0').attr("id",g)).appendTo(u.getBody());var i=l.createRng();t===n&&St.ie?(o.empty().append('

    \xa0

    ').append(t),i.setStartAfter(o[0].firstChild.firstChild),i.setEndAfter(t)):(o.empty().append(mo).append(t).append(mo),i.setStart(o[0].firstChild,1),i.setEnd(o[0].lastChild,0)),o.css({top:l.getPos(e,u.getBody()).y}),o[0].focus();var a=c.getSel();return a.removeAllRanges(),a.addRange(i),i}(e,n.targetClone,t),o=Tt.fromDom(e);return Y($u(Tt.fromDom(u.getBody()),"*[data-mce-selected]"),function(e){Pt(o,e)||er(e,i)}),l.getAttrib(e,i)||e.setAttribute(i,"1"),s=e,S(),r},w=function(e,t){if(!e)return null;if(e.collapsed){if(!y(e)){var n=t?1:-1,r=ul(n,d,e),o=r.getNode(!t);if(Hc(o))return v(n,o,!!t&&!r.isAtEnd(),!1);var i=r.getNode(t);if(Hc(i))return v(n,i,!t&&!r.isAtEnd(),!1)}return null}var a=e.startContainer,u=e.startOffset,s=e.endOffset;if(3===a.nodeType&&0===u&&vN(a.parentNode)&&(a=a.parentNode,u=l.nodeIndex(a),a=a.parentNode),1!==a.nodeType)return null;if(s===u+1&&a===e.endContainer){var c=a.childNodes[u];if(p(c))return C(c)}return null},x=function(){s&&s.removeAttribute(i),Lr(Tt.fromDom(u.getBody()),"#"+g).each(hn),s=null},S=function(){m.hide()};return St.ceFalse&&!Iv(u)&&function(){u.on("mouseup",function(e){var t=r();t.collapsed&&Jy(u,e.clientX,e.clientY)&&lC(u,t,!1).each(h)}),u.on("click",function(e){var t=yN(u,e.target);t&&(vN(t)&&(e.preventDefault(),u.focus()),hN(t)&&l.isChildOf(t,c.getNode())&&x())}),u.on("blur NewBlock",x),u.on("ResizeWindow FullscreenStateChanged",m.reposition);var a=function(e){var t=El(e);if(!e.firstChild)return!1;var n,r=Ms.before(e.firstChild),o=t.next(r);return o&&!(fg(n=o)||dg(n)||ug(n)||sg(n))},i=function(e,t){var n,r,o=l.getParent(e,f),i=l.getParent(t,f);return!(!o||e===i||!l.isChildOf(o,i)||!1!==vN(yN(u,o)))||o&&(n=o,r=i,!(l.getParent(n,f)===l.getParent(r,f)))&&a(o)};u.on("tap",function(e){var t=e.target,n=yN(u,t);vN(n)?(e.preventDefault(),cC(u,n).each(w)):p(t)&&cC(u,t).each(w)},!0),u.on("mousedown",function(e){var t,n,r,o=e.target;o!==d&&"HTML"!==o.nodeName&&!l.isChildOf(o,d)||!1===Jy(u,e.clientX,e.clientY)||((t=yN(u,o))?vN(t)?(e.preventDefault(),cC(u,t).each(w)):(x(),hN(t)&&e.shiftKey||ed(e.clientX,e.clientY,c.getRng())||(S(),c.placeCaretAt(e.clientX,e.clientY))):p(o)?cC(u,o).each(w):!1===Hc(o)&&(x(),S(),(n=Rw(d,e.clientX,e.clientY))&&(i(o,n.node)||(e.preventDefault(),r=v(1,n.node,n.before,!1),u.getBody().focus(),h(r)))))}),u.on("keypress",function(e){nd.modifierPressed(e)||vN(c.getNode())&&e.preventDefault()}),u.on("GetSelectionRange",function(e){var t=e.range;if(s){if(!s.parentNode)return void(s=null);(t=t.cloneRange()).selectNode(s),e.range=t}}),u.on("SetSelectionRange",function(e){e.range=b(e.range);var t=w(e.range,e.forward);t&&(e.range=t)});var n,e,o;u.on("AfterSetSelectionRange",function(e){var t,n=e.range,r=n.startContainer.parentNode;y(n)||"mcepastebin"===r.id||S(),t=r,l.hasClass(t,"mce-offscreen-selection")||x()}),u.on("copy",function(e){var t,n,r=e.clipboardData;e.isDefaultPrevented()||!e.clipboardData||St.ie||(t=(n=l.get(g))?n.getElementsByTagName("*")[0]:n)&&(e.preventDefault(),r.clearData(),r.setData("text/html",t.outerHTML),r.setData("text/plain",t.outerText||t.innerText))}),pN(u),e=Lu(function(){var e,t;n.removed||!n.getBody().contains(document.activeElement)||(e=n.selection.getRng()).collapsed&&(t=fC(n,e,!1),n.selection.setRng(t))},0),(n=u).on("focus",function(){e.throttle()}),n.on("blur",function(){e.cancel()}),(o=u).on("init",function(){o.on("focusin",function(e){var t,n,r=e.target;Kn(r)&&(t=Zf(o.getBody(),r),n=$n(t)?t:r,o.selection.getNode()!==n&&cC(o,n).each(function(e){return o.selection.setRng(e)}))})})}(),{showCaret:v,showBlockCaretContainer:function(e){e.hasAttribute("data-mce-caret")&&(Ao(e),h(r()),c.scrollIntoView(e))},hideFakeCaret:S,destroy:function(){m.destroy(),s=null}}},CN=function(s){var n,r,o=At.each,c=nd.BACKSPACE,l=nd.DELETE,f=s.dom,d=s.selection,e=s.parser,t=St.gecko,i=St.ie,a=St.webkit,u="data:text/mce-internal,",m=i?"Text":"URL",g=function(e,t){try{s.getDoc().execCommand(e,!1,t)}catch(n){}},p=function(e){return e.isDefaultPrevented()},h=function(){var u=function(e){var t=f.create("body"),n=e.cloneContents();return t.appendChild(n),d.serializer.serialize(t,{format:"html"})};s.on("keydown",function(e){var t,n,r,o,i,a=e.keyCode;if(!p(e)&&(a===l||a===c)){if(t=s.selection.isCollapsed(),n=s.getBody(),t&&!f.isEmpty(n))return;if(!t&&(r=s.selection.getRng(),o=u(r),(i=f.createRng()).selectNode(s.getBody()),o!==u(i)))return;e.preventDefault(),s.setContent(""),n.firstChild&&f.isBlock(n.firstChild)?s.selection.setCursorLocation(n.firstChild,0):s.selection.setCursorLocation(n,0),s.nodeChanged()}})},v=function(){s.shortcuts.add("meta+a",null,"SelectAll")},y=function(){Range.prototype.getClientRects||s.on("mousedown",function(e){var t;p(e)||"HTML"!==e.target.nodeName||((t=s.getBody()).blur(),Kr.setEditorTimeout(s,function(){t.focus()}))})},b=function(){s.on("click",function(e){var t=e.target;/^(IMG|HR)$/.test(t.nodeName)&&"false"!==f.getContentEditableParent(t)&&(e.preventDefault(),s.selection.select(t),s.nodeChanged()),"A"===t.nodeName&&f.hasClass(t,"mce-item-anchor")&&(e.preventDefault(),d.select(t))})},C=function(){s.on("keydown",function(e){if(!p(e)&&e.keyCode===c&&d.isCollapsed()&&0===d.getRng().startOffset){var t=d.getNode().previousSibling;if(t&&t.nodeName&&"table"===t.nodeName.toLowerCase())return e.preventDefault(),!1}})},w=function(){s.getParam("readonly")||s.on("BeforeExecCommand mousedown",function(){g("StyleWithCSS",!1),g("enableInlineTableEditing",!1),bc(s)||g("enableObjectResizing",!1)})},x=function(){s.on("SetContent ExecCommand",function(e){"setcontent"!==e.type&&"mceInsertLink"!==e.command||o(f.select("a"),function(e){var t=e.parentNode,n=f.getRoot();if(t.lastChild===e){for(;t&&!f.isBlock(t);){if(t.parentNode.lastChild!==t||t===n)return;t=t.parentNode}f.add(t,"br",{"data-mce-bogus":1})}})})},S=function(){s.contentStyles.push("img:-moz-broken {-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}")},N=function(){s.inline||s.on("keydown",function(){document.activeElement===document.body&&s.getWin().focus()})},E=function(){s.inline||(s.contentStyles.push("body {min-height: 150px}"),s.on("click",function(e){var t;if("HTML"===e.target.nodeName){if(11")+"";e.getParam("document_base_url","")!==e.documentBaseUrl&&(t+=''),t+='';var n=cc(e,"body_id","tinymce"),r=cc(e,"body_class","");return lc(e)&&(t+=''),t+='
    '},ON=function(e,t){var n,r,o,i,a=e.editorManager.translate("Rich Text Area. Press ALT-0 for help."),u=(n=e.id,r=a,t.height,o=e.getParam("iframe_attrs",{}),i=Tt.fromTag("iframe"),Jn(i,o),Jn(i,{id:n+"_ifr",frameBorder:"0",allowTransparency:"true",title:r}),ju(i,"tox-edit-area__iframe"),i.dom);u.onload=function(){u.onload=null,e.fire("load")};var s=function(e,t){if(document.domain!==window.location.hostname&&St.browser.isIE()){var n=hb("mce");e[n]=function(){RN(e)};var r='javascript:(function(){document.open();document.domain="'+document.domain+'";var ed = window.parent.tinymce.get("'+e.id+'");document.write(ed.iframeHTML);document.close();ed.'+n+"(true);})()";return TN.setAttrib(t,"src",r),!0}return!1}(e,u);return e.contentAreaContainer=t.iframeContainer,e.iframeElement=u,e.iframeHTML=DN(e),TN.add(t.iframeContainer,u),s},BN=Su.DOM,PN=function(t,n,e){var r=eb.get(e),o=eb.urls[e]||t.documentBaseUrl.replace(/\/$/,"");if(e=At.trim(e),r&&-1===At.inArray(n,e)){if(At.each(eb.dependencies(e),function(e){PN(t,n,e)}),t.plugins[e])return;try{var i=new r(t,o,t.$);(t.plugins[e]=i).init&&(i.init(t,o),n.push(e))}catch(zk){!function(e,t,n){var r=Bu.translate(["Failed to initialize plugin: {0}",t]);td(e,"PluginLoadError",{message:r}),lb(r,n),ab(e,r)}(t,e,zk)}}},LN=function(e){return e.replace(/^\-/,"")},IN=function(e){return{editorContainer:e,iframeContainer:e,api:{}}},MN=function(e){var t,n,r=e.getElement();return e.inline?IN(null):(t=r,n=BN.create("div"),BN.insertAfter(n,t),IN(n))},FN=function(e){var t,n,r,o=e.getElement();return e.orgDisplay=o.style.display,K(wc(e))?e.theme.renderUI():m(wc(e))?(n=(t=e).getElement(),(r=wc(t)(t,n)).editorContainer.nodeType&&(r.editorContainer.id=r.editorContainer.id||t.id+"_parent"),r.iframeContainer&&r.iframeContainer.nodeType&&(r.iframeContainer.id=r.iframeContainer.id||t.id+"_iframecontainer"),r.height=r.iframeHeight?r.iframeHeight:n.offsetHeight,r):MN(e)},UN=function(e){var n,t,r,o,i,a,u,s,c;e.fire("ScriptsLoaded"),n=e,t=At.trim(gc(n)),r=n.ui.registry.getAll().icons,o=_e(_e({},qy.get("default").icons),qy.get(t).icons),se(o,function(e,t){ve(r,t)||n.ui.registry.addIcon(t,e)}),u=wc(i=e),K(u)?(i.settings.theme=LN(u),a=tb.get(u),i.theme=new a(i,tb.urls[u]),i.theme.init&&i.theme.init(i,tb.urls[u]||i.documentBaseUrl.replace(/\/$/,""),i.$)):i.theme={},s=e,c=[],At.each(Sc(s).split(/[ ,]/),function(e){PN(s,c,LN(e))});var l,f,d,m=FN(e);l=e,f=U.from(m.api).getOr({}),d={show:U.from(f.show).getOr(te),hide:U.from(f.hide).getOr(te),disable:U.from(f.disable).getOr(te),isDisabled:U.from(f.isDisabled).getOr(A),enable:function(){l.mode.isReadOnly()||U.from(f.enable).map(_)}},l.ui=_e(_e({},l.ui),d);var g,p,h,v={editorContainer:m.editorContainer,iframeContainer:m.iframeContainer};return e.editorContainer=v.editorContainer?v.editorContainer:null,mb(e),e.inline?RN(e):(h=ON(g=e,p=v),p.editorContainer&&(TN.get(p.editorContainer).style.display=g.orgDisplay,g.hidden=TN.isHidden(p.editorContainer)),g.getElement().style.display="none",TN.setAttrib(g.id,"aria-hidden","true"),void(h||RN(g)))},zN=Su.DOM,jN=function(e){return"-"===e.charAt(0)},HN=function(e,t){var n,r=hc(t),o=t.getParam("language_url","","string");!1===Bu.hasCode(r)&&"en"!==r&&(n=""!==o?o:t.editorManager.baseURL+"/langs/"+r+".js",e.add(n,te,undefined,function(){ub(t,"LanguageLoadError",sb("language",n,r))}))},VN=function(t,e,n){return U.from(e).filter(function(e){return 0")},mceToggleVisualAid:function(){i.hasVisual=!i.hasVisual,i.addVisual()},mceReplaceContent:function(e,t,n){i.execCommand("mceInsertContent",!1,n.replace(/\{\$selection\}/g,i.selection.getContent({format:"text"})))},mceInsertLink:function(e,t,n){"string"==typeof n&&(n={href:n});var r=i.dom.getParent(i.selection.getNode(),"a");n.href=n.href.replace(/ /g,"%20"),r&&n.href||i.formatter.remove("link"),n.href&&i.formatter.apply("link",n,r)},selectAll:function(){var e,t=i.dom.getParent(i.selection.getStart(),qn);t&&((e=i.dom.createRng()).selectNodeContents(t),i.selection.setRng(e))},mceNewDocument:function(){i.setContent("")},InsertLineBreak:function(e,t,n){return SS(i,n),!0}});var e=function(r){return function(){var e=i.selection,t=e.isCollapsed()?[i.dom.getParent(e.getNode(),i.dom.isBlock)]:e.getSelectedBlocks(),n=iE(t,function(e){return!!i.formatter.matchNode(e,r)});return-1!==aE(n,!0)}};a.addCommands({JustifyLeft:e("alignleft"),JustifyCenter:e("aligncenter"),JustifyRight:e("alignright"),JustifyFull:e("alignjustify"),"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(e){return a.isFormatMatch(e)},mceBlockQuote:function(){return a.isFormatMatch("blockquote")},Outdent:function(){return ox(i)},"InsertUnorderedList,InsertOrderedList":function(e){var t=i.dom.getParent(i.selection.getNode(),"ul,ol");return t&&("insertunorderedlist"===e&&"UL"===t.tagName||"insertorderedlist"===e&&"OL"===t.tagName)}},"state"),a.addCommands({Undo:function(){i.undoManager.undo()},Redo:function(){i.undoManager.redo()}}),a.addQueryValueHandler("FontName",function(){return eE(t=i,function(e){return QN(t.getBody(),e.dom)}).getOr("");var t},this),a.addQueryValueHandler("FontSize",function(){return eE(t=i,function(e){return JN(t.getBody(),e.dom)}).getOr("");var t},this),a.addQueryValueHandler("LineHeight",function(){return eE(t=i,function(n){var e=Tt.fromDom(t.getBody());return th(n,function(e){return or(e,"line-height")},k(Pt,e)).getOrThunk(function(){var e=parseFloat(nr(n,"line-height")),t=parseFloat(nr(n,"font-size"));return String(e/t)})}).getOr("");var t},this)},sE);function sE(e){this.commands={state:{},exec:{},value:{}},this.editor=e,this.setupCommands(e)}var cE="data-mce-contenteditable",lE=function(e,t,n){var r,o;Vu(e,t)&&!1===n?(o=t,Fu(r=e)?r.dom.classList.remove(o):zu(r,o),Hu(r)):n&&ju(e,t)},fE=function(e,t,n){try{e.getDoc().execCommand(t,!1,String(n))}catch(r){}},dE=function(e,t){e.dom.contentEditable=t?"true":"false"},mE=function(e,t){var n,r,o,i=Tt.fromDom(e.getBody());lE(i,"mce-content-readonly",t),t?(e.selection.controlSelection.hideResizeRect(),e._selectionOverrides.hideFakeCaret(),o=e,U.from(o.selection.getNode()).each(function(e){e.removeAttribute("data-mce-selected")}),e.readonly=!0,dE(i,!1),Y($u(i,'*[contenteditable="true"]'),function(e){Gn(e,cE,"true"),dE(e,!1)})):(e.readonly=!1,dE(i,!0),Y($u(i,"*["+cE+'="true"]'),function(e){er(e,cE),dE(e,!0)}),fE(e,"StyleWithCSS",!1),fE(e,"enableInlineTableEditing",!1),fE(e,"enableObjectResizing",!1),(bm(r=e)||ym(r))&&e.focus(),(n=e).selection.setRng(n.selection.getRng()),e.nodeChanged())},gE=function(e){return e.readonly},pE=function(t){t.parser.addAttributeFilter("contenteditable",function(e){gE(t)&&Y(e,function(e){e.attr(cE,e.attr("contenteditable")),e.attr("contenteditable","false")})}),t.serializer.addAttributeFilter(cE,function(e){gE(t)&&Y(e,function(e){e.attr("contenteditable",e.attr(cE))})}),t.serializer.addTempAttr(cE)},hE=function(a,u){var e,t;"click"!==u.type||nd.metaKeyPressed(u)||(e=Tt.fromDom(u.target),t=a,Ir(e,"a",function(e){return Pt(e,Tt.fromDom(t.getBody()))}).bind(function(e){return Zn(e,"href")}).each(function(e){var t,n,r,o,i;u.preventDefault(),/^#/.test(e)?(t=a.dom.select(e+',[name="'+(qe(n=e,r="#")?(o=n,i=r.length,o.substring(i)):n)+'"]')).length&&a.selection.scrollIntoView(t[0],!0):window.open(e,"_blank","rel=noopener noreferrer,menubar=yes,toolbar=yes,location=yes,status=yes,resizable=yes,scrollbars=yes")}))},vE=At.makeMap("focus blur focusin focusout click dblclick mousedown mouseup mousemove mouseover beforepaste paste cut copy selectionchange mouseout mouseenter mouseleave wheel keydown keypress keyup input beforeinput contextmenu dragstart dragend dragover draggesture dragdrop drop drag submit compositionstart compositionend compositionupdate touchstart touchmove touchend touchcancel"," "),yE=(bE.isNative=function(e){return!!vE[e.toLowerCase()]},bE.prototype.fire=function(e,t){var n=e.toLowerCase(),r=t||{};r.type=n,r.target||(r.target=this.scope),r.preventDefault||(r.preventDefault=function(){r.isDefaultPrevented=R},r.stopPropagation=function(){r.isPropagationStopped=R},r.stopImmediatePropagation=function(){r.isImmediatePropagationStopped=R},r.isDefaultPrevented=A,r.isPropagationStopped=A,r.isImmediatePropagationStopped=A),this.settings.beforeFire&&this.settings.beforeFire(r);var o=this.bindings[n];if(o)for(var i=0,a=o.length;i"),LE);return o[o.length-1]=At.extend(o[o.length-1],{func:n,scope:r||this.editor}),At.extend(o[0],{desc:this.editor.translate(t),subpatterns:o.slice(1)})},ME.prototype.hasModifier=function(e){return e.altKey||e.ctrlKey||e.metaKey},ME.prototype.isFunctionKey=function(e){return"keydown"===e.type&&112<=e.keyCode&&e.keyCode<=123},ME.prototype.matchShortcut=function(e,t){return!!t&&t.ctrl===e.ctrlKey&&t.meta===e.metaKey&&t.alt===e.altKey&&t.shift===e.shiftKey&&!!(e.keyCode===t.keyCode||e.charCode&&e.charCode===t.charCode)&&(e.preventDefault(),!0)},ME.prototype.executeShortcutAction=function(e){return e.func?e.func.call(e.scope):null},ME);function ME(e){this.shortcuts={},this.pendingPatterns=[],this.editor=e;var n=this;e.on("keyup keypress keydown",function(t){!n.hasModifier(t)&&!n.isFunctionKey(t)||t.isDefaultPrevented()||(DE(n.shortcuts,function(e){if(n.matchShortcut(t,e))return n.pendingPatterns=e.subpatterns.slice(0),"keydown"===t.type&&n.executeShortcutAction(e),!0}),n.matchShortcut(t,n.pendingPatterns[0])&&(1===n.pendingPatterns.length&&"keydown"===t.type&&n.executeShortcutAction(n.pendingPatterns[0]),n.pendingPatterns.shift()))})}var FE=function(){var e,t,n,r,o,i,a,u,s=(t={},n={},r={},o={},i={},a={},{addButton:(u=function(n,r){return function(e,t){return n[e.toLowerCase()]=_e(_e({},t),{type:r})}})(e={},"button"),addGroupToolbarButton:u(e,"grouptoolbarbutton"),addToggleButton:u(e,"togglebutton"),addMenuButton:u(e,"menubutton"),addSplitButton:u(e,"splitbutton"),addMenuItem:u(t,"menuitem"),addNestedMenuItem:u(t,"nestedmenuitem"),addToggleMenuItem:u(t,"togglemenuitem"),addAutocompleter:u(n,"autocompleter"),addContextMenu:u(o,"contextmenu"),addContextToolbar:u(i,"contexttoolbar"),addContextForm:u(i,"contextform"),addSidebar:u(a,"sidebar"),addIcon:function(e,t){return r[e.toLowerCase()]=t},getAll:function(){return{buttons:e,menuItems:t,icons:r,popups:n,contextMenus:o,contextToolbars:i,sidebars:a}}});return{addAutocompleter:s.addAutocompleter,addButton:s.addButton,addContextForm:s.addContextForm,addContextMenu:s.addContextMenu,addContextToolbar:s.addContextToolbar,addIcon:s.addIcon,addMenuButton:s.addMenuButton,addMenuItem:s.addMenuItem,addNestedMenuItem:s.addNestedMenuItem,addSidebar:s.addSidebar,addSplitButton:s.addSplitButton,addToggleButton:s.addToggleButton,addGroupToolbarButton:s.addGroupToolbarButton,addToggleMenuItem:s.addToggleMenuItem,getAll:s.getAll}},UE=At.each,zE=At.trim,jE="source protocol authority userInfo user password host port relative path directory file query anchor".split(" "),HE={ftp:21,http:80,https:443,mailto:25},VE=(qE.parseDataUri=function(e){var t,n=decodeURIComponent(e).split(","),r=/data:([^;]+)/.exec(n[0]);return r&&(t=r[1]),{type:t,data:n[1]}},qE.getDocumentBaseUrl=function(e){var t=0!==e.protocol.indexOf("http")&&"file:"!==e.protocol?e.href:e.protocol+"//"+e.host+e.pathname;return/^[^:]+:\/\/\/?[^\/]+\//.test(t)&&(t=t.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,""),/[\/\\]$/.test(t)||(t+="/")),t},qE.prototype.setPath=function(e){var t=/^(.*?)\/?(\w+)?$/.exec(e);this.path=t[0],this.directory=t[1],this.file=t[2],this.source="",this.getURI()},qE.prototype.toRelative=function(e){var t;if("./"===e)return e;var n=new qE(e,{base_uri:this});if("mce_host"!==n.host&&this.host!==n.host&&n.host||this.port!==n.port||this.protocol!==n.protocol&&""!==n.protocol)return n.getURI();var r=this.getURI(),o=n.getURI();return r===o||"/"===r.charAt(r.length-1)&&r.substr(0,r.length-1)===o?r:(t=this.toRelPath(this.path,n.path),n.query&&(t+="?"+n.query),n.anchor&&(t+="#"+n.anchor),t)},qE.prototype.toAbsolute=function(e,t){var n=new qE(e,{base_uri:this});return n.getURI(t&&this.isSameOrigin(n))},qE.prototype.isSameOrigin=function(e){if(this.host==e.host&&this.protocol==e.protocol){if(this.port==e.port)return!0;var t=HE[this.protocol];if(t&&(this.port||t)==(e.port||t))return!0}return!1},qE.prototype.toRelPath=function(e,t){var n,r,o=0,i="",a=e.substring(0,e.lastIndexOf("/")).split("/"),u=t.split("/");if(a.length>=u.length)for(n=0,r=a.length;n=u.length||a[n]!==u[n]){o=n+1;break}if(a.length=a.length||a[n]!==u[n]){o=n+1;break}if(1===o)return t;for(n=0,r=a.length-(o-1);n=n.x&&o.x+o.w<=n.w+n.x&&o.y>=n.y&&o.y+o.h<=n.h+n.y)return r[i];return null},intersect:function(e,t){var n=vk(e.x,t.x),r=vk(e.y,t.y),o=hk(e.x+e.w,t.x+t.w),i=hk(e.y+e.h,t.y+t.h);return o-n<0||i-r<0?null:Ck(n,r,o-n,i-r)},clamp:function(e,t,n){var r=e.x,o=e.y,i=e.x+e.w,a=e.y+e.h,u=t.x+t.w,s=t.y+t.h,c=vk(0,t.x-r),l=vk(0,t.y-o),f=vk(0,i-u),d=vk(0,a-s);return r+=c,o+=l,n&&(i+=c,a+=l,r-=f,o-=d),Ck(r,o,(i-=f)-r,(a-=d)-o)},create:Ck,fromClientRect:function(e){return Ck(e.left,e.top,e.width,e.height)}},xk=(dk={},mk={},{load:function(r,o){var i='Script at URL "'+o+'" failed to load',a='Script at URL "'+o+"\" did not call `tinymce.Resource.add('"+r+"', data)` within 1 second";if(dk[r]!==undefined)return dk[r];var e=new Mr(function(e,t){var n=function(e,t,n){void 0===n&&(n=1e3);var r=!1,o=null,i=function(n){return function(){for(var e=[],t=0;t -1; }; var exists = function (xs, pred) { for (var i = 0, len = xs.length; i < len; i++) { var x = xs[i]; if (pred(x, i)) { return true; } } return false; }; var range = function (num, f) { var r = []; for (var i = 0; i < num; i++) { r.push(f(i)); } return r; }; var chunk = function (array, size) { var r = []; for (var i = 0; i < array.length; i += size) { var s = nativeSlice.call(array, i, i + size); r.push(s); } return r; }; var map = function (xs, f) { var len = xs.length; var r = new Array(len); for (var i = 0; i < len; i++) { var x = xs[i]; r[i] = f(x, i); } return r; }; var each = function (xs, f) { for (var i = 0, len = xs.length; i < len; i++) { var x = xs[i]; f(x, i); } }; var eachr = function (xs, f) { for (var i = xs.length - 1; i >= 0; i--) { var x = xs[i]; f(x, i); } }; var partition = function (xs, pred) { var pass = []; var fail = []; for (var i = 0, len = xs.length; i < len; i++) { var x = xs[i]; var arr = pred(x, i) ? pass : fail; arr.push(x); } return { pass: pass, fail: fail }; }; var filter = function (xs, pred) { var r = []; for (var i = 0, len = xs.length; i < len; i++) { var x = xs[i]; if (pred(x, i)) { r.push(x); } } return r; }; var foldr = function (xs, f, acc) { eachr(xs, function (x) { acc = f(acc, x); }); return acc; }; var foldl = function (xs, f, acc) { each(xs, function (x) { acc = f(acc, x); }); return acc; }; var findUntil = function (xs, pred, until) { for (var i = 0, len = xs.length; i < len; i++) { var x = xs[i]; if (pred(x, i)) { return Optional.some(x); } else if (until(x, i)) { break; } } return Optional.none(); }; var find = function (xs, pred) { return findUntil(xs, pred, never); }; var findIndex = function (xs, pred) { for (var i = 0, len = xs.length; i < len; i++) { var x = xs[i]; if (pred(x, i)) { return Optional.some(i); } } return Optional.none(); }; var flatten = function (xs) { var r = []; for (var i = 0, len = xs.length; i < len; ++i) { if (!isArray(xs[i])) { throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); } nativePush.apply(r, xs[i]); } return r; }; var bind = function (xs, f) { return flatten(map(xs, f)); }; var forall = function (xs, pred) { for (var i = 0, len = xs.length; i < len; ++i) { var x = xs[i]; if (pred(x, i) !== true) { return false; } } return true; }; var reverse = function (xs) { var r = nativeSlice.call(xs, 0); r.reverse(); return r; }; var difference = function (a1, a2) { return filter(a1, function (x) { return !contains(a2, x); }); }; var mapToObject = function (xs, f) { var r = {}; for (var i = 0, len = xs.length; i < len; i++) { var x = xs[i]; r[String(x)] = f(x, i); } return r; }; var sort = function (xs, comparator) { var copy = nativeSlice.call(xs, 0); copy.sort(comparator); return copy; }; var get = function (xs, i) { return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none(); }; var head = function (xs) { return get(xs, 0); }; var last = function (xs) { return get(xs, xs.length - 1); }; var from$1 = isFunction(Array.from) ? Array.from : function (x) { return nativeSlice.call(x); }; var findMap = function (arr, f) { for (var i = 0; i < arr.length; i++) { var r = f(arr[i], i); if (r.isSome()) { return r; } } return Optional.none(); }; var value = function (o) { var is = function (v) { return o === v; }; var or = function (_opt) { return value(o); }; var orThunk = function (_f) { return value(o); }; var map = function (f) { return value(f(o)); }; var mapError = function (_f) { return value(o); }; var each = function (f) { f(o); }; var bind = function (f) { return f(o); }; var fold = function (_, onValue) { return onValue(o); }; var exists = function (f) { return f(o); }; var forall = function (f) { return f(o); }; var toOptional = function () { return Optional.some(o); }; return { is: is, isValue: always, isError: never, getOr: constant(o), getOrThunk: constant(o), getOrDie: constant(o), or: or, orThunk: orThunk, fold: fold, map: map, mapError: mapError, each: each, bind: bind, exists: exists, forall: forall, toOptional: toOptional }; }; var error = function (message) { var getOrThunk = function (f) { return f(); }; var getOrDie = function () { return die(String(message))(); }; var or = function (opt) { return opt; }; var orThunk = function (f) { return f(); }; var map = function (_f) { return error(message); }; var mapError = function (f) { return error(f(message)); }; var bind = function (_f) { return error(message); }; var fold = function (onError, _) { return onError(message); }; return { is: never, isValue: never, isError: always, getOr: identity, getOrThunk: getOrThunk, getOrDie: getOrDie, or: or, orThunk: orThunk, fold: fold, map: map, mapError: mapError, each: noop, bind: bind, exists: never, forall: always, toOptional: Optional.none }; }; var fromOption = function (opt, err) { return opt.fold(function () { return error(err); }, value); }; var Result = { value: value, error: error, fromOption: fromOption }; var SimpleResultType; (function (SimpleResultType) { SimpleResultType[SimpleResultType['Error'] = 0] = 'Error'; SimpleResultType[SimpleResultType['Value'] = 1] = 'Value'; }(SimpleResultType || (SimpleResultType = {}))); var fold = function (res, onError, onValue) { return res.stype === SimpleResultType.Error ? onError(res.serror) : onValue(res.svalue); }; var partition$1 = function (results) { var values = []; var errors = []; each(results, function (obj) { fold(obj, function (err) { return errors.push(err); }, function (val) { return values.push(val); }); }); return { values: values, errors: errors }; }; var mapError = function (res, f) { if (res.stype === SimpleResultType.Error) { return { stype: SimpleResultType.Error, serror: f(res.serror) }; } else { return res; } }; var map$1 = function (res, f) { if (res.stype === SimpleResultType.Value) { return { stype: SimpleResultType.Value, svalue: f(res.svalue) }; } else { return res; } }; var bind$1 = function (res, f) { if (res.stype === SimpleResultType.Value) { return f(res.svalue); } else { return res; } }; var bindError = function (res, f) { if (res.stype === SimpleResultType.Error) { return f(res.serror); } else { return res; } }; var svalue = function (v) { return { stype: SimpleResultType.Value, svalue: v }; }; var serror = function (e) { return { stype: SimpleResultType.Error, serror: e }; }; var toResult = function (res) { return fold(res, Result.error, Result.value); }; var fromResult = function (res) { return res.fold(serror, svalue); }; var SimpleResult = { fromResult: fromResult, toResult: toResult, svalue: svalue, partition: partition$1, serror: serror, bind: bind$1, bindError: bindError, map: map$1, mapError: mapError, fold: fold }; var keys = Object.keys; var hasOwnProperty = Object.hasOwnProperty; var each$1 = function (obj, f) { var props = keys(obj); for (var k = 0, len = props.length; k < len; k++) { var i = props[k]; var x = obj[i]; f(x, i); } }; var map$2 = function (obj, f) { return tupleMap(obj, function (x, i) { return { k: i, v: f(x, i) }; }); }; var tupleMap = function (obj, f) { var r = {}; each$1(obj, function (x, i) { var tuple = f(x, i); r[tuple.k] = tuple.v; }); return r; }; var objAcc = function (r) { return function (x, i) { r[i] = x; }; }; var internalFilter = function (obj, pred, onTrue, onFalse) { var r = {}; each$1(obj, function (x, i) { (pred(x, i) ? onTrue : onFalse)(x, i); }); return r; }; var filter$1 = function (obj, pred) { var t = {}; internalFilter(obj, pred, objAcc(t), noop); return t; }; var mapToArray = function (obj, f) { var r = []; each$1(obj, function (value, name) { r.push(f(value, name)); }); return r; }; var find$1 = function (obj, pred) { var props = keys(obj); for (var k = 0, len = props.length; k < len; k++) { var i = props[k]; var x = obj[i]; if (pred(x, i, obj)) { return Optional.some(x); } } return Optional.none(); }; var values = function (obj) { return mapToArray(obj, function (v) { return v; }); }; var get$1 = function (obj, key) { return has(obj, key) ? Optional.from(obj[key]) : Optional.none(); }; var has = function (obj, key) { return hasOwnProperty.call(obj, key); }; var hasNonNullableKey = function (obj, key) { return has(obj, key) && obj[key] !== undefined && obj[key] !== null; }; var generate = function (cases) { if (!isArray(cases)) { throw new Error('cases must be an array'); } if (cases.length === 0) { throw new Error('there must be at least one case'); } var constructors = []; var adt = {}; each(cases, function (acase, count) { var keys$1 = keys(acase); if (keys$1.length !== 1) { throw new Error('one and only one name per case'); } var key = keys$1[0]; var value = acase[key]; if (adt[key] !== undefined) { throw new Error('duplicate key detected:' + key); } else if (key === 'cata') { throw new Error('cannot have a case named cata (sorry)'); } else if (!isArray(value)) { throw new Error('case arguments must be an array'); } constructors.push(key); adt[key] = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } var argLength = args.length; if (argLength !== value.length) { throw new Error('Wrong number of arguments to case ' + key + '. Expected ' + value.length + ' (' + value + '), got ' + argLength); } var match = function (branches) { var branchKeys = keys(branches); if (constructors.length !== branchKeys.length) { throw new Error('Wrong number of arguments to match. Expected: ' + constructors.join(',') + '\nActual: ' + branchKeys.join(',')); } var allReqd = forall(constructors, function (reqKey) { return contains(branchKeys, reqKey); }); if (!allReqd) { throw new Error('Not all branches were specified when using match. Specified: ' + branchKeys.join(', ') + '\nRequired: ' + constructors.join(', ')); } return branches[key].apply(null, args); }; return { fold: function () { var foldArgs = []; for (var _i = 0; _i < arguments.length; _i++) { foldArgs[_i] = arguments[_i]; } if (foldArgs.length !== cases.length) { throw new Error('Wrong number of arguments to fold. Expected ' + cases.length + ', got ' + foldArgs.length); } var target = foldArgs[count]; return target.apply(null, args); }, match: match, log: function (label) { console.log(label, { constructors: constructors, constructor: key, params: args }); } }; }; }); return adt; }; var Adt = { generate: generate }; var hasOwnProperty$1 = Object.prototype.hasOwnProperty; var shallow = function (old, nu) { return nu; }; var deep = function (old, nu) { var bothObjects = isObject(old) && isObject(nu); return bothObjects ? deepMerge(old, nu) : nu; }; var baseMerge = function (merger) { return function () { var objects = []; for (var _i = 0; _i < arguments.length; _i++) { objects[_i] = arguments[_i]; } if (objects.length === 0) { throw new Error('Can\'t merge zero objects'); } var ret = {}; for (var j = 0; j < objects.length; j++) { var curObject = objects[j]; for (var key in curObject) { if (hasOwnProperty$1.call(curObject, key)) { ret[key] = merger(ret[key], curObject[key]); } } } return ret; }; }; var deepMerge = baseMerge(deep); var merge = baseMerge(shallow); var cached = function (f) { var called = false; var r; return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } if (!called) { called = true; r = f.apply(null, args); } return r; }; }; var adt = Adt.generate([ { strict: [] }, { defaultedThunk: ['fallbackThunk'] }, { asOption: [] }, { asDefaultedOptionThunk: ['fallbackThunk'] }, { mergeWithThunk: ['baseThunk'] } ]); var defaulted = function (fallback) { return adt.defaultedThunk(constant(fallback)); }; var mergeWith = function (base) { return adt.mergeWithThunk(constant(base)); }; var strict = adt.strict; var asOption = adt.asOption; var defaultedThunk = adt.defaultedThunk; var asDefaultedOptionThunk = adt.asDefaultedOptionThunk; var mergeWithThunk = adt.mergeWithThunk; var comparison = Adt.generate([ { bothErrors: [ 'error1', 'error2' ] }, { firstError: [ 'error1', 'value2' ] }, { secondError: [ 'value1', 'error2' ] }, { bothValues: [ 'value1', 'value2' ] } ]); var partition$2 = function (results) { var errors = []; var values = []; each(results, function (result) { result.fold(function (err) { errors.push(err); }, function (value) { values.push(value); }); }); return { errors: errors, values: values }; }; var exclude = function (obj, fields) { var r = {}; each$1(obj, function (v, k) { if (!contains(fields, k)) { r[k] = v; } }); return r; }; var wrap = function (key, value) { var _a; return _a = {}, _a[key] = value, _a; }; var wrapAll = function (keyvalues) { var r = {}; each(keyvalues, function (kv) { r[kv.key] = kv.value; }); return r; }; var exclude$1 = function (obj, fields) { return exclude(obj, fields); }; var wrap$1 = function (key, value) { return wrap(key, value); }; var wrapAll$1 = function (keyvalues) { return wrapAll(keyvalues); }; var mergeValues = function (values, base) { return values.length === 0 ? Result.value(base) : Result.value(deepMerge(base, merge.apply(undefined, values))); }; var mergeErrors = function (errors) { return Result.error(flatten(errors)); }; var consolidate = function (objs, base) { var partitions = partition$2(objs); return partitions.errors.length > 0 ? mergeErrors(partitions.errors) : mergeValues(partitions.values, base); }; var mergeValues$1 = function (values, base) { return values.length > 0 ? SimpleResult.svalue(deepMerge(base, merge.apply(undefined, values))) : SimpleResult.svalue(base); }; var mergeErrors$1 = function (errors) { return compose(SimpleResult.serror, flatten)(errors); }; var consolidateObj = function (objects, base) { var partition = SimpleResult.partition(objects); return partition.errors.length > 0 ? mergeErrors$1(partition.errors) : mergeValues$1(partition.values, base); }; var consolidateArr = function (objects) { var partitions = SimpleResult.partition(objects); return partitions.errors.length > 0 ? mergeErrors$1(partitions.errors) : SimpleResult.svalue(partitions.values); }; var ResultCombine = { consolidateObj: consolidateObj, consolidateArr: consolidateArr }; var formatObj = function (input) { return isObject(input) && keys(input).length > 100 ? ' removed due to size' : JSON.stringify(input, null, 2); }; var formatErrors = function (errors) { var es = errors.length > 10 ? errors.slice(0, 10).concat([{ path: [], getErrorInfo: function () { return '... (only showing first ten failures)'; } }]) : errors; return map(es, function (e) { return 'Failed path: (' + e.path.join(' > ') + ')\n' + e.getErrorInfo(); }); }; var nu = function (path, getErrorInfo) { return SimpleResult.serror([{ path: path, getErrorInfo: getErrorInfo }]); }; var missingStrict = function (path, key, obj) { return nu(path, function () { return 'Could not find valid *strict* value for "' + key + '" in ' + formatObj(obj); }); }; var missingKey = function (path, key) { return nu(path, function () { return 'Choice schema did not contain choice key: "' + key + '"'; }); }; var missingBranch = function (path, branches, branch) { return nu(path, function () { return 'The chosen schema: "' + branch + '" did not exist in branches: ' + formatObj(branches); }); }; var unsupportedFields = function (path, unsupported) { return nu(path, function () { return 'There are unsupported fields: [' + unsupported.join(', ') + '] specified'; }); }; var custom = function (path, err) { return nu(path, function () { return err; }); }; var adt$1 = Adt.generate([ { field: [ 'key', 'okey', 'presence', 'prop' ] }, { state: [ 'okey', 'instantiator' ] } ]); var strictAccess = function (path, obj, key) { return get$1(obj, key).fold(function () { return missingStrict(path, key, obj); }, SimpleResult.svalue); }; var fallbackAccess = function (obj, key, fallbackThunk) { var v = get$1(obj, key).fold(function () { return fallbackThunk(obj); }, identity); return SimpleResult.svalue(v); }; var optionAccess = function (obj, key) { return SimpleResult.svalue(get$1(obj, key)); }; var optionDefaultedAccess = function (obj, key, fallback) { var opt = get$1(obj, key).map(function (val) { return val === true ? fallback(obj) : val; }); return SimpleResult.svalue(opt); }; var cExtractOne = function (path, obj, field, strength) { return field.fold(function (key, okey, presence, prop) { var bundle = function (av) { var result = prop.extract(path.concat([key]), strength, av); return SimpleResult.map(result, function (res) { return wrap(okey, strength(res)); }); }; var bundleAsOption = function (optValue) { return optValue.fold(function () { var outcome = wrap(okey, strength(Optional.none())); return SimpleResult.svalue(outcome); }, function (ov) { var result = prop.extract(path.concat([key]), strength, ov); return SimpleResult.map(result, function (res) { return wrap(okey, strength(Optional.some(res))); }); }); }; return function () { return presence.fold(function () { return SimpleResult.bind(strictAccess(path, obj, key), bundle); }, function (fallbackThunk) { return SimpleResult.bind(fallbackAccess(obj, key, fallbackThunk), bundle); }, function () { return SimpleResult.bind(optionAccess(obj, key), bundleAsOption); }, function (fallbackThunk) { return SimpleResult.bind(optionDefaultedAccess(obj, key, fallbackThunk), bundleAsOption); }, function (baseThunk) { var base = baseThunk(obj); var result = SimpleResult.map(fallbackAccess(obj, key, constant({})), function (v) { return deepMerge(base, v); }); return SimpleResult.bind(result, bundle); }); }(); }, function (okey, instantiator) { var state = instantiator(obj); return SimpleResult.svalue(wrap(okey, strength(state))); }); }; var cExtract = function (path, obj, fields, strength) { var results = map(fields, function (field) { return cExtractOne(path, obj, field, strength); }); return ResultCombine.consolidateObj(results, {}); }; var valueThunk = function (getDelegate) { var extract = function (path, strength, val) { return getDelegate().extract(path, strength, val); }; var toString = function () { return getDelegate().toString(); }; return { extract: extract, toString: toString }; }; var value$1 = function (validator) { var extract = function (path, strength, val) { return SimpleResult.bindError(validator(val, strength), function (err) { return custom(path, err); }); }; var toString = function () { return 'val'; }; return { extract: extract, toString: toString }; }; var getSetKeys = function (obj) { return keys(filter$1(obj, function (value) { return value !== undefined && value !== null; })); }; var objOfOnly = function (fields) { var delegate = objOf(fields); var fieldNames = foldr(fields, function (acc, f) { return f.fold(function (key) { return deepMerge(acc, wrap$1(key, true)); }, constant(acc)); }, {}); var extract = function (path, strength, o) { var keys = isBoolean(o) ? [] : getSetKeys(o); var extra = filter(keys, function (k) { return !hasNonNullableKey(fieldNames, k); }); return extra.length === 0 ? delegate.extract(path, strength, o) : unsupportedFields(path, extra); }; return { extract: extract, toString: delegate.toString }; }; var objOf = function (fields) { var extract = function (path, strength, o) { return cExtract(path, o, fields, strength); }; var toString = function () { var fieldStrings = map(fields, function (field) { return field.fold(function (key, okey, presence, prop) { return key + ' -> ' + prop.toString(); }, function (okey, _instantiator) { return 'state(' + okey + ')'; }); }); return 'obj{\n' + fieldStrings.join('\n') + '}'; }; return { extract: extract, toString: toString }; }; var arrOf = function (prop) { var extract = function (path, strength, array) { var results = map(array, function (a, i) { return prop.extract(path.concat(['[' + i + ']']), strength, a); }); return ResultCombine.consolidateArr(results); }; var toString = function () { return 'array(' + prop.toString() + ')'; }; return { extract: extract, toString: toString }; }; var oneOf = function (props) { var extract = function (path, strength, val) { var errors = []; for (var _i = 0, props_1 = props; _i < props_1.length; _i++) { var prop = props_1[_i]; var res = prop.extract(path, strength, val); if (res.stype === SimpleResultType.Value) { return res; } errors.push(res); } return ResultCombine.consolidateArr(errors); }; var toString = function () { return 'oneOf(' + map(props, function (prop) { return prop.toString(); }).join(', ') + ')'; }; return { extract: extract, toString: toString }; }; var setOf = function (validator, prop) { var validateKeys = function (path, keys) { return arrOf(value$1(validator)).extract(path, identity, keys); }; var extract = function (path, strength, o) { var keys$1 = keys(o); var validatedKeys = validateKeys(path, keys$1); return SimpleResult.bind(validatedKeys, function (validKeys) { var schema = map(validKeys, function (vk) { return adt$1.field(vk, vk, strict(), prop); }); return objOf(schema).extract(path, strength, o); }); }; var toString = function () { return 'setOf(' + prop.toString() + ')'; }; return { extract: extract, toString: toString }; }; var thunk = function (desc, processor) { var getP = cached(function () { return processor(); }); var extract = function (path, strength, val) { return getP().extract(path, strength, val); }; var toString = function () { return getP().toString(); }; return { extract: extract, toString: toString }; }; var anyValue = constant(value$1(SimpleResult.svalue)); var arrOfObj = compose(arrOf, objOf); var state = adt$1.state; var field = adt$1.field; var chooseFrom = function (path, strength, input, branches, ch) { var fields = get$1(branches, ch); return fields.fold(function () { return missingBranch(path, branches, ch); }, function (vp) { return vp.extract(path.concat(['branch: ' + ch]), strength, input); }); }; var choose = function (key, branches) { var extract = function (path, strength, input) { var choice = get$1(input, key); return choice.fold(function () { return missingKey(path, key); }, function (chosen) { return chooseFrom(path, strength, input, branches, chosen); }); }; var toString = function () { return 'chooseOn(' + key + '). Possible values: ' + keys(branches); }; return { extract: extract, toString: toString }; }; var _anyValue = value$1(SimpleResult.svalue); var arrOfObj$1 = function (objFields) { return arrOfObj(objFields); }; var arrOfVal = function () { return arrOf(_anyValue); }; var valueThunkOf = valueThunk; var valueOf = function (validator) { return value$1(function (v) { return validator(v).fold(SimpleResult.serror, SimpleResult.svalue); }); }; var setOf$1 = function (validator, prop) { return setOf(function (v) { return SimpleResult.fromResult(validator(v)); }, prop); }; var extract = function (label, prop, strength, obj) { var res = prop.extract([label], strength, obj); return SimpleResult.mapError(res, function (errs) { return { input: obj, errors: errs }; }); }; var asRaw = function (label, prop, obj) { return SimpleResult.toResult(extract(label, prop, identity, obj)); }; var getOrDie = function (extraction) { return extraction.fold(function (errInfo) { throw new Error(formatError(errInfo)); }, identity); }; var asRawOrDie = function (label, prop, obj) { return getOrDie(asRaw(label, prop, obj)); }; var formatError = function (errInfo) { return 'Errors: \n' + formatErrors(errInfo.errors).join('\n') + '\n\nInput object: ' + formatObj(errInfo.input); }; var chooseProcessor = function (key, branches) { return choose(key, branches); }; var choose$1 = function (key, branches) { return choose(key, map$2(branches, objOf)); }; var thunkOf = function (desc, schema) { return thunk(desc, schema); }; var anyValue$1 = constant(_anyValue); var typedValue = function (validator, expectedType) { return value$1(function (a) { var actualType = typeof a; return validator(a) ? SimpleResult.svalue(a) : SimpleResult.serror('Expected type: ' + expectedType + ' but got: ' + actualType); }); }; var number = typedValue(isNumber, 'number'); var string = typedValue(isString, 'string'); var boolean = typedValue(isBoolean, 'boolean'); var functionProcessor = typedValue(isFunction, 'function'); var isPostMessageable = function (val) { var every = function (iter, callbackFn) { var result = iter.next(); while (!result.done) { if (!callbackFn(result.value)) { return false; } result = iter.next(); } return true; }; if (Object(val) !== val) { return true; } switch ({}.toString.call(val).slice(8, -1)) { case 'Boolean': case 'Number': case 'String': case 'Date': case 'RegExp': case 'Blob': case 'FileList': case 'ImageData': case 'ImageBitmap': case 'ArrayBuffer': return true; case 'Array': case 'Object': return Object.keys(val).every(function (prop) { return isPostMessageable(val[prop]); }); case 'Map': return every(val.keys(), isPostMessageable) && every(val.values(), isPostMessageable); case 'Set': return every(val.keys(), isPostMessageable); default: return false; } }; var postMessageable = value$1(function (a) { return isPostMessageable(a) ? SimpleResult.svalue(a) : SimpleResult.serror('Expected value to be acceptable for sending via postMessage'); }); var validateEnum = function (values) { return valueOf(function (value) { return contains(values, value) ? Result.value(value) : Result.error('Unsupported value: "' + value + '", choose one of "' + values.join(', ') + '".'); }); }; var strict$1 = function (key) { return field(key, key, strict(), anyValue()); }; var strictOf = function (key, schema) { return field(key, key, strict(), schema); }; var strictNumber = function (key) { return strictOf(key, number); }; var strictString = function (key) { return strictOf(key, string); }; var strictStringEnum = function (key, values) { return field(key, key, strict(), validateEnum(values)); }; var strictBoolean = function (key) { return strictOf(key, boolean); }; var strictFunction = function (key) { return strictOf(key, functionProcessor); }; var forbid = function (key, message) { return field(key, key, asOption(), value$1(function (_v) { return SimpleResult.serror('The field: ' + key + ' is forbidden. ' + message); })); }; var strictObjOf = function (key, objSchema) { return field(key, key, strict(), objOf(objSchema)); }; var strictArrayOfObj = function (key, objFields) { return field(key, key, strict(), arrOfObj(objFields)); }; var strictArrayOf = function (key, schema) { return field(key, key, strict(), arrOf(schema)); }; var option = function (key) { return field(key, key, asOption(), anyValue()); }; var optionOf = function (key, schema) { return field(key, key, asOption(), schema); }; var optionNumber = function (key) { return optionOf(key, number); }; var optionString = function (key) { return optionOf(key, string); }; var optionFunction = function (key) { return optionOf(key, functionProcessor); }; var optionArrayOf = function (key, schema) { return optionOf(key, arrOf(schema)); }; var optionObjOf = function (key, objSchema) { return optionOf(key, objOf(objSchema)); }; var optionObjOfOnly = function (key, objSchema) { return optionOf(key, objOfOnly(objSchema)); }; var defaulted$1 = function (key, fallback) { return field(key, key, defaulted(fallback), anyValue()); }; var defaultedOf = function (key, fallback, schema) { return field(key, key, defaulted(fallback), schema); }; var defaultedNumber = function (key, fallback) { return defaultedOf(key, fallback, number); }; var defaultedString = function (key, fallback) { return defaultedOf(key, fallback, string); }; var defaultedStringEnum = function (key, fallback, values) { return defaultedOf(key, fallback, validateEnum(values)); }; var defaultedBoolean = function (key, fallback) { return defaultedOf(key, fallback, boolean); }; var defaultedFunction = function (key, fallback) { return defaultedOf(key, fallback, functionProcessor); }; var defaultedPostMsg = function (key, fallback) { return defaultedOf(key, fallback, postMessageable); }; var defaultedArrayOf = function (key, fallback, schema) { return defaultedOf(key, fallback, arrOf(schema)); }; var defaultedObjOf = function (key, fallback, objSchema) { return defaultedOf(key, fallback, objOf(objSchema)); }; var state$1 = function (okey, instantiator) { return state(okey, instantiator); }; var Cell = function (initial) { var value = initial; var get = function () { return value; }; var set = function (v) { value = v; }; return { get: get, set: set }; }; var fromHtml = function (html, scope) { var doc = scope || document; var div = doc.createElement('div'); div.innerHTML = html; if (!div.hasChildNodes() || div.childNodes.length > 1) { console.error('HTML does not have a single root node', html); throw new Error('HTML must have a single root node'); } return fromDom(div.childNodes[0]); }; var fromTag = function (tag, scope) { var doc = scope || document; var node = doc.createElement(tag); return fromDom(node); }; var fromText = function (text, scope) { var doc = scope || document; var node = doc.createTextNode(text); return fromDom(node); }; var fromDom = function (node) { if (node === null || node === undefined) { throw new Error('Node cannot be null or undefined'); } return { dom: node }; }; var fromPoint = function (docElm, x, y) { return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom); }; var SugarElement = { fromHtml: fromHtml, fromTag: fromTag, fromText: fromText, fromDom: fromDom, fromPoint: fromPoint }; var DeviceType = function (os, browser, userAgent, mediaMatch) { var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true; var isiPhone = os.isiOS() && !isiPad; var isMobile = os.isiOS() || os.isAndroid(); var isTouch = isMobile || mediaMatch('(pointer:coarse)'); var isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)'); var isPhone = isiPhone || isMobile && !isTablet; var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false; var isDesktop = !isPhone && !isTablet && !iOSwebview; return { isiPad: constant(isiPad), isiPhone: constant(isiPhone), isTablet: constant(isTablet), isPhone: constant(isPhone), isTouch: constant(isTouch), isAndroid: os.isAndroid, isiOS: os.isiOS, isWebView: constant(iOSwebview), isDesktop: constant(isDesktop) }; }; var firstMatch = function (regexes, s) { for (var i = 0; i < regexes.length; i++) { var x = regexes[i]; if (x.test(s)) { return x; } } return undefined; }; var find$2 = function (regexes, agent) { var r = firstMatch(regexes, agent); if (!r) { return { major: 0, minor: 0 }; } var group = function (i) { return Number(agent.replace(r, '$' + i)); }; return nu$1(group(1), group(2)); }; var detect = function (versionRegexes, agent) { var cleanedAgent = String(agent).toLowerCase(); if (versionRegexes.length === 0) { return unknown(); } return find$2(versionRegexes, cleanedAgent); }; var unknown = function () { return nu$1(0, 0); }; var nu$1 = function (major, minor) { return { major: major, minor: minor }; }; var Version = { nu: nu$1, detect: detect, unknown: unknown }; var detect$1 = function (candidates, userAgent) { var agent = String(userAgent).toLowerCase(); return find(candidates, function (candidate) { return candidate.search(agent); }); }; var detectBrowser = function (browsers, userAgent) { return detect$1(browsers, userAgent).map(function (browser) { var version = Version.detect(browser.versionRegexes, userAgent); return { current: browser.name, version: version }; }); }; var detectOs = function (oses, userAgent) { return detect$1(oses, userAgent).map(function (os) { var version = Version.detect(os.versionRegexes, userAgent); return { current: os.name, version: version }; }); }; var UaString = { detectBrowser: detectBrowser, detectOs: detectOs }; var checkRange = function (str, substr, start) { return substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr; }; var contains$1 = function (str, substr) { return str.indexOf(substr) !== -1; }; var endsWith = function (str, suffix) { return checkRange(str, suffix, str.length - suffix.length); }; var blank = function (r) { return function (s) { return s.replace(r, ''); }; }; var trim = blank(/^\s+|\s+$/g); var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/; var checkContains = function (target) { return function (uastring) { return contains$1(uastring, target); }; }; var browsers = [ { name: 'Edge', versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/], search: function (uastring) { return contains$1(uastring, 'edge/') && contains$1(uastring, 'chrome') && contains$1(uastring, 'safari') && contains$1(uastring, 'applewebkit'); } }, { name: 'Chrome', versionRegexes: [ /.*?chrome\/([0-9]+)\.([0-9]+).*/, normalVersionRegex ], search: function (uastring) { return contains$1(uastring, 'chrome') && !contains$1(uastring, 'chromeframe'); } }, { name: 'IE', versionRegexes: [ /.*?msie\ ?([0-9]+)\.([0-9]+).*/, /.*?rv:([0-9]+)\.([0-9]+).*/ ], search: function (uastring) { return contains$1(uastring, 'msie') || contains$1(uastring, 'trident'); } }, { name: 'Opera', versionRegexes: [ normalVersionRegex, /.*?opera\/([0-9]+)\.([0-9]+).*/ ], search: checkContains('opera') }, { name: 'Firefox', versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/], search: checkContains('firefox') }, { name: 'Safari', versionRegexes: [ normalVersionRegex, /.*?cpu os ([0-9]+)_([0-9]+).*/ ], search: function (uastring) { return (contains$1(uastring, 'safari') || contains$1(uastring, 'mobile/')) && contains$1(uastring, 'applewebkit'); } } ]; var oses = [ { name: 'Windows', search: checkContains('win'), versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/] }, { name: 'iOS', search: function (uastring) { return contains$1(uastring, 'iphone') || contains$1(uastring, 'ipad'); }, versionRegexes: [ /.*?version\/\ ?([0-9]+)\.([0-9]+).*/, /.*cpu os ([0-9]+)_([0-9]+).*/, /.*cpu iphone os ([0-9]+)_([0-9]+).*/ ] }, { name: 'Android', search: checkContains('android'), versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/] }, { name: 'OSX', search: checkContains('mac os x'), versionRegexes: [/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/] }, { name: 'Linux', search: checkContains('linux'), versionRegexes: [] }, { name: 'Solaris', search: checkContains('sunos'), versionRegexes: [] }, { name: 'FreeBSD', search: checkContains('freebsd'), versionRegexes: [] }, { name: 'ChromeOS', search: checkContains('cros'), versionRegexes: [/.*?chrome\/([0-9]+)\.([0-9]+).*/] } ]; var PlatformInfo = { browsers: constant(browsers), oses: constant(oses) }; var edge = 'Edge'; var chrome = 'Chrome'; var ie = 'IE'; var opera = 'Opera'; var firefox = 'Firefox'; var safari = 'Safari'; var unknown$1 = function () { return nu$2({ current: undefined, version: Version.unknown() }); }; var nu$2 = function (info) { var current = info.current; var version = info.version; var isBrowser = function (name) { return function () { return current === name; }; }; return { current: current, version: version, isEdge: isBrowser(edge), isChrome: isBrowser(chrome), isIE: isBrowser(ie), isOpera: isBrowser(opera), isFirefox: isBrowser(firefox), isSafari: isBrowser(safari) }; }; var Browser = { unknown: unknown$1, nu: nu$2, edge: constant(edge), chrome: constant(chrome), ie: constant(ie), opera: constant(opera), firefox: constant(firefox), safari: constant(safari) }; var windows = 'Windows'; var ios = 'iOS'; var android = 'Android'; var linux = 'Linux'; var osx = 'OSX'; var solaris = 'Solaris'; var freebsd = 'FreeBSD'; var chromeos = 'ChromeOS'; var unknown$2 = function () { return nu$3({ current: undefined, version: Version.unknown() }); }; var nu$3 = function (info) { var current = info.current; var version = info.version; var isOS = function (name) { return function () { return current === name; }; }; return { current: current, version: version, isWindows: isOS(windows), isiOS: isOS(ios), isAndroid: isOS(android), isOSX: isOS(osx), isLinux: isOS(linux), isSolaris: isOS(solaris), isFreeBSD: isOS(freebsd), isChromeOS: isOS(chromeos) }; }; var OperatingSystem = { unknown: unknown$2, nu: nu$3, windows: constant(windows), ios: constant(ios), android: constant(android), linux: constant(linux), osx: constant(osx), solaris: constant(solaris), freebsd: constant(freebsd), chromeos: constant(chromeos) }; var detect$2 = function (userAgent, mediaMatch) { var browsers = PlatformInfo.browsers(); var oses = PlatformInfo.oses(); var browser = UaString.detectBrowser(browsers, userAgent).fold(Browser.unknown, Browser.nu); var os = UaString.detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu); var deviceType = DeviceType(os, browser, userAgent, mediaMatch); return { browser: browser, os: os, deviceType: deviceType }; }; var PlatformDetection = { detect: detect$2 }; var mediaMatch = function (query) { return window.matchMedia(query).matches; }; var platform = cached(function () { return PlatformDetection.detect(navigator.userAgent, mediaMatch); }); var detect$3 = function () { return platform(); }; var compareDocumentPosition = function (a, b, match) { return (a.compareDocumentPosition(b) & match) !== 0; }; var documentPositionContainedBy = function (a, b) { return compareDocumentPosition(a, b, Node.DOCUMENT_POSITION_CONTAINED_BY); }; var DOCUMENT = 9; var DOCUMENT_FRAGMENT = 11; var ELEMENT = 1; var TEXT = 3; var is = function (element, selector) { var dom = element.dom; if (dom.nodeType !== ELEMENT) { return false; } else { var elem = dom; if (elem.matches !== undefined) { return elem.matches(selector); } else if (elem.msMatchesSelector !== undefined) { return elem.msMatchesSelector(selector); } else if (elem.webkitMatchesSelector !== undefined) { return elem.webkitMatchesSelector(selector); } else if (elem.mozMatchesSelector !== undefined) { return elem.mozMatchesSelector(selector); } else { throw new Error('Browser lacks native selectors'); } } }; var bypassSelector = function (dom) { return dom.nodeType !== ELEMENT && dom.nodeType !== DOCUMENT && dom.nodeType !== DOCUMENT_FRAGMENT || dom.childElementCount === 0; }; var all = function (selector, scope) { var base = scope === undefined ? document : scope.dom; return bypassSelector(base) ? [] : map(base.querySelectorAll(selector), SugarElement.fromDom); }; var one = function (selector, scope) { var base = scope === undefined ? document : scope.dom; return bypassSelector(base) ? Optional.none() : Optional.from(base.querySelector(selector)).map(SugarElement.fromDom); }; var eq$1 = function (e1, e2) { return e1.dom === e2.dom; }; var regularContains = function (e1, e2) { var d1 = e1.dom; var d2 = e2.dom; return d1 === d2 ? false : d1.contains(d2); }; var ieContains = function (e1, e2) { return documentPositionContainedBy(e1.dom, e2.dom); }; var contains$2 = function (e1, e2) { return detect$3().browser.isIE() ? ieContains(e1, e2) : regularContains(e1, e2); }; var ensureIsRoot = function (isRoot) { return isFunction(isRoot) ? isRoot : never; }; var ancestor = function (scope, transform, isRoot) { var element = scope.dom; var stop = ensureIsRoot(isRoot); while (element.parentNode) { element = element.parentNode; var el = SugarElement.fromDom(element); var transformed = transform(el); if (transformed.isSome()) { return transformed; } else if (stop(el)) { break; } } return Optional.none(); }; var closest = function (scope, transform, isRoot) { var current = transform(scope); var stop = ensureIsRoot(isRoot); return current.orThunk(function () { return stop(scope) ? Optional.none() : ancestor(scope, transform, stop); }); }; var isSource = function (component, simulatedEvent) { return eq$1(component.element, simulatedEvent.event.target); }; var nu$4 = function (parts) { if (!hasNonNullableKey(parts, 'can') && !hasNonNullableKey(parts, 'abort') && !hasNonNullableKey(parts, 'run')) { throw new Error('EventHandler defined by: ' + JSON.stringify(parts, null, 2) + ' does not have can, abort, or run!'); } return asRawOrDie('Extracting event.handler', objOfOnly([ defaulted$1('can', always), defaulted$1('abort', never), defaulted$1('run', noop) ]), parts); }; var all$1 = function (handlers, f) { return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } return foldl(handlers, function (acc, handler) { return acc && f(handler).apply(undefined, args); }, true); }; }; var any = function (handlers, f) { return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } return foldl(handlers, function (acc, handler) { return acc || f(handler).apply(undefined, args); }, false); }; }; var read = function (handler) { return isFunction(handler) ? { can: always, abort: never, run: handler } : handler; }; var fuse = function (handlers) { var can = all$1(handlers, function (handler) { return handler.can; }); var abort = any(handlers, function (handler) { return handler.abort; }); var run = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } each(handlers, function (handler) { handler.run.apply(undefined, args); }); }; return nu$4({ can: can, abort: abort, run: run }); }; var constant$1 = constant; var touchstart = constant$1('touchstart'); var touchmove = constant$1('touchmove'); var touchend = constant$1('touchend'); var touchcancel = constant$1('touchcancel'); var mousedown = constant$1('mousedown'); var mousemove = constant$1('mousemove'); var mouseout = constant$1('mouseout'); var mouseup = constant$1('mouseup'); var mouseover = constant$1('mouseover'); var focusin = constant$1('focusin'); var focusout = constant$1('focusout'); var keydown = constant$1('keydown'); var keyup = constant$1('keyup'); var input = constant$1('input'); var change = constant$1('change'); var click = constant$1('click'); var transitionend = constant$1('transitionend'); var selectstart = constant$1('selectstart'); var prefixName = function (name) { return constant('alloy.' + name); }; var alloy = { tap: prefixName('tap') }; var focus = prefixName('focus'); var postBlur = prefixName('blur.post'); var postPaste = prefixName('paste.post'); var receive = prefixName('receive'); var execute = prefixName('execute'); var focusItem = prefixName('focus.item'); var tap = alloy.tap; var longpress = prefixName('longpress'); var sandboxClose = prefixName('sandbox.close'); var typeaheadCancel = prefixName('typeahead.cancel'); var systemInit = prefixName('system.init'); var documentTouchmove = prefixName('system.touchmove'); var documentTouchend = prefixName('system.touchend'); var windowScroll = prefixName('system.scroll'); var windowResize = prefixName('system.resize'); var attachedToDom = prefixName('system.attached'); var detachedFromDom = prefixName('system.detached'); var dismissRequested = prefixName('system.dismissRequested'); var repositionRequested = prefixName('system.repositionRequested'); var focusShifted = prefixName('focusmanager.shifted'); var slotVisibility = prefixName('slotcontainer.visibility'); var changeTab = prefixName('change.tab'); var dismissTab = prefixName('dismiss.tab'); var highlight = prefixName('highlight'); var dehighlight = prefixName('dehighlight'); var emit = function (component, event) { dispatchWith(component, component.element, event, {}); }; var emitWith = function (component, event, properties) { dispatchWith(component, component.element, event, properties); }; var emitExecute = function (component) { emit(component, execute()); }; var dispatch = function (component, target, event) { dispatchWith(component, target, event, {}); }; var dispatchWith = function (component, target, event, properties) { var data = __assign({ target: target }, properties); component.getSystem().triggerEvent(event, target, data); }; var dispatchEvent = function (component, target, event, simulatedEvent) { component.getSystem().triggerEvent(event, target, simulatedEvent.event); }; var derive = function (configs) { return wrapAll$1(configs); }; var abort = function (name, predicate) { return { key: name, value: nu$4({ abort: predicate }) }; }; var can = function (name, predicate) { return { key: name, value: nu$4({ can: predicate }) }; }; var preventDefault = function (name) { return { key: name, value: nu$4({ run: function (component, simulatedEvent) { simulatedEvent.event.prevent(); } }) }; }; var run = function (name, handler) { return { key: name, value: nu$4({ run: handler }) }; }; var runActionExtra = function (name, action, extra) { return { key: name, value: nu$4({ run: function (component, simulatedEvent) { action.apply(undefined, [ component, simulatedEvent ].concat(extra)); } }) }; }; var runOnName = function (name) { return function (handler) { return run(name, handler); }; }; var runOnSourceName = function (name) { return function (handler) { return { key: name, value: nu$4({ run: function (component, simulatedEvent) { if (isSource(component, simulatedEvent)) { handler(component, simulatedEvent); } } }) }; }; }; var redirectToUid = function (name, uid) { return run(name, function (component, simulatedEvent) { component.getSystem().getByUid(uid).each(function (redirectee) { dispatchEvent(redirectee, redirectee.element, name, simulatedEvent); }); }); }; var redirectToPart = function (name, detail, partName) { var uid = detail.partUids[partName]; return redirectToUid(name, uid); }; var runWithTarget = function (name, f) { return run(name, function (component, simulatedEvent) { var ev = simulatedEvent.event; var target = component.getSystem().getByDom(ev.target).fold(function () { var closest$1 = closest(ev.target, function (el) { return component.getSystem().getByDom(el).toOptional(); }, never); return closest$1.getOr(component); }, function (c) { return c; }); f(component, target, simulatedEvent); }); }; var cutter = function (name) { return run(name, function (component, simulatedEvent) { simulatedEvent.cut(); }); }; var stopper = function (name) { return run(name, function (component, simulatedEvent) { simulatedEvent.stop(); }); }; var runOnSource = function (name, f) { return runOnSourceName(name)(f); }; var runOnAttached = runOnSourceName(attachedToDom()); var runOnDetached = runOnSourceName(detachedFromDom()); var runOnInit = runOnSourceName(systemInit()); var runOnExecute = runOnName(execute()); var Global = typeof window !== 'undefined' ? window : Function('return this;')(); var name = function (element) { var r = element.dom.nodeName; return r.toLowerCase(); }; var type = function (element) { return element.dom.nodeType; }; var isType$1 = function (t) { return function (element) { return type(element) === t; }; }; var isElement = isType$1(ELEMENT); var isText = isType$1(TEXT); var isDocument = isType$1(DOCUMENT); var isDocumentFragment = isType$1(DOCUMENT_FRAGMENT); var owner = function (element) { return SugarElement.fromDom(element.dom.ownerDocument); }; var documentOrOwner = function (dos) { return isDocument(dos) ? dos : owner(dos); }; var documentElement = function (element) { return SugarElement.fromDom(documentOrOwner(element).dom.documentElement); }; var defaultView = function (element) { return SugarElement.fromDom(documentOrOwner(element).dom.defaultView); }; var parent = function (element) { return Optional.from(element.dom.parentNode).map(SugarElement.fromDom); }; var parentNode = function (element) { return parent(element); }; var offsetParent = function (element) { return Optional.from(element.dom.offsetParent).map(SugarElement.fromDom); }; var nextSibling = function (element) { return Optional.from(element.dom.nextSibling).map(SugarElement.fromDom); }; var children = function (element) { return map(element.dom.childNodes, SugarElement.fromDom); }; var child = function (element, index) { var cs = element.dom.childNodes; return Optional.from(cs[index]).map(SugarElement.fromDom); }; var firstChild = function (element) { return child(element, 0); }; var isShadowRoot = function (dos) { return isDocumentFragment(dos) && isNonNullable(dos.dom.host); }; var supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode); var isSupported = constant(supported); var getRootNode = supported ? function (e) { return SugarElement.fromDom(e.dom.getRootNode()); } : documentOrOwner; var getContentContainer = function (dos) { return isShadowRoot(dos) ? dos : SugarElement.fromDom(documentOrOwner(dos).dom.body); }; var isInShadowRoot = function (e) { return getShadowRoot(e).isSome(); }; var getShadowRoot = function (e) { var r = getRootNode(e); return isShadowRoot(r) ? Optional.some(r) : Optional.none(); }; var getShadowHost = function (e) { return SugarElement.fromDom(e.dom.host); }; var getOriginalEventTarget = function (event) { if (isSupported() && isNonNullable(event.target)) { var el = SugarElement.fromDom(event.target); if (isElement(el) && isOpenShadowHost(el)) { if (event.composed && event.composedPath) { var composedPath = event.composedPath(); if (composedPath) { return head(composedPath); } } } } return Optional.from(event.target); }; var isOpenShadowHost = function (element) { return isNonNullable(element.dom.shadowRoot); }; var before = function (marker, element) { var parent$1 = parent(marker); parent$1.each(function (v) { v.dom.insertBefore(element.dom, marker.dom); }); }; var after = function (marker, element) { var sibling = nextSibling(marker); sibling.fold(function () { var parent$1 = parent(marker); parent$1.each(function (v) { append(v, element); }); }, function (v) { before(v, element); }); }; var prepend = function (parent, element) { var firstChild$1 = firstChild(parent); firstChild$1.fold(function () { append(parent, element); }, function (v) { parent.dom.insertBefore(element.dom, v.dom); }); }; var append = function (parent, element) { parent.dom.appendChild(element.dom); }; var appendAt = function (parent, element, index) { child(parent, index).fold(function () { append(parent, element); }, function (v) { before(v, element); }); }; var before$1 = function (marker, elements) { each(elements, function (x) { before(marker, x); }); }; var append$1 = function (parent, elements) { each(elements, function (x) { append(parent, x); }); }; var empty = function (element) { element.dom.textContent = ''; each(children(element), function (rogue) { remove(rogue); }); }; var remove = function (element) { var dom = element.dom; if (dom.parentNode !== null) { dom.parentNode.removeChild(dom); } }; var unwrap = function (wrapper) { var children$1 = children(wrapper); if (children$1.length > 0) { before$1(wrapper, children$1); } remove(wrapper); }; var fromHtml$1 = function (html, scope) { var doc = scope || document; var div = doc.createElement('div'); div.innerHTML = html; return children(SugarElement.fromDom(div)); }; var get$2 = function (element) { return element.dom.innerHTML; }; var set = function (element, content) { var owner$1 = owner(element); var docDom = owner$1.dom; var fragment = SugarElement.fromDom(docDom.createDocumentFragment()); var contentElements = fromHtml$1(content, docDom); append$1(fragment, contentElements); empty(element); append(element, fragment); }; var getOuter = function (element) { var container = SugarElement.fromTag('div'); var clone = SugarElement.fromDom(element.dom.cloneNode(true)); append(container, clone); return get$2(container); }; var rawSet = function (dom, key, value) { if (isString(value) || isBoolean(value) || isNumber(value)) { dom.setAttribute(key, value + ''); } else { console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom); throw new Error('Attribute value was not simple'); } }; var set$1 = function (element, key, value) { rawSet(element.dom, key, value); }; var setAll = function (element, attrs) { var dom = element.dom; each$1(attrs, function (v, k) { rawSet(dom, k, v); }); }; var get$3 = function (element, key) { var v = element.dom.getAttribute(key); return v === null ? undefined : v; }; var getOpt = function (element, key) { return Optional.from(get$3(element, key)); }; var has$1 = function (element, key) { var dom = element.dom; return dom && dom.hasAttribute ? dom.hasAttribute(key) : false; }; var remove$1 = function (element, key) { element.dom.removeAttribute(key); }; var clone = function (original, isDeep) { return SugarElement.fromDom(original.dom.cloneNode(isDeep)); }; var shallow$1 = function (original) { return clone(original, false); }; var getHtml = function (element) { if (isShadowRoot(element)) { return '#shadow-root'; } else { var clone = shallow$1(element); return getOuter(clone); } }; var element = function (elem) { return getHtml(elem); }; var isRecursive = function (component, originator, target) { return eq$1(originator, component.element) && !eq$1(originator, target); }; var events = derive([can(focus(), function (component, simulatedEvent) { var event = simulatedEvent.event; var originator = event.originator; var target = event.target; if (isRecursive(component, originator, target)) { console.warn(focus() + ' did not get interpreted by the desired target. ' + '\nOriginator: ' + element(originator) + '\nTarget: ' + element(target) + '\nCheck the ' + focus() + ' event handlers'); return false; } else { return true; } })]); var DefaultEvents = /*#__PURE__*/Object.freeze({ __proto__: null, events: events }); var unique = 0; var generate$1 = function (prefix) { var date = new Date(); var time = date.getTime(); var random = Math.floor(Math.random() * 1000000000); unique++; return prefix + '_' + random + unique + String(time); }; var prefix = constant('alloy-id-'); var idAttr = constant('data-alloy-id'); var prefix$1 = prefix(); var idAttr$1 = idAttr(); var write = function (label, elem) { var id = generate$1(prefix$1 + label); writeOnly(elem, id); return id; }; var writeOnly = function (elem, uid) { Object.defineProperty(elem.dom, idAttr$1, { value: uid, writable: true }); }; var read$1 = function (elem) { var id = isElement(elem) ? elem.dom[idAttr$1] : null; return Optional.from(id); }; var generate$2 = function (prefix) { return generate$1(prefix); }; var make = identity; var NoContextApi = function (getComp) { var fail = function (event) { return function () { throw new Error('The component must be in a context to send: ' + event + (getComp ? '\n' + element(getComp().element) + ' is not in context.' : '')); }; }; return { debugInfo: constant('fake'), triggerEvent: fail('triggerEvent'), triggerFocus: fail('triggerFocus'), triggerEscape: fail('triggerEscape'), build: fail('build'), addToWorld: fail('addToWorld'), removeFromWorld: fail('removeFromWorld'), addToGui: fail('addToGui'), removeFromGui: fail('removeFromGui'), getByUid: fail('getByUid'), getByDom: fail('getByDom'), broadcast: fail('broadcast'), broadcastOn: fail('broadcastOn'), broadcastEvent: fail('broadcastEvent'), isConnected: never }; }; var singleton = NoContextApi(); var markAsBehaviourApi = function (f, apiName, apiFunction) { var delegate = apiFunction.toString(); var endIndex = delegate.indexOf(')') + 1; var openBracketIndex = delegate.indexOf('('); var parameters = delegate.substring(openBracketIndex + 1, endIndex - 1).split(/,\s*/); f.toFunctionAnnotation = function () { return { name: apiName, parameters: cleanParameters(parameters.slice(0, 1).concat(parameters.slice(3))) }; }; return f; }; var cleanParameters = function (parameters) { return map(parameters, function (p) { return endsWith(p, '/*') ? p.substring(0, p.length - '/*'.length) : p; }); }; var markAsExtraApi = function (f, extraName) { var delegate = f.toString(); var endIndex = delegate.indexOf(')') + 1; var openBracketIndex = delegate.indexOf('('); var parameters = delegate.substring(openBracketIndex + 1, endIndex - 1).split(/,\s*/); f.toFunctionAnnotation = function () { return { name: extraName, parameters: cleanParameters(parameters) }; }; return f; }; var markAsSketchApi = function (f, apiFunction) { var delegate = apiFunction.toString(); var endIndex = delegate.indexOf(')') + 1; var openBracketIndex = delegate.indexOf('('); var parameters = delegate.substring(openBracketIndex + 1, endIndex - 1).split(/,\s*/); f.toFunctionAnnotation = function () { return { name: 'OVERRIDE', parameters: cleanParameters(parameters.slice(1)) }; }; return f; }; var premadeTag = generate$1('alloy-premade'); var premade = function (comp) { return wrap$1(premadeTag, comp); }; var getPremade = function (spec) { return get$1(spec, premadeTag); }; var makeApi = function (f) { return markAsSketchApi(function (component) { var rest = []; for (var _i = 1; _i < arguments.length; _i++) { rest[_i - 1] = arguments[_i]; } return f.apply(void 0, __spreadArrays([ component.getApis(), component ], rest)); }, f); }; var NoState = { init: function () { return nu$5({ readState: function () { return 'No State required'; } }); } }; var nu$5 = function (spec) { return spec; }; var generateFrom = function (spec, all) { var schema = map(all, function (a) { return optionObjOf(a.name(), [ strict$1('config'), defaulted$1('state', NoState) ]); }); var validated = asRaw('component.behaviours', objOf(schema), spec.behaviours).fold(function (errInfo) { throw new Error(formatError(errInfo) + '\nComplete spec:\n' + JSON.stringify(spec, null, 2)); }, function (v) { return v; }); return { list: all, data: map$2(validated, function (optBlobThunk) { var output = optBlobThunk.map(function (blob) { return { config: blob.config, state: blob.state.init(blob.config) }; }); return function () { return output; }; }) }; }; var getBehaviours = function (bData) { return bData.list; }; var getData = function (bData) { return bData.data; }; var byInnerKey = function (data, tuple) { var r = {}; each$1(data, function (detail, key) { each$1(detail, function (value, indexKey) { var chain = get$1(r, indexKey).getOr([]); r[indexKey] = chain.concat([tuple(key, value)]); }); }); return r; }; var nu$6 = function (s) { return { classes: s.classes !== undefined ? s.classes : [], attributes: s.attributes !== undefined ? s.attributes : {}, styles: s.styles !== undefined ? s.styles : {} }; }; var merge$1 = function (defnA, mod) { return __assign(__assign({}, defnA), { attributes: __assign(__assign({}, defnA.attributes), mod.attributes), styles: __assign(__assign({}, defnA.styles), mod.styles), classes: defnA.classes.concat(mod.classes) }); }; var combine = function (info, baseMod, behaviours, base) { var modsByBehaviour = __assign({}, baseMod); each(behaviours, function (behaviour) { modsByBehaviour[behaviour.name()] = behaviour.exhibit(info, base); }); var byAspect = byInnerKey(modsByBehaviour, function (name, modification) { return { name: name, modification: modification }; }); var combineObjects = function (objects) { return foldr(objects, function (b, a) { return __assign(__assign({}, a.modification), b); }, {}); }; var combinedClasses = foldr(byAspect.classes, function (b, a) { return a.modification.concat(b); }, []); var combinedAttributes = combineObjects(byAspect.attributes); var combinedStyles = combineObjects(byAspect.styles); return nu$6({ classes: combinedClasses, attributes: combinedAttributes, styles: combinedStyles }); }; var sortKeys = function (label, keyName, array, order) { try { var sorted = sort(array, function (a, b) { var aKey = a[keyName]; var bKey = b[keyName]; var aIndex = order.indexOf(aKey); var bIndex = order.indexOf(bKey); if (aIndex === -1) { throw new Error('The ordering for ' + label + ' does not have an entry for ' + aKey + '.\nOrder specified: ' + JSON.stringify(order, null, 2)); } if (bIndex === -1) { throw new Error('The ordering for ' + label + ' does not have an entry for ' + bKey + '.\nOrder specified: ' + JSON.stringify(order, null, 2)); } if (aIndex < bIndex) { return -1; } else if (bIndex < aIndex) { return 1; } else { return 0; } }); return Result.value(sorted); } catch (err) { return Result.error([err]); } }; var uncurried = function (handler, purpose) { return { handler: handler, purpose: purpose }; }; var curried = function (handler, purpose) { return { cHandler: handler, purpose: purpose }; }; var curryArgs = function (descHandler, extraArgs) { return curried(curry.apply(undefined, [descHandler.handler].concat(extraArgs)), descHandler.purpose); }; var getCurried = function (descHandler) { return descHandler.cHandler; }; var behaviourTuple = function (name, handler) { return { name: name, handler: handler }; }; var nameToHandlers = function (behaviours, info) { var r = {}; each(behaviours, function (behaviour) { r[behaviour.name()] = behaviour.handlers(info); }); return r; }; var groupByEvents = function (info, behaviours, base) { var behaviourEvents = __assign(__assign({}, base), nameToHandlers(behaviours, info)); return byInnerKey(behaviourEvents, behaviourTuple); }; var combine$1 = function (info, eventOrder, behaviours, base) { var byEventName = groupByEvents(info, behaviours, base); return combineGroups(byEventName, eventOrder); }; var assemble = function (rawHandler) { var handler = read(rawHandler); return function (component, simulatedEvent) { var rest = []; for (var _i = 2; _i < arguments.length; _i++) { rest[_i - 2] = arguments[_i]; } var args = [ component, simulatedEvent ].concat(rest); if (handler.abort.apply(undefined, args)) { simulatedEvent.stop(); } else if (handler.can.apply(undefined, args)) { handler.run.apply(undefined, args); } }; }; var missingOrderError = function (eventName, tuples) { return Result.error(['The event (' + eventName + ') has more than one behaviour that listens to it.\nWhen this occurs, you must ' + 'specify an event ordering for the behaviours in your spec (e.g. [ "listing", "toggling" ]).\nThe behaviours that ' + 'can trigger it are: ' + JSON.stringify(map(tuples, function (c) { return c.name; }), null, 2)]); }; var fuse$1 = function (tuples, eventOrder, eventName) { var order = eventOrder[eventName]; if (!order) { return missingOrderError(eventName, tuples); } else { return sortKeys('Event: ' + eventName, 'name', tuples, order).map(function (sortedTuples) { var handlers = map(sortedTuples, function (tuple) { return tuple.handler; }); return fuse(handlers); }); } }; var combineGroups = function (byEventName, eventOrder) { var r = mapToArray(byEventName, function (tuples, eventName) { var combined = tuples.length === 1 ? Result.value(tuples[0].handler) : fuse$1(tuples, eventOrder, eventName); return combined.map(function (handler) { var assembled = assemble(handler); var purpose = tuples.length > 1 ? filter(eventOrder[eventName], function (o) { return exists(tuples, function (t) { return t.name === o; }); }).join(' > ') : tuples[0].name; return wrap$1(eventName, uncurried(assembled, purpose)); }); }); return consolidate(r, {}); }; var baseBehaviour = 'alloy.base.behaviour'; var toInfo = function (spec) { var _a; return asRaw('custom.definition', objOf([ field('dom', 'dom', strict(), objOf([ strict$1('tag'), defaulted$1('styles', {}), defaulted$1('classes', []), defaulted$1('attributes', {}), option('value'), option('innerHtml') ])), strict$1('components'), strict$1('uid'), defaulted$1('events', {}), defaulted$1('apis', {}), field('eventOrder', 'eventOrder', mergeWith((_a = {}, _a[execute()] = [ 'disabling', baseBehaviour, 'toggling', 'typeaheadevents' ], _a[focus()] = [ baseBehaviour, 'focusing', 'keying' ], _a[systemInit()] = [ baseBehaviour, 'disabling', 'toggling', 'representing' ], _a[input()] = [ baseBehaviour, 'representing', 'streaming', 'invalidating' ], _a[detachedFromDom()] = [ baseBehaviour, 'representing', 'item-events', 'tooltipping' ], _a[mousedown()] = [ 'focusing', baseBehaviour, 'item-type-events' ], _a[touchstart()] = [ 'focusing', baseBehaviour, 'item-type-events' ], _a[mouseover()] = [ 'item-type-events', 'tooltipping' ], _a[receive()] = [ 'receiving', 'reflecting', 'tooltipping' ], _a)), anyValue$1()), option('domModification') ]), spec); }; var toDefinition = function (detail) { return __assign(__assign({}, detail.dom), { uid: detail.uid, domChildren: map(detail.components, function (comp) { return comp.element; }) }); }; var toModification = function (detail) { return detail.domModification.fold(function () { return nu$6({}); }, nu$6); }; var toEvents = function (info) { return info.events; }; var read$2 = function (element, attr) { var value = get$3(element, attr); return value === undefined || value === '' ? [] : value.split(' '); }; var add = function (element, attr, id) { var old = read$2(element, attr); var nu = old.concat([id]); set$1(element, attr, nu.join(' ')); return true; }; var remove$2 = function (element, attr, id) { var nu = filter(read$2(element, attr), function (v) { return v !== id; }); if (nu.length > 0) { set$1(element, attr, nu.join(' ')); } else { remove$1(element, attr); } return false; }; var supports = function (element) { return element.dom.classList !== undefined; }; var get$4 = function (element) { return read$2(element, 'class'); }; var add$1 = function (element, clazz) { return add(element, 'class', clazz); }; var remove$3 = function (element, clazz) { return remove$2(element, 'class', clazz); }; var add$2 = function (element, clazz) { if (supports(element)) { element.dom.classList.add(clazz); } else { add$1(element, clazz); } }; var cleanClass = function (element) { var classList = supports(element) ? element.dom.classList : get$4(element); if (classList.length === 0) { remove$1(element, 'class'); } }; var remove$4 = function (element, clazz) { if (supports(element)) { var classList = element.dom.classList; classList.remove(clazz); } else { remove$3(element, clazz); } cleanClass(element); }; var has$2 = function (element, clazz) { return supports(element) && element.dom.classList.contains(clazz); }; var add$3 = function (element, classes) { each(classes, function (x) { add$2(element, x); }); }; var remove$5 = function (element, classes) { each(classes, function (x) { remove$4(element, x); }); }; var isSupported$1 = function (dom) { return dom.style !== undefined && isFunction(dom.style.getPropertyValue); }; var inBody = function (element) { var dom = isText(element) ? element.dom.parentNode : element.dom; if (dom === undefined || dom === null || dom.ownerDocument === null) { return false; } var doc = dom.ownerDocument; return getShadowRoot(SugarElement.fromDom(dom)).fold(function () { return doc.body.contains(dom); }, compose1(inBody, getShadowHost)); }; var body = function () { return getBody(SugarElement.fromDom(document)); }; var getBody = function (doc) { var b = doc.dom.body; if (b === null || b === undefined) { throw new Error('Body is not available yet'); } return SugarElement.fromDom(b); }; var internalSet = function (dom, property, value) { if (!isString(value)) { console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom); throw new Error('CSS value must be a string: ' + value); } if (isSupported$1(dom)) { dom.style.setProperty(property, value); } }; var internalRemove = function (dom, property) { if (isSupported$1(dom)) { dom.style.removeProperty(property); } }; var set$2 = function (element, property, value) { var dom = element.dom; internalSet(dom, property, value); }; var setAll$1 = function (element, css) { var dom = element.dom; each$1(css, function (v, k) { internalSet(dom, k, v); }); }; var setOptions = function (element, css) { var dom = element.dom; each$1(css, function (v, k) { v.fold(function () { internalRemove(dom, k); }, function (value) { internalSet(dom, k, value); }); }); }; var get$5 = function (element, property) { var dom = element.dom; var styles = window.getComputedStyle(dom); var r = styles.getPropertyValue(property); return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r; }; var getUnsafeProperty = function (dom, property) { return isSupported$1(dom) ? dom.style.getPropertyValue(property) : ''; }; var getRaw = function (element, property) { var dom = element.dom; var raw = getUnsafeProperty(dom, property); return Optional.from(raw).filter(function (r) { return r.length > 0; }); }; var getAllRaw = function (element) { var css = {}; var dom = element.dom; if (isSupported$1(dom)) { for (var i = 0; i < dom.style.length; i++) { var ruleName = dom.style.item(i); css[ruleName] = dom.style[ruleName]; } } return css; }; var isValidValue = function (tag, property, value) { var element = SugarElement.fromTag(tag); set$2(element, property, value); var style = getRaw(element, property); return style.isSome(); }; var remove$6 = function (element, property) { var dom = element.dom; internalRemove(dom, property); if (getOpt(element, 'style').map(trim).is('')) { remove$1(element, 'style'); } }; var reflow = function (e) { return e.dom.offsetWidth; }; var get$6 = function (element) { return element.dom.value; }; var set$3 = function (element, value) { if (value === undefined) { throw new Error('Value.set was undefined'); } element.dom.value = value; }; var renderToDom = function (definition) { var subject = SugarElement.fromTag(definition.tag); setAll(subject, definition.attributes); add$3(subject, definition.classes); setAll$1(subject, definition.styles); definition.innerHtml.each(function (html) { return set(subject, html); }); var children = definition.domChildren; append$1(subject, children); definition.value.each(function (value) { set$3(subject, value); }); if (!definition.uid) { debugger; } writeOnly(subject, definition.uid); return subject; }; var getBehaviours$1 = function (spec) { var behaviours = get$1(spec, 'behaviours').getOr({}); var keys$1 = filter(keys(behaviours), function (k) { return behaviours[k] !== undefined; }); return map(keys$1, function (k) { return behaviours[k].me; }); }; var generateFrom$1 = function (spec, all) { return generateFrom(spec, all); }; var generate$3 = function (spec) { var all = getBehaviours$1(spec); return generateFrom$1(spec, all); }; var getDomDefinition = function (info, bList, bData) { var definition = toDefinition(info); var infoModification = toModification(info); var baseModification = { 'alloy.base.modification': infoModification }; var modification = bList.length > 0 ? combine(bData, baseModification, bList, definition) : infoModification; return merge$1(definition, modification); }; var getEvents = function (info, bList, bData) { var baseEvents = { 'alloy.base.behaviour': toEvents(info) }; return combine$1(bData, info.eventOrder, bList, baseEvents).getOrDie(); }; var build = function (spec) { var getMe = function () { return me; }; var systemApi = Cell(singleton); var info = getOrDie(toInfo(spec)); var bBlob = generate$3(spec); var bList = getBehaviours(bBlob); var bData = getData(bBlob); var modDefinition = getDomDefinition(info, bList, bData); var item = renderToDom(modDefinition); var events = getEvents(info, bList, bData); var subcomponents = Cell(info.components); var connect = function (newApi) { systemApi.set(newApi); }; var disconnect = function () { systemApi.set(NoContextApi(getMe)); }; var syncComponents = function () { var children$1 = children(item); var subs = bind(children$1, function (child) { return systemApi.get().getByDom(child).fold(function () { return []; }, function (c) { return [c]; }); }); subcomponents.set(subs); }; var config = function (behaviour) { var b = bData; var f = isFunction(b[behaviour.name()]) ? b[behaviour.name()] : function () { throw new Error('Could not find ' + behaviour.name() + ' in ' + JSON.stringify(spec, null, 2)); }; return f(); }; var hasConfigured = function (behaviour) { return isFunction(bData[behaviour.name()]); }; var getApis = function () { return info.apis; }; var readState = function (behaviourName) { return bData[behaviourName]().map(function (b) { return b.state.readState(); }).getOr('not enabled'); }; var me = { getSystem: systemApi.get, config: config, hasConfigured: hasConfigured, spec: spec, readState: readState, getApis: getApis, connect: connect, disconnect: disconnect, element: item, syncComponents: syncComponents, components: subcomponents.get, events: events }; return me; }; var buildSubcomponents = function (spec) { var components = get$1(spec, 'components').getOr([]); return map(components, build$1); }; var buildFromSpec = function (userSpec) { var _a = make(userSpec), specEvents = _a.events, spec = __rest(_a, ['events']); var components = buildSubcomponents(spec); var completeSpec = __assign(__assign({}, spec), { events: __assign(__assign({}, DefaultEvents), specEvents), components: components }); return Result.value(build(completeSpec)); }; var text = function (textContent) { var element = SugarElement.fromText(textContent); return external({ element: element }); }; var external = function (spec) { var extSpec = asRawOrDie('external.component', objOfOnly([ strict$1('element'), option('uid') ]), spec); var systemApi = Cell(NoContextApi()); var connect = function (newApi) { systemApi.set(newApi); }; var disconnect = function () { systemApi.set(NoContextApi(function () { return me; })); }; extSpec.uid.each(function (uid) { writeOnly(extSpec.element, uid); }); var me = { getSystem: systemApi.get, config: Optional.none, hasConfigured: never, connect: connect, disconnect: disconnect, getApis: function () { return {}; }, element: extSpec.element, spec: spec, readState: constant('No state'), syncComponents: noop, components: constant([]), events: {} }; return premade(me); }; var uids = generate$2; var build$1 = function (spec) { return getPremade(spec).fold(function () { var userSpecWithUid = spec.hasOwnProperty('uid') ? spec : __assign({ uid: uids('') }, spec); return buildFromSpec(userSpecWithUid).getOrDie(); }, function (prebuilt) { return prebuilt; }); }; var premade$1 = premade; var Dimension = function (name, getOffset) { var set = function (element, h) { if (!isNumber(h) && !h.match(/^[0-9]+$/)) { throw new Error(name + '.set accepts only positive integer values. Value was ' + h); } var dom = element.dom; if (isSupported$1(dom)) { dom.style[name] = h + 'px'; } }; var get = function (element) { var r = getOffset(element); if (r <= 0 || r === null) { var css = get$5(element, name); return parseFloat(css) || 0; } return r; }; var getOuter = get; var aggregate = function (element, properties) { return foldl(properties, function (acc, property) { var val = get$5(element, property); var value = val === undefined ? 0 : parseInt(val, 10); return isNaN(value) ? acc : acc + value; }, 0); }; var max = function (element, value, properties) { var cumulativeInclusions = aggregate(element, properties); var absoluteMax = value > cumulativeInclusions ? value - cumulativeInclusions : 0; return absoluteMax; }; return { set: set, get: get, getOuter: getOuter, aggregate: aggregate, max: max }; }; var api = Dimension('height', function (element) { var dom = element.dom; return inBody(element) ? dom.getBoundingClientRect().height : dom.offsetHeight; }); var get$7 = function (element) { return api.get(element); }; var getOuter$1 = function (element) { return api.getOuter(element); }; var setMax = function (element, value) { var inclusions = [ 'margin-top', 'border-top-width', 'padding-top', 'padding-bottom', 'border-bottom-width', 'margin-bottom' ]; var absMax = api.max(element, value, inclusions); set$2(element, 'max-height', absMax + 'px'); }; var r = function (left, top) { var translate = function (x, y) { return r(left + x, top + y); }; return { left: left, top: top, translate: translate }; }; var SugarPosition = r; var boxPosition = function (dom) { var box = dom.getBoundingClientRect(); return SugarPosition(box.left, box.top); }; var firstDefinedOrZero = function (a, b) { if (a !== undefined) { return a; } else { return b !== undefined ? b : 0; } }; var absolute = function (element) { var doc = element.dom.ownerDocument; var body = doc.body; var win = doc.defaultView; var html = doc.documentElement; if (body === element.dom) { return SugarPosition(body.offsetLeft, body.offsetTop); } var scrollTop = firstDefinedOrZero(win === null || win === void 0 ? void 0 : win.pageYOffset, html.scrollTop); var scrollLeft = firstDefinedOrZero(win === null || win === void 0 ? void 0 : win.pageXOffset, html.scrollLeft); var clientTop = firstDefinedOrZero(html.clientTop, body.clientTop); var clientLeft = firstDefinedOrZero(html.clientLeft, body.clientLeft); return viewport(element).translate(scrollLeft - clientLeft, scrollTop - clientTop); }; var viewport = function (element) { var dom = element.dom; var doc = dom.ownerDocument; var body = doc.body; if (body === dom) { return SugarPosition(body.offsetLeft, body.offsetTop); } if (!inBody(element)) { return SugarPosition(0, 0); } return boxPosition(dom); }; var api$1 = Dimension('width', function (element) { return element.dom.offsetWidth; }); var set$4 = function (element, h) { return api$1.set(element, h); }; var get$8 = function (element) { return api$1.get(element); }; var getOuter$2 = function (element) { return api$1.getOuter(element); }; var setMax$1 = function (element, value) { var inclusions = [ 'margin-left', 'border-left-width', 'padding-left', 'padding-right', 'border-right-width', 'margin-right' ]; var absMax = api$1.max(element, value, inclusions); set$2(element, 'max-width', absMax + 'px'); }; var mkEvent = function (target, x, y, stop, prevent, kill, raw) { return { target: target, x: x, y: y, stop: stop, prevent: prevent, kill: kill, raw: raw }; }; var fromRawEvent = function (rawEvent) { var target = SugarElement.fromDom(getOriginalEventTarget(rawEvent).getOr(rawEvent.target)); var stop = function () { return rawEvent.stopPropagation(); }; var prevent = function () { return rawEvent.preventDefault(); }; var kill = compose(prevent, stop); return mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent); }; var handle = function (filter, handler) { return function (rawEvent) { if (filter(rawEvent)) { handler(fromRawEvent(rawEvent)); } }; }; var binder = function (element, event, filter, handler, useCapture) { var wrapped = handle(filter, handler); element.dom.addEventListener(event, wrapped, useCapture); return { unbind: curry(unbind, element, event, wrapped, useCapture) }; }; var bind$2 = function (element, event, filter, handler) { return binder(element, event, filter, handler, false); }; var capture = function (element, event, filter, handler) { return binder(element, event, filter, handler, true); }; var unbind = function (element, event, handler, useCapture) { element.dom.removeEventListener(event, handler, useCapture); }; var get$9 = function (_DOC) { var doc = _DOC !== undefined ? _DOC.dom : document; var x = doc.body.scrollLeft || doc.documentElement.scrollLeft; var y = doc.body.scrollTop || doc.documentElement.scrollTop; return SugarPosition(x, y); }; var to = function (x, y, _DOC) { var doc = _DOC !== undefined ? _DOC.dom : document; var win = doc.defaultView; if (win) { win.scrollTo(x, y); } }; var get$a = function (_win) { var win = _win === undefined ? window : _win; return Optional.from(win['visualViewport']); }; var bounds = function (x, y, width, height) { return { x: x, y: y, width: width, height: height, right: x + width, bottom: y + height }; }; var getBounds = function (_win) { var win = _win === undefined ? window : _win; var doc = win.document; var scroll = get$9(SugarElement.fromDom(doc)); return get$a(win).fold(function () { var html = win.document.documentElement; var width = html.clientWidth; var height = html.clientHeight; return bounds(scroll.left, scroll.top, width, height); }, function (visualViewport) { return bounds(Math.max(visualViewport.pageLeft, scroll.left), Math.max(visualViewport.pageTop, scroll.top), visualViewport.width, visualViewport.height); }); }; var walkUp = function (navigation, doc) { var frame = navigation.view(doc); return frame.fold(constant([]), function (f) { var parent = navigation.owner(f); var rest = walkUp(navigation, parent); return [f].concat(rest); }); }; var pathTo = function (element, navigation) { var d = navigation.owner(element); var paths = walkUp(navigation, d); return Optional.some(paths); }; var view = function (doc) { var _a; var element = doc.dom === document ? Optional.none() : Optional.from((_a = doc.dom.defaultView) === null || _a === void 0 ? void 0 : _a.frameElement); return element.map(SugarElement.fromDom); }; var owner$1 = function (element) { return owner(element); }; var Navigation = /*#__PURE__*/Object.freeze({ __proto__: null, view: view, owner: owner$1 }); var find$3 = function (element) { var doc = SugarElement.fromDom(document); var scroll = get$9(doc); var path = pathTo(element, Navigation); return path.fold(curry(absolute, element), function (frames) { var offset = viewport(element); var r = foldr(frames, function (b, a) { var loc = viewport(a); return { left: b.left + loc.left, top: b.top + loc.top }; }, { left: 0, top: 0 }); return SugarPosition(r.left + offset.left + scroll.left, r.top + offset.top + scroll.top); }); }; var pointed = function (point, width, height) { return { point: point, width: width, height: height }; }; var rect = function (x, y, width, height) { return { x: x, y: y, width: width, height: height }; }; var bounds$1 = function (x, y, width, height) { return { x: x, y: y, width: width, height: height, right: x + width, bottom: y + height }; }; var box = function (element) { var xy = absolute(element); var w = getOuter$2(element); var h = getOuter$1(element); return bounds$1(xy.left, xy.top, w, h); }; var absolute$1 = function (element) { var position = find$3(element); var width = getOuter$2(element); var height = getOuter$1(element); return bounds$1(position.left, position.top, width, height); }; var win = function () { return getBounds(window); }; function ClosestOrAncestor (is, ancestor, scope, a, isRoot) { if (is(scope, a)) { return Optional.some(scope); } else if (isFunction(isRoot) && isRoot(scope)) { return Optional.none(); } else { return ancestor(scope, a, isRoot); } } var ancestor$1 = function (scope, predicate, isRoot) { var element = scope.dom; var stop = isFunction(isRoot) ? isRoot : never; while (element.parentNode) { element = element.parentNode; var el = SugarElement.fromDom(element); if (predicate(el)) { return Optional.some(el); } else if (stop(el)) { break; } } return Optional.none(); }; var closest$1 = function (scope, predicate, isRoot) { var is = function (s, test) { return test(s); }; return ClosestOrAncestor(is, ancestor$1, scope, predicate, isRoot); }; var descendant = function (scope, predicate) { var descend = function (node) { for (var i = 0; i < node.childNodes.length; i++) { var child_1 = SugarElement.fromDom(node.childNodes[i]); if (predicate(child_1)) { return Optional.some(child_1); } var res = descend(node.childNodes[i]); if (res.isSome()) { return res; } } return Optional.none(); }; return descend(scope.dom); }; var closest$2 = function (scope, predicate, isRoot) { return closest$1(scope, predicate, isRoot).isSome(); }; var ancestor$2 = function (scope, selector, isRoot) { return ancestor$1(scope, function (e) { return is(e, selector); }, isRoot); }; var descendant$1 = function (scope, selector) { return one(selector, scope); }; var closest$3 = function (scope, selector, isRoot) { var is$1 = function (element, selector) { return is(element, selector); }; return ClosestOrAncestor(is$1, ancestor$2, scope, selector, isRoot); }; var find$4 = function (queryElem) { var dependent = closest$1(queryElem, function (elem) { if (!isElement(elem)) { return false; } var id = get$3(elem, 'id'); return id !== undefined && id.indexOf('aria-owns') > -1; }); return dependent.bind(function (dep) { var id = get$3(dep, 'id'); var dos = getRootNode(dep); return descendant$1(dos, '[aria-owns="' + id + '"]'); }); }; var manager = function () { var ariaId = generate$1('aria-owns'); var link = function (elem) { set$1(elem, 'aria-owns', ariaId); }; var unlink = function (elem) { remove$1(elem, 'aria-owns'); }; return { id: ariaId, link: link, unlink: unlink }; }; var isAriaPartOf = function (component, queryElem) { return find$4(queryElem).exists(function (owner) { return isPartOf(component, owner); }); }; var isPartOf = function (component, queryElem) { return closest$2(queryElem, function (el) { return eq$1(el, component.element); }, never) || isAriaPartOf(component, queryElem); }; var unknown$3 = 'unknown'; var EventConfiguration; (function (EventConfiguration) { EventConfiguration[EventConfiguration['STOP'] = 0] = 'STOP'; EventConfiguration[EventConfiguration['NORMAL'] = 1] = 'NORMAL'; EventConfiguration[EventConfiguration['LOGGING'] = 2] = 'LOGGING'; }(EventConfiguration || (EventConfiguration = {}))); var eventConfig = Cell({}); var makeEventLogger = function (eventName, initialTarget) { var sequence = []; var startTime = new Date().getTime(); return { logEventCut: function (_name, target, purpose) { sequence.push({ outcome: 'cut', target: target, purpose: purpose }); }, logEventStopped: function (_name, target, purpose) { sequence.push({ outcome: 'stopped', target: target, purpose: purpose }); }, logNoParent: function (_name, target, purpose) { sequence.push({ outcome: 'no-parent', target: target, purpose: purpose }); }, logEventNoHandlers: function (_name, target) { sequence.push({ outcome: 'no-handlers-left', target: target }); }, logEventResponse: function (_name, target, purpose) { sequence.push({ outcome: 'response', purpose: purpose, target: target }); }, write: function () { var finishTime = new Date().getTime(); if (contains([ 'mousemove', 'mouseover', 'mouseout', systemInit() ], eventName)) { return; } console.log(eventName, { event: eventName, time: finishTime - startTime, target: initialTarget.dom, sequence: map(sequence, function (s) { if (!contains([ 'cut', 'stopped', 'response' ], s.outcome)) { return s.outcome; } else { return '{' + s.purpose + '} ' + s.outcome + ' at (' + element(s.target) + ')'; } }) }); } }; }; var processEvent = function (eventName, initialTarget, f) { var status = get$1(eventConfig.get(), eventName).orThunk(function () { var patterns = keys(eventConfig.get()); return findMap(patterns, function (p) { return eventName.indexOf(p) > -1 ? Optional.some(eventConfig.get()[p]) : Optional.none(); }); }).getOr(EventConfiguration.NORMAL); switch (status) { case EventConfiguration.NORMAL: return f(noLogger()); case EventConfiguration.LOGGING: { var logger = makeEventLogger(eventName, initialTarget); var output = f(logger); logger.write(); return output; } case EventConfiguration.STOP: return true; } }; var path = [ 'alloy/data/Fields', 'alloy/debugging/Debugging' ]; var getTrace = function () { var err = new Error(); if (err.stack !== undefined) { var lines = err.stack.split('\n'); return find(lines, function (line) { return line.indexOf('alloy') > 0 && !exists(path, function (p) { return line.indexOf(p) > -1; }); }).getOr(unknown$3); } else { return unknown$3; } }; var ignoreEvent = { logEventCut: noop, logEventStopped: noop, logNoParent: noop, logEventNoHandlers: noop, logEventResponse: noop, write: noop }; var monitorEvent = function (eventName, initialTarget, f) { return processEvent(eventName, initialTarget, f); }; var noLogger = constant(ignoreEvent); var menuFields = constant([ strict$1('menu'), strict$1('selectedMenu') ]); var itemFields = constant([ strict$1('item'), strict$1('selectedItem') ]); var schema = constant(objOf(itemFields().concat(menuFields()))); var itemSchema = constant(objOf(itemFields())); var _initSize = strictObjOf('initSize', [ strict$1('numColumns'), strict$1('numRows') ]); var itemMarkers = function () { return strictOf('markers', itemSchema()); }; var tieredMenuMarkers = function () { return strictObjOf('markers', [strict$1('backgroundMenu')].concat(menuFields()).concat(itemFields())); }; var markers = function (required) { return strictObjOf('markers', map(required, strict$1)); }; var onPresenceHandler = function (label, fieldName, presence) { var trace = getTrace(); return field(fieldName, fieldName, presence, valueOf(function (f) { return Result.value(function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } return f.apply(undefined, args); }); })); }; var onHandler = function (fieldName) { return onPresenceHandler('onHandler', fieldName, defaulted(noop)); }; var onKeyboardHandler = function (fieldName) { return onPresenceHandler('onKeyboardHandler', fieldName, defaulted(Optional.none)); }; var onStrictHandler = function (fieldName) { return onPresenceHandler('onHandler', fieldName, strict()); }; var onStrictKeyboardHandler = function (fieldName) { return onPresenceHandler('onKeyboardHandler', fieldName, strict()); }; var output = function (name, value) { return state$1(name, constant(value)); }; var snapshot = function (name) { return state$1(name, identity); }; var initSize = constant(_initSize); var nu$7 = function (x, y, bubble, direction, boundsRestriction, label) { return { x: x, y: y, bubble: bubble, direction: direction, boundsRestriction: boundsRestriction, label: label }; }; var adt$2 = Adt.generate([ { southeast: [] }, { southwest: [] }, { northeast: [] }, { northwest: [] }, { south: [] }, { north: [] }, { east: [] }, { west: [] } ]); var cata = function (subject, southeast, southwest, northeast, northwest, south, north, east, west) { return subject.fold(southeast, southwest, northeast, northwest, south, north, east, west); }; var cataVertical = function (subject, south, middle, north) { return subject.fold(south, south, north, north, south, north, middle, middle); }; var cataHorizontal = function (subject, east, middle, west) { return subject.fold(east, west, east, west, middle, middle, east, west); }; var southeast = adt$2.southeast; var southwest = adt$2.southwest; var northeast = adt$2.northeast; var northwest = adt$2.northwest; var south = adt$2.south; var north = adt$2.north; var east = adt$2.east; var west = adt$2.west; var getRestriction = function (anchor, restriction) { switch (restriction) { case 1: return anchor.x; case 0: return anchor.x + anchor.width; case 2: return anchor.y; case 3: return anchor.y + anchor.height; } }; var boundsRestriction = function (anchor, restrictions) { return mapToObject([ 'left', 'right', 'top', 'bottom' ], function (dir) { return get$1(restrictions, dir).map(function (restriction) { return getRestriction(anchor, restriction); }); }); }; var adjustBounds = function (bounds, boundsRestrictions, bubbleOffsets) { var applyRestriction = function (dir, current) { var bubbleOffset = dir === 'top' || dir === 'bottom' ? bubbleOffsets.top : bubbleOffsets.left; return get$1(boundsRestrictions, dir).bind(identity).bind(function (restriction) { if (dir === 'left' || dir === 'top') { return restriction >= current ? Optional.some(restriction) : Optional.none(); } else { return restriction <= current ? Optional.some(restriction) : Optional.none(); } }).map(function (restriction) { return restriction + bubbleOffset; }).getOr(current); }; var adjustedLeft = applyRestriction('left', bounds.x); var adjustedTop = applyRestriction('top', bounds.y); var adjustedRight = applyRestriction('right', bounds.right); var adjustedBottom = applyRestriction('bottom', bounds.bottom); return bounds$1(adjustedLeft, adjustedTop, adjustedRight - adjustedLeft, adjustedBottom - adjustedTop); }; var eastX = function (anchor) { return anchor.x; }; var middleX = function (anchor, element) { return anchor.x + anchor.width / 2 - element.width / 2; }; var westX = function (anchor, element) { return anchor.x + anchor.width - element.width; }; var northY = function (anchor, element) { return anchor.y - element.height; }; var southY = function (anchor) { return anchor.y + anchor.height; }; var centreY = function (anchor, element) { return anchor.y + anchor.height / 2 - element.height / 2; }; var eastEdgeX = function (anchor) { return anchor.x + anchor.width; }; var westEdgeX = function (anchor, element) { return anchor.x - element.width; }; var southeast$1 = function (anchor, element, bubbles) { return nu$7(eastX(anchor), southY(anchor), bubbles.southeast(), southeast(), boundsRestriction(anchor, { left: 1, top: 3 }), 'layout-se'); }; var southwest$1 = function (anchor, element, bubbles) { return nu$7(westX(anchor, element), southY(anchor), bubbles.southwest(), southwest(), boundsRestriction(anchor, { right: 0, top: 3 }), 'layout-sw'); }; var northeast$1 = function (anchor, element, bubbles) { return nu$7(eastX(anchor), northY(anchor, element), bubbles.northeast(), northeast(), boundsRestriction(anchor, { left: 1, bottom: 2 }), 'layout-ne'); }; var northwest$1 = function (anchor, element, bubbles) { return nu$7(westX(anchor, element), northY(anchor, element), bubbles.northwest(), northwest(), boundsRestriction(anchor, { right: 0, bottom: 2 }), 'layout-nw'); }; var north$1 = function (anchor, element, bubbles) { return nu$7(middleX(anchor, element), northY(anchor, element), bubbles.north(), north(), boundsRestriction(anchor, { bottom: 2 }), 'layout-n'); }; var south$1 = function (anchor, element, bubbles) { return nu$7(middleX(anchor, element), southY(anchor), bubbles.south(), south(), boundsRestriction(anchor, { top: 3 }), 'layout-s'); }; var east$1 = function (anchor, element, bubbles) { return nu$7(eastEdgeX(anchor), centreY(anchor, element), bubbles.east(), east(), boundsRestriction(anchor, { left: 0 }), 'layout-e'); }; var west$1 = function (anchor, element, bubbles) { return nu$7(westEdgeX(anchor, element), centreY(anchor, element), bubbles.west(), west(), boundsRestriction(anchor, { right: 1 }), 'layout-w'); }; var all$2 = function () { return [ southeast$1, southwest$1, northeast$1, northwest$1, south$1, north$1, east$1, west$1 ]; }; var allRtl = function () { return [ southwest$1, southeast$1, northwest$1, northeast$1, south$1, north$1, east$1, west$1 ]; }; var aboveOrBelow = function () { return [ northeast$1, northwest$1, southeast$1, southwest$1, north$1, south$1 ]; }; var aboveOrBelowRtl = function () { return [ northwest$1, northeast$1, southwest$1, southeast$1, north$1, south$1 ]; }; var belowOrAbove = function () { return [ southeast$1, southwest$1, northeast$1, northwest$1, south$1, north$1 ]; }; var belowOrAboveRtl = function () { return [ southwest$1, southeast$1, northwest$1, northeast$1, south$1, north$1 ]; }; var chooseChannels = function (channels, message) { return message.universal ? channels : filter(channels, function (ch) { return contains(message.channels, ch); }); }; var events$1 = function (receiveConfig) { return derive([run(receive(), function (component, message) { var channelMap = receiveConfig.channels; var channels = keys(channelMap); var receivingData = message; var targetChannels = chooseChannels(channels, receivingData); each(targetChannels, function (ch) { var channelInfo = channelMap[ch]; var channelSchema = channelInfo.schema; var data = asRawOrDie('channel[' + ch + '] data\nReceiver: ' + element(component.element), channelSchema, receivingData.data); channelInfo.onReceive(component, data); }); })]); }; var ActiveReceiving = /*#__PURE__*/Object.freeze({ __proto__: null, events: events$1 }); var ReceivingSchema = [strictOf('channels', setOf$1(Result.value, objOfOnly([ onStrictHandler('onReceive'), defaulted$1('schema', anyValue$1()) ])))]; var executeEvent = function (bConfig, bState, executor) { return runOnExecute(function (component) { executor(component, bConfig, bState); }); }; var loadEvent = function (bConfig, bState, f) { return runOnInit(function (component, _simulatedEvent) { f(component, bConfig, bState); }); }; var create = function (schema, name, active, apis, extra, state) { var configSchema = objOfOnly(schema); var schemaSchema = optionObjOf(name, [optionObjOfOnly('config', schema)]); return doCreate(configSchema, schemaSchema, name, active, apis, extra, state); }; var createModes = function (modes, name, active, apis, extra, state) { var configSchema = modes; var schemaSchema = optionObjOf(name, [optionOf('config', modes)]); return doCreate(configSchema, schemaSchema, name, active, apis, extra, state); }; var wrapApi = function (bName, apiFunction, apiName) { var f = function (component) { var rest = []; for (var _i = 1; _i < arguments.length; _i++) { rest[_i - 1] = arguments[_i]; } var args = [component].concat(rest); return component.config({ name: constant(bName) }).fold(function () { throw new Error('We could not find any behaviour configuration for: ' + bName + '. Using API: ' + apiName); }, function (info) { var rest = Array.prototype.slice.call(args, 1); return apiFunction.apply(undefined, [ component, info.config, info.state ].concat(rest)); }); }; return markAsBehaviourApi(f, apiName, apiFunction); }; var revokeBehaviour = function (name) { return { key: name, value: undefined }; }; var doCreate = function (configSchema, schemaSchema, name, active, apis, extra, state) { var getConfig = function (info) { return hasNonNullableKey(info, name) ? info[name]() : Optional.none(); }; var wrappedApis = map$2(apis, function (apiF, apiName) { return wrapApi(name, apiF, apiName); }); var wrappedExtra = map$2(extra, function (extraF, extraName) { return markAsExtraApi(extraF, extraName); }); var me = __assign(__assign(__assign({}, wrappedExtra), wrappedApis), { revoke: curry(revokeBehaviour, name), config: function (spec) { var prepared = asRawOrDie(name + '-config', configSchema, spec); return { key: name, value: { config: prepared, me: me, configAsRaw: cached(function () { return asRawOrDie(name + '-config', configSchema, spec); }), initialConfig: spec, state: state } }; }, schema: constant(schemaSchema), exhibit: function (info, base) { return getConfig(info).bind(function (behaviourInfo) { return get$1(active, 'exhibit').map(function (exhibitor) { return exhibitor(base, behaviourInfo.config, behaviourInfo.state); }); }).getOr(nu$6({})); }, name: constant(name), handlers: function (info) { return getConfig(info).map(function (behaviourInfo) { var getEvents = get$1(active, 'events').getOr(function () { return {}; }); return getEvents(behaviourInfo.config, behaviourInfo.state); }).getOr({}); } }); return me; }; var derive$1 = function (capabilities) { return wrapAll$1(capabilities); }; var simpleSchema = objOfOnly([ strict$1('fields'), strict$1('name'), defaulted$1('active', {}), defaulted$1('apis', {}), defaulted$1('state', NoState), defaulted$1('extra', {}) ]); var create$1 = function (data) { var value = asRawOrDie('Creating behaviour: ' + data.name, simpleSchema, data); return create(value.fields, value.name, value.active, value.apis, value.extra, value.state); }; var modeSchema = objOfOnly([ strict$1('branchKey'), strict$1('branches'), strict$1('name'), defaulted$1('active', {}), defaulted$1('apis', {}), defaulted$1('state', NoState), defaulted$1('extra', {}) ]); var createModes$1 = function (data) { var value = asRawOrDie('Creating behaviour: ' + data.name, modeSchema, data); return createModes(choose$1(value.branchKey, value.branches), value.name, value.active, value.apis, value.extra, value.state); }; var revoke = constant(undefined); var Receiving = create$1({ fields: ReceivingSchema, name: 'receiving', active: ActiveReceiving }); var exhibit = function (base, posConfig) { return nu$6({ classes: [], styles: posConfig.useFixed() ? {} : { position: 'relative' } }); }; var ActivePosition = /*#__PURE__*/Object.freeze({ __proto__: null, exhibit: exhibit }); var getDocument = function () { return SugarElement.fromDom(document); }; var focus$1 = function (element) { return element.dom.focus(); }; var blur = function (element) { return element.dom.blur(); }; var hasFocus = function (element) { var root = getRootNode(element).dom; return element.dom === root.activeElement; }; var active = function (root) { if (root === void 0) { root = getDocument(); } return Optional.from(root.dom.activeElement).map(SugarElement.fromDom); }; var search = function (element) { return active(getRootNode(element)).filter(function (e) { return element.dom.contains(e.dom); }); }; var preserve = function (f, container) { var dos = getRootNode(container); var refocus = active(dos).bind(function (focused) { var hasFocus = function (elem) { return eq$1(focused, elem); }; return hasFocus(container) ? Optional.some(container) : descendant(container, hasFocus); }); var result = f(container); refocus.each(function (oldFocus) { active(dos).filter(function (newFocus) { return eq$1(newFocus, oldFocus); }).fold(function () { focus$1(oldFocus); }, noop); }); return result; }; var NuPositionCss = function (position, left, top, right, bottom) { return { position: position, left: left, top: top, right: right, bottom: bottom }; }; var applyPositionCss = function (element, position) { var addPx = function (num) { return num + 'px'; }; setOptions(element, { position: Optional.some(position.position), left: position.left.map(addPx), top: position.top.map(addPx), right: position.right.map(addPx), bottom: position.bottom.map(addPx) }); }; var adt$3 = Adt.generate([ { none: [] }, { relative: [ 'x', 'y', 'width', 'height' ] }, { fixed: [ 'x', 'y', 'width', 'height' ] } ]); var positionWithDirection = function (posName, decision, x, y, width, height) { var decisionX = decision.x - x; var decisionY = decision.y - y; var decisionWidth = decision.width; var decisionHeight = decision.height; var decisionRight = width - (decisionX + decisionWidth); var decisionBottom = height - (decisionY + decisionHeight); var left = Optional.some(decisionX); var top = Optional.some(decisionY); var right = Optional.some(decisionRight); var bottom = Optional.some(decisionBottom); var none = Optional.none(); return cata(decision.direction, function () { return NuPositionCss(posName, left, top, none, none); }, function () { return NuPositionCss(posName, none, top, right, none); }, function () { return NuPositionCss(posName, left, none, none, bottom); }, function () { return NuPositionCss(posName, none, none, right, bottom); }, function () { return NuPositionCss(posName, left, top, none, none); }, function () { return NuPositionCss(posName, left, none, none, bottom); }, function () { return NuPositionCss(posName, left, top, none, none); }, function () { return NuPositionCss(posName, none, top, right, none); }); }; var reposition = function (origin, decision) { return origin.fold(function () { return NuPositionCss('absolute', Optional.some(decision.x), Optional.some(decision.y), Optional.none(), Optional.none()); }, function (x, y, width, height) { return positionWithDirection('absolute', decision, x, y, width, height); }, function (x, y, width, height) { return positionWithDirection('fixed', decision, x, y, width, height); }); }; var toBox = function (origin, element) { var rel = curry(find$3, element); var position = origin.fold(rel, rel, function () { var scroll = get$9(); return find$3(element).translate(-scroll.left, -scroll.top); }); var width = getOuter$2(element); var height = getOuter$1(element); return bounds$1(position.left, position.top, width, height); }; var viewport$1 = function (origin, getBounds) { return getBounds.fold(function () { return origin.fold(win, win, bounds$1); }, function (b) { return origin.fold(b, b, function () { var bounds = b(); var pos = translate(origin, bounds.x, bounds.y); return bounds$1(pos.left, pos.top, bounds.width, bounds.height); }); }); }; var translate = function (origin, x, y) { var pos = SugarPosition(x, y); var removeScroll = function () { var outerScroll = get$9(); return pos.translate(-outerScroll.left, -outerScroll.top); }; return origin.fold(constant(pos), constant(pos), removeScroll); }; var cata$1 = function (subject, onNone, onRelative, onFixed) { return subject.fold(onNone, onRelative, onFixed); }; var none$1 = adt$3.none; var relative = adt$3.relative; var fixed = adt$3.fixed; var anchor = function (anchorBox, origin) { return { anchorBox: anchorBox, origin: origin }; }; var box$1 = function (anchorBox, origin) { return anchor(anchorBox, origin); }; var cycleBy = function (value, delta, min, max) { var r = value + delta; if (r > max) { return min; } else if (r < min) { return max; } else { return r; } }; var clamp = function (value, min, max) { return Math.min(Math.max(value, min), max); }; var adt$4 = Adt.generate([ { fit: ['reposition'] }, { nofit: [ 'reposition', 'deltaW', 'deltaH' ] } ]); var calcReposition = function (newX, newY, width, height, bounds) { var boundsX = bounds.x; var boundsY = bounds.y; var boundsWidth = bounds.width; var boundsHeight = bounds.height; var xInBounds = newX >= boundsX; var yInBounds = newY >= boundsY; var originInBounds = xInBounds && yInBounds; var xFit = newX + width <= boundsX + boundsWidth; var yFit = newY + height <= boundsY + boundsHeight; var sizeInBounds = xFit && yFit; var deltaW = Math.abs(Math.min(width, xInBounds ? boundsX + boundsWidth - newX : boundsX - (newX + width))); var deltaH = Math.abs(Math.min(height, yInBounds ? boundsY + boundsHeight - newY : boundsY - (newY + height))); var maxX = Math.max(bounds.x, bounds.right - width); var maxY = Math.max(bounds.y, bounds.bottom - height); var limitX = clamp(newX, bounds.x, maxX); var limitY = clamp(newY, bounds.y, maxY); return { originInBounds: originInBounds, sizeInBounds: sizeInBounds, limitX: limitX, limitY: limitY, deltaW: deltaW, deltaH: deltaH }; }; var attempt = function (candidate, width, height, bounds) { var candidateX = candidate.x; var candidateY = candidate.y; var bubbleOffsets = candidate.bubble.offset; var bubbleLeft = bubbleOffsets.left; var bubbleTop = bubbleOffsets.top; var adjustedBounds = adjustBounds(bounds, candidate.boundsRestriction, bubbleOffsets); var boundsY = adjustedBounds.y; var boundsBottom = adjustedBounds.bottom; var boundsX = adjustedBounds.x; var boundsRight = adjustedBounds.right; var newX = candidateX + bubbleLeft; var newY = candidateY + bubbleTop; var _a = calcReposition(newX, newY, width, height, adjustedBounds), originInBounds = _a.originInBounds, sizeInBounds = _a.sizeInBounds, limitX = _a.limitX, limitY = _a.limitY, deltaW = _a.deltaW, deltaH = _a.deltaH; var upAvailable = constant(limitY + deltaH - boundsY); var downAvailable = constant(boundsBottom - limitY); var maxHeight = cataVertical(candidate.direction, downAvailable, downAvailable, upAvailable); var westAvailable = constant(limitX + deltaW - boundsX); var eastAvailable = constant(boundsRight - limitX); var maxWidth = cataHorizontal(candidate.direction, eastAvailable, eastAvailable, westAvailable); var reposition = { x: limitX, y: limitY, width: deltaW, height: deltaH, maxHeight: maxHeight, maxWidth: maxWidth, direction: candidate.direction, classes: { on: candidate.bubble.classesOn, off: candidate.bubble.classesOff }, label: candidate.label, candidateYforTest: newY }; return originInBounds && sizeInBounds ? adt$4.fit(reposition) : adt$4.nofit(reposition, deltaW, deltaH); }; var attempts = function (candidates, anchorBox, elementBox, bubbles, bounds) { var panelWidth = elementBox.width; var panelHeight = elementBox.height; var attemptBestFit = function (layout, reposition, deltaW, deltaH) { var next = layout(anchorBox, elementBox, bubbles); var attemptLayout = attempt(next, panelWidth, panelHeight, bounds); return attemptLayout.fold(adt$4.fit, function (newReposition, newDeltaW, newDeltaH) { var improved = newDeltaH > deltaH || newDeltaW > deltaW; return improved ? adt$4.nofit(newReposition, newDeltaW, newDeltaH) : adt$4.nofit(reposition, deltaW, deltaH); }); }; var abc = foldl(candidates, function (b, a) { var bestNext = curry(attemptBestFit, a); return b.fold(adt$4.fit, bestNext); }, adt$4.nofit({ x: anchorBox.x, y: anchorBox.y, width: elementBox.width, height: elementBox.height, maxHeight: elementBox.height, maxWidth: elementBox.width, direction: southeast(), classes: { on: [], off: [] }, label: 'none', candidateYforTest: anchorBox.y }, -1, -1)); return abc.fold(identity, identity); }; var elementSize = function (p) { return { width: getOuter$2(p), height: getOuter$1(p) }; }; var layout = function (anchorBox, element, bubbles, options) { remove$6(element, 'max-height'); remove$6(element, 'max-width'); var elementBox = elementSize(element); return attempts(options.preference, anchorBox, elementBox, bubbles, options.bounds); }; var setClasses = function (element, decision) { var classInfo = decision.classes; remove$5(element, classInfo.off); add$3(element, classInfo.on); }; var setHeight = function (element, decision, options) { var maxHeightFunction = options.maxHeightFunction; maxHeightFunction(element, decision.maxHeight); }; var setWidth = function (element, decision, options) { var maxWidthFunction = options.maxWidthFunction; maxWidthFunction(element, decision.maxWidth); }; var position = function (element, decision, options) { applyPositionCss(element, reposition(options.origin, decision)); }; var setMaxHeight = function (element, maxHeight) { setMax(element, Math.floor(maxHeight)); }; var anchored = constant(function (element, available) { setMaxHeight(element, available); setAll$1(element, { 'overflow-x': 'hidden', 'overflow-y': 'auto' }); }); var expandable = constant(function (element, available) { setMaxHeight(element, available); }); var defaultOr = function (options, key, dephault) { return options[key] === undefined ? dephault : options[key]; }; var simple = function (anchor, element, bubble, layouts, getBounds, overrideOptions) { var maxHeightFunction = defaultOr(overrideOptions, 'maxHeightFunction', anchored()); var maxWidthFunction = defaultOr(overrideOptions, 'maxWidthFunction', noop); var anchorBox = anchor.anchorBox; var origin = anchor.origin; var options = { bounds: viewport$1(origin, getBounds), origin: origin, preference: layouts, maxHeightFunction: maxHeightFunction, maxWidthFunction: maxWidthFunction }; go(anchorBox, element, bubble, options); }; var go = function (anchorBox, element, bubble, options) { var decision = layout(anchorBox, element, bubble, options); position(element, decision, options); setClasses(element, decision); setHeight(element, decision, options); setWidth(element, decision, options); }; var allAlignments = [ 'valignCentre', 'alignLeft', 'alignRight', 'alignCentre', 'top', 'bottom', 'left', 'right' ]; var nu$8 = function (width, yoffset, classes) { var getClasses = function (prop) { return get$1(classes, prop).getOr([]); }; var make = function (xDelta, yDelta, alignmentsOn) { var alignmentsOff = difference(allAlignments, alignmentsOn); return { offset: SugarPosition(xDelta, yDelta), classesOn: bind(alignmentsOn, getClasses), classesOff: bind(alignmentsOff, getClasses) }; }; return { southeast: function () { return make(-width, yoffset, [ 'top', 'alignLeft' ]); }, southwest: function () { return make(width, yoffset, [ 'top', 'alignRight' ]); }, south: function () { return make(-width / 2, yoffset, [ 'top', 'alignCentre' ]); }, northeast: function () { return make(-width, -yoffset, [ 'bottom', 'alignLeft' ]); }, northwest: function () { return make(width, -yoffset, [ 'bottom', 'alignRight' ]); }, north: function () { return make(-width / 2, -yoffset, [ 'bottom', 'alignCentre' ]); }, east: function () { return make(width, -yoffset / 2, [ 'valignCentre', 'left' ]); }, west: function () { return make(-width, -yoffset / 2, [ 'valignCentre', 'right' ]); }, innerNorthwest: function () { return make(-width, yoffset, [ 'top', 'alignRight' ]); }, innerNortheast: function () { return make(width, yoffset, [ 'top', 'alignLeft' ]); }, innerNorth: function () { return make(-width / 2, yoffset, [ 'top', 'alignCentre' ]); }, innerSouthwest: function () { return make(-width, -yoffset, [ 'bottom', 'alignRight' ]); }, innerSoutheast: function () { return make(width, -yoffset, [ 'bottom', 'alignLeft' ]); }, innerSouth: function () { return make(-width / 2, -yoffset, [ 'bottom', 'alignCentre' ]); }, innerWest: function () { return make(width, -yoffset / 2, [ 'valignCentre', 'right' ]); }, innerEast: function () { return make(-width, -yoffset / 2, [ 'valignCentre', 'left' ]); } }; }; var fallback = function () { return nu$8(0, 0, {}); }; var nu$9 = function (x) { return x; }; var onDirection = function (isLtr, isRtl) { return function (element) { return getDirection(element) === 'rtl' ? isRtl : isLtr; }; }; var getDirection = function (element) { return get$5(element, 'direction') === 'rtl' ? 'rtl' : 'ltr'; }; var AttributeValue; (function (AttributeValue) { AttributeValue['TopToBottom'] = 'toptobottom'; AttributeValue['BottomToTop'] = 'bottomtotop'; }(AttributeValue || (AttributeValue = {}))); var Attribute = 'data-alloy-vertical-dir'; var isBottomToTopDir = function (el) { return closest$2(el, function (current) { return isElement(current) && get$3(current, 'data-alloy-vertical-dir') === AttributeValue.BottomToTop; }); }; var schema$1 = function () { return optionObjOf('layouts', [ strict$1('onLtr'), strict$1('onRtl'), option('onBottomLtr'), option('onBottomRtl') ]); }; var get$b = function (elem, info, defaultLtr, defaultRtl, defaultBottomLtr, defaultBottomRtl, dirElement) { var isBottomToTop = dirElement.map(isBottomToTopDir).getOr(false); var customLtr = info.layouts.map(function (ls) { return ls.onLtr(elem); }); var customRtl = info.layouts.map(function (ls) { return ls.onRtl(elem); }); var ltr = isBottomToTop ? info.layouts.bind(function (ls) { return ls.onBottomLtr.map(function (f) { return f(elem); }); }).or(customLtr).getOr(defaultBottomLtr) : customLtr.getOr(defaultLtr); var rtl = isBottomToTop ? info.layouts.bind(function (ls) { return ls.onBottomRtl.map(function (f) { return f(elem); }); }).or(customRtl).getOr(defaultBottomRtl) : customRtl.getOr(defaultRtl); var f = onDirection(ltr, rtl); return f(elem); }; var placement = function (component, anchorInfo, origin) { var hotspot = anchorInfo.hotspot; var anchorBox = toBox(origin, hotspot.element); var layouts = get$b(component.element, anchorInfo, belowOrAbove(), belowOrAboveRtl(), aboveOrBelow(), aboveOrBelowRtl(), Optional.some(anchorInfo.hotspot.element)); return Optional.some(nu$9({ anchorBox: anchorBox, bubble: anchorInfo.bubble.getOr(fallback()), overrides: anchorInfo.overrides, layouts: layouts, placer: Optional.none() })); }; var HotspotAnchor = [ strict$1('hotspot'), option('bubble'), defaulted$1('overrides', {}), schema$1(), output('placement', placement) ]; var placement$1 = function (component, anchorInfo, origin) { var pos = translate(origin, anchorInfo.x, anchorInfo.y); var anchorBox = bounds$1(pos.left, pos.top, anchorInfo.width, anchorInfo.height); var layouts = get$b(component.element, anchorInfo, all$2(), allRtl(), all$2(), allRtl(), Optional.none()); return Optional.some(nu$9({ anchorBox: anchorBox, bubble: anchorInfo.bubble, overrides: anchorInfo.overrides, layouts: layouts, placer: Optional.none() })); }; var MakeshiftAnchor = [ strict$1('x'), strict$1('y'), defaulted$1('height', 0), defaulted$1('width', 0), defaulted$1('bubble', fallback()), defaulted$1('overrides', {}), schema$1(), output('placement', placement$1) ]; var adt$5 = Adt.generate([ { screen: ['point'] }, { absolute: [ 'point', 'scrollLeft', 'scrollTop' ] } ]); var toFixed = function (pos) { return pos.fold(identity, function (point, scrollLeft, scrollTop) { return point.translate(-scrollLeft, -scrollTop); }); }; var toAbsolute = function (pos) { return pos.fold(identity, identity); }; var sum = function (points) { return foldl(points, function (b, a) { return b.translate(a.left, a.top); }, SugarPosition(0, 0)); }; var sumAsFixed = function (positions) { var points = map(positions, toFixed); return sum(points); }; var sumAsAbsolute = function (positions) { var points = map(positions, toAbsolute); return sum(points); }; var screen = adt$5.screen; var absolute$2 = adt$5.absolute; var getOffset = function (component, origin, anchorInfo) { var win = defaultView(anchorInfo.root).dom; var hasSameOwner = function (frame) { var frameOwner = owner(frame); var compOwner = owner(component.element); return eq$1(frameOwner, compOwner); }; return Optional.from(win.frameElement).map(SugarElement.fromDom).filter(hasSameOwner).map(absolute); }; var getRootPoint = function (component, origin, anchorInfo) { var doc = owner(component.element); var outerScroll = get$9(doc); var offset = getOffset(component, origin, anchorInfo).getOr(outerScroll); return absolute$2(offset, outerScroll.left, outerScroll.top); }; var capRect = function (left, top, width, height) { var newLeft = left, newTop = top, newWidth = width, newHeight = height; if (left < 0) { newLeft = 0; newWidth = width + left; } if (top < 0) { newTop = 0; newHeight = height + top; } var point = screen(SugarPosition(newLeft, newTop)); return Optional.some(pointed(point, newWidth, newHeight)); }; var calcNewAnchor = function (optBox, rootPoint, anchorInfo, origin, elem) { return optBox.map(function (box) { var points = [ rootPoint, box.point ]; var topLeft = cata$1(origin, function () { return sumAsAbsolute(points); }, function () { return sumAsAbsolute(points); }, function () { return sumAsFixed(points); }); var anchorBox = rect(topLeft.left, topLeft.top, box.width, box.height); var layoutsLtr = anchorInfo.showAbove ? aboveOrBelow() : belowOrAbove(); var layoutsRtl = anchorInfo.showAbove ? aboveOrBelowRtl() : belowOrAboveRtl(); var layouts = get$b(elem, anchorInfo, layoutsLtr, layoutsRtl, layoutsLtr, layoutsRtl, Optional.none()); return nu$9({ anchorBox: anchorBox, bubble: anchorInfo.bubble.getOr(fallback()), overrides: anchorInfo.overrides, layouts: layouts, placer: Optional.none() }); }); }; var placement$2 = function (component, anchorInfo, origin) { var rootPoint = getRootPoint(component, origin, anchorInfo); return anchorInfo.node.filter(inBody).bind(function (target) { var rect = target.dom.getBoundingClientRect(); var nodeBox = capRect(rect.left, rect.top, rect.width, rect.height); var elem = anchorInfo.node.getOr(component.element); return calcNewAnchor(nodeBox, rootPoint, anchorInfo, origin, elem); }); }; var NodeAnchor = [ strict$1('node'), strict$1('root'), option('bubble'), schema$1(), defaulted$1('overrides', {}), defaulted$1('showAbove', false), output('placement', placement$2) ]; var zeroWidth = '\uFEFF'; var nbsp = '\xA0'; var create$2 = function (start, soffset, finish, foffset) { return { start: start, soffset: soffset, finish: finish, foffset: foffset }; }; var SimRange = { create: create$2 }; var adt$6 = Adt.generate([ { before: ['element'] }, { on: [ 'element', 'offset' ] }, { after: ['element'] } ]); var cata$2 = function (subject, onBefore, onOn, onAfter) { return subject.fold(onBefore, onOn, onAfter); }; var getStart = function (situ) { return situ.fold(identity, identity, identity); }; var before$2 = adt$6.before; var on = adt$6.on; var after$1 = adt$6.after; var Situ = { before: before$2, on: on, after: after$1, cata: cata$2, getStart: getStart }; var adt$7 = Adt.generate([ { domRange: ['rng'] }, { relative: [ 'startSitu', 'finishSitu' ] }, { exact: [ 'start', 'soffset', 'finish', 'foffset' ] } ]); var exactFromRange = function (simRange) { return adt$7.exact(simRange.start, simRange.soffset, simRange.finish, simRange.foffset); }; var getStart$1 = function (selection) { return selection.match({ domRange: function (rng) { return SugarElement.fromDom(rng.startContainer); }, relative: function (startSitu, _finishSitu) { return Situ.getStart(startSitu); }, exact: function (start, _soffset, _finish, _foffset) { return start; } }); }; var domRange = adt$7.domRange; var relative$1 = adt$7.relative; var exact = adt$7.exact; var getWin = function (selection) { var start = getStart$1(selection); return defaultView(start); }; var range$1 = SimRange.create; var SimSelection = { domRange: domRange, relative: relative$1, exact: exact, exactFromRange: exactFromRange, getWin: getWin, range: range$1 }; var setStart = function (rng, situ) { situ.fold(function (e) { rng.setStartBefore(e.dom); }, function (e, o) { rng.setStart(e.dom, o); }, function (e) { rng.setStartAfter(e.dom); }); }; var setFinish = function (rng, situ) { situ.fold(function (e) { rng.setEndBefore(e.dom); }, function (e, o) { rng.setEnd(e.dom, o); }, function (e) { rng.setEndAfter(e.dom); }); }; var relativeToNative = function (win, startSitu, finishSitu) { var range = win.document.createRange(); setStart(range, startSitu); setFinish(range, finishSitu); return range; }; var exactToNative = function (win, start, soffset, finish, foffset) { var rng = win.document.createRange(); rng.setStart(start.dom, soffset); rng.setEnd(finish.dom, foffset); return rng; }; var toRect = function (rect) { return { left: rect.left, top: rect.top, right: rect.right, bottom: rect.bottom, width: rect.width, height: rect.height }; }; var getFirstRect = function (rng) { var rects = rng.getClientRects(); var rect = rects.length > 0 ? rects[0] : rng.getBoundingClientRect(); return rect.width > 0 || rect.height > 0 ? Optional.some(rect).map(toRect) : Optional.none(); }; var adt$8 = Adt.generate([ { ltr: [ 'start', 'soffset', 'finish', 'foffset' ] }, { rtl: [ 'start', 'soffset', 'finish', 'foffset' ] } ]); var fromRange = function (win, type, range) { return type(SugarElement.fromDom(range.startContainer), range.startOffset, SugarElement.fromDom(range.endContainer), range.endOffset); }; var getRanges = function (win, selection) { return selection.match({ domRange: function (rng) { return { ltr: constant(rng), rtl: Optional.none }; }, relative: function (startSitu, finishSitu) { return { ltr: cached(function () { return relativeToNative(win, startSitu, finishSitu); }), rtl: cached(function () { return Optional.some(relativeToNative(win, finishSitu, startSitu)); }) }; }, exact: function (start, soffset, finish, foffset) { return { ltr: cached(function () { return exactToNative(win, start, soffset, finish, foffset); }), rtl: cached(function () { return Optional.some(exactToNative(win, finish, foffset, start, soffset)); }) }; } }); }; var doDiagnose = function (win, ranges) { var rng = ranges.ltr(); if (rng.collapsed) { var reversed = ranges.rtl().filter(function (rev) { return rev.collapsed === false; }); return reversed.map(function (rev) { return adt$8.rtl(SugarElement.fromDom(rev.endContainer), rev.endOffset, SugarElement.fromDom(rev.startContainer), rev.startOffset); }).getOrThunk(function () { return fromRange(win, adt$8.ltr, rng); }); } else { return fromRange(win, adt$8.ltr, rng); } }; var diagnose = function (win, selection) { var ranges = getRanges(win, selection); return doDiagnose(win, ranges); }; var asLtrRange = function (win, selection) { var diagnosis = diagnose(win, selection); return diagnosis.match({ ltr: function (start, soffset, finish, foffset) { var rng = win.document.createRange(); rng.setStart(start.dom, soffset); rng.setEnd(finish.dom, foffset); return rng; }, rtl: function (start, soffset, finish, foffset) { var rng = win.document.createRange(); rng.setStart(finish.dom, foffset); rng.setEnd(start.dom, soffset); return rng; } }); }; var ltr = adt$8.ltr; var rtl = adt$8.rtl; var NodeValue = function (is, name) { var get = function (element) { if (!is(element)) { throw new Error('Can only get ' + name + ' value of a ' + name + ' node'); } return getOption(element).getOr(''); }; var getOption = function (element) { return is(element) ? Optional.from(element.dom.nodeValue) : Optional.none(); }; var set = function (element, value) { if (!is(element)) { throw new Error('Can only set raw ' + name + ' value of a ' + name + ' node'); } element.dom.nodeValue = value; }; return { get: get, getOption: getOption, set: set }; }; var api$2 = NodeValue(isText, 'text'); var get$c = function (element) { return api$2.get(element); }; var getOption = function (element) { return api$2.getOption(element); }; var getEnd = function (element) { return name(element) === 'img' ? 1 : getOption(element).fold(function () { return children(element).length; }, function (v) { return v.length; }); }; var isTextNodeWithCursorPosition = function (el) { return getOption(el).filter(function (text) { return text.trim().length !== 0 || text.indexOf(nbsp) > -1; }).isSome(); }; var elementsWithCursorPosition = [ 'img', 'br' ]; var isCursorPosition = function (elem) { var hasCursorPosition = isTextNodeWithCursorPosition(elem); return hasCursorPosition || contains(elementsWithCursorPosition, name(elem)); }; var last$1 = function (element) { return descendantRtl(element, isCursorPosition); }; var descendantRtl = function (scope, predicate) { var descend = function (element) { var children$1 = children(element); for (var i = children$1.length - 1; i >= 0; i--) { var child = children$1[i]; if (predicate(child)) { return Optional.some(child); } var res = descend(child); if (res.isSome()) { return res; } } return Optional.none(); }; return descend(scope); }; var descendants = function (scope, selector) { return all(selector, scope); }; var makeRange = function (start, soffset, finish, foffset) { var doc = owner(start); var rng = doc.dom.createRange(); rng.setStart(start.dom, soffset); rng.setEnd(finish.dom, foffset); return rng; }; var after$2 = function (start, soffset, finish, foffset) { var r = makeRange(start, soffset, finish, foffset); var same = eq$1(start, finish) && soffset === foffset; return r.collapsed && !same; }; var getNativeSelection = function (win) { return Optional.from(win.getSelection()); }; var readRange = function (selection) { if (selection.rangeCount > 0) { var firstRng = selection.getRangeAt(0); var lastRng = selection.getRangeAt(selection.rangeCount - 1); return Optional.some(SimRange.create(SugarElement.fromDom(firstRng.startContainer), firstRng.startOffset, SugarElement.fromDom(lastRng.endContainer), lastRng.endOffset)); } else { return Optional.none(); } }; var doGetExact = function (selection) { if (selection.anchorNode === null || selection.focusNode === null) { return readRange(selection); } else { var anchor = SugarElement.fromDom(selection.anchorNode); var focus_1 = SugarElement.fromDom(selection.focusNode); return after$2(anchor, selection.anchorOffset, focus_1, selection.focusOffset) ? Optional.some(SimRange.create(anchor, selection.anchorOffset, focus_1, selection.focusOffset)) : readRange(selection); } }; var getExact = function (win) { return getNativeSelection(win).filter(function (sel) { return sel.rangeCount > 0; }).bind(doGetExact); }; var getFirstRect$1 = function (win, selection) { var rng = asLtrRange(win, selection); return getFirstRect(rng); }; var point = function (element, offset) { return { element: element, offset: offset }; }; var descendOnce = function (element, offset) { var children$1 = children(element); if (children$1.length === 0) { return point(element, offset); } else if (offset < children$1.length) { return point(children$1[offset], 0); } else { var last = children$1[children$1.length - 1]; var len = isText(last) ? get$c(last).length : children(last).length; return point(last, len); } }; var descendOnce$1 = function (element, offset) { return isText(element) ? point(element, offset) : descendOnce(element, offset); }; var getAnchorSelection = function (win, anchorInfo) { var getSelection = anchorInfo.getSelection.getOrThunk(function () { return function () { return getExact(win); }; }); return getSelection().map(function (sel) { var modStart = descendOnce$1(sel.start, sel.soffset); var modFinish = descendOnce$1(sel.finish, sel.foffset); return SimSelection.range(modStart.element, modStart.offset, modFinish.element, modFinish.offset); }); }; var placement$3 = function (component, anchorInfo, origin) { var win = defaultView(anchorInfo.root).dom; var rootPoint = getRootPoint(component, origin, anchorInfo); var selectionBox = getAnchorSelection(win, anchorInfo).bind(function (sel) { var optRect = getFirstRect$1(win, SimSelection.exactFromRange(sel)).orThunk(function () { var x = SugarElement.fromText(zeroWidth); before(sel.start, x); return getFirstRect$1(win, SimSelection.exact(x, 0, x, 1)).map(function (rect) { remove(x); return rect; }); }); return optRect.bind(function (rawRect) { return capRect(rawRect.left, rawRect.top, rawRect.width, rawRect.height); }); }); var targetElement = getAnchorSelection(win, anchorInfo).bind(function (sel) { return isElement(sel.start) ? Optional.some(sel.start) : parentNode(sel.start); }); var elem = targetElement.getOr(component.element); return calcNewAnchor(selectionBox, rootPoint, anchorInfo, origin, elem); }; var SelectionAnchor = [ option('getSelection'), strict$1('root'), option('bubble'), schema$1(), defaulted$1('overrides', {}), defaulted$1('showAbove', false), output('placement', placement$3) ]; var eastX$1 = function (anchor) { return anchor.x + anchor.width; }; var westX$1 = function (anchor, element) { return anchor.x - element.width; }; var northY$1 = function (anchor, element) { return anchor.y - element.height + anchor.height; }; var southY$1 = function (anchor) { return anchor.y; }; var southeast$2 = function (anchor, element, bubbles) { return nu$7(eastX$1(anchor), southY$1(anchor), bubbles.southeast(), southeast(), boundsRestriction(anchor, { left: 0, top: 2 }), 'link-layout-se'); }; var southwest$2 = function (anchor, element, bubbles) { return nu$7(westX$1(anchor, element), southY$1(anchor), bubbles.southwest(), southwest(), boundsRestriction(anchor, { right: 1, top: 2 }), 'link-layout-sw'); }; var northeast$2 = function (anchor, element, bubbles) { return nu$7(eastX$1(anchor), northY$1(anchor, element), bubbles.northeast(), northeast(), boundsRestriction(anchor, { left: 0, bottom: 3 }), 'link-layout-ne'); }; var northwest$2 = function (anchor, element, bubbles) { return nu$7(westX$1(anchor, element), northY$1(anchor, element), bubbles.northwest(), northwest(), boundsRestriction(anchor, { right: 1, bottom: 3 }), 'link-layout-nw'); }; var all$3 = function () { return [ southeast$2, southwest$2, northeast$2, northwest$2 ]; }; var allRtl$1 = function () { return [ southwest$2, southeast$2, northwest$2, northeast$2 ]; }; var placement$4 = function (component, submenuInfo, origin) { var anchorBox = toBox(origin, submenuInfo.item.element); var layouts = get$b(component.element, submenuInfo, all$3(), allRtl$1(), all$3(), allRtl$1(), Optional.none()); return Optional.some(nu$9({ anchorBox: anchorBox, bubble: fallback(), overrides: submenuInfo.overrides, layouts: layouts, placer: Optional.none() })); }; var SubmenuAnchor = [ strict$1('item'), schema$1(), defaulted$1('overrides', {}), output('placement', placement$4) ]; var AnchorSchema = choose$1('anchor', { selection: SelectionAnchor, node: NodeAnchor, hotspot: HotspotAnchor, submenu: SubmenuAnchor, makeshift: MakeshiftAnchor }); var getFixedOrigin = function () { var html = document.documentElement; return fixed(0, 0, html.clientWidth, html.clientHeight); }; var getRelativeOrigin = function (component) { var position = absolute(component.element); var bounds = component.element.dom.getBoundingClientRect(); return relative(position.left, position.top, bounds.width, bounds.height); }; var place = function (component, origin, anchoring, getBounds, placee) { var anchor = box$1(anchoring.anchorBox, origin); simple(anchor, placee.element, anchoring.bubble, anchoring.layouts, getBounds, anchoring.overrides); }; var position$1 = function (component, posConfig, posState, anchor, placee) { positionWithin(component, posConfig, posState, anchor, placee, Optional.none()); }; var positionWithin = function (component, posConfig, posState, anchor, placee, boxElement) { var boundsBox = boxElement.map(box); return positionWithinBounds(component, posConfig, posState, anchor, placee, boundsBox); }; var positionWithinBounds = function (component, posConfig, posState, anchor, placee, bounds) { var anchorage = asRawOrDie('positioning anchor.info', AnchorSchema, anchor); preserve(function () { set$2(placee.element, 'position', 'fixed'); var oldVisibility = getRaw(placee.element, 'visibility'); set$2(placee.element, 'visibility', 'hidden'); var origin = posConfig.useFixed() ? getFixedOrigin() : getRelativeOrigin(component); var placer = anchorage.placement; var getBounds = bounds.map(constant).or(posConfig.getBounds); placer(component, anchorage, origin).each(function (anchoring) { var doPlace = anchoring.placer.getOr(place); doPlace(component, origin, anchoring, getBounds, placee); }); oldVisibility.fold(function () { remove$6(placee.element, 'visibility'); }, function (vis) { set$2(placee.element, 'visibility', vis); }); if (getRaw(placee.element, 'left').isNone() && getRaw(placee.element, 'top').isNone() && getRaw(placee.element, 'right').isNone() && getRaw(placee.element, 'bottom').isNone() && getRaw(placee.element, 'position').is('fixed')) { remove$6(placee.element, 'position'); } }, placee.element); }; var getMode = function (component, pConfig, _pState) { return pConfig.useFixed() ? 'fixed' : 'absolute'; }; var PositionApis = /*#__PURE__*/Object.freeze({ __proto__: null, position: position$1, positionWithin: positionWithin, positionWithinBounds: positionWithinBounds, getMode: getMode }); var PositionSchema = [ defaulted$1('useFixed', never), option('getBounds') ]; var Positioning = create$1({ fields: PositionSchema, name: 'positioning', active: ActivePosition, apis: PositionApis }); var fireDetaching = function (component) { emit(component, detachedFromDom()); var children = component.components(); each(children, fireDetaching); }; var fireAttaching = function (component) { var children = component.components(); each(children, fireAttaching); emit(component, attachedToDom()); }; var attach = function (parent, child) { append(parent.element, child.element); }; var detachChildren = function (component) { each(component.components(), function (childComp) { return remove(childComp.element); }); empty(component.element); component.syncComponents(); }; var replaceChildren = function (component, newChildren) { var subs = component.components(); detachChildren(component); var deleted = difference(subs, newChildren); each(deleted, function (comp) { fireDetaching(comp); component.getSystem().removeFromWorld(comp); }); each(newChildren, function (childComp) { if (!childComp.getSystem().isConnected()) { component.getSystem().addToWorld(childComp); attach(component, childComp); if (inBody(component.element)) { fireAttaching(childComp); } } else { attach(component, childComp); } component.syncComponents(); }); }; var attach$1 = function (parent, child) { attachWith(parent, child, append); }; var attachWith = function (parent, child, insertion) { parent.getSystem().addToWorld(child); insertion(parent.element, child.element); if (inBody(parent.element)) { fireAttaching(child); } parent.syncComponents(); }; var doDetach = function (component) { fireDetaching(component); remove(component.element); component.getSystem().removeFromWorld(component); }; var detach = function (component) { var parent$1 = parent(component.element).bind(function (p) { return component.getSystem().getByDom(p).toOptional(); }); doDetach(component); parent$1.each(function (p) { p.syncComponents(); }); }; var detachChildren$1 = function (component) { var subs = component.components(); each(subs, doDetach); empty(component.element); component.syncComponents(); }; var attachSystem = function (element, guiSystem) { attachSystemWith(element, guiSystem, append); }; var attachSystemAfter = function (element, guiSystem) { attachSystemWith(element, guiSystem, after); }; var attachSystemWith = function (element, guiSystem, inserter) { inserter(element, guiSystem.element); var children$1 = children(guiSystem.element); each(children$1, function (child) { guiSystem.getByDom(child).each(fireAttaching); }); }; var detachSystem = function (guiSystem) { var children$1 = children(guiSystem.element); each(children$1, function (child) { guiSystem.getByDom(child).each(fireDetaching); }); remove(guiSystem.element); }; var rebuild = function (sandbox, sConfig, sState, data) { sState.get().each(function (_data) { detachChildren$1(sandbox); }); var point = sConfig.getAttachPoint(sandbox); attach$1(point, sandbox); var built = sandbox.getSystem().build(data); attach$1(sandbox, built); sState.set(built); return built; }; var open = function (sandbox, sConfig, sState, data) { var newState = rebuild(sandbox, sConfig, sState, data); sConfig.onOpen(sandbox, newState); return newState; }; var setContent = function (sandbox, sConfig, sState, data) { return sState.get().map(function () { return rebuild(sandbox, sConfig, sState, data); }); }; var openWhileCloaked = function (sandbox, sConfig, sState, data, transaction) { cloak(sandbox, sConfig); open(sandbox, sConfig, sState, data); transaction(); decloak(sandbox, sConfig); }; var close = function (sandbox, sConfig, sState) { sState.get().each(function (data) { detachChildren$1(sandbox); detach(sandbox); sConfig.onClose(sandbox, data); sState.clear(); }); }; var isOpen = function (_sandbox, _sConfig, sState) { return sState.isOpen(); }; var isPartOf$1 = function (sandbox, sConfig, sState, queryElem) { return isOpen(sandbox, sConfig, sState) && sState.get().exists(function (data) { return sConfig.isPartOf(sandbox, data, queryElem); }); }; var getState = function (_sandbox, _sConfig, sState) { return sState.get(); }; var store = function (sandbox, cssKey, attr, newValue) { getRaw(sandbox.element, cssKey).fold(function () { remove$1(sandbox.element, attr); }, function (v) { set$1(sandbox.element, attr, v); }); set$2(sandbox.element, cssKey, newValue); }; var restore = function (sandbox, cssKey, attr) { getOpt(sandbox.element, attr).fold(function () { return remove$6(sandbox.element, cssKey); }, function (oldValue) { return set$2(sandbox.element, cssKey, oldValue); }); }; var cloak = function (sandbox, sConfig, _sState) { var sink = sConfig.getAttachPoint(sandbox); set$2(sandbox.element, 'position', Positioning.getMode(sink)); store(sandbox, 'visibility', sConfig.cloakVisibilityAttr, 'hidden'); }; var hasPosition = function (element) { return exists([ 'top', 'left', 'right', 'bottom' ], function (pos) { return getRaw(element, pos).isSome(); }); }; var decloak = function (sandbox, sConfig, _sState) { if (!hasPosition(sandbox.element)) { remove$6(sandbox.element, 'position'); } restore(sandbox, 'visibility', sConfig.cloakVisibilityAttr); }; var SandboxApis = /*#__PURE__*/Object.freeze({ __proto__: null, cloak: cloak, decloak: decloak, open: open, openWhileCloaked: openWhileCloaked, close: close, isOpen: isOpen, isPartOf: isPartOf$1, getState: getState, setContent: setContent }); var events$2 = function (sandboxConfig, sandboxState) { return derive([run(sandboxClose(), function (sandbox, _simulatedEvent) { close(sandbox, sandboxConfig, sandboxState); })]); }; var ActiveSandbox = /*#__PURE__*/Object.freeze({ __proto__: null, events: events$2 }); var SandboxSchema = [ onHandler('onOpen'), onHandler('onClose'), strict$1('isPartOf'), strict$1('getAttachPoint'), defaulted$1('cloakVisibilityAttr', 'data-precloak-visibility') ]; var init = function () { var contents = Cell(Optional.none()); var readState = constant('not-implemented'); var isOpen = function () { return contents.get().isSome(); }; var set = function (comp) { contents.set(Optional.some(comp)); }; var get = function () { return contents.get(); }; var clear = function () { contents.set(Optional.none()); }; return nu$5({ readState: readState, isOpen: isOpen, clear: clear, set: set, get: get }); }; var SandboxState = /*#__PURE__*/Object.freeze({ __proto__: null, init: init }); var Sandboxing = create$1({ fields: SandboxSchema, name: 'sandboxing', active: ActiveSandbox, apis: SandboxApis, state: SandboxState }); var dismissPopups = constant('dismiss.popups'); var repositionPopups = constant('reposition.popups'); var mouseReleased = constant('mouse.released'); var schema$2 = objOfOnly([ defaulted$1('isExtraPart', never), optionObjOf('fireEventInstead', [defaulted$1('event', dismissRequested())]) ]); var receivingChannel = function (rawSpec) { var _a; var detail = asRawOrDie('Dismissal', schema$2, rawSpec); return _a = {}, _a[dismissPopups()] = { schema: objOfOnly([strict$1('target')]), onReceive: function (sandbox, data) { if (Sandboxing.isOpen(sandbox)) { var isPart = Sandboxing.isPartOf(sandbox, data.target) || detail.isExtraPart(sandbox, data.target); if (!isPart) { detail.fireEventInstead.fold(function () { return Sandboxing.close(sandbox); }, function (fe) { return emit(sandbox, fe.event); }); } } } }, _a; }; var schema$3 = objOfOnly([ optionObjOf('fireEventInstead', [defaulted$1('event', repositionRequested())]), strictFunction('doReposition') ]); var receivingChannel$1 = function (rawSpec) { var _a; var detail = asRawOrDie('Reposition', schema$3, rawSpec); return _a = {}, _a[repositionPopups()] = { onReceive: function (sandbox) { if (Sandboxing.isOpen(sandbox)) { detail.fireEventInstead.fold(function () { return detail.doReposition(sandbox); }, function (fe) { return emit(sandbox, fe.event); }); } } }, _a; }; var onLoad = function (component, repConfig, repState) { repConfig.store.manager.onLoad(component, repConfig, repState); }; var onUnload = function (component, repConfig, repState) { repConfig.store.manager.onUnload(component, repConfig, repState); }; var setValue = function (component, repConfig, repState, data) { repConfig.store.manager.setValue(component, repConfig, repState, data); }; var getValue = function (component, repConfig, repState) { return repConfig.store.manager.getValue(component, repConfig, repState); }; var getState$1 = function (component, repConfig, repState) { return repState; }; var RepresentApis = /*#__PURE__*/Object.freeze({ __proto__: null, onLoad: onLoad, onUnload: onUnload, setValue: setValue, getValue: getValue, getState: getState$1 }); var events$3 = function (repConfig, repState) { var es = repConfig.resetOnDom ? [ runOnAttached(function (comp, _se) { onLoad(comp, repConfig, repState); }), runOnDetached(function (comp, _se) { onUnload(comp, repConfig, repState); }) ] : [loadEvent(repConfig, repState, onLoad)]; return derive(es); }; var ActiveRepresenting = /*#__PURE__*/Object.freeze({ __proto__: null, events: events$3 }); var memory = function () { var data = Cell(null); var readState = function () { return { mode: 'memory', value: data.get() }; }; var isNotSet = function () { return data.get() === null; }; var clear = function () { data.set(null); }; return nu$5({ set: data.set, get: data.get, isNotSet: isNotSet, clear: clear, readState: readState }); }; var manual = function () { var readState = noop; return nu$5({ readState: readState }); }; var dataset = function () { var dataByValue = Cell({}); var dataByText = Cell({}); var readState = function () { return { mode: 'dataset', dataByValue: dataByValue.get(), dataByText: dataByText.get() }; }; var clear = function () { dataByValue.set({}); dataByText.set({}); }; var lookup = function (itemString) { return get$1(dataByValue.get(), itemString).orThunk(function () { return get$1(dataByText.get(), itemString); }); }; var update = function (items) { var currentDataByValue = dataByValue.get(); var currentDataByText = dataByText.get(); var newDataByValue = {}; var newDataByText = {}; each(items, function (item) { newDataByValue[item.value] = item; get$1(item, 'meta').each(function (meta) { get$1(meta, 'text').each(function (text) { newDataByText[text] = item; }); }); }); dataByValue.set(__assign(__assign({}, currentDataByValue), newDataByValue)); dataByText.set(__assign(__assign({}, currentDataByText), newDataByText)); }; return nu$5({ readState: readState, lookup: lookup, update: update, clear: clear }); }; var init$1 = function (spec) { return spec.store.manager.state(spec); }; var RepresentState = /*#__PURE__*/Object.freeze({ __proto__: null, memory: memory, dataset: dataset, manual: manual, init: init$1 }); var setValue$1 = function (component, repConfig, repState, data) { var store = repConfig.store; repState.update([data]); store.setValue(component, data); repConfig.onSetValue(component, data); }; var getValue$1 = function (component, repConfig, repState) { var store = repConfig.store; var key = store.getDataKey(component); return repState.lookup(key).fold(function () { return store.getFallbackEntry(key); }, function (data) { return data; }); }; var onLoad$1 = function (component, repConfig, repState) { var store = repConfig.store; store.initialValue.each(function (data) { setValue$1(component, repConfig, repState, data); }); }; var onUnload$1 = function (component, repConfig, repState) { repState.clear(); }; var DatasetStore = [ option('initialValue'), strict$1('getFallbackEntry'), strict$1('getDataKey'), strict$1('setValue'), output('manager', { setValue: setValue$1, getValue: getValue$1, onLoad: onLoad$1, onUnload: onUnload$1, state: dataset }) ]; var getValue$2 = function (component, repConfig, _repState) { return repConfig.store.getValue(component); }; var setValue$2 = function (component, repConfig, _repState, data) { repConfig.store.setValue(component, data); repConfig.onSetValue(component, data); }; var onLoad$2 = function (component, repConfig, _repState) { repConfig.store.initialValue.each(function (data) { repConfig.store.setValue(component, data); }); }; var ManualStore = [ strict$1('getValue'), defaulted$1('setValue', noop), option('initialValue'), output('manager', { setValue: setValue$2, getValue: getValue$2, onLoad: onLoad$2, onUnload: noop, state: NoState.init }) ]; var setValue$3 = function (component, repConfig, repState, data) { repState.set(data); repConfig.onSetValue(component, data); }; var getValue$3 = function (component, repConfig, repState) { return repState.get(); }; var onLoad$3 = function (component, repConfig, repState) { repConfig.store.initialValue.each(function (initVal) { if (repState.isNotSet()) { repState.set(initVal); } }); }; var onUnload$2 = function (component, repConfig, repState) { repState.clear(); }; var MemoryStore = [ option('initialValue'), output('manager', { setValue: setValue$3, getValue: getValue$3, onLoad: onLoad$3, onUnload: onUnload$2, state: memory }) ]; var RepresentSchema = [ defaultedOf('store', { mode: 'memory' }, choose$1('mode', { memory: MemoryStore, manual: ManualStore, dataset: DatasetStore })), onHandler('onSetValue'), defaulted$1('resetOnDom', false) ]; var Representing = create$1({ fields: RepresentSchema, name: 'representing', active: ActiveRepresenting, apis: RepresentApis, extra: { setValueFrom: function (component, source) { var value = Representing.getValue(source); Representing.setValue(component, value); } }, state: RepresentState }); var field$1 = function (name, forbidden) { return defaultedObjOf(name, {}, map(forbidden, function (f) { return forbid(f.name(), 'Cannot configure ' + f.name() + ' for ' + name); }).concat([state$1('dump', identity)])); }; var get$d = function (data) { return data.dump; }; var augment = function (data, original) { return __assign(__assign({}, data.dump), derive$1(original)); }; var SketchBehaviours = { field: field$1, augment: augment, get: get$d }; var _placeholder = 'placeholder'; var adt$9 = Adt.generate([ { single: [ 'required', 'valueThunk' ] }, { multiple: [ 'required', 'valueThunks' ] } ]); var isSubstituted = function (spec) { return has(spec, 'uiType'); }; var subPlaceholder = function (owner, detail, compSpec, placeholders) { if (owner.exists(function (o) { return o !== compSpec.owner; })) { return adt$9.single(true, constant(compSpec)); } return get$1(placeholders, compSpec.name).fold(function () { throw new Error('Unknown placeholder component: ' + compSpec.name + '\nKnown: [' + keys(placeholders) + ']\nNamespace: ' + owner.getOr('none') + '\nSpec: ' + JSON.stringify(compSpec, null, 2)); }, function (newSpec) { return newSpec.replace(); }); }; var scan = function (owner, detail, compSpec, placeholders) { if (isSubstituted(compSpec) && compSpec.uiType === _placeholder) { return subPlaceholder(owner, detail, compSpec, placeholders); } else { return adt$9.single(false, constant(compSpec)); } }; var substitute = function (owner, detail, compSpec, placeholders) { var base = scan(owner, detail, compSpec, placeholders); return base.fold(function (req, valueThunk) { var value = isSubstituted(compSpec) ? valueThunk(detail, compSpec.config, compSpec.validated) : valueThunk(detail); var childSpecs = get$1(value, 'components').getOr([]); var substituted = bind(childSpecs, function (c) { return substitute(owner, detail, c, placeholders); }); return [__assign(__assign({}, value), { components: substituted })]; }, function (req, valuesThunk) { if (isSubstituted(compSpec)) { var values = valuesThunk(detail, compSpec.config, compSpec.validated); var preprocessor = compSpec.validated.preprocess.getOr(identity); return preprocessor(values); } else { return valuesThunk(detail); } }); }; var substituteAll = function (owner, detail, components, placeholders) { return bind(components, function (c) { return substitute(owner, detail, c, placeholders); }); }; var oneReplace = function (label, replacements) { var called = false; var used = function () { return called; }; var replace = function () { if (called) { throw new Error('Trying to use the same placeholder more than once: ' + label); } called = true; return replacements; }; var required = function () { return replacements.fold(function (req, _) { return req; }, function (req, _) { return req; }); }; return { name: constant(label), required: required, used: used, replace: replace }; }; var substitutePlaces = function (owner, detail, components, placeholders) { var ps = map$2(placeholders, function (ph, name) { return oneReplace(name, ph); }); var outcome = substituteAll(owner, detail, components, ps); each$1(ps, function (p) { if (p.used() === false && p.required()) { throw new Error('Placeholder: ' + p.name() + ' was not found in components list\nNamespace: ' + owner.getOr('none') + '\nComponents: ' + JSON.stringify(detail.components, null, 2)); } }); return outcome; }; var single = adt$9.single; var multiple = adt$9.multiple; var placeholder = constant(_placeholder); var adt$a = Adt.generate([ { required: ['data'] }, { external: ['data'] }, { optional: ['data'] }, { group: ['data'] } ]); var fFactory = defaulted$1('factory', { sketch: identity }); var fSchema = defaulted$1('schema', []); var fName = strict$1('name'); var fPname = field('pname', 'pname', defaultedThunk(function (typeSpec) { return ''; }), anyValue$1()); var fGroupSchema = state$1('schema', function () { return [option('preprocess')]; }); var fDefaults = defaulted$1('defaults', constant({})); var fOverrides = defaulted$1('overrides', constant({})); var requiredSpec = objOf([ fFactory, fSchema, fName, fPname, fDefaults, fOverrides ]); var externalSpec = objOf([ fFactory, fSchema, fName, fDefaults, fOverrides ]); var optionalSpec = objOf([ fFactory, fSchema, fName, fPname, fDefaults, fOverrides ]); var groupSpec = objOf([ fFactory, fGroupSchema, fName, strict$1('unit'), fPname, fDefaults, fOverrides ]); var asNamedPart = function (part) { return part.fold(Optional.some, Optional.none, Optional.some, Optional.some); }; var name$1 = function (part) { var get = function (data) { return data.name; }; return part.fold(get, get, get, get); }; var asCommon = function (part) { return part.fold(identity, identity, identity, identity); }; var convert = function (adtConstructor, partSchema) { return function (spec) { var data = asRawOrDie('Converting part type', partSchema, spec); return adtConstructor(data); }; }; var required = convert(adt$a.required, requiredSpec); var external$1 = convert(adt$a.external, externalSpec); var optional = convert(adt$a.optional, optionalSpec); var group = convert(adt$a.group, groupSpec); var original = constant('entirety'); var PartType = /*#__PURE__*/Object.freeze({ __proto__: null, required: required, external: external$1, optional: optional, group: group, asNamedPart: asNamedPart, name: name$1, asCommon: asCommon, original: original }); var combine$2 = function (detail, data, partSpec, partValidated) { return deepMerge(data.defaults(detail, partSpec, partValidated), partSpec, { uid: detail.partUids[data.name] }, data.overrides(detail, partSpec, partValidated)); }; var subs = function (owner, detail, parts) { var internals = {}; var externals = {}; each(parts, function (part) { part.fold(function (data) { internals[data.pname] = single(true, function (detail, partSpec, partValidated) { return data.factory.sketch(combine$2(detail, data, partSpec, partValidated)); }); }, function (data) { var partSpec = detail.parts[data.name]; externals[data.name] = constant(data.factory.sketch(combine$2(detail, data, partSpec[original()]), partSpec)); }, function (data) { internals[data.pname] = single(false, function (detail, partSpec, partValidated) { return data.factory.sketch(combine$2(detail, data, partSpec, partValidated)); }); }, function (data) { internals[data.pname] = multiple(true, function (detail, _partSpec, _partValidated) { var units = detail[data.name]; return map(units, function (u) { return data.factory.sketch(deepMerge(data.defaults(detail, u, _partValidated), u, data.overrides(detail, u))); }); }); }); }); return { internals: constant(internals), externals: constant(externals) }; }; var generate$4 = function (owner, parts) { var r = {}; each(parts, function (part) { asNamedPart(part).each(function (np) { var g = doGenerateOne(owner, np.pname); r[np.name] = function (config) { var validated = asRawOrDie('Part: ' + np.name + ' in ' + owner, objOf(np.schema), config); return __assign(__assign({}, g), { config: config, validated: validated }); }; }); }); return r; }; var doGenerateOne = function (owner, pname) { return { uiType: placeholder(), owner: owner, name: pname }; }; var generateOne = function (owner, pname, config) { return { uiType: placeholder(), owner: owner, name: pname, config: config, validated: {} }; }; var schemas = function (parts) { return bind(parts, function (part) { return part.fold(Optional.none, Optional.some, Optional.none, Optional.none).map(function (data) { return strictObjOf(data.name, data.schema.concat([snapshot(original())])); }).toArray(); }); }; var names = function (parts) { return map(parts, name$1); }; var substitutes = function (owner, detail, parts) { return subs(owner, detail, parts); }; var components = function (owner, detail, internals) { return substitutePlaces(Optional.some(owner), detail, detail.components, internals); }; var getPart = function (component, detail, partKey) { var uid = detail.partUids[partKey]; return component.getSystem().getByUid(uid).toOptional(); }; var getPartOrDie = function (component, detail, partKey) { return getPart(component, detail, partKey).getOrDie('Could not find part: ' + partKey); }; var getParts = function (component, detail, partKeys) { var r = {}; var uids = detail.partUids; var system = component.getSystem(); each(partKeys, function (pk) { r[pk] = constant(system.getByUid(uids[pk])); }); return r; }; var getAllParts = function (component, detail) { var system = component.getSystem(); return map$2(detail.partUids, function (pUid, _k) { return constant(system.getByUid(pUid)); }); }; var getAllPartNames = function (detail) { return keys(detail.partUids); }; var getPartsOrDie = function (component, detail, partKeys) { var r = {}; var uids = detail.partUids; var system = component.getSystem(); each(partKeys, function (pk) { r[pk] = constant(system.getByUid(uids[pk]).getOrDie()); }); return r; }; var defaultUids = function (baseUid, partTypes) { var partNames = names(partTypes); return wrapAll$1(map(partNames, function (pn) { return { key: pn, value: baseUid + '-' + pn }; })); }; var defaultUidsSchema = function (partTypes) { return field('partUids', 'partUids', mergeWithThunk(function (spec) { return defaultUids(spec.uid, partTypes); }), anyValue$1()); }; var AlloyParts = /*#__PURE__*/Object.freeze({ __proto__: null, generate: generate$4, generateOne: generateOne, schemas: schemas, names: names, substitutes: substitutes, components: components, defaultUids: defaultUids, defaultUidsSchema: defaultUidsSchema, getAllParts: getAllParts, getAllPartNames: getAllPartNames, getPart: getPart, getPartOrDie: getPartOrDie, getParts: getParts, getPartsOrDie: getPartsOrDie }); var base = function (partSchemas, partUidsSchemas) { var ps = partSchemas.length > 0 ? [strictObjOf('parts', partSchemas)] : []; return ps.concat([ strict$1('uid'), defaulted$1('dom', {}), defaulted$1('components', []), snapshot('originalSpec'), defaulted$1('debug.sketcher', {}) ]).concat(partUidsSchemas); }; var asRawOrDie$1 = function (label, schema, spec, partSchemas, partUidsSchemas) { var baseS = base(partSchemas, partUidsSchemas); return asRawOrDie(label + ' [SpecSchema]', objOfOnly(baseS.concat(schema)), spec); }; var single$1 = function (owner, schema, factory, spec) { var specWithUid = supplyUid(spec); var detail = asRawOrDie$1(owner, schema, specWithUid, [], []); return factory(detail, specWithUid); }; var composite = function (owner, schema, partTypes, factory, spec) { var specWithUid = supplyUid(spec); var partSchemas = schemas(partTypes); var partUidsSchema = defaultUidsSchema(partTypes); var detail = asRawOrDie$1(owner, schema, specWithUid, partSchemas, [partUidsSchema]); var subs = substitutes(owner, detail, partTypes); var components$1 = components(owner, detail, subs.internals()); return factory(detail, components$1, specWithUid, subs.externals()); }; var hasUid = function (spec) { return has(spec, 'uid'); }; var supplyUid = function (spec) { return hasUid(spec) ? spec : __assign(__assign({}, spec), { uid: generate$2('uid') }); }; var isSketchSpec = function (spec) { return spec.uid !== undefined; }; var singleSchema = objOfOnly([ strict$1('name'), strict$1('factory'), strict$1('configFields'), defaulted$1('apis', {}), defaulted$1('extraApis', {}) ]); var compositeSchema = objOfOnly([ strict$1('name'), strict$1('factory'), strict$1('configFields'), strict$1('partFields'), defaulted$1('apis', {}), defaulted$1('extraApis', {}) ]); var single$2 = function (rawConfig) { var config = asRawOrDie('Sketcher for ' + rawConfig.name, singleSchema, rawConfig); var sketch = function (spec) { return single$1(config.name, config.configFields, config.factory, spec); }; var apis = map$2(config.apis, makeApi); var extraApis = map$2(config.extraApis, function (f, k) { return markAsExtraApi(f, k); }); return __assign(__assign({ name: config.name, configFields: config.configFields, sketch: sketch }, apis), extraApis); }; var composite$1 = function (rawConfig) { var config = asRawOrDie('Sketcher for ' + rawConfig.name, compositeSchema, rawConfig); var sketch = function (spec) { return composite(config.name, config.configFields, config.partFields, config.factory, spec); }; var parts = generate$4(config.name, config.partFields); var apis = map$2(config.apis, makeApi); var extraApis = map$2(config.extraApis, function (f, k) { return markAsExtraApi(f, k); }); return __assign(__assign({ name: config.name, partFields: config.partFields, configFields: config.configFields, sketch: sketch, parts: parts }, apis), extraApis); }; var cat = function (arr) { var r = []; var push = function (x) { r.push(x); }; for (var i = 0; i < arr.length; i++) { arr[i].each(push); } return r; }; var sequence = function (arr) { var r = []; for (var i = 0; i < arr.length; i++) { var x = arr[i]; if (x.isSome()) { r.push(x.getOrDie()); } else { return Optional.none(); } } return Optional.some(r); }; var lift2 = function (oa, ob, f) { return oa.isSome() && ob.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie())) : Optional.none(); }; var lift3 = function (oa, ob, oc, f) { return oa.isSome() && ob.isSome() && oc.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie(), oc.getOrDie())) : Optional.none(); }; var mapFrom = function (a, f) { return a !== undefined && a !== null ? Optional.some(f(a)) : Optional.none(); }; var someIf = function (b, a) { return b ? Optional.some(a) : Optional.none(); }; var inside = function (target) { return name(target) === 'input' && get$3(target, 'type') !== 'radio' || name(target) === 'textarea'; }; var getCurrent = function (component, composeConfig, _composeState) { return composeConfig.find(component); }; var ComposeApis = /*#__PURE__*/Object.freeze({ __proto__: null, getCurrent: getCurrent }); var ComposeSchema = [strict$1('find')]; var Composing = create$1({ fields: ComposeSchema, name: 'composing', apis: ComposeApis }); var dehighlightAllExcept = function (component, hConfig, hState, skip) { var highlighted = descendants(component.element, '.' + hConfig.highlightClass); each(highlighted, function (h) { if (!exists(skip, function (skipComp) { return skipComp.element === h; })) { remove$4(h, hConfig.highlightClass); component.getSystem().getByDom(h).each(function (target) { hConfig.onDehighlight(component, target); emit(target, dehighlight()); }); } }); }; var dehighlightAll = function (component, hConfig, hState) { return dehighlightAllExcept(component, hConfig, hState, []); }; var dehighlight$1 = function (component, hConfig, hState, target) { if (isHighlighted(component, hConfig, hState, target)) { remove$4(target.element, hConfig.highlightClass); hConfig.onDehighlight(component, target); emit(target, dehighlight()); } }; var highlight$1 = function (component, hConfig, hState, target) { dehighlightAllExcept(component, hConfig, hState, [target]); if (!isHighlighted(component, hConfig, hState, target)) { add$2(target.element, hConfig.highlightClass); hConfig.onHighlight(component, target); emit(target, highlight()); } }; var highlightFirst = function (component, hConfig, hState) { getFirst(component, hConfig).each(function (firstComp) { highlight$1(component, hConfig, hState, firstComp); }); }; var highlightLast = function (component, hConfig, hState) { getLast(component, hConfig).each(function (lastComp) { highlight$1(component, hConfig, hState, lastComp); }); }; var highlightAt = function (component, hConfig, hState, index) { getByIndex(component, hConfig, hState, index).fold(function (err) { throw err; }, function (firstComp) { highlight$1(component, hConfig, hState, firstComp); }); }; var highlightBy = function (component, hConfig, hState, predicate) { var candidates = getCandidates(component, hConfig); var targetComp = find(candidates, predicate); targetComp.each(function (c) { highlight$1(component, hConfig, hState, c); }); }; var isHighlighted = function (component, hConfig, hState, queryTarget) { return has$2(queryTarget.element, hConfig.highlightClass); }; var getHighlighted = function (component, hConfig, _hState) { return descendant$1(component.element, '.' + hConfig.highlightClass).bind(function (e) { return component.getSystem().getByDom(e).toOptional(); }); }; var getByIndex = function (component, hConfig, hState, index) { var items = descendants(component.element, '.' + hConfig.itemClass); return Optional.from(items[index]).fold(function () { return Result.error(new Error('No element found with index ' + index)); }, component.getSystem().getByDom); }; var getFirst = function (component, hConfig, _hState) { return descendant$1(component.element, '.' + hConfig.itemClass).bind(function (e) { return component.getSystem().getByDom(e).toOptional(); }); }; var getLast = function (component, hConfig, _hState) { var items = descendants(component.element, '.' + hConfig.itemClass); var last = items.length > 0 ? Optional.some(items[items.length - 1]) : Optional.none(); return last.bind(function (c) { return component.getSystem().getByDom(c).toOptional(); }); }; var getDelta = function (component, hConfig, hState, delta) { var items = descendants(component.element, '.' + hConfig.itemClass); var current = findIndex(items, function (item) { return has$2(item, hConfig.highlightClass); }); return current.bind(function (selected) { var dest = cycleBy(selected, delta, 0, items.length - 1); return component.getSystem().getByDom(items[dest]).toOptional(); }); }; var getPrevious = function (component, hConfig, hState) { return getDelta(component, hConfig, hState, -1); }; var getNext = function (component, hConfig, hState) { return getDelta(component, hConfig, hState, +1); }; var getCandidates = function (component, hConfig, _hState) { var items = descendants(component.element, '.' + hConfig.itemClass); return cat(map(items, function (i) { return component.getSystem().getByDom(i).toOptional(); })); }; var HighlightApis = /*#__PURE__*/Object.freeze({ __proto__: null, dehighlightAll: dehighlightAll, dehighlight: dehighlight$1, highlight: highlight$1, highlightFirst: highlightFirst, highlightLast: highlightLast, highlightAt: highlightAt, highlightBy: highlightBy, isHighlighted: isHighlighted, getHighlighted: getHighlighted, getFirst: getFirst, getLast: getLast, getPrevious: getPrevious, getNext: getNext, getCandidates: getCandidates }); var HighlightSchema = [ strict$1('highlightClass'), strict$1('itemClass'), onHandler('onHighlight'), onHandler('onDehighlight') ]; var Highlighting = create$1({ fields: HighlightSchema, name: 'highlighting', apis: HighlightApis }); var BACKSPACE = [8]; var TAB = [9]; var ENTER = [13]; var ESCAPE = [27]; var SPACE = [32]; var LEFT = [37]; var UP = [38]; var RIGHT = [39]; var DOWN = [40]; var cyclePrev = function (values, index, predicate) { var before = reverse(values.slice(0, index)); var after = reverse(values.slice(index + 1)); return find(before.concat(after), predicate); }; var tryPrev = function (values, index, predicate) { var before = reverse(values.slice(0, index)); return find(before, predicate); }; var cycleNext = function (values, index, predicate) { var before = values.slice(0, index); var after = values.slice(index + 1); return find(after.concat(before), predicate); }; var tryNext = function (values, index, predicate) { var after = values.slice(index + 1); return find(after, predicate); }; var inSet = function (keys) { return function (event) { var raw = event.raw; return contains(keys, raw.which); }; }; var and = function (preds) { return function (event) { return forall(preds, function (pred) { return pred(event); }); }; }; var isShift = function (event) { var raw = event.raw; return raw.shiftKey === true; }; var isControl = function (event) { var raw = event.raw; return raw.ctrlKey === true; }; var isNotShift = not(isShift); var rule = function (matches, action) { return { matches: matches, classification: action }; }; var choose$2 = function (transitions, event) { var transition = find(transitions, function (t) { return t.matches(event); }); return transition.map(function (t) { return t.classification; }); }; var reportFocusShifting = function (component, prevFocus, newFocus) { var noChange = prevFocus.exists(function (p) { return newFocus.exists(function (n) { return eq$1(n, p); }); }); if (!noChange) { emitWith(component, focusShifted(), { prevFocus: prevFocus, newFocus: newFocus }); } }; var dom = function () { var get = function (component) { return search(component.element); }; var set = function (component, focusee) { var prevFocus = get(component); component.getSystem().triggerFocus(focusee, component.element); var newFocus = get(component); reportFocusShifting(component, prevFocus, newFocus); }; return { get: get, set: set }; }; var highlights = function () { var get = function (component) { return Highlighting.getHighlighted(component).map(function (item) { return item.element; }); }; var set = function (component, element) { var prevFocus = get(component); component.getSystem().getByDom(element).fold(noop, function (item) { Highlighting.highlight(component, item); }); var newFocus = get(component); reportFocusShifting(component, prevFocus, newFocus); }; return { get: get, set: set }; }; var FocusInsideModes; (function (FocusInsideModes) { FocusInsideModes['OnFocusMode'] = 'onFocus'; FocusInsideModes['OnEnterOrSpaceMode'] = 'onEnterOrSpace'; FocusInsideModes['OnApiMode'] = 'onApi'; }(FocusInsideModes || (FocusInsideModes = {}))); var typical = function (infoSchema, stateInit, getKeydownRules, getKeyupRules, optFocusIn) { var schema = function () { return infoSchema.concat([ defaulted$1('focusManager', dom()), defaultedOf('focusInside', 'onFocus', valueOf(function (val) { return contains([ 'onFocus', 'onEnterOrSpace', 'onApi' ], val) ? Result.value(val) : Result.error('Invalid value for focusInside'); })), output('handler', me), output('state', stateInit), output('sendFocusIn', optFocusIn) ]); }; var processKey = function (component, simulatedEvent, getRules, keyingConfig, keyingState) { var rules = getRules(component, simulatedEvent, keyingConfig, keyingState); return choose$2(rules, simulatedEvent.event).bind(function (rule) { return rule(component, simulatedEvent, keyingConfig, keyingState); }); }; var toEvents = function (keyingConfig, keyingState) { var onFocusHandler = keyingConfig.focusInside !== FocusInsideModes.OnFocusMode ? Optional.none() : optFocusIn(keyingConfig).map(function (focusIn) { return run(focus(), function (component, simulatedEvent) { focusIn(component, keyingConfig, keyingState); simulatedEvent.stop(); }); }); var tryGoInsideComponent = function (component, simulatedEvent) { var isEnterOrSpace = inSet(SPACE.concat(ENTER))(simulatedEvent.event); if (keyingConfig.focusInside === FocusInsideModes.OnEnterOrSpaceMode && isEnterOrSpace && isSource(component, simulatedEvent)) { optFocusIn(keyingConfig).each(function (focusIn) { focusIn(component, keyingConfig, keyingState); simulatedEvent.stop(); }); } }; var keyboardEvents = [ run(keydown(), function (component, simulatedEvent) { processKey(component, simulatedEvent, getKeydownRules, keyingConfig, keyingState).fold(function () { tryGoInsideComponent(component, simulatedEvent); }, function (_) { simulatedEvent.stop(); }); }), run(keyup(), function (component, simulatedEvent) { processKey(component, simulatedEvent, getKeyupRules, keyingConfig, keyingState).each(function (_) { simulatedEvent.stop(); }); }) ]; return derive(onFocusHandler.toArray().concat(keyboardEvents)); }; var me = { schema: schema, processKey: processKey, toEvents: toEvents }; return me; }; var create$3 = function (cyclicField) { var schema = [ option('onEscape'), option('onEnter'), defaulted$1('selector', '[data-alloy-tabstop="true"]:not(:disabled)'), defaulted$1('firstTabstop', 0), defaulted$1('useTabstopAt', always), option('visibilitySelector') ].concat([cyclicField]); var isVisible = function (tabbingConfig, element) { var target = tabbingConfig.visibilitySelector.bind(function (sel) { return closest$3(element, sel); }).getOr(element); return get$7(target) > 0; }; var findInitial = function (component, tabbingConfig) { var tabstops = descendants(component.element, tabbingConfig.selector); var visibles = filter(tabstops, function (elem) { return isVisible(tabbingConfig, elem); }); return Optional.from(visibles[tabbingConfig.firstTabstop]); }; var findCurrent = function (component, tabbingConfig) { return tabbingConfig.focusManager.get(component).bind(function (elem) { return closest$3(elem, tabbingConfig.selector); }); }; var isTabstop = function (tabbingConfig, element) { return isVisible(tabbingConfig, element) && tabbingConfig.useTabstopAt(element); }; var focusIn = function (component, tabbingConfig, _tabbingState) { findInitial(component, tabbingConfig).each(function (target) { tabbingConfig.focusManager.set(component, target); }); }; var goFromTabstop = function (component, tabstops, stopIndex, tabbingConfig, cycle) { return cycle(tabstops, stopIndex, function (elem) { return isTabstop(tabbingConfig, elem); }).fold(function () { return tabbingConfig.cyclic ? Optional.some(true) : Optional.none(); }, function (target) { tabbingConfig.focusManager.set(component, target); return Optional.some(true); }); }; var go = function (component, _simulatedEvent, tabbingConfig, cycle) { var tabstops = descendants(component.element, tabbingConfig.selector); return findCurrent(component, tabbingConfig).bind(function (tabstop) { var optStopIndex = findIndex(tabstops, curry(eq$1, tabstop)); return optStopIndex.bind(function (stopIndex) { return goFromTabstop(component, tabstops, stopIndex, tabbingConfig, cycle); }); }); }; var goBackwards = function (component, simulatedEvent, tabbingConfig) { var navigate = tabbingConfig.cyclic ? cyclePrev : tryPrev; return go(component, simulatedEvent, tabbingConfig, navigate); }; var goForwards = function (component, simulatedEvent, tabbingConfig) { var navigate = tabbingConfig.cyclic ? cycleNext : tryNext; return go(component, simulatedEvent, tabbingConfig, navigate); }; var execute = function (component, simulatedEvent, tabbingConfig) { return tabbingConfig.onEnter.bind(function (f) { return f(component, simulatedEvent); }); }; var exit = function (component, simulatedEvent, tabbingConfig) { return tabbingConfig.onEscape.bind(function (f) { return f(component, simulatedEvent); }); }; var getKeydownRules = constant([ rule(and([ isShift, inSet(TAB) ]), goBackwards), rule(inSet(TAB), goForwards), rule(inSet(ESCAPE), exit), rule(and([ isNotShift, inSet(ENTER) ]), execute) ]); var getKeyupRules = constant([]); return typical(schema, NoState.init, getKeydownRules, getKeyupRules, function () { return Optional.some(focusIn); }); }; var AcyclicType = create$3(state$1('cyclic', never)); var CyclicType = create$3(state$1('cyclic', always)); var doDefaultExecute = function (component, _simulatedEvent, focused) { dispatch(component, focused, execute()); return Optional.some(true); }; var defaultExecute = function (component, simulatedEvent, focused) { var isComplex = inside(focused) && inSet(SPACE)(simulatedEvent.event); return isComplex ? Optional.none() : doDefaultExecute(component, simulatedEvent, focused); }; var stopEventForFirefox = function (_component, _simulatedEvent) { return Optional.some(true); }; var schema$4 = [ defaulted$1('execute', defaultExecute), defaulted$1('useSpace', false), defaulted$1('useEnter', true), defaulted$1('useControlEnter', false), defaulted$1('useDown', false) ]; var execute$1 = function (component, simulatedEvent, executeConfig) { return executeConfig.execute(component, simulatedEvent, component.element); }; var getKeydownRules = function (component, _simulatedEvent, executeConfig, _executeState) { var spaceExec = executeConfig.useSpace && !inside(component.element) ? SPACE : []; var enterExec = executeConfig.useEnter ? ENTER : []; var downExec = executeConfig.useDown ? DOWN : []; var execKeys = spaceExec.concat(enterExec).concat(downExec); return [rule(inSet(execKeys), execute$1)].concat(executeConfig.useControlEnter ? [rule(and([ isControl, inSet(ENTER) ]), execute$1)] : []); }; var getKeyupRules = function (component, _simulatedEvent, executeConfig, _executeState) { return executeConfig.useSpace && !inside(component.element) ? [rule(inSet(SPACE), stopEventForFirefox)] : []; }; var ExecutionType = typical(schema$4, NoState.init, getKeydownRules, getKeyupRules, function () { return Optional.none(); }); var flatgrid = function () { var dimensions = Cell(Optional.none()); var setGridSize = function (numRows, numColumns) { dimensions.set(Optional.some({ numRows: numRows, numColumns: numColumns })); }; var getNumRows = function () { return dimensions.get().map(function (d) { return d.numRows; }); }; var getNumColumns = function () { return dimensions.get().map(function (d) { return d.numColumns; }); }; return nu$5({ readState: function () { return dimensions.get().map(function (d) { return { numRows: String(d.numRows), numColumns: String(d.numColumns) }; }).getOr({ numRows: '?', numColumns: '?' }); }, setGridSize: setGridSize, getNumRows: getNumRows, getNumColumns: getNumColumns }); }; var init$2 = function (spec) { return spec.state(spec); }; var KeyingState = /*#__PURE__*/Object.freeze({ __proto__: null, flatgrid: flatgrid, init: init$2 }); var useH = function (movement) { return function (component, simulatedEvent, config, state) { var move = movement(component.element); return use(move, component, simulatedEvent, config, state); }; }; var west$2 = function (moveLeft, moveRight) { var movement = onDirection(moveLeft, moveRight); return useH(movement); }; var east$2 = function (moveLeft, moveRight) { var movement = onDirection(moveRight, moveLeft); return useH(movement); }; var useV = function (move) { return function (component, simulatedEvent, config, state) { return use(move, component, simulatedEvent, config, state); }; }; var use = function (move, component, simulatedEvent, config, state) { var outcome = config.focusManager.get(component).bind(function (focused) { return move(component.element, focused, config, state); }); return outcome.map(function (newFocus) { config.focusManager.set(component, newFocus); return true; }); }; var north$2 = useV; var south$2 = useV; var move = useV; var isHidden = function (dom) { return dom.offsetWidth <= 0 && dom.offsetHeight <= 0; }; var isVisible = function (element) { return !isHidden(element.dom); }; var locate = function (candidates, predicate) { return findIndex(candidates, predicate).map(function (index) { return { index: index, candidates: candidates }; }); }; var locateVisible = function (container, current, selector) { var predicate = function (x) { return eq$1(x, current); }; var candidates = descendants(container, selector); var visible = filter(candidates, isVisible); return locate(visible, predicate); }; var findIndex$1 = function (elements, target) { return findIndex(elements, function (elem) { return eq$1(target, elem); }); }; var withGrid = function (values, index, numCols, f) { var oldRow = Math.floor(index / numCols); var oldColumn = index % numCols; return f(oldRow, oldColumn).bind(function (address) { var newIndex = address.row * numCols + address.column; return newIndex >= 0 && newIndex < values.length ? Optional.some(values[newIndex]) : Optional.none(); }); }; var cycleHorizontal = function (values, index, numRows, numCols, delta) { return withGrid(values, index, numCols, function (oldRow, oldColumn) { var onLastRow = oldRow === numRows - 1; var colsInRow = onLastRow ? values.length - oldRow * numCols : numCols; var newColumn = cycleBy(oldColumn, delta, 0, colsInRow - 1); return Optional.some({ row: oldRow, column: newColumn }); }); }; var cycleVertical = function (values, index, numRows, numCols, delta) { return withGrid(values, index, numCols, function (oldRow, oldColumn) { var newRow = cycleBy(oldRow, delta, 0, numRows - 1); var onLastRow = newRow === numRows - 1; var colsInRow = onLastRow ? values.length - newRow * numCols : numCols; var newCol = clamp(oldColumn, 0, colsInRow - 1); return Optional.some({ row: newRow, column: newCol }); }); }; var cycleRight = function (values, index, numRows, numCols) { return cycleHorizontal(values, index, numRows, numCols, +1); }; var cycleLeft = function (values, index, numRows, numCols) { return cycleHorizontal(values, index, numRows, numCols, -1); }; var cycleUp = function (values, index, numRows, numCols) { return cycleVertical(values, index, numRows, numCols, -1); }; var cycleDown = function (values, index, numRows, numCols) { return cycleVertical(values, index, numRows, numCols, +1); }; var schema$5 = [ strict$1('selector'), defaulted$1('execute', defaultExecute), onKeyboardHandler('onEscape'), defaulted$1('captureTab', false), initSize() ]; var focusIn = function (component, gridConfig, _gridState) { descendant$1(component.element, gridConfig.selector).each(function (first) { gridConfig.focusManager.set(component, first); }); }; var findCurrent = function (component, gridConfig) { return gridConfig.focusManager.get(component).bind(function (elem) { return closest$3(elem, gridConfig.selector); }); }; var execute$2 = function (component, simulatedEvent, gridConfig, _gridState) { return findCurrent(component, gridConfig).bind(function (focused) { return gridConfig.execute(component, simulatedEvent, focused); }); }; var doMove = function (cycle) { return function (element, focused, gridConfig, gridState) { return locateVisible(element, focused, gridConfig.selector).bind(function (identified) { return cycle(identified.candidates, identified.index, gridState.getNumRows().getOr(gridConfig.initSize.numRows), gridState.getNumColumns().getOr(gridConfig.initSize.numColumns)); }); }; }; var handleTab = function (_component, _simulatedEvent, gridConfig) { return gridConfig.captureTab ? Optional.some(true) : Optional.none(); }; var doEscape = function (component, simulatedEvent, gridConfig) { return gridConfig.onEscape(component, simulatedEvent); }; var moveLeft = doMove(cycleLeft); var moveRight = doMove(cycleRight); var moveNorth = doMove(cycleUp); var moveSouth = doMove(cycleDown); var getKeydownRules$1 = constant([ rule(inSet(LEFT), west$2(moveLeft, moveRight)), rule(inSet(RIGHT), east$2(moveLeft, moveRight)), rule(inSet(UP), north$2(moveNorth)), rule(inSet(DOWN), south$2(moveSouth)), rule(and([ isShift, inSet(TAB) ]), handleTab), rule(and([ isNotShift, inSet(TAB) ]), handleTab), rule(inSet(ESCAPE), doEscape), rule(inSet(SPACE.concat(ENTER)), execute$2) ]); var getKeyupRules$1 = constant([rule(inSet(SPACE), stopEventForFirefox)]); var FlatgridType = typical(schema$5, flatgrid, getKeydownRules$1, getKeyupRules$1, function () { return Optional.some(focusIn); }); var horizontal = function (container, selector, current, delta) { var isDisabledButton = function (candidate) { return name(candidate) === 'button' && get$3(candidate, 'disabled') === 'disabled'; }; var tryCycle = function (initial, index, candidates) { var newIndex = cycleBy(index, delta, 0, candidates.length - 1); if (newIndex === initial) { return Optional.none(); } else { return isDisabledButton(candidates[newIndex]) ? tryCycle(initial, newIndex, candidates) : Optional.from(candidates[newIndex]); } }; return locateVisible(container, current, selector).bind(function (identified) { var index = identified.index; var candidates = identified.candidates; return tryCycle(index, index, candidates); }); }; var schema$6 = [ strict$1('selector'), defaulted$1('getInitial', Optional.none), defaulted$1('execute', defaultExecute), onKeyboardHandler('onEscape'), defaulted$1('executeOnMove', false), defaulted$1('allowVertical', true) ]; var findCurrent$1 = function (component, flowConfig) { return flowConfig.focusManager.get(component).bind(function (elem) { return closest$3(elem, flowConfig.selector); }); }; var execute$3 = function (component, simulatedEvent, flowConfig) { return findCurrent$1(component, flowConfig).bind(function (focused) { return flowConfig.execute(component, simulatedEvent, focused); }); }; var focusIn$1 = function (component, flowConfig, _state) { flowConfig.getInitial(component).orThunk(function () { return descendant$1(component.element, flowConfig.selector); }).each(function (first) { flowConfig.focusManager.set(component, first); }); }; var moveLeft$1 = function (element, focused, info) { return horizontal(element, info.selector, focused, -1); }; var moveRight$1 = function (element, focused, info) { return horizontal(element, info.selector, focused, +1); }; var doMove$1 = function (movement) { return function (component, simulatedEvent, flowConfig, flowState) { return movement(component, simulatedEvent, flowConfig, flowState).bind(function () { return flowConfig.executeOnMove ? execute$3(component, simulatedEvent, flowConfig) : Optional.some(true); }); }; }; var doEscape$1 = function (component, simulatedEvent, flowConfig) { return flowConfig.onEscape(component, simulatedEvent); }; var getKeydownRules$2 = function (_component, _se, flowConfig, _flowState) { var westMovers = LEFT.concat(flowConfig.allowVertical ? UP : []); var eastMovers = RIGHT.concat(flowConfig.allowVertical ? DOWN : []); return [ rule(inSet(westMovers), doMove$1(west$2(moveLeft$1, moveRight$1))), rule(inSet(eastMovers), doMove$1(east$2(moveLeft$1, moveRight$1))), rule(inSet(ENTER), execute$3), rule(inSet(SPACE), execute$3), rule(inSet(ESCAPE), doEscape$1) ]; }; var getKeyupRules$2 = constant([rule(inSet(SPACE), stopEventForFirefox)]); var FlowType = typical(schema$6, NoState.init, getKeydownRules$2, getKeyupRules$2, function () { return Optional.some(focusIn$1); }); var toCell = function (matrix, rowIndex, columnIndex) { return Optional.from(matrix[rowIndex]).bind(function (row) { return Optional.from(row[columnIndex]).map(function (cell) { return { rowIndex: rowIndex, columnIndex: columnIndex, cell: cell }; }); }); }; var cycleHorizontal$1 = function (matrix, rowIndex, startCol, deltaCol) { var row = matrix[rowIndex]; var colsInRow = row.length; var newColIndex = cycleBy(startCol, deltaCol, 0, colsInRow - 1); return toCell(matrix, rowIndex, newColIndex); }; var cycleVertical$1 = function (matrix, colIndex, startRow, deltaRow) { var nextRowIndex = cycleBy(startRow, deltaRow, 0, matrix.length - 1); var colsInNextRow = matrix[nextRowIndex].length; var nextColIndex = clamp(colIndex, 0, colsInNextRow - 1); return toCell(matrix, nextRowIndex, nextColIndex); }; var moveHorizontal = function (matrix, rowIndex, startCol, deltaCol) { var row = matrix[rowIndex]; var colsInRow = row.length; var newColIndex = clamp(startCol + deltaCol, 0, colsInRow - 1); return toCell(matrix, rowIndex, newColIndex); }; var moveVertical = function (matrix, colIndex, startRow, deltaRow) { var nextRowIndex = clamp(startRow + deltaRow, 0, matrix.length - 1); var colsInNextRow = matrix[nextRowIndex].length; var nextColIndex = clamp(colIndex, 0, colsInNextRow - 1); return toCell(matrix, nextRowIndex, nextColIndex); }; var cycleRight$1 = function (matrix, startRow, startCol) { return cycleHorizontal$1(matrix, startRow, startCol, +1); }; var cycleLeft$1 = function (matrix, startRow, startCol) { return cycleHorizontal$1(matrix, startRow, startCol, -1); }; var cycleUp$1 = function (matrix, startRow, startCol) { return cycleVertical$1(matrix, startCol, startRow, -1); }; var cycleDown$1 = function (matrix, startRow, startCol) { return cycleVertical$1(matrix, startCol, startRow, +1); }; var moveLeft$2 = function (matrix, startRow, startCol) { return moveHorizontal(matrix, startRow, startCol, -1); }; var moveRight$2 = function (matrix, startRow, startCol) { return moveHorizontal(matrix, startRow, startCol, +1); }; var moveUp = function (matrix, startRow, startCol) { return moveVertical(matrix, startCol, startRow, -1); }; var moveDown = function (matrix, startRow, startCol) { return moveVertical(matrix, startCol, startRow, +1); }; var schema$7 = [ strictObjOf('selectors', [ strict$1('row'), strict$1('cell') ]), defaulted$1('cycles', true), defaulted$1('previousSelector', Optional.none), defaulted$1('execute', defaultExecute) ]; var focusIn$2 = function (component, matrixConfig, _state) { var focused = matrixConfig.previousSelector(component).orThunk(function () { var selectors = matrixConfig.selectors; return descendant$1(component.element, selectors.cell); }); focused.each(function (cell) { matrixConfig.focusManager.set(component, cell); }); }; var execute$4 = function (component, simulatedEvent, matrixConfig) { return search(component.element).bind(function (focused) { return matrixConfig.execute(component, simulatedEvent, focused); }); }; var toMatrix = function (rows, matrixConfig) { return map(rows, function (row) { return descendants(row, matrixConfig.selectors.cell); }); }; var doMove$2 = function (ifCycle, ifMove) { return function (element, focused, matrixConfig) { var move = matrixConfig.cycles ? ifCycle : ifMove; return closest$3(focused, matrixConfig.selectors.row).bind(function (inRow) { var cellsInRow = descendants(inRow, matrixConfig.selectors.cell); return findIndex$1(cellsInRow, focused).bind(function (colIndex) { var allRows = descendants(element, matrixConfig.selectors.row); return findIndex$1(allRows, inRow).bind(function (rowIndex) { var matrix = toMatrix(allRows, matrixConfig); return move(matrix, rowIndex, colIndex).map(function (next) { return next.cell; }); }); }); }); }; }; var moveLeft$3 = doMove$2(cycleLeft$1, moveLeft$2); var moveRight$3 = doMove$2(cycleRight$1, moveRight$2); var moveNorth$1 = doMove$2(cycleUp$1, moveUp); var moveSouth$1 = doMove$2(cycleDown$1, moveDown); var getKeydownRules$3 = constant([ rule(inSet(LEFT), west$2(moveLeft$3, moveRight$3)), rule(inSet(RIGHT), east$2(moveLeft$3, moveRight$3)), rule(inSet(UP), north$2(moveNorth$1)), rule(inSet(DOWN), south$2(moveSouth$1)), rule(inSet(SPACE.concat(ENTER)), execute$4) ]); var getKeyupRules$3 = constant([rule(inSet(SPACE), stopEventForFirefox)]); var MatrixType = typical(schema$7, NoState.init, getKeydownRules$3, getKeyupRules$3, function () { return Optional.some(focusIn$2); }); var schema$8 = [ strict$1('selector'), defaulted$1('execute', defaultExecute), defaulted$1('moveOnTab', false) ]; var execute$5 = function (component, simulatedEvent, menuConfig) { return menuConfig.focusManager.get(component).bind(function (focused) { return menuConfig.execute(component, simulatedEvent, focused); }); }; var focusIn$3 = function (component, menuConfig, _state) { descendant$1(component.element, menuConfig.selector).each(function (first) { menuConfig.focusManager.set(component, first); }); }; var moveUp$1 = function (element, focused, info) { return horizontal(element, info.selector, focused, -1); }; var moveDown$1 = function (element, focused, info) { return horizontal(element, info.selector, focused, +1); }; var fireShiftTab = function (component, simulatedEvent, menuConfig, menuState) { return menuConfig.moveOnTab ? move(moveUp$1)(component, simulatedEvent, menuConfig, menuState) : Optional.none(); }; var fireTab = function (component, simulatedEvent, menuConfig, menuState) { return menuConfig.moveOnTab ? move(moveDown$1)(component, simulatedEvent, menuConfig, menuState) : Optional.none(); }; var getKeydownRules$4 = constant([ rule(inSet(UP), move(moveUp$1)), rule(inSet(DOWN), move(moveDown$1)), rule(and([ isShift, inSet(TAB) ]), fireShiftTab), rule(and([ isNotShift, inSet(TAB) ]), fireTab), rule(inSet(ENTER), execute$5), rule(inSet(SPACE), execute$5) ]); var getKeyupRules$4 = constant([rule(inSet(SPACE), stopEventForFirefox)]); var MenuType = typical(schema$8, NoState.init, getKeydownRules$4, getKeyupRules$4, function () { return Optional.some(focusIn$3); }); var schema$9 = [ onKeyboardHandler('onSpace'), onKeyboardHandler('onEnter'), onKeyboardHandler('onShiftEnter'), onKeyboardHandler('onLeft'), onKeyboardHandler('onRight'), onKeyboardHandler('onTab'), onKeyboardHandler('onShiftTab'), onKeyboardHandler('onUp'), onKeyboardHandler('onDown'), onKeyboardHandler('onEscape'), defaulted$1('stopSpaceKeyup', false), option('focusIn') ]; var getKeydownRules$5 = function (component, simulatedEvent, specialInfo) { return [ rule(inSet(SPACE), specialInfo.onSpace), rule(and([ isNotShift, inSet(ENTER) ]), specialInfo.onEnter), rule(and([ isShift, inSet(ENTER) ]), specialInfo.onShiftEnter), rule(and([ isShift, inSet(TAB) ]), specialInfo.onShiftTab), rule(and([ isNotShift, inSet(TAB) ]), specialInfo.onTab), rule(inSet(UP), specialInfo.onUp), rule(inSet(DOWN), specialInfo.onDown), rule(inSet(LEFT), specialInfo.onLeft), rule(inSet(RIGHT), specialInfo.onRight), rule(inSet(SPACE), specialInfo.onSpace), rule(inSet(ESCAPE), specialInfo.onEscape) ]; }; var getKeyupRules$5 = function (component, simulatedEvent, specialInfo) { return specialInfo.stopSpaceKeyup ? [rule(inSet(SPACE), stopEventForFirefox)] : []; }; var SpecialType = typical(schema$9, NoState.init, getKeydownRules$5, getKeyupRules$5, function (specialInfo) { return specialInfo.focusIn; }); var acyclic = AcyclicType.schema(); var cyclic = CyclicType.schema(); var flow = FlowType.schema(); var flatgrid$1 = FlatgridType.schema(); var matrix = MatrixType.schema(); var execution = ExecutionType.schema(); var menu = MenuType.schema(); var special = SpecialType.schema(); var KeyboardBranches = /*#__PURE__*/Object.freeze({ __proto__: null, acyclic: acyclic, cyclic: cyclic, flow: flow, flatgrid: flatgrid$1, matrix: matrix, execution: execution, menu: menu, special: special }); var isFlatgridState = function (keyState) { return hasNonNullableKey(keyState, 'setGridSize'); }; var Keying = createModes$1({ branchKey: 'mode', branches: KeyboardBranches, name: 'keying', active: { events: function (keyingConfig, keyingState) { var handler = keyingConfig.handler; return handler.toEvents(keyingConfig, keyingState); } }, apis: { focusIn: function (component, keyConfig, keyState) { keyConfig.sendFocusIn(keyConfig).fold(function () { component.getSystem().triggerFocus(component.element, component.element); }, function (sendFocusIn) { sendFocusIn(component, keyConfig, keyState); }); }, setGridSize: function (component, keyConfig, keyState, numRows, numColumns) { if (!isFlatgridState(keyState)) { console.error('Layout does not support setGridSize'); } else { keyState.setGridSize(numRows, numColumns); } } }, state: KeyingState }); var set$5 = function (component, replaceConfig, replaceState, data) { preserve(function () { var newChildren = map(data, component.getSystem().build); replaceChildren(component, newChildren); }, component.element); }; var insert = function (component, replaceConfig, insertion, childSpec) { var child = component.getSystem().build(childSpec); attachWith(component, child, insertion); }; var append$2 = function (component, replaceConfig, replaceState, appendee) { insert(component, replaceConfig, append, appendee); }; var prepend$1 = function (component, replaceConfig, replaceState, prependee) { insert(component, replaceConfig, prepend, prependee); }; var remove$7 = function (component, replaceConfig, replaceState, removee) { var children = contents(component); var foundChild = find(children, function (child) { return eq$1(removee.element, child.element); }); foundChild.each(detach); }; var contents = function (component, _replaceConfig) { return component.components(); }; var replaceAt = function (component, replaceConfig, replaceState, replaceeIndex, replacer) { var children = contents(component); return Optional.from(children[replaceeIndex]).map(function (replacee) { remove$7(component, replaceConfig, replaceState, replacee); replacer.each(function (r) { insert(component, replaceConfig, function (p, c) { appendAt(p, c, replaceeIndex); }, r); }); return replacee; }); }; var replaceBy = function (component, replaceConfig, replaceState, replaceePred, replacer) { var children = contents(component); return findIndex(children, replaceePred).bind(function (replaceeIndex) { return replaceAt(component, replaceConfig, replaceState, replaceeIndex, replacer); }); }; var ReplaceApis = /*#__PURE__*/Object.freeze({ __proto__: null, append: append$2, prepend: prepend$1, remove: remove$7, replaceAt: replaceAt, replaceBy: replaceBy, set: set$5, contents: contents }); var Replacing = create$1({ fields: [], name: 'replacing', apis: ReplaceApis }); var events$4 = function (name, eventHandlers) { var events = derive(eventHandlers); return create$1({ fields: [strict$1('enabled')], name: name, active: { events: constant(events) } }); }; var config = function (name, eventHandlers) { var me = events$4(name, eventHandlers); return { key: name, value: { config: {}, me: me, configAsRaw: constant({}), initialConfig: {}, state: NoState } }; }; var focus$2 = function (component, focusConfig) { if (!focusConfig.ignore) { focus$1(component.element); focusConfig.onFocus(component); } }; var blur$1 = function (component, focusConfig) { if (!focusConfig.ignore) { blur(component.element); } }; var isFocused = function (component) { return hasFocus(component.element); }; var FocusApis = /*#__PURE__*/Object.freeze({ __proto__: null, focus: focus$2, blur: blur$1, isFocused: isFocused }); var exhibit$1 = function (base, focusConfig) { var mod = focusConfig.ignore ? {} : { attributes: { tabindex: '-1' } }; return nu$6(mod); }; var events$5 = function (focusConfig) { return derive([run(focus(), function (component, simulatedEvent) { focus$2(component, focusConfig); simulatedEvent.stop(); })].concat(focusConfig.stopMousedown ? [run(mousedown(), function (_, simulatedEvent) { simulatedEvent.event.prevent(); })] : [])); }; var ActiveFocus = /*#__PURE__*/Object.freeze({ __proto__: null, exhibit: exhibit$1, events: events$5 }); var FocusSchema = [ onHandler('onFocus'), defaulted$1('stopMousedown', false), defaulted$1('ignore', false) ]; var Focusing = create$1({ fields: FocusSchema, name: 'focusing', active: ActiveFocus, apis: FocusApis }); var SetupBehaviourCellState = function (initialState) { var init = function () { var cell = Cell(initialState); var get = function () { return cell.get(); }; var set = function (newState) { return cell.set(newState); }; var clear = function () { return cell.set(initialState); }; var readState = function () { return cell.get(); }; return { get: get, set: set, clear: clear, readState: readState }; }; return { init: init }; }; var updateAriaState = function (component, toggleConfig, toggleState) { var ariaInfo = toggleConfig.aria; ariaInfo.update(component, ariaInfo, toggleState.get()); }; var updateClass = function (component, toggleConfig, toggleState) { toggleConfig.toggleClass.each(function (toggleClass) { if (toggleState.get()) { add$2(component.element, toggleClass); } else { remove$4(component.element, toggleClass); } }); }; var toggle = function (component, toggleConfig, toggleState) { set$6(component, toggleConfig, toggleState, !toggleState.get()); }; var on$1 = function (component, toggleConfig, toggleState) { toggleState.set(true); updateClass(component, toggleConfig, toggleState); updateAriaState(component, toggleConfig, toggleState); }; var off = function (component, toggleConfig, toggleState) { toggleState.set(false); updateClass(component, toggleConfig, toggleState); updateAriaState(component, toggleConfig, toggleState); }; var set$6 = function (component, toggleConfig, toggleState, state) { var action = state ? on$1 : off; action(component, toggleConfig, toggleState); }; var isOn = function (component, toggleConfig, toggleState) { return toggleState.get(); }; var onLoad$4 = function (component, toggleConfig, toggleState) { set$6(component, toggleConfig, toggleState, toggleConfig.selected); }; var ToggleApis = /*#__PURE__*/Object.freeze({ __proto__: null, onLoad: onLoad$4, toggle: toggle, isOn: isOn, on: on$1, off: off, set: set$6 }); var exhibit$2 = function () { return nu$6({}); }; var events$6 = function (toggleConfig, toggleState) { var execute = executeEvent(toggleConfig, toggleState, toggle); var load = loadEvent(toggleConfig, toggleState, onLoad$4); return derive(flatten([ toggleConfig.toggleOnExecute ? [execute] : [], [load] ])); }; var ActiveToggle = /*#__PURE__*/Object.freeze({ __proto__: null, exhibit: exhibit$2, events: events$6 }); var updatePressed = function (component, ariaInfo, status) { set$1(component.element, 'aria-pressed', status); if (ariaInfo.syncWithExpanded) { updateExpanded(component, ariaInfo, status); } }; var updateSelected = function (component, ariaInfo, status) { set$1(component.element, 'aria-selected', status); }; var updateChecked = function (component, ariaInfo, status) { set$1(component.element, 'aria-checked', status); }; var updateExpanded = function (component, ariaInfo, status) { set$1(component.element, 'aria-expanded', status); }; var ToggleSchema = [ defaulted$1('selected', false), option('toggleClass'), defaulted$1('toggleOnExecute', true), defaultedOf('aria', { mode: 'none' }, choose$1('mode', { pressed: [ defaulted$1('syncWithExpanded', false), output('update', updatePressed) ], checked: [output('update', updateChecked)], expanded: [output('update', updateExpanded)], selected: [output('update', updateSelected)], none: [output('update', noop)] })) ]; var Toggling = create$1({ fields: ToggleSchema, name: 'toggling', active: ActiveToggle, apis: ToggleApis, state: SetupBehaviourCellState(false) }); var pointerEvents = function () { var onClick = function (component, simulatedEvent) { simulatedEvent.stop(); emitExecute(component); }; return [ run(click(), onClick), run(tap(), onClick), cutter(touchstart()), cutter(mousedown()) ]; }; var events$7 = function (optAction) { var executeHandler = function (action) { return runOnExecute(function (component, simulatedEvent) { action(component); simulatedEvent.stop(); }); }; return derive(flatten([ optAction.map(executeHandler).toArray(), pointerEvents() ])); }; var hoverEvent = 'alloy.item-hover'; var focusEvent = 'alloy.item-focus'; var onHover = function (item) { if (search(item.element).isNone() || Focusing.isFocused(item)) { if (!Focusing.isFocused(item)) { Focusing.focus(item); } emitWith(item, hoverEvent, { item: item }); } }; var onFocus = function (item) { emitWith(item, focusEvent, { item: item }); }; var hover = constant(hoverEvent); var focus$3 = constant(focusEvent); var builder = function (detail) { return { dom: detail.dom, domModification: __assign(__assign({}, detail.domModification), { attributes: __assign(__assign(__assign({ 'role': detail.toggling.isSome() ? 'menuitemcheckbox' : 'menuitem' }, detail.domModification.attributes), { 'aria-haspopup': detail.hasSubmenu }), detail.hasSubmenu ? { 'aria-expanded': false } : {}) }), behaviours: SketchBehaviours.augment(detail.itemBehaviours, [ detail.toggling.fold(Toggling.revoke, function (tConfig) { return Toggling.config(__assign({ aria: { mode: 'checked' } }, tConfig)); }), Focusing.config({ ignore: detail.ignoreFocus, stopMousedown: detail.ignoreFocus, onFocus: function (component) { onFocus(component); } }), Keying.config({ mode: 'execution' }), Representing.config({ store: { mode: 'memory', initialValue: detail.data } }), config('item-type-events', __spreadArrays(pointerEvents(), [ run(mouseover(), onHover), run(focusItem(), Focusing.focus) ])) ]), components: detail.components, eventOrder: detail.eventOrder }; }; var schema$a = [ strict$1('data'), strict$1('components'), strict$1('dom'), defaulted$1('hasSubmenu', false), option('toggling'), SketchBehaviours.field('itemBehaviours', [ Toggling, Focusing, Keying, Representing ]), defaulted$1('ignoreFocus', false), defaulted$1('domModification', {}), output('builder', builder), defaulted$1('eventOrder', {}) ]; var builder$1 = function (detail) { return { dom: detail.dom, components: detail.components, events: derive([stopper(focusItem())]) }; }; var schema$b = [ strict$1('dom'), strict$1('components'), output('builder', builder$1) ]; var owner$2 = constant('item-widget'); var parts = constant([required({ name: 'widget', overrides: function (detail) { return { behaviours: derive$1([Representing.config({ store: { mode: 'manual', getValue: function (_component) { return detail.data; }, setValue: noop } })]) }; } })]); var builder$2 = function (detail) { var subs = substitutes(owner$2(), detail, parts()); var components$1 = components(owner$2(), detail, subs.internals()); var focusWidget = function (component) { return getPart(component, detail, 'widget').map(function (widget) { Keying.focusIn(widget); return widget; }); }; var onHorizontalArrow = function (component, simulatedEvent) { return inside(simulatedEvent.event.target) ? Optional.none() : function () { if (detail.autofocus) { simulatedEvent.setSource(component.element); return Optional.none(); } else { return Optional.none(); } }(); }; return { dom: detail.dom, components: components$1, domModification: detail.domModification, events: derive([ runOnExecute(function (component, simulatedEvent) { focusWidget(component).each(function (_widget) { simulatedEvent.stop(); }); }), run(mouseover(), onHover), run(focusItem(), function (component, _simulatedEvent) { if (detail.autofocus) { focusWidget(component); } else { Focusing.focus(component); } }) ]), behaviours: SketchBehaviours.augment(detail.widgetBehaviours, [ Representing.config({ store: { mode: 'memory', initialValue: detail.data } }), Focusing.config({ ignore: detail.ignoreFocus, onFocus: function (component) { onFocus(component); } }), Keying.config({ mode: 'special', focusIn: detail.autofocus ? function (component) { focusWidget(component); } : revoke(), onLeft: onHorizontalArrow, onRight: onHorizontalArrow, onEscape: function (component, simulatedEvent) { if (!Focusing.isFocused(component) && !detail.autofocus) { Focusing.focus(component); return Optional.some(true); } else if (detail.autofocus) { simulatedEvent.setSource(component.element); return Optional.none(); } else { return Optional.none(); } } }) ]) }; }; var schema$c = [ strict$1('uid'), strict$1('data'), strict$1('components'), strict$1('dom'), defaulted$1('autofocus', false), defaulted$1('ignoreFocus', false), SketchBehaviours.field('widgetBehaviours', [ Representing, Focusing, Keying ]), defaulted$1('domModification', {}), defaultUidsSchema(parts()), output('builder', builder$2) ]; var itemSchema$1 = choose$1('type', { widget: schema$c, item: schema$a, separator: schema$b }); var configureGrid = function (detail, movementInfo) { return { mode: 'flatgrid', selector: '.' + detail.markers.item, initSize: { numColumns: movementInfo.initSize.numColumns, numRows: movementInfo.initSize.numRows }, focusManager: detail.focusManager }; }; var configureMatrix = function (detail, movementInfo) { return { mode: 'matrix', selectors: { row: movementInfo.rowSelector, cell: '.' + detail.markers.item }, focusManager: detail.focusManager }; }; var configureMenu = function (detail, movementInfo) { return { mode: 'menu', selector: '.' + detail.markers.item, moveOnTab: movementInfo.moveOnTab, focusManager: detail.focusManager }; }; var parts$1 = constant([group({ factory: { sketch: function (spec) { var itemInfo = asRawOrDie('menu.spec item', itemSchema$1, spec); return itemInfo.builder(itemInfo); } }, name: 'items', unit: 'item', defaults: function (detail, u) { return u.hasOwnProperty('uid') ? u : __assign(__assign({}, u), { uid: generate$2('item') }); }, overrides: function (detail, u) { return { type: u.type, ignoreFocus: detail.fakeFocus, domModification: { classes: [detail.markers.item] } }; } })]); var schema$d = constant([ strict$1('value'), strict$1('items'), strict$1('dom'), strict$1('components'), defaulted$1('eventOrder', {}), field$1('menuBehaviours', [ Highlighting, Representing, Composing, Keying ]), defaultedOf('movement', { mode: 'menu', moveOnTab: true }, choose$1('mode', { grid: [ initSize(), output('config', configureGrid) ], matrix: [ output('config', configureMatrix), strict$1('rowSelector') ], menu: [ defaulted$1('moveOnTab', true), output('config', configureMenu) ] })), itemMarkers(), defaulted$1('fakeFocus', false), defaulted$1('focusManager', dom()), onHandler('onHighlight') ]); var focus$4 = constant('alloy.menu-focus'); var make$1 = function (detail, components, _spec, _externals) { return { uid: detail.uid, dom: detail.dom, markers: detail.markers, behaviours: augment(detail.menuBehaviours, [ Highlighting.config({ highlightClass: detail.markers.selectedItem, itemClass: detail.markers.item, onHighlight: detail.onHighlight }), Representing.config({ store: { mode: 'memory', initialValue: detail.value } }), Composing.config({ find: Optional.some }), Keying.config(detail.movement.config(detail, detail.movement)) ]), events: derive([ run(focus$3(), function (menu, simulatedEvent) { var event = simulatedEvent.event; menu.getSystem().getByDom(event.target).each(function (item) { Highlighting.highlight(menu, item); simulatedEvent.stop(); emitWith(menu, focus$4(), { menu: menu, item: item }); }); }), run(hover(), function (menu, simulatedEvent) { var item = simulatedEvent.event.item; Highlighting.highlight(menu, item); }) ]), components: components, eventOrder: detail.eventOrder, domModification: { attributes: { role: 'menu' } } }; }; var Menu = composite$1({ name: 'Menu', configFields: schema$d(), partFields: parts$1(), factory: make$1 }); var transpose = function (obj) { return tupleMap(obj, function (v, k) { return { k: v, v: k }; }); }; var trace = function (items, byItem, byMenu, finish) { return get$1(byMenu, finish).bind(function (triggerItem) { return get$1(items, triggerItem).bind(function (triggerMenu) { var rest = trace(items, byItem, byMenu, triggerMenu); return Optional.some([triggerMenu].concat(rest)); }); }).getOr([]); }; var generate$5 = function (menus, expansions) { var items = {}; each$1(menus, function (menuItems, menu) { each(menuItems, function (item) { items[item] = menu; }); }); var byItem = expansions; var byMenu = transpose(expansions); var menuPaths = map$2(byMenu, function (_triggerItem, submenu) { return [submenu].concat(trace(items, byItem, byMenu, submenu)); }); return map$2(items, function (menu) { return get$1(menuPaths, menu).getOr([menu]); }); }; var init$3 = function () { var expansions = Cell({}); var menus = Cell({}); var paths = Cell({}); var primary = Cell(Optional.none()); var directory = Cell({}); var clear = function () { expansions.set({}); menus.set({}); paths.set({}); primary.set(Optional.none()); }; var isClear = function () { return primary.get().isNone(); }; var setMenuBuilt = function (menuName, built) { var _a; menus.set(__assign(__assign({}, menus.get()), (_a = {}, _a[menuName] = { type: 'prepared', menu: built }, _a))); }; var setContents = function (sPrimary, sMenus, sExpansions, dir) { primary.set(Optional.some(sPrimary)); expansions.set(sExpansions); menus.set(sMenus); directory.set(dir); var sPaths = generate$5(dir, sExpansions); paths.set(sPaths); }; var getTriggeringItem = function (menuValue) { return find$1(expansions.get(), function (v, _k) { return v === menuValue; }); }; var getTriggerData = function (menuValue, getItemByValue, path) { return getPreparedMenu(menuValue).bind(function (menu) { return getTriggeringItem(menuValue).bind(function (triggeringItemValue) { return getItemByValue(triggeringItemValue).map(function (triggeredItem) { return { triggeredMenu: menu, triggeringItem: triggeredItem, triggeringPath: path }; }); }); }); }; var getTriggeringPath = function (itemValue, getItemByValue) { var extraPath = filter(lookupItem(itemValue).toArray(), function (menuValue) { return getPreparedMenu(menuValue).isSome(); }); return get$1(paths.get(), itemValue).bind(function (path) { var revPath = reverse(extraPath.concat(path)); var triggers = bind(revPath, function (menuValue, menuIndex) { return getTriggerData(menuValue, getItemByValue, revPath.slice(0, menuIndex + 1)).fold(function () { return primary.get().is(menuValue) ? [] : [Optional.none()]; }, function (data) { return [Optional.some(data)]; }); }); return sequence(triggers); }); }; var expand = function (itemValue) { return get$1(expansions.get(), itemValue).map(function (menu) { var current = get$1(paths.get(), itemValue).getOr([]); return [menu].concat(current); }); }; var collapse = function (itemValue) { return get$1(paths.get(), itemValue).bind(function (path) { return path.length > 1 ? Optional.some(path.slice(1)) : Optional.none(); }); }; var refresh = function (itemValue) { return get$1(paths.get(), itemValue); }; var getPreparedMenu = function (menuValue) { return lookupMenu(menuValue).bind(extractPreparedMenu); }; var lookupMenu = function (menuValue) { return get$1(menus.get(), menuValue); }; var lookupItem = function (itemValue) { return get$1(expansions.get(), itemValue); }; var otherMenus = function (path) { var menuValues = directory.get(); return difference(keys(menuValues), path); }; var getPrimary = function () { return primary.get().bind(getPreparedMenu); }; var getMenus = function () { return menus.get(); }; return { setMenuBuilt: setMenuBuilt, setContents: setContents, expand: expand, refresh: refresh, collapse: collapse, lookupMenu: lookupMenu, lookupItem: lookupItem, otherMenus: otherMenus, getPrimary: getPrimary, getMenus: getMenus, clear: clear, isClear: isClear, getTriggeringPath: getTriggeringPath }; }; var extractPreparedMenu = function (prep) { return prep.type === 'prepared' ? Optional.some(prep.menu) : Optional.none(); }; var LayeredState = { init: init$3, extractPreparedMenu: extractPreparedMenu }; var make$2 = function (detail, _rawUiSpec) { var submenuParentItems = Cell(Optional.none()); var buildMenus = function (container, primaryName, menus) { return map$2(menus, function (spec, name) { var makeSketch = function () { return Menu.sketch(__assign(__assign({}, spec), { value: name, markers: detail.markers, fakeFocus: detail.fakeFocus, onHighlight: detail.onHighlight, focusManager: detail.fakeFocus ? highlights() : dom() })); }; return name === primaryName ? { type: 'prepared', menu: container.getSystem().build(makeSketch()) } : { type: 'notbuilt', nbMenu: makeSketch }; }); }; var layeredState = LayeredState.init(); var setup = function (container) { var componentMap = buildMenus(container, detail.data.primary, detail.data.menus); var directory = toDirectory(); layeredState.setContents(detail.data.primary, componentMap, detail.data.expansions, directory); return layeredState.getPrimary(); }; var getItemValue = function (item) { return Representing.getValue(item).value; }; var getItemByValue = function (_container, menus, itemValue) { return findMap(menus, function (menu) { if (!menu.getSystem().isConnected()) { return Optional.none(); } var candidates = Highlighting.getCandidates(menu); return find(candidates, function (c) { return getItemValue(c) === itemValue; }); }); }; var toDirectory = function (_container) { return map$2(detail.data.menus, function (data, _menuName) { return bind(data.items, function (item) { return item.type === 'separator' ? [] : [item.data.value]; }); }); }; var setActiveMenu = function (container, menu) { Highlighting.highlight(container, menu); Highlighting.getHighlighted(menu).orThunk(function () { return Highlighting.getFirst(menu); }).each(function (item) { dispatch(container, item.element, focusItem()); }); }; var getMenus = function (state, menuValues) { return cat(map(menuValues, function (mv) { return state.lookupMenu(mv).bind(function (prep) { return prep.type === 'prepared' ? Optional.some(prep.menu) : Optional.none(); }); })); }; var closeOthers = function (container, state, path) { var others = getMenus(state, state.otherMenus(path)); each(others, function (o) { remove$5(o.element, [detail.markers.backgroundMenu]); if (!detail.stayInDom) { Replacing.remove(container, o); } }); }; var getSubmenuParents = function (container) { return submenuParentItems.get().getOrThunk(function () { var r = {}; var items = descendants(container.element, '.' + detail.markers.item); var parentItems = filter(items, function (i) { return get$3(i, 'aria-haspopup') === 'true'; }); each(parentItems, function (i) { container.getSystem().getByDom(i).each(function (itemComp) { var key = getItemValue(itemComp); r[key] = itemComp; }); }); submenuParentItems.set(Optional.some(r)); return r; }); }; var updateAriaExpansions = function (container, path) { var parentItems = getSubmenuParents(container); each$1(parentItems, function (v, k) { var expanded = contains(path, k); set$1(v.element, 'aria-expanded', expanded); }); }; var updateMenuPath = function (container, state, path) { return Optional.from(path[0]).bind(function (latestMenuName) { return state.lookupMenu(latestMenuName).bind(function (menuPrep) { if (menuPrep.type === 'notbuilt') { return Optional.none(); } else { var activeMenu = menuPrep.menu; var rest = getMenus(state, path.slice(1)); each(rest, function (r) { add$2(r.element, detail.markers.backgroundMenu); }); if (!inBody(activeMenu.element)) { Replacing.append(container, premade$1(activeMenu)); } remove$5(activeMenu.element, [detail.markers.backgroundMenu]); setActiveMenu(container, activeMenu); closeOthers(container, state, path); return Optional.some(activeMenu); } }); }); }; var ExpandHighlightDecision; (function (ExpandHighlightDecision) { ExpandHighlightDecision[ExpandHighlightDecision['HighlightSubmenu'] = 0] = 'HighlightSubmenu'; ExpandHighlightDecision[ExpandHighlightDecision['HighlightParent'] = 1] = 'HighlightParent'; }(ExpandHighlightDecision || (ExpandHighlightDecision = {}))); var buildIfRequired = function (container, menuName, menuPrep) { if (menuPrep.type === 'notbuilt') { var menu = container.getSystem().build(menuPrep.nbMenu()); layeredState.setMenuBuilt(menuName, menu); return menu; } else { return menuPrep.menu; } }; var expandRight = function (container, item, decision) { if (decision === void 0) { decision = ExpandHighlightDecision.HighlightSubmenu; } var value = getItemValue(item); return layeredState.expand(value).bind(function (path) { updateAriaExpansions(container, path); return Optional.from(path[0]).bind(function (menuName) { return layeredState.lookupMenu(menuName).bind(function (activeMenuPrep) { var activeMenu = buildIfRequired(container, menuName, activeMenuPrep); if (!inBody(activeMenu.element)) { Replacing.append(container, premade$1(activeMenu)); } detail.onOpenSubmenu(container, item, activeMenu, reverse(path)); if (decision === ExpandHighlightDecision.HighlightSubmenu) { Highlighting.highlightFirst(activeMenu); return updateMenuPath(container, layeredState, path); } else { Highlighting.dehighlightAll(activeMenu); return Optional.some(item); } }); }); }); }; var collapseLeft = function (container, item) { var value = getItemValue(item); return layeredState.collapse(value).bind(function (path) { updateAriaExpansions(container, path); return updateMenuPath(container, layeredState, path).map(function (activeMenu) { detail.onCollapseMenu(container, item, activeMenu); return activeMenu; }); }); }; var updateView = function (container, item) { var value = getItemValue(item); return layeredState.refresh(value).bind(function (path) { updateAriaExpansions(container, path); return updateMenuPath(container, layeredState, path); }); }; var onRight = function (container, item) { return inside(item.element) ? Optional.none() : expandRight(container, item, ExpandHighlightDecision.HighlightSubmenu); }; var onLeft = function (container, item) { return inside(item.element) ? Optional.none() : collapseLeft(container, item); }; var onEscape = function (container, item) { return collapseLeft(container, item).orThunk(function () { return detail.onEscape(container, item).map(function () { return container; }); }); }; var keyOnItem = function (f) { return function (container, simulatedEvent) { return closest$3(simulatedEvent.getSource(), '.' + detail.markers.item).bind(function (target) { return container.getSystem().getByDom(target).toOptional().bind(function (item) { return f(container, item).map(always); }); }); }; }; var events = derive([ run(focus$4(), function (sandbox, simulatedEvent) { var item = simulatedEvent.event.item; layeredState.lookupItem(getItemValue(item)).each(function () { var menu = simulatedEvent.event.menu; Highlighting.highlight(sandbox, menu); var value = getItemValue(simulatedEvent.event.item); layeredState.refresh(value).each(function (path) { return closeOthers(sandbox, layeredState, path); }); }); }), runOnExecute(function (component, simulatedEvent) { var target = simulatedEvent.event.target; component.getSystem().getByDom(target).each(function (item) { var itemValue = getItemValue(item); if (itemValue.indexOf('collapse-item') === 0) { collapseLeft(component, item); } expandRight(component, item, ExpandHighlightDecision.HighlightSubmenu).fold(function () { detail.onExecute(component, item); }, noop); }); }), runOnAttached(function (container, _simulatedEvent) { setup(container).each(function (primary) { Replacing.append(container, premade$1(primary)); detail.onOpenMenu(container, primary); if (detail.highlightImmediately) { setActiveMenu(container, primary); } }); }) ].concat(detail.navigateOnHover ? [run(hover(), function (sandbox, simulatedEvent) { var item = simulatedEvent.event.item; updateView(sandbox, item); expandRight(sandbox, item, ExpandHighlightDecision.HighlightParent); detail.onHover(sandbox, item); })] : [])); var getActiveItem = function (container) { return Highlighting.getHighlighted(container).bind(Highlighting.getHighlighted); }; var collapseMenuApi = function (container) { getActiveItem(container).each(function (currentItem) { collapseLeft(container, currentItem); }); }; var highlightPrimary = function (container) { layeredState.getPrimary().each(function (primary) { setActiveMenu(container, primary); }); }; var extractMenuFromContainer = function (container) { return Optional.from(container.components()[0]).filter(function (comp) { return get$3(comp.element, 'role') === 'menu'; }); }; var repositionMenus = function (container) { var maybeActivePrimary = layeredState.getPrimary().bind(function (primary) { return getActiveItem(container).bind(function (currentItem) { var itemValue = getItemValue(currentItem); var allMenus = values(layeredState.getMenus()); var preparedMenus = cat(map(allMenus, LayeredState.extractPreparedMenu)); return layeredState.getTriggeringPath(itemValue, function (v) { return getItemByValue(container, preparedMenus, v); }); }).map(function (triggeringPath) { return { primary: primary, triggeringPath: triggeringPath }; }); }); maybeActivePrimary.fold(function () { extractMenuFromContainer(container).each(function (primaryMenu) { detail.onRepositionMenu(container, primaryMenu, []); }); }, function (_a) { var primary = _a.primary, triggeringPath = _a.triggeringPath; detail.onRepositionMenu(container, primary, triggeringPath); }); }; var apis = { collapseMenu: collapseMenuApi, highlightPrimary: highlightPrimary, repositionMenus: repositionMenus }; return { uid: detail.uid, dom: detail.dom, markers: detail.markers, behaviours: augment(detail.tmenuBehaviours, [ Keying.config({ mode: 'special', onRight: keyOnItem(onRight), onLeft: keyOnItem(onLeft), onEscape: keyOnItem(onEscape), focusIn: function (container, _keyInfo) { layeredState.getPrimary().each(function (primary) { dispatch(container, primary.element, focusItem()); }); } }), Highlighting.config({ highlightClass: detail.markers.selectedMenu, itemClass: detail.markers.menu }), Composing.config({ find: function (container) { return Highlighting.getHighlighted(container); } }), Replacing.config({}) ]), eventOrder: detail.eventOrder, apis: apis, events: events }; }; var collapseItem = constant('collapse-item'); var tieredData = function (primary, menus, expansions) { return { primary: primary, menus: menus, expansions: expansions }; }; var singleData = function (name, menu) { return { primary: name, menus: wrap$1(name, menu), expansions: {} }; }; var collapseItem$1 = function (text) { return { value: generate$1(collapseItem()), meta: { text: text } }; }; var tieredMenu = single$2({ name: 'TieredMenu', configFields: [ onStrictKeyboardHandler('onExecute'), onStrictKeyboardHandler('onEscape'), onStrictHandler('onOpenMenu'), onStrictHandler('onOpenSubmenu'), onHandler('onRepositionMenu'), onHandler('onCollapseMenu'), defaulted$1('highlightImmediately', true), strictObjOf('data', [ strict$1('primary'), strict$1('menus'), strict$1('expansions') ]), defaulted$1('fakeFocus', false), onHandler('onHighlight'), onHandler('onHover'), tieredMenuMarkers(), strict$1('dom'), defaulted$1('navigateOnHover', true), defaulted$1('stayInDom', false), field$1('tmenuBehaviours', [ Keying, Highlighting, Composing, Replacing ]), defaulted$1('eventOrder', {}) ], apis: { collapseMenu: function (apis, tmenu) { apis.collapseMenu(tmenu); }, highlightPrimary: function (apis, tmenu) { apis.highlightPrimary(tmenu); }, repositionMenus: function (apis, tmenu) { apis.repositionMenus(tmenu); } }, factory: make$2, extraApis: { tieredData: tieredData, singleData: singleData, collapseItem: collapseItem$1 } }); var makeMenu = function (detail, menuSandbox, anchor, menuSpec, getBounds) { var lazySink = function () { return detail.lazySink(menuSandbox); }; var layouts = menuSpec.type === 'horizontal' ? { layouts: { onLtr: function () { return belowOrAbove(); }, onRtl: function () { return belowOrAboveRtl(); } } } : {}; var isFirstTierSubmenu = function (triggeringPaths) { return triggeringPaths.length === 2; }; var getSubmenuLayouts = function (triggeringPaths) { return isFirstTierSubmenu(triggeringPaths) ? layouts : {}; }; return tieredMenu.sketch({ dom: { tag: 'div' }, data: menuSpec.data, markers: menuSpec.menu.markers, highlightImmediately: menuSpec.menu.highlightImmediately, onEscape: function () { Sandboxing.close(menuSandbox); detail.onEscape.map(function (handler) { return handler(menuSandbox); }); return Optional.some(true); }, onExecute: function () { return Optional.some(true); }, onOpenMenu: function (tmenu, menu) { Positioning.positionWithinBounds(lazySink().getOrDie(), anchor, menu, getBounds()); }, onOpenSubmenu: function (tmenu, item, submenu, triggeringPaths) { var sink = lazySink().getOrDie(); Positioning.position(sink, __assign({ anchor: 'submenu', item: item }, getSubmenuLayouts(triggeringPaths)), submenu); }, onRepositionMenu: function (tmenu, primaryMenu, submenuTriggers) { var sink = lazySink().getOrDie(); Positioning.positionWithinBounds(sink, anchor, primaryMenu, getBounds()); each(submenuTriggers, function (st) { var submenuLayouts = getSubmenuLayouts(st.triggeringPath); Positioning.position(sink, __assign({ anchor: 'submenu', item: st.triggeringItem }, submenuLayouts), st.triggeredMenu); }); } }); }; var factory = function (detail, spec) { var isPartOfRelated = function (sandbox, queryElem) { var related = detail.getRelated(sandbox); return related.exists(function (rel) { return isPartOf(rel, queryElem); }); }; var setContent = function (sandbox, thing) { Sandboxing.setContent(sandbox, thing); }; var showAt = function (sandbox, anchor, thing) { showWithin(sandbox, anchor, thing, Optional.none()); }; var showWithin = function (sandbox, anchor, thing, boxElement) { showWithinBounds(sandbox, anchor, thing, function () { return boxElement.map(function (elem) { return box(elem); }); }); }; var showWithinBounds = function (sandbox, anchor, thing, getBounds) { var sink = detail.lazySink(sandbox).getOrDie(); Sandboxing.openWhileCloaked(sandbox, thing, function () { return Positioning.positionWithinBounds(sink, anchor, sandbox, getBounds()); }); Representing.setValue(sandbox, Optional.some({ mode: 'position', anchor: anchor, getBounds: getBounds })); }; var showMenuAt = function (sandbox, anchor, menuSpec) { showMenuWithinBounds(sandbox, anchor, menuSpec, function () { return Optional.none(); }); }; var showMenuWithinBounds = function (sandbox, anchor, menuSpec, getBounds) { var menu = makeMenu(detail, sandbox, anchor, menuSpec, getBounds); Sandboxing.open(sandbox, menu); Representing.setValue(sandbox, Optional.some({ mode: 'menu', menu: menu })); }; var hide = function (sandbox) { if (Sandboxing.isOpen(sandbox)) { Representing.setValue(sandbox, Optional.none()); Sandboxing.close(sandbox); } }; var getContent = function (sandbox) { return Sandboxing.getState(sandbox); }; var reposition = function (sandbox) { if (Sandboxing.isOpen(sandbox)) { Representing.getValue(sandbox).each(function (state) { switch (state.mode) { case 'menu': Sandboxing.getState(sandbox).each(function (tmenu) { tieredMenu.repositionMenus(tmenu); }); break; case 'position': var sink = detail.lazySink(sandbox).getOrDie(); Positioning.positionWithinBounds(sink, state.anchor, sandbox, state.getBounds()); break; } }); } }; var apis = { setContent: setContent, showAt: showAt, showWithin: showWithin, showWithinBounds: showWithinBounds, showMenuAt: showMenuAt, showMenuWithinBounds: showMenuWithinBounds, hide: hide, getContent: getContent, reposition: reposition, isOpen: Sandboxing.isOpen }; return { uid: detail.uid, dom: detail.dom, behaviours: augment(detail.inlineBehaviours, [ Sandboxing.config({ isPartOf: function (sandbox, data, queryElem) { return isPartOf(data, queryElem) || isPartOfRelated(sandbox, queryElem); }, getAttachPoint: function (sandbox) { return detail.lazySink(sandbox).getOrDie(); }, onOpen: function (sandbox) { detail.onShow(sandbox); }, onClose: function (sandbox) { detail.onHide(sandbox); } }), Representing.config({ store: { mode: 'memory', initialValue: Optional.none() } }), Receiving.config({ channels: __assign(__assign({}, receivingChannel(__assign({ isExtraPart: spec.isExtraPart }, detail.fireDismissalEventInstead.map(function (fe) { return { fireEventInstead: { event: fe.event } }; }).getOr({})))), receivingChannel$1(__assign(__assign({}, detail.fireRepositionEventInstead.map(function (fe) { return { fireEventInstead: { event: fe.event } }; }).getOr({})), { doReposition: reposition }))) }) ]), eventOrder: detail.eventOrder, apis: apis }; }; var InlineView = single$2({ name: 'InlineView', configFields: [ strict$1('lazySink'), onHandler('onShow'), onHandler('onHide'), optionFunction('onEscape'), field$1('inlineBehaviours', [ Sandboxing, Representing, Receiving ]), optionObjOf('fireDismissalEventInstead', [defaulted$1('event', dismissRequested())]), optionObjOf('fireRepositionEventInstead', [defaulted$1('event', repositionRequested())]), defaulted$1('getRelated', Optional.none), defaulted$1('isExtraPart', never), defaulted$1('eventOrder', Optional.none) ], factory: factory, apis: { showAt: function (apis, component, anchor, thing) { apis.showAt(component, anchor, thing); }, showWithin: function (apis, component, anchor, thing, boxElement) { apis.showWithin(component, anchor, thing, boxElement); }, showWithinBounds: function (apis, component, anchor, thing, bounds) { apis.showWithinBounds(component, anchor, thing, bounds); }, showMenuAt: function (apis, component, anchor, menuSpec) { apis.showMenuAt(component, anchor, menuSpec); }, showMenuWithinBounds: function (apis, component, anchor, menuSpec, bounds) { apis.showMenuWithinBounds(component, anchor, menuSpec, bounds); }, hide: function (apis, component) { apis.hide(component); }, isOpen: function (apis, component) { return apis.isOpen(component); }, getContent: function (apis, component) { return apis.getContent(component); }, setContent: function (apis, component, thing) { apis.setContent(component, thing); }, reposition: function (apis, component) { apis.reposition(component); } } }); var westEdgeX$1 = function (anchor) { return anchor.x; }; var middleX$1 = function (anchor, element) { return anchor.x + anchor.width / 2 - element.width / 2; }; var eastEdgeX$1 = function (anchor, element) { return anchor.x + anchor.width - element.width; }; var northY$2 = function (anchor) { return anchor.y; }; var southY$2 = function (anchor, element) { return anchor.y + anchor.height - element.height; }; var southeast$3 = function (anchor, element, bubbles) { return nu$7(eastEdgeX$1(anchor, element), southY$2(anchor, element), bubbles.innerSoutheast(), northwest(), boundsRestriction(anchor, { right: 0, bottom: 3 }), 'layout-inner-se'); }; var southwest$3 = function (anchor, element, bubbles) { return nu$7(westEdgeX$1(anchor), southY$2(anchor, element), bubbles.innerSouthwest(), northeast(), boundsRestriction(anchor, { left: 1, bottom: 3 }), 'layout-inner-sw'); }; var northeast$3 = function (anchor, element, bubbles) { return nu$7(eastEdgeX$1(anchor, element), northY$2(anchor), bubbles.innerNortheast(), southwest(), boundsRestriction(anchor, { right: 0, top: 2 }), 'layout-inner-ne'); }; var northwest$3 = function (anchor, element, bubbles) { return nu$7(westEdgeX$1(anchor), northY$2(anchor), bubbles.innerNorthwest(), southeast(), boundsRestriction(anchor, { left: 1, top: 2 }), 'layout-inner-nw'); }; var north$3 = function (anchor, element, bubbles) { return nu$7(middleX$1(anchor, element), northY$2(anchor), bubbles.innerNorth(), south(), boundsRestriction(anchor, { top: 2 }), 'layout-inner-n'); }; var south$3 = function (anchor, element, bubbles) { return nu$7(middleX$1(anchor, element), southY$2(anchor, element), bubbles.innerSouth(), north(), boundsRestriction(anchor, { bottom: 3 }), 'layout-inner-s'); }; var global$2 = tinymce.util.Tools.resolve('tinymce.util.Delay'); var factory$1 = function (detail) { var events = events$7(detail.action); var tag = detail.dom.tag; var lookupAttr = function (attr) { return get$1(detail.dom, 'attributes').bind(function (attrs) { return get$1(attrs, attr); }); }; var getModAttributes = function () { if (tag === 'button') { var type = lookupAttr('type').getOr('button'); var roleAttrs = lookupAttr('role').map(function (role) { return { role: role }; }).getOr({}); return __assign({ type: type }, roleAttrs); } else { var role = lookupAttr('role').getOr('button'); return { role: role }; } }; return { uid: detail.uid, dom: detail.dom, components: detail.components, events: events, behaviours: SketchBehaviours.augment(detail.buttonBehaviours, [ Focusing.config({}), Keying.config({ mode: 'execution', useSpace: true, useEnter: true }) ]), domModification: { attributes: getModAttributes() }, eventOrder: detail.eventOrder }; }; var Button = single$2({ name: 'Button', factory: factory$1, configFields: [ defaulted$1('uid', undefined), strict$1('dom'), defaulted$1('components', []), SketchBehaviours.field('buttonBehaviours', [ Focusing, Keying ]), option('action'), option('role'), defaulted$1('eventOrder', {}) ] }); var record = function (spec) { var uid = isSketchSpec(spec) && hasNonNullableKey(spec, 'uid') ? spec.uid : generate$2('memento'); var get = function (anyInSystem) { return anyInSystem.getSystem().getByUid(uid).getOrDie(); }; var getOpt = function (anyInSystem) { return anyInSystem.getSystem().getByUid(uid).toOptional(); }; var asSpec = function () { return __assign(__assign({}, spec), { uid: uid }); }; return { get: get, getOpt: getOpt, asSpec: asSpec }; }; var defaultIcon = function (icons) { return Optional.from(icons()['temporary-placeholder']).getOr('!not found!'); }; var get$e = function (name, icons) { return Optional.from(icons()[name.toLowerCase()]).getOrThunk(function () { return defaultIcon(icons); }); }; var getOr = function (name, icons, fallback) { return Optional.from(icons()[name.toLowerCase()]).or(fallback).getOrThunk(function () { return defaultIcon(icons); }); }; var getFirst$1 = function (names, icons) { return findMap(names, function (name) { return Optional.from(icons()[name.toLowerCase()]); }).getOrThunk(function () { return defaultIcon(icons); }); }; var notificationIconMap = { success: 'checkmark', error: 'warning', err: 'error', warning: 'warning', warn: 'warning', info: 'info' }; var factory$2 = function (detail) { var memBannerText = record({ dom: { tag: 'p', innerHtml: detail.translationProvider(detail.text) }, behaviours: derive$1([Replacing.config({})]) }); var renderPercentBar = function (percent) { return { dom: { tag: 'div', classes: ['tox-bar'], attributes: { style: 'width: ' + percent + '%' } } }; }; var renderPercentText = function (percent) { return { dom: { tag: 'div', classes: ['tox-text'], innerHtml: percent + '%' } }; }; var memBannerProgress = record({ dom: { tag: 'div', classes: detail.progress ? [ 'tox-progress-bar', 'tox-progress-indicator' ] : ['tox-progress-bar'] }, components: [ { dom: { tag: 'div', classes: ['tox-bar-container'] }, components: [renderPercentBar(0)] }, renderPercentText(0) ], behaviours: derive$1([Replacing.config({})]) }); var updateProgress = function (comp, percent) { if (comp.getSystem().isConnected()) { memBannerProgress.getOpt(comp).each(function (progress) { Replacing.set(progress, [ { dom: { tag: 'div', classes: ['tox-bar-container'] }, components: [renderPercentBar(percent)] }, renderPercentText(percent) ]); }); } }; var updateText = function (comp, text$1) { if (comp.getSystem().isConnected()) { var banner = memBannerText.get(comp); Replacing.set(banner, [text(text$1)]); } }; var apis = { updateProgress: updateProgress, updateText: updateText }; var iconChoices = flatten([ detail.icon.toArray(), detail.level.toArray(), detail.level.bind(function (level) { return Optional.from(notificationIconMap[level]); }).toArray() ]); var memButton = record(Button.sketch({ dom: { tag: 'button', classes: [ 'tox-notification__dismiss', 'tox-button', 'tox-button--naked', 'tox-button--icon' ] }, components: [{ dom: { tag: 'div', classes: ['tox-icon'], innerHtml: get$e('close', detail.iconProvider), attributes: { 'aria-label': detail.translationProvider('Close') } } }], action: function (comp) { detail.onAction(comp); } })); var components = [ { dom: { tag: 'div', classes: ['tox-notification__icon'], innerHtml: getFirst$1(iconChoices, detail.iconProvider) } }, { dom: { tag: 'div', classes: ['tox-notification__body'] }, components: [memBannerText.asSpec()], behaviours: derive$1([Replacing.config({})]) } ]; return { uid: detail.uid, dom: { tag: 'div', attributes: { role: 'alert' }, classes: detail.level.map(function (level) { return [ 'tox-notification', 'tox-notification--in', 'tox-notification--' + level ]; }).getOr([ 'tox-notification', 'tox-notification--in' ]) }, behaviours: derive$1([ Focusing.config({}), config('notification-events', [run(focusin(), function (comp) { memButton.getOpt(comp).each(Focusing.focus); })]) ]), components: components.concat(detail.progress ? [memBannerProgress.asSpec()] : []).concat(!detail.closeButton ? [] : [memButton.asSpec()]), apis: apis }; }; var Notification = single$2({ name: 'Notification', factory: factory$2, configFields: [ option('level'), strict$1('progress'), strict$1('icon'), strict$1('onAction'), strict$1('text'), strict$1('iconProvider'), strict$1('translationProvider'), defaultedBoolean('closeButton', true) ], apis: { updateProgress: function (apis, comp, percent) { apis.updateProgress(comp, percent); }, updateText: function (apis, comp, text) { apis.updateText(comp, text); } } }); function NotificationManagerImpl (editor, extras, uiMothership) { var backstage = extras.backstage; var getLayoutDirection = function (rel) { switch (rel) { case 'bc-bc': return south$3; case 'tc-tc': return north$3; case 'tc-bc': return north$1; case 'bc-tc': default: return south$1; } }; var prePositionNotifications = function (notifications) { each(notifications, function (notification) { return notification.moveTo(0, 0); }); }; var positionNotifications = function (notifications) { if (notifications.length > 0) { head(notifications).each(function (firstItem) { return firstItem.moveRel(null, 'banner'); }); each(notifications, function (notification, index) { if (index > 0) { notification.moveRel(notifications[index - 1].getEl(), 'bc-tc'); } }); } }; var reposition = function (notifications) { prePositionNotifications(notifications); positionNotifications(notifications); }; var open = function (settings, closeCallback) { var hideCloseButton = !settings.closeButton && settings.timeout && (settings.timeout > 0 || settings.timeout < 0); var close = function () { closeCallback(); InlineView.hide(notificationWrapper); }; var notification = build$1(Notification.sketch({ text: settings.text, level: contains([ 'success', 'error', 'warning', 'warn', 'info' ], settings.type) ? settings.type : undefined, progress: settings.progressBar === true, icon: Optional.from(settings.icon), closeButton: !hideCloseButton, onAction: close, iconProvider: backstage.shared.providers.icons, translationProvider: backstage.shared.providers.translate })); var notificationWrapper = build$1(InlineView.sketch(__assign({ dom: { tag: 'div', classes: ['tox-notifications-container'] }, lazySink: extras.backstage.shared.getSink, fireDismissalEventInstead: {} }, backstage.shared.header.isPositionedAtTop() ? {} : { fireRepositionEventInstead: {} }))); uiMothership.add(notificationWrapper); if (settings.timeout > 0) { global$2.setTimeout(function () { close(); }, settings.timeout); } return { close: close, moveTo: function (x, y) { InlineView.showAt(notificationWrapper, { anchor: 'makeshift', x: x, y: y }, premade$1(notification)); }, moveRel: function (element, rel) { if (rel !== 'banner') { var layoutDirection_1 = getLayoutDirection(rel); var nodeAnchor = { anchor: 'node', root: body(), node: Optional.some(SugarElement.fromDom(element)), layouts: { onRtl: function () { return [layoutDirection_1]; }, onLtr: function () { return [layoutDirection_1]; } } }; InlineView.showAt(notificationWrapper, nodeAnchor, premade$1(notification)); } else { InlineView.showAt(notificationWrapper, extras.backstage.shared.anchors.banner(), premade$1(notification)); } }, text: function (nuText) { Notification.updateText(notification, nuText); }, settings: settings, getEl: function () { return notification.element.dom; }, progressBar: { value: function (percent) { Notification.updateProgress(notification, percent); } } }; }; var close = function (notification) { notification.close(); }; var getArgs = function (notification) { return notification.settings; }; return { open: open, close: close, reposition: reposition, getArgs: getArgs }; } var first = function (fn, rate) { var timer = null; var cancel = function () { if (timer !== null) { clearTimeout(timer); timer = null; } }; var throttle = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } if (timer === null) { timer = setTimeout(function () { fn.apply(null, args); timer = null; }, rate); } }; return { cancel: cancel, throttle: throttle }; }; var last$2 = function (fn, rate) { var timer = null; var cancel = function () { if (timer !== null) { clearTimeout(timer); timer = null; } }; var throttle = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } if (timer !== null) { clearTimeout(timer); } timer = setTimeout(function () { fn.apply(null, args); timer = null; }, rate); }; return { cancel: cancel, throttle: throttle }; }; var global$3 = tinymce.util.Tools.resolve('tinymce.dom.TextSeeker'); var isBoundary = function (dom, node) { return dom.isBlock(node) || contains([ 'BR', 'IMG', 'HR', 'INPUT' ], node.nodeName) || dom.getContentEditable(node) === 'false'; }; var repeatLeft = function (dom, node, offset, process, rootNode) { var search = global$3(dom, function (node) { return isBoundary(dom, node); }); return Optional.from(search.backwards(node, offset, process, rootNode)); }; var autocompleteSelector = '[data-mce-autocompleter]'; var create$4 = function (editor, range) { return detect$4(SugarElement.fromDom(editor.selection.getNode())).getOrThunk(function () { var wrapper = SugarElement.fromHtml('', editor.getDoc()); append(wrapper, SugarElement.fromDom(range.extractContents())); range.insertNode(wrapper.dom); parent(wrapper).each(function (elm) { return elm.dom.normalize(); }); last$1(wrapper).map(function (last) { editor.selection.setCursorLocation(last.dom, getEnd(last)); }); return wrapper; }); }; var detect$4 = function (elm) { return closest$3(elm, autocompleteSelector); }; var isValidTextRange = function (rng) { return rng.collapsed && rng.startContainer.nodeType === 3; }; var getText = function (rng) { return rng.toString().replace(/\u00A0/g, ' ').replace(/\uFEFF/g, ''); }; var isWhitespace = function (chr) { return chr !== '' && ' \xA0\f\n\r\t\x0B'.indexOf(chr) !== -1; }; var stripTriggerChar = function (text, triggerCh) { return text.substring(triggerCh.length); }; var findChar = function (text, index, ch) { var i; for (i = index - 1; i >= 0; i--) { var char = text.charAt(i); if (isWhitespace(char)) { return Optional.none(); } if (char === ch) { break; } } return Optional.some(i); }; var findStart = function (dom, initRange, ch, minChars) { if (minChars === void 0) { minChars = 0; } if (!isValidTextRange(initRange)) { return Optional.none(); } var findTriggerChIndex = function (element, offset, text) { return findChar(text, offset, ch).getOr(offset); }; var root = dom.getParent(initRange.startContainer, dom.isBlock) || dom.getRoot(); return repeatLeft(dom, initRange.startContainer, initRange.startOffset, findTriggerChIndex, root).bind(function (spot) { var range = initRange.cloneRange(); range.setStart(spot.container, spot.offset); range.setEnd(initRange.endContainer, initRange.endOffset); if (range.collapsed) { return Optional.none(); } var text = getText(range); var triggerCharIndex = text.lastIndexOf(ch); if (triggerCharIndex !== 0 || stripTriggerChar(text, ch).length < minChars) { return Optional.none(); } else { return Optional.some({ text: stripTriggerChar(text, ch), range: range, triggerChar: ch }); } }); }; var getContext = function (dom, initRange, ch, minChars) { if (minChars === void 0) { minChars = 0; } return detect$4(SugarElement.fromDom(initRange.startContainer)).fold(function () { return findStart(dom, initRange, ch, minChars); }, function (elm) { var range = dom.createRng(); range.selectNode(elm.dom); var text = getText(range); return Optional.some({ range: range, text: stripTriggerChar(text, ch), triggerChar: ch }); }); }; var setup = function (api, editor) { editor.on('keypress compositionend', api.onKeypress.throttle); editor.on('remove', api.onKeypress.cancel); var redirectKeyToItem = function (item, e) { emitWith(item, keydown(), { raw: e }); }; editor.on('keydown', function (e) { var getItem = function () { return api.getView().bind(Highlighting.getHighlighted); }; if (e.which === 8) { api.onKeypress.throttle(e); } if (api.isActive()) { if (e.which === 27) { api.cancelIfNecessary(); } if (api.isMenuOpen()) { if (e.which === 13) { getItem().each(emitExecute); e.preventDefault(); } else if (e.which === 40) { getItem().fold(function () { api.getView().each(Highlighting.highlightFirst); }, function (item) { redirectKeyToItem(item, e); }); e.preventDefault(); e.stopImmediatePropagation(); } else if (e.which === 37 || e.which === 38 || e.which === 39) { getItem().each(function (item) { redirectKeyToItem(item, e); e.preventDefault(); e.stopImmediatePropagation(); }); } } else { if (e.which === 13 || e.which === 38 || e.which === 40) { api.cancelIfNecessary(); } } } }); editor.on('NodeChange', function (e) { if (api.isActive() && !api.isProcessingAction() && detect$4(SugarElement.fromDom(e.element)).isNone()) { api.cancelIfNecessary(); } }); }; var AutocompleterEditorEvents = { setup: setup }; var global$4 = tinymce.util.Tools.resolve('tinymce.util.Promise'); var point$1 = function (container, offset) { return { container: container, offset: offset }; }; var isText$1 = function (node) { return node.nodeType === TEXT; }; var isElement$1 = function (node) { return node.nodeType === ELEMENT; }; var toLast = function (node) { if (isText$1(node)) { return point$1(node, node.data.length); } else { var children = node.childNodes; return children.length > 0 ? toLast(children[children.length - 1]) : point$1(node, children.length); } }; var toLeaf = function (node, offset) { var children = node.childNodes; if (children.length > 0 && offset < children.length) { return toLeaf(children[offset], 0); } else if (children.length > 0 && isElement$1(node) && children.length === offset) { return toLast(children[children.length - 1]); } else { return point$1(node, offset); } }; var isPreviousCharContent = function (dom, leaf) { return repeatLeft(dom, leaf.container, leaf.offset, function (element, offset) { return offset === 0 ? -1 : offset; }, dom.getRoot()).filter(function (spot) { var char = spot.container.data.charAt(spot.offset - 1); return !isWhitespace(char); }).isSome(); }; var isStartOfWord = function (dom) { return function (rng) { var leaf = toLeaf(rng.startContainer, rng.startOffset); return !isPreviousCharContent(dom, leaf); }; }; var getTriggerContext = function (dom, initRange, database) { return findMap(database.triggerChars, function (ch) { return getContext(dom, initRange, ch); }); }; var lookup = function (editor, getDatabase) { var database = getDatabase(); var rng = editor.selection.getRng(); return getTriggerContext(editor.dom, rng, database).bind(function (context) { return lookupWithContext(editor, getDatabase, context); }); }; var lookupWithContext = function (editor, getDatabase, context, fetchOptions) { if (fetchOptions === void 0) { fetchOptions = {}; } var database = getDatabase(); var rng = editor.selection.getRng(); var startText = rng.startContainer.nodeValue; var autocompleters = filter(database.lookupByChar(context.triggerChar), function (autocompleter) { return context.text.length >= autocompleter.minChars && autocompleter.matches.getOrThunk(function () { return isStartOfWord(editor.dom); })(context.range, startText, context.text); }); if (autocompleters.length === 0) { return Optional.none(); } var lookupData = global$4.all(map(autocompleters, function (ac) { var fetchResult = ac.fetch(context.text, ac.maxResults, fetchOptions); return fetchResult.then(function (results) { return { matchText: context.text, items: results, columns: ac.columns, onAction: ac.onAction, highlightOn: ac.highlightOn }; }); })); return Optional.some({ lookupData: lookupData, context: context }); }; var separatorMenuItemSchema = objOf([ strictString('type'), optionString('text') ]); var createSeparatorMenuItem = function (spec) { return asRaw('separatormenuitem', separatorMenuItemSchema, spec); }; var autocompleterItemSchema = objOf([ defaulted$1('type', 'autocompleteitem'), defaulted$1('active', false), defaulted$1('disabled', false), defaulted$1('meta', {}), strictString('value'), optionString('text'), optionString('icon') ]); var autocompleterSchema = objOf([ strictString('type'), strictString('ch'), defaultedNumber('minChars', 1), defaulted$1('columns', 1), defaultedNumber('maxResults', 10), optionFunction('matches'), strictFunction('fetch'), strictFunction('onAction'), defaultedArrayOf('highlightOn', [], string) ]); var createSeparatorItem = function (spec) { return asRaw('Autocompleter.Separator', separatorMenuItemSchema, spec); }; var createAutocompleterItem = function (spec) { return asRaw('Autocompleter.Item', autocompleterItemSchema, spec); }; var createAutocompleter = function (spec) { return asRaw('Autocompleter', autocompleterSchema, spec); }; var baseToolbarButtonFields = [ defaultedBoolean('disabled', false), optionString('tooltip'), optionString('icon'), optionString('text'), defaultedFunction('onSetup', function () { return noop; }) ]; var toolbarButtonSchema = objOf([ strictString('type'), strictFunction('onAction') ].concat(baseToolbarButtonFields)); var createToolbarButton = function (spec) { return asRaw('toolbarbutton', toolbarButtonSchema, spec); }; var baseToolbarToggleButtonFields = [defaultedBoolean('active', false)].concat(baseToolbarButtonFields); var toggleButtonSchema = objOf(baseToolbarToggleButtonFields.concat([ strictString('type'), strictFunction('onAction') ])); var createToggleButton = function (spec) { return asRaw('ToggleButton', toggleButtonSchema, spec); }; var contextBarFields = [ defaultedFunction('predicate', never), defaultedStringEnum('scope', 'node', [ 'node', 'editor' ]), defaultedStringEnum('position', 'selection', [ 'node', 'selection', 'line' ]) ]; var contextButtonFields = baseToolbarButtonFields.concat([ defaulted$1('type', 'contextformbutton'), defaulted$1('primary', false), strictFunction('onAction'), state$1('original', identity) ]); var contextToggleButtonFields = baseToolbarToggleButtonFields.concat([ defaulted$1('type', 'contextformbutton'), defaulted$1('primary', false), strictFunction('onAction'), state$1('original', identity) ]); var launchButtonFields = baseToolbarButtonFields.concat([defaulted$1('type', 'contextformbutton')]); var launchToggleButtonFields = baseToolbarToggleButtonFields.concat([defaulted$1('type', 'contextformtogglebutton')]); var toggleOrNormal = choose$1('type', { contextformbutton: contextButtonFields, contextformtogglebutton: contextToggleButtonFields }); var contextFormSchema = objOf([ defaulted$1('type', 'contextform'), defaultedFunction('initValue', function () { return ''; }), optionString('label'), strictArrayOf('commands', toggleOrNormal), optionOf('launch', choose$1('type', { contextformbutton: launchButtonFields, contextformtogglebutton: launchToggleButtonFields })) ].concat(contextBarFields)); var createContextForm = function (spec) { return asRaw('ContextForm', contextFormSchema, spec); }; var contextToolbarSchema = objOf([ defaulted$1('type', 'contexttoolbar'), strictString('items') ].concat(contextBarFields)); var createContextToolbar = function (spec) { return asRaw('ContextToolbar', contextToolbarSchema, spec); }; var stringArray = function (a) { var all = {}; each(a, function (key) { all[key] = {}; }); return keys(all); }; var register = function (editor) { var popups = editor.ui.registry.getAll().popups; var dataset = map$2(popups, function (popup) { return createAutocompleter(popup).fold(function (err) { throw new Error(formatError(err)); }, function (x) { return x; }); }); var triggerChars = stringArray(mapToArray(dataset, function (v) { return v.ch; })); var datasetValues = values(dataset); var lookupByChar = function (ch) { return filter(datasetValues, function (dv) { return dv.ch === ch; }); }; return { dataset: dataset, triggerChars: triggerChars, lookupByChar: lookupByChar }; }; var ItemResponse; (function (ItemResponse) { ItemResponse[ItemResponse['CLOSE_ON_EXECUTE'] = 0] = 'CLOSE_ON_EXECUTE'; ItemResponse[ItemResponse['BUBBLE_TO_SANDBOX'] = 1] = 'BUBBLE_TO_SANDBOX'; }(ItemResponse || (ItemResponse = {}))); var ItemResponse$1 = ItemResponse; var navClass = 'tox-menu-nav__js'; var selectableClass = 'tox-collection__item'; var colorClass = 'tox-swatch'; var presetClasses = { normal: navClass, color: colorClass }; var tickedClass = 'tox-collection__item--enabled'; var groupHeadingClass = 'tox-collection__group-heading'; var iconClass = 'tox-collection__item-icon'; var textClass = 'tox-collection__item-label'; var accessoryClass = 'tox-collection__item-accessory'; var caretClass = 'tox-collection__item-caret'; var checkmarkClass = 'tox-collection__item-checkmark'; var activeClass = 'tox-collection__item--active'; var iconClassRtl = 'tox-collection__item-icon-rtl'; var containerClass = 'tox-collection__item-container'; var containerColumnClass = 'tox-collection__item-container--column'; var containerRowClass = 'tox-collection__item-container--row'; var containerAlignRightClass = 'tox-collection__item-container--align-right'; var containerAlignLeftClass = 'tox-collection__item-container--align-left'; var containerValignTopClass = 'tox-collection__item-container--valign-top'; var containerValignMiddleClass = 'tox-collection__item-container--valign-middle'; var containerValignBottomClass = 'tox-collection__item-container--valign-bottom'; var classForPreset = function (presets) { return get$1(presetClasses, presets).getOr(navClass); }; var forMenu = function (presets) { if (presets === 'color') { return 'tox-swatches'; } else { return 'tox-menu'; } }; var classes = function (presets) { return { backgroundMenu: 'tox-background-menu', selectedMenu: 'tox-selected-menu', selectedItem: 'tox-collection__item--active', hasIcons: 'tox-menu--has-icons', menu: forMenu(presets), tieredMenu: 'tox-tiered-menu' }; }; var markers$1 = function (presets) { var menuClasses = classes(presets); return { backgroundMenu: menuClasses.backgroundMenu, selectedMenu: menuClasses.selectedMenu, menu: menuClasses.menu, selectedItem: menuClasses.selectedItem, item: classForPreset(presets) }; }; var dom$1 = function (hasIcons, columns, presets) { var menuClasses = classes(presets); return { tag: 'div', classes: flatten([ [ menuClasses.menu, 'tox-menu-' + columns + '-column' ], hasIcons ? [menuClasses.hasIcons] : [] ]) }; }; var components$1 = [Menu.parts.items({})]; var part = function (hasIcons, columns, presets) { var menuClasses = classes(presets); var d = { tag: 'div', classes: flatten([[menuClasses.tieredMenu]]) }; return { dom: d, markers: markers$1(presets) }; }; var chunk$1 = function (rowDom, numColumns) { return function (items) { var chunks = chunk(items, numColumns); return map(chunks, function (c) { return { dom: rowDom, components: c }; }); }; }; var forSwatch = function (columns) { return { dom: { tag: 'div', classes: [ 'tox-menu', 'tox-swatches-menu' ] }, components: [{ dom: { tag: 'div', classes: ['tox-swatches'] }, components: [Menu.parts.items({ preprocess: columns !== 'auto' ? chunk$1({ tag: 'div', classes: ['tox-swatches__row'] }, columns) : identity })] }] }; }; var forToolbar = function (columns) { return { dom: { tag: 'div', classes: [ 'tox-menu', 'tox-collection', 'tox-collection--toolbar', 'tox-collection--toolbar-lg' ] }, components: [Menu.parts.items({ preprocess: chunk$1({ tag: 'div', classes: ['tox-collection__group'] }, columns) })] }; }; var preprocessCollection = function (items, isSeparator) { var allSplits = []; var currentSplit = []; each(items, function (item, i) { if (isSeparator(item, i)) { if (currentSplit.length > 0) { allSplits.push(currentSplit); } currentSplit = []; if (has(item.dom, 'innerHtml')) { currentSplit.push(item); } } else { currentSplit.push(item); } }); if (currentSplit.length > 0) { allSplits.push(currentSplit); } return map(allSplits, function (s) { return { dom: { tag: 'div', classes: ['tox-collection__group'] }, components: s }; }); }; var forCollection = function (columns, initItems, _hasIcons) { return { dom: { tag: 'div', classes: [ 'tox-menu', 'tox-collection' ].concat(columns === 1 ? ['tox-collection--list'] : ['tox-collection--grid']) }, components: [Menu.parts.items({ preprocess: function (items) { if (columns !== 'auto' && columns > 1) { return chunk$1({ tag: 'div', classes: ['tox-collection__group'] }, columns)(items); } else { return preprocessCollection(items, function (_item, i) { return initItems[i].type === 'separator'; }); } } })] }; }; var forHorizontalCollection = function (initItems, _hasIcons) { return { dom: { tag: 'div', classes: [ 'tox-collection', 'tox-collection--horizontal' ] }, components: [Menu.parts.items({ preprocess: function (items) { return preprocessCollection(items, function (_item, i) { return initItems[i].type === 'separator'; }); } })] }; }; var menuHasIcons = function (xs) { return exists(xs, function (item) { return 'icon' in item && item.icon !== undefined; }); }; var handleError = function (error) { console.error(formatError(error)); console.log(error); return Optional.none(); }; var createHorizontalPartialMenuWithAlloyItems = function (value, _hasIcons, items, _columns, _presets) { var structure = forHorizontalCollection(items); return { value: value, dom: structure.dom, components: structure.components, items: items }; }; var createPartialMenuWithAlloyItems = function (value, hasIcons, items, columns, presets) { if (presets === 'color') { var structure = forSwatch(columns); return { value: value, dom: structure.dom, components: structure.components, items: items }; } if (presets === 'normal' && columns === 'auto') { var structure = forCollection(columns, items); return { value: value, dom: structure.dom, components: structure.components, items: items }; } if (presets === 'normal' && columns === 1) { var structure = forCollection(1, items); return { value: value, dom: structure.dom, components: structure.components, items: items }; } if (presets === 'normal') { var structure = forCollection(columns, items); return { value: value, dom: structure.dom, components: structure.components, items: items }; } if (presets === 'listpreview' && columns !== 'auto') { var structure = forToolbar(columns); return { value: value, dom: structure.dom, components: structure.components, items: items }; } return { value: value, dom: dom$1(hasIcons, columns, presets), components: components$1, items: items }; }; var cardImageFields = [ strictString('type'), strictString('src'), optionString('alt'), defaultedArrayOf('classes', [], string) ]; var cardImageSchema = objOf(cardImageFields); var cardTextFields = [ strictString('type'), strictString('text'), optionString('name'), defaultedArrayOf('classes', ['tox-collection__item-label'], string) ]; var cardTextSchema = objOf(cardTextFields); var itemSchema$2 = valueThunkOf(function () { return chooseProcessor('type', { cardimage: cardImageSchema, cardtext: cardTextSchema, cardcontainer: cardContainerSchema }); }); var cardContainerSchema = objOf([ strictString('type'), defaultedString('direction', 'horizontal'), defaultedString('align', 'left'), defaultedString('valign', 'middle'), strictArrayOf('items', itemSchema$2) ]); var commonMenuItemFields = [ defaultedBoolean('disabled', false), optionString('text'), optionString('shortcut'), field('value', 'value', defaultedThunk(function () { return generate$1('menuitem-value'); }), anyValue$1()), defaulted$1('meta', {}) ]; var cardMenuItemSchema = objOf([ strictString('type'), optionString('label'), strictArrayOf('items', itemSchema$2), defaultedFunction('onSetup', function () { return noop; }), defaultedFunction('onAction', noop) ].concat(commonMenuItemFields)); var createCardMenuItem = function (spec) { return asRaw('cardmenuitem', cardMenuItemSchema, spec); }; var choiceMenuItemSchema = objOf([ strictString('type'), defaultedBoolean('active', false), optionString('icon') ].concat(commonMenuItemFields)); var createChoiceMenuItem = function (spec) { return asRaw('choicemenuitem', choiceMenuItemSchema, spec); }; var fancyTypes = [ 'inserttable', 'colorswatch' ]; var fancyMenuItemSchema = objOf([ strictString('type'), strictStringEnum('fancytype', fancyTypes), defaultedFunction('onAction', noop) ]); var createFancyMenuItem = function (spec) { return asRaw('fancymenuitem', fancyMenuItemSchema, spec); }; var menuItemSchema = objOf([ strictString('type'), defaultedFunction('onSetup', function () { return noop; }), defaultedFunction('onAction', noop), optionString('icon') ].concat(commonMenuItemFields)); var createMenuItem = function (spec) { return asRaw('menuitem', menuItemSchema, spec); }; var nestedMenuItemSchema = objOf([ strictString('type'), strictFunction('getSubmenuItems'), defaultedFunction('onSetup', function () { return noop; }), optionString('icon') ].concat(commonMenuItemFields)); var createNestedMenuItem = function (spec) { return asRaw('nestedmenuitem', nestedMenuItemSchema, spec); }; var toggleMenuItemSchema = objOf([ strictString('type'), optionString('icon'), defaultedBoolean('active', false), defaultedFunction('onSetup', function () { return noop; }), strictFunction('onAction') ].concat(commonMenuItemFields)); var createToggleMenuItem = function (spec) { return asRaw('togglemenuitem', toggleMenuItemSchema, spec); }; var detectSize = function (comp, margin, selectorClass) { var descendants$1 = descendants(comp.element, '.' + selectorClass); if (descendants$1.length > 0) { var columnLength = findIndex(descendants$1, function (c) { var thisTop = c.dom.getBoundingClientRect().top; var cTop = descendants$1[0].dom.getBoundingClientRect().top; return Math.abs(thisTop - cTop) > margin; }).getOr(descendants$1.length); return Optional.some({ numColumns: columnLength, numRows: Math.ceil(descendants$1.length / columnLength) }); } else { return Optional.none(); } }; var namedEvents = function (name, handlers) { return derive$1([config(name, handlers)]); }; var unnamedEvents = function (handlers) { return namedEvents(generate$1('unnamed-events'), handlers); }; var SimpleBehaviours = { namedEvents: namedEvents, unnamedEvents: unnamedEvents }; var ExclusivityChannel = generate$1('tooltip.exclusive'); var ShowTooltipEvent = generate$1('tooltip.show'); var HideTooltipEvent = generate$1('tooltip.hide'); var hideAllExclusive = function (component, _tConfig, _tState) { component.getSystem().broadcastOn([ExclusivityChannel], {}); }; var setComponents = function (component, tConfig, tState, specs) { tState.getTooltip().each(function (tooltip) { if (tooltip.getSystem().isConnected()) { Replacing.set(tooltip, specs); } }); }; var TooltippingApis = /*#__PURE__*/Object.freeze({ __proto__: null, hideAllExclusive: hideAllExclusive, setComponents: setComponents }); var events$8 = function (tooltipConfig, state) { var hide = function (comp) { state.getTooltip().each(function (p) { detach(p); tooltipConfig.onHide(comp, p); state.clearTooltip(); }); state.clearTimer(); }; var show = function (comp) { if (!state.isShowing()) { hideAllExclusive(comp); var sink = tooltipConfig.lazySink(comp).getOrDie(); var popup = comp.getSystem().build({ dom: tooltipConfig.tooltipDom, components: tooltipConfig.tooltipComponents, events: derive(tooltipConfig.mode === 'normal' ? [ run(mouseover(), function (_) { emit(comp, ShowTooltipEvent); }), run(mouseout(), function (_) { emit(comp, HideTooltipEvent); }) ] : []), behaviours: derive$1([Replacing.config({})]) }); state.setTooltip(popup); attach$1(sink, popup); tooltipConfig.onShow(comp, popup); Positioning.position(sink, tooltipConfig.anchor(comp), popup); } }; return derive(flatten([ [ run(ShowTooltipEvent, function (comp) { state.resetTimer(function () { show(comp); }, tooltipConfig.delay); }), run(HideTooltipEvent, function (comp) { state.resetTimer(function () { hide(comp); }, tooltipConfig.delay); }), run(receive(), function (comp, message) { var receivingData = message; if (!receivingData.universal) { if (contains(receivingData.channels, ExclusivityChannel)) { hide(comp); } } }), runOnDetached(function (comp) { hide(comp); }) ], tooltipConfig.mode === 'normal' ? [ run(focusin(), function (comp) { emit(comp, ShowTooltipEvent); }), run(postBlur(), function (comp) { emit(comp, HideTooltipEvent); }), run(mouseover(), function (comp) { emit(comp, ShowTooltipEvent); }), run(mouseout(), function (comp) { emit(comp, HideTooltipEvent); }) ] : [ run(highlight(), function (comp, _se) { emit(comp, ShowTooltipEvent); }), run(dehighlight(), function (comp) { emit(comp, HideTooltipEvent); }) ] ])); }; var ActiveTooltipping = /*#__PURE__*/Object.freeze({ __proto__: null, events: events$8 }); var TooltippingSchema = [ strict$1('lazySink'), strict$1('tooltipDom'), defaulted$1('exclusive', true), defaulted$1('tooltipComponents', []), defaulted$1('delay', 300), defaultedStringEnum('mode', 'normal', [ 'normal', 'follow-highlight' ]), defaulted$1('anchor', function (comp) { return { anchor: 'hotspot', hotspot: comp, layouts: { onLtr: constant([ south$1, north$1, southeast$1, northeast$1, southwest$1, northwest$1 ]), onRtl: constant([ south$1, north$1, southeast$1, northeast$1, southwest$1, northwest$1 ]) } }; }), onHandler('onHide'), onHandler('onShow') ]; var init$4 = function () { var timer = Cell(Optional.none()); var popup = Cell(Optional.none()); var getTooltip = function () { return popup.get(); }; var setTooltip = function (comp) { popup.set(Optional.some(comp)); }; var clearTooltip = function () { popup.set(Optional.none()); }; var clearTimer = function () { timer.get().each(function (t) { clearTimeout(t); }); }; var resetTimer = function (f, delay) { clearTimer(); timer.set(Optional.some(setTimeout(function () { f(); }, delay))); }; var isShowing = function () { return popup.get().isSome(); }; var readState = constant('not-implemented'); return nu$5({ getTooltip: getTooltip, isShowing: isShowing, setTooltip: setTooltip, clearTooltip: clearTooltip, clearTimer: clearTimer, resetTimer: resetTimer, readState: readState }); }; var TooltippingState = /*#__PURE__*/Object.freeze({ __proto__: null, init: init$4 }); var Tooltipping = create$1({ fields: TooltippingSchema, name: 'tooltipping', active: ActiveTooltipping, state: TooltippingState, apis: TooltippingApis }); var escape = function (text) { return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); }; var global$5 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); var global$6 = tinymce.util.Tools.resolve('tinymce.util.I18n'); var nativeDisabled = [ 'input', 'button', 'textarea', 'select' ]; var onLoad$5 = function (component, disableConfig, disableState) { var f = disableConfig.disabled() ? disable : enable; f(component, disableConfig); }; var hasNative = function (component, config) { return config.useNative === true && contains(nativeDisabled, name(component.element)); }; var nativeIsDisabled = function (component) { return has$1(component.element, 'disabled'); }; var nativeDisable = function (component) { set$1(component.element, 'disabled', 'disabled'); }; var nativeEnable = function (component) { remove$1(component.element, 'disabled'); }; var ariaIsDisabled = function (component) { return get$3(component.element, 'aria-disabled') === 'true'; }; var ariaDisable = function (component) { set$1(component.element, 'aria-disabled', 'true'); }; var ariaEnable = function (component) { set$1(component.element, 'aria-disabled', 'false'); }; var disable = function (component, disableConfig, _disableState) { disableConfig.disableClass.each(function (disableClass) { add$2(component.element, disableClass); }); var f = hasNative(component, disableConfig) ? nativeDisable : ariaDisable; f(component); disableConfig.onDisabled(component); }; var enable = function (component, disableConfig, _disableState) { disableConfig.disableClass.each(function (disableClass) { remove$4(component.element, disableClass); }); var f = hasNative(component, disableConfig) ? nativeEnable : ariaEnable; f(component); disableConfig.onEnabled(component); }; var isDisabled = function (component, disableConfig) { return hasNative(component, disableConfig) ? nativeIsDisabled(component) : ariaIsDisabled(component); }; var set$7 = function (component, disableConfig, disableState, disabled) { var f = disabled ? disable : enable; f(component, disableConfig); }; var DisableApis = /*#__PURE__*/Object.freeze({ __proto__: null, enable: enable, disable: disable, isDisabled: isDisabled, onLoad: onLoad$5, set: set$7 }); var exhibit$3 = function (base, disableConfig) { return nu$6({ classes: disableConfig.disabled() ? disableConfig.disableClass.toArray() : [] }); }; var events$9 = function (disableConfig, disableState) { return derive([ abort(execute(), function (component, _simulatedEvent) { return isDisabled(component, disableConfig); }), loadEvent(disableConfig, disableState, onLoad$5) ]); }; var ActiveDisable = /*#__PURE__*/Object.freeze({ __proto__: null, exhibit: exhibit$3, events: events$9 }); var DisableSchema = [ defaultedFunction('disabled', never), defaulted$1('useNative', true), option('disableClass'), onHandler('onDisabled'), onHandler('onEnabled') ]; var Disabling = create$1({ fields: DisableSchema, name: 'disabling', active: ActiveDisable, apis: DisableApis }); var global$7 = tinymce.util.Tools.resolve('tinymce.EditorManager'); var getSkinUrl = function (editor) { var skin = editor.getParam('skin'); var skinUrl = editor.getParam('skin_url'); if (skin !== false) { var skinName = skin ? skin : 'oxide'; if (skinUrl) { skinUrl = editor.documentBaseURI.toAbsolute(skinUrl); } else { skinUrl = global$7.baseURL + '/skins/ui/' + skinName; } } return skinUrl; }; var isReadOnly = function (editor) { return editor.getParam('readonly', false, 'boolean'); }; var isSkinDisabled = function (editor) { return editor.getParam('skin') === false; }; var getHeightSetting = function (editor) { return editor.getParam('height', Math.max(editor.getElement().offsetHeight, 200)); }; var getWidthSetting = function (editor) { return editor.getParam('width', global$5.DOM.getStyle(editor.getElement(), 'width')); }; var getMinWidthSetting = function (editor) { return Optional.from(editor.getParam('min_width')).filter(isNumber); }; var getMinHeightSetting = function (editor) { return Optional.from(editor.getParam('min_height')).filter(isNumber); }; var getMaxWidthSetting = function (editor) { return Optional.from(editor.getParam('max_width')).filter(isNumber); }; var getMaxHeightSetting = function (editor) { return Optional.from(editor.getParam('max_height')).filter(isNumber); }; var getUserStyleFormats = function (editor) { return Optional.from(editor.getParam('style_formats')).filter(isArray); }; var isMergeStyleFormats = function (editor) { return editor.getParam('style_formats_merge', false, 'boolean'); }; var getLineHeightFormats = function (editor) { return editor.getParam('lineheight_formats', '1 1.1 1.2 1.3 1.4 1.5 2', 'string').split(' '); }; var getRemovedMenuItems = function (editor) { return editor.getParam('removed_menuitems', ''); }; var isMenubarEnabled = function (editor) { return editor.getParam('menubar', true, 'boolean') !== false; }; var isToolbarEnabled = function (editor) { var toolbar = editor.getParam('toolbar', true); var isToolbarTrue = toolbar === true; var isToolbarString = isString(toolbar); var isToolbarObjectArray = isArray(toolbar) && toolbar.length > 0; return !isMultipleToolbars(editor) && (isToolbarObjectArray || isToolbarString || isToolbarTrue); }; var getMultipleToolbarsSetting = function (editor) { var toolbars = range(9, function (num) { return editor.getParam('toolbar' + (num + 1), false, 'string'); }); var toolbarArray = filter(toolbars, function (toolbar) { return typeof toolbar === 'string'; }); return toolbarArray.length > 0 ? Optional.some(toolbarArray) : Optional.none(); }; var isMultipleToolbars = function (editor) { return getMultipleToolbarsSetting(editor).fold(function () { var toolbar = editor.getParam('toolbar', [], 'string[]'); return toolbar.length > 0; }, always); }; var ToolbarMode; (function (ToolbarMode) { ToolbarMode['default'] = 'wrap'; ToolbarMode['floating'] = 'floating'; ToolbarMode['sliding'] = 'sliding'; ToolbarMode['scrolling'] = 'scrolling'; }(ToolbarMode || (ToolbarMode = {}))); var getToolbarMode = function (editor) { return editor.getParam('toolbar_mode', '', 'string'); }; var ToolbarLocation; (function (ToolbarLocation) { ToolbarLocation['auto'] = 'auto'; ToolbarLocation['top'] = 'top'; ToolbarLocation['bottom'] = 'bottom'; }(ToolbarLocation || (ToolbarLocation = {}))); var getToolbarGroups = function (editor) { return editor.getParam('toolbar_groups', {}, 'object'); }; var getToolbarLocation = function (editor) { return editor.getParam('toolbar_location', ToolbarLocation.auto, 'string'); }; var isToolbarLocationBottom = function (editor) { return getToolbarLocation(editor) === ToolbarLocation.bottom; }; var fixedContainerSelector = function (editor) { return editor.getParam('fixed_toolbar_container', '', 'string'); }; var fixedToolbarContainerTarget = function (editor) { return editor.getParam('fixed_toolbar_container_target'); }; var isToolbarPersist = function (editor) { return editor.getParam('toolbar_persist', false, 'boolean'); }; var fixedContainerTarget = function (editor) { if (!editor.inline) { return Optional.none(); } var selector = fixedContainerSelector(editor); if (selector.length > 0) { return descendant$1(body(), selector); } var element = fixedToolbarContainerTarget(editor); if (isNonNullable(element)) { return Optional.some(SugarElement.fromDom(element)); } return Optional.none(); }; var useFixedContainer = function (editor) { return editor.inline && fixedContainerTarget(editor).isSome(); }; var getUiContainer = function (editor) { var fixedContainer = fixedContainerTarget(editor); return fixedContainer.getOrThunk(function () { return getContentContainer(getRootNode(SugarElement.fromDom(editor.getElement()))); }); }; var isDistractionFree = function (editor) { return editor.inline && !isMenubarEnabled(editor) && !isToolbarEnabled(editor) && !isMultipleToolbars(editor); }; var isStickyToolbar = function (editor) { var isStickyToolbar = editor.getParam('toolbar_sticky', false, 'boolean'); return (isStickyToolbar || editor.inline) && !useFixedContainer(editor) && !isDistractionFree(editor); }; var isDraggableModal = function (editor) { return editor.getParam('draggable_modal', false, 'boolean'); }; var getMenus = function (editor) { var menu = editor.getParam('menu'); if (menu) { return map$2(menu, function (menu) { return __assign(__assign({}, menu), { items: menu.items }); }); } else { return {}; } }; var getMenubar = function (editor) { return editor.getParam('menubar'); }; var getToolbar = function (editor) { return editor.getParam('toolbar', true); }; var getFilePickerCallback = function (editor) { return editor.getParam('file_picker_callback'); }; var getFilePickerTypes = function (editor) { return editor.getParam('file_picker_types'); }; var getFileBrowserCallbackTypes = function (editor) { return editor.getParam('file_browser_callback_types'); }; var noTypeaheadUrls = function (editor) { return editor.getParam('typeahead_urls') === false; }; var getAnchorTop = function (editor) { return editor.getParam('anchor_top', '#top'); }; var getAnchorBottom = function (editor) { return editor.getParam('anchor_bottom', '#bottom'); }; var getFilePickerValidatorHandler = function (editor) { var handler = editor.getParam('file_picker_validator_handler', undefined, 'function'); if (handler === undefined) { return editor.getParam('filepicker_validator_handler', undefined, 'function'); } else { return handler; } }; var ReadOnlyChannel = 'silver.readonly'; var ReadOnlyDataSchema = objOf([strictBoolean('readonly')]); var broadcastReadonly = function (uiComponents, readonly) { var outerContainer = uiComponents.outerContainer; var target = outerContainer.element; if (readonly) { uiComponents.mothership.broadcastOn([dismissPopups()], { target: target }); uiComponents.uiMothership.broadcastOn([dismissPopups()], { target: target }); } uiComponents.mothership.broadcastOn([ReadOnlyChannel], { readonly: readonly }); uiComponents.uiMothership.broadcastOn([ReadOnlyChannel], { readonly: readonly }); }; var setupReadonlyModeSwitch = function (editor, uiComponents) { editor.on('init', function () { if (editor.mode.isReadOnly()) { broadcastReadonly(uiComponents, true); } }); editor.on('SwitchMode', function () { return broadcastReadonly(uiComponents, editor.mode.isReadOnly()); }); if (isReadOnly(editor)) { editor.setMode('readonly'); } }; var receivingConfig = function () { var _a; return Receiving.config({ channels: (_a = {}, _a[ReadOnlyChannel] = { schema: ReadOnlyDataSchema, onReceive: function (comp, data) { Disabling.set(comp, data.readonly); } }, _a) }); }; var item = function (disabled) { return Disabling.config({ disabled: disabled, disableClass: 'tox-collection__item--state-disabled' }); }; var button = function (disabled) { return Disabling.config({ disabled: disabled }); }; var splitButton = function (disabled) { return Disabling.config({ disabled: disabled, disableClass: 'tox-tbtn--disabled' }); }; var toolbarButton = function (disabled) { return Disabling.config({ disabled: disabled, disableClass: 'tox-tbtn--disabled', useNative: false }); }; var DisablingConfigs = { item: item, button: button, splitButton: splitButton, toolbarButton: toolbarButton }; var runWithApi = function (info, comp) { var api = info.getApi(comp); return function (f) { f(api); }; }; var onControlAttached = function (info, editorOffCell) { return runOnAttached(function (comp) { var run = runWithApi(info, comp); run(function (api) { var onDestroy = info.onSetup(api); if (isFunction(onDestroy)) { editorOffCell.set(onDestroy); } }); }); }; var onControlDetached = function (getApi, editorOffCell) { return runOnDetached(function (comp) { return runWithApi(getApi, comp)(editorOffCell.get()); }); }; var _a; var onMenuItemExecute = function (info, itemResponse) { return runOnExecute(function (comp, simulatedEvent) { runWithApi(info, comp)(info.onAction); if (!info.triggersSubmenu && itemResponse === ItemResponse$1.CLOSE_ON_EXECUTE) { if (comp.getSystem().isConnected()) { emit(comp, sandboxClose()); } simulatedEvent.stop(); } }); }; var menuItemEventOrder = (_a = {}, _a[execute()] = [ 'disabling', 'alloy.base.behaviour', 'toggling', 'item-events' ], _a); var componentRenderPipeline = function (xs) { return bind(xs, function (o) { return o.toArray(); }); }; var renderCommonItem = function (spec, structure, itemResponse, providersbackstage) { var editorOffCell = Cell(noop); return { type: 'item', dom: structure.dom, components: componentRenderPipeline(structure.optComponents), data: spec.data, eventOrder: menuItemEventOrder, hasSubmenu: spec.triggersSubmenu, itemBehaviours: derive$1([ config('item-events', [ onMenuItemExecute(spec, itemResponse), onControlAttached(spec, editorOffCell), onControlDetached(spec, editorOffCell) ]), DisablingConfigs.item(function () { return spec.disabled || providersbackstage.isDisabled(); }), receivingConfig(), Replacing.config({}) ].concat(spec.itemBehaviours)) }; }; var buildData = function (source) { return { value: source.value, meta: __assign({ text: source.text.getOr('') }, source.meta) }; }; var global$8 = tinymce.util.Tools.resolve('tinymce.Env'); var convertText = function (source) { var mac = { alt: '⌥', ctrl: '⌃', shift: '⇧', meta: '⌘', access: '⌃⌥' }; var other = { meta: 'Ctrl', access: 'Shift+Alt' }; var replace = global$8.mac ? mac : other; var shortcut = source.split('+'); var updated = map(shortcut, function (segment) { var search = segment.toLowerCase().trim(); return has(replace, search) ? replace[search] : segment; }); return global$8.mac ? updated.join('') : updated.join('+'); }; var renderIcon = function (iconHtml) { return { dom: { tag: 'div', classes: [iconClass], innerHtml: iconHtml } }; }; var renderText = function (text$1) { return { dom: { tag: 'div', classes: [textClass] }, components: [text(global$6.translate(text$1))] }; }; var renderHtml = function (html, classes) { return { dom: { tag: 'div', classes: classes, innerHtml: html } }; }; var renderStyledText = function (style, text$1) { return { dom: { tag: 'div', classes: [textClass] }, components: [{ dom: { tag: style.tag, styles: style.styles }, components: [text(global$6.translate(text$1))] }] }; }; var renderShortcut = function (shortcut) { return { dom: { tag: 'div', classes: [accessoryClass], innerHtml: convertText(shortcut) } }; }; var renderCheckmark = function (icons) { return { dom: { tag: 'div', classes: [checkmarkClass], innerHtml: get$e('checkmark', icons) } }; }; var renderSubmenuCaret = function (icons) { return { dom: { tag: 'div', classes: [caretClass], innerHtml: get$e('chevron-right', icons) } }; }; var renderDownwardsCaret = function (icons) { return { dom: { tag: 'div', classes: [caretClass], innerHtml: get$e('chevron-down', icons) } }; }; var renderContainer = function (container, components) { var directionClass = container.direction === 'vertical' ? containerColumnClass : containerRowClass; var alignClass = container.align === 'left' ? containerAlignLeftClass : containerAlignRightClass; var getValignClass = function () { switch (container.valign) { case 'top': return containerValignTopClass; case 'middle': return containerValignMiddleClass; case 'bottom': return containerValignBottomClass; } }; return { dom: { tag: 'div', classes: [ containerClass, directionClass, alignClass, getValignClass() ] }, components: components }; }; var renderImage = function (src, classes, alt) { return { dom: { tag: 'img', classes: classes, attributes: { src: src, alt: alt.getOr('') } } }; }; var renderColorStructure = function (itemText, itemValue, iconSvg, providerBackstage) { var colorPickerCommand = 'custom'; var removeColorCommand = 'remove'; var getDom = function () { var common = colorClass; var icon = iconSvg.getOr(''); var attributes = itemText.map(function (text) { return { title: providerBackstage.translate(text) }; }).getOr({}); var baseDom = { tag: 'div', attributes: attributes, classes: [common] }; if (itemValue === colorPickerCommand) { return __assign(__assign({}, baseDom), { tag: 'button', classes: __spreadArrays(baseDom.classes, ['tox-swatches__picker-btn']), innerHtml: icon }); } else if (itemValue === removeColorCommand) { return __assign(__assign({}, baseDom), { classes: __spreadArrays(baseDom.classes, ['tox-swatch--remove']), innerHtml: icon }); } else { return __assign(__assign({}, baseDom), { attributes: __assign(__assign({}, baseDom.attributes), { 'data-mce-color': itemValue }), styles: { 'background-color': itemValue } }); } }; return { dom: getDom(), optComponents: [] }; }; var renderItemDomStructure = function (rtlClass, ariaLabel) { var domTitle = ariaLabel.map(function (label) { return { attributes: { title: global$6.translate(label) } }; }).getOr({}); return __assign({ tag: 'div', classes: [ navClass, selectableClass ].concat(rtlClass ? [iconClassRtl] : []) }, domTitle); }; var renderNormalItemStructure = function (info, icon, renderIcons, textRender, rtlClass) { var leftIcon = renderIcons ? icon.or(Optional.some('')).map(renderIcon) : Optional.none(); var checkmark = info.checkMark; var content = info.htmlContent.fold(function () { return info.textContent.map(textRender); }, function (html) { return Optional.some(renderHtml(html, [textClass])); }); var menuItem = { dom: renderItemDomStructure(rtlClass, info.ariaLabel), optComponents: [ leftIcon, content, info.shortcutContent.map(renderShortcut), checkmark, info.caret ] }; return menuItem; }; var rtlIcon = [ 'list-num-default', 'list-num-lower-alpha', 'list-num-lower-greek', 'list-num-lower-roman', 'list-num-upper-alpha', 'list-num-upper-roman' ]; var rtlTransform = [ 'list-bull-circle', 'list-bull-default', 'list-bull-square' ]; var renderItemStructure = function (info, providersBackstage, renderIcons, fallbackIcon) { if (fallbackIcon === void 0) { fallbackIcon = Optional.none(); } var getIconName = function (iconName) { return iconName.map(function (name) { return global$6.isRtl() && contains(rtlIcon, name) ? name + '-rtl' : name; }); }; var needRtlClass = global$6.isRtl() && info.iconContent.exists(function (name) { return contains(rtlTransform, name); }); var icon = getIconName(info.iconContent).map(function (iconName) { return getOr(iconName, providersBackstage.icons, fallbackIcon); }); var textRender = Optional.from(info.meta).fold(function () { return renderText; }, function (meta) { return has(meta, 'style') ? curry(renderStyledText, meta.style) : renderText; }); if (info.presets === 'color') { return renderColorStructure(info.ariaLabel, info.value, icon, providersBackstage); } else { return renderNormalItemStructure(info, icon, renderIcons, textRender, needRtlClass); } }; var tooltipBehaviour = function (meta, sharedBackstage) { return get$1(meta, 'tooltipWorker').map(function (tooltipWorker) { return [Tooltipping.config({ lazySink: sharedBackstage.getSink, tooltipDom: { tag: 'div', classes: ['tox-tooltip-worker-container'] }, tooltipComponents: [], anchor: function (comp) { return { anchor: 'submenu', item: comp, overrides: { maxHeightFunction: expandable } }; }, mode: 'follow-highlight', onShow: function (component, _tooltip) { tooltipWorker(function (elm) { Tooltipping.setComponents(component, [external({ element: SugarElement.fromDom(elm) })]); }); } })]; }).getOr([]); }; var encodeText = function (text) { return global$5.DOM.encode(text); }; var replaceText = function (text, matchText) { var translated = global$6.translate(text); var encoded = encodeText(translated); if (matchText.length > 0) { var escapedMatchRegex = new RegExp(escape(matchText), 'gi'); return encoded.replace(escapedMatchRegex, function (match) { return '' + match + ''; }); } else { return encoded; } }; var renderAutocompleteItem = function (spec, matchText, useText, presets, onItemValueHandler, itemResponse, sharedBackstage, renderIcons) { if (renderIcons === void 0) { renderIcons = true; } var structure = renderItemStructure({ presets: presets, textContent: Optional.none(), htmlContent: useText ? spec.text.map(function (text) { return replaceText(text, matchText); }) : Optional.none(), ariaLabel: spec.text, iconContent: spec.icon, shortcutContent: Optional.none(), checkMark: Optional.none(), caret: Optional.none(), value: spec.value }, sharedBackstage.providers, renderIcons, spec.icon); return renderCommonItem({ data: buildData(spec), disabled: spec.disabled, getApi: constant({}), onAction: function (_api) { return onItemValueHandler(spec.value, spec.meta); }, onSetup: constant(noop), triggersSubmenu: false, itemBehaviours: tooltipBehaviour(spec.meta, sharedBackstage) }, structure, itemResponse, sharedBackstage.providers); }; var render = function (items, extras) { return map(items, function (item) { switch (item.type) { case 'cardcontainer': return renderContainer(item, render(item.items, extras)); case 'cardimage': return renderImage(item.src, item.classes, item.alt); case 'cardtext': var shouldHighlight = item.name.exists(function (name) { return contains(extras.cardText.highlightOn, name); }); var matchText = shouldHighlight ? Optional.from(extras.cardText.matchText).getOr('') : ''; return renderHtml(replaceText(item.text, matchText), item.classes); } }); }; var renderCardMenuItem = function (spec, itemResponse, sharedBackstage, extras) { var getApi = function (component) { return { isDisabled: function () { return Disabling.isDisabled(component); }, setDisabled: function (state) { Disabling.set(component, state); each(descendants(component.element, '*'), function (elm) { component.getSystem().getByDom(elm).each(function (comp) { if (comp.hasConfigured(Disabling)) { Disabling.set(comp, state); } }); }); } }; }; var structure = { dom: renderItemDomStructure(false, spec.label), optComponents: [Optional.some({ dom: { tag: 'div', classes: [ containerClass, containerRowClass ] }, components: render(spec.items, extras) })] }; return renderCommonItem({ data: buildData(__assign({ text: Optional.none() }, spec)), disabled: spec.disabled, getApi: getApi, onAction: spec.onAction, onSetup: spec.onSetup, triggersSubmenu: false, itemBehaviours: Optional.from(extras.itemBehaviours).getOr([]) }, structure, itemResponse, sharedBackstage.providers); }; var renderChoiceItem = function (spec, useText, presets, onItemValueHandler, isSelected, itemResponse, providersBackstage, renderIcons) { if (renderIcons === void 0) { renderIcons = true; } var getApi = function (component) { return { setActive: function (state) { Toggling.set(component, state); }, isActive: function () { return Toggling.isOn(component); }, isDisabled: function () { return Disabling.isDisabled(component); }, setDisabled: function (state) { return Disabling.set(component, state); } }; }; var structure = renderItemStructure({ presets: presets, textContent: useText ? spec.text : Optional.none(), htmlContent: Optional.none(), ariaLabel: spec.text, iconContent: spec.icon, shortcutContent: useText ? spec.shortcut : Optional.none(), checkMark: useText ? Optional.some(renderCheckmark(providersBackstage.icons)) : Optional.none(), caret: Optional.none(), value: spec.value }, providersBackstage, renderIcons); return deepMerge(renderCommonItem({ data: buildData(spec), disabled: spec.disabled, getApi: getApi, onAction: function (_api) { return onItemValueHandler(spec.value); }, onSetup: function (api) { api.setActive(isSelected); return noop; }, triggersSubmenu: false, itemBehaviours: [] }, structure, itemResponse, providersBackstage), { toggling: { toggleClass: tickedClass, toggleOnExecute: false, selected: spec.active } }); }; var parts$2 = generate$4(owner$2(), parts()); var hexColour = function (value) { return { value: value }; }; var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; var longformRegex = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i; var isHexString = function (hex) { return shorthandRegex.test(hex) || longformRegex.test(hex); }; var getLongForm = function (hex) { var hexString = hex.value.replace(shorthandRegex, function (m, r, g, b) { return r + r + g + g + b + b; }); return { value: hexString }; }; var extractValues = function (hex) { var longForm = getLongForm(hex); var splitForm = longformRegex.exec(longForm.value); return splitForm === null ? [ 'FFFFFF', 'FF', 'FF', 'FF' ] : splitForm; }; var toHex = function (component) { var hex = component.toString(16); return (hex.length === 1 ? '0' + hex : hex).toUpperCase(); }; var fromRgba = function (rgbaColour) { var value = toHex(rgbaColour.red) + toHex(rgbaColour.green) + toHex(rgbaColour.blue); return hexColour(value); }; var min = Math.min; var max = Math.max; var round = Math.round; var rgbRegex = /^rgb\((\d+),\s*(\d+),\s*(\d+)\)/; var rgbaRegex = /^rgba\((\d+),\s*(\d+),\s*(\d+),\s*(\d?(?:\.\d+)?)\)/; var rgbaColour = function (red, green, blue, alpha) { return { red: red, green: green, blue: blue, alpha: alpha }; }; var isRgbaComponent = function (value) { var num = parseInt(value, 10); return num.toString() === value && num >= 0 && num <= 255; }; var fromHsv = function (hsv) { var r; var g; var b; var hue = (hsv.hue || 0) % 360; var saturation = hsv.saturation / 100; var brightness = hsv.value / 100; saturation = max(0, min(saturation, 1)); brightness = max(0, min(brightness, 1)); if (saturation === 0) { r = g = b = round(255 * brightness); return rgbaColour(r, g, b, 1); } var side = hue / 60; var chroma = brightness * saturation; var x = chroma * (1 - Math.abs(side % 2 - 1)); var match = brightness - chroma; switch (Math.floor(side)) { case 0: r = chroma; g = x; b = 0; break; case 1: r = x; g = chroma; b = 0; break; case 2: r = 0; g = chroma; b = x; break; case 3: r = 0; g = x; b = chroma; break; case 4: r = x; g = 0; b = chroma; break; case 5: r = chroma; g = 0; b = x; break; default: r = g = b = 0; } r = round(255 * (r + match)); g = round(255 * (g + match)); b = round(255 * (b + match)); return rgbaColour(r, g, b, 1); }; var fromHex = function (hexColour) { var result = extractValues(hexColour); var red = parseInt(result[1], 16); var green = parseInt(result[2], 16); var blue = parseInt(result[3], 16); return rgbaColour(red, green, blue, 1); }; var fromStringValues = function (red, green, blue, alpha) { var r = parseInt(red, 10); var g = parseInt(green, 10); var b = parseInt(blue, 10); var a = parseFloat(alpha); return rgbaColour(r, g, b, a); }; var fromString = function (rgbaString) { if (rgbaString === 'transparent') { return Optional.some(rgbaColour(0, 0, 0, 0)); } var rgbMatch = rgbRegex.exec(rgbaString); if (rgbMatch !== null) { return Optional.some(fromStringValues(rgbMatch[1], rgbMatch[2], rgbMatch[3], '1')); } var rgbaMatch = rgbaRegex.exec(rgbaString); if (rgbaMatch !== null) { return Optional.some(fromStringValues(rgbaMatch[1], rgbaMatch[2], rgbaMatch[3], rgbaMatch[4])); } return Optional.none(); }; var toString = function (rgba) { return 'rgba(' + rgba.red + ',' + rgba.green + ',' + rgba.blue + ',' + rgba.alpha + ')'; }; var red = rgbaColour(255, 0, 0, 1); var fireSkinLoaded = function (editor) { return editor.fire('SkinLoaded'); }; var fireSkinLoadError = function (editor, error) { return editor.fire('SkinLoadError', error); }; var fireResizeEditor = function (editor) { return editor.fire('ResizeEditor'); }; var fireResizeContent = function (editor, e) { return editor.fire('ResizeContent', e); }; var fireScrollContent = function (editor, e) { return editor.fire('ScrollContent', e); }; var fireTextColorChange = function (editor, data) { return editor.fire('TextColorChange', data); }; var global$9 = tinymce.util.Tools.resolve('tinymce.util.LocalStorage'); var storageName = 'tinymce-custom-colors'; function ColorCache (max) { if (max === void 0) { max = 10; } var storageString = global$9.getItem(storageName); var localstorage = isString(storageString) ? JSON.parse(storageString) : []; var prune = function (list) { var diff = max - list.length; return diff < 0 ? list.slice(0, max) : list; }; var cache = prune(localstorage); var add = function (key) { indexOf(cache, key).each(remove); cache.unshift(key); if (cache.length > max) { cache.pop(); } global$9.setItem(storageName, JSON.stringify(cache)); }; var remove = function (idx) { cache.splice(idx, 1); }; var state = function () { return cache.slice(0); }; return { add: add, state: state }; } var choiceItem = 'choiceitem'; var defaultColors = [ { type: choiceItem, text: 'Light Green', value: '#BFEDD2' }, { type: choiceItem, text: 'Light Yellow', value: '#FBEEB8' }, { type: choiceItem, text: 'Light Red', value: '#F8CAC6' }, { type: choiceItem, text: 'Light Purple', value: '#ECCAFA' }, { type: choiceItem, text: 'Light Blue', value: '#C2E0F4' }, { type: choiceItem, text: 'Green', value: '#2DC26B' }, { type: choiceItem, text: 'Yellow', value: '#F1C40F' }, { type: choiceItem, text: 'Red', value: '#E03E2D' }, { type: choiceItem, text: 'Purple', value: '#B96AD9' }, { type: choiceItem, text: 'Blue', value: '#3598DB' }, { type: choiceItem, text: 'Dark Turquoise', value: '#169179' }, { type: choiceItem, text: 'Orange', value: '#E67E23' }, { type: choiceItem, text: 'Dark Red', value: '#BA372A' }, { type: choiceItem, text: 'Dark Purple', value: '#843FA1' }, { type: choiceItem, text: 'Dark Blue', value: '#236FA1' }, { type: choiceItem, text: 'Light Gray', value: '#ECF0F1' }, { type: choiceItem, text: 'Medium Gray', value: '#CED4D9' }, { type: choiceItem, text: 'Gray', value: '#95A5A6' }, { type: choiceItem, text: 'Dark Gray', value: '#7E8C8D' }, { type: choiceItem, text: 'Navy Blue', value: '#34495E' }, { type: choiceItem, text: 'Black', value: '#000000' }, { type: choiceItem, text: 'White', value: '#ffffff' } ]; var colorCache = ColorCache(10); var mapColors = function (colorMap) { var colors = []; var canvas = document.createElement('canvas'); canvas.height = 1; canvas.width = 1; var ctx = canvas.getContext('2d'); var byteAsHex = function (colorByte, alphaByte) { var bg = 255; var alpha = alphaByte / 255; var colorByteWithWhiteBg = Math.round(colorByte * alpha + bg * (1 - alpha)); return ('0' + colorByteWithWhiteBg.toString(16)).slice(-2).toUpperCase(); }; var asHexColor = function (color) { if (/^[0-9A-Fa-f]{6}$/.test(color)) { return '#' + color.toUpperCase(); } ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.fillStyle = '#FFFFFF'; ctx.fillStyle = color; ctx.fillRect(0, 0, 1, 1); var rgba = ctx.getImageData(0, 0, 1, 1).data; var r = rgba[0], g = rgba[1], b = rgba[2], a = rgba[3]; return '#' + byteAsHex(r, a) + byteAsHex(g, a) + byteAsHex(b, a); }; for (var i = 0; i < colorMap.length; i += 2) { colors.push({ text: colorMap[i + 1], value: asHexColor(colorMap[i]), type: 'choiceitem' }); } return colors; }; var getColorCols = function (editor, defaultCols) { return editor.getParam('color_cols', defaultCols, 'number'); }; var hasCustomColors = function (editor) { return editor.getParam('custom_colors') !== false; }; var getColorMap = function (editor) { return editor.getParam('color_map'); }; var getColors = function (editor) { var unmapped = getColorMap(editor); return unmapped !== undefined ? mapColors(unmapped) : defaultColors; }; var getCurrentColors = function () { return map(colorCache.state(), function (color) { return { type: choiceItem, text: color, value: color }; }); }; var addColor = function (color) { colorCache.add(color); }; var getCurrentColor = function (editor, format) { var color; editor.dom.getParents(editor.selection.getStart(), function (elm) { var value; if (value = elm.style[format === 'forecolor' ? 'color' : 'background-color']) { color = color ? color : value; } }); return color; }; var applyFormat = function (editor, format, value) { editor.undoManager.transact(function () { editor.focus(); editor.formatter.apply(format, { value: value }); editor.nodeChanged(); }); }; var removeFormat = function (editor, format) { editor.undoManager.transact(function () { editor.focus(); editor.formatter.remove(format, { value: null }, null, true); editor.nodeChanged(); }); }; var registerCommands = function (editor) { editor.addCommand('mceApplyTextcolor', function (format, value) { applyFormat(editor, format, value); }); editor.addCommand('mceRemoveTextcolor', function (format) { removeFormat(editor, format); }); }; var calcCols = function (colors) { return Math.max(5, Math.ceil(Math.sqrt(colors))); }; var getColorCols$1 = function (editor) { var colors = getColors(editor); var defaultCols = calcCols(colors.length); return getColorCols(editor, defaultCols); }; var getAdditionalColors = function (hasCustom) { var type = 'choiceitem'; var remove = { type: type, text: 'Remove color', icon: 'color-swatch-remove-color', value: 'remove' }; var custom = { type: type, text: 'Custom color', icon: 'color-picker', value: 'custom' }; return hasCustom ? [ remove, custom ] : [remove]; }; var applyColor = function (editor, format, value, onChoice) { if (value === 'custom') { var dialog = colorPickerDialog(editor); dialog(function (colorOpt) { colorOpt.each(function (color) { addColor(color); editor.execCommand('mceApplyTextcolor', format, color); onChoice(color); }); }, '#000000'); } else if (value === 'remove') { onChoice(''); editor.execCommand('mceRemoveTextcolor', format); } else { onChoice(value); editor.execCommand('mceApplyTextcolor', format, value); } }; var getColors$1 = function (colors, hasCustom) { return colors.concat(getCurrentColors().concat(getAdditionalColors(hasCustom))); }; var getFetch = function (colors, hasCustom) { return function (callback) { callback(getColors$1(colors, hasCustom)); }; }; var setIconColor = function (splitButtonApi, name, newColor) { var id = name === 'forecolor' ? 'tox-icon-text-color__color' : 'tox-icon-highlight-bg-color__color'; splitButtonApi.setIconFill(id, newColor); }; var registerTextColorButton = function (editor, name, format, tooltip, lastColor) { editor.ui.registry.addSplitButton(name, { tooltip: tooltip, presets: 'color', icon: name === 'forecolor' ? 'text-color' : 'highlight-bg-color', select: function (value) { var optCurrentRgb = Optional.from(getCurrentColor(editor, format)); return optCurrentRgb.bind(function (currentRgb) { return fromString(currentRgb).map(function (rgba) { var currentHex = fromRgba(rgba).value; return contains$1(value.toLowerCase(), currentHex); }); }).getOr(false); }, columns: getColorCols$1(editor), fetch: getFetch(getColors(editor), hasCustomColors(editor)), onAction: function (_splitButtonApi) { if (lastColor.get() !== null) { applyColor(editor, format, lastColor.get(), noop); } }, onItemAction: function (_splitButtonApi, value) { applyColor(editor, format, value, function (newColor) { lastColor.set(newColor); fireTextColorChange(editor, { name: name, color: newColor }); }); }, onSetup: function (splitButtonApi) { if (lastColor.get() !== null) { setIconColor(splitButtonApi, name, lastColor.get()); } var handler = function (e) { if (e.name === name) { setIconColor(splitButtonApi, e.name, e.color); } }; editor.on('TextColorChange', handler); return function () { editor.off('TextColorChange', handler); }; } }); }; var registerTextColorMenuItem = function (editor, name, format, text) { editor.ui.registry.addNestedMenuItem(name, { text: text, icon: name === 'forecolor' ? 'text-color' : 'highlight-bg-color', getSubmenuItems: function () { return [{ type: 'fancymenuitem', fancytype: 'colorswatch', onAction: function (data) { applyColor(editor, format, data.value, noop); } }]; } }); }; var colorPickerDialog = function (editor) { return function (callback, value) { var isValid = false; var onSubmit = function (api) { var data = api.getData(); var hex = data.colorpicker; if (isValid) { callback(Optional.from(hex)); api.close(); } else { editor.windowManager.alert(editor.translate([ 'Invalid hex color code: {0}', hex ])); } }; var onAction = function (_api, details) { if (details.name === 'hex-valid') { isValid = details.value; } }; var initialData = { colorpicker: value }; editor.windowManager.open({ title: 'Color Picker', size: 'normal', body: { type: 'panel', items: [{ type: 'colorpicker', name: 'colorpicker', label: 'Color' }] }, buttons: [ { type: 'cancel', name: 'cancel', text: 'Cancel' }, { type: 'submit', name: 'save', text: 'Save', primary: true } ], initialData: initialData, onAction: onAction, onSubmit: onSubmit, onClose: noop, onCancel: function () { callback(Optional.none()); } }); }; }; var register$1 = function (editor) { registerCommands(editor); var lastForeColor = Cell(null); var lastBackColor = Cell(null); registerTextColorButton(editor, 'forecolor', 'forecolor', 'Text color', lastForeColor); registerTextColorButton(editor, 'backcolor', 'hilitecolor', 'Background color', lastBackColor); registerTextColorMenuItem(editor, 'forecolor', 'forecolor', 'Text color'); registerTextColorMenuItem(editor, 'backcolor', 'hilitecolor', 'Background color'); }; var createPartialChoiceMenu = function (value, items, onItemValueHandler, columns, presets, itemResponse, select, providersBackstage) { var hasIcons = menuHasIcons(items); var presetItemTypes = presets !== 'color' ? 'normal' : 'color'; var alloyItems = createChoiceItems(items, onItemValueHandler, columns, presetItemTypes, itemResponse, select, providersBackstage); return createPartialMenuWithAlloyItems(value, hasIcons, alloyItems, columns, presets); }; var createChoiceItems = function (items, onItemValueHandler, columns, itemPresets, itemResponse, select, providersBackstage) { return cat(map(items, function (item) { if (item.type === 'choiceitem') { return createChoiceMenuItem(item).fold(handleError, function (d) { return Optional.some(renderChoiceItem(d, columns === 1, itemPresets, onItemValueHandler, select(item.value), itemResponse, providersBackstage, menuHasIcons(items))); }); } else { return Optional.none(); } })); }; var deriveMenuMovement = function (columns, presets) { var menuMarkers = markers$1(presets); if (columns === 1) { return { mode: 'menu', moveOnTab: true }; } else if (columns === 'auto') { return { mode: 'grid', selector: '.' + menuMarkers.item, initSize: { numColumns: 1, numRows: 1 } }; } else { var rowClass = presets === 'color' ? 'tox-swatches__row' : 'tox-collection__group'; return { mode: 'matrix', rowSelector: '.' + rowClass }; } }; var deriveCollectionMovement = function (columns, presets) { if (columns === 1) { return { mode: 'menu', moveOnTab: false, selector: '.tox-collection__item' }; } else if (columns === 'auto') { return { mode: 'flatgrid', selector: '.' + 'tox-collection__item', initSize: { numColumns: 1, numRows: 1 } }; } else { return { mode: 'matrix', selectors: { row: presets === 'color' ? '.tox-swatches__row' : '.tox-collection__group', cell: presets === 'color' ? '.' + colorClass : '.' + selectableClass } }; } }; var renderColorSwatchItem = function (spec, backstage) { var items = getColors$1(backstage.colorinput.getColors(), backstage.colorinput.hasCustomColors()); var columns = backstage.colorinput.getColorCols(); var presets = 'color'; var menuSpec = createPartialChoiceMenu(generate$1('menu-value'), items, function (value) { spec.onAction({ value: value }); }, columns, presets, ItemResponse$1.CLOSE_ON_EXECUTE, never, backstage.shared.providers); var widgetSpec = __assign(__assign({}, menuSpec), { markers: markers$1(presets), movement: deriveMenuMovement(columns, presets) }); return { type: 'widget', data: { value: generate$1('widget-id') }, dom: { tag: 'div', classes: ['tox-fancymenuitem'] }, autofocus: true, components: [parts$2.widget(Menu.sketch(widgetSpec))] }; }; var cellOverEvent = generate$1('cell-over'); var cellExecuteEvent = generate$1('cell-execute'); var makeCell = function (row, col, labelId) { var _a; var emitCellOver = function (c) { return emitWith(c, cellOverEvent, { row: row, col: col }); }; var emitExecute = function (c) { return emitWith(c, cellExecuteEvent, { row: row, col: col }); }; var onClick = function (c, se) { se.stop(); emitExecute(c); }; return build$1({ dom: { tag: 'div', attributes: (_a = { role: 'button' }, _a['aria-labelledby'] = labelId, _a) }, behaviours: derive$1([ config('insert-table-picker-cell', [ run(mouseover(), Focusing.focus), run(execute(), emitExecute), run(click(), onClick), run(tap(), onClick) ]), Toggling.config({ toggleClass: 'tox-insert-table-picker__selected', toggleOnExecute: false }), Focusing.config({ onFocus: emitCellOver }) ]) }); }; var makeCells = function (labelId, numRows, numCols) { var cells = []; for (var i = 0; i < numRows; i++) { var row = []; for (var j = 0; j < numCols; j++) { row.push(makeCell(i, j, labelId)); } cells.push(row); } return cells; }; var selectCells = function (cells, selectedRow, selectedColumn, numRows, numColumns) { for (var i = 0; i < numRows; i++) { for (var j = 0; j < numColumns; j++) { Toggling.set(cells[i][j], i <= selectedRow && j <= selectedColumn); } } }; var makeComponents = function (cells) { return bind(cells, function (cellRow) { return map(cellRow, premade$1); }); }; var makeLabelText = function (row, col) { return text(col + 1 + 'x' + (row + 1)); }; var renderInsertTableMenuItem = function (spec) { var numRows = 10; var numColumns = 10; var sizeLabelId = generate$1('size-label'); var cells = makeCells(sizeLabelId, numRows, numColumns); var memLabel = record({ dom: { tag: 'span', classes: ['tox-insert-table-picker__label'], attributes: { id: sizeLabelId } }, components: [text('0x0')], behaviours: derive$1([Replacing.config({})]) }); return { type: 'widget', data: { value: generate$1('widget-id') }, dom: { tag: 'div', classes: ['tox-fancymenuitem'] }, autofocus: true, components: [parts$2.widget({ dom: { tag: 'div', classes: ['tox-insert-table-picker'] }, components: makeComponents(cells).concat(memLabel.asSpec()), behaviours: derive$1([ config('insert-table-picker', [ runWithTarget(cellOverEvent, function (c, t, e) { var row = e.event.row; var col = e.event.col; selectCells(cells, row, col, numRows, numColumns); Replacing.set(memLabel.get(c), [makeLabelText(row, col)]); }), runWithTarget(cellExecuteEvent, function (c, _, e) { spec.onAction({ numRows: e.event.row + 1, numColumns: e.event.col + 1 }); emit(c, sandboxClose()); }) ]), Keying.config({ initSize: { numRows: numRows, numColumns: numColumns }, mode: 'flatgrid', selector: '[role="button"]' }) ]) })] }; }; var fancyMenuItems = { inserttable: renderInsertTableMenuItem, colorswatch: renderColorSwatchItem }; var valueOpt = function (obj, key) { return Object.prototype.hasOwnProperty.call(obj, key) ? Optional.some(obj[key]) : Optional.none(); }; var renderFancyMenuItem = function (spec, backstage) { return valueOpt(fancyMenuItems, spec.fancytype).map(function (render) { return render(spec, backstage); }); }; var renderNestedItem = function (spec, itemResponse, providersBackstage, renderIcons, downwardsCaret) { if (renderIcons === void 0) { renderIcons = true; } if (downwardsCaret === void 0) { downwardsCaret = false; } var caret = downwardsCaret ? renderDownwardsCaret(providersBackstage.icons) : renderSubmenuCaret(providersBackstage.icons); var getApi = function (component) { return { isDisabled: function () { return Disabling.isDisabled(component); }, setDisabled: function (state) { return Disabling.set(component, state); } }; }; var structure = renderItemStructure({ presets: 'normal', iconContent: spec.icon, textContent: spec.text, htmlContent: Optional.none(), ariaLabel: spec.text, caret: Optional.some(caret), checkMark: Optional.none(), shortcutContent: spec.shortcut }, providersBackstage, renderIcons); return renderCommonItem({ data: buildData(spec), getApi: getApi, disabled: spec.disabled, onAction: noop, onSetup: spec.onSetup, triggersSubmenu: true, itemBehaviours: [] }, structure, itemResponse, providersBackstage); }; var renderNormalItem = function (spec, itemResponse, providersBackstage, renderIcons) { if (renderIcons === void 0) { renderIcons = true; } var getApi = function (component) { return { isDisabled: function () { return Disabling.isDisabled(component); }, setDisabled: function (state) { return Disabling.set(component, state); } }; }; var structure = renderItemStructure({ presets: 'normal', iconContent: spec.icon, textContent: spec.text, htmlContent: Optional.none(), ariaLabel: spec.text, caret: Optional.none(), checkMark: Optional.none(), shortcutContent: spec.shortcut }, providersBackstage, renderIcons); return renderCommonItem({ data: buildData(spec), getApi: getApi, disabled: spec.disabled, onAction: spec.onAction, onSetup: spec.onSetup, triggersSubmenu: false, itemBehaviours: [] }, structure, itemResponse, providersBackstage); }; var renderSeparatorItem = function (spec) { var innerHtml = spec.text.fold(function () { return {}; }, function (text) { return { innerHtml: text }; }); return { type: 'separator', dom: __assign({ tag: 'div', classes: [ selectableClass, groupHeadingClass ] }, innerHtml), components: [] }; }; var renderToggleMenuItem = function (spec, itemResponse, providersBackstage, renderIcons) { if (renderIcons === void 0) { renderIcons = true; } var getApi = function (component) { return { setActive: function (state) { Toggling.set(component, state); }, isActive: function () { return Toggling.isOn(component); }, isDisabled: function () { return Disabling.isDisabled(component); }, setDisabled: function (state) { return Disabling.set(component, state); } }; }; var structure = renderItemStructure({ iconContent: spec.icon, textContent: spec.text, htmlContent: Optional.none(), ariaLabel: spec.text, checkMark: Optional.some(renderCheckmark(providersBackstage.icons)), caret: Optional.none(), shortcutContent: spec.shortcut, presets: 'normal', meta: spec.meta }, providersBackstage, renderIcons); return deepMerge(renderCommonItem({ data: buildData(spec), disabled: spec.disabled, getApi: getApi, onAction: spec.onAction, onSetup: spec.onSetup, triggersSubmenu: false, itemBehaviours: [] }, structure, itemResponse, providersBackstage), { toggling: { toggleClass: tickedClass, toggleOnExecute: false, selected: spec.active } }); }; var autocomplete = renderAutocompleteItem; var separator = renderSeparatorItem; var normal = renderNormalItem; var nested = renderNestedItem; var toggle$1 = renderToggleMenuItem; var fancy = renderFancyMenuItem; var card = renderCardMenuItem; var FocusMode; (function (FocusMode) { FocusMode[FocusMode['ContentFocus'] = 0] = 'ContentFocus'; FocusMode[FocusMode['UiFocus'] = 1] = 'UiFocus'; }(FocusMode || (FocusMode = {}))); var createMenuItemFromBridge = function (item, itemResponse, backstage, menuHasIcons, isHorizontalMenu) { var providersBackstage = backstage.shared.providers; var parseForHorizontalMenu = function (menuitem) { return !isHorizontalMenu ? menuitem : __assign(__assign({}, menuitem), { shortcut: Optional.none(), icon: menuitem.text.isSome() ? Optional.none() : menuitem.icon }); }; switch (item.type) { case 'menuitem': return createMenuItem(item).fold(handleError, function (d) { return Optional.some(normal(parseForHorizontalMenu(d), itemResponse, providersBackstage, menuHasIcons)); }); case 'nestedmenuitem': return createNestedMenuItem(item).fold(handleError, function (d) { return Optional.some(nested(parseForHorizontalMenu(d), itemResponse, providersBackstage, menuHasIcons, isHorizontalMenu)); }); case 'togglemenuitem': return createToggleMenuItem(item).fold(handleError, function (d) { return Optional.some(toggle$1(parseForHorizontalMenu(d), itemResponse, providersBackstage, menuHasIcons)); }); case 'separator': return createSeparatorMenuItem(item).fold(handleError, function (d) { return Optional.some(separator(d)); }); case 'fancymenuitem': return createFancyMenuItem(item).fold(handleError, function (d) { return fancy(parseForHorizontalMenu(d), backstage); }); default: { console.error('Unknown item in general menu', item); return Optional.none(); } } }; var createAutocompleteItems = function (items, matchText, onItemValueHandler, columns, itemResponse, sharedBackstage, highlightOn) { var renderText = columns === 1; var renderIcons = !renderText || menuHasIcons(items); return cat(map(items, function (item) { switch (item.type) { case 'separator': return createSeparatorItem(item).fold(handleError, function (d) { return Optional.some(separator(d)); }); case 'cardmenuitem': return createCardMenuItem(item).fold(handleError, function (d) { return Optional.some(card(__assign(__assign({}, d), { onAction: function (api) { d.onAction(api); onItemValueHandler(d.value, d.meta); } }), itemResponse, sharedBackstage, { itemBehaviours: tooltipBehaviour(d.meta, sharedBackstage), cardText: { matchText: matchText, highlightOn: highlightOn } })); }); case 'autocompleteitem': default: return createAutocompleterItem(item).fold(handleError, function (d) { return Optional.some(autocomplete(d, matchText, renderText, 'normal', onItemValueHandler, itemResponse, sharedBackstage, renderIcons)); }); } })); }; var createPartialMenu = function (value, items, itemResponse, backstage, isHorizontalMenu) { var hasIcons = menuHasIcons(items); var alloyItems = cat(map(items, function (item) { var itemHasIcon = function (i) { return isHorizontalMenu ? !i.hasOwnProperty('text') : hasIcons; }; var createItem = function (i) { return createMenuItemFromBridge(i, itemResponse, backstage, itemHasIcon(i), isHorizontalMenu); }; if (item.type === 'nestedmenuitem' && item.getSubmenuItems().length <= 0) { return createItem(__assign(__assign({}, item), { disabled: true })); } else { return createItem(item); } })); var createPartial = isHorizontalMenu ? createHorizontalPartialMenuWithAlloyItems : createPartialMenuWithAlloyItems; return createPartial(value, hasIcons, alloyItems, 1, 'normal'); }; var createTieredDataFrom = function (partialMenu) { return tieredMenu.singleData(partialMenu.value, partialMenu); }; var createMenuFrom = function (partialMenu, columns, focusMode, presets) { var focusManager = focusMode === FocusMode.ContentFocus ? highlights() : dom(); var movement = deriveMenuMovement(columns, presets); var menuMarkers = markers$1(presets); return { dom: partialMenu.dom, components: partialMenu.components, items: partialMenu.items, value: partialMenu.value, markers: { selectedItem: menuMarkers.selectedItem, item: menuMarkers.item }, movement: movement, fakeFocus: focusMode === FocusMode.ContentFocus, focusManager: focusManager, menuBehaviours: SimpleBehaviours.unnamedEvents(columns !== 'auto' ? [] : [runOnAttached(function (comp, _se) { detectSize(comp, 4, menuMarkers.item).each(function (_a) { var numColumns = _a.numColumns, numRows = _a.numRows; Keying.setGridSize(comp, numRows, numColumns); }); })]) }; }; var register$2 = function (editor, sharedBackstage) { var activeAutocompleter = Cell(Optional.none()); var processingAction = Cell(false); var autocompleter = build$1(InlineView.sketch({ dom: { tag: 'div', classes: ['tox-autocompleter'] }, components: [], fireDismissalEventInstead: {}, inlineBehaviours: derive$1([config('dismissAutocompleter', [run(dismissRequested(), function () { return cancelIfNecessary(); })])]), lazySink: sharedBackstage.getSink })); var isMenuOpen = function () { return InlineView.isOpen(autocompleter); }; var isActive = function () { return activeAutocompleter.get().isSome(); }; var hideIfNecessary = function () { if (isActive()) { InlineView.hide(autocompleter); } }; var cancelIfNecessary = function () { if (isActive()) { var lastElement = activeAutocompleter.get().map(function (ac) { return ac.element; }); detect$4(lastElement.getOr(SugarElement.fromDom(editor.selection.getNode()))).each(unwrap); hideIfNecessary(); activeAutocompleter.set(Optional.none()); processingAction.set(false); } }; var getAutocompleters = cached(function () { return register(editor); }); var getCombinedItems = function (triggerChar, matches) { var columns = findMap(matches, function (m) { return Optional.from(m.columns); }).getOr(1); return bind(matches, function (match) { var choices = match.items; return createAutocompleteItems(choices, match.matchText, function (itemValue, itemMeta) { var nr = editor.selection.getRng(); getContext(editor.dom, nr, triggerChar).fold(function () { return console.error('Lost context. Cursor probably moved'); }, function (_a) { var range = _a.range; var autocompleterApi = { hide: function () { cancelIfNecessary(); }, reload: function (fetchOptions) { hideIfNecessary(); load(fetchOptions); } }; processingAction.set(true); match.onAction(autocompleterApi, range, itemValue, itemMeta); processingAction.set(false); }); }, columns, ItemResponse$1.BUBBLE_TO_SANDBOX, sharedBackstage, match.highlightOn); }); }; var commenceIfNecessary = function (context) { if (!isActive()) { var wrapper = create$4(editor, context.range); activeAutocompleter.set(Optional.some({ triggerChar: context.triggerChar, element: wrapper, matchLength: context.text.length })); processingAction.set(false); } }; var display = function (ac, context, lookupData, items) { ac.matchLength = context.text.length; var columns = findMap(lookupData, function (ld) { return Optional.from(ld.columns); }).getOr(1); InlineView.showAt(autocompleter, { anchor: 'node', root: SugarElement.fromDom(editor.getBody()), node: Optional.from(ac.element) }, Menu.sketch(createMenuFrom(createPartialMenuWithAlloyItems('autocompleter-value', true, items, columns, 'normal'), columns, FocusMode.ContentFocus, 'normal'))); InlineView.getContent(autocompleter).each(Highlighting.highlightFirst); }; var doLookup = function (fetchOptions) { return activeAutocompleter.get().map(function (ac) { return getContext(editor.dom, editor.selection.getRng(), ac.triggerChar).bind(function (newContext) { return lookupWithContext(editor, getAutocompleters, newContext, fetchOptions); }); }).getOrThunk(function () { return lookup(editor, getAutocompleters); }); }; var load = function (fetchOptions) { doLookup(fetchOptions).fold(cancelIfNecessary, function (lookupInfo) { commenceIfNecessary(lookupInfo.context); lookupInfo.lookupData.then(function (lookupData) { activeAutocompleter.get().map(function (ac) { var context = lookupInfo.context; if (ac.triggerChar === context.triggerChar) { var combinedItems = getCombinedItems(context.triggerChar, lookupData); if (combinedItems.length > 0) { display(ac, context, lookupData, combinedItems); } else if (context.text.length - ac.matchLength >= 10) { cancelIfNecessary(); } else { hideIfNecessary(); } } }); }); }); }; var onKeypress = last$2(function (e) { if (e.which === 27) { return; } load(); }, 50); var autocompleterUiApi = { onKeypress: onKeypress, cancelIfNecessary: cancelIfNecessary, isMenuOpen: isMenuOpen, isActive: isActive, isProcessingAction: processingAction.get, getView: function () { return InlineView.getContent(autocompleter); } }; if (editor.hasPlugin('rtc') === false) { AutocompleterEditorEvents.setup(autocompleterUiApi, editor); } }; var Autocompleter = { register: register$2 }; var filter$2 = always; var bind$3 = function (element, event, handler) { return bind$2(element, event, filter$2, handler); }; var capture$1 = function (element, event, handler) { return capture(element, event, filter$2, handler); }; var fromRawEvent$1 = fromRawEvent; var closest$4 = function (scope, selector, isRoot) { return closest$3(scope, selector, isRoot).isSome(); }; var DelayedFunction = function (fun, delay) { var ref = null; var schedule = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } ref = setTimeout(function () { fun.apply(null, args); ref = null; }, delay); }; var cancel = function () { if (ref !== null) { clearTimeout(ref); ref = null; } }; return { cancel: cancel, schedule: schedule }; }; var SIGNIFICANT_MOVE = 5; var LONGPRESS_DELAY = 400; var getTouch = function (event) { var raw = event.raw; if (raw.touches === undefined || raw.touches.length !== 1) { return Optional.none(); } return Optional.some(raw.touches[0]); }; var isFarEnough = function (touch, data) { var distX = Math.abs(touch.clientX - data.x); var distY = Math.abs(touch.clientY - data.y); return distX > SIGNIFICANT_MOVE || distY > SIGNIFICANT_MOVE; }; var monitor = function (settings) { var startData = Cell(Optional.none()); var longpressFired = Cell(false); var longpress$1 = DelayedFunction(function (event) { settings.triggerEvent(longpress(), event); longpressFired.set(true); }, LONGPRESS_DELAY); var handleTouchstart = function (event) { getTouch(event).each(function (touch) { longpress$1.cancel(); var data = { x: touch.clientX, y: touch.clientY, target: event.target }; longpress$1.schedule(event); longpressFired.set(false); startData.set(Optional.some(data)); }); return Optional.none(); }; var handleTouchmove = function (event) { longpress$1.cancel(); getTouch(event).each(function (touch) { startData.get().each(function (data) { if (isFarEnough(touch, data)) { startData.set(Optional.none()); } }); }); return Optional.none(); }; var handleTouchend = function (event) { longpress$1.cancel(); var isSame = function (data) { return eq$1(data.target, event.target); }; return startData.get().filter(isSame).map(function (_data) { if (longpressFired.get()) { event.prevent(); return false; } else { return settings.triggerEvent(tap(), event); } }); }; var handlers = wrapAll$1([ { key: touchstart(), value: handleTouchstart }, { key: touchmove(), value: handleTouchmove }, { key: touchend(), value: handleTouchend } ]); var fireIfReady = function (event, type) { return get$1(handlers, type).bind(function (handler) { return handler(event); }); }; return { fireIfReady: fireIfReady }; }; var isDangerous = function (event) { var keyEv = event.raw; return keyEv.which === BACKSPACE[0] && !contains([ 'input', 'textarea' ], name(event.target)) && !closest$4(event.target, '[contenteditable="true"]'); }; var isFirefox = function () { return detect$3().browser.isFirefox(); }; var settingsSchema = objOfOnly([ strictFunction('triggerEvent'), defaulted$1('stopBackspace', true) ]); var bindFocus = function (container, handler) { if (isFirefox()) { return capture$1(container, 'focus', handler); } else { return bind$3(container, 'focusin', handler); } }; var bindBlur = function (container, handler) { if (isFirefox()) { return capture$1(container, 'blur', handler); } else { return bind$3(container, 'focusout', handler); } }; var setup$1 = function (container, rawSettings) { var settings = asRawOrDie('Getting GUI events settings', settingsSchema, rawSettings); var pointerEvents = [ 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'gesturestart', 'mousedown', 'mouseup', 'mouseover', 'mousemove', 'mouseout', 'click' ]; var tapEvent = monitor(settings); var simpleEvents = map(pointerEvents.concat([ 'selectstart', 'input', 'contextmenu', 'change', 'transitionend', 'drag', 'dragstart', 'dragend', 'dragenter', 'dragleave', 'dragover', 'drop', 'keyup' ]), function (type) { return bind$3(container, type, function (event) { tapEvent.fireIfReady(event, type).each(function (tapStopped) { if (tapStopped) { event.kill(); } }); var stopped = settings.triggerEvent(type, event); if (stopped) { event.kill(); } }); }); var pasteTimeout = Cell(Optional.none()); var onPaste = bind$3(container, 'paste', function (event) { tapEvent.fireIfReady(event, 'paste').each(function (tapStopped) { if (tapStopped) { event.kill(); } }); var stopped = settings.triggerEvent('paste', event); if (stopped) { event.kill(); } pasteTimeout.set(Optional.some(setTimeout(function () { settings.triggerEvent(postPaste(), event); }, 0))); }); var onKeydown = bind$3(container, 'keydown', function (event) { var stopped = settings.triggerEvent('keydown', event); if (stopped) { event.kill(); } else if (settings.stopBackspace === true && isDangerous(event)) { event.prevent(); } }); var onFocusIn = bindFocus(container, function (event) { var stopped = settings.triggerEvent('focusin', event); if (stopped) { event.kill(); } }); var focusoutTimeout = Cell(Optional.none()); var onFocusOut = bindBlur(container, function (event) { var stopped = settings.triggerEvent('focusout', event); if (stopped) { event.kill(); } focusoutTimeout.set(Optional.some(setTimeout(function () { settings.triggerEvent(postBlur(), event); }, 0))); }); var unbind = function () { each(simpleEvents, function (e) { e.unbind(); }); onKeydown.unbind(); onFocusIn.unbind(); onFocusOut.unbind(); onPaste.unbind(); pasteTimeout.get().each(clearTimeout); focusoutTimeout.get().each(clearTimeout); }; return { unbind: unbind }; }; var derive$2 = function (rawEvent, rawTarget) { var source = get$1(rawEvent, 'target').getOr(rawTarget); return Cell(source); }; var fromSource = function (event, source) { var stopper = Cell(false); var cutter = Cell(false); var stop = function () { stopper.set(true); }; var cut = function () { cutter.set(true); }; return { stop: stop, cut: cut, isStopped: stopper.get, isCut: cutter.get, event: event, setSource: source.set, getSource: source.get }; }; var fromExternal = function (event) { var stopper = Cell(false); var stop = function () { stopper.set(true); }; return { stop: stop, cut: noop, isStopped: stopper.get, isCut: never, event: event, setSource: die('Cannot set source of a broadcasted event'), getSource: die('Cannot get source of a broadcasted event') }; }; var adt$b = Adt.generate([ { stopped: [] }, { resume: ['element'] }, { complete: [] } ]); var doTriggerHandler = function (lookup, eventType, rawEvent, target, source, logger) { var handler = lookup(eventType, target); var simulatedEvent = fromSource(rawEvent, source); return handler.fold(function () { logger.logEventNoHandlers(eventType, target); return adt$b.complete(); }, function (handlerInfo) { var descHandler = handlerInfo.descHandler; var eventHandler = getCurried(descHandler); eventHandler(simulatedEvent); if (simulatedEvent.isStopped()) { logger.logEventStopped(eventType, handlerInfo.element, descHandler.purpose); return adt$b.stopped(); } else if (simulatedEvent.isCut()) { logger.logEventCut(eventType, handlerInfo.element, descHandler.purpose); return adt$b.complete(); } else { return parent(handlerInfo.element).fold(function () { logger.logNoParent(eventType, handlerInfo.element, descHandler.purpose); return adt$b.complete(); }, function (parent) { logger.logEventResponse(eventType, handlerInfo.element, descHandler.purpose); return adt$b.resume(parent); }); } }); }; var doTriggerOnUntilStopped = function (lookup, eventType, rawEvent, rawTarget, source, logger) { return doTriggerHandler(lookup, eventType, rawEvent, rawTarget, source, logger).fold(always, function (parent) { return doTriggerOnUntilStopped(lookup, eventType, rawEvent, parent, source, logger); }, never); }; var triggerHandler = function (lookup, eventType, rawEvent, target, logger) { var source = derive$2(rawEvent, target); return doTriggerHandler(lookup, eventType, rawEvent, target, source, logger); }; var broadcast = function (listeners, rawEvent, _logger) { var simulatedEvent = fromExternal(rawEvent); each(listeners, function (listener) { var descHandler = listener.descHandler; var handler = getCurried(descHandler); handler(simulatedEvent); }); return simulatedEvent.isStopped(); }; var triggerUntilStopped = function (lookup, eventType, rawEvent, logger) { return triggerOnUntilStopped(lookup, eventType, rawEvent, rawEvent.target, logger); }; var triggerOnUntilStopped = function (lookup, eventType, rawEvent, rawTarget, logger) { var source = derive$2(rawEvent, rawTarget); return doTriggerOnUntilStopped(lookup, eventType, rawEvent, rawTarget, source, logger); }; var eventHandler = function (element, descHandler) { return { element: element, descHandler: descHandler }; }; var broadcastHandler = function (id, handler) { return { id: id, descHandler: handler }; }; var EventRegistry = function () { var registry = {}; var registerId = function (extraArgs, id, events) { each$1(events, function (v, k) { var handlers = registry[k] !== undefined ? registry[k] : {}; handlers[id] = curryArgs(v, extraArgs); registry[k] = handlers; }); }; var findHandler = function (handlers, elem) { return read$1(elem).fold(function () { return Optional.none(); }, function (id) { return handlers.bind(function (h) { return get$1(h, id); }).map(function (descHandler) { return eventHandler(elem, descHandler); }); }); }; var filterByType = function (type) { return get$1(registry, type).map(function (handlers) { return mapToArray(handlers, function (f, id) { return broadcastHandler(id, f); }); }).getOr([]); }; var find = function (isAboveRoot, type, target) { var handlers = get$1(registry, type); return closest(target, function (elem) { return findHandler(handlers, elem); }, isAboveRoot); }; var unregisterId = function (id) { each$1(registry, function (handlersById, _eventName) { if (handlersById.hasOwnProperty(id)) { delete handlersById[id]; } }); }; return { registerId: registerId, unregisterId: unregisterId, filterByType: filterByType, find: find }; }; var Registry = function () { var events = EventRegistry(); var components = {}; var readOrTag = function (component) { var elem = component.element; return read$1(elem).fold(function () { return write('uid-', component.element); }, function (uid) { return uid; }); }; var failOnDuplicate = function (component, tagId) { var conflict = components[tagId]; if (conflict === component) { unregister(component); } else { throw new Error('The tagId "' + tagId + '" is already used by: ' + element(conflict.element) + '\nCannot use it for: ' + element(component.element) + '\n' + 'The conflicting element is' + (inBody(conflict.element) ? ' ' : ' not ') + 'already in the DOM'); } }; var register = function (component) { var tagId = readOrTag(component); if (hasNonNullableKey(components, tagId)) { failOnDuplicate(component, tagId); } var extraArgs = [component]; events.registerId(extraArgs, tagId, component.events); components[tagId] = component; }; var unregister = function (component) { read$1(component.element).each(function (tagId) { delete components[tagId]; events.unregisterId(tagId); }); }; var filter = function (type) { return events.filterByType(type); }; var find = function (isAboveRoot, type, target) { return events.find(isAboveRoot, type, target); }; var getById = function (id) { return get$1(components, id); }; return { find: find, filter: filter, register: register, unregister: unregister, getById: getById }; }; var factory$3 = function (detail) { var _a = detail.dom, attributes = _a.attributes, domWithoutAttributes = __rest(_a, ['attributes']); return { uid: detail.uid, dom: __assign({ tag: 'div', attributes: __assign({ role: 'presentation' }, attributes) }, domWithoutAttributes), components: detail.components, behaviours: get$d(detail.containerBehaviours), events: detail.events, domModification: detail.domModification, eventOrder: detail.eventOrder }; }; var Container = single$2({ name: 'Container', factory: factory$3, configFields: [ defaulted$1('components', []), field$1('containerBehaviours', []), defaulted$1('events', {}), defaulted$1('domModification', {}), defaulted$1('eventOrder', {}) ] }); var takeover = function (root) { var isAboveRoot = function (el) { return parent(root.element).fold(always, function (parent) { return eq$1(el, parent); }); }; var registry = Registry(); var lookup = function (eventName, target) { return registry.find(isAboveRoot, eventName, target); }; var domEvents = setup$1(root.element, { triggerEvent: function (eventName, event) { return monitorEvent(eventName, event.target, function (logger) { return triggerUntilStopped(lookup, eventName, event, logger); }); } }); var systemApi = { debugInfo: constant('real'), triggerEvent: function (eventName, target, data) { monitorEvent(eventName, target, function (logger) { return triggerOnUntilStopped(lookup, eventName, data, target, logger); }); }, triggerFocus: function (target, originator) { read$1(target).fold(function () { focus$1(target); }, function (_alloyId) { monitorEvent(focus(), target, function (logger) { triggerHandler(lookup, focus(), { originator: originator, kill: noop, prevent: noop, target: target }, target, logger); return false; }); }); }, triggerEscape: function (comp, simulatedEvent) { systemApi.triggerEvent('keydown', comp.element, simulatedEvent.event); }, getByUid: function (uid) { return getByUid(uid); }, getByDom: function (elem) { return getByDom(elem); }, build: build$1, addToGui: function (c) { add(c); }, removeFromGui: function (c) { remove$1(c); }, addToWorld: function (c) { addToWorld(c); }, removeFromWorld: function (c) { removeFromWorld(c); }, broadcast: function (message) { broadcast$1(message); }, broadcastOn: function (channels, message) { broadcastOn(channels, message); }, broadcastEvent: function (eventName, event) { broadcastEvent(eventName, event); }, isConnected: always }; var addToWorld = function (component) { component.connect(systemApi); if (!isText(component.element)) { registry.register(component); each(component.components(), addToWorld); systemApi.triggerEvent(systemInit(), component.element, { target: component.element }); } }; var removeFromWorld = function (component) { if (!isText(component.element)) { each(component.components(), removeFromWorld); registry.unregister(component); } component.disconnect(); }; var add = function (component) { attach$1(root, component); }; var remove$1 = function (component) { detach(component); }; var destroy = function () { domEvents.unbind(); remove(root.element); }; var broadcastData = function (data) { var receivers = registry.filter(receive()); each(receivers, function (receiver) { var descHandler = receiver.descHandler; var handler = getCurried(descHandler); handler(data); }); }; var broadcast$1 = function (message) { broadcastData({ universal: true, data: message }); }; var broadcastOn = function (channels, message) { broadcastData({ universal: false, channels: channels, data: message }); }; var broadcastEvent = function (eventName, event) { var listeners = registry.filter(eventName); return broadcast(listeners, event); }; var getByUid = function (uid) { return registry.getById(uid).fold(function () { return Result.error(new Error('Could not find component with uid: "' + uid + '" in system.')); }, Result.value); }; var getByDom = function (elem) { var uid = read$1(elem).getOr('not found'); return getByUid(uid); }; addToWorld(root); return { root: root, element: root.element, destroy: destroy, add: add, remove: remove$1, getByUid: getByUid, getByDom: getByDom, addToWorld: addToWorld, removeFromWorld: removeFromWorld, broadcast: broadcast$1, broadcastOn: broadcastOn, broadcastEvent: broadcastEvent }; }; var renderBar = function (spec, backstage) { return { dom: { tag: 'div', classes: [ 'tox-bar', 'tox-form__controls-h-stack' ] }, components: map(spec.items, backstage.interpreter) }; }; var schema$e = constant([ defaulted$1('prefix', 'form-field'), field$1('fieldBehaviours', [ Composing, Representing ]) ]); var parts$3 = constant([ optional({ schema: [strict$1('dom')], name: 'label' }), optional({ factory: { sketch: function (spec) { return { uid: spec.uid, dom: { tag: 'span', styles: { display: 'none' }, attributes: { 'aria-hidden': 'true' }, innerHtml: spec.text } }; } }, schema: [strict$1('text')], name: 'aria-descriptor' }), required({ factory: { sketch: function (spec) { var excludeFactory = exclude$1(spec, ['factory']); return spec.factory.sketch(excludeFactory); } }, schema: [strict$1('factory')], name: 'field' }) ]); var factory$4 = function (detail, components, _spec, _externals) { var behaviours = augment(detail.fieldBehaviours, [ Composing.config({ find: function (container) { return getPart(container, detail, 'field'); } }), Representing.config({ store: { mode: 'manual', getValue: function (field) { return Composing.getCurrent(field).bind(Representing.getValue); }, setValue: function (field, value) { Composing.getCurrent(field).each(function (current) { Representing.setValue(current, value); }); } } }) ]); var events = derive([runOnAttached(function (component, _simulatedEvent) { var ps = getParts(component, detail, [ 'label', 'field', 'aria-descriptor' ]); ps.field().each(function (field) { var id = generate$1(detail.prefix); ps.label().each(function (label) { set$1(label.element, 'for', id); set$1(field.element, 'id', id); }); ps['aria-descriptor']().each(function (descriptor) { var descriptorId = generate$1(detail.prefix); set$1(descriptor.element, 'id', descriptorId); set$1(field.element, 'aria-describedby', descriptorId); }); }); })]); var apis = { getField: function (container) { return getPart(container, detail, 'field'); }, getLabel: function (container) { return getPart(container, detail, 'label'); } }; return { uid: detail.uid, dom: detail.dom, components: components, behaviours: behaviours, events: events, apis: apis }; }; var FormField = composite$1({ name: 'FormField', configFields: schema$e(), partFields: parts$3(), factory: factory$4, apis: { getField: function (apis, comp) { return apis.getField(comp); }, getLabel: function (apis, comp) { return apis.getLabel(comp); } } }); var exhibit$4 = function (base, tabConfig) { return nu$6({ attributes: wrapAll$1([{ key: tabConfig.tabAttr, value: 'true' }]) }); }; var ActiveTabstopping = /*#__PURE__*/Object.freeze({ __proto__: null, exhibit: exhibit$4 }); var TabstopSchema = [defaulted$1('tabAttr', 'data-alloy-tabstop')]; var Tabstopping = create$1({ fields: TabstopSchema, name: 'tabstopping', active: ActiveTabstopping }); var global$a = tinymce.util.Tools.resolve('tinymce.html.Entities'); var renderFormFieldWith = function (pLabel, pField, extraClasses, extraBehaviours) { var spec = renderFormFieldSpecWith(pLabel, pField, extraClasses, extraBehaviours); return FormField.sketch(spec); }; var renderFormField = function (pLabel, pField) { return renderFormFieldWith(pLabel, pField, [], []); }; var renderFormFieldSpecWith = function (pLabel, pField, extraClasses, extraBehaviours) { return { dom: renderFormFieldDomWith(extraClasses), components: pLabel.toArray().concat([pField]), fieldBehaviours: derive$1(extraBehaviours) }; }; var renderFormFieldDom = function () { return renderFormFieldDomWith([]); }; var renderFormFieldDomWith = function (extraClasses) { return { tag: 'div', classes: ['tox-form__group'].concat(extraClasses) }; }; var renderLabel = function (label, providersBackstage) { return FormField.parts.label({ dom: { tag: 'label', classes: ['tox-label'], innerHtml: providersBackstage.translate(label) } }); }; var formChangeEvent = generate$1('form-component-change'); var formCloseEvent = generate$1('form-close'); var formCancelEvent = generate$1('form-cancel'); var formActionEvent = generate$1('form-action'); var formSubmitEvent = generate$1('form-submit'); var formBlockEvent = generate$1('form-block'); var formUnblockEvent = generate$1('form-unblock'); var formTabChangeEvent = generate$1('form-tabchange'); var formResizeEvent = generate$1('form-resize'); var renderCollection = function (spec, providersBackstage) { var _a; var pLabel = spec.label.map(function (label) { return renderLabel(label, providersBackstage); }); var runOnItem = function (f) { return function (comp, se) { closest$3(se.event.target, '[data-collection-item-value]').each(function (target) { f(comp, se, target, get$3(target, 'data-collection-item-value')); }); }; }; var setContents = function (comp, items) { var htmlLines = map(items, function (item) { var itemText = global$6.translate(item.text); var textContent = spec.columns === 1 ? '
    ' + itemText + '
    ' : ''; var iconContent = '
    ' + item.icon + '
    '; var mapItemName = { '_': ' ', ' - ': ' ', '-': ' ' }; var ariaLabel = itemText.replace(/\_| \- |\-/g, function (match) { return mapItemName[match]; }); var disabledClass = providersBackstage.isDisabled() ? ' tox-collection__item--state-disabled' : ''; return '
    ' + iconContent + textContent + '
    '; }); var chunks = spec.columns !== 'auto' && spec.columns > 1 ? chunk(htmlLines, spec.columns) : [htmlLines]; var html = map(chunks, function (ch) { return '
    ' + ch.join('') + '
    '; }); set(comp.element, html.join('')); }; var onClick = runOnItem(function (comp, se, tgt, itemValue) { se.stop(); if (!providersBackstage.isDisabled()) { emitWith(comp, formActionEvent, { name: spec.name, value: itemValue }); } }); var collectionEvents = [ run(mouseover(), runOnItem(function (comp, se, tgt) { focus$1(tgt); })), run(click(), onClick), run(tap(), onClick), run(focusin(), runOnItem(function (comp, se, tgt) { descendant$1(comp.element, '.' + activeClass).each(function (currentActive) { remove$4(currentActive, activeClass); }); add$2(tgt, activeClass); })), run(focusout(), runOnItem(function (comp) { descendant$1(comp.element, '.' + activeClass).each(function (currentActive) { remove$4(currentActive, activeClass); }); })), runOnExecute(runOnItem(function (comp, se, tgt, itemValue) { emitWith(comp, formActionEvent, { name: spec.name, value: itemValue }); })) ]; var iterCollectionItems = function (comp, applyAttributes) { return map(descendants(comp.element, '.tox-collection__item'), applyAttributes); }; var pField = FormField.parts.field({ dom: { tag: 'div', classes: ['tox-collection'].concat(spec.columns !== 1 ? ['tox-collection--grid'] : ['tox-collection--list']) }, components: [], factory: { sketch: identity }, behaviours: derive$1([ Disabling.config({ disabled: providersBackstage.isDisabled, onDisabled: function (comp) { iterCollectionItems(comp, function (childElm) { add$2(childElm, 'tox-collection__item--state-disabled'); set$1(childElm, 'aria-disabled', true); }); }, onEnabled: function (comp) { iterCollectionItems(comp, function (childElm) { remove$4(childElm, 'tox-collection__item--state-disabled'); remove$1(childElm, 'aria-disabled'); }); } }), receivingConfig(), Replacing.config({}), Representing.config({ store: { mode: 'memory', initialValue: [] }, onSetValue: function (comp, items) { setContents(comp, items); if (spec.columns === 'auto') { detectSize(comp, 5, 'tox-collection__item').each(function (_a) { var numRows = _a.numRows, numColumns = _a.numColumns; Keying.setGridSize(comp, numRows, numColumns); }); } emit(comp, formResizeEvent); } }), Tabstopping.config({}), Keying.config(deriveCollectionMovement(spec.columns, 'normal')), config('collection-events', collectionEvents) ]), eventOrder: (_a = {}, _a[execute()] = [ 'disabling', 'alloy.base.behaviour', 'collection-events' ], _a) }); var extraClasses = ['tox-form__group--collection']; return renderFormFieldWith(pLabel, pField, extraClasses, []); }; var schema$f = constant([ option('data'), defaulted$1('inputAttributes', {}), defaulted$1('inputStyles', {}), defaulted$1('tag', 'input'), defaulted$1('inputClasses', []), onHandler('onSetValue'), defaulted$1('styles', {}), defaulted$1('eventOrder', {}), field$1('inputBehaviours', [ Representing, Focusing ]), defaulted$1('selectOnFocus', true) ]); var focusBehaviours = function (detail) { return derive$1([Focusing.config({ onFocus: !detail.selectOnFocus ? noop : function (component) { var input = component.element; var value = get$6(input); input.dom.setSelectionRange(0, value.length); } })]); }; var behaviours = function (detail) { return __assign(__assign({}, focusBehaviours(detail)), augment(detail.inputBehaviours, [Representing.config({ store: __assign(__assign({ mode: 'manual' }, detail.data.map(function (data) { return { initialValue: data }; }).getOr({})), { getValue: function (input) { return get$6(input.element); }, setValue: function (input, data) { var current = get$6(input.element); if (current !== data) { set$3(input.element, data); } } }), onSetValue: detail.onSetValue })])); }; var dom$2 = function (detail) { return { tag: detail.tag, attributes: __assign({ type: 'text' }, detail.inputAttributes), styles: detail.inputStyles, classes: detail.inputClasses }; }; var factory$5 = function (detail, _spec) { return { uid: detail.uid, dom: dom$2(detail), components: [], behaviours: behaviours(detail), eventOrder: detail.eventOrder }; }; var Input = single$2({ name: 'Input', configFields: schema$f(), factory: factory$5 }); var exports$1 = {}, module = { exports: exports$1 }; (function (define, exports, module, require) { (function (f) { if (typeof exports === 'object' && typeof module !== 'undefined') { module.exports = f(); } else if (typeof define === 'function' && define.amd) { define([], f); } else { var g; if (typeof window !== 'undefined') { g = window; } else if (typeof global !== 'undefined') { g = global; } else if (typeof self !== 'undefined') { g = self; } else { g = this; } g.EphoxContactWrapper = f(); } }(function () { return function () { function r(e, n, t) { function o(i, f) { if (!n[i]) { if (!e[i]) { var c = 'function' == typeof require && require; if (!f && c) return c(i, !0); if (u) return u(i, !0); var a = new Error('Cannot find module \'' + i + '\''); throw a.code = 'MODULE_NOT_FOUND', a; } var p = n[i] = { exports: {} }; e[i][0].call(p.exports, function (r) { var n = e[i][1][r]; return o(n || r); }, p, p.exports, r, e, n, t); } return n[i].exports; } for (var u = 'function' == typeof require && require, i = 0; i < t.length; i++) o(t[i]); return o; } return r; }()({ 1: [ function (require, module, exports) { var process = module.exports = {}; var cachedSetTimeout; var cachedClearTimeout; function defaultSetTimout() { throw new Error('setTimeout has not been defined'); } function defaultClearTimeout() { throw new Error('clearTimeout has not been defined'); } (function () { try { if (typeof setTimeout === 'function') { cachedSetTimeout = setTimeout; } else { cachedSetTimeout = defaultSetTimout; } } catch (e) { cachedSetTimeout = defaultSetTimout; } try { if (typeof clearTimeout === 'function') { cachedClearTimeout = clearTimeout; } else { cachedClearTimeout = defaultClearTimeout; } } catch (e) { cachedClearTimeout = defaultClearTimeout; } }()); function runTimeout(fun) { if (cachedSetTimeout === setTimeout) { return setTimeout(fun, 0); } if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { cachedSetTimeout = setTimeout; return setTimeout(fun, 0); } try { return cachedSetTimeout(fun, 0); } catch (e) { try { return cachedSetTimeout.call(null, fun, 0); } catch (e) { return cachedSetTimeout.call(this, fun, 0); } } } function runClearTimeout(marker) { if (cachedClearTimeout === clearTimeout) { return clearTimeout(marker); } if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { cachedClearTimeout = clearTimeout; return clearTimeout(marker); } try { return cachedClearTimeout(marker); } catch (e) { try { return cachedClearTimeout.call(null, marker); } catch (e) { return cachedClearTimeout.call(this, marker); } } } var queue = []; var draining = false; var currentQueue; var queueIndex = -1; function cleanUpNextTick() { if (!draining || !currentQueue) { return; } draining = false; if (currentQueue.length) { queue = currentQueue.concat(queue); } else { queueIndex = -1; } if (queue.length) { drainQueue(); } } function drainQueue() { if (draining) { return; } var timeout = runTimeout(cleanUpNextTick); draining = true; var len = queue.length; while (len) { currentQueue = queue; queue = []; while (++queueIndex < len) { if (currentQueue) { currentQueue[queueIndex].run(); } } queueIndex = -1; len = queue.length; } currentQueue = null; draining = false; runClearTimeout(timeout); } process.nextTick = function (fun) { var args = new Array(arguments.length - 1); if (arguments.length > 1) { for (var i = 1; i < arguments.length; i++) { args[i - 1] = arguments[i]; } } queue.push(new Item(fun, args)); if (queue.length === 1 && !draining) { runTimeout(drainQueue); } }; function Item(fun, array) { this.fun = fun; this.array = array; } Item.prototype.run = function () { this.fun.apply(null, this.array); }; process.title = 'browser'; process.browser = true; process.env = {}; process.argv = []; process.version = ''; process.versions = {}; function noop() { } process.on = noop; process.addListener = noop; process.once = noop; process.off = noop; process.removeListener = noop; process.removeAllListeners = noop; process.emit = noop; process.prependListener = noop; process.prependOnceListener = noop; process.listeners = function (name) { return []; }; process.binding = function (name) { throw new Error('process.binding is not supported'); }; process.cwd = function () { return '/'; }; process.chdir = function (dir) { throw new Error('process.chdir is not supported'); }; process.umask = function () { return 0; }; }, {} ], 2: [ function (require, module, exports) { (function (setImmediate) { (function (root) { var setTimeoutFunc = setTimeout; function noop() { } function bind(fn, thisArg) { return function () { fn.apply(thisArg, arguments); }; } function Promise(fn) { if (typeof this !== 'object') throw new TypeError('Promises must be constructed via new'); if (typeof fn !== 'function') throw new TypeError('not a function'); this._state = 0; this._handled = false; this._value = undefined; this._deferreds = []; doResolve(fn, this); } function handle(self, deferred) { while (self._state === 3) { self = self._value; } if (self._state === 0) { self._deferreds.push(deferred); return; } self._handled = true; Promise._immediateFn(function () { var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected; if (cb === null) { (self._state === 1 ? resolve : reject)(deferred.promise, self._value); return; } var ret; try { ret = cb(self._value); } catch (e) { reject(deferred.promise, e); return; } resolve(deferred.promise, ret); }); } function resolve(self, newValue) { try { if (newValue === self) throw new TypeError('A promise cannot be resolved with itself.'); if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) { var then = newValue.then; if (newValue instanceof Promise) { self._state = 3; self._value = newValue; finale(self); return; } else if (typeof then === 'function') { doResolve(bind(then, newValue), self); return; } } self._state = 1; self._value = newValue; finale(self); } catch (e) { reject(self, e); } } function reject(self, newValue) { self._state = 2; self._value = newValue; finale(self); } function finale(self) { if (self._state === 2 && self._deferreds.length === 0) { Promise._immediateFn(function () { if (!self._handled) { Promise._unhandledRejectionFn(self._value); } }); } for (var i = 0, len = self._deferreds.length; i < len; i++) { handle(self, self._deferreds[i]); } self._deferreds = null; } function Handler(onFulfilled, onRejected, promise) { this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; this.onRejected = typeof onRejected === 'function' ? onRejected : null; this.promise = promise; } function doResolve(fn, self) { var done = false; try { fn(function (value) { if (done) return; done = true; resolve(self, value); }, function (reason) { if (done) return; done = true; reject(self, reason); }); } catch (ex) { if (done) return; done = true; reject(self, ex); } } Promise.prototype['catch'] = function (onRejected) { return this.then(null, onRejected); }; Promise.prototype.then = function (onFulfilled, onRejected) { var prom = new this.constructor(noop); handle(this, new Handler(onFulfilled, onRejected, prom)); return prom; }; Promise.all = function (arr) { var args = Array.prototype.slice.call(arr); return new Promise(function (resolve, reject) { if (args.length === 0) return resolve([]); var remaining = args.length; function res(i, val) { try { if (val && (typeof val === 'object' || typeof val === 'function')) { var then = val.then; if (typeof then === 'function') { then.call(val, function (val) { res(i, val); }, reject); return; } } args[i] = val; if (--remaining === 0) { resolve(args); } } catch (ex) { reject(ex); } } for (var i = 0; i < args.length; i++) { res(i, args[i]); } }); }; Promise.resolve = function (value) { if (value && typeof value === 'object' && value.constructor === Promise) { return value; } return new Promise(function (resolve) { resolve(value); }); }; Promise.reject = function (value) { return new Promise(function (resolve, reject) { reject(value); }); }; Promise.race = function (values) { return new Promise(function (resolve, reject) { for (var i = 0, len = values.length; i < len; i++) { values[i].then(resolve, reject); } }); }; Promise._immediateFn = typeof setImmediate === 'function' ? function (fn) { setImmediate(fn); } : function (fn) { setTimeoutFunc(fn, 0); }; Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) { if (typeof console !== 'undefined' && console) { console.warn('Possible Unhandled Promise Rejection:', err); } }; Promise._setImmediateFn = function _setImmediateFn(fn) { Promise._immediateFn = fn; }; Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) { Promise._unhandledRejectionFn = fn; }; if (typeof module !== 'undefined' && module.exports) { module.exports = Promise; } else if (!root.Promise) { root.Promise = Promise; } }(this)); }.call(this, require('timers').setImmediate)); }, { 'timers': 3 } ], 3: [ function (require, module, exports) { (function (setImmediate, clearImmediate) { var nextTick = require('process/browser.js').nextTick; var apply = Function.prototype.apply; var slice = Array.prototype.slice; var immediateIds = {}; var nextImmediateId = 0; exports.setTimeout = function () { return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout); }; exports.setInterval = function () { return new Timeout(apply.call(setInterval, window, arguments), clearInterval); }; exports.clearTimeout = exports.clearInterval = function (timeout) { timeout.close(); }; function Timeout(id, clearFn) { this._id = id; this._clearFn = clearFn; } Timeout.prototype.unref = Timeout.prototype.ref = function () { }; Timeout.prototype.close = function () { this._clearFn.call(window, this._id); }; exports.enroll = function (item, msecs) { clearTimeout(item._idleTimeoutId); item._idleTimeout = msecs; }; exports.unenroll = function (item) { clearTimeout(item._idleTimeoutId); item._idleTimeout = -1; }; exports._unrefActive = exports.active = function (item) { clearTimeout(item._idleTimeoutId); var msecs = item._idleTimeout; if (msecs >= 0) { item._idleTimeoutId = setTimeout(function onTimeout() { if (item._onTimeout) item._onTimeout(); }, msecs); } }; exports.setImmediate = typeof setImmediate === 'function' ? setImmediate : function (fn) { var id = nextImmediateId++; var args = arguments.length < 2 ? false : slice.call(arguments, 1); immediateIds[id] = true; nextTick(function onNextTick() { if (immediateIds[id]) { if (args) { fn.apply(null, args); } else { fn.call(null); } exports.clearImmediate(id); } }); return id; }; exports.clearImmediate = typeof clearImmediate === 'function' ? clearImmediate : function (id) { delete immediateIds[id]; }; }.call(this, require('timers').setImmediate, require('timers').clearImmediate)); }, { 'process/browser.js': 1, 'timers': 3 } ], 4: [ function (require, module, exports) { var promisePolyfill = require('promise-polyfill'); var Global = function () { if (typeof window !== 'undefined') { return window; } else { return Function('return this;')(); } }(); module.exports = { boltExport: Global.Promise || promisePolyfill }; }, { 'promise-polyfill': 2 } ] }, {}, [4])(4); })); }(undefined, exports$1, module, undefined)); var Promise = module.exports.boltExport; var nu$a = function (baseFn) { var data = Optional.none(); var callbacks = []; var map = function (f) { return nu$a(function (nCallback) { get(function (data) { nCallback(f(data)); }); }); }; var get = function (nCallback) { if (isReady()) { call(nCallback); } else { callbacks.push(nCallback); } }; var set = function (x) { if (!isReady()) { data = Optional.some(x); run(callbacks); callbacks = []; } }; var isReady = function () { return data.isSome(); }; var run = function (cbs) { each(cbs, call); }; var call = function (cb) { data.each(function (x) { setTimeout(function () { cb(x); }, 0); }); }; baseFn(set); return { get: get, map: map, isReady: isReady }; }; var pure = function (a) { return nu$a(function (callback) { callback(a); }); }; var LazyValue = { nu: nu$a, pure: pure }; var errorReporter = function (err) { setTimeout(function () { throw err; }, 0); }; var make$3 = function (run) { var get = function (callback) { run().then(callback, errorReporter); }; var map = function (fab) { return make$3(function () { return run().then(fab); }); }; var bind = function (aFutureB) { return make$3(function () { return run().then(function (v) { return aFutureB(v).toPromise(); }); }); }; var anonBind = function (futureB) { return make$3(function () { return run().then(function () { return futureB.toPromise(); }); }); }; var toLazy = function () { return LazyValue.nu(get); }; var toCached = function () { var cache = null; return make$3(function () { if (cache === null) { cache = run(); } return cache; }); }; var toPromise = run; return { map: map, bind: bind, anonBind: anonBind, toLazy: toLazy, toCached: toCached, toPromise: toPromise, get: get }; }; var nu$b = function (baseFn) { return make$3(function () { return new Promise(baseFn); }); }; var pure$1 = function (a) { return make$3(function () { return Promise.resolve(a); }); }; var Future = { nu: nu$b, pure: pure$1 }; var ariaElements = [ 'input', 'textarea' ]; var isAriaElement = function (elem) { var name$1 = name(elem); return contains(ariaElements, name$1); }; var markValid = function (component, invalidConfig) { var elem = invalidConfig.getRoot(component).getOr(component.element); remove$4(elem, invalidConfig.invalidClass); invalidConfig.notify.each(function (notifyInfo) { if (isAriaElement(component.element)) { set$1(component.element, 'aria-invalid', false); } notifyInfo.getContainer(component).each(function (container) { set(container, notifyInfo.validHtml); }); notifyInfo.onValid(component); }); }; var markInvalid = function (component, invalidConfig, invalidState, text) { var elem = invalidConfig.getRoot(component).getOr(component.element); add$2(elem, invalidConfig.invalidClass); invalidConfig.notify.each(function (notifyInfo) { if (isAriaElement(component.element)) { set$1(component.element, 'aria-invalid', true); } notifyInfo.getContainer(component).each(function (container) { set(container, text); }); notifyInfo.onInvalid(component, text); }); }; var query = function (component, invalidConfig, _invalidState) { return invalidConfig.validator.fold(function () { return Future.pure(Result.value(true)); }, function (validatorInfo) { return validatorInfo.validate(component); }); }; var run$1 = function (component, invalidConfig, invalidState) { invalidConfig.notify.each(function (notifyInfo) { notifyInfo.onValidate(component); }); return query(component, invalidConfig).map(function (valid) { if (component.getSystem().isConnected()) { return valid.fold(function (err) { markInvalid(component, invalidConfig, invalidState, err); return Result.error(err); }, function (v) { markValid(component, invalidConfig); return Result.value(v); }); } else { return Result.error('No longer in system'); } }); }; var isInvalid = function (component, invalidConfig) { var elem = invalidConfig.getRoot(component).getOr(component.element); return has$2(elem, invalidConfig.invalidClass); }; var InvalidateApis = /*#__PURE__*/Object.freeze({ __proto__: null, markValid: markValid, markInvalid: markInvalid, query: query, run: run$1, isInvalid: isInvalid }); var events$a = function (invalidConfig, invalidState) { return invalidConfig.validator.map(function (validatorInfo) { return derive([run(validatorInfo.onEvent, function (component) { run$1(component, invalidConfig, invalidState).get(identity); })].concat(validatorInfo.validateOnLoad ? [runOnAttached(function (component) { run$1(component, invalidConfig, invalidState).get(noop); })] : [])); }).getOr({}); }; var ActiveInvalidate = /*#__PURE__*/Object.freeze({ __proto__: null, events: events$a }); var InvalidateSchema = [ strict$1('invalidClass'), defaulted$1('getRoot', Optional.none), optionObjOf('notify', [ defaulted$1('aria', 'alert'), defaulted$1('getContainer', Optional.none), defaulted$1('validHtml', ''), onHandler('onValid'), onHandler('onInvalid'), onHandler('onValidate') ]), optionObjOf('validator', [ strict$1('validate'), defaulted$1('onEvent', 'input'), defaulted$1('validateOnLoad', true) ]) ]; var Invalidating = create$1({ fields: InvalidateSchema, name: 'invalidating', active: ActiveInvalidate, apis: InvalidateApis, extra: { validation: function (validator) { return function (component) { var v = Representing.getValue(component); return Future.pure(validator(v)); }; } } }); var getCoupled = function (component, coupleConfig, coupleState, name) { return coupleState.getOrCreate(component, coupleConfig, name); }; var CouplingApis = /*#__PURE__*/Object.freeze({ __proto__: null, getCoupled: getCoupled }); var CouplingSchema = [strictOf('others', setOf$1(Result.value, anyValue$1()))]; var init$5 = function () { var coupled = {}; var getOrCreate = function (component, coupleConfig, name) { var available = keys(coupleConfig.others); if (!available) { throw new Error('Cannot find coupled component: ' + name + '. Known coupled components: ' + JSON.stringify(available, null, 2)); } else { return get$1(coupled, name).getOrThunk(function () { var builder = get$1(coupleConfig.others, name).getOrDie('No information found for coupled component: ' + name); var spec = builder(component); var built = component.getSystem().build(spec); coupled[name] = built; return built; }); } }; var readState = constant({}); return nu$5({ readState: readState, getOrCreate: getOrCreate }); }; var CouplingState = /*#__PURE__*/Object.freeze({ __proto__: null, init: init$5 }); var Coupling = create$1({ fields: CouplingSchema, name: 'coupling', apis: CouplingApis, state: CouplingState }); var suffix = constant('sink'); var partType = constant(optional({ name: suffix(), overrides: constant({ dom: { tag: 'div' }, behaviours: derive$1([Positioning.config({ useFixed: always })]), events: derive([ cutter(keydown()), cutter(mousedown()), cutter(click()) ]) }) })); var HighlightOnOpen; (function (HighlightOnOpen) { HighlightOnOpen[HighlightOnOpen['HighlightFirst'] = 0] = 'HighlightFirst'; HighlightOnOpen[HighlightOnOpen['HighlightNone'] = 1] = 'HighlightNone'; }(HighlightOnOpen || (HighlightOnOpen = {}))); var getAnchor = function (detail, component) { var hotspot = detail.getHotspot(component).getOr(component); var anchor = 'hotspot'; var overrides = detail.getAnchorOverrides(); return detail.layouts.fold(function () { return { anchor: anchor, hotspot: hotspot, overrides: overrides }; }, function (layouts) { return { anchor: anchor, hotspot: hotspot, overrides: overrides, layouts: layouts }; }); }; var fetch = function (detail, mapFetch, component) { var fetcher = detail.fetch; return fetcher(component).map(mapFetch); }; var openF = function (detail, mapFetch, anchor, component, sandbox, externals, highlightOnOpen) { var futureData = fetch(detail, mapFetch, component); var getLazySink = getSink(component, detail); return futureData.map(function (tdata) { return tdata.bind(function (data) { return Optional.from(tieredMenu.sketch(__assign(__assign({}, externals.menu()), { uid: generate$2(''), data: data, highlightImmediately: highlightOnOpen === HighlightOnOpen.HighlightFirst, onOpenMenu: function (tmenu, menu) { var sink = getLazySink().getOrDie(); Positioning.position(sink, anchor, menu); Sandboxing.decloak(sandbox); }, onOpenSubmenu: function (tmenu, item, submenu) { var sink = getLazySink().getOrDie(); Positioning.position(sink, { anchor: 'submenu', item: item }, submenu); Sandboxing.decloak(sandbox); }, onRepositionMenu: function (tmenu, primaryMenu, submenuTriggers) { var sink = getLazySink().getOrDie(); Positioning.position(sink, anchor, primaryMenu); each(submenuTriggers, function (st) { Positioning.position(sink, { anchor: 'submenu', item: st.triggeringItem }, st.triggeredMenu); }); }, onEscape: function () { Focusing.focus(component); Sandboxing.close(sandbox); return Optional.some(true); } }))); }); }); }; var open$1 = function (detail, mapFetch, hotspot, sandbox, externals, onOpenSync, highlightOnOpen) { var anchor = getAnchor(detail, hotspot); var processed = openF(detail, mapFetch, anchor, hotspot, sandbox, externals, highlightOnOpen); return processed.map(function (tdata) { tdata.fold(function () { if (Sandboxing.isOpen(sandbox)) { Sandboxing.close(sandbox); } }, function (data) { Sandboxing.cloak(sandbox); Sandboxing.open(sandbox, data); onOpenSync(sandbox); }); return sandbox; }); }; var close$1 = function (detail, mapFetch, component, sandbox, _externals, _onOpenSync, _highlightOnOpen) { Sandboxing.close(sandbox); return Future.pure(sandbox); }; var togglePopup = function (detail, mapFetch, hotspot, externals, onOpenSync, highlightOnOpen) { var sandbox = Coupling.getCoupled(hotspot, 'sandbox'); var showing = Sandboxing.isOpen(sandbox); var action = showing ? close$1 : open$1; return action(detail, mapFetch, hotspot, sandbox, externals, onOpenSync, highlightOnOpen); }; var matchWidth = function (hotspot, container, useMinWidth) { var menu = Composing.getCurrent(container).getOr(container); var buttonWidth = get$8(hotspot.element); if (useMinWidth) { set$2(menu.element, 'min-width', buttonWidth + 'px'); } else { set$4(menu.element, buttonWidth); } }; var getSink = function (anyInSystem, sinkDetail) { return anyInSystem.getSystem().getByUid(sinkDetail.uid + '-' + suffix()).map(function (internalSink) { return function () { return Result.value(internalSink); }; }).getOrThunk(function () { return sinkDetail.lazySink.fold(function () { return function () { return Result.error(new Error('No internal sink is specified, nor could an external sink be found')); }; }, function (lazySinkFn) { return function () { return lazySinkFn(anyInSystem); }; }); }); }; var doRepositionMenus = function (sandbox) { Sandboxing.getState(sandbox).each(function (tmenu) { tieredMenu.repositionMenus(tmenu); }); }; var makeSandbox = function (detail, hotspot, extras) { var ariaOwner = manager(); var onOpen = function (component, menu) { var anchor = getAnchor(detail, hotspot); ariaOwner.link(hotspot.element); if (detail.matchWidth) { matchWidth(anchor.hotspot, menu, detail.useMinWidth); } detail.onOpen(anchor, component, menu); if (extras !== undefined && extras.onOpen !== undefined) { extras.onOpen(component, menu); } }; var onClose = function (component, menu) { ariaOwner.unlink(hotspot.element); if (extras !== undefined && extras.onClose !== undefined) { extras.onClose(component, menu); } }; var lazySink = getSink(hotspot, detail); return { dom: { tag: 'div', classes: detail.sandboxClasses, attributes: { id: ariaOwner.id, role: 'listbox' } }, behaviours: SketchBehaviours.augment(detail.sandboxBehaviours, [ Representing.config({ store: { mode: 'memory', initialValue: hotspot } }), Sandboxing.config({ onOpen: onOpen, onClose: onClose, isPartOf: function (container, data, queryElem) { return isPartOf(data, queryElem) || isPartOf(hotspot, queryElem); }, getAttachPoint: function () { return lazySink().getOrDie(); } }), Composing.config({ find: function (sandbox) { return Sandboxing.getState(sandbox).bind(function (menu) { return Composing.getCurrent(menu); }); } }), Receiving.config({ channels: __assign(__assign({}, receivingChannel({ isExtraPart: never })), receivingChannel$1({ doReposition: doRepositionMenus })) }) ]) }; }; var repositionMenus = function (comp) { var sandbox = Coupling.getCoupled(comp, 'sandbox'); doRepositionMenus(sandbox); }; var sandboxFields = function () { return [ defaulted$1('sandboxClasses', []), SketchBehaviours.field('sandboxBehaviours', [ Composing, Receiving, Sandboxing, Representing ]) ]; }; var schema$g = constant([ strict$1('dom'), strict$1('fetch'), onHandler('onOpen'), onKeyboardHandler('onExecute'), defaulted$1('getHotspot', Optional.some), defaulted$1('getAnchorOverrides', constant({})), schema$1(), field$1('dropdownBehaviours', [ Toggling, Coupling, Keying, Focusing ]), strict$1('toggleClass'), defaulted$1('eventOrder', {}), option('lazySink'), defaulted$1('matchWidth', false), defaulted$1('useMinWidth', false), option('role') ].concat(sandboxFields())); var parts$4 = constant([ external$1({ schema: [tieredMenuMarkers()], name: 'menu', defaults: function (detail) { return { onExecute: detail.onExecute }; } }), partType() ]); var factory$6 = function (detail, components, _spec, externals) { var _a; var lookupAttr = function (attr) { return get$1(detail.dom, 'attributes').bind(function (attrs) { return get$1(attrs, attr); }); }; var switchToMenu = function (sandbox) { Sandboxing.getState(sandbox).each(function (tmenu) { tieredMenu.highlightPrimary(tmenu); }); }; var action = function (component) { var onOpenSync = switchToMenu; togglePopup(detail, function (x) { return x; }, component, externals, onOpenSync, HighlightOnOpen.HighlightFirst).get(noop); }; var apis = { expand: function (comp) { if (!Toggling.isOn(comp)) { togglePopup(detail, function (x) { return x; }, comp, externals, noop, HighlightOnOpen.HighlightNone).get(noop); } }, open: function (comp) { if (!Toggling.isOn(comp)) { togglePopup(detail, function (x) { return x; }, comp, externals, noop, HighlightOnOpen.HighlightFirst).get(noop); } }, isOpen: Toggling.isOn, close: function (comp) { if (Toggling.isOn(comp)) { togglePopup(detail, function (x) { return x; }, comp, externals, noop, HighlightOnOpen.HighlightFirst).get(noop); } }, repositionMenus: function (comp) { if (Toggling.isOn(comp)) { repositionMenus(comp); } } }; var triggerExecute = function (comp, _se) { emitExecute(comp); return Optional.some(true); }; return { uid: detail.uid, dom: detail.dom, components: components, behaviours: augment(detail.dropdownBehaviours, [ Toggling.config({ toggleClass: detail.toggleClass, aria: { mode: 'expanded' } }), Coupling.config({ others: { sandbox: function (hotspot) { return makeSandbox(detail, hotspot, { onOpen: function () { return Toggling.on(hotspot); }, onClose: function () { return Toggling.off(hotspot); } }); } } }), Keying.config({ mode: 'special', onSpace: triggerExecute, onEnter: triggerExecute, onDown: function (comp, _se) { if (Dropdown.isOpen(comp)) { var sandbox = Coupling.getCoupled(comp, 'sandbox'); switchToMenu(sandbox); } else { Dropdown.open(comp); } return Optional.some(true); }, onEscape: function (comp, _se) { if (Dropdown.isOpen(comp)) { Dropdown.close(comp); return Optional.some(true); } else { return Optional.none(); } } }), Focusing.config({}) ]), events: events$7(Optional.some(action)), eventOrder: __assign(__assign({}, detail.eventOrder), (_a = {}, _a[execute()] = [ 'disabling', 'toggling', 'alloy.base.behaviour' ], _a)), apis: apis, domModification: { attributes: __assign(__assign({ 'aria-haspopup': 'true' }, detail.role.fold(function () { return {}; }, function (role) { return { role: role }; })), detail.dom.tag === 'button' ? { type: lookupAttr('type').getOr('button') } : {}) } }; }; var Dropdown = composite$1({ name: 'Dropdown', configFields: schema$g(), partFields: parts$4(), factory: factory$6, apis: { open: function (apis, comp) { return apis.open(comp); }, expand: function (apis, comp) { return apis.expand(comp); }, close: function (apis, comp) { return apis.close(comp); }, isOpen: function (apis, comp) { return apis.isOpen(comp); }, repositionMenus: function (apis, comp) { return apis.repositionMenus(comp); } } }); var exhibit$5 = function () { return nu$6({ styles: { '-webkit-user-select': 'none', 'user-select': 'none', '-ms-user-select': 'none', '-moz-user-select': '-moz-none' }, attributes: { unselectable: 'on' } }); }; var events$b = function () { return derive([abort(selectstart(), always)]); }; var ActiveUnselecting = /*#__PURE__*/Object.freeze({ __proto__: null, events: events$b, exhibit: exhibit$5 }); var Unselecting = create$1({ fields: [], name: 'unselecting', active: ActiveUnselecting }); var renderPanelButton = function (spec, sharedBackstage) { return Dropdown.sketch({ dom: spec.dom, components: spec.components, toggleClass: 'mce-active', dropdownBehaviours: derive$1([ DisablingConfigs.button(sharedBackstage.providers.isDisabled), receivingConfig(), Unselecting.config({}), Tabstopping.config({}) ]), layouts: spec.layouts, sandboxClasses: ['tox-dialog__popups'], lazySink: sharedBackstage.getSink, fetch: function (comp) { return Future.nu(function (callback) { return spec.fetch(callback); }).map(function (items) { return Optional.from(createTieredDataFrom(deepMerge(createPartialChoiceMenu(generate$1('menu-value'), items, function (value) { spec.onItemAction(comp, value); }, spec.columns, spec.presets, ItemResponse$1.CLOSE_ON_EXECUTE, never, sharedBackstage.providers), { movement: deriveMenuMovement(spec.columns, spec.presets) }))); }); }, parts: { menu: part(false, 1, spec.presets) } }); }; var colorInputChangeEvent = generate$1('color-input-change'); var colorSwatchChangeEvent = generate$1('color-swatch-change'); var colorPickerCancelEvent = generate$1('color-picker-cancel'); var renderColorInput = function (spec, sharedBackstage, colorInputBackstage) { var pField = FormField.parts.field({ factory: Input, inputClasses: ['tox-textfield'], onSetValue: function (c) { return Invalidating.run(c).get(noop); }, inputBehaviours: derive$1([ Disabling.config({ disabled: sharedBackstage.providers.isDisabled }), receivingConfig(), Tabstopping.config({}), Invalidating.config({ invalidClass: 'tox-textbox-field-invalid', getRoot: function (comp) { return parent(comp.element); }, notify: { onValid: function (comp) { var val = Representing.getValue(comp); emitWith(comp, colorInputChangeEvent, { color: val }); } }, validator: { validateOnLoad: false, validate: function (input) { var inputValue = Representing.getValue(input); if (inputValue.length === 0) { return Future.pure(Result.value(true)); } else { var span = SugarElement.fromTag('span'); set$2(span, 'background-color', inputValue); var res = getRaw(span, 'background-color').fold(function () { return Result.error('blah'); }, function (_) { return Result.value(inputValue); }); return Future.pure(res); } } } }) ]), selectOnFocus: false }); var pLabel = spec.label.map(function (label) { return renderLabel(label, sharedBackstage.providers); }); var emitSwatchChange = function (colorBit, value) { emitWith(colorBit, colorSwatchChangeEvent, { value: value }); }; var onItemAction = function (comp, value) { memColorButton.getOpt(comp).each(function (colorBit) { if (value === 'custom') { colorInputBackstage.colorPicker(function (valueOpt) { valueOpt.fold(function () { return emit(colorBit, colorPickerCancelEvent); }, function (value) { emitSwatchChange(colorBit, value); addColor(value); }); }, '#ffffff'); } else if (value === 'remove') { emitSwatchChange(colorBit, ''); } else { emitSwatchChange(colorBit, value); } }); }; var memColorButton = record(renderPanelButton({ dom: { tag: 'span', attributes: { 'aria-label': sharedBackstage.providers.translate('Color swatch') } }, layouts: { onRtl: function () { return [ southwest$1, southeast$1, south$1 ]; }, onLtr: function () { return [ southeast$1, southwest$1, south$1 ]; } }, components: [], fetch: getFetch(colorInputBackstage.getColors(), colorInputBackstage.hasCustomColors()), columns: colorInputBackstage.getColorCols(), presets: 'color', onItemAction: onItemAction }, sharedBackstage)); return FormField.sketch({ dom: { tag: 'div', classes: ['tox-form__group'] }, components: pLabel.toArray().concat([{ dom: { tag: 'div', classes: ['tox-color-input'] }, components: [ pField, memColorButton.asSpec() ] }]), fieldBehaviours: derive$1([config('form-field-events', [ run(colorInputChangeEvent, function (comp, se) { memColorButton.getOpt(comp).each(function (colorButton) { set$2(colorButton.element, 'background-color', se.event.color); }); emitWith(comp, formChangeEvent, { name: spec.name }); }), run(colorSwatchChangeEvent, function (comp, se) { FormField.getField(comp).each(function (field) { Representing.setValue(field, se.event.value); Composing.getCurrent(comp).each(Focusing.focus); }); }), run(colorPickerCancelEvent, function (comp, _se) { FormField.getField(comp).each(function (_field) { Composing.getCurrent(comp).each(Focusing.focus); }); }) ])]) }); }; var labelPart = optional({ schema: [strict$1('dom')], name: 'label' }); var edgePart = function (name) { return optional({ name: '' + name + '-edge', overrides: function (detail) { var action = detail.model.manager.edgeActions[name]; return action.fold(function () { return {}; }, function (a) { return { events: derive([ runActionExtra(touchstart(), function (comp, se, d) { return a(comp, d); }, [detail]), runActionExtra(mousedown(), function (comp, se, d) { return a(comp, d); }, [detail]), runActionExtra(mousemove(), function (comp, se, det) { if (det.mouseIsDown.get()) { a(comp, det); } }, [detail]) ]) }; }); } }); }; var tlEdgePart = edgePart('top-left'); var tedgePart = edgePart('top'); var trEdgePart = edgePart('top-right'); var redgePart = edgePart('right'); var brEdgePart = edgePart('bottom-right'); var bedgePart = edgePart('bottom'); var blEdgePart = edgePart('bottom-left'); var ledgePart = edgePart('left'); var thumbPart = required({ name: 'thumb', defaults: constant({ dom: { styles: { position: 'absolute' } } }), overrides: function (detail) { return { events: derive([ redirectToPart(touchstart(), detail, 'spectrum'), redirectToPart(touchmove(), detail, 'spectrum'), redirectToPart(touchend(), detail, 'spectrum'), redirectToPart(mousedown(), detail, 'spectrum'), redirectToPart(mousemove(), detail, 'spectrum'), redirectToPart(mouseup(), detail, 'spectrum') ]) }; } }); var spectrumPart = required({ schema: [state$1('mouseIsDown', function () { return Cell(false); })], name: 'spectrum', overrides: function (detail) { var modelDetail = detail.model; var model = modelDetail.manager; var setValueFrom = function (component, simulatedEvent) { return model.getValueFromEvent(simulatedEvent).map(function (value) { return model.setValueFrom(component, detail, value); }); }; return { behaviours: derive$1([ Keying.config({ mode: 'special', onLeft: function (spectrum) { return model.onLeft(spectrum, detail); }, onRight: function (spectrum) { return model.onRight(spectrum, detail); }, onUp: function (spectrum) { return model.onUp(spectrum, detail); }, onDown: function (spectrum) { return model.onDown(spectrum, detail); } }), Focusing.config({}) ]), events: derive([ run(touchstart(), setValueFrom), run(touchmove(), setValueFrom), run(mousedown(), setValueFrom), run(mousemove(), function (spectrum, se) { if (detail.mouseIsDown.get()) { setValueFrom(spectrum, se); } }) ]) }; } }); var SliderParts = [ labelPart, ledgePart, redgePart, tedgePart, bedgePart, tlEdgePart, trEdgePart, blEdgePart, brEdgePart, thumbPart, spectrumPart ]; var _sliderChangeEvent = 'slider.change.value'; var sliderChangeEvent = constant(_sliderChangeEvent); var isTouchEvent = function (evt) { return evt.type.indexOf('touch') !== -1; }; var getEventSource = function (simulatedEvent) { var evt = simulatedEvent.event.raw; if (isTouchEvent(evt)) { var touchEvent = evt; return touchEvent.touches !== undefined && touchEvent.touches.length === 1 ? Optional.some(touchEvent.touches[0]).map(function (t) { return SugarPosition(t.clientX, t.clientY); }) : Optional.none(); } else { var mouseEvent = evt; return mouseEvent.clientX !== undefined ? Optional.some(mouseEvent).map(function (me) { return SugarPosition(me.clientX, me.clientY); }) : Optional.none(); } }; var t = 'top', r$1 = 'right', b = 'bottom', l = 'left'; var minX = function (detail) { return detail.model.minX; }; var minY = function (detail) { return detail.model.minY; }; var min1X = function (detail) { return detail.model.minX - 1; }; var min1Y = function (detail) { return detail.model.minY - 1; }; var maxX = function (detail) { return detail.model.maxX; }; var maxY = function (detail) { return detail.model.maxY; }; var max1X = function (detail) { return detail.model.maxX + 1; }; var max1Y = function (detail) { return detail.model.maxY + 1; }; var range$2 = function (detail, max, min) { return max(detail) - min(detail); }; var xRange = function (detail) { return range$2(detail, maxX, minX); }; var yRange = function (detail) { return range$2(detail, maxY, minY); }; var halfX = function (detail) { return xRange(detail) / 2; }; var halfY = function (detail) { return yRange(detail) / 2; }; var step = function (detail) { return detail.stepSize; }; var snap = function (detail) { return detail.snapToGrid; }; var snapStart = function (detail) { return detail.snapStart; }; var rounded = function (detail) { return detail.rounded; }; var hasEdge = function (detail, edgeName) { return detail[edgeName + '-edge'] !== undefined; }; var hasLEdge = function (detail) { return hasEdge(detail, l); }; var hasREdge = function (detail) { return hasEdge(detail, r$1); }; var hasTEdge = function (detail) { return hasEdge(detail, t); }; var hasBEdge = function (detail) { return hasEdge(detail, b); }; var currentValue = function (detail) { return detail.model.value.get(); }; var xValue = function (x) { return { x: x }; }; var yValue = function (y) { return { y: y }; }; var xyValue = function (x, y) { return { x: x, y: y }; }; var fireSliderChange = function (component, value) { emitWith(component, sliderChangeEvent(), { value: value }); }; var setToTLEdgeXY = function (edge, detail) { fireSliderChange(edge, xyValue(min1X(detail), min1Y(detail))); }; var setToTEdge = function (edge, detail) { fireSliderChange(edge, yValue(min1Y(detail))); }; var setToTEdgeXY = function (edge, detail) { fireSliderChange(edge, xyValue(halfX(detail), min1Y(detail))); }; var setToTREdgeXY = function (edge, detail) { fireSliderChange(edge, xyValue(max1X(detail), min1Y(detail))); }; var setToREdge = function (edge, detail) { fireSliderChange(edge, xValue(max1X(detail))); }; var setToREdgeXY = function (edge, detail) { fireSliderChange(edge, xyValue(max1X(detail), halfY(detail))); }; var setToBREdgeXY = function (edge, detail) { fireSliderChange(edge, xyValue(max1X(detail), max1Y(detail))); }; var setToBEdge = function (edge, detail) { fireSliderChange(edge, yValue(max1Y(detail))); }; var setToBEdgeXY = function (edge, detail) { fireSliderChange(edge, xyValue(halfX(detail), max1Y(detail))); }; var setToBLEdgeXY = function (edge, detail) { fireSliderChange(edge, xyValue(min1X(detail), max1Y(detail))); }; var setToLEdge = function (edge, detail) { fireSliderChange(edge, xValue(min1X(detail))); }; var setToLEdgeXY = function (edge, detail) { fireSliderChange(edge, xyValue(min1X(detail), halfY(detail))); }; var reduceBy = function (value, min, max, step) { if (value < min) { return value; } else if (value > max) { return max; } else if (value === min) { return min - 1; } else { return Math.max(min, value - step); } }; var increaseBy = function (value, min, max, step) { if (value > max) { return value; } else if (value < min) { return min; } else if (value === max) { return max + 1; } else { return Math.min(max, value + step); } }; var capValue = function (value, min, max) { return Math.max(min, Math.min(max, value)); }; var snapValueOf = function (value, min, max, step, snapStart) { return snapStart.fold(function () { var initValue = value - min; var extraValue = Math.round(initValue / step) * step; return capValue(min + extraValue, min - 1, max + 1); }, function (start) { var remainder = (value - start) % step; var adjustment = Math.round(remainder / step); var rawSteps = Math.floor((value - start) / step); var maxSteps = Math.floor((max - start) / step); var numSteps = Math.min(maxSteps, rawSteps + adjustment); var r = start + numSteps * step; return Math.max(start, r); }); }; var findOffsetOf = function (value, min, max) { return Math.min(max, Math.max(value, min)) - min; }; var findValueOf = function (args) { var min = args.min, max = args.max, range = args.range, value = args.value, step = args.step, snap = args.snap, snapStart = args.snapStart, rounded = args.rounded, hasMinEdge = args.hasMinEdge, hasMaxEdge = args.hasMaxEdge, minBound = args.minBound, maxBound = args.maxBound, screenRange = args.screenRange; var capMin = hasMinEdge ? min - 1 : min; var capMax = hasMaxEdge ? max + 1 : max; if (value < minBound) { return capMin; } else if (value > maxBound) { return capMax; } else { var offset = findOffsetOf(value, minBound, maxBound); var newValue = capValue(offset / screenRange * range + min, capMin, capMax); if (snap && newValue >= min && newValue <= max) { return snapValueOf(newValue, min, max, step, snapStart); } else if (rounded) { return Math.round(newValue); } else { return newValue; } } }; var findOffsetOfValue = function (args) { var min = args.min, max = args.max, range = args.range, value = args.value, hasMinEdge = args.hasMinEdge, hasMaxEdge = args.hasMaxEdge, maxBound = args.maxBound, maxOffset = args.maxOffset, centerMinEdge = args.centerMinEdge, centerMaxEdge = args.centerMaxEdge; if (value < min) { return hasMinEdge ? 0 : centerMinEdge; } else if (value > max) { return hasMaxEdge ? maxBound : centerMaxEdge; } else { return (value - min) / range * maxOffset; } }; var top = 'top', right = 'right', bottom = 'bottom', left = 'left', width = 'width', height = 'height'; var getBounds$1 = function (component) { return component.element.dom.getBoundingClientRect(); }; var getBoundsProperty = function (bounds, property) { return bounds[property]; }; var getMinXBounds = function (component) { var bounds = getBounds$1(component); return getBoundsProperty(bounds, left); }; var getMaxXBounds = function (component) { var bounds = getBounds$1(component); return getBoundsProperty(bounds, right); }; var getMinYBounds = function (component) { var bounds = getBounds$1(component); return getBoundsProperty(bounds, top); }; var getMaxYBounds = function (component) { var bounds = getBounds$1(component); return getBoundsProperty(bounds, bottom); }; var getXScreenRange = function (component) { var bounds = getBounds$1(component); return getBoundsProperty(bounds, width); }; var getYScreenRange = function (component) { var bounds = getBounds$1(component); return getBoundsProperty(bounds, height); }; var getCenterOffsetOf = function (componentMinEdge, componentMaxEdge, spectrumMinEdge) { return (componentMinEdge + componentMaxEdge) / 2 - spectrumMinEdge; }; var getXCenterOffSetOf = function (component, spectrum) { var componentBounds = getBounds$1(component); var spectrumBounds = getBounds$1(spectrum); var componentMinEdge = getBoundsProperty(componentBounds, left); var componentMaxEdge = getBoundsProperty(componentBounds, right); var spectrumMinEdge = getBoundsProperty(spectrumBounds, left); return getCenterOffsetOf(componentMinEdge, componentMaxEdge, spectrumMinEdge); }; var getYCenterOffSetOf = function (component, spectrum) { var componentBounds = getBounds$1(component); var spectrumBounds = getBounds$1(spectrum); var componentMinEdge = getBoundsProperty(componentBounds, top); var componentMaxEdge = getBoundsProperty(componentBounds, bottom); var spectrumMinEdge = getBoundsProperty(spectrumBounds, top); return getCenterOffsetOf(componentMinEdge, componentMaxEdge, spectrumMinEdge); }; var fireSliderChange$1 = function (spectrum, value) { emitWith(spectrum, sliderChangeEvent(), { value: value }); }; var sliderValue = function (x) { return { x: x }; }; var findValueOfOffset = function (spectrum, detail, left) { var args = { min: minX(detail), max: maxX(detail), range: xRange(detail), value: left, step: step(detail), snap: snap(detail), snapStart: snapStart(detail), rounded: rounded(detail), hasMinEdge: hasLEdge(detail), hasMaxEdge: hasREdge(detail), minBound: getMinXBounds(spectrum), maxBound: getMaxXBounds(spectrum), screenRange: getXScreenRange(spectrum) }; return findValueOf(args); }; var setValueFrom = function (spectrum, detail, value) { var xValue = findValueOfOffset(spectrum, detail, value); var sliderVal = sliderValue(xValue); fireSliderChange$1(spectrum, sliderVal); return xValue; }; var setToMin = function (spectrum, detail) { var min = minX(detail); fireSliderChange$1(spectrum, sliderValue(min)); }; var setToMax = function (spectrum, detail) { var max = maxX(detail); fireSliderChange$1(spectrum, sliderValue(max)); }; var moveBy = function (direction, spectrum, detail) { var f = direction > 0 ? increaseBy : reduceBy; var xValue = f(currentValue(detail).x, minX(detail), maxX(detail), step(detail)); fireSliderChange$1(spectrum, sliderValue(xValue)); return Optional.some(xValue); }; var handleMovement = function (direction) { return function (spectrum, detail) { return moveBy(direction, spectrum, detail).map(always); }; }; var getValueFromEvent = function (simulatedEvent) { var pos = getEventSource(simulatedEvent); return pos.map(function (p) { return p.left; }); }; var findOffsetOfValue$1 = function (spectrum, detail, value, minEdge, maxEdge) { var minOffset = 0; var maxOffset = getXScreenRange(spectrum); var centerMinEdge = minEdge.bind(function (edge) { return Optional.some(getXCenterOffSetOf(edge, spectrum)); }).getOr(minOffset); var centerMaxEdge = maxEdge.bind(function (edge) { return Optional.some(getXCenterOffSetOf(edge, spectrum)); }).getOr(maxOffset); var args = { min: minX(detail), max: maxX(detail), range: xRange(detail), value: value, hasMinEdge: hasLEdge(detail), hasMaxEdge: hasREdge(detail), minBound: getMinXBounds(spectrum), minOffset: minOffset, maxBound: getMaxXBounds(spectrum), maxOffset: maxOffset, centerMinEdge: centerMinEdge, centerMaxEdge: centerMaxEdge }; return findOffsetOfValue(args); }; var findPositionOfValue = function (slider, spectrum, value, minEdge, maxEdge, detail) { var offset = findOffsetOfValue$1(spectrum, detail, value, minEdge, maxEdge); return getMinXBounds(spectrum) - getMinXBounds(slider) + offset; }; var setPositionFromValue = function (slider, thumb, detail, edges) { var value = currentValue(detail); var pos = findPositionOfValue(slider, edges.getSpectrum(slider), value.x, edges.getLeftEdge(slider), edges.getRightEdge(slider), detail); var thumbRadius = get$8(thumb.element) / 2; set$2(thumb.element, 'left', pos - thumbRadius + 'px'); }; var onLeft = handleMovement(-1); var onRight = handleMovement(1); var onUp = Optional.none; var onDown = Optional.none; var edgeActions = { 'top-left': Optional.none(), 'top': Optional.none(), 'top-right': Optional.none(), 'right': Optional.some(setToREdge), 'bottom-right': Optional.none(), 'bottom': Optional.none(), 'bottom-left': Optional.none(), 'left': Optional.some(setToLEdge) }; var HorizontalModel = /*#__PURE__*/Object.freeze({ __proto__: null, setValueFrom: setValueFrom, setToMin: setToMin, setToMax: setToMax, findValueOfOffset: findValueOfOffset, getValueFromEvent: getValueFromEvent, findPositionOfValue: findPositionOfValue, setPositionFromValue: setPositionFromValue, onLeft: onLeft, onRight: onRight, onUp: onUp, onDown: onDown, edgeActions: edgeActions }); var fireSliderChange$2 = function (spectrum, value) { emitWith(spectrum, sliderChangeEvent(), { value: value }); }; var sliderValue$1 = function (y) { return { y: y }; }; var findValueOfOffset$1 = function (spectrum, detail, top) { var args = { min: minY(detail), max: maxY(detail), range: yRange(detail), value: top, step: step(detail), snap: snap(detail), snapStart: snapStart(detail), rounded: rounded(detail), hasMinEdge: hasTEdge(detail), hasMaxEdge: hasBEdge(detail), minBound: getMinYBounds(spectrum), maxBound: getMaxYBounds(spectrum), screenRange: getYScreenRange(spectrum) }; return findValueOf(args); }; var setValueFrom$1 = function (spectrum, detail, value) { var yValue = findValueOfOffset$1(spectrum, detail, value); var sliderVal = sliderValue$1(yValue); fireSliderChange$2(spectrum, sliderVal); return yValue; }; var setToMin$1 = function (spectrum, detail) { var min = minY(detail); fireSliderChange$2(spectrum, sliderValue$1(min)); }; var setToMax$1 = function (spectrum, detail) { var max = maxY(detail); fireSliderChange$2(spectrum, sliderValue$1(max)); }; var moveBy$1 = function (direction, spectrum, detail) { var f = direction > 0 ? increaseBy : reduceBy; var yValue = f(currentValue(detail).y, minY(detail), maxY(detail), step(detail)); fireSliderChange$2(spectrum, sliderValue$1(yValue)); return Optional.some(yValue); }; var handleMovement$1 = function (direction) { return function (spectrum, detail) { return moveBy$1(direction, spectrum, detail).map(always); }; }; var getValueFromEvent$1 = function (simulatedEvent) { var pos = getEventSource(simulatedEvent); return pos.map(function (p) { return p.top; }); }; var findOffsetOfValue$2 = function (spectrum, detail, value, minEdge, maxEdge) { var minOffset = 0; var maxOffset = getYScreenRange(spectrum); var centerMinEdge = minEdge.bind(function (edge) { return Optional.some(getYCenterOffSetOf(edge, spectrum)); }).getOr(minOffset); var centerMaxEdge = maxEdge.bind(function (edge) { return Optional.some(getYCenterOffSetOf(edge, spectrum)); }).getOr(maxOffset); var args = { min: minY(detail), max: maxY(detail), range: yRange(detail), value: value, hasMinEdge: hasTEdge(detail), hasMaxEdge: hasBEdge(detail), minBound: getMinYBounds(spectrum), minOffset: minOffset, maxBound: getMaxYBounds(spectrum), maxOffset: maxOffset, centerMinEdge: centerMinEdge, centerMaxEdge: centerMaxEdge }; return findOffsetOfValue(args); }; var findPositionOfValue$1 = function (slider, spectrum, value, minEdge, maxEdge, detail) { var offset = findOffsetOfValue$2(spectrum, detail, value, minEdge, maxEdge); return getMinYBounds(spectrum) - getMinYBounds(slider) + offset; }; var setPositionFromValue$1 = function (slider, thumb, detail, edges) { var value = currentValue(detail); var pos = findPositionOfValue$1(slider, edges.getSpectrum(slider), value.y, edges.getTopEdge(slider), edges.getBottomEdge(slider), detail); var thumbRadius = get$7(thumb.element) / 2; set$2(thumb.element, 'top', pos - thumbRadius + 'px'); }; var onLeft$1 = Optional.none; var onRight$1 = Optional.none; var onUp$1 = handleMovement$1(-1); var onDown$1 = handleMovement$1(1); var edgeActions$1 = { 'top-left': Optional.none(), 'top': Optional.some(setToTEdge), 'top-right': Optional.none(), 'right': Optional.none(), 'bottom-right': Optional.none(), 'bottom': Optional.some(setToBEdge), 'bottom-left': Optional.none(), 'left': Optional.none() }; var VerticalModel = /*#__PURE__*/Object.freeze({ __proto__: null, setValueFrom: setValueFrom$1, setToMin: setToMin$1, setToMax: setToMax$1, findValueOfOffset: findValueOfOffset$1, getValueFromEvent: getValueFromEvent$1, findPositionOfValue: findPositionOfValue$1, setPositionFromValue: setPositionFromValue$1, onLeft: onLeft$1, onRight: onRight$1, onUp: onUp$1, onDown: onDown$1, edgeActions: edgeActions$1 }); var fireSliderChange$3 = function (spectrum, value) { emitWith(spectrum, sliderChangeEvent(), { value: value }); }; var sliderValue$2 = function (x, y) { return { x: x, y: y }; }; var setValueFrom$2 = function (spectrum, detail, value) { var xValue = findValueOfOffset(spectrum, detail, value.left); var yValue = findValueOfOffset$1(spectrum, detail, value.top); var val = sliderValue$2(xValue, yValue); fireSliderChange$3(spectrum, val); return val; }; var moveBy$2 = function (direction, isVerticalMovement, spectrum, detail) { var f = direction > 0 ? increaseBy : reduceBy; var xValue = isVerticalMovement ? currentValue(detail).x : f(currentValue(detail).x, minX(detail), maxX(detail), step(detail)); var yValue = !isVerticalMovement ? currentValue(detail).y : f(currentValue(detail).y, minY(detail), maxY(detail), step(detail)); fireSliderChange$3(spectrum, sliderValue$2(xValue, yValue)); return Optional.some(xValue); }; var handleMovement$2 = function (direction, isVerticalMovement) { return function (spectrum, detail) { return moveBy$2(direction, isVerticalMovement, spectrum, detail).map(always); }; }; var setToMin$2 = function (spectrum, detail) { var mX = minX(detail); var mY = minY(detail); fireSliderChange$3(spectrum, sliderValue$2(mX, mY)); }; var setToMax$2 = function (spectrum, detail) { var mX = maxX(detail); var mY = maxY(detail); fireSliderChange$3(spectrum, sliderValue$2(mX, mY)); }; var getValueFromEvent$2 = function (simulatedEvent) { return getEventSource(simulatedEvent); }; var setPositionFromValue$2 = function (slider, thumb, detail, edges) { var value = currentValue(detail); var xPos = findPositionOfValue(slider, edges.getSpectrum(slider), value.x, edges.getLeftEdge(slider), edges.getRightEdge(slider), detail); var yPos = findPositionOfValue$1(slider, edges.getSpectrum(slider), value.y, edges.getTopEdge(slider), edges.getBottomEdge(slider), detail); var thumbXRadius = get$8(thumb.element) / 2; var thumbYRadius = get$7(thumb.element) / 2; set$2(thumb.element, 'left', xPos - thumbXRadius + 'px'); set$2(thumb.element, 'top', yPos - thumbYRadius + 'px'); }; var onLeft$2 = handleMovement$2(-1, false); var onRight$2 = handleMovement$2(1, false); var onUp$2 = handleMovement$2(-1, true); var onDown$2 = handleMovement$2(1, true); var edgeActions$2 = { 'top-left': Optional.some(setToTLEdgeXY), 'top': Optional.some(setToTEdgeXY), 'top-right': Optional.some(setToTREdgeXY), 'right': Optional.some(setToREdgeXY), 'bottom-right': Optional.some(setToBREdgeXY), 'bottom': Optional.some(setToBEdgeXY), 'bottom-left': Optional.some(setToBLEdgeXY), 'left': Optional.some(setToLEdgeXY) }; var TwoDModel = /*#__PURE__*/Object.freeze({ __proto__: null, setValueFrom: setValueFrom$2, setToMin: setToMin$2, setToMax: setToMax$2, getValueFromEvent: getValueFromEvent$2, setPositionFromValue: setPositionFromValue$2, onLeft: onLeft$2, onRight: onRight$2, onUp: onUp$2, onDown: onDown$2, edgeActions: edgeActions$2 }); var SliderSchema = [ defaulted$1('stepSize', 1), defaulted$1('onChange', noop), defaulted$1('onChoose', noop), defaulted$1('onInit', noop), defaulted$1('onDragStart', noop), defaulted$1('onDragEnd', noop), defaulted$1('snapToGrid', false), defaulted$1('rounded', true), option('snapStart'), strictOf('model', choose$1('mode', { x: [ defaulted$1('minX', 0), defaulted$1('maxX', 100), state$1('value', function (spec) { return Cell(spec.mode.minX); }), strict$1('getInitialValue'), output('manager', HorizontalModel) ], y: [ defaulted$1('minY', 0), defaulted$1('maxY', 100), state$1('value', function (spec) { return Cell(spec.mode.minY); }), strict$1('getInitialValue'), output('manager', VerticalModel) ], xy: [ defaulted$1('minX', 0), defaulted$1('maxX', 100), defaulted$1('minY', 0), defaulted$1('maxY', 100), state$1('value', function (spec) { return Cell({ x: spec.mode.minX, y: spec.mode.minY }); }), strict$1('getInitialValue'), output('manager', TwoDModel) ] })), field$1('sliderBehaviours', [ Keying, Representing ]), state$1('mouseIsDown', function () { return Cell(false); }) ]; var sketch = function (detail, components, _spec, _externals) { var _a; var getThumb = function (component) { return getPartOrDie(component, detail, 'thumb'); }; var getSpectrum = function (component) { return getPartOrDie(component, detail, 'spectrum'); }; var getLeftEdge = function (component) { return getPart(component, detail, 'left-edge'); }; var getRightEdge = function (component) { return getPart(component, detail, 'right-edge'); }; var getTopEdge = function (component) { return getPart(component, detail, 'top-edge'); }; var getBottomEdge = function (component) { return getPart(component, detail, 'bottom-edge'); }; var modelDetail = detail.model; var model = modelDetail.manager; var refresh = function (slider, thumb) { model.setPositionFromValue(slider, thumb, detail, { getLeftEdge: getLeftEdge, getRightEdge: getRightEdge, getTopEdge: getTopEdge, getBottomEdge: getBottomEdge, getSpectrum: getSpectrum }); }; var setValue = function (slider, newValue) { modelDetail.value.set(newValue); var thumb = getThumb(slider); refresh(slider, thumb); }; var changeValue = function (slider, newValue) { setValue(slider, newValue); var thumb = getThumb(slider); detail.onChange(slider, thumb, newValue); return Optional.some(true); }; var resetToMin = function (slider) { model.setToMin(slider, detail); }; var resetToMax = function (slider) { model.setToMax(slider, detail); }; var choose = function (slider) { var fireOnChoose = function () { getPart(slider, detail, 'thumb').each(function (thumb) { var value = modelDetail.value.get(); detail.onChoose(slider, thumb, value); }); }; var wasDown = detail.mouseIsDown.get(); detail.mouseIsDown.set(false); if (wasDown) { fireOnChoose(); } }; var onDragStart = function (slider, simulatedEvent) { simulatedEvent.stop(); detail.mouseIsDown.set(true); detail.onDragStart(slider, getThumb(slider)); }; var onDragEnd = function (slider, simulatedEvent) { simulatedEvent.stop(); detail.onDragEnd(slider, getThumb(slider)); choose(slider); }; return { uid: detail.uid, dom: detail.dom, components: components, behaviours: augment(detail.sliderBehaviours, [ Keying.config({ mode: 'special', focusIn: function (slider) { return getPart(slider, detail, 'spectrum').map(Keying.focusIn).map(always); } }), Representing.config({ store: { mode: 'manual', getValue: function (_) { return modelDetail.value.get(); } } }), Receiving.config({ channels: (_a = {}, _a[mouseReleased()] = { onReceive: choose }, _a) }) ]), events: derive([ run(sliderChangeEvent(), function (slider, simulatedEvent) { changeValue(slider, simulatedEvent.event.value); }), runOnAttached(function (slider, _simulatedEvent) { var getInitial = modelDetail.getInitialValue(); modelDetail.value.set(getInitial); var thumb = getThumb(slider); refresh(slider, thumb); var spectrum = getSpectrum(slider); detail.onInit(slider, thumb, spectrum, modelDetail.value.get()); }), run(touchstart(), onDragStart), run(touchend(), onDragEnd), run(mousedown(), onDragStart), run(mouseup(), onDragEnd) ]), apis: { resetToMin: resetToMin, resetToMax: resetToMax, setValue: setValue, refresh: refresh }, domModification: { styles: { position: 'relative' } } }; }; var Slider = composite$1({ name: 'Slider', configFields: SliderSchema, partFields: SliderParts, factory: sketch, apis: { setValue: function (apis, slider, value) { apis.setValue(slider, value); }, resetToMin: function (apis, slider) { apis.resetToMin(slider); }, resetToMax: function (apis, slider) { apis.resetToMax(slider); }, refresh: function (apis, slider) { apis.refresh(slider); } } }); var hsvColour = function (hue, saturation, value) { return { hue: hue, saturation: saturation, value: value }; }; var fromRgb = function (rgbaColour) { var h = 0; var s = 0; var v = 0; var r = rgbaColour.red / 255; var g = rgbaColour.green / 255; var b = rgbaColour.blue / 255; var minRGB = Math.min(r, Math.min(g, b)); var maxRGB = Math.max(r, Math.max(g, b)); if (minRGB === maxRGB) { v = minRGB; return hsvColour(0, 0, v * 100); } var d = r === minRGB ? g - b : b === minRGB ? r - g : b - r; h = r === minRGB ? 3 : b === minRGB ? 1 : 5; h = 60 * (h - d / (maxRGB - minRGB)); s = (maxRGB - minRGB) / maxRGB; v = maxRGB; return hsvColour(Math.round(h), Math.round(s * 100), Math.round(v * 100)); }; var hexToHsv = function (hex) { return fromRgb(fromHex(hex)); }; var hsvToHex = function (hsv) { return fromRgba(fromHsv(hsv)); }; var fieldsUpdate = generate$1('rgb-hex-update'); var sliderUpdate = generate$1('slider-update'); var paletteUpdate = generate$1('palette-update'); var sliderFactory = function (translate, getClass) { var spectrum = Slider.parts.spectrum({ dom: { tag: 'div', classes: [getClass('hue-slider-spectrum')], attributes: { role: 'presentation' } } }); var thumb = Slider.parts.thumb({ dom: { tag: 'div', classes: [getClass('hue-slider-thumb')], attributes: { role: 'presentation' } } }); return Slider.sketch({ dom: { tag: 'div', classes: [getClass('hue-slider')], attributes: { role: 'presentation' } }, rounded: false, model: { mode: 'y', getInitialValue: constant({ y: 0 }) }, components: [ spectrum, thumb ], sliderBehaviours: derive$1([Focusing.config({})]), onChange: function (slider, _thumb, value) { emitWith(slider, sliderUpdate, { value: value }); } }); }; var owner$3 = 'form'; var schema$h = [field$1('formBehaviours', [Representing])]; var getPartName = function (name) { return ''; }; var sketch$1 = function (fSpec) { var parts = function () { var record = []; var field = function (name, config) { record.push(name); return generateOne(owner$3, getPartName(name), config); }; return { field: field, record: function () { return record; } }; }(); var spec = fSpec(parts); var partNames = parts.record(); var fieldParts = map(partNames, function (n) { return required({ name: n, pname: getPartName(n) }); }); return composite(owner$3, schema$h, fieldParts, make$4, spec); }; var toResult$1 = function (o, e) { return o.fold(function () { return Result.error(e); }, Result.value); }; var make$4 = function (detail, components) { return { uid: detail.uid, dom: detail.dom, components: components, behaviours: augment(detail.formBehaviours, [Representing.config({ store: { mode: 'manual', getValue: function (form) { var resPs = getAllParts(form, detail); return map$2(resPs, function (resPThunk, pName) { return resPThunk().bind(function (v) { var opt = Composing.getCurrent(v); return toResult$1(opt, new Error('Cannot find a current component to extract the value from for form part \'' + pName + '\': ' + element(v.element))); }).map(Representing.getValue); }); }, setValue: function (form, values) { each$1(values, function (newValue, key) { getPart(form, detail, key).each(function (wrapper) { Composing.getCurrent(wrapper).each(function (field) { Representing.setValue(field, newValue); }); }); }); } } })]), apis: { getField: function (form, key) { return getPart(form, detail, key).bind(Composing.getCurrent); } } }; }; var Form = { getField: makeApi(function (apis, component, key) { return apis.getField(component, key); }), sketch: sketch$1 }; var validInput = generate$1('valid-input'); var invalidInput = generate$1('invalid-input'); var validatingInput = generate$1('validating-input'); var translatePrefix = 'colorcustom.rgb.'; var rgbFormFactory = function (translate, getClass, onValidHexx, onInvalidHexx) { var invalidation = function (label, isValid) { return Invalidating.config({ invalidClass: getClass('invalid'), notify: { onValidate: function (comp) { emitWith(comp, validatingInput, { type: label }); }, onValid: function (comp) { emitWith(comp, validInput, { type: label, value: Representing.getValue(comp) }); }, onInvalid: function (comp) { emitWith(comp, invalidInput, { type: label, value: Representing.getValue(comp) }); } }, validator: { validate: function (comp) { var value = Representing.getValue(comp); var res = isValid(value) ? Result.value(true) : Result.error(translate('aria.input.invalid')); return Future.pure(res); }, validateOnLoad: false } }); }; var renderTextField = function (isValid, name, label, description, data) { var helptext = translate(translatePrefix + 'range'); var pLabel = FormField.parts.label({ dom: { tag: 'label', innerHtml: label, attributes: { 'aria-label': description } } }); var pField = FormField.parts.field({ data: data, factory: Input, inputAttributes: __assign({ type: 'text' }, name === 'hex' ? { 'aria-live': 'polite' } : {}), inputClasses: [getClass('textfield')], inputBehaviours: derive$1([ invalidation(name, isValid), Tabstopping.config({}) ]), onSetValue: function (input) { if (Invalidating.isInvalid(input)) { var run = Invalidating.run(input); run.get(noop); } } }); var comps = [ pLabel, pField ]; var concats = name !== 'hex' ? [FormField.parts['aria-descriptor']({ text: helptext })] : []; var components = comps.concat(concats); return { dom: { tag: 'div', attributes: { role: 'presentation' } }, components: components }; }; var copyRgbToHex = function (form, rgba) { var hex = fromRgba(rgba); Form.getField(form, 'hex').each(function (hexField) { if (!Focusing.isFocused(hexField)) { Representing.setValue(form, { hex: hex.value }); } }); return hex; }; var copyRgbToForm = function (form, rgb) { var red = rgb.red; var green = rgb.green; var blue = rgb.blue; Representing.setValue(form, { red: red, green: green, blue: blue }); }; var memPreview = record({ dom: { tag: 'div', classes: [getClass('rgba-preview')], styles: { 'background-color': 'white' }, attributes: { role: 'presentation' } } }); var updatePreview = function (anyInSystem, hex) { memPreview.getOpt(anyInSystem).each(function (preview) { set$2(preview.element, 'background-color', '#' + hex.value); }); }; var factory = function () { var state = { red: Cell(Optional.some(255)), green: Cell(Optional.some(255)), blue: Cell(Optional.some(255)), hex: Cell(Optional.some('ffffff')) }; var copyHexToRgb = function (form, hex) { var rgb = fromHex(hex); copyRgbToForm(form, rgb); setValueRgb(rgb); }; var get = function (prop) { return state[prop].get(); }; var set = function (prop, value) { state[prop].set(value); }; var getValueRgb = function () { return get('red').bind(function (red) { return get('green').bind(function (green) { return get('blue').map(function (blue) { return rgbaColour(red, green, blue, 1); }); }); }); }; var setValueRgb = function (rgb) { var red = rgb.red; var green = rgb.green; var blue = rgb.blue; set('red', Optional.some(red)); set('green', Optional.some(green)); set('blue', Optional.some(blue)); }; var onInvalidInput = function (form, simulatedEvent) { var data = simulatedEvent.event; if (data.type !== 'hex') { set(data.type, Optional.none()); } else { onInvalidHexx(form); } }; var onValidHex = function (form, value) { onValidHexx(form); var hex = hexColour(value); set('hex', Optional.some(value)); var rgb = fromHex(hex); copyRgbToForm(form, rgb); setValueRgb(rgb); emitWith(form, fieldsUpdate, { hex: hex }); updatePreview(form, hex); }; var onValidRgb = function (form, prop, value) { var val = parseInt(value, 10); set(prop, Optional.some(val)); getValueRgb().each(function (rgb) { var hex = copyRgbToHex(form, rgb); emitWith(form, fieldsUpdate, { hex: hex }); updatePreview(form, hex); }); }; var isHexInputEvent = function (data) { return data.type === 'hex'; }; var onValidInput = function (form, simulatedEvent) { var data = simulatedEvent.event; if (isHexInputEvent(data)) { onValidHex(form, data.value); } else { onValidRgb(form, data.type, data.value); } }; var formPartStrings = function (key) { return { label: translate(translatePrefix + key + '.label'), description: translate(translatePrefix + key + '.description') }; }; var redStrings = formPartStrings('red'); var greenStrings = formPartStrings('green'); var blueStrings = formPartStrings('blue'); var hexStrings = formPartStrings('hex'); return deepMerge(Form.sketch(function (parts) { return { dom: { tag: 'form', classes: [getClass('rgb-form')], attributes: { 'aria-label': translate('aria.color.picker') } }, components: [ parts.field('red', FormField.sketch(renderTextField(isRgbaComponent, 'red', redStrings.label, redStrings.description, 255))), parts.field('green', FormField.sketch(renderTextField(isRgbaComponent, 'green', greenStrings.label, greenStrings.description, 255))), parts.field('blue', FormField.sketch(renderTextField(isRgbaComponent, 'blue', blueStrings.label, blueStrings.description, 255))), parts.field('hex', FormField.sketch(renderTextField(isHexString, 'hex', hexStrings.label, hexStrings.description, 'ffffff'))), memPreview.asSpec() ], formBehaviours: derive$1([ Invalidating.config({ invalidClass: getClass('form-invalid') }), config('rgb-form-events', [ run(validInput, onValidInput), run(invalidInput, onInvalidInput), run(validatingInput, onInvalidInput) ]) ]) }; }), { apis: { updateHex: function (form, hex) { Representing.setValue(form, { hex: hex.value }); copyHexToRgb(form, hex); updatePreview(form, hex); } } }); }; var rgbFormSketcher = single$2({ factory: factory, name: 'RgbForm', configFields: [], apis: { updateHex: function (apis, form, hex) { apis.updateHex(form, hex); } }, extraApis: {} }); return rgbFormSketcher; }; var paletteFactory = function (_translate, getClass) { var spectrumPart = Slider.parts.spectrum({ dom: { tag: 'canvas', attributes: { role: 'presentation' }, classes: [getClass('sv-palette-spectrum')] } }); var thumbPart = Slider.parts.thumb({ dom: { tag: 'div', attributes: { role: 'presentation' }, classes: [getClass('sv-palette-thumb')], innerHtml: '' } }); var setColour = function (canvas, rgba) { var width = canvas.width, height = canvas.height; var ctx = canvas.getContext('2d'); if (ctx === null) { return; } ctx.fillStyle = rgba; ctx.fillRect(0, 0, width, height); var grdWhite = ctx.createLinearGradient(0, 0, width, 0); grdWhite.addColorStop(0, 'rgba(255,255,255,1)'); grdWhite.addColorStop(1, 'rgba(255,255,255,0)'); ctx.fillStyle = grdWhite; ctx.fillRect(0, 0, width, height); var grdBlack = ctx.createLinearGradient(0, 0, 0, height); grdBlack.addColorStop(0, 'rgba(0,0,0,0)'); grdBlack.addColorStop(1, 'rgba(0,0,0,1)'); ctx.fillStyle = grdBlack; ctx.fillRect(0, 0, width, height); }; var setPaletteHue = function (slider, hue) { var canvas = slider.components()[0].element.dom; var hsv = hsvColour(hue, 100, 100); var rgba = fromHsv(hsv); setColour(canvas, toString(rgba)); }; var setPaletteThumb = function (slider, hex) { var hsv = fromRgb(fromHex(hex)); Slider.setValue(slider, { x: hsv.saturation, y: 100 - hsv.value }); }; var factory = function (_detail) { var getInitialValue = constant({ x: 0, y: 0 }); var onChange = function (slider, _thumb, value) { emitWith(slider, paletteUpdate, { value: value }); }; var onInit = function (_slider, _thumb, spectrum, _value) { setColour(spectrum.element.dom, toString(red)); }; var sliderBehaviours = derive$1([ Composing.config({ find: Optional.some }), Focusing.config({}) ]); return Slider.sketch({ dom: { tag: 'div', attributes: { role: 'presentation' }, classes: [getClass('sv-palette')] }, model: { mode: 'xy', getInitialValue: getInitialValue }, rounded: false, components: [ spectrumPart, thumbPart ], onChange: onChange, onInit: onInit, sliderBehaviours: sliderBehaviours }); }; var saturationBrightnessPaletteSketcher = single$2({ factory: factory, name: 'SaturationBrightnessPalette', configFields: [], apis: { setHue: function (_apis, slider, hue) { setPaletteHue(slider, hue); }, setThumb: function (_apis, slider, hex) { setPaletteThumb(slider, hex); } }, extraApis: {} }); return saturationBrightnessPaletteSketcher; }; var makeFactory = function (translate, getClass) { var factory = function (detail) { var rgbForm = rgbFormFactory(translate, getClass, detail.onValidHex, detail.onInvalidHex); var sbPalette = paletteFactory(translate, getClass); var hueSliderToDegrees = function (hue) { return (100 - hue) / 100 * 360; }; var hueDegreesToSlider = function (hue) { return 100 - hue / 360 * 100; }; var state = { paletteRgba: Cell(red), paletteHue: Cell(0) }; var memSlider = record(sliderFactory(translate, getClass)); var memPalette = record(sbPalette.sketch({})); var memRgb = record(rgbForm.sketch({})); var updatePalette = function (anyInSystem, _hex, hue) { memPalette.getOpt(anyInSystem).each(function (palette) { sbPalette.setHue(palette, hue); }); }; var updateFields = function (anyInSystem, hex) { memRgb.getOpt(anyInSystem).each(function (form) { rgbForm.updateHex(form, hex); }); }; var updateSlider = function (anyInSystem, _hex, hue) { memSlider.getOpt(anyInSystem).each(function (slider) { Slider.setValue(slider, { y: hueDegreesToSlider(hue) }); }); }; var updatePaletteThumb = function (anyInSystem, hex) { memPalette.getOpt(anyInSystem).each(function (palette) { sbPalette.setThumb(palette, hex); }); }; var updateState = function (hex, hue) { var rgba = fromHex(hex); state.paletteRgba.set(rgba); state.paletteHue.set(hue); }; var runUpdates = function (anyInSystem, hex, hue, updates) { updateState(hex, hue); each(updates, function (update) { update(anyInSystem, hex, hue); }); }; var onPaletteUpdate = function () { var updates = [updateFields]; return function (form, simulatedEvent) { var value = simulatedEvent.event.value; var oldHue = state.paletteHue.get(); var newHsv = hsvColour(oldHue, value.x, 100 - value.y); var newHex = hsvToHex(newHsv); runUpdates(form, newHex, oldHue, updates); }; }; var onSliderUpdate = function () { var updates = [ updatePalette, updateFields ]; return function (form, simulatedEvent) { var hue = hueSliderToDegrees(simulatedEvent.event.value.y); var oldRgb = state.paletteRgba.get(); var oldHsv = fromRgb(oldRgb); var newHsv = hsvColour(hue, oldHsv.saturation, oldHsv.value); var newHex = hsvToHex(newHsv); runUpdates(form, newHex, hue, updates); }; }; var onFieldsUpdate = function () { var updates = [ updatePalette, updateSlider, updatePaletteThumb ]; return function (form, simulatedEvent) { var hex = simulatedEvent.event.hex; var hsv = hexToHsv(hex); runUpdates(form, hex, hsv.hue, updates); }; }; return { uid: detail.uid, dom: detail.dom, components: [ memPalette.asSpec(), memSlider.asSpec(), memRgb.asSpec() ], behaviours: derive$1([ config('colour-picker-events', [ run(fieldsUpdate, onFieldsUpdate()), run(paletteUpdate, onPaletteUpdate()), run(sliderUpdate, onSliderUpdate()) ]), Composing.config({ find: function (comp) { return memRgb.getOpt(comp); } }), Keying.config({ mode: 'acyclic' }) ]) }; }; var colourPickerSketcher = single$2({ name: 'ColourPicker', configFields: [ strict$1('dom'), defaulted$1('onValidHex', noop), defaulted$1('onInvalidHex', noop) ], factory: factory }); return colourPickerSketcher; }; var self$1 = function () { return Composing.config({ find: Optional.some }); }; var memento = function (mem) { return Composing.config({ find: mem.getOpt }); }; var childAt = function (index) { return Composing.config({ find: function (comp) { return child(comp.element, index).bind(function (element) { return comp.getSystem().getByDom(element).toOptional(); }); } }); }; var ComposingConfigs = { self: self$1, memento: memento, childAt: childAt }; var english = { 'colorcustom.rgb.red.label': 'R', 'colorcustom.rgb.red.description': 'Red component', 'colorcustom.rgb.green.label': 'G', 'colorcustom.rgb.green.description': 'Green component', 'colorcustom.rgb.blue.label': 'B', 'colorcustom.rgb.blue.description': 'Blue component', 'colorcustom.rgb.hex.label': '#', 'colorcustom.rgb.hex.description': 'Hex color code', 'colorcustom.rgb.range': 'Range 0 to 255', 'colorcustom.sb.saturation': 'Saturation', 'colorcustom.sb.brightness': 'Brightness', 'colorcustom.sb.picker': 'Saturation and Brightness Picker', 'colorcustom.sb.palette': 'Saturation and Brightness Palette', 'colorcustom.sb.instructions': 'Use arrow keys to select saturation and brightness, on x and y axes', 'colorcustom.hue.hue': 'Hue', 'colorcustom.hue.slider': 'Hue Slider', 'colorcustom.hue.palette': 'Hue Palette', 'colorcustom.hue.instructions': 'Use arrow keys to select a hue', 'aria.color.picker': 'Color Picker', 'aria.input.invalid': 'Invalid input' }; var getEnglishText = function (key) { return english[key]; }; var translate$1 = function (key) { return getEnglishText(key); }; var renderColorPicker = function (_spec) { var getClass = function (key) { return 'tox-' + key; }; var colourPickerFactory = makeFactory(translate$1, getClass); var onValidHex = function (form) { emitWith(form, formActionEvent, { name: 'hex-valid', value: true }); }; var onInvalidHex = function (form) { emitWith(form, formActionEvent, { name: 'hex-valid', value: false }); }; var memPicker = record(colourPickerFactory.sketch({ dom: { tag: 'div', classes: [getClass('color-picker-container')], attributes: { role: 'presentation' } }, onValidHex: onValidHex, onInvalidHex: onInvalidHex })); return { dom: { tag: 'div' }, components: [memPicker.asSpec()], behaviours: derive$1([ Representing.config({ store: { mode: 'manual', getValue: function (comp) { var picker = memPicker.get(comp); var optRgbForm = Composing.getCurrent(picker); var optHex = optRgbForm.bind(function (rgbForm) { var formValues = Representing.getValue(rgbForm); return formValues.hex; }); return optHex.map(function (hex) { return '#' + hex; }).getOr(''); }, setValue: function (comp, newValue) { var pattern = /^#([a-fA-F0-9]{3}(?:[a-fA-F0-9]{3})?)/; var m = pattern.exec(newValue); var picker = memPicker.get(comp); var optRgbForm = Composing.getCurrent(picker); optRgbForm.fold(function () { console.log('Can not find form'); }, function (rgbForm) { Representing.setValue(rgbForm, { hex: Optional.from(m[1]).getOr('') }); Form.getField(rgbForm, 'hex').each(function (hexField) { emit(hexField, input()); }); }); } } }), ComposingConfigs.self() ]) }; }; var global$b = tinymce.util.Tools.resolve('tinymce.Resource'); var isOldCustomEditor = function (spec) { return Object.prototype.hasOwnProperty.call(spec, 'init'); }; var renderCustomEditor = function (spec) { var editorApi = Cell(Optional.none()); var memReplaced = record({ dom: { tag: spec.tag } }); var initialValue = Cell(Optional.none()); return { dom: { tag: 'div', classes: ['tox-custom-editor'] }, behaviours: derive$1([ config('custom-editor-events', [runOnAttached(function (component) { memReplaced.getOpt(component).each(function (ta) { (isOldCustomEditor(spec) ? spec.init(ta.element.dom) : global$b.load(spec.scriptId, spec.scriptUrl).then(function (init) { return init(ta.element.dom, spec.settings); })).then(function (ea) { initialValue.get().each(function (cvalue) { ea.setValue(cvalue); }); initialValue.set(Optional.none()); editorApi.set(Optional.some(ea)); }); }); })]), Representing.config({ store: { mode: 'manual', getValue: function () { return editorApi.get().fold(function () { return initialValue.get().getOr(''); }, function (ed) { return ed.getValue(); }); }, setValue: function (component, value) { editorApi.get().fold(function () { initialValue.set(Optional.some(value)); }, function (ed) { return ed.setValue(value); }); } } }), ComposingConfigs.self() ]), components: [memReplaced.asSpec()] }; }; var global$c = tinymce.util.Tools.resolve('tinymce.util.Tools'); var processors = objOf([ defaulted$1('preprocess', identity), defaulted$1('postprocess', identity) ]); var memento$1 = function (mem, rawProcessors) { var ps = asRawOrDie('RepresentingConfigs.memento processors', processors, rawProcessors); return Representing.config({ store: { mode: 'manual', getValue: function (comp) { var other = mem.get(comp); var rawValue = Representing.getValue(other); return ps.postprocess(rawValue); }, setValue: function (comp, rawValue) { var newValue = ps.preprocess(rawValue); var other = mem.get(comp); Representing.setValue(other, newValue); } } }); }; var withComp = function (optInitialValue, getter, setter) { return Representing.config(deepMerge({ store: { mode: 'manual', getValue: getter, setValue: setter } }, optInitialValue.map(function (initialValue) { return { store: { initialValue: initialValue } }; }).getOr({}))); }; var withElement = function (initialValue, getter, setter) { return withComp(initialValue, function (c) { return getter(c.element); }, function (c, v) { return setter(c.element, v); }); }; var domValue = function (optInitialValue) { return withElement(optInitialValue, get$6, set$3); }; var domHtml = function (optInitialValue) { return withElement(optInitialValue, get$2, set); }; var memory$1 = function (initialValue) { return Representing.config({ store: { mode: 'memory', initialValue: initialValue } }); }; var RepresentingConfigs = { memento: memento$1, withElement: withElement, withComp: withComp, domValue: domValue, domHtml: domHtml, memory: memory$1 }; var defaultImageFileTypes = 'jpeg,jpg,jpe,jfi,jif,jfif,png,gif,bmp,webp'; var filterByExtension = function (files, providersBackstage) { var allowedImageFileTypes = global$c.explode(providersBackstage.getSetting('images_file_types', defaultImageFileTypes, 'string')); var isFileInAllowedTypes = function (file) { return exists(allowedImageFileTypes, function (type) { return endsWith(file.name.toLowerCase(), '.' + type.toLowerCase()); }); }; return filter(from$1(files), isFileInAllowedTypes); }; var renderDropZone = function (spec, providersBackstage) { var stopper = function (_, se) { se.stop(); }; var sequence = function (actions) { return function (comp, se) { each(actions, function (a) { a(comp, se); }); }; }; var onDrop = function (comp, se) { if (!Disabling.isDisabled(comp)) { var transferEvent = se.event.raw; handleFiles(comp, transferEvent.dataTransfer.files); } }; var onSelect = function (component, simulatedEvent) { var input = simulatedEvent.event.raw.target; handleFiles(component, input.files); }; var handleFiles = function (component, files) { Representing.setValue(component, filterByExtension(files, providersBackstage)); emitWith(component, formChangeEvent, { name: spec.name }); }; var memInput = record({ dom: { tag: 'input', attributes: { type: 'file', accept: 'image/*' }, styles: { display: 'none' } }, behaviours: derive$1([config('input-file-events', [ cutter(click()), cutter(tap()) ])]) }); var renderField = function (s) { return { uid: s.uid, dom: { tag: 'div', classes: ['tox-dropzone-container'] }, behaviours: derive$1([ RepresentingConfigs.memory([]), ComposingConfigs.self(), Disabling.config({}), Toggling.config({ toggleClass: 'dragenter', toggleOnExecute: false }), config('dropzone-events', [ run('dragenter', sequence([ stopper, Toggling.toggle ])), run('dragleave', sequence([ stopper, Toggling.toggle ])), run('dragover', stopper), run('drop', sequence([ stopper, onDrop ])), run(change(), onSelect) ]) ]), components: [{ dom: { tag: 'div', classes: ['tox-dropzone'], styles: {} }, components: [ { dom: { tag: 'p', innerHtml: providersBackstage.translate('Drop an image here') } }, Button.sketch({ dom: { tag: 'button', innerHtml: providersBackstage.translate('Browse for an image'), styles: { position: 'relative' }, classes: [ 'tox-button', 'tox-button--secondary' ] }, components: [memInput.asSpec()], action: function (comp) { var inputComp = memInput.get(comp); inputComp.element.dom.click(); }, buttonBehaviours: derive$1([ Tabstopping.config({}), DisablingConfigs.button(providersBackstage.isDisabled), receivingConfig() ]) }) ] }] }; }; var pLabel = spec.label.map(function (label) { return renderLabel(label, providersBackstage); }); var pField = FormField.parts.field({ factory: { sketch: renderField } }); return renderFormFieldWith(pLabel, pField, ['tox-form__group--stretched'], []); }; var renderGrid = function (spec, backstage) { return { dom: { tag: 'div', classes: [ 'tox-form__grid', 'tox-form__grid--' + spec.columns + 'col' ] }, components: map(spec.items, backstage.interpreter) }; }; var beforeObject = generate$1('alloy-fake-before-tabstop'); var afterObject = generate$1('alloy-fake-after-tabstop'); var craftWithClasses = function (classes) { return { dom: { tag: 'div', styles: { width: '1px', height: '1px', outline: 'none' }, attributes: { tabindex: '0' }, classes: classes }, behaviours: derive$1([ Focusing.config({ ignore: true }), Tabstopping.config({}) ]) }; }; var craft = function (spec) { return { dom: { tag: 'div', classes: ['tox-navobj'] }, components: [ craftWithClasses([beforeObject]), spec, craftWithClasses([afterObject]) ], behaviours: derive$1([ComposingConfigs.childAt(1)]) }; }; var triggerTab = function (placeholder, shiftKey) { emitWith(placeholder, keydown(), { raw: { which: 9, shiftKey: shiftKey } }); }; var onFocus$1 = function (container, targetComp) { var target = targetComp.element; if (has$2(target, beforeObject)) { triggerTab(container, true); } else if (has$2(target, afterObject)) { triggerTab(container, false); } }; var isPseudoStop = function (element) { return closest$4(element, [ '.' + beforeObject, '.' + afterObject ].join(','), never); }; var platformNeedsSandboxing = !(detect$3().browser.isIE() || detect$3().browser.isEdge()); var getDynamicSource = function (isSandbox) { var cachedValue = Cell(''); return { getValue: function (_frameComponent) { return cachedValue.get(); }, setValue: function (frameComponent, html) { if (!isSandbox) { set$1(frameComponent.element, 'src', 'javascript:\'\''); var doc = frameComponent.element.dom.contentWindow.document; doc.open(); doc.write(html); doc.close(); } else { set$1(frameComponent.element, 'srcdoc', html); } cachedValue.set(html); } }; }; var renderIFrame = function (spec, providersBackstage) { var isSandbox = platformNeedsSandboxing && spec.sandboxed; var attributes = __assign(__assign({}, spec.label.map(function (title) { return { title: title }; }).getOr({})), isSandbox ? { sandbox: 'allow-scripts allow-same-origin' } : {}); var sourcing = getDynamicSource(isSandbox); var pLabel = spec.label.map(function (label) { return renderLabel(label, providersBackstage); }); var factory = function (newSpec) { return craft({ uid: newSpec.uid, dom: { tag: 'iframe', attributes: attributes }, behaviours: derive$1([ Tabstopping.config({}), Focusing.config({}), RepresentingConfigs.withComp(Optional.none(), sourcing.getValue, sourcing.setValue) ]) }); }; var pField = FormField.parts.field({ factory: { sketch: factory } }); return renderFormFieldWith(pLabel, pField, ['tox-form__group--stretched'], []); }; var create$5 = function (width, height) { return resize(document.createElement('canvas'), width, height); }; var clone$1 = function (canvas) { var tCanvas = create$5(canvas.width, canvas.height); var ctx = get2dContext(tCanvas); ctx.drawImage(canvas, 0, 0); return tCanvas; }; var get2dContext = function (canvas) { return canvas.getContext('2d'); }; var resize = function (canvas, width, height) { canvas.width = width; canvas.height = height; return canvas; }; var getWidth = function (image) { return image.naturalWidth || image.width; }; var getHeight = function (image) { return image.naturalHeight || image.height; }; var promise = function () { var Promise = function (fn) { if (typeof this !== 'object') { throw new TypeError('Promises must be constructed via new'); } if (typeof fn !== 'function') { throw new TypeError('not a function'); } this._state = null; this._value = null; this._deferreds = []; doResolve(fn, bind(resolve, this), bind(reject, this)); }; var anyWindow = window; var asap = Promise.immediateFn || typeof anyWindow.setImmediate === 'function' && anyWindow.setImmediate || function (fn) { return setTimeout(fn, 1); }; var bind = function (fn, thisArg) { return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } return fn.apply(thisArg, args); }; }; var isArray = Array.isArray || function (value) { return Object.prototype.toString.call(value) === '[object Array]'; }; function handle(deferred) { var me = this; if (this._state === null) { this._deferreds.push(deferred); return; } asap(function () { var cb = me._state ? deferred.onFulfilled : deferred.onRejected; if (cb === null) { (me._state ? deferred.resolve : deferred.reject)(me._value); return; } var ret; try { ret = cb(me._value); } catch (e) { deferred.reject(e); return; } deferred.resolve(ret); }); } function resolve(newValue) { try { if (newValue === this) { throw new TypeError('A promise cannot be resolved with itself.'); } if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) { var then = newValue.then; if (typeof then === 'function') { doResolve(bind(then, newValue), bind(resolve, this), bind(reject, this)); return; } } this._state = true; this._value = newValue; finale.call(this); } catch (e) { reject.call(this, e); } } function reject(newValue) { this._state = false; this._value = newValue; finale.call(this); } function finale() { for (var _i = 0, _a = this._deferreds; _i < _a.length; _i++) { var deferred = _a[_i]; handle.call(this, deferred); } this._deferreds = []; } function Handler(onFulfilled, onRejected, resolve, reject) { this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; this.onRejected = typeof onRejected === 'function' ? onRejected : null; this.resolve = resolve; this.reject = reject; } var doResolve = function (fn, onFulfilled, onRejected) { var done = false; try { fn(function (value) { if (done) { return; } done = true; onFulfilled(value); }, function (reason) { if (done) { return; } done = true; onRejected(reason); }); } catch (ex) { if (done) { return; } done = true; onRejected(ex); } }; Promise.prototype.catch = function (onRejected) { return this.then(null, onRejected); }; Promise.prototype.then = function (onFulfilled, onRejected) { var me = this; return new Promise(function (resolve, reject) { handle.call(me, new Handler(onFulfilled, onRejected, resolve, reject)); }); }; Promise.all = function () { var values = []; for (var _i = 0; _i < arguments.length; _i++) { values[_i] = arguments[_i]; } var args = Array.prototype.slice.call(values.length === 1 && isArray(values[0]) ? values[0] : values); return new Promise(function (resolve, reject) { if (args.length === 0) { return resolve([]); } var remaining = args.length; var res = function (i, val) { try { if (val && (typeof val === 'object' || typeof val === 'function')) { var then = val.then; if (typeof then === 'function') { then.call(val, function (val) { res(i, val); }, reject); return; } } args[i] = val; if (--remaining === 0) { resolve(args); } } catch (ex) { reject(ex); } }; for (var i = 0; i < args.length; i++) { res(i, args[i]); } }); }; Promise.resolve = function (value) { if (value && typeof value === 'object' && value.constructor === Promise) { return value; } return new Promise(function (resolve) { resolve(value); }); }; Promise.reject = function (reason) { return new Promise(function (resolve, reject) { reject(reason); }); }; Promise.race = function (values) { return new Promise(function (resolve, reject) { for (var _i = 0, values_1 = values; _i < values_1.length; _i++) { var value = values_1[_i]; value.then(resolve, reject); } }); }; return Promise; }; var Promise$1 = window.Promise ? window.Promise : promise(); var blobToImage = function (blob) { return new Promise$1(function (resolve, reject) { var blobUrl = URL.createObjectURL(blob); var image = new Image(); var removeListeners = function () { image.removeEventListener('load', loaded); image.removeEventListener('error', error); }; var loaded = function () { removeListeners(); resolve(image); }; var error = function () { removeListeners(); reject('Unable to load data of type ' + blob.type + ': ' + blobUrl); }; image.addEventListener('load', loaded); image.addEventListener('error', error); image.src = blobUrl; if (image.complete) { setTimeout(loaded, 0); } }); }; var dataUriToBlobSync = function (uri) { var data = uri.split(','); var matches = /data:([^;]+)/.exec(data[0]); if (!matches) { return Optional.none(); } var mimetype = matches[1]; var base64 = data[1]; var sliceSize = 1024; var byteCharacters = atob(base64); var bytesLength = byteCharacters.length; var slicesCount = Math.ceil(bytesLength / sliceSize); var byteArrays = new Array(slicesCount); for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) { var begin = sliceIndex * sliceSize; var end = Math.min(begin + sliceSize, bytesLength); var bytes = new Array(end - begin); for (var offset = begin, i = 0; offset < end; ++i, ++offset) { bytes[i] = byteCharacters[offset].charCodeAt(0); } byteArrays[sliceIndex] = new Uint8Array(bytes); } return Optional.some(new Blob(byteArrays, { type: mimetype })); }; var dataUriToBlob = function (uri) { return new Promise$1(function (resolve, reject) { dataUriToBlobSync(uri).fold(function () { reject('uri is not base64: ' + uri); }, resolve); }); }; var canvasToBlob = function (canvas, type, quality) { type = type || 'image/png'; if (isFunction(HTMLCanvasElement.prototype.toBlob)) { return new Promise$1(function (resolve, reject) { canvas.toBlob(function (blob) { if (blob) { resolve(blob); } else { reject(); } }, type, quality); }); } else { return dataUriToBlob(canvas.toDataURL(type, quality)); } }; var canvasToDataURL = function (canvas, type, quality) { type = type || 'image/png'; return canvas.toDataURL(type, quality); }; var blobToCanvas = function (blob) { return blobToImage(blob).then(function (image) { revokeImageUrl(image); var canvas = create$5(getWidth(image), getHeight(image)); var context = get2dContext(canvas); context.drawImage(image, 0, 0); return canvas; }); }; var blobToDataUri = function (blob) { return new Promise$1(function (resolve) { var reader = new FileReader(); reader.onloadend = function () { resolve(reader.result); }; reader.readAsDataURL(blob); }); }; var revokeImageUrl = function (image) { URL.revokeObjectURL(image.src); }; var create$6 = function (getCanvas, blob, uri) { var initialType = blob.type; var getType = constant(initialType); var toBlob = function () { return Promise$1.resolve(blob); }; var toDataURL = constant(uri); var toBase64 = function () { return uri.split(',')[1]; }; var toAdjustedBlob = function (type, quality) { return getCanvas.then(function (canvas) { return canvasToBlob(canvas, type, quality); }); }; var toAdjustedDataURL = function (type, quality) { return getCanvas.then(function (canvas) { return canvasToDataURL(canvas, type, quality); }); }; var toAdjustedBase64 = function (type, quality) { return toAdjustedDataURL(type, quality).then(function (dataurl) { return dataurl.split(',')[1]; }); }; var toCanvas = function () { return getCanvas.then(clone$1); }; return { getType: getType, toBlob: toBlob, toDataURL: toDataURL, toBase64: toBase64, toAdjustedBlob: toAdjustedBlob, toAdjustedDataURL: toAdjustedDataURL, toAdjustedBase64: toAdjustedBase64, toCanvas: toCanvas }; }; var fromBlob = function (blob) { return blobToDataUri(blob).then(function (uri) { return create$6(blobToCanvas(blob), blob, uri); }); }; var fromCanvas = function (canvas, type) { return canvasToBlob(canvas, type).then(function (blob) { return create$6(Promise$1.resolve(canvas), blob, canvas.toDataURL()); }); }; var blobToImageResult = function (blob) { return fromBlob(blob); }; var clamp$1 = function (value, min, max) { var parsedValue = typeof value === 'string' ? parseFloat(value) : value; if (parsedValue > max) { parsedValue = max; } else if (parsedValue < min) { parsedValue = min; } return parsedValue; }; var identity$1 = function () { return [ 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1 ]; }; var DELTA_INDEX = [ 0, 0.01, 0.02, 0.04, 0.05, 0.06, 0.07, 0.08, 0.1, 0.11, 0.12, 0.14, 0.15, 0.16, 0.17, 0.18, 0.2, 0.21, 0.22, 0.24, 0.25, 0.27, 0.28, 0.3, 0.32, 0.34, 0.36, 0.38, 0.4, 0.42, 0.44, 0.46, 0.48, 0.5, 0.53, 0.56, 0.59, 0.62, 0.65, 0.68, 0.71, 0.74, 0.77, 0.8, 0.83, 0.86, 0.89, 0.92, 0.95, 0.98, 1, 1.06, 1.12, 1.18, 1.24, 1.3, 1.36, 1.42, 1.48, 1.54, 1.6, 1.66, 1.72, 1.78, 1.84, 1.9, 1.96, 2, 2.12, 2.25, 2.37, 2.5, 2.62, 2.75, 2.87, 3, 3.2, 3.4, 3.6, 3.8, 4, 4.3, 4.7, 4.9, 5, 5.5, 6, 6.5, 6.8, 7, 7.3, 7.5, 7.8, 8, 8.4, 8.7, 9, 9.4, 9.6, 9.8, 10 ]; var multiply = function (matrix1, matrix2) { var col = []; var out = new Array(25); var val; for (var i = 0; i < 5; i++) { for (var j = 0; j < 5; j++) { col[j] = matrix2[j + i * 5]; } for (var j = 0; j < 5; j++) { val = 0; for (var k = 0; k < 5; k++) { val += matrix1[j + k * 5] * col[k]; } out[j + i * 5] = val; } } return out; }; var adjustContrast = function (matrix, value) { var x; value = clamp$1(value, -1, 1); value *= 100; if (value < 0) { x = 127 + value / 100 * 127; } else { x = value % 1; if (x === 0) { x = DELTA_INDEX[value]; } else { x = DELTA_INDEX[Math.floor(value)] * (1 - x) + DELTA_INDEX[Math.floor(value) + 1] * x; } x = x * 127 + 127; } return multiply(matrix, [ x / 127, 0, 0, 0, 0.5 * (127 - x), 0, x / 127, 0, 0, 0.5 * (127 - x), 0, 0, x / 127, 0, 0.5 * (127 - x), 0, 0, 0, 1, 0, 0, 0, 0, 0, 1 ]); }; var adjustBrightness = function (matrix, value) { value = clamp$1(255 * value, -255, 255); return multiply(matrix, [ 1, 0, 0, 0, value, 0, 1, 0, 0, value, 0, 0, 1, 0, value, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1 ]); }; var adjustColors = function (matrix, adjustR, adjustG, adjustB) { adjustR = clamp$1(adjustR, 0, 2); adjustG = clamp$1(adjustG, 0, 2); adjustB = clamp$1(adjustB, 0, 2); return multiply(matrix, [ adjustR, 0, 0, 0, 0, 0, adjustG, 0, 0, 0, 0, 0, adjustB, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1 ]); }; var colorFilter = function (ir, matrix) { return ir.toCanvas().then(function (canvas) { return applyColorFilter(canvas, ir.getType(), matrix); }); }; var applyColorFilter = function (canvas, type, matrix) { var context = get2dContext(canvas); var applyMatrix = function (pixelsData, m) { var r, g, b, a; var data = pixelsData.data, m0 = m[0], m1 = m[1], m2 = m[2], m3 = m[3], m4 = m[4], m5 = m[5], m6 = m[6], m7 = m[7], m8 = m[8], m9 = m[9], m10 = m[10], m11 = m[11], m12 = m[12], m13 = m[13], m14 = m[14], m15 = m[15], m16 = m[16], m17 = m[17], m18 = m[18], m19 = m[19]; for (var i = 0; i < data.length; i += 4) { r = data[i]; g = data[i + 1]; b = data[i + 2]; a = data[i + 3]; data[i] = r * m0 + g * m1 + b * m2 + a * m3 + m4; data[i + 1] = r * m5 + g * m6 + b * m7 + a * m8 + m9; data[i + 2] = r * m10 + g * m11 + b * m12 + a * m13 + m14; data[i + 3] = r * m15 + g * m16 + b * m17 + a * m18 + m19; } return pixelsData; }; var pixels = applyMatrix(context.getImageData(0, 0, canvas.width, canvas.height), matrix); context.putImageData(pixels, 0, 0); return fromCanvas(canvas, type); }; var convoluteFilter = function (ir, matrix) { return ir.toCanvas().then(function (canvas) { return applyConvoluteFilter(canvas, ir.getType(), matrix); }); }; var applyConvoluteFilter = function (canvas, type, matrix) { var context = get2dContext(canvas); var applyMatrix = function (pIn, pOut, aMatrix) { var clamp = function (value, min, max) { if (value > max) { value = max; } else if (value < min) { value = min; } return value; }; var side = Math.round(Math.sqrt(aMatrix.length)); var halfSide = Math.floor(side / 2); var rgba = pIn.data; var drgba = pOut.data; var w = pIn.width; var h = pIn.height; for (var y = 0; y < h; y++) { for (var x = 0; x < w; x++) { var r = 0; var g = 0; var b = 0; for (var cy = 0; cy < side; cy++) { for (var cx = 0; cx < side; cx++) { var scx = clamp(x + cx - halfSide, 0, w - 1); var scy = clamp(y + cy - halfSide, 0, h - 1); var innerOffset = (scy * w + scx) * 4; var wt = aMatrix[cy * side + cx]; r += rgba[innerOffset] * wt; g += rgba[innerOffset + 1] * wt; b += rgba[innerOffset + 2] * wt; } } var offset = (y * w + x) * 4; drgba[offset] = clamp(r, 0, 255); drgba[offset + 1] = clamp(g, 0, 255); drgba[offset + 2] = clamp(b, 0, 255); } } return pOut; }; var pixelsIn = context.getImageData(0, 0, canvas.width, canvas.height); var pixelsOut = context.getImageData(0, 0, canvas.width, canvas.height); pixelsOut = applyMatrix(pixelsIn, pixelsOut, matrix); context.putImageData(pixelsOut, 0, 0); return fromCanvas(canvas, type); }; var functionColorFilter = function (colorFn) { var filterImpl = function (canvas, type, value) { var context = get2dContext(canvas); var lookup = new Array(256); var applyLookup = function (pixelsData, lookupData) { var data = pixelsData.data; for (var i = 0; i < data.length; i += 4) { data[i] = lookupData[data[i]]; data[i + 1] = lookupData[data[i + 1]]; data[i + 2] = lookupData[data[i + 2]]; } return pixelsData; }; for (var i = 0; i < lookup.length; i++) { lookup[i] = colorFn(i, value); } var pixels = applyLookup(context.getImageData(0, 0, canvas.width, canvas.height), lookup); context.putImageData(pixels, 0, 0); return fromCanvas(canvas, type); }; return function (ir, value) { return ir.toCanvas().then(function (canvas) { return filterImpl(canvas, ir.getType(), value); }); }; }; var complexAdjustableColorFilter = function (matrixAdjustFn) { return function (ir, adjust) { return colorFilter(ir, matrixAdjustFn(identity$1(), adjust)); }; }; var basicColorFilter = function (matrix) { return function (ir) { return colorFilter(ir, matrix); }; }; var basicConvolutionFilter = function (kernel) { return function (ir) { return convoluteFilter(ir, kernel); }; }; var invert = basicColorFilter([ -1, 0, 0, 0, 255, 0, -1, 0, 0, 255, 0, 0, -1, 0, 255, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1 ]); var brightness = complexAdjustableColorFilter(adjustBrightness); var contrast = complexAdjustableColorFilter(adjustContrast); var colorize = function (ir, adjustR, adjustG, adjustB) { return colorFilter(ir, adjustColors(identity$1(), adjustR, adjustG, adjustB)); }; var sharpen = basicConvolutionFilter([ 0, -1, 0, -1, 5, -1, 0, -1, 0 ]); var gamma = functionColorFilter(function (color, value) { return Math.pow(color / 255, 1 - value) * 255; }); var scale = function (image, dW, dH) { var sW = getWidth(image); var sH = getHeight(image); var wRatio = dW / sW; var hRatio = dH / sH; var scaleCapped = false; if (wRatio < 0.5 || wRatio > 2) { wRatio = wRatio < 0.5 ? 0.5 : 2; scaleCapped = true; } if (hRatio < 0.5 || hRatio > 2) { hRatio = hRatio < 0.5 ? 0.5 : 2; scaleCapped = true; } var scaled = _scale(image, wRatio, hRatio); return !scaleCapped ? scaled : scaled.then(function (tCanvas) { return scale(tCanvas, dW, dH); }); }; var _scale = function (image, wRatio, hRatio) { return new Promise$1(function (resolve) { var sW = getWidth(image); var sH = getHeight(image); var dW = Math.floor(sW * wRatio); var dH = Math.floor(sH * hRatio); var canvas = create$5(dW, dH); var context = get2dContext(canvas); context.drawImage(image, 0, 0, sW, sH, 0, 0, dW, dH); resolve(canvas); }); }; var ceilWithPrecision = function (num, precision) { if (precision === void 0) { precision = 2; } var mul = Math.pow(10, precision); var upper = Math.round(num * mul); return Math.ceil(upper / mul); }; var rotate = function (ir, angle) { return ir.toCanvas().then(function (canvas) { return applyRotate(canvas, ir.getType(), angle); }); }; var applyRotate = function (image, type, angle) { var degrees = angle < 0 ? 360 + angle : angle; var rad = degrees * Math.PI / 180; var width = image.width; var height = image.height; var sin = Math.sin(rad); var cos = Math.cos(rad); var newWidth = ceilWithPrecision(Math.abs(width * cos) + Math.abs(height * sin)); var newHeight = ceilWithPrecision(Math.abs(width * sin) + Math.abs(height * cos)); var canvas = create$5(newWidth, newHeight); var context = get2dContext(canvas); context.translate(newWidth / 2, newHeight / 2); context.rotate(rad); context.drawImage(image, -width / 2, -height / 2); return fromCanvas(canvas, type); }; var flip = function (ir, axis) { return ir.toCanvas().then(function (canvas) { return applyFlip(canvas, ir.getType(), axis); }); }; var applyFlip = function (image, type, axis) { var canvas = create$5(image.width, image.height); var context = get2dContext(canvas); if (axis === 'v') { context.scale(1, -1); context.drawImage(image, 0, -canvas.height); } else { context.scale(-1, 1); context.drawImage(image, -canvas.width, 0); } return fromCanvas(canvas, type); }; var crop = function (ir, x, y, w, h) { return ir.toCanvas().then(function (canvas) { return applyCrop(canvas, ir.getType(), x, y, w, h); }); }; var applyCrop = function (image, type, x, y, w, h) { var canvas = create$5(w, h); var context = get2dContext(canvas); context.drawImage(image, -x, -y); return fromCanvas(canvas, type); }; var resize$1 = function (ir, w, h) { return ir.toCanvas().then(function (canvas) { return scale(canvas, w, h).then(function (newCanvas) { return fromCanvas(newCanvas, ir.getType()); }); }); }; var invert$1 = function (ir) { return invert(ir); }; var sharpen$1 = function (ir) { return sharpen(ir); }; var gamma$1 = function (ir, value) { return gamma(ir, value); }; var colorize$1 = function (ir, adjustR, adjustG, adjustB) { return colorize(ir, adjustR, adjustG, adjustB); }; var brightness$1 = function (ir, adjust) { return brightness(ir, adjust); }; var contrast$1 = function (ir, adjust) { return contrast(ir, adjust); }; var flip$1 = function (ir, axis) { return flip(ir, axis); }; var crop$1 = function (ir, x, y, w, h) { return crop(ir, x, y, w, h); }; var resize$2 = function (ir, w, h) { return resize$1(ir, w, h); }; var rotate$1 = function (ir, angle) { return rotate(ir, angle); }; var renderIcon$1 = function (iconHtml, behaviours) { return __assign({ dom: { tag: 'span', innerHtml: iconHtml, classes: [ 'tox-icon', 'tox-tbtn__icon-wrap' ] } }, behaviours); }; var renderIconFromPack = function (iconName, iconsProvider) { return renderIcon$1(get$e(iconName, iconsProvider), {}); }; var renderReplacableIconFromPack = function (iconName, iconsProvider) { return renderIcon$1(get$e(iconName, iconsProvider), { behaviours: derive$1([Replacing.config({})]) }); }; var renderLabel$1 = function (text, prefix, providersBackstage) { return { dom: { tag: 'span', innerHtml: providersBackstage.translate(text), classes: [prefix + '__select-label'] }, behaviours: derive$1([Replacing.config({})]) }; }; var _a$1; var internalToolbarButtonExecute = generate$1('toolbar.button.execute'); var onToolbarButtonExecute = function (info) { return runOnExecute(function (comp, _simulatedEvent) { runWithApi(info, comp)(function (itemApi) { emitWith(comp, internalToolbarButtonExecute, { buttonApi: itemApi }); info.onAction(itemApi); }); }); }; var toolbarButtonEventOrder = (_a$1 = {}, _a$1[execute()] = [ 'disabling', 'alloy.base.behaviour', 'toggling', 'toolbar-button-events' ], _a$1); var updateMenuText = generate$1('update-menu-text'); var updateMenuIcon = generate$1('update-menu-icon'); var renderCommonDropdown = function (spec, prefix, sharedBackstage) { var editorOffCell = Cell(noop); var optMemDisplayText = spec.text.map(function (text) { return record(renderLabel$1(text, prefix, sharedBackstage.providers)); }); var optMemDisplayIcon = spec.icon.map(function (iconName) { return record(renderReplacableIconFromPack(iconName, sharedBackstage.providers.icons)); }); var onLeftOrRightInMenu = function (comp, se) { var dropdown = Representing.getValue(comp); Focusing.focus(dropdown); emitWith(dropdown, 'keydown', { raw: se.event.raw }); Dropdown.close(dropdown); return Optional.some(true); }; var role = spec.role.fold(function () { return {}; }, function (role) { return { role: role }; }); var tooltipAttributes = spec.tooltip.fold(function () { return {}; }, function (tooltip) { var translatedTooltip = sharedBackstage.providers.translate(tooltip); return { 'title': translatedTooltip, 'aria-label': translatedTooltip }; }); var memDropdown = record(Dropdown.sketch(__assign(__assign(__assign({}, spec.uid ? { uid: spec.uid } : {}), role), { dom: { tag: 'button', classes: [ prefix, prefix + '--select' ].concat(map(spec.classes, function (c) { return prefix + '--' + c; })), attributes: __assign({}, tooltipAttributes) }, components: componentRenderPipeline([ optMemDisplayIcon.map(function (mem) { return mem.asSpec(); }), optMemDisplayText.map(function (mem) { return mem.asSpec(); }), Optional.some({ dom: { tag: 'div', classes: [prefix + '__select-chevron'], innerHtml: get$e('chevron-down', sharedBackstage.providers.icons) } }) ]), matchWidth: true, useMinWidth: true, dropdownBehaviours: derive$1(__spreadArrays(spec.dropdownBehaviours, [ DisablingConfigs.button(function () { return spec.disabled || sharedBackstage.providers.isDisabled(); }), receivingConfig(), Unselecting.config({}), Replacing.config({}), config('dropdown-events', [ onControlAttached(spec, editorOffCell), onControlDetached(spec, editorOffCell) ]), config('menubutton-update-display-text', [ run(updateMenuText, function (comp, se) { optMemDisplayText.bind(function (mem) { return mem.getOpt(comp); }).each(function (displayText) { Replacing.set(displayText, [text(sharedBackstage.providers.translate(se.event.text))]); }); }), run(updateMenuIcon, function (comp, se) { optMemDisplayIcon.bind(function (mem) { return mem.getOpt(comp); }).each(function (displayIcon) { Replacing.set(displayIcon, [renderReplacableIconFromPack(se.event.icon, sharedBackstage.providers.icons)]); }); }) ]) ])), eventOrder: deepMerge(toolbarButtonEventOrder, { mousedown: [ 'focusing', 'alloy.base.behaviour', 'item-type-events', 'normal-dropdown-events' ] }), sandboxBehaviours: derive$1([Keying.config({ mode: 'special', onLeft: onLeftOrRightInMenu, onRight: onLeftOrRightInMenu })]), lazySink: sharedBackstage.getSink, toggleClass: prefix + '--active', parts: { menu: part(false, spec.columns, spec.presets) }, fetch: function (comp) { return Future.nu(curry(spec.fetch, comp)); } }))); return memDropdown.asSpec(); }; var isMenuItemReference = function (item) { return isString(item); }; var isSeparator = function (item) { return item.type === 'separator'; }; var isExpandingMenuItem = function (item) { return has(item, 'getSubmenuItems'); }; var separator$1 = { type: 'separator' }; var unwrapReferences = function (items, menuItems) { var realItems = foldl(items, function (acc, item) { if (isMenuItemReference(item)) { if (item === '') { return acc; } else if (item === '|') { return acc.length > 0 && !isSeparator(acc[acc.length - 1]) ? acc.concat([separator$1]) : acc; } else if (has(menuItems, item.toLowerCase())) { return acc.concat([menuItems[item.toLowerCase()]]); } else { return acc; } } else { return acc.concat([item]); } }, []); if (realItems.length > 0 && isSeparator(realItems[realItems.length - 1])) { realItems.pop(); } return realItems; }; var getFromExpandingItem = function (item, menuItems) { var submenuItems = item.getSubmenuItems(); var rest = expand(submenuItems, menuItems); var newMenus = deepMerge(rest.menus, wrap$1(item.value, rest.items)); var newExpansions = deepMerge(rest.expansions, wrap$1(item.value, item.value)); return { item: item, menus: newMenus, expansions: newExpansions }; }; var getFromItem = function (item, menuItems) { return isExpandingMenuItem(item) ? getFromExpandingItem(item, menuItems) : { item: item, menus: {}, expansions: {} }; }; var generateValueIfRequired = function (item) { if (isSeparator(item)) { return item; } else { var itemValue = get$1(item, 'value').getOrThunk(function () { return generate$1('generated-menu-item'); }); return deepMerge({ value: itemValue }, item); } }; var expand = function (items, menuItems) { var realItems = unwrapReferences(isString(items) ? items.split(' ') : items, menuItems); return foldr(realItems, function (acc, item) { var itemWithValue = generateValueIfRequired(item); var newData = getFromItem(itemWithValue, menuItems); return { menus: deepMerge(acc.menus, newData.menus), items: [newData.item].concat(acc.items), expansions: deepMerge(acc.expansions, newData.expansions) }; }, { menus: {}, expansions: {}, items: [] }); }; var build$2 = function (items, itemResponse, backstage, isHorizontalMenu) { var primary = generate$1('primary-menu'); var data = expand(items, backstage.shared.providers.menuItems()); if (data.items.length === 0) { return Optional.none(); } var mainMenu = createPartialMenu(primary, data.items, itemResponse, backstage, isHorizontalMenu); var submenus = map$2(data.menus, function (menuItems, menuName) { return createPartialMenu(menuName, menuItems, itemResponse, backstage, false); }); var menus = deepMerge(submenus, wrap$1(primary, mainMenu)); return Optional.from(tieredMenu.tieredData(primary, menus, data.expansions)); }; var getMenuButtonApi = function (component) { return { isDisabled: function () { return Disabling.isDisabled(component); }, setDisabled: function (state) { return Disabling.set(component, state); }, setActive: function (state) { var elm = component.element; if (state) { add$2(elm, 'tox-tbtn--enabled'); set$1(elm, 'aria-pressed', true); } else { remove$4(elm, 'tox-tbtn--enabled'); remove$1(elm, 'aria-pressed'); } }, isActive: function () { return has$2(component.element, 'tox-tbtn--enabled'); } }; }; var renderMenuButton = function (spec, prefix, backstage, role) { return renderCommonDropdown({ text: spec.text, icon: spec.icon, tooltip: spec.tooltip, role: role, fetch: function (_comp, callback) { spec.fetch(function (items) { callback(build$2(items, ItemResponse$1.CLOSE_ON_EXECUTE, backstage, false)); }); }, onSetup: spec.onSetup, getApi: getMenuButtonApi, columns: 1, presets: 'normal', classes: [], dropdownBehaviours: [Tabstopping.config({})] }, prefix, backstage.shared); }; var getFetch$1 = function (items, getButton, backstage) { var getMenuItemAction = function (item) { return function (api) { var newValue = !api.isActive(); api.setActive(newValue); item.storage.set(newValue); backstage.shared.getSink().each(function (sink) { getButton().getOpt(sink).each(function (orig) { focus$1(orig.element); emitWith(orig, formActionEvent, { name: item.name, value: item.storage.get() }); }); }); }; }; var getMenuItemSetup = function (item) { return function (api) { api.setActive(item.storage.get()); }; }; return function (success) { success(map(items, function (item) { var text = item.text.fold(function () { return {}; }, function (text) { return { text: text }; }); return __assign(__assign({ type: item.type, active: false }, text), { onAction: getMenuItemAction(item), onSetup: getMenuItemSetup(item) }); })); }; }; var renderCommonSpec = function (spec, actionOpt, extraBehaviours, dom, components, providersBackstage) { if (extraBehaviours === void 0) { extraBehaviours = []; } var action = actionOpt.fold(function () { return {}; }, function (action) { return { action: action }; }); var common = __assign({ buttonBehaviours: derive$1([ DisablingConfigs.button(function () { return spec.disabled || providersBackstage.isDisabled(); }), receivingConfig(), Tabstopping.config({}), config('button press', [ preventDefault('click'), preventDefault('mousedown') ]) ].concat(extraBehaviours)), eventOrder: { click: [ 'button press', 'alloy.base.behaviour' ], mousedown: [ 'button press', 'alloy.base.behaviour' ] } }, action); var domFinal = deepMerge(common, { dom: dom }); return deepMerge(domFinal, { components: components }); }; var renderIconButtonSpec = function (spec, action, providersBackstage, extraBehaviours) { if (extraBehaviours === void 0) { extraBehaviours = []; } var tooltipAttributes = spec.tooltip.map(function (tooltip) { return { 'aria-label': providersBackstage.translate(tooltip), 'title': providersBackstage.translate(tooltip) }; }).getOr({}); var dom = { tag: 'button', classes: ['tox-tbtn'], attributes: tooltipAttributes }; var icon = spec.icon.map(function (iconName) { return renderIconFromPack(iconName, providersBackstage.icons); }); var components = componentRenderPipeline([icon]); return renderCommonSpec(spec, action, extraBehaviours, dom, components, providersBackstage); }; var renderIconButton = function (spec, action, providersBackstage, extraBehaviours) { if (extraBehaviours === void 0) { extraBehaviours = []; } var iconButtonSpec = renderIconButtonSpec(spec, Optional.some(action), providersBackstage, extraBehaviours); return Button.sketch(iconButtonSpec); }; var renderButtonSpec = function (spec, action, providersBackstage, extraBehaviours, extraClasses) { if (extraBehaviours === void 0) { extraBehaviours = []; } if (extraClasses === void 0) { extraClasses = []; } var translatedText = providersBackstage.translate(spec.text); var icon = spec.icon ? spec.icon.map(function (iconName) { return renderIconFromPack(iconName, providersBackstage.icons); }) : Optional.none(); var components = icon.isSome() ? componentRenderPipeline([icon]) : []; var innerHtml = icon.isSome() ? {} : { innerHtml: translatedText }; var classes = __spreadArrays(!spec.primary && !spec.borderless ? [ 'tox-button', 'tox-button--secondary' ] : ['tox-button'], icon.isSome() ? ['tox-button--icon'] : [], spec.borderless ? ['tox-button--naked'] : [], extraClasses); var dom = __assign(__assign({ tag: 'button', classes: classes }, innerHtml), { attributes: { title: translatedText } }); return renderCommonSpec(spec, action, extraBehaviours, dom, components, providersBackstage); }; var renderButton = function (spec, action, providersBackstage, extraBehaviours, extraClasses) { if (extraBehaviours === void 0) { extraBehaviours = []; } if (extraClasses === void 0) { extraClasses = []; } var buttonSpec = renderButtonSpec(spec, Optional.some(action), providersBackstage, extraBehaviours, extraClasses); return Button.sketch(buttonSpec); }; var getAction = function (name, buttonType) { return function (comp) { if (buttonType === 'custom') { emitWith(comp, formActionEvent, { name: name, value: {} }); } else if (buttonType === 'submit') { emit(comp, formSubmitEvent); } else if (buttonType === 'cancel') { emit(comp, formCancelEvent); } else { console.error('Unknown button type: ', buttonType); } }; }; var isMenuFooterButtonSpec = function (spec, buttonType) { return buttonType === 'menu'; }; var isNormalFooterButtonSpec = function (spec, buttonType) { return buttonType === 'custom' || buttonType === 'cancel' || buttonType === 'submit'; }; var renderFooterButton = function (spec, buttonType, backstage) { if (isMenuFooterButtonSpec(spec, buttonType)) { var getButton = function () { return memButton_1; }; var menuButtonSpec = spec; var fixedSpec = __assign(__assign({}, spec), { onSetup: function (api) { api.setDisabled(spec.disabled); return noop; }, fetch: getFetch$1(menuButtonSpec.items, getButton, backstage) }); var memButton_1 = record(renderMenuButton(fixedSpec, 'tox-tbtn', backstage, Optional.none())); return memButton_1.asSpec(); } else if (isNormalFooterButtonSpec(spec, buttonType)) { var action = getAction(spec.name, buttonType); var buttonSpec = __assign(__assign({}, spec), { borderless: false }); return renderButton(buttonSpec, action, backstage.shared.providers, []); } else { console.error('Unknown footer button type: ', buttonType); } }; var renderDialogButton = function (spec, providersBackstage) { var action = getAction(spec.name, 'custom'); return renderFormField(Optional.none(), FormField.parts.field(__assign({ factory: Button }, renderButtonSpec(spec, Optional.some(action), providersBackstage, [ RepresentingConfigs.memory(''), ComposingConfigs.self() ])))); }; var schema$i = constant([ defaulted$1('field1Name', 'field1'), defaulted$1('field2Name', 'field2'), onStrictHandler('onLockedChange'), markers(['lockClass']), defaulted$1('locked', false), SketchBehaviours.field('coupledFieldBehaviours', [ Composing, Representing ]) ]); var getField = function (comp, detail, partName) { return getPart(comp, detail, partName).bind(Composing.getCurrent); }; var coupledPart = function (selfName, otherName) { return required({ factory: FormField, name: selfName, overrides: function (detail) { return { fieldBehaviours: derive$1([config('coupled-input-behaviour', [run(input(), function (me) { getField(me, detail, otherName).each(function (other) { getPart(me, detail, 'lock').each(function (lock) { if (Toggling.isOn(lock)) { detail.onLockedChange(me, other, lock); } }); }); })])]) }; } }); }; var parts$5 = constant([ coupledPart('field1', 'field2'), coupledPart('field2', 'field1'), required({ factory: Button, schema: [strict$1('dom')], name: 'lock', overrides: function (detail) { return { buttonBehaviours: derive$1([Toggling.config({ selected: detail.locked, toggleClass: detail.markers.lockClass, aria: { mode: 'pressed' } })]) }; } }) ]); var factory$7 = function (detail, components, _spec, _externals) { return { uid: detail.uid, dom: detail.dom, components: components, behaviours: SketchBehaviours.augment(detail.coupledFieldBehaviours, [ Composing.config({ find: Optional.some }), Representing.config({ store: { mode: 'manual', getValue: function (comp) { var _a; var parts = getPartsOrDie(comp, detail, [ 'field1', 'field2' ]); return _a = {}, _a[detail.field1Name] = Representing.getValue(parts.field1()), _a[detail.field2Name] = Representing.getValue(parts.field2()), _a; }, setValue: function (comp, value) { var parts = getPartsOrDie(comp, detail, [ 'field1', 'field2' ]); if (hasNonNullableKey(value, detail.field1Name)) { Representing.setValue(parts.field1(), value[detail.field1Name]); } if (hasNonNullableKey(value, detail.field2Name)) { Representing.setValue(parts.field2(), value[detail.field2Name]); } } } }) ]), apis: { getField1: function (component) { return getPart(component, detail, 'field1'); }, getField2: function (component) { return getPart(component, detail, 'field2'); }, getLock: function (component) { return getPart(component, detail, 'lock'); } } }; }; var FormCoupledInputs = composite$1({ name: 'FormCoupledInputs', configFields: schema$i(), partFields: parts$5(), factory: factory$7, apis: { getField1: function (apis, component) { return apis.getField1(component); }, getField2: function (apis, component) { return apis.getField2(component); }, getLock: function (apis, component) { return apis.getLock(component); } } }); var formatSize = function (size) { var unitDec = { '': 0, 'px': 0, 'pt': 1, 'mm': 1, 'pc': 2, 'ex': 2, 'em': 2, 'ch': 2, 'rem': 2, 'cm': 3, 'in': 4, '%': 4 }; var maxDecimal = function (unit) { return unit in unitDec ? unitDec[unit] : 1; }; var numText = size.value.toFixed(maxDecimal(size.unit)); if (numText.indexOf('.') !== -1) { numText = numText.replace(/\.?0*$/, ''); } return numText + size.unit; }; var parseSize = function (sizeText) { var numPattern = /^\s*(\d+(?:\.\d+)?)\s*(|cm|mm|in|px|pt|pc|em|ex|ch|rem|vw|vh|vmin|vmax|%)\s*$/; var match = numPattern.exec(sizeText); if (match !== null) { var value = parseFloat(match[1]); var unit = match[2]; return Result.value({ value: value, unit: unit }); } else { return Result.error(sizeText); } }; var convertUnit = function (size, unit) { var inInch = { '': 96, 'px': 96, 'pt': 72, 'cm': 2.54, 'pc': 12, 'mm': 25.4, 'in': 1 }; var supported = function (u) { return Object.prototype.hasOwnProperty.call(inInch, u); }; if (size.unit === unit) { return Optional.some(size.value); } else if (supported(size.unit) && supported(unit)) { if (inInch[size.unit] === inInch[unit]) { return Optional.some(size.value); } else { return Optional.some(size.value / inInch[size.unit] * inInch[unit]); } } else { return Optional.none(); } }; var noSizeConversion = function (_input) { return Optional.none(); }; var ratioSizeConversion = function (scale, unit) { return function (size) { return convertUnit(size, unit).map(function (value) { return { value: value * scale, unit: unit }; }); }; }; var makeRatioConverter = function (currentFieldText, otherFieldText) { var cValue = parseSize(currentFieldText).toOptional(); var oValue = parseSize(otherFieldText).toOptional(); return lift2(cValue, oValue, function (cSize, oSize) { return convertUnit(cSize, oSize.unit).map(function (val) { return oSize.value / val; }).map(function (r) { return ratioSizeConversion(r, oSize.unit); }).getOr(noSizeConversion); }).getOr(noSizeConversion); }; var renderSizeInput = function (spec, providersBackstage) { var converter = noSizeConversion; var ratioEvent = generate$1('ratio-event'); var pLock = FormCoupledInputs.parts.lock({ dom: { tag: 'button', classes: [ 'tox-lock', 'tox-button', 'tox-button--naked', 'tox-button--icon' ], attributes: { title: providersBackstage.translate(spec.label.getOr('Constrain proportions')) } }, components: [ { dom: { tag: 'span', classes: [ 'tox-icon', 'tox-lock-icon__lock' ], innerHtml: get$e('lock', providersBackstage.icons) } }, { dom: { tag: 'span', classes: [ 'tox-icon', 'tox-lock-icon__unlock' ], innerHtml: get$e('unlock', providersBackstage.icons) } } ], buttonBehaviours: derive$1([ Disabling.config({ disabled: function () { return spec.disabled || providersBackstage.isDisabled(); } }), receivingConfig(), Tabstopping.config({}) ]) }); var formGroup = function (components) { return { dom: { tag: 'div', classes: ['tox-form__group'] }, components: components }; }; var getFieldPart = function (isField1) { return FormField.parts.field({ factory: Input, inputClasses: ['tox-textfield'], inputBehaviours: derive$1([ Disabling.config({ disabled: function () { return spec.disabled || providersBackstage.isDisabled(); } }), receivingConfig(), Tabstopping.config({}), config('size-input-events', [ run(focusin(), function (component, _simulatedEvent) { emitWith(component, ratioEvent, { isField1: isField1 }); }), run(change(), function (component, _simulatedEvent) { emitWith(component, formChangeEvent, { name: spec.name }); }) ]) ]), selectOnFocus: false }); }; var getLabel = function (label) { return { dom: { tag: 'label', classes: ['tox-label'], innerHtml: providersBackstage.translate(label) } }; }; var widthField = FormCoupledInputs.parts.field1(formGroup([ FormField.parts.label(getLabel('Width')), getFieldPart(true) ])); var heightField = FormCoupledInputs.parts.field2(formGroup([ FormField.parts.label(getLabel('Height')), getFieldPart(false) ])); return FormCoupledInputs.sketch({ dom: { tag: 'div', classes: ['tox-form__group'] }, components: [{ dom: { tag: 'div', classes: ['tox-form__controls-h-stack'] }, components: [ widthField, heightField, formGroup([ getLabel(' '), pLock ]) ] }], field1Name: 'width', field2Name: 'height', locked: true, markers: { lockClass: 'tox-locked' }, onLockedChange: function (current, other, _lock) { parseSize(Representing.getValue(current)).each(function (size) { converter(size).each(function (newSize) { Representing.setValue(other, formatSize(newSize)); }); }); }, coupledFieldBehaviours: derive$1([ Disabling.config({ disabled: function () { return spec.disabled || providersBackstage.isDisabled(); }, onDisabled: function (comp) { FormCoupledInputs.getField1(comp).bind(FormField.getField).each(Disabling.disable); FormCoupledInputs.getField2(comp).bind(FormField.getField).each(Disabling.disable); FormCoupledInputs.getLock(comp).each(Disabling.disable); }, onEnabled: function (comp) { FormCoupledInputs.getField1(comp).bind(FormField.getField).each(Disabling.enable); FormCoupledInputs.getField2(comp).bind(FormField.getField).each(Disabling.enable); FormCoupledInputs.getLock(comp).each(Disabling.enable); } }), receivingConfig(), config('size-input-events2', [run(ratioEvent, function (component, simulatedEvent) { var isField1 = simulatedEvent.event.isField1; var optCurrent = isField1 ? FormCoupledInputs.getField1(component) : FormCoupledInputs.getField2(component); var optOther = isField1 ? FormCoupledInputs.getField2(component) : FormCoupledInputs.getField1(component); var value1 = optCurrent.map(Representing.getValue).getOr(''); var value2 = optOther.map(Representing.getValue).getOr(''); converter = makeRatioConverter(value1, value2); })]) ]) }); }; var undo = constant(generate$1('undo')); var redo = constant(generate$1('redo')); var zoom = constant(generate$1('zoom')); var back = constant(generate$1('back')); var apply = constant(generate$1('apply')); var swap = constant(generate$1('swap')); var transform = constant(generate$1('transform')); var tempTransform = constant(generate$1('temp-transform')); var transformApply = constant(generate$1('transform-apply')); var internal = { undo: undo, redo: redo, zoom: zoom, back: back, apply: apply, swap: swap, transform: transform, tempTransform: tempTransform, transformApply: transformApply }; var saveState = constant('save-state'); var disable$1 = constant('disable'); var enable$1 = constant('enable'); var external$2 = { formActionEvent: formActionEvent, saveState: saveState, disable: disable$1, enable: enable$1 }; var renderEditPanel = function (imagePanel, providersBackstage) { var createButton = function (text, action, disabled, primary) { return record(renderButton({ name: text, text: text, disabled: disabled, primary: primary, icon: Optional.none(), borderless: false }, action, providersBackstage)); }; var createIconButton = function (icon, tooltip, action, disabled) { return record(renderIconButton({ name: icon, icon: Optional.some(icon), tooltip: Optional.some(tooltip), disabled: disabled, primary: false, borderless: false }, action, providersBackstage)); }; var disableAllComponents = function (comps, eventcomp) { comps.map(function (mem) { var component = mem.get(eventcomp); if (component.hasConfigured(Disabling)) { Disabling.disable(component); } }); }; var enableAllComponents = function (comps, eventcomp) { comps.map(function (mem) { var component = mem.get(eventcomp); if (component.hasConfigured(Disabling)) { Disabling.enable(component); } }); }; var panelDom = { tag: 'div', classes: [ 'tox-image-tools__toolbar', 'tox-image-tools-edit-panel' ] }; var noop$1 = noop; var emit$1 = function (comp, event, data) { emitWith(comp, event, data); }; var emitDisable = function (component) { return emit(component, external$2.disable()); }; var emitEnable = function (component) { return emit(component, external$2.enable()); }; var emitTransform = function (comp, transform) { emitDisable(comp); emit$1(comp, internal.transform(), { transform: transform }); emitEnable(comp); }; var emitTempTransform = function (comp, transform) { emitDisable(comp); emit$1(comp, internal.tempTransform(), { transform: transform }); emitEnable(comp); }; var getBackSwap = function (anyInSystem) { return function () { memContainer.getOpt(anyInSystem).each(function (container) { Replacing.set(container, [ButtonPanel]); }); }; }; var emitTransformApply = function (comp, transform) { emitDisable(comp); emit$1(comp, internal.transformApply(), { transform: transform, swap: getBackSwap(comp) }); emitEnable(comp); }; var createBackButton = function () { return createButton('Back', function (button) { return emit$1(button, internal.back(), { swap: getBackSwap(button) }); }, false, false); }; var createSpacer = function () { return record({ dom: { tag: 'div', classes: ['tox-spacer'] }, behaviours: derive$1([Disabling.config({})]) }); }; var createApplyButton = function () { return createButton('Apply', function (button) { return emit$1(button, internal.apply(), { swap: getBackSwap(button) }); }, true, true); }; var makeCropTransform = function () { return function (ir) { var rect = imagePanel.getRect(); return crop$1(ir, rect.x, rect.y, rect.w, rect.h); }; }; var cropPanelComponents = [ createBackButton(), createSpacer(), createButton('Apply', function (button) { var transform = makeCropTransform(); emitTransformApply(button, transform); imagePanel.hideCrop(); }, false, true) ]; var CropPanel = Container.sketch({ dom: panelDom, components: cropPanelComponents.map(function (mem) { return mem.asSpec(); }), containerBehaviours: derive$1([config('image-tools-crop-buttons-events', [ run(external$2.disable(), function (comp, _se) { disableAllComponents(cropPanelComponents, comp); }), run(external$2.enable(), function (comp, _se) { enableAllComponents(cropPanelComponents, comp); }) ])]) }); var memSize = record(renderSizeInput({ name: 'size', label: Optional.none(), constrain: true, disabled: false }, providersBackstage)); var makeResizeTransform = function (width, height) { return function (ir) { return resize$2(ir, width, height); }; }; var resizePanelComponents = [ createBackButton(), createSpacer(), memSize, createSpacer(), createButton('Apply', function (button) { memSize.getOpt(button).each(function (sizeInput) { var value = Representing.getValue(sizeInput); var width = parseInt(value.width, 10); var height = parseInt(value.height, 10); var transform = makeResizeTransform(width, height); emitTransformApply(button, transform); }); }, false, true) ]; var ResizePanel = Container.sketch({ dom: panelDom, components: resizePanelComponents.map(function (mem) { return mem.asSpec(); }), containerBehaviours: derive$1([config('image-tools-resize-buttons-events', [ run(external$2.disable(), function (comp, _se) { disableAllComponents(resizePanelComponents, comp); }), run(external$2.enable(), function (comp, _se) { enableAllComponents(resizePanelComponents, comp); }) ])]) }); var makeValueTransform = function (transform, value) { return function (ir) { return transform(ir, value); }; }; var horizontalFlip = makeValueTransform(flip$1, 'h'); var verticalFlip = makeValueTransform(flip$1, 'v'); var counterclockwiseRotate = makeValueTransform(rotate$1, -90); var clockwiseRotate = makeValueTransform(rotate$1, 90); var flipRotateOnAction = function (comp, operation) { emitTempTransform(comp, operation); }; var flipRotateComponents = [ createBackButton(), createSpacer(), createIconButton('flip-horizontally', 'Flip horizontally', function (button) { flipRotateOnAction(button, horizontalFlip); }, false), createIconButton('flip-vertically', 'Flip vertically', function (button) { flipRotateOnAction(button, verticalFlip); }, false), createIconButton('rotate-left', 'Rotate counterclockwise', function (button) { flipRotateOnAction(button, counterclockwiseRotate); }, false), createIconButton('rotate-right', 'Rotate clockwise', function (button) { flipRotateOnAction(button, clockwiseRotate); }, false), createSpacer(), createApplyButton() ]; var FlipRotatePanel = Container.sketch({ dom: panelDom, components: flipRotateComponents.map(function (mem) { return mem.asSpec(); }), containerBehaviours: derive$1([config('image-tools-fliprotate-buttons-events', [ run(external$2.disable(), function (comp, _se) { disableAllComponents(flipRotateComponents, comp); }), run(external$2.enable(), function (comp, _se) { enableAllComponents(flipRotateComponents, comp); }) ])]) }); var makeSlider = function (label, onChoose, min, value, max) { var labelPart = Slider.parts.label({ dom: { tag: 'label', classes: ['tox-label'], innerHtml: providersBackstage.translate(label) } }); var spectrum = Slider.parts.spectrum({ dom: { tag: 'div', classes: ['tox-slider__rail'], attributes: { role: 'presentation' } } }); var thumb = Slider.parts.thumb({ dom: { tag: 'div', classes: ['tox-slider__handle'], attributes: { role: 'presentation' } } }); return record(Slider.sketch({ dom: { tag: 'div', classes: ['tox-slider'], attributes: { role: 'presentation' } }, model: { mode: 'x', minX: min, maxX: max, getInitialValue: constant({ x: value }) }, components: [ labelPart, spectrum, thumb ], sliderBehaviours: derive$1([Focusing.config({})]), onChoose: onChoose })); }; var makeVariableSlider = function (label, transform, min, value, max) { var onChoose = function (slider, _thumb, value) { var valTransform = makeValueTransform(transform, value.x / 100); emitTransform(slider, valTransform); }; return makeSlider(label, onChoose, min, value, max); }; var variableFilterPanelComponents = function (label, transform, min, value, max) { return [ createBackButton(), makeVariableSlider(label, transform, min, value, max), createApplyButton() ]; }; var createVariableFilterPanel = function (label, transform, min, value, max) { var filterPanelComponents = variableFilterPanelComponents(label, transform, min, value, max); return Container.sketch({ dom: panelDom, components: filterPanelComponents.map(function (mem) { return mem.asSpec(); }), containerBehaviours: derive$1([config('image-tools-filter-panel-buttons-events', [ run(external$2.disable(), function (comp, _se) { disableAllComponents(filterPanelComponents, comp); }), run(external$2.enable(), function (comp, _se) { enableAllComponents(filterPanelComponents, comp); }) ])]) }); }; var filterPanelComponents = [ createBackButton(), createSpacer(), createApplyButton() ]; var FilterPanel = Container.sketch({ dom: panelDom, components: filterPanelComponents.map(function (mem) { return mem.asSpec(); }) }); var BrightnessPanel = createVariableFilterPanel('Brightness', brightness$1, -100, 0, 100); var ContrastPanel = createVariableFilterPanel('Contrast', contrast$1, -100, 0, 100); var GammaPanel = createVariableFilterPanel('Gamma', gamma$1, -100, 0, 100); var makeColorTransform = function (red, green, blue) { return function (ir) { return colorize$1(ir, red, green, blue); }; }; var makeColorSlider = function (label) { var onChoose = function (slider, _thumb, _value) { var redOpt = memRed.getOpt(slider); var blueOpt = memBlue.getOpt(slider); var greenOpt = memGreen.getOpt(slider); redOpt.each(function (red) { blueOpt.each(function (blue) { greenOpt.each(function (green) { var r = Representing.getValue(red).x / 100; var g = Representing.getValue(green).x / 100; var b = Representing.getValue(blue).x / 100; var transform = makeColorTransform(r, g, b); emitTransform(slider, transform); }); }); }); }; return makeSlider(label, onChoose, 0, 100, 200); }; var memRed = makeColorSlider('R'); var memGreen = makeColorSlider('G'); var memBlue = makeColorSlider('B'); var colorizePanelComponents = [ createBackButton(), memRed, memGreen, memBlue, createApplyButton() ]; var ColorizePanel = Container.sketch({ dom: panelDom, components: colorizePanelComponents.map(function (mem) { return mem.asSpec(); }) }); var getTransformPanelEvent = function (panel, transform, update) { return function (button) { var swap = function () { memContainer.getOpt(button).each(function (container) { Replacing.set(container, [panel]); update(container); }); }; emit$1(button, internal.swap(), { transform: transform, swap: swap }); }; }; var cropPanelUpdate = function (_anyInSystem) { imagePanel.showCrop(); }; var resizePanelUpdate = function (anyInSystem) { memSize.getOpt(anyInSystem).each(function (sizeInput) { var measurements = imagePanel.getMeasurements(); var width = measurements.width; var height = measurements.height; Representing.setValue(sizeInput, { width: width, height: height }); }); }; var sharpenTransform = Optional.some(sharpen$1); var invertTransform = Optional.some(invert$1); var buttonPanelComponents = [ createIconButton('crop', 'Crop', getTransformPanelEvent(CropPanel, Optional.none(), cropPanelUpdate), false), createIconButton('resize', 'Resize', getTransformPanelEvent(ResizePanel, Optional.none(), resizePanelUpdate), false), createIconButton('orientation', 'Orientation', getTransformPanelEvent(FlipRotatePanel, Optional.none(), noop$1), false), createIconButton('brightness', 'Brightness', getTransformPanelEvent(BrightnessPanel, Optional.none(), noop$1), false), createIconButton('sharpen', 'Sharpen', getTransformPanelEvent(FilterPanel, sharpenTransform, noop$1), false), createIconButton('contrast', 'Contrast', getTransformPanelEvent(ContrastPanel, Optional.none(), noop$1), false), createIconButton('color-levels', 'Color levels', getTransformPanelEvent(ColorizePanel, Optional.none(), noop$1), false), createIconButton('gamma', 'Gamma', getTransformPanelEvent(GammaPanel, Optional.none(), noop$1), false), createIconButton('invert', 'Invert', getTransformPanelEvent(FilterPanel, invertTransform, noop$1), false) ]; var ButtonPanel = Container.sketch({ dom: panelDom, components: buttonPanelComponents.map(function (mem) { return mem.asSpec(); }) }); var container = Container.sketch({ dom: { tag: 'div' }, components: [ButtonPanel], containerBehaviours: derive$1([Replacing.config({})]) }); var memContainer = record(container); var getApplyButton = function (anyInSystem) { return memContainer.getOpt(anyInSystem).map(function (container) { var panel = container.components()[0]; return panel.components()[panel.components().length - 1]; }); }; return { memContainer: memContainer, getApplyButton: getApplyButton }; }; var global$d = tinymce.util.Tools.resolve('tinymce.geom.Rect'); var global$e = tinymce.util.Tools.resolve('tinymce.dom.DomQuery'); var global$f = tinymce.util.Tools.resolve('tinymce.util.Observable'); var global$g = tinymce.util.Tools.resolve('tinymce.util.VK'); var getDocumentSize = function (doc) { var max = Math.max; var documentElement = doc.documentElement; var body = doc.body; var scrollWidth = max(documentElement.scrollWidth, body.scrollWidth); var clientWidth = max(documentElement.clientWidth, body.clientWidth); var offsetWidth = max(documentElement.offsetWidth, body.offsetWidth); var scrollHeight = max(documentElement.scrollHeight, body.scrollHeight); var clientHeight = max(documentElement.clientHeight, body.clientHeight); var offsetHeight = max(documentElement.offsetHeight, body.offsetHeight); return { width: scrollWidth < offsetWidth ? clientWidth : scrollWidth, height: scrollHeight < offsetHeight ? clientHeight : scrollHeight }; }; var updateWithTouchData = function (e) { var keys, i; if (e.changedTouches) { keys = 'screenX screenY pageX pageY clientX clientY'.split(' '); for (i = 0; i < keys.length; i++) { e[keys[i]] = e.changedTouches[0][keys[i]]; } } }; function DragHelper (id, settings) { var $eventOverlay; var doc = settings.document || document; var downButton; var startX, startY; var handleElement = doc.getElementById(settings.handle || id); var start = function (e) { var docSize = getDocumentSize(doc); var cursor; updateWithTouchData(e); e.preventDefault(); downButton = e.button; var handleElm = handleElement; startX = e.screenX; startY = e.screenY; if (window.getComputedStyle) { cursor = window.getComputedStyle(handleElm, null).getPropertyValue('cursor'); } else { cursor = handleElm.runtimeStyle.cursor; } $eventOverlay = global$e('
    ').css({ position: 'absolute', top: 0, left: 0, width: docSize.width, height: docSize.height, zIndex: 2147483647, opacity: 0.0001, cursor: cursor }).appendTo(doc.body); global$e(doc).on('mousemove touchmove', drag).on('mouseup touchend', stop); settings.start(e); }; var drag = function (e) { updateWithTouchData(e); if (e.button !== downButton) { return stop(e); } e.deltaX = e.screenX - startX; e.deltaY = e.screenY - startY; e.preventDefault(); settings.drag(e); }; var stop = function (e) { updateWithTouchData(e); global$e(doc).off('mousemove touchmove', drag).off('mouseup touchend', stop); $eventOverlay.remove(); if (settings.stop) { settings.stop(e); } }; var destroy = function () { global$e(handleElement).off(); }; global$e(handleElement).on('mousedown touchstart', start); return { destroy: destroy }; } var count = 0; var create$7 = function (currentRect, viewPortRect, clampRect, containerElm, action) { var dragHelpers; var prefix = 'tox-'; var id = prefix + 'crid-' + count++; var handles = [ { name: 'move', xMul: 0, yMul: 0, deltaX: 1, deltaY: 1, deltaW: 0, deltaH: 0, label: 'Crop Mask' }, { name: 'nw', xMul: 0, yMul: 0, deltaX: 1, deltaY: 1, deltaW: -1, deltaH: -1, label: 'Top Left Crop Handle' }, { name: 'ne', xMul: 1, yMul: 0, deltaX: 0, deltaY: 1, deltaW: 1, deltaH: -1, label: 'Top Right Crop Handle' }, { name: 'sw', xMul: 0, yMul: 1, deltaX: 1, deltaY: 0, deltaW: -1, deltaH: 1, label: 'Bottom Left Crop Handle' }, { name: 'se', xMul: 1, yMul: 1, deltaX: 0, deltaY: 0, deltaW: 1, deltaH: 1, label: 'Bottom Right Crop Handle' } ]; var blockers = [ 'top', 'right', 'bottom', 'left' ]; var getAbsoluteRect = function (outerRect, relativeRect) { return { x: relativeRect.x + outerRect.x, y: relativeRect.y + outerRect.y, w: relativeRect.w, h: relativeRect.h }; }; var getRelativeRect = function (outerRect, innerRect) { return { x: innerRect.x - outerRect.x, y: innerRect.y - outerRect.y, w: innerRect.w, h: innerRect.h }; }; var getInnerRect = function () { return getRelativeRect(clampRect, currentRect); }; var moveRect = function (handle, startRect, deltaX, deltaY) { var x, y, w, h, rect; x = startRect.x; y = startRect.y; w = startRect.w; h = startRect.h; x += deltaX * handle.deltaX; y += deltaY * handle.deltaY; w += deltaX * handle.deltaW; h += deltaY * handle.deltaH; if (w < 20) { w = 20; } if (h < 20) { h = 20; } rect = currentRect = global$d.clamp({ x: x, y: y, w: w, h: h }, clampRect, handle.name === 'move'); rect = getRelativeRect(clampRect, rect); instance.fire('updateRect', { rect: rect }); setInnerRect(rect); }; var render = function () { var createDragHelper = function (handle) { var startRect; return DragHelper(id, { document: containerElm.ownerDocument, handle: id + '-' + handle.name, start: function () { startRect = currentRect; }, drag: function (e) { moveRect(handle, startRect, e.deltaX, e.deltaY); } }); }; global$e('
    ').appendTo(containerElm); global$c.each(blockers, function (blocker) { global$e('#' + id, containerElm).append('