places-autocomplete-js 1.0.4 → 1.0.5

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.
package/README.md CHANGED
@@ -7,9 +7,16 @@ A flexible and customizable vanilla JavaScript library leveraging the [Google Ma
7
7
 
8
8
  It handles API loading, session tokens for cost-effective usage, fetching suggestions with debouncing, keyboard navigation, highlighting matched text, and requesting place details, allowing you to focus on integrating the results into your application.
9
9
 
10
- ## Demo
10
+ ## Live Demos
11
+
12
+ Explore interactive examples of the Google Places Autocomplete JS library:
13
+
14
+ A quick, editable sandbox to experiment with the core functionality:
15
+
16
+ [![Try it on CodePen](https://img.shields.io/badge/Try%20it%20on-CodePen-blue?style=for-the-badge&logo=codepen)](https://codepen.io/alexpechkarev/pen/wBaMaMY)
17
+
18
+ See a more comprehensive live demo of the library in action: [pacservice.pages.dev](https://pacservice.pages.dev/)
11
19
 
12
- See a live demo of the library in action: [Basic Example](https://pacservice.pages.dev/)
13
20
 
14
21
 
15
22
 
@@ -1,10 +1,10 @@
1
- var B = Object.defineProperty;
2
- var G = (l) => {
3
- throw TypeError(l);
1
+ var H = Object.defineProperty;
2
+ var K = (c) => {
3
+ throw TypeError(c);
4
4
  };
5
- var H = (l, t, s) => t in l ? B(l, t, { enumerable: !0, configurable: !0, writable: !0, value: s }) : l[t] = s;
6
- var K = (l, t, s) => H(l, typeof t != "symbol" ? t + "" : t, s), $ = (l, t, s) => t.has(l) || G("Cannot " + s);
7
- var e = (l, t, s) => ($(l, t, "read from private field"), s ? s.call(l) : t.get(l)), h = (l, t, s) => t.has(l) ? G("Cannot add the same private member more than once") : t instanceof WeakSet ? t.add(l) : t.set(l, s), c = (l, t, s, i) => ($(l, t, "write to private field"), i ? i.call(l, s) : t.set(l, s), s);
5
+ var V = (c, t, s) => t in c ? H(c, t, { enumerable: !0, configurable: !0, writable: !0, value: s }) : c[t] = s;
6
+ var $ = (c, t, s) => V(c, typeof t != "symbol" ? t + "" : t, s), F = (c, t, s) => t.has(c) || K("Cannot " + s);
7
+ var e = (c, t, s) => (F(c, t, "read from private field"), s ? s.call(c) : t.get(c)), h = (c, t, s) => t.has(c) ? K("Cannot add the same private member more than once") : t instanceof WeakSet ? t.add(c) : t.set(c, s), l = (c, t, s, i) => (F(c, t, "write to private field"), i ? i.call(c, s) : t.set(c, s), s);
8
8
  /**
9
9
  * Initializes a Places Autocomplete widget.
10
10
  * This script dynamically loads the Google Maps JavaScript API, creates the UI elements
@@ -16,8 +16,8 @@ var e = (l, t, s) => ($(l, t, "read from private field"), s ? s.call(l) : t.get(
16
16
  * @license MIT
17
17
  *
18
18
  */
19
- var F, f, q, D, n, A, r, u, o, E, w, k, b, p, O, y, j, R;
20
- class J {
19
+ var B, M, C, D, O, n, A, r, u, o, x, E, w, f, p, j, g, R, z;
20
+ class U {
21
21
  /**
22
22
  * Class constructor for PacAutocomplete.
23
23
  * Initializes the autocomplete widget with the provided configuration.
@@ -31,24 +31,26 @@ class J {
31
31
  */
32
32
  constructor(t) {
33
33
  // --- Private Properties (using # or _ prefix by convention) ---
34
- h(this, f);
35
- h(this, q);
34
+ h(this, M);
35
+ // Container ID where the autocomplete widget will be rendered.
36
+ h(this, C);
36
37
  h(this, D);
38
+ h(this, O);
37
39
  h(this, n);
38
40
  h(this, A);
39
41
  h(this, r);
40
42
  h(this, u);
41
43
  h(this, o);
44
+ h(this, x);
42
45
  h(this, E);
43
46
  h(this, w);
44
- h(this, k);
45
- h(this, b, []);
47
+ h(this, f, []);
46
48
  h(this, p, -1);
47
- h(this, O);
49
+ h(this, j);
48
50
  // For user-provided data callback
49
- h(this, y);
51
+ h(this, g);
50
52
  // For user-provided error callback
51
- h(this, j, {
53
+ h(this, R, {
52
54
  // CSS classes for various parts of the widget.
53
55
  section: "",
54
56
  // Outer section container.
@@ -93,7 +95,7 @@ class J {
93
95
  highlight: "font-bold"
94
96
  // Class for highlighting matched text in suggestions.
95
97
  });
96
- h(this, R, {
98
+ h(this, z, {
97
99
  // Default parameters for the autocomplete request.
98
100
  input: "",
99
101
  // Initial input value (empty).
@@ -106,7 +108,7 @@ class J {
106
108
  * Debounced function to fetch autocomplete suggestions from the Google Places API.
107
109
  * Triggered by the 'input' event on the input element.
108
110
  */
109
- K(this, "_debouncedMakeAcRequest", this._debounce(async () => {
111
+ $(this, "_debouncedMakeAcRequest", this._debounce(async () => {
110
112
  if (!e(this, r) || !e(this, r).value) {
111
113
  this._reset(), e(this, r) && e(this, r).setAttribute("aria-expanded", "false");
112
114
  return;
@@ -123,18 +125,18 @@ class J {
123
125
  ...this._createSuggestionElements(t)
124
126
  ), e(this, o).style.display = "block", e(this, r).setAttribute("aria-expanded", "true")) : (this._reset(), e(this, r).setAttribute("aria-expanded", "false"));
125
127
  } catch (t) {
126
- e(this, y).call(this, t), this._reset(), e(this, r) && e(this, r).setAttribute("aria-expanded", "false");
128
+ e(this, g).call(this, t), this._reset(), e(this, r) && e(this, r).setAttribute("aria-expanded", "false");
127
129
  }
128
- }, ((F = e(this, n)) == null ? void 0 : F.debounce) ?? 100));
130
+ }, ((B = e(this, n)) == null ? void 0 : B.debounce) ?? 100));
129
131
  if (!t || !t.containerId || !t.googleMapsApiKey)
130
132
  throw new Error(
131
133
  "PacAutocomplete: Missing required configuration (containerId, googleMapsApiKey)."
132
134
  );
133
- if (c(this, f, document.getElementById(t.containerId)), !e(this, f))
135
+ if (l(this, M, t.containerId), l(this, C, document.getElementById(t.containerId)), !e(this, C))
134
136
  throw new Error(
135
137
  `PacAutocomplete: Container element with ID "${t.containerId}" not found.`
136
138
  );
137
- c(this, q, t.googleMapsApiKey), c(this, D, t.googleMapsApiVersion || "weekly"), c(this, n, {
139
+ l(this, D, t.googleMapsApiKey), l(this, O, t.googleMapsApiVersion || "weekly"), l(this, n, {
138
140
  autofocus: !1,
139
141
  // Automatically focus the input on load.
140
142
  autocomplete: "off",
@@ -152,26 +154,26 @@ class J {
152
154
  ...t.options
153
155
  // User-defined options override defaults
154
156
  }), t.options && t.options.classes ? e(this, n).classes = {
155
- ...e(this, j),
157
+ ...e(this, R),
156
158
  ...t.options.classes
157
- } : e(this, n).classes = e(this, j), c(this, O, t.onResponse || ((s) => {
159
+ } : e(this, n).classes = e(this, R), l(this, j, t.onResponse || ((s) => {
158
160
  console.info("---------Default onResponse not provided---------"), console.info("Selected Place:", JSON.stringify(s, null, 2));
159
- })), c(this, y, t.onError || ((s) => {
161
+ })), l(this, g, t.onError || ((s) => {
160
162
  console.error("---------Default onError not provided---------"), console.error("PAC Error:", s);
161
- })), t.requestParams && Object.keys(t.requestParams).length > 0 ? c(this, A, {
162
- ...e(this, R),
163
+ })), t.requestParams && Object.keys(t.requestParams).length > 0 ? l(this, A, {
164
+ ...e(this, z),
163
165
  ...t.requestParams
164
- }) : c(this, A, { ...e(this, R) }), this._init();
166
+ }) : l(this, A, { ...e(this, z) }), this._init();
165
167
  }
166
168
  // --- Private Initialization Method ---
167
169
  async _init() {
168
170
  try {
169
171
  (typeof google > "u" || !google.maps) && await this._loadGoogleMapsApi({
170
- key: e(this, q),
171
- v: e(this, D)
172
+ key: e(this, D),
173
+ v: e(this, O)
172
174
  }), this._createPACStructure(), await this._initializeAutocomplete();
173
175
  } catch (t) {
174
- e(this, y).call(this, t);
176
+ e(this, g).call(this, t);
175
177
  }
176
178
  }
177
179
  /**
@@ -185,10 +187,10 @@ class J {
185
187
  _debounce(t, s) {
186
188
  let i = null;
187
189
  return function(...d) {
188
- const _ = () => {
190
+ const b = () => {
189
191
  i = null, t(...d);
190
192
  };
191
- i !== null && clearTimeout(i), i = setTimeout(_, s ?? 100);
193
+ i !== null && clearTimeout(i), i = setTimeout(b, s ?? 100);
192
194
  };
193
195
  }
194
196
  /**
@@ -210,39 +212,39 @@ class J {
210
212
  * @param {object} g - Configuration object for the API loader (key, v, libraries, etc.).
211
213
  */
212
214
  async _loadGoogleMapsApi(t) {
213
- var s, i, a, d = "The Google Maps JavaScript API", _ = "google", M = "importLibrary", L = "__ib__", T = document, v = window;
214
- v = v[_] || (v[_] = {});
215
- var x = v.maps || (v.maps = {}), S = /* @__PURE__ */ new Set(), N = new URLSearchParams(), I = () => (
215
+ var s, i, a, d = "The Google Maps JavaScript API", b = "google", T = "importLibrary", L = "__ib__", N = document, y = window;
216
+ y = y[b] || (y[b] = {});
217
+ var v = y.maps || (y.maps = {}), S = /* @__PURE__ */ new Set(), I = new URLSearchParams(), q = () => (
216
218
  // Function to initiate API loading (if not already started)
217
219
  s || // eslint-disable-next-line no-async-promise-executor
218
- (s = new Promise(async (C, m) => {
220
+ (s = new Promise(async (k, m) => {
219
221
  var P;
220
- i = T.createElement("script"), N.set("libraries", [...S].join(","));
222
+ i = N.createElement("script"), I.set("libraries", [...S].join(","));
221
223
  for (a in t)
222
- N.set(
223
- a.replace(/[A-Z]/g, (g) => "_" + g[0].toLowerCase()),
224
+ I.set(
225
+ a.replace(/[A-Z]/g, (_) => "_" + _[0].toLowerCase()),
224
226
  // Convert camelCase to snake_case
225
227
  t[a]
226
228
  );
227
- N.set("callback", _ + ".maps." + L), i.src = `https://maps.${_}apis.com/maps/api/js?` + N, x[L] = C, i.onerror = () => s = m(Error(d + " could not load.")), i.nonce = ((P = T.querySelector("script[nonce]")) == null ? void 0 : P.nonce) || "", T.head.append(i);
229
+ I.set("callback", b + ".maps." + L), i.src = `https://maps.${b}apis.com/maps/api/js?` + I, v[L] = k, i.onerror = () => s = m(Error(d + " could not load.")), i.nonce = ((P = N.querySelector("script[nonce]")) == null ? void 0 : P.nonce) || "", N.head.append(i);
228
230
  }))
229
231
  );
230
- x[M] ? console.warn(d + " only loads once. Ignoring:", t) : x[M] = (C, ...m) => S.add(C) && I().then(() => x[M](C, ...m));
232
+ v[T] ? console.warn(d + " only loads once. Ignoring:", t) : v[T] = (k, ...m) => S.add(k) && q().then(() => v[T](k, ...m));
231
233
  }
232
234
  // --- UI Creation ---
233
235
  _createPACStructure() {
234
236
  const t = document.createElement("section");
235
- e(this, n).classes.section.split(" ").forEach((d) => d && t.classList.add(d)), c(this, u, document.createElement("div")), e(this, u).className = e(this, n).classes.container, e(this, u).setAttribute("id", e(this, f)), t.appendChild(e(this, u));
237
+ e(this, n).classes.section.split(" ").forEach((d) => d && t.classList.add(d)), l(this, u, document.createElement("div")), e(this, u).className = e(this, n).classes.container, e(this, u).setAttribute("id", e(this, M) + "-div"), t.appendChild(e(this, u));
236
238
  const s = document.createElement("div");
237
239
  s.className = e(this, n).classes.icon_container, e(this, u).appendChild(s);
238
240
  const i = document.createElement("div");
239
- if (i.innerHTML = e(this, n).classes.icon, s.appendChild(i.firstElementChild), c(this, r, document.createElement("input")), e(this, r).id = "input" + e(this, f), e(this, r).type = "text", e(this, r).name = "search", e(this, r).placeholder = e(this, n).placeholder, e(this, r).autocomplete = e(this, n).autocomplete, e(this, r).className = e(this, n).classes.input, e(this, r).setAttribute("role", "combobox"), e(this, r).setAttribute("aria-autocomplete", "list"), e(this, r).setAttribute("aria-expanded", "false"), e(this, r).setAttribute("aria-controls", "pacSuggestions"), e(this, n).autofocus && (e(this, r).autofocus = !0), e(this, n).label) {
241
+ if (i.innerHTML = e(this, n).classes.icon, s.appendChild(i.firstElementChild), l(this, r, document.createElement("input")), e(this, r).id = e(this, M) + "-input", e(this, r).type = "text", e(this, r).name = "search", e(this, r).placeholder = e(this, n).placeholder, e(this, r).autocomplete = e(this, n).autocomplete, e(this, r).className = e(this, n).classes.input, e(this, r).setAttribute("role", "combobox"), e(this, r).setAttribute("aria-autocomplete", "list"), e(this, r).setAttribute("aria-expanded", "false"), e(this, r).setAttribute("aria-controls", "pacSuggestions"), e(this, n).autofocus && (e(this, r).autofocus = !0), e(this, n).label) {
240
242
  const d = document.createElement("label");
241
- d.htmlFor = "labelInput" + e(this, f), d.textContent = e(this, n).label, e(this, u).appendChild(d);
243
+ d.htmlFor = e(this, M) + "-labelInput", d.textContent = e(this, n).label, e(this, u).appendChild(d);
242
244
  }
243
245
  e(this, u).appendChild(e(this, r));
244
246
  const a = document.createElement("div");
245
- a.className = e(this, n).classes.kbd_container, c(this, E, document.createElement("kbd")), e(this, E).className = e(this, n).classes.kbd_escape, e(this, E).textContent = "Esc", a.appendChild(e(this, E)), c(this, w, document.createElement("kbd")), e(this, w).className = e(this, n).classes.kbd_up, e(this, w).innerHTML = "↑", a.appendChild(e(this, w)), c(this, k, document.createElement("kbd")), e(this, k).className = e(this, n).classes.kbd_down, e(this, k).innerHTML = "↓", a.appendChild(e(this, k)), e(this, u).appendChild(a), c(this, o, document.createElement("ul")), e(this, o).id = "pacSuggestions", e(this, o).className = e(this, n).classes.ul, e(this, o).style.display = "none", e(this, o).setAttribute("role", "listbox"), e(this, u).appendChild(e(this, o)), e(this, f).appendChild(t), t.addEventListener("keydown", this._onKeyDown.bind(this));
247
+ a.className = e(this, n).classes.kbd_container, l(this, x, document.createElement("kbd")), e(this, x).className = e(this, n).classes.kbd_escape, e(this, x).textContent = "Esc", a.appendChild(e(this, x)), l(this, E, document.createElement("kbd")), e(this, E).className = e(this, n).classes.kbd_up, e(this, E).innerHTML = "↑", a.appendChild(e(this, E)), l(this, w, document.createElement("kbd")), e(this, w).className = e(this, n).classes.kbd_down, e(this, w).innerHTML = "↓", a.appendChild(e(this, w)), e(this, u).appendChild(a), l(this, o, document.createElement("ul")), e(this, o).id = "pacSuggestions", e(this, o).className = e(this, n).classes.ul, e(this, o).style.display = "none", e(this, o).setAttribute("role", "listbox"), e(this, u).appendChild(e(this, o)), e(this, C).appendChild(t), t.addEventListener("keydown", this._onKeyDown.bind(this));
246
248
  }
247
249
  /**
248
250
  * Initializes the core autocomplete functionality after the API is loaded.
@@ -258,10 +260,10 @@ class J {
258
260
  e(this, o) && !e(this, o).contains(document.activeElement) && (e(this, o).style.display = "none", e(this, r).setAttribute("aria-expanded", "false"));
259
261
  }, 200);
260
262
  }), e(this, r).addEventListener("focus", () => {
261
- e(this, r).value && e(this, b).length > 0 && (e(this, o).style.display = "block", e(this, r).setAttribute("aria-expanded", "true"));
262
- })) : e(this, y).call(this, new Error("Input element not found during initialization."));
263
+ e(this, r).value && e(this, f).length > 0 && (e(this, o).style.display = "block", e(this, r).setAttribute("aria-expanded", "true"));
264
+ })) : e(this, g).call(this, new Error("Input element not found during initialization."));
263
265
  } catch (t) {
264
- console.error("Error initializing Google Places Autocomplete:", t), e(this, y).call(this, new Error("Google Maps Places library not available."));
266
+ console.error("Error initializing Google Places Autocomplete:", t), e(this, g).call(this, new Error("Google Maps Places library not available."));
265
267
  }
266
268
  }
267
269
  /**
@@ -269,7 +271,7 @@ class J {
269
271
  * @param {boolean} [refresh=false] - Whether to refresh the Google Places session token.
270
272
  */
271
273
  _reset(t = !1) {
272
- c(this, p, -1), e(this, r) && (e(this, r).value = ""), c(this, b, []), c(this, p, -1), e(this, o) && (e(this, o).innerHTML = "", e(this, o).style.display = "none"), t && this._refreshToken();
274
+ l(this, p, -1), e(this, r) && (e(this, r).value = ""), l(this, f, []), l(this, p, -1), e(this, o) && (e(this, o).innerHTML = "", e(this, o).style.display = "none"), t && this._refreshToken();
273
275
  }
274
276
  /**
275
277
  * Removes the 'current' highlighting classes from all suggestion list items (li) and their links (a).
@@ -287,12 +289,12 @@ class J {
287
289
  * @param {KeyboardEvent} e - The keyboard event object.
288
290
  */
289
291
  _onKeyDown(t) {
290
- if (!(!e(this, b).length || !e(this, o) || e(this, o).style.display === "none"))
292
+ if (!(!e(this, f).length || !e(this, o) || e(this, o).style.display === "none"))
291
293
  if (this._resetLiClasses(), t.key === "ArrowDown") {
292
- t.preventDefault(), c(this, p, Math.min(
294
+ t.preventDefault(), l(this, p, Math.min(
293
295
  e(this, p) + 1,
294
- e(this, b).length - 1
295
- )), e(this, p) < 0 && c(this, p, 0);
296
+ e(this, f).length - 1
297
+ )), e(this, p) < 0 && l(this, p, 0);
296
298
  const s = e(this, o).children.item(e(this, p));
297
299
  if (s) {
298
300
  const i = s.querySelector("a");
@@ -300,16 +302,16 @@ class J {
300
302
  }
301
303
  e(this, n).classes.kbd_active.split(" ").forEach((i) => {
302
304
  var a;
303
- return (a = e(this, k)) == null ? void 0 : a.classList.add(i);
305
+ return (a = e(this, w)) == null ? void 0 : a.classList.add(i);
304
306
  }), setTimeout(
305
307
  () => e(this, n).classes.kbd_active.split(" ").forEach((i) => {
306
308
  var a;
307
- return (a = e(this, k)) == null ? void 0 : a.classList.remove(i);
309
+ return (a = e(this, w)) == null ? void 0 : a.classList.remove(i);
308
310
  }),
309
311
  300
310
312
  );
311
313
  } else if (t.key === "ArrowUp") {
312
- t.preventDefault(), c(this, p, Math.max(e(this, p) - 1, 0));
314
+ t.preventDefault(), l(this, p, Math.max(e(this, p) - 1, 0));
313
315
  const s = e(this, o).children.item(e(this, p));
314
316
  if (s) {
315
317
  const i = s.querySelector("a");
@@ -317,23 +319,23 @@ class J {
317
319
  }
318
320
  e(this, n).classes.kbd_active.split(" ").forEach((i) => {
319
321
  var a;
320
- return (a = e(this, w)) == null ? void 0 : a.classList.add(i);
322
+ return (a = e(this, E)) == null ? void 0 : a.classList.add(i);
321
323
  }), setTimeout(
322
324
  () => e(this, n).classes.kbd_active.split(" ").forEach((i) => {
323
325
  var a;
324
- return (a = e(this, w)) == null ? void 0 : a.classList.remove(i);
326
+ return (a = e(this, E)) == null ? void 0 : a.classList.remove(i);
325
327
  }),
326
328
  300
327
329
  );
328
- } else t.key === "Enter" ? (t.preventDefault(), e(this, p) >= 0 && e(this, p) < e(this, b).length && this._onPlaceSelected(
329
- e(this, b)[e(this, p)].place
330
+ } else t.key === "Enter" ? (t.preventDefault(), e(this, p) >= 0 && e(this, p) < e(this, f).length && this._onPlaceSelected(
331
+ e(this, f)[e(this, p)].place
330
332
  )) : t.key === "Escape" && (t.preventDefault(), e(this, n).classes.kbd_active.split(" ").forEach((s) => {
331
333
  var i;
332
- return (i = e(this, E)) == null ? void 0 : i.classList.add(s);
334
+ return (i = e(this, x)) == null ? void 0 : i.classList.add(s);
333
335
  }), setTimeout(
334
336
  () => e(this, n).classes.kbd_active.split(" ").forEach((s) => {
335
337
  var i;
336
- return (i = e(this, E)) == null ? void 0 : i.classList.remove(s);
338
+ return (i = e(this, x)) == null ? void 0 : i.classList.remove(s);
337
339
  }),
338
340
  300
339
341
  ), this._reset(!0));
@@ -346,8 +348,8 @@ class J {
346
348
  * @returns {Array<HTMLLIElement>} An array of LI elements to be added to the suggestions UL.
347
349
  */
348
350
  _createSuggestionElements(t) {
349
- return c(this, b, []), t.map((s, i) => {
350
- e(this, b).push({
351
+ return l(this, f, []), t.map((s, i) => {
352
+ e(this, f).push({
351
353
  id: i + 1,
352
354
  description: s.placePrediction.toString(),
353
355
  place: s.placePrediction.toPlace()
@@ -356,36 +358,36 @@ class J {
356
358
  a.className = e(this, n).classes.li_div_container;
357
359
  const d = document.createElement("div");
358
360
  d.className = e(this, n).classes.li_div_one, a.appendChild(d);
359
- const _ = document.createElement("p");
360
- _.className = e(this, n).classes.li_div_one_p;
361
- const M = s.placePrediction.text, L = M.text, T = M.matches;
362
- let v = 0;
363
- T.sort((g, z) => g.startOffset - z.startOffset);
364
- const x = document.createElement("span"), S = document.createElement("span");
361
+ const b = document.createElement("p");
362
+ b.className = e(this, n).classes.li_div_one_p;
363
+ const T = s.placePrediction.text, L = T.text, N = T.matches;
364
+ let y = 0;
365
+ N.sort((_, G) => _.startOffset - G.startOffset);
366
+ const v = document.createElement("span"), S = document.createElement("span");
365
367
  S.classList = e(this, n).classes.highlight ?? "font-bold";
366
- for (const g of T)
367
- x.textContent += L.substring(
368
- v,
369
- g.startOffset
370
- ), g.startOffset > 0 && L.charAt(g.startOffset - 1) == " " && (S.textContent += " "), S.textContent += L.substring(
371
- g.startOffset,
372
- g.endOffset
373
- ), v = g.endOffset;
374
- const N = document.createTextNode(
375
- L.substring(v)
368
+ for (const _ of N)
369
+ v.textContent += L.substring(
370
+ y,
371
+ _.startOffset
372
+ ), _.startOffset > 0 && L.charAt(_.startOffset - 1) == " " && (S.textContent += " "), S.textContent += L.substring(
373
+ _.startOffset,
374
+ _.endOffset
375
+ ), y = _.endOffset;
376
+ const I = document.createTextNode(
377
+ L.substring(y)
376
378
  );
377
- x.appendChild(S), x.appendChild(N), _.appendChild(x), d.appendChild(_), a.appendChild(d);
378
- const I = document.createElement("div");
379
- I.className = e(this, n).classes.li_div_two, a.appendChild(I);
380
- const C = document.createElement("p");
381
- C.className = e(this, n).classes.li_div_two_p, C.textContent = this._formatDistance(
379
+ v.appendChild(S), v.appendChild(I), b.appendChild(v), d.appendChild(b), a.appendChild(d);
380
+ const q = document.createElement("div");
381
+ q.className = e(this, n).classes.li_div_two, a.appendChild(q);
382
+ const k = document.createElement("p");
383
+ k.className = e(this, n).classes.li_div_two_p, k.textContent = this._formatDistance(
382
384
  s.placePrediction.distanceMeters,
383
385
  e(this, n).distance_units ?? "km"
384
- ), I.appendChild(C);
386
+ ), q.appendChild(k);
385
387
  const m = document.createElement("a");
386
388
  m.href = "javascript:void(0)", m.tabIndex = i + 1, m.className = e(this, n).classes.li_a, m.addEventListener("click", () => {
387
389
  this._onPlaceSelected(s.placePrediction.toPlace());
388
- }), m.appendChild(a), m.appendChild(I);
390
+ }), m.appendChild(a), m.appendChild(q);
389
391
  const P = document.createElement("li");
390
392
  return P.id = `option-${i + 1}`, P.className = e(this, n).classes.li, P.appendChild(m), P;
391
393
  });
@@ -401,9 +403,9 @@ class J {
401
403
  await t.fetchFields({
402
404
  fields: ["displayName", "formattedAddress", "addressComponents"]
403
405
  // Add more fields as needed
404
- }), e(this, O).call(this, t.toJSON());
406
+ }), e(this, j).call(this, t.toJSON());
405
407
  } catch (s) {
406
- console.error("Error fetching place details:", s), e(this, y).call(this, s);
408
+ console.error("Error fetching place details:", s), e(this, g).call(this, s);
407
409
  } finally {
408
410
  this._reset(!0);
409
411
  }
@@ -416,7 +418,7 @@ class J {
416
418
  try {
417
419
  e(this, A).sessionToken = new google.maps.places.AutocompleteSessionToken();
418
420
  } catch (t) {
419
- console.error("Error creating session token:", t), e(this, y).call(this, t);
421
+ console.error("Error creating session token:", t), e(this, g).call(this, t);
420
422
  }
421
423
  }
422
424
  clear() {
@@ -426,14 +428,14 @@ class J {
426
428
  e(this, r) && e(this, r).removeEventListener(
427
429
  "input",
428
430
  this._debouncedMakeAcRequest
429
- ), e(this, f) && e(this, u) && e(this, f).removeChild(e(this, u).parentElement);
431
+ ), e(this, C) && e(this, u) && e(this, C).removeChild(e(this, u).parentElement);
430
432
  for (const t in this)
431
433
  Object.hasOwn(this, t) && (this[t] = null);
432
434
  console.log("PacAutocomplete instance destroyed.");
433
435
  }
434
436
  }
435
- f = new WeakMap(), q = new WeakMap(), D = new WeakMap(), n = new WeakMap(), A = new WeakMap(), r = new WeakMap(), u = new WeakMap(), o = new WeakMap(), E = new WeakMap(), w = new WeakMap(), k = new WeakMap(), b = new WeakMap(), p = new WeakMap(), O = new WeakMap(), y = new WeakMap(), j = new WeakMap(), R = new WeakMap();
437
+ M = new WeakMap(), C = new WeakMap(), D = new WeakMap(), O = new WeakMap(), n = new WeakMap(), A = new WeakMap(), r = new WeakMap(), u = new WeakMap(), o = new WeakMap(), x = new WeakMap(), E = new WeakMap(), w = new WeakMap(), f = new WeakMap(), p = new WeakMap(), j = new WeakMap(), g = new WeakMap(), R = new WeakMap(), z = new WeakMap();
436
438
  export {
437
- J as PlacesAutocomplete
439
+ U as PlacesAutocomplete
438
440
  };
439
441
  //# sourceMappingURL=places-autocomplete.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"places-autocomplete.js","sources":["../lib/PlacesAutocomplete.js"],"sourcesContent":["/**\n * Initializes a Places Autocomplete widget.\n * This script dynamically loads the Google Maps JavaScript API, creates the UI elements\n * for the autocomplete input and suggestions list, handles user input with debouncing,\n * fetches suggestions, manages keyboard navigation, and calls user-defined callbacks\n * on place selection or error.\n *\n * @author Alexander Pechkarev <alexpechkarev@gmail.com>\n * @license MIT\n *\n */\n\n/**\n * PacAutocomplete class\n * This class provides a Places Autocomplete widget.\n */\nexport class PlacesAutocomplete {\n // --- Private Properties (using # or _ prefix by convention) ---\n #pacEl;\n #googleMapsApiKey;\n #googleMapsApiVersion;\n #options;\n #request;\n #inputElement;\n #container;\n #ul;\n #kbdEscape;\n #kbdUp;\n #kbdDown;\n #allSuggestions = [];\n #currentSuggestion = -1;\n #onDataCallback; // For user-provided data callback\n #onErrorCallback; // For user-provided error callback\n #defaultClasses = {\n // CSS classes for various parts of the widget.\n section: \"\", // Outer section container.\n container: \"relative z-10 transform rounded-xl mt-4\", // Main container div.\n icon_container:\n \"pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3\", // Container for the search icon.\n icon: '<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"w-5 h-5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"8\" /><path d=\"m21 21-4.3-4.3\" /></svg>', // SVG for the search icon.\n input:\n \"border-1 w-full rounded-md border-0 shadow-sm bg-gray-100 px-4 py-2.5 pl-10 pr-20 text-gray-900 ring-1 ring-inset ring-gray-300 focus:ring-2 sm:text-sm\", // Input field.\n kbd_container: \"absolute inset-y-0 right-0 flex py-1.5 pr-1.5\", // Container for keyboard hints.\n kbd_escape:\n \"inline-flex items-center rounded border border-gray-300 px-1 font-sans text-xs text-gray-500 w-8 mr-1\", // Escape key hint.\n kbd_up:\n \"inline-flex items-center justify-center rounded border border-gray-300 px-1 font-sans text-xs text-gray-500 w-6\", // Up arrow key hint.\n kbd_down:\n \"inline-flex items-center rounded border border-gray-400 px-1 font-sans text-xs text-gray-500 justify-center w-6\", // Down arrow key hint.\n kbd_active: \"bg-indigo-500 text-white\", // Class for active keyboard hint.\n ul: \"absolute z-50 -mb-2 mt-1 max-h-60 w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none sm:text-sm divide-y divide-gray-100\", // Suggestions list (ul).\n li: \"z-50 cursor-default select-none py-2 px-2 lg:px-4 text-gray-900 hover:bg-indigo-500 hover:text-white\", // Suggestion item (li).\n li_current: \"bg-indigo-500\", // Class for the currently selected suggestion item.\n li_a: \"block w-full flex justify-between\", // Link element within a suggestion item.\n li_a_current: \"text-white\", // Class for the link in the currently selected suggestion item.\n li_div_container: \"flex min-w-0 gap-x-4\", // Container div within the suggestion link.\n li_div_one: \"min-w-0 flex-auto\", // First inner div (for place name).\n li_div_one_p: \"text-sm/6\", // Paragraph for the place name.\n li_div_two: \"shrink-0 flex flex-col items-end min-w-16\", // Second inner div (for distance).\n li_div_two_p: \"mt-1 text-xs/5\", // Paragraph for the distance.\n highlight: \"font-bold\", // Class for highlighting matched text in suggestions.\n };\n #defaultRequestParams = {\n // Default parameters for the autocomplete request.\n input: \"\", // Initial input value (empty).\n includedRegionCodes: [\"GB\"], // Default region codes to include in suggestions.\n language: \"en-gb\",\n region: \"GB\",\n };\n\n /**\n * Class constructor for PacAutocomplete.\n * Initializes the autocomplete widget with the provided configuration.\n * @param {Object} config - Configuration object for the autocomplete widget.\n * @param {string} config.containerId - ID of the container element for the widget.\n * @param {string} config.googleMapsApiKey - Google Maps API key.\n * @param {string} [config.googleMapsApiVersion] - Version of the Google Maps API to use (default: \"weekly\").\n * @param {Object} [config.options] - Additional options for the widget (e.g., classes, callbacks).\n * @param {Object} [config.requestParams] - Parameters for the autocomplete request (e.g., input, region).\n * @param {*} config\n */\n constructor(config) {\n // console.log(\"PacAutocomplete constructor called.\", config.requestParams);\n if (!config || !config.containerId || !config.googleMapsApiKey) {\n throw new Error(\n \"PacAutocomplete: Missing required configuration (containerId, googleMapsApiKey).\"\n );\n }\n\n this.#pacEl = document.getElementById(config.containerId);\n if (!this.#pacEl) {\n throw new Error(\n `PacAutocomplete: Container element with ID \"${config.containerId}\" not found.`\n );\n }\n\n this.#googleMapsApiKey = config.googleMapsApiKey;\n this.#googleMapsApiVersion = config.googleMapsApiVersion || \"weekly\";\n\n // Merge user options with defaults\n this.#options = {\n autofocus: false, // Automatically focus the input on load.\n autocomplete: \"off\", // HTML autocomplete attribute for the input.\n placeholder: \"Start typing your address ...\", // Placeholder text for the input.\n distance: true, // Show distance in suggestions (requires origin in request).\n distance_units: \"km\", // Units for distance ('km' or 'miles').\n label: \"\", // Optional label text above the input.\n debounce: 100, // Debounce delay (ms) for API requests.\n ...config.options, // User-defined options override defaults\n };\n // Ensure classes are deeply merged if user provides partial classes\n if (config.options && config.options.classes) {\n this.#options.classes = {\n ...this.#defaultClasses,\n ...config.options.classes,\n };\n } else {\n this.#options.classes = this.#defaultClasses; // Use default classes if none provided\n }\n\n // Set default response and error callbacks if not provided\n this.#onDataCallback =\n config.onResponse ||\n ((place) => {\n console.info(\"---------Default onResponse not provided---------\");\n console.info(\"Selected Place:\", JSON.stringify(place, null, 2));\n });\n this.#onErrorCallback =\n config.onError ||\n ((error) => {\n console.error(\"---------Default onError not provided---------\");\n console.error(\"PAC Error:\", error);\n });\n\n if (config.requestParams && Object.keys(config.requestParams).length > 0) {\n this.#request = {\n ...this.#defaultRequestParams,\n ...config.requestParams,\n };\n } else {\n this.#request = { ...this.#defaultRequestParams }; // Use defaults if no requestParams provided\n }\n\n //console.log(this.#request);\n\n this._init(); // Underscore prefix for internal initialization method\n }\n\n // --- Private Initialization Method ---\n async _init() {\n try {\n // check if google maps api is already loaded\n if (typeof google === \"undefined\" || !google.maps) {\n // Load the Google Maps API dynamically\n await this._loadGoogleMapsApi({\n key: this.#googleMapsApiKey,\n v: this.#googleMapsApiVersion,\n });\n }\n this._createPACStructure(); // Pass this.#options\n await this._initializeAutocomplete(); // Pass this.#options\n //console.log(\"PacAutocomplete Initialized for container:\", this.#pacEl.id);\n } catch (error) {\n this.#onErrorCallback(error);\n }\n }\n\n /**\n * Creates a debounced version of a function.\n * The debounced function delays invoking `func` until after `wait` milliseconds have\n * elapsed since the last time the debounced function was invoked.\n * @param {Function} func - The function to debounce.\n * @param {number} wait - The number of milliseconds to delay.\n * @returns {Function} The new debounced function.\n */\n _debounce(func, wait) {\n let timeout = null;\n return function executedFunction(...args) {\n const later = () => {\n timeout = null;\n func(...args); // Call original function\n };\n if (timeout !== null) {\n clearTimeout(timeout); // Clear the previous timeout\n }\n timeout = setTimeout(later, wait ?? 100); // Set the new timeout\n };\n }\n /**\n * Formats a distance in meters into kilometers or miles.\n * @param {number | null | undefined} distance - Distance in meters.\n * @param {'km' | 'miles'} units - The desired output units.\n * @returns {string | null} Formatted distance string (e.g., \"1.23 km\") or null if input is invalid.\n */\n _formatDistance(distance, units) {\n if (typeof distance !== \"number\" || !this.#options.distance) {\n return null; // Return null if distance isn't shown or invalid\n }\n let value;\n let unitLabel;\n if (units === \"km\") {\n value = (distance / 1000).toFixed(2);\n unitLabel = \"km\";\n } else {\n // Default to miles if not 'km'\n value = (distance / 1609.34).toFixed(2);\n unitLabel = \"miles\";\n }\n // Avoid showing \".00\"\n value = value.replace(/\\.00$/, \"\");\n return `${value} ${unitLabel}`;\n }\n\n /**\n * Dynamically loads the Google Maps JavaScript API using the importLibrary method.\n * This is the standard approach recommended by Google.\n * @see https://developers.google.com/maps/documentation/javascript/load-maps-js-api\n * @param {object} g - Configuration object for the API loader (key, v, libraries, etc.).\n */\n async _loadGoogleMapsApi(g) {\n var h, // Promise tracking API load\n a, // Script element\n k, // Loop variable for config keys\n p = \"The Google Maps JavaScript API\", // Error message prefix\n c = \"google\", // Global namespace\n l = \"importLibrary\", // Loader function name\n q = \"__ib__\", // Internal callback name\n m = document, // Document reference\n b = window; // Window reference\n b = b[c] || (b[c] = {}); // Ensure google namespace exists\n var d = b.maps || (b.maps = {}), // Ensure google.maps namespace exists\n r = new Set(), // Set to track requested libraries\n e = new URLSearchParams(), // URL parameters for the API script\n u = () =>\n // Function to initiate API loading (if not already started)\n h ||\n // eslint-disable-next-line no-async-promise-executor\n (h = new Promise(async (f, n) => {\n // Create script element (done async to potentially wait for nonce)\n // await (a = m.createElement('script')); // Original Google code had await here, might not be needed\n a = m.createElement(\"script\"); // Create script tag\n e.set(\"libraries\", [...r].join(\",\")); // Add accumulated libraries\n // Add other parameters from the config object 'g'\n for (k in g)\n e.set(\n k.replace(/[A-Z]/g, (t) => \"_\" + t[0].toLowerCase()), // Convert camelCase to snake_case\n g[k]\n );\n e.set(\"callback\", c + \".maps.\" + q); // Set the internal callback function name\n a.src = `https://maps.${c}apis.com/maps/api/js?` + e; // Construct the API URL\n d[q] = f; // Assign the promise resolver to the callback name on google.maps\n // Error handling for script loading failure\n a.onerror = () => (h = n(Error(p + \" could not load.\"))); // Use onerror for load failures\n // Nonce for Content Security Policy\n a.nonce = m.querySelector(\"script[nonce]\")?.nonce || \"\";\n m.head.append(a); // Append the script to the document head\n }));\n // Define or reuse the importLibrary function on google.maps\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n d[l]\n ? console.warn(p + \" only loads once. Ignoring:\", g) // Warn if called again\n : (d[l] = (f, ...n) => r.add(f) && u().then(() => d[l](f, ...n))); // The actual importLibrary implementation\n }\n\n // --- UI Creation ---\n _createPACStructure() {\n const section = document.createElement(\"section\");\n this.#options.classes.section\n .split(\" \")\n .forEach((cl) => cl && section.classList.add(cl));\n\n // Main container\n this.#container = document.createElement(\"div\");\n this.#container.className = this.#options.classes.container;\n this.#container.setAttribute(\"id\", this.#pacEl);\n section.appendChild(this.#container);\n\n // Icon\n const iconContainer = document.createElement(\"div\");\n iconContainer.className = this.#options.classes.icon_container;\n this.#container.appendChild(iconContainer);\n const icon = document.createElement(\"div\");\n icon.innerHTML = this.#options.classes.icon;\n iconContainer.appendChild(icon.firstElementChild); // Append the actual SVG element\n\n // Input field\n this.#inputElement = document.createElement(\"input\");\n this.#inputElement.id = \"input\" + this.#pacEl; // Assign ID for label association\n this.#inputElement.type = \"text\";\n this.#inputElement.name = \"search\"; // Consider making name configurable\n this.#inputElement.placeholder = this.#options.placeholder;\n this.#inputElement.autocomplete = this.#options.autocomplete;\n this.#inputElement.className = this.#options.classes.input;\n this.#inputElement.setAttribute(\"role\", \"combobox\");\n this.#inputElement.setAttribute(\"aria-autocomplete\", \"list\");\n this.#inputElement.setAttribute(\"aria-expanded\", \"false\"); // Will be updated dynamically\n this.#inputElement.setAttribute(\"aria-controls\", \"pacSuggestions\"); // Links to the suggestions list\n\n if (this.#options.autofocus) {\n this.#inputElement.autofocus = true;\n }\n if (this.#options.label) {\n const label = document.createElement(\"label\");\n label.htmlFor = \"labelInput\" + this.#pacEl; // Assuming inputElement gets this ID\n label.textContent = this.#options.label;\n // Add label classes if needed from opts.classes\n this.#container.appendChild(label); // Append label before input or adjust structure\n }\n this.#container.appendChild(this.#inputElement);\n\n // Keyboard hints container\n const kbdContainer = document.createElement(\"div\");\n kbdContainer.className = this.#options.classes.kbd_container;\n this.#kbdEscape = document.createElement(\"kbd\");\n this.#kbdEscape.className = this.#options.classes.kbd_escape;\n this.#kbdEscape.textContent = \"Esc\";\n kbdContainer.appendChild(this.#kbdEscape);\n this.#kbdUp = document.createElement(\"kbd\");\n this.#kbdUp.className = this.#options.classes.kbd_up;\n this.#kbdUp.innerHTML = \"&#8593;\"; // Up arrow HTML entity\n kbdContainer.appendChild(this.#kbdUp);\n this.#kbdDown = document.createElement(\"kbd\");\n this.#kbdDown.className = this.#options.classes.kbd_down;\n this.#kbdDown.innerHTML = \"&#8595;\"; // Down arrow HTML entity\n kbdContainer.appendChild(this.#kbdDown);\n this.#container.appendChild(kbdContainer);\n\n // Suggestions list (initially hidden)\n this.#ul = document.createElement(\"ul\");\n this.#ul.id = \"pacSuggestions\"; // Must match aria-controls\n this.#ul.className = this.#options.classes.ul;\n this.#ul.style.display = \"none\";\n this.#ul.setAttribute(\"role\", \"listbox\");\n this.#container.appendChild(this.#ul);\n\n this.#pacEl.appendChild(section);\n section.addEventListener(\"keydown\", this._onKeyDown.bind(this)); // Bind 'this'\n }\n\n /**\n * Initializes the core autocomplete functionality after the API is loaded.\n * Imports necessary libraries and sets up the input event listener.\n */\n async _initializeAutocomplete() {\n try {\n // Ensure the 'places' library is available via the dynamic loader\n // eslint-disable-next-line no-undef\n await google.maps.importLibrary(\"places\");\n // console.log('Places library imported successfully.'); // For debugging\n\n // Initial token generation\n this._refreshToken();\n\n // Attach the debounced request function to the input element's 'input' event\n if (this.#inputElement) {\n this.#inputElement.addEventListener(\n \"input\",\n this._debouncedMakeAcRequest.bind(this)\n );\n // Add focus/blur listeners if needed to manage suggestion visibility\n this.#inputElement.addEventListener(\"blur\", () => {\n // Delay hiding suggestions to allow click events on them\n setTimeout(() => {\n if (this.#ul && !this.#ul.contains(document.activeElement)) {\n // Check if focus moved outside suggestions\n this.#ul.style.display = \"none\";\n this.#inputElement.setAttribute(\"aria-expanded\", \"false\");\n }\n }, 200); // Adjust delay as needed\n });\n this.#inputElement.addEventListener(\"focus\", () => {\n // Potentially show suggestions again if input has value\n if (this.#inputElement.value && this.#allSuggestions.length > 0) {\n this.#ul.style.display = \"block\";\n this.#inputElement.setAttribute(\"aria-expanded\", \"true\");\n }\n });\n } else {\n this.#onErrorCallback(\n new Error(\"Input element not found during initialization.\")\n );\n }\n } catch (error) {\n console.error(\"Error initializing Google Places Autocomplete:\", error);\n // eslint-disable-next-line no-undef\n this.#onErrorCallback(\n new Error(\"Google Maps Places library not available.\")\n );\n }\n }\n\n /**\n * Resets the autocomplete input field, clears suggestions, and optionally refreshes the session token.\n * @param {boolean} [refresh=false] - Whether to refresh the Google Places session token.\n */\n _reset(refresh = false) {\n this.#currentSuggestion = -1;\n if (this.#inputElement) {\n this.#inputElement.value = \"\";\n }\n this.#allSuggestions = [];\n this.#currentSuggestion = -1;\n if (this.#ul) {\n this.#ul.innerHTML = \"\"; // Clear existing suggestions\n this.#ul.style.display = \"none\";\n }\n if (refresh) {\n this._refreshToken();\n }\n }\n /**\n * Removes the 'current' highlighting classes from all suggestion list items (li) and their links (a).\n */\n _resetLiClasses() {\n if (!this.#ul) return;\n Array.from(this.#ul.children).forEach((li) => {\n this.#options.classes.li_current\n .split(\" \")\n .forEach((cl) => li.classList.remove(cl));\n const link = li.querySelector(\"a\");\n if (link) {\n this.#options.classes.li_a_current\n .split(\" \")\n .forEach((cl) => link.classList.remove(cl));\n }\n });\n }\n\n /**\n * Handles keyboard events (ArrowDown, ArrowUp, Enter, Escape) for navigating\n * and selecting suggestions or closing the list.\n * @param {KeyboardEvent} e - The keyboard event object.\n */\n _onKeyDown(e) {\n if (\n !this.#allSuggestions.length ||\n !this.#ul ||\n this.#ul.style.display === \"none\"\n )\n return;\n\n this._resetLiClasses(); // Reset classes on any key press within the suggestions\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault(); // Prevent cursor movement in input\n this.#currentSuggestion = Math.min(\n this.#currentSuggestion + 1,\n this.#allSuggestions.length - 1\n );\n if (this.#currentSuggestion < 0) this.#currentSuggestion = 0; // Handle case where it was -1\n\n const currentLi = this.#ul.children.item(this.#currentSuggestion);\n if (currentLi) {\n const currentA = currentLi.querySelector(\"a\");\n this.#options.classes.li_current\n .split(\" \")\n .forEach((cl) => currentLi.classList.add(cl));\n if (currentA) {\n this.#options.classes.li_a_current\n .split(\" \")\n .forEach((cl) => currentA.classList.add(cl));\n }\n currentLi.scrollIntoView({ block: \"nearest\" }); // Ensure visible\n }\n\n // Visual feedback for key press\n this.#options.classes.kbd_active\n .split(\" \")\n .forEach((cl) => this.#kbdDown?.classList.add(cl));\n setTimeout(\n () =>\n this.#options.classes.kbd_active\n .split(\" \")\n .forEach((cl) => this.#kbdDown?.classList.remove(cl)),\n 300\n );\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault(); // Prevent cursor movement in input\n this.#currentSuggestion = Math.max(this.#currentSuggestion - 1, 0); // Stay at 0 if already there\n\n const currentLi = this.#ul.children.item(this.#currentSuggestion);\n if (currentLi) {\n const currentA = currentLi.querySelector(\"a\");\n this.#options.classes.li_current\n .split(\" \")\n .forEach((cl) => currentLi.classList.add(cl));\n if (currentA) {\n this.#options.classes.li_a_current\n .split(\" \")\n .forEach((cl) => currentA.classList.add(cl));\n }\n currentLi.scrollIntoView({ block: \"nearest\" }); // Ensure visible\n }\n\n // Visual feedback for key press\n this.#options.classes.kbd_active\n .split(\" \")\n .forEach((cl) => this.#kbdUp?.classList.add(cl));\n setTimeout(\n () =>\n this.#options.classes.kbd_active\n .split(\" \")\n .forEach((cl) => this.#kbdUp?.classList.remove(cl)),\n 300\n );\n } else if (e.key === \"Enter\") {\n e.preventDefault(); // Prevent form submission if applicable\n if (\n this.#currentSuggestion >= 0 &&\n this.#currentSuggestion < this.#allSuggestions.length\n ) {\n this._onPlaceSelected(\n this.#allSuggestions[this.#currentSuggestion].place\n );\n // Reset is handled within onPlaceSelected via reset(true)\n }\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n // Visual feedback for key press\n this.#options.classes.kbd_active\n .split(\" \")\n .forEach((cl) => this.#kbdEscape?.classList.add(cl));\n setTimeout(\n () =>\n this.#options.classes.kbd_active\n .split(\" \")\n .forEach((cl) => this.#kbdEscape?.classList.remove(cl)),\n 300\n );\n this._reset(true); // Reset search input and results, refresh token\n }\n }\n\n /**\n * Debounced function to fetch autocomplete suggestions from the Google Places API.\n * Triggered by the 'input' event on the input element.\n */\n _debouncedMakeAcRequest = this._debounce(async () => {\n if (!this.#inputElement || !this.#inputElement.value) {\n this._reset();\n if (this.#inputElement)\n this.#inputElement.setAttribute(\"aria-expanded\", \"false\");\n return;\n }\n\n this.#request.input = this.#inputElement.value;\n //console.log(\"Request:\", this.#request); // Debugging\n try {\n const { suggestions } =\n // eslint-disable-next-line no-undef\n await google.maps.places.AutocompleteSuggestion.fetchAutocompleteSuggestions(\n this.#request\n );\n\n // Display suggestions\n if (suggestions && suggestions.length > 0) {\n this.#ul.replaceChildren(\n ...this._createSuggestionElements(suggestions)\n );\n this.#ul.style.display = \"block\";\n this.#inputElement.setAttribute(\"aria-expanded\", \"true\");\n } else {\n // No suggestions found\n this._reset(); // Clear any old suggestions\n this.#inputElement.setAttribute(\"aria-expanded\", \"false\");\n // Optionally display a \"no results\" message in the 'ul'\n }\n } catch (error) {\n this.#onErrorCallback(error);\n this._reset();\n if (this.#inputElement)\n this.#inputElement.setAttribute(\"aria-expanded\", \"false\");\n }\n }, this.#options?.debounce ?? 100);\n\n /**\n * Creates an array of list item (LI) elements for the suggestions dropdown.\n * Each LI contains a link (A) with the place prediction details and distance.\n * Handles highlighting the matched parts of the suggestion text.\n * @param {Array<google.maps.places.AutocompleteSuggestion>} suggestions - Array of suggestion objects from the API.\n * @returns {Array<HTMLLIElement>} An array of LI elements to be added to the suggestions UL.\n */\n _createSuggestionElements(suggestions) {\n this.#allSuggestions = []; // Reset before populating\n return suggestions.map((suggestion, index) => {\n this.#allSuggestions.push({\n id: index + 1,\n description: suggestion.placePrediction.toString(),\n place: suggestion.placePrediction.toPlace(),\n });\n\n // create div elements\n const divContainer = document.createElement(\"div\");\n divContainer.className = this.#options.classes.li_div_container; // flex min-w-0 gap-x-4\n // create inner div element - place name\n const divInner = document.createElement(\"div\");\n divInner.className = this.#options.classes.li_div_one; // min-w-0 flex-auto\n divContainer.appendChild(divInner);\n // create p element - place name\n const p = document.createElement(\"p\");\n p.className = this.#options.classes.li_div_one_p; // text-sm/6\n\n // get prediction text\n const predictionText = suggestion.placePrediction.text;\n const originalText = predictionText.text;\n // Array of objects with startOffset, endOffset\n const matches = predictionText.matches;\n\n //Highlighting Logic\n let lastIndex = 0;\n\n // Sort matches just in case they aren't ordered (though they usually are)\n matches.sort((a, b) => a.startOffset - b.startOffset);\n\n // 1. Create the outer span\n const outerSpan = document.createElement(\"span\");\n\n // 2. Create the inner span for the bold part\n const innerSpan = document.createElement(\"span\");\n innerSpan.classList = this.#options.classes.highlight ?? \"font-bold\"; // Use the highlight class from options\n\n for (const match of matches) {\n // Append text before the current match\n outerSpan.textContent += originalText.substring(\n lastIndex,\n match.startOffset\n );\n\n // Append the highlighted match segment\n if (match.startOffset > 0) {\n // check previous charter is space\n const prevChar = originalText.charAt(match.startOffset - 1);\n if (prevChar == \" \") {\n innerSpan.textContent += \" \";\n }\n }\n innerSpan.textContent += originalText.substring(\n match.startOffset,\n match.endOffset\n );\n\n // Update the last index processed\n lastIndex = match.endOffset;\n }\n\n // 3. Create a text node for the remaining text\n const remainingText = document.createTextNode(\n originalText.substring(lastIndex)\n );\n\n // 4. Append the inner span and the text node to the outer span\n outerSpan.appendChild(innerSpan);\n outerSpan.appendChild(remainingText);\n\n // 5. Append the outer span to the paragraph element\n p.appendChild(outerSpan);\n\n divInner.appendChild(p);\n divContainer.appendChild(divInner);\n\n // create inner div element - distance\n const divInner2 = document.createElement(\"div\");\n divInner2.className = this.#options.classes.li_div_two; //'shrink-0 flex flex-col items-end min-w-16';\n divContainer.appendChild(divInner2);\n // create p element - distance\n const p2 = document.createElement(\"p\");\n p2.className = this.#options.classes.li_div_two_p; //'mt-1 text-xs/5 ';\n p2.textContent = this._formatDistance(\n suggestion.placePrediction.distanceMeters,\n this.#options.distance_units ?? \"km\"\n );\n divInner2.appendChild(p2);\n\n // // create a link element\n const a = document.createElement(\"a\");\n a.href = \"javascript:void(0)\";\n a.tabIndex = index + 1;\n a.className = this.#options.classes.li_a; // block w-full flex justify-between\n\n a.addEventListener(\"click\", () => {\n this._onPlaceSelected(suggestion.placePrediction.toPlace());\n });\n\n // ...\n // a.addEventListener(\"click\", () => {\n // this._fetchPlaceDetails(prediction.place_id);\n // });\n a.appendChild(divContainer);\n a.appendChild(divInner2);\n\n const li = document.createElement(\"li\");\n li.id = `option-${index + 1}`;\n li.className = this.#options.classes.li;\n\n li.appendChild(a);\n return li;\n });\n }\n\n /**\n * Handles the selection of a place. Fetches required fields\n * (displayName, formattedAddress, addressComponents) and calls the\n * user-defined `onPacData` callback.\n * @param {google.maps.places.Place} place - The selected Place object.\n */\n async _onPlaceSelected(place) {\n try {\n // Fetch necessary details for the selected place\n await place.fetchFields({\n fields: [\"displayName\", \"formattedAddress\", \"addressComponents\"], // Add more fields as needed\n });\n // Call the user-provided callback with the place data\n // eslint-disable-next-line no-undef\n this.#onDataCallback(place.toJSON()); // Convert to plain JSON object for the callback\n } catch (error) {\n console.error(\"Error fetching place details:\", error);\n // eslint-disable-next-line no-undef\n this.#onErrorCallback(error);\n } finally {\n // Reset the input and suggestions regardless of success/error\n this._reset(true); // Refresh token after selection\n }\n }\n\n /**\n * Creates a new Google Places Autocomplete Session Token.\n * This should be called before starting a new series of autocomplete requests.\n */\n _refreshToken() {\n try {\n // eslint-disable-next-line no-undef\n this.#request.sessionToken =\n new google.maps.places.AutocompleteSessionToken();\n } catch (error) {\n console.error(\"Error creating session token:\", error);\n // eslint-disable-next-line no-undef\n this.#onErrorCallback(error);\n }\n }\n\n clear() {\n this._reset(true);\n }\n\n destroy() {\n // Remove event listeners, remove elements from DOM\n if (this.#inputElement) {\n this.#inputElement.removeEventListener(\n \"input\",\n this._debouncedMakeAcRequest\n );\n // remove other listeners\n }\n if (this.#pacEl && this.#container) {\n this.#pacEl.removeChild(this.#container.parentElement); // remove the whole section\n }\n // Nullify properties\n for (const prop in this) {\n if (Object.hasOwn(this, prop)) {\n this[prop] = null;\n }\n }\n console.log(\"PacAutocomplete instance destroyed.\");\n }\n}\n"],"names":["_a","_pacEl","_googleMapsApiKey","_googleMapsApiVersion","_options","_request","_inputElement","_container","_ul","_kbdEscape","_kbdUp","_kbdDown","_allSuggestions","_currentSuggestion","_onDataCallback","_onErrorCallback","_defaultClasses","_defaultRequestParams","PlacesAutocomplete","config","__privateAdd","__publicField","__privateGet","suggestions","error","__privateSet","place","func","wait","timeout","args","later","distance","units","value","unitLabel","g","h","a","k","p","c","l","q","m","b","d","r","e","u","f","n","t","section","cl","iconContainer","icon","label","kbdContainer","refresh","li","link","currentLi","currentA","suggestion","index","divContainer","divInner","predictionText","originalText","matches","lastIndex","outerSpan","innerSpan","match","remainingText","divInner2","p2","prop"],"mappings":"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"}
1
+ {"version":3,"file":"places-autocomplete.js","sources":["../lib/PlacesAutocomplete.js"],"sourcesContent":["/**\n * Initializes a Places Autocomplete widget.\n * This script dynamically loads the Google Maps JavaScript API, creates the UI elements\n * for the autocomplete input and suggestions list, handles user input with debouncing,\n * fetches suggestions, manages keyboard navigation, and calls user-defined callbacks\n * on place selection or error.\n *\n * @author Alexander Pechkarev <alexpechkarev@gmail.com>\n * @license MIT\n *\n */\n\n/**\n * PacAutocomplete class\n * This class provides a Places Autocomplete widget.\n */\nexport class PlacesAutocomplete {\n // --- Private Properties (using # or _ prefix by convention) ---\n #containerId; // Container ID where the autocomplete widget will be rendered.\n #pacEl;\n #googleMapsApiKey;\n #googleMapsApiVersion;\n #options;\n #request;\n #inputElement;\n #container;\n #ul;\n #kbdEscape;\n #kbdUp;\n #kbdDown;\n #allSuggestions = [];\n #currentSuggestion = -1;\n #onDataCallback; // For user-provided data callback\n #onErrorCallback; // For user-provided error callback\n #defaultClasses = {\n // CSS classes for various parts of the widget.\n section: \"\", // Outer section container.\n container: \"relative z-10 transform rounded-xl mt-4\", // Main container div.\n icon_container:\n \"pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3\", // Container for the search icon.\n icon: '<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"w-5 h-5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"8\" /><path d=\"m21 21-4.3-4.3\" /></svg>', // SVG for the search icon.\n input:\n \"border-1 w-full rounded-md border-0 shadow-sm bg-gray-100 px-4 py-2.5 pl-10 pr-20 text-gray-900 ring-1 ring-inset ring-gray-300 focus:ring-2 sm:text-sm\", // Input field.\n kbd_container: \"absolute inset-y-0 right-0 flex py-1.5 pr-1.5\", // Container for keyboard hints.\n kbd_escape:\n \"inline-flex items-center rounded border border-gray-300 px-1 font-sans text-xs text-gray-500 w-8 mr-1\", // Escape key hint.\n kbd_up:\n \"inline-flex items-center justify-center rounded border border-gray-300 px-1 font-sans text-xs text-gray-500 w-6\", // Up arrow key hint.\n kbd_down:\n \"inline-flex items-center rounded border border-gray-400 px-1 font-sans text-xs text-gray-500 justify-center w-6\", // Down arrow key hint.\n kbd_active: \"bg-indigo-500 text-white\", // Class for active keyboard hint.\n ul: \"absolute z-50 -mb-2 mt-1 max-h-60 w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none sm:text-sm divide-y divide-gray-100\", // Suggestions list (ul).\n li: \"z-50 cursor-default select-none py-2 px-2 lg:px-4 text-gray-900 hover:bg-indigo-500 hover:text-white\", // Suggestion item (li).\n li_current: \"bg-indigo-500\", // Class for the currently selected suggestion item.\n li_a: \"block w-full flex justify-between\", // Link element within a suggestion item.\n li_a_current: \"text-white\", // Class for the link in the currently selected suggestion item.\n li_div_container: \"flex min-w-0 gap-x-4\", // Container div within the suggestion link.\n li_div_one: \"min-w-0 flex-auto\", // First inner div (for place name).\n li_div_one_p: \"text-sm/6\", // Paragraph for the place name.\n li_div_two: \"shrink-0 flex flex-col items-end min-w-16\", // Second inner div (for distance).\n li_div_two_p: \"mt-1 text-xs/5\", // Paragraph for the distance.\n highlight: \"font-bold\", // Class for highlighting matched text in suggestions.\n };\n #defaultRequestParams = {\n // Default parameters for the autocomplete request.\n input: \"\", // Initial input value (empty).\n includedRegionCodes: [\"GB\"], // Default region codes to include in suggestions.\n language: \"en-gb\",\n region: \"GB\",\n };\n\n /**\n * Class constructor for PacAutocomplete.\n * Initializes the autocomplete widget with the provided configuration.\n * @param {Object} config - Configuration object for the autocomplete widget.\n * @param {string} config.containerId - ID of the container element for the widget.\n * @param {string} config.googleMapsApiKey - Google Maps API key.\n * @param {string} [config.googleMapsApiVersion] - Version of the Google Maps API to use (default: \"weekly\").\n * @param {Object} [config.options] - Additional options for the widget (e.g., classes, callbacks).\n * @param {Object} [config.requestParams] - Parameters for the autocomplete request (e.g., input, region).\n * @param {*} config\n */\n constructor(config) {\n // console.log(\"PacAutocomplete constructor called.\", config.requestParams);\n if (!config || !config.containerId || !config.googleMapsApiKey) {\n throw new Error(\n \"PacAutocomplete: Missing required configuration (containerId, googleMapsApiKey).\"\n );\n }\n\n this.#containerId = config.containerId; // Store the configuration object\n this.#pacEl = document.getElementById(config.containerId);\n if (!this.#pacEl) {\n throw new Error(\n `PacAutocomplete: Container element with ID \"${config.containerId}\" not found.`\n );\n }\n\n this.#googleMapsApiKey = config.googleMapsApiKey;\n this.#googleMapsApiVersion = config.googleMapsApiVersion || \"weekly\";\n\n // Merge user options with defaults\n this.#options = {\n autofocus: false, // Automatically focus the input on load.\n autocomplete: \"off\", // HTML autocomplete attribute for the input.\n placeholder: \"Start typing your address ...\", // Placeholder text for the input.\n distance: true, // Show distance in suggestions (requires origin in request).\n distance_units: \"km\", // Units for distance ('km' or 'miles').\n label: \"\", // Optional label text above the input.\n debounce: 100, // Debounce delay (ms) for API requests.\n ...config.options, // User-defined options override defaults\n };\n // Ensure classes are deeply merged if user provides partial classes\n if (config.options && config.options.classes) {\n this.#options.classes = {\n ...this.#defaultClasses,\n ...config.options.classes,\n };\n } else {\n this.#options.classes = this.#defaultClasses; // Use default classes if none provided\n }\n\n // Set default response and error callbacks if not provided\n this.#onDataCallback =\n config.onResponse ||\n ((place) => {\n console.info(\"---------Default onResponse not provided---------\");\n console.info(\"Selected Place:\", JSON.stringify(place, null, 2));\n });\n this.#onErrorCallback =\n config.onError ||\n ((error) => {\n console.error(\"---------Default onError not provided---------\");\n console.error(\"PAC Error:\", error);\n });\n\n if (config.requestParams && Object.keys(config.requestParams).length > 0) {\n this.#request = {\n ...this.#defaultRequestParams,\n ...config.requestParams,\n };\n } else {\n this.#request = { ...this.#defaultRequestParams }; // Use defaults if no requestParams provided\n }\n\n //console.log(this.#request);\n\n this._init(); // Underscore prefix for internal initialization method\n }\n\n // --- Private Initialization Method ---\n async _init() {\n try {\n // check if google maps api is already loaded\n if (typeof google === \"undefined\" || !google.maps) {\n // Load the Google Maps API dynamically\n await this._loadGoogleMapsApi({\n key: this.#googleMapsApiKey,\n v: this.#googleMapsApiVersion,\n });\n }\n this._createPACStructure(); // Pass this.#options\n await this._initializeAutocomplete(); // Pass this.#options\n //console.log(\"PacAutocomplete Initialized for container:\", this.#pacEl.id);\n } catch (error) {\n this.#onErrorCallback(error);\n }\n }\n\n /**\n * Creates a debounced version of a function.\n * The debounced function delays invoking `func` until after `wait` milliseconds have\n * elapsed since the last time the debounced function was invoked.\n * @param {Function} func - The function to debounce.\n * @param {number} wait - The number of milliseconds to delay.\n * @returns {Function} The new debounced function.\n */\n _debounce(func, wait) {\n let timeout = null;\n return function executedFunction(...args) {\n const later = () => {\n timeout = null;\n func(...args); // Call original function\n };\n if (timeout !== null) {\n clearTimeout(timeout); // Clear the previous timeout\n }\n timeout = setTimeout(later, wait ?? 100); // Set the new timeout\n };\n }\n /**\n * Formats a distance in meters into kilometers or miles.\n * @param {number | null | undefined} distance - Distance in meters.\n * @param {'km' | 'miles'} units - The desired output units.\n * @returns {string | null} Formatted distance string (e.g., \"1.23 km\") or null if input is invalid.\n */\n _formatDistance(distance, units) {\n if (typeof distance !== \"number\" || !this.#options.distance) {\n return null; // Return null if distance isn't shown or invalid\n }\n let value;\n let unitLabel;\n if (units === \"km\") {\n value = (distance / 1000).toFixed(2);\n unitLabel = \"km\";\n } else {\n // Default to miles if not 'km'\n value = (distance / 1609.34).toFixed(2);\n unitLabel = \"miles\";\n }\n // Avoid showing \".00\"\n value = value.replace(/\\.00$/, \"\");\n return `${value} ${unitLabel}`;\n }\n\n /**\n * Dynamically loads the Google Maps JavaScript API using the importLibrary method.\n * This is the standard approach recommended by Google.\n * @see https://developers.google.com/maps/documentation/javascript/load-maps-js-api\n * @param {object} g - Configuration object for the API loader (key, v, libraries, etc.).\n */\n async _loadGoogleMapsApi(g) {\n var h, // Promise tracking API load\n a, // Script element\n k, // Loop variable for config keys\n p = \"The Google Maps JavaScript API\", // Error message prefix\n c = \"google\", // Global namespace\n l = \"importLibrary\", // Loader function name\n q = \"__ib__\", // Internal callback name\n m = document, // Document reference\n b = window; // Window reference\n b = b[c] || (b[c] = {}); // Ensure google namespace exists\n var d = b.maps || (b.maps = {}), // Ensure google.maps namespace exists\n r = new Set(), // Set to track requested libraries\n e = new URLSearchParams(), // URL parameters for the API script\n u = () =>\n // Function to initiate API loading (if not already started)\n h ||\n // eslint-disable-next-line no-async-promise-executor\n (h = new Promise(async (f, n) => {\n // Create script element (done async to potentially wait for nonce)\n // await (a = m.createElement('script')); // Original Google code had await here, might not be needed\n a = m.createElement(\"script\"); // Create script tag\n e.set(\"libraries\", [...r].join(\",\")); // Add accumulated libraries\n // Add other parameters from the config object 'g'\n for (k in g)\n e.set(\n k.replace(/[A-Z]/g, (t) => \"_\" + t[0].toLowerCase()), // Convert camelCase to snake_case\n g[k]\n );\n e.set(\"callback\", c + \".maps.\" + q); // Set the internal callback function name\n a.src = `https://maps.${c}apis.com/maps/api/js?` + e; // Construct the API URL\n d[q] = f; // Assign the promise resolver to the callback name on google.maps\n // Error handling for script loading failure\n a.onerror = () => (h = n(Error(p + \" could not load.\"))); // Use onerror for load failures\n // Nonce for Content Security Policy\n a.nonce = m.querySelector(\"script[nonce]\")?.nonce || \"\";\n m.head.append(a); // Append the script to the document head\n }));\n // Define or reuse the importLibrary function on google.maps\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n d[l]\n ? console.warn(p + \" only loads once. Ignoring:\", g) // Warn if called again\n : (d[l] = (f, ...n) => r.add(f) && u().then(() => d[l](f, ...n))); // The actual importLibrary implementation\n }\n\n // --- UI Creation ---\n _createPACStructure() {\n const section = document.createElement(\"section\");\n this.#options.classes.section\n .split(\" \")\n .forEach((cl) => cl && section.classList.add(cl));\n\n // Main container\n this.#container = document.createElement(\"div\");\n this.#container.className = this.#options.classes.container;\n this.#container.setAttribute(\"id\", this.#containerId + \"-div\");\n section.appendChild(this.#container);\n\n // Icon\n const iconContainer = document.createElement(\"div\");\n iconContainer.className = this.#options.classes.icon_container;\n this.#container.appendChild(iconContainer);\n const icon = document.createElement(\"div\");\n icon.innerHTML = this.#options.classes.icon;\n iconContainer.appendChild(icon.firstElementChild); // Append the actual SVG element\n\n // Input field\n this.#inputElement = document.createElement(\"input\");\n this.#inputElement.id = this.#containerId + \"-input\"; // Assign ID for label association\n this.#inputElement.type = \"text\";\n this.#inputElement.name = \"search\"; // Consider making name configurable\n this.#inputElement.placeholder = this.#options.placeholder;\n this.#inputElement.autocomplete = this.#options.autocomplete;\n this.#inputElement.className = this.#options.classes.input;\n this.#inputElement.setAttribute(\"role\", \"combobox\");\n this.#inputElement.setAttribute(\"aria-autocomplete\", \"list\");\n this.#inputElement.setAttribute(\"aria-expanded\", \"false\"); // Will be updated dynamically\n this.#inputElement.setAttribute(\"aria-controls\", \"pacSuggestions\"); // Links to the suggestions list\n\n if (this.#options.autofocus) {\n this.#inputElement.autofocus = true;\n }\n if (this.#options.label) {\n const label = document.createElement(\"label\");\n label.htmlFor = this.#containerId + \"-labelInput\"; // Assuming inputElement gets this ID\n label.textContent = this.#options.label;\n // Add label classes if needed from opts.classes\n this.#container.appendChild(label); // Append label before input or adjust structure\n }\n this.#container.appendChild(this.#inputElement);\n\n // Keyboard hints container\n const kbdContainer = document.createElement(\"div\");\n kbdContainer.className = this.#options.classes.kbd_container;\n this.#kbdEscape = document.createElement(\"kbd\");\n this.#kbdEscape.className = this.#options.classes.kbd_escape;\n this.#kbdEscape.textContent = \"Esc\";\n kbdContainer.appendChild(this.#kbdEscape);\n this.#kbdUp = document.createElement(\"kbd\");\n this.#kbdUp.className = this.#options.classes.kbd_up;\n this.#kbdUp.innerHTML = \"&#8593;\"; // Up arrow HTML entity\n kbdContainer.appendChild(this.#kbdUp);\n this.#kbdDown = document.createElement(\"kbd\");\n this.#kbdDown.className = this.#options.classes.kbd_down;\n this.#kbdDown.innerHTML = \"&#8595;\"; // Down arrow HTML entity\n kbdContainer.appendChild(this.#kbdDown);\n this.#container.appendChild(kbdContainer);\n\n // Suggestions list (initially hidden)\n this.#ul = document.createElement(\"ul\");\n this.#ul.id = \"pacSuggestions\"; // Must match aria-controls\n this.#ul.className = this.#options.classes.ul;\n this.#ul.style.display = \"none\";\n this.#ul.setAttribute(\"role\", \"listbox\");\n this.#container.appendChild(this.#ul);\n\n this.#pacEl.appendChild(section);\n section.addEventListener(\"keydown\", this._onKeyDown.bind(this)); // Bind 'this'\n }\n\n /**\n * Initializes the core autocomplete functionality after the API is loaded.\n * Imports necessary libraries and sets up the input event listener.\n */\n async _initializeAutocomplete() {\n try {\n // Ensure the 'places' library is available via the dynamic loader\n // eslint-disable-next-line no-undef\n await google.maps.importLibrary(\"places\");\n // console.log('Places library imported successfully.'); // For debugging\n\n // Initial token generation\n this._refreshToken();\n\n // Attach the debounced request function to the input element's 'input' event\n if (this.#inputElement) {\n this.#inputElement.addEventListener(\n \"input\",\n this._debouncedMakeAcRequest.bind(this)\n );\n // Add focus/blur listeners if needed to manage suggestion visibility\n this.#inputElement.addEventListener(\"blur\", () => {\n // Delay hiding suggestions to allow click events on them\n setTimeout(() => {\n if (this.#ul && !this.#ul.contains(document.activeElement)) {\n // Check if focus moved outside suggestions\n this.#ul.style.display = \"none\";\n this.#inputElement.setAttribute(\"aria-expanded\", \"false\");\n }\n }, 200); // Adjust delay as needed\n });\n this.#inputElement.addEventListener(\"focus\", () => {\n // Potentially show suggestions again if input has value\n if (this.#inputElement.value && this.#allSuggestions.length > 0) {\n this.#ul.style.display = \"block\";\n this.#inputElement.setAttribute(\"aria-expanded\", \"true\");\n }\n });\n } else {\n this.#onErrorCallback(\n new Error(\"Input element not found during initialization.\")\n );\n }\n } catch (error) {\n console.error(\"Error initializing Google Places Autocomplete:\", error);\n // eslint-disable-next-line no-undef\n this.#onErrorCallback(\n new Error(\"Google Maps Places library not available.\")\n );\n }\n }\n\n /**\n * Resets the autocomplete input field, clears suggestions, and optionally refreshes the session token.\n * @param {boolean} [refresh=false] - Whether to refresh the Google Places session token.\n */\n _reset(refresh = false) {\n this.#currentSuggestion = -1;\n if (this.#inputElement) {\n this.#inputElement.value = \"\";\n }\n this.#allSuggestions = [];\n this.#currentSuggestion = -1;\n if (this.#ul) {\n this.#ul.innerHTML = \"\"; // Clear existing suggestions\n this.#ul.style.display = \"none\";\n }\n if (refresh) {\n this._refreshToken();\n }\n }\n /**\n * Removes the 'current' highlighting classes from all suggestion list items (li) and their links (a).\n */\n _resetLiClasses() {\n if (!this.#ul) return;\n Array.from(this.#ul.children).forEach((li) => {\n this.#options.classes.li_current\n .split(\" \")\n .forEach((cl) => li.classList.remove(cl));\n const link = li.querySelector(\"a\");\n if (link) {\n this.#options.classes.li_a_current\n .split(\" \")\n .forEach((cl) => link.classList.remove(cl));\n }\n });\n }\n\n /**\n * Handles keyboard events (ArrowDown, ArrowUp, Enter, Escape) for navigating\n * and selecting suggestions or closing the list.\n * @param {KeyboardEvent} e - The keyboard event object.\n */\n _onKeyDown(e) {\n if (\n !this.#allSuggestions.length ||\n !this.#ul ||\n this.#ul.style.display === \"none\"\n )\n return;\n\n this._resetLiClasses(); // Reset classes on any key press within the suggestions\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault(); // Prevent cursor movement in input\n this.#currentSuggestion = Math.min(\n this.#currentSuggestion + 1,\n this.#allSuggestions.length - 1\n );\n if (this.#currentSuggestion < 0) this.#currentSuggestion = 0; // Handle case where it was -1\n\n const currentLi = this.#ul.children.item(this.#currentSuggestion);\n if (currentLi) {\n const currentA = currentLi.querySelector(\"a\");\n this.#options.classes.li_current\n .split(\" \")\n .forEach((cl) => currentLi.classList.add(cl));\n if (currentA) {\n this.#options.classes.li_a_current\n .split(\" \")\n .forEach((cl) => currentA.classList.add(cl));\n }\n currentLi.scrollIntoView({ block: \"nearest\" }); // Ensure visible\n }\n\n // Visual feedback for key press\n this.#options.classes.kbd_active\n .split(\" \")\n .forEach((cl) => this.#kbdDown?.classList.add(cl));\n setTimeout(\n () =>\n this.#options.classes.kbd_active\n .split(\" \")\n .forEach((cl) => this.#kbdDown?.classList.remove(cl)),\n 300\n );\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault(); // Prevent cursor movement in input\n this.#currentSuggestion = Math.max(this.#currentSuggestion - 1, 0); // Stay at 0 if already there\n\n const currentLi = this.#ul.children.item(this.#currentSuggestion);\n if (currentLi) {\n const currentA = currentLi.querySelector(\"a\");\n this.#options.classes.li_current\n .split(\" \")\n .forEach((cl) => currentLi.classList.add(cl));\n if (currentA) {\n this.#options.classes.li_a_current\n .split(\" \")\n .forEach((cl) => currentA.classList.add(cl));\n }\n currentLi.scrollIntoView({ block: \"nearest\" }); // Ensure visible\n }\n\n // Visual feedback for key press\n this.#options.classes.kbd_active\n .split(\" \")\n .forEach((cl) => this.#kbdUp?.classList.add(cl));\n setTimeout(\n () =>\n this.#options.classes.kbd_active\n .split(\" \")\n .forEach((cl) => this.#kbdUp?.classList.remove(cl)),\n 300\n );\n } else if (e.key === \"Enter\") {\n e.preventDefault(); // Prevent form submission if applicable\n if (\n this.#currentSuggestion >= 0 &&\n this.#currentSuggestion < this.#allSuggestions.length\n ) {\n this._onPlaceSelected(\n this.#allSuggestions[this.#currentSuggestion].place\n );\n // Reset is handled within onPlaceSelected via reset(true)\n }\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n // Visual feedback for key press\n this.#options.classes.kbd_active\n .split(\" \")\n .forEach((cl) => this.#kbdEscape?.classList.add(cl));\n setTimeout(\n () =>\n this.#options.classes.kbd_active\n .split(\" \")\n .forEach((cl) => this.#kbdEscape?.classList.remove(cl)),\n 300\n );\n this._reset(true); // Reset search input and results, refresh token\n }\n }\n\n /**\n * Debounced function to fetch autocomplete suggestions from the Google Places API.\n * Triggered by the 'input' event on the input element.\n */\n _debouncedMakeAcRequest = this._debounce(async () => {\n if (!this.#inputElement || !this.#inputElement.value) {\n this._reset();\n if (this.#inputElement)\n this.#inputElement.setAttribute(\"aria-expanded\", \"false\");\n return;\n }\n\n this.#request.input = this.#inputElement.value;\n //console.log(\"Request:\", this.#request); // Debugging\n try {\n const { suggestions } =\n // eslint-disable-next-line no-undef\n await google.maps.places.AutocompleteSuggestion.fetchAutocompleteSuggestions(\n this.#request\n );\n\n // Display suggestions\n if (suggestions && suggestions.length > 0) {\n this.#ul.replaceChildren(\n ...this._createSuggestionElements(suggestions)\n );\n this.#ul.style.display = \"block\";\n this.#inputElement.setAttribute(\"aria-expanded\", \"true\");\n } else {\n // No suggestions found\n this._reset(); // Clear any old suggestions\n this.#inputElement.setAttribute(\"aria-expanded\", \"false\");\n // Optionally display a \"no results\" message in the 'ul'\n }\n } catch (error) {\n this.#onErrorCallback(error);\n this._reset();\n if (this.#inputElement)\n this.#inputElement.setAttribute(\"aria-expanded\", \"false\");\n }\n }, this.#options?.debounce ?? 100);\n\n /**\n * Creates an array of list item (LI) elements for the suggestions dropdown.\n * Each LI contains a link (A) with the place prediction details and distance.\n * Handles highlighting the matched parts of the suggestion text.\n * @param {Array<google.maps.places.AutocompleteSuggestion>} suggestions - Array of suggestion objects from the API.\n * @returns {Array<HTMLLIElement>} An array of LI elements to be added to the suggestions UL.\n */\n _createSuggestionElements(suggestions) {\n this.#allSuggestions = []; // Reset before populating\n return suggestions.map((suggestion, index) => {\n this.#allSuggestions.push({\n id: index + 1,\n description: suggestion.placePrediction.toString(),\n place: suggestion.placePrediction.toPlace(),\n });\n\n // create div elements\n const divContainer = document.createElement(\"div\");\n divContainer.className = this.#options.classes.li_div_container; // flex min-w-0 gap-x-4\n // create inner div element - place name\n const divInner = document.createElement(\"div\");\n divInner.className = this.#options.classes.li_div_one; // min-w-0 flex-auto\n divContainer.appendChild(divInner);\n // create p element - place name\n const p = document.createElement(\"p\");\n p.className = this.#options.classes.li_div_one_p; // text-sm/6\n\n // get prediction text\n const predictionText = suggestion.placePrediction.text;\n const originalText = predictionText.text;\n // Array of objects with startOffset, endOffset\n const matches = predictionText.matches;\n\n //Highlighting Logic\n let lastIndex = 0;\n\n // Sort matches just in case they aren't ordered (though they usually are)\n matches.sort((a, b) => a.startOffset - b.startOffset);\n\n // 1. Create the outer span\n const outerSpan = document.createElement(\"span\");\n\n // 2. Create the inner span for the bold part\n const innerSpan = document.createElement(\"span\");\n innerSpan.classList = this.#options.classes.highlight ?? \"font-bold\"; // Use the highlight class from options\n\n for (const match of matches) {\n // Append text before the current match\n outerSpan.textContent += originalText.substring(\n lastIndex,\n match.startOffset\n );\n\n // Append the highlighted match segment\n if (match.startOffset > 0) {\n // check previous charter is space\n const prevChar = originalText.charAt(match.startOffset - 1);\n if (prevChar == \" \") {\n innerSpan.textContent += \" \";\n }\n }\n innerSpan.textContent += originalText.substring(\n match.startOffset,\n match.endOffset\n );\n\n // Update the last index processed\n lastIndex = match.endOffset;\n }\n\n // 3. Create a text node for the remaining text\n const remainingText = document.createTextNode(\n originalText.substring(lastIndex)\n );\n\n // 4. Append the inner span and the text node to the outer span\n outerSpan.appendChild(innerSpan);\n outerSpan.appendChild(remainingText);\n\n // 5. Append the outer span to the paragraph element\n p.appendChild(outerSpan);\n\n divInner.appendChild(p);\n divContainer.appendChild(divInner);\n\n // create inner div element - distance\n const divInner2 = document.createElement(\"div\");\n divInner2.className = this.#options.classes.li_div_two; //'shrink-0 flex flex-col items-end min-w-16';\n divContainer.appendChild(divInner2);\n // create p element - distance\n const p2 = document.createElement(\"p\");\n p2.className = this.#options.classes.li_div_two_p; //'mt-1 text-xs/5 ';\n p2.textContent = this._formatDistance(\n suggestion.placePrediction.distanceMeters,\n this.#options.distance_units ?? \"km\"\n );\n divInner2.appendChild(p2);\n\n // // create a link element\n const a = document.createElement(\"a\");\n a.href = \"javascript:void(0)\";\n a.tabIndex = index + 1;\n a.className = this.#options.classes.li_a; // block w-full flex justify-between\n\n a.addEventListener(\"click\", () => {\n this._onPlaceSelected(suggestion.placePrediction.toPlace());\n });\n\n // ...\n // a.addEventListener(\"click\", () => {\n // this._fetchPlaceDetails(prediction.place_id);\n // });\n a.appendChild(divContainer);\n a.appendChild(divInner2);\n\n const li = document.createElement(\"li\");\n li.id = `option-${index + 1}`;\n li.className = this.#options.classes.li;\n\n li.appendChild(a);\n return li;\n });\n }\n\n /**\n * Handles the selection of a place. Fetches required fields\n * (displayName, formattedAddress, addressComponents) and calls the\n * user-defined `onPacData` callback.\n * @param {google.maps.places.Place} place - The selected Place object.\n */\n async _onPlaceSelected(place) {\n try {\n // Fetch necessary details for the selected place\n await place.fetchFields({\n fields: [\"displayName\", \"formattedAddress\", \"addressComponents\"], // Add more fields as needed\n });\n // Call the user-provided callback with the place data\n // eslint-disable-next-line no-undef\n this.#onDataCallback(place.toJSON()); // Convert to plain JSON object for the callback\n } catch (error) {\n console.error(\"Error fetching place details:\", error);\n // eslint-disable-next-line no-undef\n this.#onErrorCallback(error);\n } finally {\n // Reset the input and suggestions regardless of success/error\n this._reset(true); // Refresh token after selection\n }\n }\n\n /**\n * Creates a new Google Places Autocomplete Session Token.\n * This should be called before starting a new series of autocomplete requests.\n */\n _refreshToken() {\n try {\n // eslint-disable-next-line no-undef\n this.#request.sessionToken =\n new google.maps.places.AutocompleteSessionToken();\n } catch (error) {\n console.error(\"Error creating session token:\", error);\n // eslint-disable-next-line no-undef\n this.#onErrorCallback(error);\n }\n }\n\n clear() {\n this._reset(true);\n }\n\n destroy() {\n // Remove event listeners, remove elements from DOM\n if (this.#inputElement) {\n this.#inputElement.removeEventListener(\n \"input\",\n this._debouncedMakeAcRequest\n );\n // remove other listeners\n }\n if (this.#pacEl && this.#container) {\n this.#pacEl.removeChild(this.#container.parentElement); // remove the whole section\n }\n // Nullify properties\n for (const prop in this) {\n if (Object.hasOwn(this, prop)) {\n this[prop] = null;\n }\n }\n console.log(\"PacAutocomplete instance destroyed.\");\n }\n}\n"],"names":["_a","_containerId","_pacEl","_googleMapsApiKey","_googleMapsApiVersion","_options","_request","_inputElement","_container","_ul","_kbdEscape","_kbdUp","_kbdDown","_allSuggestions","_currentSuggestion","_onDataCallback","_onErrorCallback","_defaultClasses","_defaultRequestParams","PlacesAutocomplete","config","__privateAdd","__publicField","__privateGet","suggestions","error","__privateSet","place","func","wait","timeout","args","later","distance","units","value","unitLabel","g","h","a","k","p","c","l","q","m","b","d","r","e","u","f","n","t","section","cl","iconContainer","icon","label","kbdContainer","refresh","li","link","currentLi","currentA","suggestion","index","divContainer","divInner","predictionText","originalText","matches","lastIndex","outerSpan","innerSpan","match","remainingText","divInner2","p2","prop"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- (function(r,l){typeof exports=="object"&&typeof module<"u"?l(exports):typeof define=="function"&&define.amd?define(["exports"],l):(r=typeof globalThis<"u"?globalThis:r||self,l(r.PlacesAutocomplete={}))})(this,function(r){"use strict";var H=Object.defineProperty;var $=r=>{throw TypeError(r)};var V=(r,l,d)=>l in r?H(r,l,{enumerable:!0,configurable:!0,writable:!0,value:d}):r[l]=d;var F=(r,l,d)=>V(r,typeof l!="symbol"?l+"":l,d),B=(r,l,d)=>l.has(r)||$("Cannot "+d);var e=(r,l,d)=>(B(r,l,"read from private field"),d?d.call(r):l.get(r)),p=(r,l,d)=>l.has(r)?$("Cannot add the same private member more than once"):l instanceof WeakSet?l.add(r):l.set(r,d),h=(r,l,d,f)=>(B(r,l,"write to private field"),f?f.call(r,d):l.set(r,d),d);/**
1
+ (function(r,l){typeof exports=="object"&&typeof module<"u"?l(exports):typeof define=="function"&&define.amd?define(["exports"],l):(r=typeof globalThis<"u"?globalThis:r||self,l(r.PlacesAutocomplete={}))})(this,function(r){"use strict";var V=Object.defineProperty;var F=r=>{throw TypeError(r)};var J=(r,l,p)=>l in r?V(r,l,{enumerable:!0,configurable:!0,writable:!0,value:p}):r[l]=p;var B=(r,l,p)=>J(r,typeof l!="symbol"?l+"":l,p),H=(r,l,p)=>l.has(r)||F("Cannot "+p);var e=(r,l,p)=>(H(r,l,"read from private field"),p?p.call(r):l.get(r)),d=(r,l,p)=>l.has(r)?F("Cannot add the same private member more than once"):l instanceof WeakSet?l.add(r):l.set(r,p),h=(r,l,p,g)=>(H(r,l,"write to private field"),g?g.call(r,p):l.set(r,p),p);/**
2
2
  * Initializes a Places Autocomplete widget.
3
3
  * This script dynamically loads the Google Maps JavaScript API, creates the UI elements
4
4
  * for the autocomplete input and suggestions list, handles user input with debouncing,
@@ -8,5 +8,5 @@
8
8
  * @author Alexander Pechkarev <alexpechkarev@gmail.com>
9
9
  * @license MIT
10
10
  *
11
- */var d,f,O,j,i,L,o,b,c,E,w,k,_,u,R,y,z,G;class l{constructor(t){p(this,f);p(this,O);p(this,j);p(this,i);p(this,L);p(this,o);p(this,b);p(this,c);p(this,E);p(this,w);p(this,k);p(this,_,[]);p(this,u,-1);p(this,R);p(this,y);p(this,z,{section:"",container:"relative z-10 transform rounded-xl mt-4",icon_container:"pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3",icon:'<svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8" /><path d="m21 21-4.3-4.3" /></svg>',input:"border-1 w-full rounded-md border-0 shadow-sm bg-gray-100 px-4 py-2.5 pl-10 pr-20 text-gray-900 ring-1 ring-inset ring-gray-300 focus:ring-2 sm:text-sm",kbd_container:"absolute inset-y-0 right-0 flex py-1.5 pr-1.5",kbd_escape:"inline-flex items-center rounded border border-gray-300 px-1 font-sans text-xs text-gray-500 w-8 mr-1",kbd_up:"inline-flex items-center justify-center rounded border border-gray-300 px-1 font-sans text-xs text-gray-500 w-6",kbd_down:"inline-flex items-center rounded border border-gray-400 px-1 font-sans text-xs text-gray-500 justify-center w-6",kbd_active:"bg-indigo-500 text-white",ul:"absolute z-50 -mb-2 mt-1 max-h-60 w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none sm:text-sm divide-y divide-gray-100",li:"z-50 cursor-default select-none py-2 px-2 lg:px-4 text-gray-900 hover:bg-indigo-500 hover:text-white",li_current:"bg-indigo-500",li_a:"block w-full flex justify-between",li_a_current:"text-white",li_div_container:"flex min-w-0 gap-x-4",li_div_one:"min-w-0 flex-auto",li_div_one_p:"text-sm/6",li_div_two:"shrink-0 flex flex-col items-end min-w-16",li_div_two_p:"mt-1 text-xs/5",highlight:"font-bold"});p(this,G,{input:"",includedRegionCodes:["GB"],language:"en-gb",region:"GB"});F(this,"_debouncedMakeAcRequest",this._debounce(async()=>{if(!e(this,o)||!e(this,o).value){this._reset(),e(this,o)&&e(this,o).setAttribute("aria-expanded","false");return}e(this,L).input=e(this,o).value;try{const{suggestions:t}=await google.maps.places.AutocompleteSuggestion.fetchAutocompleteSuggestions(e(this,L));t&&t.length>0?(e(this,c).replaceChildren(...this._createSuggestionElements(t)),e(this,c).style.display="block",e(this,o).setAttribute("aria-expanded","true")):(this._reset(),e(this,o).setAttribute("aria-expanded","false"))}catch(t){e(this,y).call(this,t),this._reset(),e(this,o)&&e(this,o).setAttribute("aria-expanded","false")}},((d=e(this,i))==null?void 0:d.debounce)??100));if(!t||!t.containerId||!t.googleMapsApiKey)throw new Error("PacAutocomplete: Missing required configuration (containerId, googleMapsApiKey).");if(h(this,f,document.getElementById(t.containerId)),!e(this,f))throw new Error(`PacAutocomplete: Container element with ID "${t.containerId}" not found.`);h(this,O,t.googleMapsApiKey),h(this,j,t.googleMapsApiVersion||"weekly"),h(this,i,{autofocus:!1,autocomplete:"off",placeholder:"Start typing your address ...",distance:!0,distance_units:"km",label:"",debounce:100,...t.options}),t.options&&t.options.classes?e(this,i).classes={...e(this,z),...t.options.classes}:e(this,i).classes=e(this,z),h(this,R,t.onResponse||(n=>{console.info("---------Default onResponse not provided---------"),console.info("Selected Place:",JSON.stringify(n,null,2))})),h(this,y,t.onError||(n=>{console.error("---------Default onError not provided---------"),console.error("PAC Error:",n)})),t.requestParams&&Object.keys(t.requestParams).length>0?h(this,L,{...e(this,G),...t.requestParams}):h(this,L,{...e(this,G)}),this._init()}async _init(){try{(typeof google>"u"||!google.maps)&&await this._loadGoogleMapsApi({key:e(this,O),v:e(this,j)}),this._createPACStructure(),await this._initializeAutocomplete()}catch(t){e(this,y).call(this,t)}}_debounce(t,n){let s=null;return function(...m){const v=()=>{s=null,t(...m)};s!==null&&clearTimeout(s),s=setTimeout(v,n??100)}}_formatDistance(t,n){if(typeof t!="number"||!e(this,i).distance)return null;let s,a;return n==="km"?(s=(t/1e3).toFixed(2),a="km"):(s=(t/1609.34).toFixed(2),a="miles"),s=s.replace(/\.00$/,""),`${s} ${a}`}async _loadGoogleMapsApi(t){var n,s,a,m="The Google Maps JavaScript API",v="google",N="importLibrary",S="__ib__",I=document,C=window;C=C[v]||(C[v]={});var A=C.maps||(C.maps={}),T=new Set,q=new URLSearchParams,D=()=>n||(n=new Promise(async(P,g)=>{var M;s=I.createElement("script"),q.set("libraries",[...T].join(","));for(a in t)q.set(a.replace(/[A-Z]/g,x=>"_"+x[0].toLowerCase()),t[a]);q.set("callback",v+".maps."+S),s.src=`https://maps.${v}apis.com/maps/api/js?`+q,A[S]=P,s.onerror=()=>n=g(Error(m+" could not load.")),s.nonce=((M=I.querySelector("script[nonce]"))==null?void 0:M.nonce)||"",I.head.append(s)}));A[N]?console.warn(m+" only loads once. Ignoring:",t):A[N]=(P,...g)=>T.add(P)&&D().then(()=>A[N](P,...g))}_createPACStructure(){const t=document.createElement("section");e(this,i).classes.section.split(" ").forEach(m=>m&&t.classList.add(m)),h(this,b,document.createElement("div")),e(this,b).className=e(this,i).classes.container,e(this,b).setAttribute("id",e(this,f)),t.appendChild(e(this,b));const n=document.createElement("div");n.className=e(this,i).classes.icon_container,e(this,b).appendChild(n);const s=document.createElement("div");if(s.innerHTML=e(this,i).classes.icon,n.appendChild(s.firstElementChild),h(this,o,document.createElement("input")),e(this,o).id="input"+e(this,f),e(this,o).type="text",e(this,o).name="search",e(this,o).placeholder=e(this,i).placeholder,e(this,o).autocomplete=e(this,i).autocomplete,e(this,o).className=e(this,i).classes.input,e(this,o).setAttribute("role","combobox"),e(this,o).setAttribute("aria-autocomplete","list"),e(this,o).setAttribute("aria-expanded","false"),e(this,o).setAttribute("aria-controls","pacSuggestions"),e(this,i).autofocus&&(e(this,o).autofocus=!0),e(this,i).label){const m=document.createElement("label");m.htmlFor="labelInput"+e(this,f),m.textContent=e(this,i).label,e(this,b).appendChild(m)}e(this,b).appendChild(e(this,o));const a=document.createElement("div");a.className=e(this,i).classes.kbd_container,h(this,E,document.createElement("kbd")),e(this,E).className=e(this,i).classes.kbd_escape,e(this,E).textContent="Esc",a.appendChild(e(this,E)),h(this,w,document.createElement("kbd")),e(this,w).className=e(this,i).classes.kbd_up,e(this,w).innerHTML="&#8593;",a.appendChild(e(this,w)),h(this,k,document.createElement("kbd")),e(this,k).className=e(this,i).classes.kbd_down,e(this,k).innerHTML="&#8595;",a.appendChild(e(this,k)),e(this,b).appendChild(a),h(this,c,document.createElement("ul")),e(this,c).id="pacSuggestions",e(this,c).className=e(this,i).classes.ul,e(this,c).style.display="none",e(this,c).setAttribute("role","listbox"),e(this,b).appendChild(e(this,c)),e(this,f).appendChild(t),t.addEventListener("keydown",this._onKeyDown.bind(this))}async _initializeAutocomplete(){try{await google.maps.importLibrary("places"),this._refreshToken(),e(this,o)?(e(this,o).addEventListener("input",this._debouncedMakeAcRequest.bind(this)),e(this,o).addEventListener("blur",()=>{setTimeout(()=>{e(this,c)&&!e(this,c).contains(document.activeElement)&&(e(this,c).style.display="none",e(this,o).setAttribute("aria-expanded","false"))},200)}),e(this,o).addEventListener("focus",()=>{e(this,o).value&&e(this,_).length>0&&(e(this,c).style.display="block",e(this,o).setAttribute("aria-expanded","true"))})):e(this,y).call(this,new Error("Input element not found during initialization."))}catch(t){console.error("Error initializing Google Places Autocomplete:",t),e(this,y).call(this,new Error("Google Maps Places library not available."))}}_reset(t=!1){h(this,u,-1),e(this,o)&&(e(this,o).value=""),h(this,_,[]),h(this,u,-1),e(this,c)&&(e(this,c).innerHTML="",e(this,c).style.display="none"),t&&this._refreshToken()}_resetLiClasses(){e(this,c)&&Array.from(e(this,c).children).forEach(t=>{e(this,i).classes.li_current.split(" ").forEach(s=>t.classList.remove(s));const n=t.querySelector("a");n&&e(this,i).classes.li_a_current.split(" ").forEach(s=>n.classList.remove(s))})}_onKeyDown(t){if(!(!e(this,_).length||!e(this,c)||e(this,c).style.display==="none"))if(this._resetLiClasses(),t.key==="ArrowDown"){t.preventDefault(),h(this,u,Math.min(e(this,u)+1,e(this,_).length-1)),e(this,u)<0&&h(this,u,0);const n=e(this,c).children.item(e(this,u));if(n){const s=n.querySelector("a");e(this,i).classes.li_current.split(" ").forEach(a=>n.classList.add(a)),s&&e(this,i).classes.li_a_current.split(" ").forEach(a=>s.classList.add(a)),n.scrollIntoView({block:"nearest"})}e(this,i).classes.kbd_active.split(" ").forEach(s=>{var a;return(a=e(this,k))==null?void 0:a.classList.add(s)}),setTimeout(()=>e(this,i).classes.kbd_active.split(" ").forEach(s=>{var a;return(a=e(this,k))==null?void 0:a.classList.remove(s)}),300)}else if(t.key==="ArrowUp"){t.preventDefault(),h(this,u,Math.max(e(this,u)-1,0));const n=e(this,c).children.item(e(this,u));if(n){const s=n.querySelector("a");e(this,i).classes.li_current.split(" ").forEach(a=>n.classList.add(a)),s&&e(this,i).classes.li_a_current.split(" ").forEach(a=>s.classList.add(a)),n.scrollIntoView({block:"nearest"})}e(this,i).classes.kbd_active.split(" ").forEach(s=>{var a;return(a=e(this,w))==null?void 0:a.classList.add(s)}),setTimeout(()=>e(this,i).classes.kbd_active.split(" ").forEach(s=>{var a;return(a=e(this,w))==null?void 0:a.classList.remove(s)}),300)}else t.key==="Enter"?(t.preventDefault(),e(this,u)>=0&&e(this,u)<e(this,_).length&&this._onPlaceSelected(e(this,_)[e(this,u)].place)):t.key==="Escape"&&(t.preventDefault(),e(this,i).classes.kbd_active.split(" ").forEach(n=>{var s;return(s=e(this,E))==null?void 0:s.classList.add(n)}),setTimeout(()=>e(this,i).classes.kbd_active.split(" ").forEach(n=>{var s;return(s=e(this,E))==null?void 0:s.classList.remove(n)}),300),this._reset(!0))}_createSuggestionElements(t){return h(this,_,[]),t.map((n,s)=>{e(this,_).push({id:s+1,description:n.placePrediction.toString(),place:n.placePrediction.toPlace()});const a=document.createElement("div");a.className=e(this,i).classes.li_div_container;const m=document.createElement("div");m.className=e(this,i).classes.li_div_one,a.appendChild(m);const v=document.createElement("p");v.className=e(this,i).classes.li_div_one_p;const N=n.placePrediction.text,S=N.text,I=N.matches;let C=0;I.sort((x,K)=>x.startOffset-K.startOffset);const A=document.createElement("span"),T=document.createElement("span");T.classList=e(this,i).classes.highlight??"font-bold";for(const x of I)A.textContent+=S.substring(C,x.startOffset),x.startOffset>0&&S.charAt(x.startOffset-1)==" "&&(T.textContent+=" "),T.textContent+=S.substring(x.startOffset,x.endOffset),C=x.endOffset;const q=document.createTextNode(S.substring(C));A.appendChild(T),A.appendChild(q),v.appendChild(A),m.appendChild(v),a.appendChild(m);const D=document.createElement("div");D.className=e(this,i).classes.li_div_two,a.appendChild(D);const P=document.createElement("p");P.className=e(this,i).classes.li_div_two_p,P.textContent=this._formatDistance(n.placePrediction.distanceMeters,e(this,i).distance_units??"km"),D.appendChild(P);const g=document.createElement("a");g.href="javascript:void(0)",g.tabIndex=s+1,g.className=e(this,i).classes.li_a,g.addEventListener("click",()=>{this._onPlaceSelected(n.placePrediction.toPlace())}),g.appendChild(a),g.appendChild(D);const M=document.createElement("li");return M.id=`option-${s+1}`,M.className=e(this,i).classes.li,M.appendChild(g),M})}async _onPlaceSelected(t){try{await t.fetchFields({fields:["displayName","formattedAddress","addressComponents"]}),e(this,R).call(this,t.toJSON())}catch(n){console.error("Error fetching place details:",n),e(this,y).call(this,n)}finally{this._reset(!0)}}_refreshToken(){try{e(this,L).sessionToken=new google.maps.places.AutocompleteSessionToken}catch(t){console.error("Error creating session token:",t),e(this,y).call(this,t)}}clear(){this._reset(!0)}destroy(){e(this,o)&&e(this,o).removeEventListener("input",this._debouncedMakeAcRequest),e(this,f)&&e(this,b)&&e(this,f).removeChild(e(this,b).parentElement);for(const t in this)Object.hasOwn(this,t)&&(this[t]=null);console.log("PacAutocomplete instance destroyed.")}}f=new WeakMap,O=new WeakMap,j=new WeakMap,i=new WeakMap,L=new WeakMap,o=new WeakMap,b=new WeakMap,c=new WeakMap,E=new WeakMap,w=new WeakMap,k=new WeakMap,_=new WeakMap,u=new WeakMap,R=new WeakMap,y=new WeakMap,z=new WeakMap,G=new WeakMap,r.PlacesAutocomplete=l,Object.defineProperty(r,Symbol.toStringTag,{value:"Module"})});
11
+ */var p,g,L,j,R,i,P,o,f,c,E,w,k,b,u,z,y,G,K;class l{constructor(t){d(this,g);d(this,L);d(this,j);d(this,R);d(this,i);d(this,P);d(this,o);d(this,f);d(this,c);d(this,E);d(this,w);d(this,k);d(this,b,[]);d(this,u,-1);d(this,z);d(this,y);d(this,G,{section:"",container:"relative z-10 transform rounded-xl mt-4",icon_container:"pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3",icon:'<svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8" /><path d="m21 21-4.3-4.3" /></svg>',input:"border-1 w-full rounded-md border-0 shadow-sm bg-gray-100 px-4 py-2.5 pl-10 pr-20 text-gray-900 ring-1 ring-inset ring-gray-300 focus:ring-2 sm:text-sm",kbd_container:"absolute inset-y-0 right-0 flex py-1.5 pr-1.5",kbd_escape:"inline-flex items-center rounded border border-gray-300 px-1 font-sans text-xs text-gray-500 w-8 mr-1",kbd_up:"inline-flex items-center justify-center rounded border border-gray-300 px-1 font-sans text-xs text-gray-500 w-6",kbd_down:"inline-flex items-center rounded border border-gray-400 px-1 font-sans text-xs text-gray-500 justify-center w-6",kbd_active:"bg-indigo-500 text-white",ul:"absolute z-50 -mb-2 mt-1 max-h-60 w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none sm:text-sm divide-y divide-gray-100",li:"z-50 cursor-default select-none py-2 px-2 lg:px-4 text-gray-900 hover:bg-indigo-500 hover:text-white",li_current:"bg-indigo-500",li_a:"block w-full flex justify-between",li_a_current:"text-white",li_div_container:"flex min-w-0 gap-x-4",li_div_one:"min-w-0 flex-auto",li_div_one_p:"text-sm/6",li_div_two:"shrink-0 flex flex-col items-end min-w-16",li_div_two_p:"mt-1 text-xs/5",highlight:"font-bold"});d(this,K,{input:"",includedRegionCodes:["GB"],language:"en-gb",region:"GB"});B(this,"_debouncedMakeAcRequest",this._debounce(async()=>{if(!e(this,o)||!e(this,o).value){this._reset(),e(this,o)&&e(this,o).setAttribute("aria-expanded","false");return}e(this,P).input=e(this,o).value;try{const{suggestions:t}=await google.maps.places.AutocompleteSuggestion.fetchAutocompleteSuggestions(e(this,P));t&&t.length>0?(e(this,c).replaceChildren(...this._createSuggestionElements(t)),e(this,c).style.display="block",e(this,o).setAttribute("aria-expanded","true")):(this._reset(),e(this,o).setAttribute("aria-expanded","false"))}catch(t){e(this,y).call(this,t),this._reset(),e(this,o)&&e(this,o).setAttribute("aria-expanded","false")}},((p=e(this,i))==null?void 0:p.debounce)??100));if(!t||!t.containerId||!t.googleMapsApiKey)throw new Error("PacAutocomplete: Missing required configuration (containerId, googleMapsApiKey).");if(h(this,g,t.containerId),h(this,L,document.getElementById(t.containerId)),!e(this,L))throw new Error(`PacAutocomplete: Container element with ID "${t.containerId}" not found.`);h(this,j,t.googleMapsApiKey),h(this,R,t.googleMapsApiVersion||"weekly"),h(this,i,{autofocus:!1,autocomplete:"off",placeholder:"Start typing your address ...",distance:!0,distance_units:"km",label:"",debounce:100,...t.options}),t.options&&t.options.classes?e(this,i).classes={...e(this,G),...t.options.classes}:e(this,i).classes=e(this,G),h(this,z,t.onResponse||(n=>{console.info("---------Default onResponse not provided---------"),console.info("Selected Place:",JSON.stringify(n,null,2))})),h(this,y,t.onError||(n=>{console.error("---------Default onError not provided---------"),console.error("PAC Error:",n)})),t.requestParams&&Object.keys(t.requestParams).length>0?h(this,P,{...e(this,K),...t.requestParams}):h(this,P,{...e(this,K)}),this._init()}async _init(){try{(typeof google>"u"||!google.maps)&&await this._loadGoogleMapsApi({key:e(this,j),v:e(this,R)}),this._createPACStructure(),await this._initializeAutocomplete()}catch(t){e(this,y).call(this,t)}}_debounce(t,n){let s=null;return function(...m){const v=()=>{s=null,t(...m)};s!==null&&clearTimeout(s),s=setTimeout(v,n??100)}}_formatDistance(t,n){if(typeof t!="number"||!e(this,i).distance)return null;let s,a;return n==="km"?(s=(t/1e3).toFixed(2),a="km"):(s=(t/1609.34).toFixed(2),a="miles"),s=s.replace(/\.00$/,""),`${s} ${a}`}async _loadGoogleMapsApi(t){var n,s,a,m="The Google Maps JavaScript API",v="google",I="importLibrary",T="__ib__",q=document,C=window;C=C[v]||(C[v]={});var A=C.maps||(C.maps={}),M=new Set,D=new URLSearchParams,O=()=>n||(n=new Promise(async(S,_)=>{var N;s=q.createElement("script"),D.set("libraries",[...M].join(","));for(a in t)D.set(a.replace(/[A-Z]/g,x=>"_"+x[0].toLowerCase()),t[a]);D.set("callback",v+".maps."+T),s.src=`https://maps.${v}apis.com/maps/api/js?`+D,A[T]=S,s.onerror=()=>n=_(Error(m+" could not load.")),s.nonce=((N=q.querySelector("script[nonce]"))==null?void 0:N.nonce)||"",q.head.append(s)}));A[I]?console.warn(m+" only loads once. Ignoring:",t):A[I]=(S,..._)=>M.add(S)&&O().then(()=>A[I](S,..._))}_createPACStructure(){const t=document.createElement("section");e(this,i).classes.section.split(" ").forEach(m=>m&&t.classList.add(m)),h(this,f,document.createElement("div")),e(this,f).className=e(this,i).classes.container,e(this,f).setAttribute("id",e(this,g)+"-div"),t.appendChild(e(this,f));const n=document.createElement("div");n.className=e(this,i).classes.icon_container,e(this,f).appendChild(n);const s=document.createElement("div");if(s.innerHTML=e(this,i).classes.icon,n.appendChild(s.firstElementChild),h(this,o,document.createElement("input")),e(this,o).id=e(this,g)+"-input",e(this,o).type="text",e(this,o).name="search",e(this,o).placeholder=e(this,i).placeholder,e(this,o).autocomplete=e(this,i).autocomplete,e(this,o).className=e(this,i).classes.input,e(this,o).setAttribute("role","combobox"),e(this,o).setAttribute("aria-autocomplete","list"),e(this,o).setAttribute("aria-expanded","false"),e(this,o).setAttribute("aria-controls","pacSuggestions"),e(this,i).autofocus&&(e(this,o).autofocus=!0),e(this,i).label){const m=document.createElement("label");m.htmlFor=e(this,g)+"-labelInput",m.textContent=e(this,i).label,e(this,f).appendChild(m)}e(this,f).appendChild(e(this,o));const a=document.createElement("div");a.className=e(this,i).classes.kbd_container,h(this,E,document.createElement("kbd")),e(this,E).className=e(this,i).classes.kbd_escape,e(this,E).textContent="Esc",a.appendChild(e(this,E)),h(this,w,document.createElement("kbd")),e(this,w).className=e(this,i).classes.kbd_up,e(this,w).innerHTML="&#8593;",a.appendChild(e(this,w)),h(this,k,document.createElement("kbd")),e(this,k).className=e(this,i).classes.kbd_down,e(this,k).innerHTML="&#8595;",a.appendChild(e(this,k)),e(this,f).appendChild(a),h(this,c,document.createElement("ul")),e(this,c).id="pacSuggestions",e(this,c).className=e(this,i).classes.ul,e(this,c).style.display="none",e(this,c).setAttribute("role","listbox"),e(this,f).appendChild(e(this,c)),e(this,L).appendChild(t),t.addEventListener("keydown",this._onKeyDown.bind(this))}async _initializeAutocomplete(){try{await google.maps.importLibrary("places"),this._refreshToken(),e(this,o)?(e(this,o).addEventListener("input",this._debouncedMakeAcRequest.bind(this)),e(this,o).addEventListener("blur",()=>{setTimeout(()=>{e(this,c)&&!e(this,c).contains(document.activeElement)&&(e(this,c).style.display="none",e(this,o).setAttribute("aria-expanded","false"))},200)}),e(this,o).addEventListener("focus",()=>{e(this,o).value&&e(this,b).length>0&&(e(this,c).style.display="block",e(this,o).setAttribute("aria-expanded","true"))})):e(this,y).call(this,new Error("Input element not found during initialization."))}catch(t){console.error("Error initializing Google Places Autocomplete:",t),e(this,y).call(this,new Error("Google Maps Places library not available."))}}_reset(t=!1){h(this,u,-1),e(this,o)&&(e(this,o).value=""),h(this,b,[]),h(this,u,-1),e(this,c)&&(e(this,c).innerHTML="",e(this,c).style.display="none"),t&&this._refreshToken()}_resetLiClasses(){e(this,c)&&Array.from(e(this,c).children).forEach(t=>{e(this,i).classes.li_current.split(" ").forEach(s=>t.classList.remove(s));const n=t.querySelector("a");n&&e(this,i).classes.li_a_current.split(" ").forEach(s=>n.classList.remove(s))})}_onKeyDown(t){if(!(!e(this,b).length||!e(this,c)||e(this,c).style.display==="none"))if(this._resetLiClasses(),t.key==="ArrowDown"){t.preventDefault(),h(this,u,Math.min(e(this,u)+1,e(this,b).length-1)),e(this,u)<0&&h(this,u,0);const n=e(this,c).children.item(e(this,u));if(n){const s=n.querySelector("a");e(this,i).classes.li_current.split(" ").forEach(a=>n.classList.add(a)),s&&e(this,i).classes.li_a_current.split(" ").forEach(a=>s.classList.add(a)),n.scrollIntoView({block:"nearest"})}e(this,i).classes.kbd_active.split(" ").forEach(s=>{var a;return(a=e(this,k))==null?void 0:a.classList.add(s)}),setTimeout(()=>e(this,i).classes.kbd_active.split(" ").forEach(s=>{var a;return(a=e(this,k))==null?void 0:a.classList.remove(s)}),300)}else if(t.key==="ArrowUp"){t.preventDefault(),h(this,u,Math.max(e(this,u)-1,0));const n=e(this,c).children.item(e(this,u));if(n){const s=n.querySelector("a");e(this,i).classes.li_current.split(" ").forEach(a=>n.classList.add(a)),s&&e(this,i).classes.li_a_current.split(" ").forEach(a=>s.classList.add(a)),n.scrollIntoView({block:"nearest"})}e(this,i).classes.kbd_active.split(" ").forEach(s=>{var a;return(a=e(this,w))==null?void 0:a.classList.add(s)}),setTimeout(()=>e(this,i).classes.kbd_active.split(" ").forEach(s=>{var a;return(a=e(this,w))==null?void 0:a.classList.remove(s)}),300)}else t.key==="Enter"?(t.preventDefault(),e(this,u)>=0&&e(this,u)<e(this,b).length&&this._onPlaceSelected(e(this,b)[e(this,u)].place)):t.key==="Escape"&&(t.preventDefault(),e(this,i).classes.kbd_active.split(" ").forEach(n=>{var s;return(s=e(this,E))==null?void 0:s.classList.add(n)}),setTimeout(()=>e(this,i).classes.kbd_active.split(" ").forEach(n=>{var s;return(s=e(this,E))==null?void 0:s.classList.remove(n)}),300),this._reset(!0))}_createSuggestionElements(t){return h(this,b,[]),t.map((n,s)=>{e(this,b).push({id:s+1,description:n.placePrediction.toString(),place:n.placePrediction.toPlace()});const a=document.createElement("div");a.className=e(this,i).classes.li_div_container;const m=document.createElement("div");m.className=e(this,i).classes.li_div_one,a.appendChild(m);const v=document.createElement("p");v.className=e(this,i).classes.li_div_one_p;const I=n.placePrediction.text,T=I.text,q=I.matches;let C=0;q.sort((x,$)=>x.startOffset-$.startOffset);const A=document.createElement("span"),M=document.createElement("span");M.classList=e(this,i).classes.highlight??"font-bold";for(const x of q)A.textContent+=T.substring(C,x.startOffset),x.startOffset>0&&T.charAt(x.startOffset-1)==" "&&(M.textContent+=" "),M.textContent+=T.substring(x.startOffset,x.endOffset),C=x.endOffset;const D=document.createTextNode(T.substring(C));A.appendChild(M),A.appendChild(D),v.appendChild(A),m.appendChild(v),a.appendChild(m);const O=document.createElement("div");O.className=e(this,i).classes.li_div_two,a.appendChild(O);const S=document.createElement("p");S.className=e(this,i).classes.li_div_two_p,S.textContent=this._formatDistance(n.placePrediction.distanceMeters,e(this,i).distance_units??"km"),O.appendChild(S);const _=document.createElement("a");_.href="javascript:void(0)",_.tabIndex=s+1,_.className=e(this,i).classes.li_a,_.addEventListener("click",()=>{this._onPlaceSelected(n.placePrediction.toPlace())}),_.appendChild(a),_.appendChild(O);const N=document.createElement("li");return N.id=`option-${s+1}`,N.className=e(this,i).classes.li,N.appendChild(_),N})}async _onPlaceSelected(t){try{await t.fetchFields({fields:["displayName","formattedAddress","addressComponents"]}),e(this,z).call(this,t.toJSON())}catch(n){console.error("Error fetching place details:",n),e(this,y).call(this,n)}finally{this._reset(!0)}}_refreshToken(){try{e(this,P).sessionToken=new google.maps.places.AutocompleteSessionToken}catch(t){console.error("Error creating session token:",t),e(this,y).call(this,t)}}clear(){this._reset(!0)}destroy(){e(this,o)&&e(this,o).removeEventListener("input",this._debouncedMakeAcRequest),e(this,L)&&e(this,f)&&e(this,L).removeChild(e(this,f).parentElement);for(const t in this)Object.hasOwn(this,t)&&(this[t]=null);console.log("PacAutocomplete instance destroyed.")}}g=new WeakMap,L=new WeakMap,j=new WeakMap,R=new WeakMap,i=new WeakMap,P=new WeakMap,o=new WeakMap,f=new WeakMap,c=new WeakMap,E=new WeakMap,w=new WeakMap,k=new WeakMap,b=new WeakMap,u=new WeakMap,z=new WeakMap,y=new WeakMap,G=new WeakMap,K=new WeakMap,r.PlacesAutocomplete=l,Object.defineProperty(r,Symbol.toStringTag,{value:"Module"})});
12
12
  //# sourceMappingURL=places-autocomplete.umd.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"places-autocomplete.umd.cjs","sources":["../lib/PlacesAutocomplete.js"],"sourcesContent":["/**\n * Initializes a Places Autocomplete widget.\n * This script dynamically loads the Google Maps JavaScript API, creates the UI elements\n * for the autocomplete input and suggestions list, handles user input with debouncing,\n * fetches suggestions, manages keyboard navigation, and calls user-defined callbacks\n * on place selection or error.\n *\n * @author Alexander Pechkarev <alexpechkarev@gmail.com>\n * @license MIT\n *\n */\n\n/**\n * PacAutocomplete class\n * This class provides a Places Autocomplete widget.\n */\nexport class PlacesAutocomplete {\n // --- Private Properties (using # or _ prefix by convention) ---\n #pacEl;\n #googleMapsApiKey;\n #googleMapsApiVersion;\n #options;\n #request;\n #inputElement;\n #container;\n #ul;\n #kbdEscape;\n #kbdUp;\n #kbdDown;\n #allSuggestions = [];\n #currentSuggestion = -1;\n #onDataCallback; // For user-provided data callback\n #onErrorCallback; // For user-provided error callback\n #defaultClasses = {\n // CSS classes for various parts of the widget.\n section: \"\", // Outer section container.\n container: \"relative z-10 transform rounded-xl mt-4\", // Main container div.\n icon_container:\n \"pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3\", // Container for the search icon.\n icon: '<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"w-5 h-5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"8\" /><path d=\"m21 21-4.3-4.3\" /></svg>', // SVG for the search icon.\n input:\n \"border-1 w-full rounded-md border-0 shadow-sm bg-gray-100 px-4 py-2.5 pl-10 pr-20 text-gray-900 ring-1 ring-inset ring-gray-300 focus:ring-2 sm:text-sm\", // Input field.\n kbd_container: \"absolute inset-y-0 right-0 flex py-1.5 pr-1.5\", // Container for keyboard hints.\n kbd_escape:\n \"inline-flex items-center rounded border border-gray-300 px-1 font-sans text-xs text-gray-500 w-8 mr-1\", // Escape key hint.\n kbd_up:\n \"inline-flex items-center justify-center rounded border border-gray-300 px-1 font-sans text-xs text-gray-500 w-6\", // Up arrow key hint.\n kbd_down:\n \"inline-flex items-center rounded border border-gray-400 px-1 font-sans text-xs text-gray-500 justify-center w-6\", // Down arrow key hint.\n kbd_active: \"bg-indigo-500 text-white\", // Class for active keyboard hint.\n ul: \"absolute z-50 -mb-2 mt-1 max-h-60 w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none sm:text-sm divide-y divide-gray-100\", // Suggestions list (ul).\n li: \"z-50 cursor-default select-none py-2 px-2 lg:px-4 text-gray-900 hover:bg-indigo-500 hover:text-white\", // Suggestion item (li).\n li_current: \"bg-indigo-500\", // Class for the currently selected suggestion item.\n li_a: \"block w-full flex justify-between\", // Link element within a suggestion item.\n li_a_current: \"text-white\", // Class for the link in the currently selected suggestion item.\n li_div_container: \"flex min-w-0 gap-x-4\", // Container div within the suggestion link.\n li_div_one: \"min-w-0 flex-auto\", // First inner div (for place name).\n li_div_one_p: \"text-sm/6\", // Paragraph for the place name.\n li_div_two: \"shrink-0 flex flex-col items-end min-w-16\", // Second inner div (for distance).\n li_div_two_p: \"mt-1 text-xs/5\", // Paragraph for the distance.\n highlight: \"font-bold\", // Class for highlighting matched text in suggestions.\n };\n #defaultRequestParams = {\n // Default parameters for the autocomplete request.\n input: \"\", // Initial input value (empty).\n includedRegionCodes: [\"GB\"], // Default region codes to include in suggestions.\n language: \"en-gb\",\n region: \"GB\",\n };\n\n /**\n * Class constructor for PacAutocomplete.\n * Initializes the autocomplete widget with the provided configuration.\n * @param {Object} config - Configuration object for the autocomplete widget.\n * @param {string} config.containerId - ID of the container element for the widget.\n * @param {string} config.googleMapsApiKey - Google Maps API key.\n * @param {string} [config.googleMapsApiVersion] - Version of the Google Maps API to use (default: \"weekly\").\n * @param {Object} [config.options] - Additional options for the widget (e.g., classes, callbacks).\n * @param {Object} [config.requestParams] - Parameters for the autocomplete request (e.g., input, region).\n * @param {*} config\n */\n constructor(config) {\n // console.log(\"PacAutocomplete constructor called.\", config.requestParams);\n if (!config || !config.containerId || !config.googleMapsApiKey) {\n throw new Error(\n \"PacAutocomplete: Missing required configuration (containerId, googleMapsApiKey).\"\n );\n }\n\n this.#pacEl = document.getElementById(config.containerId);\n if (!this.#pacEl) {\n throw new Error(\n `PacAutocomplete: Container element with ID \"${config.containerId}\" not found.`\n );\n }\n\n this.#googleMapsApiKey = config.googleMapsApiKey;\n this.#googleMapsApiVersion = config.googleMapsApiVersion || \"weekly\";\n\n // Merge user options with defaults\n this.#options = {\n autofocus: false, // Automatically focus the input on load.\n autocomplete: \"off\", // HTML autocomplete attribute for the input.\n placeholder: \"Start typing your address ...\", // Placeholder text for the input.\n distance: true, // Show distance in suggestions (requires origin in request).\n distance_units: \"km\", // Units for distance ('km' or 'miles').\n label: \"\", // Optional label text above the input.\n debounce: 100, // Debounce delay (ms) for API requests.\n ...config.options, // User-defined options override defaults\n };\n // Ensure classes are deeply merged if user provides partial classes\n if (config.options && config.options.classes) {\n this.#options.classes = {\n ...this.#defaultClasses,\n ...config.options.classes,\n };\n } else {\n this.#options.classes = this.#defaultClasses; // Use default classes if none provided\n }\n\n // Set default response and error callbacks if not provided\n this.#onDataCallback =\n config.onResponse ||\n ((place) => {\n console.info(\"---------Default onResponse not provided---------\");\n console.info(\"Selected Place:\", JSON.stringify(place, null, 2));\n });\n this.#onErrorCallback =\n config.onError ||\n ((error) => {\n console.error(\"---------Default onError not provided---------\");\n console.error(\"PAC Error:\", error);\n });\n\n if (config.requestParams && Object.keys(config.requestParams).length > 0) {\n this.#request = {\n ...this.#defaultRequestParams,\n ...config.requestParams,\n };\n } else {\n this.#request = { ...this.#defaultRequestParams }; // Use defaults if no requestParams provided\n }\n\n //console.log(this.#request);\n\n this._init(); // Underscore prefix for internal initialization method\n }\n\n // --- Private Initialization Method ---\n async _init() {\n try {\n // check if google maps api is already loaded\n if (typeof google === \"undefined\" || !google.maps) {\n // Load the Google Maps API dynamically\n await this._loadGoogleMapsApi({\n key: this.#googleMapsApiKey,\n v: this.#googleMapsApiVersion,\n });\n }\n this._createPACStructure(); // Pass this.#options\n await this._initializeAutocomplete(); // Pass this.#options\n //console.log(\"PacAutocomplete Initialized for container:\", this.#pacEl.id);\n } catch (error) {\n this.#onErrorCallback(error);\n }\n }\n\n /**\n * Creates a debounced version of a function.\n * The debounced function delays invoking `func` until after `wait` milliseconds have\n * elapsed since the last time the debounced function was invoked.\n * @param {Function} func - The function to debounce.\n * @param {number} wait - The number of milliseconds to delay.\n * @returns {Function} The new debounced function.\n */\n _debounce(func, wait) {\n let timeout = null;\n return function executedFunction(...args) {\n const later = () => {\n timeout = null;\n func(...args); // Call original function\n };\n if (timeout !== null) {\n clearTimeout(timeout); // Clear the previous timeout\n }\n timeout = setTimeout(later, wait ?? 100); // Set the new timeout\n };\n }\n /**\n * Formats a distance in meters into kilometers or miles.\n * @param {number | null | undefined} distance - Distance in meters.\n * @param {'km' | 'miles'} units - The desired output units.\n * @returns {string | null} Formatted distance string (e.g., \"1.23 km\") or null if input is invalid.\n */\n _formatDistance(distance, units) {\n if (typeof distance !== \"number\" || !this.#options.distance) {\n return null; // Return null if distance isn't shown or invalid\n }\n let value;\n let unitLabel;\n if (units === \"km\") {\n value = (distance / 1000).toFixed(2);\n unitLabel = \"km\";\n } else {\n // Default to miles if not 'km'\n value = (distance / 1609.34).toFixed(2);\n unitLabel = \"miles\";\n }\n // Avoid showing \".00\"\n value = value.replace(/\\.00$/, \"\");\n return `${value} ${unitLabel}`;\n }\n\n /**\n * Dynamically loads the Google Maps JavaScript API using the importLibrary method.\n * This is the standard approach recommended by Google.\n * @see https://developers.google.com/maps/documentation/javascript/load-maps-js-api\n * @param {object} g - Configuration object for the API loader (key, v, libraries, etc.).\n */\n async _loadGoogleMapsApi(g) {\n var h, // Promise tracking API load\n a, // Script element\n k, // Loop variable for config keys\n p = \"The Google Maps JavaScript API\", // Error message prefix\n c = \"google\", // Global namespace\n l = \"importLibrary\", // Loader function name\n q = \"__ib__\", // Internal callback name\n m = document, // Document reference\n b = window; // Window reference\n b = b[c] || (b[c] = {}); // Ensure google namespace exists\n var d = b.maps || (b.maps = {}), // Ensure google.maps namespace exists\n r = new Set(), // Set to track requested libraries\n e = new URLSearchParams(), // URL parameters for the API script\n u = () =>\n // Function to initiate API loading (if not already started)\n h ||\n // eslint-disable-next-line no-async-promise-executor\n (h = new Promise(async (f, n) => {\n // Create script element (done async to potentially wait for nonce)\n // await (a = m.createElement('script')); // Original Google code had await here, might not be needed\n a = m.createElement(\"script\"); // Create script tag\n e.set(\"libraries\", [...r].join(\",\")); // Add accumulated libraries\n // Add other parameters from the config object 'g'\n for (k in g)\n e.set(\n k.replace(/[A-Z]/g, (t) => \"_\" + t[0].toLowerCase()), // Convert camelCase to snake_case\n g[k]\n );\n e.set(\"callback\", c + \".maps.\" + q); // Set the internal callback function name\n a.src = `https://maps.${c}apis.com/maps/api/js?` + e; // Construct the API URL\n d[q] = f; // Assign the promise resolver to the callback name on google.maps\n // Error handling for script loading failure\n a.onerror = () => (h = n(Error(p + \" could not load.\"))); // Use onerror for load failures\n // Nonce for Content Security Policy\n a.nonce = m.querySelector(\"script[nonce]\")?.nonce || \"\";\n m.head.append(a); // Append the script to the document head\n }));\n // Define or reuse the importLibrary function on google.maps\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n d[l]\n ? console.warn(p + \" only loads once. Ignoring:\", g) // Warn if called again\n : (d[l] = (f, ...n) => r.add(f) && u().then(() => d[l](f, ...n))); // The actual importLibrary implementation\n }\n\n // --- UI Creation ---\n _createPACStructure() {\n const section = document.createElement(\"section\");\n this.#options.classes.section\n .split(\" \")\n .forEach((cl) => cl && section.classList.add(cl));\n\n // Main container\n this.#container = document.createElement(\"div\");\n this.#container.className = this.#options.classes.container;\n this.#container.setAttribute(\"id\", this.#pacEl);\n section.appendChild(this.#container);\n\n // Icon\n const iconContainer = document.createElement(\"div\");\n iconContainer.className = this.#options.classes.icon_container;\n this.#container.appendChild(iconContainer);\n const icon = document.createElement(\"div\");\n icon.innerHTML = this.#options.classes.icon;\n iconContainer.appendChild(icon.firstElementChild); // Append the actual SVG element\n\n // Input field\n this.#inputElement = document.createElement(\"input\");\n this.#inputElement.id = \"input\" + this.#pacEl; // Assign ID for label association\n this.#inputElement.type = \"text\";\n this.#inputElement.name = \"search\"; // Consider making name configurable\n this.#inputElement.placeholder = this.#options.placeholder;\n this.#inputElement.autocomplete = this.#options.autocomplete;\n this.#inputElement.className = this.#options.classes.input;\n this.#inputElement.setAttribute(\"role\", \"combobox\");\n this.#inputElement.setAttribute(\"aria-autocomplete\", \"list\");\n this.#inputElement.setAttribute(\"aria-expanded\", \"false\"); // Will be updated dynamically\n this.#inputElement.setAttribute(\"aria-controls\", \"pacSuggestions\"); // Links to the suggestions list\n\n if (this.#options.autofocus) {\n this.#inputElement.autofocus = true;\n }\n if (this.#options.label) {\n const label = document.createElement(\"label\");\n label.htmlFor = \"labelInput\" + this.#pacEl; // Assuming inputElement gets this ID\n label.textContent = this.#options.label;\n // Add label classes if needed from opts.classes\n this.#container.appendChild(label); // Append label before input or adjust structure\n }\n this.#container.appendChild(this.#inputElement);\n\n // Keyboard hints container\n const kbdContainer = document.createElement(\"div\");\n kbdContainer.className = this.#options.classes.kbd_container;\n this.#kbdEscape = document.createElement(\"kbd\");\n this.#kbdEscape.className = this.#options.classes.kbd_escape;\n this.#kbdEscape.textContent = \"Esc\";\n kbdContainer.appendChild(this.#kbdEscape);\n this.#kbdUp = document.createElement(\"kbd\");\n this.#kbdUp.className = this.#options.classes.kbd_up;\n this.#kbdUp.innerHTML = \"&#8593;\"; // Up arrow HTML entity\n kbdContainer.appendChild(this.#kbdUp);\n this.#kbdDown = document.createElement(\"kbd\");\n this.#kbdDown.className = this.#options.classes.kbd_down;\n this.#kbdDown.innerHTML = \"&#8595;\"; // Down arrow HTML entity\n kbdContainer.appendChild(this.#kbdDown);\n this.#container.appendChild(kbdContainer);\n\n // Suggestions list (initially hidden)\n this.#ul = document.createElement(\"ul\");\n this.#ul.id = \"pacSuggestions\"; // Must match aria-controls\n this.#ul.className = this.#options.classes.ul;\n this.#ul.style.display = \"none\";\n this.#ul.setAttribute(\"role\", \"listbox\");\n this.#container.appendChild(this.#ul);\n\n this.#pacEl.appendChild(section);\n section.addEventListener(\"keydown\", this._onKeyDown.bind(this)); // Bind 'this'\n }\n\n /**\n * Initializes the core autocomplete functionality after the API is loaded.\n * Imports necessary libraries and sets up the input event listener.\n */\n async _initializeAutocomplete() {\n try {\n // Ensure the 'places' library is available via the dynamic loader\n // eslint-disable-next-line no-undef\n await google.maps.importLibrary(\"places\");\n // console.log('Places library imported successfully.'); // For debugging\n\n // Initial token generation\n this._refreshToken();\n\n // Attach the debounced request function to the input element's 'input' event\n if (this.#inputElement) {\n this.#inputElement.addEventListener(\n \"input\",\n this._debouncedMakeAcRequest.bind(this)\n );\n // Add focus/blur listeners if needed to manage suggestion visibility\n this.#inputElement.addEventListener(\"blur\", () => {\n // Delay hiding suggestions to allow click events on them\n setTimeout(() => {\n if (this.#ul && !this.#ul.contains(document.activeElement)) {\n // Check if focus moved outside suggestions\n this.#ul.style.display = \"none\";\n this.#inputElement.setAttribute(\"aria-expanded\", \"false\");\n }\n }, 200); // Adjust delay as needed\n });\n this.#inputElement.addEventListener(\"focus\", () => {\n // Potentially show suggestions again if input has value\n if (this.#inputElement.value && this.#allSuggestions.length > 0) {\n this.#ul.style.display = \"block\";\n this.#inputElement.setAttribute(\"aria-expanded\", \"true\");\n }\n });\n } else {\n this.#onErrorCallback(\n new Error(\"Input element not found during initialization.\")\n );\n }\n } catch (error) {\n console.error(\"Error initializing Google Places Autocomplete:\", error);\n // eslint-disable-next-line no-undef\n this.#onErrorCallback(\n new Error(\"Google Maps Places library not available.\")\n );\n }\n }\n\n /**\n * Resets the autocomplete input field, clears suggestions, and optionally refreshes the session token.\n * @param {boolean} [refresh=false] - Whether to refresh the Google Places session token.\n */\n _reset(refresh = false) {\n this.#currentSuggestion = -1;\n if (this.#inputElement) {\n this.#inputElement.value = \"\";\n }\n this.#allSuggestions = [];\n this.#currentSuggestion = -1;\n if (this.#ul) {\n this.#ul.innerHTML = \"\"; // Clear existing suggestions\n this.#ul.style.display = \"none\";\n }\n if (refresh) {\n this._refreshToken();\n }\n }\n /**\n * Removes the 'current' highlighting classes from all suggestion list items (li) and their links (a).\n */\n _resetLiClasses() {\n if (!this.#ul) return;\n Array.from(this.#ul.children).forEach((li) => {\n this.#options.classes.li_current\n .split(\" \")\n .forEach((cl) => li.classList.remove(cl));\n const link = li.querySelector(\"a\");\n if (link) {\n this.#options.classes.li_a_current\n .split(\" \")\n .forEach((cl) => link.classList.remove(cl));\n }\n });\n }\n\n /**\n * Handles keyboard events (ArrowDown, ArrowUp, Enter, Escape) for navigating\n * and selecting suggestions or closing the list.\n * @param {KeyboardEvent} e - The keyboard event object.\n */\n _onKeyDown(e) {\n if (\n !this.#allSuggestions.length ||\n !this.#ul ||\n this.#ul.style.display === \"none\"\n )\n return;\n\n this._resetLiClasses(); // Reset classes on any key press within the suggestions\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault(); // Prevent cursor movement in input\n this.#currentSuggestion = Math.min(\n this.#currentSuggestion + 1,\n this.#allSuggestions.length - 1\n );\n if (this.#currentSuggestion < 0) this.#currentSuggestion = 0; // Handle case where it was -1\n\n const currentLi = this.#ul.children.item(this.#currentSuggestion);\n if (currentLi) {\n const currentA = currentLi.querySelector(\"a\");\n this.#options.classes.li_current\n .split(\" \")\n .forEach((cl) => currentLi.classList.add(cl));\n if (currentA) {\n this.#options.classes.li_a_current\n .split(\" \")\n .forEach((cl) => currentA.classList.add(cl));\n }\n currentLi.scrollIntoView({ block: \"nearest\" }); // Ensure visible\n }\n\n // Visual feedback for key press\n this.#options.classes.kbd_active\n .split(\" \")\n .forEach((cl) => this.#kbdDown?.classList.add(cl));\n setTimeout(\n () =>\n this.#options.classes.kbd_active\n .split(\" \")\n .forEach((cl) => this.#kbdDown?.classList.remove(cl)),\n 300\n );\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault(); // Prevent cursor movement in input\n this.#currentSuggestion = Math.max(this.#currentSuggestion - 1, 0); // Stay at 0 if already there\n\n const currentLi = this.#ul.children.item(this.#currentSuggestion);\n if (currentLi) {\n const currentA = currentLi.querySelector(\"a\");\n this.#options.classes.li_current\n .split(\" \")\n .forEach((cl) => currentLi.classList.add(cl));\n if (currentA) {\n this.#options.classes.li_a_current\n .split(\" \")\n .forEach((cl) => currentA.classList.add(cl));\n }\n currentLi.scrollIntoView({ block: \"nearest\" }); // Ensure visible\n }\n\n // Visual feedback for key press\n this.#options.classes.kbd_active\n .split(\" \")\n .forEach((cl) => this.#kbdUp?.classList.add(cl));\n setTimeout(\n () =>\n this.#options.classes.kbd_active\n .split(\" \")\n .forEach((cl) => this.#kbdUp?.classList.remove(cl)),\n 300\n );\n } else if (e.key === \"Enter\") {\n e.preventDefault(); // Prevent form submission if applicable\n if (\n this.#currentSuggestion >= 0 &&\n this.#currentSuggestion < this.#allSuggestions.length\n ) {\n this._onPlaceSelected(\n this.#allSuggestions[this.#currentSuggestion].place\n );\n // Reset is handled within onPlaceSelected via reset(true)\n }\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n // Visual feedback for key press\n this.#options.classes.kbd_active\n .split(\" \")\n .forEach((cl) => this.#kbdEscape?.classList.add(cl));\n setTimeout(\n () =>\n this.#options.classes.kbd_active\n .split(\" \")\n .forEach((cl) => this.#kbdEscape?.classList.remove(cl)),\n 300\n );\n this._reset(true); // Reset search input and results, refresh token\n }\n }\n\n /**\n * Debounced function to fetch autocomplete suggestions from the Google Places API.\n * Triggered by the 'input' event on the input element.\n */\n _debouncedMakeAcRequest = this._debounce(async () => {\n if (!this.#inputElement || !this.#inputElement.value) {\n this._reset();\n if (this.#inputElement)\n this.#inputElement.setAttribute(\"aria-expanded\", \"false\");\n return;\n }\n\n this.#request.input = this.#inputElement.value;\n //console.log(\"Request:\", this.#request); // Debugging\n try {\n const { suggestions } =\n // eslint-disable-next-line no-undef\n await google.maps.places.AutocompleteSuggestion.fetchAutocompleteSuggestions(\n this.#request\n );\n\n // Display suggestions\n if (suggestions && suggestions.length > 0) {\n this.#ul.replaceChildren(\n ...this._createSuggestionElements(suggestions)\n );\n this.#ul.style.display = \"block\";\n this.#inputElement.setAttribute(\"aria-expanded\", \"true\");\n } else {\n // No suggestions found\n this._reset(); // Clear any old suggestions\n this.#inputElement.setAttribute(\"aria-expanded\", \"false\");\n // Optionally display a \"no results\" message in the 'ul'\n }\n } catch (error) {\n this.#onErrorCallback(error);\n this._reset();\n if (this.#inputElement)\n this.#inputElement.setAttribute(\"aria-expanded\", \"false\");\n }\n }, this.#options?.debounce ?? 100);\n\n /**\n * Creates an array of list item (LI) elements for the suggestions dropdown.\n * Each LI contains a link (A) with the place prediction details and distance.\n * Handles highlighting the matched parts of the suggestion text.\n * @param {Array<google.maps.places.AutocompleteSuggestion>} suggestions - Array of suggestion objects from the API.\n * @returns {Array<HTMLLIElement>} An array of LI elements to be added to the suggestions UL.\n */\n _createSuggestionElements(suggestions) {\n this.#allSuggestions = []; // Reset before populating\n return suggestions.map((suggestion, index) => {\n this.#allSuggestions.push({\n id: index + 1,\n description: suggestion.placePrediction.toString(),\n place: suggestion.placePrediction.toPlace(),\n });\n\n // create div elements\n const divContainer = document.createElement(\"div\");\n divContainer.className = this.#options.classes.li_div_container; // flex min-w-0 gap-x-4\n // create inner div element - place name\n const divInner = document.createElement(\"div\");\n divInner.className = this.#options.classes.li_div_one; // min-w-0 flex-auto\n divContainer.appendChild(divInner);\n // create p element - place name\n const p = document.createElement(\"p\");\n p.className = this.#options.classes.li_div_one_p; // text-sm/6\n\n // get prediction text\n const predictionText = suggestion.placePrediction.text;\n const originalText = predictionText.text;\n // Array of objects with startOffset, endOffset\n const matches = predictionText.matches;\n\n //Highlighting Logic\n let lastIndex = 0;\n\n // Sort matches just in case they aren't ordered (though they usually are)\n matches.sort((a, b) => a.startOffset - b.startOffset);\n\n // 1. Create the outer span\n const outerSpan = document.createElement(\"span\");\n\n // 2. Create the inner span for the bold part\n const innerSpan = document.createElement(\"span\");\n innerSpan.classList = this.#options.classes.highlight ?? \"font-bold\"; // Use the highlight class from options\n\n for (const match of matches) {\n // Append text before the current match\n outerSpan.textContent += originalText.substring(\n lastIndex,\n match.startOffset\n );\n\n // Append the highlighted match segment\n if (match.startOffset > 0) {\n // check previous charter is space\n const prevChar = originalText.charAt(match.startOffset - 1);\n if (prevChar == \" \") {\n innerSpan.textContent += \" \";\n }\n }\n innerSpan.textContent += originalText.substring(\n match.startOffset,\n match.endOffset\n );\n\n // Update the last index processed\n lastIndex = match.endOffset;\n }\n\n // 3. Create a text node for the remaining text\n const remainingText = document.createTextNode(\n originalText.substring(lastIndex)\n );\n\n // 4. Append the inner span and the text node to the outer span\n outerSpan.appendChild(innerSpan);\n outerSpan.appendChild(remainingText);\n\n // 5. Append the outer span to the paragraph element\n p.appendChild(outerSpan);\n\n divInner.appendChild(p);\n divContainer.appendChild(divInner);\n\n // create inner div element - distance\n const divInner2 = document.createElement(\"div\");\n divInner2.className = this.#options.classes.li_div_two; //'shrink-0 flex flex-col items-end min-w-16';\n divContainer.appendChild(divInner2);\n // create p element - distance\n const p2 = document.createElement(\"p\");\n p2.className = this.#options.classes.li_div_two_p; //'mt-1 text-xs/5 ';\n p2.textContent = this._formatDistance(\n suggestion.placePrediction.distanceMeters,\n this.#options.distance_units ?? \"km\"\n );\n divInner2.appendChild(p2);\n\n // // create a link element\n const a = document.createElement(\"a\");\n a.href = \"javascript:void(0)\";\n a.tabIndex = index + 1;\n a.className = this.#options.classes.li_a; // block w-full flex justify-between\n\n a.addEventListener(\"click\", () => {\n this._onPlaceSelected(suggestion.placePrediction.toPlace());\n });\n\n // ...\n // a.addEventListener(\"click\", () => {\n // this._fetchPlaceDetails(prediction.place_id);\n // });\n a.appendChild(divContainer);\n a.appendChild(divInner2);\n\n const li = document.createElement(\"li\");\n li.id = `option-${index + 1}`;\n li.className = this.#options.classes.li;\n\n li.appendChild(a);\n return li;\n });\n }\n\n /**\n * Handles the selection of a place. Fetches required fields\n * (displayName, formattedAddress, addressComponents) and calls the\n * user-defined `onPacData` callback.\n * @param {google.maps.places.Place} place - The selected Place object.\n */\n async _onPlaceSelected(place) {\n try {\n // Fetch necessary details for the selected place\n await place.fetchFields({\n fields: [\"displayName\", \"formattedAddress\", \"addressComponents\"], // Add more fields as needed\n });\n // Call the user-provided callback with the place data\n // eslint-disable-next-line no-undef\n this.#onDataCallback(place.toJSON()); // Convert to plain JSON object for the callback\n } catch (error) {\n console.error(\"Error fetching place details:\", error);\n // eslint-disable-next-line no-undef\n this.#onErrorCallback(error);\n } finally {\n // Reset the input and suggestions regardless of success/error\n this._reset(true); // Refresh token after selection\n }\n }\n\n /**\n * Creates a new Google Places Autocomplete Session Token.\n * This should be called before starting a new series of autocomplete requests.\n */\n _refreshToken() {\n try {\n // eslint-disable-next-line no-undef\n this.#request.sessionToken =\n new google.maps.places.AutocompleteSessionToken();\n } catch (error) {\n console.error(\"Error creating session token:\", error);\n // eslint-disable-next-line no-undef\n this.#onErrorCallback(error);\n }\n }\n\n clear() {\n this._reset(true);\n }\n\n destroy() {\n // Remove event listeners, remove elements from DOM\n if (this.#inputElement) {\n this.#inputElement.removeEventListener(\n \"input\",\n this._debouncedMakeAcRequest\n );\n // remove other listeners\n }\n if (this.#pacEl && this.#container) {\n this.#pacEl.removeChild(this.#container.parentElement); // remove the whole section\n }\n // Nullify properties\n for (const prop in this) {\n if (Object.hasOwn(this, prop)) {\n this[prop] = null;\n }\n }\n console.log(\"PacAutocomplete instance destroyed.\");\n }\n}\n"],"names":["PlacesAutocomplete","config","__privateAdd","_pacEl","_googleMapsApiKey","_googleMapsApiVersion","_options","_request","_inputElement","_container","_ul","_kbdEscape","_kbdUp","_kbdDown","_allSuggestions","_currentSuggestion","_onDataCallback","_onErrorCallback","_defaultClasses","_defaultRequestParams","__publicField","__privateGet","suggestions","error","_a","__privateSet","place","func","wait","timeout","args","later","distance","units","value","unitLabel","g","h","a","k","p","c","l","q","m","b","d","r","e","u","f","n","t","section","cl","iconContainer","icon","label","kbdContainer","refresh","li","link","currentLi","currentA","suggestion","index","divContainer","divInner","predictionText","originalText","matches","lastIndex","outerSpan","innerSpan","match","remainingText","divInner2","p2","prop"],"mappings":"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"}
1
+ {"version":3,"file":"places-autocomplete.umd.cjs","sources":["../lib/PlacesAutocomplete.js"],"sourcesContent":["/**\n * Initializes a Places Autocomplete widget.\n * This script dynamically loads the Google Maps JavaScript API, creates the UI elements\n * for the autocomplete input and suggestions list, handles user input with debouncing,\n * fetches suggestions, manages keyboard navigation, and calls user-defined callbacks\n * on place selection or error.\n *\n * @author Alexander Pechkarev <alexpechkarev@gmail.com>\n * @license MIT\n *\n */\n\n/**\n * PacAutocomplete class\n * This class provides a Places Autocomplete widget.\n */\nexport class PlacesAutocomplete {\n // --- Private Properties (using # or _ prefix by convention) ---\n #containerId; // Container ID where the autocomplete widget will be rendered.\n #pacEl;\n #googleMapsApiKey;\n #googleMapsApiVersion;\n #options;\n #request;\n #inputElement;\n #container;\n #ul;\n #kbdEscape;\n #kbdUp;\n #kbdDown;\n #allSuggestions = [];\n #currentSuggestion = -1;\n #onDataCallback; // For user-provided data callback\n #onErrorCallback; // For user-provided error callback\n #defaultClasses = {\n // CSS classes for various parts of the widget.\n section: \"\", // Outer section container.\n container: \"relative z-10 transform rounded-xl mt-4\", // Main container div.\n icon_container:\n \"pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3\", // Container for the search icon.\n icon: '<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"w-5 h-5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"8\" /><path d=\"m21 21-4.3-4.3\" /></svg>', // SVG for the search icon.\n input:\n \"border-1 w-full rounded-md border-0 shadow-sm bg-gray-100 px-4 py-2.5 pl-10 pr-20 text-gray-900 ring-1 ring-inset ring-gray-300 focus:ring-2 sm:text-sm\", // Input field.\n kbd_container: \"absolute inset-y-0 right-0 flex py-1.5 pr-1.5\", // Container for keyboard hints.\n kbd_escape:\n \"inline-flex items-center rounded border border-gray-300 px-1 font-sans text-xs text-gray-500 w-8 mr-1\", // Escape key hint.\n kbd_up:\n \"inline-flex items-center justify-center rounded border border-gray-300 px-1 font-sans text-xs text-gray-500 w-6\", // Up arrow key hint.\n kbd_down:\n \"inline-flex items-center rounded border border-gray-400 px-1 font-sans text-xs text-gray-500 justify-center w-6\", // Down arrow key hint.\n kbd_active: \"bg-indigo-500 text-white\", // Class for active keyboard hint.\n ul: \"absolute z-50 -mb-2 mt-1 max-h-60 w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none sm:text-sm divide-y divide-gray-100\", // Suggestions list (ul).\n li: \"z-50 cursor-default select-none py-2 px-2 lg:px-4 text-gray-900 hover:bg-indigo-500 hover:text-white\", // Suggestion item (li).\n li_current: \"bg-indigo-500\", // Class for the currently selected suggestion item.\n li_a: \"block w-full flex justify-between\", // Link element within a suggestion item.\n li_a_current: \"text-white\", // Class for the link in the currently selected suggestion item.\n li_div_container: \"flex min-w-0 gap-x-4\", // Container div within the suggestion link.\n li_div_one: \"min-w-0 flex-auto\", // First inner div (for place name).\n li_div_one_p: \"text-sm/6\", // Paragraph for the place name.\n li_div_two: \"shrink-0 flex flex-col items-end min-w-16\", // Second inner div (for distance).\n li_div_two_p: \"mt-1 text-xs/5\", // Paragraph for the distance.\n highlight: \"font-bold\", // Class for highlighting matched text in suggestions.\n };\n #defaultRequestParams = {\n // Default parameters for the autocomplete request.\n input: \"\", // Initial input value (empty).\n includedRegionCodes: [\"GB\"], // Default region codes to include in suggestions.\n language: \"en-gb\",\n region: \"GB\",\n };\n\n /**\n * Class constructor for PacAutocomplete.\n * Initializes the autocomplete widget with the provided configuration.\n * @param {Object} config - Configuration object for the autocomplete widget.\n * @param {string} config.containerId - ID of the container element for the widget.\n * @param {string} config.googleMapsApiKey - Google Maps API key.\n * @param {string} [config.googleMapsApiVersion] - Version of the Google Maps API to use (default: \"weekly\").\n * @param {Object} [config.options] - Additional options for the widget (e.g., classes, callbacks).\n * @param {Object} [config.requestParams] - Parameters for the autocomplete request (e.g., input, region).\n * @param {*} config\n */\n constructor(config) {\n // console.log(\"PacAutocomplete constructor called.\", config.requestParams);\n if (!config || !config.containerId || !config.googleMapsApiKey) {\n throw new Error(\n \"PacAutocomplete: Missing required configuration (containerId, googleMapsApiKey).\"\n );\n }\n\n this.#containerId = config.containerId; // Store the configuration object\n this.#pacEl = document.getElementById(config.containerId);\n if (!this.#pacEl) {\n throw new Error(\n `PacAutocomplete: Container element with ID \"${config.containerId}\" not found.`\n );\n }\n\n this.#googleMapsApiKey = config.googleMapsApiKey;\n this.#googleMapsApiVersion = config.googleMapsApiVersion || \"weekly\";\n\n // Merge user options with defaults\n this.#options = {\n autofocus: false, // Automatically focus the input on load.\n autocomplete: \"off\", // HTML autocomplete attribute for the input.\n placeholder: \"Start typing your address ...\", // Placeholder text for the input.\n distance: true, // Show distance in suggestions (requires origin in request).\n distance_units: \"km\", // Units for distance ('km' or 'miles').\n label: \"\", // Optional label text above the input.\n debounce: 100, // Debounce delay (ms) for API requests.\n ...config.options, // User-defined options override defaults\n };\n // Ensure classes are deeply merged if user provides partial classes\n if (config.options && config.options.classes) {\n this.#options.classes = {\n ...this.#defaultClasses,\n ...config.options.classes,\n };\n } else {\n this.#options.classes = this.#defaultClasses; // Use default classes if none provided\n }\n\n // Set default response and error callbacks if not provided\n this.#onDataCallback =\n config.onResponse ||\n ((place) => {\n console.info(\"---------Default onResponse not provided---------\");\n console.info(\"Selected Place:\", JSON.stringify(place, null, 2));\n });\n this.#onErrorCallback =\n config.onError ||\n ((error) => {\n console.error(\"---------Default onError not provided---------\");\n console.error(\"PAC Error:\", error);\n });\n\n if (config.requestParams && Object.keys(config.requestParams).length > 0) {\n this.#request = {\n ...this.#defaultRequestParams,\n ...config.requestParams,\n };\n } else {\n this.#request = { ...this.#defaultRequestParams }; // Use defaults if no requestParams provided\n }\n\n //console.log(this.#request);\n\n this._init(); // Underscore prefix for internal initialization method\n }\n\n // --- Private Initialization Method ---\n async _init() {\n try {\n // check if google maps api is already loaded\n if (typeof google === \"undefined\" || !google.maps) {\n // Load the Google Maps API dynamically\n await this._loadGoogleMapsApi({\n key: this.#googleMapsApiKey,\n v: this.#googleMapsApiVersion,\n });\n }\n this._createPACStructure(); // Pass this.#options\n await this._initializeAutocomplete(); // Pass this.#options\n //console.log(\"PacAutocomplete Initialized for container:\", this.#pacEl.id);\n } catch (error) {\n this.#onErrorCallback(error);\n }\n }\n\n /**\n * Creates a debounced version of a function.\n * The debounced function delays invoking `func` until after `wait` milliseconds have\n * elapsed since the last time the debounced function was invoked.\n * @param {Function} func - The function to debounce.\n * @param {number} wait - The number of milliseconds to delay.\n * @returns {Function} The new debounced function.\n */\n _debounce(func, wait) {\n let timeout = null;\n return function executedFunction(...args) {\n const later = () => {\n timeout = null;\n func(...args); // Call original function\n };\n if (timeout !== null) {\n clearTimeout(timeout); // Clear the previous timeout\n }\n timeout = setTimeout(later, wait ?? 100); // Set the new timeout\n };\n }\n /**\n * Formats a distance in meters into kilometers or miles.\n * @param {number | null | undefined} distance - Distance in meters.\n * @param {'km' | 'miles'} units - The desired output units.\n * @returns {string | null} Formatted distance string (e.g., \"1.23 km\") or null if input is invalid.\n */\n _formatDistance(distance, units) {\n if (typeof distance !== \"number\" || !this.#options.distance) {\n return null; // Return null if distance isn't shown or invalid\n }\n let value;\n let unitLabel;\n if (units === \"km\") {\n value = (distance / 1000).toFixed(2);\n unitLabel = \"km\";\n } else {\n // Default to miles if not 'km'\n value = (distance / 1609.34).toFixed(2);\n unitLabel = \"miles\";\n }\n // Avoid showing \".00\"\n value = value.replace(/\\.00$/, \"\");\n return `${value} ${unitLabel}`;\n }\n\n /**\n * Dynamically loads the Google Maps JavaScript API using the importLibrary method.\n * This is the standard approach recommended by Google.\n * @see https://developers.google.com/maps/documentation/javascript/load-maps-js-api\n * @param {object} g - Configuration object for the API loader (key, v, libraries, etc.).\n */\n async _loadGoogleMapsApi(g) {\n var h, // Promise tracking API load\n a, // Script element\n k, // Loop variable for config keys\n p = \"The Google Maps JavaScript API\", // Error message prefix\n c = \"google\", // Global namespace\n l = \"importLibrary\", // Loader function name\n q = \"__ib__\", // Internal callback name\n m = document, // Document reference\n b = window; // Window reference\n b = b[c] || (b[c] = {}); // Ensure google namespace exists\n var d = b.maps || (b.maps = {}), // Ensure google.maps namespace exists\n r = new Set(), // Set to track requested libraries\n e = new URLSearchParams(), // URL parameters for the API script\n u = () =>\n // Function to initiate API loading (if not already started)\n h ||\n // eslint-disable-next-line no-async-promise-executor\n (h = new Promise(async (f, n) => {\n // Create script element (done async to potentially wait for nonce)\n // await (a = m.createElement('script')); // Original Google code had await here, might not be needed\n a = m.createElement(\"script\"); // Create script tag\n e.set(\"libraries\", [...r].join(\",\")); // Add accumulated libraries\n // Add other parameters from the config object 'g'\n for (k in g)\n e.set(\n k.replace(/[A-Z]/g, (t) => \"_\" + t[0].toLowerCase()), // Convert camelCase to snake_case\n g[k]\n );\n e.set(\"callback\", c + \".maps.\" + q); // Set the internal callback function name\n a.src = `https://maps.${c}apis.com/maps/api/js?` + e; // Construct the API URL\n d[q] = f; // Assign the promise resolver to the callback name on google.maps\n // Error handling for script loading failure\n a.onerror = () => (h = n(Error(p + \" could not load.\"))); // Use onerror for load failures\n // Nonce for Content Security Policy\n a.nonce = m.querySelector(\"script[nonce]\")?.nonce || \"\";\n m.head.append(a); // Append the script to the document head\n }));\n // Define or reuse the importLibrary function on google.maps\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n d[l]\n ? console.warn(p + \" only loads once. Ignoring:\", g) // Warn if called again\n : (d[l] = (f, ...n) => r.add(f) && u().then(() => d[l](f, ...n))); // The actual importLibrary implementation\n }\n\n // --- UI Creation ---\n _createPACStructure() {\n const section = document.createElement(\"section\");\n this.#options.classes.section\n .split(\" \")\n .forEach((cl) => cl && section.classList.add(cl));\n\n // Main container\n this.#container = document.createElement(\"div\");\n this.#container.className = this.#options.classes.container;\n this.#container.setAttribute(\"id\", this.#containerId + \"-div\");\n section.appendChild(this.#container);\n\n // Icon\n const iconContainer = document.createElement(\"div\");\n iconContainer.className = this.#options.classes.icon_container;\n this.#container.appendChild(iconContainer);\n const icon = document.createElement(\"div\");\n icon.innerHTML = this.#options.classes.icon;\n iconContainer.appendChild(icon.firstElementChild); // Append the actual SVG element\n\n // Input field\n this.#inputElement = document.createElement(\"input\");\n this.#inputElement.id = this.#containerId + \"-input\"; // Assign ID for label association\n this.#inputElement.type = \"text\";\n this.#inputElement.name = \"search\"; // Consider making name configurable\n this.#inputElement.placeholder = this.#options.placeholder;\n this.#inputElement.autocomplete = this.#options.autocomplete;\n this.#inputElement.className = this.#options.classes.input;\n this.#inputElement.setAttribute(\"role\", \"combobox\");\n this.#inputElement.setAttribute(\"aria-autocomplete\", \"list\");\n this.#inputElement.setAttribute(\"aria-expanded\", \"false\"); // Will be updated dynamically\n this.#inputElement.setAttribute(\"aria-controls\", \"pacSuggestions\"); // Links to the suggestions list\n\n if (this.#options.autofocus) {\n this.#inputElement.autofocus = true;\n }\n if (this.#options.label) {\n const label = document.createElement(\"label\");\n label.htmlFor = this.#containerId + \"-labelInput\"; // Assuming inputElement gets this ID\n label.textContent = this.#options.label;\n // Add label classes if needed from opts.classes\n this.#container.appendChild(label); // Append label before input or adjust structure\n }\n this.#container.appendChild(this.#inputElement);\n\n // Keyboard hints container\n const kbdContainer = document.createElement(\"div\");\n kbdContainer.className = this.#options.classes.kbd_container;\n this.#kbdEscape = document.createElement(\"kbd\");\n this.#kbdEscape.className = this.#options.classes.kbd_escape;\n this.#kbdEscape.textContent = \"Esc\";\n kbdContainer.appendChild(this.#kbdEscape);\n this.#kbdUp = document.createElement(\"kbd\");\n this.#kbdUp.className = this.#options.classes.kbd_up;\n this.#kbdUp.innerHTML = \"&#8593;\"; // Up arrow HTML entity\n kbdContainer.appendChild(this.#kbdUp);\n this.#kbdDown = document.createElement(\"kbd\");\n this.#kbdDown.className = this.#options.classes.kbd_down;\n this.#kbdDown.innerHTML = \"&#8595;\"; // Down arrow HTML entity\n kbdContainer.appendChild(this.#kbdDown);\n this.#container.appendChild(kbdContainer);\n\n // Suggestions list (initially hidden)\n this.#ul = document.createElement(\"ul\");\n this.#ul.id = \"pacSuggestions\"; // Must match aria-controls\n this.#ul.className = this.#options.classes.ul;\n this.#ul.style.display = \"none\";\n this.#ul.setAttribute(\"role\", \"listbox\");\n this.#container.appendChild(this.#ul);\n\n this.#pacEl.appendChild(section);\n section.addEventListener(\"keydown\", this._onKeyDown.bind(this)); // Bind 'this'\n }\n\n /**\n * Initializes the core autocomplete functionality after the API is loaded.\n * Imports necessary libraries and sets up the input event listener.\n */\n async _initializeAutocomplete() {\n try {\n // Ensure the 'places' library is available via the dynamic loader\n // eslint-disable-next-line no-undef\n await google.maps.importLibrary(\"places\");\n // console.log('Places library imported successfully.'); // For debugging\n\n // Initial token generation\n this._refreshToken();\n\n // Attach the debounced request function to the input element's 'input' event\n if (this.#inputElement) {\n this.#inputElement.addEventListener(\n \"input\",\n this._debouncedMakeAcRequest.bind(this)\n );\n // Add focus/blur listeners if needed to manage suggestion visibility\n this.#inputElement.addEventListener(\"blur\", () => {\n // Delay hiding suggestions to allow click events on them\n setTimeout(() => {\n if (this.#ul && !this.#ul.contains(document.activeElement)) {\n // Check if focus moved outside suggestions\n this.#ul.style.display = \"none\";\n this.#inputElement.setAttribute(\"aria-expanded\", \"false\");\n }\n }, 200); // Adjust delay as needed\n });\n this.#inputElement.addEventListener(\"focus\", () => {\n // Potentially show suggestions again if input has value\n if (this.#inputElement.value && this.#allSuggestions.length > 0) {\n this.#ul.style.display = \"block\";\n this.#inputElement.setAttribute(\"aria-expanded\", \"true\");\n }\n });\n } else {\n this.#onErrorCallback(\n new Error(\"Input element not found during initialization.\")\n );\n }\n } catch (error) {\n console.error(\"Error initializing Google Places Autocomplete:\", error);\n // eslint-disable-next-line no-undef\n this.#onErrorCallback(\n new Error(\"Google Maps Places library not available.\")\n );\n }\n }\n\n /**\n * Resets the autocomplete input field, clears suggestions, and optionally refreshes the session token.\n * @param {boolean} [refresh=false] - Whether to refresh the Google Places session token.\n */\n _reset(refresh = false) {\n this.#currentSuggestion = -1;\n if (this.#inputElement) {\n this.#inputElement.value = \"\";\n }\n this.#allSuggestions = [];\n this.#currentSuggestion = -1;\n if (this.#ul) {\n this.#ul.innerHTML = \"\"; // Clear existing suggestions\n this.#ul.style.display = \"none\";\n }\n if (refresh) {\n this._refreshToken();\n }\n }\n /**\n * Removes the 'current' highlighting classes from all suggestion list items (li) and their links (a).\n */\n _resetLiClasses() {\n if (!this.#ul) return;\n Array.from(this.#ul.children).forEach((li) => {\n this.#options.classes.li_current\n .split(\" \")\n .forEach((cl) => li.classList.remove(cl));\n const link = li.querySelector(\"a\");\n if (link) {\n this.#options.classes.li_a_current\n .split(\" \")\n .forEach((cl) => link.classList.remove(cl));\n }\n });\n }\n\n /**\n * Handles keyboard events (ArrowDown, ArrowUp, Enter, Escape) for navigating\n * and selecting suggestions or closing the list.\n * @param {KeyboardEvent} e - The keyboard event object.\n */\n _onKeyDown(e) {\n if (\n !this.#allSuggestions.length ||\n !this.#ul ||\n this.#ul.style.display === \"none\"\n )\n return;\n\n this._resetLiClasses(); // Reset classes on any key press within the suggestions\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault(); // Prevent cursor movement in input\n this.#currentSuggestion = Math.min(\n this.#currentSuggestion + 1,\n this.#allSuggestions.length - 1\n );\n if (this.#currentSuggestion < 0) this.#currentSuggestion = 0; // Handle case where it was -1\n\n const currentLi = this.#ul.children.item(this.#currentSuggestion);\n if (currentLi) {\n const currentA = currentLi.querySelector(\"a\");\n this.#options.classes.li_current\n .split(\" \")\n .forEach((cl) => currentLi.classList.add(cl));\n if (currentA) {\n this.#options.classes.li_a_current\n .split(\" \")\n .forEach((cl) => currentA.classList.add(cl));\n }\n currentLi.scrollIntoView({ block: \"nearest\" }); // Ensure visible\n }\n\n // Visual feedback for key press\n this.#options.classes.kbd_active\n .split(\" \")\n .forEach((cl) => this.#kbdDown?.classList.add(cl));\n setTimeout(\n () =>\n this.#options.classes.kbd_active\n .split(\" \")\n .forEach((cl) => this.#kbdDown?.classList.remove(cl)),\n 300\n );\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault(); // Prevent cursor movement in input\n this.#currentSuggestion = Math.max(this.#currentSuggestion - 1, 0); // Stay at 0 if already there\n\n const currentLi = this.#ul.children.item(this.#currentSuggestion);\n if (currentLi) {\n const currentA = currentLi.querySelector(\"a\");\n this.#options.classes.li_current\n .split(\" \")\n .forEach((cl) => currentLi.classList.add(cl));\n if (currentA) {\n this.#options.classes.li_a_current\n .split(\" \")\n .forEach((cl) => currentA.classList.add(cl));\n }\n currentLi.scrollIntoView({ block: \"nearest\" }); // Ensure visible\n }\n\n // Visual feedback for key press\n this.#options.classes.kbd_active\n .split(\" \")\n .forEach((cl) => this.#kbdUp?.classList.add(cl));\n setTimeout(\n () =>\n this.#options.classes.kbd_active\n .split(\" \")\n .forEach((cl) => this.#kbdUp?.classList.remove(cl)),\n 300\n );\n } else if (e.key === \"Enter\") {\n e.preventDefault(); // Prevent form submission if applicable\n if (\n this.#currentSuggestion >= 0 &&\n this.#currentSuggestion < this.#allSuggestions.length\n ) {\n this._onPlaceSelected(\n this.#allSuggestions[this.#currentSuggestion].place\n );\n // Reset is handled within onPlaceSelected via reset(true)\n }\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n // Visual feedback for key press\n this.#options.classes.kbd_active\n .split(\" \")\n .forEach((cl) => this.#kbdEscape?.classList.add(cl));\n setTimeout(\n () =>\n this.#options.classes.kbd_active\n .split(\" \")\n .forEach((cl) => this.#kbdEscape?.classList.remove(cl)),\n 300\n );\n this._reset(true); // Reset search input and results, refresh token\n }\n }\n\n /**\n * Debounced function to fetch autocomplete suggestions from the Google Places API.\n * Triggered by the 'input' event on the input element.\n */\n _debouncedMakeAcRequest = this._debounce(async () => {\n if (!this.#inputElement || !this.#inputElement.value) {\n this._reset();\n if (this.#inputElement)\n this.#inputElement.setAttribute(\"aria-expanded\", \"false\");\n return;\n }\n\n this.#request.input = this.#inputElement.value;\n //console.log(\"Request:\", this.#request); // Debugging\n try {\n const { suggestions } =\n // eslint-disable-next-line no-undef\n await google.maps.places.AutocompleteSuggestion.fetchAutocompleteSuggestions(\n this.#request\n );\n\n // Display suggestions\n if (suggestions && suggestions.length > 0) {\n this.#ul.replaceChildren(\n ...this._createSuggestionElements(suggestions)\n );\n this.#ul.style.display = \"block\";\n this.#inputElement.setAttribute(\"aria-expanded\", \"true\");\n } else {\n // No suggestions found\n this._reset(); // Clear any old suggestions\n this.#inputElement.setAttribute(\"aria-expanded\", \"false\");\n // Optionally display a \"no results\" message in the 'ul'\n }\n } catch (error) {\n this.#onErrorCallback(error);\n this._reset();\n if (this.#inputElement)\n this.#inputElement.setAttribute(\"aria-expanded\", \"false\");\n }\n }, this.#options?.debounce ?? 100);\n\n /**\n * Creates an array of list item (LI) elements for the suggestions dropdown.\n * Each LI contains a link (A) with the place prediction details and distance.\n * Handles highlighting the matched parts of the suggestion text.\n * @param {Array<google.maps.places.AutocompleteSuggestion>} suggestions - Array of suggestion objects from the API.\n * @returns {Array<HTMLLIElement>} An array of LI elements to be added to the suggestions UL.\n */\n _createSuggestionElements(suggestions) {\n this.#allSuggestions = []; // Reset before populating\n return suggestions.map((suggestion, index) => {\n this.#allSuggestions.push({\n id: index + 1,\n description: suggestion.placePrediction.toString(),\n place: suggestion.placePrediction.toPlace(),\n });\n\n // create div elements\n const divContainer = document.createElement(\"div\");\n divContainer.className = this.#options.classes.li_div_container; // flex min-w-0 gap-x-4\n // create inner div element - place name\n const divInner = document.createElement(\"div\");\n divInner.className = this.#options.classes.li_div_one; // min-w-0 flex-auto\n divContainer.appendChild(divInner);\n // create p element - place name\n const p = document.createElement(\"p\");\n p.className = this.#options.classes.li_div_one_p; // text-sm/6\n\n // get prediction text\n const predictionText = suggestion.placePrediction.text;\n const originalText = predictionText.text;\n // Array of objects with startOffset, endOffset\n const matches = predictionText.matches;\n\n //Highlighting Logic\n let lastIndex = 0;\n\n // Sort matches just in case they aren't ordered (though they usually are)\n matches.sort((a, b) => a.startOffset - b.startOffset);\n\n // 1. Create the outer span\n const outerSpan = document.createElement(\"span\");\n\n // 2. Create the inner span for the bold part\n const innerSpan = document.createElement(\"span\");\n innerSpan.classList = this.#options.classes.highlight ?? \"font-bold\"; // Use the highlight class from options\n\n for (const match of matches) {\n // Append text before the current match\n outerSpan.textContent += originalText.substring(\n lastIndex,\n match.startOffset\n );\n\n // Append the highlighted match segment\n if (match.startOffset > 0) {\n // check previous charter is space\n const prevChar = originalText.charAt(match.startOffset - 1);\n if (prevChar == \" \") {\n innerSpan.textContent += \" \";\n }\n }\n innerSpan.textContent += originalText.substring(\n match.startOffset,\n match.endOffset\n );\n\n // Update the last index processed\n lastIndex = match.endOffset;\n }\n\n // 3. Create a text node for the remaining text\n const remainingText = document.createTextNode(\n originalText.substring(lastIndex)\n );\n\n // 4. Append the inner span and the text node to the outer span\n outerSpan.appendChild(innerSpan);\n outerSpan.appendChild(remainingText);\n\n // 5. Append the outer span to the paragraph element\n p.appendChild(outerSpan);\n\n divInner.appendChild(p);\n divContainer.appendChild(divInner);\n\n // create inner div element - distance\n const divInner2 = document.createElement(\"div\");\n divInner2.className = this.#options.classes.li_div_two; //'shrink-0 flex flex-col items-end min-w-16';\n divContainer.appendChild(divInner2);\n // create p element - distance\n const p2 = document.createElement(\"p\");\n p2.className = this.#options.classes.li_div_two_p; //'mt-1 text-xs/5 ';\n p2.textContent = this._formatDistance(\n suggestion.placePrediction.distanceMeters,\n this.#options.distance_units ?? \"km\"\n );\n divInner2.appendChild(p2);\n\n // // create a link element\n const a = document.createElement(\"a\");\n a.href = \"javascript:void(0)\";\n a.tabIndex = index + 1;\n a.className = this.#options.classes.li_a; // block w-full flex justify-between\n\n a.addEventListener(\"click\", () => {\n this._onPlaceSelected(suggestion.placePrediction.toPlace());\n });\n\n // ...\n // a.addEventListener(\"click\", () => {\n // this._fetchPlaceDetails(prediction.place_id);\n // });\n a.appendChild(divContainer);\n a.appendChild(divInner2);\n\n const li = document.createElement(\"li\");\n li.id = `option-${index + 1}`;\n li.className = this.#options.classes.li;\n\n li.appendChild(a);\n return li;\n });\n }\n\n /**\n * Handles the selection of a place. Fetches required fields\n * (displayName, formattedAddress, addressComponents) and calls the\n * user-defined `onPacData` callback.\n * @param {google.maps.places.Place} place - The selected Place object.\n */\n async _onPlaceSelected(place) {\n try {\n // Fetch necessary details for the selected place\n await place.fetchFields({\n fields: [\"displayName\", \"formattedAddress\", \"addressComponents\"], // Add more fields as needed\n });\n // Call the user-provided callback with the place data\n // eslint-disable-next-line no-undef\n this.#onDataCallback(place.toJSON()); // Convert to plain JSON object for the callback\n } catch (error) {\n console.error(\"Error fetching place details:\", error);\n // eslint-disable-next-line no-undef\n this.#onErrorCallback(error);\n } finally {\n // Reset the input and suggestions regardless of success/error\n this._reset(true); // Refresh token after selection\n }\n }\n\n /**\n * Creates a new Google Places Autocomplete Session Token.\n * This should be called before starting a new series of autocomplete requests.\n */\n _refreshToken() {\n try {\n // eslint-disable-next-line no-undef\n this.#request.sessionToken =\n new google.maps.places.AutocompleteSessionToken();\n } catch (error) {\n console.error(\"Error creating session token:\", error);\n // eslint-disable-next-line no-undef\n this.#onErrorCallback(error);\n }\n }\n\n clear() {\n this._reset(true);\n }\n\n destroy() {\n // Remove event listeners, remove elements from DOM\n if (this.#inputElement) {\n this.#inputElement.removeEventListener(\n \"input\",\n this._debouncedMakeAcRequest\n );\n // remove other listeners\n }\n if (this.#pacEl && this.#container) {\n this.#pacEl.removeChild(this.#container.parentElement); // remove the whole section\n }\n // Nullify properties\n for (const prop in this) {\n if (Object.hasOwn(this, prop)) {\n this[prop] = null;\n }\n }\n console.log(\"PacAutocomplete instance destroyed.\");\n }\n}\n"],"names":["PlacesAutocomplete","config","__privateAdd","_containerId","_pacEl","_googleMapsApiKey","_googleMapsApiVersion","_options","_request","_inputElement","_container","_ul","_kbdEscape","_kbdUp","_kbdDown","_allSuggestions","_currentSuggestion","_onDataCallback","_onErrorCallback","_defaultClasses","_defaultRequestParams","__publicField","__privateGet","suggestions","error","_a","__privateSet","place","func","wait","timeout","args","later","distance","units","value","unitLabel","g","h","a","k","p","c","l","q","m","b","d","r","e","u","f","n","t","section","cl","iconContainer","icon","label","kbdContainer","refresh","li","link","currentLi","currentA","suggestion","index","divContainer","divInner","predictionText","originalText","matches","lastIndex","outerSpan","innerSpan","match","remainingText","divInner2","p2","prop"],"mappings":"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"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "places-autocomplete-js",
3
3
  "license": "MIT",
4
4
  "type": "module",
5
- "version": "1.0.4",
5
+ "version": "1.0.5",
6
6
  "description": "A flexible and customisable vanilla JavaScript library leveraging the Google Maps Places (New) Autocomplete API. This library provides a user-friendly way to search for and retrieve detailed address information in any web application.",
7
7
  "keywords": [
8
8
  "place-autocomplete",
@@ -50,11 +50,11 @@
50
50
  "lint": "eslint src/**/*.js"
51
51
  },
52
52
  "devDependencies": {
53
- "@tailwindcss/postcss": "^4.1.7",
54
- "@tailwindcss/vite": "^4.1.7",
55
- "eslint": "^9.27.0",
56
- "postcss": "^8.5.3",
57
- "tailwindcss": "^4.1.7",
53
+ "@tailwindcss/postcss": "^4.1.8",
54
+ "@tailwindcss/vite": "^4.1.8",
55
+ "eslint": "^9.28.0",
56
+ "postcss": "^8.5.4",
57
+ "tailwindcss": "^4.1.8",
58
58
  "vite": "^6.3.5",
59
59
  "dotenv": "^16.5.0"
60
60
  },