From 92e837d83a0571d440d1cb4d646b80310677a59b Mon Sep 17 00:00:00 2001 From: Benjamin Svobodny Date: Tue, 8 Aug 2017 17:51:19 -0400 Subject: [PATCH 01/11] add possibility to use another container for suggestion items list (example: document.body) --- awesomplete.base.css | 6 ++++-- awesomplete.css | 29 ++++++++++++++++++++--------- awesomplete.css.map | 2 +- awesomplete.js | 17 +++++++++++++++-- awesomplete.min.js | 2 +- awesomplete.min.js.map | 2 +- awesomplete.theme.css | 23 ++++++++++++++++------- 7 files changed, 58 insertions(+), 23 deletions(-) diff --git a/awesomplete.base.css b/awesomplete.base.css index 8e5ec125..f413abae 100644 --- a/awesomplete.base.css +++ b/awesomplete.base.css @@ -16,7 +16,8 @@ display: block; } -.awesomplete > ul { +.awesomplete > ul, +ul.awesomplete-suggestion-list { position: absolute; left: 0; z-index: 1; @@ -28,6 +29,7 @@ background: #fff; } -.awesomplete > ul:empty { +.awesomplete > ul:empty, +ul.awesomplete-suggestion-list:empty { display: none; } diff --git a/awesomplete.css b/awesomplete.css index 0b2ea34f..f9b9689b 100644 --- a/awesomplete.css +++ b/awesomplete.css @@ -16,7 +16,8 @@ display: block; } -.awesomplete > ul { +.awesomplete > ul, +ul.awesomplete-suggestion-list { position: absolute; left: 0; z-index: 1; @@ -28,11 +29,13 @@ background: #fff; } -.awesomplete > ul:empty { +.awesomplete > ul:empty, +ul.awesomplete-suggestion-list:empty { display: none; } -.awesomplete > ul { +.awesomplete > ul, +ul.awesomplete-suggestion-list { border-radius: .3em; margin: .2em 0 0; background: hsla(0,0%,100%,.9); @@ -43,13 +46,16 @@ } @supports (transform: scale(0)) { - .awesomplete > ul { + .awesomplete > ul, + ul.awesomplete-suggestion-list { transition: .3s cubic-bezier(.4,.2,.5,1.4); transform-origin: 1.43em -.43em; } .awesomplete > ul[hidden], - .awesomplete > ul:empty { + .awesomplete > ul:empty, + ul.awesomplete-suggestion-list[hidden], + ul.awesomplete-suggestion-list:empty { opacity: 0; transform: scale(0); display: block; @@ -58,7 +64,9 @@ } /* Pointer */ - .awesomplete > ul:before { + + .awesomplete > ul:before, + ul.awesomplete-suggestion-list:before { content: ""; position: absolute; top: -.43em; @@ -73,18 +81,21 @@ transform: rotate(45deg); } - .awesomplete > ul > li { + .awesomplete > ul > li, + ul.awesomplete-suggestion-list > li { position: relative; padding: .2em .5em; cursor: pointer; } - .awesomplete > ul > li:hover { + .awesomplete > ul > li:hover, + ul.awesomplete-suggestion-list > li:hover { background: hsl(200, 40%, 80%); color: black; } - .awesomplete > ul > li[aria-selected="true"] { + .awesomplete > ul >li [aria-selected="true"], + ul.awesomplete-suggestion-list > li[aria-selected="true"] { background: hsl(205, 40%, 40%); color: white; } diff --git a/awesomplete.css.map b/awesomplete.css.map index 3d578397..f8475c49 100644 --- a/awesomplete.css.map +++ b/awesomplete.css.map @@ -1 +1 @@ -{"version":3,"sources":["awesomplete.base.css","awesomplete.theme.css"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"awesomplete.css","sourcesContent":[".awesomplete [hidden] {\n display: none;\n}\n\n.awesomplete .visually-hidden {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n}\n\n.awesomplete {\n display: inline-block;\n position: relative;\n}\n\n.awesomplete > input {\n display: block;\n}\n\n.awesomplete > ul {\n position: absolute;\n left: 0;\n z-index: 1;\n min-width: 100%;\n box-sizing: border-box;\n list-style: none;\n padding: 0;\n margin: 0;\n background: #fff;\n}\n\n.awesomplete > ul:empty {\n display: none;\n}\n",".awesomplete > ul {\n\tborder-radius: .3em;\n\tmargin: .2em 0 0;\n\tbackground: hsla(0,0%,100%,.9);\n\tbackground: linear-gradient(to bottom right, white, hsla(0,0%,100%,.8));\n\tborder: 1px solid rgba(0,0,0,.3);\n\tbox-shadow: .05em .2em .6em rgba(0,0,0,.2);\n\ttext-shadow: none;\n}\n\n@supports (transform: scale(0)) {\n\t.awesomplete > ul {\n\t\ttransition: .3s cubic-bezier(.4,.2,.5,1.4);\n\t\ttransform-origin: 1.43em -.43em;\n\t}\n\t\n\t.awesomplete > ul[hidden],\n\t.awesomplete > ul:empty {\n\t\topacity: 0;\n\t\ttransform: scale(0);\n\t\tdisplay: block;\n\t\ttransition-timing-function: ease;\n\t}\n}\n\n\t/* Pointer */\n\t.awesomplete > ul:before {\n\t\tcontent: \"\";\n\t\tposition: absolute;\n\t\ttop: -.43em;\n\t\tleft: 1em;\n\t\twidth: 0; height: 0;\n\t\tpadding: .4em;\n\t\tbackground: white;\n\t\tborder: inherit;\n\t\tborder-right: 0;\n\t\tborder-bottom: 0;\n\t\t-webkit-transform: rotate(45deg);\n\t\ttransform: rotate(45deg);\n\t}\n\n\t.awesomplete > ul > li {\n\t\tposition: relative;\n\t\tpadding: .2em .5em;\n\t\tcursor: pointer;\n\t}\n\t\n\t.awesomplete > ul > li:hover {\n\t\tbackground: hsl(200, 40%, 80%);\n\t\tcolor: black;\n\t}\n\t\n\t.awesomplete > ul > li[aria-selected=\"true\"] {\n\t\tbackground: hsl(205, 40%, 40%);\n\t\tcolor: white;\n\t}\n\t\n\t\t.awesomplete mark {\n\t\t\tbackground: hsl(65, 100%, 50%);\n\t\t}\n\t\t\n\t\t.awesomplete li:hover mark {\n\t\t\tbackground: hsl(68, 100%, 41%);\n\t\t}\n\t\t\n\t\t.awesomplete li[aria-selected=\"true\"] mark {\n\t\t\tbackground: hsl(86, 100%, 21%);\n\t\t\tcolor: inherit;\n\t\t}"]} \ No newline at end of file +{"version":3,"sources":["awesomplete.base.css","awesomplete.theme.css"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"awesomplete.css","sourcesContent":[".awesomplete [hidden] {\r\n display: none;\r\n}\r\n\r\n.awesomplete .visually-hidden {\r\n position: absolute;\r\n clip: rect(0, 0, 0, 0);\r\n}\r\n\r\n.awesomplete {\r\n display: inline-block;\r\n position: relative;\r\n}\r\n\r\n.awesomplete > input {\r\n display: block;\r\n}\r\n\r\n.awesomplete > ul,\r\nul.awesomplete-suggestion-list {\r\n position: absolute;\r\n left: 0;\r\n z-index: 1;\r\n min-width: 100%;\r\n box-sizing: border-box;\r\n list-style: none;\r\n padding: 0;\r\n margin: 0;\r\n background: #fff;\r\n}\r\n\r\n.awesomplete > ul:empty,\r\nul.awesomplete-suggestion-list:empty {\r\n display: none;\r\n}\r\n",".awesomplete > ul,\r\nul.awesomplete-suggestion-list {\r\n\tborder-radius: .3em;\r\n\tmargin: .2em 0 0;\r\n\tbackground: hsla(0,0%,100%,.9);\r\n\tbackground: linear-gradient(to bottom right, white, hsla(0,0%,100%,.8));\r\n\tborder: 1px solid rgba(0,0,0,.3);\r\n\tbox-shadow: .05em .2em .6em rgba(0,0,0,.2);\r\n\ttext-shadow: none;\r\n}\r\n\r\n@supports (transform: scale(0)) {\r\n\t.awesomplete > ul,\r\n\tul.awesomplete-suggestion-list {\r\n\t\ttransition: .3s cubic-bezier(.4,.2,.5,1.4);\r\n\t\ttransform-origin: 1.43em -.43em;\r\n\t}\r\n\t\r\n\t.awesomplete > ul[hidden],\r\n\t.awesomplete > ul:empty,\r\n\tul.awesomplete-suggestion-list[hidden],\r\n\tul.awesomplete-suggestion-list:empty {\r\n\t\topacity: 0;\r\n\t\ttransform: scale(0);\r\n\t\tdisplay: block;\r\n\t\ttransition-timing-function: ease;\r\n\t}\r\n}\r\n\r\n\t/* Pointer */\r\n\r\n\t.awesomplete > ul:before,\r\n\tul.awesomplete-suggestion-list:before {\r\n\t\tcontent: \"\";\r\n\t\tposition: absolute;\r\n\t\ttop: -.43em;\r\n\t\tleft: 1em;\r\n\t\twidth: 0; height: 0;\r\n\t\tpadding: .4em;\r\n\t\tbackground: white;\r\n\t\tborder: inherit;\r\n\t\tborder-right: 0;\r\n\t\tborder-bottom: 0;\r\n\t\t-webkit-transform: rotate(45deg);\r\n\t\ttransform: rotate(45deg);\r\n\t}\r\n\r\n\t.awesomplete > ul > li,\r\n\tul.awesomplete-suggestion-list > li {\r\n\t\tposition: relative;\r\n\t\tpadding: .2em .5em;\r\n\t\tcursor: pointer;\r\n\t}\r\n\t\r\n\t.awesomplete > ul > li:hover,\r\n\tul.awesomplete-suggestion-list > li:hover {\r\n\t\tbackground: hsl(200, 40%, 80%);\r\n\t\tcolor: black;\r\n\t}\r\n\t\r\n\t.awesomplete > ul >li [aria-selected=\"true\"],\r\n\tul.awesomplete-suggestion-list > li[aria-selected=\"true\"] {\r\n\t\tbackground: hsl(205, 40%, 40%);\r\n\t\tcolor: white;\r\n\t}\r\n\t\r\n\t\t.awesomplete mark {\r\n\t\t\tbackground: hsl(65, 100%, 50%);\r\n\t\t}\r\n\t\t\r\n\t\t.awesomplete li:hover mark {\r\n\t\t\tbackground: hsl(68, 100%, 41%);\r\n\t\t}\r\n\t\t\r\n\t\t.awesomplete li[aria-selected=\"true\"] mark {\r\n\t\t\tbackground: hsl(86, 100%, 21%);\r\n\t\t\tcolor: inherit;\r\n\t\t}"]} \ No newline at end of file diff --git a/awesomplete.js b/awesomplete.js index 11c312f2..caa672d2 100644 --- a/awesomplete.js +++ b/awesomplete.js @@ -28,7 +28,8 @@ var _ = function (input, o) { filter: _.FILTER_CONTAINS, sort: o.sort === false ? false : _.SORT_BYLENGTH, item: _.ITEM, - replace: _.REPLACE + replace: _.REPLACE, + listContainer: _.CONTAINER }, o); this.index = -1; @@ -42,7 +43,8 @@ var _ = function (input, o) { this.ul = $.create("ul", { hidden: "hidden", - inside: this.container + className: "awesomplete-suggestion-list", + inside: me.listContainer === _.CONTAINER ? me.container : me.listContainer }); this.status = $.create("span", { @@ -169,7 +171,16 @@ _.prototype = { }, open: function () { + if (this.listContainer !== _.CONTAINER) { + // In case the suggestion list is out of the container, + // get the bounding information of the container to set the position of the suggestion list below + var boundingRect = this.container.getBoundingClientRect() + this.ul.style.top = (boundingRect.top + boundingRect.height) + "px"; + this.ul.style.left = boundingRect.left + "px"; + this.ul.style["min-width"] = boundingRect.width + "px"; + } this.ul.removeAttribute("hidden"); + this.isOpened = true; if (this.autoFirst && this.index === -1) { @@ -333,6 +344,8 @@ _.REPLACE = function (text) { this.input.value = text.value; }; +_.CONTAINER = "container"; + _.DATA = function (item/*, input*/) { return item; }; // Private functions diff --git a/awesomplete.min.js b/awesomplete.min.js index 48693e5e..2376b769 100644 --- a/awesomplete.min.js +++ b/awesomplete.min.js @@ -1,3 +1,3 @@ // Awesomplete - Lea Verou - MIT license -!function(){function t(t){var e=Array.isArray(t)?{label:t[0],value:t[1]}:"object"==typeof t&&"label"in t&&"value"in t?t:{label:t,value:t};this.label=e.label||e.value,this.value=e.value}function e(t,e,i){for(var n in e){var s=e[n],r=t.input.getAttribute("data-"+n.toLowerCase());"number"==typeof s?t[n]=parseInt(r):!1===s?t[n]=null!==r:s instanceof Function?t[n]=null:t[n]=r,t[n]||0===t[n]||(t[n]=n in i?i[n]:s)}}function i(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function n(t,e){return o.call((e||document).querySelectorAll(t))}function s(){n("input.awesomplete").forEach(function(t){new r(t)})}var r=function(t,n){var s=this;this.isOpened=!1,this.input=i(t),this.input.setAttribute("autocomplete","off"),this.input.setAttribute("aria-autocomplete","list"),n=n||{},e(this,{minChars:2,maxItems:10,autoFirst:!1,data:r.DATA,filter:r.FILTER_CONTAINS,sort:!1!==n.sort&&r.SORT_BYLENGTH,item:r.ITEM,replace:r.REPLACE},n),this.index=-1,this.container=i.create("div",{className:"awesomplete",around:t}),this.ul=i.create("ul",{hidden:"hidden",inside:this.container}),this.status=i.create("span",{className:"visually-hidden",role:"status","aria-live":"assertive","aria-relevant":"additions",inside:this.container}),this._events={input:{input:this.evaluate.bind(this),blur:this.close.bind(this,{reason:"blur"}),keydown:function(t){var e=t.keyCode;s.opened&&(13===e&&s.selected?(t.preventDefault(),s.select()):27===e?s.close({reason:"esc"}):38!==e&&40!==e||(t.preventDefault(),s[38===e?"previous":"next"]()))}},form:{submit:this.close.bind(this,{reason:"submit"})},ul:{mousedown:function(t){var e=t.target;if(e!==this){for(;e&&!/li/i.test(e.nodeName);)e=e.parentNode;e&&0===t.button&&(t.preventDefault(),s.select(e,t.target))}}}},i.bind(this.input,this._events.input),i.bind(this.input.form,this._events.form),i.bind(this.ul,this._events.ul),this.input.hasAttribute("list")?(this.list="#"+this.input.getAttribute("list"),this.input.removeAttribute("list")):this.list=this.input.getAttribute("data-list")||n.list||[],r.all.push(this)};r.prototype={set list(t){if(Array.isArray(t))this._list=t;else if("string"==typeof t&&t.indexOf(",")>-1)this._list=t.split(/\s*,\s*/);else if((t=i(t))&&t.children){var e=[];o.apply(t.children).forEach(function(t){if(!t.disabled){var i=t.textContent.trim(),n=t.value||i,s=t.label||i;""!==n&&e.push({label:s,value:n})}}),this._list=e}document.activeElement===this.input&&this.evaluate()},get selected(){return this.index>-1},get opened(){return this.isOpened},close:function(t){this.opened&&(this.ul.setAttribute("hidden",""),this.isOpened=!1,this.index=-1,i.fire(this.input,"awesomplete-close",t||{}))},open:function(){this.ul.removeAttribute("hidden"),this.isOpened=!0,this.autoFirst&&-1===this.index&&this.goto(0),i.fire(this.input,"awesomplete-open")},destroy:function(){i.unbind(this.input,this._events.input),i.unbind(this.input.form,this._events.form);var t=this.container.parentNode;t.insertBefore(this.input,this.container),t.removeChild(this.container),this.input.removeAttribute("autocomplete"),this.input.removeAttribute("aria-autocomplete");var e=r.all.indexOf(this);-1!==e&&r.all.splice(e,1)},next:function(){var t=this.ul.children.length;this.goto(this.index-1&&e.length>0&&(e[t].setAttribute("aria-selected","true"),this.status.textContent=e[t].textContent,this.ul.scrollTop=e[t].offsetTop-this.ul.clientHeight+e[t].clientHeight,i.fire(this.input,"awesomplete-highlight",{text:this.suggestions[this.index]}))},select:function(t,e){if(t?this.index=i.siblingIndex(t):t=this.ul.children[this.index],t){var n=this.suggestions[this.index];i.fire(this.input,"awesomplete-select",{text:n,origin:e||t})&&(this.replace(n),this.close({reason:"select"}),i.fire(this.input,"awesomplete-selectcomplete",{text:n}))}},evaluate:function(){var e=this,i=this.input.value;i.length>=this.minChars&&this._list.length>0?(this.index=-1,this.ul.innerHTML="",this.suggestions=this._list.map(function(n){return new t(e.data(n,i))}).filter(function(t){return e.filter(t,i)}),!1!==this.sort&&(this.suggestions=this.suggestions.sort(this.sort)),this.suggestions=this.suggestions.slice(0,this.maxItems),this.suggestions.forEach(function(t){e.ul.appendChild(e.item(t,i))}),0===this.ul.children.length?this.close({reason:"nomatches"}):this.open()):this.close({reason:"nomatches"})}},r.all=[],r.FILTER_CONTAINS=function(t,e){return RegExp(i.regExpEscape(e.trim()),"i").test(t)},r.FILTER_STARTSWITH=function(t,e){return RegExp("^"+i.regExpEscape(e.trim()),"i").test(t)},r.SORT_BYLENGTH=function(t,e){return t.length!==e.length?t.length-e.length:t$&"),"aria-selected":"false"})},r.REPLACE=function(t){this.input.value=t.value},r.DATA=function(t){return t},Object.defineProperty(t.prototype=Object.create(String.prototype),"length",{get:function(){return this.label.length}}),t.prototype.toString=t.prototype.valueOf=function(){return""+this.label};var o=Array.prototype.slice;i.create=function(t,e){var n=document.createElement(t);for(var s in e){var r=e[s];if("inside"===s)i(r).appendChild(n);else if("around"===s){var o=i(r);o.parentNode.insertBefore(n,o),n.appendChild(o)}else s in n?n[s]=r:n.setAttribute(s,r)}return n},i.bind=function(t,e){if(t)for(var i in e){var n=e[i];i.split(/\s+/).forEach(function(e){t.addEventListener(e,n)})}},i.unbind=function(t,e){if(t)for(var i in e){var n=e[i];i.split(/\s+/).forEach(function(e){t.removeEventListener(e,n)})}},i.fire=function(t,e,i){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0);for(var s in i)n[s]=i[s];return t.dispatchEvent(n)},i.regExpEscape=function(t){return t.replace(/[-\\^$*+?.()|[\]{}]/g,"\\$&")},i.siblingIndex=function(t){for(var e=0;t=t.previousElementSibling;e++);return e},"undefined"!=typeof Document&&("loading"!==document.readyState?s():document.addEventListener("DOMContentLoaded",s)),r.$=i,r.$$=n,"undefined"!=typeof self&&(self.Awesomplete=r),"object"==typeof module&&module.exports&&(module.exports=r)}(); +!function(){function t(t){var e=Array.isArray(t)?{label:t[0],value:t[1]}:"object"==typeof t&&"label"in t&&"value"in t?t:{label:t,value:t};this.label=e.label||e.value,this.value=e.value}function e(t,e,i){for(var n in e){var s=e[n],r=t.input.getAttribute("data-"+n.toLowerCase());"number"==typeof s?t[n]=parseInt(r):!1===s?t[n]=null!==r:s instanceof Function?t[n]=null:t[n]=r,t[n]||0===t[n]||(t[n]=n in i?i[n]:s)}}function i(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function n(t,e){return o.call((e||document).querySelectorAll(t))}function s(){n("input.awesomplete").forEach(function(t){new r(t)})}var r=function(t,n){var s=this;this.isOpened=!1,this.input=i(t),this.input.setAttribute("autocomplete","off"),this.input.setAttribute("aria-autocomplete","list"),n=n||{},e(this,{minChars:2,maxItems:10,autoFirst:!1,data:r.DATA,filter:r.FILTER_CONTAINS,sort:!1!==n.sort&&r.SORT_BYLENGTH,item:r.ITEM,replace:r.REPLACE,listContainer:r.CONTAINER},n),this.index=-1,this.container=i.create("div",{className:"awesomplete",around:t}),this.ul=i.create("ul",{hidden:"hidden",className:"awesomplete-suggestion-list",inside:s.listContainer===r.CONTAINER?s.container:s.listContainer}),this.status=i.create("span",{className:"visually-hidden",role:"status","aria-live":"assertive","aria-relevant":"additions",inside:this.container}),this._events={input:{input:this.evaluate.bind(this),blur:this.close.bind(this,{reason:"blur"}),keydown:function(t){var e=t.keyCode;s.opened&&(13===e&&s.selected?(t.preventDefault(),s.select()):27===e?s.close({reason:"esc"}):38!==e&&40!==e||(t.preventDefault(),s[38===e?"previous":"next"]()))}},form:{submit:this.close.bind(this,{reason:"submit"})},ul:{mousedown:function(t){var e=t.target;if(e!==this){for(;e&&!/li/i.test(e.nodeName);)e=e.parentNode;e&&0===t.button&&(t.preventDefault(),s.select(e,t.target))}}}},i.bind(this.input,this._events.input),i.bind(this.input.form,this._events.form),i.bind(this.ul,this._events.ul),this.input.hasAttribute("list")?(this.list="#"+this.input.getAttribute("list"),this.input.removeAttribute("list")):this.list=this.input.getAttribute("data-list")||n.list||[],r.all.push(this)};r.prototype={set list(t){if(Array.isArray(t))this._list=t;else if("string"==typeof t&&t.indexOf(",")>-1)this._list=t.split(/\s*,\s*/);else if((t=i(t))&&t.children){var e=[];o.apply(t.children).forEach(function(t){if(!t.disabled){var i=t.textContent.trim(),n=t.value||i,s=t.label||i;""!==n&&e.push({label:s,value:n})}}),this._list=e}document.activeElement===this.input&&this.evaluate()},get selected(){return this.index>-1},get opened(){return this.isOpened},close:function(t){this.opened&&(this.ul.setAttribute("hidden",""),this.isOpened=!1,this.index=-1,i.fire(this.input,"awesomplete-close",t||{}))},open:function(){if(this.listContainer!==r.CONTAINER){var t=this.container.getBoundingClientRect();this.ul.style.top=t.top+t.height+"px",this.ul.style.left=t.left+"px",this.ul.style["min-width"]=t.width+"px"}this.ul.removeAttribute("hidden"),this.isOpened=!0,this.autoFirst&&-1===this.index&&this.goto(0),i.fire(this.input,"awesomplete-open")},destroy:function(){i.unbind(this.input,this._events.input),i.unbind(this.input.form,this._events.form);var t=this.container.parentNode;t.insertBefore(this.input,this.container),t.removeChild(this.container),this.input.removeAttribute("autocomplete"),this.input.removeAttribute("aria-autocomplete");var e=r.all.indexOf(this);-1!==e&&r.all.splice(e,1)},next:function(){var t=this.ul.children.length;this.goto(this.index-1&&e.length>0&&(e[t].setAttribute("aria-selected","true"),this.status.textContent=e[t].textContent,this.ul.scrollTop=e[t].offsetTop-this.ul.clientHeight+e[t].clientHeight,i.fire(this.input,"awesomplete-highlight",{text:this.suggestions[this.index]}))},select:function(t,e){if(t?this.index=i.siblingIndex(t):t=this.ul.children[this.index],t){var n=this.suggestions[this.index];i.fire(this.input,"awesomplete-select",{text:n,origin:e||t})&&(this.replace(n),this.close({reason:"select"}),i.fire(this.input,"awesomplete-selectcomplete",{text:n}))}},evaluate:function(){var e=this,i=this.input.value;i.length>=this.minChars&&this._list.length>0?(this.index=-1,this.ul.innerHTML="",this.suggestions=this._list.map(function(n){return new t(e.data(n,i))}).filter(function(t){return e.filter(t,i)}),!1!==this.sort&&(this.suggestions=this.suggestions.sort(this.sort)),this.suggestions=this.suggestions.slice(0,this.maxItems),this.suggestions.forEach(function(t){e.ul.appendChild(e.item(t,i))}),0===this.ul.children.length?this.close({reason:"nomatches"}):this.open()):this.close({reason:"nomatches"})}},r.all=[],r.FILTER_CONTAINS=function(t,e){return RegExp(i.regExpEscape(e.trim()),"i").test(t)},r.FILTER_STARTSWITH=function(t,e){return RegExp("^"+i.regExpEscape(e.trim()),"i").test(t)},r.SORT_BYLENGTH=function(t,e){return t.length!==e.length?t.length-e.length:t$&"),"aria-selected":"false"})},r.REPLACE=function(t){this.input.value=t.value},r.CONTAINER="container",r.DATA=function(t){return t},Object.defineProperty(t.prototype=Object.create(String.prototype),"length",{get:function(){return this.label.length}}),t.prototype.toString=t.prototype.valueOf=function(){return""+this.label};var o=Array.prototype.slice;i.create=function(t,e){var n=document.createElement(t);for(var s in e){var r=e[s];if("inside"===s)i(r).appendChild(n);else if("around"===s){var o=i(r);o.parentNode.insertBefore(n,o),n.appendChild(o)}else s in n?n[s]=r:n.setAttribute(s,r)}return n},i.bind=function(t,e){if(t)for(var i in e){var n=e[i];i.split(/\s+/).forEach(function(e){t.addEventListener(e,n)})}},i.unbind=function(t,e){if(t)for(var i in e){var n=e[i];i.split(/\s+/).forEach(function(e){t.removeEventListener(e,n)})}},i.fire=function(t,e,i){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0);for(var s in i)n[s]=i[s];return t.dispatchEvent(n)},i.regExpEscape=function(t){return t.replace(/[-\\^$*+?.()|[\]{}]/g,"\\$&")},i.siblingIndex=function(t){for(var e=0;t=t.previousElementSibling;e++);return e},"undefined"!=typeof Document&&("loading"!==document.readyState?s():document.addEventListener("DOMContentLoaded",s)),r.$=i,r.$$=n,"undefined"!=typeof self&&(self.Awesomplete=r),"object"==typeof module&&module.exports&&(module.exports=r)}(); //# sourceMappingURL=awesomplete.min.js.map diff --git a/awesomplete.min.js.map b/awesomplete.min.js.map index a1a73311..a27fa968 100644 --- a/awesomplete.min.js.map +++ b/awesomplete.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["awesomplete.js"],"names":["Suggestion","data","o","Array","isArray","label","value","this","configure","instance","properties","i","initial","attrValue","input","getAttribute","toLowerCase","parseInt","Function","$","expr","con","document","querySelector","$$","slice","call","querySelectorAll","init","forEach","_","me","isOpened","setAttribute","minChars","maxItems","autoFirst","DATA","filter","FILTER_CONTAINS","sort","SORT_BYLENGTH","item","ITEM","replace","REPLACE","index","container","create","className","around","ul","hidden","inside","status","role","aria-live","aria-relevant","_events","evaluate","bind","blur","close","reason","keydown","evt","c","keyCode","opened","selected","preventDefault","select","form","submit","mousedown","li","target","test","nodeName","parentNode","button","hasAttribute","list","removeAttribute","all","push","prototype","_list","indexOf","split","children","items","apply","el","disabled","text","textContent","trim","activeElement","fire","open","goto","destroy","unbind","insertBefore","removeChild","indexOfAwesomplete","splice","next","count","length","previous","pos","lis","scrollTop","offsetTop","clientHeight","suggestions","origin","siblingIndex","suggestion","innerHTML","map","appendChild","RegExp","regExpEscape","FILTER_STARTSWITH","a","b","aria-selected","Object","defineProperty","String","get","toString","valueOf","tag","element","createElement","val","ref","event","callback","addEventListener","removeEventListener","type","createEvent","initEvent","j","dispatchEvent","s","previousElementSibling","Document","readyState","self","Awesomplete","module","exports"],"mappings":";CAOC,WA4UD,QAASA,GAAWC,GACnB,GAAIC,GAAIC,MAAMC,QAAQH,IAChBI,MAAOJ,EAAK,GAAIK,MAAOL,EAAK,IACd,gBAATA,IAAqB,SAAWA,IAAQ,SAAWA,GAAOA,GAASI,MAAOJ,EAAMK,MAAOL,EAElGM,MAAKF,MAAQH,EAAEG,OAASH,EAAEI,MAC1BC,KAAKD,MAAQJ,EAAEI,MAShB,QAASE,GAAUC,EAAUC,EAAYR,GACxC,IAAK,GAAIS,KAAKD,GAAY,CACzB,GAAIE,GAAUF,EAAWC,GACrBE,EAAYJ,EAASK,MAAMC,aAAa,QAAUJ,EAAEK,cAEjC,iBAAZJ,GACVH,EAASE,GAAKM,SAASJ,IAEH,IAAZD,EACRH,EAASE,GAAmB,OAAdE,EAEND,YAAmBM,UAC3BT,EAASE,GAAK,KAGdF,EAASE,GAAKE,EAGVJ,EAASE,IAAsB,IAAhBF,EAASE,KAC5BF,EAASE,GAAMA,IAAKT,GAAIA,EAAES,GAAKC,IASlC,QAASO,GAAEC,EAAMC,GAChB,MAAuB,gBAATD,IAAoBC,GAAOC,UAAUC,cAAcH,GAAQA,GAAQ,KAGlF,QAASI,GAAGJ,EAAMC,GACjB,MAAOI,GAAMC,MAAML,GAAOC,UAAUK,iBAAiBP,IA4EtD,QAASQ,KACRJ,EAAG,qBAAqBK,QAAQ,SAAUf,GACzC,GAAIgB,GAAEhB,KAxcR,GAAIgB,GAAI,SAAUhB,EAAOZ,GACxB,GAAI6B,GAAKxB,IAITA,MAAKyB,UAAW,EAEhBzB,KAAKO,MAAQK,EAAEL,GACfP,KAAKO,MAAMmB,aAAa,eAAgB,OACxC1B,KAAKO,MAAMmB,aAAa,oBAAqB,QAE7C/B,EAAIA,MAEJM,EAAUD,MACT2B,SAAU,EACVC,SAAU,GACVC,WAAW,EACXnC,KAAM6B,EAAEO,KACRC,OAAQR,EAAES,gBACVC,MAAiB,IAAXtC,EAAEsC,MAAyBV,EAAEW,cACnCC,KAAMZ,EAAEa,KACRC,QAASd,EAAEe,SACT3C,GAEHK,KAAKuC,OAAS,EAIdvC,KAAKwC,UAAY5B,EAAE6B,OAAO,OACzBC,UAAW,cACXC,OAAQpC,IAGTP,KAAK4C,GAAKhC,EAAE6B,OAAO,MAClBI,OAAQ,SACRC,OAAQ9C,KAAKwC,YAGdxC,KAAK+C,OAASnC,EAAE6B,OAAO,QACtBC,UAAW,kBACXM,KAAM,SACNC,YAAa,YACbC,gBAAiB,YACjBJ,OAAQ9C,KAAKwC,YAKdxC,KAAKmD,SACJ5C,OACCA,MAASP,KAAKoD,SAASC,KAAKrD,MAC5BsD,KAAQtD,KAAKuD,MAAMF,KAAKrD,MAAQwD,OAAQ,SACxCC,QAAW,SAASC,GACnB,GAAIC,GAAID,EAAIE,OAITpC,GAAGqC,SACK,KAANF,GAAYnC,EAAGsC,UAClBJ,EAAIK,iBACJvC,EAAGwC,UAEW,KAANL,EACRnC,EAAG+B,OAAQC,OAAQ,QAEL,KAANG,GAAkB,KAANA,IACpBD,EAAIK,iBACJvC,EAAS,KAANmC,EAAU,WAAa,cAK9BM,MACCC,OAAUlE,KAAKuD,MAAMF,KAAKrD,MAAQwD,OAAQ,YAE3CZ,IACCuB,UAAa,SAAST,GACrB,GAAIU,GAAKV,EAAIW,MAEb,IAAID,IAAOpE,KAAM,CAEhB,KAAOoE,IAAO,MAAME,KAAKF,EAAGG,WAC3BH,EAAKA,EAAGI,UAGLJ,IAAqB,IAAfV,EAAIe,SACbf,EAAIK,iBACJvC,EAAGwC,OAAOI,EAAIV,EAAIW,aAOvBzD,EAAEyC,KAAKrD,KAAKO,MAAOP,KAAKmD,QAAQ5C,OAChCK,EAAEyC,KAAKrD,KAAKO,MAAM0D,KAAMjE,KAAKmD,QAAQc,MACrCrD,EAAEyC,KAAKrD,KAAK4C,GAAI5C,KAAKmD,QAAQP,IAEzB5C,KAAKO,MAAMmE,aAAa,SAC3B1E,KAAK2E,KAAO,IAAM3E,KAAKO,MAAMC,aAAa,QAC1CR,KAAKO,MAAMqE,gBAAgB,SAG3B5E,KAAK2E,KAAO3E,KAAKO,MAAMC,aAAa,cAAgBb,EAAEgF,SAGvDpD,EAAEsD,IAAIC,KAAK9E,MAGZuB,GAAEwD,WACDJ,GAAIA,MAAKA,GACR,GAAI/E,MAAMC,QAAQ8E,GACjB3E,KAAKgF,MAAQL,MAET,IAAoB,gBAATA,IAAqBA,EAAKM,QAAQ,MAAQ,EACxDjF,KAAKgF,MAAQL,EAAKO,MAAM,eAKzB,KAFAP,EAAO/D,EAAE+D,KAEGA,EAAKQ,SAAU,CAC1B,GAAIC,KACJlE,GAAMmE,MAAMV,EAAKQ,UAAU7D,QAAQ,SAAUgE,GAC5C,IAAKA,EAAGC,SAAU,CACjB,GAAIC,GAAOF,EAAGG,YAAYC,OACtB3F,EAAQuF,EAAGvF,OAASyF,EACpB1F,EAAQwF,EAAGxF,OAAS0F,CACV,MAAVzF,GACHqF,EAAMN,MAAOhF,MAAOA,EAAOC,MAAOA,OAIrCC,KAAKgF,MAAQI,EAIXrE,SAAS4E,gBAAkB3F,KAAKO,OACnCP,KAAKoD,YAIPU,GAAIA,YACH,MAAO9D,MAAKuC,OAAS,GAGtBsB,GAAIA,UACH,MAAO7D,MAAKyB,UAGb8B,MAAO,SAAU5D,GACXK,KAAK6D,SAIV7D,KAAK4C,GAAGlB,aAAa,SAAU,IAC/B1B,KAAKyB,UAAW,EAChBzB,KAAKuC,OAAS,EAEd3B,EAAEgF,KAAK5F,KAAKO,MAAO,oBAAqBZ,SAGzCkG,KAAM,WACL7F,KAAK4C,GAAGgC,gBAAgB,UACxB5E,KAAKyB,UAAW,EAEZzB,KAAK6B,YAA6B,IAAhB7B,KAAKuC,OAC1BvC,KAAK8F,KAAK,GAGXlF,EAAEgF,KAAK5F,KAAKO,MAAO,qBAGpBwF,QAAS,WAERnF,EAAEoF,OAAOhG,KAAKO,MAAOP,KAAKmD,QAAQ5C,OAClCK,EAAEoF,OAAOhG,KAAKO,MAAM0D,KAAMjE,KAAKmD,QAAQc,KAGvC,IAAIO,GAAaxE,KAAKwC,UAAUgC,UAEhCA,GAAWyB,aAAajG,KAAKO,MAAOP,KAAKwC,WACzCgC,EAAW0B,YAAYlG,KAAKwC,WAG5BxC,KAAKO,MAAMqE,gBAAgB,gBAC3B5E,KAAKO,MAAMqE,gBAAgB,oBAG3B,IAAIuB,GAAqB5E,EAAEsD,IAAII,QAAQjF,OAEX,IAAxBmG,GACH5E,EAAEsD,IAAIuB,OAAOD,EAAoB,IAInCE,KAAM,WACL,GAAIC,GAAQtG,KAAK4C,GAAGuC,SAASoB,MAC7BvG,MAAK8F,KAAK9F,KAAKuC,MAAQ+D,EAAQ,EAAItG,KAAKuC,MAAQ,EAAK+D,EAAQ,GAAK,IAGnEE,SAAU,WACT,GAAIF,GAAQtG,KAAK4C,GAAGuC,SAASoB,OACzBE,EAAMzG,KAAKuC,MAAQ,CAEvBvC,MAAK8F,KAAK9F,KAAK8D,WAAqB,IAAT2C,EAAaA,EAAMH,EAAQ,IAIvDR,KAAM,SAAU1F,GACf,GAAIsG,GAAM1G,KAAK4C,GAAGuC,QAEdnF,MAAK8D,UACR4C,EAAI1G,KAAKuC,OAAOb,aAAa,gBAAiB,SAG/C1B,KAAKuC,MAAQnC,EAETA,GAAK,GAAKsG,EAAIH,OAAS,IAC1BG,EAAItG,GAAGsB,aAAa,gBAAiB,QACrC1B,KAAK+C,OAAO0C,YAAciB,EAAItG,GAAGqF,YAGjCzF,KAAK4C,GAAG+D,UAAYD,EAAItG,GAAGwG,UAAY5G,KAAK4C,GAAGiE,aAAeH,EAAItG,GAAGyG,aAErEjG,EAAEgF,KAAK5F,KAAKO,MAAO,yBAClBiF,KAAMxF,KAAK8G,YAAY9G,KAAKuC,WAK/ByB,OAAQ,SAAUF,EAAUiD,GAO3B,GANIjD,EACH9D,KAAKuC,MAAQ3B,EAAEoG,aAAalD,GAE5BA,EAAW9D,KAAK4C,GAAGuC,SAASnF,KAAKuC,OAG9BuB,EAAU,CACb,GAAImD,GAAajH,KAAK8G,YAAY9G,KAAKuC,MAEzB3B,GAAEgF,KAAK5F,KAAKO,MAAO,sBAChCiF,KAAMyB,EACNF,OAAQA,GAAUjD,MAIlB9D,KAAKqC,QAAQ4E,GACbjH,KAAKuD,OAAQC,OAAQ,WACrB5C,EAAEgF,KAAK5F,KAAKO,MAAO,8BAClBiF,KAAMyB,OAMV7D,SAAU,WACT,GAAI5B,GAAKxB,KACLD,EAAQC,KAAKO,MAAMR,KAEnBA,GAAMwG,QAAUvG,KAAK2B,UAAY3B,KAAKgF,MAAMuB,OAAS,GACxDvG,KAAKuC,OAAS,EAEdvC,KAAK4C,GAAGsE,UAAY,GAEpBlH,KAAK8G,YAAc9G,KAAKgF,MACtBmC,IAAI,SAAShF,GACb,MAAO,IAAI1C,GAAW+B,EAAG9B,KAAKyC,EAAMpC,MAEpCgC,OAAO,SAASI,GAChB,MAAOX,GAAGO,OAAOI,EAAMpC,MAGP,IAAdC,KAAKiC,OACRjC,KAAK8G,YAAc9G,KAAK8G,YAAY7E,KAAKjC,KAAKiC,OAG/CjC,KAAK8G,YAAc9G,KAAK8G,YAAY5F,MAAM,EAAGlB,KAAK4B,UAElD5B,KAAK8G,YAAYxF,QAAQ,SAASkE,GAChChE,EAAGoB,GAAGwE,YAAY5F,EAAGW,KAAKqD,EAAMzF,MAGF,IAA5BC,KAAK4C,GAAGuC,SAASoB,OACpBvG,KAAKuD,OAAQC,OAAQ,cAErBxD,KAAK6F,QAIN7F,KAAKuD,OAAQC,OAAQ,gBAOxBjC,EAAEsD,OAEFtD,EAAES,gBAAkB,SAAUwD,EAAMjF,GACnC,MAAO8G,QAAOzG,EAAE0G,aAAa/G,EAAMmF,QAAS,KAAKpB,KAAKkB,IAGvDjE,EAAEgG,kBAAoB,SAAU/B,EAAMjF,GACrC,MAAO8G,QAAO,IAAMzG,EAAE0G,aAAa/G,EAAMmF,QAAS,KAAKpB,KAAKkB,IAG7DjE,EAAEW,cAAgB,SAAUsF,EAAGC,GAC9B,MAAID,GAAEjB,SAAWkB,EAAElB,OACXiB,EAAEjB,OAASkB,EAAElB,OAGdiB,EAAIC,GAAI,EAAI,GAGpBlG,EAAEa,KAAO,SAAUoD,EAAMjF,GAExB,MAAOK,GAAE6B,OAAO,MACfyE,UAF2B,KAAjB3G,EAAMmF,OAAgBF,EAAOA,EAAKnD,QAAQgF,OAAOzG,EAAE0G,aAAa/G,EAAMmF,QAAS,MAAO,mBAGhGgC,gBAAiB,WAInBnG,EAAEe,QAAU,SAAUkD,GACrBxF,KAAKO,MAAMR,MAAQyF,EAAKzF,OAGzBwB,EAAEO,KAAO,SAAUK,GAAmB,MAAOA,IAY7CwF,OAAOC,eAAenI,EAAWsF,UAAY4C,OAAOlF,OAAOoF,OAAO9C,WAAY,UAC7E+C,IAAK,WAAa,MAAO9H,MAAKF,MAAMyG,UAErC9G,EAAWsF,UAAUgD,SAAWtI,EAAWsF,UAAUiD,QAAU,WAC9D,MAAO,GAAKhI,KAAKF,MA6BlB,IAAIoB,GAAQtB,MAAMmF,UAAU7D,KAU5BN,GAAE6B,OAAS,SAASwF,EAAKtI,GACxB,GAAIuI,GAAUnH,SAASoH,cAAcF,EAErC,KAAK,GAAI7H,KAAKT,GAAG,CAChB,GAAIyI,GAAMzI,EAAES,EAEZ,IAAU,WAANA,EACHQ,EAAEwH,GAAKhB,YAAYc,OAEf,IAAU,WAAN9H,EAAgB,CACxB,GAAIiI,GAAMzH,EAAEwH,EACZC,GAAI7D,WAAWyB,aAAaiC,EAASG,GACrCH,EAAQd,YAAYiB,OAEZjI,KAAK8H,GACbA,EAAQ9H,GAAKgI,EAGbF,EAAQxG,aAAatB,EAAGgI,GAI1B,MAAOF,IAGRtH,EAAEyC,KAAO,SAAS6E,EAASvI,GAC1B,GAAIuI,EACH,IAAK,GAAII,KAAS3I,GAAG,CACpB,GAAI4I,GAAW5I,EAAE2I,EAEjBA,GAAMpD,MAAM,OAAO5D,QAAQ,SAAUgH,GACpCJ,EAAQM,iBAAiBF,EAAOC,OAMpC3H,EAAEoF,OAAS,SAASkC,EAASvI,GAC5B,GAAIuI,EACH,IAAK,GAAII,KAAS3I,GAAG,CACpB,GAAI4I,GAAW5I,EAAE2I,EAEjBA,GAAMpD,MAAM,OAAO5D,QAAQ,SAASgH,GACnCJ,EAAQO,oBAAoBH,EAAOC,OAMvC3H,EAAEgF,KAAO,SAASvB,EAAQqE,EAAMvI,GAC/B,GAAIuD,GAAM3C,SAAS4H,YAAY,aAE/BjF,GAAIkF,UAAUF,GAAM,GAAM,EAE1B,KAAK,GAAIG,KAAK1I,GACbuD,EAAImF,GAAK1I,EAAW0I,EAGrB,OAAOxE,GAAOyE,cAAcpF,IAG7B9C,EAAE0G,aAAe,SAAUyB,GAC1B,MAAOA,GAAE1G,QAAQ,uBAAwB,SAG1CzB,EAAEoG,aAAe,SAAU1B,GAE1B,IAAK,GAAIlF,GAAI,EAAGkF,EAAKA,EAAG0D,uBAAwB5I,KAChD,MAAOA,IAYgB,mBAAb6I,YAEkB,YAAxBlI,SAASmI,WACZ7H,IAIAN,SAASyH,iBAAiB,mBAAoBnH,IAIhDE,EAAEX,EAAIA,EACNW,EAAEN,GAAKA,EAGa,mBAATkI,QACVA,KAAKC,YAAc7H,GAIE,gBAAX8H,SAAuBA,OAAOC,UACxCD,OAAOC,QAAU/H","file":"awesomplete.min.js","sourcesContent":["/**\n * Simple, lightweight, usable local autocomplete library for modern browsers\n * Because there weren’t enough autocomplete scripts in the world? Because I’m completely insane and have NIH syndrome? Probably both. :P\n * @author Lea Verou http://leaverou.github.io/awesomplete\n * MIT license\n */\n\n(function () {\n\nvar _ = function (input, o) {\n\tvar me = this;\n\n\t// Setup\n\n\tthis.isOpened = false;\n\n\tthis.input = $(input);\n\tthis.input.setAttribute(\"autocomplete\", \"off\");\n\tthis.input.setAttribute(\"aria-autocomplete\", \"list\");\n\n\to = o || {};\n\n\tconfigure(this, {\n\t\tminChars: 2,\n\t\tmaxItems: 10,\n\t\tautoFirst: false,\n\t\tdata: _.DATA,\n\t\tfilter: _.FILTER_CONTAINS,\n\t\tsort: o.sort === false ? false : _.SORT_BYLENGTH,\n\t\titem: _.ITEM,\n\t\treplace: _.REPLACE\n\t}, o);\n\n\tthis.index = -1;\n\n\t// Create necessary elements\n\n\tthis.container = $.create(\"div\", {\n\t\tclassName: \"awesomplete\",\n\t\taround: input\n\t});\n\n\tthis.ul = $.create(\"ul\", {\n\t\thidden: \"hidden\",\n\t\tinside: this.container\n\t});\n\n\tthis.status = $.create(\"span\", {\n\t\tclassName: \"visually-hidden\",\n\t\trole: \"status\",\n\t\t\"aria-live\": \"assertive\",\n\t\t\"aria-relevant\": \"additions\",\n\t\tinside: this.container\n\t});\n\n\t// Bind events\n\n\tthis._events = {\n\t\tinput: {\n\t\t\t\"input\": this.evaluate.bind(this),\n\t\t\t\"blur\": this.close.bind(this, { reason: \"blur\" }),\n\t\t\t\"keydown\": function(evt) {\n\t\t\t\tvar c = evt.keyCode;\n\n\t\t\t\t// If the dropdown `ul` is in view, then act on keydown for the following keys:\n\t\t\t\t// Enter / Esc / Up / Down\n\t\t\t\tif(me.opened) {\n\t\t\t\t\tif (c === 13 && me.selected) { // Enter\n\t\t\t\t\t\tevt.preventDefault();\n\t\t\t\t\t\tme.select();\n\t\t\t\t\t}\n\t\t\t\t\telse if (c === 27) { // Esc\n\t\t\t\t\t\tme.close({ reason: \"esc\" });\n\t\t\t\t\t}\n\t\t\t\t\telse if (c === 38 || c === 40) { // Down/Up arrow\n\t\t\t\t\t\tevt.preventDefault();\n\t\t\t\t\t\tme[c === 38? \"previous\" : \"next\"]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tform: {\n\t\t\t\"submit\": this.close.bind(this, { reason: \"submit\" })\n\t\t},\n\t\tul: {\n\t\t\t\"mousedown\": function(evt) {\n\t\t\t\tvar li = evt.target;\n\n\t\t\t\tif (li !== this) {\n\n\t\t\t\t\twhile (li && !/li/i.test(li.nodeName)) {\n\t\t\t\t\t\tli = li.parentNode;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (li && evt.button === 0) { // Only select on left click\n\t\t\t\t\t\tevt.preventDefault();\n\t\t\t\t\t\tme.select(li, evt.target);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t$.bind(this.input, this._events.input);\n\t$.bind(this.input.form, this._events.form);\n\t$.bind(this.ul, this._events.ul);\n\n\tif (this.input.hasAttribute(\"list\")) {\n\t\tthis.list = \"#\" + this.input.getAttribute(\"list\");\n\t\tthis.input.removeAttribute(\"list\");\n\t}\n\telse {\n\t\tthis.list = this.input.getAttribute(\"data-list\") || o.list || [];\n\t}\n\n\t_.all.push(this);\n};\n\n_.prototype = {\n\tset list(list) {\n\t\tif (Array.isArray(list)) {\n\t\t\tthis._list = list;\n\t\t}\n\t\telse if (typeof list === \"string\" && list.indexOf(\",\") > -1) {\n\t\t\t\tthis._list = list.split(/\\s*,\\s*/);\n\t\t}\n\t\telse { // Element or CSS selector\n\t\t\tlist = $(list);\n\n\t\t\tif (list && list.children) {\n\t\t\t\tvar items = [];\n\t\t\t\tslice.apply(list.children).forEach(function (el) {\n\t\t\t\t\tif (!el.disabled) {\n\t\t\t\t\t\tvar text = el.textContent.trim();\n\t\t\t\t\t\tvar value = el.value || text;\n\t\t\t\t\t\tvar label = el.label || text;\n\t\t\t\t\t\tif (value !== \"\") {\n\t\t\t\t\t\t\titems.push({ label: label, value: value });\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tthis._list = items;\n\t\t\t}\n\t\t}\n\n\t\tif (document.activeElement === this.input) {\n\t\t\tthis.evaluate();\n\t\t}\n\t},\n\n\tget selected() {\n\t\treturn this.index > -1;\n\t},\n\n\tget opened() {\n\t\treturn this.isOpened;\n\t},\n\n\tclose: function (o) {\n\t\tif (!this.opened) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.ul.setAttribute(\"hidden\", \"\");\n\t\tthis.isOpened = false;\n\t\tthis.index = -1;\n\n\t\t$.fire(this.input, \"awesomplete-close\", o || {});\n\t},\n\n\topen: function () {\n\t\tthis.ul.removeAttribute(\"hidden\");\n\t\tthis.isOpened = true;\n\n\t\tif (this.autoFirst && this.index === -1) {\n\t\t\tthis.goto(0);\n\t\t}\n\n\t\t$.fire(this.input, \"awesomplete-open\");\n\t},\n\n\tdestroy: function() {\n\t\t//remove events from the input and its form\n\t\t$.unbind(this.input, this._events.input);\n\t\t$.unbind(this.input.form, this._events.form);\n\n\t\t//move the input out of the awesomplete container and remove the container and its children\n\t\tvar parentNode = this.container.parentNode;\n\n\t\tparentNode.insertBefore(this.input, this.container);\n\t\tparentNode.removeChild(this.container);\n\n\t\t//remove autocomplete and aria-autocomplete attributes\n\t\tthis.input.removeAttribute(\"autocomplete\");\n\t\tthis.input.removeAttribute(\"aria-autocomplete\");\n\n\t\t//remove this awesomeplete instance from the global array of instances\n\t\tvar indexOfAwesomplete = _.all.indexOf(this);\n\n\t\tif (indexOfAwesomplete !== -1) {\n\t\t\t_.all.splice(indexOfAwesomplete, 1);\n\t\t}\n\t},\n\n\tnext: function () {\n\t\tvar count = this.ul.children.length;\n\t\tthis.goto(this.index < count - 1 ? this.index + 1 : (count ? 0 : -1) );\n\t},\n\n\tprevious: function () {\n\t\tvar count = this.ul.children.length;\n\t\tvar pos = this.index - 1;\n\n\t\tthis.goto(this.selected && pos !== -1 ? pos : count - 1);\n\t},\n\n\t// Should not be used, highlights specific item without any checks!\n\tgoto: function (i) {\n\t\tvar lis = this.ul.children;\n\n\t\tif (this.selected) {\n\t\t\tlis[this.index].setAttribute(\"aria-selected\", \"false\");\n\t\t}\n\n\t\tthis.index = i;\n\n\t\tif (i > -1 && lis.length > 0) {\n\t\t\tlis[i].setAttribute(\"aria-selected\", \"true\");\n\t\t\tthis.status.textContent = lis[i].textContent;\n\n\t\t\t// scroll to highlighted element in case parent's height is fixed\n\t\t\tthis.ul.scrollTop = lis[i].offsetTop - this.ul.clientHeight + lis[i].clientHeight;\n\n\t\t\t$.fire(this.input, \"awesomplete-highlight\", {\n\t\t\t\ttext: this.suggestions[this.index]\n\t\t\t});\n\t\t}\n\t},\n\n\tselect: function (selected, origin) {\n\t\tif (selected) {\n\t\t\tthis.index = $.siblingIndex(selected);\n\t\t} else {\n\t\t\tselected = this.ul.children[this.index];\n\t\t}\n\n\t\tif (selected) {\n\t\t\tvar suggestion = this.suggestions[this.index];\n\n\t\t\tvar allowed = $.fire(this.input, \"awesomplete-select\", {\n\t\t\t\ttext: suggestion,\n\t\t\t\torigin: origin || selected\n\t\t\t});\n\n\t\t\tif (allowed) {\n\t\t\t\tthis.replace(suggestion);\n\t\t\t\tthis.close({ reason: \"select\" });\n\t\t\t\t$.fire(this.input, \"awesomplete-selectcomplete\", {\n\t\t\t\t\ttext: suggestion\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t},\n\n\tevaluate: function() {\n\t\tvar me = this;\n\t\tvar value = this.input.value;\n\n\t\tif (value.length >= this.minChars && this._list.length > 0) {\n\t\t\tthis.index = -1;\n\t\t\t// Populate list with options that match\n\t\t\tthis.ul.innerHTML = \"\";\n\n\t\t\tthis.suggestions = this._list\n\t\t\t\t.map(function(item) {\n\t\t\t\t\treturn new Suggestion(me.data(item, value));\n\t\t\t\t})\n\t\t\t\t.filter(function(item) {\n\t\t\t\t\treturn me.filter(item, value);\n\t\t\t\t});\n\n\t\t\tif (this.sort !== false) {\n\t\t\t\tthis.suggestions = this.suggestions.sort(this.sort);\n\t\t\t}\n\n\t\t\tthis.suggestions = this.suggestions.slice(0, this.maxItems);\n\n\t\t\tthis.suggestions.forEach(function(text) {\n\t\t\t\t\tme.ul.appendChild(me.item(text, value));\n\t\t\t\t});\n\n\t\t\tif (this.ul.children.length === 0) {\n\t\t\t\tthis.close({ reason: \"nomatches\" });\n\t\t\t} else {\n\t\t\t\tthis.open();\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tthis.close({ reason: \"nomatches\" });\n\t\t}\n\t}\n};\n\n// Static methods/properties\n\n_.all = [];\n\n_.FILTER_CONTAINS = function (text, input) {\n\treturn RegExp($.regExpEscape(input.trim()), \"i\").test(text);\n};\n\n_.FILTER_STARTSWITH = function (text, input) {\n\treturn RegExp(\"^\" + $.regExpEscape(input.trim()), \"i\").test(text);\n};\n\n_.SORT_BYLENGTH = function (a, b) {\n\tif (a.length !== b.length) {\n\t\treturn a.length - b.length;\n\t}\n\n\treturn a < b? -1 : 1;\n};\n\n_.ITEM = function (text, input) {\n\tvar html = input.trim() === \"\" ? text : text.replace(RegExp($.regExpEscape(input.trim()), \"gi\"), \"$&\");\n\treturn $.create(\"li\", {\n\t\tinnerHTML: html,\n\t\t\"aria-selected\": \"false\"\n\t});\n};\n\n_.REPLACE = function (text) {\n\tthis.input.value = text.value;\n};\n\n_.DATA = function (item/*, input*/) { return item; };\n\n// Private functions\n\nfunction Suggestion(data) {\n\tvar o = Array.isArray(data)\n\t ? { label: data[0], value: data[1] }\n\t : typeof data === \"object\" && \"label\" in data && \"value\" in data ? data : { label: data, value: data };\n\n\tthis.label = o.label || o.value;\n\tthis.value = o.value;\n}\nObject.defineProperty(Suggestion.prototype = Object.create(String.prototype), \"length\", {\n\tget: function() { return this.label.length; }\n});\nSuggestion.prototype.toString = Suggestion.prototype.valueOf = function () {\n\treturn \"\" + this.label;\n};\n\nfunction configure(instance, properties, o) {\n\tfor (var i in properties) {\n\t\tvar initial = properties[i],\n\t\t attrValue = instance.input.getAttribute(\"data-\" + i.toLowerCase());\n\n\t\tif (typeof initial === \"number\") {\n\t\t\tinstance[i] = parseInt(attrValue);\n\t\t}\n\t\telse if (initial === false) { // Boolean options must be false by default anyway\n\t\t\tinstance[i] = attrValue !== null;\n\t\t}\n\t\telse if (initial instanceof Function) {\n\t\t\tinstance[i] = null;\n\t\t}\n\t\telse {\n\t\t\tinstance[i] = attrValue;\n\t\t}\n\n\t\tif (!instance[i] && instance[i] !== 0) {\n\t\t\tinstance[i] = (i in o)? o[i] : initial;\n\t\t}\n\t}\n}\n\n// Helpers\n\nvar slice = Array.prototype.slice;\n\nfunction $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nfunction $$(expr, con) {\n\treturn slice.call((con || document).querySelectorAll(expr));\n}\n\n$.create = function(tag, o) {\n\tvar element = document.createElement(tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\t\t}\n\t\telse if (i in element) {\n\t\t\telement[i] = val;\n\t\t}\n\t\telse {\n\t\t\telement.setAttribute(i, val);\n\t\t}\n\t}\n\n\treturn element;\n};\n\n$.bind = function(element, o) {\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function (event) {\n\t\t\t\telement.addEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n};\n\n$.unbind = function(element, o) {\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function(event) {\n\t\t\t\telement.removeEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n};\n\n$.fire = function(target, type, properties) {\n\tvar evt = document.createEvent(\"HTMLEvents\");\n\n\tevt.initEvent(type, true, true );\n\n\tfor (var j in properties) {\n\t\tevt[j] = properties[j];\n\t}\n\n\treturn target.dispatchEvent(evt);\n};\n\n$.regExpEscape = function (s) {\n\treturn s.replace(/[-\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n};\n\n$.siblingIndex = function (el) {\n\t/* eslint-disable no-cond-assign */\n\tfor (var i = 0; el = el.previousElementSibling; i++);\n\treturn i;\n};\n\n// Initialization\n\nfunction init() {\n\t$$(\"input.awesomplete\").forEach(function (input) {\n\t\tnew _(input);\n\t});\n}\n\n// Are we in a browser? Check for Document constructor\nif (typeof Document !== \"undefined\") {\n\t// DOM already loaded?\n\tif (document.readyState !== \"loading\") {\n\t\tinit();\n\t}\n\telse {\n\t\t// Wait for it\n\t\tdocument.addEventListener(\"DOMContentLoaded\", init);\n\t}\n}\n\n_.$ = $;\n_.$$ = $$;\n\n// Make sure to export Awesomplete on self when in a browser\nif (typeof self !== \"undefined\") {\n\tself.Awesomplete = _;\n}\n\n// Expose Awesomplete as a CJS module\nif (typeof module === \"object\" && module.exports) {\n\tmodule.exports = _;\n}\n\nreturn _;\n\n}());\n"]} \ No newline at end of file +{"version":3,"sources":["awesomplete.js"],"names":["Suggestion","data","o","Array","isArray","label","value","this","configure","instance","properties","i","initial","attrValue","input","getAttribute","toLowerCase","parseInt","Function","$","expr","con","document","querySelector","$$","slice","call","querySelectorAll","init","forEach","_","me","isOpened","setAttribute","minChars","maxItems","autoFirst","DATA","filter","FILTER_CONTAINS","sort","SORT_BYLENGTH","item","ITEM","replace","REPLACE","listContainer","CONTAINER","index","container","create","className","around","ul","hidden","inside","status","role","aria-live","aria-relevant","_events","evaluate","bind","blur","close","reason","keydown","evt","c","keyCode","opened","selected","preventDefault","select","form","submit","mousedown","li","target","test","nodeName","parentNode","button","hasAttribute","list","removeAttribute","all","push","prototype","_list","indexOf","split","children","items","apply","el","disabled","text","textContent","trim","activeElement","fire","open","boundingRect","getBoundingClientRect","style","top","height","left","width","goto","destroy","unbind","insertBefore","removeChild","indexOfAwesomplete","splice","next","count","length","previous","pos","lis","scrollTop","offsetTop","clientHeight","suggestions","origin","siblingIndex","suggestion","innerHTML","map","appendChild","RegExp","regExpEscape","FILTER_STARTSWITH","a","b","aria-selected","Object","defineProperty","String","get","toString","valueOf","tag","element","createElement","val","ref","event","callback","addEventListener","removeEventListener","type","createEvent","initEvent","j","dispatchEvent","s","previousElementSibling","Document","readyState","self","Awesomplete","module","exports"],"mappings":"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","file":"awesomplete.min.js","sourcesContent":["/**\r\n * Simple, lightweight, usable local autocomplete library for modern browsers\r\n * Because there weren’t enough autocomplete scripts in the world? Because I’m completely insane and have NIH syndrome? Probably both. :P\r\n * @author Lea Verou http://leaverou.github.io/awesomplete\r\n * MIT license\r\n */\r\n\r\n(function () {\r\n\r\nvar _ = function (input, o) {\r\n\tvar me = this;\r\n\r\n\t// Setup\r\n\r\n\tthis.isOpened = false;\r\n\r\n\tthis.input = $(input);\r\n\tthis.input.setAttribute(\"autocomplete\", \"off\");\r\n\tthis.input.setAttribute(\"aria-autocomplete\", \"list\");\r\n\r\n\to = o || {};\r\n\r\n\tconfigure(this, {\r\n\t\tminChars: 2,\r\n\t\tmaxItems: 10,\r\n\t\tautoFirst: false,\r\n\t\tdata: _.DATA,\r\n\t\tfilter: _.FILTER_CONTAINS,\r\n\t\tsort: o.sort === false ? false : _.SORT_BYLENGTH,\r\n\t\titem: _.ITEM,\r\n\t\treplace: _.REPLACE,\r\n\t\tlistContainer: _.CONTAINER\r\n\t}, o);\r\n\r\n\tthis.index = -1;\r\n\r\n\t// Create necessary elements\r\n\r\n\tthis.container = $.create(\"div\", {\r\n\t\tclassName: \"awesomplete\",\r\n\t\taround: input\r\n\t});\r\n\r\n\tthis.ul = $.create(\"ul\", {\r\n\t\thidden: \"hidden\",\r\n\t\tclassName: \"awesomplete-suggestion-list\",\r\n\t\tinside: me.listContainer === _.CONTAINER ? me.container : me.listContainer\r\n\t});\r\n\r\n\tthis.status = $.create(\"span\", {\r\n\t\tclassName: \"visually-hidden\",\r\n\t\trole: \"status\",\r\n\t\t\"aria-live\": \"assertive\",\r\n\t\t\"aria-relevant\": \"additions\",\r\n\t\tinside: this.container\r\n\t});\r\n\r\n\t// Bind events\r\n\r\n\tthis._events = {\r\n\t\tinput: {\r\n\t\t\t\"input\": this.evaluate.bind(this),\r\n\t\t\t\"blur\": this.close.bind(this, { reason: \"blur\" }),\r\n\t\t\t\"keydown\": function(evt) {\r\n\t\t\t\tvar c = evt.keyCode;\r\n\r\n\t\t\t\t// If the dropdown `ul` is in view, then act on keydown for the following keys:\r\n\t\t\t\t// Enter / Esc / Up / Down\r\n\t\t\t\tif(me.opened) {\r\n\t\t\t\t\tif (c === 13 && me.selected) { // Enter\r\n\t\t\t\t\t\tevt.preventDefault();\r\n\t\t\t\t\t\tme.select();\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (c === 27) { // Esc\r\n\t\t\t\t\t\tme.close({ reason: \"esc\" });\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (c === 38 || c === 40) { // Down/Up arrow\r\n\t\t\t\t\t\tevt.preventDefault();\r\n\t\t\t\t\t\tme[c === 38? \"previous\" : \"next\"]();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\tform: {\r\n\t\t\t\"submit\": this.close.bind(this, { reason: \"submit\" })\r\n\t\t},\r\n\t\tul: {\r\n\t\t\t\"mousedown\": function(evt) {\r\n\t\t\t\tvar li = evt.target;\r\n\r\n\t\t\t\tif (li !== this) {\r\n\r\n\t\t\t\t\twhile (li && !/li/i.test(li.nodeName)) {\r\n\t\t\t\t\t\tli = li.parentNode;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (li && evt.button === 0) { // Only select on left click\r\n\t\t\t\t\t\tevt.preventDefault();\r\n\t\t\t\t\t\tme.select(li, evt.target);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\t$.bind(this.input, this._events.input);\r\n\t$.bind(this.input.form, this._events.form);\r\n\t$.bind(this.ul, this._events.ul);\r\n\r\n\tif (this.input.hasAttribute(\"list\")) {\r\n\t\tthis.list = \"#\" + this.input.getAttribute(\"list\");\r\n\t\tthis.input.removeAttribute(\"list\");\r\n\t}\r\n\telse {\r\n\t\tthis.list = this.input.getAttribute(\"data-list\") || o.list || [];\r\n\t}\r\n\r\n\t_.all.push(this);\r\n};\r\n\r\n_.prototype = {\r\n\tset list(list) {\r\n\t\tif (Array.isArray(list)) {\r\n\t\t\tthis._list = list;\r\n\t\t}\r\n\t\telse if (typeof list === \"string\" && list.indexOf(\",\") > -1) {\r\n\t\t\t\tthis._list = list.split(/\\s*,\\s*/);\r\n\t\t}\r\n\t\telse { // Element or CSS selector\r\n\t\t\tlist = $(list);\r\n\r\n\t\t\tif (list && list.children) {\r\n\t\t\t\tvar items = [];\r\n\t\t\t\tslice.apply(list.children).forEach(function (el) {\r\n\t\t\t\t\tif (!el.disabled) {\r\n\t\t\t\t\t\tvar text = el.textContent.trim();\r\n\t\t\t\t\t\tvar value = el.value || text;\r\n\t\t\t\t\t\tvar label = el.label || text;\r\n\t\t\t\t\t\tif (value !== \"\") {\r\n\t\t\t\t\t\t\titems.push({ label: label, value: value });\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t\tthis._list = items;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (document.activeElement === this.input) {\r\n\t\t\tthis.evaluate();\r\n\t\t}\r\n\t},\r\n\r\n\tget selected() {\r\n\t\treturn this.index > -1;\r\n\t},\r\n\r\n\tget opened() {\r\n\t\treturn this.isOpened;\r\n\t},\r\n\r\n\tclose: function (o) {\r\n\t\tif (!this.opened) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.ul.setAttribute(\"hidden\", \"\");\r\n\t\tthis.isOpened = false;\r\n\t\tthis.index = -1;\r\n\r\n\t\t$.fire(this.input, \"awesomplete-close\", o || {});\r\n\t},\r\n\r\n\topen: function () {\r\n\t\tif (this.listContainer !== _.CONTAINER) {\r\n\t\t\t// In case the suggestion list is out of the container, \r\n\t\t\t// get the bounding information of the container to set the position of the suggestion list below\r\n\t\t\tvar boundingRect = this.container.getBoundingClientRect()\r\n\t\t\tthis.ul.style.top = (boundingRect.top + boundingRect.height) + 'px';\r\n\t\t\tthis.ul.style.left = boundingRect.left + 'px';\r\n\t\t\tthis.ul.style['min-width'] = boundingRect.width + 'px';\r\n\t\t}\r\n\t\tthis.ul.removeAttribute(\"hidden\");\r\n\r\n\t\tthis.isOpened = true;\r\n\r\n\t\tif (this.autoFirst && this.index === -1) {\r\n\t\t\tthis.goto(0);\r\n\t\t}\r\n\r\n\t\t$.fire(this.input, \"awesomplete-open\");\r\n\t},\r\n\r\n\tdestroy: function() {\r\n\t\t//remove events from the input and its form\r\n\t\t$.unbind(this.input, this._events.input);\r\n\t\t$.unbind(this.input.form, this._events.form);\r\n\r\n\t\t//move the input out of the awesomplete container and remove the container and its children\r\n\t\tvar parentNode = this.container.parentNode;\r\n\r\n\t\tparentNode.insertBefore(this.input, this.container);\r\n\t\tparentNode.removeChild(this.container);\r\n\r\n\t\t//remove autocomplete and aria-autocomplete attributes\r\n\t\tthis.input.removeAttribute(\"autocomplete\");\r\n\t\tthis.input.removeAttribute(\"aria-autocomplete\");\r\n\r\n\t\t//remove this awesomeplete instance from the global array of instances\r\n\t\tvar indexOfAwesomplete = _.all.indexOf(this);\r\n\r\n\t\tif (indexOfAwesomplete !== -1) {\r\n\t\t\t_.all.splice(indexOfAwesomplete, 1);\r\n\t\t}\r\n\t},\r\n\r\n\tnext: function () {\r\n\t\tvar count = this.ul.children.length;\r\n\t\tthis.goto(this.index < count - 1 ? this.index + 1 : (count ? 0 : -1) );\r\n\t},\r\n\r\n\tprevious: function () {\r\n\t\tvar count = this.ul.children.length;\r\n\t\tvar pos = this.index - 1;\r\n\r\n\t\tthis.goto(this.selected && pos !== -1 ? pos : count - 1);\r\n\t},\r\n\r\n\t// Should not be used, highlights specific item without any checks!\r\n\tgoto: function (i) {\r\n\t\tvar lis = this.ul.children;\r\n\r\n\t\tif (this.selected) {\r\n\t\t\tlis[this.index].setAttribute(\"aria-selected\", \"false\");\r\n\t\t}\r\n\r\n\t\tthis.index = i;\r\n\r\n\t\tif (i > -1 && lis.length > 0) {\r\n\t\t\tlis[i].setAttribute(\"aria-selected\", \"true\");\r\n\t\t\tthis.status.textContent = lis[i].textContent;\r\n\r\n\t\t\t// scroll to highlighted element in case parent's height is fixed\r\n\t\t\tthis.ul.scrollTop = lis[i].offsetTop - this.ul.clientHeight + lis[i].clientHeight;\r\n\r\n\t\t\t$.fire(this.input, \"awesomplete-highlight\", {\r\n\t\t\t\ttext: this.suggestions[this.index]\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n\r\n\tselect: function (selected, origin) {\r\n\t\tif (selected) {\r\n\t\t\tthis.index = $.siblingIndex(selected);\r\n\t\t} else {\r\n\t\t\tselected = this.ul.children[this.index];\r\n\t\t}\r\n\r\n\t\tif (selected) {\r\n\t\t\tvar suggestion = this.suggestions[this.index];\r\n\r\n\t\t\tvar allowed = $.fire(this.input, \"awesomplete-select\", {\r\n\t\t\t\ttext: suggestion,\r\n\t\t\t\torigin: origin || selected\r\n\t\t\t});\r\n\r\n\t\t\tif (allowed) {\r\n\t\t\t\tthis.replace(suggestion);\r\n\t\t\t\tthis.close({ reason: \"select\" });\r\n\t\t\t\t$.fire(this.input, \"awesomplete-selectcomplete\", {\r\n\t\t\t\t\ttext: suggestion\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tevaluate: function() {\r\n\t\tvar me = this;\r\n\t\tvar value = this.input.value;\r\n\r\n\t\tif (value.length >= this.minChars && this._list.length > 0) {\r\n\t\t\tthis.index = -1;\r\n\t\t\t// Populate list with options that match\r\n\t\t\tthis.ul.innerHTML = \"\";\r\n\r\n\t\t\tthis.suggestions = this._list\r\n\t\t\t\t.map(function(item) {\r\n\t\t\t\t\treturn new Suggestion(me.data(item, value));\r\n\t\t\t\t})\r\n\t\t\t\t.filter(function(item) {\r\n\t\t\t\t\treturn me.filter(item, value);\r\n\t\t\t\t});\r\n\r\n\t\t\tif (this.sort !== false) {\r\n\t\t\t\tthis.suggestions = this.suggestions.sort(this.sort);\r\n\t\t\t}\r\n\r\n\t\t\tthis.suggestions = this.suggestions.slice(0, this.maxItems);\r\n\r\n\t\t\tthis.suggestions.forEach(function(text) {\r\n\t\t\t\t\tme.ul.appendChild(me.item(text, value));\r\n\t\t\t\t});\r\n\r\n\t\t\tif (this.ul.children.length === 0) {\r\n\t\t\t\tthis.close({ reason: \"nomatches\" });\r\n\t\t\t} else {\r\n\t\t\t\tthis.open();\r\n\t\t\t}\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.close({ reason: \"nomatches\" });\r\n\t\t}\r\n\t}\r\n};\r\n\r\n// Static methods/properties\r\n\r\n_.all = [];\r\n\r\n_.FILTER_CONTAINS = function (text, input) {\r\n\treturn RegExp($.regExpEscape(input.trim()), \"i\").test(text);\r\n};\r\n\r\n_.FILTER_STARTSWITH = function (text, input) {\r\n\treturn RegExp(\"^\" + $.regExpEscape(input.trim()), \"i\").test(text);\r\n};\r\n\r\n_.SORT_BYLENGTH = function (a, b) {\r\n\tif (a.length !== b.length) {\r\n\t\treturn a.length - b.length;\r\n\t}\r\n\r\n\treturn a < b? -1 : 1;\r\n};\r\n\r\n_.ITEM = function (text, input) {\r\n\tvar html = input.trim() === \"\" ? text : text.replace(RegExp($.regExpEscape(input.trim()), \"gi\"), \"$&\");\r\n\treturn $.create(\"li\", {\r\n\t\tinnerHTML: html,\r\n\t\t\"aria-selected\": \"false\"\r\n\t});\r\n};\r\n\r\n_.REPLACE = function (text) {\r\n\tthis.input.value = text.value;\r\n};\r\n\r\n_.CONTAINER = \"container\";\r\n\r\n_.DATA = function (item/*, input*/) { return item; };\r\n\r\n// Private functions\r\n\r\nfunction Suggestion(data) {\r\n\tvar o = Array.isArray(data)\r\n\t ? { label: data[0], value: data[1] }\r\n\t : typeof data === \"object\" && \"label\" in data && \"value\" in data ? data : { label: data, value: data };\r\n\r\n\tthis.label = o.label || o.value;\r\n\tthis.value = o.value;\r\n}\r\nObject.defineProperty(Suggestion.prototype = Object.create(String.prototype), \"length\", {\r\n\tget: function() { return this.label.length; }\r\n});\r\nSuggestion.prototype.toString = Suggestion.prototype.valueOf = function () {\r\n\treturn \"\" + this.label;\r\n};\r\n\r\nfunction configure(instance, properties, o) {\r\n\tfor (var i in properties) {\r\n\t\tvar initial = properties[i],\r\n\t\t attrValue = instance.input.getAttribute(\"data-\" + i.toLowerCase());\r\n\r\n\t\tif (typeof initial === \"number\") {\r\n\t\t\tinstance[i] = parseInt(attrValue);\r\n\t\t}\r\n\t\telse if (initial === false) { // Boolean options must be false by default anyway\r\n\t\t\tinstance[i] = attrValue !== null;\r\n\t\t}\r\n\t\telse if (initial instanceof Function) {\r\n\t\t\tinstance[i] = null;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tinstance[i] = attrValue;\r\n\t\t}\r\n\r\n\t\tif (!instance[i] && instance[i] !== 0) {\r\n\t\t\tinstance[i] = (i in o)? o[i] : initial;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// Helpers\r\n\r\nvar slice = Array.prototype.slice;\r\n\r\nfunction $(expr, con) {\r\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\r\n}\r\n\r\nfunction $$(expr, con) {\r\n\treturn slice.call((con || document).querySelectorAll(expr));\r\n}\r\n\r\n$.create = function(tag, o) {\r\n\tvar element = document.createElement(tag);\r\n\r\n\tfor (var i in o) {\r\n\t\tvar val = o[i];\r\n\r\n\t\tif (i === \"inside\") {\r\n\t\t\t$(val).appendChild(element);\r\n\t\t}\r\n\t\telse if (i === \"around\") {\r\n\t\t\tvar ref = $(val);\r\n\t\t\tref.parentNode.insertBefore(element, ref);\r\n\t\t\telement.appendChild(ref);\r\n\t\t}\r\n\t\telse if (i in element) {\r\n\t\t\telement[i] = val;\r\n\t\t}\r\n\t\telse {\r\n\t\t\telement.setAttribute(i, val);\r\n\t\t}\r\n\t}\r\n\r\n\treturn element;\r\n};\r\n\r\n$.bind = function(element, o) {\r\n\tif (element) {\r\n\t\tfor (var event in o) {\r\n\t\t\tvar callback = o[event];\r\n\r\n\t\t\tevent.split(/\\s+/).forEach(function (event) {\r\n\t\t\t\telement.addEventListener(event, callback);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n};\r\n\r\n$.unbind = function(element, o) {\r\n\tif (element) {\r\n\t\tfor (var event in o) {\r\n\t\t\tvar callback = o[event];\r\n\r\n\t\t\tevent.split(/\\s+/).forEach(function(event) {\r\n\t\t\t\telement.removeEventListener(event, callback);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n};\r\n\r\n$.fire = function(target, type, properties) {\r\n\tvar evt = document.createEvent(\"HTMLEvents\");\r\n\r\n\tevt.initEvent(type, true, true );\r\n\r\n\tfor (var j in properties) {\r\n\t\tevt[j] = properties[j];\r\n\t}\r\n\r\n\treturn target.dispatchEvent(evt);\r\n};\r\n\r\n$.regExpEscape = function (s) {\r\n\treturn s.replace(/[-\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\r\n};\r\n\r\n$.siblingIndex = function (el) {\r\n\t/* eslint-disable no-cond-assign */\r\n\tfor (var i = 0; el = el.previousElementSibling; i++);\r\n\treturn i;\r\n};\r\n\r\n// Initialization\r\n\r\nfunction init() {\r\n\t$$(\"input.awesomplete\").forEach(function (input) {\r\n\t\tnew _(input);\r\n\t});\r\n}\r\n\r\n// Are we in a browser? Check for Document constructor\r\nif (typeof Document !== \"undefined\") {\r\n\t// DOM already loaded?\r\n\tif (document.readyState !== \"loading\") {\r\n\t\tinit();\r\n\t}\r\n\telse {\r\n\t\t// Wait for it\r\n\t\tdocument.addEventListener(\"DOMContentLoaded\", init);\r\n\t}\r\n}\r\n\r\n_.$ = $;\r\n_.$$ = $$;\r\n\r\n// Make sure to export Awesomplete on self when in a browser\r\nif (typeof self !== \"undefined\") {\r\n\tself.Awesomplete = _;\r\n}\r\n\r\n// Expose Awesomplete as a CJS module\r\nif (typeof module === \"object\" && module.exports) {\r\n\tmodule.exports = _;\r\n}\r\n\r\nreturn _;\r\n\r\n}());\r\n"]} \ No newline at end of file diff --git a/awesomplete.theme.css b/awesomplete.theme.css index 8a964f11..78b63051 100644 --- a/awesomplete.theme.css +++ b/awesomplete.theme.css @@ -1,4 +1,5 @@ -.awesomplete > ul { +.awesomplete > ul, +ul.awesomplete-suggestion-list { border-radius: .3em; margin: .2em 0 0; background: hsla(0,0%,100%,.9); @@ -9,13 +10,16 @@ } @supports (transform: scale(0)) { - .awesomplete > ul { + .awesomplete > ul, + ul.awesomplete-suggestion-list { transition: .3s cubic-bezier(.4,.2,.5,1.4); transform-origin: 1.43em -.43em; } .awesomplete > ul[hidden], - .awesomplete > ul:empty { + .awesomplete > ul:empty, + ul.awesomplete-suggestion-list[hidden], + ul.awesomplete-suggestion-list:empty { opacity: 0; transform: scale(0); display: block; @@ -24,7 +28,9 @@ } /* Pointer */ - .awesomplete > ul:before { + + .awesomplete > ul:before, + ul.awesomplete-suggestion-list:before { content: ""; position: absolute; top: -.43em; @@ -39,18 +45,21 @@ transform: rotate(45deg); } - .awesomplete > ul > li { + .awesomplete > ul > li, + ul.awesomplete-suggestion-list > li { position: relative; padding: .2em .5em; cursor: pointer; } - .awesomplete > ul > li:hover { + .awesomplete > ul > li:hover, + ul.awesomplete-suggestion-list > li:hover { background: hsl(200, 40%, 80%); color: black; } - .awesomplete > ul > li[aria-selected="true"] { + .awesomplete > ul >li [aria-selected="true"], + ul.awesomplete-suggestion-list > li[aria-selected="true"] { background: hsl(205, 40%, 40%); color: white; } From de1de89d943e552d42f8d30df7f76354a249b2e1 Mon Sep 17 00:00:00 2001 From: Benjamin Svobodny Date: Sun, 17 Apr 2022 16:00:13 -0400 Subject: [PATCH 02/11] =?UTF-8?q?add=20possibility=20to=20use=20another=20?= =?UTF-8?q?container=20for=20suggestion=20items=20list=20(e=E2=80=A6=20(#2?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + awesomplete.js | 35 +++- awesomplete.min.js | 361 +------------------------------------ awesomplete.min.js.map | 2 +- index.html | 10 +- test/api/evaluateSpec.js | 99 ++++++++++ test/api/openSpec.js | 69 ++++++- test/api/removeSpec.js | 64 ++++++- test/events/scrollSpec.js | 26 +++ test/helpers/unbindSpec.js | 75 ++++++++ 10 files changed, 363 insertions(+), 379 deletions(-) create mode 100644 test/events/scrollSpec.js diff --git a/README.md b/README.md index f925e4ad..7e8b1737 100644 --- a/README.md +++ b/README.md @@ -90,6 +90,7 @@ There are multiple customizations and properties able to be instantiated within | `maxItems` | `data-maxitems` | Maximum number of suggestions to display. | Number | `10` | | `autoFirst` | `data-autofirst` | Should the first element be automatically | Boolean | `false` | | `listLabel` | `data-listlabel` | Denotes a label to be used as aria-label on the generated autocomplete list. | String | Results List | +| `listContainer` | `data-listcontainer` | Optional container where the list will be generated ; ex: `document.body`. | HMTL Element | created by the lib | ## License diff --git a/awesomplete.js b/awesomplete.js index 0bed7d75..6eedf3af 100644 --- a/awesomplete.js +++ b/awesomplete.js @@ -54,9 +54,8 @@ this.ul = $.create("ul", { hidden: "hidden", - className: "awesomplete-suggestion-list", inside: - me.listContainer === _.CONTAINER ? this.container : this.listContainer, + me.listContainer === _.CONTAINER ? me.container : me.listContainer, role: "listbox", id: "awesomplete_list_" + this.count, "aria-label": this.listLabel, @@ -131,11 +130,22 @@ } }, }, + window: { + scroll: function () { + var boundingRect = me.container.getBoundingClientRect(); + me.ul.style.top = boundingRect.top + boundingRect.height + "px"; + me.ul.style.left = boundingRect.left + "px"; + me.ul.style.minWidth = boundingRect.width + "px"; + }, + }, }; $.bind(this.input, this._events.input); $.bind(this.input.form, this._events.form); $.bind(this.ul, this._events.ul); + if (this.listContainer !== _.CONTAINER) { + $.bind(window, this._events.window); + } if (this.input.hasAttribute("list")) { this.list = "#" + this.input.getAttribute("list"); @@ -208,11 +218,13 @@ var boundingRect = this.container.getBoundingClientRect(); this.ul.style.top = boundingRect.top + boundingRect.height + "px"; this.ul.style.left = boundingRect.left + "px"; - this.ul.style["min-width"] = boundingRect.width + "px"; + this.ul.style.position = "fixed"; + this.ul.style.transitionProperty = "height, width, transform"; + this.ul.style.minWidth = boundingRect.width + "px"; + this.ul.className = "awesomplete-suggestion-list"; } this.input.setAttribute("aria-expanded", "true"); this.ul.removeAttribute("hidden"); - this.isOpened = true; this.status.removeAttribute("hidden"); @@ -228,14 +240,21 @@ //remove events from the input and its form $.unbind(this.input, this._events.input); $.unbind(this.input.form, this._events.form); + if (this.listContainer !== _.CONTAINER) { + $.unbind(window, this._events.window); + } // cleanup container if it was created by Awesomplete but leave it alone otherwise if (!this.options.container) { //move the input out of the awesomplete container and remove the container and its children var parentNode = this.container.parentNode; - - parentNode.insertBefore(this.input, this.container); - parentNode.removeChild(this.container); + if (this.listContainer !== _.CONTAINER) { + var ulParentNode = this.ul.parentNode; + ulParentNode.removeChild(this.ul); + } else { + parentNode.insertBefore(this.input, this.container); + parentNode.removeChild(this.container); + } } //remove autocomplete and aria-autocomplete attributes @@ -415,8 +434,6 @@ this.input.value = text.value; }; - _.CONTAINER = "container"; - _.DATA = function (item /*, input*/) { return item; }; diff --git a/awesomplete.min.js b/awesomplete.min.js index 1e785136..7b70c8c0 100644 --- a/awesomplete.min.js +++ b/awesomplete.min.js @@ -1,362 +1,3 @@ // Awesomplete - Lea Verou - MIT license -!(function () { - function t(t) { - var e = Array.isArray(t) - ? { label: t[0], value: t[1] } - : "object" == typeof t && "label" in t && "value" in t - ? t - : { label: t, value: t }; - (this.label = e.label || e.value), (this.value = e.value); - } - function e(t, e, i) { - for (var n in e) { - var s = e[n], - r = t.input.getAttribute("data-" + n.toLowerCase()); - "number" == typeof s - ? (t[n] = parseInt(r)) - : !1 === s - ? (t[n] = null !== r) - : s instanceof Function - ? (t[n] = null) - : (t[n] = r), - t[n] || 0 === t[n] || (t[n] = n in i ? i[n] : s); - } - } - function i(t, e) { - return "string" == typeof t ? (e || document).querySelector(t) : t || null; - } - function n(t, e) { - return o.call((e || document).querySelectorAll(t)); - } - function s() { - n("input.awesomplete").forEach(function (t) { - new r(t); - }); - } - var r = function (t, n) { - var s = this; - (r.count = (r.count || 0) + 1), - (this.count = r.count), - (this.isOpened = !1), - (this.input = i(t)), - this.input.setAttribute("autocomplete", "off"), - this.input.setAttribute("aria-expanded", "false"), - this.input.setAttribute("aria-owns", "awesomplete_list_" + this.count), - this.input.setAttribute("role", "combobox"), - (this.options = n = n || {}), - e( - this, - { - minChars: 2, - maxItems: 10, - autoFirst: !1, - data: r.DATA, - filter: r.FILTER_CONTAINS, - sort: !1 !== n.sort && r.SORT_BYLENGTH, - container: r.CONTAINER, - item: r.ITEM, - replace: r.REPLACE, - tabSelect: !1, - listLabel: "Results List", - }, - n - ), - (this.index = -1), - (this.container = this.container(t)), - (this.ul = i.create("ul", { - hidden: "hidden", - role: "listbox", - id: "awesomplete_list_" + this.count, - inside: this.container, - "aria-label": this.listLabel, - })), - (this.status = i.create("span", { - className: "visually-hidden", - role: "status", - "aria-live": "assertive", - "aria-atomic": !0, - inside: this.container, - textContent: - 0 != this.minChars - ? "Type " + this.minChars + " or more characters for results." - : "Begin typing for results.", - })), - (this._events = { - input: { - input: this.evaluate.bind(this), - blur: this.close.bind(this, { reason: "blur" }), - keydown: function (t) { - var e = t.keyCode; - s.opened && - (13 === e && s.selected - ? (t.preventDefault(), s.select(void 0, void 0, t)) - : 9 === e && s.selected && s.tabSelect - ? s.select(void 0, void 0, t) - : 27 === e - ? s.close({ reason: "esc" }) - : (38 !== e && 40 !== e) || - (t.preventDefault(), s[38 === e ? "previous" : "next"]())); - }, - }, - form: { submit: this.close.bind(this, { reason: "submit" }) }, - ul: { - mousedown: function (t) { - t.preventDefault(); - }, - click: function (t) { - var e = t.target; - if (e !== this) { - for (; e && !/li/i.test(e.nodeName); ) e = e.parentNode; - e && - 0 === t.button && - (t.preventDefault(), s.select(e, t.target, t)); - } - }, - }, - }), - i.bind(this.input, this._events.input), - i.bind(this.input.form, this._events.form), - i.bind(this.ul, this._events.ul), - this.input.hasAttribute("list") - ? ((this.list = "#" + this.input.getAttribute("list")), - this.input.removeAttribute("list")) - : (this.list = this.input.getAttribute("data-list") || n.list || []), - r.all.push(this); - }; - (r.prototype = { - set list(t) { - if (Array.isArray(t)) this._list = t; - else if ("string" == typeof t && t.indexOf(",") > -1) - this._list = t.split(/\s*,\s*/); - else if ((t = i(t)) && t.children) { - var e = []; - o.apply(t.children).forEach(function (t) { - if (!t.disabled) { - var i = t.textContent.trim(), - n = t.value || i, - s = t.label || i; - "" !== n && e.push({ label: s, value: n }); - } - }), - (this._list = e); - } - document.activeElement === this.input && this.evaluate(); - }, - get selected() { - return this.index > -1; - }, - get opened() { - return this.isOpened; - }, - close: function (t) { - this.opened && - (this.input.setAttribute("aria-expanded", "false"), - this.ul.setAttribute("hidden", ""), - (this.isOpened = !1), - (this.index = -1), - this.status.setAttribute("hidden", ""), - i.fire(this.input, "awesomplete-close", t || {})); - }, - open: function () { - this.input.setAttribute("aria-expanded", "true"), - this.ul.removeAttribute("hidden"), - (this.isOpened = !0), - this.status.removeAttribute("hidden"), - this.autoFirst && -1 === this.index && this.goto(0), - i.fire(this.input, "awesomplete-open"); - }, - destroy: function () { - if ( - (i.unbind(this.input, this._events.input), - i.unbind(this.input.form, this._events.form), - !this.options.container) - ) { - var t = this.container.parentNode; - t.insertBefore(this.input, this.container), - t.removeChild(this.container); - } - this.input.removeAttribute("autocomplete"), - this.input.removeAttribute("aria-autocomplete"); - var e = r.all.indexOf(this); - -1 !== e && r.all.splice(e, 1); - }, - next: function () { - var t = this.ul.children.length; - this.goto(this.index < t - 1 ? this.index + 1 : t ? 0 : -1); - }, - previous: function () { - var t = this.ul.children.length, - e = this.index - 1; - this.goto(this.selected && -1 !== e ? e : t - 1); - }, - goto: function (t) { - var e = this.ul.children; - this.selected && e[this.index].setAttribute("aria-selected", "false"), - (this.index = t), - t > -1 && - e.length > 0 && - (e[t].setAttribute("aria-selected", "true"), - (this.status.textContent = - e[t].textContent + ", list item " + (t + 1) + " of " + e.length), - this.input.setAttribute( - "aria-activedescendant", - this.ul.id + "_item_" + this.index - ), - (this.ul.scrollTop = - e[t].offsetTop - this.ul.clientHeight + e[t].clientHeight), - i.fire(this.input, "awesomplete-highlight", { - text: this.suggestions[this.index], - })); - }, - select: function (t, e, n) { - if ( - (t - ? (this.index = i.siblingIndex(t)) - : (t = this.ul.children[this.index]), - t) - ) { - var s = this.suggestions[this.index]; - i.fire(this.input, "awesomplete-select", { - text: s, - origin: e || t, - originalEvent: n, - }) && - (this.replace(s), - this.close({ reason: "select" }), - i.fire(this.input, "awesomplete-selectcomplete", { - text: s, - originalEvent: n, - })); - } - }, - evaluate: function () { - var e = this, - i = this.input.value; - i.length >= this.minChars && this._list && this._list.length > 0 - ? ((this.index = -1), - (this.ul.innerHTML = ""), - (this.suggestions = this._list - .map(function (n) { - return new t(e.data(n, i)); - }) - .filter(function (t) { - return e.filter(t, i); - })), - !1 !== this.sort && - (this.suggestions = this.suggestions.sort(this.sort)), - (this.suggestions = this.suggestions.slice(0, this.maxItems)), - this.suggestions.forEach(function (t, n) { - e.ul.appendChild(e.item(t, i, n)); - }), - 0 === this.ul.children.length - ? ((this.status.textContent = "No results found"), - this.close({ reason: "nomatches" })) - : (this.open(), - (this.status.textContent = - this.ul.children.length + " results found"))) - : (this.close({ reason: "nomatches" }), - (this.status.textContent = "No results found")); - }, - }), - (r.all = []), - (r.FILTER_CONTAINS = function (t, e) { - return RegExp(i.regExpEscape(e.trim()), "i").test(t); - }), - (r.FILTER_STARTSWITH = function (t, e) { - return RegExp("^" + i.regExpEscape(e.trim()), "i").test(t); - }), - (r.SORT_BYLENGTH = function (t, e) { - return t.length !== e.length ? t.length - e.length : t < e ? -1 : 1; - }), - (r.CONTAINER = function (t) { - return i.create("div", { className: "awesomplete", around: t }); - }), - (r.ITEM = function (t, e, n) { - return i.create("li", { - innerHTML: - "" === e.trim() - ? t - : t.replace( - RegExp(i.regExpEscape(e.trim()), "gi"), - "$&" - ), - role: "option", - "aria-selected": "false", - id: "awesomplete_list_" + this.count + "_item_" + n, - }); - }), - (r.REPLACE = function (t) { - this.input.value = t.value; - }), - (r.DATA = function (t) { - return t; - }), - Object.defineProperty( - (t.prototype = Object.create(String.prototype)), - "length", - { - get: function () { - return this.label.length; - }, - } - ), - (t.prototype.toString = t.prototype.valueOf = - function () { - return "" + this.label; - }); - var o = Array.prototype.slice; - (i.create = function (t, e) { - var n = document.createElement(t); - for (var s in e) { - var r = e[s]; - if ("inside" === s) i(r).appendChild(n); - else if ("around" === s) { - var o = i(r); - o.parentNode.insertBefore(n, o), - n.appendChild(o), - null != o.getAttribute("autofocus") && o.focus(); - } else s in n ? (n[s] = r) : n.setAttribute(s, r); - } - return n; - }), - (i.bind = function (t, e) { - if (t) - for (var i in e) { - var n = e[i]; - i.split(/\s+/).forEach(function (e) { - t.addEventListener(e, n); - }); - } - }), - (i.unbind = function (t, e) { - if (t) - for (var i in e) { - var n = e[i]; - i.split(/\s+/).forEach(function (e) { - t.removeEventListener(e, n); - }); - } - }), - (i.fire = function (t, e, i) { - var n = document.createEvent("HTMLEvents"); - n.initEvent(e, !0, !0); - for (var s in i) n[s] = i[s]; - return t.dispatchEvent(n); - }), - (i.regExpEscape = function (t) { - return t.replace(/[-\\^$*+?.()|[\]{}]/g, "\\$&"); - }), - (i.siblingIndex = function (t) { - for (var e = 0; (t = t.previousElementSibling); e++); - return e; - }), - "undefined" != typeof self && (self.Awesomplete = r), - "undefined" != typeof Document && - ("loading" !== document.readyState - ? s() - : document.addEventListener("DOMContentLoaded", s)), - (r.$ = i), - (r.$$ = n), - "object" == typeof module && module.exports && (module.exports = r); -})(); +!function(){function t(t){var e=Array.isArray(t)?{label:t[0],value:t[1]}:"object"==typeof t&&"label"in t&&"value"in t?t:{label:t,value:t};this.label=e.label||e.value,this.value=e.value}function e(t,e,i){for(var n in e){var s=e[n],o=t.input.getAttribute("data-"+n.toLowerCase());"number"==typeof s?t[n]=parseInt(o):!1===s?t[n]=null!==o:s instanceof Function?t[n]=null:t[n]=o,t[n]||0===t[n]||(t[n]=n in i?i[n]:s)}}function i(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function n(t,e){return r.call((e||document).querySelectorAll(t))}function s(){n("input.awesomplete").forEach(function(t){new o(t)})}var o=function(t,n){var s=this;o.count=(o.count||0)+1,this.count=o.count,this.isOpened=!1,this.input=i(t),this.input.setAttribute("autocomplete","off"),this.input.setAttribute("aria-expanded","false"),this.input.setAttribute("aria-owns","awesomplete_list_"+this.count),this.input.setAttribute("role","combobox"),this.options=n=n||{},e(this,{minChars:2,maxItems:10,autoFirst:!1,data:o.DATA,filter:o.FILTER_CONTAINS,sort:!1!==n.sort&&o.SORT_BYLENGTH,container:o.CONTAINER,item:o.ITEM,replace:o.REPLACE,listContainer:o.CONTAINER,tabSelect:!1,listLabel:"Results List"},n),this.index=-1,this.container=this.container(t),this.ul=i.create("ul",{hidden:"hidden",inside:s.listContainer===o.CONTAINER?s.container:s.listContainer,role:"listbox",id:"awesomplete_list_"+this.count,"aria-label":this.listLabel}),this.status=i.create("span",{className:"visually-hidden",role:"status","aria-live":"assertive","aria-atomic":!0,inside:this.container,textContent:0!=this.minChars?"Type "+this.minChars+" or more characters for results.":"Begin typing for results."}),this._events={input:{input:this.evaluate.bind(this),blur:this.close.bind(this,{reason:"blur"}),keydown:function(t){var e=t.keyCode;s.opened&&(13===e&&s.selected?(t.preventDefault(),s.select(void 0,void 0,t)):9===e&&s.selected&&s.tabSelect?(t.preventDefault(),s.select(void 0,void 0,t)):27===e?s.close({reason:"esc"}):38!==e&&40!==e||(t.preventDefault(),s[38===e?"previous":"next"]()))}},form:{submit:this.close.bind(this,{reason:"submit"})},ul:{mousedown:function(t){t.preventDefault()},click:function(t){var e=t.target;if(e!==this){for(;e&&!/li/i.test(e.nodeName);)e=e.parentNode;e&&0===t.button&&(t.preventDefault(),s.select(e,t.target,t))}}},window:{scroll:function(){var t=s.container.getBoundingClientRect();s.ul.style.top=t.top+t.height+"px",s.ul.style.left=t.left+"px",s.ul.style.minWidth=t.width+"px"}}},i.bind(this.input,this._events.input),i.bind(this.input.form,this._events.form),i.bind(this.ul,this._events.ul),this.listContainer!==o.CONTAINER&&i.bind(window,this._events.window),this.input.hasAttribute("list")?(this.list="#"+this.input.getAttribute("list"),this.input.removeAttribute("list")):this.list=this.input.getAttribute("data-list")||n.list||[],o.all.push(this)};o.prototype={set list(t){if(Array.isArray(t))this._list=t;else if("string"==typeof t&&t.indexOf(",")>-1)this._list=t.split(/\s*,\s*/);else if((t=i(t))&&t.children){var e=[];r.apply(t.children).forEach(function(t){if(!t.disabled){var i=t.textContent.trim(),n=t.value||i,s=t.label||i;""!==n&&e.push({label:s,value:n})}}),this._list=e}document.activeElement===this.input&&this.evaluate()},get selected(){return this.index>-1},get opened(){return this.isOpened},close:function(t){this.opened&&(this.input.setAttribute("aria-expanded","false"),this.ul.setAttribute("hidden",""),this.isOpened=!1,this.index=-1,this.status.setAttribute("hidden",""),i.fire(this.input,"awesomplete-close",t||{}))},open:function(){if(this.listContainer!==o.CONTAINER){var t=this.container.getBoundingClientRect();this.ul.style.top=t.top+t.height+"px",this.ul.style.left=t.left+"px",this.ul.style.position="fixed",this.ul.style.transitionProperty="height, width, transform",this.ul.style.minWidth=t.width+"px",this.ul.className="awesomplete-suggestion-list"}this.input.setAttribute("aria-expanded","true"),this.ul.removeAttribute("hidden"),this.isOpened=!0,this.status.removeAttribute("hidden"),this.autoFirst&&-1===this.index&&this.goto(0),i.fire(this.input,"awesomplete-open")},destroy:function(){if(i.unbind(this.input,this._events.input),i.unbind(this.input.form,this._events.form),this.listContainer!==o.CONTAINER&&i.unbind(window,this._events.window),!this.options.container){var t=this.container.parentNode;if(this.listContainer!==o.CONTAINER){this.ul.parentNode.removeChild(this.ul)}else t.insertBefore(this.input,this.container),t.removeChild(this.container)}this.input.removeAttribute("autocomplete"),this.input.removeAttribute("aria-autocomplete");var e=o.all.indexOf(this);-1!==e&&o.all.splice(e,1)},next:function(){var t=this.ul.children.length;this.goto(this.index-1&&e.length>0&&(e[t].setAttribute("aria-selected","true"),this.status.textContent=e[t].textContent+", list item "+(t+1)+" of "+e.length,this.input.setAttribute("aria-activedescendant",this.ul.id+"_item_"+this.index),this.ul.scrollTop=e[t].offsetTop-this.ul.clientHeight+e[t].clientHeight,i.fire(this.input,"awesomplete-highlight",{text:this.suggestions[this.index]}))},select:function(t,e,n){if(t?this.index=i.siblingIndex(t):t=this.ul.children[this.index],t){var s=this.suggestions[this.index];i.fire(this.input,"awesomplete-select",{text:s,origin:e||t,originalEvent:n})&&(this.replace(s),this.close({reason:"select"}),i.fire(this.input,"awesomplete-selectcomplete",{text:s,originalEvent:n}))}},evaluate:function(){var e=this,i=this.input.value;i.length>=this.minChars&&this._list&&this._list.length>0?(this.index=-1,this.ul.innerHTML="",this.suggestions=this._list.map(function(n){return new t(e.data(n,i))}).filter(function(t){return e.filter(t,i)}),!1!==this.sort&&(this.suggestions=this.suggestions.sort(this.sort)),this.suggestions=this.suggestions.slice(0,this.maxItems),this.suggestions.forEach(function(t,n){e.ul.appendChild(e.item(t,i,n))}),0===this.ul.children.length?(this.status.textContent="No results found",this.close({reason:"nomatches"})):(this.open(),this.status.textContent=this.ul.children.length+" results found")):(this.close({reason:"nomatches"}),this.status.textContent="No results found")}},o.all=[],o.FILTER_CONTAINS=function(t,e){return RegExp(i.regExpEscape(e.trim()),"i").test(t)},o.FILTER_STARTSWITH=function(t,e){return RegExp("^"+i.regExpEscape(e.trim()),"i").test(t)},o.SORT_BYLENGTH=function(t,e){return t.length!==e.length?t.length-e.length:t$&"),role:"option","aria-selected":"false",id:"awesomplete_list_"+this.count+"_item_"+n})},o.REPLACE=function(t){this.input.value=t.value},o.DATA=function(t){return t},Object.defineProperty(t.prototype=Object.create(String.prototype),"length",{get:function(){return this.label.length}}),t.prototype.toString=t.prototype.valueOf=function(){return""+this.label};var r=Array.prototype.slice;i.create=function(t,e){var n=document.createElement(t);for(var s in e){var o=e[s];if("inside"===s)i(o).appendChild(n);else if("around"===s){var r=i(o);r.parentNode.insertBefore(n,r),n.appendChild(r),null!=r.getAttribute("autofocus")&&r.focus()}else s in n?n[s]=o:n.setAttribute(s,o)}return n},i.bind=function(t,e){if(t)for(var i in e){var n=e[i];i.split(/\s+/).forEach(function(e){t.addEventListener(e,n)})}},i.unbind=function(t,e){if(t)for(var i in e){var n=e[i];i.split(/\s+/).forEach(function(e){t.removeEventListener(e,n)})}},i.fire=function(t,e,i){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0);for(var s in i)n[s]=i[s];return t.dispatchEvent(n)},i.regExpEscape=function(t){return t.replace(/[-\\^$*+?.()|[\]{}]/g,"\\$&")},i.siblingIndex=function(t){for(var e=0;t=t.previousElementSibling;e++);return e},"undefined"!=typeof self&&(self.Awesomplete=o),"undefined"!=typeof Document&&("loading"!==document.readyState?s():document.addEventListener("DOMContentLoaded",s)),o.$=i,o.$$=n,"object"==typeof module&&module.exports&&(module.exports=o)}(); //# sourceMappingURL=awesomplete.min.js.map diff --git a/awesomplete.min.js.map b/awesomplete.min.js.map index eb2db36b..ebc720f7 100644 --- a/awesomplete.min.js.map +++ b/awesomplete.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["awesomplete.js"],"names":["Suggestion","data","o","Array","isArray","label","value","this","configure","instance","properties","i","initial","attrValue","input","getAttribute","toLowerCase","parseInt","Function","$","expr","con","document","querySelector","$$","slice","call","querySelectorAll","init","forEach","_","me","count","isOpened","setAttribute","options","minChars","maxItems","autoFirst","DATA","filter","FILTER_CONTAINS","sort","SORT_BYLENGTH","container","CONTAINER","item","ITEM","replace","REPLACE","tabSelect","listLabel","index","ul","create","hidden","role","id","inside","aria-label","status","className","aria-live","aria-atomic","textContent","_events","evaluate","bind","blur","close","reason","keydown","evt","c","keyCode","opened","selected","preventDefault","select","undefined","form","submit","mousedown","click","li","target","test","nodeName","parentNode","button","hasAttribute","list","removeAttribute","all","push","prototype","_list","indexOf","split","children","items","apply","el","disabled","text","trim","activeElement","fire","open","goto","destroy","unbind","insertBefore","removeChild","indexOfAwesomplete","splice","next","length","previous","pos","lis","scrollTop","offsetTop","clientHeight","suggestions","origin","originalEvent","siblingIndex","suggestion","innerHTML","map","appendChild","RegExp","regExpEscape","FILTER_STARTSWITH","a","b","around","item_id","aria-selected","Object","defineProperty","String","get","toString","valueOf","tag","element","createElement","val","ref","focus","event","callback","addEventListener","removeEventListener","type","createEvent","initEvent","j","dispatchEvent","s","previousElementSibling","self","Awesomplete","Document","readyState","module","exports"],"mappings":"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","file":"awesomplete.min.js","sourcesContent":["/**\n * Simple, lightweight, usable local autocomplete library for modern browsers\n * Because there weren’t enough autocomplete scripts in the world? Because I’m completely insane and have NIH syndrome? Probably both. :P\n * @author Lea Verou http://leaverou.github.io/awesomplete\n * MIT license\n */\n\n(function () {\n\nvar _ = function (input, o) {\n\tvar me = this;\n\n // Keep track of number of instances for unique IDs\n _.count = (_.count || 0) + 1;\n this.count = _.count;\n\n\t// Setup\n\n\tthis.isOpened = false;\n\n\tthis.input = $(input);\n\tthis.input.setAttribute(\"autocomplete\", \"off\");\n\tthis.input.setAttribute(\"aria-expanded\", \"false\");\n\tthis.input.setAttribute(\"aria-owns\", \"awesomplete_list_\" + this.count);\n\tthis.input.setAttribute(\"role\", \"combobox\");\n\n\t// store constructor options in case we need to distinguish\n\t// between default and customized behavior later on\n\tthis.options = o = o || {};\n\n\tconfigure(this, {\n\t\tminChars: 2,\n\t\tmaxItems: 10,\n\t\tautoFirst: false,\n\t\tdata: _.DATA,\n\t\tfilter: _.FILTER_CONTAINS,\n\t\tsort: o.sort === false ? false : _.SORT_BYLENGTH,\n\t\tcontainer: _.CONTAINER,\n\t\titem: _.ITEM,\n\t\treplace: _.REPLACE,\n\t\ttabSelect: false,\n\t\tlistLabel: \"Results List\"\n\t}, o);\n\n\tthis.index = -1;\n\n\t// Create necessary elements\n\n\tthis.container = this.container(input);\n\n\tthis.ul = $.create(\"ul\", {\n\t\thidden: \"hidden\",\n role: \"listbox\",\n id: \"awesomplete_list_\" + this.count,\n\t\tinside: this.container,\n\t\t\"aria-label\": this.listLabel\n\t});\n\n\tthis.status = $.create(\"span\", {\n\t\tclassName: \"visually-hidden\",\n\t\trole: \"status\",\n\t\t\"aria-live\": \"assertive\",\n \"aria-atomic\": true,\n inside: this.container,\n textContent: this.minChars != 0 ? (\"Type \" + this.minChars + \" or more characters for results.\") : \"Begin typing for results.\"\n\t});\n\n\t// Bind events\n\n\tthis._events = {\n\t\tinput: {\n\t\t\t\"input\": this.evaluate.bind(this),\n\t\t\t\"blur\": this.close.bind(this, { reason: \"blur\" }),\n\t\t\t\"keydown\": function(evt) {\n\t\t\t\tvar c = evt.keyCode;\n\n\t\t\t\t// If the dropdown `ul` is in view, then act on keydown for the following keys:\n\t\t\t\t// Enter / Esc / Up / Down\n\t\t\t\tif(me.opened) {\n\t\t\t\t\tif (c === 13 && me.selected) { // Enter\n\t\t\t\t\t\tevt.preventDefault();\n\t\t\t\t\t\tme.select(undefined, undefined, evt);\n\t\t\t\t\t}\n\t\t\t\t\telse if (c === 9 && me.selected && me.tabSelect) {\n\t\t\t\t\t\tme.select(undefined, undefined, evt);\n\t\t\t\t\t}\n\t\t\t\t\telse if (c === 27) { // Esc\n\t\t\t\t\t\tme.close({ reason: \"esc\" });\n\t\t\t\t\t}\n\t\t\t\t\telse if (c === 38 || c === 40) { // Down/Up arrow\n\t\t\t\t\t\tevt.preventDefault();\n\t\t\t\t\t\tme[c === 38? \"previous\" : \"next\"]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tform: {\n\t\t\t\"submit\": this.close.bind(this, { reason: \"submit\" })\n\t\t},\n\t\tul: {\n\t\t\t// Prevent the default mousedowm, which ensures the input is not blurred.\n\t\t\t// The actual selection will happen on click. This also ensures dragging the\n\t\t\t// cursor away from the list item will cancel the selection\n\t\t\t\"mousedown\": function(evt) {\n\t\t\t\tevt.preventDefault();\n\t\t\t},\n\t\t\t// The click event is fired even if the corresponding mousedown event has called preventDefault\n\t\t\t\"click\": function(evt) {\n\t\t\t\tvar li = evt.target;\n\n\t\t\t\tif (li !== this) {\n\n\t\t\t\t\twhile (li && !/li/i.test(li.nodeName)) {\n\t\t\t\t\t\tli = li.parentNode;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (li && evt.button === 0) { // Only select on left click\n\t\t\t\t\t\tevt.preventDefault();\n\t\t\t\t\t\tme.select(li, evt.target, evt);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t$.bind(this.input, this._events.input);\n\t$.bind(this.input.form, this._events.form);\n\t$.bind(this.ul, this._events.ul);\n\n\tif (this.input.hasAttribute(\"list\")) {\n\t\tthis.list = \"#\" + this.input.getAttribute(\"list\");\n\t\tthis.input.removeAttribute(\"list\");\n\t}\n\telse {\n\t\tthis.list = this.input.getAttribute(\"data-list\") || o.list || [];\n\t}\n\n\t_.all.push(this);\n};\n\n_.prototype = {\n\tset list(list) {\n\t\tif (Array.isArray(list)) {\n\t\t\tthis._list = list;\n\t\t}\n\t\telse if (typeof list === \"string\" && list.indexOf(\",\") > -1) {\n\t\t\t\tthis._list = list.split(/\\s*,\\s*/);\n\t\t}\n\t\telse { // Element or CSS selector\n\t\t\tlist = $(list);\n\n\t\t\tif (list && list.children) {\n\t\t\t\tvar items = [];\n\t\t\t\tslice.apply(list.children).forEach(function (el) {\n\t\t\t\t\tif (!el.disabled) {\n\t\t\t\t\t\tvar text = el.textContent.trim();\n\t\t\t\t\t\tvar value = el.value || text;\n\t\t\t\t\t\tvar label = el.label || text;\n\t\t\t\t\t\tif (value !== \"\") {\n\t\t\t\t\t\t\titems.push({ label: label, value: value });\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tthis._list = items;\n\t\t\t}\n\t\t}\n\n\t\tif (document.activeElement === this.input) {\n\t\t\tthis.evaluate();\n\t\t}\n\t},\n\n\tget selected() {\n\t\treturn this.index > -1;\n\t},\n\n\tget opened() {\n\t\treturn this.isOpened;\n\t},\n\n\tclose: function (o) {\n\t\tif (!this.opened) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.input.setAttribute(\"aria-expanded\", \"false\");\n\t\tthis.ul.setAttribute(\"hidden\", \"\");\n\t\tthis.isOpened = false;\n\t\tthis.index = -1;\n\n\t\tthis.status.setAttribute(\"hidden\", \"\");\n\n\t\t$.fire(this.input, \"awesomplete-close\", o || {});\n\t},\n\n\topen: function () {\n\t\tthis.input.setAttribute(\"aria-expanded\", \"true\");\n\t\tthis.ul.removeAttribute(\"hidden\");\n\t\tthis.isOpened = true;\n\n\t\tthis.status.removeAttribute(\"hidden\");\n\n\t\tif (this.autoFirst && this.index === -1) {\n\t\t\tthis.goto(0);\n\t\t}\n\n\t\t$.fire(this.input, \"awesomplete-open\");\n\t},\n\n\tdestroy: function() {\n\t\t//remove events from the input and its form\n\t\t$.unbind(this.input, this._events.input);\n\t\t$.unbind(this.input.form, this._events.form);\n\n\t\t// cleanup container if it was created by Awesomplete but leave it alone otherwise\n\t\tif (!this.options.container) {\n\t\t\t//move the input out of the awesomplete container and remove the container and its children\n\t\t\tvar parentNode = this.container.parentNode;\n\n\t\t\tparentNode.insertBefore(this.input, this.container);\n\t\t\tparentNode.removeChild(this.container);\n\t\t}\n\n\t\t//remove autocomplete and aria-autocomplete attributes\n\t\tthis.input.removeAttribute(\"autocomplete\");\n\t\tthis.input.removeAttribute(\"aria-autocomplete\");\n\n\t\t//remove this awesomeplete instance from the global array of instances\n\t\tvar indexOfAwesomplete = _.all.indexOf(this);\n\n\t\tif (indexOfAwesomplete !== -1) {\n\t\t\t_.all.splice(indexOfAwesomplete, 1);\n\t\t}\n\t},\n\n\tnext: function () {\n\t\tvar count = this.ul.children.length;\n\t\tthis.goto(this.index < count - 1 ? this.index + 1 : (count ? 0 : -1) );\n\t},\n\n\tprevious: function () {\n\t\tvar count = this.ul.children.length;\n\t\tvar pos = this.index - 1;\n\n\t\tthis.goto(this.selected && pos !== -1 ? pos : count - 1);\n\t},\n\n\t// Should not be used, highlights specific item without any checks!\n\tgoto: function (i) {\n\t\tvar lis = this.ul.children;\n\n\t\tif (this.selected) {\n\t\t\tlis[this.index].setAttribute(\"aria-selected\", \"false\");\n\t\t}\n\n\t\tthis.index = i;\n\n\t\tif (i > -1 && lis.length > 0) {\n\t\t\tlis[i].setAttribute(\"aria-selected\", \"true\");\n\n\t\t\tthis.status.textContent = lis[i].textContent + \", list item \" + (i + 1) + \" of \" + lis.length;\n\n this.input.setAttribute(\"aria-activedescendant\", this.ul.id + \"_item_\" + this.index);\n\n\t\t\t// scroll to highlighted element in case parent's height is fixed\n\t\t\tthis.ul.scrollTop = lis[i].offsetTop - this.ul.clientHeight + lis[i].clientHeight;\n\n\t\t\t$.fire(this.input, \"awesomplete-highlight\", {\n\t\t\t\ttext: this.suggestions[this.index]\n\t\t\t});\n\t\t}\n\t},\n\n\tselect: function (selected, origin, originalEvent) {\n\t\tif (selected) {\n\t\t\tthis.index = $.siblingIndex(selected);\n\t\t} else {\n\t\t\tselected = this.ul.children[this.index];\n\t\t}\n\n\t\tif (selected) {\n\t\t\tvar suggestion = this.suggestions[this.index];\n\n\t\t\tvar allowed = $.fire(this.input, \"awesomplete-select\", {\n\t\t\t\ttext: suggestion,\n\t\t\t\torigin: origin || selected,\n\t\t\t\toriginalEvent: originalEvent\n\t\t\t});\n\n\t\t\tif (allowed) {\n\t\t\t\tthis.replace(suggestion);\n\t\t\t\tthis.close({ reason: \"select\" });\n\t\t\t\t$.fire(this.input, \"awesomplete-selectcomplete\", {\n\t\t\t\t\ttext: suggestion,\n\t\t\t\t\toriginalEvent: originalEvent\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t},\n\n\tevaluate: function() {\n\t\tvar me = this;\n\t\tvar value = this.input.value;\n\n\t\tif (value.length >= this.minChars && this._list && this._list.length > 0) {\n\t\t\tthis.index = -1;\n\t\t\t// Populate list with options that match\n\t\t\tthis.ul.innerHTML = \"\";\n\n\t\t\tthis.suggestions = this._list\n\t\t\t\t.map(function(item) {\n\t\t\t\t\treturn new Suggestion(me.data(item, value));\n\t\t\t\t})\n\t\t\t\t.filter(function(item) {\n\t\t\t\t\treturn me.filter(item, value);\n\t\t\t\t});\n\n\t\t\tif (this.sort !== false) {\n\t\t\t\tthis.suggestions = this.suggestions.sort(this.sort);\n\t\t\t}\n\n\t\t\tthis.suggestions = this.suggestions.slice(0, this.maxItems);\n\n\t\t\tthis.suggestions.forEach(function(text, index) {\n\t\t\t\t\tme.ul.appendChild(me.item(text, value, index));\n\t\t\t\t});\n\n\t\t\tif (this.ul.children.length === 0) {\n\n this.status.textContent = \"No results found\";\n\n\t\t\t\tthis.close({ reason: \"nomatches\" });\n\n\t\t\t} else {\n\t\t\t\tthis.open();\n\n this.status.textContent = this.ul.children.length + \" results found\";\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tthis.close({ reason: \"nomatches\" });\n\n this.status.textContent = \"No results found\";\n\t\t}\n\t}\n};\n\n// Static methods/properties\n\n_.all = [];\n\n_.FILTER_CONTAINS = function (text, input) {\n\treturn RegExp($.regExpEscape(input.trim()), \"i\").test(text);\n};\n\n_.FILTER_STARTSWITH = function (text, input) {\n\treturn RegExp(\"^\" + $.regExpEscape(input.trim()), \"i\").test(text);\n};\n\n_.SORT_BYLENGTH = function (a, b) {\n\tif (a.length !== b.length) {\n\t\treturn a.length - b.length;\n\t}\n\n\treturn a < b? -1 : 1;\n};\n\n_.CONTAINER = function (input) {\n\treturn $.create(\"div\", {\n\t\tclassName: \"awesomplete\",\n\t\taround: input\n\t});\n}\n\n_.ITEM = function (text, input, item_id) {\n\tvar html = input.trim() === \"\" ? text : text.replace(RegExp($.regExpEscape(input.trim()), \"gi\"), \"$&\");\n\treturn $.create(\"li\", {\n\t\tinnerHTML: html,\n\t\t\"role\": \"option\",\n\t\t\"aria-selected\": \"false\",\n\t\t\"id\": \"awesomplete_list_\" + this.count + \"_item_\" + item_id\n\t});\n};\n\n_.REPLACE = function (text) {\n\tthis.input.value = text.value;\n};\n\n_.DATA = function (item/*, input*/) { return item; };\n\n// Private functions\n\nfunction Suggestion(data) {\n\tvar o = Array.isArray(data)\n\t ? { label: data[0], value: data[1] }\n\t : typeof data === \"object\" && \"label\" in data && \"value\" in data ? data : { label: data, value: data };\n\n\tthis.label = o.label || o.value;\n\tthis.value = o.value;\n}\nObject.defineProperty(Suggestion.prototype = Object.create(String.prototype), \"length\", {\n\tget: function() { return this.label.length; }\n});\nSuggestion.prototype.toString = Suggestion.prototype.valueOf = function () {\n\treturn \"\" + this.label;\n};\n\nfunction configure(instance, properties, o) {\n\tfor (var i in properties) {\n\t\tvar initial = properties[i],\n\t\t attrValue = instance.input.getAttribute(\"data-\" + i.toLowerCase());\n\n\t\tif (typeof initial === \"number\") {\n\t\t\tinstance[i] = parseInt(attrValue);\n\t\t}\n\t\telse if (initial === false) { // Boolean options must be false by default anyway\n\t\t\tinstance[i] = attrValue !== null;\n\t\t}\n\t\telse if (initial instanceof Function) {\n\t\t\tinstance[i] = null;\n\t\t}\n\t\telse {\n\t\t\tinstance[i] = attrValue;\n\t\t}\n\n\t\tif (!instance[i] && instance[i] !== 0) {\n\t\t\tinstance[i] = (i in o)? o[i] : initial;\n\t\t}\n\t}\n}\n\n// Helpers\n\nvar slice = Array.prototype.slice;\n\nfunction $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nfunction $$(expr, con) {\n\treturn slice.call((con || document).querySelectorAll(expr));\n}\n\n$.create = function(tag, o) {\n\tvar element = document.createElement(tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t\tif (ref.getAttribute(\"autofocus\") != null) {\n\t\t\t\tref.focus();\n\t\t\t}\n\t\t}\n\t\telse if (i in element) {\n\t\t\telement[i] = val;\n\t\t}\n\t\telse {\n\t\t\telement.setAttribute(i, val);\n\t\t}\n\t}\n\n\treturn element;\n};\n\n$.bind = function(element, o) {\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function (event) {\n\t\t\t\telement.addEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n};\n\n$.unbind = function(element, o) {\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function(event) {\n\t\t\t\telement.removeEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n};\n\n$.fire = function(target, type, properties) {\n\tvar evt = document.createEvent(\"HTMLEvents\");\n\n\tevt.initEvent(type, true, true );\n\n\tfor (var j in properties) {\n\t\tevt[j] = properties[j];\n\t}\n\n\treturn target.dispatchEvent(evt);\n};\n\n$.regExpEscape = function (s) {\n\treturn s.replace(/[-\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n};\n\n$.siblingIndex = function (el) {\n\t/* eslint-disable no-cond-assign */\n\tfor (var i = 0; el = el.previousElementSibling; i++);\n\treturn i;\n};\n\n// Initialization\n\nfunction init() {\n\t$$(\"input.awesomplete\").forEach(function (input) {\n\t\tnew _(input);\n\t});\n}\n\n// Make sure to export Awesomplete on self when in a browser\nif (typeof self !== \"undefined\") {\n\tself.Awesomplete = _;\n}\n\n// Are we in a browser? Check for Document constructor\nif (typeof Document !== \"undefined\") {\n\t// DOM already loaded?\n\tif (document.readyState !== \"loading\") {\n\t\tinit();\n\t}\n\telse {\n\t\t// Wait for it\n\t\tdocument.addEventListener(\"DOMContentLoaded\", init);\n\t}\n}\n\n_.$ = $;\n_.$$ = $$;\n\n// Expose Awesomplete as a CJS module\nif (typeof module === \"object\" && module.exports) {\n\tmodule.exports = _;\n}\n\nreturn _;\n\n}());\n"]} +{"version":3,"sources":["awesomplete.js"],"names":["Suggestion","data","o","Array","isArray","label","value","this","configure","instance","properties","i","initial","attrValue","input","getAttribute","toLowerCase","parseInt","Function","$","expr","con","document","querySelector","$$","slice","call","querySelectorAll","init","forEach","_","me","count","isOpened","setAttribute","options","minChars","maxItems","autoFirst","DATA","filter","FILTER_CONTAINS","sort","SORT_BYLENGTH","container","CONTAINER","item","ITEM","replace","REPLACE","listContainer","tabSelect","listLabel","index","ul","create","hidden","inside","role","id","aria-label","status","className","aria-live","aria-atomic","textContent","_events","evaluate","bind","blur","close","reason","keydown","evt","c","keyCode","opened","selected","preventDefault","select","undefined","form","submit","mousedown","click","li","target","test","nodeName","parentNode","button","window","scroll","boundingRect","getBoundingClientRect","style","top","height","left","minWidth","width","hasAttribute","list","removeAttribute","all","push","prototype","_list","indexOf","split","children","items","apply","el","disabled","text","trim","activeElement","fire","open","position","transitionProperty","goto","destroy","unbind","removeChild","insertBefore","indexOfAwesomplete","splice","next","length","previous","pos","lis","scrollTop","offsetTop","clientHeight","suggestions","origin","originalEvent","siblingIndex","suggestion","innerHTML","map","appendChild","RegExp","regExpEscape","FILTER_STARTSWITH","a","b","around","item_id","aria-selected","Object","defineProperty","String","get","toString","valueOf","tag","element","createElement","val","ref","focus","event","callback","addEventListener","removeEventListener","type","createEvent","initEvent","j","dispatchEvent","s","previousElementSibling","self","Awesomplete","Document","readyState","module","exports"],"mappings":"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","file":"awesomplete.min.js","sourcesContent":["/**\n * Simple, lightweight, usable local autocomplete library for modern browsers\n * Because there weren’t enough autocomplete scripts in the world? Because I’m completely insane and have NIH syndrome? Probably both. :P\n * @author Lea Verou http://leaverou.github.io/awesomplete\n * MIT license\n */\n\n(function () {\n var _ = function (input, o) {\n var me = this;\n\n // Keep track of number of instances for unique IDs\n _.count = (_.count || 0) + 1;\n this.count = _.count;\n\n // Setup\n\n this.isOpened = false;\n\n this.input = $(input);\n this.input.setAttribute(\"autocomplete\", \"off\");\n this.input.setAttribute(\"aria-expanded\", \"false\");\n this.input.setAttribute(\"aria-owns\", \"awesomplete_list_\" + this.count);\n this.input.setAttribute(\"role\", \"combobox\");\n\n // store constructor options in case we need to distinguish\n // between default and customized behavior later on\n this.options = o = o || {};\n\n configure(\n this,\n {\n minChars: 2,\n maxItems: 10,\n autoFirst: false,\n data: _.DATA,\n filter: _.FILTER_CONTAINS,\n sort: o.sort === false ? false : _.SORT_BYLENGTH,\n container: _.CONTAINER,\n item: _.ITEM,\n replace: _.REPLACE,\n listContainer: _.CONTAINER,\n tabSelect: false,\n listLabel: \"Results List\",\n },\n o\n );\n\n this.index = -1;\n\n // Create necessary elements\n\n this.container = this.container(input);\n\n this.ul = $.create(\"ul\", {\n hidden: \"hidden\",\n inside:\n me.listContainer === _.CONTAINER ? me.container : me.listContainer,\n role: \"listbox\",\n id: \"awesomplete_list_\" + this.count,\n \"aria-label\": this.listLabel,\n });\n\n this.status = $.create(\"span\", {\n className: \"visually-hidden\",\n role: \"status\",\n \"aria-live\": \"assertive\",\n \"aria-atomic\": true,\n inside: this.container,\n textContent:\n this.minChars != 0\n ? \"Type \" + this.minChars + \" or more characters for results.\"\n : \"Begin typing for results.\",\n });\n\n // Bind events\n\n this._events = {\n input: {\n input: this.evaluate.bind(this),\n blur: this.close.bind(this, { reason: \"blur\" }),\n keydown: function (evt) {\n var c = evt.keyCode;\n\n // If the dropdown `ul` is in view, then act on keydown for the following keys:\n // Enter / Esc / Up / Down\n if (me.opened) {\n if (c === 13 && me.selected) {\n // Enter\n evt.preventDefault();\n me.select(undefined, undefined, evt);\n } else if (c === 9 && me.selected && me.tabSelect) {\n evt.preventDefault();\n me.select(undefined, undefined, evt);\n } else if (c === 27) {\n // Esc\n me.close({ reason: \"esc\" });\n } else if (c === 38 || c === 40) {\n // Down/Up arrow\n evt.preventDefault();\n me[c === 38 ? \"previous\" : \"next\"]();\n }\n }\n },\n },\n form: {\n submit: this.close.bind(this, { reason: \"submit\" }),\n },\n ul: {\n // Prevent the default mousedowm, which ensures the input is not blurred.\n // The actual selection will happen on click. This also ensures dragging the\n // cursor away from the list item will cancel the selection\n mousedown: function (evt) {\n evt.preventDefault();\n },\n // The click event is fired even if the corresponding mousedown event has called preventDefault\n click: function (evt) {\n var li = evt.target;\n\n if (li !== this) {\n while (li && !/li/i.test(li.nodeName)) {\n li = li.parentNode;\n }\n\n if (li && evt.button === 0) {\n // Only select on left click\n evt.preventDefault();\n me.select(li, evt.target, evt);\n }\n }\n },\n },\n window: {\n scroll: function () {\n var boundingRect = me.container.getBoundingClientRect();\n me.ul.style.top = boundingRect.top + boundingRect.height + \"px\";\n me.ul.style.left = boundingRect.left + \"px\";\n me.ul.style.minWidth = boundingRect.width + \"px\";\n },\n },\n };\n\n $.bind(this.input, this._events.input);\n $.bind(this.input.form, this._events.form);\n $.bind(this.ul, this._events.ul);\n if (this.listContainer !== _.CONTAINER) {\n $.bind(window, this._events.window);\n }\n\n if (this.input.hasAttribute(\"list\")) {\n this.list = \"#\" + this.input.getAttribute(\"list\");\n this.input.removeAttribute(\"list\");\n } else {\n this.list = this.input.getAttribute(\"data-list\") || o.list || [];\n }\n\n _.all.push(this);\n };\n\n _.prototype = {\n set list(list) {\n if (Array.isArray(list)) {\n this._list = list;\n } else if (typeof list === \"string\" && list.indexOf(\",\") > -1) {\n this._list = list.split(/\\s*,\\s*/);\n } else {\n // Element or CSS selector\n list = $(list);\n\n if (list && list.children) {\n var items = [];\n slice.apply(list.children).forEach(function (el) {\n if (!el.disabled) {\n var text = el.textContent.trim();\n var value = el.value || text;\n var label = el.label || text;\n if (value !== \"\") {\n items.push({ label: label, value: value });\n }\n }\n });\n this._list = items;\n }\n }\n\n if (document.activeElement === this.input) {\n this.evaluate();\n }\n },\n\n get selected() {\n return this.index > -1;\n },\n\n get opened() {\n return this.isOpened;\n },\n\n close: function (o) {\n if (!this.opened) {\n return;\n }\n\n this.input.setAttribute(\"aria-expanded\", \"false\");\n this.ul.setAttribute(\"hidden\", \"\");\n this.isOpened = false;\n this.index = -1;\n\n this.status.setAttribute(\"hidden\", \"\");\n\n $.fire(this.input, \"awesomplete-close\", o || {});\n },\n\n open: function () {\n if (this.listContainer !== _.CONTAINER) {\n // In case the suggestion list is out of the container,\n // get the bounding information of the container to set the position of the suggestion list below\n var boundingRect = this.container.getBoundingClientRect();\n this.ul.style.top = boundingRect.top + boundingRect.height + \"px\";\n this.ul.style.left = boundingRect.left + \"px\";\n this.ul.style.position = \"fixed\";\n this.ul.style.transitionProperty = \"height, width, transform\";\n this.ul.style.minWidth = boundingRect.width + \"px\";\n this.ul.className = \"awesomplete-suggestion-list\";\n }\n this.input.setAttribute(\"aria-expanded\", \"true\");\n this.ul.removeAttribute(\"hidden\");\n this.isOpened = true;\n\n this.status.removeAttribute(\"hidden\");\n\n if (this.autoFirst && this.index === -1) {\n this.goto(0);\n }\n\n $.fire(this.input, \"awesomplete-open\");\n },\n\n destroy: function () {\n //remove events from the input and its form\n $.unbind(this.input, this._events.input);\n $.unbind(this.input.form, this._events.form);\n if (this.listContainer !== _.CONTAINER) {\n $.unbind(window, this._events.window);\n }\n\n // cleanup container if it was created by Awesomplete but leave it alone otherwise\n if (!this.options.container) {\n //move the input out of the awesomplete container and remove the container and its children\n var parentNode = this.container.parentNode;\n if (this.listContainer !== _.CONTAINER) {\n var ulParentNode = this.ul.parentNode;\n ulParentNode.removeChild(this.ul);\n } else {\n parentNode.insertBefore(this.input, this.container);\n parentNode.removeChild(this.container);\n }\n }\n\n //remove autocomplete and aria-autocomplete attributes\n this.input.removeAttribute(\"autocomplete\");\n this.input.removeAttribute(\"aria-autocomplete\");\n\n //remove this awesomeplete instance from the global array of instances\n var indexOfAwesomplete = _.all.indexOf(this);\n\n if (indexOfAwesomplete !== -1) {\n _.all.splice(indexOfAwesomplete, 1);\n }\n },\n\n next: function () {\n var count = this.ul.children.length;\n this.goto(this.index < count - 1 ? this.index + 1 : count ? 0 : -1);\n },\n\n previous: function () {\n var count = this.ul.children.length;\n var pos = this.index - 1;\n\n this.goto(this.selected && pos !== -1 ? pos : count - 1);\n },\n\n // Should not be used, highlights specific item without any checks!\n goto: function (i) {\n var lis = this.ul.children;\n\n if (this.selected) {\n lis[this.index].setAttribute(\"aria-selected\", \"false\");\n }\n\n this.index = i;\n\n if (i > -1 && lis.length > 0) {\n lis[i].setAttribute(\"aria-selected\", \"true\");\n\n this.status.textContent =\n lis[i].textContent + \", list item \" + (i + 1) + \" of \" + lis.length;\n\n this.input.setAttribute(\n \"aria-activedescendant\",\n this.ul.id + \"_item_\" + this.index\n );\n\n // scroll to highlighted element in case parent's height is fixed\n this.ul.scrollTop =\n lis[i].offsetTop - this.ul.clientHeight + lis[i].clientHeight;\n\n $.fire(this.input, \"awesomplete-highlight\", {\n text: this.suggestions[this.index],\n });\n }\n },\n\n select: function (selected, origin, originalEvent) {\n if (selected) {\n this.index = $.siblingIndex(selected);\n } else {\n selected = this.ul.children[this.index];\n }\n\n if (selected) {\n var suggestion = this.suggestions[this.index];\n\n var allowed = $.fire(this.input, \"awesomplete-select\", {\n text: suggestion,\n origin: origin || selected,\n originalEvent: originalEvent,\n });\n\n if (allowed) {\n this.replace(suggestion);\n this.close({ reason: \"select\" });\n $.fire(this.input, \"awesomplete-selectcomplete\", {\n text: suggestion,\n originalEvent: originalEvent,\n });\n }\n }\n },\n\n evaluate: function () {\n var me = this;\n var value = this.input.value;\n\n if (\n value.length >= this.minChars &&\n this._list &&\n this._list.length > 0\n ) {\n this.index = -1;\n // Populate list with options that match\n this.ul.innerHTML = \"\";\n\n this.suggestions = this._list\n .map(function (item) {\n return new Suggestion(me.data(item, value));\n })\n .filter(function (item) {\n return me.filter(item, value);\n });\n\n if (this.sort !== false) {\n this.suggestions = this.suggestions.sort(this.sort);\n }\n\n this.suggestions = this.suggestions.slice(0, this.maxItems);\n\n this.suggestions.forEach(function (text, index) {\n me.ul.appendChild(me.item(text, value, index));\n });\n\n if (this.ul.children.length === 0) {\n this.status.textContent = \"No results found\";\n\n this.close({ reason: \"nomatches\" });\n } else {\n this.open();\n\n this.status.textContent = this.ul.children.length + \" results found\";\n }\n } else {\n this.close({ reason: \"nomatches\" });\n\n this.status.textContent = \"No results found\";\n }\n },\n };\n\n // Static methods/properties\n\n _.all = [];\n\n _.FILTER_CONTAINS = function (text, input) {\n return RegExp($.regExpEscape(input.trim()), \"i\").test(text);\n };\n\n _.FILTER_STARTSWITH = function (text, input) {\n return RegExp(\"^\" + $.regExpEscape(input.trim()), \"i\").test(text);\n };\n\n _.SORT_BYLENGTH = function (a, b) {\n if (a.length !== b.length) {\n return a.length - b.length;\n }\n\n return a < b ? -1 : 1;\n };\n\n _.CONTAINER = function (input) {\n return $.create(\"div\", {\n className: \"awesomplete\",\n around: input,\n });\n };\n\n _.ITEM = function (text, input, item_id) {\n var html =\n input.trim() === \"\"\n ? text\n : text.replace(\n RegExp($.regExpEscape(input.trim()), \"gi\"),\n \"$&\"\n );\n return $.create(\"li\", {\n innerHTML: html,\n role: \"option\",\n \"aria-selected\": \"false\",\n id: \"awesomplete_list_\" + this.count + \"_item_\" + item_id,\n });\n };\n\n _.REPLACE = function (text) {\n this.input.value = text.value;\n };\n\n _.DATA = function (item /*, input*/) {\n return item;\n };\n\n // Private functions\n\n function Suggestion(data) {\n var o = Array.isArray(data)\n ? { label: data[0], value: data[1] }\n : typeof data === \"object\" && \"label\" in data && \"value\" in data\n ? data\n : { label: data, value: data };\n\n this.label = o.label || o.value;\n this.value = o.value;\n }\n Object.defineProperty(\n (Suggestion.prototype = Object.create(String.prototype)),\n \"length\",\n {\n get: function () {\n return this.label.length;\n },\n }\n );\n Suggestion.prototype.toString = Suggestion.prototype.valueOf = function () {\n return \"\" + this.label;\n };\n\n function configure(instance, properties, o) {\n for (var i in properties) {\n var initial = properties[i],\n attrValue = instance.input.getAttribute(\"data-\" + i.toLowerCase());\n\n if (typeof initial === \"number\") {\n instance[i] = parseInt(attrValue);\n } else if (initial === false) {\n // Boolean options must be false by default anyway\n instance[i] = attrValue !== null;\n } else if (initial instanceof Function) {\n instance[i] = null;\n } else {\n instance[i] = attrValue;\n }\n\n if (!instance[i] && instance[i] !== 0) {\n instance[i] = i in o ? o[i] : initial;\n }\n }\n }\n\n // Helpers\n\n var slice = Array.prototype.slice;\n\n function $(expr, con) {\n return typeof expr === \"string\"\n ? (con || document).querySelector(expr)\n : expr || null;\n }\n\n function $$(expr, con) {\n return slice.call((con || document).querySelectorAll(expr));\n }\n\n $.create = function (tag, o) {\n var element = document.createElement(tag);\n\n for (var i in o) {\n var val = o[i];\n\n if (i === \"inside\") {\n $(val).appendChild(element);\n } else if (i === \"around\") {\n var ref = $(val);\n ref.parentNode.insertBefore(element, ref);\n element.appendChild(ref);\n\n if (ref.getAttribute(\"autofocus\") != null) {\n ref.focus();\n }\n } else if (i in element) {\n element[i] = val;\n } else {\n element.setAttribute(i, val);\n }\n }\n\n return element;\n };\n\n $.bind = function (element, o) {\n if (element) {\n for (var event in o) {\n var callback = o[event];\n\n event.split(/\\s+/).forEach(function (event) {\n element.addEventListener(event, callback);\n });\n }\n }\n };\n\n $.unbind = function (element, o) {\n if (element) {\n for (var event in o) {\n var callback = o[event];\n\n event.split(/\\s+/).forEach(function (event) {\n element.removeEventListener(event, callback);\n });\n }\n }\n };\n\n $.fire = function (target, type, properties) {\n var evt = document.createEvent(\"HTMLEvents\");\n\n evt.initEvent(type, true, true);\n\n for (var j in properties) {\n evt[j] = properties[j];\n }\n\n return target.dispatchEvent(evt);\n };\n\n $.regExpEscape = function (s) {\n return s.replace(/[-\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n };\n\n $.siblingIndex = function (el) {\n /* eslint-disable no-cond-assign */\n for (var i = 0; (el = el.previousElementSibling); i++);\n return i;\n };\n\n // Initialization\n\n function init() {\n $$(\"input.awesomplete\").forEach(function (input) {\n new _(input);\n });\n }\n\n // Make sure to export Awesomplete on self when in a browser\n if (typeof self !== \"undefined\") {\n self.Awesomplete = _;\n }\n\n // Are we in a browser? Check for Document constructor\n if (typeof Document !== \"undefined\") {\n // DOM already loaded?\n if (document.readyState !== \"loading\") {\n init();\n } else {\n // Wait for it\n document.addEventListener(\"DOMContentLoaded\", init);\n }\n }\n\n _.$ = $;\n _.$$ = $$;\n\n // Expose Awesomplete as a CJS module\n if (typeof module === \"object\" && module.exports) {\n module.exports = _;\n }\n\n return _;\n})();\n"]} \ No newline at end of file diff --git a/index.html b/index.html index 2ed5949c..4ca7c44f 100644 --- a/index.html +++ b/index.html @@ -420,6 +420,7 @@

E-mail autocomplete

data: function (text, input) { return input.slice(0, input.indexOf("@")) + "@" + text; }, + listContainer: document.body, filter: Awesomplete.FILTER_STARTSWITH }); @@ -445,19 +446,20 @@

Multiple values

-

Ajax example (restcountries.eu api)

+

Ajax example (restcountries.com api)

Custom list example (based on user input)

+
<input id="query" class="awesomplete"  />