@rpcbase/ui 0.281.0 → 0.282.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/AddressAutocompleteInput/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAoE,MAAM,OAAO,CAAA;AA0JnG,eAAO,MAAM,wBAAwB,0KAclC;IACD,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,mBAAmB,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAA;IAChF,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC/B,gBAAgB,CAAC,EAAE,SAAS,CAAA;CAC7B,gCAyXA,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/AddressAutocompleteInput/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAoE,MAAM,OAAO,CAAA;AA0JnG,eAAO,MAAM,wBAAwB,0KAclC;IACD,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,mBAAmB,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAA;IAChF,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC/B,gBAAgB,CAAC,EAAE,SAAS,CAAA;CAC7B,gCAgYA,CAAA"}
package/dist/index14.js CHANGED
@@ -4,18 +4,18 @@ import { cn as n } from "./index12.js";
4
4
  import { Input as r } from "./index13.js";
5
5
  import { c as i } from "react/compiler-runtime";
6
6
  import { useEffect as a, useMemo as o, useRef as s, useState as c } from "react";
7
- import { Loader2 as ee } from "lucide-react";
8
- import { Fragment as l, jsx as u, jsxs as d } from "react/jsx-runtime";
7
+ import { Loader2 as l } from "lucide-react";
8
+ import { Fragment as u, jsx as d, jsxs as f } from "react/jsx-runtime";
9
9
  //#region src/components/AddressAutocompleteInput/index.tsx
