camunda-bpmn-js 0.24.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/dist/assets/base-modeler.css +2 -1
  2. package/dist/assets/color-picker.css +10 -0
  3. package/dist/assets/diagram-js.css +1 -3
  4. package/dist/base-modeler.development.js +751 -243
  5. package/dist/base-modeler.production.min.js +22 -22
  6. package/dist/base-navigated-viewer.development.js +3 -0
  7. package/dist/base-navigated-viewer.production.min.js +1 -1
  8. package/dist/base-viewer.development.js +3 -0
  9. package/dist/base-viewer.production.min.js +1 -1
  10. package/dist/camunda-cloud-modeler.development.js +1570 -415
  11. package/dist/camunda-cloud-modeler.production.min.js +22 -22
  12. package/dist/camunda-cloud-navigated-viewer.development.js +3 -0
  13. package/dist/camunda-cloud-navigated-viewer.production.min.js +1 -1
  14. package/dist/camunda-cloud-viewer.development.js +3 -0
  15. package/dist/camunda-cloud-viewer.production.min.js +1 -1
  16. package/dist/camunda-platform-modeler.development.js +1180 -269
  17. package/dist/camunda-platform-modeler.production.min.js +26 -26
  18. package/dist/camunda-platform-navigated-viewer.development.js +3 -0
  19. package/dist/camunda-platform-navigated-viewer.production.min.js +1 -1
  20. package/dist/camunda-platform-viewer.development.js +3 -0
  21. package/dist/camunda-platform-viewer.production.min.js +1 -1
  22. package/lib/camunda-cloud/Modeler.js +5 -1
  23. package/lib/camunda-cloud/features/replace/ElementTemplatesReplaceProvider.js +3 -141
  24. package/lib/camunda-platform/Modeler.js +6 -1
  25. package/lib/shared/features/replace/UnlinkTemplateReplaceProvider.js +178 -0
  26. package/lib/shared/features/replace/index.js +8 -0
  27. package/lib/{camunda-cloud/features/replace → shared/features/replace/util}/ReplaceOptionsUtil.js +0 -0
  28. package/package.json +9 -7
  29. package/styles/base-modeler.css +2 -1
@@ -22147,6 +22147,9 @@
22147
22147
 
22148
22148
  };
22149
22149
 
22150
+ Overlays.prototype.isShown = function() {
22151
+ return this._overlayRoot.style.display !== 'none';
22152
+ };
22150
22153
 
22151
22154
  Overlays.prototype.show = function() {
22152
22155
  setVisible$1(this._overlayRoot);
@@ -28053,7 +28056,9 @@
28053
28056
 
28054
28057
 
28055
28058
  /**
28056
- * Trigger context pad action.
28059
+ * Trigger context pad via DOM event.
28060
+ *
28061
+ * The entry to trigger is determined by the target element.
28057
28062
  *
28058
28063
  * @param {string} action
28059
28064
  * @param {Event} event
@@ -28061,10 +28066,7 @@
28061
28066
  */
28062
28067
  ContextPad.prototype.trigger = function(action, event, autoActivate) {
28063
28068
 
28064
- var target = this._current.target,
28065
- entries = this._current.entries,
28066
- entry,
28067
- handler,
28069
+ var entry,
28068
28070
  originalEvent,
28069
28071
  button = event.delegateTarget || event.target;
28070
28072
 
@@ -28072,19 +28074,45 @@
28072
28074
  return event.preventDefault();
28073
28075
  }
28074
28076
 
28075
- entry = entries[attr$1(button, 'data-action')];
28076
- handler = entry.action;
28077
-
28077
+ entry = attr$1(button, 'data-action');
28078
28078
  originalEvent = event.originalEvent || event;
28079
28079
 
28080
+ return this.triggerEntry(entry, action, originalEvent, autoActivate);
28081
+ };
28082
+
28083
+ /**
28084
+ * Trigger context pad entry entry.
28085
+ *
28086
+ * @param {string} entryId
28087
+ * @param {string} action
28088
+ * @param {Event} event
28089
+ * @param {boolean} [autoActivate=false]
28090
+ */
28091
+ ContextPad.prototype.triggerEntry = function(entryId, action, event, autoActivate) {
28092
+
28093
+ if (!this.isShown()) {
28094
+ return;
28095
+ }
28096
+
28097
+ var target = this._current.target,
28098
+ entries = this._current.entries;
28099
+
28100
+ var entry = entries[entryId];
28101
+
28102
+ if (!entry) {
28103
+ return;
28104
+ }
28105
+
28106
+ var handler = entry.action;
28107
+
28080
28108
  // simple action (via callback function)
28081
28109
  if (isFunction(handler)) {
28082
28110
  if (action === 'click') {
28083
- return handler(originalEvent, target, autoActivate);
28111
+ return handler(event, target, autoActivate);
28084
28112
  }
28085
28113
  } else {
28086
28114
  if (handler[action]) {
28087
- return handler[action](originalEvent, target, autoActivate);
28115
+ return handler[action](event, target, autoActivate);
28088
28116
  }
28089
28117
  }
28090
28118
 
@@ -28285,6 +28313,16 @@
28285
28313
  };
28286
28314
 
28287
28315
 
