col-browser 2.0.1 → 2.2.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.
Files changed (74) hide show
  1. package/es/bibtex.js +8 -0
  2. package/es/bibtex.js.map +1 -0
  3. package/es/chunks/AntdIcon-B1nMlqyh.js +984 -0
  4. package/es/chunks/AntdIcon-B1nMlqyh.js.map +1 -0
  5. package/es/chunks/BibTex-BqzD3qLB.js +13 -0
  6. package/es/chunks/BibTex-BqzD3qLB.js.map +1 -0
  7. package/es/chunks/DatasetCitation-bkPmDDYB.js +119 -0
  8. package/es/chunks/DatasetCitation-bkPmDDYB.js.map +1 -0
  9. package/es/chunks/DatasetlogoWithFallback-CbP7vRs_.js +823 -0
  10. package/es/chunks/DatasetlogoWithFallback-CbP7vRs_.js.map +1 -0
  11. package/es/chunks/Distributions-CXIEJ6e6.js +1131 -0
  12. package/es/chunks/Distributions-CXIEJ6e6.js.map +1 -0
  13. package/es/chunks/ErrorMsg-K8k5PPTp.js +26 -0
  14. package/es/chunks/ErrorMsg-K8k5PPTp.js.map +1 -0
  15. package/es/chunks/LinkOutlined-2IkQWTV7.js +22 -0
  16. package/es/chunks/LinkOutlined-2IkQWTV7.js.map +1 -0
  17. package/es/chunks/MergedDataBadge-DsTsn5Xu.js +134 -0
  18. package/es/chunks/MergedDataBadge-DsTsn5Xu.js.map +1 -0
  19. package/es/chunks/MetricsPresentation-U_CO8JoH.js +66 -0
  20. package/es/chunks/MetricsPresentation-U_CO8JoH.js.map +1 -0
  21. package/es/chunks/TaxonBreakdown-BzDHojmp.js +210 -0
  22. package/es/chunks/TaxonBreakdown-BzDHojmp.js.map +1 -0
  23. package/es/chunks/config-BPRXv9x8.js +31 -0
  24. package/es/chunks/config-BPRXv9x8.js.map +1 -0
  25. package/es/chunks/dataset-DvQG4NjA.js +30 -0
  26. package/es/chunks/dataset-DvQG4NjA.js.map +1 -0
  27. package/es/chunks/enumeration-yDQXSZsf.js +12 -0
  28. package/es/chunks/enumeration-yDQXSZsf.js.map +1 -0
  29. package/es/chunks/index-CNK3JADR.js +95 -0
  30. package/es/chunks/index-CNK3JADR.js.map +1 -0
  31. package/es/chunks/jsx-runtime-BzflLqGi.js +283 -0
  32. package/es/chunks/jsx-runtime-BzflLqGi.js.map +1 -0
  33. package/es/chunks/router-CssZk5qZ.js +109 -0
  34. package/es/chunks/router-CssZk5qZ.js.map +1 -0
  35. package/es/chunks/sector-BnVzMnMO.js +9 -0
  36. package/es/chunks/sector-BnVzMnMO.js.map +1 -0
  37. package/es/chunks/storage-BgdCo9fV.js +20 -0
  38. package/es/chunks/storage-BgdCo9fV.js.map +1 -0
  39. package/es/chunks/withDatasetKey-BgMY05XE.js +48 -0
  40. package/es/chunks/withDatasetKey-BgMY05XE.js.map +1 -0
  41. package/es/col-browser.css +1 -1
  42. package/es/index.js +18 -7964
  43. package/es/index.js.map +1 -1
  44. package/es/routing.js +5 -0
  45. package/es/routing.js.map +1 -0
  46. package/es/search.js +810 -0
  47. package/es/search.js.map +1 -0
  48. package/es/sourceDataset.js +453 -0
  49. package/es/sourceDataset.js.map +1 -0
  50. package/es/sourceDatasetList.js +366 -0
  51. package/es/sourceDatasetList.js.map +1 -0
  52. package/es/taxon.js +1643 -0
  53. package/es/taxon.js.map +1 -0
  54. package/es/taxonBreakdown.js +44 -0
  55. package/es/taxonBreakdown.js.map +1 -0
  56. package/es/taxonDistribution.js +50 -0
  57. package/es/taxonDistribution.js.map +1 -0
  58. package/es/tree.js +823 -0
  59. package/es/tree.js.map +1 -0
  60. package/package.json +48 -7
  61. package/types/bibtex.d.ts +1 -0
  62. package/types/index.d.ts +162 -0
  63. package/types/routing.d.ts +1 -0
  64. package/types/search.d.ts +1 -0
  65. package/types/sourceDataset.d.ts +1 -0
  66. package/types/sourceDatasetList.d.ts +1 -0
  67. package/types/taxon.d.ts +1 -0
  68. package/types/taxonBreakdown.d.ts +1 -0
  69. package/types/taxonDistribution.d.ts +1 -0
  70. package/types/tree.d.ts +1 -0
  71. package/umd/col-browser.js +8830 -15340
  72. package/umd/col-browser.js.map +1 -1
  73. package/umd/col-browser.min.js +5 -13
  74. package/umd/col-browser.min.js.map +1 -1
