@rpcbase/ui 0.218.0 → 0.219.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.
- package/dist/components/AddressAutocompleteInput/index.d.ts.map +1 -1
- package/dist/index10.js +3 -3
- package/dist/index100.js +4 -5
- package/dist/index100.js.map +1 -1
- package/dist/index101.js +8 -4
- package/dist/index101.js.map +1 -1
- package/dist/index102.js +5 -8
- package/dist/index102.js.map +1 -1
- package/dist/index103.js +4 -5
- package/dist/index103.js.map +1 -1
- package/dist/index104.js +3 -3
- package/dist/index104.js.map +1 -1
- package/dist/index105.js +6 -4
- package/dist/index105.js.map +1 -1
- package/dist/index106.js +145 -6
- package/dist/index106.js.map +1 -1
- package/dist/index107.js +38 -144
- package/dist/index107.js.map +1 -1
- package/dist/index108.js +4 -39
- package/dist/index108.js.map +1 -1
- package/dist/index109.js +7 -4
- package/dist/index109.js.map +1 -1
- package/dist/index11.js +2 -2
- package/dist/index110.js +12 -6
- package/dist/index110.js.map +1 -1
- package/dist/index111.js +13 -13
- package/dist/index111.js.map +1 -1
- package/dist/index112.js +7 -13
- package/dist/index112.js.map +1 -1
- package/dist/index113.js +30 -6
- package/dist/index113.js.map +1 -1
- package/dist/index114.js +10 -31
- package/dist/index114.js.map +1 -1
- package/dist/index115.js +10 -10
- package/dist/index115.js.map +1 -1
- package/dist/index116.js +8 -10
- package/dist/index116.js.map +1 -1
- package/dist/index117.js +13 -8
- package/dist/index117.js.map +1 -1
- package/dist/index118.js +101 -13
- package/dist/index118.js.map +1 -1
- package/dist/index119.js +20 -102
- package/dist/index119.js.map +1 -1
- package/dist/index12.js +3 -3
- package/dist/index120.js +54 -20
- package/dist/index120.js.map +1 -1
- package/dist/index121.js +70 -51
- package/dist/index121.js.map +1 -1
- package/dist/index122.js +9 -72
- package/dist/index122.js.map +1 -1
- package/dist/index123.js +20 -9
- package/dist/index123.js.map +1 -1
- package/dist/index124.js +16 -20
- package/dist/index124.js.map +1 -1
- package/dist/index125.js +23 -16
- package/dist/index125.js.map +1 -1
- package/dist/index126.js +6 -23
- package/dist/index126.js.map +1 -1
- package/dist/index127.js +5 -6
- package/dist/index127.js.map +1 -1
- package/dist/index128.js +23 -5
- package/dist/index128.js.map +1 -1
- package/dist/index129.js +35 -24
- package/dist/index129.js.map +1 -1
- package/dist/index13.js +2 -2
- package/dist/index130.js +16 -35
- package/dist/index130.js.map +1 -1
- package/dist/index131.js +7 -16
- package/dist/index131.js.map +1 -1
- package/dist/index132.js +4 -6
- package/dist/index132.js.map +1 -1
- package/dist/index133.js +4 -4
- package/dist/index133.js.map +1 -1
- package/dist/index134.js +4 -4
- package/dist/index134.js.map +1 -1
- package/dist/index135.js +4 -4
- package/dist/index135.js.map +1 -1
- package/dist/index136.js +3 -4
- package/dist/index136.js.map +1 -1
- package/dist/index137.js +6 -3
- package/dist/index137.js.map +1 -1
- package/dist/index138.js +24 -7
- package/dist/index138.js.map +1 -1
- package/dist/index139.js +8 -24
- package/dist/index139.js.map +1 -1
- package/dist/index14.js +2 -2
- package/dist/index140.js +6 -7
- package/dist/index140.js.map +1 -1
- package/dist/index141.js +5 -6
- package/dist/index141.js.map +1 -1
- package/dist/index142.js +3 -5
- package/dist/index142.js.map +1 -1
- package/dist/index143.js +3 -3
- package/dist/index143.js.map +1 -1
- package/dist/index144.js +4 -3
- package/dist/index144.js.map +1 -1
- package/dist/index145.js +3 -4
- package/dist/index145.js.map +1 -1
- package/dist/index146.js +4 -3
- package/dist/index146.js.map +1 -1
- package/dist/index147.js +3 -4
- package/dist/index147.js.map +1 -1
- package/dist/index148.js +3 -3
- package/dist/index148.js.map +1 -1
- package/dist/index149.js +3 -3
- package/dist/index149.js.map +1 -1
- package/dist/index15.js +2 -2
- package/dist/index150.js +46 -3
- package/dist/index150.js.map +1 -1
- package/dist/index151.js +2 -2
- package/dist/index153.js +2 -2
- package/dist/index154.js +1 -1
- package/dist/index16.js +2 -2
- package/dist/index17.js +1 -1
- package/dist/index18.js +7 -7
- package/dist/index181.js +1 -1
- package/dist/index19.js +3 -3
- package/dist/index21.js +1 -1
- package/dist/index22.js +2 -2
- package/dist/index228.js +1 -1
- package/dist/index229.js +1 -1
- package/dist/index23.js +1 -1
- package/dist/index231.js +1 -1
- package/dist/index233.js +1 -1
- package/dist/index234.js +1 -1
- package/dist/index235.js +4 -4
- package/dist/index236.js +2 -2
- package/dist/index24.js +1 -1
- package/dist/index25.js +1 -1
- package/dist/index269.js +1 -1
- package/dist/index271.js +4 -4
- package/dist/index28.js +2 -2
- package/dist/index29.js +3 -37
- package/dist/index29.js.map +1 -1
- package/dist/index294.js +69 -65
- package/dist/index294.js.map +1 -1
- package/dist/index295.js +8 -68
- package/dist/index295.js.map +1 -1
- package/dist/index296.js +14 -9
- package/dist/index296.js.map +1 -1
- package/dist/index297.js +66 -14
- package/dist/index297.js.map +1 -1
- package/dist/index298.js +64 -65
- package/dist/index298.js.map +1 -1
- package/dist/index3.js +92 -86
- package/dist/index3.js.map +1 -1
- package/dist/index30.js +125 -3
- package/dist/index30.js.map +1 -1
- package/dist/index31.js +227 -120
- package/dist/index31.js.map +1 -1
- package/dist/index32.js +21 -229
- package/dist/index32.js.map +1 -1
- package/dist/index33.js +50 -23
- package/dist/index33.js.map +1 -1
- package/dist/index34.js +21 -50
- package/dist/index34.js.map +1 -1
- package/dist/index35.js +126 -18
- package/dist/index35.js.map +1 -1
- package/dist/index36.js +205 -113
- package/dist/index36.js.map +1 -1
- package/dist/index37.js +74 -205
- package/dist/index37.js.map +1 -1
- package/dist/index38.js +115 -87
- package/dist/index38.js.map +1 -1
- package/dist/index39.js +5 -118
- package/dist/index39.js.map +1 -1
- package/dist/index4.js +2 -2
- package/dist/index40.js +819 -5
- package/dist/index40.js.map +1 -1
- package/dist/index41.js +56 -819
- package/dist/index41.js.map +1 -1
- package/dist/index42.js +37 -57
- package/dist/index42.js.map +1 -1
- package/dist/index45.js +1 -1
- package/dist/index46.js +1 -1
- package/dist/index49.js +1 -1
- package/dist/index5.js +2 -2
- package/dist/index50.js +1 -1
- package/dist/index51.js +7 -2
- package/dist/index51.js.map +1 -1
- package/dist/index52.js +34 -2
- package/dist/index52.js.map +1 -1
- package/dist/index53.js +49 -2
- package/dist/index53.js.map +1 -1
- package/dist/index54.js +8 -2
- package/dist/index54.js.map +1 -1
- package/dist/index55.js +11 -6
- package/dist/index55.js.map +1 -1
- package/dist/index56.js +2 -34
- package/dist/index56.js.map +1 -1
- package/dist/index57.js +2 -49
- package/dist/index57.js.map +1 -1
- package/dist/index58.js +3 -7
- package/dist/index58.js.map +1 -1
- package/dist/index59.js +47 -11
- package/dist/index59.js.map +1 -1
- package/dist/index6.js +5 -5
- package/dist/index60.js +50 -3
- package/dist/index60.js.map +1 -1
- package/dist/index61.js +7 -47
- package/dist/index61.js.map +1 -1
- package/dist/index62.js +12 -48
- package/dist/index62.js.map +1 -1
- package/dist/index63.js +133 -7
- package/dist/index63.js.map +1 -1
- package/dist/index64.js +10 -14
- package/dist/index64.js.map +1 -1
- package/dist/index65.js +210 -127
- package/dist/index65.js.map +1 -1
- package/dist/index66.js +12 -10
- package/dist/index66.js.map +1 -1
- package/dist/index67.js +44 -214
- package/dist/index67.js.map +1 -1
- package/dist/index68.js +49 -12
- package/dist/index68.js.map +1 -1
- package/dist/index69.js +4 -47
- package/dist/index69.js.map +1 -1
- package/dist/index7.js +2 -2
- package/dist/index70.js +5 -49
- package/dist/index70.js.map +1 -1
- package/dist/index71.js +28 -4
- package/dist/index71.js.map +1 -1
- package/dist/index72.js +50 -6
- package/dist/index72.js.map +1 -1
- package/dist/index73.js +9 -28
- package/dist/index73.js.map +1 -1
- package/dist/index74.js +2 -50
- package/dist/index74.js.map +1 -1
- package/dist/index75.js +2 -9
- package/dist/index75.js.map +1 -1
- package/dist/index79.js +52 -47
- package/dist/index79.js.map +1 -1
- package/dist/index8.js +3 -3
- package/dist/index80.js +5 -52
- package/dist/index80.js.map +1 -1
- package/dist/index81.js +4 -4
- package/dist/index81.js.map +1 -1
- package/dist/index82.js +15 -4
- package/dist/index82.js.map +1 -1
- package/dist/index83.js +5 -15
- package/dist/index83.js.map +1 -1
- package/dist/index84.js +7 -5
- package/dist/index84.js.map +1 -1
- package/dist/index85.js +15 -6
- package/dist/index85.js.map +1 -1
- package/dist/index86.js +4 -16
- package/dist/index86.js.map +1 -1
- package/dist/index87.js +1 -1
- package/dist/index87.js.map +1 -1
- package/dist/index88.js +5 -4
- package/dist/index88.js.map +1 -1
- package/dist/index89.js +4 -4
- package/dist/index89.js.map +1 -1
- package/dist/index9.js +1 -1
- package/dist/index90.js +4 -5
- package/dist/index90.js.map +1 -1
- package/dist/index91.js +2 -2
- package/dist/index91.js.map +1 -1
- package/dist/index92.js +5 -3
- package/dist/index92.js.map +1 -1
- package/dist/index93.js +24 -6
- package/dist/index93.js.map +1 -1
- package/dist/index94.js +6 -24
- package/dist/index94.js.map +1 -1
- package/dist/index95.js +4 -6
- package/dist/index95.js.map +1 -1
- package/dist/index96.js +5 -3
- package/dist/index96.js.map +1 -1
- package/dist/index97.js +5 -6
- package/dist/index97.js.map +1 -1
- package/dist/index98.js +4 -5
- package/dist/index98.js.map +1 -1
- package/dist/index99.js +4 -3
- package/dist/index99.js.map +1 -1
- package/package.json +1 -1
package/dist/index3.js
CHANGED
|
@@ -1,74 +1,75 @@
|
|
|
1
|
-
import { j as c } from "./
|
|
2
|
-
import { c as
|
|
3
|
-
import { useState as
|
|
4
|
-
import { clsx as
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
import { j as c } from "./index28.js";
|
|
2
|
+
import { c as Z } from "./index29.js";
|
|
3
|
+
import { useState as S, useRef as w, useMemo as ee, useEffect as O } from "react";
|
|
4
|
+
import { clsx as te } from "./index26.js";
|
|
5
|
+
import { Loader2 as re } from "lucide-react";
|
|
6
|
+
import { useMapsLibrary as se } from "./index22.js";
|
|
7
|
+
import { Input as ne } from "./index14.js";
|
|
8
|
+
import { cn as oe } from "./index2.js";
|
|
9
|
+
const le = /* @__PURE__ */ new Set(["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"]), q = (n) => (n.text?.text ?? "").replace(/, France$/, "").trim(), ie = (n) => {
|
|
10
|
+
const e = Z.c(8), {
|
|
10
11
|
prediction: l
|
|
11
12
|
} = n;
|
|
12
|
-
let r, o,
|
|
13
|
+
let r, o, m;
|
|
13
14
|
if (e[0] !== l) {
|
|
14
|
-
|
|
15
|
+
m = /* @__PURE__ */ Symbol.for("react.early_return_sentinel");
|
|
15
16
|
e: {
|
|
16
|
-
r =
|
|
17
|
-
const h = l.text?.text ?? "",
|
|
18
|
-
if (
|
|
19
|
-
|
|
17
|
+
r = q(l);
|
|
18
|
+
const h = l.text?.text ?? "", P = l.text?.matches ?? [], F = r.length < h.length;
|
|
19
|
+
if (P.length === 0) {
|
|
20
|
+
m = /* @__PURE__ */ c.jsx(c.Fragment, { children: r });
|
|
20
21
|
break e;
|
|
21
22
|
}
|
|
22
23
|
o = [];
|
|
23
24
|
let f = 0;
|
|
24
|
-
|
|
25
|
+
P.forEach((y, u) => {
|
|
25
26
|
if (F && y.startOffset >= r.length)
|
|
26
27
|
return;
|
|
27
28
|
const g = y.startOffset, i = Math.min(y.endOffset, r.length);
|
|
28
29
|
if (g > f && o.push(r.substring(f, g)), i > g) {
|
|
29
|
-
const
|
|
30
|
-
o.push(/* @__PURE__ */ c.jsx("strong", { children:
|
|
30
|
+
const d = r.substring(g, i);
|
|
31
|
+
o.push(/* @__PURE__ */ c.jsx("strong", { children: d }, u));
|
|
31
32
|
}
|
|
32
33
|
f = Math.max(f, i);
|
|
33
34
|
}), f < r.length && o.push(r.substring(f));
|
|
34
35
|
}
|
|
35
|
-
e[0] = l, e[1] = r, e[2] = o, e[3] =
|
|
36
|
+
e[0] = l, e[1] = r, e[2] = o, e[3] = m;
|
|
36
37
|
} else
|
|
37
|
-
r = e[1], o = e[2],
|
|
38
|
-
if (
|
|
39
|
-
return
|
|
38
|
+
r = e[1], o = e[2], m = e[3];
|
|
39
|
+
if (m !== /* @__PURE__ */ Symbol.for("react.early_return_sentinel"))
|
|
40
|
+
return m;
|
|
40
41
|
if (o.length === 0) {
|
|
41
42
|
let h;
|
|
42
43
|
return e[4] !== r ? (h = /* @__PURE__ */ c.jsx(c.Fragment, { children: r }), e[4] = r, e[5] = h) : h = e[5], h;
|
|
43
44
|
}
|
|
44
45
|
let p;
|
|
45
46
|
return e[6] !== o ? (p = /* @__PURE__ */ c.jsx(c.Fragment, { children: o }), e[6] = o, e[7] = p) : p = e[7], p;
|
|
46
|
-
},
|
|
47
|
+
}, ce = (n, e) => !n.types || n.types.length === 0 || !e || e.size === 0 ? !0 : n.types.some((l) => e.has(l)), ae = (n, e) => n.placeId || `${n.text?.text ?? "prediction"}-${e}`, ue = (n) => {
|
|
47
48
|
const e = /* @__PURE__ */ new Map();
|
|
48
49
|
return n.forEach((l) => {
|
|
49
50
|
const r = l.placeId;
|
|
50
51
|
r && (e.has(r) || e.set(r, l));
|
|
51
52
|
}), Array.from(e.values());
|
|
52
|
-
},
|
|
53
|
+
}, fe = (n, e) => n.filter((l) => ce(l, e)), de = (n) => n.sort((e, l) => {
|
|
53
54
|
const r = e.distanceMeters ?? Number.POSITIVE_INFINITY, o = l.distanceMeters ?? Number.POSITIVE_INFINITY;
|
|
54
55
|
return r - o;
|
|
55
|
-
}),
|
|
56
|
+
}), me = (n, e) => de(fe(ue(n), e)), pe = (n, e) => q(n).toLowerCase() === e.trim().toLowerCase(), Ie = ({
|
|
56
57
|
id: n,
|
|
57
58
|
label: e,
|
|
58
59
|
placeholder: l,
|
|
59
60
|
value: r,
|
|
60
61
|
onValueChange: o,
|
|
61
|
-
disabled:
|
|
62
|
+
disabled: m,
|
|
62
63
|
name: p,
|
|
63
64
|
className: h,
|
|
64
|
-
autofillShimName:
|
|
65
|
+
autofillShimName: P,
|
|
65
66
|
googleMapsApiKey: F,
|
|
66
67
|
locationRestriction: f,
|
|
67
68
|
allowedTypes: y
|
|
68
69
|
}) => {
|
|
69
|
-
const [u, g] =
|
|
70
|
+
const [u, g] = S(r ?? ""), [i, d] = S([]), [j, a] = S(!1), [v, M] = S(-1), [H, b] = S(!1), R = w(null), N = w(null), $ = w(!1), k = w(!1), x = w(null), B = w([]), I = w("smooth"), C = se("places", F), Y = ee(() => {
|
|
70
71
|
if (!y)
|
|
71
|
-
return
|
|
72
|
+
return le;
|
|
72
73
|
const t = /* @__PURE__ */ new Set();
|
|
73
74
|
for (const s of y)
|
|
74
75
|
t.add(s);
|
|
@@ -77,105 +78,110 @@ const ne = /* @__PURE__ */ new Set(["street_address", "route", "premise", "subpr
|
|
|
77
78
|
O(() => {
|
|
78
79
|
g(r ?? ""), k.current = !1;
|
|
79
80
|
}, [r]), O(() => {
|
|
80
|
-
if (
|
|
81
|
-
|
|
81
|
+
if ($.current) {
|
|
82
|
+
$.current = !1;
|
|
82
83
|
return;
|
|
83
84
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
85
|
+
const t = u.trim();
|
|
86
|
+
b(t !== "");
|
|
87
|
+
let s = !0;
|
|
88
|
+
const _ = setTimeout(() => {
|
|
89
|
+
if (!s)
|
|
87
90
|
return;
|
|
88
|
-
if (
|
|
89
|
-
|
|
91
|
+
if (t === "") {
|
|
92
|
+
d([]), a(!1), x.current = null, r !== "" && o("");
|
|
90
93
|
return;
|
|
91
94
|
}
|
|
92
|
-
if (!
|
|
95
|
+
if (!C) return;
|
|
93
96
|
const {
|
|
94
|
-
AutocompleteSuggestion:
|
|
95
|
-
AutocompleteSessionToken:
|
|
96
|
-
} =
|
|
97
|
-
if (!
|
|
98
|
-
console.error("AddressAutocompleteInput: missing AutocompleteSuggestion or AutocompleteSessionToken exports"),
|
|
97
|
+
AutocompleteSuggestion: A,
|
|
98
|
+
AutocompleteSessionToken: L
|
|
99
|
+
} = C;
|
|
100
|
+
if (!A || !L) {
|
|
101
|
+
console.error("AddressAutocompleteInput: missing AutocompleteSuggestion or AutocompleteSessionToken exports"), d([]), a(!1), b(!1);
|
|
99
102
|
return;
|
|
100
103
|
}
|
|
101
|
-
x.current || (x.current = new
|
|
102
|
-
const
|
|
104
|
+
x.current || (x.current = new L());
|
|
105
|
+
const T = {
|
|
103
106
|
input: u,
|
|
104
107
|
sessionToken: x.current ?? void 0,
|
|
105
108
|
includedRegionCodes: ["fr"]
|
|
106
109
|
};
|
|
107
|
-
f && (
|
|
108
|
-
if (!
|
|
110
|
+
f && (T.locationRestriction = f), A.fetchAutocompleteSuggestions(T).then((D) => {
|
|
111
|
+
if (!s)
|
|
109
112
|
return;
|
|
110
|
-
const
|
|
111
|
-
if (!k.current &&
|
|
112
|
-
|
|
113
|
+
const V = D.suggestions.map((U) => U.placePrediction).filter((U) => !!U), E = me(V, Y), W = E[0], X = W && E.length === 1 && pe(W, u);
|
|
114
|
+
if (!k.current && X) {
|
|
115
|
+
d(E), a(!1), b(!1);
|
|
113
116
|
return;
|
|
114
117
|
}
|
|
115
|
-
|
|
116
|
-
}).catch((
|
|
117
|
-
|
|
118
|
+
E.length > 0 ? (d(E), k.current && a(!0), M(-1)) : (d([]), a(!1)), b(!1);
|
|
119
|
+
}).catch((D) => {
|
|
120
|
+
s && (console.error("AddressAutocompleteInput: suggestion fetch failed", D), d([]), a(!1), b(!1));
|
|
118
121
|
});
|
|
119
122
|
}, 300);
|
|
120
123
|
return () => {
|
|
121
|
-
|
|
124
|
+
s = !1, clearTimeout(_);
|
|
122
125
|
};
|
|
123
|
-
}, [u,
|
|
126
|
+
}, [u, C, o, r, f, Y]), O(() => {
|
|
124
127
|
const t = (s) => {
|
|
125
|
-
|
|
128
|
+
R.current && !R.current.contains(s.target) && N.current && !N.current.contains(s.target) && a(!1);
|
|
126
129
|
};
|
|
127
130
|
return document.addEventListener("mousedown", t), () => {
|
|
128
131
|
document.removeEventListener("mousedown", t);
|
|
129
132
|
};
|
|
130
133
|
}, []);
|
|
131
|
-
const
|
|
132
|
-
|
|
133
|
-
const s =
|
|
134
|
-
g(s), o(s),
|
|
135
|
-
},
|
|
134
|
+
const z = (t) => {
|
|
135
|
+
$.current = !0;
|
|
136
|
+
const s = q(t);
|
|
137
|
+
g(s), o(s), d([]), a(!1), b(!1), x.current = null;
|
|
138
|
+
}, G = (t) => {
|
|
136
139
|
k.current = !0, g(t.target.value);
|
|
137
|
-
},
|
|
138
|
-
if (!
|
|
140
|
+
}, J = (t) => {
|
|
141
|
+
if (!j || i.length === 0) {
|
|
139
142
|
t.key === "Enter" && (t.preventDefault(), o(u), a(!1), x.current = null);
|
|
140
143
|
return;
|
|
141
144
|
}
|
|
142
|
-
t.key === "ArrowDown" ? (
|
|
143
|
-
},
|
|
145
|
+
t.key === "ArrowDown" ? (I.current = t.repeat ? "auto" : "smooth", t.preventDefault(), M((s) => i.length === 0 ? -1 : s < 0 ? 0 : (s + 1) % i.length)) : t.key === "ArrowUp" ? (I.current = t.repeat ? "auto" : "smooth", t.preventDefault(), M((s) => i.length === 0 ? -1 : s <= 0 ? i.length - 1 : (s - 1) % i.length)) : t.key === "Enter" ? (t.preventDefault(), v > -1 && i[v] ? z(i[v]) : (o(u), a(!1), x.current = null)) : t.key === "Escape" && a(!1);
|
|
146
|
+
}, Q = () => {
|
|
144
147
|
a(!1), r !== u && o(u), x.current = null;
|
|
145
|
-
},
|
|
148
|
+
}, K = P ?? (p ? `${p}_shim` : void 0);
|
|
146
149
|
return O(() => {
|
|
147
|
-
if (!
|
|
148
|
-
|
|
150
|
+
if (!j || v < 0) {
|
|
151
|
+
I.current = "smooth";
|
|
149
152
|
return;
|
|
150
153
|
}
|
|
151
|
-
const t =
|
|
154
|
+
const t = B.current[v], s = N.current;
|
|
152
155
|
if (!t || !s) {
|
|
153
|
-
|
|
156
|
+
I.current = "smooth";
|
|
154
157
|
return;
|
|
155
158
|
}
|
|
156
|
-
const
|
|
157
|
-
|
|
158
|
-
const
|
|
159
|
-
|
|
159
|
+
const _ = I.current;
|
|
160
|
+
I.current = "smooth";
|
|
161
|
+
const A = t.offsetTop, L = A + t.offsetHeight, T = s.scrollTop, D = T + s.clientHeight;
|
|
162
|
+
A >= T && L <= D || t.scrollIntoView({
|
|
160
163
|
block: "nearest",
|
|
161
|
-
behavior:
|
|
164
|
+
behavior: _
|
|
162
165
|
});
|
|
163
|
-
}, [v,
|
|
164
|
-
|
|
166
|
+
}, [v, j]), B.current.length = i.length, /* @__PURE__ */ c.jsxs("div", { className: "relative", children: [
|
|
167
|
+
K && /* @__PURE__ */ c.jsx("input", { tabIndex: -1, autoComplete: "street-address", name: K, "aria-hidden": "true", className: "pointer-events-none absolute left-0 top-0 h-0 w-0 opacity-0" }),
|
|
165
168
|
/* @__PURE__ */ c.jsx("label", { htmlFor: n, className: "text-left block text-sm font-medium text-gray-700 mb-1 cursor-pointer", children: e }),
|
|
166
|
-
/* @__PURE__ */ c.
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
},
|
|
169
|
+
/* @__PURE__ */ c.jsxs("div", { className: "relative", children: [
|
|
170
|
+
/* @__PURE__ */ c.jsx(ne, { ref: R, id: n, type: "text", placeholder: l, name: p ?? `${n}_input`, value: u, onChange: G, onKeyDown: J, onFocus: () => {
|
|
171
|
+
i.length > 0 && u && a(!0);
|
|
172
|
+
}, onBlur: Q, disabled: m, autoComplete: "off", className: oe("w-full", H && "pr-9", h) }),
|
|
173
|
+
H && /* @__PURE__ */ c.jsx(re, { className: "pointer-events-none absolute right-3 top-1/2 h-4 w-4 -translate-y-1/2 animate-spin text-gray-400", "aria-hidden": "true" })
|
|
174
|
+
] }),
|
|
175
|
+
j && i.length > 0 && /* @__PURE__ */ c.jsx("ul", { ref: 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", role: "listbox", children: i.map((t, s) => /* @__PURE__ */ c.jsx("li", { ref: (_) => {
|
|
176
|
+
B.current[s] = _;
|
|
177
|
+
}, className: te("cursor-pointer px-3 py-2 text-sm text-gray-700 hover:bg-gray-100", {
|
|
172
178
|
"bg-gray-100": v === s
|
|
173
|
-
}), role: "option", onMouseDown: (
|
|
174
|
-
|
|
175
|
-
}, children: /* @__PURE__ */ c.jsx(
|
|
179
|
+
}), role: "option", onMouseDown: (_) => {
|
|
180
|
+
_.preventDefault(), z(t);
|
|
181
|
+
}, children: /* @__PURE__ */ c.jsx(ie, { prediction: t }) }, ae(t, s))) })
|
|
176
182
|
] });
|
|
177
183
|
};
|
|
178
184
|
export {
|
|
179
|
-
|
|
185
|
+
Ie as AddressAutocompleteInput
|
|
180
186
|
};
|
|
181
187
|
//# sourceMappingURL=index3.js.map
|
package/dist/index3.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index3.js","sources":["../src/components/AddressAutocompleteInput/index.tsx"],"sourcesContent":["import { ReactNode, ChangeEvent, KeyboardEvent, useState, useEffect, useRef, useMemo } from \"react\"\nimport clsx from \"clsx\"\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 getDisplayText = (prediction: google.maps.places.PlacePrediction) => {\n const fullText = 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 = 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 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}: {\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}) => {\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\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 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 let isActive = true\n\n const handler = setTimeout(() => {\n if (!isActive) {\n return\n }\n\n const trimmed = inputValue.trim()\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 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((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\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 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 })\n .catch((error: unknown) => {\n if (!isActive) {\n return\n }\n console.error(\"AddressAutocompleteInput: suggestion fetch failed\", error)\n setPredictions([])\n setIsDropdownOpen(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 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 className=\"pointer-events-none absolute left-0 top-0 h-0 w-0 opacity-0\"\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 <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=\"off\"\n className={cn(\"w-full\", className)}\n />\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"],"names":["DEFAULT_ALLOWED_TYPES","Set","getDisplayText","prediction","text","replace","trim","PredictionItem","t0","$","_c","displayText","parts","t1","Symbol","for","bb0","fullText","matches","wasCountryRemoved","length","lastIndex","forEach","substring","index","startOffset","endOffset","Math","min","push","matched","jsx","max","t2","isAllowedPrediction","allowedTypes","types","size","some","type","has","getPredictionId","placeId","getUniquePredictions","predictions","map","Map","key","set","Array","from","values","getFilteredPredictions","filter","sortPredictions","sort","a","b","aDistance","distanceMeters","Number","POSITIVE_INFINITY","bDistance","buildDisplayPredictions","isExactMatch","value","toLowerCase","AddressAutocompleteInput","id","label","placeholder","onValueChange","disabled","name","className","autofillShimName","googleMapsApiKey","locationRestriction","inputValue","setInputValue","useState","setPredictions","isDropdownOpen","setIsDropdownOpen","highlightedIndex","setHighlightedIndex","inputRef","useRef","dropdownRef","isSelecting","hasUserTyped","sessionTokenRef","optionRefs","scrollBehaviorRef","placesLibrary","useMapsLibrary","allowedTypesSet","useMemo","newSet","add","useEffect","current","isActive","handler","setTimeout","AutocompleteSuggestion","AutocompleteSessionToken","console","error","request","input","sessionToken","undefined","includedRegionCodes","fetchAutocompleteSuggestions","then","response","placePredictions","suggestions","suggestion","placePrediction","Boolean","combinedPredictions","singlePrediction","hasExactMatch","catch","clearTimeout","handleClickOutside","event","contains","target","document","addEventListener","removeEventListener","handleSelectPrediction","newAddress","handleInputChange","e","handleKeyDown","preventDefault","repeat","prev","handleBlur","shimName","item","list","behavior","top","offsetTop","bottom","offsetHeight","viewTop","scrollTop","viewBottom","clientHeight","scrollIntoView","block","jsxs","Input","cn","node","clsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index3.js","sources":["../src/components/AddressAutocompleteInput/index.tsx"],"sourcesContent":["import { 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 getDisplayText = (prediction: google.maps.places.PlacePrediction) => {\n const fullText = 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 = 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 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}: {\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}) => {\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 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((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\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 className=\"pointer-events-none absolute left-0 top-0 h-0 w-0 opacity-0\"\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=\"off\"\n className={cn(\"w-full\", isLoading && \"pr-9\", className)}\n />\n {isLoading && (\n <Loader2\n className=\"pointer-events-none absolute right-3 top-1/2 h-4 w-4 -translate-y-1/2 animate-spin text-gray-400\"\n aria-hidden=\"true\"\n />\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"],"names":["DEFAULT_ALLOWED_TYPES","Set","getDisplayText","prediction","text","replace","trim","PredictionItem","t0","$","_c","displayText","parts","t1","Symbol","for","bb0","fullText","matches","wasCountryRemoved","length","lastIndex","forEach","substring","index","startOffset","endOffset","Math","min","push","matched","jsx","max","t2","isAllowedPrediction","allowedTypes","types","size","some","type","has","getPredictionId","placeId","getUniquePredictions","predictions","map","Map","key","set","Array","from","values","getFilteredPredictions","filter","sortPredictions","sort","a","b","aDistance","distanceMeters","Number","POSITIVE_INFINITY","bDistance","buildDisplayPredictions","isExactMatch","value","toLowerCase","AddressAutocompleteInput","id","label","placeholder","onValueChange","disabled","name","className","autofillShimName","googleMapsApiKey","locationRestriction","inputValue","setInputValue","useState","setPredictions","isDropdownOpen","setIsDropdownOpen","highlightedIndex","setHighlightedIndex","isLoading","setIsLoading","inputRef","useRef","dropdownRef","isSelecting","hasUserTyped","sessionTokenRef","optionRefs","scrollBehaviorRef","placesLibrary","useMapsLibrary","allowedTypesSet","useMemo","newSet","add","useEffect","current","trimmed","isActive","handler","setTimeout","AutocompleteSuggestion","AutocompleteSessionToken","console","error","request","input","sessionToken","undefined","includedRegionCodes","fetchAutocompleteSuggestions","then","response","placePredictions","suggestions","suggestion","placePrediction","Boolean","combinedPredictions","singlePrediction","hasExactMatch","catch","clearTimeout","handleClickOutside","event","contains","target","document","addEventListener","removeEventListener","handleSelectPrediction","newAddress","handleInputChange","e","handleKeyDown","preventDefault","repeat","prev","handleBlur","shimName","item","list","behavior","top","offsetTop","bottom","offsetHeight","viewTop","scrollTop","viewBottom","clientHeight","scrollIntoView","block","jsxs","Input","cn","Loader2","node","clsx"],"mappings":"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"}
|
package/dist/index30.js
CHANGED
|
@@ -1,6 +1,128 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
1
|
+
import * as s from "react";
|
|
2
|
+
import { composeEventHandlers as h } from "./index51.js";
|
|
3
|
+
import { Primitive as w, dispatchDiscreteCustomEvent as k } from "./index52.js";
|
|
4
|
+
import { useComposedRefs as R } from "./index53.js";
|
|
5
|
+
import { useCallbackRef as g } from "./index54.js";
|
|
6
|
+
import { useEscapeKeydown as U } from "./index55.js";
|
|
7
|
+
import { j as x } from "./index28.js";
|
|
8
|
+
var j = "DismissableLayer", p = "dismissableLayer.update", z = "dismissableLayer.pointerDownOutside", H = "dismissableLayer.focusOutside", C, T = s.createContext({
|
|
9
|
+
layers: /* @__PURE__ */ new Set(),
|
|
10
|
+
layersWithOutsidePointerEventsDisabled: /* @__PURE__ */ new Set(),
|
|
11
|
+
branches: /* @__PURE__ */ new Set()
|
|
12
|
+
}), M = s.forwardRef(
|
|
13
|
+
(n, e) => {
|
|
14
|
+
const {
|
|
15
|
+
disableOutsidePointerEvents: r = !1,
|
|
16
|
+
onEscapeKeyDown: a,
|
|
17
|
+
onPointerDownOutside: i,
|
|
18
|
+
onFocusOutside: c,
|
|
19
|
+
onInteractOutside: f,
|
|
20
|
+
onDismiss: d,
|
|
21
|
+
...E
|
|
22
|
+
} = n, o = s.useContext(T), [u, F] = s.useState(null), l = u?.ownerDocument ?? globalThis?.document, [, I] = s.useState({}), S = R(e, (t) => F(t)), y = Array.from(o.layers), [W] = [...o.layersWithOutsidePointerEventsDisabled].slice(-1), A = y.indexOf(W), b = u ? y.indexOf(u) : -1, N = o.layersWithOutsidePointerEventsDisabled.size > 0, D = b >= A, _ = Y((t) => {
|
|
23
|
+
const v = t.target, P = [...o.branches].some((m) => m.contains(v));
|
|
24
|
+
!D || P || (i?.(t), f?.(t), t.defaultPrevented || d?.());
|
|
25
|
+
}, l), O = q((t) => {
|
|
26
|
+
const v = t.target;
|
|
27
|
+
[...o.branches].some((m) => m.contains(v)) || (c?.(t), f?.(t), t.defaultPrevented || d?.());
|
|
28
|
+
}, l);
|
|
29
|
+
return U((t) => {
|
|
30
|
+
b === o.layers.size - 1 && (a?.(t), !t.defaultPrevented && d && (t.preventDefault(), d()));
|
|
31
|
+
}, l), s.useEffect(() => {
|
|
32
|
+
if (u)
|
|
33
|
+
return r && (o.layersWithOutsidePointerEventsDisabled.size === 0 && (C = l.body.style.pointerEvents, l.body.style.pointerEvents = "none"), o.layersWithOutsidePointerEventsDisabled.add(u)), o.layers.add(u), L(), () => {
|
|
34
|
+
r && o.layersWithOutsidePointerEventsDisabled.size === 1 && (l.body.style.pointerEvents = C);
|
|
35
|
+
};
|
|
36
|
+
}, [u, l, r, o]), s.useEffect(() => () => {
|
|
37
|
+
u && (o.layers.delete(u), o.layersWithOutsidePointerEventsDisabled.delete(u), L());
|
|
38
|
+
}, [u, o]), s.useEffect(() => {
|
|
39
|
+
const t = () => I({});
|
|
40
|
+
return document.addEventListener(p, t), () => document.removeEventListener(p, t);
|
|
41
|
+
}, []), /* @__PURE__ */ x.jsx(
|
|
42
|
+
w.div,
|
|
43
|
+
{
|
|
44
|
+
...E,
|
|
45
|
+
ref: S,
|
|
46
|
+
style: {
|
|
47
|
+
pointerEvents: N ? D ? "auto" : "none" : void 0,
|
|
48
|
+
...n.style
|
|
49
|
+
},
|
|
50
|
+
onFocusCapture: h(n.onFocusCapture, O.onFocusCapture),
|
|
51
|
+
onBlurCapture: h(n.onBlurCapture, O.onBlurCapture),
|
|
52
|
+
onPointerDownCapture: h(
|
|
53
|
+
n.onPointerDownCapture,
|
|
54
|
+
_.onPointerDownCapture
|
|
55
|
+
)
|
|
56
|
+
}
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
M.displayName = j;
|
|
61
|
+
var K = "DismissableLayerBranch", X = s.forwardRef((n, e) => {
|
|
62
|
+
const r = s.useContext(T), a = s.useRef(null), i = R(e, a);
|
|
63
|
+
return s.useEffect(() => {
|
|
64
|
+
const c = a.current;
|
|
65
|
+
if (c)
|
|
66
|
+
return r.branches.add(c), () => {
|
|
67
|
+
r.branches.delete(c);
|
|
68
|
+
};
|
|
69
|
+
}, [r.branches]), /* @__PURE__ */ x.jsx(w.div, { ...n, ref: i });
|
|
70
|
+
});
|
|
71
|
+
X.displayName = K;
|
|
72
|
+
function Y(n, e = globalThis?.document) {
|
|
73
|
+
const r = g(n), a = s.useRef(!1), i = s.useRef(() => {
|
|
74
|
+
});
|
|
75
|
+
return s.useEffect(() => {
|
|
76
|
+
const c = (d) => {
|
|
77
|
+
if (d.target && !a.current) {
|
|
78
|
+
let E = function() {
|
|
79
|
+
B(
|
|
80
|
+
z,
|
|
81
|
+
r,
|
|
82
|
+
o,
|
|
83
|
+
{ discrete: !0 }
|
|
84
|
+
);
|
|
85
|
+
};
|
|
86
|
+
const o = { originalEvent: d };
|
|
87
|
+
d.pointerType === "touch" ? (e.removeEventListener("click", i.current), i.current = E, e.addEventListener("click", i.current, { once: !0 })) : E();
|
|
88
|
+
} else
|
|
89
|
+
e.removeEventListener("click", i.current);
|
|
90
|
+
a.current = !1;
|
|
91
|
+
}, f = window.setTimeout(() => {
|
|
92
|
+
e.addEventListener("pointerdown", c);
|
|
93
|
+
}, 0);
|
|
94
|
+
return () => {
|
|
95
|
+
window.clearTimeout(f), e.removeEventListener("pointerdown", c), e.removeEventListener("click", i.current);
|
|
96
|
+
};
|
|
97
|
+
}, [e, r]), {
|
|
98
|
+
// ensures we check React component tree (not just DOM tree)
|
|
99
|
+
onPointerDownCapture: () => a.current = !0
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function q(n, e = globalThis?.document) {
|
|
103
|
+
const r = g(n), a = s.useRef(!1);
|
|
104
|
+
return s.useEffect(() => {
|
|
105
|
+
const i = (c) => {
|
|
106
|
+
c.target && !a.current && B(H, r, { originalEvent: c }, {
|
|
107
|
+
discrete: !1
|
|
108
|
+
});
|
|
109
|
+
};
|
|
110
|
+
return e.addEventListener("focusin", i), () => e.removeEventListener("focusin", i);
|
|
111
|
+
}, [e, r]), {
|
|
112
|
+
onFocusCapture: () => a.current = !0,
|
|
113
|
+
onBlurCapture: () => a.current = !1
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
function L() {
|
|
117
|
+
const n = new CustomEvent(p);
|
|
118
|
+
document.dispatchEvent(n);
|
|
119
|
+
}
|
|
120
|
+
function B(n, e, r, { discrete: a }) {
|
|
121
|
+
const i = r.originalEvent.target, c = new CustomEvent(n, { bubbles: !1, cancelable: !0, detail: r });
|
|
122
|
+
e && i.addEventListener(n, e, { once: !0 }), a ? k(i, c) : i.dispatchEvent(c);
|
|
123
|
+
}
|
|
3
124
|
export {
|
|
4
|
-
|
|
125
|
+
M as DismissableLayer,
|
|
126
|
+
X as DismissableLayerBranch
|
|
5
127
|
};
|
|
6
128
|
//# sourceMappingURL=index30.js.map
|
package/dist/index30.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index30.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
|
1
|
+
{"version":3,"file":"index30.js","sources":["../../../node_modules/@radix-ui/react-dismissable-layer/dist/index.mjs"],"sourcesContent":["\"use client\";\n\n// src/dismissable-layer.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { Primitive, dispatchDiscreteCustomEvent } from \"@radix-ui/react-primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { useEscapeKeydown } from \"@radix-ui/react-use-escape-keydown\";\nimport { jsx } from \"react/jsx-runtime\";\nvar DISMISSABLE_LAYER_NAME = \"DismissableLayer\";\nvar CONTEXT_UPDATE = \"dismissableLayer.update\";\nvar POINTER_DOWN_OUTSIDE = \"dismissableLayer.pointerDownOutside\";\nvar FOCUS_OUTSIDE = \"dismissableLayer.focusOutside\";\nvar originalBodyPointerEvents;\nvar DismissableLayerContext = React.createContext({\n layers: /* @__PURE__ */ new Set(),\n layersWithOutsidePointerEventsDisabled: /* @__PURE__ */ new Set(),\n branches: /* @__PURE__ */ new Set()\n});\nvar DismissableLayer = React.forwardRef(\n (props, forwardedRef) => {\n const {\n disableOutsidePointerEvents = false,\n onEscapeKeyDown,\n onPointerDownOutside,\n onFocusOutside,\n onInteractOutside,\n onDismiss,\n ...layerProps\n } = props;\n const context = React.useContext(DismissableLayerContext);\n const [node, setNode] = React.useState(null);\n const ownerDocument = node?.ownerDocument ?? globalThis?.document;\n const [, force] = React.useState({});\n const composedRefs = useComposedRefs(forwardedRef, (node2) => setNode(node2));\n const layers = Array.from(context.layers);\n const [highestLayerWithOutsidePointerEventsDisabled] = [...context.layersWithOutsidePointerEventsDisabled].slice(-1);\n const highestLayerWithOutsidePointerEventsDisabledIndex = layers.indexOf(highestLayerWithOutsidePointerEventsDisabled);\n const index = node ? layers.indexOf(node) : -1;\n const isBodyPointerEventsDisabled = context.layersWithOutsidePointerEventsDisabled.size > 0;\n const isPointerEventsEnabled = index >= highestLayerWithOutsidePointerEventsDisabledIndex;\n const pointerDownOutside = usePointerDownOutside((event) => {\n const target = event.target;\n const isPointerDownOnBranch = [...context.branches].some((branch) => branch.contains(target));\n if (!isPointerEventsEnabled || isPointerDownOnBranch) return;\n onPointerDownOutside?.(event);\n onInteractOutside?.(event);\n if (!event.defaultPrevented) onDismiss?.();\n }, ownerDocument);\n const focusOutside = useFocusOutside((event) => {\n const target = event.target;\n const isFocusInBranch = [...context.branches].some((branch) => branch.contains(target));\n if (isFocusInBranch) return;\n onFocusOutside?.(event);\n onInteractOutside?.(event);\n if (!event.defaultPrevented) onDismiss?.();\n }, ownerDocument);\n useEscapeKeydown((event) => {\n const isHighestLayer = index === context.layers.size - 1;\n if (!isHighestLayer) return;\n onEscapeKeyDown?.(event);\n if (!event.defaultPrevented && onDismiss) {\n event.preventDefault();\n onDismiss();\n }\n }, ownerDocument);\n React.useEffect(() => {\n if (!node) return;\n if (disableOutsidePointerEvents) {\n if (context.layersWithOutsidePointerEventsDisabled.size === 0) {\n originalBodyPointerEvents = ownerDocument.body.style.pointerEvents;\n ownerDocument.body.style.pointerEvents = \"none\";\n }\n context.layersWithOutsidePointerEventsDisabled.add(node);\n }\n context.layers.add(node);\n dispatchUpdate();\n return () => {\n if (disableOutsidePointerEvents && context.layersWithOutsidePointerEventsDisabled.size === 1) {\n ownerDocument.body.style.pointerEvents = originalBodyPointerEvents;\n }\n };\n }, [node, ownerDocument, disableOutsidePointerEvents, context]);\n React.useEffect(() => {\n return () => {\n if (!node) return;\n context.layers.delete(node);\n context.layersWithOutsidePointerEventsDisabled.delete(node);\n dispatchUpdate();\n };\n }, [node, context]);\n React.useEffect(() => {\n const handleUpdate = () => force({});\n document.addEventListener(CONTEXT_UPDATE, handleUpdate);\n return () => document.removeEventListener(CONTEXT_UPDATE, handleUpdate);\n }, []);\n return /* @__PURE__ */ jsx(\n Primitive.div,\n {\n ...layerProps,\n ref: composedRefs,\n style: {\n pointerEvents: isBodyPointerEventsDisabled ? isPointerEventsEnabled ? \"auto\" : \"none\" : void 0,\n ...props.style\n },\n onFocusCapture: composeEventHandlers(props.onFocusCapture, focusOutside.onFocusCapture),\n onBlurCapture: composeEventHandlers(props.onBlurCapture, focusOutside.onBlurCapture),\n onPointerDownCapture: composeEventHandlers(\n props.onPointerDownCapture,\n pointerDownOutside.onPointerDownCapture\n )\n }\n );\n }\n);\nDismissableLayer.displayName = DISMISSABLE_LAYER_NAME;\nvar BRANCH_NAME = \"DismissableLayerBranch\";\nvar DismissableLayerBranch = React.forwardRef((props, forwardedRef) => {\n const context = React.useContext(DismissableLayerContext);\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n React.useEffect(() => {\n const node = ref.current;\n if (node) {\n context.branches.add(node);\n return () => {\n context.branches.delete(node);\n };\n }\n }, [context.branches]);\n return /* @__PURE__ */ jsx(Primitive.div, { ...props, ref: composedRefs });\n});\nDismissableLayerBranch.displayName = BRANCH_NAME;\nfunction usePointerDownOutside(onPointerDownOutside, ownerDocument = globalThis?.document) {\n const handlePointerDownOutside = useCallbackRef(onPointerDownOutside);\n const isPointerInsideReactTreeRef = React.useRef(false);\n const handleClickRef = React.useRef(() => {\n });\n React.useEffect(() => {\n const handlePointerDown = (event) => {\n if (event.target && !isPointerInsideReactTreeRef.current) {\n let handleAndDispatchPointerDownOutsideEvent2 = function() {\n handleAndDispatchCustomEvent(\n POINTER_DOWN_OUTSIDE,\n handlePointerDownOutside,\n eventDetail,\n { discrete: true }\n );\n };\n var handleAndDispatchPointerDownOutsideEvent = handleAndDispatchPointerDownOutsideEvent2;\n const eventDetail = { originalEvent: event };\n if (event.pointerType === \"touch\") {\n ownerDocument.removeEventListener(\"click\", handleClickRef.current);\n handleClickRef.current = handleAndDispatchPointerDownOutsideEvent2;\n ownerDocument.addEventListener(\"click\", handleClickRef.current, { once: true });\n } else {\n handleAndDispatchPointerDownOutsideEvent2();\n }\n } else {\n ownerDocument.removeEventListener(\"click\", handleClickRef.current);\n }\n isPointerInsideReactTreeRef.current = false;\n };\n const timerId = window.setTimeout(() => {\n ownerDocument.addEventListener(\"pointerdown\", handlePointerDown);\n }, 0);\n return () => {\n window.clearTimeout(timerId);\n ownerDocument.removeEventListener(\"pointerdown\", handlePointerDown);\n ownerDocument.removeEventListener(\"click\", handleClickRef.current);\n };\n }, [ownerDocument, handlePointerDownOutside]);\n return {\n // ensures we check React component tree (not just DOM tree)\n onPointerDownCapture: () => isPointerInsideReactTreeRef.current = true\n };\n}\nfunction useFocusOutside(onFocusOutside, ownerDocument = globalThis?.document) {\n const handleFocusOutside = useCallbackRef(onFocusOutside);\n const isFocusInsideReactTreeRef = React.useRef(false);\n React.useEffect(() => {\n const handleFocus = (event) => {\n if (event.target && !isFocusInsideReactTreeRef.current) {\n const eventDetail = { originalEvent: event };\n handleAndDispatchCustomEvent(FOCUS_OUTSIDE, handleFocusOutside, eventDetail, {\n discrete: false\n });\n }\n };\n ownerDocument.addEventListener(\"focusin\", handleFocus);\n return () => ownerDocument.removeEventListener(\"focusin\", handleFocus);\n }, [ownerDocument, handleFocusOutside]);\n return {\n onFocusCapture: () => isFocusInsideReactTreeRef.current = true,\n onBlurCapture: () => isFocusInsideReactTreeRef.current = false\n };\n}\nfunction dispatchUpdate() {\n const event = new CustomEvent(CONTEXT_UPDATE);\n document.dispatchEvent(event);\n}\nfunction handleAndDispatchCustomEvent(name, handler, detail, { discrete }) {\n const target = detail.originalEvent.target;\n const event = new CustomEvent(name, { bubbles: false, cancelable: true, detail });\n if (handler) target.addEventListener(name, handler, { once: true });\n if (discrete) {\n dispatchDiscreteCustomEvent(target, event);\n } else {\n target.dispatchEvent(event);\n }\n}\nvar Root = DismissableLayer;\nvar Branch = DismissableLayerBranch;\nexport {\n Branch,\n DismissableLayer,\n DismissableLayerBranch,\n Root\n};\n//# sourceMappingURL=index.mjs.map\n"],"names":["DISMISSABLE_LAYER_NAME","CONTEXT_UPDATE","POINTER_DOWN_OUTSIDE","FOCUS_OUTSIDE","originalBodyPointerEvents","DismissableLayerContext","React","DismissableLayer","props","forwardedRef","disableOutsidePointerEvents","onEscapeKeyDown","onPointerDownOutside","onFocusOutside","onInteractOutside","onDismiss","layerProps","context","node","setNode","ownerDocument","force","composedRefs","useComposedRefs","node2","layers","highestLayerWithOutsidePointerEventsDisabled","highestLayerWithOutsidePointerEventsDisabledIndex","index","isBodyPointerEventsDisabled","isPointerEventsEnabled","pointerDownOutside","usePointerDownOutside","event","target","isPointerDownOnBranch","branch","focusOutside","useFocusOutside","useEscapeKeydown","dispatchUpdate","handleUpdate","jsx","Primitive","composeEventHandlers","BRANCH_NAME","DismissableLayerBranch","ref","handlePointerDownOutside","useCallbackRef","isPointerInsideReactTreeRef","handleClickRef","handlePointerDown","handleAndDispatchPointerDownOutsideEvent2","handleAndDispatchCustomEvent","eventDetail","timerId","handleFocusOutside","isFocusInsideReactTreeRef","handleFocus","name","handler","detail","discrete","dispatchDiscreteCustomEvent"],"mappings":"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","x_google_ignoreList":[0]}
|