28316
+ /**
28317
+ * Check if pad is open and not hidden.
28318
+ *
28319
+ * @return {boolean}
28320
+ */
28321
+ ContextPad.prototype.isShown = function() {
28322
+ return this.isOpen() && this._overlays.isShown();
28323
+ };
28324
+
28325
+
28288
28326
  /**
28289
28327
  * Get contex pad position.
28290
28328
  *
@@ -28337,11 +28375,11 @@
28337
28375
 
28338
28376
  var n$3,l$3,u$3,t$5,o$5,f$3={},e$5=[],c$3=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function s$3(n,l){for(var u in l)n[u]=l[u];return n}function a$4(n){var l=n.parentNode;l&&l.removeChild(n);}function h$3(l,u,i){var t,o,r,f={};for(r in u)"key"==r?t=u[r]:"ref"==r?o=u[r]:f[r]=u[r];if(arguments.length>2&&(f.children=arguments.length>3?n$3.call(arguments,2):i),"function"==typeof l&&null!=l.defaultProps)for(r in l.defaultProps)void 0===f[r]&&(f[r]=l.defaultProps[r]);return v$3(l,f,t,o,null)}function v$3(n,i,t,o,r){var f={type:n,props:i,key:t,ref:o,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==r?++u$3:r};return null==r&&null!=l$3.vnode&&l$3.vnode(f),f}function p$4(n){return n.children}function d$3(n,l){this.props=n,this.context=l;}function _$3(n,l){if(null==l)return n.__?_$3(n.__,n.__.__k.indexOf(n)+1):null;for(var u;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e)return u.__e;return "function"==typeof n.type?_$3(n):null}function k$4(n){var l,u;if(null!=(n=n.__)&&null!=n.__c){for(n.__e=n.__c.base=null,l=0;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e){n.__e=n.__c.base=u.__e;break}return k$4(n)}}function b$3(n){(!n.__d&&(n.__d=!0)&&t$5.push(n)&&!g$4.__r++||o$5!==l$3.debounceRendering)&&((o$5=l$3.debounceRendering)||setTimeout)(g$4);}function g$4(){for(var n;g$4.__r=t$5.length;)n=t$5.sort(function(n,l){return n.__v.__b-l.__v.__b}),t$5=[],n.some(function(n){var l,u,i,t,o,r;n.__d&&(o=(t=(l=n).__v).__e,(r=l.__P)&&(u=[],(i=s$3({},t)).__v=t.__v+1,j$4(r,t,i,l.__n,void 0!==r.ownerSVGElement,null!=t.__h?[o]:null,u,null==o?_$3(t):o,t.__h),z$3(u,t),t.__e!=o&&k$4(t)));});}function w$4(n,l,u,i,t,o,r,c,s,a){var h,y,d,k,b,g,w,x=i&&i.__k||e$5,C=x.length;for(u.__k=[],h=0;h<l.length;h++)if(null!=(k=u.__k[h]=null==(k=l[h])||"boolean"==typeof k?null:"string"==typeof k||"number"==typeof k||"bigint"==typeof k?v$3(null,k,null,null,k):Array.isArray(k)?v$3(p$4,{children:k},null,null,null):k.__b>0?v$3(k.type,k.props,k.key,k.ref?k.ref:null,k.__v):k)){if(k.__=u,k.__b=u.__b+1,null===(d=x[h])||d&&k.key==d.key&&k.type===d.type)x[h]=void 0;else for(y=0;y<C;y++){if((d=x[y])&&k.key==d.key&&k.type===d.type){x[y]=void 0;break}d=null;}j$4(n,k,d=d||f$3,t,o,r,c,s,a),b=k.__e,(y=k.ref)&&d.ref!=y&&(w||(w=[]),d.ref&&w.push(d.ref,null,k),w.push(y,k.__c||b,k)),null!=b?(null==g&&(g=b),"function"==typeof k.type&&k.__k===d.__k?k.__d=s=m$4(k,s,n):s=A$3(n,k,d,x,b,s),"function"==typeof u.type&&(u.__d=s)):s&&d.__e==s&&s.parentNode!=n&&(s=_$3(d));}for(u.__e=g,h=C;h--;)null!=x[h]&&N$2(x[h],x[h]);if(w)for(h=0;h<w.length;h++)M$2(w[h],w[++h],w[++h]);}function m$4(n,l,u){for(var i,t=n.__k,o=0;t&&o<t.length;o++)(i=t[o])&&(i.__=n,l="function"==typeof i.type?m$4(i,l,u):A$3(u,i,i,t,i.__e,l));return l}function A$3(n,l,u,i,t,o){var r,f,e;if(void 0!==l.__d)r=l.__d,l.__d=void 0;else if(null==u||t!=o||null==t.parentNode)n:if(null==o||o.parentNode!==n)n.appendChild(t),r=null;else {for(f=o,e=0;(f=f.nextSibling)&&e<i.length;e+=1)if(f==t)break n;n.insertBefore(t,o),r=o;}return void 0!==r?r:t.nextSibling}function C$3(n,l,u,i,t){var o;for(o in u)"children"===o||"key"===o||o in l||H$2(n,o,null,u[o],i);for(o in l)t&&"function"!=typeof l[o]||"children"===o||"key"===o||"value"===o||"checked"===o||u[o]===l[o]||H$2(n,o,l[o],u[o],i);}function $$2(n,l,u){"-"===l[0]?n.setProperty(l,u):n[l]=null==u?"":"number"!=typeof u||c$3.test(l)?u:u+"px";}function H$2(n,l,u,i,t){var o;n:if("style"===l)if("string"==typeof u)n.style.cssText=u;else {if("string"==typeof i&&(n.style.cssText=i=""),i)for(l in i)u&&l in u||$$2(n.style,l,"");if(u)for(l in u)i&&u[l]===i[l]||$$2(n.style,l,u[l]);}else if("o"===l[0]&&"n"===l[1])o=l!==(l=l.replace(/Capture$/,"")),l=l.toLowerCase()in n?l.toLowerCase().slice(2):l.slice(2),n.l||(n.l={}),n.l[l+o]=u,u?i||n.addEventListener(l,o?T$4:I$2,o):n.removeEventListener(l,o?T$4:I$2,o);else if("dangerouslySetInnerHTML"!==l){if(t)l=l.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if("href"!==l&&"list"!==l&&"form"!==l&&"tabIndex"!==l&&"download"!==l&&l in n)try{n[l]=null==u?"":u;break n}catch(n){}"function"==typeof u||(null==u||!1===u&&-1==l.indexOf("-")?n.removeAttribute(l):n.setAttribute(l,u));}}function I$2(n){this.l[n.type+!1](l$3.event?l$3.event(n):n);}function T$4(n){this.l[n.type+!0](l$3.event?l$3.event(n):n);}function j$4(n,u,i,t,o,r,f,e,c){var a,h,v,y,_,k,b,g,m,x,A,C,$,H,I,T=u.type;if(void 0!==u.constructor)return null;null!=i.__h&&(c=i.__h,e=u.__e=i.__e,u.__h=null,r=[e]),(a=l$3.__b)&&a(u);try{n:if("function"==typeof T){if(g=u.props,m=(a=T.contextType)&&t[a.__c],x=a?m?m.props.value:a.__:t,i.__c?b=(h=u.__c=i.__c).__=h.__E:("prototype"in T&&T.prototype.render?u.__c=h=new T(g,x):(u.__c=h=new d$3(g,x),h.constructor=T,h.render=O$2),m&&m.sub(h),h.props=g,h.state||(h.state={}),h.context=x,h.__n=t,v=h.__d=!0,h.__h=[],h._sb=[]),null==h.__s&&(h.__s=h.state),null!=T.getDerivedStateFromProps&&(h.__s==h.state&&(h.__s=s$3({},h.__s)),s$3(h.__s,T.getDerivedStateFromProps(g,h.__s))),y=h.props,_=h.state,v)null==T.getDerivedStateFromProps&&null!=h.componentWillMount&&h.componentWillMount(),null!=h.componentDidMount&&h.__h.push(h.componentDidMount);else {if(null==T.getDerivedStateFromProps&&g!==y&&null!=h.componentWillReceiveProps&&h.componentWillReceiveProps(g,x),!h.__e&&null!=h.shouldComponentUpdate&&!1===h.shouldComponentUpdate(g,h.__s,x)||u.__v===i.__v){for(h.props=g,h.state=h.__s,u.__v!==i.__v&&(h.__d=!1),h.__v=u,u.__e=i.__e,u.__k=i.__k,u.__k.forEach(function(n){n&&(n.__=u);}),A=0;A<h._sb.length;A++)h.__h.push(h._sb[A]);h._sb=[],h.__h.length&&f.push(h);break n}null!=h.componentWillUpdate&&h.componentWillUpdate(g,h.__s,x),null!=h.componentDidUpdate&&h.__h.push(function(){h.componentDidUpdate(y,_,k);});}if(h.context=x,h.props=g,h.__v=u,h.__P=n,C=l$3.__r,$=0,"prototype"in T&&T.prototype.render){for(h.state=h.__s,h.__d=!1,C&&C(u),a=h.render(h.props,h.state,h.context),H=0;H<h._sb.length;H++)h.__h.push(h._sb[H]);h._sb=[];}else do{h.__d=!1,C&&C(u),a=h.render(h.props,h.state,h.context),h.state=h.__s;}while(h.__d&&++$<25);h.state=h.__s,null!=h.getChildContext&&(t=s$3(s$3({},t),h.getChildContext())),v||null==h.getSnapshotBeforeUpdate||(k=h.getSnapshotBeforeUpdate(y,_)),I=null!=a&&a.type===p$4&&null==a.key?a.props.children:a,w$4(n,Array.isArray(I)?I:[I],u,i,t,o,r,f,e,c),h.base=u.__e,u.__h=null,h.__h.length&&f.push(h),b&&(h.__E=h.__=null),h.__e=!1;}else null==r&&u.__v===i.__v?(u.__k=i.__k,u.__e=i.__e):u.__e=L$2(i.__e,u,i,t,o,r,f,c);(a=l$3.diffed)&&a(u);}catch(n){u.__v=null,(c||null!=r)&&(u.__e=e,u.__h=!!c,r[r.indexOf(e)]=null),l$3.__e(n,u,i);}}function z$3(n,u){l$3.__c&&l$3.__c(u,n),n.some(function(u){try{n=u.__h,u.__h=[],n.some(function(n){n.call(u);});}catch(n){l$3.__e(n,u.__v);}});}function L$2(l,u,i,t,o,r,e,c){var s,h,v,y=i.props,p=u.props,d=u.type,k=0;if("svg"===d&&(o=!0),null!=r)for(;k<r.length;k++)if((s=r[k])&&"setAttribute"in s==!!d&&(d?s.localName===d:3===s.nodeType)){l=s,r[k]=null;break}if(null==l){if(null===d)return document.createTextNode(p);l=o?document.createElementNS("http://www.w3.org/2000/svg",d):document.createElement(d,p.is&&p),r=null,c=!1;}if(null===d)y===p||c&&l.data===p||(l.data=p);else {if(r=r&&n$3.call(l.childNodes),h=(y=i.props||f$3).dangerouslySetInnerHTML,v=p.dangerouslySetInnerHTML,!c){if(null!=r)for(y={},k=0;k<l.attributes.length;k++)y[l.attributes[k].name]=l.attributes[k].value;(v||h)&&(v&&(h&&v.__html==h.__html||v.__html===l.innerHTML)||(l.innerHTML=v&&v.__html||""));}if(C$3(l,p,y,o,c),v)u.__k=[];else if(k=u.props.children,w$4(l,Array.isArray(k)?k:[k],u,i,t,o&&"foreignObject"!==d,r,e,r?r[0]:i.__k&&_$3(i,0),c),null!=r)for(k=r.length;k--;)null!=r[k]&&a$4(r[k]);c||("value"in p&&void 0!==(k=p.value)&&(k!==l.value||"progress"===d&&!k||"option"===d&&k!==y.value)&&H$2(l,"value",k,y.value,!1),"checked"in p&&void 0!==(k=p.checked)&&k!==l.checked&&H$2(l,"checked",k,y.checked,!1));}return l}function M$2(n,u,i){try{"function"==typeof n?n(u):n.current=u;}catch(n){l$3.__e(n,i);}}function N$2(n,u,i){var t,o;if(l$3.unmount&&l$3.unmount(n),(t=n.ref)&&(t.current&&t.current!==n.__e||M$2(t,null,u)),null!=(t=n.__c)){if(t.componentWillUnmount)try{t.componentWillUnmount();}catch(n){l$3.__e(n,u);}t.base=t.__P=null,n.__c=void 0;}if(t=n.__k)for(o=0;o<t.length;o++)t[o]&&N$2(t[o],u,i||"function"!=typeof n.type);i||null==n.__e||a$4(n.__e),n.__=n.__e=n.__d=void 0;}function O$2(n,l,u){return this.constructor(n,u)}function P$2(u,i,t){var o,r,e;l$3.__&&l$3.__(u,i),r=(o="function"==typeof t)?null:t&&t.__k||i.__k,e=[],j$4(i,u=(!o&&t||i).__k=h$3(p$4,null,[u]),r||f$3,f$3,void 0!==i.ownerSVGElement,!o&&t?[t]:r?null:i.firstChild?n$3.call(i.childNodes):null,e,!o&&t?t:r?r.__e:i.firstChild,o),z$3(e,u);}n$3=e$5.slice,l$3={__e:function(n,l,u,i){for(var t,o,r;l=l.__;)if((t=l.__c)&&!t.__)try{if((o=t.constructor)&&null!=o.getDerivedStateFromError&&(t.setState(o.getDerivedStateFromError(n)),r=t.__d),null!=t.componentDidCatch&&(t.componentDidCatch(n,i||{}),r=t.__d),r)return t.__E=t}catch(l){n=l;}throw n}},u$3=0,d$3.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=s$3({},this.state),"function"==typeof n&&(n=n(s$3({},u),this.props)),n&&s$3(u,n),null!=n&&this.__v&&(l&&this._sb.push(l),b$3(this));},d$3.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),b$3(this));},d$3.prototype.render=p$4,t$5=[],g$4.__r=0;
28339
28377
 
28340
- var t$4,r$3,u$2,i$4,o$4=0,f$2=[],c$2=[],e$4=l$3.__b,a$3=l$3.__r,v$2=l$3.diffed,l$2=l$3.__c,m$3=l$3.unmount;function d$2(t,u){l$3.__h&&l$3.__h(r$3,t,o$4||u),o$4=0;var i=r$3.__H||(r$3.__H={__:[],__h:[]});return t>=i.__.length&&i.__.push({__V:c$2}),i.__[t]}function p$3(n){return o$4=1,y$2(B$1,n)}function y$2(n,u,i){var o=d$2(t$4++,2);if(o.t=n,!o.__c&&(o.__=[i?i(u):B$1(void 0,u),function(n){var t=o.__N?o.__N[0]:o.__[0],r=o.t(t,n);t!==r&&(o.__N=[r,o.__[1]],o.__c.setState({}));}],o.__c=r$3,!r$3.u)){r$3.u=!0;var f=r$3.shouldComponentUpdate;r$3.shouldComponentUpdate=function(n,t,r){if(!o.__c.__H)return !0;var u=o.__c.__H.__.filter(function(n){return n.__c});if(u.every(function(n){return !n.__N}))return !f||f.call(this,n,t,r);var i=!1;return u.forEach(function(n){if(n.__N){var t=n.__[0];n.__=n.__N,n.__N=void 0,t!==n.__[0]&&(i=!0);}}),!(!i&&o.__c.props===n)&&(!f||f.call(this,n,t,r))};}return o.__N||o.__}function h$2(u,i){var o=d$2(t$4++,3);!l$3.__s&&z$2(o.__H,i)&&(o.__=u,o.i=i,r$3.__H.__h.push(o));}function s$2(u,i){var o=d$2(t$4++,4);!l$3.__s&&z$2(o.__H,i)&&(o.__=u,o.i=i,r$3.__h.push(o));}function _$2(n){return o$4=5,F$2(function(){return {current:n}},[])}function F$2(n,r){var u=d$2(t$4++,7);return z$2(u.__H,r)?(u.__V=n(),u.i=r,u.__h=n,u.__V):u.__}function T$3(n,t){return o$4=8,F$2(function(){return n},t)}function b$2(){for(var t;t=f$2.shift();)if(t.__P&&t.__H)try{t.__H.__h.forEach(k$3),t.__H.__h.forEach(w$3),t.__H.__h=[];}catch(r){t.__H.__h=[],l$3.__e(r,t.__v);}}l$3.__b=function(n){r$3=null,e$4&&e$4(n);},l$3.__r=function(n){a$3&&a$3(n),t$4=0;var i=(r$3=n.__c).__H;i&&(u$2===r$3?(i.__h=[],r$3.__h=[],i.__.forEach(function(n){n.__N&&(n.__=n.__N),n.__V=c$2,n.__N=n.i=void 0;})):(i.__h.forEach(k$3),i.__h.forEach(w$3),i.__h=[])),u$2=r$3;},l$3.diffed=function(t){v$2&&v$2(t);var o=t.__c;o&&o.__H&&(o.__H.__h.length&&(1!==f$2.push(o)&&i$4===l$3.requestAnimationFrame||((i$4=l$3.requestAnimationFrame)||j$3)(b$2)),o.__H.__.forEach(function(n){n.i&&(n.__H=n.i),n.__V!==c$2&&(n.__=n.__V),n.i=void 0,n.__V=c$2;})),u$2=r$3=null;},l$3.__c=function(t,r){r.some(function(t){try{t.__h.forEach(k$3),t.__h=t.__h.filter(function(n){return !n.__||w$3(n)});}catch(u){r.some(function(n){n.__h&&(n.__h=[]);}),r=[],l$3.__e(u,t.__v);}}),l$2&&l$2(t,r);},l$3.unmount=function(t){m$3&&m$3(t);var r,u=t.__c;u&&u.__H&&(u.__H.__.forEach(function(n){try{k$3(n);}catch(n){r=n;}}),u.__H=void 0,r&&l$3.__e(r,u.__v));};var g$3="function"==typeof requestAnimationFrame;function j$3(n){var t,r=function(){clearTimeout(u),g$3&&cancelAnimationFrame(t),setTimeout(n);},u=setTimeout(r,100);g$3&&(t=requestAnimationFrame(r));}function k$3(n){var t=r$3,u=n.__c;"function"==typeof u&&(n.__c=void 0,u()),r$3=t;}function w$3(n){var t=r$3;n.__c=n.__(),r$3=t;}function z$2(n,t){return !n||n.length!==t.length||t.some(function(t,r){return t!==n[r]})}function B$1(n,t){return "function"==typeof t?t(n):t}
28378
+ var n$2=function(t,s,r,e){var u;s[0]=0;for(var h=1;h<s.length;h++){var p=s[h++],a=s[h]?(s[0]|=p?1:2,r[s[h++]]):s[++h];3===p?e[0]=a:4===p?e[1]=Object.assign(e[1]||{},a):5===p?(e[1]=e[1]||{})[s[++h]]=a:6===p?e[1][s[++h]]+=a+"":p?(u=t.apply(a,n$2(t,a,r,["",null])),e.push(u),a[0]?s[0]|=2:(s[h-2]=0,s[h]=u)):e.push(a);}return e},t$4=new Map;function e$4(s){var r=t$4.get(this);return r||(r=new Map,t$4.set(this,r)),(r=n$2(this,r.get(s)||(r.set(s,r=function(n){for(var t,s,r=1,e="",u="",h=[0],p=function(n){1===r&&(n||(e=e.replace(/^\s*\n\s*|\s*\n\s*$/g,"")))?h.push(0,n,e):3===r&&(n||e)?(h.push(3,n,e),r=2):2===r&&"..."===e&&n?h.push(4,n,0):2===r&&e&&!n?h.push(5,0,!0,e):r>=5&&((e||!n&&5===r)&&(h.push(r,0,e,s),r=6),n&&(h.push(r,n,0,s),r=6)),e="";},a=0;a<n.length;a++){a&&(1===r&&p(),p(a));for(var l=0;l<n[a].length;l++)t=n[a][l],1===r?"<"===t?(p(),h=[h],r=3):e+=t:4===r?"--"===e&&">"===t?(r=1,e=""):e=t+e[0]:u?t===u?u="":e+=t:'"'===t||"'"===t?u=t:">"===t?(p(),r=1):r&&("="===t?(r=5,s=e,e=""):"/"===t&&(r<5||">"===n[a][l+1])?(p(),3===r&&(h=h[0]),r=h,(h=h[0]).push(2,0,r),r=0):" "===t||"\t"===t||"\n"===t||"\r"===t?(p(),r=2):e+=t),3===r&&"!--"===e&&(r=4,h=h[0]);}return p(),h}(s)),r),arguments,[])).length>1?r:r[0]}
28341
28379
 
28342
- var n$2=function(t,s,r,e){var u;s[0]=0;for(var h=1;h<s.length;h++){var p=s[h++],a=s[h]?(s[0]|=p?1:2,r[s[h++]]):s[++h];3===p?e[0]=a:4===p?e[1]=Object.assign(e[1]||{},a):5===p?(e[1]=e[1]||{})[s[++h]]=a:6===p?e[1][s[++h]]+=a+"":p?(u=t.apply(a,n$2(t,a,r,["",null])),e.push(u),a[0]?s[0]|=2:(s[h-2]=0,s[h]=u)):e.push(a);}return e},t$3=new Map;function e$3(s){var r=t$3.get(this);return r||(r=new Map,t$3.set(this,r)),(r=n$2(this,r.get(s)||(r.set(s,r=function(n){for(var t,s,r=1,e="",u="",h=[0],p=function(n){1===r&&(n||(e=e.replace(/^\s*\n\s*|\s*\n\s*$/g,"")))?h.push(0,n,e):3===r&&(n||e)?(h.push(3,n,e),r=2):2===r&&"..."===e&&n?h.push(4,n,0):2===r&&e&&!n?h.push(5,0,!0,e):r>=5&&((e||!n&&5===r)&&(h.push(r,0,e,s),r=6),n&&(h.push(r,n,0,s),r=6)),e="";},a=0;a<n.length;a++){a&&(1===r&&p(),p(a));for(var l=0;l<n[a].length;l++)t=n[a][l],1===r?"<"===t?(p(),h=[h],r=3):e+=t:4===r?"--"===e&&">"===t?(r=1,e=""):e=t+e[0]:u?t===u?u="":e+=t:'"'===t||"'"===t?u=t:">"===t?(p(),r=1):r&&("="===t?(r=5,s=e,e=""):"/"===t&&(r<5||">"===n[a][l+1])?(p(),3===r&&(h=h[0]),r=h,(h=h[0]).push(2,0,r),r=0):" "===t||"\t"===t||"\n"===t||"\r"===t?(p(),r=2):e+=t),3===r&&"!--"===e&&(r=4,h=h[0]);}return p(),h}(s)),r),arguments,[])).length>1?r:r[0]}
28380
+ var m$3=e$4.bind(h$3);
28343
28381
 
28344
- var m$2=e$3.bind(h$3);
28382
+ var t$3,r$3,u$2,i$4,o$4=0,f$2=[],c$2=[],e$3=l$3.__b,a$3=l$3.__r,v$2=l$3.diffed,l$2=l$3.__c,m$2=l$3.unmount;function d$2(t,u){l$3.__h&&l$3.__h(r$3,t,o$4||u),o$4=0;var i=r$3.__H||(r$3.__H={__:[],__h:[]});return t>=i.__.length&&i.__.push({__V:c$2}),i.__[t]}function p$3(n){return o$4=1,y$2(B$1,n)}function y$2(n,u,i){var o=d$2(t$3++,2);if(o.t=n,!o.__c&&(o.__=[i?i(u):B$1(void 0,u),function(n){var t=o.__N?o.__N[0]:o.__[0],r=o.t(t,n);t!==r&&(o.__N=[r,o.__[1]],o.__c.setState({}));}],o.__c=r$3,!r$3.u)){r$3.u=!0;var f=r$3.shouldComponentUpdate;r$3.shouldComponentUpdate=function(n,t,r){if(!o.__c.__H)return !0;var u=o.__c.__H.__.filter(function(n){return n.__c});if(u.every(function(n){return !n.__N}))return !f||f.call(this,n,t,r);var i=!1;return u.forEach(function(n){if(n.__N){var t=n.__[0];n.__=n.__N,n.__N=void 0,t!==n.__[0]&&(i=!0);}}),!(!i&&o.__c.props===n)&&(!f||f.call(this,n,t,r))};}return o.__N||o.__}function h$2(u,i){var o=d$2(t$3++,3);!l$3.__s&&z$2(o.__H,i)&&(o.__=u,o.i=i,r$3.__H.__h.push(o));}function s$2(u,i){var o=d$2(t$3++,4);!l$3.__s&&z$2(o.__H,i)&&(o.__=u,o.i=i,r$3.__h.push(o));}function _$2(n){return o$4=5,F$2(function(){return {current:n}},[])}function F$2(n,r){var u=d$2(t$3++,7);return z$2(u.__H,r)?(u.__V=n(),u.i=r,u.__h=n,u.__V):u.__}function T$3(n,t){return o$4=8,F$2(function(){return n},t)}function b$2(){for(var t;t=f$2.shift();)if(t.__P&&t.__H)try{t.__H.__h.forEach(k$3),t.__H.__h.forEach(w$3),t.__H.__h=[];}catch(r){t.__H.__h=[],l$3.__e(r,t.__v);}}l$3.__b=function(n){r$3=null,e$3&&e$3(n);},l$3.__r=function(n){a$3&&a$3(n),t$3=0;var i=(r$3=n.__c).__H;i&&(u$2===r$3?(i.__h=[],r$3.__h=[],i.__.forEach(function(n){n.__N&&(n.__=n.__N),n.__V=c$2,n.__N=n.i=void 0;})):(i.__h.forEach(k$3),i.__h.forEach(w$3),i.__h=[])),u$2=r$3;},l$3.diffed=function(t){v$2&&v$2(t);var o=t.__c;o&&o.__H&&(o.__H.__h.length&&(1!==f$2.push(o)&&i$4===l$3.requestAnimationFrame||((i$4=l$3.requestAnimationFrame)||j$3)(b$2)),o.__H.__.forEach(function(n){n.i&&(n.__H=n.i),n.__V!==c$2&&(n.__=n.__V),n.i=void 0,n.__V=c$2;})),u$2=r$3=null;},l$3.__c=function(t,r){r.some(function(t){try{t.__h.forEach(k$3),t.__h=t.__h.filter(function(n){return !n.__||w$3(n)});}catch(u){r.some(function(n){n.__h&&(n.__h=[]);}),r=[],l$3.__e(u,t.__v);}}),l$2&&l$2(t,r);},l$3.unmount=function(t){m$2&&m$2(t);var r,u=t.__c;u&&u.__H&&(u.__H.__.forEach(function(n){try{k$3(n);}catch(n){r=n;}}),u.__H=void 0,r&&l$3.__e(r,u.__v));};var g$3="function"==typeof requestAnimationFrame;function j$3(n){var t,r=function(){clearTimeout(u),g$3&&cancelAnimationFrame(t),setTimeout(n);},u=setTimeout(r,100);g$3&&(t=requestAnimationFrame(r));}function k$3(n){var t=r$3,u=n.__c;"function"==typeof u&&(n.__c=void 0,u()),r$3=t;}function w$3(n){var t=r$3;n.__c=n.__(),r$3=t;}function z$2(n,t){return !n||n.length!==t.length||t.some(function(t,r){return t!==n[r]})}function B$1(n,t){return "function"==typeof t?t(n):t}
28345
28383
 
28346
28384
  function r$2(e){var t,f,n="";if("string"==typeof e||"number"==typeof e)n+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(f=r$2(e[t]))&&(n&&(n+=" "),n+=f);else for(t in e)e[t]&&(n&&(n+=" "),n+=t);return n}function clsx(){for(var e,t,f=0,n="";f<arguments.length;)(e=arguments[f++])&&(t=r$2(e))&&(n&&(n+=" "),n+=t);return n}
28347
28385
 
@@ -28364,7 +28402,7 @@
28364
28402
  onClick
28365
28403
  } = props;
28366
28404
 
28367
- return m$2`
28405
+ return m$3`
28368
28406
  <li
28369
28407
  class=${ clsx('entry', { selected }) }
28370
28408
  data-id=${ entry.id }
@@ -28377,17 +28415,17 @@
28377
28415
  <span
28378
28416
  class=${ clsx('djs-popup-entry-name', entry.className) }
28379
28417
  >
28380
- ${ entry.imageUrl ? m$2`
28418
+ ${ entry.imageUrl ? m$3`
28381
28419
  <img class="djs-popup-entry-icon" src=${ entry.imageUrl } />
28382
28420
  ` : null }
28383
28421
 
28384
- ${ entry.label ? m$2`
28422
+ ${ entry.label ? m$3`
28385
28423
  <span class="djs-popup-label">
28386
28424
  ${ entry.label }
28387
28425
  </span>
28388
28426
  ` : null }
28389
28427
  </span>
28390
- ${ entry.description && m$2`
28428
+ ${ entry.description && m$3`
28391
28429
  <span
28392
28430
  class="djs-popup-entry-description"
28393
28431
  title=${ entry.description }
@@ -28396,7 +28434,7 @@
28396
28434
  </span>
28397
28435
  ` }
28398
28436
  </div>
28399
- ${ entry.documentationRef && m$2`
28437
+ ${ entry.documentationRef && m$3`
28400
28438
  <div class="djs-popup-entry-docs">
28401
28439
  <a
28402
28440
  href="${ entry.documentationRef }"
@@ -28451,16 +28489,16 @@
28451
28489
  }
28452
28490
  }, [ selectedEntry ]);
28453
28491
 
28454
- return m$2`
28492
+ return m$3`
28455
28493
  <div class="djs-popup-results" ref=${ resultsRef }>
28456
- ${ groups.map(group => m$2`
28457
- ${ group.name && m$2`
28494
+ ${ groups.map(group => m$3`
28495
+ ${ group.name && m$3`
28458
28496
  <div key=${ group.id } class="entry-header" title=${ group.name }>
28459
28497
  ${ group.name }
28460
28498
  </div>
28461
28499
  ` }
28462
28500
  <ul class="djs-popup-group" data-group=${ group.id }>
28463
- ${ group.entries.map(entry => m$2`
28501
+ ${ group.entries.map(entry => m$3`
28464
28502
  <${PopupMenuItem}
28465
28503
  key=${ entry.id }
28466
28504
  entry=${ entry }
@@ -28679,7 +28717,7 @@
28679
28717
 
28680
28718
  const displayHeader = F$2(() => title || headerEntries.length > 0, [ title, headerEntries ]);
28681
28719
 
28682
- return m$2`
28720
+ return m$3`
28683
28721
  <${PopupMenuWrapper}
28684
28722
  onClose=${ onClose }
28685
28723
  onKeyup=${ handleKey }
@@ -28689,10 +28727,10 @@
28689
28727
  width=${ width }
28690
28728
  scale=${ scale }
28691
28729
  >
28692
- ${ displayHeader && m$2`
28730
+ ${ displayHeader && m$3`
28693
28731
  <div class="djs-popup-header">
28694
28732
  <h3 class="djs-popup-title" title=${ title }>${ title }</h3>
28695
- ${ headerEntries.map(entry => m$2`
28733
+ ${ headerEntries.map(entry => m$3`
28696
28734
  <span
28697
28735
  class=${ getHeaderClasses(entry, entry === selectedEntry) }
28698
28736
  onClick=${ event => onSelect(event, entry) }
@@ -28701,21 +28739,21 @@
28701
28739
  onMouseEnter=${ () => setSelectedEntry(entry) }
28702
28740
  onMouseLeave=${ () => setSelectedEntry(null) }
28703
28741
  >
28704
- ${ entry.imageUrl ? m$2`
28742
+ ${ entry.imageUrl ? m$3`
28705
28743
  <img class="djs-popup-entry-icon" src=${ entry.imageUrl } />
28706
28744
  ` : null }
28707
28745
 
28708
- ${ entry.label ? m$2`
28746
+ ${ entry.label ? m$3`
28709
28747
  <span class="djs-popup-label">${ entry.label }</span>
28710
28748
  ` : null }
28711
28749
  </span>
28712
28750
  `) }
28713
28751
  </div>
28714
28752
  ` }
28715
- ${ originalEntries.length > 0 && m$2`
28753
+ ${ originalEntries.length > 0 && m$3`
28716
28754
  <div class="djs-popup-body">
28717
28755
 
28718
- ${ searchable && m$2`
28756
+ ${ searchable && m$3`
28719
28757
  <div class="djs-popup-search">
28720
28758
  <svg class="djs-popup-search-icon" width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
28721
28759
  <path fill-rule="evenodd" clip-rule="evenodd" d="M9.0325 8.5H9.625L13.3675 12.25L12.25 13.3675L8.5 9.625V9.0325L8.2975 8.8225C7.4425 9.5575 6.3325 10 5.125 10C2.4325 10 0.25 7.8175 0.25 5.125C0.25 2.4325 2.4325 0.25 5.125 0.25C7.8175 0.25 10 2.4325 10 5.125C10 6.3325 9.5575 7.4425 8.8225 8.2975L9.0325 8.5ZM1.75 5.125C1.75 6.9925 3.2575 8.5 5.125 8.5C6.9925 8.5 8.5 6.9925 8.5 5.125C8.5 3.2575 6.9925 1.75 5.125 1.75C3.2575 1.75 1.75 3.2575 1.75 5.125Z" fill="#22242A"/>
@@ -28734,7 +28772,7 @@
28734
28772
  onClick=${ onSelect }
28735
28773
  />
28736
28774
  </div>
28737
- ${ entries.length === 0 && m$2`
28775
+ ${ entries.length === 0 && m$3`
28738
28776
  <div class="djs-popup-no-results">No matching entries found.</div>
28739
28777
  ` }
28740
28778
  ` }
@@ -28787,7 +28825,7 @@
28787
28825
  popupRef.current && popupRef.current.focus();
28788
28826
  }, []);
28789
28827
 
28790
- return m$2`
28828
+ return m$3`
28791
28829
  <div
28792
28830
  class="djs-popup-backdrop"
28793
28831
  onClick=${ checkClose }
@@ -28918,7 +28956,7 @@
28918
28956
  const onSelect = (event, entry) => this.trigger(event, entry);
28919
28957
 
28920
28958
  P$2(
28921
- m$2`
28959
+ m$3`
28922
28960
  <${PopupMenuComponent}
28923
28961
  onClose=${ onClose }
28924
28962
  onSelect=${ onSelect }
@@ -29042,13 +29080,10 @@
29042
29080
 
29043
29081
  PopupMenu.prototype._createContainer = function(config) {
29044
29082
 
29045
- let parent = config && config.parent || 'body';
29046
-
29047
- if (typeof parent === 'string') {
29048
- parent = document.querySelector(parent);
29049
- }
29083
+ var canvas = this._canvas,
29084
+ parent = canvas.getContainer();
29050
29085
 
29051
- const container = domify$1(`<div class="djs-popup-parent djs-parent" data-popup=${config.provider}></div>`);
29086
+ const container = domify$1(`<div class="djs-popup-parent djs-scrollable" data-popup=${config.provider}></div>`);
29052
29087
 
29053
29088
  parent.appendChild(container);
29054
29089
 
@@ -39908,6 +39943,7 @@
39908
39943
  var directEditing = injector.get('directEditing', false);
39909
39944
  var searchPad = injector.get('searchPad', false);
39910
39945
  var modeling = injector.get('modeling', false);
39946
+ var contextPad = injector.get('contextPad', false);
39911
39947
 
39912
39948
  // (2) check components and register actions
39913
39949
 
@@ -40031,6 +40067,12 @@
40031
40067
  });
40032
40068
  }
40033
40069
 
40070
+ if (selection && contextPad) {
40071
+ this._registerAction('replaceElement', function(event) {
40072
+ contextPad.triggerEntry('replace', 'click', event);
40073
+ });
40074
+ }
40075
+
40034
40076
  };
40035
40077
 
40036
40078
  var EditorActionsModule = {
@@ -41149,6 +41191,23 @@
41149
41191
  }
41150
41192
  });
41151
41193
 
41194
+ // activate replace element
41195
+ // R
41196
+ addListener('replaceElement', function(context) {
41197
+
41198
+ var event = context.keyEvent;
41199
+
41200
+ if (keyboard.hasModifier(event)) {
41201
+ return;
41202
+ }
41203
+
41204
+ if (keyboard.isKey([ 'r', 'R' ], event)) {
41205
+ editorActions.trigger('replaceElement', event);
41206
+
41207
+ return true;
41208
+ }
41209
+ });
41210
+
41152
41211
  };
41153
41212
 
41154
41213
  var KeyboardModule = {
@@ -64434,10 +64493,11 @@
64434
64493
  /**
64435
64494
  Create a selection range.
64436
64495
  */