@@ -0,0 +1,1131 @@
1
+ var tt = Object.defineProperty;
2
+ var nt = (e, n, r) => n in e ? tt(e, n, { enumerable: !0, configurable: !0, writable: !0, value: r }) : e[n] = r;
3
+ var Z = (e, n, r) => nt(e, typeof n != "symbol" ? n + "" : n, r);
4
+ import { j as s } from "./jsx-runtime-BzflLqGi.js";
5
+ import * as Ne from "react";
6
+ import rt, { useState as L, useRef as G, useMemo as ne, useEffect as N } from "react";
7
+ import { Spin as st, Popover as ot, Radio as le } from "antd";
8
+ import { isArray as we, get as $, keyBy as it, startCase as at } from "lodash-es";
9
+ import { c as te, p as ct } from "./router-CssZk5qZ.js";
10
+ import { c as A } from "./config-BPRXv9x8.js";
11
+ import { E as lt } from "./ErrorMsg-K8k5PPTp.js";
12
+ import { I as dt } from "./AntdIcon-B1nMlqyh.js";
13
+ import { M as ut } from "./MergedDataBadge-DsTsn5Xu.js";
14
+ import D from "maplibre-gl";
15
+ import "maplibre-gl/dist/maplibre-gl.css";
16
+ import { r as pt, w as ft } from "./storage-BgdCo9fV.js";
17
+ var ht = { icon: { tag: "svg", attrs: { viewBox: "64 64 896 896", focusable: "false" }, children: [{ tag: "path", attrs: { d: "M832 64H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V96c0-17.7-14.3-32-32-32zm-260 72h96v209.9L621.5 312 572 347.4V136zm220 752H232V136h280v296.9c0 3.3 1 6.6 3 9.3a15.9 15.9 0 0022.3 3.7l83.8-59.9 81.4 59.4c2.7 2 6 3.1 9.4 3.1 8.8 0 16-7.2 16-16V136h64v752z" } }] }, name: "book", theme: "outlined" };
18
+ function fe() {
19
+ return fe = Object.assign ? Object.assign.bind() : function(e) {
20
+ for (var n = 1; n < arguments.length; n++) {
21
+ var r = arguments[n];
22
+ for (var i in r)
23
+ Object.prototype.hasOwnProperty.call(r, i) && (e[i] = r[i]);
24
+ }
25
+ return e;
26
+ }, fe.apply(this, arguments);
27
+ }
28
+ const gt = (e, n) => /* @__PURE__ */ Ne.createElement(dt, fe({}, e, {
29
+ ref: n,
30
+ icon: ht
31
+ })), _e = /* @__PURE__ */ Ne.forwardRef(gt);
32
+ process.env.NODE_ENV !== "production" && (_e.displayName = "BookOutlined");
33
+ class mt extends rt.Component {
34
+ constructor(r) {
35
+ super(r);
36
+ Z(this, "getData", () => {
37
+ const { referenceId: r, datasetKey: i, references: o } = this.props;
38
+ if (r) {
39
+ const c = we(r) ? r : [r], f = [];
40
+ this.setState({ loading: !0 }), Promise.allSettled(
41
+ c.map(
42
+ (u) => $(o, u) ? Promise.resolve(f.push(o[u])) : te(
43
+ `${A.dataApi}dataset/${i}/reference/${u}`
44
+ ).then((a) => f.push(a.data)).catch((a) => this.setState({ error: a }))
45
+ )
46
+ ).then(() => this.setState({ reference: f, loading: !1 }));
47
+ }
48
+ });
49
+ Z(this, "getContent", () => {
50
+ const { error: r, reference: i, loading: o } = this.state;
51
+ return o ? /* @__PURE__ */ s.jsx(st, {}) : r ? /* @__PURE__ */ s.jsx(lt, { error: r }) : i.length === 1 ? i[0].citation : /* @__PURE__ */ s.jsx("ul", { children: i.map((c) => /* @__PURE__ */ s.jsx("li", { children: c.citation }, c.id)) });
52
+ });
53
+ Z(this, "scrollToReference", (r, i) => {
54
+ const o = document.getElementById(`col-reference-${i}`);
55
+ o && (r.preventDefault(), o.scrollIntoView({ behavior: "smooth", block: "start" }));
56
+ });
57
+ Z(this, "render", () => {
58
+ const { referenceId: r, referenceIndexMap: i, trigger: o } = this.props, c = we(r) ? r : [r];
59
+ let f = i && $(i, c[0]) ? c.map((u) => /* @__PURE__ */ s.jsx(
60
+ "a",
61
+ {
62
+ className: "col-reference-link",
63
+ href: `#col-reference-${u}`,
64
+ onClick: (a) => this.scrollToReference(a, u),
65
+ children: `[${i[u]}]`
66
+ },
67
+ u
68
+ )) : /* @__PURE__ */ s.jsx(_e, { style: { cursor: "pointer" } });
69
+ return r ? /* @__PURE__ */ s.jsx("div", { id: `reference_${r}`, style: this.props.style, children: /* @__PURE__ */ s.jsx(
70
+ ot,
71
+ {
72
+ getPopupContainer: () => document.getElementById(`reference_${r}`),
73
+ placement: this.props.placement || "left",
74
+ title: "Reference",
75
+ onOpenChange: (u) => u && this.getData(),
76
+ content: /* @__PURE__ */ s.jsx("div", { style: { maxWidth: "500px" }, children: this.getContent() }),
77
+ trigger: o || "hover",
78
+ children: f
79
+ }
80
+ ) }, `reference_${r}`) : "";
81
+ });
82
+ this.state = {
83
+ reference: [],
84
+ loading: !1,
85
+ error: null
86
+ };
87
+ }
88
+ }
89
+ const se = [
90
+ "subspecies",
91
+ "variety",
92
+ "subvariety",
93
+ "form",
94
+ "subform",
95
+ "infraspecific name"
96
+ ], $e = (e, n) => {
97
+ const r = n.indexOf(e);
98
+ return r === -1 ? [] : se.filter((i) => n.indexOf(i) > r);
99
+ }, yt = 16, bt = (e) => {
100
+ var n, r;
101
+ return ((n = e == null ? void 0 : e.area) == null ? void 0 : n.gazetteer) !== "text" && !!((r = e == null ? void 0 : e.area) != null && r.globalId);
102
+ }, xt = async (e, n, r) => {
103
+ const i = new Array(e.length);
104
+ let o = 0;
105
+ const c = Array.from({ length: Math.min(r, e.length) }, async () => {
106
+ for (; ; ) {
107
+ const f = o++;
108
+ if (f >= e.length) return;
109
+ i[f] = await n(e[f], f);
110
+ }
111
+ });
112
+ return await Promise.all(c), i;
113
+ }, vt = async (e, n, r) => {
114
+ var u;
115
+ if (r.length === 0) return [];
116
+ const i = new URLSearchParams();
117
+ i.append("TAXON_ID", n), r.forEach((a) => i.append("rank", a)), ["accepted", "provisionally accepted"].forEach(
118
+ (a) => i.append("status", a)
119
+ ), i.append("limit", "1000");
120
+ const o = `${A.dataApi}dataset/${e}/nameusage/search?${i}`, c = await te(o);
121
+ return (((u = c == null ? void 0 : c.data) == null ? void 0 : u.result) || []).filter((a) => {
122
+ var p;
123
+ return (p = a == null ? void 0 : a.usage) == null ? void 0 : p.id;
124
+ }).map((a) => {
125
+ var p, w, j, k, C, S;
126
+ return {
127
+ id: a.usage.id,
128
+ scientificName: ((w = (p = a.usage) == null ? void 0 : p.name) == null ? void 0 : w.scientificName) || ((j = a.usage) == null ? void 0 : j.label) || a.usage.id,
129
+ rank: (C = (k = a.usage) == null ? void 0 : k.name) == null ? void 0 : C.rank,
130
+ parentId: (S = a.usage) == null ? void 0 : S.parentId
131
+ };
132
+ });
133
+ }, jt = async (e, n) => {
134
+ const r = `${A.dataApi}dataset/${e}/taxon/${encodeURIComponent(n)}/distribution`;
135
+ try {
136
+ const i = await te(r);
137
+ return Array.isArray(i == null ? void 0 : i.data) ? i.data : [];
138
+ } catch {
139
+ return [];
140
+ }
141
+ }, St = async ({ datasetKey: e, focalTaxon: n, rankOrder: r }) => {
142
+ var a;
143
+ const i = $e((a = n == null ? void 0 : n.name) == null ? void 0 : a.rank, r);
144
+ let o = !1, c = [];
145
+ try {
146
+ c = await vt(e, n.id, i);
147
+ } catch {
148
+ return o = !0, { taxa: [], descendantsFailed: o };
149
+ }
150
+ const f = await xt(
151
+ c,
152
+ (p) => jt(e, p.id),
153
+ yt
154
+ );
155
+ return { taxa: c.map((p, w) => {
156
+ const j = f[w] || [];
157
+ return { ...p, distributions: j, mappable: j.filter(bt) };
158
+ }), descendantsFailed: o };
159
+ }, Le = [
160
+ "#E58606",
161
+ "#5D69B1",
162
+ "#52BCA3",
163
+ "#99C945",
164
+ "#CC61B0",
165
+ "#24796C",
166
+ "#DAA51B",
167
+ "#2F8AC4",
168
+ "#764E9F",
169
+ "#ED645A",
170
+ "#CC3A8E",
171
+ "#A5AA99"
172
+ ], ke = (e, n) => {
173
+ const r = n.indexOf(e);
174
+ return r === -1 ? n.length : r;
175
+ }, It = (e, n) => {
176
+ const r = [...e].sort((o, c) => {
177
+ const f = ke(o.rank, n), u = ke(c.rank, n);
178
+ return f !== u ? f - u : o.scientificName.localeCompare(c.scientificName);
179
+ }), i = {};
180
+ return r.forEach((o, c) => {
181
+ i[o.id] = Le[c % Le.length];
182
+ }), i;
183
+ }, wt = {
184
+ position: "absolute",
185
+ bottom: 8,
186
+ left: 8,
187
+ zIndex: 1e3,
188
+ background: "#fff",
189
+ borderRadius: 4,
190
+ boxShadow: "0 1px 4px rgba(0,0,0,0.2)",
191
+ padding: "6px 8px",
192
+ fontSize: 12,
193
+ lineHeight: 1.5,
194
+ maxWidth: 260
195
+ }, Lt = {
196
+ maxHeight: 240,
197
+ overflowY: "auto"
198
+ }, Ae = {
199
+ fontWeight: 600,
200
+ marginTop: 4
201
+ }, kt = {
202
+ ...Ae,
203
+ marginTop: 0
204
+ }, Pe = {
205
+ display: "flex",
206
+ alignItems: "center",
207
+ gap: 6,
208
+ paddingLeft: 4
209
+ }, Ct = (e) => ({
210
+ display: "inline-block",
211
+ width: 12,
212
+ height: 12,
213
+ background: e,
214
+ border: "1px solid rgba(0,0,0,0.15)",
215
+ borderRadius: 2,
216
+ flex: "0 0 auto"
217
+ }), Rt = {
218
+ marginTop: 6,
219
+ cursor: "pointer",
220
+ color: "#1890ff",
221
+ fontSize: 11
222
+ }, Et = {
223
+ marginTop: 4,
224
+ borderTop: "1px solid #eee",
225
+ paddingTop: 4,
226
+ color: "#666"
227
+ }, Oe = {
228
+ fontWeight: 600,
229
+ marginTop: 4
230
+ }, Bt = {
231
+ ...Oe,
232
+ marginTop: 0
233
+ }, Ft = {
234
+ fontStyle: "italic",
235
+ paddingLeft: 4
236
+ }, Ce = (e) => e.reduce((n, r) => n + r.taxa.length, 0), Gt = () => /* @__PURE__ */ s.jsxs("div", { style: Pe, children: [
237
+ /* @__PURE__ */ s.jsx("svg", { width: "12", height: "12", viewBox: "0 0 12 12", "aria-hidden": "true", children: /* @__PURE__ */ s.jsx(
238
+ "polygon",
239
+ {
240
+ points: "3,1 9,1 11,6 9,11 3,11 1,6",
241
+ fill: "#de1e6e",
242
+ stroke: "rgba(0,0,0,0.25)",
243
+ strokeWidth: "0.75"
244
+ }
245
+ ) }),
246
+ /* @__PURE__ */ s.jsx("span", { children: "GBIF occurrences" })
247
+ ] }), Mt = ({ visibleGroups: e, unmappableGroups: n, showGbif: r }) => {
248
+ const [i, o] = L(!1), c = Ce(e), f = Ce(n);
249
+ return c === 0 && f === 0 && !r ? null : /* @__PURE__ */ s.jsxs("div", { style: wt, children: [
250
+ /* @__PURE__ */ s.jsxs("div", { style: Lt, children: [
251
+ e.map((u, a) => /* @__PURE__ */ s.jsxs("div", { children: [
252
+ /* @__PURE__ */ s.jsx("div", { style: a === 0 ? kt : Ae, children: u.label }),
253
+ u.taxa.map((p) => /* @__PURE__ */ s.jsxs("div", { style: Pe, children: [
254
+ /* @__PURE__ */ s.jsx("span", { style: Ct(p.color) }),
255
+ /* @__PURE__ */ s.jsx("span", { style: { fontStyle: "italic" }, children: p.displayName || p.scientificName })
256
+ ] }, p.id))
257
+ ] }, u.rank)),
258
+ r && /* @__PURE__ */ s.jsx(Gt, {})
259
+ ] }),
260
+ f > 0 && /* @__PURE__ */ s.jsxs(s.Fragment, { children: [
261
+ /* @__PURE__ */ s.jsxs(
262
+ "div",
263
+ {
264
+ style: Rt,
265
+ onClick: () => o((u) => !u),
266
+ children: [
267
+ i ? "− Hide" : "+",
268
+ " ",
269
+ f,
270
+ " without map data"
271
+ ]
272
+ }
273
+ ),
274
+ i && /* @__PURE__ */ s.jsx("div", { style: Et, children: n.map((u, a) => /* @__PURE__ */ s.jsxs("div", { children: [
275
+ /* @__PURE__ */ s.jsx(
276
+ "div",
277
+ {
278
+ style: a === 0 ? Bt : Oe,
279
+ children: u.label
280
+ }
281
+ ),
282
+ u.taxa.map((p) => /* @__PURE__ */ s.jsx("div", { style: Ft, children: p.displayName || p.scientificName }, p.id))
283
+ ] }, u.rank)) })
284
+ ] })
285
+ ] });
286
+ }, Nt = [
287
+ "establishmentMeans",
288
+ "degreeOfEstablishment",
289
+ "pathway",
290
+ "threatStatus",
291
+ "year",
292
+ "lifeStage"
293
+ ], De = [
294
+ { key: "nativeendemic", label: "Native endemic", color: "#0F8554" },
295
+ { key: "native", label: "Native", color: "#87C55F" },
296
+ { key: "nativereintroduced", label: "Native reintroduced", color: "#C9DB74" },
297
+ { key: "introduced", label: "Introduced", color: "#FE88B1" },
298
+ {
299
+ key: "introducedassistedcolonisation",
300
+ label: "Introduced assisted colonisation",
301
+ color: "#DCB0F2"
302
+ },
303
+ { key: "vagrant", label: "Vagrant", color: "#F6CF71" },
304
+ { key: "uncertain", label: "Uncertain", color: "#8BE0A4" }
305
+ ], ze = Object.fromEntries(
306
+ De.map((e) => [e.key, e.color])
307
+ ), oe = "#66C5CC", _t = (e) => String(e || "").toLowerCase().replace(/[^a-z]/g, ""), He = (e) => {
308
+ const n = e == null ? void 0 : e.establishmentMeans;
309
+ if (n == null || n === "") return null;
310
+ const r = _t(n);
311
+ return ze[r] ? r : "uncertain";
312
+ }, $t = (e) => {
313
+ const n = He(e);
314
+ return n == null ? oe : ze[n];
315
+ }, At = "https://basemaps.cartocdn.com/gl/positron-gl-style/style.json", Ve = "gbif-visible", Pt = (e) => pt(Ve, e), Re = (e) => ft(Ve, e), Ot = "/v2/map/occurrence/density/{z}/{x}/{y}@1x.png?srs=EPSG%3A3857&style=iNaturalist.poly&bin=hex&hexPerTile=64&hasCoordinate=true&hasGeospatialIssue=false&occurrenceStatus=PRESENT&checklistKey={checklistKey}&taxonKey={taxonKey}", X = "col-focal-distributions", U = "col-focal-fill", de = "col-focal-line", re = "col-gbif-occurrences", M = "col-gbif-occurrences", ue = (e) => `col-descendant-${e}`, J = (e) => `col-descendant-fill-${e}`, Q = (e) => `col-descendant-line-${e}`, pe = /* @__PURE__ */ new Map(), Ee = (e, n) => {
316
+ const r = `${e}:${n}`;
317
+ if (pe.has(r)) return pe.get(r);
318
+ const i = `${A.dataApi}vocab/area/${r}`, o = te(i, {
319
+ headers: { Accept: "application/geo+json" }
320
+ }).then(
321
+ (c) => c.data,
322
+ () => null
323
+ );
324
+ return pe.set(r, o), o;
325
+ }, ee = (e) => String(e).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;"), Ue = (e) => {
326
+ var i, o;
327
+ const n = ((i = e == null ? void 0 : e.area) == null ? void 0 : i.name) || ((o = e == null ? void 0 : e.area) == null ? void 0 : o.globalId) || "", r = Nt.map((c) => [c, e == null ? void 0 : e[c]]).filter(([, c]) => c != null && c !== "").map(
328
+ ([c, f]) => `<div><strong>${ee(c)}:</strong> ${ee(f)}</div>`
329
+ ).join("");
330
+ return `<div style="min-width:180px"><div style="font-weight:600;margin-bottom:4px">${ee(
331
+ n
332
+ )}</div>${r}</div>`;
333
+ }, Dt = (e, n) => `<div style="font-weight:600;font-style:italic;margin-bottom:4px">${ee(
334
+ e.scientificName
335
+ )}</div><div style="color:#888;margin-bottom:4px">${ee(e.rank || "")}</div>` + Ue(n), zt = {
336
+ subspecies: "subspecies",
337
+ variety: "varieties",
338
+ subvariety: "subvarieties",
339
+ form: "forms",
340
+ subform: "subforms",
341
+ "infraspecific name": "infraspecific names"
342
+ }, Be = (e) => zt[e] || e, We = (e) => {
343
+ if (!e) return "";
344
+ const n = e.trim().split(/\s+/);
345
+ return n[n.length - 1];
346
+ }, Ht = () => /* @__PURE__ */ s.jsxs("div", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [
347
+ /* @__PURE__ */ s.jsx("svg", { width: "12", height: "12", viewBox: "0 0 12 12", "aria-hidden": "true", children: /* @__PURE__ */ s.jsx(
348
+ "polygon",
349
+ {
350
+ points: "3,1 9,1 11,6 9,11 3,11 1,6",
351
+ fill: "#de1e6e",
352
+ stroke: "rgba(0,0,0,0.25)",
353
+ strokeWidth: "0.75"
354
+ }
355
+ ) }),
356
+ /* @__PURE__ */ s.jsx("span", { children: "GBIF occurrences" })
357
+ ] }), Vt = (e) => {
358
+ var f;
359
+ let n = 1 / 0, r = 1 / 0, i = -1 / 0, o = -1 / 0;
360
+ const c = (u) => {
361
+ if (typeof u[0] == "number") {
362
+ const [a, p] = u;
363
+ a < n && (n = a), a > i && (i = a), p < r && (r = p), p > o && (o = p);
364
+ } else
365
+ for (let a = 0; a < u.length; a++) c(u[a]);
366
+ };
367
+ for (let u = 0; u < e.length; u++) {
368
+ const a = (f = e[u]) == null ? void 0 : f.geometry;
369
+ a != null && a.coordinates && c(a.coordinates);
370
+ }
371
+ return n === 1 / 0 ? null : [
372
+ [n, r],
373
+ [i, o]
374
+ ];
375
+ }, Fe = (e) => e ? e.type === "FeatureCollection" ? e.features || [] : [e] : [], Ge = () => {
376
+ var e;
377
+ return typeof ((e = D) == null ? void 0 : e.supported) == "function" ? D.supported() : typeof WebGLRenderingContext < "u";
378
+ }, Ut = ({
379
+ records: e,
380
+ onUnmappable: n,
381
+ datasetKey: r,
382
+ focalTaxon: i,
383
+ rankOrder: o,
384
+ gbifChecklistKey: c,
385
+ // true | null → show GBIF layer; false → GBIF API returned 0 occurrences,
386
+ // grey out the toggle and skip loading tiles. Defaults to true so the
387
+ // component works without the count check.
388
+ gbifAvailable: f = !0
389
+ }) => {
390
+ var Ie;
391
+ const u = G(null), a = G(null), p = G(null), w = G(/* @__PURE__ */ new Map()), j = G(/* @__PURE__ */ new Map()), k = G(/* @__PURE__ */ new Map()), C = G(!1), S = G(!1), R = G(/* @__PURE__ */ new Set()), [I, P] = L(!1), [E, _] = L(!1), [y, m] = L({
392
+ status: "idle",
393
+ // idle | loading | ready | empty | error
394
+ taxa: []
395
+ }), [z, O] = L(!0), W = !!c && (!e || e.length === 0), [B, he] = L(
396
+ () => Pt(!0)
397
+ ), [K, ge] = L(/* @__PURE__ */ new Set()), [Ke, me] = L(!1), ie = G(!1), Te = () => {
398
+ he((t) => {
399
+ const d = !t;
400
+ return Re(d), d;
401
+ });
402
+ }, ye = () => {
403
+ he(!0), Re(!0);
404
+ }, be = ne(() => {
405
+ if (!(e != null && e.length)) return [];
406
+ const t = /* @__PURE__ */ new Set();
407
+ return e.forEach((d) => {
408
+ const l = He(d);
409
+ l != null && t.add(l);
410
+ }), De.filter((d) => t.has(d.key));
411
+ }, [e]), T = ne(() => y.status !== "ready" ? {} : It(
412
+ y.taxa.filter((t) => t.mappable.length > 0),
413
+ o || []
414
+ ), [y, o]), ae = ne(() => {
415
+ if (y.status !== "ready")
416
+ return { visibleGroups: [], unmappableGroups: [] };
417
+ const t = (h) => ({
418
+ ...h,
419
+ color: T[h.id],
420
+ displayName: We(h.scientificName)
421
+ }), d = (h) => {
422
+ const x = {};
423
+ return h.forEach((b) => {
424
+ (x[b.rank] = x[b.rank] || []).push(t(b));
425
+ }), se.filter((b) => x[b]).map((b) => ({
426
+ rank: b,
427
+ label: Be(b),
428
+ taxa: x[b]
429
+ }));
430
+ }, l = d(
431
+ y.taxa.filter(
432
+ (h) => h.mappable.length > 0 && K.has(h.id)
433
+ )
434
+ ), g = d(
435
+ y.taxa.filter((h) => h.mappable.length === 0)
436
+ );
437
+ return { visibleGroups: l, unmappableGroups: g };
438
+ }, [y, T, K]), xe = ae.visibleGroups.length > 0;
439
+ N(() => {
440
+ if (!u.current || a.current || !Ge()) return;
441
+ const t = new D.Map({
442
+ container: u.current,
443
+ style: At,
444
+ center: [0, 20],
445
+ zoom: 1,
446
+ minZoom: 0,
447
+ attributionControl: !1,
448
+ renderWorldCopies: !0
449
+ });
450
+ t.addControl(
451
+ new D.AttributionControl({ compact: !0 }),
452
+ "bottom-right"
453
+ ), t.addControl(
454
+ new D.NavigationControl({ showCompass: !1 }),
455
+ "top-left"
456
+ ), a.current = t, t.on("load", () => {
457
+ P(!0);
458
+ const l = t.getContainer().querySelector(".maplibregl-ctrl-attrib");
459
+ l && l.classList.remove("maplibregl-compact-show");
460
+ });
461
+ const d = typeof ResizeObserver < "u" ? new ResizeObserver(() => t.resize()) : null;
462
+ return d && d.observe(u.current), () => {
463
+ d && d.disconnect(), p.current && (p.current.remove(), p.current = null), t.remove(), a.current = null, C.current = !1, S.current = !1, R.current = /* @__PURE__ */ new Set();
464
+ };
465
+ }, []), N(() => {
466
+ if (!I || !(e != null && e.length)) return;
467
+ const t = a.current;
468
+ if (!t) return;
469
+ let d = !1;
470
+ return _(!1), Promise.allSettled(
471
+ e.map(
472
+ (l) => Ee(l.area.gazetteer, l.area.id).then((g) => ({
473
+ record: l,
474
+ geojson: g
475
+ }))
476
+ )
477
+ ).then((l) => {
478
+ if (d) return;
479
+ const g = [], h = /* @__PURE__ */ new Map();
480
+ let x = 0;
481
+ l.forEach((v, F) => {
482
+ if (v.status !== "fulfilled" || !v.value.geojson) {
483
+ x += 1;
484
+ return;
485
+ }
486
+ const { record: H, geojson: V } = v.value, ce = $t(H), Y = `focal-${F}`;
487
+ h.set(Y, H), Fe(V).forEach((q) => {
488
+ g.push({
489
+ ...q,
490
+ properties: {
491
+ ...q.properties || {},
492
+ _recordKey: Y,
493
+ _color: ce
494
+ }
495
+ });
496
+ });
497
+ }), w.current = h;
498
+ const b = { type: "FeatureCollection", features: g };
499
+ if (t.getSource(X))
500
+ t.getSource(X).setData(b);
501
+ else {
502
+ const v = t.getLayer(M) ? M : void 0;
503
+ t.addSource(X, { type: "geojson", data: b }), t.addLayer(
504
+ {
505
+ id: U,
506
+ type: "fill",
507
+ source: X,
508
+ paint: {
509
+ "fill-color": ["coalesce", ["get", "_color"], oe],
510
+ "fill-opacity": 0.65
511
+ }
512
+ },
513
+ v
514
+ ), t.addLayer(
515
+ {
516
+ id: de,
517
+ type: "line",
518
+ source: X,
519
+ paint: {
520
+ "line-color": ["coalesce", ["get", "_color"], oe],
521
+ "line-width": 1
522
+ }
523
+ },
524
+ v
525
+ ), t.on("click", U, Ye), t.on("mouseenter", U, ve), t.on("mouseleave", U, je), C.current = !0;
526
+ }
527
+ if (g.length > 0) {
528
+ const v = Vt(g);
529
+ v && t.fitBounds(v, { padding: 20, animate: !1 });
530
+ }
531
+ typeof n == "function" && n(x), _(!0);
532
+ }), () => {
533
+ d = !0;
534
+ };
535
+ }, [I, e]);
536
+ const Ye = (t) => {
537
+ var x, b;
538
+ const d = a.current;
539
+ if (!d) return;
540
+ const l = (x = t.features) == null ? void 0 : x[0], g = (b = l == null ? void 0 : l.properties) == null ? void 0 : b._recordKey, h = g ? w.current.get(g) : null;
541
+ h && (p.current && p.current.remove(), p.current = new D.Popup({ closeButton: !0, maxWidth: "320px" }).setLngLat(t.lngLat).setHTML(Ue(h)).addTo(d));
542
+ }, ve = () => {
543
+ const t = a.current;
544
+ t && (t.getCanvas().style.cursor = "pointer");
545
+ }, je = () => {
546
+ const t = a.current;
547
+ t && (t.getCanvas().style.cursor = "");
548
+ };
549
+ N(() => {
550
+ const t = a.current;
551
+ if (!t || !C.current) return;
552
+ const d = z ? "visible" : "none";
553
+ t.getLayer(U) && t.setLayoutProperty(U, "visibility", d), t.getLayer(de) && t.setLayoutProperty(de, "visibility", d);
554
+ }, [z, E]), N(() => {
555
+ if (!I) return;
556
+ const t = a.current;
557
+ if (!t || ((() => {
558
+ t.getLayer(M) && t.removeLayer(M), t.getSource(re) && t.removeSource(re), S.current = !1;
559
+ })(), !c || !(i != null && i.id)) || f === !1) return;
560
+ const l = (A.gbifApi + Ot).replace("{checklistKey}", encodeURIComponent(c)).replace("{taxonKey}", encodeURIComponent(i.id)), g = A.gbifPortal + "/occurrence/search?checklist_key=" + encodeURIComponent(c) + "&taxon_key=" + encodeURIComponent(i.id);
561
+ t.addSource(re, {
562
+ type: "raster",
563
+ tiles: [l],
564
+ tileSize: 256,
565
+ attribution: '<a href="' + g + '" target="_blank" rel="noopener">GBIF</a> occurrence data'
566
+ }), t.addLayer({
567
+ id: M,
568
+ type: "raster",
569
+ source: re,
570
+ paint: { "raster-opacity": 0.9 },
571
+ layout: { visibility: B ? "visible" : "none" }
572
+ }), S.current = !0;
573
+ }, [I, c, i == null ? void 0 : i.id, f]), N(() => {
574
+ const t = a.current;
575
+ if (!t || !S.current) return;
576
+ const d = B ? "visible" : "none";
577
+ t.getLayer(M) && t.setLayoutProperty(M, "visibility", d);
578
+ }, [B]), N(() => {
579
+ if (!I) return;
580
+ const t = a.current;
581
+ if (!t || (R.current.forEach((l) => {
582
+ t.getLayer(J(l)) && t.removeLayer(J(l)), t.getLayer(Q(l)) && t.removeLayer(Q(l)), t.getSource(ue(l)) && t.removeSource(ue(l));
583
+ }), R.current = /* @__PURE__ */ new Set(), j.current = /* @__PURE__ */ new Map(), k.current = /* @__PURE__ */ new Map(), y.status !== "ready")) return;
584
+ const d = T;
585
+ y.taxa.forEach((l) => {
586
+ l.mappable.length !== 0 && (j.current.set(l.id, l), Promise.allSettled(
587
+ l.mappable.map(
588
+ (g) => Ee(g.area.gazetteer, g.area.id).then((h) => ({
589
+ record: g,
590
+ geojson: h
591
+ }))
592
+ )
593
+ ).then((g) => {
594
+ if (!a.current) return;
595
+ const h = [];
596
+ g.forEach((F, H) => {
597
+ if (F.status !== "fulfilled" || !F.value.geojson) return;
598
+ const { record: V, geojson: ce } = F.value, Y = `desc-${l.id}-${H}`;
599
+ k.current.set(Y, { taxon: l, record: V }), Fe(ce).forEach((q) => {
600
+ h.push({
601
+ ...q,
602
+ properties: {
603
+ ...q.properties || {},
604
+ _recordKey: Y
605
+ }
606
+ });
607
+ });
608
+ });
609
+ const x = d[l.id] || oe, b = { type: "FeatureCollection", features: h }, v = ue(l.id);
610
+ if (a.current.getSource(v))
611
+ a.current.getSource(v).setData(b);
612
+ else {
613
+ a.current.addSource(v, { type: "geojson", data: b });
614
+ const F = J(l.id), H = Q(l.id), V = a.current.getLayer(M) ? M : void 0;
615
+ a.current.addLayer(
616
+ {
617
+ id: F,
618
+ type: "fill",
619
+ source: v,
620
+ paint: { "fill-color": x, "fill-opacity": 0.55 },
621
+ layout: { visibility: "none" }
622
+ },
623
+ V
624
+ ), a.current.addLayer(
625
+ {
626
+ id: H,
627
+ type: "line",
628
+ source: v,
629
+ paint: { "line-color": x, "line-width": 2 },
630
+ layout: { visibility: "none" }
631
+ },
632
+ V
633
+ ), a.current.on("click", F, qe), a.current.on("mouseenter", F, ve), a.current.on("mouseleave", F, je), R.current.add(l.id);
634
+ }
635
+ }));
636
+ });
637
+ }, [I, y, T]);
638
+ const qe = (t) => {
639
+ var x, b;
640
+ const d = a.current;
641
+ if (!d) return;
642
+ const l = (x = t.features) == null ? void 0 : x[0], g = (b = l == null ? void 0 : l.properties) == null ? void 0 : b._recordKey, h = g ? k.current.get(g) : null;
643
+ h && (p.current && p.current.remove(), p.current = new D.Popup({ closeButton: !0, maxWidth: "320px" }).setLngLat(t.lngLat).setHTML(Dt(h.taxon, h.record)).addTo(d));
644
+ };
645
+ N(() => {
646
+ const t = a.current;
647
+ t && R.current.forEach((d) => {
648
+ const l = K.has(d) ? "visible" : "none";
649
+ t.getLayer(J(d)) && t.setLayoutProperty(J(d), "visibility", l), t.getLayer(Q(d)) && t.setLayoutProperty(Q(d), "visibility", l);
650
+ });
651
+ }, [K, y]);
652
+ const Se = () => {
653
+ var l;
654
+ if (ie.current || !r || !i || !o) return;
655
+ const t = (l = i == null ? void 0 : i.name) == null ? void 0 : l.rank;
656
+ !t || t !== "species" && !se.includes(t) || $e(t, o).length === 0 || (ie.current = !0, m({ status: "loading", taxa: [] }), St({ datasetKey: r, focalTaxon: i, rankOrder: o }).then(
657
+ ({ taxa: g, descendantsFailed: h }) => {
658
+ if (h) {
659
+ m({ status: "error", taxa: [] });
660
+ return;
661
+ }
662
+ if (g.length === 0) {
663
+ m({ status: "empty", taxa: [] });
664
+ return;
665
+ }
666
+ m({ status: "ready", taxa: g });
667
+ }
668
+ ));
669
+ }, Ze = () => {
670
+ me(!0), Se();
671
+ }, Xe = ne(() => {
672
+ if (y.status !== "ready") return [];
673
+ const t = {};
674
+ return y.taxa.filter((d) => d.mappable.length > 0).forEach((d) => {
675
+ (t[d.rank] = t[d.rank] || []).push(d);
676
+ }), se.filter((d) => t[d]).map((d) => ({
677
+ rank: d,
678
+ label: Be(d),
679
+ taxa: t[d].slice().sort(
680
+ (l, g) => l.scientificName.localeCompare(g.scientificName)
681
+ )
682
+ }));
683
+ }, [y]), Je = (t) => {
684
+ ge((d) => {
685
+ const l = new Set(d);
686
+ return l.has(t) ? l.delete(t) : l.add(t), l;
687
+ });
688
+ }, Qe = (t) => {
689
+ ge((d) => {
690
+ const l = new Set(d), g = t.every((h) => d.has(h.id));
691
+ return t.forEach((h) => {
692
+ g ? l.delete(h.id) : l.add(h.id);
693
+ }), l;
694
+ });
695
+ };
696
+ if (!Ge())
697
+ return /* @__PURE__ */ s.jsx(
698
+ "div",
699
+ {
700
+ style: {
701
+ padding: 12,
702
+ background: "#fafafa",
703
+ border: "1px solid #eee",
704
+ borderRadius: 4,
705
+ color: "#666",
706
+ fontSize: 12
707
+ },
708
+ children: "Maps require WebGL, which your browser doesn't support."
709
+ }
710
+ );
711
+ if (W && !B)
712
+ return /* @__PURE__ */ s.jsxs(
713
+ "div",
714
+ {
715
+ className: "col-distributions-map col-distributions-map--collapsed",
716
+ style: {
717
+ display: "flex",
718
+ alignItems: "center",
719
+ gap: 6,
720
+ padding: "8px 12px",
721
+ background: "#fafafa",
722
+ border: "1px solid #eee",
723
+ borderRadius: 4,
724
+ color: "#666",
725
+ fontSize: 12
726
+ },
727
+ children: [
728
+ /* @__PURE__ */ s.jsx("span", { children: "No curated distribution data." }),
729
+ /* @__PURE__ */ s.jsx(
730
+ "a",
731
+ {
732
+ role: "button",
733
+ tabIndex: 0,
734
+ style: { cursor: "pointer" },
735
+ onClick: ye,
736
+ onKeyDown: (t) => {
737
+ (t.key === "Enter" || t.key === " ") && (t.preventDefault(), ye());
738
+ },
739
+ children: "Show GBIF occurrences"
740
+ }
741
+ )
742
+ ]
743
+ }
744
+ );
745
+ const et = ((Ie = i == null ? void 0 : i.name) == null ? void 0 : Ie.scientificName) || "This taxon";
746
+ return /* @__PURE__ */ s.jsxs("div", { className: "col-distributions-map", style: { position: "relative" }, children: [
747
+ /* @__PURE__ */ s.jsx(
748
+ "div",
749
+ {
750
+ ref: u,
751
+ style: { height: 360, width: "100%", background: "#f5f5f5" }
752
+ }
753
+ ),
754
+ /* @__PURE__ */ s.jsx(
755
+ Wt,
756
+ {
757
+ open: Ke,
758
+ onOpen: Ze,
759
+ onClose: () => me(!1),
760
+ focalName: et,
761
+ focalReady: E,
762
+ focalVisible: z,
763
+ onToggleFocal: () => O((t) => !t),
764
+ gbifEnabled: !!c,
765
+ gbifVisible: B,
766
+ gbifAvailable: f,
767
+ onToggleGbif: Te,
768
+ descendantStatus: y.status,
769
+ descendantsByRank: Xe,
770
+ descendantColors: T,
771
+ visibleTaxonIds: K,
772
+ onToggleTaxon: Je,
773
+ onToggleRankGroup: Qe,
774
+ onRetry: () => {
775
+ ie.current = !1, m({ status: "idle", taxa: [] }), Se();
776
+ }
777
+ }
778
+ ),
779
+ !xe && (be.length > 0 || c && f !== !1 && B) && /* @__PURE__ */ s.jsxs(
780
+ "div",
781
+ {
782
+ style: {
783
+ position: "absolute",
784
+ bottom: 8,
785
+ left: 8,
786
+ zIndex: 1,
787
+ background: "#fff",
788
+ borderRadius: 4,
789
+ boxShadow: "0 1px 4px rgba(0,0,0,0.2)",
790
+ padding: "6px 8px",
791
+ fontSize: 12,
792
+ lineHeight: 1.5
793
+ },
794
+ children: [
795
+ be.map((t) => /* @__PURE__ */ s.jsxs(
796
+ "div",
797
+ {
798
+ style: { display: "flex", alignItems: "center", gap: 6 },
799
+ children: [
800
+ /* @__PURE__ */ s.jsx(
801
+ "span",
802
+ {
803
+ style: {
804
+ display: "inline-block",
805
+ width: 12,
806
+ height: 12,
807
+ background: t.color,
808
+ border: "1px solid rgba(0,0,0,0.15)",
809
+ borderRadius: 2
810
+ }
811
+ }
812
+ ),
813
+ /* @__PURE__ */ s.jsx("span", { children: t.label })
814
+ ]
815
+ },
816
+ t.key
817
+ )),
818
+ c && f !== !1 && B && /* @__PURE__ */ s.jsx(Ht, {})
819
+ ]
820
+ }
821
+ ),
822
+ xe && /* @__PURE__ */ s.jsx(
823
+ Mt,
824
+ {
825
+ visibleGroups: ae.visibleGroups,
826
+ unmappableGroups: ae.unmappableGroups,
827
+ showGbif: !!c && f !== !1 && B
828
+ }
829
+ )
830
+ ] });
831
+ }, Wt = ({
832
+ open: e,
833
+ onOpen: n,
834
+ onClose: r,
835
+ focalName: i,
836
+ focalReady: o,
837
+ focalVisible: c,
838
+ onToggleFocal: f,
839
+ gbifEnabled: u,
840
+ gbifVisible: a,
841
+ gbifAvailable: p,
842
+ onToggleGbif: w,
843
+ descendantStatus: j,
844
+ descendantsByRank: k,
845
+ descendantColors: C,
846
+ visibleTaxonIds: S,
847
+ onToggleTaxon: R,
848
+ onToggleRankGroup: I,
849
+ onRetry: P
850
+ }) => e ? /* @__PURE__ */ s.jsxs(
851
+ "div",
852
+ {
853
+ style: {
854
+ position: "absolute",
855
+ top: 10,
856
+ right: 10,
857
+ zIndex: 2,
858
+ background: "#fff",
859
+ borderRadius: 4,
860
+ boxShadow: "0 1px 4px rgba(0,0,0,0.2)",
861
+ padding: "6px 10px",
862
+ fontSize: 12,
863
+ lineHeight: 1.5,
864
+ maxHeight: 320,
865
+ overflowY: "auto",
866
+ minWidth: 160
867
+ },
868
+ onMouseLeave: r,
869
+ children: [
870
+ /* @__PURE__ */ s.jsxs("div", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [
871
+ /* @__PURE__ */ s.jsx(
872
+ "input",
873
+ {
874
+ type: "checkbox",
875
+ checked: c,
876
+ disabled: !o,
877
+ onChange: f
878
+ }
879
+ ),
880
+ /* @__PURE__ */ s.jsx("span", { style: { fontStyle: "italic" }, children: i })
881
+ ] }),
882
+ u && /* @__PURE__ */ s.jsxs(
883
+ "div",
884
+ {
885
+ style: {
886
+ display: "flex",
887
+ alignItems: "center",
888
+ gap: 6,
889
+ opacity: p === !1 ? 0.5 : 1
890
+ },
891
+ title: p === !1 ? "GBIF has no occurrence records for this taxon." : void 0,
892
+ children: [
893
+ /* @__PURE__ */ s.jsx(
894
+ "input",
895
+ {
896
+ type: "checkbox",
897
+ checked: p === !1 ? !1 : a,
898
+ disabled: p === !1,
899
+ onChange: w
900
+ }
901
+ ),
902
+ /* @__PURE__ */ s.jsx("span", { children: "GBIF occurrences" })
903
+ ]
904
+ }
905
+ ),
906
+ j === "loading" && /* @__PURE__ */ s.jsx("div", { style: { marginTop: 6, color: "#888" }, children: "Loading descendants…" }),
907
+ j === "error" && /* @__PURE__ */ s.jsxs("div", { style: { marginTop: 6, color: "#888" }, children: [
908
+ "Couldn't load descendants.",
909
+ " ",
910
+ /* @__PURE__ */ s.jsx("a", { onClick: P, style: { cursor: "pointer" }, children: "Retry" })
911
+ ] }),
912
+ j === "ready" && k.map((E) => {
913
+ const _ = E.taxa.every((m) => S.has(m.id)), y = E.taxa.some((m) => S.has(m.id));
914
+ return /* @__PURE__ */ s.jsxs("div", { style: { marginTop: 6 }, children: [
915
+ /* @__PURE__ */ s.jsxs(
916
+ "label",
917
+ {
918
+ style: {
919
+ display: "flex",
920
+ alignItems: "center",
921
+ gap: 6,
922
+ fontWeight: 600
923
+ },
924
+ children: [
925
+ /* @__PURE__ */ s.jsx(
926
+ "input",
927
+ {
928
+ type: "checkbox",
929
+ checked: _,
930
+ ref: (m) => {
931
+ m && (m.indeterminate = !_ && y);
932
+ },
933
+ onChange: () => I(E.taxa)
934
+ }
935
+ ),
936
+ E.label
937
+ ]
938
+ }
939
+ ),
940
+ /* @__PURE__ */ s.jsx("div", { style: { paddingLeft: 18 }, children: E.taxa.map((m) => /* @__PURE__ */ s.jsxs(
941
+ "label",
942
+ {
943
+ style: {
944
+ display: "flex",
945
+ alignItems: "center",
946
+ gap: 6
947
+ },
948
+ children: [
949
+ /* @__PURE__ */ s.jsx(
950
+ "input",
951
+ {
952
+ type: "checkbox",
953
+ checked: S.has(m.id),
954
+ onChange: () => R(m.id)
955
+ }
956
+ ),
957
+ /* @__PURE__ */ s.jsx(
958
+ "span",
959
+ {
960
+ style: {
961
+ display: "inline-block",
962
+ width: 10,
963
+ height: 10,
964
+ background: C[m.id],
965
+ border: "1px solid rgba(0,0,0,0.15)",
966
+ borderRadius: 2
967
+ }
968
+ }
969
+ ),
970
+ /* @__PURE__ */ s.jsx("span", { style: { fontStyle: "italic" }, children: We(m.scientificName) })
971
+ ]
972
+ },
973
+ m.id
974
+ )) })
975
+ ] }, E.rank);
976
+ })
977
+ ]
978
+ }
979
+ ) : /* @__PURE__ */ s.jsx(
980
+ "button",
981
+ {
982
+ type: "button",
983
+ onClick: n,
984
+ onMouseEnter: n,
985
+ title: "Layers",
986
+ style: {
987
+ position: "absolute",
988
+ top: 10,
989
+ right: 10,
990
+ zIndex: 2,
991
+ width: 30,
992
+ height: 30,
993
+ background: "#fff",
994
+ border: "1px solid rgba(0,0,0,0.2)",
995
+ borderRadius: 4,
996
+ cursor: "pointer",
997
+ fontSize: 18,
998
+ lineHeight: "26px",
999
+ padding: 0,
1000
+ boxShadow: "0 1px 4px rgba(0,0,0,0.2)"
1001
+ },
1002
+ children: "+"
1003
+ }
1004
+ ), Kt = (e) => {
1005
+ var n, r;
1006
+ return ((n = e == null ? void 0 : e.area) == null ? void 0 : n.gazetteer) !== "text" && !!((r = e == null ? void 0 : e.area) != null && r.globalId);
1007
+ }, Me = ({ datasetKey: e, data: n }) => {
1008
+ const [r, i] = L({});
1009
+ return N(() => {
1010
+ let o = !1;
1011
+ for (let c = 0; c < n.length; c++)
1012
+ if (n[c].gazetteer === "iso") {
1013
+ o = !0;
1014
+ break;
1015
+ }
1016
+ o && te(`${A.dataApi}vocab/country`).then((c) => {
1017
+ i(it(c.data, "alpha3"));
1018
+ });
1019
+ }, []), /* @__PURE__ */ s.jsx("div", { children: n.map((o, c) => /* @__PURE__ */ s.jsxs("span", { children: [
1020
+ (o == null ? void 0 : o.merged) && /* @__PURE__ */ s.jsx(
1021
+ ut,
1022
+ {
1023
+ createdBy: o == null ? void 0 : o.createdBy,
1024
+ datasetKey: o.datasetKey,
1025
+ sourceDatasetKey: o == null ? void 0 : o.sourceDatasetKey,
1026
+ verbatimSourceKey: o == null ? void 0 : o.verbatimSourceKey,
1027
+ style: { marginRight: "4px" }
1028
+ }
1029
+ ),
1030
+ ($(r, `[${$(o, "area.name")}].name`) ? at($(r, `[${$(o, "area.name")}].name`)) : null) || $(o, "area.name") || $(o, "area.globalId"),
1031
+ " ",
1032
+ o.referenceId && /* @__PURE__ */ s.jsx(
1033
+ mt,
1034
+ {
1035
+ datasetKey: e,
1036
+ referenceId: o.referenceId,
1037
+ placement: "bottom"
1038
+ }
1039
+ ),
1040
+ c < n.length - 1 && ", "
1041
+ ] }, c)) });
1042
+ }, an = ({
1043
+ datasetKey: e,
1044
+ data: n,
1045
+ style: r,
1046
+ showDistributionMap: i,
1047
+ focalTaxon: o,
1048
+ rankOrder: c,
1049
+ gbifChecklistKey: f
1050
+ }) => {
1051
+ const u = n.filter(Kt), a = n.length - u.length, p = !!f, w = n.length > 0, [j, k] = L("map"), [C, S] = L(0), [R, I] = L(null);
1052
+ N(() => {
1053
+ if (!f || !(o != null && o.id)) {
1054
+ I(null);
1055
+ return;
1056
+ }
1057
+ I(null);
1058
+ let O = !1;
1059
+ return ct.get(`${A.gbifApi}/v1/occurrence/search`, {
1060
+ params: {
1061
+ checklistKey: f,
1062
+ taxonKey: o.id,
1063
+ hasCoordinate: !0,
1064
+ hasGeospatialIssue: !1,
1065
+ occurrenceStatus: "PRESENT",
1066
+ limit: 0
1067
+ }
1068
+ }).then(
1069
+ (W) => {
1070
+ var B;
1071
+ O || I(((B = W == null ? void 0 : W.data) == null ? void 0 : B.count) ?? 0);
1072
+ },
1073
+ () => {
1074
+ O || I(null);
1075
+ }
1076
+ ), () => {
1077
+ O = !0;
1078
+ };
1079
+ }, [f, o == null ? void 0 : o.id]);
1080
+ const P = p ? R === null || R > 0 : !1, E = u.length > 0 && C >= u.length, _ = i && (u.length > 0 || P) && !(u.length > 0 && E && !P);
1081
+ if (!_ && p && u.length === 0 && R === 0)
1082
+ return /* @__PURE__ */ s.jsx("div", { style: r, children: /* @__PURE__ */ s.jsx("span", { style: { color: "#888" }, children: "No occurrence data on GBIF for this taxon." }) });
1083
+ if (!_)
1084
+ return w ? /* @__PURE__ */ s.jsx("div", { style: r, children: /* @__PURE__ */ s.jsx(Me, { datasetKey: e, data: n }) }) : null;
1085
+ const y = a + C, m = w, z = m ? j : "map";
1086
+ return /* @__PURE__ */ s.jsxs("div", { style: r, children: [
1087
+ m ? /* @__PURE__ */ s.jsxs(
1088
+ le.Group,
1089
+ {
1090
+ size: "small",
1091
+ value: z,
1092
+ onChange: (O) => k(O.target.value),
1093
+ style: { marginBottom: 8 },
1094
+ children: [
1095
+ /* @__PURE__ */ s.jsx(le.Button, { value: "map", children: "Map" }),
1096
+ /* @__PURE__ */ s.jsx(le.Button, { value: "list", children: "List" })
1097
+ ]
1098
+ }
1099
+ ) : (
1100
+ // Reserve the vertical space the Map/List toggle would occupy so the
1101
+ // map's top edge lines up with the "Distributions" label.
1102
+ /* @__PURE__ */ s.jsx("div", { style: { height: 24, marginBottom: 8 } })
1103
+ ),
1104
+ z === "map" ? /* @__PURE__ */ s.jsxs(s.Fragment, { children: [
1105
+ /* @__PURE__ */ s.jsx(
1106
+ Ut,
1107
+ {
1108
+ records: u,
1109
+ onUnmappable: S,
1110
+ datasetKey: e,
1111
+ focalTaxon: o,
1112
+ rankOrder: c,
1113
+ gbifChecklistKey: f,
1114
+ gbifAvailable: P
1115
+ }
1116
+ ),
1117
+ m && y > 0 && /* @__PURE__ */ s.jsx("div", { style: { marginTop: 6 }, children: /* @__PURE__ */ s.jsxs("a", { onClick: () => k("list"), style: { cursor: "pointer" }, children: [
1118
+ "+",
1119
+ y,
1120
+ " distribution",
1121
+ y === 1 ? "" : "s",
1122
+ " not on map"
1123
+ ] }) })
1124
+ ] }) : /* @__PURE__ */ s.jsx(Me, { datasetKey: e, data: n })
1125
+ ] });
1126
+ };
1127
+ export {
1128
+ an as D,
1129
+ mt as R
1130
+ };
1131
+ //# sourceMappingURL=Distributions-CXIEJ6e6.js.map