{"version":3,"file":"tributejs-v_PFrKPD.js","sources":["../../../../../shared/node_modules/tributejs/dist/tribute.esm.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$1(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$1.prototype = window.Event.prototype;\n }\n\n window.CustomEvent = CustomEvent$1;\n}\n\nclass 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
  • 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 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\nclass 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\n// Thanks to https://github.com/jeff-collins/ment.io\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 let wordsArray = text.split(/\\s+/);\n let 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// 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 len = string.length,\n pre = opts.pre || '',\n post = opts.post || '',\n compareString = opts.caseSensitive && string || string.toLowerCase();\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 the pattern search at end\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\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 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.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 \"
  • No Match Found!
  • \";\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 \"
  • No Match Found!
  • \";\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 '' +\n (this.current.collection.trigger +\n item.original[this.current.collection.fillAttr]) +\n \"\"\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 || \"\",\n post: this.current.collection.searchOpts.post || \"\",\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;\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\n/**\n * Tribute.js\n * Native ES6 JavaScript @mention Plugin\n **/\n\nexport default Tribute;\n"],"names":["predicate","list","length","thisArg","value","i","CustomEvent$1","event","params","evt","TributeEvents","tribute","element","instance","o","li","keyCode","trigger","eventKeyPressed","el","info","collectionItem","item","count","selected","index","lis","liClientRect","menuClientRect","scrollDistance","elem","includeMargin","height","style","TributeMenuEvents","menu","func","wait","immediate","timeout","context","args","later","callNow","TributeRange","iframe","scrollTo","coordinates","menuDimensions","menuIsOffScreen","menuIsOffScreenHorizontally","menuIsOffScreenVertically","targetElement","path","offset","range","sel","text","requireLeadingSpace","hasTrailingSpace","originalEvent","replaceEvent","textSuffix","endPos","myField","startPos","html","frag","node","lastNode","ctx","ce","selectedElem","workingNodeContent","selectStartOffset","textComponent","wordsArray","worldsCount","menuAlreadyActive","allowSpaces","isAutocomplete","selectionInfo","effectiveRange","lastWordOfEffectiveRange","mostRecentTriggerCharPos","triggerChar","config","c","idx","currentTriggerSnippet","firstSnippetChar","leadingSpace","regex","str","reversedStr","cidx","len","firstChar","match","triggerIdx","windowWidth","windowHeight","doc","windowLeft","windowTop","menuTop","menuRight","menuBottom","menuLeft","dimensions","position","flipped","properties","isFirefox","div","computed","prop","span","rect","top","left","parentHeight","parentRect","scrollStillAvailable","selectedNodePosition","reasonableBuffer","clientRect","maxScrollDisplacement","e","elemTop","elemBottom","maxY","targetY","TributeSearch","pattern","array","string","opts","pre","post","compareString","patternCache","stringIndex","patternIndex","best","temp","score","indices","rendered","arr","prev","a","b","compare","Tribute","values","selectClass","containerClass","itemClass","autocompleteMode","selectTemplate","menuItemTemplate","lookup","fillAttr","collection","menuContainer","noMatchTemplate","replaceTextSuffix","positionMenu","spaceSelectsMatch","searchOpts","menuItemLimit","menuShowMinLength","t","val","noMatchEvent","matchItem","wrapper","ul","processValues","items","fragment","collectionIndex","textRange","textNode","textarea","scrollPos","caretPos","front","back","content","newValues","replace"],"mappings":"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","x_google_ignoreList":[0]}