@ably/ui 6.0.1 → 6.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,46 @@
1
+ @layer components {
2
+ .ui-company-autocomplete-container {
3
+ @apply shadow-container absolute bg-white w-full z-10 font-sans;
4
+ }
5
+
6
+ .ui-company-autocomplete-list {
7
+ @apply border border-mid-grey border-t-0;
8
+ }
9
+
10
+ .ui-company-autocomplete-listitem {
11
+ @apply border-b border-mid-grey h-48;
12
+ }
13
+
14
+ .ui-company-autocomplete-btn {
15
+ @apply h-full w-full flex items-center py-4 px-12;
16
+ }
17
+
18
+ .ui-company-autocomplete-btn:focus {
19
+ @apply focus:text-gui-focus;
20
+ }
21
+
22
+ .ui-company-autocomplete-listitem:last-child {
23
+ @apply border-b-0;
24
+ }
25
+
26
+ .ui-company-autocomplete-listitem:hover {
27
+ @apply bg-light-grey cursor-pointer;
28
+ }
29
+
30
+ .ui-company-autocomplete-listitem:hover .ui-company-autocomplete-name {
31
+ @apply text-gui-hover;
32
+ }
33
+
34
+ .ui-company-autocomplete-logo {
35
+ @apply w-32;
36
+ }
37
+
38
+ .ui-company-autocomplete-name {
39
+ @apply font-sans font-light text-cool-black ml-8 text-p3 text-left;
40
+ }
41
+
42
+ .ui-company-autocomplete-domain {
43
+ @apply font-sans font-light text-dark-grey ml-auto text-p3;
44
+ }
45
+ }
46
+
@@ -0,0 +1 @@
1
+ !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.AblyUi=e():(t.AblyUi=t.AblyUi||{},t.AblyUi.Core=t.AblyUi.Core||{},t.AblyUi.Core.CompanyAutocomplete=e())}(this,(function(){return(()=>{var t={7757:(t,e,r)=>{t.exports=r(5666)},3096:(t,e,r)=>{var n="Expected a function",o=/^\s+|\s+$/g,i=/^[-+]0x[0-9a-f]+$/i,a=/^0b[01]+$/i,c=/^0o[0-7]+$/i,u=parseInt,f="object"==typeof r.g&&r.g&&r.g.Object===Object&&r.g,l="object"==typeof self&&self&&self.Object===Object&&self,s=f||l||Function("return this")(),p=Object.prototype.toString,d=Math.max,h=Math.min,v=function(){return s.Date.now()};function y(t){var e=typeof t;return!!t&&("object"==e||"function"==e)}function m(t){if("number"==typeof t)return t;if(function(t){return"symbol"==typeof t||function(t){return!!t&&"object"==typeof t}(t)&&"[object Symbol]"==p.call(t)}(t))return NaN;if(y(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=y(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(o,"");var r=a.test(t);return r||c.test(t)?u(t.slice(2),r?2:8):i.test(t)?NaN:+t}t.exports=function(t,e,r){var o=!0,i=!0;if("function"!=typeof t)throw new TypeError(n);return y(r)&&(o="leading"in r?!!r.leading:o,i="trailing"in r?!!r.trailing:i),function(t,e,r){var o,i,a,c,u,f,l=0,s=!1,p=!1,g=!0;if("function"!=typeof t)throw new TypeError(n);function w(e){var r=o,n=i;return o=i=void 0,l=e,c=t.apply(n,r)}function b(t){return l=t,u=setTimeout(E,e),s?w(t):c}function x(t){var r=t-f;return void 0===f||r>=e||r<0||p&&t-l>=a}function E(){var t=v();if(x(t))return L(t);u=setTimeout(E,function(t){var r=e-(t-f);return p?h(r,a-(t-l)):r}(t))}function L(t){return u=void 0,g&&o?w(t):(o=i=void 0,c)}function j(){var t=v(),r=x(t);if(o=arguments,i=this,f=t,r){if(void 0===u)return b(f);if(p)return u=setTimeout(E,e),w(f)}return void 0===u&&(u=setTimeout(E,e)),c}return e=m(e)||0,y(r)&&(s=!!r.leading,a=(p="maxWait"in r)?d(m(r.maxWait)||0,e):a,g="trailing"in r?!!r.trailing:g),j.cancel=function(){void 0!==u&&clearTimeout(u),l=0,o=f=i=u=void 0},j.flush=function(){return void 0===u?c:L(v())},j}(t,e,{leading:o,maxWait:e,trailing:i})}},5666:t=>{var e=function(t){"use strict";var e,r=Object.prototype,n=r.hasOwnProperty,o="function"==typeof Symbol?Symbol:{},i=o.iterator||"@@iterator",a=o.asyncIterator||"@@asyncIterator",c=o.toStringTag||"@@toStringTag";function u(t,e,r){return Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{u({},"")}catch(t){u=function(t,e,r){return t[e]=r}}function f(t,e,r,n){var o=e&&e.prototype instanceof y?e:y,i=Object.create(o.prototype),a=new k(n||[]);return i._invoke=function(t,e,r){var n=s;return function(o,i){if(n===d)throw new Error("Generator is already running");if(n===h){if("throw"===o)throw i;return S()}for(r.method=o,r.arg=i;;){var a=r.delegate;if(a){var c=O(a,r);if(c){if(c===v)continue;return c}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(n===s)throw n=h,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);n=d;var u=l(t,e,r);if("normal"===u.type){if(n=r.done?h:p,u.arg===v)continue;return{value:u.arg,done:r.done}}"throw"===u.type&&(n=h,r.method="throw",r.arg=u.arg)}}}(t,r,a),i}function l(t,e,r){try{return{type:"normal",arg:t.call(e,r)}}catch(t){return{type:"throw",arg:t}}}t.wrap=f;var s="suspendedStart",p="suspendedYield",d="executing",h="completed",v={};function y(){}function m(){}function g(){}var w={};w[i]=function(){return this};var b=Object.getPrototypeOf,x=b&&b(b(N([])));x&&x!==r&&n.call(x,i)&&(w=x);var E=g.prototype=y.prototype=Object.create(w);function L(t){["next","throw","return"].forEach((function(e){u(t,e,(function(t){return this._invoke(e,t)}))}))}function j(t,e){function r(o,i,a,c){var u=l(t[o],t,i);if("throw"!==u.type){var f=u.arg,s=f.value;return s&&"object"==typeof s&&n.call(s,"__await")?e.resolve(s.__await).then((function(t){r("next",t,a,c)}),(function(t){r("throw",t,a,c)})):e.resolve(s).then((function(t){f.value=t,a(f)}),(function(t){return r("throw",t,a,c)}))}c(u.arg)}var o;this._invoke=function(t,n){function i(){return new e((function(e,o){r(t,n,e,o)}))}return o=o?o.then(i,i):i()}}function O(t,r){var n=t.iterator[r.method];if(n===e){if(r.delegate=null,"throw"===r.method){if(t.iterator.return&&(r.method="return",r.arg=e,O(t,r),"throw"===r.method))return v;r.method="throw",r.arg=new TypeError("The iterator does not provide a 'throw' method")}return v}var o=l(n,t.iterator,r.arg);if("throw"===o.type)return r.method="throw",r.arg=o.arg,r.delegate=null,v;var i=o.arg;return i?i.done?(r[t.resultName]=i.value,r.next=t.nextLoc,"return"!==r.method&&(r.method="next",r.arg=e),r.delegate=null,v):i:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,v)}function T(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function _(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function k(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(T,this),this.reset(!0)}function N(t){if(t){var r=t[i];if(r)return r.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var o=-1,a=function r(){for(;++o<t.length;)if(n.call(t,o))return r.value=t[o],r.done=!1,r;return r.value=e,r.done=!0,r};return a.next=a}}return{next:S}}function S(){return{value:e,done:!0}}return m.prototype=E.constructor=g,g.constructor=m,m.displayName=u(g,c,"GeneratorFunction"),t.isGeneratorFunction=function(t){var e="function"==typeof t&&t.constructor;return!!e&&(e===m||"GeneratorFunction"===(e.displayName||e.name))},t.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,g):(t.__proto__=g,u(t,c,"GeneratorFunction")),t.prototype=Object.create(E),t},t.awrap=function(t){return{__await:t}},L(j.prototype),j.prototype[a]=function(){return this},t.AsyncIterator=j,t.async=function(e,r,n,o,i){void 0===i&&(i=Promise);var a=new j(f(e,r,n,o),i);return t.isGeneratorFunction(r)?a:a.next().then((function(t){return t.done?t.value:a.next()}))},L(E),u(E,c,"Generator"),E[i]=function(){return this},E.toString=function(){return"[object Generator]"},t.keys=function(t){var e=[];for(var r in t)e.push(r);return e.reverse(),function r(){for(;e.length;){var n=e.pop();if(n in t)return r.value=n,r.done=!1,r}return r.done=!0,r}},t.values=N,k.prototype={constructor:k,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=e,this.done=!1,this.delegate=null,this.method="next",this.arg=e,this.tryEntries.forEach(_),!t)for(var r in this)"t"===r.charAt(0)&&n.call(this,r)&&!isNaN(+r.slice(1))&&(this[r]=e)},stop:function(){this.done=!0;var t=this.tryEntries[0].completion;if("throw"===t.type)throw t.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var r=this;function o(n,o){return c.type="throw",c.arg=t,r.next=n,o&&(r.method="next",r.arg=e),!!o}for(var i=this.tryEntries.length-1;i>=0;--i){var a=this.tryEntries[i],c=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var u=n.call(a,"catchLoc"),f=n.call(a,"finallyLoc");if(u&&f){if(this.prev<a.catchLoc)return o(a.catchLoc,!0);if(this.prev<a.finallyLoc)return o(a.finallyLoc)}else if(u){if(this.prev<a.catchLoc)return o(a.catchLoc,!0)}else{if(!f)throw new Error("try statement without catch or finally");if(this.prev<a.finallyLoc)return o(a.finallyLoc)}}}},abrupt:function(t,e){for(var r=this.tryEntries.length-1;r>=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev<o.finallyLoc){var i=o;break}}i&&("break"===t||"continue"===t)&&i.tryLoc<=e&&e<=i.finallyLoc&&(i=null);var a=i?i.completion:{};return a.type=t,a.arg=e,i?(this.method="next",this.next=i.finallyLoc,v):this.complete(a)},complete:function(t,e){if("throw"===t.type)throw t.arg;return"break"===t.type||"continue"===t.type?this.next=t.arg:"return"===t.type?(this.rval=this.arg=t.arg,this.method="return",this.next="end"):"normal"===t.type&&e&&(this.next=e),v},finish:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),_(r),v}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;_(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,r,n){return this.delegate={iterator:N(t),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=e),v}},t}(t.exports);try{regeneratorRuntime=e}catch(t){Function("r","regeneratorRuntime = r")(e)}}},e={};function r(n){var o=e[n];if(void 0!==o)return o.exports;var i=e[n]={exports:{}};return t[n](i,i.exports,r),i.exports}r.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return r.d(e,{a:e}),e},r.d=(t,e)=>{for(var n in e)r.o(e,n)&&!r.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),r.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var n={};return(()=>{"use strict";r.d(n,{default:()=>h});var t=r(7757),e=r.n(t),o=r(3096),i=r.n(o);function a(t,e,r,n,o,i,a){try{var c=t[i](a),u=c.value}catch(t){return void r(t)}c.done?e(u):Promise.resolve(u).then(n,o)}function c(t){return function(){var e=this,r=arguments;return new Promise((function(n,o){var i=t.apply(e,r);function c(t){a(i,n,o,c,u,"next",t)}function u(t){a(i,n,o,c,u,"throw",t)}c(void 0)}))}}var u=function(t){return t.parentNode.querySelector("[data-id=company-autocomplete-dropdown]")},f=function(t){return t?t.querySelectorAll("li > button"):[]},l=function(t){return Array.from(t).indexOf(document.activeElement)},s=function(t){var e=u(t);e&&(e.classList.add("hidden"),e.querySelector("ol").innerHTML="")},p=function(t,e){var r=t.parentNode,n=function(t){var e=u(t);if(!e){t.parentNode.style.position="relative",(e=document.createElement("div")).dataset.id="company-autocomplete-dropdown",e.classList.add("ui-company-autocomplete-container");var r=document.createElement("ol");return r.classList.add("ui-company-autocomplete-list"),{container:e,list:r}}return{container:e,list:e.querySelector("ol")}}(t),o=n.container,i=n.list,a=function(t){return t.map((function(t){var e=document.createElement("li");e.classList.add("ui-company-autocomplete-listitem");var r=document.createElement("button");r.classList.add("ui-company-autocomplete-btn"),r.dataset.name=t.name;var n=document.createElement("img");n.alt="".concat(t.name," logo"),n.src=t.logo,n.classList.add("ui-company-autocomplete-logo");var o=document.createElement("p");o.textContent=t.name,o.classList.add("ui-company-autocomplete-name");var i=document.createElement("p");return i.textContent=t.domain,i.classList.add("ui-company-autocomplete-domain"),r.append(n),r.append(o),r.append(i),e.append(r),e}))}(e);s(t),a.forEach((function(r,n){i.append(r),r.addEventListener("click",(function(r){t.value=e[n].name,r.preventDefault()}))})),o.append(i),o.classList.remove("hidden"),r.append(o)},d=function(){var t=c(e().mark((function t(r,n){var o,i;return e().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(t.prev=0,n){t.next=3;break}return t.abrupt("return",[]);case 3:return t.next=5,fetch("".concat(r,"?query=").concat(n));case 5:return o=t.sent,t.next=8,o.json();case 8:return i=t.sent,t.abrupt("return",i);case 12:return t.prev=12,t.t0=t.catch(0),console.error(t.t0),t.abrupt("return",[]);case 16:case"end":return t.stop()}}),t,null,[[0,12]])})));return function(e,r){return t.apply(this,arguments)}}();const h=function(t,r){t&&r&&(t.addEventListener("keyup",i()(function(){var n=c(e().mark((function n(o){var i,a;return e().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!["Enter","Space","Tab","Escape"].includes(o.code)){e.next=2;break}return e.abrupt("return");case 2:return i=o.target.value,e.next=5,d(r,i);case 5:(a=e.sent)&&a.length>0&&p(t,a);case 7:case"end":return e.stop()}}),n)})));return function(t){return n.apply(this,arguments)}}(),100,{trailing:!0})),t.parentNode.addEventListener("keydown",(function(e){"ArrowDown"===e.code?function(t,e){var r=u(t),n=f(r),o=l(n);0!==n.length&&(document.activeElement===t?n[0].focus():o>=0&&o<n.length-1&&n[o+1].focus(),e.preventDefault())}(t,e):"ArrowUp"===e.code?function(t,e){var r=u(t),n=f(r),o=l(n);0!==n.length&&(0===o?t.focus():o>0&&n[o-1].focus(),e.preventDefault())}(t,e):"Enter"===e.code||"Space"===e.code?function(t,e){e.target.dataset.name&&(t.value=e.target.dataset.name,s(t),t.focus(),e.preventDefault())}(t,e):"Tab"===e.code?function(t,e){var r=u(t),n=f(r),o=l(n);(document.activeElement===t&&e.shiftKey||o===n.length-1)&&s(t)}(t,e):"Escape"===e.code&&s(t)})),document.body.addEventListener("click",(function(){s(t)})))}})(),n.default})()}));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ably/ui",
3
- "version": "6.0.1",
3
+ "version": "6.1.0",
4
4
  "description": "Home of the Ably design system library ([design.ably.com](https://design.ably.com)). It provides a showcase, development/test environment and a publishing pipeline for different distributables.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -0,0 +1,45 @@