64437
- static range(anchor, head, goalColumn) {
64438
- let goal = (goalColumn !== null && goalColumn !== void 0 ? goalColumn : 33554431 /* RangeFlag.NoGoalColumn */) << 5 /* RangeFlag.GoalColumnOffset */;
64439
- return head < anchor ? SelectionRange.create(head, anchor, 16 /* RangeFlag.Inverted */ | goal | 8 /* RangeFlag.AssocAfter */)
64440
- : SelectionRange.create(anchor, head, goal | (head > anchor ? 4 /* RangeFlag.AssocBefore */ : 0));
64496
+ static range(anchor, head, goalColumn, bidiLevel) {
64497
+ let flags = ((goalColumn !== null && goalColumn !== void 0 ? goalColumn : 33554431 /* RangeFlag.NoGoalColumn */) << 5 /* RangeFlag.GoalColumnOffset */) |
64498
+ (bidiLevel == null ? 3 : Math.min(2, bidiLevel));
64499
+ return head < anchor ? SelectionRange.create(head, anchor, 16 /* RangeFlag.Inverted */ | 8 /* RangeFlag.AssocAfter */ | flags)
64500
+ : SelectionRange.create(anchor, head, (head > anchor ? 4 /* RangeFlag.AssocBefore */ : 0) | flags);
64441
64501
  }
64442
64502
  /**
64443
64503
  @internal
@@ -67267,6 +67327,26 @@
67267
67327
  }
67268
67328
  }
67269
67329
  }
67330
+ function scrollableParent(dom) {
67331
+ let doc = dom.ownerDocument;
67332
+ for (let cur = dom.parentNode; cur;) {
67333
+ if (cur == doc.body) {
67334
+ break;
67335
+ }
67336
+ else if (cur.nodeType == 1) {
67337
+ if (cur.scrollHeight > cur.clientHeight || cur.scrollWidth > cur.clientWidth)
67338
+ return cur;
67339
+ cur = cur.assignedSlot || cur.parentNode;
67340
+ }
67341
+ else if (cur.nodeType == 11) {
67342
+ cur = cur.host;
67343
+ }
67344
+ else {
67345
+ break;
67346
+ }
67347
+ }
67348
+ return null;
67349
+ }
67270
67350
  class DOMSelectionState {
67271
67351
  constructor() {
67272
67352
  this.anchorNode = null;
@@ -68403,7 +68483,9 @@
68403
68483
  super(-200000000 /* Side.Line */, -200000000 /* Side.Line */, null, spec);
68404
68484
  }