10
- var f = /* @__PURE__ */ new Set(/* @__PURE__ */ "street_address.route.premise.subpremise.intersection.sublocality.sublocality_level_1.sublocality_level_2.sublocality_level_3.sublocality_level_4.sublocality_level_5.administrative_area_level_1.administrative_area_level_2.administrative_area_level_3.administrative_area_level_4.administrative_area_level_5.administrative_area_level_6.administrative_area_level_7.postal_code.locality.country.geocode.plus_code.political.neighborhood.colloquial_area.lodging.train_station.transit_station".split(".")), p = /* @__PURE__ */ new WeakMap(), m = (e) => (p.get(e) ?? e.text?.text ?? "").replace(/, France$/, "").trim(), h = (e) => {
10
+ var p = /* @__PURE__ */ new Set(/* @__PURE__ */ "street_address.route.premise.subpremise.intersection.sublocality.sublocality_level_1.sublocality_level_2.sublocality_level_3.sublocality_level_4.sublocality_level_5.administrative_area_level_1.administrative_area_level_2.administrative_area_level_3.administrative_area_level_4.administrative_area_level_5.administrative_area_level_6.administrative_area_level_7.postal_code.locality.country.geocode.plus_code.political.neighborhood.colloquial_area.lodging.train_station.transit_station".split(".")), m = /* @__PURE__ */ new WeakMap(), h = (e) => (m.get(e) ?? e.text?.text ?? "").replace(/, France$/, "").trim(), g = (e) => {
11
11
  let t = i(8), { prediction: n } = e, r, a, o;
12
12
  if (t[0] !== n) {
13
13
  o = Symbol.for("react.early_return_sentinel");
14
14
  bb0: {
15
- r = m(n);
16
- let e = p.get(n) ?? n.text?.text ?? "", t = n.text?.matches ?? [], i = r.length < e.length;
15
+ r = h(n);
16
+ let e = m.get(n) ?? n.text?.text ?? "", t = n.text?.matches ?? [], i = r.length < e.length;
17
17
  if (t.length === 0) {
18
- o = /* @__PURE__ */ u(l, { children: r });
18
+ o = /* @__PURE__ */ d(u, { children: r });
19
19
  break bb0;
20
20
  }
21
21
  a = [];
@@ -25,7 +25,7 @@ var f = /* @__PURE__ */ new Set(/* @__PURE__ */ "street_address.route.premise.su
25
25
  let n = e.startOffset, o = Math.min(e.endOffset, r.length);
26
26
  if (n > s && a.push(r.substring(s, n)), o > n) {
27
27
  let e = r.substring(n, o);
28
- a.push(/* @__PURE__ */ u("strong", { children: e }, t));
28
+ a.push(/* @__PURE__ */ d("strong", { children: e }, t));
29
29
  }
30
30
  s = Math.max(s, o);
31
31
  }), s < r.length && a.push(r.substring(s));
@@ -35,133 +35,133 @@ var f = /* @__PURE__ */ new Set(/* @__PURE__ */ "street_address.route.premise.su
35
35
  if (o !== Symbol.for("react.early_return_sentinel")) return o;
36
36
  if (a.length === 0) {
37
37
  let e;
38
- return t[4] === r ? e = t[5] : (e = /* @__PURE__ */ u(l, { children: r }), t[4] = r, t[5] = e), e;
38
+ return t[4] === r ? e = t[5] : (e = /* @__PURE__ */ d(u, { children: r }), t[4] = r, t[5] = e), e;
39
39
  }
40
40
  let s;
41
- return t[6] === a ? s = t[7] : (s = /* @__PURE__ */ u(l, { children: a }), t[6] = a, t[7] = s), s;
42
- }, g = (e, t) => !e.types || e.types.length === 0 || !t || t.size === 0 || e.types.some((e) => t.has(e)), _ = (e) => e.types?.some((e) => e === "establishment" || e === "point_of_interest") ?? !1, v = (e, t) => e.placeId || `${e.text?.text ?? "prediction"}-${t}`, y = (e) => {
41
+ return t[6] === a ? s = t[7] : (s = /* @__PURE__ */ d(u, { children: a }), t[6] = a, t[7] = s), s;
42
+ }, _ = (e, t) => !e.types || e.types.length === 0 || !t || t.size === 0 || e.types.some((e) => t.has(e)), ee = (e) => e.types?.some((e) => e === "establishment" || e === "point_of_interest") ?? !1, v = (e, t) => e.placeId || `${e.text?.text ?? "prediction"}-${t}`, y = (e) => {
43
43
  let t = /* @__PURE__ */ new Map();
44
44
  return e.forEach((e) => {
45
45
  let n = e.placeId;
46
46
  n && (t.has(n) || t.set(n, e));
47
47
  }), Array.from(t.values());
48
- }, b = (e, t) => e.filter((e) => g(e, t)), x = (e) => e.sort((e, t) => (e.distanceMeters ?? Infinity) - (t.distanceMeters ?? Infinity)), S = (e, t) => x(b(y(e), t)), C = (e, t) => m(e).toLowerCase() === t.trim().toLowerCase(), w = ({ id: i, label: l, placeholder: g, value: y, onValueChange: b, disabled: x, name: w, className: T, autofillShimName: E, googleMapsApiKey: D, locationRestriction: O, allowedTypes: k, loadingIndicator: A }) => {
49
- let [j, M] = c(y ?? ""), [N, P] = c([]), [F, I] = c(!1), [L, R] = c(-1), [z, B] = c(!1), V = s(null), H = s(null), U = s(!1), W = s(!1), G = s(null), K = s(/* @__PURE__ */ new Map()), q = s([]), J = s("smooth"), Y = e("places", D), X = o(() => {
50
- if (!k) return f;
48
+ }, b = (e, t) => e.filter((e) => _(e, t)), x = (e) => e.sort((e, t) => (e.distanceMeters ?? Infinity) - (t.distanceMeters ?? Infinity)), S = (e, t) => x(b(y(e), t)), C = (e, t) => h(e).toLowerCase() === t.trim().toLowerCase(), w = ({ id: i, label: u, placeholder: _, value: y, onValueChange: b, disabled: x, name: w, className: T, autofillShimName: te, googleMapsApiKey: E, locationRestriction: D, allowedTypes: O, loadingIndicator: k }) => {
49
+ let [A, j] = c(y ?? ""), [M, N] = c([]), [P, F] = c(!1), [I, L] = c(-1), [R, z] = c(!1), B = s(null), V = s(null), H = s(!1), U = s(!1), W = s(null), G = s(/* @__PURE__ */ new Map()), K = s([]), q = s("smooth"), J = s(y), Y = s(b), X = e("places", E), Z = o(() => {
50
+ if (!O) return p;
51
51
  let e = /* @__PURE__ */ new Set();
52
- for (let t of k) e.add(t);
52
+ for (let t of O) e.add(t);
53
53
  return e;
54
- }, [k]);
54
+ }, [O]);
55
55
  a(() => {
56
- M(y ?? ""), W.current = !1;
56
+ j(y ?? ""), U.current = !1;
57
57
  }, [y]), a(() => {
58
- if (U.current) {
59
- U.current = !1;
58
+ J.current = y, Y.current = b;
59
+ }, [b, y]), a(() => {
60
+ if (H.current) {
61
+ H.current = !1;
60
62
  return;
61
63
  }
62
- let e = j.trim();
63
- B(e !== "");
64
+ let e = A.trim();
65
+ z(e !== "");
64
66
  let t = !0, n = setTimeout(() => {
65
67
  if (!t) return;
66
68
  if (e === "") {
67
- P([]), I(!1), G.current = null, y !== "" && b("");
69
+ N([]), F(!1), W.current = null, J.current !== "" && Y.current("");
68
70
  return;
69
71
  }
70
- if (!Y) return;
71
- let { AutocompleteSuggestion: n, AutocompleteSessionToken: r } = Y;
72
+ if (!X) return;
73
+ let { AutocompleteSuggestion: n, AutocompleteSessionToken: r } = X;
72
74
  if (!n || !r) {
73
- console.error("AddressAutocompleteInput: missing AutocompleteSuggestion or AutocompleteSessionToken exports"), P([]), I(!1), B(!1);
75
+ console.error("AddressAutocompleteInput: missing AutocompleteSuggestion or AutocompleteSessionToken exports"), N([]), F(!1), z(!1);
74
76
  return;
75
77
  }
76
- G.current ||= new r();
78
+ W.current ||= new r();
77
79
  let i = {
78
- input: j,
79
- sessionToken: G.current ?? void 0,
80
+ input: A,
81
+ sessionToken: W.current ?? void 0,
80
82
  includedRegionCodes: ["fr"]
81
83
  };
82
- O && (i.locationRestriction = O), n.fetchAutocompleteSuggestions(i).then(async (e) => {
84
+ D && (i.locationRestriction = D), n.fetchAutocompleteSuggestions(i).then(async (e) => {
83
85
  if (!t) return;
84
- let n = S(e.suggestions.map((e) => e.placePrediction).filter((e) => !!e), X);
86
+ let n = S(e.suggestions.map((e) => e.placePrediction).filter((e) => !!e), Z);
85
87
  if (await Promise.all(n.map(async (e) => {
86
88
  let t = e.placeId;
87
- if (!t || !_(e)) return;
88
- let n = K.current.get(t);
89
+ if (!t || !ee(e)) return;
90
+ let n = G.current.get(t);
89
91
  n || (n = (async () => {
90
92
  try {
91
93
  let t = (await e.toPlace().fetchFields({ fields: ["formattedAddress"] })).place.formattedAddress?.trim(), n = e.mainText?.text?.trim();
92
94
  return !t || !n ? void 0 : `${n}, ${t}`;
93
95
  } catch (e) {
94
- K.current.delete(t), console.error("AddressAutocompleteInput: place details fetch failed", e);
96
+ G.current.delete(t), console.error("AddressAutocompleteInput: place details fetch failed", e);
95
97
  return;
96
98
  }
97
- })(), K.current.set(t, n));
99
+ })(), G.current.set(t, n));
98
100
  let r = await n;
99
- r && p.set(e, r);
101
+ r && m.set(e, r);
100
102
  })), !t) return;
101
- let r = n[0], i = r && n.length === 1 && C(r, j);
102
- if (!W.current && i) {
103
- P(n), I(!1), B(!1);
103
+ let r = n[0], i = r && n.length === 1 && C(r, A);
104
+ if (!U.current && i) {
105
+ N(n), F(!1), z(!1);
104
106
  return;
105
107
  }
106
- n.length > 0 ? (P(n), W.current && I(!0), R(-1)) : (P([]), I(!1)), B(!1);
108
+ n.length > 0 ? (N(n), U.current && F(!0), L(-1)) : (N([]), F(!1)), z(!1);
107
109
  }).catch((e) => {
108
- t && (console.error("AddressAutocompleteInput: suggestion fetch failed", e), P([]), I(!1), B(!1));
110
+ t && (console.error("AddressAutocompleteInput: suggestion fetch failed", e), N([]), F(!1), z(!1));
109
111
  });
110
112
  }, 300);
111
113
  return () => {
112
114
  t = !1, clearTimeout(n);
113
115
  };
114
116
  }, [
115
- j,
116
- Y,
117
- b,
118
- y,
119
- O,
120
- X
117
+ A,
118
+ X,
119
+ D,
120
+ Z
121
121
  ]), a(() => {
122
122
  let e = (e) => {
123
- V.current && !V.current.contains(e.target) && H.current && !H.current.contains(e.target) && I(!1);
123
+ B.current && !B.current.contains(e.target) && V.current && !V.current.contains(e.target) && F(!1);
124
124
  };
125
125
  return document.addEventListener("mousedown", e), () => {
126
126
  document.removeEventListener("mousedown", e);
127
127
  };
128
128
  }, []);
129
- let Z = (e) => {
130
- U.current = !0;
131
- let t = m(e);
132
- M(t), b(t), P([]), I(!1), B(!1), G.current = null;
133
- }, Q = (e) => {
134
- W.current = !0, M(e.target.value);
135
- }, te = (e) => {
136
- if (!F || N.length === 0) {
137
- e.key === "Enter" && (e.preventDefault(), b(j), I(!1), G.current = null);
129
+ let Q = (e) => {
130
+ H.current = !0;
131
+ let t = h(e);
132
+ j(t), b(t), N([]), F(!1), z(!1), W.current = null;
133
+ }, ne = (e) => {
134
+ U.current = !0, j(e.target.value);
135
+ }, re = (e) => {
136
+ if (!P || M.length === 0) {
137
+ e.key === "Enter" && (e.preventDefault(), b(A), F(!1), W.current = null);
138
138
  return;
139
139
  }
140
- e.key === "ArrowDown" ? (J.current = e.repeat ? "auto" : "smooth", e.preventDefault(), R((e) => N.length === 0 ? -1 : e < 0 ? 0 : (e + 1) % N.length)) : e.key === "ArrowUp" ? (J.current = e.repeat ? "auto" : "smooth", e.preventDefault(), R((e) => N.length === 0 ? -1 : e <= 0 ? N.length - 1 : (e - 1) % N.length)) : e.key === "Enter" ? (e.preventDefault(), L > -1 && N[L] ? Z(N[L]) : (b(j), I(!1), G.current = null)) : e.key === "Escape" && I(!1);
141
- }, ne = () => {
142
- I(!1), y !== j && b(j), G.current = null;
143
- }, $ = E ?? (w ? `${w}_shim` : void 0);
140
+ e.key === "ArrowDown" ? (q.current = e.repeat ? "auto" : "smooth", e.preventDefault(), L((e) => M.length === 0 ? -1 : e < 0 ? 0 : (e + 1) % M.length)) : e.key === "ArrowUp" ? (q.current = e.repeat ? "auto" : "smooth", e.preventDefault(), L((e) => M.length === 0 ? -1 : e <= 0 ? M.length - 1 : (e - 1) % M.length)) : e.key === "Enter" ? (e.preventDefault(), I > -1 && M[I] ? Q(M[I]) : (b(A), F(!1), W.current = null)) : e.key === "Escape" && F(!1);
141
+ }, ie = () => {
142
+ F(!1), y !== A && b(A), W.current = null;
143
+ }, $ = te ?? (w ? `${w}_shim` : void 0);
144
144
  return a(() => {
145
- if (!F || L < 0) {
146
- J.current = "smooth";
145
+ if (!P || I < 0) {
146
+ q.current = "smooth";
147
147
  return;
148
148
  }
149
- let e = q.current[L], t = H.current;
149
+ let e = K.current[I], t = V.current;
150
150
  if (!e || !t) {
151
- J.current = "smooth";
151
+ q.current = "smooth";
152
152
  return;
153
153
  }
154
- let n = J.current;
155
- J.current = "smooth";
154
+ let n = q.current;
155
+ q.current = "smooth";
156
156
  let r = e.offsetTop, i = r + e.offsetHeight, a = t.scrollTop, o = a + t.clientHeight;
157
157
  r >= a && i <= o || e.scrollIntoView({
158
158
  block: "nearest",
159
159
  behavior: n
160
160
  });
161
- }, [L, F]), q.current.length = N.length, /* @__PURE__ */ d("div", {
161
+ }, [I, P]), K.current.length = M.length, /* @__PURE__ */ f("div", {
162
162
  className: "relative",
163
163
  children: [
164
- $ && /* @__PURE__ */ u("input", {
164
+ $ && /* @__PURE__ */ d("input", {
165
165
  tabIndex: -1,
166
166
  autoComplete: "street-address",
167
167
  name: $,
@@ -174,50 +174,50 @@ var f = /* @__PURE__ */ new Set(/* @__PURE__ */ "street_address.route.premise.su
174
174
  width: "1px"
175
175
  }
176
176
  }),
177
- /* @__PURE__ */ u("label", {
177
+ /* @__PURE__ */ d("label", {
178
178
  htmlFor: i,
179
179
  className: "text-left block text-sm font-medium text-gray-700 mb-1 cursor-pointer",
180
- children: l
180
+ children: u
181
181
  }),
182
- /* @__PURE__ */ d("div", {
182
+ /* @__PURE__ */ f("div", {
183
183
  className: "relative",
184
- children: [/* @__PURE__ */ u(r, {
185
- ref: V,
184
+ children: [/* @__PURE__ */ d(r, {
185
+ ref: B,
186
186
  id: i,
187
187
  type: "text",
188
- placeholder: g,
188
+ placeholder: _,
189
189
  name: w ?? `${i}_input`,
190
- value: j,
191
- onChange: Q,
192
- onKeyDown: te,
190
+ value: A,
191
+ onChange: ne,
192
+ onKeyDown: re,
193
193
  onFocus: () => {
194
- N.length > 0 && j && I(!0);
194
+ M.length > 0 && A && F(!0);
195
195
  },
196
- onBlur: ne,
196
+ onBlur: ie,
197
197
  disabled: x,
198
198
  autoComplete: "new-password",
199
- className: n("w-full", z && "pr-9", T)
200
- }), z && /* @__PURE__ */ u("span", {
199
+ className: n("w-full", R && "pr-9", T)
200
+ }), R && /* @__PURE__ */ d("span", {
201
201
  "aria-hidden": "true",
202
202
  className: "pointer-events-none absolute right-3 top-1/2 flex size-4 -translate-y-1/2 items-center justify-center text-gray-400",
203
203
  "data-slot": "address-autocomplete-loading-indicator",
204
- children: A === void 0 ? /* @__PURE__ */ u(ee, { className: "size-full animate-spin" }) : A
204
+ children: k === void 0 ? /* @__PURE__ */ d(l, { className: "size-full animate-spin" }) : k
205
205
  })]
206
206
  }),
207
- F && N.length > 0 && /* @__PURE__ */ u("ul", {
208
- ref: H,
207
+ P && M.length > 0 && /* @__PURE__ */ d("ul", {
208
+ ref: V,
209
209
  className: "absolute z-10 mt-1 w-full max-h-60 overflow-y-auto rounded-md border border-gray-200 bg-white text-left shadow-lg",
210
210
  role: "listbox",
211
- children: N.map((e, n) => /* @__PURE__ */ u("li", {
211
+ children: M.map((e, n) => /* @__PURE__ */ d("li", {
212
212
  ref: (e) => {
213
- q.current[n] = e;
213
+ K.current[n] = e;
214
214
  },
215
- className: t("cursor-pointer px-3 py-2 text-sm text-gray-700 hover:bg-gray-100", { "bg-gray-100": L === n }),
215
+ className: t("cursor-pointer px-3 py-2 text-sm text-gray-700 hover:bg-gray-100", { "bg-gray-100": I === n }),
216
216
  role: "option",
217
217
  onMouseDown: (t) => {
218
- t.preventDefault(), Z(e);
218
+ t.preventDefault(), Q(e);
219
219
  },
220
- children: /* @__PURE__ */ u(h, { prediction: e })
220
+ children: /* @__PURE__ */ d(g, { prediction: e })
221
221
  }, v(e, n)))
222
222
  })
223
223
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"index14.js","names":["displayText","index","matched","lastIndex","parts","prediction","error","e","prev"],"sources":["../src/components/AddressAutocompleteInput/index.tsx"],"sourcesContent":["/// <reference types=\"google.maps\" />\n\nimport { ReactNode, ChangeEvent, KeyboardEvent, useState, useEffect, useRef, useMemo } from \"react\"\nimport clsx from \"clsx\"\nimport { Loader2 } from \"lucide-react\"\n\nimport { useMapsLibrary } from \"@/helpers/useMapsLibrary\"\nimport { Input } from \"@/components/Input\"\nimport { cn } from \"@/lib/utils\"\n\n\nconst DEFAULT_ALLOWED_TYPES = new Set([\n \"street_address\",\n \"route\",\n \"premise\",\n \"subpremise\",\n \"intersection\",\n \"sublocality\",\n \"sublocality_level_1\",\n \"sublocality_level_2\",\n \"sublocality_level_3\",\n \"sublocality_level_4\",\n \"sublocality_level_5\",\n \"administrative_area_level_1\",\n \"administrative_area_level_2\",\n \"administrative_area_level_3\",\n \"administrative_area_level_4\",\n \"administrative_area_level_5\",\n \"administrative_area_level_6\",\n \"administrative_area_level_7\",\n \"postal_code\",\n \"locality\",\n \"country\",\n \"geocode\",\n \"plus_code\",\n \"political\",\n \"neighborhood\",\n \"colloquial_area\",\n \"lodging\",\n \"train_station\",\n \"transit_station\",\n])\n\nconst detailedTextByPrediction = new WeakMap<google.maps.places.PlacePrediction, string>()\n\nconst getDisplayText = (prediction: google.maps.places.PlacePrediction) => {\n const fullText = detailedTextByPrediction.get(prediction) ?? prediction.text?.text ?? \"\"\n return fullText.replace(/, France$/, \"\").trim()\n}\n\nconst PredictionItem = ({ prediction }: { prediction: google.maps.places.PlacePrediction }) => {\n const displayText = getDisplayText(prediction)\n const fullText = detailedTextByPrediction.get(prediction) ?? prediction.text?.text ?? \"\"\n const matches = prediction.text?.matches ?? []\n const wasCountryRemoved = displayText.length < fullText.length\n\n if (matches.length === 0) {\n return <>{displayText}</>\n }\n\n const parts: ReactNode[] = []\n let lastIndex = 0\n\n matches.forEach((substring, index) => {\n if (wasCountryRemoved && substring.startOffset >= displayText.length) {\n return\n }\n\n const startOffset = substring.startOffset\n const endOffset = Math.min(substring.endOffset, displayText.length)\n\n if (startOffset > lastIndex) {\n parts.push(displayText.substring(lastIndex, startOffset))\n }\n\n if (endOffset > startOffset) {\n const matched = displayText.substring(startOffset, endOffset)\n parts.push(<strong key={index}>{matched}</strong>)\n }\n\n lastIndex = Math.max(lastIndex, endOffset)\n })\n\n if (lastIndex < displayText.length) {\n parts.push(displayText.substring(lastIndex))\n }\n\n if (parts.length === 0) {\n return <>{displayText}</>\n }\n\n return <>{parts}</>\n}\n\nconst isAllowedPrediction = (\n prediction: google.maps.places.PlacePrediction,\n allowedTypes: ReadonlySet<string> | null,\n) => {\n if (!prediction.types || prediction.types.length === 0) {\n return true\n }\n\n if (!allowedTypes || allowedTypes.size === 0) {\n return true\n }\n\n return prediction.types.some(type => allowedTypes.has(type))\n}\n\nconst isNamedPlacePrediction = (prediction: google.maps.places.PlacePrediction) =>\n prediction.types?.some(type => type === \"establishment\" || type === \"point_of_interest\") ?? false\n\nconst getPredictionId = (prediction: google.maps.places.PlacePrediction, index: number) =>\n prediction.placeId || `${prediction.text?.text ?? \"prediction\"}-${index}`\n\nconst getUniquePredictions = (predictions: google.maps.places.PlacePrediction[]) => {\n const map = new Map<string, google.maps.places.PlacePrediction>()\n\n predictions.forEach(prediction => {\n const key = prediction.placeId\n\n if (!key) {\n return\n }\n\n if (!map.has(key)) {\n map.set(key, prediction)\n }\n })\n\n return Array.from(map.values())\n}\n\nconst getFilteredPredictions = (\n predictions: google.maps.places.PlacePrediction[],\n allowedTypes: ReadonlySet<string> | null,\n) => predictions.filter(prediction => isAllowedPrediction(prediction, allowedTypes))\n\nconst sortPredictions = (predictions: google.maps.places.PlacePrediction[]) =>\n predictions.sort((a, b) => {\n const aDistance = a.distanceMeters ?? Number.POSITIVE_INFINITY\n const bDistance = b.distanceMeters ?? Number.POSITIVE_INFINITY\n\n return aDistance - bDistance\n })\n\nconst buildDisplayPredictions = (\n predictions: google.maps.places.PlacePrediction[],\n allowedTypes: ReadonlySet<string> | null,\n) => sortPredictions(getFilteredPredictions(getUniquePredictions(predictions), allowedTypes))\n\nconst isExactMatch = (prediction: google.maps.places.PlacePrediction, value: string) => {\n const display = getDisplayText(prediction)\n return display.toLowerCase() === value.trim().toLowerCase()\n}\n\nexport const AddressAutocompleteInput = ({\n id,\n label,\n placeholder,\n value,\n onValueChange,\n disabled,\n name,\n className,\n autofillShimName,\n googleMapsApiKey,\n locationRestriction,\n allowedTypes,\n loadingIndicator,\n}: {\n id: string\n label: string\n placeholder: string\n value: string | undefined\n onValueChange: (value: string) => void\n disabled?: boolean\n name?: string\n className?: string\n autofillShimName?: string\n googleMapsApiKey?: string\n locationRestriction?: google.maps.LatLngBoundsLiteral | google.maps.LatLngBounds\n allowedTypes?: Iterable<string>\n loadingIndicator?: ReactNode\n}) => {\n const [inputValue, setInputValue] = useState(value ?? \"\")\n const [predictions, setPredictions] = useState<google.maps.places.PlacePrediction[]>([])\n const [isDropdownOpen, setIsDropdownOpen] = useState(false)\n const [highlightedIndex, setHighlightedIndex] = useState(-1)\n const [isLoading, setIsLoading] = useState(false)\n\n const inputRef = useRef<HTMLInputElement>(null)\n const dropdownRef = useRef<HTMLUListElement>(null)\n const isSelecting = useRef(false)\n const hasUserTyped = useRef(false)\n const sessionTokenRef = useRef<google.maps.places.AutocompleteSessionToken | null>(null)\n const detailedTextRequestsRef = useRef(new Map<string, Promise<string | undefined>>())\n const optionRefs = useRef<(HTMLLIElement | null)[]>([])\n const scrollBehaviorRef = useRef<ScrollBehavior>(\"smooth\")\n const placesLibrary = useMapsLibrary(\"places\", googleMapsApiKey)\n const allowedTypesSet = useMemo(() => {\n if (!allowedTypes) {\n return DEFAULT_ALLOWED_TYPES\n }\n\n const newSet = new Set<string>()\n for (const type of allowedTypes) {\n newSet.add(type)\n }\n return newSet\n }, [allowedTypes])\n\n useEffect(() => {\n setInputValue(value ?? \"\")\n hasUserTyped.current = false\n }, [value])\n\n useEffect(() => {\n if (isSelecting.current) {\n isSelecting.current = false\n return\n }\n\n const trimmed = inputValue.trim()\n\n if (trimmed === \"\") {\n setIsLoading(false)\n } else {\n setIsLoading(true)\n }\n\n let isActive = true\n\n const handler = setTimeout(() => {\n if (!isActive) {\n return\n }\n\n if (trimmed === \"\") {\n setPredictions([])\n setIsDropdownOpen(false)\n sessionTokenRef.current = null\n if (value !== \"\") {\n onValueChange(\"\")\n }\n return\n }\n\n if (!placesLibrary) return\n\n const { AutocompleteSuggestion, AutocompleteSessionToken } = placesLibrary\n\n if (!AutocompleteSuggestion || !AutocompleteSessionToken) {\n console.error(\"AddressAutocompleteInput: missing AutocompleteSuggestion or AutocompleteSessionToken exports\")\n setPredictions([])\n setIsDropdownOpen(false)\n setIsLoading(false)\n return\n }\n\n if (!sessionTokenRef.current) {\n sessionTokenRef.current = new AutocompleteSessionToken()\n }\n\n const request: google.maps.places.AutocompleteRequest = {\n input: inputValue,\n sessionToken: sessionTokenRef.current ?? undefined,\n includedRegionCodes: [\"fr\"],\n }\n if (locationRestriction) {\n request.locationRestriction = locationRestriction\n }\n\n AutocompleteSuggestion.fetchAutocompleteSuggestions(request)\n .then(async (response: { suggestions: google.maps.places.AutocompleteSuggestion[] }) => {\n if (!isActive) {\n return\n }\n\n const placePredictions = response.suggestions\n .map((suggestion: google.maps.places.AutocompleteSuggestion) => suggestion.placePrediction)\n .filter((prediction): prediction is google.maps.places.PlacePrediction => Boolean(prediction))\n\n const combinedPredictions = buildDisplayPredictions(placePredictions, allowedTypesSet)\n await Promise.all(combinedPredictions.map(async prediction => {\n const placeId = prediction.placeId\n if (!placeId || !isNamedPlacePrediction(prediction)) {\n return\n }\n\n let detailedTextRequest = detailedTextRequestsRef.current.get(placeId)\n if (!detailedTextRequest) {\n detailedTextRequest = (async () => {\n try {\n const place = prediction.toPlace()\n const result = await place.fetchFields({ fields: [\"formattedAddress\"] })\n const formattedAddress = result.place.formattedAddress?.trim()\n const placeName = prediction.mainText?.text?.trim()\n if (!formattedAddress || !placeName) return undefined\n return `${placeName}, ${formattedAddress}`\n } catch (error) {\n detailedTextRequestsRef.current.delete(placeId)\n console.error(\"AddressAutocompleteInput: place details fetch failed\", error)\n return undefined\n }\n })()\n detailedTextRequestsRef.current.set(placeId, detailedTextRequest)\n }\n\n const detailedText = await detailedTextRequest\n if (detailedText) {\n detailedTextByPrediction.set(prediction, detailedText)\n }\n }))\n\n if (!isActive) {\n return\n }\n\n const singlePrediction = combinedPredictions[0]\n const hasExactMatch =\n singlePrediction && combinedPredictions.length === 1 && isExactMatch(singlePrediction, inputValue)\n\n if (!hasUserTyped.current && hasExactMatch) {\n setPredictions(combinedPredictions)\n setIsDropdownOpen(false)\n setIsLoading(false)\n return\n }\n\n if (combinedPredictions.length > 0) {\n setPredictions(combinedPredictions)\n if (hasUserTyped.current) {\n setIsDropdownOpen(true)\n }\n setHighlightedIndex(-1)\n } else {\n setPredictions([])\n setIsDropdownOpen(false)\n }\n setIsLoading(false)\n })\n .catch((error: unknown) => {\n if (!isActive) {\n return\n }\n console.error(\"AddressAutocompleteInput: suggestion fetch failed\", error)\n setPredictions([])\n setIsDropdownOpen(false)\n setIsLoading(false)\n })\n }, 300)\n\n return () => {\n isActive = false\n clearTimeout(handler)\n }\n }, [inputValue, placesLibrary, onValueChange, value, locationRestriction, allowedTypesSet])\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n inputRef.current &&\n !inputRef.current.contains(event.target as Node) &&\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n setIsDropdownOpen(false)\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside)\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside)\n }\n }, [])\n\n const handleSelectPrediction = (prediction: google.maps.places.PlacePrediction) => {\n isSelecting.current = true\n const newAddress = getDisplayText(prediction)\n setInputValue(newAddress)\n onValueChange(newAddress)\n setPredictions([])\n setIsDropdownOpen(false)\n setIsLoading(false)\n sessionTokenRef.current = null\n }\n\n const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n hasUserTyped.current = true\n setInputValue(e.target.value)\n }\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (!isDropdownOpen || predictions.length === 0) {\n if (e.key === \"Enter\") {\n e.preventDefault()\n onValueChange(inputValue)\n setIsDropdownOpen(false)\n sessionTokenRef.current = null\n }\n return\n }\n\n if (e.key === \"ArrowDown\") {\n scrollBehaviorRef.current = e.repeat ? \"auto\" : \"smooth\"\n e.preventDefault()\n setHighlightedIndex(prev => {\n if (predictions.length === 0) {\n return -1\n }\n return prev < 0 ? 0 : (prev + 1) % predictions.length\n })\n } else if (e.key === \"ArrowUp\") {\n scrollBehaviorRef.current = e.repeat ? \"auto\" : \"smooth\"\n e.preventDefault()\n setHighlightedIndex(prev => {\n if (predictions.length === 0) {\n return -1\n }\n if (prev <= 0) {\n return predictions.length - 1\n }\n return (prev - 1) % predictions.length\n })\n } else if (e.key === \"Enter\") {\n e.preventDefault()\n if (highlightedIndex > -1 && predictions[highlightedIndex]) {\n handleSelectPrediction(predictions[highlightedIndex])\n } else {\n onValueChange(inputValue)\n setIsDropdownOpen(false)\n sessionTokenRef.current = null\n }\n } else if (e.key === \"Escape\") {\n setIsDropdownOpen(false)\n }\n }\n\n const handleBlur = () => {\n setIsDropdownOpen(false)\n if (value !== inputValue) {\n onValueChange(inputValue)\n }\n sessionTokenRef.current = null\n }\n\n const shimName = autofillShimName ?? (name ? `${name}_shim` : undefined)\n\n useEffect(() => {\n if (!isDropdownOpen || highlightedIndex < 0) {\n scrollBehaviorRef.current = \"smooth\"\n return\n }\n\n const item = optionRefs.current[highlightedIndex]\n const list = dropdownRef.current\n\n if (!item || !list) {\n scrollBehaviorRef.current = \"smooth\"\n return\n }\n\n const behavior = scrollBehaviorRef.current\n scrollBehaviorRef.current = \"smooth\"\n\n const top = item.offsetTop\n const bottom = top + item.offsetHeight\n const viewTop = list.scrollTop\n const viewBottom = viewTop + list.clientHeight\n\n if (top >= viewTop && bottom <= viewBottom) {\n return\n }\n\n item.scrollIntoView({\n block: \"nearest\",\n behavior,\n })\n }, [highlightedIndex, isDropdownOpen])\n\n optionRefs.current.length = predictions.length\n\n return (\n <div className=\"relative\">\n {shimName && (\n <input\n tabIndex={-1}\n autoComplete=\"street-address\"\n name={shimName}\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n left: \"-9999px\",\n top: \"-9999px\",\n height: \"1px\",\n width: \"1px\",\n }}\n />\n )}\n <label htmlFor={id} className=\"text-left block text-sm font-medium text-gray-700 mb-1 cursor-pointer\">\n {label}\n </label>\n <div className=\"relative\">\n <Input\n ref={inputRef}\n id={id}\n type=\"text\"\n placeholder={placeholder}\n name={name ?? `${id}_input`}\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onFocus={() => {\n if (predictions.length > 0 && inputValue) {\n setIsDropdownOpen(true)\n }\n }}\n onBlur={handleBlur}\n disabled={disabled}\n autoComplete=\"new-password\"\n className={cn(\"w-full\", isLoading && \"pr-9\", className)}\n />\n {isLoading && (\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute right-3 top-1/2 flex size-4 -translate-y-1/2 items-center justify-center text-gray-400\"\n data-slot=\"address-autocomplete-loading-indicator\"\n >\n {loadingIndicator === undefined ? <Loader2 className=\"size-full animate-spin\" /> : loadingIndicator}\n </span>\n )}\n </div>\n {isDropdownOpen && predictions.length > 0 && (\n <ul\n ref={dropdownRef}\n className=\"absolute z-10 mt-1 w-full max-h-60 overflow-y-auto rounded-md border border-gray-200 bg-white text-left shadow-lg\"\n role=\"listbox\"\n >\n {predictions.map((prediction, index) => (\n <li\n key={getPredictionId(prediction, index)}\n ref={node => {\n optionRefs.current[index] = node\n }}\n className={clsx(\n \"cursor-pointer px-3 py-2 text-sm text-gray-700 hover:bg-gray-100\",\n { \"bg-gray-100\": highlightedIndex === index },\n )}\n role=\"option\"\n onMouseDown={e => {\n e.preventDefault()\n handleSelectPrediction(prediction)\n }}\n >\n <PredictionItem prediction={prediction} />\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n"],"mappings":";;;;;;;;;AAWA,IAAM,oBAAwB,IAAI,IAAI,ggBA6BnB,CAClB,GAEK,oBAA2B,IAAI,QAAoD,GAEnF,KAAkB,OACL,EAAyB,IAAI,CAAU,KAAK,EAAW,MAAM,QAAQ,GAAA,CACtE,QAAQ,aAAa,EAAE,CAAC,CAAC,KAAK,GAG1C,KAAiB,MAAA;CAAA,IAAA,IAAA,EAAA,CAAA,GAAC,EAAA,kBAAA,GAAkE,GAAA,GAAA;CAAA,IAAA,EAAA,OAAA,GAAA;EAO/E,IAAA,OAAkB,IAAlB,6BAAiB;EAAC,KAAA;GAN3B,IAAoB,EAAe,CAAU;GAC7C,IAAA,IAAiB,EAAwB,IAAK,CAAmC,KAApB,EAAU,MAAW,QAAjE,IACjB,IAAgB,EAAU,MAAc,WAAxB,CAAA,GAChB,IAA0B,EAAW,SAAU,EAAQ;GAEvD,IAAI,EAAO,WAAY,GAAC;IACf,IAAA,kBAAA,GAAA,EAAA,UAAG,EAAW,CAAA;IAAd,MAAA;GAAkB;GAG3B,IAA2B,CAAA;GAC3B,IAAA,IAAgB;GAsBhB,AApBA,EAAO,SAAS,GAAA,MAAA;IACd,IAAI,KAAqB,EAAS,eAAgB,EAAW,QAAO;IAIpE,IAAA,IAAoB,EAAS,aAC7B,IAAkB,KAAI,IAAK,EAAS,WAAY,EAAW,MAAO;IAMlE,IAJI,IAAc,KAChB,EAAK,KAAM,EAAW,UAAW,GAAW,CAAW,CAAC,GAGtD,IAAY,GAAW;KACzB,IAAA,IAAgB,EAAW,UAAW,GAAa,CAAS;KAC5D,EAAK,KAAM,kBAAA,UAAA,EAAA,UAAqB,EAAiB,GAAzB,CAAyB,CAAA;IAAC;IAGpD,IAAY,KAAI,IAAK,GAAW,CAAS;GAAhC,CACV,GAEG,IAAY,EAAW,UACzB,EAAK,KAAM,EAAW,UAAW,CAAS,CAAC;EAC5C;EAAA,AAAA,EAAA,KAAA,GAAA,EAAA,KAAA,GAAA,EAAA,KAAA,GAAA,EAAA,KAAA;CAAA,OAAA,AAAA,IAAA,EAAA,IAAA,IAAA,EAAA,IAAA,IAAA,EAAA;CAAA,IAAA,MAAA,OAAA,IAAA,6BAAA,GAAA,OAAA;CAED,IAAI,EAAK,WAAY,GAAC;EAAA,IAAA;EACK,OADL,EAAA,OAAA,IACK,IAAA,EAAA,MAAlB,IAAA,kBAAA,GAAA,EAAA,UAAG,EAAW,CAAA,GAAI,EAAA,KAAA,GAAA,EAAA,KAAA,IAAlB;CAAkB;CAC1B,IAAA;CAEkB,OAFlB,EAAA,OAAA,IAEkB,IAAA,EAAA,MAAZ,IAAA,kBAAA,GAAA,EAAA,UAAG,EAAK,CAAA,GAAI,EAAA,KAAA,GAAA,EAAA,KAAA,IAAZ;AAAY,GAGf,KACJ,GACA,MAEI,CAAC,EAAW,SAAS,EAAW,MAAM,WAAW,KAIjD,CAAC,KAAgB,EAAa,SAAS,KAIpC,EAAW,MAAM,MAAK,MAAQ,EAAa,IAAI,CAAI,CAAC,GAGvD,KAA0B,MAC9B,EAAW,OAAO,MAAK,MAAQ,MAAS,mBAAmB,MAAS,mBAAmB,KAAK,IAExF,KAAmB,GAAgD,MACvE,EAAW,WAAW,GAAG,EAAW,MAAM,QAAQ,aAAY,GAAI,KAE9D,KAAwB,MAAsD;CAClF,IAAM,oBAAM,IAAI,IAAgD;CAchE,OAZA,EAAY,SAAQ,MAAc;EAChC,IAAM,IAAM,EAAW;EAElB,MAIA,EAAI,IAAI,CAAG,KACd,EAAI,IAAI,GAAK,CAAU;CAE3B,CAAC,GAEM,MAAM,KAAK,EAAI,OAAO,CAAC;AAChC,GAEM,KACJ,GACA,MACG,EAAY,QAAO,MAAc,EAAoB,GAAY,CAAY,CAAC,GAE7E,KAAmB,MACvB,EAAY,MAAM,GAAG,OACD,EAAE,kBAAkB,aACpB,EAAE,kBAAkB,SAGvC,GAEG,KACJ,GACA,MACG,EAAgB,EAAuB,EAAqB,CAAW,GAAG,CAAY,CAAC,GAEtF,KAAgB,GAAgD,MACpD,EAAe,CACxB,CAAA,CAAQ,YAAY,MAAM,EAAM,KAAK,CAAC,CAAC,YAAY,GAG/C,KAA4B,EACvC,OACA,UACA,gBACA,UACA,kBACA,aACA,SACA,cACA,qBACA,qBACA,wBACA,iBACA,0BAeI;CACJ,IAAM,CAAC,GAAY,KAAiB,EAAS,KAAS,EAAE,GAClD,CAAC,GAAa,KAAkB,EAA+C,CAAA,CAAE,GACjF,CAAC,GAAgB,KAAqB,EAAS,EAAK,GACpD,CAAC,GAAkB,KAAuB,EAAS,EAAE,GACrD,CAAC,GAAW,KAAgB,EAAS,EAAK,GAE1C,IAAW,EAAyB,IAAI,GACxC,IAAc,EAAyB,IAAI,GAC3C,IAAc,EAAO,EAAK,GAC1B,IAAe,EAAO,EAAK,GAC3B,IAAkB,EAA2D,IAAI,GACjF,IAA0B,kBAAO,IAAI,IAAyC,CAAC,GAC/E,IAAa,EAAiC,CAAA,CAAE,GAChD,IAAoB,EAAuB,QAAQ,GACnD,IAAgB,EAAe,UAAU,CAAgB,GACzD,IAAkB,QAAc;EACpC,IAAI,CAAC,GACH,OAAO;EAGT,IAAM,oBAAS,IAAI,IAAY;EAC/B,KAAK,IAAM,KAAQ,GACjB,EAAO,IAAI,CAAI;EAEjB,OAAO;CACT,GAAG,CAAC,CAAY,CAAC;CAqJjB,AAnJA,QAAgB;EAEd,AADA,EAAc,KAAS,EAAE,GACzB,EAAa,UAAU;CACzB,GAAG,CAAC,CAAK,CAAC,GAEV,QAAgB;EACd,IAAI,EAAY,SAAS;GACvB,EAAY,UAAU;GACtB;EACF;EAEA,IAAM,IAAU,EAAW,KAAK;EAEhC,AACE,EADE,MAAY,EAGG;EAGnB,IAAI,IAAW,IAET,IAAU,iBAAiB;GAC/B,IAAI,CAAC,GACH;GAGF,IAAI,MAAY,IAAI;IAIlB,AAHA,EAAe,CAAA,CAAE,GACjB,EAAkB,EAAK,GACvB,EAAgB,UAAU,MACtB,MAAU,MACZ,EAAc,EAAE;IAElB;GACF;GAEA,IAAI,CAAC,GAAe;GAEpB,IAAM,EAAE,2BAAwB,gCAA6B;GAE7D,IAAI,CAAC,KAA0B,CAAC,GAA0B;IAIxD,AAHA,QAAQ,MAAM,8FAA8F,GAC5G,EAAe,CAAA,CAAE,GACjB,EAAkB,EAAK,GACvB,EAAa,EAAK;IAClB;GACF;GAEA,AACE,EAAgB,YAAU,IAAI,EAAyB;GAGzD,IAAM,IAAkD;IACtD,OAAO;IACP,cAAc,EAAgB,WAAW,KAAA;IACzC,qBAAqB,CAAC,IAAI;GAC5B;GAKA,AAJI,MACF,EAAQ,sBAAsB,IAGhC,EAAuB,6BAA6B,CAAO,CAAC,CACzD,KAAK,OAAO,MAA2E;IACtF,IAAI,CAAC,GACH;IAOF,IAAM,IAAsB,EAJH,EAAS,YAC/B,KAAK,MAA0D,EAAW,eAAe,CAAC,CAC1F,QAAQ,MAAiE,EAAQ,CAEhC,GAAkB,CAAe;IAgCrF,IA/BA,MAAM,QAAQ,IAAI,EAAoB,IAAI,OAAMK,MAAc;KAC5D,IAAM,IAAUA,EAAW;KAC3B,IAAI,CAAC,KAAW,CAAC,EAAuBA,CAAU,GAChD;KAGF,IAAI,IAAsB,EAAwB,QAAQ,IAAI,CAAO;KACrE,AAAK,MACH,KAAuB,YAAY;MACjC,IAAI;OAGF,IAAM,KAAmB,MAFXA,EAAW,QACJ,CAAA,CAAM,YAAY,EAAE,QAAQ,CAAC,kBAAkB,EAAE,CAAC,EAAA,CACvC,MAAM,kBAAkB,KAAK,GACvD,IAAYA,EAAW,UAAU,MAAM,KAAK;OAElD,OADI,CAAC,KAAoB,CAAC,IAAW,SAC9B,GAAG,EAAS,IAAK;MAC1B,SAAS,GAAO;OAEd,AADA,EAAwB,QAAQ,OAAO,CAAO,GAC9C,QAAQ,MAAM,wDAAwD,CAAK;OAC3E;MACF;KACF,EAAA,CAAG,GACH,EAAwB,QAAQ,IAAI,GAAS,CAAmB;KAGlE,IAAM,IAAe,MAAM;KAC3B,AAAI,KACF,EAAyB,IAAIA,GAAY,CAAY;IAEzD,CAAC,CAAC,GAEE,CAAC,GACH;IAGF,IAAM,IAAmB,EAAoB,IACvC,IACJ,KAAoB,EAAoB,WAAW,KAAK,EAAa,GAAkB,CAAU;IAEnG,IAAI,CAAC,EAAa,WAAW,GAAe;KAG1C,AAFA,EAAe,CAAmB,GAClC,EAAkB,EAAK,GACvB,EAAa,EAAK;KAClB;IACF;IAYA,AAVI,EAAoB,SAAS,KAC/B,EAAe,CAAmB,GAC9B,EAAa,WACf,EAAkB,EAAI,GAExB,EAAoB,EAAE,MAEtB,EAAe,CAAA,CAAE,GACjB,EAAkB,EAAK,IAEzB,EAAa,EAAK;GACpB,CAAC,CAAC,CACD,OAAOC,MAAmB;IACpB,MAGL,QAAQ,MAAM,qDAAqDA,CAAK,GACxE,EAAe,CAAA,CAAE,GACjB,EAAkB,EAAK,GACvB,EAAa,EAAK;GACpB,CAAC;EACL,GAAG,GAAG;EAEN,aAAa;GAEX,AADA,IAAW,IACX,aAAa,CAAO;EACtB;CACF,GAAG;EAAC;EAAY;EAAe;EAAe;EAAO;EAAqB;CAAe,CAAC,GAE1F,QAAgB;EACd,IAAM,KAAsB,MAAsB;GAChD,AACE,EAAS,WACT,CAAC,EAAS,QAAQ,SAAS,EAAM,MAAc,KAC/C,EAAY,WACZ,CAAC,EAAY,QAAQ,SAAS,EAAM,MAAc,KAElD,EAAkB,EAAK;EAE3B;EAEA,OADA,SAAS,iBAAiB,aAAa,CAAkB,SAC5C;GACX,SAAS,oBAAoB,aAAa,CAAkB;EAC9D;CACF,GAAG,CAAA,CAAE;CAEL,IAAM,KAA0BD,MAAmD;EACjF,EAAY,UAAU;EACtB,IAAM,IAAa,EAAeA,CAAU;EAM5C,AALA,EAAc,CAAU,GACxB,EAAc,CAAU,GACxB,EAAe,CAAA,CAAE,GACjB,EAAkB,EAAK,GACvB,EAAa,EAAK,GAClB,EAAgB,UAAU;CAC5B,GAEM,KAAqB,MAAqC;EAE9D,AADA,EAAa,UAAU,IACvB,EAAc,EAAE,OAAO,KAAK;CAC9B,GAEM,MAAiBE,MAAuC;EAC5D,IAAI,CAAC,KAAkB,EAAY,WAAW,GAAG;GAC/C,AAAIA,EAAE,QAAQ,YACZA,EAAE,eAAe,GACjB,EAAc,CAAU,GACxB,EAAkB,EAAK,GACvB,EAAgB,UAAU;GAE5B;EACF;EAEA,AAAIA,EAAE,QAAQ,eACZ,EAAkB,UAAUA,EAAE,SAAS,SAAS,UAChDA,EAAE,eAAe,GACjB,GAAoB,MACd,EAAY,WAAW,IAClB,KAEF,IAAO,IAAI,KAAK,IAAO,KAAK,EAAY,MAChD,KACQA,EAAE,QAAQ,aACnB,EAAkB,UAAUA,EAAE,SAAS,SAAS,UAChDA,EAAE,eAAe,GACjB,GAAoBC,MACd,EAAY,WAAW,IAClB,KAELA,KAAQ,IACH,EAAY,SAAS,KAEtBA,IAAO,KAAK,EAAY,MACjC,KACQD,EAAE,QAAQ,WACnBA,EAAE,eAAe,GACb,IAAmB,MAAM,EAAY,KACvC,EAAuB,EAAY,EAAiB,KAEpD,EAAc,CAAU,GACxB,EAAkB,EAAK,GACvB,EAAgB,UAAU,SAEnBA,EAAE,QAAQ,YACnB,EAAkB,EAAK;CAE3B,GAEM,WAAmB;EAKvB,AAJA,EAAkB,EAAK,GACnB,MAAU,KACZ,EAAc,CAAU,GAE1B,EAAgB,UAAU;CAC5B,GAEM,IAAW,MAAqB,IAAO,GAAG,EAAI,SAAU,KAAA;CAoC9D,OAlCA,QAAgB;EACd,IAAI,CAAC,KAAkB,IAAmB,GAAG;GAC3C,EAAkB,UAAU;GAC5B;EACF;EAEA,IAAM,IAAO,EAAW,QAAQ,IAC1B,IAAO,EAAY;EAEzB,IAAI,CAAC,KAAQ,CAAC,GAAM;GAClB,EAAkB,UAAU;GAC5B;EACF;EAEA,IAAM,IAAW,EAAkB;EACnC,EAAkB,UAAU;EAE5B,IAAM,IAAM,EAAK,WACX,IAAS,IAAM,EAAK,cACpB,IAAU,EAAK,WACf,IAAa,IAAU,EAAK;EAE9B,KAAO,KAAW,KAAU,KAIhC,EAAK,eAAe;GAClB,OAAO;GACP;EACF,CAAC;CACH,GAAG,CAAC,GAAkB,CAAc,CAAC,GAErC,EAAW,QAAQ,SAAS,EAAY,QAGtC,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACG,KACC,kBAAC,SAAD;IACE,UAAU;IACV,cAAa;IACb,MAAM;IACN,eAAY;IACZ,OAAO;KACL,UAAU;KACV,MAAM;KACN,KAAK;KACL,QAAQ;KACR,OAAO;IACT;GAAE,CAAA;GAGN,kBAAC,SAAD;IAAO,SAAS;IAAI,WAAU;IAC3B,UAAA;GACI,CAAA;GACP,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAAC,GAAD;KACE,KAAK;KACD;KACJ,MAAK;KACQ;KACb,MAAM,KAAQ,GAAG,EAAE;KACnB,OAAO;KACP,UAAU;KACV,WAAW;KACX,eAAe;MACb,AAAI,EAAY,SAAS,KAAK,KAC5B,EAAkB,EAAI;KAE1B;KACA,QAAQ;KACE;KACV,cAAa;KACb,WAAW,EAAG,UAAU,KAAa,QAAQ,CAAS;IAAE,CAAA,GAEzD,KACC,kBAAC,QAAD;KACE,eAAY;KACZ,WAAU;KACV,aAAU;KAET,UAAA,MAAqB,KAAA,IAAY,kBAAC,IAAD,EAAS,WAAU,yBAAwB,CAAA,IAAM;IAC/E,CAAA,CAEL;;GACJ,KAAkB,EAAY,SAAS,KACtC,kBAAC,MAAD;IACE,KAAK;IACL,WAAU;IACV,MAAK;IAEJ,UAAA,EAAY,KAAKF,GAAY,MAC5B,kBAAC,MAAD;KAEE,MAAK,MAAQ;MACX,EAAW,QAAQ,KAAS;KAC9B;KACA,WAAW,EACT,oEACA,EAAE,eAAe,MAAqB,EAAM,CAC9C;KACA,MAAK;KACL,cAAaE,MAAK;MAEhB,AADAA,EAAE,eAAe,GACjB,EAAuBF,CAAU;KACnC;KAEA,UAAA,kBAAC,GAAD,EAAgB,YAAYA,EAAW,CAAA;IACrC,GAfG,EAAgBA,GAAY,CAAK,CAepC,CACL;GACC,CAAA;EAEH;;AAET"}
1
+ {"version":3,"file":"index14.js","names":["displayText","index","matched","lastIndex","parts","prediction","error","e","prev"],"sources":["../src/components/AddressAutocompleteInput/index.tsx"],"sourcesContent":["/// <reference types=\"google.maps\" />\n\nimport { ReactNode, ChangeEvent, KeyboardEvent, useState, useEffect, useRef, useMemo } from \"react\"\nimport clsx from \"clsx\"\nimport { Loader2 } from \"lucide-react\"\n\nimport { useMapsLibrary } from \"@/helpers/useMapsLibrary\"\nimport { Input } from \"@/components/Input\"\nimport { cn } from \"@/lib/utils\"\n\n\nconst DEFAULT_ALLOWED_TYPES = new Set([\n \"street_address\",\n \"route\",\n \"premise\",\n \"subpremise\",\n \"intersection\",\n \"sublocality\",\n \"sublocality_level_1\",\n \"sublocality_level_2\",\n \"sublocality_level_3\",\n \"sublocality_level_4\",\n \"sublocality_level_5\",\n \"administrative_area_level_1\",\n \"administrative_area_level_2\",\n \"administrative_area_level_3\",\n \"administrative_area_level_4\",\n \"administrative_area_level_5\",\n \"administrative_area_level_6\",\n \"administrative_area_level_7\",\n \"postal_code\",\n \"locality\",\n \"country\",\n \"geocode\",\n \"plus_code\",\n \"political\",\n \"neighborhood\",\n \"colloquial_area\",\n \"lodging\",\n \"train_station\",\n \"transit_station\",\n])\n\nconst detailedTextByPrediction = new WeakMap<google.maps.places.PlacePrediction, string>()\n\nconst getDisplayText = (prediction: google.maps.places.PlacePrediction) => {\n const fullText = detailedTextByPrediction.get(prediction) ?? prediction.text?.text ?? \"\"\n return fullText.replace(/, France$/, \"\").trim()\n}\n\nconst PredictionItem = ({ prediction }: { prediction: google.maps.places.PlacePrediction }) => {\n const displayText = getDisplayText(prediction)\n const fullText = detailedTextByPrediction.get(prediction) ?? prediction.text?.text ?? \"\"\n const matches = prediction.text?.matches ?? []\n const wasCountryRemoved = displayText.length < fullText.length\n\n if (matches.length === 0) {\n return <>{displayText}</>\n }\n\n const parts: ReactNode[] = []\n let lastIndex = 0\n\n matches.forEach((substring, index) => {\n if (wasCountryRemoved && substring.startOffset >= displayText.length) {\n return\n }\n\n const startOffset = substring.startOffset\n const endOffset = Math.min(substring.endOffset, displayText.length)\n\n if (startOffset > lastIndex) {\n parts.push(displayText.substring(lastIndex, startOffset))\n }\n\n if (endOffset > startOffset) {\n const matched = displayText.substring(startOffset, endOffset)\n parts.push(<strong key={index}>{matched}</strong>)\n }\n\n lastIndex = Math.max(lastIndex, endOffset)\n })\n\n if (lastIndex < displayText.length) {\n parts.push(displayText.substring(lastIndex))\n }\n\n if (parts.length === 0) {\n return <>{displayText}</>\n }\n\n return <>{parts}</>\n}\n\nconst isAllowedPrediction = (\n prediction: google.maps.places.PlacePrediction,\n allowedTypes: ReadonlySet<string> | null,\n) => {\n if (!prediction.types || prediction.types.length === 0) {\n return true\n }\n\n if (!allowedTypes || allowedTypes.size === 0) {\n return true\n }\n\n return prediction.types.some(type => allowedTypes.has(type))\n}\n\nconst isNamedPlacePrediction = (prediction: google.maps.places.PlacePrediction) =>\n prediction.types?.some(type => type === \"establishment\" || type === \"point_of_interest\") ?? false\n\nconst getPredictionId = (prediction: google.maps.places.PlacePrediction, index: number) =>\n prediction.placeId || `${prediction.text?.text ?? \"prediction\"}-${index}`\n\nconst getUniquePredictions = (predictions: google.maps.places.PlacePrediction[]) => {\n const map = new Map<string, google.maps.places.PlacePrediction>()\n\n predictions.forEach(prediction => {\n const key = prediction.placeId\n\n if (!key) {\n return\n }\n\n if (!map.has(key)) {\n map.set(key, prediction)\n }\n })\n\n return Array.from(map.values())\n}\n\nconst getFilteredPredictions = (\n predictions: google.maps.places.PlacePrediction[],\n allowedTypes: ReadonlySet<string> | null,\n) => predictions.filter(prediction => isAllowedPrediction(prediction, allowedTypes))\n\nconst sortPredictions = (predictions: google.maps.places.PlacePrediction[]) =>\n predictions.sort((a, b) => {\n const aDistance = a.distanceMeters ?? Number.POSITIVE_INFINITY\n const bDistance = b.distanceMeters ?? Number.POSITIVE_INFINITY\n\n return aDistance - bDistance\n })\n\nconst buildDisplayPredictions = (\n predictions: google.maps.places.PlacePrediction[],\n allowedTypes: ReadonlySet<string> | null,\n) => sortPredictions(getFilteredPredictions(getUniquePredictions(predictions), allowedTypes))\n\nconst isExactMatch = (prediction: google.maps.places.PlacePrediction, value: string) => {\n const display = getDisplayText(prediction)\n return display.toLowerCase() === value.trim().toLowerCase()\n}\n\nexport const AddressAutocompleteInput = ({\n id,\n label,\n placeholder,\n value,\n onValueChange,\n disabled,\n name,\n className,\n autofillShimName,\n googleMapsApiKey,\n locationRestriction,\n allowedTypes,\n loadingIndicator,\n}: {\n id: string\n label: string\n placeholder: string\n value: string | undefined\n onValueChange: (value: string) => void\n disabled?: boolean\n name?: string\n className?: string\n autofillShimName?: string\n googleMapsApiKey?: string\n locationRestriction?: google.maps.LatLngBoundsLiteral | google.maps.LatLngBounds\n allowedTypes?: Iterable<string>\n loadingIndicator?: ReactNode\n}) => {\n const [inputValue, setInputValue] = useState(value ?? \"\")\n const [predictions, setPredictions] = useState<google.maps.places.PlacePrediction[]>([])\n const [isDropdownOpen, setIsDropdownOpen] = useState(false)\n const [highlightedIndex, setHighlightedIndex] = useState(-1)\n const [isLoading, setIsLoading] = useState(false)\n\n const inputRef = useRef<HTMLInputElement>(null)\n const dropdownRef = useRef<HTMLUListElement>(null)\n const isSelecting = useRef(false)\n const hasUserTyped = useRef(false)\n const sessionTokenRef = useRef<google.maps.places.AutocompleteSessionToken | null>(null)\n const detailedTextRequestsRef = useRef(new Map<string, Promise<string | undefined>>())\n const optionRefs = useRef<(HTMLLIElement | null)[]>([])\n const scrollBehaviorRef = useRef<ScrollBehavior>(\"smooth\")\n const valueRef = useRef(value)\n const onValueChangeRef = useRef(onValueChange)\n const placesLibrary = useMapsLibrary(\"places\", googleMapsApiKey)\n const allowedTypesSet = useMemo(() => {\n if (!allowedTypes) {\n return DEFAULT_ALLOWED_TYPES\n }\n\n const newSet = new Set<string>()\n for (const type of allowedTypes) {\n newSet.add(type)\n }\n return newSet\n }, [allowedTypes])\n\n useEffect(() => {\n setInputValue(value ?? \"\")\n hasUserTyped.current = false\n }, [value])\n\n useEffect(() => {\n valueRef.current = value\n onValueChangeRef.current = onValueChange\n }, [onValueChange, value])\n\n useEffect(() => {\n if (isSelecting.current) {\n isSelecting.current = false\n return\n }\n\n const trimmed = inputValue.trim()\n\n if (trimmed === \"\") {\n setIsLoading(false)\n } else {\n setIsLoading(true)\n }\n\n let isActive = true\n\n const handler = setTimeout(() => {\n if (!isActive) {\n return\n }\n\n if (trimmed === \"\") {\n setPredictions([])\n setIsDropdownOpen(false)\n sessionTokenRef.current = null\n if (valueRef.current !== \"\") {\n onValueChangeRef.current(\"\")\n }\n return\n }\n\n if (!placesLibrary) return\n\n const { AutocompleteSuggestion, AutocompleteSessionToken } = placesLibrary\n\n if (!AutocompleteSuggestion || !AutocompleteSessionToken) {\n console.error(\"AddressAutocompleteInput: missing AutocompleteSuggestion or AutocompleteSessionToken exports\")\n setPredictions([])\n setIsDropdownOpen(false)\n setIsLoading(false)\n return\n }\n\n if (!sessionTokenRef.current) {\n sessionTokenRef.current = new AutocompleteSessionToken()\n }\n\n const request: google.maps.places.AutocompleteRequest = {\n input: inputValue,\n sessionToken: sessionTokenRef.current ?? undefined,\n includedRegionCodes: [\"fr\"],\n }\n if (locationRestriction) {\n request.locationRestriction = locationRestriction\n }\n\n AutocompleteSuggestion.fetchAutocompleteSuggestions(request)\n .then(async (response: { suggestions: google.maps.places.AutocompleteSuggestion[] }) => {\n if (!isActive) {\n return\n }\n\n const placePredictions = response.suggestions\n .map((suggestion: google.maps.places.AutocompleteSuggestion) => suggestion.placePrediction)\n .filter((prediction): prediction is google.maps.places.PlacePrediction => Boolean(prediction))\n\n const combinedPredictions = buildDisplayPredictions(placePredictions, allowedTypesSet)\n await Promise.all(combinedPredictions.map(async prediction => {\n const placeId = prediction.placeId\n if (!placeId || !isNamedPlacePrediction(prediction)) {\n return\n }\n\n let detailedTextRequest = detailedTextRequestsRef.current.get(placeId)\n if (!detailedTextRequest) {\n detailedTextRequest = (async () => {\n try {\n const place = prediction.toPlace()\n const result = await place.fetchFields({ fields: [\"formattedAddress\"] })\n const formattedAddress = result.place.formattedAddress?.trim()\n const placeName = prediction.mainText?.text?.trim()\n if (!formattedAddress || !placeName) return undefined\n return `${placeName}, ${formattedAddress}`\n } catch (error) {\n detailedTextRequestsRef.current.delete(placeId)\n console.error(\"AddressAutocompleteInput: place details fetch failed\", error)\n return undefined\n }\n })()\n detailedTextRequestsRef.current.set(placeId, detailedTextRequest)\n }\n\n const detailedText = await detailedTextRequest\n if (detailedText) {\n detailedTextByPrediction.set(prediction, detailedText)\n }\n }))\n\n if (!isActive) {\n return\n }\n\n const singlePrediction = combinedPredictions[0]\n const hasExactMatch =\n singlePrediction && combinedPredictions.length === 1 && isExactMatch(singlePrediction, inputValue)\n\n if (!hasUserTyped.current && hasExactMatch) {\n setPredictions(combinedPredictions)\n setIsDropdownOpen(false)\n setIsLoading(false)\n return\n }\n\n if (combinedPredictions.length > 0) {\n setPredictions(combinedPredictions)\n if (hasUserTyped.current) {\n setIsDropdownOpen(true)\n }\n setHighlightedIndex(-1)\n } else {\n setPredictions([])\n setIsDropdownOpen(false)\n }\n setIsLoading(false)\n })\n .catch((error: unknown) => {\n if (!isActive) {\n return\n }\n console.error(\"AddressAutocompleteInput: suggestion fetch failed\", error)\n setPredictions([])\n setIsDropdownOpen(false)\n setIsLoading(false)\n })\n }, 300)\n\n return () => {\n isActive = false\n clearTimeout(handler)\n }\n }, [inputValue, placesLibrary, locationRestriction, allowedTypesSet])\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n inputRef.current &&\n !inputRef.current.contains(event.target as Node) &&\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n setIsDropdownOpen(false)\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside)\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside)\n }\n }, [])\n\n const handleSelectPrediction = (prediction: google.maps.places.PlacePrediction) => {\n isSelecting.current = true\n const newAddress = getDisplayText(prediction)\n setInputValue(newAddress)\n onValueChange(newAddress)\n setPredictions([])\n setIsDropdownOpen(false)\n setIsLoading(false)\n sessionTokenRef.current = null\n }\n\n const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n hasUserTyped.current = true\n setInputValue(e.target.value)\n }\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (!isDropdownOpen || predictions.length === 0) {\n if (e.key === \"Enter\") {\n e.preventDefault()\n onValueChange(inputValue)\n setIsDropdownOpen(false)\n sessionTokenRef.current = null\n }\n return\n }\n\n if (e.key === \"ArrowDown\") {\n scrollBehaviorRef.current = e.repeat ? \"auto\" : \"smooth\"\n e.preventDefault()\n setHighlightedIndex(prev => {\n if (predictions.length === 0) {\n return -1\n }\n return prev < 0 ? 0 : (prev + 1) % predictions.length\n })\n } else if (e.key === \"ArrowUp\") {\n scrollBehaviorRef.current = e.repeat ? \"auto\" : \"smooth\"\n e.preventDefault()\n setHighlightedIndex(prev => {\n if (predictions.length === 0) {\n return -1\n }\n if (prev <= 0) {\n return predictions.length - 1\n }\n return (prev - 1) % predictions.length\n })\n } else if (e.key === \"Enter\") {\n e.preventDefault()\n if (highlightedIndex > -1 && predictions[highlightedIndex]) {\n handleSelectPrediction(predictions[highlightedIndex])\n } else {\n onValueChange(inputValue)\n setIsDropdownOpen(false)\n sessionTokenRef.current = null\n }\n } else if (e.key === \"Escape\") {\n setIsDropdownOpen(false)\n }\n }\n\n const handleBlur = () => {\n setIsDropdownOpen(false)\n if (value !== inputValue) {\n onValueChange(inputValue)\n }\n sessionTokenRef.current = null\n }\n\n const shimName = autofillShimName ?? (name ? `${name}_shim` : undefined)\n\n useEffect(() => {\n if (!isDropdownOpen || highlightedIndex < 0) {\n scrollBehaviorRef.current = \"smooth\"\n return\n }\n\n const item = optionRefs.current[highlightedIndex]\n const list = dropdownRef.current\n\n if (!item || !list) {\n scrollBehaviorRef.current = \"smooth\"\n return\n }\n\n const behavior = scrollBehaviorRef.current\n scrollBehaviorRef.current = \"smooth\"\n\n const top = item.offsetTop\n const bottom = top + item.offsetHeight\n const viewTop = list.scrollTop\n const viewBottom = viewTop + list.clientHeight\n\n if (top >= viewTop && bottom <= viewBottom) {\n return\n }\n\n item.scrollIntoView({\n block: \"nearest\",\n behavior,\n })\n }, [highlightedIndex, isDropdownOpen])\n\n optionRefs.current.length = predictions.length\n\n return (\n <div className=\"relative\">\n {shimName && (\n <input\n tabIndex={-1}\n autoComplete=\"street-address\"\n name={shimName}\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n left: \"-9999px\",\n top: \"-9999px\",\n height: \"1px\",\n width: \"1px\",\n }}\n />\n )}\n <label htmlFor={id} className=\"text-left block text-sm font-medium text-gray-700 mb-1 cursor-pointer\">\n {label}\n </label>\n <div className=\"relative\">\n <Input\n ref={inputRef}\n id={id}\n type=\"text\"\n placeholder={placeholder}\n name={name ?? `${id}_input`}\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onFocus={() => {\n if (predictions.length > 0 && inputValue) {\n setIsDropdownOpen(true)\n }\n }}\n onBlur={handleBlur}\n disabled={disabled}\n autoComplete=\"new-password\"\n className={cn(\"w-full\", isLoading && \"pr-9\", className)}\n />\n {isLoading && (\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute right-3 top-1/2 flex size-4 -translate-y-1/2 items-center justify-center text-gray-400\"\n data-slot=\"address-autocomplete-loading-indicator\"\n >\n {loadingIndicator === undefined ? <Loader2 className=\"size-full animate-spin\" /> : loadingIndicator}\n </span>\n )}\n </div>\n {isDropdownOpen && predictions.length > 0 && (\n <ul\n ref={dropdownRef}\n className=\"absolute z-10 mt-1 w-full max-h-60 overflow-y-auto rounded-md border border-gray-200 bg-white text-left shadow-lg\"\n role=\"listbox\"\n >\n {predictions.map((prediction, index) => (\n <li\n key={getPredictionId(prediction, index)}\n ref={node => {\n optionRefs.current[index] = node\n }}\n className={clsx(\n \"cursor-pointer px-3 py-2 text-sm text-gray-700 hover:bg-gray-100\",\n { \"bg-gray-100\": highlightedIndex === index },\n )}\n role=\"option\"\n onMouseDown={e => {\n e.preventDefault()\n handleSelectPrediction(prediction)\n }}\n >\n <PredictionItem prediction={prediction} />\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rpcbase/ui",
3
- "version": "0.281.0",
3
+ "version": "0.282.0",
4
4
  "license": "SEE LICENSE IN LICENSE",
5
5
  "type": "module",
6
6
  "sideEffects": [