1
+ @layer components {
2
+ .ui-company-autocomplete-container {
3
+ @apply shadow-container absolute bg-white w-full z-10 font-sans;
4
+ }
5
+
6
+ .ui-company-autocomplete-list {
7
+ @apply border border-mid-grey border-t-0;
8
+ }
9
+
10
+ .ui-company-autocomplete-listitem {
11
+ @apply border-b border-mid-grey h-48;
12
+ }
13
+
14
+ .ui-company-autocomplete-btn {
15
+ @apply h-full w-full flex items-center py-4 px-12;
16
+ }
17
+
18
+ .ui-company-autocomplete-btn:focus {
19
+ @apply focus:text-gui-focus;
20
+ }
21
+
22
+ .ui-company-autocomplete-listitem:last-child {
23
+ @apply border-b-0;
24
+ }
25
+
26
+ .ui-company-autocomplete-listitem:hover {
27
+ @apply bg-light-grey cursor-pointer;
28
+ }
29
+
30
+ .ui-company-autocomplete-listitem:hover .ui-company-autocomplete-name {
31
+ @apply text-gui-hover;
32
+ }
33
+
34
+ .ui-company-autocomplete-logo {
35
+ @apply w-32;
36
+ }
37
+
38
+ .ui-company-autocomplete-name {
39
+ @apply font-sans font-light text-cool-black ml-8 text-p3 text-left;
40
+ }
41
+
42
+ .ui-company-autocomplete-domain {
43
+ @apply font-sans font-light text-dark-grey ml-auto text-p3;
44
+ }
45
+ }
@@ -0,0 +1,202 @@
1
+ import "./component.css";
2
+
3
+ import throttle from "lodash.throttle";
4
+
5
+ const COMPANY_AUTOCOMPLETE_DROPDOWN = "[data-id=company-autocomplete-dropdown]";
6
+
7
+ const getContainer = (input) =>
8
+ input.parentNode.querySelector(COMPANY_AUTOCOMPLETE_DROPDOWN);
9
+ const getItems = (container) =>
10
+ container ? container.querySelectorAll("li > button") : [];
11
+ const getFocusedItemIndex = (items) =>
12
+ Array.from(items).indexOf(document.activeElement);
13
+
14
+ const clearList = (input) => {
15
+ const container = getContainer(input);
16
+
17
+ if (container) {
18
+ container.classList.add("hidden");
19
+ container.querySelector("ol").innerHTML = "";
20
+ }
21
+ };
22
+
23
+ const renderItems = (data) =>
24
+ data.map((element) => {
25
+ const listItem = document.createElement("li");
26
+ listItem.classList.add("ui-company-autocomplete-listitem");
27
+
28
+ const btn = document.createElement("button");
29
+ btn.classList.add("ui-company-autocomplete-btn");
30
+ btn.dataset.name = element.name;
31
+
32
+ const logo = document.createElement("img");
33
+ logo.alt = `${element.name} logo`;
34
+ logo.src = element.logo;
35
+ logo.classList.add("ui-company-autocomplete-logo");
36
+
37
+ const name = document.createElement("p");
38
+ name.textContent = element.name;
39
+ name.classList.add("ui-company-autocomplete-name");
40
+
41
+ const domain = document.createElement("p");
42
+ domain.textContent = element.domain;
43
+ domain.classList.add("ui-company-autocomplete-domain");
44
+
45
+ btn.append(logo);
46
+ btn.append(name);
47
+ btn.append(domain);
48
+ listItem.append(btn);
49
+
50
+ return listItem;
51
+ });
52
+
53
+ const renderContainer = (input) => {
54
+ let container = getContainer(input);
55
+
56
+ if (!container) {
57
+ input.parentNode.style.position = "relative";
58
+
59
+ container = document.createElement("div");
60
+ container.dataset.id = "company-autocomplete-dropdown";
61
+ container.classList.add("ui-company-autocomplete-container");
62
+
63
+ const list = document.createElement("ol");
64
+ list.classList.add("ui-company-autocomplete-list");
65
+
66
+ return { container, list };
67
+ }
68
+
69
+ return { container, list: container.querySelector("ol") };
70
+ };
71
+
72
+ const renderDropdown = (input, data) => {
73
+ const parent = input.parentNode;
74
+ const { container, list } = renderContainer(input);
75
+ const items = renderItems(data);
76
+
77
+ clearList(input);
78
+
79
+ items.forEach((item, index) => {
80
+ list.append(item);
81
+ item.addEventListener("click", (event) => {
82
+ input.value = data[index].name;
83
+ event.preventDefault();
84
+ });
85
+ });
86
+
87
+ container.append(list);
88
+ container.classList.remove("hidden");
89
+ parent.append(container);
90
+ };
91
+
92
+ const fetchData = async (url, query) => {
93
+ try {
94
+ if (!query) {
95
+ return [];
96
+ }
97
+
98
+ const res = await fetch(`${url}?query=${query}`);
99
+ const payload = await res.json();
100
+
101
+ return payload;
102
+ } catch (e) {
103
+ // eslint-disable-next-line no-console
104
+ console.error(e);
105
+ return [];
106
+ }
107
+ };
108
+
109
+ const handleDownArrow = (input, event) => {
110
+ const container = getContainer(input);
111
+ const items = getItems(container);
112
+ const focusedItemIndex = getFocusedItemIndex(items);
113
+
114
+ if (items.length === 0) {
115
+ return;
116
+ } else if (document.activeElement === input) {
117
+ items[0].focus();
118
+ } else if (focusedItemIndex >= 0 && focusedItemIndex < items.length - 1) {
119
+ items[focusedItemIndex + 1].focus();
120
+ }
121
+
122
+ event.preventDefault();
123
+ };
124
+
125
+ const handleUpArrow = (input, event) => {
126
+ const container = getContainer(input);
127
+ const items = getItems(container);
128
+ const focusedItemIndex = getFocusedItemIndex(items);
129
+
130
+ if (items.length === 0) {
131
+ return;
132
+ } else if (focusedItemIndex === 0) {
133
+ input.focus();
134
+ } else if (focusedItemIndex > 0) {
135
+ items[focusedItemIndex - 1].focus();
136
+ }
137
+
138
+ event.preventDefault();
139
+ };
140
+
141
+ const handleTab = (input, event) => {
142
+ const container = getContainer(input);
143
+ const items = getItems(container);
144
+ const focusedItemIndex = getFocusedItemIndex(items);
145
+
146
+ if (document.activeElement === input && event.shiftKey) {
147
+ clearList(input);
148
+ } else if (focusedItemIndex === items.length - 1) {
149
+ clearList(input);
150
+ }
151
+ };
152
+
153
+ const handleEnter = (input, event) => {
154
+ if (event.target.dataset.name) {
155
+ input.value = event.target.dataset.name;
156
+ clearList(input);
157
+ input.focus();
158
+ event.preventDefault();
159
+ }
160
+ };
161
+
162
+ const CompanyAutocomplete = (input, url) => {
163
+ if (!input || !url) return;
164
+
165
+ input.addEventListener(
166
+ "keyup",
167
+ throttle(
168
+ async (event) => {
169
+ if (["Enter", "Space", "Tab", "Escape"].includes(event.code)) return;
170
+
171
+ const query = event.target.value;
172
+ const data = await fetchData(url, query);
173
+
174
+ if (data && data.length > 0) {
175
+ renderDropdown(input, data);
176
+ }
177
+ },
178
+ 100,
179
+ { trailing: true }
180
+ )
181
+ );
182
+
183
+ input.parentNode.addEventListener("keydown", (event) => {
184
+ if (event.code === "ArrowDown") {
185
+ handleDownArrow(input, event);
186
+ } else if (event.code === "ArrowUp") {
187
+ handleUpArrow(input, event);
188
+ } else if (event.code === "Enter" || event.code === "Space") {
189
+ handleEnter(input, event);
190
+ } else if (event.code === "Tab") {
191
+ handleTab(input, event);
192
+ } else if (event.code === "Escape") {
193
+ clearList(input);
194
+ }
195
+ });
196
+
197
+ document.body.addEventListener("click", () => {
198
+ clearList(input);
199
+ });
200
+ };
201
+
202
+ export default CompanyAutocomplete;