]> source.dussan.org Git - redmine.git/commitdiff
Update Tribute to 5.1.3 (#33424).
authorGo MAEDA <maeda@farend.jp>
Mon, 18 May 2020 14:25:11 +0000 (14:25 +0000)
committerGo MAEDA <maeda@farend.jp>
Mon, 18 May 2020 14:25:11 +0000 (14:25 +0000)
git-svn-id: http://svn.redmine.org/redmine/trunk@19785 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/helpers/application_helper.rb
app/views/layouts/base.html.erb
public/javascripts/application.js
public/javascripts/tribute-3.7.3.min.js [deleted file]
public/javascripts/tribute-5.1.3.min.js [new file with mode: 0644]
public/javascripts/tribute.min.js.map
public/stylesheets/tribute-3.7.3.css [deleted file]
public/stylesheets/tribute-5.1.3.css [new file with mode: 0644]

index d364814590541735cfd2120ec718931c6d82ef29..bf55e05a515f02bbfd1b54e391f1d961f34552c6 100644 (file)
@@ -1622,7 +1622,7 @@ module ApplicationHelper
 
   # Returns the javascript tags that are included in the html layout head
   def javascript_heads
-    tags = javascript_include_tag('jquery-2.2.4-ui-1.12.1-ujs-5.2.3', 'tribute-3.7.3.min', 'application', 'responsive')
+    tags = javascript_include_tag('jquery-2.2.4-ui-1.12.1-ujs-5.2.3', 'tribute-5.1.3.min', 'application', 'responsive')
     unless User.current.pref.warn_on_leaving_unsaved == '0'
       tags << "\n".html_safe + javascript_tag("$(window).on('load', function(){ warnLeavingUnsaved('#{escape_javascript l(:text_warn_on_leaving_unsaved)}'); });")
     end
index 7740a778ee1b9379eaa956b7e329cbaddb55ae95..d6c76c41c428e6a97d7a0d27259e11913ea36805 100644 (file)
@@ -9,7 +9,7 @@
 <meta name="keywords" content="issue,bug,tracker" />
 <%= csrf_meta_tag %>
 <%= favicon %>
-<%= stylesheet_link_tag 'jquery/jquery-ui-1.12.1', 'tribute-3.7.3', 'application', 'responsive', :media => 'all' %>
+<%= stylesheet_link_tag 'jquery/jquery-ui-1.12.1', 'tribute-5.1.3', 'application', 'responsive', :media => 'all' %>
 <%= stylesheet_link_tag 'rtl', :media => 'all' if l(:direction) == 'rtl' %>
 <%= javascript_heads %>
 <%= heads_for_theme %>
index 491b274043dd2f1004530e774c2bc5698dd535a0..a61b0c5cb6b7f1da6732cfc81b32658b186c3568 100644 (file)
@@ -1063,6 +1063,9 @@ function inlineAutoComplete(element) {
       requireLeadingSpace: true,
       selectTemplate: function (issue) {
         return '#' + issue.original.id;
+      },
+      noMatchTemplate: function () {
+        return '<span style:"visibility: hidden;"></span>';
       }
     });
 