68405
68485
  eq(other) {
68406
- return other instanceof LineDecoration && attrsEq(this.spec.attributes, other.spec.attributes);
68486
+ return other instanceof LineDecoration &&
68487
+ this.spec.class == other.spec.class &&
68488
+ attrsEq(this.spec.attributes, other.spec.attributes);
68407
68489
  }
68408
68490
  range(from, to = from) {
68409
68491
  if (to != from)
@@ -68678,6 +68760,7 @@
68678
68760
  this.curLine = null;
68679
68761
  this.breakAtStart = 0;
68680
68762
  this.pendingBuffer = 0 /* Buf.No */;
68763
+ this.bufferMarks = [];
68681
68764
  // Set to false directly after a widget that covers the position after it
68682
68765
  this.atCursorPos = true;
68683
68766
  this.openStart = -1;
@@ -68700,20 +68783,20 @@
68700
68783
  }
68701
68784
  return this.curLine;
68702
68785
  }
68703
- flushBuffer(active) {
68786
+ flushBuffer(active = this.bufferMarks) {
68704
68787
  if (this.pendingBuffer) {
68705
68788
  this.curLine.append(wrapMarks(new WidgetBufferView(-1), active), active.length);
68706
68789
  this.pendingBuffer = 0 /* Buf.No */;
68707
68790
  }
68708
68791
  }
68709
68792
  addBlockWidget(view) {
68710
- this.flushBuffer([]);
68793
+ this.flushBuffer();
68711
68794
  this.curLine = null;
68712
68795
  this.content.push(view);
68713
68796
  }
68714
68797
  finish(openEnd) {
68715
- if (!openEnd)
68716
- this.flushBuffer([]);
68798
+ if (this.pendingBuffer && openEnd <= this.bufferMarks.length)
68799
+ this.flushBuffer();
68717
68800
  else
68718
68801
  this.pendingBuffer = 0 /* Buf.No */;
68719
68802
  if (!this.posCovered())
@@ -68733,8 +68816,9 @@
68733
68816
  this.content[this.content.length - 1].breakAfter = 1;
68734
68817
  else
68735
68818
  this.breakAtStart = 1;
68736
- this.flushBuffer([]);
68819
+ this.flushBuffer();
68737
68820
  this.curLine = null;
68821
+ this.atCursorPos = true;
68738
68822
  length--;
68739
68823
  continue;
68740
68824
  }
@@ -68776,7 +68860,7 @@
68776
68860
  else {
68777
68861
  let view = WidgetView.create(deco.widget || new NullWidget("span"), len, len ? 0 : deco.startSide);
68778
68862
  let cursorBefore = this.atCursorPos && !view.isEditable && openStart <= active.length && (from < to || deco.startSide > 0);
68779
- let cursorAfter = !view.isEditable && (from < to || deco.startSide <= 0);
68863
+ let cursorAfter = !view.isEditable && (from < to || openStart > active.length || deco.startSide <= 0);
68780
68864
  let line = this.getLine();
68781
68865
  if (this.pendingBuffer == 2 /* Buf.IfCursor */ && !cursorBefore)
68782
68866
  this.pendingBuffer = 0 /* Buf.No */;
@@ -68787,7 +68871,9 @@
68787
68871
  }
68788
68872
  line.append(wrapMarks(view, active), openStart);
68789
68873
  this.atCursorPos = cursorAfter;
68790
- this.pendingBuffer = !cursorAfter ? 0 /* Buf.No */ : from < to ? 1 /* Buf.Yes */ : 2 /* Buf.IfCursor */;
68874
+ this.pendingBuffer = !cursorAfter ? 0 /* Buf.No */ : from < to || openStart > active.length ? 1 /* Buf.Yes */ : 2 /* Buf.IfCursor */;
68875
+ if (this.pendingBuffer)
68876
+ this.bufferMarks = active.slice();
68791
68877
  }
68792
68878
  }