diff --git a/public/javascripts/tribute-3.7.3.min.js b/public/javascripts/tribute-3.7.3.min.js
deleted file mode 100644 (file)
index 7b84f9a..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).Tribute=e()}}(function(){return function o(u,a,l){function s(t,e){if(!a[t]){if(!u[t]){var n="function"==typeof require&&require;if(!e&&n)return n(t,!0);if(c)return c(t,!0);var i=new Error("Cannot find module '"+t+"'");throw i.code="MODULE_NOT_FOUND",i}var r=a[t]={exports:{}};u[t][0].call(r.exports,function(e){return s(u[t][1][e]||e)},r,r.exports,o,u,a,l)}return a[t].exports}for(var c="function"==typeof require&&require,e=0;e<l.length;e++)s(l[e]);return s}({1:[function(e,t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.default=void 0;i(e("./utils"));var F=i(e("./TributeEvents")),q=i(e("./TributeMenuEvents")),z=i(e("./TributeRange")),Y=i(e("./TributeSearch"));function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=[],i=!0,r=!1,o=void 0;try{for(var u,a=e[Symbol.iterator]();!(i=(u=a.next()).done)&&(n.push(u.value),!t||n.length!==t);i=!0);}catch(e){r=!0,o=e}finally{try{i||null==a.return||a.return()}finally{if(r)throw o}}return n}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function r(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}var o=function(){function B(e){var t=this,n=e.values,i=void 0===n?null:n,r=e.iframe,o=void 0===r?null:r,u=e.selectClass,a=void 0===u?"highlight":u,l=e.trigger,s=void 0===l?"@":l,c=e.autocompleteMode,d=void 0!==c&&c,f=e.selectTemplate,h=void 0===f?null:f,p=e.menuItemTemplate,v=void 0===p?null:p,m=e.lookup,g=void 0===m?"key":m,b=e.fillAttr,y=void 0===b?"value":b,w=e.collection,T=void 0===w?null:w,E=e.menuContainer,C=void 0===E?null:E,k=e.noMatchTemplate,S=void 0===k?null:k,x=e.requireLeadingSpace,M=void 0===x||x,A=e.allowSpaces,L=void 0!==A&&A,I=e.replaceTextSuffix,N=void 0===I?null:I,O=e.positionMenu,P=void 0===O||O,D=e.spaceSelectsMatch,R=void 0!==D&&D,_=e.searchOpts,W=void 0===_?{}:_,H=e.menuItemLimit,j=void 0===H?null:H;if(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,B),this.autocompleteMode=d,this.menuSelected=0,this.current={},this.inputEvent=!1,this.isActive=!1,this.menuContainer=C,this.allowSpaces=L,this.replaceTextSuffix=N,this.positionMenu=P,this.hasTrailingSpace=!1,this.spaceSelectsMatch=R,this.autocompleteMode&&(s="",L=!1),i)this.collection=[{trigger:s,iframe:o,selectClass:a,selectTemplate:(h||B.defaultSelectTemplate).bind(this),menuItemTemplate:(v||B.defaultMenuItemTemplate).bind(this),noMatchTemplate:"function"==typeof S?S.bind(t):S||function(){return""}.bind(t),lookup:g,fillAttr:y,values:i,requireLeadingSpace:M,searchOpts:W,menuItemLimit:j}];else{if(!T)throw new Error("[Tribute] No collection specified.");this.autocompleteMode&&console.warn("Tribute in autocomplete mode does not work for collections"),this.collection=T.map(function(e){return{trigger:e.trigger||s,iframe:e.iframe||o,selectClass:e.selectClass||a,selectTemplate:(e.selectTemplate||B.defaultSelectTemplate).bind(t),menuItemTemplate:(e.menuItemTemplate||B.defaultMenuItemTemplate).bind(t),noMatchTemplate:"function"==typeof S?S.bind(t):null,lookup:e.lookup||g,fillAttr:e.fillAttr||y,values:e.values,requireLeadingSpace:e.requireLeadingSpace,searchOpts:e.searchOpts||W,menuItemLimit:e.menuItemLimit||j}})}new z.default(this),new F.default(this),new q.default(this),new Y.default(this)}return function(e,t,n){t&&r(e.prototype,t),n&&r(e,n)}(B,[{key:"triggers",value:function(){return this.collection.map(function(e){return e.trigger})}},{key:"attach",value:function(e){if(!e)throw new Error("[Tribute] Must pass in a DOM node or NodeList.");if("undefined"!=typeof jQuery&&e instanceof jQuery&&(e=e.get()),e.constructor===NodeList||e.constructor===HTMLCollection||e.constructor===Array)for(var t=e.length,n=0;n<t;++n)this._attach(e[n]);else this._attach(e)}},{key:"_attach",value:function(e){e.hasAttribute("data-tribute")&&console.warn("Tribute was already bound to "+e.nodeName),this.ensureEditable(e),this.events.bind(e),e.setAttribute("data-tribute",!0)}},{key:"ensureEditable",value:function(e){if(-1===B.inputTypes().indexOf(e.nodeName)){if(!e.contentEditable)throw new Error("[Tribute] Cannot bind to "+e.nodeName);e.contentEditable=!0}}},{key:"createMenu",value:function(){var e=this.range.getDocument().createElement("div"),t=this.range.getDocument().createElement("ul");return e.className="tribute-container",e.appendChild(t),this.menuContainer?this.menuContainer.appendChild(e):this.range.getDocument().body.appendChild(e)}},{key:"showMenuFor",value:function(e,o){var u=this;if(!this.isActive||this.current.element!==e||this.current.mentionText!==this.currentMentionTextSnapshot){this.currentMentionTextSnapshot=this.current.mentionText,this.menu||(this.menu=this.createMenu(),e.tributeMenu=this.menu,this.menuEvents.bind(this.menu)),this.isActive=!0,this.menuSelected=0,this.current.mentionText||(this.current.mentionText="");var t=function(e){if(u.isActive){var t=u.search.filter(u.current.mentionText,e,{pre:u.current.collection.searchOpts.pre||"<span>",post:u.current.collection.searchOpts.post||"</span>",skip:u.current.collection.searchOpts.skip,extract:function(e){if("string"==typeof u.current.collection.lookup)return e[u.current.collection.lookup];if("function"==typeof u.current.collection.lookup)return u.current.collection.lookup(e,u.current.mentionText);throw new Error("Invalid lookup attribute, lookup must be string or function.")}});u.current.filteredItems=t;var n=u.menu.querySelector("ul");if(u.range.positionMenuAtCaret(o),!t.length){var i=new CustomEvent("tribute-no-match",{detail:u.menu});return u.current.element.dispatchEvent(i),void("function"==typeof u.current.collection.noMatchTemplate&&!u.current.collection.noMatchTemplate()||!u.current.collection.noMatchTemplate?u.hideMenu():"function"==typeof u.current.collection.noMatchTemplate?n.innerHTML=u.current.collection.noMatchTemplate():n.innerHTML=u.current.collection.noMatchTemplate)}u.current.collection.menuItemLimit&&(t=t.slice(0,u.current.collection.menuItemLimit)),n.innerHTML="";var r=u.range.getDocument().createDocumentFragment();t.forEach(function(e,t){var n=u.range.getDocument().createElement("li");n.setAttribute("data-index",t),n.addEventListener("mousemove",function(e){var t=a(u._findLiTarget(e.target),2),n=(t[0],t[1]);0!==e.movementY&&u.events.setActiveLi(n)}),u.menuSelected===t&&(n.className=u.current.collection.selectClass),n.innerHTML=u.current.collection.menuItemTemplate(e),r.appendChild(n)}),n.appendChild(r)}};"function"==typeof this.current.collection.values?this.current.collection.values(this.current.mentionText,t):t(this.current.collection.values)}}},{key:"_findLiTarget",value:function(e){if(!e)return[];var t=e.getAttribute("data-index");return t?[e,t]:this._findLiTarget(e.parentNode)}},{key:"showMenuForCollection",value:function(e,t){e!==document.activeElement&&this.placeCaretAtEnd(e),this.current.collection=this.collection[t||0],this.current.externalTrigger=!0,(this.current.element=e).isContentEditable?this.insertTextAtCursor(this.current.collection.trigger):this.insertAtCaret(e,this.current.collection.trigger),this.showMenuFor(e)}},{key:"placeCaretAtEnd",value:function(e){if(e.focus(),void 0!==window.getSelection&&void 0!==document.createRange){var t=document.createRange();t.selectNodeContents(e),t.collapse(!1);var n=window.getSelection();n.removeAllRanges(),n.addRange(t)}else if(void 0!==document.body.createTextRange){var i=document.body.createTextRange();i.moveToElementText(e),i.collapse(!1),i.select()}}},{key:"insertTextAtCursor",value:function(e){var t,n;(n=(t=window.getSelection()).getRangeAt(0)).deleteContents();var i=document.createTextNode(e);n.insertNode(i),n.selectNodeContents(i),n.collapse(!1),t.removeAllRanges(),t.addRange(n)}},{key:"insertAtCaret",value:function(e,t){var n=e.scrollTop,i=e.selectionStart,r=e.value.substring(0,i),o=e.value.substring(e.selectionEnd,e.value.length);e.value=r+t+o,i+=t.length,e.selectionStart=i,e.selectionEnd=i,e.focus(),e.scrollTop=n}},{key:"hideMenu",value:function(){this.menu&&(this.menu.style.cssText="display: none;",this.isActive=!1,this.menuSelected=0,this.current={})}},{key:"selectItemAtIndex",value:function(e,t){if("number"==typeof(e=parseInt(e))&&!isNaN(e)){var n=this.current.filteredItems[e],i=this.current.collection.selectTemplate(n);null!==i&&this.replaceText(i,t,n)}}},{key:"replaceText",value:function(e,t,n){this.range.replaceTriggerText(e,!0,!0,t,n)}},{key:"_append",value:function(e,t,n){if("function"==typeof e.values)throw new Error("Unable to append to values, as it is a function.");e.values=n?t:e.values.concat(t)}},{key:"append",value:function(e,t,n){var i=parseInt(e);if("number"!=typeof i)throw new Error("please provide an index for the collection to update.");var r=this.collection[i];this._append(r,t,n)}},{key:"appendCurrent",value:function(e,t){if(!this.isActive)throw new Error("No active state. Please use append instead and pass an index.");this._append(this.current.collection,e,t)}},{key:"detach",value:function(e){if(!e)throw new Error("[Tribute] Must pass in a DOM node or NodeList.");if("undefined"!=typeof jQuery&&e instanceof jQuery&&(e=e.get()),e.constructor===NodeList||e.constructor===HTMLCollection||e.constructor===Array)for(var t=e.length,n=0;n<t;++n)this._detach(e[n]);else this._detach(e)}},{key:"_detach",value:function(e){var t=this;this.events.unbind(e),e.tributeMenu&&this.menuEvents.unbind(e.tributeMenu),setTimeout(function(){e.removeAttribute("data-tribute"),t.isActive=!1,e.tributeMenu&&e.tributeMenu.remove()})}}],[{key:"defaultSelectTemplate",value:function(e){return void 0===e?null:this.range.isContentEditable(this.current.element)?'<span class="tribute-mention">'+(this.current.collection.trigger+e.original[this.current.collection.fillAttr])+"</span>":this.current.collection.trigger+e.original[this.current.collection.fillAttr]}},{key:"defaultMenuItemTemplate",value:function(e){return e.string}},{key:"inputTypes",value:function(){return["TEXTAREA","INPUT"]}}]),B}();n.default=o,t.exports=n.default},{"./TributeEvents":2,"./TributeMenuEvents":3,"./TributeRange":4,"./TributeSearch":5,"./utils":7}],2:[function(e,t,n){"use strict";function i(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}Object.defineProperty(n,"__esModule",{value:!0}),n.default=void 0;var r=function(){function r(e){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,r),this.tribute=e,this.tribute.events=this}return function(e,t,n){t&&i(e.prototype,t),n&&i(e,n)}(r,[{key:"bind",value:function(e){e.boundKeydown=this.keydown.bind(e,this),e.boundKeyup=this.keyup.bind(e,this),e.boundInput=this.input.bind(e,this),e.addEventListener("keydown",e.boundKeydown,!1),e.addEventListener("keyup",e.boundKeyup,!1),e.addEventListener("input",e.boundInput,!1)}},{key:"unbind",value:function(e){e.removeEventListener("keydown",e.boundKeydown,!1),e.removeEventListener("keyup",e.boundKeyup,!1),e.removeEventListener("input",e.boundInput,!1),delete e.boundKeydown,delete e.boundKeyup,delete e.boundInput}},{key:"keydown",value:function(t,n){t.shouldDeactivate(n)&&(t.tribute.isActive=!1,t.tribute.hideMenu());var i=this;t.commandEvent=!1,r.keys().forEach(function(e){e.key===n.keyCode&&(t.commandEvent=!0,t.callbacks()[e.value.toLowerCase()](n,i))})}},{key:"input",value:function(e,t){e.inputEvent=!0,e.keyup.call(this,e,t)}},{key:"click",value:function(e,t){var n=e.tribute;if(n.menu&&n.menu.contains(t.target)){var i=t.target;for(t.preventDefault(),t.stopPropagation();"li"!==i.nodeName.toLowerCase();)if(!(i=i.parentNode)||i===n.menu)throw new Error("cannot find the <li> container for the click");n.selectItemAtIndex(i.getAttribute("data-index"),t),n.hideMenu()}else n.current.element&&!n.current.externalTrigger&&(n.current.externalTrigger=!1,setTimeout(function(){return n.hideMenu()}))}},{key:"keyup",value:function(e,t){if(e.inputEvent&&(e.inputEvent=!1),e.updateSelection(this),27!==t.keyCode){if(!e.tribute.allowSpaces&&e.tribute.hasTrailingSpace)return e.tribute.hasTrailingSpace=!1,e.commandEvent=!0,void e.callbacks().space(t,this);if(!e.tribute.isActive)if(e.tribute.autocompleteMode)e.callbacks().triggerChar(t,this,"");else{var n=e.getKeyCode(e,this,t);if(isNaN(n)||!n)return;var i=e.tribute.triggers().find(function(e){return e.charCodeAt(0)===n});void 0!==i&&e.callbacks().triggerChar(t,this,i)}((e.tribute.current.trigger||e.tribute.autocompleteMode)&&!1===e.commandEvent||e.tribute.isActive&&8===t.keyCode)&&e.tribute.showMenuFor(this,!0)}}},{key:"shouldDeactivate",value:function(t){if(!this.tribute.isActive)return!1;if(0!==this.tribute.current.mentionText.length)return!1;var n=!1;return r.keys().forEach(function(e){t.keyCode===e.key&&(n=!0)}),!n}},{key:"getKeyCode",value:function(e,t,n){var i=e.tribute,r=i.range.getTriggerInfo(!1,i.hasTrailingSpace,!0,i.allowSpaces,i.autocompleteMode);return!!r&&r.mentionTriggerChar.charCodeAt(0)}},{key:"updateSelection",value:function(e){this.tribute.current.element=e;var t=this.tribute.range.getTriggerInfo(!1,this.tribute.hasTrailingSpace,!0,this.tribute.allowSpaces,this.tribute.autocompleteMode);t&&(this.tribute.current.selectedPath=t.mentionSelectedPath,this.tribute.current.mentionText=t.mentionText,this.tribute.current.selectedOffset=t.mentionSelectedOffset)}},{key:"callbacks",value:function(){var o=this;return{triggerChar:function(e,t,n){var i=o.tribute;i.current.trigger=n;var r=i.collection.find(function(e){return e.trigger===n});i.current.collection=r,i.inputEvent&&i.showMenuFor(t,!0)},enter:function(e,t){o.tribute.isActive&&o.tribute.current.filteredItems&&(e.preventDefault(),e.stopPropagation(),setTimeout(function(){o.tribute.selectItemAtIndex(o.tribute.menuSelected,e),o.tribute.hideMenu()},0))},escape:function(e,t){o.tribute.isActive&&(e.preventDefault(),e.stopPropagation(),o.tribute.isActive=!1,o.tribute.hideMenu())},tab:function(e,t){o.callbacks().enter(e,t)},space:function(e,t){o.tribute.isActive&&(o.tribute.spaceSelectsMatch?o.callbacks().enter(e,t):o.tribute.allowSpaces||(e.stopPropagation(),setTimeout(function(){o.tribute.hideMenu(),o.tribute.isActive=!1},0)))},up:function(e,t){if(o.tribute.isActive&&o.tribute.current.filteredItems){e.preventDefault(),e.stopPropagation();var n=o.tribute.current.filteredItems.length,i=o.tribute.menuSelected;i<n&&0<i?(o.tribute.menuSelected--,o.setActiveLi()):0===i&&(o.tribute.menuSelected=n-1,o.setActiveLi(),o.tribute.menu.scrollTop=o.tribute.menu.scrollHeight)}},down:function(e,t){if(o.tribute.isActive&&o.tribute.current.filteredItems){e.preventDefault(),e.stopPropagation();var n=o.tribute.current.filteredItems.length-1,i=o.tribute.menuSelected;i<n?(o.tribute.menuSelected++,o.setActiveLi()):n===i&&(o.tribute.menuSelected=0,o.setActiveLi(),o.tribute.menu.scrollTop=0)}},delete:function(e,t){o.tribute.isActive&&o.tribute.current.mentionText.length<1?o.tribute.hideMenu():o.tribute.isActive&&o.tribute.showMenuFor(t)}}}},{key:"setActiveLi",value:function(e){var t=this.tribute.menu.querySelectorAll("li"),n=t.length>>>0;e&&(this.tribute.menuSelected=parseInt(e));for(var i=0;i<n;i++){var r=t[i];if(i===this.tribute.menuSelected){r.classList.add(this.tribute.current.collection.selectClass);var o=r.getBoundingClientRect(),u=this.tribute.menu.getBoundingClientRect();if(o.bottom>u.bottom){var a=o.bottom-u.bottom;this.tribute.menu.scrollTop+=a}else if(o.top<u.top){var l=u.top-o.top;this.tribute.menu.scrollTop-=l}}else r.classList.remove(this.tribute.current.collection.selectClass)}}},{key:"getFullHeight",value:function(e,t){var n=e.getBoundingClientRect().height;if(t){var i=e.currentStyle||window.getComputedStyle(e);return n+parseFloat(i.marginTop)+parseFloat(i.marginBottom)}return n}}],[{key:"keys",value:function(){return[{key:9,value:"TAB"},{key:8,value:"DELETE"},{key:13,value:"ENTER"},{key:27,value:"ESCAPE"},{key:32,value:"SPACE"},{key:38,value:"UP"},{key:40,value:"DOWN"}]}}]),r}();n.default=r,t.exports=n.default},{}],3:[function(e,t,n){"use strict";function i(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}Object.defineProperty(n,"__esModule",{value:!0}),n.default=void 0;var r=function(){function t(e){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),this.tribute=e,(this.tribute.menuEvents=this).menu=this.tribute.menu}return function(e,t,n){t&&i(e.prototype,t),n&&i(e,n)}(t,[{key:"bind",value:function(e){var t=this;this.menuClickEvent=this.tribute.events.click.bind(null,this),this.menuContainerScrollEvent=this.debounce(function(){t.tribute.isActive&&t.tribute.showMenuFor(t.tribute.current.element,!1)},300,!1),this.windowResizeEvent=this.debounce(function(){t.tribute.isActive&&t.tribute.range.positionMenuAtCaret(!0)},300,!1),this.tribute.range.getDocument().addEventListener("MSPointerDown",this.menuClickEvent,!1),this.tribute.range.getDocument().addEventListener("mousedown",this.menuClickEvent,!1),window.addEventListener("resize",this.windowResizeEvent),this.menuContainer?this.menuContainer.addEventListener("scroll",this.menuContainerScrollEvent,!1):window.addEventListener("scroll",this.menuContainerScrollEvent)}},{key:"unbind",value:function(e){this.tribute.range.getDocument().removeEventListener("mousedown",this.menuClickEvent,!1),this.tribute.range.getDocument().removeEventListener("MSPointerDown",this.menuClickEvent,!1),window.removeEventListener("resize",this.windowResizeEvent),this.menuContainer?this.menuContainer.removeEventListener("scroll",this.menuContainerScrollEvent,!1):window.removeEventListener("scroll",this.menuContainerScrollEvent)}},{key:"debounce",value:function(i,r,o){var u,a=this,l=arguments;return function(){var e=a,t=l,n=o&&!u;clearTimeout(u),u=setTimeout(function(){u=null,o||i.apply(e,t)},r),n&&i.apply(e,t)}}}]),t}();n.default=r,t.exports=n.default},{}],4:[function(e,t,n){"use strict";function i(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}Object.defineProperty(n,"__esModule",{value:!0}),n.default=void 0;var r=function(){function t(e){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),this.tribute=e,this.tribute.range=this}return function(e,t,n){t&&i(e.prototype,t),n&&i(e,n)}(t,[{key:"getDocument",value:function(){var e;return this.tribute.current.collection&&(e=this.tribute.current.collection.iframe),e?e.contentWindow.document:document}},{key:"positionMenuAtCaret",value:function(r){var o,u=this,e=this.tribute.current,t=this.getTriggerInfo(!1,this.tribute.hasTrailingSpace,!0,this.tribute.allowSpaces,this.tribute.autocompleteMode);if(void 0!==t){if(!this.tribute.positionMenu)return void(this.tribute.menu.style.cssText="display: block;");o=this.isContentEditable(e.element)?this.getContentEditableCaretPosition(t.mentionPosition):this.getTextAreaOrInputUnderlinePosition(this.tribute.current.element,t.mentionPosition),this.tribute.menu.style.cssText="top: ".concat(o.top,"px;\n                                     left: ").concat(o.left,"px;\n                                     right: ").concat(o.right,"px;\n                                     bottom: ").concat(o.bottom,"px;\n                                     position: absolute;\n                                     z-index: 10000;\n                                     display: block;"),"auto"===o.left&&(this.tribute.menu.style.left="auto"),"auto"===o.top&&(this.tribute.menu.style.top="auto"),r&&this.scrollIntoView(),window.setTimeout(function(){var e={width:u.tribute.menu.offsetWidth,height:u.tribute.menu.offsetHeight},t=u.isMenuOffScreen(o,e),n=window.innerWidth>e.width&&(t.left||t.right),i=window.innerHeight>e.height&&(t.top||t.bottom);(n||i)&&(u.tribute.menu.style.cssText="display: none",u.positionMenuAtCaret(r))},0)}else this.tribute.menu.style.cssText="display: none"}},{key:"selectElement",value:function(e,t,n){var i,r=e;if(t)for(var o=0;o<t.length;o++){if(void 0===(r=r.childNodes[t[o]]))return;for(;r.length<n;)n-=r.length,r=r.nextSibling;0!==r.childNodes.length||r.length||(r=r.previousSibling)}var u=this.getWindowSelection();(i=this.getDocument().createRange()).setStart(r,n),i.setEnd(r,n),i.collapse(!0);try{u.removeAllRanges()}catch(e){}u.addRange(i),e.focus()}},{key:"replaceTriggerText",value:function(e,t,n,i,r){var o=this.getTriggerInfo(!0,n,t,this.tribute.allowSpaces,this.tribute.autocompleteMode);if(void 0!==o){var u=this.tribute.current,a=new CustomEvent("tribute-replaced",{detail:{item:r,instance:u,context:o,event:i}});if(this.isContentEditable(u.element)){e+="string"==typeof this.tribute.replaceTextSuffix?this.tribute.replaceTextSuffix:" ",this.pasteHtml(e,o.mentionPosition,o.mentionPosition+o.mentionText.length+!this.tribute.autocompleteMode)}else{var l=this.tribute.current.element,s="string"==typeof this.tribute.replaceTextSuffix?this.tribute.replaceTextSuffix:" ";e+=s;var c=o.mentionPosition,d=o.mentionPosition+o.mentionText.length+s.length;l.value=l.value.substring(0,c)+e+l.value.substring(d,l.value.length),l.selectionStart=c+e.length,l.selectionEnd=c+e.length}u.element.dispatchEvent(a)}}},{key:"pasteHtml",value:function(e,t,n){var i,r;r=this.getWindowSelection(),(i=this.getDocument().createRange()).setStart(r.anchorNode,t),i.setEnd(r.anchorNode,n),i.deleteContents();var o=this.getDocument().createElement("div");o.innerHTML=e;for(var u,a,l=this.getDocument().createDocumentFragment();u=o.firstChild;)a=l.appendChild(u);i.insertNode(l),a&&((i=i.cloneRange()).setStartAfter(a),i.collapse(!0),r.removeAllRanges(),r.addRange(i))}},{key:"getWindowSelection",value:function(){return this.tribute.collection.iframe?this.tribute.collection.iframe.contentWindow.getSelection():window.getSelection()}},{key:"getNodePositionInParent",value:function(e){if(null===e.parentNode)return 0;for(var t=0;t<e.parentNode.childNodes.length;t++){if(e.parentNode.childNodes[t]===e)return t}}},{key:"getContentEditableSelectedPath",value:function(e){var t=this.getWindowSelection(),n=t.anchorNode,i=[];if(null!=n){for(var r,o=n.contentEditable;null!==n&&"true"!==o;)r=this.getNodePositionInParent(n),i.push(r),null!==(n=n.parentNode)&&(o=n.contentEditable);return i.reverse(),{selected:n,path:i,offset:t.getRangeAt(0).startOffset}}}},{key:"getTextPrecedingCurrentSelection",value:function(){var e=this.tribute.current,t="";if(this.isContentEditable(e.element)){var n=this.getWindowSelection().anchorNode;if(null!=n){var i=n.textContent,r=this.getWindowSelection().getRangeAt(0).startOffset;i&&0<=r&&(t=i.substring(0,r))}}else{var o=this.tribute.current.element;if(o){var u=o.selectionStart;o.value&&0<=u&&(t=o.value.substring(0,u))}}return t}},{key:"getLastWordInText",value:function(e){var t=(e=e.replace(/\u00A0/g," ")).split(" ");return t[t.length-1].trim()}},{key:"getTriggerInfo",value:function(e,t,i,n,r){var o,u,a,l=this,s=this.tribute.current;if(this.isContentEditable(s.element)){var c=this.getContentEditableSelectedPath(s);c&&(o=c.selected,u=c.path,a=c.offset)}else o=this.tribute.current.element;var d=this.getTextPrecedingCurrentSelection(),f=this.getLastWordInText(d);if(r)return{mentionPosition:d.length-f.length,mentionText:f,mentionSelectedElement:o,mentionSelectedPath:u,mentionSelectedOffset:a};if(null!=d){var h,p=-1;if(this.tribute.collection.forEach(function(e){var t=e.trigger,n=e.requireLeadingSpace?l.lastIndexWithLeadingSpace(d,t):d.lastIndexOf(t);p<n&&(p=n,h=t,i=e.requireLeadingSpace)}),0<=p&&(0===p||!i||/[\xA0\s]/g.test(d.substring(p-1,p)))){var v=d.substring(p+1,d.length);h=d.substring(p,p+1);var m=v.substring(0,1),g=0<v.length&&(" "===m||" "===m);t&&(v=v.trim());var b=n?/[^\S ]/g:/[\xA0\s]/g;if(this.tribute.hasTrailingSpace=b.test(v),!g&&(e||!b.test(v)))return{mentionPosition:p,mentionText:v,mentionSelectedElement:o,mentionSelectedPath:u,mentionSelectedOffset:a,mentionTriggerChar:h}}}}},{key:"lastIndexWithLeadingSpace",value:function(e,t){for(var n=e.split("").reverse().join(""),i=-1,r=0,o=e.length;r<o;r++){var u=r===e.length-1,a=/\s/.test(n[r+1]);if(t===n[r]&&(u||a)){i=e.length-1-r;break}}return i}},{key:"isContentEditable",value:function(e){return"INPUT"!==e.nodeName&&"TEXTAREA"!==e.nodeName}},{key:"isMenuOffScreen",value:function(e,t){var n=window.innerWidth,i=window.innerHeight,r=document.documentElement,o=(window.pageXOffset||r.scrollLeft)-(r.clientLeft||0),u=(window.pageYOffset||r.scrollTop)-(r.clientTop||0),a="number"==typeof e.top?e.top:u+i-e.bottom-t.height,l="number"==typeof e.right?e.right:e.left+t.width,s="number"==typeof e.bottom?e.bottom:e.top+t.height,c="number"==typeof e.left?e.left:o+n-e.right-t.width;return{top:a<Math.floor(u),right:l>Math.ceil(o+n),bottom:s>Math.ceil(u+i),left:c<Math.floor(o)}}},{key:"getMenuDimensions",value:function(){var e={width:null,height:null};return this.tribute.menu.style.cssText="top: 0px;\n                                 left: 0px;\n                                 position: fixed;\n                                 zIndex: 10000;\n                                 display: block;\n                                 visibility; hidden;",e.width=this.tribute.menu.offsetWidth,e.height=this.tribute.menu.offsetHeight,this.tribute.menu.style.cssText="display: none;",e}},{key:"getTextAreaOrInputUnderlinePosition",value:function(e,t,n){var i=null!==window.mozInnerScreenX,r=this.getDocument().createElement("div");r.id="input-textarea-caret-position-mirror-div",this.getDocument().body.appendChild(r);var o=r.style,u=window.getComputedStyle?getComputedStyle(e):e.currentStyle;o.whiteSpace="pre-wrap","INPUT"!==e.nodeName&&(o.wordWrap="break-word"),o.position="absolute",o.visibility="hidden",["direction","boxSizing","width","height","overflowX","overflowY","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","paddingTop","paddingRight","paddingBottom","paddingLeft","fontStyle","fontVariant","fontWeight","fontStretch","fontSize","fontSizeAdjust","lineHeight","fontFamily","textAlign","textTransform","textIndent","textDecoration","letterSpacing","wordSpacing"].forEach(function(e){o[e]=u[e]}),i?(o.width="".concat(parseInt(u.width)-2,"px"),e.scrollHeight>parseInt(u.height)&&(o.overflowY="scroll")):o.overflow="hidden",r.textContent=e.value.substring(0,t),"INPUT"===e.nodeName&&(r.textContent=r.textContent.replace(/\s/g," "));var a=this.getDocument().createElement("span");a.textContent=e.value.substring(t)||".",r.appendChild(a);var l=e.getBoundingClientRect(),s=document.documentElement,c=(window.pageXOffset||s.scrollLeft)-(s.clientLeft||0),d=(window.pageYOffset||s.scrollTop)-(s.clientTop||0),f={top:l.top+d+a.offsetTop+parseInt(u.borderTopWidth)+parseInt(u.fontSize)-e.scrollTop,left:l.left+c+a.offsetLeft+parseInt(u.borderLeftWidth)},h=window.innerWidth,p=window.innerHeight,v=this.getMenuDimensions(),m=this.isMenuOffScreen(f,v);m.right&&(f.right=h-f.left,f.left="auto");var g=this.tribute.menuContainer?this.tribute.menuContainer.offsetHeight:this.getDocument().body.offsetHeight;if(m.bottom){var b=g-(p-(this.tribute.menuContainer?this.tribute.menuContainer.getBoundingClientRect():this.getDocument().body.getBoundingClientRect()).top);f.bottom=b+(p-l.top-a.offsetTop),f.top="auto"}return(m=this.isMenuOffScreen(f,v)).left&&(f.left=h>v.width?c+h-v.width:c,delete f.right),m.top&&(f.top=p>v.height?d+p-v.height:d,delete f.bottom),this.getDocument().body.removeChild(r),f}},{key:"getContentEditableCaretPosition",value:function(e){var t,n,i="sel_".concat((new Date).getTime(),"_").concat(Math.random().toString().substr(2)),r=this.getWindowSelection(),o=r.getRangeAt(0);(n=this.getDocument().createRange()).setStart(r.anchorNode,e),n.setEnd(r.anchorNode,e),n.collapse(!1),(t=this.getDocument().createElement("span")).id=i,t.appendChild(this.getDocument().createTextNode("\ufeff")),n.insertNode(t),r.removeAllRanges(),r.addRange(o);var u=t.getBoundingClientRect(),a=document.documentElement,l=(window.pageXOffset||a.scrollLeft)-(a.clientLeft||0),s=(window.pageYOffset||a.scrollTop)-(a.clientTop||0),c={left:u.left+l,top:u.top+t.offsetHeight+s},d=window.innerWidth,f=window.innerHeight,h=this.getMenuDimensions(),p=this.isMenuOffScreen(c,h);p.right&&(c.left="auto",c.right=d-u.left-l);var v=this.tribute.menuContainer?this.tribute.menuContainer.offsetHeight:this.getDocument().body.offsetHeight;if(p.bottom){var m=v-(f-(this.tribute.menuContainer?this.tribute.menuContainer.getBoundingClientRect():this.getDocument().body.getBoundingClientRect()).top);c.top="auto",c.bottom=m+(f-u.top)}return(p=this.isMenuOffScreen(c,h)).left&&(c.left=d>h.width?l+d-h.width:l,delete c.right),p.top&&(c.top=f>h.height?s+f-h.height:s,delete c.bottom),t.parentNode.removeChild(t),c}},{key:"scrollIntoView",value:function(e){var t,n=this.menu;if(void 0!==n){for(;void 0===t||0===t.height;)if(0===(t=n.getBoundingClientRect()).height&&(void 0===(n=n.childNodes[0])||!n.getBoundingClientRect))return;var i=t.top,r=i+t.height;if(i<0)window.scrollTo(0,window.pageYOffset+t.top-20);else if(r>window.innerHeight){var o=window.pageYOffset+t.top-20;100<o-window.pageYOffset&&(o=window.pageYOffset+100);var u=window.pageYOffset-(window.innerHeight-r);o<u&&(u=o),window.scrollTo(0,u)}}}}]),t}();n.default=r,t.exports=n.default},{}],5:[function(e,t,n){"use strict";function i(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}Object.defineProperty(n,"__esModule",{value:!0}),n.default=void 0;var r=function(){function t(e){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),this.tribute=e,this.tribute.search=this}return function(e,t,n){t&&i(e.prototype,t),n&&i(e,n)}(t,[{key:"simpleFilter",value:function(t,e){var n=this;return e.filter(function(e){return n.test(t,e)})}},{key:"test",value:function(e,t){return null!==this.match(e,t)}},{key:"match",value:function(e,t,n){n=n||{};t.length;var i=n.pre||"",r=n.post||"",o=n.caseSensitive&&t||t.toLowerCase();if(n.skip)return{rendered:t,score:0};e=n.caseSensitive&&e||e.toLowerCase();var u=this.traverse(o,e,0,0,[]);return u?{rendered:this.render(t,u.cache,i,r),score:u.score}:null}},{key:"traverse",value:function(e,t,n,i,r){if(t.length===i)return{score:this.calculateScore(r),cache:r.slice()};if(!(e.length===n||t.length-i>e.length-n)){for(var o,u,a=t[i],l=e.indexOf(a,n);-1<l;){if(r.push(l),u=this.traverse(e,t,l+1,i+1,r),r.pop(),!u)return o;(!o||o.score<u.score)&&(o=u),l=e.indexOf(a,l+1)}return o}}},{key:"calculateScore",value:function(n){var i=0,r=1;return n.forEach(function(e,t){0<t&&(n[t-1]+1===e?r+=r+1:r=1),i+=r}),i}},{key:"render",value:function(n,i,r,o){var u=n.substring(0,i[0]);return i.forEach(function(e,t){u+=r+n[e]+o+n.substring(e+1,i[t+1]?i[t+1]:n.length)}),u}},{key:"filter",value:function(u,e,a){var l=this;return a=a||{},e.reduce(function(e,t,n,i){var r=t;a.extract&&(r=(r=a.extract(t))||"");var o=l.match(u,r,a);return null!=o&&(e[e.length]={string:o.rendered,score:o.score,index:n,original:t}),e},[]).sort(function(e,t){var n=t.score-e.score;return n||e.index-t.index})}}]),t}();n.default=r,t.exports=n.default},{}],6:[function(e,t,n){"use strict";var i;Object.defineProperty(n,"__esModule",{value:!0}),n.default=void 0;var r=((i=e("./Tribute"))&&i.__esModule?i:{default:i}).default;n.default=r,t.exports=n.default},{"./Tribute":1}],7:[function(e,t,n){"use strict";if(Array.prototype.find||(Array.prototype.find=function(e){if(null===this)throw new TypeError("Array.prototype.find called on null or undefined");if("function"!=typeof e)throw new TypeError("predicate must be a function");for(var t,n=Object(this),i=n.length>>>0,r=arguments[1],o=0;o<i;o++)if(t=n[o],e.call(r,t,o,n))return t}),window&&"function"!=typeof window.CustomEvent){var i=function(e,t){t=t||{bubbles:!1,cancelable:!1,detail:void 0};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,t.bubbles,t.cancelable,t.detail),n};void 0!==window.Event&&(i.prototype=window.Event.prototype),window.CustomEvent=i}},{}]},{},[6])(6)});
-//# sourceMappingURL=tribute.min.js.map
diff --git a/public/javascripts/tribute-5.1.3.min.js b/public/javascripts/tribute-5.1.3.min.js
new file mode 100644 (file)
index 0000000..88bd3f8
--- /dev/null
@@ -0,0 +1,2 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).Tribute=t()}(this,(function(){"use strict";function e(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function t(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function n(e,n,i){return n&&t(e.prototype,n),i&&t(e,i),e}function i(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if("undefined"==typeof Symbol||!(Symbol.iterator in Object(e)))return;var n=[],i=!0,r=!1,o=void 0;try{for(var u,l=e[Symbol.iterator]();!(i=(u=l.next()).done)&&(n.push(u.value),!t||n.length!==t);i=!0);}catch(e){r=!0,o=e}finally{try{i||null==l.return||l.return()}finally{if(r)throw o}}return n}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return r(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);n<t;n++)i[n]=e[n];return i}if(Array.prototype.find||(Array.prototype.find=function(e){if(null===this)throw new TypeError("Array.prototype.find called on null or undefined");if("function"!=typeof e)throw new TypeError("predicate must be a function");for(var t,n=Object(this),i=n.length>>>0,r=arguments[1],o=0;o<i;o++)if(t=n[o],e.call(r,t,o,n))return t}),window&&"function"!=typeof window.CustomEvent){var o=function(e,t){t=t||{bubbles:!1,cancelable:!1,detail:void 0};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,t.bubbles,t.cancelable,t.detail),n};void 0!==window.Event&&(o.prototype=window.Event.prototype),window.CustomEvent=o}var u=function(){function t(n){e(this,t),this.tribute=n,this.tribute.events=this}return n(t,[{key:"bind",value:function(e){e.boundKeydown=this.keydown.bind(e,this),e.boundKeyup=this.keyup.bind(e,this),e.boundInput=this.input.bind(e,this),e.addEventListener("keydown",e.boundKeydown,!1),e.addEventListener("keyup",e.boundKeyup,!1),e.addEventListener("input",e.boundInput,!1)}},{key:"unbind",value:function(e){e.removeEventListener("keydown",e.boundKeydown,!1),e.removeEventListener("keyup",e.boundKeyup,!1),e.removeEventListener("input",e.boundInput,!1),delete e.boundKeydown,delete e.boundKeyup,delete e.boundInput}},{key:"keydown",value:function(e,n){e.shouldDeactivate(n)&&(e.tribute.isActive=!1,e.tribute.hideMenu());var i=this;e.commandEvent=!1,t.keys().forEach((function(t){t.key===n.keyCode&&(e.commandEvent=!0,e.callbacks()[t.value.toLowerCase()](n,i))}))}},{key:"input",value:function(e,t){e.inputEvent=!0,e.keyup.call(this,e,t)}},{key:"click",value:function(e,t){var n=e.tribute;if(n.menu&&n.menu.contains(t.target)){var i=t.target;for(t.preventDefault(),t.stopPropagation();"li"!==i.nodeName.toLowerCase();)if(!(i=i.parentNode)||i===n.menu)throw new Error("cannot find the <li> container for the click");n.selectItemAtIndex(i.getAttribute("data-index"),t),n.hideMenu()}else n.current.element&&!n.current.externalTrigger&&(n.current.externalTrigger=!1,setTimeout((function(){return n.hideMenu()})))}},{key:"keyup",value:function(e,t){if(e.inputEvent&&(e.inputEvent=!1),e.updateSelection(this),27!==t.keyCode){if(!e.tribute.allowSpaces&&e.tribute.hasTrailingSpace)return e.tribute.hasTrailingSpace=!1,e.commandEvent=!0,void e.callbacks().space(t,this);if(!e.tribute.isActive)if(e.tribute.autocompleteMode)e.callbacks().triggerChar(t,this,"");else{var n=e.getKeyCode(e,this,t);if(isNaN(n)||!n)return;var i=e.tribute.triggers().find((function(e){return e.charCodeAt(0)===n}));void 0!==i&&e.callbacks().triggerChar(t,this,i)}e.tribute.current.mentionText.length<e.tribute.current.collection.menuShowMinLength||((e.tribute.current.trigger||e.tribute.autocompleteMode)&&!1===e.commandEvent||e.tribute.isActive&&8===t.keyCode)&&e.tribute.showMenuFor(this,!0)}}},{key:"shouldDeactivate",value:function(e){if(!this.tribute.isActive)return!1;if(0===this.tribute.current.mentionText.length){var n=!1;return t.keys().forEach((function(t){e.keyCode===t.key&&(n=!0)})),!n}return!1}},{key:"getKeyCode",value:function(e,t,n){var i=e.tribute,r=i.range.getTriggerInfo(!1,i.hasTrailingSpace,!0,i.allowSpaces,i.autocompleteMode);return!!r&&r.mentionTriggerChar.charCodeAt(0)}},{key:"updateSelection",value:function(e){this.tribute.current.element=e;var t=this.tribute.range.getTriggerInfo(!1,this.tribute.hasTrailingSpace,!0,this.tribute.allowSpaces,this.tribute.autocompleteMode);t&&(this.tribute.current.selectedPath=t.mentionSelectedPath,this.tribute.current.mentionText=t.mentionText,this.tribute.current.selectedOffset=t.mentionSelectedOffset)}},{key:"callbacks",value:function(){var e=this;return{triggerChar:function(t,n,i){var r=e.tribute;r.current.trigger=i;var o=r.collection.find((function(e){return e.trigger===i}));r.current.collection=o,r.current.mentionText.length>=r.current.collection.menuShowMinLength&&r.inputEvent&&r.showMenuFor(n,!0)},enter:function(t,n){e.tribute.isActive&&e.tribute.current.filteredItems&&(t.preventDefault(),t.stopPropagation(),setTimeout((function(){e.tribute.selectItemAtIndex(e.tribute.menuSelected,t),e.tribute.hideMenu()}),0))},escape:function(t,n){e.tribute.isActive&&(t.preventDefault(),t.stopPropagation(),e.tribute.isActive=!1,e.tribute.hideMenu())},tab:function(t,n){e.callbacks().enter(t,n)},space:function(t,n){e.tribute.isActive&&(e.tribute.spaceSelectsMatch?e.callbacks().enter(t,n):e.tribute.allowSpaces||(t.stopPropagation(),setTimeout((function(){e.tribute.hideMenu(),e.tribute.isActive=!1}),0)))},up:function(t,n){if(e.tribute.isActive&&e.tribute.current.filteredItems){t.preventDefault(),t.stopPropagation();var i=e.tribute.current.filteredItems.length,r=e.tribute.menuSelected;i>r&&r>0?(e.tribute.menuSelected--,e.setActiveLi()):0===r&&(e.tribute.menuSelected=i-1,e.setActiveLi(),e.tribute.menu.scrollTop=e.tribute.menu.scrollHeight)}},down:function(t,n){if(e.tribute.isActive&&e.tribute.current.filteredItems){t.preventDefault(),t.stopPropagation();var i=e.tribute.current.filteredItems.length-1,r=e.tribute.menuSelected;i>r?(e.tribute.menuSelected++,e.setActiveLi()):i===r&&(e.tribute.menuSelected=0,e.setActiveLi(),e.tribute.menu.scrollTop=0)}},delete:function(t,n){e.tribute.isActive&&e.tribute.current.mentionText.length<1?e.tribute.hideMenu():e.tribute.isActive&&e.tribute.showMenuFor(n)}}}},{key:"setActiveLi",value:function(e){var t=this.tribute.menu.querySelectorAll("li"),n=t.length>>>0;e&&(this.tribute.menuSelected=parseInt(e));for(var i=0;i<n;i++){var r=t[i];if(i===this.tribute.menuSelected){r.classList.add(this.tribute.current.collection.selectClass);var o=r.getBoundingClientRect(),u=this.tribute.menu.getBoundingClientRect();if(o.bottom>u.bottom){var l=o.bottom-u.bottom;this.tribute.menu.scrollTop+=l}else if(o.top<u.top){var a=u.top-o.top;this.tribute.menu.scrollTop-=a}}else r.classList.remove(this.tribute.current.collection.selectClass)}}},{key:"getFullHeight",value:function(e,t){var n=e.getBoundingClientRect().height;if(t){var i=e.currentStyle||window.getComputedStyle(e);return n+parseFloat(i.marginTop)+parseFloat(i.marginBottom)}return n}}],[{key:"keys",value:function(){return[{key:9,value:"TAB"},{key:8,value:"DELETE"},{key:13,value:"ENTER"},{key:27,value:"ESCAPE"},{key:32,value:"SPACE"},{key:38,value:"UP"},{key:40,value:"DOWN"}]}}]),t}(),l=function(){function t(n){e(this,t),this.tribute=n,this.tribute.menuEvents=this,this.menu=this.tribute.menu}return n(t,[{key:"bind",value:function(e){var t=this;this.menuClickEvent=this.tribute.events.click.bind(null,this),this.menuContainerScrollEvent=this.debounce((function(){t.tribute.isActive&&t.tribute.showMenuFor(t.tribute.current.element,!1)}),300,!1),this.windowResizeEvent=this.debounce((function(){t.tribute.isActive&&t.tribute.range.positionMenuAtCaret(!0)}),300,!1),this.tribute.range.getDocument().addEventListener("MSPointerDown",this.menuClickEvent,!1),this.tribute.range.getDocument().addEventListener("mousedown",this.menuClickEvent,!1),window.addEventListener("resize",this.windowResizeEvent),this.menuContainer?this.menuContainer.addEventListener("scroll",this.menuContainerScrollEvent,!1):window.addEventListener("scroll",this.menuContainerScrollEvent)}},{key:"unbind",value:function(e){this.tribute.range.getDocument().removeEventListener("mousedown",this.menuClickEvent,!1),this.tribute.range.getDocument().removeEventListener("MSPointerDown",this.menuClickEvent,!1),window.removeEventListener("resize",this.windowResizeEvent),this.menuContainer?this.menuContainer.removeEventListener("scroll",this.menuContainerScrollEvent,!1):window.removeEventListener("scroll",this.menuContainerScrollEvent)}},{key:"debounce",value:function(e,t,n){var i,r=arguments,o=this;return function(){var u=o,l=r,a=n&&!i;clearTimeout(i),i=setTimeout((function(){i=null,n||e.apply(u,l)}),t),a&&e.apply(u,l)}}}]),t}(),a=function(){function t(n){e(this,t),this.tribute=n,this.tribute.range=this}return n(t,[{key:"getDocument",value:function(){var e;return this.tribute.current.collection&&(e=this.tribute.current.collection.iframe),e?e.contentWindow.document:document}},{key:"positionMenuAtCaret",value:function(e){var t,n=this,i=this.tribute.current,r=this.getTriggerInfo(!1,this.tribute.hasTrailingSpace,!0,this.tribute.allowSpaces,this.tribute.autocompleteMode);if(void 0!==r){if(!this.tribute.positionMenu)return void(this.tribute.menu.style.cssText="display: block;");t=this.isContentEditable(i.element)?this.getContentEditableCaretPosition(r.mentionPosition):this.getTextAreaOrInputUnderlinePosition(this.tribute.current.element,r.mentionPosition),this.tribute.menu.style.cssText="top: ".concat(t.top,"px;\n                                     left: ").concat(t.left,"px;\n                                     right: ").concat(t.right,"px;\n                                     bottom: ").concat(t.bottom,"px;\n                                     position: absolute;\n                                     display: block;"),"auto"===t.left&&(this.tribute.menu.style.left="auto"),"auto"===t.top&&(this.tribute.menu.style.top="auto"),e&&this.scrollIntoView(),window.setTimeout((function(){var i={width:n.tribute.menu.offsetWidth,height:n.tribute.menu.offsetHeight},r=n.isMenuOffScreen(t,i),o=window.innerWidth>i.width&&(r.left||r.right),u=window.innerHeight>i.height&&(r.top||r.bottom);(o||u)&&(n.tribute.menu.style.cssText="display: none",n.positionMenuAtCaret(e))}),0)}else this.tribute.menu.style.cssText="display: none"}},{key:"selectElement",value:function(e,t,n){var i,r=e;if(t)for(var o=0;o<t.length;o++){if(void 0===(r=r.childNodes[t[o]]))return;for(;r.length<n;)n-=r.length,r=r.nextSibling;0!==r.childNodes.length||r.length||(r=r.previousSibling)}var u=this.getWindowSelection();(i=this.getDocument().createRange()).setStart(r,n),i.setEnd(r,n),i.collapse(!0);try{u.removeAllRanges()}catch(e){}u.addRange(i),e.focus()}},{key:"replaceTriggerText",value:function(e,t,n,i,r){var o=this.getTriggerInfo(!0,n,t,this.tribute.allowSpaces,this.tribute.autocompleteMode);if(void 0!==o){var u=this.tribute.current,l=new CustomEvent("tribute-replaced",{detail:{item:r,instance:u,context:o,event:i}});if(this.isContentEditable(u.element)){e+="string"==typeof this.tribute.replaceTextSuffix?this.tribute.replaceTextSuffix:" ";var a=o.mentionPosition+o.mentionText.length;this.tribute.autocompleteMode||(a+=o.mentionTriggerChar.length),this.pasteHtml(e,o.mentionPosition,a)}else{var s=this.tribute.current.element,c="string"==typeof this.tribute.replaceTextSuffix?this.tribute.replaceTextSuffix:" ";e+=c;var h=o.mentionPosition,d=o.mentionPosition+o.mentionText.length+c.length;this.tribute.autocompleteMode||(d+=o.mentionTriggerChar.length-1),s.value=s.value.substring(0,h)+e+s.value.substring(d,s.value.length),s.selectionStart=h+e.length,s.selectionEnd=h+e.length}u.element.dispatchEvent(new CustomEvent("input",{bubbles:!0})),u.element.dispatchEvent(l)}}},{key:"pasteHtml",value:function(e,t,n){var i,r;r=this.getWindowSelection(),(i=this.getDocument().createRange()).setStart(r.anchorNode,t),i.setEnd(r.anchorNode,n),i.deleteContents();var o=this.getDocument().createElement("div");o.innerHTML=e;for(var u,l,a=this.getDocument().createDocumentFragment();u=o.firstChild;)l=a.appendChild(u);i.insertNode(a),l&&((i=i.cloneRange()).setStartAfter(l),i.collapse(!0),r.removeAllRanges(),r.addRange(i))}},{key:"getWindowSelection",value:function(){return this.tribute.collection.iframe?this.tribute.collection.iframe.contentWindow.getSelection():window.getSelection()}},{key:"getNodePositionInParent",value:function(e){if(null===e.parentNode)return 0;for(var t=0;t<e.parentNode.childNodes.length;t++){if(e.parentNode.childNodes[t]===e)return t}}},{key:"getContentEditableSelectedPath",value:function(e){var t=this.getWindowSelection(),n=t.anchorNode,i=[];if(null!=n){for(var r,o=n.contentEditable;null!==n&&"true"!==o;)r=this.getNodePositionInParent(n),i.push(r),null!==(n=n.parentNode)&&(o=n.contentEditable);return i.reverse(),{selected:n,path:i,offset:t.getRangeAt(0).startOffset}}}},{key:"getTextPrecedingCurrentSelection",value:function(){var e=this.tribute.current,t="";if(this.isContentEditable(e.element)){var n=this.getWindowSelection().anchorNode;if(null!=n){var i=n.textContent,r=this.getWindowSelection().getRangeAt(0).startOffset;i&&r>=0&&(t=i.substring(0,r))}}else{var o=this.tribute.current.element;if(o){var u=o.selectionStart;o.value&&u>=0&&(t=o.value.substring(0,u))}}return t}},{key:"getLastWordInText",value:function(e){var t;return e=e.replace(/\u00A0/g," "),(t=this.tribute.autocompleteSeparator?e.split(this.tribute.autocompleteSeparator):e.split(/\s+/))[t.length-1].trim()}},{key:"getTriggerInfo",value:function(e,t,n,i,r){var o,u,l,a=this,s=this.tribute.current;if(this.isContentEditable(s.element)){var c=this.getContentEditableSelectedPath(s);c&&(o=c.selected,u=c.path,l=c.offset)}else o=this.tribute.current.element;var h=this.getTextPrecedingCurrentSelection(),d=this.getLastWordInText(h);if(r)return{mentionPosition:h.length-d.length,mentionText:d,mentionSelectedElement:o,mentionSelectedPath:u,mentionSelectedOffset:l};if(null!=h){var f,m=-1;if(this.tribute.collection.forEach((function(e){var t=e.trigger,i=e.requireLeadingSpace?a.lastIndexWithLeadingSpace(h,t):h.lastIndexOf(t);i>m&&(m=i,f=t,n=e.requireLeadingSpace)})),m>=0&&(0===m||!n||/[\xA0\s]/g.test(h.substring(m-1,m)))){var p=h.substring(m+f.length,h.length);f=h.substring(m,m+f.length);var v=p.substring(0,1),g=p.length>0&&(" "===v||" "===v);t&&(p=p.trim());var b=i?/[^\S ]/g:/[\xA0\s]/g;if(this.tribute.hasTrailingSpace=b.test(p),!g&&(e||!b.test(p)))return{mentionPosition:m,mentionText:p,mentionSelectedElement:o,mentionSelectedPath:u,mentionSelectedOffset:l,mentionTriggerChar:f}}}}},{key:"lastIndexWithLeadingSpace",value:function(e,t){for(var n=e.split("").reverse().join(""),i=-1,r=0,o=e.length;r<o;r++){for(var u=r===e.length-1,l=/\s/.test(n[r+1]),a=!0,s=t.length-1;s>=0;s--)if(t[s]!==n[r-s]){a=!1;break}if(a&&(u||l)){i=e.length-1-r;break}}return i}},{key:"isContentEditable",value:function(e){return"INPUT"!==e.nodeName&&"TEXTAREA"!==e.nodeName}},{key:"isMenuOffScreen",value:function(e,t){var n=window.innerWidth,i=window.innerHeight,r=document.documentElement,o=(window.pageXOffset||r.scrollLeft)-(r.clientLeft||0),u=(window.pageYOffset||r.scrollTop)-(r.clientTop||0),l="number"==typeof e.top?e.top:u+i-e.bottom-t.height,a="number"==typeof e.right?e.right:e.left+t.width,s="number"==typeof e.bottom?e.bottom:e.top+t.height,c="number"==typeof e.left?e.left:o+n-e.right-t.width;return{top:l<Math.floor(u),right:a>Math.ceil(o+n),bottom:s>Math.ceil(u+i),left:c<Math.floor(o)}}},{key:"getMenuDimensions",value:function(){var e={width:null,height:null};return this.tribute.menu.style.cssText="top: 0px;\n                                 left: 0px;\n                                 position: fixed;\n                                 display: block;\n                                 visibility; hidden;",e.width=this.tribute.menu.offsetWidth,e.height=this.tribute.menu.offsetHeight,this.tribute.menu.style.cssText="display: none;",e}},{key:"getTextAreaOrInputUnderlinePosition",value:function(e,t,n){var i=null!==window.mozInnerScreenX,r=this.getDocument().createElement("div");r.id="input-textarea-caret-position-mirror-div",this.getDocument().body.appendChild(r);var o=r.style,u=window.getComputedStyle?getComputedStyle(e):e.currentStyle;o.whiteSpace="pre-wrap","INPUT"!==e.nodeName&&(o.wordWrap="break-word"),o.position="absolute",o.visibility="hidden",["direction","boxSizing","width","height","overflowX","overflowY","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","paddingTop","paddingRight","paddingBottom","paddingLeft","fontStyle","fontVariant","fontWeight","fontStretch","fontSize","fontSizeAdjust","lineHeight","fontFamily","textAlign","textTransform","textIndent","textDecoration","letterSpacing","wordSpacing"].forEach((function(e){o[e]=u[e]})),i?(o.width="".concat(parseInt(u.width)-2,"px"),e.scrollHeight>parseInt(u.height)&&(o.overflowY="scroll")):o.overflow="hidden",r.textContent=e.value.substring(0,t),"INPUT"===e.nodeName&&(r.textContent=r.textContent.replace(/\s/g," "));var l=this.getDocument().createElement("span");l.textContent=e.value.substring(t)||".",r.appendChild(l);var a=e.getBoundingClientRect(),s=document.documentElement,c=(window.pageXOffset||s.scrollLeft)-(s.clientLeft||0),h=(window.pageYOffset||s.scrollTop)-(s.clientTop||0),d=0,f=0;this.menuContainerIsBody&&(d=a.top,f=a.left);var m={top:d+h+l.offsetTop+parseInt(u.borderTopWidth)+parseInt(u.fontSize)-e.scrollTop,left:f+c+l.offsetLeft+parseInt(u.borderLeftWidth)},p=window.innerWidth,v=window.innerHeight,g=this.getMenuDimensions(),b=this.isMenuOffScreen(m,g);b.right&&(m.right=p-m.left,m.left="auto");var y=this.tribute.menuContainer?this.tribute.menuContainer.offsetHeight:this.getDocument().body.offsetHeight;if(b.bottom){var w=y-(v-(this.tribute.menuContainer?this.tribute.menuContainer.getBoundingClientRect():this.getDocument().body.getBoundingClientRect()).top);m.bottom=w+(v-a.top-l.offsetTop),m.top="auto"}return(b=this.isMenuOffScreen(m,g)).left&&(m.left=p>g.width?c+p-g.width:c,delete m.right),b.top&&(m.top=v>g.height?h+v-g.height:h,delete m.bottom),this.getDocument().body.removeChild(r),m}},{key:"getContentEditableCaretPosition",value:function(e){var t,n=this.getWindowSelection();(t=this.getDocument().createRange()).setStart(n.anchorNode,e),t.setEnd(n.anchorNode,e),t.collapse(!1);var i=t.getBoundingClientRect(),r=document.documentElement,o=(window.pageXOffset||r.scrollLeft)-(r.clientLeft||0),u=(window.pageYOffset||r.scrollTop)-(r.clientTop||0),l={left:i.left+o,top:i.top+i.height+u},a=window.innerWidth,s=window.innerHeight,c=this.getMenuDimensions(),h=this.isMenuOffScreen(l,c);h.right&&(l.left="auto",l.right=a-i.left-o);var d=this.tribute.menuContainer?this.tribute.menuContainer.offsetHeight:this.getDocument().body.offsetHeight;if(h.bottom){var f=d-(s-(this.tribute.menuContainer?this.tribute.menuContainer.getBoundingClientRect():this.getDocument().body.getBoundingClientRect()).top);l.top="auto",l.bottom=f+(s-i.top)}return(h=this.isMenuOffScreen(l,c)).left&&(l.left=a>c.width?o+a-c.width:o,delete l.right),h.top&&(l.top=s>c.height?u+s-c.height:u,delete l.bottom),this.menuContainerIsBody||(l.left=l.left?l.left-this.tribute.menuContainer.offsetLeft:l.left,l.top=l.top?l.top-this.tribute.menuContainer.offsetTop:l.top),l}},{key:"scrollIntoView",value:function(e){var t,n=this.menu;if(void 0!==n){for(;void 0===t||0===t.height;)if(0===(t=n.getBoundingClientRect()).height&&(void 0===(n=n.childNodes[0])||!n.getBoundingClientRect))return;var i=t.top,r=i+t.height;if(i<0)window.scrollTo(0,window.pageYOffset+t.top-20);else if(r>window.innerHeight){var o=window.pageYOffset+t.top-20;o-window.pageYOffset>100&&(o=window.pageYOffset+100);var u=window.pageYOffset-(window.innerHeight-r);u>o&&(u=o),window.scrollTo(0,u)}}}},{key:"menuContainerIsBody",get:function(){return this.tribute.menuContainer===document.body||!this.tribute.menuContainer}}]),t}(),s=function(){function t(n){e(this,t),this.tribute=n,this.tribute.search=this}return n(t,[{key:"simpleFilter",value:function(e,t){var n=this;return t.filter((function(t){return n.test(e,t)}))}},{key:"test",value:function(e,t){return null!==this.match(e,t)}},{key:"match",value:function(e,t,n){n=n||{};t.length;var i=n.pre||"",r=n.post||"",o=n.caseSensitive&&t||t.toLowerCase();if(n.skip)return{rendered:t,score:0};e=n.caseSensitive&&e||e.toLowerCase();var u=this.traverse(o,e,0,0,[]);return u?{rendered:this.render(t,u.cache,i,r),score:u.score}:null}},{key:"traverse",value:function(e,t,n,i,r){if(this.tribute.autocompleteSeparator&&(t=t.split(this.tribute.autocompleteSeparator).splice(-1)[0]),t.length===i)return{score:this.calculateScore(r),cache:r.slice()};if(!(e.length===n||t.length-i>e.length-n)){for(var o,u,l=t[i],a=e.indexOf(l,n);a>-1;){if(r.push(a),u=this.traverse(e,t,a+1,i+1,r),r.pop(),!u)return o;(!o||o.score<u.score)&&(o=u),a=e.indexOf(l,a+1)}return o}}},{key:"calculateScore",value:function(e){var t=0,n=1;return e.forEach((function(i,r){r>0&&(e[r-1]+1===i?n+=n+1:n=1),t+=n})),t}},{key:"render",value:function(e,t,n,i){var r=e.substring(0,t[0]);return t.forEach((function(o,u){r+=n+e[o]+i+e.substring(o+1,t[u+1]?t[u+1]:e.length)})),r}},{key:"filter",value:function(e,t,n){var i=this;return n=n||{},t.reduce((function(t,r,o,u){var l=r;n.extract&&((l=n.extract(r))||(l=""));var a=i.match(e,l,n);return null!=a&&(t[t.length]={string:a.rendered,score:a.score,index:o,original:r}),t}),[]).sort((function(e,t){var n=t.score-e.score;return n||e.index-t.index}))}}]),t}();return function(){function t(n){var i,r=this,o=n.values,c=void 0===o?null:o,h=n.iframe,d=void 0===h?null:h,f=n.selectClass,m=void 0===f?"highlight":f,p=n.containerClass,v=void 0===p?"tribute-container":p,g=n.itemClass,b=void 0===g?"":g,y=n.trigger,w=void 0===y?"@":y,T=n.autocompleteMode,C=void 0!==T&&T,S=n.autocompleteSeparator,E=void 0===S?null:S,k=n.selectTemplate,x=void 0===k?null:k,M=n.menuItemTemplate,A=void 0===M?null:M,L=n.lookup,I=void 0===L?"key":L,N=n.fillAttr,O=void 0===N?"value":N,D=n.collection,P=void 0===D?null:D,R=n.menuContainer,W=void 0===R?null:R,H=n.noMatchTemplate,B=void 0===H?null:H,F=n.requireLeadingSpace,_=void 0===F||F,j=n.allowSpaces,Y=void 0!==j&&j,z=n.replaceTextSuffix,K=void 0===z?null:z,U=n.positionMenu,q=void 0===U||U,X=n.spaceSelectsMatch,Q=void 0!==X&&X,V=n.searchOpts,$=void 0===V?{}:V,G=n.menuItemLimit,J=void 0===G?null:G,Z=n.menuShowMinLength,ee=void 0===Z?0:Z;if(e(this,t),this.autocompleteMode=C,this.autocompleteSeparator=E,this.menuSelected=0,this.current={},this.inputEvent=!1,this.isActive=!1,this.menuContainer=W,this.allowSpaces=Y,this.replaceTextSuffix=K,this.positionMenu=q,this.hasTrailingSpace=!1,this.spaceSelectsMatch=Q,this.autocompleteMode&&(w="",Y=!1),c)this.collection=[{trigger:w,iframe:d,selectClass:m,containerClass:v,itemClass:b,selectTemplate:(x||t.defaultSelectTemplate).bind(this),menuItemTemplate:(A||t.defaultMenuItemTemplate).bind(this),noMatchTemplate:(i=B,"string"==typeof i?""===i.trim()?null:i:"function"==typeof i?i.bind(r):B||function(){return"<li>No Match Found!</li>"}.bind(r)),lookup:I,fillAttr:O,values:c,requireLeadingSpace:_,searchOpts:$,menuItemLimit:J,menuShowMinLength:ee}];else{if(!P)throw new Error("[Tribute] No collection specified.");this.autocompleteMode&&console.warn("Tribute in autocomplete mode does not work for collections"),this.collection=P.map((function(e){return{trigger:e.trigger||w,iframe:e.iframe||d,selectClass:e.selectClass||m,containerClass:e.containerClass||v,itemClass:e.itemClass||b,selectTemplate:(e.selectTemplate||t.defaultSelectTemplate).bind(r),menuItemTemplate:(e.menuItemTemplate||t.defaultMenuItemTemplate).bind(r),noMatchTemplate:function(e){return"string"==typeof e?""===e.trim()?null:e:"function"==typeof e?e.bind(r):B||function(){return"<li>No Match Found!</li>"}.bind(r)}(B),lookup:e.lookup||I,fillAttr:e.fillAttr||O,values:e.values,requireLeadingSpace:e.requireLeadingSpace,searchOpts:e.searchOpts||$,menuItemLimit:e.menuItemLimit||J,menuShowMinLength:e.menuShowMinLength||ee}}))}new a(this),new u(this),new l(this),new s(this)}return n(t,[{key:"triggers",value:function(){return this.collection.map((function(e){return e.trigger}))}},{key:"attach",value:function(e){if(!e)throw new Error("[Tribute] Must pass in a DOM node or NodeList.");if("undefined"!=typeof jQuery&&e instanceof jQuery&&(e=e.get()),e.constructor===NodeList||e.constructor===HTMLCollection||e.constructor===Array)for(var t=e.length,n=0;n<t;++n)this._attach(e[n]);else this._attach(e)}},{key:"_attach",value:function(e){e.hasAttribute("data-tribute")&&console.warn("Tribute was already bound to "+e.nodeName),this.ensureEditable(e),this.events.bind(e),e.setAttribute("data-tribute",!0)}},{key:"ensureEditable",value:function(e){if(-1===t.inputTypes().indexOf(e.nodeName)){if(!e.contentEditable)throw new Error("[Tribute] Cannot bind to "+e.nodeName);e.contentEditable=!0}}},{key:"createMenu",value:function(e){var t=this.range.getDocument().createElement("div"),n=this.range.getDocument().createElement("ul");return t.className=e,t.appendChild(n),this.menuContainer?this.menuContainer.appendChild(t):this.range.getDocument().body.appendChild(t)}},{key:"showMenuFor",value:function(e,t){var n=this;if(!this.isActive||this.current.element!==e||this.current.mentionText!==this.currentMentionTextSnapshot){this.currentMentionTextSnapshot=this.current.mentionText,this.menu||(this.menu=this.createMenu(this.current.collection.containerClass),e.tributeMenu=this.menu,this.menuEvents.bind(this.menu)),this.isActive=!0,this.menuSelected=0,this.current.mentionText||(this.current.mentionText="");var r=function(e){if(n.isActive){var r=n.search.filter(n.current.mentionText,e,{pre:n.current.collection.searchOpts.pre||"<span>",post:n.current.collection.searchOpts.post||"</span>",skip:n.current.collection.searchOpts.skip,extract:function(e){if("string"==typeof n.current.collection.lookup)return e[n.current.collection.lookup];if("function"==typeof n.current.collection.lookup)return n.current.collection.lookup(e,n.current.mentionText);throw new Error("Invalid lookup attribute, lookup must be string or function.")}});n.current.collection.menuItemLimit&&(r=r.slice(0,n.current.collection.menuItemLimit)),n.current.filteredItems=r;var o=n.menu.querySelector("ul");if(n.range.positionMenuAtCaret(t),!r.length){var u=new CustomEvent("tribute-no-match",{detail:n.menu});return n.current.element.dispatchEvent(u),void("function"==typeof n.current.collection.noMatchTemplate&&!n.current.collection.noMatchTemplate()||!n.current.collection.noMatchTemplate?n.hideMenu():"function"==typeof n.current.collection.noMatchTemplate?o.innerHTML=n.current.collection.noMatchTemplate():o.innerHTML=n.current.collection.noMatchTemplate)}o.innerHTML="";var l=n.range.getDocument().createDocumentFragment();r.forEach((function(e,t){var r=n.range.getDocument().createElement("li");r.setAttribute("data-index",t),r.className=n.current.collection.itemClass,r.addEventListener("mousemove",(function(e){var t=i(n._findLiTarget(e.target),2),r=(t[0],t[1]);0!==e.movementY&&n.events.setActiveLi(r)})),n.menuSelected===t&&r.classList.add(n.current.collection.selectClass),r.innerHTML=n.current.collection.menuItemTemplate(e),l.appendChild(r)})),o.appendChild(l)}};"function"==typeof this.current.collection.values?this.current.collection.values(this.current.mentionText,r):r(this.current.collection.values)}}},{key:"_findLiTarget",value:function(e){if(!e)return[];var t=e.getAttribute("data-index");return t?[e,t]:this._findLiTarget(e.parentNode)}},{key:"showMenuForCollection",value:function(e,t){e!==document.activeElement&&this.placeCaretAtEnd(e),this.current.collection=this.collection[t||0],this.current.externalTrigger=!0,this.current.element=e,e.isContentEditable?this.insertTextAtCursor(this.current.collection.trigger):this.insertAtCaret(e,this.current.collection.trigger),this.showMenuFor(e)}},{key:"placeCaretAtEnd",value:function(e){if(e.focus(),void 0!==window.getSelection&&void 0!==document.createRange){var t=document.createRange();t.selectNodeContents(e),t.collapse(!1);var n=window.getSelection();n.removeAllRanges(),n.addRange(t)}else if(void 0!==document.body.createTextRange){var i=document.body.createTextRange();i.moveToElementText(e),i.collapse(!1),i.select()}}},{key:"insertTextAtCursor",value:function(e){var t,n;(n=(t=window.getSelection()).getRangeAt(0)).deleteContents();var i=document.createTextNode(e);n.insertNode(i),n.selectNodeContents(i),n.collapse(!1),t.removeAllRanges(),t.addRange(n)}},{key:"insertAtCaret",value:function(e,t){var n=e.scrollTop,i=e.selectionStart,r=e.value.substring(0,i),o=e.value.substring(e.selectionEnd,e.value.length);e.value=r+t+o,i+=t.length,e.selectionStart=i,e.selectionEnd=i,e.focus(),e.scrollTop=n}},{key:"hideMenu",value:function(){this.menu&&(this.menu.style.cssText="display: none;",this.isActive=!1,this.menuSelected=0,this.current={})}},{key:"selectItemAtIndex",value:function(e,t){if("number"==typeof(e=parseInt(e))&&!isNaN(e)){var n=this.current.filteredItems[e],i=this.current.collection.selectTemplate(n);null!==i&&this.replaceText(i,t,n)}}},{key:"replaceText",value:function(e,t,n){this.range.replaceTriggerText(e,!0,!0,t,n)}},{key:"_append",value:function(e,t,n){if("function"==typeof e.values)throw new Error("Unable to append to values, as it is a function.");e.values=n?t:e.values.concat(t)}},{key:"append",value:function(e,t,n){var i=parseInt(e);if("number"!=typeof i)throw new Error("please provide an index for the collection to update.");var r=this.collection[i];this._append(r,t,n)}},{key:"appendCurrent",value:function(e,t){if(!this.isActive)throw new Error("No active state. Please use append instead and pass an index.");this._append(this.current.collection,e,t)}},{key:"detach",value:function(e){if(!e)throw new Error("[Tribute] Must pass in a DOM node or NodeList.");if("undefined"!=typeof jQuery&&e instanceof jQuery&&(e=e.get()),e.constructor===NodeList||e.constructor===HTMLCollection||e.constructor===Array)for(var t=e.length,n=0;n<t;++n)this._detach(e[n]);else this._detach(e)}},{key:"_detach",value:function(e){var t=this;this.events.unbind(e),e.tributeMenu&&this.menuEvents.unbind(e.tributeMenu),setTimeout((function(){e.removeAttribute("data-tribute"),t.isActive=!1,e.tributeMenu&&e.tributeMenu.remove()}))}},{key:"isActive",get:function(){return this._isActive},set:function(e){if(this._isActive!=e&&(this._isActive=e,this.current.element)){var t=new CustomEvent("tribute-active-".concat(e));this.current.element.dispatchEvent(t)}}}],[{key:"defaultSelectTemplate",value:function(e){return void 0===e?"".concat(this.current.collection.trigger).concat(this.current.mentionText):this.range.isContentEditable(this.current.element)?'<span class="tribute-mention">'+(this.current.collection.trigger+e.original[this.current.collection.fillAttr])+"</span>":this.current.collection.trigger+e.original[this.current.collection.fillAttr]}},{key:"defaultMenuItemTemplate",value:function(e){return e.string}},{key:"inputTypes",value:function(){return["TEXTAREA","INPUT"]}}]),t}()}));
+//# sourceMappingURL=tribute.min.js.map
index 0788c7bceda018ca680b1bed83e4eecace4cffa5..9ec73d5389989c23db49b289e0a039cf4dcc7ba5 100644 (file)
@@ -1 +1 @@
-{"version":3,"sources":["tribute.min.js"],"names":["f","exports","module","define","amd","window","global","self","this","Tribute","r","e","n","t","o","i","c","require","u","a","Error","code","p","call","length","1","Object","defineProperty","value","_interopRequireDefault","_TributeEvents","_TributeMenuEvents","_TributeRange","_TributeSearch","obj","__esModule","default","_slicedToArray","arr","Array","isArray","_arrayWithHoles","_arr","_n","_d","_e","undefined","_s","_i","Symbol","iterator","next","done","push","err","_iterableToArrayLimit","TypeError","_nonIterableRest","_defineProperties","target","props","descriptor","enumerable","configurable","writable","key","_default","_ref","_this","_ref$values","values","_ref$iframe","iframe","_ref$selectClass","selectClass","_ref$trigger","trigger","_ref$autocompleteMode","autocompleteMode","_ref$selectTemplate","selectTemplate","_ref$menuItemTemplate","menuItemTemplate","_ref$lookup","lookup","_ref$fillAttr","fillAttr","_ref$collection","collection","_ref$menuContainer","menuContainer","_ref$noMatchTemplate","noMatchTemplate","_ref$requireLeadingSp","requireLeadingSpace","_ref$allowSpaces","allowSpaces","_ref$replaceTextSuffi","replaceTextSuffix","_ref$positionMenu","positionMenu","_ref$spaceSelectsMatc","spaceSelectsMatch","_ref$searchOpts","searchOpts","_ref$menuItemLimit","menuItemLimit","instance","Constructor","_classCallCheck","menuSelected","current","inputEvent","isActive","hasTrailingSpace","defaultSelectTemplate","bind","defaultMenuItemTemplate","console","warn","map","item","protoProps","staticProps","prototype","_createClass","config","el","jQuery","get","constructor","NodeList","HTMLCollection","_attach","hasAttribute","nodeName","ensureEditable","events","setAttribute","element","inputTypes","indexOf","contentEditable","wrapper","range","getDocument","createElement","ul","className","appendChild","body","scrollTo","_this2","mentionText","currentMentionTextSnapshot","menu","createMenu","tributeMenu","menuEvents","processValues","items","search","filter","pre","post","skip","extract","filteredItems","querySelector","positionMenuAtCaret","noMatchEvent","CustomEvent","detail","dispatchEvent","hideMenu","innerHTML","slice","fragment","createDocumentFragment","forEach","index","li","addEventListener","_this2$_findLiTarget2","_findLiTarget","movementY","setActiveLi","getAttribute","parentNode","collectionIndex","document","activeElement","placeCaretAtEnd","externalTrigger","isContentEditable","insertTextAtCursor","insertAtCaret","showMenuFor","focus","getSelection","createRange","selectNodeContents","collapse","sel","removeAllRanges","addRange","createTextRange","textRange","moveToElementText","select","text","getRangeAt","deleteContents","textNode","createTextNode","insertNode","textarea","scrollPos","scrollTop","caretPos","selectionStart","front","substring","back","selectionEnd","style","cssText","originalEvent","parseInt","isNaN","content","replaceText","replaceTriggerText","newValues","replace","concat","_append","_detach","_this3","unbind","setTimeout","removeAttribute","remove","original","matchItem","string","./TributeEvents","./TributeMenuEvents","./TributeRange","./TributeSearch","./utils","2","TributeEvents","tribute","boundKeydown","keydown","boundKeyup","keyup","boundInput","input","removeEventListener","event","shouldDeactivate","commandEvent","keys","keyCode","callbacks","toLowerCase","contains","preventDefault","stopPropagation","selectItemAtIndex","updateSelection","triggerChar","getKeyCode","triggers","find","charCodeAt","eventKeyPressed","info","getTriggerInfo","mentionTriggerChar","selectedPath","mentionSelectedPath","selectedOffset","mentionSelectedOffset","collectionItem","enter","escape","tab","space","up","count","selected","scrollHeight","down","delete","lis","querySelectorAll","classList","add","liClientRect","getBoundingClientRect","menuClientRect","bottom","scrollDistance","top","_scrollDistance","elem","includeMargin","height","currentStyle","getComputedStyle","parseFloat","marginTop","marginBottom","3","TributeMenuEvents","menuClickEvent","click","menuContainerScrollEvent","debounce","windowResizeEvent","func","wait","immediate","timeout","_arguments","arguments","context","args","callNow","clearTimeout","apply","4","TributeRange","contentWindow","coordinates","getContentEditableCaretPosition","mentionPosition","getTextAreaOrInputUnderlinePosition","left","right","scrollIntoView","menuDimensions","width","offsetWidth","offsetHeight","menuIsOffScreen","isMenuOffScreen","menuIsOffScreenHorizontally","innerWidth","menuIsOffScreenVertically","innerHeight","targetElement","path","offset","childNodes","nextSibling","previousSibling","getWindowSelection","setStart","setEnd","error","replaceEvent","pasteHtml","myField","textSuffix","startPos","endPos","html","anchorNode","node","lastNode","frag","firstChild","cloneRange","setStartAfter","ctx","ce","getNodePositionInParent","reverse","startOffset","selectedElem","workingNodeContent","textContent","selectStartOffset","textComponent","wordsArray","split","trim","menuAlreadyActive","isAutocomplete","selectionInfo","getContentEditableSelectedPath","effectiveRange","getTextPrecedingCurrentSelection","lastWordOfEffectiveRange","getLastWordInText","mentionSelectedElement","mostRecentTriggerCharPos","idx","lastIndexWithLeadingSpace","lastIndexOf","test","currentTriggerSnippet","firstSnippetChar","leadingSpace","regex","str","_char","reversedStr","join","cidx","len","firstChar","windowWidth","windowHeight","doc","documentElement","windowLeft","pageXOffset","scrollLeft","clientLeft","windowTop","pageYOffset","clientTop","menuTop","menuRight","menuBottom","menuLeft","Math","floor","ceil","dimensions","position","flipped","isFirefox","mozInnerScreenX","div","id","computed","whiteSpace","wordWrap","visibility","prop","overflowY","overflow","span","rect","offsetTop","borderTopWidth","fontSize","offsetLeft","borderLeftWidth","getMenuDimensions","parentHeight","scrollStillAvailable","removeChild","selectedNodePosition","markerEl","markerId","Date","getTime","random","toString","substr","prevRange","clientRect","elemTop","elemBottom","maxY","targetY","5","TributeSearch","pattern","array","match","opts","compareString","caseSensitive","rendered","score","patternCache","traverse","render","cache","stringIndex","patternIndex","calculateScore","best","temp","pop","indices","reduce","prev","sort","b","compare","6","./Tribute","7","predicate","list","thisArg","params","bubbles","cancelable","evt","createEvent","initCustomEvent","Event"],"mappings":"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","file":"tribute.min.js","sourcesContent":["(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.Tribute = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _utils = _interopRequireDefault(require(\"./utils\"));\n\nvar _TributeEvents = _interopRequireDefault(require(\"./TributeEvents\"));\n\nvar _TributeMenuEvents = _interopRequireDefault(require(\"./TributeMenuEvents\"));\n\nvar _TributeRange = _interopRequireDefault(require(\"./TributeRange\"));\n\nvar _TributeSearch = _interopRequireDefault(require(\"./TributeSearch\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); }\n\nfunction _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nvar Tribute =\n/*#__PURE__*/\nfunction () {\n  function Tribute(_ref) {\n    var _this = this;\n\n    var _ref$values = _ref.values,\n        values = _ref$values === void 0 ? null : _ref$values,\n        _ref$iframe = _ref.iframe,\n        iframe = _ref$iframe === void 0 ? null : _ref$iframe,\n        _ref$selectClass = _ref.selectClass,\n        selectClass = _ref$selectClass === void 0 ? 'highlight' : _ref$selectClass,\n        _ref$trigger = _ref.trigger,\n        trigger = _ref$trigger === void 0 ? '@' : _ref$trigger,\n        _ref$autocompleteMode = _ref.autocompleteMode,\n        autocompleteMode = _ref$autocompleteMode === void 0 ? false : _ref$autocompleteMode,\n        _ref$selectTemplate = _ref.selectTemplate,\n        selectTemplate = _ref$selectTemplate === void 0 ? null : _ref$selectTemplate,\n        _ref$menuItemTemplate = _ref.menuItemTemplate,\n        menuItemTemplate = _ref$menuItemTemplate === void 0 ? null : _ref$menuItemTemplate,\n        _ref$lookup = _ref.lookup,\n        lookup = _ref$lookup === void 0 ? 'key' : _ref$lookup,\n        _ref$fillAttr = _ref.fillAttr,\n        fillAttr = _ref$fillAttr === void 0 ? 'value' : _ref$fillAttr,\n        _ref$collection = _ref.collection,\n        collection = _ref$collection === void 0 ? null : _ref$collection,\n        _ref$menuContainer = _ref.menuContainer,\n        menuContainer = _ref$menuContainer === void 0 ? null : _ref$menuContainer,\n        _ref$noMatchTemplate = _ref.noMatchTemplate,\n        noMatchTemplate = _ref$noMatchTemplate === void 0 ? null : _ref$noMatchTemplate,\n        _ref$requireLeadingSp = _ref.requireLeadingSpace,\n        requireLeadingSpace = _ref$requireLeadingSp === void 0 ? true : _ref$requireLeadingSp,\n        _ref$allowSpaces = _ref.allowSpaces,\n        allowSpaces = _ref$allowSpaces === void 0 ? false : _ref$allowSpaces,\n        _ref$replaceTextSuffi = _ref.replaceTextSuffix,\n        replaceTextSuffix = _ref$replaceTextSuffi === void 0 ? null : _ref$replaceTextSuffi,\n        _ref$positionMenu = _ref.positionMenu,\n        positionMenu = _ref$positionMenu === void 0 ? true : _ref$positionMenu,\n        _ref$spaceSelectsMatc = _ref.spaceSelectsMatch,\n        spaceSelectsMatch = _ref$spaceSelectsMatc === void 0 ? false : _ref$spaceSelectsMatc,\n        _ref$searchOpts = _ref.searchOpts,\n        searchOpts = _ref$searchOpts === void 0 ? {} : _ref$searchOpts,\n        _ref$menuItemLimit = _ref.menuItemLimit,\n        menuItemLimit = _ref$menuItemLimit === void 0 ? null : _ref$menuItemLimit;\n\n    _classCallCheck(this, Tribute);\n\n    this.autocompleteMode = autocompleteMode;\n    this.menuSelected = 0;\n    this.current = {};\n    this.inputEvent = false;\n    this.isActive = false;\n    this.menuContainer = menuContainer;\n    this.allowSpaces = allowSpaces;\n    this.replaceTextSuffix = replaceTextSuffix;\n    this.positionMenu = positionMenu;\n    this.hasTrailingSpace = false;\n    this.spaceSelectsMatch = spaceSelectsMatch;\n\n    if (this.autocompleteMode) {\n      trigger = '';\n      allowSpaces = false;\n    }\n\n    if (values) {\n      this.collection = [{\n        // symbol that starts the lookup\n        trigger: trigger,\n        // is it wrapped in an iframe\n        iframe: iframe,\n        // class applied to selected item\n        selectClass: selectClass,\n        // function called on select that retuns the content to insert\n        selectTemplate: (selectTemplate || Tribute.defaultSelectTemplate).bind(this),\n        // function called that returns content for an item\n        menuItemTemplate: (menuItemTemplate || Tribute.defaultMenuItemTemplate).bind(this),\n        // function called when menu is empty, disables hiding of menu.\n        noMatchTemplate: function (t) {\n          if (typeof t === 'function') {\n            return t.bind(_this);\n          }\n\n          return noMatchTemplate || function () {\n            return '';\n          }.bind(_this);\n        }(noMatchTemplate),\n        // column to search against in the object\n        lookup: lookup,\n        // column that contains the content to insert by default\n        fillAttr: fillAttr,\n        // array of objects or a function returning an array of objects\n        values: values,\n        requireLeadingSpace: requireLeadingSpace,\n        searchOpts: searchOpts,\n        menuItemLimit: menuItemLimit\n      }];\n    } else if (collection) {\n      if (this.autocompleteMode) console.warn('Tribute in autocomplete mode does not work for collections');\n      this.collection = collection.map(function (item) {\n        return {\n          trigger: item.trigger || trigger,\n          iframe: item.iframe || iframe,\n          selectClass: item.selectClass || selectClass,\n          selectTemplate: (item.selectTemplate || Tribute.defaultSelectTemplate).bind(_this),\n          menuItemTemplate: (item.menuItemTemplate || Tribute.defaultMenuItemTemplate).bind(_this),\n          // function called when menu is empty, disables hiding of menu.\n          noMatchTemplate: function (t) {\n            if (typeof t === 'function') {\n              return t.bind(_this);\n            }\n\n            return null;\n          }(noMatchTemplate),\n          lookup: item.lookup || lookup,\n          fillAttr: item.fillAttr || fillAttr,\n          values: item.values,\n          requireLeadingSpace: item.requireLeadingSpace,\n          searchOpts: item.searchOpts || searchOpts,\n          menuItemLimit: item.menuItemLimit || menuItemLimit\n        };\n      });\n    } else {\n      throw new Error('[Tribute] No collection specified.');\n    }\n\n    new _TributeRange[\"default\"](this);\n    new _TributeEvents[\"default\"](this);\n    new _TributeMenuEvents[\"default\"](this);\n    new _TributeSearch[\"default\"](this);\n  }\n\n  _createClass(Tribute, [{\n    key: \"triggers\",\n    value: function triggers() {\n      return this.collection.map(function (config) {\n        return config.trigger;\n      });\n    }\n  }, {\n    key: \"attach\",\n    value: function attach(el) {\n      if (!el) {\n        throw new Error('[Tribute] Must pass in a DOM node or NodeList.');\n      } // Check if it is a jQuery collection\n\n\n      if (typeof jQuery !== 'undefined' && el instanceof jQuery) {\n        el = el.get();\n      } // Is el an Array/Array-like object?\n\n\n      if (el.constructor === NodeList || el.constructor === HTMLCollection || el.constructor === Array) {\n        var length = el.length;\n\n        for (var i = 0; i < length; ++i) {\n          this._attach(el[i]);\n        }\n      } else {\n        this._attach(el);\n      }\n    }\n  }, {\n    key: \"_attach\",\n    value: function _attach(el) {\n      if (el.hasAttribute('data-tribute')) {\n        console.warn('Tribute was already bound to ' + el.nodeName);\n      }\n\n      this.ensureEditable(el);\n      this.events.bind(el);\n      el.setAttribute('data-tribute', true);\n    }\n  }, {\n    key: \"ensureEditable\",\n    value: function ensureEditable(element) {\n      if (Tribute.inputTypes().indexOf(element.nodeName) === -1) {\n        if (element.contentEditable) {\n          element.contentEditable = true;\n        } else {\n          throw new Error('[Tribute] Cannot bind to ' + element.nodeName);\n        }\n      }\n    }\n  }, {\n    key: \"createMenu\",\n    value: function createMenu() {\n      var wrapper = this.range.getDocument().createElement('div'),\n          ul = this.range.getDocument().createElement('ul');\n      wrapper.className = 'tribute-container';\n      wrapper.appendChild(ul);\n\n      if (this.menuContainer) {\n        return this.menuContainer.appendChild(wrapper);\n      }\n\n      return this.range.getDocument().body.appendChild(wrapper);\n    }\n  }, {\n    key: \"showMenuFor\",\n    value: function showMenuFor(element, scrollTo) {\n      var _this2 = this;\n\n      // Only proceed if menu isn't already shown for the current element & mentionText\n      if (this.isActive && this.current.element === element && this.current.mentionText === this.currentMentionTextSnapshot) {\n        return;\n      }\n\n      this.currentMentionTextSnapshot = this.current.mentionText; // create the menu if it doesn't exist.\n\n      if (!this.menu) {\n        this.menu = this.createMenu();\n        element.tributeMenu = this.menu;\n        this.menuEvents.bind(this.menu);\n      }\n\n      this.isActive = true;\n      this.menuSelected = 0;\n\n      if (!this.current.mentionText) {\n        this.current.mentionText = '';\n      }\n\n      var processValues = function processValues(values) {\n        // Tribute may not be active any more by the time the value callback returns\n        if (!_this2.isActive) {\n          return;\n        }\n\n        var items = _this2.search.filter(_this2.current.mentionText, values, {\n          pre: _this2.current.collection.searchOpts.pre || '<span>',\n          post: _this2.current.collection.searchOpts.post || '</span>',\n          skip: _this2.current.collection.searchOpts.skip,\n          extract: function extract(el) {\n            if (typeof _this2.current.collection.lookup === 'string') {\n              return el[_this2.current.collection.lookup];\n            } else if (typeof _this2.current.collection.lookup === 'function') {\n              return _this2.current.collection.lookup(el, _this2.current.mentionText);\n            } else {\n              throw new Error('Invalid lookup attribute, lookup must be string or function.');\n            }\n          }\n        });\n\n        _this2.current.filteredItems = items;\n\n        var ul = _this2.menu.querySelector('ul');\n\n        _this2.range.positionMenuAtCaret(scrollTo);\n\n        if (!items.length) {\n          var noMatchEvent = new CustomEvent('tribute-no-match', {\n            detail: _this2.menu\n          });\n\n          _this2.current.element.dispatchEvent(noMatchEvent);\n\n          if (typeof _this2.current.collection.noMatchTemplate === 'function' && !_this2.current.collection.noMatchTemplate() || !_this2.current.collection.noMatchTemplate) {\n            _this2.hideMenu();\n          } else {\n            typeof _this2.current.collection.noMatchTemplate === 'function' ? ul.innerHTML = _this2.current.collection.noMatchTemplate() : ul.innerHTML = _this2.current.collection.noMatchTemplate;\n          }\n\n          return;\n        }\n\n        if (_this2.current.collection.menuItemLimit) {\n          items = items.slice(0, _this2.current.collection.menuItemLimit);\n        }\n\n        ul.innerHTML = '';\n\n        var fragment = _this2.range.getDocument().createDocumentFragment();\n\n        items.forEach(function (item, index) {\n          var li = _this2.range.getDocument().createElement('li');\n\n          li.setAttribute('data-index', index);\n          li.addEventListener('mousemove', function (e) {\n            var _this2$_findLiTarget = _this2._findLiTarget(e.target),\n                _this2$_findLiTarget2 = _slicedToArray(_this2$_findLiTarget, 2),\n                li = _this2$_findLiTarget2[0],\n                index = _this2$_findLiTarget2[1];\n\n            if (e.movementY !== 0) {\n              _this2.events.setActiveLi(index);\n            }\n          });\n\n          if (_this2.menuSelected === index) {\n            li.className = _this2.current.collection.selectClass;\n          }\n\n          li.innerHTML = _this2.current.collection.menuItemTemplate(item);\n          fragment.appendChild(li);\n        });\n        ul.appendChild(fragment);\n      };\n\n      if (typeof this.current.collection.values === 'function') {\n        this.current.collection.values(this.current.mentionText, processValues);\n      } else {\n        processValues(this.current.collection.values);\n      }\n    }\n  }, {\n    key: \"_findLiTarget\",\n    value: function _findLiTarget(el) {\n      if (!el) return [];\n      var index = el.getAttribute('data-index');\n      return !index ? this._findLiTarget(el.parentNode) : [el, index];\n    }\n  }, {\n    key: \"showMenuForCollection\",\n    value: function showMenuForCollection(element, collectionIndex) {\n      if (element !== document.activeElement) {\n        this.placeCaretAtEnd(element);\n      }\n\n      this.current.collection = this.collection[collectionIndex || 0];\n      this.current.externalTrigger = true;\n      this.current.element = element;\n      if (element.isContentEditable) this.insertTextAtCursor(this.current.collection.trigger);else this.insertAtCaret(element, this.current.collection.trigger);\n      this.showMenuFor(element);\n    } // TODO: make sure this works for inputs/textareas\n\n  }, {\n    key: \"placeCaretAtEnd\",\n    value: function placeCaretAtEnd(el) {\n      el.focus();\n\n      if (typeof window.getSelection != \"undefined\" && typeof document.createRange != \"undefined\") {\n        var range = document.createRange();\n        range.selectNodeContents(el);\n        range.collapse(false);\n        var sel = window.getSelection();\n        sel.removeAllRanges();\n        sel.addRange(range);\n      } else if (typeof document.body.createTextRange != \"undefined\") {\n        var textRange = document.body.createTextRange();\n        textRange.moveToElementText(el);\n        textRange.collapse(false);\n        textRange.select();\n      }\n    } // for contenteditable\n\n  }, {\n    key: \"insertTextAtCursor\",\n    value: function insertTextAtCursor(text) {\n      var sel, range, html;\n      sel = window.getSelection();\n      range = sel.getRangeAt(0);\n      range.deleteContents();\n      var textNode = document.createTextNode(text);\n      range.insertNode(textNode);\n      range.selectNodeContents(textNode);\n      range.collapse(false);\n      sel.removeAllRanges();\n      sel.addRange(range);\n    } // for regular inputs\n\n  }, {\n    key: \"insertAtCaret\",\n    value: function insertAtCaret(textarea, text) {\n      var scrollPos = textarea.scrollTop;\n      var caretPos = textarea.selectionStart;\n      var front = textarea.value.substring(0, caretPos);\n      var back = textarea.value.substring(textarea.selectionEnd, textarea.value.length);\n      textarea.value = front + text + back;\n      caretPos = caretPos + text.length;\n      textarea.selectionStart = caretPos;\n      textarea.selectionEnd = caretPos;\n      textarea.focus();\n      textarea.scrollTop = scrollPos;\n    }\n  }, {\n    key: \"hideMenu\",\n    value: function hideMenu() {\n      if (this.menu) {\n        this.menu.style.cssText = 'display: none;';\n        this.isActive = false;\n        this.menuSelected = 0;\n        this.current = {};\n      }\n    }\n  }, {\n    key: \"selectItemAtIndex\",\n    value: function selectItemAtIndex(index, originalEvent) {\n      index = parseInt(index);\n      if (typeof index !== 'number' || isNaN(index)) return;\n      var item = this.current.filteredItems[index];\n      var content = this.current.collection.selectTemplate(item);\n      if (content !== null) this.replaceText(content, originalEvent, item);\n    }\n  }, {\n    key: \"replaceText\",\n    value: function replaceText(content, originalEvent, item) {\n      this.range.replaceTriggerText(content, true, true, originalEvent, item);\n    }\n  }, {\n    key: \"_append\",\n    value: function _append(collection, newValues, replace) {\n      if (typeof collection.values === 'function') {\n        throw new Error('Unable to append to values, as it is a function.');\n      } else if (!replace) {\n        collection.values = collection.values.concat(newValues);\n      } else {\n        collection.values = newValues;\n      }\n    }\n  }, {\n    key: \"append\",\n    value: function append(collectionIndex, newValues, replace) {\n      var index = parseInt(collectionIndex);\n      if (typeof index !== 'number') throw new Error('please provide an index for the collection to update.');\n      var collection = this.collection[index];\n\n      this._append(collection, newValues, replace);\n    }\n  }, {\n    key: \"appendCurrent\",\n    value: function appendCurrent(newValues, replace) {\n      if (this.isActive) {\n        this._append(this.current.collection, newValues, replace);\n      } else {\n        throw new Error('No active state. Please use append instead and pass an index.');\n      }\n    }\n  }, {\n    key: \"detach\",\n    value: function detach(el) {\n      if (!el) {\n        throw new Error('[Tribute] Must pass in a DOM node or NodeList.');\n      } // Check if it is a jQuery collection\n\n\n      if (typeof jQuery !== 'undefined' && el instanceof jQuery) {\n        el = el.get();\n      } // Is el an Array/Array-like object?\n\n\n      if (el.constructor === NodeList || el.constructor === HTMLCollection || el.constructor === Array) {\n        var length = el.length;\n\n        for (var i = 0; i < length; ++i) {\n          this._detach(el[i]);\n        }\n      } else {\n        this._detach(el);\n      }\n    }\n  }, {\n    key: \"_detach\",\n    value: function _detach(el) {\n      var _this3 = this;\n\n      this.events.unbind(el);\n\n      if (el.tributeMenu) {\n        this.menuEvents.unbind(el.tributeMenu);\n      }\n\n      setTimeout(function () {\n        el.removeAttribute('data-tribute');\n        _this3.isActive = false;\n\n        if (el.tributeMenu) {\n          el.tributeMenu.remove();\n        }\n      });\n    }\n  }], [{\n    key: \"defaultSelectTemplate\",\n    value: function defaultSelectTemplate(item) {\n      if (typeof item === 'undefined') return null;\n\n      if (this.range.isContentEditable(this.current.element)) {\n        return '<span class=\"tribute-mention\">' + (this.current.collection.trigger + item.original[this.current.collection.fillAttr]) + '</span>';\n      }\n\n      return this.current.collection.trigger + item.original[this.current.collection.fillAttr];\n    }\n  }, {\n    key: \"defaultMenuItemTemplate\",\n    value: function defaultMenuItemTemplate(matchItem) {\n      return matchItem.string;\n    }\n  }, {\n    key: \"inputTypes\",\n    value: function inputTypes() {\n      return ['TEXTAREA', 'INPUT'];\n    }\n  }]);\n\n  return Tribute;\n}();\n\nvar _default = Tribute;\nexports[\"default\"] = _default;\nmodule.exports = exports.default;\n\n},{\"./TributeEvents\":2,\"./TributeMenuEvents\":3,\"./TributeRange\":4,\"./TributeSearch\":5,\"./utils\":7}],2:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nvar TributeEvents =\n/*#__PURE__*/\nfunction () {\n  function TributeEvents(tribute) {\n    _classCallCheck(this, TributeEvents);\n\n    this.tribute = tribute;\n    this.tribute.events = this;\n  }\n\n  _createClass(TributeEvents, [{\n    key: \"bind\",\n    value: function bind(element) {\n      element.boundKeydown = this.keydown.bind(element, this);\n      element.boundKeyup = this.keyup.bind(element, this);\n      element.boundInput = this.input.bind(element, this);\n      element.addEventListener('keydown', element.boundKeydown, false);\n      element.addEventListener('keyup', element.boundKeyup, false);\n      element.addEventListener('input', element.boundInput, false);\n    }\n  }, {\n    key: \"unbind\",\n    value: function unbind(element) {\n      element.removeEventListener('keydown', element.boundKeydown, false);\n      element.removeEventListener('keyup', element.boundKeyup, false);\n      element.removeEventListener('input', element.boundInput, false);\n      delete element.boundKeydown;\n      delete element.boundKeyup;\n      delete element.boundInput;\n    }\n  }, {\n    key: \"keydown\",\n    value: function keydown(instance, event) {\n      if (instance.shouldDeactivate(event)) {\n        instance.tribute.isActive = false;\n        instance.tribute.hideMenu();\n      }\n\n      var element = this;\n      instance.commandEvent = false;\n      TributeEvents.keys().forEach(function (o) {\n        if (o.key === event.keyCode) {\n          instance.commandEvent = true;\n          instance.callbacks()[o.value.toLowerCase()](event, element);\n        }\n      });\n    }\n  }, {\n    key: \"input\",\n    value: function input(instance, event) {\n      instance.inputEvent = true;\n      instance.keyup.call(this, instance, event);\n    }\n  }, {\n    key: \"click\",\n    value: function click(instance, event) {\n      var tribute = instance.tribute;\n\n      if (tribute.menu && tribute.menu.contains(event.target)) {\n        var li = event.target;\n        event.preventDefault();\n        event.stopPropagation();\n\n        while (li.nodeName.toLowerCase() !== 'li') {\n          li = li.parentNode;\n\n          if (!li || li === tribute.menu) {\n            throw new Error('cannot find the <li> container for the click');\n          }\n        }\n\n        tribute.selectItemAtIndex(li.getAttribute('data-index'), event);\n        tribute.hideMenu(); // TODO: should fire with externalTrigger and target is outside of menu\n      } else if (tribute.current.element && !tribute.current.externalTrigger) {\n        tribute.current.externalTrigger = false;\n        setTimeout(function () {\n          return tribute.hideMenu();\n        });\n      }\n    }\n  }, {\n    key: \"keyup\",\n    value: function keyup(instance, event) {\n      if (instance.inputEvent) {\n        instance.inputEvent = false;\n      }\n\n      instance.updateSelection(this);\n      if (event.keyCode === 27) return;\n\n      if (!instance.tribute.allowSpaces && instance.tribute.hasTrailingSpace) {\n        instance.tribute.hasTrailingSpace = false;\n        instance.commandEvent = true;\n        instance.callbacks()[\"space\"](event, this);\n        return;\n      }\n\n      if (!instance.tribute.isActive) {\n        if (instance.tribute.autocompleteMode) {\n          instance.callbacks().triggerChar(event, this, '');\n        } else {\n          var keyCode = instance.getKeyCode(instance, this, event);\n          if (isNaN(keyCode) || !keyCode) return;\n          var trigger = instance.tribute.triggers().find(function (trigger) {\n            return trigger.charCodeAt(0) === keyCode;\n          });\n\n          if (typeof trigger !== 'undefined') {\n            instance.callbacks().triggerChar(event, this, trigger);\n          }\n        }\n      }\n\n      if ((instance.tribute.current.trigger || instance.tribute.autocompleteMode) && instance.commandEvent === false || instance.tribute.isActive && event.keyCode === 8) {\n        instance.tribute.showMenuFor(this, true);\n      }\n    }\n  }, {\n    key: \"shouldDeactivate\",\n    value: function shouldDeactivate(event) {\n      if (!this.tribute.isActive) return false;\n\n      if (this.tribute.current.mentionText.length === 0) {\n        var eventKeyPressed = false;\n        TributeEvents.keys().forEach(function (o) {\n          if (event.keyCode === o.key) eventKeyPressed = true;\n        });\n        return !eventKeyPressed;\n      }\n\n      return false;\n    }\n  }, {\n    key: \"getKeyCode\",\n    value: function getKeyCode(instance, el, event) {\n      var _char;\n\n      var tribute = instance.tribute;\n      var info = tribute.range.getTriggerInfo(false, tribute.hasTrailingSpace, true, tribute.allowSpaces, tribute.autocompleteMode);\n\n      if (info) {\n        return info.mentionTriggerChar.charCodeAt(0);\n      } else {\n        return false;\n      }\n    }\n  }, {\n    key: \"updateSelection\",\n    value: function updateSelection(el) {\n      this.tribute.current.element = el;\n      var info = this.tribute.range.getTriggerInfo(false, this.tribute.hasTrailingSpace, true, this.tribute.allowSpaces, this.tribute.autocompleteMode);\n\n      if (info) {\n        this.tribute.current.selectedPath = info.mentionSelectedPath;\n        this.tribute.current.mentionText = info.mentionText;\n        this.tribute.current.selectedOffset = info.mentionSelectedOffset;\n      }\n    }\n  }, {\n    key: \"callbacks\",\n    value: function callbacks() {\n      var _this = this;\n\n      return {\n        triggerChar: function triggerChar(e, el, trigger) {\n          var tribute = _this.tribute;\n          tribute.current.trigger = trigger;\n          var collectionItem = tribute.collection.find(function (item) {\n            return item.trigger === trigger;\n          });\n          tribute.current.collection = collectionItem;\n          if (tribute.inputEvent) tribute.showMenuFor(el, true);\n        },\n        enter: function enter(e, el) {\n          // choose selection\n          if (_this.tribute.isActive && _this.tribute.current.filteredItems) {\n            e.preventDefault();\n            e.stopPropagation();\n            setTimeout(function () {\n              _this.tribute.selectItemAtIndex(_this.tribute.menuSelected, e);\n\n              _this.tribute.hideMenu();\n            }, 0);\n          }\n        },\n        escape: function escape(e, el) {\n          if (_this.tribute.isActive) {\n            e.preventDefault();\n            e.stopPropagation();\n            _this.tribute.isActive = false;\n\n            _this.tribute.hideMenu();\n          }\n        },\n        tab: function tab(e, el) {\n          // choose first match\n          _this.callbacks().enter(e, el);\n        },\n        space: function space(e, el) {\n          if (_this.tribute.isActive) {\n            if (_this.tribute.spaceSelectsMatch) {\n              _this.callbacks().enter(e, el);\n            } else if (!_this.tribute.allowSpaces) {\n              e.stopPropagation();\n              setTimeout(function () {\n                _this.tribute.hideMenu();\n\n                _this.tribute.isActive = false;\n              }, 0);\n            }\n          }\n        },\n        up: function up(e, el) {\n          // navigate up ul\n          if (_this.tribute.isActive && _this.tribute.current.filteredItems) {\n            e.preventDefault();\n            e.stopPropagation();\n            var count = _this.tribute.current.filteredItems.length,\n                selected = _this.tribute.menuSelected;\n\n            if (count > selected && selected > 0) {\n              _this.tribute.menuSelected--;\n\n              _this.setActiveLi();\n            } else if (selected === 0) {\n              _this.tribute.menuSelected = count - 1;\n\n              _this.setActiveLi();\n\n              _this.tribute.menu.scrollTop = _this.tribute.menu.scrollHeight;\n            }\n          }\n        },\n        down: function down(e, el) {\n          // navigate down ul\n          if (_this.tribute.isActive && _this.tribute.current.filteredItems) {\n            e.preventDefault();\n            e.stopPropagation();\n            var count = _this.tribute.current.filteredItems.length - 1,\n                selected = _this.tribute.menuSelected;\n\n            if (count > selected) {\n              _this.tribute.menuSelected++;\n\n              _this.setActiveLi();\n            } else if (count === selected) {\n              _this.tribute.menuSelected = 0;\n\n              _this.setActiveLi();\n\n              _this.tribute.menu.scrollTop = 0;\n            }\n          }\n        },\n        \"delete\": function _delete(e, el) {\n          if (_this.tribute.isActive && _this.tribute.current.mentionText.length < 1) {\n            _this.tribute.hideMenu();\n          } else if (_this.tribute.isActive) {\n            _this.tribute.showMenuFor(el);\n          }\n        }\n      };\n    }\n  }, {\n    key: \"setActiveLi\",\n    value: function setActiveLi(index) {\n      var lis = this.tribute.menu.querySelectorAll('li'),\n          length = lis.length >>> 0;\n      if (index) this.tribute.menuSelected = parseInt(index);\n\n      for (var i = 0; i < length; i++) {\n        var li = lis[i];\n\n        if (i === this.tribute.menuSelected) {\n          li.classList.add(this.tribute.current.collection.selectClass);\n          var liClientRect = li.getBoundingClientRect();\n          var menuClientRect = this.tribute.menu.getBoundingClientRect();\n\n          if (liClientRect.bottom > menuClientRect.bottom) {\n            var scrollDistance = liClientRect.bottom - menuClientRect.bottom;\n            this.tribute.menu.scrollTop += scrollDistance;\n          } else if (liClientRect.top < menuClientRect.top) {\n            var _scrollDistance = menuClientRect.top - liClientRect.top;\n\n            this.tribute.menu.scrollTop -= _scrollDistance;\n          }\n        } else {\n          li.classList.remove(this.tribute.current.collection.selectClass);\n        }\n      }\n    }\n  }, {\n    key: \"getFullHeight\",\n    value: function getFullHeight(elem, includeMargin) {\n      var height = elem.getBoundingClientRect().height;\n\n      if (includeMargin) {\n        var style = elem.currentStyle || window.getComputedStyle(elem);\n        return height + parseFloat(style.marginTop) + parseFloat(style.marginBottom);\n      }\n\n      return height;\n    }\n  }], [{\n    key: \"keys\",\n    value: function keys() {\n      return [{\n        key: 9,\n        value: 'TAB'\n      }, {\n        key: 8,\n        value: 'DELETE'\n      }, {\n        key: 13,\n        value: 'ENTER'\n      }, {\n        key: 27,\n        value: 'ESCAPE'\n      }, {\n        key: 32,\n        value: 'SPACE'\n      }, {\n        key: 38,\n        value: 'UP'\n      }, {\n        key: 40,\n        value: 'DOWN'\n      }];\n    }\n  }]);\n\n  return TributeEvents;\n}();\n\nvar _default = TributeEvents;\nexports[\"default\"] = _default;\nmodule.exports = exports.default;\n\n},{}],3:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nvar TributeMenuEvents =\n/*#__PURE__*/\nfunction () {\n  function TributeMenuEvents(tribute) {\n    _classCallCheck(this, TributeMenuEvents);\n\n    this.tribute = tribute;\n    this.tribute.menuEvents = this;\n    this.menu = this.tribute.menu;\n  }\n\n  _createClass(TributeMenuEvents, [{\n    key: \"bind\",\n    value: function bind(menu) {\n      var _this = this;\n\n      this.menuClickEvent = this.tribute.events.click.bind(null, this);\n      this.menuContainerScrollEvent = this.debounce(function () {\n        if (_this.tribute.isActive) {\n          _this.tribute.showMenuFor(_this.tribute.current.element, false);\n        }\n      }, 300, false);\n      this.windowResizeEvent = this.debounce(function () {\n        if (_this.tribute.isActive) {\n          _this.tribute.range.positionMenuAtCaret(true);\n        }\n      }, 300, false); // fixes IE11 issues with mousedown\n\n      this.tribute.range.getDocument().addEventListener('MSPointerDown', this.menuClickEvent, false);\n      this.tribute.range.getDocument().addEventListener('mousedown', this.menuClickEvent, false);\n      window.addEventListener('resize', this.windowResizeEvent);\n\n      if (this.menuContainer) {\n        this.menuContainer.addEventListener('scroll', this.menuContainerScrollEvent, false);\n      } else {\n        window.addEventListener('scroll', this.menuContainerScrollEvent);\n      }\n    }\n  }, {\n    key: \"unbind\",\n    value: function unbind(menu) {\n      this.tribute.range.getDocument().removeEventListener('mousedown', this.menuClickEvent, false);\n      this.tribute.range.getDocument().removeEventListener('MSPointerDown', this.menuClickEvent, false);\n      window.removeEventListener('resize', this.windowResizeEvent);\n\n      if (this.menuContainer) {\n        this.menuContainer.removeEventListener('scroll', this.menuContainerScrollEvent, false);\n      } else {\n        window.removeEventListener('scroll', this.menuContainerScrollEvent);\n      }\n    }\n  }, {\n    key: \"debounce\",\n    value: function debounce(func, wait, immediate) {\n      var _this2 = this,\n          _arguments = arguments;\n\n      var timeout;\n      return function () {\n        var context = _this2,\n            args = _arguments;\n\n        var later = function later() {\n          timeout = null;\n          if (!immediate) func.apply(context, args);\n        };\n\n        var callNow = immediate && !timeout;\n        clearTimeout(timeout);\n        timeout = setTimeout(later, wait);\n        if (callNow) func.apply(context, args);\n      };\n    }\n  }]);\n\n  return TributeMenuEvents;\n}();\n\nvar _default = TributeMenuEvents;\nexports[\"default\"] = _default;\nmodule.exports = exports.default;\n\n},{}],4:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n// Thanks to https://github.com/jeff-collins/ment.io\nvar TributeRange =\n/*#__PURE__*/\nfunction () {\n  function TributeRange(tribute) {\n    _classCallCheck(this, TributeRange);\n\n    this.tribute = tribute;\n    this.tribute.range = this;\n  }\n\n  _createClass(TributeRange, [{\n    key: \"getDocument\",\n    value: function getDocument() {\n      var iframe;\n\n      if (this.tribute.current.collection) {\n        iframe = this.tribute.current.collection.iframe;\n      }\n\n      if (!iframe) {\n        return document;\n      }\n\n      return iframe.contentWindow.document;\n    }\n  }, {\n    key: \"positionMenuAtCaret\",\n    value: function positionMenuAtCaret(scrollTo) {\n      var _this = this;\n\n      var context = this.tribute.current,\n          coordinates;\n      var info = this.getTriggerInfo(false, this.tribute.hasTrailingSpace, true, this.tribute.allowSpaces, this.tribute.autocompleteMode);\n\n      if (typeof info !== 'undefined') {\n        if (!this.tribute.positionMenu) {\n          this.tribute.menu.style.cssText = \"display: block;\";\n          return;\n        }\n\n        if (!this.isContentEditable(context.element)) {\n          coordinates = this.getTextAreaOrInputUnderlinePosition(this.tribute.current.element, info.mentionPosition);\n        } else {\n          coordinates = this.getContentEditableCaretPosition(info.mentionPosition);\n        }\n\n        this.tribute.menu.style.cssText = \"top: \".concat(coordinates.top, \"px;\\n                                     left: \").concat(coordinates.left, \"px;\\n                                     right: \").concat(coordinates.right, \"px;\\n                                     bottom: \").concat(coordinates.bottom, \"px;\\n                                     position: absolute;\\n                                     z-index: 10000;\\n                                     display: block;\");\n\n        if (coordinates.left === 'auto') {\n          this.tribute.menu.style.left = 'auto';\n        }\n\n        if (coordinates.top === 'auto') {\n          this.tribute.menu.style.top = 'auto';\n        }\n\n        if (scrollTo) this.scrollIntoView();\n        window.setTimeout(function () {\n          var menuDimensions = {\n            width: _this.tribute.menu.offsetWidth,\n            height: _this.tribute.menu.offsetHeight\n          };\n\n          var menuIsOffScreen = _this.isMenuOffScreen(coordinates, menuDimensions);\n\n          var menuIsOffScreenHorizontally = window.innerWidth > menuDimensions.width && (menuIsOffScreen.left || menuIsOffScreen.right);\n          var menuIsOffScreenVertically = window.innerHeight > menuDimensions.height && (menuIsOffScreen.top || menuIsOffScreen.bottom);\n\n          if (menuIsOffScreenHorizontally || menuIsOffScreenVertically) {\n            _this.tribute.menu.style.cssText = 'display: none';\n\n            _this.positionMenuAtCaret(scrollTo);\n          }\n        }, 0);\n      } else {\n        this.tribute.menu.style.cssText = 'display: none';\n      }\n    }\n  }, {\n    key: \"selectElement\",\n    value: function selectElement(targetElement, path, offset) {\n      var range;\n      var elem = targetElement;\n\n      if (path) {\n        for (var i = 0; i < path.length; i++) {\n          elem = elem.childNodes[path[i]];\n\n          if (elem === undefined) {\n            return;\n          }\n\n          while (elem.length < offset) {\n            offset -= elem.length;\n            elem = elem.nextSibling;\n          }\n\n          if (elem.childNodes.length === 0 && !elem.length) {\n            elem = elem.previousSibling;\n          }\n        }\n      }\n\n      var sel = this.getWindowSelection();\n      range = this.getDocument().createRange();\n      range.setStart(elem, offset);\n      range.setEnd(elem, offset);\n      range.collapse(true);\n\n      try {\n        sel.removeAllRanges();\n      } catch (error) {}\n\n      sel.addRange(range);\n      targetElement.focus();\n    }\n  }, {\n    key: \"replaceTriggerText\",\n    value: function replaceTriggerText(text, requireLeadingSpace, hasTrailingSpace, originalEvent, item) {\n      var info = this.getTriggerInfo(true, hasTrailingSpace, requireLeadingSpace, this.tribute.allowSpaces, this.tribute.autocompleteMode);\n\n      if (info !== undefined) {\n        var context = this.tribute.current;\n        var replaceEvent = new CustomEvent('tribute-replaced', {\n          detail: {\n            item: item,\n            instance: context,\n            context: info,\n            event: originalEvent\n          }\n        });\n\n        if (!this.isContentEditable(context.element)) {\n          var myField = this.tribute.current.element;\n          var textSuffix = typeof this.tribute.replaceTextSuffix == 'string' ? this.tribute.replaceTextSuffix : ' ';\n          text += textSuffix;\n          var startPos = info.mentionPosition;\n          var endPos = info.mentionPosition + info.mentionText.length + textSuffix.length;\n          myField.value = myField.value.substring(0, startPos) + text + myField.value.substring(endPos, myField.value.length);\n          myField.selectionStart = startPos + text.length;\n          myField.selectionEnd = startPos + text.length;\n        } else {\n          // add a space to the end of the pasted text\n          var _textSuffix = typeof this.tribute.replaceTextSuffix == 'string' ? this.tribute.replaceTextSuffix : '\\xA0';\n\n          text += _textSuffix;\n          this.pasteHtml(text, info.mentionPosition, info.mentionPosition + info.mentionText.length + !this.tribute.autocompleteMode);\n        }\n\n        context.element.dispatchEvent(replaceEvent);\n      }\n    }\n  }, {\n    key: \"pasteHtml\",\n    value: function pasteHtml(html, startPos, endPos) {\n      var range, sel;\n      sel = this.getWindowSelection();\n      range = this.getDocument().createRange();\n      range.setStart(sel.anchorNode, startPos);\n      range.setEnd(sel.anchorNode, endPos);\n      range.deleteContents();\n      var el = this.getDocument().createElement('div');\n      el.innerHTML = html;\n      var frag = this.getDocument().createDocumentFragment(),\n          node,\n          lastNode;\n\n      while (node = el.firstChild) {\n        lastNode = frag.appendChild(node);\n      }\n\n      range.insertNode(frag); // Preserve the selection\n\n      if (lastNode) {\n        range = range.cloneRange();\n        range.setStartAfter(lastNode);\n        range.collapse(true);\n        sel.removeAllRanges();\n        sel.addRange(range);\n      }\n    }\n  }, {\n    key: \"getWindowSelection\",\n    value: function getWindowSelection() {\n      if (this.tribute.collection.iframe) {\n        return this.tribute.collection.iframe.contentWindow.getSelection();\n      }\n\n      return window.getSelection();\n    }\n  }, {\n    key: \"getNodePositionInParent\",\n    value: function getNodePositionInParent(element) {\n      if (element.parentNode === null) {\n        return 0;\n      }\n\n      for (var i = 0; i < element.parentNode.childNodes.length; i++) {\n        var node = element.parentNode.childNodes[i];\n\n        if (node === element) {\n          return i;\n        }\n      }\n    }\n  }, {\n    key: \"getContentEditableSelectedPath\",\n    value: function getContentEditableSelectedPath(ctx) {\n      var sel = this.getWindowSelection();\n      var selected = sel.anchorNode;\n      var path = [];\n      var offset;\n\n      if (selected != null) {\n        var i;\n        var ce = selected.contentEditable;\n\n        while (selected !== null && ce !== 'true') {\n          i = this.getNodePositionInParent(selected);\n          path.push(i);\n          selected = selected.parentNode;\n\n          if (selected !== null) {\n            ce = selected.contentEditable;\n          }\n        }\n\n        path.reverse(); // getRangeAt may not exist, need alternative\n\n        offset = sel.getRangeAt(0).startOffset;\n        return {\n          selected: selected,\n          path: path,\n          offset: offset\n        };\n      }\n    }\n  }, {\n    key: \"getTextPrecedingCurrentSelection\",\n    value: function getTextPrecedingCurrentSelection() {\n      var context = this.tribute.current,\n          text = '';\n\n      if (!this.isContentEditable(context.element)) {\n        var textComponent = this.tribute.current.element;\n\n        if (textComponent) {\n          var startPos = textComponent.selectionStart;\n\n          if (textComponent.value && startPos >= 0) {\n            text = textComponent.value.substring(0, startPos);\n          }\n        }\n      } else {\n        var selectedElem = this.getWindowSelection().anchorNode;\n\n        if (selectedElem != null) {\n          var workingNodeContent = selectedElem.textContent;\n          var selectStartOffset = this.getWindowSelection().getRangeAt(0).startOffset;\n\n          if (workingNodeContent && selectStartOffset >= 0) {\n            text = workingNodeContent.substring(0, selectStartOffset);\n          }\n        }\n      }\n\n      return text;\n    }\n  }, {\n    key: \"getLastWordInText\",\n    value: function getLastWordInText(text) {\n      text = text.replace(/\\u00A0/g, ' '); // https://stackoverflow.com/questions/29850407/how-do-i-replace-unicode-character-u00a0-with-a-space-in-javascript\n\n      var wordsArray = text.split(' ');\n      var worldsCount = wordsArray.length - 1;\n      return wordsArray[worldsCount].trim();\n    }\n  }, {\n    key: \"getTriggerInfo\",\n    value: function getTriggerInfo(menuAlreadyActive, hasTrailingSpace, requireLeadingSpace, allowSpaces, isAutocomplete) {\n      var _this2 = this;\n\n      var ctx = this.tribute.current;\n      var selected, path, offset;\n\n      if (!this.isContentEditable(ctx.element)) {\n        selected = this.tribute.current.element;\n      } else {\n        var selectionInfo = this.getContentEditableSelectedPath(ctx);\n\n        if (selectionInfo) {\n          selected = selectionInfo.selected;\n          path = selectionInfo.path;\n          offset = selectionInfo.offset;\n        }\n      }\n\n      var effectiveRange = this.getTextPrecedingCurrentSelection();\n      var lastWordOfEffectiveRange = this.getLastWordInText(effectiveRange);\n\n      if (isAutocomplete) {\n        return {\n          mentionPosition: effectiveRange.length - lastWordOfEffectiveRange.length,\n          mentionText: lastWordOfEffectiveRange,\n          mentionSelectedElement: selected,\n          mentionSelectedPath: path,\n          mentionSelectedOffset: offset\n        };\n      }\n\n      if (effectiveRange !== undefined && effectiveRange !== null) {\n        var mostRecentTriggerCharPos = -1;\n        var triggerChar;\n        this.tribute.collection.forEach(function (config) {\n          var c = config.trigger;\n          var idx = config.requireLeadingSpace ? _this2.lastIndexWithLeadingSpace(effectiveRange, c) : effectiveRange.lastIndexOf(c);\n\n          if (idx > mostRecentTriggerCharPos) {\n            mostRecentTriggerCharPos = idx;\n            triggerChar = c;\n            requireLeadingSpace = config.requireLeadingSpace;\n          }\n        });\n\n        if (mostRecentTriggerCharPos >= 0 && (mostRecentTriggerCharPos === 0 || !requireLeadingSpace || /[\\xA0\\s]/g.test(effectiveRange.substring(mostRecentTriggerCharPos - 1, mostRecentTriggerCharPos)))) {\n          var currentTriggerSnippet = effectiveRange.substring(mostRecentTriggerCharPos + 1, effectiveRange.length);\n          triggerChar = effectiveRange.substring(mostRecentTriggerCharPos, mostRecentTriggerCharPos + 1);\n          var firstSnippetChar = currentTriggerSnippet.substring(0, 1);\n          var leadingSpace = currentTriggerSnippet.length > 0 && (firstSnippetChar === ' ' || firstSnippetChar === '\\xA0');\n\n          if (hasTrailingSpace) {\n            currentTriggerSnippet = currentTriggerSnippet.trim();\n          }\n\n          var regex = allowSpaces ? /[^\\S ]/g : /[\\xA0\\s]/g;\n          this.tribute.hasTrailingSpace = regex.test(currentTriggerSnippet);\n\n          if (!leadingSpace && (menuAlreadyActive || !regex.test(currentTriggerSnippet))) {\n            return {\n              mentionPosition: mostRecentTriggerCharPos,\n              mentionText: currentTriggerSnippet,\n              mentionSelectedElement: selected,\n              mentionSelectedPath: path,\n              mentionSelectedOffset: offset,\n              mentionTriggerChar: triggerChar\n            };\n          }\n        }\n      }\n    }\n  }, {\n    key: \"lastIndexWithLeadingSpace\",\n    value: function lastIndexWithLeadingSpace(str, _char) {\n      var reversedStr = str.split('').reverse().join('');\n      var index = -1;\n\n      for (var cidx = 0, len = str.length; cidx < len; cidx++) {\n        var firstChar = cidx === str.length - 1;\n        var leadingSpace = /\\s/.test(reversedStr[cidx + 1]);\n        var match = _char === reversedStr[cidx];\n\n        if (match && (firstChar || leadingSpace)) {\n          index = str.length - 1 - cidx;\n          break;\n        }\n      }\n\n      return index;\n    }\n  }, {\n    key: \"isContentEditable\",\n    value: function isContentEditable(element) {\n      return element.nodeName !== 'INPUT' && element.nodeName !== 'TEXTAREA';\n    }\n  }, {\n    key: \"isMenuOffScreen\",\n    value: function isMenuOffScreen(coordinates, menuDimensions) {\n      var windowWidth = window.innerWidth;\n      var windowHeight = window.innerHeight;\n      var doc = document.documentElement;\n      var windowLeft = (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0);\n      var windowTop = (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0);\n      var menuTop = typeof coordinates.top === 'number' ? coordinates.top : windowTop + windowHeight - coordinates.bottom - menuDimensions.height;\n      var menuRight = typeof coordinates.right === 'number' ? coordinates.right : coordinates.left + menuDimensions.width;\n      var menuBottom = typeof coordinates.bottom === 'number' ? coordinates.bottom : coordinates.top + menuDimensions.height;\n      var menuLeft = typeof coordinates.left === 'number' ? coordinates.left : windowLeft + windowWidth - coordinates.right - menuDimensions.width;\n      return {\n        top: menuTop < Math.floor(windowTop),\n        right: menuRight > Math.ceil(windowLeft + windowWidth),\n        bottom: menuBottom > Math.ceil(windowTop + windowHeight),\n        left: menuLeft < Math.floor(windowLeft)\n      };\n    }\n  }, {\n    key: \"getMenuDimensions\",\n    value: function getMenuDimensions() {\n      // Width of the menu depends of its contents and position\n      // We must check what its width would be without any obstruction\n      // This way, we can achieve good positioning for flipping the menu\n      var dimensions = {\n        width: null,\n        height: null\n      };\n      this.tribute.menu.style.cssText = \"top: 0px;\\n                                 left: 0px;\\n                                 position: fixed;\\n                                 zIndex: 10000;\\n                                 display: block;\\n                                 visibility; hidden;\";\n      dimensions.width = this.tribute.menu.offsetWidth;\n      dimensions.height = this.tribute.menu.offsetHeight;\n      this.tribute.menu.style.cssText = \"display: none;\";\n      return dimensions;\n    }\n  }, {\n    key: \"getTextAreaOrInputUnderlinePosition\",\n    value: function getTextAreaOrInputUnderlinePosition(element, position, flipped) {\n      var properties = ['direction', 'boxSizing', 'width', 'height', 'overflowX', 'overflowY', 'borderTopWidth', 'borderRightWidth', 'borderBottomWidth', 'borderLeftWidth', 'paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft', 'fontStyle', 'fontVariant', 'fontWeight', 'fontStretch', 'fontSize', 'fontSizeAdjust', 'lineHeight', 'fontFamily', 'textAlign', 'textTransform', 'textIndent', 'textDecoration', 'letterSpacing', 'wordSpacing'];\n      var isFirefox = window.mozInnerScreenX !== null;\n      var div = this.getDocument().createElement('div');\n      div.id = 'input-textarea-caret-position-mirror-div';\n      this.getDocument().body.appendChild(div);\n      var style = div.style;\n      var computed = window.getComputedStyle ? getComputedStyle(element) : element.currentStyle;\n      style.whiteSpace = 'pre-wrap';\n\n      if (element.nodeName !== 'INPUT') {\n        style.wordWrap = 'break-word';\n      } // position off-screen\n\n\n      style.position = 'absolute';\n      style.visibility = 'hidden'; // transfer the element's properties to the div\n\n      properties.forEach(function (prop) {\n        style[prop] = computed[prop];\n      });\n\n      if (isFirefox) {\n        style.width = \"\".concat(parseInt(computed.width) - 2, \"px\");\n        if (element.scrollHeight > parseInt(computed.height)) style.overflowY = 'scroll';\n      } else {\n        style.overflow = 'hidden';\n      }\n\n      div.textContent = element.value.substring(0, position);\n\n      if (element.nodeName === 'INPUT') {\n        div.textContent = div.textContent.replace(/\\s/g, ' ');\n      }\n\n      var span = this.getDocument().createElement('span');\n      span.textContent = element.value.substring(position) || '.';\n      div.appendChild(span);\n      var rect = element.getBoundingClientRect();\n      var doc = document.documentElement;\n      var windowLeft = (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0);\n      var windowTop = (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0);\n      var coordinates = {\n        top: rect.top + windowTop + span.offsetTop + parseInt(computed.borderTopWidth) + parseInt(computed.fontSize) - element.scrollTop,\n        left: rect.left + windowLeft + span.offsetLeft + parseInt(computed.borderLeftWidth)\n      };\n      var windowWidth = window.innerWidth;\n      var windowHeight = window.innerHeight;\n      var menuDimensions = this.getMenuDimensions();\n      var menuIsOffScreen = this.isMenuOffScreen(coordinates, menuDimensions);\n\n      if (menuIsOffScreen.right) {\n        coordinates.right = windowWidth - coordinates.left;\n        coordinates.left = 'auto';\n      }\n\n      var parentHeight = this.tribute.menuContainer ? this.tribute.menuContainer.offsetHeight : this.getDocument().body.offsetHeight;\n\n      if (menuIsOffScreen.bottom) {\n        var parentRect = this.tribute.menuContainer ? this.tribute.menuContainer.getBoundingClientRect() : this.getDocument().body.getBoundingClientRect();\n        var scrollStillAvailable = parentHeight - (windowHeight - parentRect.top);\n        coordinates.bottom = scrollStillAvailable + (windowHeight - rect.top - span.offsetTop);\n        coordinates.top = 'auto';\n      }\n\n      menuIsOffScreen = this.isMenuOffScreen(coordinates, menuDimensions);\n\n      if (menuIsOffScreen.left) {\n        coordinates.left = windowWidth > menuDimensions.width ? windowLeft + windowWidth - menuDimensions.width : windowLeft;\n        delete coordinates.right;\n      }\n\n      if (menuIsOffScreen.top) {\n        coordinates.top = windowHeight > menuDimensions.height ? windowTop + windowHeight - menuDimensions.height : windowTop;\n        delete coordinates.bottom;\n      }\n\n      this.getDocument().body.removeChild(div);\n      return coordinates;\n    }\n  }, {\n    key: \"getContentEditableCaretPosition\",\n    value: function getContentEditableCaretPosition(selectedNodePosition) {\n      var markerTextChar = '';\n      var markerEl,\n          markerId = \"sel_\".concat(new Date().getTime(), \"_\").concat(Math.random().toString().substr(2));\n      var range;\n      var sel = this.getWindowSelection();\n      var prevRange = sel.getRangeAt(0);\n      range = this.getDocument().createRange();\n      range.setStart(sel.anchorNode, selectedNodePosition);\n      range.setEnd(sel.anchorNode, selectedNodePosition);\n      range.collapse(false); // Create the marker element containing a single invisible character using DOM methods and insert it\n\n      markerEl = this.getDocument().createElement('span');\n      markerEl.id = markerId;\n      markerEl.appendChild(this.getDocument().createTextNode(markerTextChar));\n      range.insertNode(markerEl);\n      sel.removeAllRanges();\n      sel.addRange(prevRange);\n      var rect = markerEl.getBoundingClientRect();\n      var doc = document.documentElement;\n      var windowLeft = (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0);\n      var windowTop = (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0);\n      var coordinates = {\n        left: rect.left + windowLeft,\n        top: rect.top + markerEl.offsetHeight + windowTop\n      };\n      var windowWidth = window.innerWidth;\n      var windowHeight = window.innerHeight;\n      var menuDimensions = this.getMenuDimensions();\n      var menuIsOffScreen = this.isMenuOffScreen(coordinates, menuDimensions);\n\n      if (menuIsOffScreen.right) {\n        coordinates.left = 'auto';\n        coordinates.right = windowWidth - rect.left - windowLeft;\n      }\n\n      var parentHeight = this.tribute.menuContainer ? this.tribute.menuContainer.offsetHeight : this.getDocument().body.offsetHeight;\n\n      if (menuIsOffScreen.bottom) {\n        var parentRect = this.tribute.menuContainer ? this.tribute.menuContainer.getBoundingClientRect() : this.getDocument().body.getBoundingClientRect();\n        var scrollStillAvailable = parentHeight - (windowHeight - parentRect.top);\n        coordinates.top = 'auto';\n        coordinates.bottom = scrollStillAvailable + (windowHeight - rect.top);\n      }\n\n      menuIsOffScreen = this.isMenuOffScreen(coordinates, menuDimensions);\n\n      if (menuIsOffScreen.left) {\n        coordinates.left = windowWidth > menuDimensions.width ? windowLeft + windowWidth - menuDimensions.width : windowLeft;\n        delete coordinates.right;\n      }\n\n      if (menuIsOffScreen.top) {\n        coordinates.top = windowHeight > menuDimensions.height ? windowTop + windowHeight - menuDimensions.height : windowTop;\n        delete coordinates.bottom;\n      }\n\n      markerEl.parentNode.removeChild(markerEl);\n      return coordinates;\n    }\n  }, {\n    key: \"scrollIntoView\",\n    value: function scrollIntoView(elem) {\n      var reasonableBuffer = 20,\n          clientRect;\n      var maxScrollDisplacement = 100;\n      var e = this.menu;\n      if (typeof e === 'undefined') return;\n\n      while (clientRect === undefined || clientRect.height === 0) {\n        clientRect = e.getBoundingClientRect();\n\n        if (clientRect.height === 0) {\n          e = e.childNodes[0];\n\n          if (e === undefined || !e.getBoundingClientRect) {\n            return;\n          }\n        }\n      }\n\n      var elemTop = clientRect.top;\n      var elemBottom = elemTop + clientRect.height;\n\n      if (elemTop < 0) {\n        window.scrollTo(0, window.pageYOffset + clientRect.top - reasonableBuffer);\n      } else if (elemBottom > window.innerHeight) {\n        var maxY = window.pageYOffset + clientRect.top - reasonableBuffer;\n\n        if (maxY - window.pageYOffset > maxScrollDisplacement) {\n          maxY = window.pageYOffset + maxScrollDisplacement;\n        }\n\n        var targetY = window.pageYOffset - (window.innerHeight - elemBottom);\n\n        if (targetY > maxY) {\n          targetY = maxY;\n        }\n\n        window.scrollTo(0, targetY);\n      }\n    }\n  }]);\n\n  return TributeRange;\n}();\n\nvar _default = TributeRange;\nexports[\"default\"] = _default;\nmodule.exports = exports.default;\n\n},{}],5:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n// Thanks to https://github.com/mattyork/fuzzy\nvar TributeSearch =\n/*#__PURE__*/\nfunction () {\n  function TributeSearch(tribute) {\n    _classCallCheck(this, TributeSearch);\n\n    this.tribute = tribute;\n    this.tribute.search = this;\n  }\n\n  _createClass(TributeSearch, [{\n    key: \"simpleFilter\",\n    value: function simpleFilter(pattern, array) {\n      var _this = this;\n\n      return array.filter(function (string) {\n        return _this.test(pattern, string);\n      });\n    }\n  }, {\n    key: \"test\",\n    value: function test(pattern, string) {\n      return this.match(pattern, string) !== null;\n    }\n  }, {\n    key: \"match\",\n    value: function match(pattern, string, opts) {\n      opts = opts || {};\n      var patternIdx = 0,\n          result = [],\n          len = string.length,\n          totalScore = 0,\n          currScore = 0,\n          pre = opts.pre || '',\n          post = opts.post || '',\n          compareString = opts.caseSensitive && string || string.toLowerCase(),\n          ch,\n          compareChar;\n\n      if (opts.skip) {\n        return {\n          rendered: string,\n          score: 0\n        };\n      }\n\n      pattern = opts.caseSensitive && pattern || pattern.toLowerCase();\n      var patternCache = this.traverse(compareString, pattern, 0, 0, []);\n\n      if (!patternCache) {\n        return null;\n      }\n\n      return {\n        rendered: this.render(string, patternCache.cache, pre, post),\n        score: patternCache.score\n      };\n    }\n  }, {\n    key: \"traverse\",\n    value: function traverse(string, pattern, stringIndex, patternIndex, patternCache) {\n      // if the pattern search at end\n      if (pattern.length === patternIndex) {\n        // calculate score and copy the cache containing the indices where it's found\n        return {\n          score: this.calculateScore(patternCache),\n          cache: patternCache.slice()\n        };\n      } // if string at end or remaining pattern > remaining string\n\n\n      if (string.length === stringIndex || pattern.length - patternIndex > string.length - stringIndex) {\n        return undefined;\n      }\n\n      var c = pattern[patternIndex];\n      var index = string.indexOf(c, stringIndex);\n      var best, temp;\n\n      while (index > -1) {\n        patternCache.push(index);\n        temp = this.traverse(string, pattern, index + 1, patternIndex + 1, patternCache);\n        patternCache.pop(); // if downstream traversal failed, return best answer so far\n\n        if (!temp) {\n          return best;\n        }\n\n        if (!best || best.score < temp.score) {\n          best = temp;\n        }\n\n        index = string.indexOf(c, index + 1);\n      }\n\n      return best;\n    }\n  }, {\n    key: \"calculateScore\",\n    value: function calculateScore(patternCache) {\n      var score = 0;\n      var temp = 1;\n      patternCache.forEach(function (index, i) {\n        if (i > 0) {\n          if (patternCache[i - 1] + 1 === index) {\n            temp += temp + 1;\n          } else {\n            temp = 1;\n          }\n        }\n\n        score += temp;\n      });\n      return score;\n    }\n  }, {\n    key: \"render\",\n    value: function render(string, indices, pre, post) {\n      var rendered = string.substring(0, indices[0]);\n      indices.forEach(function (index, i) {\n        rendered += pre + string[index] + post + string.substring(index + 1, indices[i + 1] ? indices[i + 1] : string.length);\n      });\n      return rendered;\n    }\n  }, {\n    key: \"filter\",\n    value: function filter(pattern, arr, opts) {\n      var _this2 = this;\n\n      opts = opts || {};\n      return arr.reduce(function (prev, element, idx, arr) {\n        var str = element;\n\n        if (opts.extract) {\n          str = opts.extract(element);\n\n          if (!str) {\n            // take care of undefineds / nulls / etc.\n            str = '';\n          }\n        }\n\n        var rendered = _this2.match(pattern, str, opts);\n\n        if (rendered != null) {\n          prev[prev.length] = {\n            string: rendered.rendered,\n            score: rendered.score,\n            index: idx,\n            original: element\n          };\n        }\n\n        return prev;\n      }, []).sort(function (a, b) {\n        var compare = b.score - a.score;\n        if (compare) return compare;\n        return a.index - b.index;\n      });\n    }\n  }]);\n\n  return TributeSearch;\n}();\n\nvar _default = TributeSearch;\nexports[\"default\"] = _default;\nmodule.exports = exports.default;\n\n},{}],6:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _Tribute = _interopRequireDefault(require(\"./Tribute\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/**\n* Tribute.js\n* Native ES6 JavaScript @mention Plugin\n**/\nvar _default = _Tribute[\"default\"];\nexports[\"default\"] = _default;\nmodule.exports = exports.default;\n\n},{\"./Tribute\":1}],7:[function(require,module,exports){\n\"use strict\";\n\nif (!Array.prototype.find) {\n  Array.prototype.find = function (predicate) {\n    if (this === null) {\n      throw new TypeError('Array.prototype.find called on null or undefined');\n    }\n\n    if (typeof predicate !== 'function') {\n      throw new TypeError('predicate must be a function');\n    }\n\n    var list = Object(this);\n    var length = list.length >>> 0;\n    var thisArg = arguments[1];\n    var value;\n\n    for (var i = 0; i < length; i++) {\n      value = list[i];\n\n      if (predicate.call(thisArg, value, i, list)) {\n        return value;\n      }\n    }\n\n    return undefined;\n  };\n}\n\nif (window && typeof window.CustomEvent !== \"function\") {\n  var CustomEvent = function CustomEvent(event, params) {\n    params = params || {\n      bubbles: false,\n      cancelable: false,\n      detail: undefined\n    };\n    var evt = document.createEvent('CustomEvent');\n    evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n    return evt;\n  };\n\n  if (typeof window.Event !== 'undefined') {\n    CustomEvent.prototype = window.Event.prototype;\n  }\n\n  window.CustomEvent = CustomEvent;\n}\n\n},{}]},{},[6])(6)\n});\n//# sourceMappingURL=tribute.js.map\n"]}
\ No newline at end of file
+{"version":3,"file":"tribute.min.js","sources":["../src/utils.js","../src/TributeEvents.js","../src/TributeMenuEvents.js","../src/TributeRange.js","../src/TributeSearch.js","../src/Tribute.js"],"sourcesContent":["if (!Array.prototype.find) {\n    Array.prototype.find = function(predicate) {\n        if (this === null) {\n            throw new TypeError('Array.prototype.find called on null or undefined')\n        }\n        if (typeof predicate !== 'function') {\n            throw new TypeError('predicate must be a function')\n        }\n        var list = Object(this)\n        var length = list.length >>> 0\n        var thisArg = arguments[1]\n        var value\n\n        for (var i = 0; i < length; i++) {\n            value = list[i]\n            if (predicate.call(thisArg, value, i, list)) {\n                return value\n            }\n        }\n        return undefined\n    }\n}\n\nif (window && typeof window.CustomEvent !== \"function\") {\n  function CustomEvent(event, params) {\n    params = params || {\n      bubbles: false,\n      cancelable: false,\n      detail: undefined\n    }\n    var evt = document.createEvent('CustomEvent')\n    evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail)\n    return evt\n  }\n\n if (typeof window.Event !== 'undefined') {\n   CustomEvent.prototype = window.Event.prototype\n }\n\n  window.CustomEvent = CustomEvent\n}","class TributeEvents {\n  constructor(tribute) {\n    this.tribute = tribute;\n    this.tribute.events = this;\n  }\n\n  static keys() {\n    return [\n      {\n        key: 9,\n        value: \"TAB\"\n      },\n      {\n        key: 8,\n        value: \"DELETE\"\n      },\n      {\n        key: 13,\n        value: \"ENTER\"\n      },\n      {\n        key: 27,\n        value: \"ESCAPE\"\n      },\n      {\n        key: 32,\n        value: \"SPACE\"\n      },\n      {\n        key: 38,\n        value: \"UP\"\n      },\n      {\n        key: 40,\n        value: \"DOWN\"\n      }\n    ];\n  }\n\n  bind(element) {\n    element.boundKeydown = this.keydown.bind(element, this);\n    element.boundKeyup = this.keyup.bind(element, this);\n    element.boundInput = this.input.bind(element, this);\n\n    element.addEventListener(\"keydown\", element.boundKeydown, false);\n    element.addEventListener(\"keyup\", element.boundKeyup, false);\n    element.addEventListener(\"input\", element.boundInput, false);\n  }\n\n  unbind(element) {\n    element.removeEventListener(\"keydown\", element.boundKeydown, false);\n    element.removeEventListener(\"keyup\", element.boundKeyup, false);\n    element.removeEventListener(\"input\", element.boundInput, false);\n\n    delete element.boundKeydown;\n    delete element.boundKeyup;\n    delete element.boundInput;\n  }\n\n  keydown(instance, event) {\n    if (instance.shouldDeactivate(event)) {\n      instance.tribute.isActive = false;\n      instance.tribute.hideMenu();\n    }\n\n    let element = this;\n    instance.commandEvent = false;\n\n    TributeEvents.keys().forEach(o => {\n      if (o.key === event.keyCode) {\n        instance.commandEvent = true;\n        instance.callbacks()[o.value.toLowerCase()](event, element);\n      }\n    });\n  }\n\n  input(instance, event) {\n    instance.inputEvent = true;\n    instance.keyup.call(this, instance, event);\n  }\n\n  click(instance, event) {\n    let tribute = instance.tribute;\n    if (tribute.menu && tribute.menu.contains(event.target)) {\n      let li = event.target;\n      event.preventDefault();\n      event.stopPropagation();\n      while (li.nodeName.toLowerCase() !== \"li\") {\n        li = li.parentNode;\n        if (!li || li === tribute.menu) {\n          throw new Error(\"cannot find the <li> container for the click\");\n        }\n      }\n      tribute.selectItemAtIndex(li.getAttribute(\"data-index\"), event);\n      tribute.hideMenu();\n\n      // TODO: should fire with externalTrigger and target is outside of menu\n    } else if (tribute.current.element && !tribute.current.externalTrigger) {\n      tribute.current.externalTrigger = false;\n      setTimeout(() => tribute.hideMenu());\n    }\n  }\n\n  keyup(instance, event) {\n    if (instance.inputEvent) {\n      instance.inputEvent = false;\n    }\n    instance.updateSelection(this);\n\n    if (event.keyCode === 27) return;\n\n    if (!instance.tribute.allowSpaces && instance.tribute.hasTrailingSpace) {\n      instance.tribute.hasTrailingSpace = false;\n      instance.commandEvent = true;\n      instance.callbacks()[\"space\"](event, this);\n      return;\n    }\n\n    if (!instance.tribute.isActive) {\n      if (instance.tribute.autocompleteMode) {\n        instance.callbacks().triggerChar(event, this, \"\");\n      } else {\n        let keyCode = instance.getKeyCode(instance, this, event);\n\n        if (isNaN(keyCode) || !keyCode) return;\n\n        let trigger = instance.tribute.triggers().find(trigger => {\n          return trigger.charCodeAt(0) === keyCode;\n        });\n\n        if (typeof trigger !== \"undefined\") {\n          instance.callbacks().triggerChar(event, this, trigger);\n        }\n      }\n    }\n\n    if (\n      instance.tribute.current.mentionText.length <\n      instance.tribute.current.collection.menuShowMinLength\n    ) {\n      return;\n    }\n\n    if (\n      ((instance.tribute.current.trigger ||\n        instance.tribute.autocompleteMode) &&\n        instance.commandEvent === false) ||\n      (instance.tribute.isActive && event.keyCode === 8)\n    ) {\n      instance.tribute.showMenuFor(this, true);\n    }\n  }\n\n  shouldDeactivate(event) {\n    if (!this.tribute.isActive) return false;\n\n    if (this.tribute.current.mentionText.length === 0) {\n      let eventKeyPressed = false;\n      TributeEvents.keys().forEach(o => {\n        if (event.keyCode === o.key) eventKeyPressed = true;\n      });\n\n      return !eventKeyPressed;\n    }\n\n    return false;\n  }\n\n  getKeyCode(instance, el, event) {\n    let char;\n    let tribute = instance.tribute;\n    let info = tribute.range.getTriggerInfo(\n      false,\n      tribute.hasTrailingSpace,\n      true,\n      tribute.allowSpaces,\n      tribute.autocompleteMode\n    );\n\n    if (info) {\n      return info.mentionTriggerChar.charCodeAt(0);\n    } else {\n      return false;\n    }\n  }\n\n  updateSelection(el) {\n    this.tribute.current.element = el;\n    let info = this.tribute.range.getTriggerInfo(\n      false,\n      this.tribute.hasTrailingSpace,\n      true,\n      this.tribute.allowSpaces,\n      this.tribute.autocompleteMode\n    );\n\n    if (info) {\n      this.tribute.current.selectedPath = info.mentionSelectedPath;\n      this.tribute.current.mentionText = info.mentionText;\n      this.tribute.current.selectedOffset = info.mentionSelectedOffset;\n    }\n  }\n\n  callbacks() {\n    return {\n      triggerChar: (e, el, trigger) => {\n        let tribute = this.tribute;\n        tribute.current.trigger = trigger;\n\n        let collectionItem = tribute.collection.find(item => {\n          return item.trigger === trigger;\n        });\n\n        tribute.current.collection = collectionItem;\n\n        if (\n          tribute.current.mentionText.length >=\n            tribute.current.collection.menuShowMinLength &&\n          tribute.inputEvent\n        ) {\n          tribute.showMenuFor(el, true);\n        }\n      },\n      enter: (e, el) => {\n        // choose selection\n        if (this.tribute.isActive && this.tribute.current.filteredItems) {\n          e.preventDefault();\n          e.stopPropagation();\n          setTimeout(() => {\n            this.tribute.selectItemAtIndex(this.tribute.menuSelected, e);\n            this.tribute.hideMenu();\n          }, 0);\n        }\n      },\n      escape: (e, el) => {\n        if (this.tribute.isActive) {\n          e.preventDefault();\n          e.stopPropagation();\n          this.tribute.isActive = false;\n          this.tribute.hideMenu();\n        }\n      },\n      tab: (e, el) => {\n        // choose first match\n        this.callbacks().enter(e, el);\n      },\n      space: (e, el) => {\n        if (this.tribute.isActive) {\n          if (this.tribute.spaceSelectsMatch) {\n            this.callbacks().enter(e, el);\n          } else if (!this.tribute.allowSpaces) {\n            e.stopPropagation();\n            setTimeout(() => {\n              this.tribute.hideMenu();\n              this.tribute.isActive = false;\n            }, 0);\n          }\n        }\n      },\n      up: (e, el) => {\n        // navigate up ul\n        if (this.tribute.isActive && this.tribute.current.filteredItems) {\n          e.preventDefault();\n          e.stopPropagation();\n          let count = this.tribute.current.filteredItems.length,\n            selected = this.tribute.menuSelected;\n\n          if (count > selected && selected > 0) {\n            this.tribute.menuSelected--;\n            this.setActiveLi();\n          } else if (selected === 0) {\n            this.tribute.menuSelected = count - 1;\n            this.setActiveLi();\n            this.tribute.menu.scrollTop = this.tribute.menu.scrollHeight;\n          }\n        }\n      },\n      down: (e, el) => {\n        // navigate down ul\n        if (this.tribute.isActive && this.tribute.current.filteredItems) {\n          e.preventDefault();\n          e.stopPropagation();\n          let count = this.tribute.current.filteredItems.length - 1,\n            selected = this.tribute.menuSelected;\n\n          if (count > selected) {\n            this.tribute.menuSelected++;\n            this.setActiveLi();\n          } else if (count === selected) {\n            this.tribute.menuSelected = 0;\n            this.setActiveLi();\n            this.tribute.menu.scrollTop = 0;\n          }\n        }\n      },\n      delete: (e, el) => {\n        if (\n          this.tribute.isActive &&\n          this.tribute.current.mentionText.length < 1\n        ) {\n          this.tribute.hideMenu();\n        } else if (this.tribute.isActive) {\n          this.tribute.showMenuFor(el);\n        }\n      }\n    };\n  }\n\n  setActiveLi(index) {\n    let lis = this.tribute.menu.querySelectorAll(\"li\"),\n      length = lis.length >>> 0;\n\n    if (index) this.tribute.menuSelected = parseInt(index);\n\n    for (let i = 0; i < length; i++) {\n      let li = lis[i];\n      if (i === this.tribute.menuSelected) {\n        li.classList.add(this.tribute.current.collection.selectClass);\n\n        let liClientRect = li.getBoundingClientRect();\n        let menuClientRect = this.tribute.menu.getBoundingClientRect();\n\n        if (liClientRect.bottom > menuClientRect.bottom) {\n          let scrollDistance = liClientRect.bottom - menuClientRect.bottom;\n          this.tribute.menu.scrollTop += scrollDistance;\n        } else if (liClientRect.top < menuClientRect.top) {\n          let scrollDistance = menuClientRect.top - liClientRect.top;\n          this.tribute.menu.scrollTop -= scrollDistance;\n        }\n      } else {\n        li.classList.remove(this.tribute.current.collection.selectClass);\n      }\n    }\n  }\n\n  getFullHeight(elem, includeMargin) {\n    let height = elem.getBoundingClientRect().height;\n\n    if (includeMargin) {\n      let style = elem.currentStyle || window.getComputedStyle(elem);\n      return (\n        height + parseFloat(style.marginTop) + parseFloat(style.marginBottom)\n      );\n    }\n\n    return height;\n  }\n}\n\nexport default TributeEvents;\n","class TributeMenuEvents {\n  constructor(tribute) {\n    this.tribute = tribute;\n    this.tribute.menuEvents = this;\n    this.menu = this.tribute.menu;\n  }\n\n  bind(menu) {\n    this.menuClickEvent = this.tribute.events.click.bind(null, this);\n    this.menuContainerScrollEvent = this.debounce(\n      () => {\n        if (this.tribute.isActive) {\n          this.tribute.showMenuFor(this.tribute.current.element, false);\n        }\n      },\n      300,\n      false\n    );\n    this.windowResizeEvent = this.debounce(\n      () => {\n        if (this.tribute.isActive) {\n          this.tribute.range.positionMenuAtCaret(true);\n        }\n      },\n      300,\n      false\n    );\n\n    // fixes IE11 issues with mousedown\n    this.tribute.range\n      .getDocument()\n      .addEventListener(\"MSPointerDown\", this.menuClickEvent, false);\n    this.tribute.range\n      .getDocument()\n      .addEventListener(\"mousedown\", this.menuClickEvent, false);\n    window.addEventListener(\"resize\", this.windowResizeEvent);\n\n    if (this.menuContainer) {\n      this.menuContainer.addEventListener(\n        \"scroll\",\n        this.menuContainerScrollEvent,\n        false\n      );\n    } else {\n      window.addEventListener(\"scroll\", this.menuContainerScrollEvent);\n    }\n  }\n\n  unbind(menu) {\n    this.tribute.range\n      .getDocument()\n      .removeEventListener(\"mousedown\", this.menuClickEvent, false);\n    this.tribute.range\n      .getDocument()\n      .removeEventListener(\"MSPointerDown\", this.menuClickEvent, false);\n    window.removeEventListener(\"resize\", this.windowResizeEvent);\n\n    if (this.menuContainer) {\n      this.menuContainer.removeEventListener(\n        \"scroll\",\n        this.menuContainerScrollEvent,\n        false\n      );\n    } else {\n      window.removeEventListener(\"scroll\", this.menuContainerScrollEvent);\n    }\n  }\n\n  debounce(func, wait, immediate) {\n    var timeout;\n    return () => {\n      var context = this,\n        args = arguments;\n      var later = () => {\n        timeout = null;\n        if (!immediate) func.apply(context, args);\n      };\n      var callNow = immediate && !timeout;\n      clearTimeout(timeout);\n      timeout = setTimeout(later, wait);\n      if (callNow) func.apply(context, args);\n    };\n  }\n}\n\nexport default TributeMenuEvents;\n","// Thanks to https://github.com/jeff-collins/ment.io\nimport \"./utils\";\n\nclass TributeRange {\n    constructor(tribute) {\n        this.tribute = tribute\n        this.tribute.range = this\n    }\n\n    getDocument() {\n        let iframe\n        if (this.tribute.current.collection) {\n            iframe = this.tribute.current.collection.iframe\n        }\n\n        if (!iframe) {\n            return document\n        }\n\n        return iframe.contentWindow.document\n    }\n\n    positionMenuAtCaret(scrollTo) {\n        let context = this.tribute.current,\n            coordinates\n\n        let info = this.getTriggerInfo(false, this.tribute.hasTrailingSpace, true, this.tribute.allowSpaces, this.tribute.autocompleteMode)\n\n        if (typeof info !== 'undefined') {\n\n            if(!this.tribute.positionMenu){\n                this.tribute.menu.style.cssText = `display: block;`\n                return\n            }\n\n            if (!this.isContentEditable(context.element)) {\n                coordinates = this.getTextAreaOrInputUnderlinePosition(this.tribute.current.element,\n                    info.mentionPosition)\n            }\n            else {\n                coordinates = this.getContentEditableCaretPosition(info.mentionPosition)\n            }\n\n            this.tribute.menu.style.cssText = `top: ${coordinates.top}px;\n                                     left: ${coordinates.left}px;\n                                     right: ${coordinates.right}px;\n                                     bottom: ${coordinates.bottom}px;\n                                     position: absolute;\n                                     display: block;`\n\n            if (coordinates.left === 'auto') {\n                this.tribute.menu.style.left = 'auto'\n            }\n\n            if (coordinates.top === 'auto') {\n                this.tribute.menu.style.top = 'auto'\n            }\n\n            if (scrollTo) this.scrollIntoView()\n\n            window.setTimeout(() => {\n                let menuDimensions = {\n                   width: this.tribute.menu.offsetWidth,\n                   height: this.tribute.menu.offsetHeight\n                }\n                let menuIsOffScreen = this.isMenuOffScreen(coordinates, menuDimensions)\n\n                let menuIsOffScreenHorizontally = window.innerWidth > menuDimensions.width && (menuIsOffScreen.left || menuIsOffScreen.right)\n                let menuIsOffScreenVertically = window.innerHeight > menuDimensions.height && (menuIsOffScreen.top || menuIsOffScreen.bottom)\n                if (menuIsOffScreenHorizontally || menuIsOffScreenVertically) {\n                    this.tribute.menu.style.cssText = 'display: none'\n                    this.positionMenuAtCaret(scrollTo)\n                }\n            }, 0)\n\n        } else {\n            this.tribute.menu.style.cssText = 'display: none'\n        }\n    }\n\n    get menuContainerIsBody() {\n        return this.tribute.menuContainer === document.body || !this.tribute.menuContainer;\n    }\n\n\n    selectElement(targetElement, path, offset) {\n        let range\n        let elem = targetElement\n\n        if (path) {\n            for (var i = 0; i < path.length; i++) {\n                elem = elem.childNodes[path[i]]\n                if (elem === undefined) {\n                    return\n                }\n                while (elem.length < offset) {\n                    offset -= elem.length\n                    elem = elem.nextSibling\n                }\n                if (elem.childNodes.length === 0 && !elem.length) {\n                    elem = elem.previousSibling\n                }\n            }\n        }\n        let sel = this.getWindowSelection()\n\n        range = this.getDocument().createRange()\n        range.setStart(elem, offset)\n        range.setEnd(elem, offset)\n        range.collapse(true)\n\n        try {\n            sel.removeAllRanges()\n        } catch (error) {}\n\n        sel.addRange(range)\n        targetElement.focus()\n    }\n\n    replaceTriggerText(text, requireLeadingSpace, hasTrailingSpace, originalEvent, item) {\n        let info = this.getTriggerInfo(true, hasTrailingSpace, requireLeadingSpace, this.tribute.allowSpaces, this.tribute.autocompleteMode)\n\n        if (info !== undefined) {\n            let context = this.tribute.current\n            let replaceEvent = new CustomEvent('tribute-replaced', {\n                detail: {\n                    item: item,\n                    instance: context,\n                    context: info,\n                    event: originalEvent,\n                }\n            })\n\n            if (!this.isContentEditable(context.element)) {\n                let myField = this.tribute.current.element\n                let textSuffix = typeof this.tribute.replaceTextSuffix == 'string'\n                    ? this.tribute.replaceTextSuffix\n                    : ' '\n                text += textSuffix\n                let startPos = info.mentionPosition\n                let endPos = info.mentionPosition + info.mentionText.length + textSuffix.length\n                if (!this.tribute.autocompleteMode) {\n                    endPos += info.mentionTriggerChar.length - 1\n                }\n                myField.value = myField.value.substring(0, startPos) + text +\n                    myField.value.substring(endPos, myField.value.length)\n                myField.selectionStart = startPos + text.length\n                myField.selectionEnd = startPos + text.length\n            } else {\n                // add a space to the end of the pasted text\n                let textSuffix = typeof this.tribute.replaceTextSuffix == 'string'\n                    ? this.tribute.replaceTextSuffix\n                    : '\\xA0'\n                text += textSuffix\n                let endPos = info.mentionPosition + info.mentionText.length\n                if (!this.tribute.autocompleteMode) {\n                    endPos += info.mentionTriggerChar.length\n                }\n                this.pasteHtml(text, info.mentionPosition, endPos)\n            }\n\n            context.element.dispatchEvent(new CustomEvent('input', { bubbles: true }))\n            context.element.dispatchEvent(replaceEvent)\n        }\n    }\n\n    pasteHtml(html, startPos, endPos) {\n        let range, sel\n        sel = this.getWindowSelection()\n        range = this.getDocument().createRange()\n        range.setStart(sel.anchorNode, startPos)\n        range.setEnd(sel.anchorNode, endPos)\n        range.deleteContents()\n\n        let el = this.getDocument().createElement('div')\n        el.innerHTML = html\n        let frag = this.getDocument().createDocumentFragment(),\n            node, lastNode\n        while ((node = el.firstChild)) {\n            lastNode = frag.appendChild(node)\n        }\n        range.insertNode(frag)\n\n        // Preserve the selection\n        if (lastNode) {\n            range = range.cloneRange()\n            range.setStartAfter(lastNode)\n            range.collapse(true)\n            sel.removeAllRanges()\n            sel.addRange(range)\n        }\n    }\n\n    getWindowSelection() {\n        if (this.tribute.collection.iframe) {\n            return this.tribute.collection.iframe.contentWindow.getSelection()\n        }\n\n        return window.getSelection()\n    }\n\n    getNodePositionInParent(element) {\n        if (element.parentNode === null) {\n            return 0\n        }\n\n        for (var i = 0; i < element.parentNode.childNodes.length; i++) {\n            let node = element.parentNode.childNodes[i]\n\n            if (node === element) {\n                return i\n            }\n        }\n    }\n\n    getContentEditableSelectedPath(ctx) {\n        let sel = this.getWindowSelection()\n        let selected = sel.anchorNode\n        let path = []\n        let offset\n\n        if (selected != null) {\n            let i\n            let ce = selected.contentEditable\n            while (selected !== null && ce !== 'true') {\n                i = this.getNodePositionInParent(selected)\n                path.push(i)\n                selected = selected.parentNode\n                if (selected !== null) {\n                    ce = selected.contentEditable\n                }\n            }\n            path.reverse()\n\n            // getRangeAt may not exist, need alternative\n            offset = sel.getRangeAt(0).startOffset\n\n            return {\n                selected: selected,\n                path: path,\n                offset: offset\n            }\n        }\n    }\n\n    getTextPrecedingCurrentSelection() {\n        let context = this.tribute.current,\n            text = ''\n\n        if (!this.isContentEditable(context.element)) {\n            let textComponent = this.tribute.current.element;\n            if (textComponent) {\n                let startPos = textComponent.selectionStart\n                if (textComponent.value && startPos >= 0) {\n                    text = textComponent.value.substring(0, startPos)\n                }\n            }\n\n        } else {\n            let selectedElem = this.getWindowSelection().anchorNode\n\n            if (selectedElem != null) {\n                let workingNodeContent = selectedElem.textContent\n                let selectStartOffset = this.getWindowSelection().getRangeAt(0).startOffset\n\n                if (workingNodeContent && selectStartOffset >= 0) {\n                    text = workingNodeContent.substring(0, selectStartOffset)\n                }\n            }\n        }\n\n        return text\n    }\n\n    getLastWordInText(text) {\n        text = text.replace(/\\u00A0/g, ' '); // https://stackoverflow.com/questions/29850407/how-do-i-replace-unicode-character-u00a0-with-a-space-in-javascript\n        var wordsArray;\n        if (this.tribute.autocompleteSeparator) {\n            wordsArray = text.split(this.tribute.autocompleteSeparator);\n        } else {\n            wordsArray = text.split(/\\s+/);\n        }\n        var worldsCount = wordsArray.length - 1;\n        return wordsArray[worldsCount].trim();\n    }\n\n    getTriggerInfo(menuAlreadyActive, hasTrailingSpace, requireLeadingSpace, allowSpaces, isAutocomplete) {\n        let ctx = this.tribute.current\n        let selected, path, offset\n\n        if (!this.isContentEditable(ctx.element)) {\n            selected = this.tribute.current.element\n        } else {\n            let selectionInfo = this.getContentEditableSelectedPath(ctx)\n\n            if (selectionInfo) {\n                selected = selectionInfo.selected\n                path = selectionInfo.path\n                offset = selectionInfo.offset\n            }\n        }\n\n        let effectiveRange = this.getTextPrecedingCurrentSelection()\n        let lastWordOfEffectiveRange = this.getLastWordInText(effectiveRange)\n\n        if (isAutocomplete) {\n            return {\n                mentionPosition: effectiveRange.length - lastWordOfEffectiveRange.length,\n                mentionText: lastWordOfEffectiveRange,\n                mentionSelectedElement: selected,\n                mentionSelectedPath: path,\n                mentionSelectedOffset: offset\n            }\n        }\n\n        if (effectiveRange !== undefined && effectiveRange !== null) {\n            let mostRecentTriggerCharPos = -1\n            let triggerChar\n\n            this.tribute.collection.forEach(config => {\n                let c = config.trigger\n                let idx = config.requireLeadingSpace ?\n                    this.lastIndexWithLeadingSpace(effectiveRange, c) :\n                    effectiveRange.lastIndexOf(c)\n\n                if (idx > mostRecentTriggerCharPos) {\n                    mostRecentTriggerCharPos = idx\n                    triggerChar = c\n                    requireLeadingSpace = config.requireLeadingSpace\n                }\n            })\n\n            if (mostRecentTriggerCharPos >= 0 &&\n                (\n                    mostRecentTriggerCharPos === 0 ||\n                    !requireLeadingSpace ||\n                    /[\\xA0\\s]/g.test(\n                        effectiveRange.substring(\n                            mostRecentTriggerCharPos - 1,\n                            mostRecentTriggerCharPos)\n                    )\n                )\n            ) {\n                let currentTriggerSnippet = effectiveRange.substring(mostRecentTriggerCharPos + triggerChar.length,\n                    effectiveRange.length)\n\n                triggerChar = effectiveRange.substring(mostRecentTriggerCharPos, mostRecentTriggerCharPos + triggerChar.length)\n                let firstSnippetChar = currentTriggerSnippet.substring(0, 1)\n                let leadingSpace = currentTriggerSnippet.length > 0 &&\n                    (\n                        firstSnippetChar === ' ' ||\n                        firstSnippetChar === '\\xA0'\n                    )\n                if (hasTrailingSpace) {\n                    currentTriggerSnippet = currentTriggerSnippet.trim()\n                }\n\n                let regex = allowSpaces ? /[^\\S ]/g : /[\\xA0\\s]/g;\n\n                this.tribute.hasTrailingSpace = regex.test(currentTriggerSnippet);\n\n                if (!leadingSpace && (menuAlreadyActive || !(regex.test(currentTriggerSnippet)))) {\n                    return {\n                        mentionPosition: mostRecentTriggerCharPos,\n                        mentionText: currentTriggerSnippet,\n                        mentionSelectedElement: selected,\n                        mentionSelectedPath: path,\n                        mentionSelectedOffset: offset,\n                        mentionTriggerChar: triggerChar\n                    }\n                }\n            }\n        }\n    }\n\n    lastIndexWithLeadingSpace (str, trigger) {\n        let reversedStr = str.split('').reverse().join('')\n        let index = -1\n\n        for (let cidx = 0, len = str.length; cidx < len; cidx++) {\n            let firstChar = cidx === str.length - 1\n            let leadingSpace = /\\s/.test(reversedStr[cidx + 1])\n\n            let match = true\n            for (let triggerIdx = trigger.length - 1; triggerIdx >= 0; triggerIdx--) {\n              if (trigger[triggerIdx] !== reversedStr[cidx-triggerIdx]) {\n                match = false\n                break\n              }\n            }\n\n            if (match && (firstChar || leadingSpace)) {\n                index = str.length - 1 - cidx\n                break\n            }\n        }\n\n        return index\n    }\n\n    isContentEditable(element) {\n        return element.nodeName !== 'INPUT' && element.nodeName !== 'TEXTAREA'\n    }\n\n    isMenuOffScreen(coordinates, menuDimensions) {\n        let windowWidth = window.innerWidth\n        let windowHeight = window.innerHeight\n        let doc = document.documentElement\n        let windowLeft = (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0)\n        let windowTop = (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0)\n\n        let menuTop = typeof coordinates.top === 'number' ? coordinates.top : windowTop + windowHeight - coordinates.bottom - menuDimensions.height\n        let menuRight = typeof coordinates.right === 'number' ? coordinates.right : coordinates.left + menuDimensions.width\n        let menuBottom = typeof coordinates.bottom === 'number' ? coordinates.bottom : coordinates.top + menuDimensions.height\n        let menuLeft = typeof coordinates.left === 'number' ? coordinates.left : windowLeft + windowWidth - coordinates.right - menuDimensions.width\n\n        return {\n            top: menuTop < Math.floor(windowTop),\n            right: menuRight > Math.ceil(windowLeft + windowWidth),\n            bottom: menuBottom > Math.ceil(windowTop + windowHeight),\n            left: menuLeft < Math.floor(windowLeft)\n        }\n    }\n\n    getMenuDimensions() {\n        // Width of the menu depends of its contents and position\n        // We must check what its width would be without any obstruction\n        // This way, we can achieve good positioning for flipping the menu\n        let dimensions = {\n            width: null,\n            height: null\n        }\n\n        this.tribute.menu.style.cssText = `top: 0px;\n                                 left: 0px;\n                                 position: fixed;\n                                 display: block;\n                                 visibility; hidden;`\n       dimensions.width = this.tribute.menu.offsetWidth\n       dimensions.height = this.tribute.menu.offsetHeight\n\n       this.tribute.menu.style.cssText = `display: none;`\n\n       return dimensions\n    }\n\n    getTextAreaOrInputUnderlinePosition(element, position, flipped) {\n        let properties = ['direction', 'boxSizing', 'width', 'height', 'overflowX',\n            'overflowY', 'borderTopWidth', 'borderRightWidth',\n            'borderBottomWidth', 'borderLeftWidth', 'paddingTop',\n            'paddingRight', 'paddingBottom', 'paddingLeft',\n            'fontStyle', 'fontVariant', 'fontWeight', 'fontStretch',\n            'fontSize', 'fontSizeAdjust', 'lineHeight', 'fontFamily',\n            'textAlign', 'textTransform', 'textIndent',\n            'textDecoration', 'letterSpacing', 'wordSpacing'\n        ]\n\n        let isFirefox = (window.mozInnerScreenX !== null)\n\n        let div = this.getDocument().createElement('div')\n        div.id = 'input-textarea-caret-position-mirror-div'\n        this.getDocument().body.appendChild(div)\n\n        let style = div.style\n        let computed = window.getComputedStyle ? getComputedStyle(element) : element.currentStyle\n\n        style.whiteSpace = 'pre-wrap'\n        if (element.nodeName !== 'INPUT') {\n            style.wordWrap = 'break-word'\n        }\n\n        // position off-screen\n        style.position = 'absolute'\n        style.visibility = 'hidden'\n\n        // transfer the element's properties to the div\n        properties.forEach(prop => {\n            style[prop] = computed[prop]\n        })\n\n        if (isFirefox) {\n            style.width = `${(parseInt(computed.width) - 2)}px`\n            if (element.scrollHeight > parseInt(computed.height))\n                style.overflowY = 'scroll'\n        } else {\n            style.overflow = 'hidden'\n        }\n\n        div.textContent = element.value.substring(0, position)\n\n        if (element.nodeName === 'INPUT') {\n            div.textContent = div.textContent.replace(/\\s/g, ' ')\n        }\n\n        let span = this.getDocument().createElement('span')\n        span.textContent = element.value.substring(position) || '.'\n        div.appendChild(span)\n\n        let rect = element.getBoundingClientRect()\n        let doc = document.documentElement\n        let windowLeft = (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0)\n        let windowTop = (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0)\n\n        let top = 0;\n        let left = 0;\n        if (this.menuContainerIsBody) {\n          top = rect.top;\n          left = rect.left;\n        }\n\n        let coordinates = {\n            top: top + windowTop + span.offsetTop + parseInt(computed.borderTopWidth) + parseInt(computed.fontSize) - element.scrollTop,\n            left: left + windowLeft + span.offsetLeft + parseInt(computed.borderLeftWidth)\n        }\n\n        let windowWidth = window.innerWidth\n        let windowHeight = window.innerHeight\n\n        let menuDimensions = this.getMenuDimensions()\n        let menuIsOffScreen = this.isMenuOffScreen(coordinates, menuDimensions)\n\n        if (menuIsOffScreen.right) {\n            coordinates.right = windowWidth - coordinates.left\n            coordinates.left = 'auto'\n        }\n\n        let parentHeight = this.tribute.menuContainer\n            ? this.tribute.menuContainer.offsetHeight\n            : this.getDocument().body.offsetHeight\n\n        if (menuIsOffScreen.bottom) {\n            let parentRect = this.tribute.menuContainer\n                ? this.tribute.menuContainer.getBoundingClientRect()\n                : this.getDocument().body.getBoundingClientRect()\n            let scrollStillAvailable = parentHeight - (windowHeight - parentRect.top)\n\n            coordinates.bottom = scrollStillAvailable + (windowHeight - rect.top - span.offsetTop)\n            coordinates.top = 'auto'\n        }\n\n        menuIsOffScreen = this.isMenuOffScreen(coordinates, menuDimensions)\n        if (menuIsOffScreen.left) {\n            coordinates.left = windowWidth > menuDimensions.width\n                ? windowLeft + windowWidth - menuDimensions.width\n                : windowLeft\n            delete coordinates.right\n        }\n        if (menuIsOffScreen.top) {\n            coordinates.top = windowHeight > menuDimensions.height\n                ? windowTop + windowHeight - menuDimensions.height\n                : windowTop\n            delete coordinates.bottom\n        }\n\n        this.getDocument().body.removeChild(div)\n        return coordinates\n    }\n\n    getContentEditableCaretPosition(selectedNodePosition) {\n        let range\n        let sel = this.getWindowSelection()\n\n        range = this.getDocument().createRange()\n        range.setStart(sel.anchorNode, selectedNodePosition)\n        range.setEnd(sel.anchorNode, selectedNodePosition)\n\n        range.collapse(false)\n\n        let rect = range.getBoundingClientRect()\n        let doc = document.documentElement\n        let windowLeft = (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0)\n        let windowTop = (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0)\n\n        let left = rect.left\n        let top = rect.top\n\n        let coordinates = {\n            left: left + windowLeft,\n            top: top + rect.height + windowTop\n        }\n        let windowWidth = window.innerWidth\n        let windowHeight = window.innerHeight\n\n        let menuDimensions = this.getMenuDimensions()\n        let menuIsOffScreen = this.isMenuOffScreen(coordinates, menuDimensions)\n\n        if (menuIsOffScreen.right) {\n            coordinates.left = 'auto'\n            coordinates.right = windowWidth - rect.left - windowLeft\n        }\n\n        let parentHeight = this.tribute.menuContainer\n            ? this.tribute.menuContainer.offsetHeight\n            : this.getDocument().body.offsetHeight\n\n        if (menuIsOffScreen.bottom) {\n            let parentRect = this.tribute.menuContainer\n                ? this.tribute.menuContainer.getBoundingClientRect()\n                : this.getDocument().body.getBoundingClientRect()\n            let scrollStillAvailable = parentHeight - (windowHeight - parentRect.top)\n\n            coordinates.top = 'auto'\n            coordinates.bottom = scrollStillAvailable + (windowHeight - rect.top)\n        }\n\n        menuIsOffScreen = this.isMenuOffScreen(coordinates, menuDimensions)\n        if (menuIsOffScreen.left) {\n            coordinates.left = windowWidth > menuDimensions.width\n                ? windowLeft + windowWidth - menuDimensions.width\n                : windowLeft\n            delete coordinates.right\n        }\n        if (menuIsOffScreen.top) {\n            coordinates.top = windowHeight > menuDimensions.height\n                ? windowTop + windowHeight - menuDimensions.height\n                : windowTop\n            delete coordinates.bottom\n        }\n\n        if (!this.menuContainerIsBody) {\n            coordinates.left = coordinates.left ? coordinates.left - this.tribute.menuContainer.offsetLeft : coordinates.left\n            coordinates.top = coordinates.top ? coordinates.top - this.tribute.menuContainer.offsetTop : coordinates.top\n        }\n\n        return coordinates\n    }\n\n    scrollIntoView(elem) {\n        let reasonableBuffer = 20,\n            clientRect\n        let maxScrollDisplacement = 100\n        let e = this.menu\n\n        if (typeof e === 'undefined') return;\n\n        while (clientRect === undefined || clientRect.height === 0) {\n            clientRect = e.getBoundingClientRect()\n\n            if (clientRect.height === 0) {\n                e = e.childNodes[0]\n                if (e === undefined || !e.getBoundingClientRect) {\n                    return\n                }\n            }\n        }\n\n        let elemTop = clientRect.top\n        let elemBottom = elemTop + clientRect.height\n\n        if (elemTop < 0) {\n            window.scrollTo(0, window.pageYOffset + clientRect.top - reasonableBuffer)\n        } else if (elemBottom > window.innerHeight) {\n            let maxY = window.pageYOffset + clientRect.top - reasonableBuffer\n\n            if (maxY - window.pageYOffset > maxScrollDisplacement) {\n                maxY = window.pageYOffset + maxScrollDisplacement\n            }\n\n            let targetY = window.pageYOffset - (window.innerHeight - elemBottom)\n\n            if (targetY > maxY) {\n                targetY = maxY\n            }\n\n            window.scrollTo(0, targetY)\n        }\n    }\n}\n\n\nexport default TributeRange;\n","// Thanks to https://github.com/mattyork/fuzzy\nclass TributeSearch {\n    constructor(tribute) {\n        this.tribute = tribute\n        this.tribute.search = this\n    }\n\n    simpleFilter(pattern, array) {\n        return array.filter(string => {\n            return this.test(pattern, string)\n        })\n    }\n\n    test(pattern, string) {\n        return this.match(pattern, string) !== null\n    }\n\n    match(pattern, string, opts) {\n        opts = opts || {}\n        let patternIdx = 0,\n            result = [],\n            len = string.length,\n            totalScore = 0,\n            currScore = 0,\n            pre = opts.pre || '',\n            post = opts.post || '',\n            compareString = opts.caseSensitive && string || string.toLowerCase(),\n            ch, compareChar\n\n        if (opts.skip) {\n            return {rendered: string, score: 0}\n        }\n\n        pattern = opts.caseSensitive && pattern || pattern.toLowerCase()\n\n        let patternCache = this.traverse(compareString, pattern, 0, 0, [])\n        if (!patternCache) {\n            return null\n        }\n        return {\n            rendered: this.render(string, patternCache.cache, pre, post),\n            score: patternCache.score\n        }\n    }\n\n    traverse(string, pattern, stringIndex, patternIndex, patternCache) {\n        if (this.tribute.autocompleteSeparator) {\n            // if the pattern search at end\n            pattern = pattern.split(this.tribute.autocompleteSeparator).splice(-1)[0];\n        }\n\n        if (pattern.length === patternIndex) {\n\n            // calculate score and copy the cache containing the indices where it's found\n            return {\n                score: this.calculateScore(patternCache),\n                cache: patternCache.slice()\n            }\n        }\n\n        // if string at end or remaining pattern > remaining string\n        if (string.length === stringIndex || pattern.length - patternIndex > string.length - stringIndex) {\n            return undefined\n        }\n\n        let c = pattern[patternIndex]\n        let index = string.indexOf(c, stringIndex)\n        let best, temp\n\n        while (index > -1) {\n            patternCache.push(index)\n            temp = this.traverse(string, pattern, index + 1, patternIndex + 1, patternCache)\n            patternCache.pop()\n\n            // if downstream traversal failed, return best answer so far\n            if (!temp) {\n                return best\n            }\n\n            if (!best || best.score < temp.score) {\n                best = temp\n            }\n\n            index = string.indexOf(c, index + 1)\n        }\n\n        return best\n    }\n\n    calculateScore(patternCache) {\n        let score = 0\n        let temp = 1\n\n        patternCache.forEach((index, i) => {\n            if (i > 0) {\n                if (patternCache[i - 1] + 1 === index) {\n                    temp += temp + 1\n                }\n                else {\n                    temp = 1\n                }\n            }\n\n            score += temp\n        })\n\n        return score\n    }\n\n    render(string, indices, pre, post) {\n        var rendered = string.substring(0, indices[0])\n\n        indices.forEach((index, i) => {\n            rendered += pre + string[index] + post +\n                string.substring(index + 1, (indices[i + 1]) ? indices[i + 1] : string.length)\n        })\n\n        return rendered\n    }\n\n    filter(pattern, arr, opts) {\n        opts = opts || {}\n        return arr\n            .reduce((prev, element, idx, arr) => {\n                let str = element\n\n                if (opts.extract) {\n                    str = opts.extract(element)\n\n                    if (!str) { // take care of undefineds / nulls / etc.\n                        str = ''\n                    }\n                }\n\n                let rendered = this.match(pattern, str, opts)\n\n                if (rendered != null) {\n                    prev[prev.length] = {\n                        string: rendered.rendered,\n                        score: rendered.score,\n                        index: idx,\n                        original: element\n                    }\n                }\n\n                return prev\n            }, [])\n\n        .sort((a, b) => {\n            let compare = b.score - a.score\n            if (compare) return compare\n            return a.index - b.index\n        })\n    }\n}\n\nexport default TributeSearch;\n","import \"./utils\";\nimport TributeEvents from \"./TributeEvents\";\nimport TributeMenuEvents from \"./TributeMenuEvents\";\nimport TributeRange from \"./TributeRange\";\nimport TributeSearch from \"./TributeSearch\";\n\nclass Tribute {\n  constructor({\n    values = null,\n    iframe = null,\n    selectClass = \"highlight\",\n    containerClass = \"tribute-container\",\n    itemClass = \"\",\n    trigger = \"@\",\n    autocompleteMode = false,\n    autocompleteSeparator = null,\n    selectTemplate = null,\n    menuItemTemplate = null,\n    lookup = \"key\",\n    fillAttr = \"value\",\n    collection = null,\n    menuContainer = null,\n    noMatchTemplate = null,\n    requireLeadingSpace = true,\n    allowSpaces = false,\n    replaceTextSuffix = null,\n    positionMenu = true,\n    spaceSelectsMatch = false,\n    searchOpts = {},\n    menuItemLimit = null,\n    menuShowMinLength = 0\n  }) {\n    this.autocompleteMode = autocompleteMode;\n    this.autocompleteSeparator = autocompleteSeparator;\n    this.menuSelected = 0;\n    this.current = {};\n    this.inputEvent = false;\n    this.isActive = false;\n    this.menuContainer = menuContainer;\n    this.allowSpaces = allowSpaces;\n    this.replaceTextSuffix = replaceTextSuffix;\n    this.positionMenu = positionMenu;\n    this.hasTrailingSpace = false;\n    this.spaceSelectsMatch = spaceSelectsMatch;\n\n    if (this.autocompleteMode) {\n      trigger = \"\";\n      allowSpaces = false;\n    }\n\n    if (values) {\n      this.collection = [\n        {\n          // symbol that starts the lookup\n          trigger: trigger,\n\n          // is it wrapped in an iframe\n          iframe: iframe,\n\n          // class applied to selected item\n          selectClass: selectClass,\n\n          // class applied to the Container\n          containerClass: containerClass,\n\n          // class applied to each item\n          itemClass: itemClass,\n\n          // function called on select that retuns the content to insert\n          selectTemplate: (\n            selectTemplate || Tribute.defaultSelectTemplate\n          ).bind(this),\n\n          // function called that returns content for an item\n          menuItemTemplate: (\n            menuItemTemplate || Tribute.defaultMenuItemTemplate\n          ).bind(this),\n\n          // function called when menu is empty, disables hiding of menu.\n          noMatchTemplate: (t => {\n            if (typeof t === \"string\") {\n              if (t.trim() === \"\") return null;\n              return t;\n            }\n            if (typeof t === \"function\") {\n              return t.bind(this);\n            }\n\n            return (\n              noMatchTemplate ||\n              function() {\n                return \"<li>No Match Found!</li>\";\n              }.bind(this)\n            );\n          })(noMatchTemplate),\n\n          // column to search against in the object\n          lookup: lookup,\n\n          // column that contains the content to insert by default\n          fillAttr: fillAttr,\n\n          // array of objects or a function returning an array of objects\n          values: values,\n\n          requireLeadingSpace: requireLeadingSpace,\n\n          searchOpts: searchOpts,\n\n          menuItemLimit: menuItemLimit,\n\n          menuShowMinLength: menuShowMinLength\n        }\n      ];\n    } else if (collection) {\n      if (this.autocompleteMode)\n        console.warn(\n          \"Tribute in autocomplete mode does not work for collections\"\n        );\n      this.collection = collection.map(item => {\n        return {\n          trigger: item.trigger || trigger,\n          iframe: item.iframe || iframe,\n          selectClass: item.selectClass || selectClass,\n          containerClass: item.containerClass || containerClass,\n          itemClass: item.itemClass || itemClass,\n          selectTemplate: (\n            item.selectTemplate || Tribute.defaultSelectTemplate\n          ).bind(this),\n          menuItemTemplate: (\n            item.menuItemTemplate || Tribute.defaultMenuItemTemplate\n          ).bind(this),\n          // function called when menu is empty, disables hiding of menu.\n          noMatchTemplate: (t => {\n            if (typeof t === \"string\") {\n              if (t.trim() === \"\") return null;\n              return t;\n            }\n            if (typeof t === \"function\") {\n              return t.bind(this);\n            }\n\n            return (\n              noMatchTemplate ||\n              function() {\n                return \"<li>No Match Found!</li>\";\n              }.bind(this)\n            );\n          })(noMatchTemplate),\n          lookup: item.lookup || lookup,\n          fillAttr: item.fillAttr || fillAttr,\n          values: item.values,\n          requireLeadingSpace: item.requireLeadingSpace,\n          searchOpts: item.searchOpts || searchOpts,\n          menuItemLimit: item.menuItemLimit || menuItemLimit,\n          menuShowMinLength: item.menuShowMinLength || menuShowMinLength\n        };\n      });\n    } else {\n      throw new Error(\"[Tribute] No collection specified.\");\n    }\n\n    new TributeRange(this);\n    new TributeEvents(this);\n    new TributeMenuEvents(this);\n    new TributeSearch(this);\n  }\n\n  get isActive() {\n    return this._isActive;\n  }\n\n  set isActive(val) {\n    if (this._isActive != val) {\n      this._isActive = val;\n      if (this.current.element) {\n        let noMatchEvent = new CustomEvent(`tribute-active-${val}`);\n        this.current.element.dispatchEvent(noMatchEvent);\n      }\n    }\n  }\n\n  static defaultSelectTemplate(item) {\n    if (typeof item === \"undefined\")\n      return `${this.current.collection.trigger}${this.current.mentionText}`;\n    if (this.range.isContentEditable(this.current.element)) {\n      return (\n        '<span class=\"tribute-mention\">' +\n        (this.current.collection.trigger +\n          item.original[this.current.collection.fillAttr]) +\n        \"</span>\"\n      );\n    }\n\n    return (\n      this.current.collection.trigger +\n      item.original[this.current.collection.fillAttr]\n    );\n  }\n\n  static defaultMenuItemTemplate(matchItem) {\n    return matchItem.string;\n  }\n\n  static inputTypes() {\n    return [\"TEXTAREA\", \"INPUT\"];\n  }\n\n  triggers() {\n    return this.collection.map(config => {\n      return config.trigger;\n    });\n  }\n\n  attach(el) {\n    if (!el) {\n      throw new Error(\"[Tribute] Must pass in a DOM node or NodeList.\");\n    }\n\n    // Check if it is a jQuery collection\n    if (typeof jQuery !== \"undefined\" && el instanceof jQuery) {\n      el = el.get();\n    }\n\n    // Is el an Array/Array-like object?\n    if (\n      el.constructor === NodeList ||\n      el.constructor === HTMLCollection ||\n      el.constructor === Array\n    ) {\n      let length = el.length;\n      for (var i = 0; i < length; ++i) {\n        this._attach(el[i]);\n      }\n    } else {\n      this._attach(el);\n    }\n  }\n\n  _attach(el) {\n    if (el.hasAttribute(\"data-tribute\")) {\n      console.warn(\"Tribute was already bound to \" + el.nodeName);\n    }\n\n    this.ensureEditable(el);\n    this.events.bind(el);\n    el.setAttribute(\"data-tribute\", true);\n  }\n\n  ensureEditable(element) {\n    if (Tribute.inputTypes().indexOf(element.nodeName) === -1) {\n      if (element.contentEditable) {\n        element.contentEditable = true;\n      } else {\n        throw new Error(\"[Tribute] Cannot bind to \" + element.nodeName);\n      }\n    }\n  }\n\n  createMenu(containerClass) {\n    let wrapper = this.range.getDocument().createElement(\"div\"),\n      ul = this.range.getDocument().createElement(\"ul\");\n    wrapper.className = containerClass;\n    wrapper.appendChild(ul);\n\n    if (this.menuContainer) {\n      return this.menuContainer.appendChild(wrapper);\n    }\n\n    return this.range.getDocument().body.appendChild(wrapper);\n  }\n\n  showMenuFor(element, scrollTo) {\n    // Only proceed if menu isn't already shown for the current element & mentionText\n    if (\n      this.isActive &&\n      this.current.element === element &&\n      this.current.mentionText === this.currentMentionTextSnapshot\n    ) {\n      return;\n    }\n    this.currentMentionTextSnapshot = this.current.mentionText;\n\n    // create the menu if it doesn't exist.\n    if (!this.menu) {\n      this.menu = this.createMenu(this.current.collection.containerClass);\n      element.tributeMenu = this.menu;\n      this.menuEvents.bind(this.menu);\n    }\n\n    this.isActive = true;\n    this.menuSelected = 0;\n\n    if (!this.current.mentionText) {\n      this.current.mentionText = \"\";\n    }\n\n    const processValues = values => {\n      // Tribute may not be active any more by the time the value callback returns\n      if (!this.isActive) {\n        return;\n      }\n\n      let items = this.search.filter(this.current.mentionText, values, {\n        pre: this.current.collection.searchOpts.pre || \"<span>\",\n        post: this.current.collection.searchOpts.post || \"</span>\",\n        skip: this.current.collection.searchOpts.skip,\n        extract: el => {\n          if (typeof this.current.collection.lookup === \"string\") {\n            return el[this.current.collection.lookup];\n          } else if (typeof this.current.collection.lookup === \"function\") {\n            return this.current.collection.lookup(el, this.current.mentionText);\n          } else {\n            throw new Error(\n              \"Invalid lookup attribute, lookup must be string or function.\"\n            );\n          }\n        }\n      });\n\n      if (this.current.collection.menuItemLimit) {\n        items = items.slice(0, this.current.collection.menuItemLimit);\n      }\n\n      this.current.filteredItems = items;\n\n      let ul = this.menu.querySelector(\"ul\");\n\n      this.range.positionMenuAtCaret(scrollTo);\n\n      if (!items.length) {\n        let noMatchEvent = new CustomEvent(\"tribute-no-match\", {\n          detail: this.menu\n        });\n        this.current.element.dispatchEvent(noMatchEvent);\n        if (\n          (typeof this.current.collection.noMatchTemplate === \"function\" &&\n            !this.current.collection.noMatchTemplate()) ||\n          !this.current.collection.noMatchTemplate\n        ) {\n          this.hideMenu();\n        } else {\n          typeof this.current.collection.noMatchTemplate === \"function\"\n            ? (ul.innerHTML = this.current.collection.noMatchTemplate())\n            : (ul.innerHTML = this.current.collection.noMatchTemplate);\n        }\n\n        return;\n      }\n\n      ul.innerHTML = \"\";\n      let fragment = this.range.getDocument().createDocumentFragment();\n\n      items.forEach((item, index) => {\n        let li = this.range.getDocument().createElement(\"li\");\n        li.setAttribute(\"data-index\", index);\n        li.className = this.current.collection.itemClass;\n        li.addEventListener(\"mousemove\", e => {\n          let [li, index] = this._findLiTarget(e.target);\n          if (e.movementY !== 0) {\n            this.events.setActiveLi(index);\n          }\n        });\n        if (this.menuSelected === index) {\n          li.classList.add(this.current.collection.selectClass);\n        }\n        li.innerHTML = this.current.collection.menuItemTemplate(item);\n        fragment.appendChild(li);\n      });\n      ul.appendChild(fragment);\n    };\n\n    if (typeof this.current.collection.values === \"function\") {\n      this.current.collection.values(this.current.mentionText, processValues);\n    } else {\n      processValues(this.current.collection.values);\n    }\n  }\n\n  _findLiTarget(el) {\n    if (!el) return [];\n    const index = el.getAttribute(\"data-index\");\n    return !index ? this._findLiTarget(el.parentNode) : [el, index];\n  }\n\n  showMenuForCollection(element, collectionIndex) {\n    if (element !== document.activeElement) {\n      this.placeCaretAtEnd(element);\n    }\n\n    this.current.collection = this.collection[collectionIndex || 0];\n    this.current.externalTrigger = true;\n    this.current.element = element;\n\n    if (element.isContentEditable)\n      this.insertTextAtCursor(this.current.collection.trigger);\n    else this.insertAtCaret(element, this.current.collection.trigger);\n\n    this.showMenuFor(element);\n  }\n\n  // TODO: make sure this works for inputs/textareas\n  placeCaretAtEnd(el) {\n    el.focus();\n    if (\n      typeof window.getSelection != \"undefined\" &&\n      typeof document.createRange != \"undefined\"\n    ) {\n      var range = document.createRange();\n      range.selectNodeContents(el);\n      range.collapse(false);\n      var sel = window.getSelection();\n      sel.removeAllRanges();\n      sel.addRange(range);\n    } else if (typeof document.body.createTextRange != \"undefined\") {\n      var textRange = document.body.createTextRange();\n      textRange.moveToElementText(el);\n      textRange.collapse(false);\n      textRange.select();\n    }\n  }\n\n  // for contenteditable\n  insertTextAtCursor(text) {\n    var sel, range, html;\n    sel = window.getSelection();\n    range = sel.getRangeAt(0);\n    range.deleteContents();\n    var textNode = document.createTextNode(text);\n    range.insertNode(textNode);\n    range.selectNodeContents(textNode);\n    range.collapse(false);\n    sel.removeAllRanges();\n    sel.addRange(range);\n  }\n\n  // for regular inputs\n  insertAtCaret(textarea, text) {\n    var scrollPos = textarea.scrollTop;\n    var caretPos = textarea.selectionStart;\n\n    var front = textarea.value.substring(0, caretPos);\n    var back = textarea.value.substring(\n      textarea.selectionEnd,\n      textarea.value.length\n    );\n    textarea.value = front + text + back;\n    caretPos = caretPos + text.length;\n    textarea.selectionStart = caretPos;\n    textarea.selectionEnd = caretPos;\n    textarea.focus();\n    textarea.scrollTop = scrollPos;\n  }\n\n  hideMenu() {\n    if (this.menu) {\n      this.menu.style.cssText = \"display: none;\";\n      this.isActive = false;\n      this.menuSelected = 0;\n      this.current = {};\n    }\n  }\n\n  selectItemAtIndex(index, originalEvent) {\n    index = parseInt(index);\n    if (typeof index !== \"number\" || isNaN(index)) return;\n    let item = this.current.filteredItems[index];\n    let content = this.current.collection.selectTemplate(item);\n    if (content !== null) this.replaceText(content, originalEvent, item);\n  }\n\n  replaceText(content, originalEvent, item) {\n    this.range.replaceTriggerText(content, true, true, originalEvent, item);\n  }\n\n  _append(collection, newValues, replace) {\n    if (typeof collection.values === \"function\") {\n      throw new Error(\"Unable to append to values, as it is a function.\");\n    } else if (!replace) {\n      collection.values = collection.values.concat(newValues);\n    } else {\n      collection.values = newValues;\n    }\n  }\n\n  append(collectionIndex, newValues, replace) {\n    let index = parseInt(collectionIndex);\n    if (typeof index !== \"number\")\n      throw new Error(\"please provide an index for the collection to update.\");\n\n    let collection = this.collection[index];\n\n    this._append(collection, newValues, replace);\n  }\n\n  appendCurrent(newValues, replace) {\n    if (this.isActive) {\n      this._append(this.current.collection, newValues, replace);\n    } else {\n      throw new Error(\n        \"No active state. Please use append instead and pass an index.\"\n      );\n    }\n  }\n\n  detach(el) {\n    if (!el) {\n      throw new Error(\"[Tribute] Must pass in a DOM node or NodeList.\");\n    }\n\n    // Check if it is a jQuery collection\n    if (typeof jQuery !== \"undefined\" && el instanceof jQuery) {\n      el = el.get();\n    }\n\n    // Is el an Array/Array-like object?\n    if (\n      el.constructor === NodeList ||\n      el.constructor === HTMLCollection ||\n      el.constructor === Array\n    ) {\n      let length = el.length;\n      for (var i = 0; i < length; ++i) {\n        this._detach(el[i]);\n      }\n    } else {\n      this._detach(el);\n    }\n  }\n\n  _detach(el) {\n    this.events.unbind(el);\n    if (el.tributeMenu) {\n      this.menuEvents.unbind(el.tributeMenu);\n    }\n\n    setTimeout(() => {\n      el.removeAttribute(\"data-tribute\");\n      this.isActive = false;\n      if (el.tributeMenu) {\n        el.tributeMenu.remove();\n      }\n    });\n  }\n}\n\nexport default Tribute;\n"],"names":["Array","prototype","find","predicate","this","TypeError","value","list","Object","length","thisArg","arguments","i","call","window","CustomEvent","event","params","bubbles","cancelable","detail","undefined","evt","document","createEvent","initCustomEvent","Event","TributeEvents","tribute","events","element","boundKeydown","keydown","bind","boundKeyup","keyup","boundInput","input","addEventListener","removeEventListener","instance","shouldDeactivate","isActive","hideMenu","commandEvent","keys","forEach","o","key","keyCode","callbacks","toLowerCase","inputEvent","menu","contains","target","li","preventDefault","stopPropagation","nodeName","parentNode","Error","selectItemAtIndex","getAttribute","current","externalTrigger","setTimeout","updateSelection","allowSpaces","hasTrailingSpace","autocompleteMode","triggerChar","getKeyCode","isNaN","trigger","triggers","charCodeAt","mentionText","collection","menuShowMinLength","showMenuFor","eventKeyPressed","el","info","range","getTriggerInfo","mentionTriggerChar","selectedPath","mentionSelectedPath","selectedOffset","mentionSelectedOffset","e","_this","collectionItem","item","enter","filteredItems","menuSelected","escape","tab","space","spaceSelectsMatch","up","count","selected","setActiveLi","scrollTop","scrollHeight","down","index","lis","querySelectorAll","parseInt","classList","add","selectClass","liClientRect","getBoundingClientRect","menuClientRect","bottom","scrollDistance","top","remove","elem","includeMargin","height","style","currentStyle","getComputedStyle","parseFloat","marginTop","marginBottom","TributeMenuEvents","menuEvents","menuClickEvent","click","menuContainerScrollEvent","debounce","windowResizeEvent","positionMenuAtCaret","getDocument","menuContainer","func","wait","immediate","timeout","context","_this2","args","callNow","clearTimeout","apply","TributeRange","iframe","contentWindow","scrollTo","coordinates","positionMenu","cssText","isContentEditable","getContentEditableCaretPosition","mentionPosition","getTextAreaOrInputUnderlinePosition","left","right","scrollIntoView","menuDimensions","width","offsetWidth","offsetHeight","menuIsOffScreen","isMenuOffScreen","menuIsOffScreenHorizontally","innerWidth","menuIsOffScreenVertically","innerHeight","targetElement","path","offset","childNodes","nextSibling","previousSibling","sel","getWindowSelection","createRange","setStart","setEnd","collapse","removeAllRanges","error","addRange","focus","text","requireLeadingSpace","originalEvent","replaceEvent","replaceTextSuffix","endPos","pasteHtml","myField","textSuffix","startPos","substring","selectionStart","selectionEnd","dispatchEvent","html","anchorNode","deleteContents","createElement","innerHTML","node","lastNode","frag","createDocumentFragment","firstChild","appendChild","insertNode","cloneRange","setStartAfter","getSelection","ctx","ce","contentEditable","getNodePositionInParent","push","reverse","getRangeAt","startOffset","selectedElem","workingNodeContent","textContent","selectStartOffset","textComponent","wordsArray","replace","autocompleteSeparator","split","trim","menuAlreadyActive","isAutocomplete","selectionInfo","getContentEditableSelectedPath","effectiveRange","getTextPrecedingCurrentSelection","lastWordOfEffectiveRange","getLastWordInText","mentionSelectedElement","mostRecentTriggerCharPos","config","c","idx","lastIndexWithLeadingSpace","lastIndexOf","test","currentTriggerSnippet","firstSnippetChar","leadingSpace","regex","str","reversedStr","join","cidx","len","firstChar","match","triggerIdx","windowWidth","windowHeight","doc","documentElement","windowLeft","pageXOffset","scrollLeft","clientLeft","windowTop","pageYOffset","clientTop","menuTop","menuRight","menuBottom","menuLeft","Math","floor","ceil","dimensions","position","flipped","isFirefox","mozInnerScreenX","div","id","body","computed","whiteSpace","wordWrap","visibility","prop","overflowY","overflow","span","rect","menuContainerIsBody","offsetTop","borderTopWidth","fontSize","offsetLeft","borderLeftWidth","getMenuDimensions","parentHeight","scrollStillAvailable","removeChild","selectedNodePosition","clientRect","elemTop","elemBottom","maxY","targetY","TributeSearch","search","pattern","array","filter","string","opts","pre","post","compareString","caseSensitive","skip","rendered","score","patternCache","traverse","render","cache","stringIndex","patternIndex","splice","calculateScore","slice","best","temp","indexOf","pop","indices","arr","reduce","prev","extract","original","sort","a","b","compare","t","values","containerClass","itemClass","selectTemplate","menuItemTemplate","lookup","fillAttr","noMatchTemplate","searchOpts","menuItemLimit","Tribute","defaultSelectTemplate","defaultMenuItemTemplate","console","warn","map","jQuery","get","constructor","NodeList","HTMLCollection","_attach","hasAttribute","ensureEditable","setAttribute","inputTypes","wrapper","ul","className","currentMentionTextSnapshot","createMenu","tributeMenu","processValues","items","querySelector","noMatchEvent","fragment","_findLiTarget","movementY","collectionIndex","activeElement","placeCaretAtEnd","insertTextAtCursor","insertAtCaret","selectNodeContents","createTextRange","textRange","moveToElementText","select","textNode","createTextNode","textarea","scrollPos","caretPos","front","back","content","replaceText","replaceTriggerText","newValues","concat","_append","_detach","unbind","removeAttribute","_this3","_isActive","val","matchItem"],"mappings":"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"}
\ No newline at end of file
diff --git a/public/stylesheets/tribute-3.7.3.css b/public/stylesheets/tribute-3.7.3.css
deleted file mode 100644 (file)
index 06a876f..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-.tribute-container {
-    position: absolute;
-    top: 0;
-    left: 0;
-    height: auto;
-    max-height: 300px;
-    max-width: 500px;
-    overflow: auto;
-    display: block;
-    z-index: 999999; }
-.tribute-container ul {
-    margin: 0;
-    margin-top: 2px;
-    padding: 0;
-    list-style: none;
-    background: #efefef; }
-.tribute-container li {
-    padding: 5px 5px;
-    cursor: pointer; }
-.tribute-container li.highlight {
-    background: #ddd; }
-.tribute-container li span {
-    font-weight: bold; }
-.tribute-container li.no-match {
-    cursor: default; }
-.tribute-container .menu-highlighted {
-    font-weight: bold; }
diff --git a/public/stylesheets/tribute-5.1.3.css b/public/stylesheets/tribute-5.1.3.css
new file mode 100644 (file)
index 0000000..80be23a
--- /dev/null
@@ -0,0 +1,34 @@
+.tribute-container {
+  position: absolute;
+  top: 0;
+  left: 0;
+  height: auto;
+  max-height: 300px;
+  max-width: 500px;
+  overflow: auto;
+  display: block;
+  z-index: 999999;
+}
+.tribute-container ul {
+  margin: 0;
+  margin-top: 2px;
+  padding: 0;
+  list-style: none;
+  background: #efefef;
+}
+.tribute-container li {
+  padding: 5px 5px;
+  cursor: pointer;
+}
+.tribute-container li.highlight {
+  background: #ddd;
+}
+.tribute-container li span {
+  font-weight: bold;
+}
+.tribute-container li.no-match {
+  cursor: default;
+}
+.tribute-container .menu-highlighted {
+  font-weight: bold;
+}
\ No newline at end of file