68793
68879
  else if (this.doc.lineAt(this.pos).from == this.pos) { // Line decoration
@@ -70461,22 +70547,30 @@
70461
70547
  this.compositionFirstChange = null;
70462
70548
  this.compositionEndedAt = 0;
70463
70549
  this.mouseSelection = null;
70550
+ let handleEvent = (handler, event) => {
70551
+ if (this.ignoreDuringComposition(event))
70552
+ return;
70553
+ if (event.type == "keydown" && this.keydown(view, event))
70554
+ return;
70555
+ if (this.mustFlushObserver(event))
70556
+ view.observer.forceFlush();
70557
+ if (this.runCustomHandlers(event.type, view, event))
70558
+ event.preventDefault();
70559
+ else
70560
+ handler(view, event);
70561
+ };
70464
70562
  for (let type in handlers) {
70465
70563
  let handler = handlers[type];
70466
- view.contentDOM.addEventListener(type, (event) => {
70467
- if (!eventBelongsToEditor(view, event) || this.ignoreDuringComposition(event))
70468
- return;
70469
- if (type == "keydown" && this.keydown(view, event))
70470
- return;
70471
- if (this.mustFlushObserver(event))
70472
- view.observer.forceFlush();
70473
- if (this.runCustomHandlers(type, view, event))
70474
- event.preventDefault();
70475
- else
70476
- handler(view, event);
70564
+ view.contentDOM.addEventListener(type, event => {
70565
+ if (eventBelongsToEditor(view, event))
70566
+ handleEvent(handler, event);
70477
70567
  }, handlerOptions[type]);
70478
70568
  this.registeredEvents.push(type);
70479
70569
  }
70570
+ view.scrollDOM.addEventListener("mousedown", (event) => {
70571
+ if (event.target == view.scrollDOM)
70572
+ handleEvent(handlers.mousedown, event);
70573
+ });
70480
70574
  if (browser.chrome && browser.chrome_version == 102) { // FIXME remove at some point
70481
70575
  // On Chrome 102, viewport updates somehow stop wheel-based
70482
70576
  // scrolling. Turning off pointer events during the scroll seems
@@ -70633,12 +70727,18 @@
70633
70727
  const EmacsyPendingKeys = "dthko";
70634
70728
  // Key codes for modifier keys
70635
70729
  const modifierCodes = [16, 17, 18, 20, 91, 92, 224, 225];
70730
+ function dragScrollSpeed(dist) {
70731
+ return dist * 0.7 + 8;
70732
+ }
70636
70733
  class MouseSelection {
70637
70734
  constructor(view, startEvent, style, mustSelect) {
70638
70735
  this.view = view;
70639
70736
  this.style = style;
70640
70737
  this.mustSelect = mustSelect;
70738
+ this.scrollSpeed = { x: 0, y: 0 };
70739
+ this.scrolling = -1;
70641
70740
  this.lastEvent = startEvent;
70741
+ this.scrollParent = scrollableParent(view.contentDOM);
70642
70742
  let doc = view.contentDOM.ownerDocument;
70643
70743
  doc.addEventListener("mousemove", this.move = this.move.bind(this));
70644
70744
  doc.addEventListener("mouseup", this.up = this.up.bind(this));
@@ -70654,11 +70754,24 @@
70654
70754
  }
70655
70755
  }
70656
70756
  move(event) {
70757
+ var _a;
70657
70758
  if (event.buttons == 0)
70658
70759
  return this.destroy();
70659
70760
  if (this.dragging !== false)
70660
70761
  return;
70661
70762
  this.select(this.lastEvent = event);
70763
+ let sx = 0, sy = 0;
70764
+ let rect = ((_a = this.scrollParent) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect())
70765
+ || { left: 0, top: 0, right: this.view.win.innerWidth, bottom: this.view.win.innerHeight };
70766
+ if (event.clientX <= rect.left)
70767
+ sx = -dragScrollSpeed(rect.left - event.clientX);
70768
+ else if (event.clientX >= rect.right)
70769
+ sx = dragScrollSpeed(event.clientX - rect.right);
70770
+ if (event.clientY <= rect.top)
70771
+ sy = -dragScrollSpeed(rect.top - event.clientY);
70772
+ else if (event.clientY >= rect.bottom)
70773
+ sy = dragScrollSpeed(event.clientY - rect.bottom);
70774
+ this.setScrollSpeed(sx, sy);
70662
70775
  }
70663
70776
  up(event) {
70664
70777
  if (this.dragging == null)
@@ -70668,19 +70781,41 @@
70668
70781
  this.destroy();
70669
70782
  }
70670
70783
  destroy() {
70784
+ this.setScrollSpeed(0, 0);
70671
70785
  let doc = this.view.contentDOM.ownerDocument;
70672
70786
  doc.removeEventListener("mousemove", this.move);
70673
70787
  doc.removeEventListener("mouseup", this.up);
70674
70788
  this.view.inputState.mouseSelection = null;
70675
70789
  }
70790
+ setScrollSpeed(sx, sy) {
70791
+ this.scrollSpeed = { x: sx, y: sy };
70792
+ if (sx || sy) {
70793
+ if (this.scrolling < 0)
70794
+ this.scrolling = setInterval(() => this.scroll(), 50);
70795
+ }
70796
+ else if (this.scrolling > -1) {
70797
+ clearInterval(this.scrolling);
70798
+ this.scrolling = -1;
70799
+ }
70800
+ }
70801
+ scroll() {
70802
+ if (this.scrollParent) {
70803
+ this.scrollParent.scrollLeft += this.scrollSpeed.x;
70804
+ this.scrollParent.scrollTop += this.scrollSpeed.y;
70805
+ }
70806
+ else {
70807
+ this.view.win.scrollBy(this.scrollSpeed.x, this.scrollSpeed.y);
70808
+ }
70809
+ if (this.dragging === false)
70810
+ this.select(this.lastEvent);
70811
+ }
70676
70812
  select(event) {
70677
70813
  let selection = this.style.get(event, this.extend, this.multiple);
70678
70814
  if (this.mustSelect || !selection.eq(this.view.state.selection) ||
70679
70815
  selection.main.assoc != this.view.state.selection.main.assoc)
70680
70816
  this.view.dispatch({
70681
70817
  selection,
70682
- userEvent: "select.pointer",
70683
- scrollIntoView: true
70818
+ userEvent: "select.pointer"
70684
70819
  });
70685
70820
  this.mustSelect = false;
70686
70821
  }
@@ -70871,23 +71006,15 @@
70871
71006
  function basicMouseSelection(view, event) {
70872
71007
  let start = queryPos(view, event), type = getClickType(event);
70873
71008
  let startSel = view.state.selection;
70874
- let last = start, lastEvent = event;
70875
71009
  return {
70876
71010
  update(update) {
70877
71011
  if (update.docChanged) {
70878
71012
  start.pos = update.changes.mapPos(start.pos);
70879
71013
  startSel = startSel.map(update.changes);
70880
- lastEvent = null;
70881
71014
  }
70882
71015
  },
70883
71016
  get(event, extend, multiple) {
70884
- let cur;
70885
- if (lastEvent && event.clientX == lastEvent.clientX && event.clientY == lastEvent.clientY)
70886
- cur = last;
70887
- else {
70888
- cur = last = queryPos(view, event);
70889
- lastEvent = event;
70890
- }
71017
+ let cur = queryPos(view, event);
70891
71018
  let range = rangeForClick(view, cur.pos, cur.bias, type);
70892
71019
  if (start.pos != cur.pos && !extend) {
70893
71020
  let startRange = rangeForClick(view, start.pos, start.bias, type);
@@ -72333,7 +72460,7 @@
72333
72460
  });
72334
72461
  }
72335
72462
  const baseTheme$1$1 = /*@__PURE__*/buildTheme("." + baseThemeID, {
72336
- "&.cm-editor": {
72463
+ "&": {
72337
72464
  position: "relative !important",
72338
72465
  boxSizing: "border-box",
72339
72466
  "&.cm-focused": {
@@ -72364,7 +72491,6 @@
72364
72491
  margin: 0,
72365
72492
  flexGrow: 2,
72366
72493
  flexShrink: 0,
72367
- minHeight: "100%",
72368
72494
  display: "block",
72369
72495
  whiteSpace: "pre",
72370
72496
  wordWrap: "normal",
@@ -72386,14 +72512,13 @@
72386
72512
  "&dark .cm-content": { caretColor: "white" },
72387
72513
  ".cm-line": {
72388
72514
  display: "block",
72389
- padding: "0 2px 0 4px"
72390
- },
72391
- ".cm-selectionLayer": {
72392
- zIndex: -1,
72393
- contain: "size style"
72515
+ padding: "0 2px 0 6px"
72394
72516
  },
72395
- ".cm-selectionBackground": {
72396
- position: "absolute",
72517
+ ".cm-layer": {
72518
+ contain: "size style",
72519
+ "& > *": {
72520
+ position: "absolute"
72521
+ }
72397
72522
  },
72398
72523
  "&light .cm-selectionBackground": {
72399
72524
  background: "#d9d9d9"
@@ -72408,8 +72533,6 @@
72408
72533
  background: "#233"
72409
72534
  },
72410
72535
  ".cm-cursorLayer": {
72411
- zIndex: 100,
72412
- contain: "size style",
72413
72536
  pointerEvents: "none"
72414
72537
  },
72415
72538
  "&.cm-focused .cm-cursorLayer": {
@@ -72421,7 +72544,6 @@
72421
72544
  "@keyframes cm-blink": { "0%": {}, "50%": { opacity: 0 }, "100%": {} },
72422
72545
  "@keyframes cm-blink2": { "0%": {}, "50%": { opacity: 0 }, "100%": {} },
72423
72546
  ".cm-cursor, .cm-dropCursor": {
72424
- position: "absolute",
72425
72547
  borderLeft: "1.2px solid black",
72426
72548
  marginLeft: "-0.6px",
72427
72549
  pointerEvents: "none",
@@ -72515,6 +72637,21 @@
72515
72637
  display: "inline-block",
72516
72638
  verticalAlign: "top",
72517
72639
  },
72640
+ ".cm-highlightSpace:before": {
72641
+ content: "attr(data-display)",
72642
+ position: "absolute",
72643
+ pointerEvents: "none",
72644
+ color: "#888"
72645
+ },
72646
+ ".cm-highlightTab": {
72647
+ backgroundImage: `url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="200" height="20"><path stroke="%23888" stroke-width="1" fill="none" d="M1 10H196L190 5M190 15L196 10M197 4L197 16"/></svg>')`,
72648
+ backgroundSize: "auto 100%",
72649
+ backgroundPosition: "right 90%",
72650
+ backgroundRepeat: "no-repeat"
72651
+ },
72652
+ ".cm-trailingSpace": {
72653
+ backgroundColor: "#ff332255"
72654
+ },
72518
72655
  ".cm-button": {
72519
72656
  verticalAlign: "middle",
72520
72657
  color: "inherit",
@@ -72607,7 +72744,7 @@
72607
72744
  insert: Text.of(domChange.text.slice(diff.from, diff.toB).split(LineBreakPlaceholder)) };
72608
72745
  }
72609
72746
  }
72610
- else if (newSel && (!view.hasFocus || !view.state.facet(editable) || newSel.main.eq(sel))) {
72747
+ else if (newSel && (!view.hasFocus && view.state.facet(editable) || newSel.main.eq(sel))) {
72611
72748
  newSel = null;
72612
72749
  }
72613
72750
  if (!change && !newSel)
@@ -72817,7 +72954,8 @@
72817
72954
  this.lastChange = 0;
72818
72955
  this.scrollTargets = [];
72819
72956
  this.intersection = null;
72820
- this.resize = null;
72957
+ this.resizeScroll = null;
72958
+ this.resizeContent = null;
72821
72959
  this.intersecting = false;
72822
72960
  this.gapIntersection = null;
72823
72961
  this.gaps = [];
@@ -72855,12 +72993,14 @@
72855
72993
  this.onPrint = this.onPrint.bind(this);
72856
72994
  this.onScroll = this.onScroll.bind(this);
72857
72995
  if (typeof ResizeObserver == "function") {
72858
- this.resize = new ResizeObserver(() => {
72996
+ this.resizeScroll = new ResizeObserver(() => {
72859
72997
  var _a;
72860
72998
  if (((_a = this.view.docView) === null || _a === void 0 ? void 0 : _a.lastUpdate) < Date.now() - 75)
72861
72999
  this.onResize();
72862
73000
  });
72863
- this.resize.observe(view.scrollDOM);
73001
+ this.resizeScroll.observe(view.scrollDOM);
73002
+ this.resizeContent = new ResizeObserver(() => this.view.requestMeasure());
73003
+ this.resizeContent.observe(view.contentDOM);
72864
73004
  }
72865
73005
  this.addWindowListeners(this.win = view.win);
72866
73006
  this.start();
@@ -73179,11 +73319,12 @@
73179
73319
  win.document.removeEventListener("selectionchange", this.onSelectionChange);
73180
73320
  }
73181
73321
  destroy() {
73182
- var _a, _b, _c;
73322
+ var _a, _b, _c, _d;
73183
73323
  this.stop();
73184
73324
  (_a = this.intersection) === null || _a === void 0 ? void 0 : _a.disconnect();
73185
73325
  (_b = this.gapIntersection) === null || _b === void 0 ? void 0 : _b.disconnect();
73186
- (_c = this.resize) === null || _c === void 0 ? void 0 : _c.disconnect();
73326
+ (_c = this.resizeScroll) === null || _c === void 0 ? void 0 : _c.disconnect();
73327
+ (_d = this.resizeContent) === null || _d === void 0 ? void 0 : _d.disconnect();
73187
73328
  for (let dom of this.scrollTargets)
73188
73329
  dom.removeEventListener("scroll", this.onScroll);
73189
73330
  this.removeWindowListeners(this.win);
@@ -73282,7 +73423,7 @@
73282
73423
  this.scrollDOM.className = "cm-scroller";
73283
73424
  this.scrollDOM.appendChild(this.contentDOM);
73284
73425
  this.announceDOM = document.createElement("div");
73285
- this.announceDOM.style.cssText = "position: absolute; top: -10000px";
73426
+ this.announceDOM.style.cssText = "position: fixed; top: -10000px";
73286
73427
  this.announceDOM.setAttribute("aria-live", "polite");
73287
73428
  this.dom = document.createElement("div");
73288
73429
  this.dom.appendChild(this.announceDOM);
@@ -73667,6 +73808,8 @@
73667
73808
  if (this.measureScheduled < 0)
73668
73809
  this.measureScheduled = this.win.requestAnimationFrame(() => this.measure());
73669
73810
  if (request) {
73811
+ if (this.measureRequests.indexOf(request) > -1)
73812
+ return;
73670
73813
  if (request.key != null)
73671
73814
  for (let i = 0; i < this.measureRequests.length; i++) {
73672
73815
  if (this.measureRequests[i].key === request.key) {
@@ -74342,6 +74485,8 @@
74342
74485
  if (runFor(scopeObj[prefix + modifiers(name, event, !isChar)]))
74343
74486
  return true;
74344
74487
  if (isChar && (event.altKey || event.metaKey || event.ctrlKey) &&
74488
+ // Ctrl-Alt may be used for AltGr on Windows
74489
+ !(browser.windows && event.ctrlKey && event.altKey) &&
74345
74490
  (baseName = base[event.keyCode]) && baseName != name) {
74346
74491
  if (runFor(scopeObj[prefix + modifiers(baseName, event, true)]))
74347
74492
  return true;
@@ -74579,6 +74724,17 @@
74579
74724
  : pos.bottom + (size.bottom - size.top) + offset.y > space.bottom) &&
74580
74725
  above == (space.bottom - pos.bottom > pos.top - space.top))
74581
74726
  above = !above;
74727
+ let spaceVert = (above ? pos.top - space.top : space.bottom - pos.bottom) - arrowHeight;
74728
+ if (spaceVert < height && tView.resize !== false) {
74729
+ if (spaceVert < this.view.defaultLineHeight) {
74730
+ dom.style.top = Outside;
74731
+ continue;
74732
+ }
74733
+ dom.style.height = (height = spaceVert) + "px";
74734
+ }
74735
+ else if (dom.style.height) {
74736
+ dom.style.height = "";
74737
+ }
74582
74738
  let top = above ? pos.top - height - arrowHeight - offset.y : pos.bottom + arrowHeight + offset.y;
74583
74739
  let right = left + width;
74584
74740
  if (tView.overlap !== true)
@@ -74622,7 +74778,8 @@
74622
74778
  });
74623
74779
  const baseTheme$4 = /*@__PURE__*/EditorView.baseTheme({
74624
74780
  ".cm-tooltip": {
74625
- zIndex: 100
74781
+ zIndex: 100,
74782
+ boxSizing: "border-box"
74626
74783
  },
74627
74784
  "&light .cm-tooltip": {
74628
74785
  border: "1px solid #bbb",
@@ -75187,8 +75344,8 @@
75187
75344
  /// Define a node type.
75188
75345
  static define(spec) {
75189
75346
  let props = spec.props && spec.props.length ? Object.create(null) : noProps;
75190
- let flags = (spec.top ? 1 /* Top */ : 0) | (spec.skipped ? 2 /* Skipped */ : 0) |
75191
- (spec.error ? 4 /* Error */ : 0) | (spec.name == null ? 8 /* Anonymous */ : 0);
75347
+ let flags = (spec.top ? 1 /* NodeFlag.Top */ : 0) | (spec.skipped ? 2 /* NodeFlag.Skipped */ : 0) |
75348
+ (spec.error ? 4 /* NodeFlag.Error */ : 0) | (spec.name == null ? 8 /* NodeFlag.Anonymous */ : 0);
75192
75349
  let type = new NodeType(spec.name || "", props, spec.id, flags);
75193
75350
  if (spec.props)
75194
75351
  for (let src of spec.props) {
@@ -75206,14 +75363,14 @@
75206
75363
  /// the prop isn't present on this node.
75207
75364
  prop(prop) { return this.props[prop.id]; }
75208
75365
  /// True when this is the top node of a grammar.
75209
- get isTop() { return (this.flags & 1 /* Top */) > 0; }
75366
+ get isTop() { return (this.flags & 1 /* NodeFlag.Top */) > 0; }
75210
75367
  /// True when this node is produced by a skip rule.
75211
- get isSkipped() { return (this.flags & 2 /* Skipped */) > 0; }
75368
+ get isSkipped() { return (this.flags & 2 /* NodeFlag.Skipped */) > 0; }
75212
75369
  /// Indicates whether this is an error node.
75213
- get isError() { return (this.flags & 4 /* Error */) > 0; }
75370
+ get isError() { return (this.flags & 4 /* NodeFlag.Error */) > 0; }
75214
75371
  /// When true, this node type doesn't correspond to a user-declared
75215
75372
  /// named node, for example because it is used to cache repetition.
75216
- get isAnonymous() { return (this.flags & 8 /* Anonymous */) > 0; }
75373
+ get isAnonymous() { return (this.flags & 8 /* NodeFlag.Anonymous */) > 0; }
75217
75374
  /// Returns true when this node's name or one of its
75218
75375
  /// [groups](#common.NodeProp^group) matches the given string.
75219
75376
  is(name) {
@@ -75246,7 +75403,7 @@
75246
75403
  }
75247
75404
  }
75248
75405
  /// An empty dummy node type to use when no actual type is available.
75249
- NodeType.none = new NodeType("", Object.create(null), 0, 8 /* Anonymous */);
75406
+ NodeType.none = new NodeType("", Object.create(null), 0, 8 /* NodeFlag.Anonymous */);
75250
75407
  /// A node set holds a collection of node types. It is used to
75251
75408
  /// compactly represent trees by storing their type ids, rather than a
75252
75409
  /// full pointer to the type object, in a numeric array. Each parser
@@ -75455,7 +75612,7 @@
75455
75612
  /// which may have children grouped into subtrees with type
75456
75613
  /// [`NodeType.none`](#common.NodeType^none).
75457
75614
  balance(config = {}) {
75458
- return this.children.length <= 8 /* BranchFactor */ ? this :
75615
+ return this.children.length <= 8 /* Balance.BranchFactor */ ? this :
75459
75616
  balanceRange(NodeType.none, this.children, this.positions, 0, this.children.length, 0, this.length, (children, positions, length) => new Tree(this.type, children, positions, length, this.propValues), config.makeTree || ((children, positions, length) => new Tree(NodeType.none, children, positions, length)));
75460
75617
  }
75461
75618
  /// Build a tree from a postfix-ordered buffer of node information,
@@ -75534,26 +75691,27 @@
75534
75691
  return pick;
75535
75692
  }
75536
75693
  /// @internal
75537
- slice(startI, endI, from, to) {
75694
+ slice(startI, endI, from) {
75538
75695
  let b = this.buffer;
75539
- let copy = new Uint16Array(endI - startI);
75696
+ let copy = new Uint16Array(endI - startI), len = 0;
75540
75697
  for (let i = startI, j = 0; i < endI;) {
75541
75698
  copy[j++] = b[i++];
75542
75699
  copy[j++] = b[i++] - from;
75543
- copy[j++] = b[i++] - from;
75700
+ let to = copy[j++] = b[i++] - from;
75544
75701
  copy[j++] = b[i++] - startI;
75702
+ len = Math.max(len, to);
75545
75703
  }
75546
- return new TreeBuffer(copy, to - from, this.set);
75704
+ return new TreeBuffer(copy, len, this.set);
75547
75705
  }
75548
75706
  }
75549
75707
  function checkSide(side, pos, from, to) {
75550
75708
  switch (side) {
75551
- case -2 /* Before */: return from < pos;
75552
- case -1 /* AtOrBefore */: return to >= pos && from < pos;
75553
- case 0 /* Around */: return from < pos && to > pos;
75554
- case 1 /* AtOrAfter */: return from <= pos && to > pos;
75555
- case 2 /* After */: return to > pos;
75556
- case 4 /* DontCare */: return true;
75709
+ case -2 /* Side.Before */: return from < pos;
75710
+ case -1 /* Side.AtOrBefore */: return to >= pos && from < pos;
75711
+ case 0 /* Side.Around */: return from < pos && to > pos;
75712
+ case 1 /* Side.AtOrAfter */: return from <= pos && to > pos;
75713
+ case 2 /* Side.After */: return to > pos;
75714
+ case 4 /* Side.DontCare */: return true;
75557
75715
  }
75558
75716
  }
75559
75717
  function enterUnfinishedNodesBefore(node, pos) {
@@ -75643,10 +75801,10 @@
75643
75801
  return null;
75644
75802
  }
75645
75803
  }
75646
- get firstChild() { return this.nextChild(0, 1, 0, 4 /* DontCare */); }
75647
- get lastChild() { return this.nextChild(this._tree.children.length - 1, -1, 0, 4 /* DontCare */); }
75648
- childAfter(pos) { return this.nextChild(0, 1, pos, 2 /* After */); }
75649
- childBefore(pos) { return this.nextChild(this._tree.children.length - 1, -1, pos, -2 /* Before */); }
75804
+ get firstChild() { return this.nextChild(0, 1, 0, 4 /* Side.DontCare */); }
75805
+ get lastChild() { return this.nextChild(this._tree.children.length - 1, -1, 0, 4 /* Side.DontCare */); }
75806
+ childAfter(pos) { return this.nextChild(0, 1, pos, 2 /* Side.After */); }
75807
+ childBefore(pos) { return this.nextChild(this._tree.children.length - 1, -1, pos, -2 /* Side.Before */); }
75650
75808
  enter(pos, side, mode = 0) {
75651
75809
  let mounted;
75652
75810
  if (!(mode & IterMode.IgnoreOverlays) && (mounted = this._tree.prop(NodeProp.mounted)) && mounted.overlay) {
@@ -75669,10 +75827,10 @@
75669
75827
  return this._parent ? this._parent.nextSignificantParent() : null;
75670
75828
  }
75671
75829
  get nextSibling() {
75672
- return this._parent && this.index >= 0 ? this._parent.nextChild(this.index + 1, 1, 0, 4 /* DontCare */) : null;
75830
+ return this._parent && this.index >= 0 ? this._parent.nextChild(this.index + 1, 1, 0, 4 /* Side.DontCare */) : null;
75673
75831
  }
75674
75832
  get prevSibling() {
75675
- return this._parent && this.index >= 0 ? this._parent.nextChild(this.index - 1, -1, 0, 4 /* DontCare */) : null;
75833
+ return this._parent && this.index >= 0 ? this._parent.nextChild(this.index - 1, -1, 0, 4 /* Side.DontCare */) : null;
75676
75834
  }
75677
75835
  cursor(mode = 0) { return new TreeCursor(this, mode); }
75678
75836
  get tree() { return this._tree; }
@@ -75734,24 +75892,24 @@
75734
75892
  }
75735
75893
  }
75736
75894
  class BufferNode {
75895
+ get name() { return this.type.name; }
75896
+ get from() { return this.context.start + this.context.buffer.buffer[this.index + 1]; }
75897
+ get to() { return this.context.start + this.context.buffer.buffer[this.index + 2]; }
75737
75898
  constructor(context, _parent, index) {
75738
75899
  this.context = context;
75739
75900
  this._parent = _parent;
75740
75901
  this.index = index;
75741
75902
  this.type = context.buffer.set.types[context.buffer.buffer[index]];
75742
75903
  }
75743
- get name() { return this.type.name; }
75744
- get from() { return this.context.start + this.context.buffer.buffer[this.index + 1]; }
75745
- get to() { return this.context.start + this.context.buffer.buffer[this.index + 2]; }
75746
75904
  child(dir, pos, side) {
75747
75905
  let { buffer } = this.context;
75748
75906
  let index = buffer.findChild(this.index + 4, buffer.buffer[this.index + 3], dir, pos - this.context.start, side);
75749
75907
  return index < 0 ? null : new BufferNode(this.context, this, index);
75750
75908
  }
75751
- get firstChild() { return this.child(1, 0, 4 /* DontCare */); }
75752
- get lastChild() { return this.child(-1, 0, 4 /* DontCare */); }
75753
- childAfter(pos) { return this.child(1, pos, 2 /* After */); }
75754
- childBefore(pos) { return this.child(-1, pos, -2 /* Before */); }
75909
+ get firstChild() { return this.child(1, 0, 4 /* Side.DontCare */); }
75910
+ get lastChild() { return this.child(-1, 0, 4 /* Side.DontCare */); }
75911
+ childAfter(pos) { return this.child(1, pos, 2 /* Side.After */); }
75912
+ childBefore(pos) { return this.child(-1, pos, -2 /* Side.Before */); }
75755
75913
  enter(pos, side, mode = 0) {
75756
75914
  if (mode & IterMode.ExcludeBuffers)
75757
75915
  return null;
@@ -75763,7 +75921,7 @@
75763
75921
  return this._parent || this.context.parent.nextSignificantParent();
75764
75922
  }
75765
75923
  externalSibling(dir) {
75766
- return this._parent ? null : this.context.parent.nextChild(this.context.index + dir, dir, 0, 4 /* DontCare */);
75924
+ return this._parent ? null : this.context.parent.nextChild(this.context.index + dir, dir, 0, 4 /* Side.DontCare */);
75767
75925
  }
75768
75926
  get nextSibling() {
75769
75927
  let { buffer } = this.context;
@@ -75777,7 +75935,7 @@
75777
75935
  let parentStart = this._parent ? this._parent.index + 4 : 0;
75778
75936
  if (this.index == parentStart)
75779
75937
  return this.externalSibling(-1);
75780
- return new BufferNode(this.context, this._parent, buffer.findChild(parentStart, this.index, -1, 0, 4 /* DontCare */));
75938
+ return new BufferNode(this.context, this._parent, buffer.findChild(parentStart, this.index, -1, 0, 4 /* Side.DontCare */));
75781
75939
  }
75782
75940
  cursor(mode = 0) { return new TreeCursor(this, mode); }
75783
75941
  get tree() { return null; }
@@ -75786,8 +75944,8 @@
75786
75944
  let { buffer } = this.context;
75787
75945
  let startI = this.index + 4, endI = buffer.buffer[this.index + 3];
75788
75946
  if (endI > startI) {
75789
- let from = buffer.buffer[this.index + 1], to = buffer.buffer[this.index + 2];
75790
- children.push(buffer.slice(startI, endI, from, to));
75947
+ let from = buffer.buffer[this.index + 1];
75948
+ children.push(buffer.slice(startI, endI, from));
75791
75949
  positions.push(0);
75792
75950
  }
75793
75951
  return new Tree(this.type, children, positions, this.to - this.from);
@@ -75814,6 +75972,8 @@
75814
75972
  /// A tree cursor object focuses on a given node in a syntax tree, and
75815
75973
  /// allows you to move to adjacent nodes.
75816
75974
  class TreeCursor {
75975
+ /// Shorthand for `.type.name`.
75976
+ get name() { return this.type.name; }
75817
75977
  /// @internal
75818
75978
  constructor(node,
75819
75979
  /// @internal
@@ -75837,8 +75997,6 @@
75837
75997
  this.yieldBuf(node.index);
75838
75998
  }
75839
75999
  }
75840
- /// Shorthand for `.type.name`.
75841
- get name() { return this.type.name; }
75842
76000
  yieldNode(node) {
75843
76001
  if (!node)
75844
76002
  return false;
@@ -75883,13 +76041,13 @@
75883
76041
  }
75884
76042
  /// Move the cursor to this node's first child. When this returns
75885
76043
  /// false, the node has no child, and the cursor has not been moved.
75886
- firstChild() { return this.enterChild(1, 0, 4 /* DontCare */); }
76044
+ firstChild() { return this.enterChild(1, 0, 4 /* Side.DontCare */); }
75887
76045
  /// Move the cursor to this node's last child.
75888
- lastChild() { return this.enterChild(-1, 0, 4 /* DontCare */); }
76046
+ lastChild() { return this.enterChild(-1, 0, 4 /* Side.DontCare */); }
75889
76047
  /// Move the cursor to the first child that ends after `pos`.
75890
- childAfter(pos) { return this.enterChild(1, pos, 2 /* After */); }
76048
+ childAfter(pos) { return this.enterChild(1, pos, 2 /* Side.After */); }
75891
76049
  /// Move to the last child that starts before `pos`.
75892
- childBefore(pos) { return this.enterChild(-1, pos, -2 /* Before */); }
76050
+ childBefore(pos) { return this.enterChild(-1, pos, -2 /* Side.Before */); }
75893
76051
  /// Move the cursor to the child around `pos`. If side is -1 the
75894
76052
  /// child may end at that position, when 1 it may start there. This
75895
76053
  /// will also enter [overlaid](#common.MountedTree.overlay)
@@ -75915,19 +76073,19 @@
75915
76073
  if (!this.buffer)
75916
76074
  return !this._tree._parent ? false
75917
76075
  : this.yield(this._tree.index < 0 ? null
75918
- : this._tree._parent.nextChild(this._tree.index + dir, dir, 0, 4 /* DontCare */, this.mode));
76076
+ : this._tree._parent.nextChild(this._tree.index + dir, dir, 0, 4 /* Side.DontCare */, this.mode));
75919
76077
  let { buffer } = this.buffer, d = this.stack.length - 1;
75920
76078
  if (dir < 0) {
75921
76079
  let parentStart = d < 0 ? 0 : this.stack[d] + 4;
75922
76080
  if (this.index != parentStart)
75923
- return this.yieldBuf(buffer.findChild(parentStart, this.index, -1, 0, 4 /* DontCare */));
76081
+ return this.yieldBuf(buffer.findChild(parentStart, this.index, -1, 0, 4 /* Side.DontCare */));
75924
76082
  }
75925
76083
  else {
75926
76084
  let after = buffer.buffer[this.index + 3];
75927
76085
  if (after < (d < 0 ? buffer.buffer.length : buffer.buffer[this.stack[d] + 3]))
75928
76086
  return this.yieldBuf(after);
75929
76087
  }
75930
- return d < 0 ? this.yield(this.buffer.parent.nextChild(this.buffer.index + dir, dir, 0, 4 /* DontCare */, this.mode)) : false;
76088
+ return d < 0 ? this.yield(this.buffer.parent.nextChild(this.buffer.index + dir, dir, 0, 4 /* Side.DontCare */, this.mode)) : false;
75931
76089
  }
75932
76090
  /// Move to this node's next sibling, if any.
75933
76091
  nextSibling() { return this.sibling(1); }
@@ -75964,7 +76122,7 @@
75964
76122
  return true;
75965
76123
  }
75966
76124
  move(dir, enter) {
75967
- if (enter && this.enterChild(dir, 0, 4 /* DontCare */))
76125
+ if (enter && this.enterChild(dir, 0, 4 /* Side.DontCare */))
75968
76126
  return true;
75969
76127
  for (;;) {
75970
76128
  if (this.sibling(dir))
@@ -75974,7 +76132,7 @@
75974
76132
  }
75975
76133
  }
75976
76134
  /// Move to the next node in a
75977
- /// [pre-order](https://en.wikipedia.org/wiki/Tree_traversal#Pre-order_(NLR))
76135
+ /// [pre-order](https://en.wikipedia.org/wiki/Tree_traversal#Pre-order,_NLR)
75978
76136
  /// traversal, going from a node to its first child or, if the
75979
76137
  /// current node is empty or `enter` is false, its next sibling or
75980
76138
  /// the next sibling of the first parent node that has one.
@@ -76090,17 +76248,17 @@
76090
76248
  let lookAheadAtStart = lookAhead;
76091
76249
  while (size < 0) {
76092
76250
  cursor.next();
76093
- if (size == -1 /* Reuse */) {
76251
+ if (size == -1 /* SpecialRecord.Reuse */) {
76094
76252
  let node = reused[id];
76095
76253
  children.push(node);
76096
76254
  positions.push(start - parentStart);
76097
76255
  return;
76098
76256
  }
76099
- else if (size == -3 /* ContextChange */) { // Context change
76257
+ else if (size == -3 /* SpecialRecord.ContextChange */) { // Context change
76100
76258
  contextHash = id;
76101
76259
  return;
76102
76260
  }
76103
- else if (size == -4 /* LookAhead */) {
76261
+ else if (size == -4 /* SpecialRecord.LookAhead */) {
76104
76262
  lookAhead = id;
76105
76263
  return;
76106
76264
  }
@@ -76217,7 +76375,7 @@
76217
76375
  fork.next();
76218
76376
  while (fork.pos > startPos) {
76219
76377
  if (fork.size < 0) {
76220
- if (fork.size == -3 /* ContextChange */)
76378
+ if (fork.size == -3 /* SpecialRecord.ContextChange */)
76221
76379
  localSkipped += 4;
76222
76380
  else
76223
76381
  break scan;
@@ -76253,10 +76411,10 @@
76253
76411
  buffer[--index] = start - bufferStart;
76254
76412
  buffer[--index] = id;
76255
76413
  }
76256
- else if (size == -3 /* ContextChange */) {
76414
+ else if (size == -3 /* SpecialRecord.ContextChange */) {
76257
76415
  contextHash = id;
76258
76416
  }
76259
- else if (size == -4 /* LookAhead */) {
76417
+ else if (size == -4 /* SpecialRecord.LookAhead */) {
76260
76418
  lookAhead = id;
76261
76419
  }
76262
76420
  return index;
@@ -76303,7 +76461,7 @@
76303
76461
  let total = 0;
76304
76462
  for (let i = from; i < to; i++)
76305
76463
  total += nodeSize(balanceType, children[i]);
76306
- let maxChild = Math.ceil((total * 1.5) / 8 /* BranchFactor */);
76464
+ let maxChild = Math.ceil((total * 1.5) / 8 /* Balance.BranchFactor */);
76307
76465
  let localChildren = [], localPositions = [];
76308
76466
  function divide(children, positions, from, to, offset) {
76309
76467
  for (let i = from; i < to;) {
@@ -76364,16 +76522,16 @@
76364
76522
  this.to = to;
76365
76523
  this.tree = tree;
76366
76524
  this.offset = offset;
76367
- this.open = (openStart ? 1 /* Start */ : 0) | (openEnd ? 2 /* End */ : 0);
76525
+ this.open = (openStart ? 1 /* Open.Start */ : 0) | (openEnd ? 2 /* Open.End */ : 0);
76368
76526
  }
76369
76527
  /// Whether the start of the fragment represents the start of a
76370
76528
  /// parse, or the end of a change. (In the second case, it may not
76371
76529
  /// be safe to reuse some nodes at the start, depending on the
76372
76530
  /// parsing algorithm.)
76373
- get openStart() { return (this.open & 1 /* Start */) > 0; }
76531
+ get openStart() { return (this.open & 1 /* Open.Start */) > 0; }
76374
76532
  /// Whether the end of the fragment represents the end of a
76375
76533
  /// full-document parse, or the start of a change.
76376
- get openEnd() { return (this.open & 2 /* End */) > 0; }
76534
+ get openEnd() { return (this.open & 2 /* Open.End */) > 0; }
76377
76535
  /// Create a set of fragments from a freshly parsed tree, or update
76378
76536
  /// an existing set of fragments by replacing the ones that overlap
76379
76537
  /// with a tree with content from the new tree. When `partial` is
@@ -76617,10 +76775,10 @@
76617
76775
  tags = [tags];
76618
76776
  for (let part of prop.split(" "))
76619
76777
  if (part) {
76620
- let pieces = [], mode = 2 /* Normal */, rest = part;
76778
+ let pieces = [], mode = 2 /* Mode.Normal */, rest = part;
76621
76779
  for (let pos = 0;;) {
76622
76780
  if (rest == "..." && pos > 0 && pos + 3 == part.length) {
76623
- mode = 1 /* Inherit */;
76781
+ mode = 1 /* Mode.Inherit */;
76624
76782
  break;
76625
76783
  }
76626
76784
  let m = /^"(?:[^"\\]|\\.)*?"|[^\/!]+/.exec(rest);
@@ -76632,7 +76790,7 @@
76632
76790
  break;
76633
76791
  let next = part[pos++];
76634
76792
  if (pos == part.length && next == "!") {
76635
- mode = 0 /* Opaque */;
76793
+ mode = 0 /* Mode.Opaque */;
76636
76794
  break;
76637
76795
  }
76638
76796
  if (next != "/")
@@ -76656,8 +76814,8 @@
76656
76814
  this.context = context;
76657
76815
  this.next = next;
76658
76816
  }
76659
- get opaque() { return this.mode == 0 /* Opaque */; }
76660
- get inherit() { return this.mode == 1 /* Inherit */; }
76817
+ get opaque() { return this.mode == 0 /* Mode.Opaque */; }
76818
+ get inherit() { return this.mode == 1 /* Mode.Inherit */; }
76661
76819
  sort(other) {
76662
76820
  if (!other || other.depth < this.depth) {
76663
76821
  this.next = other;
@@ -76668,7 +76826,7 @@
76668
76826
  }
76669
76827
  get depth() { return this.context ? this.context.length : 0; }
76670
76828
  }
76671
- Rule.empty = new Rule([], 2 /* Normal */, null);
76829
+ Rule.empty = new Rule([], 2 /* Mode.Normal */, null);
76672
76830
  /// Define a [highlighter](#highlight.Highlighter) from an array of
76673
76831
  /// tag/class pairs. Classes associated with more specific tags will
76674
76832
  /// take precedence.
@@ -76755,7 +76913,7 @@
76755
76913
  if (cls)
76756
76914
  cls += " ";
76757
76915
  cls += tagCls;
76758
- if (rule.mode == 1 /* Inherit */)
76916
+ if (rule.mode == 1 /* Mode.Inherit */)
76759
76917
  inheritedClass += (inheritedClass ? " " : "") + tagCls;
76760
76918
  }
76761
76919
  this.startSpan(cursor.from, cls);
@@ -76773,7 +76931,7 @@
76773
76931
  if (rangeFrom < rangeTo && hasChild) {
76774
76932
  while (cursor.from < rangeTo) {
76775
76933
  this.highlightRange(cursor, rangeFrom, rangeTo, inheritedClass, highlighters);
76776
- this.startSpan(Math.min(to, cursor.to), cls);
76934
+ this.startSpan(Math.min(rangeTo, cursor.to), cls);
76777
76935
  if (cursor.to >= nextPos || !cursor.nextSibling())
76778
76936
  break;
76779
76937
  }
@@ -78714,6 +78872,7 @@
78714
78872
  closeOnBlur: true,
78715
78873
  maxRenderedOptions: 100,
78716
78874
  defaultKeymap: true,
78875
+ tooltipClass: () => "",
78717
78876
  optionClass: () => "",
78718
78877
  aboveCursor: false,
78719
78878
  icons: true,
@@ -78724,6 +78883,7 @@
78724
78883
  defaultKeymap: (a, b) => a && b,
78725
78884
  closeOnBlur: (a, b) => a && b,
78726
78885
  icons: (a, b) => a && b,
78886
+ tooltipClass: (a, b) => c => joinClass(a(c), b(c)),
78727
78887
  optionClass: (a, b) => c => joinClass(a(c), b(c)),
78728
78888
  addToOptions: (a, b) => a.concat(b)
78729
78889
  });
@@ -78802,14 +78962,17 @@
78802
78962
  key: this
78803
78963
  };
78804
78964
  this.space = null;
78965
+ this.currentClass = "";
78805
78966
  let cState = view.state.field(stateField);
78806
78967
  let { options, selected } = cState.open;
78807
78968
  let config = view.state.facet(completionConfig);
78808
78969
  this.optionContent = optionContent(config);
78809
78970
  this.optionClass = config.optionClass;
78971
+ this.tooltipClass = config.tooltipClass;
78810
78972
  this.range = rangeAroundSelected(options.length, selected, config.maxRenderedOptions);
78811
78973
  this.dom = document.createElement("div");
78812
78974
  this.dom.className = "cm-tooltip-autocomplete";
78975
+ this.updateTooltipClass(view.state);
78813
78976
  this.dom.addEventListener("mousedown", (e) => {
78814
78977
  for (let dom = e.target, match; dom && dom != this.dom; dom = dom.parentNode) {
78815
78978
  if (dom.nodeName == "LI" && (match = /-(\d+)$/.exec(dom.id)) && +match[1] < options.length) {
@@ -78830,12 +78993,25 @@
78830
78993
  var _a, _b, _c;
78831
78994
  let cState = update.state.field(this.stateField);
78832
78995
  let prevState = update.startState.field(this.stateField);
78996
+ this.updateTooltipClass(update.state);
78833
78997
  if (cState != prevState) {
78834
78998
  this.updateSel();
78835
78999
  if (((_a = cState.open) === null || _a === void 0 ? void 0 : _a.disabled) != ((_b = prevState.open) === null || _b === void 0 ? void 0 : _b.disabled))
78836
79000
  this.dom.classList.toggle("cm-tooltip-autocomplete-disabled", !!((_c = cState.open) === null || _c === void 0 ? void 0 : _c.disabled));
78837
79001
  }
78838
79002
  }
79003
+ updateTooltipClass(state) {
79004
+ let cls = this.tooltipClass(state);
79005
+ if (cls != this.currentClass) {
79006
+ for (let c of this.currentClass.split(" "))
79007
+ if (c)
79008
+ this.dom.classList.remove(c);
79009
+ for (let c of cls.split(" "))
79010
+ if (c)
79011
+ this.dom.classList.add(c);
79012
+ this.currentClass = cls;
79013
+ }
79014
+ }
78839
79015
  positioned(space) {
78840
79016
  this.space = space;
78841
79017
  if (this.info)
@@ -79096,13 +79272,13 @@
79096
79272
  if (active.length == this.active.length && active.every((a, i) => a == this.active[i]))
79097
79273
  active = this.active;
79098
79274
  let open = this.open;
79275
+ if (open && tr.docChanged)
79276
+ open = open.map(tr.changes);
79099
79277
  if (tr.selection || active.some(a => a.hasResult() && tr.changes.touchesRange(a.from, a.to)) ||
79100
79278
  !sameResults(active, this.active))
79101
- open = CompletionDialog.build(active, state, this.id, this.open, conf);
79279
+ open = CompletionDialog.build(active, state, this.id, open, conf);
79102
79280
  else if (open && open.disabled && !active.some(a => a.state == 1 /* State.Pending */))
79103
79281
  open = null;
79104
- else if (open && tr.docChanged)
79105
- open = open.map(tr.changes);
79106
79282
  if (!open && active.every(a => a.state != 1 /* State.Pending */) && active.some(a => a.hasResult()))
79107
79283
  active = active.map(a => a.hasResult() ? new ActiveSource(a.source, 0 /* State.Inactive */) : a);
79108
79284
  for (let effect of tr.effects)
@@ -79457,6 +79633,7 @@
79457
79633
  maxWidth: "min(700px, 95vw)",
79458
79634
  minWidth: "250px",
79459
79635
  maxHeight: "10em",
79636
+ height: "100%",
79460
79637
  listStyle: "none",
79461
79638
  margin: 0,
79462
79639
  padding: 0,
@@ -80411,7 +80588,7 @@
80411
80588
  function extendSel(view, how) {
80412
80589
  let selection = updateSel(view.state.selection, range => {
80413
80590
  let head = how(range);
80414
- return EditorSelection.range(range.anchor, head.head, head.goalColumn);
80591
+ return EditorSelection.range(range.anchor, head.head, head.goalColumn, head.bidiLevel || undefined);
80415
80592
  });
80416
80593
  if (selection.eq(view.state.selection))
80417
80594
  return false;
@@ -84384,6 +84561,88 @@
84384
84561
  }
84385
84562
  });
84386
84563
 
84564
+ /**
84565
+ * Create an array of syntax errors in the given tree.
84566
+ *
84567
+ * @param {Tree} syntaxTree
84568
+ * @returns {LintMessage[]} array of syntax errors
84569
+ */
84570
+ function lintSyntax(syntaxTree) {
84571
+
84572
+ const lintMessages = [];
84573
+
84574
+ syntaxTree.iterate({
84575
+ enter: node => {
84576
+ if (node.type.isError) {
84577
+
84578
+ const error = node.toString();
84579
+
84580
+ /* The error has the pattern [⚠ || ⚠(NodeType)]. The regex extracts the node type from inside the brackets */
84581
+ const match = /\((.*?)\)/.exec(error);
84582
+ const nodeType = match && match[1];
84583
+
84584
+ let message;
84585
+
84586
+ if (nodeType) {
84587
+ message = 'unexpected ' + nodeType;
84588
+ } else {
84589
+ message = 'expression expected';
84590
+ }
84591
+
84592
+ lintMessages.push(
84593
+ {
84594
+ from: node.from,
84595
+ to: node.to,
84596
+ severity: 'error',
84597
+ message: message,
84598
+ type: 'syntaxError'
84599
+ }
84600
+ );
84601
+ }
84602
+ }
84603
+ });
84604
+
84605
+ return lintMessages;
84606
+ }
84607
+
84608
+ /**
84609
+ * Generates lint messages for the given syntax tree.
84610
+ *
84611
+ * @param {Tree} syntaxTree
84612
+ * @returns {LintMessage[]} array of all lint messages
84613
+ */
84614
+ function lintAll(syntaxTree) {
84615
+
84616
+ const lintMessages = [
84617
+ ... lintSyntax(syntaxTree)
84618
+ ];
84619
+
84620
+ return lintMessages;
84621
+ }
84622
+
84623
+ /**
84624
+ * CodeMirror extension that provides linting for FEEL expressions.
84625
+ *
84626
+ * @param {EditorView} editorView
84627
+ * @returns {Source} CodeMirror linting source
84628
+ */
84629
+ const cmFeelLinter = () => editorView => {
84630
+
84631
+ // don't lint if the Editor is empty
84632
+ if (editorView.state.doc.length === 0) {
84633
+ return [];
84634
+ }
84635
+
84636
+ const tree = syntaxTree(editorView.state);
84637
+
84638
+ const messages = lintAll(tree);
84639
+
84640
+ return messages.map(message => ({
84641
+ ...message,
84642
+ source: 'syntaxError'
84643
+ }));
84644
+ };
84645
+
84387
84646
  // helpers ///////////////////////////////
84388
84647
 
84389
84648
  function isNodeEmpty(node) {
@@ -84747,9 +85006,10 @@
84747
85006
  label: tag.name,
84748
85007
  type: 'function',
84749
85008
  info: () => {
84750
- const html = domify$1(tag.description);
85009
+ const html = domify$1(`<div class="description">${tag.description}<div>`);
84751
85010
  return html;
84752
- }
85011
+ },
85012
+ boost: -1
84753
85013
  }
84754
85014
  ));
84755
85015
 
@@ -84788,6 +85048,109 @@
84788
85048
  */
84789
85049
  const variablesFacet = Facet.define();
84790
85050
 
85051
+ var pathExpression = context => {
85052
+ const variables = context.state.facet(variablesFacet)[0];
85053
+ const nodeBefore = syntaxTree(context.state).resolve(context.pos, -1);
85054
+
85055
+ if (!isPathExpression(nodeBefore)) {
85056
+ return;
85057
+ }
85058
+
85059
+ const expression = findPathExpression(nodeBefore);
85060
+
85061
+ // if the cursor is directly after the `.`, variable starts at the cursor position
85062
+ const from = nodeBefore === expression ? context.pos : nodeBefore.from;
85063
+
85064
+ const path = getPath(expression, context);
85065
+
85066
+ let options = variables;
85067
+ for (var i = 0; i < path.length - 1; i++) {
85068
+ var childVar = options.find(val => val.name === path[i].name);
85069
+
85070
+ if (!childVar) {
85071
+ return null;
85072
+ }
85073
+
85074
+ // only suggest if variable type matches
85075
+ if (
85076
+ childVar.isList !== 'optional' &&
85077
+ !!childVar.isList !== path[i].isList
85078
+ ) {
85079
+ return;
85080
+ }
85081
+
85082
+ options = childVar.entries;
85083
+ }
85084
+
85085
+ if (!options) return;
85086
+
85087
+ options = options.map(v => ({
85088
+ label: v.name,
85089
+ type: 'variable',
85090
+ info: v.info,
85091
+ detail: v.detail
85092
+ }));
85093
+
85094
+ const result = {
85095
+ from: from,
85096
+ options: options
85097
+ };
85098
+
85099
+ return result;
85100
+ };
85101
+
85102
+
85103
+ function findPathExpression(node) {
85104
+ while (node) {
85105
+ if (node.name === 'PathExpression') {
85106
+ return node;
85107
+ }
85108
+ node = node.parent;
85109
+ }
85110
+ }
85111
+
85112
+ // parses the path expression into a list of variable names with type information
85113
+ // e.g. foo[0].bar => [ { name: 'foo', isList: true }, { name: 'bar', isList: false } ]
85114
+ function getPath(node, context) {
85115
+ let path = [];
85116
+
85117
+ for (let child = node.firstChild; child; child = child.nextSibling) {
85118
+ if (child.name === 'PathExpression') {
85119
+ path.push(...getPath(child, context));
85120
+ } else if (child.name === 'FilterExpression') {
85121
+ path.push(...getFilter(child, context));
85122
+ }
85123
+ else {
85124
+ path.push({
85125
+ name: getNodeContent(child, context),
85126
+ isList: false
85127
+ });
85128
+ }
85129
+ }
85130
+ return path;
85131
+ }
85132
+
85133
+ function getFilter(node, context) {
85134
+ const list = node.firstChild;
85135
+
85136
+ if (list.name === 'PathExpression') {
85137
+ const path = getPath(list, context);
85138
+ const last = path[path.length - 1];
85139
+ last.isList = true;
85140
+
85141
+ return path;
85142
+ }
85143
+
85144
+ return [ {
85145
+ name: getNodeContent(list, context),
85146
+ isList: true
85147
+ } ];
85148
+ }
85149
+
85150
+ function getNodeContent(node, context) {
85151
+ return context.state.sliceDoc(node.from, node.to);
85152
+ }
85153
+
84791
85154
  /**
84792
85155
  * @type {import('@codemirror/autocomplete').CompletionSource}
84793
85156
  */
@@ -84839,7 +85202,8 @@
84839
85202
  override: [
84840
85203
  variables,
84841
85204
  builtins,
84842
- completeFromList(snippets)
85205
+ completeFromList(snippets.map(s => ({ ...s, boost: -1 }))),
85206
+ pathExpression
84843
85207
  ]
84844
85208
  })
84845
85209
  ];
@@ -84849,53 +85213,7 @@
84849
85213
  return new LanguageSupport(feelLanguage, [ ]);
84850
85214
  }
84851
85215
 
84852
- const FeelLinter = function(editorView) {
84853
- const messages = [];
84854
-
84855
- // don't lint if the Editor is empty
84856
- if (editorView.state.doc.length === 0) {
84857
- return messages;
84858
- }
84859
-
84860
- const tree = syntaxTree(editorView.state);
84861
-
84862
- tree.iterate({
84863
- enter: node => {
84864
- if (node.type.isError) {
84865
-
84866
- const error = node.toString();
84867
-
84868
- /* The error has the pattern [⚠ || ⚠(NodeType)]. The regex extracts the node type from inside the brackets */
84869
- const match = /\((.*?)\)/.exec(error);
84870
- const nodeType = match && match[1];
84871
-
84872
- let message;
84873
-
84874
- if (nodeType) {
84875
- message = 'unexpected ' + nodeType;
84876
- } else {
84877
- message = 'expression expected';
84878
- }
84879
-
84880
- messages.push(
84881
- {
84882
- from: node.from,
84883
- to: node.to,
84884
- severity: 'error',
84885
- message: message,
84886
- source: 'syntaxError'
84887
- }
84888
- );
84889
- }
84890
- }
84891
- });
84892
-
84893
- return messages;
84894
- };
84895
-
84896
- var syntaxLinter = linter$1(FeelLinter);
84897
-
84898
- var linter = [ syntaxLinter ];
85216
+ var linter = [ linter$1(cmFeelLinter()) ];
84899
85217
 
84900
85218
  const baseTheme = EditorView.theme({
84901
85219
  '& .cm-content': {
@@ -84963,9 +85281,11 @@
84963
85281
 
84964
85282
  /**
84965
85283
  * @typedef {object} Variable
84966
- * @property {string} name
84967
- * @property {string} [info]
84968
- * @property {string} [detail]
85284
+ * @property {string} name name or key of the variable
85285
+ * @property {string} [info] short information about the variable, e.g. type
85286
+ * @property {string} [detail] longer description of the variable content
85287
+ * @property {boolean} [isList] whether the variable is a list
85288
+ * @property {array<Variable>} [schema] array of child variables if the variable is a context or list
84969
85289
  */
84970
85290
 
84971
85291
  const autocompletionConf = new Compartment();
@@ -86081,7 +86401,7 @@
86081
86401
  label,
86082
86402
  onChange,
86083
86403
  options = [],
86084
- value,
86404
+ value = '',
86085
86405
  disabled,
86086
86406
  onFocus,
86087
86407
  onBlur
@@ -87019,28 +87339,41 @@
87019
87339
 
87020
87340
  // api /////////////////////////
87021
87341
 
87342
+ /**
87343
+ * Extractors add ProcessVariables to the `options.processVariables` parameter.
87344
+ * @callback extractor
87345
+ * @param {Object} options
87346
+ * @param {Array<ModdleElement>} options.elements
87347
+ * @param {ModdleElement} options.containerElement
87348
+ * @param {Array<ProcessVariable>} options.processVariables
87349
+ */
87350
+
87022
87351
  /**
87023
87352
  * Retrieves all process variables for a given container element.
87024
87353
  * @param {ModdleElement} containerElement
87354
+ * @param {Array<extractor>} [additionalExtractors]
87025
87355
  *
87026
- * @returns {Array<ProcessVariable>}
87356
+ * @returns {Promise<Array<ProcessVariable>>}
87027
87357
  */
87028
- function getProcessVariables$1(containerElement) {
87358
+ function getProcessVariables$1(containerElement, additionalExtractors = []) {
87029
87359
  var processVariables = [];
87030
87360
 
87031
87361
  // (1) extract all flow elements inside the container
87032
87362
  var elements = selfAndAllFlowElements$1([ containerElement ], false);
87033
87363
 
87364
+ const allPromises = [];
87365
+
87034
87366
  // (2) extract all variables from the extractors
87035
- minDash$1.forEach(extractors$1, function(extractor) {
87036
- extractor({
87367
+ minDash$1.forEach([ ...extractors$1, ...additionalExtractors ], function(extractor) {
87368
+ allPromises.push(extractor({
87037
87369
  elements: elements,
87038
87370
  containerElement: containerElement,
87039
87371
  processVariables: processVariables
87040
- });
87372
+ }));
87041
87373
  });
87042
87374
 
87043
- return processVariables;
87375
+ return Promise.all(allPromises)
87376
+ .then(() => processVariables);
87044
87377
  }
87045
87378
 
87046
87379
  /**
@@ -87052,12 +87385,13 @@
87052
87385
  *
87053
87386
  * @param {string} scope
87054
87387
  * @param {ModdleElement} rootElement element from where to extract all variables
87388
+ * @param {Array<extractor>} [additionalExtractors]
87055
87389
  *
87056
- * @returns {Array<ProcessVariable>}
87390
+ * @returns {Promise<Array<ProcessVariable>>}
87057
87391
  */
87058
- function getVariablesForScope$1(scope, rootElement) {
87392
+ async function getVariablesForScope$1(scope, rootElement, additionalExtractors = []) {
87059
87393
 
87060
- var allVariables = getProcessVariables$1(rootElement);
87394
+ var allVariables = await getProcessVariables$1(rootElement, additionalExtractors);
87061
87395
 
87062
87396
  var scopeElement = getElement$1(scope, rootElement);
87063
87397
 
@@ -87079,8 +87413,8 @@
87079
87413
  }
87080
87414
 
87081
87415
 
87082
- function getVariablesForElement(element) {
87083
- return getVariablesForScope$1(getScope$2(element), getRootElement(element));
87416
+ function getVariablesForElement(element, additionalExtractors = []) {
87417
+ return getVariablesForScope$1(getScope$2(element), getRootElement(element), additionalExtractors);
87084
87418
  }
87085
87419
 
87086
87420
  function getScope$2(element) {
@@ -87785,30 +88119,46 @@
87785
88119
  * @property {ModdleElement} scope
87786
88120
  */
87787
88121
 
88122
+
88123
+ /**
88124
+ * Extractors add ProcessVariables to the `options.processVariables` parameter.
88125
+ * @callback extractor
88126
+ * @param {Object} options
88127
+ * @param {Array<ModdleElement>} options.elements
88128
+ * @param {ModdleElement} options.containerElement
88129
+ * @param {Array<ProcessVariable>} options.processVariables
88130
+ */
88131
+
87788
88132
  // api /////////////////////////
87789
88133
 
87790
88134
  /**
87791
88135
  * Retrieves all process variables for a given container element.
87792
88136
  * @param {ModdleElement} containerElement
88137
+ * @param {Array<extractor>} additionalExtractors
87793
88138
  *
87794
- * @returns {Array<ProcessVariable>}
88139
+ * @returns {Promise<Array<ProcessVariable>>}
87795
88140
  */
87796
- function getProcessVariables(containerElement) {
88141
+ function getProcessVariables(containerElement, additionalExtractors = []) {
88142
+ const allPromises = [];
88143
+
87797
88144
  var processVariables = [];
87798
88145
 
87799
88146
  // (1) extract all flow elements inside the container
87800
88147
  var elements = selfAndAllFlowElements([ containerElement ], false);
87801
88148
 
87802
88149
  // (2) extract all variables from the extractors
87803
- minDash.forEach(extractors, function(extractor) {
87804
- extractor({
87805
- elements: elements,
87806
- containerElement: containerElement,
87807
- processVariables: processVariables
87808
- });
88150
+ minDash.forEach([ ...extractors, ...additionalExtractors ], function(extractor) {
88151
+ allPromises.push(
88152
+ extractor({
88153
+ elements: elements,
88154
+ containerElement: containerElement,
88155
+ processVariables: processVariables
88156
+ })
88157
+ );
87809
88158
  });
87810
88159
 
87811
- return processVariables;
88160
+ return Promise.all(allPromises)
88161
+ .then(() => processVariables);
87812
88162
  }
87813
88163
 
87814
88164
  /**
@@ -87820,12 +88170,13 @@
87820
88170
  *
87821
88171
  * @param {string} scope
87822
88172
  * @param {ModdleElement} rootElement element from where to extract all variables
88173
+ * @param {Array<extractor>} additionalExtractors
87823
88174
  *
87824
- * @returns {Array<ProcessVariable>}
88175
+ * @returns {Promise<Array<ProcessVariable>>}
87825
88176
  */
87826
- function getVariablesForScope(scope, rootElement) {
88177
+ async function getVariablesForScope(scope, rootElement, additionalExtractors = []) {
87827
88178
 
87828
- var allVariables = getProcessVariables(rootElement);
88179
+ var allVariables = await getProcessVariables(rootElement, additionalExtractors);
87829
88180
 
87830
88181
  var scopeElement = getElement(scope, rootElement);
87831
88182
 
@@ -90230,7 +90581,7 @@
90230
90581
  /**
90231
90582
  * @returns {Array<Entry>} entries
90232
90583
  */
90233
- function ErrorProps$1(props) {
90584
+ function ErrorProps$2(props) {
90234
90585
  const {
90235
90586
  element
90236
90587
  } = props;
@@ -90250,7 +90601,7 @@
90250
90601
  isEdited: isEdited$1
90251
90602
  }, {
90252
90603
  id: 'errorCode',
90253
- component: ErrorCode$1,
90604
+ component: ErrorCode$2,
90254
90605
  isEdited: isEdited$1
90255
90606
  }];
90256
90607
  }
@@ -90366,7 +90717,7 @@
90366
90717
  debounce
90367
90718
  });
90368
90719
  }
90369
- function ErrorCode$1(props) {
90720
+ function ErrorCode$2(props) {
90370
90721
  const {
90371
90722
  element
90372
90723
  } = props;
@@ -91840,7 +92191,7 @@
91840
92191
  id: 'error',
91841
92192
  label: translate('Error'),
91842
92193
  component: Group,
91843
- entries: [...ErrorProps$1({
92194
+ entries: [...ErrorProps$2({
91844
92195
  element
91845
92196
  })]
91846
92197
  };
@@ -92758,7 +93109,7 @@
92758
93109
  // different conditions but same bindings
92759
93110
  return oldProperties.filter(property => !findPropertyWithBinding(newTemplate, property));
92760
93111
  }
92761
- function normalizeReplacer(key, value) {
93112
+ function normalizeReplacer$1(key, value) {
92762
93113
  if (isObject(value)) {
92763
93114
  const keys = Object.keys(value).sort();
92764
93115
  return keys.reduce((obj, key) => {
@@ -92769,7 +93120,7 @@
92769
93120
  return value;
92770
93121
  }
92771
93122
  function equals(a, b) {
92772
- return JSON.stringify(a, normalizeReplacer) === JSON.stringify(b, normalizeReplacer);
93123
+ return JSON.stringify(a, normalizeReplacer$1) === JSON.stringify(b, normalizeReplacer$1);
92773
93124
  }
92774
93125
 
92775
93126
  function unlinkTemplate$1(element, injector) {
@@ -92964,6 +93315,163 @@
92964
93315
 
92965
93316
  document.createElement('form');
92966
93317
 
93318
+ /**
93319
+ * Restores the original order of the template properties
93320
+ * on the moddle element.
93321
+ */
93322
+ class UpdateTemplatePropertiesOrder extends CommandInterceptor {
93323
+ constructor(eventBus, elementTemplates, commandStack, bpmnFactory) {
93324
+ super(eventBus);
93325
+ this._eventBus = eventBus;
93326
+ this._elementTemplates = elementTemplates;
93327
+ this._commandStack = commandStack;
93328
+ this._bpmnFactory = bpmnFactory;
93329
+ this.postExecute(['element.updateProperties', 'element.updateModdleProperties'], this._updatePropertiesOrder, true, this);
93330
+ }
93331
+ _updatePropertiesOrder(context) {
93332
+ const {
93333
+ element
93334
+ } = context;
93335
+ const template = this._elementTemplates.get(element);
93336
+ const businessObject = element.businessObject;
93337
+ const commands = [];
93338
+ if (!template) {
93339
+ return;
93340
+ }
93341
+ const templateProperties = template.properties;
93342
+
93343
+ // zeebe:Property
93344
+ const zeebeProperties = findExtension$1(businessObject, 'zeebe:Properties');
93345
+ if (zeebeProperties) {
93346
+ this._updateZeebePropertiesOrder(zeebeProperties, templateProperties, commands, context);
93347
+ }
93348
+
93349
+ // zeebe:IoMapping
93350
+ const ioMapping = findExtension$1(businessObject, 'zeebe:IoMapping');
93351
+ if (ioMapping) {
93352
+ // zeebe:Input
93353
+ this._updateInputOrder(ioMapping, templateProperties, commands, context);
93354
+
93355
+ // zeebe:Output
93356
+ this._updateOutputOrder(ioMapping, templateProperties, commands, context);
93357
+ }
93358
+
93359
+ // zeebe:TaskHeaders
93360
+ const taskHeaders = findExtension$1(businessObject, 'zeebe:TaskHeaders');
93361
+ if (taskHeaders) {
93362
+ this._updateTaskHeadersOrder(taskHeaders, templateProperties, commands, context);
93363
+ }
93364
+ if (commands.length) {
93365
+ const commandsToExecute = commands.filter(command => command !== null);
93366
+ commandsToExecute.length && this._commandStack.execute('properties-panel.multi-command-executor', commandsToExecute);
93367
+ return;
93368
+ }
93369
+ }
93370
+ _updateZeebePropertiesOrder(zeebeProperties, templateProperties, commands, context) {
93371
+ const findIndex = (properties, propertyToFind) => properties.findIndex(prop => prop.binding.type == 'zeebe:property' && prop.binding.name === propertyToFind.get('name'));
93372
+ const properties = zeebeProperties.get('properties');
93373
+ if (properties.length < 1) return;
93374
+ let newPropertiesOrder = [...properties];
93375
+ sortProperties(newPropertiesOrder, findIndex, templateProperties);
93376
+ if (!arrayEquals(newPropertiesOrder, properties)) {
93377
+ commands.push({
93378
+ cmd: 'element.updateModdleProperties',
93379
+ context: {
93380
+ ...context,
93381
+ moddleElement: zeebeProperties,
93382
+ properties: {
93383
+ properties: newPropertiesOrder
93384
+ }
93385
+ }
93386
+ });
93387
+ }
93388
+ }
93389
+ _updateInputOrder(ioMapping, templateProperties, commands, context) {
93390
+ const findIndex = (properties, propertyToFind) => properties.findIndex(prop => prop.binding.type == 'zeebe:input' && prop.binding.name === propertyToFind.get('target'));
93391
+ const inputParameters = ioMapping.get('inputParameters');
93392
+ if (inputParameters.length < 1) return;
93393
+ let newInputOrder = [...inputParameters];
93394
+ sortProperties(newInputOrder, findIndex, templateProperties);
93395
+ if (!arrayEquals(newInputOrder, inputParameters)) {
93396
+ commands.push({
93397
+ cmd: 'element.updateModdleProperties',
93398
+ context: {
93399
+ ...context,
93400
+ moddleElement: ioMapping,
93401
+ properties: {
93402
+ inputParameters: newInputOrder
93403
+ }
93404
+ }
93405
+ });
93406
+ }
93407
+ }
93408
+ _updateOutputOrder(ioMapping, templateProperties, commands, context) {
93409
+ const findIndex = (properties, propertyToFind) => properties.findIndex(prop => prop.binding.type == 'zeebe:output' && prop.binding.source === propertyToFind.get('source'));
93410
+ const outputParameters = ioMapping.get('outputParameters');
93411
+ if (outputParameters.length < 1) return;
93412
+ let newOutputOrder = [...outputParameters];
93413
+ sortProperties(newOutputOrder, findIndex, templateProperties);
93414
+ if (!arrayEquals(newOutputOrder, outputParameters)) {
93415
+ commands.push({
93416
+ cmd: 'element.updateModdleProperties',
93417
+ context: {
93418
+ ...context,
93419
+ moddleElement: ioMapping,
93420
+ properties: {
93421
+ outputParameters: newOutputOrder
93422
+ }
93423
+ }
93424
+ });
93425
+ }
93426
+ }
93427
+ _updateTaskHeadersOrder(taskHeaders, templateProperties, commands, context) {
93428
+ const findIndex = (properties, propertyToFind) => properties.findIndex(prop => prop.binding.type == 'zeebe:taskHeader' && prop.binding.key === propertyToFind.get('key'));
93429
+ const headers = taskHeaders.get('zeebe:values');
93430
+ if (headers.length < 1) return;
93431
+ let newHeadersOrder = [...headers];
93432
+ sortProperties(newHeadersOrder, findIndex, templateProperties);
93433
+ if (!arrayEquals(newHeadersOrder, headers)) {
93434
+ commands.push({
93435
+ cmd: 'element.updateModdleProperties',
93436
+ context: {
93437
+ ...context,
93438
+ moddleElement: taskHeaders,
93439
+ properties: {
93440
+ values: newHeadersOrder
93441
+ }
93442
+ }
93443
+ });
93444
+ }
93445
+ }
93446
+ }
93447
+ UpdateTemplatePropertiesOrder.$inject = ['eventBus', 'elementTemplates', 'commandStack', 'bpmnFactory'];
93448
+
93449
+ // helpers
93450
+
93451
+ function normalizeReplacer(key, value) {
93452
+ if (isObject(value)) {
93453
+ const keys = Object.keys(value).sort();
93454
+ return keys.reduce((obj, key) => {
93455
+ obj[key] = value[key];
93456
+ return obj;
93457
+ }, {});
93458
+ }
93459
+ return value;
93460
+ }
93461
+ function objectEquals(a, b) {
93462
+ return JSON.stringify(a, normalizeReplacer) === JSON.stringify(b, normalizeReplacer);
93463
+ }
93464
+ function arrayEquals(a, b) {
93465
+ return a.every((element, idx) => objectEquals(element, b[idx]));
93466
+ }
93467
+ function sortProperties(array, findIndex, templateProperties) {
93468
+ return array.sort((a, b) => {
93469
+ const aIndex = findIndex(templateProperties, a);
93470
+ const bIndex = findIndex(templateProperties, b);
93471
+ return aIndex - bIndex;
93472
+ });
93473
+ }
93474
+
92967
93475
  /**
92968
93476
  * This Behavior checks if the new element's type is in
92969
93477
  * the list of elements the template applies to and unlinks