baselode 0.1.21 → 0.1.22

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/baselode.js CHANGED
@@ -1,11 +1,11 @@
1
- import { _ as Nt, w as G, H as N, P as de, F as L, T as M, c as vt, L as re, a as oe, D as j, A as Y, b as W, E as he, N as ge, d as Ae, M as ve, G as le, e as ce, B as Et, f as et, g as ke, h as ze, i as tt, j as Ue, k as At, l as nt, m as St, n as Tt, o as It } from "./baselode3dScene-CLEvddGM.js";
2
- import { p as Nr, q as vr, r as Er, s as Ar, t as Sr, u as Tr, v as Ir, x as Cr, y as Lr, z as Mr, C as Pr, I as Or, J as xr, K as Dr, O as Rr, Q as zr, R as $r, S as kr, U as Fr, V as wr, W as Hr, X as Gr, Y as Ur, Z as Br, $ as Vr, a0 as jr, a1 as Yr, a2 as Wr, a3 as qr, a4 as Xr, a5 as Kr, a6 as Zr, a7 as Jr, a8 as Qr, a9 as eo, aa as to, ab as no, ac as ro, ad as oo, ae as so, af as io, ag as ao, ah as lo, ai as co, aj as uo, ak as mo, al as fo, am as po, an as ho, ao as go, ap as yo, aq as bo, ar as _o, as as No, at as vo, au as Eo, av as Ao, aw as So, ax as To, ay as Io, az as Co, aA as Lo, aB as Mo, aC as Po, aD as Oo, aE as xo, aF as Do, aG as Ro, aH as zo, aI as $o, aJ as ko, aK as Fo, aL as wo, aM as Ho, aN as Go, aO as Uo, aP as Bo, aQ as Vo, aR as jo, aS as Yo, aT as Wo, aU as qo, aV as Xo, aW as Ko, aX as Zo, aY as Jo, aZ as Qo, a_ as es, a$ as ts, b0 as ns, b1 as rs, b2 as os, b3 as ss, b4 as is, b5 as as, b6 as ls, b7 as cs, b8 as us, b9 as ds, ba as ms, bb as fs, bc as ps, bd as hs, be as gs, bf as ys, bg as bs } from "./baselode3dScene-CLEvddGM.js";
1
+ import { _ as Nt, w as U, H as N, P as de, F as M, T as O, c as vt, L as re, a as oe, D as V, A as Y, b as W, E as pe, N as ge, d as Ee, M as ve, G as le, e as ce, B as Et, f as et, g as $e, h as ze, i as tt, j as Ge, k as At, l as nt, m as St, n as Tt, o as Lt, p as It } from "./baselode3dScene-4nzt80B1.js";
2
+ import { q as vr, r as Er, s as Ar, t as Sr, u as Tr, v as Lr, x as Ir, y as Cr, z as Mr, C as Pr, I as Or, J as xr, K as Dr, O as Rr, Q as zr, R as Fr, S as $r, U as kr, V as wr, W as Ur, X as Hr, Y as Gr, Z as Br, $ as Vr, a0 as jr, a1 as Yr, a2 as Wr, a3 as qr, a4 as Xr, a5 as Kr, a6 as Zr, a7 as Jr, a8 as Qr, a9 as eo, aa as to, ab as no, ac as ro, ad as oo, ae as so, af as io, ag as ao, ah as lo, ai as co, aj as uo, ak as mo, al as fo, am as ho, an as po, ao as go, ap as bo, aq as yo, ar as _o, as as No, at as vo, au as Eo, av as Ao, aw as So, ax as To, ay as Lo, az as Io, aA as Co, aB as Mo, aC as Po, aD as Oo, aE as xo, aF as Do, aG as Ro, aH as zo, aI as Fo, aJ as $o, aK as ko, aL as wo, aM as Uo, aN as Ho, aO as Go, aP as Bo, aQ as Vo, aR as jo, aS as Yo, aT as Wo, aU as qo, aV as Xo, aW as Ko, aX as Zo, aY as Jo, aZ as Qo, a_ as es, a$ as ts, b0 as ns, b1 as rs, b2 as os, b3 as ss, b4 as is, b5 as as, b6 as ls, b7 as cs, b8 as us, b9 as ds, ba as ms, bb as fs, bc as hs, bd as ps, be as gs, bf as bs, bg as ys, bh as _s, bi as Ns, bj as vs, bk as Es, bl as As } from "./baselode3dScene-4nzt80B1.js";
3
3
  import J from "papaparse";
4
- import { jsxs as H, jsx as E, Fragment as Ct } from "react/jsx-runtime";
5
- import { useRef as _e, useState as K, useEffect as ne, useMemo as ee, useCallback as Oe } from "react";
6
- import Ee from "plotly.js-dist-min";
4
+ import { jsxs as w, jsx as S, Fragment as Ct } from "react/jsx-runtime";
5
+ import { useRef as ye, useState as K, useEffect as te, useMemo as ee, useCallback as Pe } from "react";
6
+ import Oe from "plotly.js-dist-min";
7
7
  import * as Q from "three";
8
- function Se(e) {
8
+ function Ae(e) {
9
9
  return (e || "").toString().trim().toLowerCase().replace(/\s+/g, "_");
10
10
  }
11
11
  function ie(e, n = null, t = null) {
@@ -13,21 +13,21 @@ function ie(e, n = null, t = null) {
13
13
  if (t) {
14
14
  for (const [i, s] of Object.entries(t))
15
15
  if (i != null && s != null) {
16
- const a = Se(i), l = Se(s);
16
+ const a = Ae(i), l = Ae(s);
17
17
  r[a] = l;
18
18
  }
19
19
  }
20
20
  const o = {};
21
21
  for (const [i, s] of Object.entries(e)) {
22
- const a = Se(i), l = r[a] || a;
22
+ const a = Ae(i), l = r[a] || a;
23
23
  o[l] = s;
24
24
  }
25
25
  return o;
26
26
  }
27
- function Mn(e, n = null, t = null) {
27
+ function Pn(e, n = null, t = null) {
28
28
  return e.map((r) => ie(r, n, t));
29
29
  }
30
- const Lt = /* @__PURE__ */ new Set([
30
+ const Mt = /* @__PURE__ */ new Set([
31
31
  "hole_id",
32
32
  "holeid",
33
33
  "id",
@@ -59,14 +59,14 @@ const Lt = /* @__PURE__ */ new Set([
59
59
  "todepth",
60
60
  "comment",
61
61
  "z"
62
- ]), Le = (e, n = null) => ie(e, null, n);
63
- function Mt(e) {
62
+ ]), Ie = (e, n = null) => ie(e, null, n);
63
+ function Pt(e) {
64
64
  return { holeId: e[N] };
65
65
  }
66
66
  function rt(e, n = null) {
67
67
  const t = e[N], r = t !== void 0 ? `${t}`.trim() : "";
68
68
  if (!r) return null;
69
- const o = e[de] || e.project || e.project_code, i = Number(e[L]), s = Number(e[M]);
69
+ const o = e[de] || e.project || e.project_code, i = Number(e[M]), s = Number(e[O]);
70
70
  return !Number.isFinite(i) || !Number.isFinite(s) || s <= i ? null : {
71
71
  holeId: r,
72
72
  project: o,
@@ -90,7 +90,7 @@ function ot(e, n) {
90
90
  r.push(c), r.push({ ...c, z: a });
91
91
  }), { id: e, project: (o = t[0]) == null ? void 0 : o.project, points: r };
92
92
  }
93
- function Pn(e, n = null) {
93
+ function On(e, n = null) {
94
94
  return new Promise((t, r) => {
95
95
  const o = /* @__PURE__ */ new Set();
96
96
  J.parse(e, {
@@ -98,18 +98,18 @@ function Pn(e, n = null) {
98
98
  dynamicTyping: !0,
99
99
  skipEmptyLines: !0,
100
100
  step: (i) => {
101
- const a = Le(i.data, n)[N];
101
+ const a = Ie(i.data, n)[N];
102
102
  a !== void 0 && `${a}`.trim() !== "" && o.add(`${a}`.trim());
103
103
  },
104
104
  complete: () => t(Array.from(o)),
105
- error: (i) => r(G("parseAssayHoleIds", i))
105
+ error: (i) => r(U("parseAssayHoleIds", i))
106
106
  });
107
107
  });
108
108
  }
109
- function Pt(e) {
110
- return Object.entries(e || {}).some(([n, t]) => !(Lt.has(n) || t == null || typeof t == "string" && t.trim() === ""));
109
+ function Ot(e) {
110
+ return Object.entries(e || {}).some(([n, t]) => !(Mt.has(n) || t == null || typeof t == "string" && t.trim() === ""));
111
111
  }
112
- function Ot(e, n = null) {
112
+ function xt(e, n = null) {
113
113
  return new Promise((t, r) => {
114
114
  const o = /* @__PURE__ */ new Map();
115
115
  J.parse(e, {
@@ -117,9 +117,9 @@ function Ot(e, n = null) {
117
117
  dynamicTyping: !0,
118
118
  skipEmptyLines: !0,
119
119
  step: (i) => {
120
- const s = Le(i.data, n);
121
- if (!Pt(s)) return;
122
- const l = Mt(s).holeId;
120
+ const s = Ie(i.data, n);
121
+ if (!Ot(s)) return;
122
+ const l = Pt(s).holeId;
123
123
  if (l !== void 0 && `${l}`.trim() !== "") {
124
124
  const u = `${l}`.trim();
125
125
  o.has(u) || o.set(u, {
@@ -128,15 +128,15 @@ function Ot(e, n = null) {
128
128
  }
129
129
  },
130
130
  complete: () => t(Array.from(o.values())),
131
- error: (i) => r(G("parseAssayHoleIdsWithAssays", i))
131
+ error: (i) => r(U("parseAssayHoleIdsWithAssays", i))
132
132
  });
133
133
  });
134
134
  }
135
- function xt(e, n, t = null, r = null) {
135
+ function Dt(e, n, t = null, r = null) {
136
136
  return new Promise((o, i) => {
137
137
  const s = `${n}`.trim();
138
138
  if (!s) {
139
- i(G("parseAssayHole", new Error("Missing hole id")));
139
+ i(U("parseAssayHole", new Error("Missing hole id")));
140
140
  return;
141
141
  }
142
142
  const a = [];
@@ -145,7 +145,7 @@ function xt(e, n, t = null, r = null) {
145
145
  dynamicTyping: !0,
146
146
  skipEmptyLines: !0,
147
147
  step: (l) => {
148
- const u = Le(l.data, r), c = rt(u, r);
148
+ const u = Ie(l.data, r), c = rt(u, r);
149
149
  c && `${c.holeId}`.trim() === s && a.push(c);
150
150
  },
151
151
  complete: () => {
@@ -156,11 +156,11 @@ function xt(e, n, t = null, r = null) {
156
156
  const l = ot(s, a);
157
157
  o(l);
158
158
  },
159
- error: (l) => i(G("parseAssayHole", l))
159
+ error: (l) => i(U("parseAssayHole", l))
160
160
  });
161
161
  });
162
162
  }
163
- function Dt(e, n = null, t = null) {
163
+ function Rt(e, n = null, t = null) {
164
164
  return new Promise((r, o) => {
165
165
  J.parse(e, {
166
166
  header: !0,
@@ -169,23 +169,23 @@ function Dt(e, n = null, t = null) {
169
169
  complete: (i) => {
170
170
  const s = /* @__PURE__ */ new Map();
171
171
  i.data.forEach((l) => {
172
- const u = Le(l, t), c = rt(u, t);
172
+ const u = Ie(l, t), c = rt(u, t);
173
173
  c && (s.has(c.holeId) || s.set(c.holeId, []), s.get(c.holeId).push(c));
174
174
  });
175
175
  const a = Array.from(s.entries()).map(([l, u]) => ot(l, u));
176
176
  r({ holes: a });
177
177
  },
178
- error: (i) => o(G("parseAssaysCSV", i))
178
+ error: (i) => o(U("parseAssaysCSV", i))
179
179
  });
180
180
  });
181
181
  }
182
- function On(e = {}) {
182
+ function xn(e = {}) {
183
183
  const n = {};
184
184
  return Object.entries(e || {}).forEach(([t, r]) => {
185
- t && (n[Se(t)] = r);
185
+ t && (n[Ae(t)] = r);
186
186
  }), n;
187
187
  }
188
- function xn(e = {}, n = [], t) {
188
+ function Dn(e = {}, n = [], t) {
189
189
  for (const r of n) {
190
190
  const o = e[r];
191
191
  if (o != null && `${o}`.trim() !== "")
@@ -193,7 +193,7 @@ function xn(e = {}, n = [], t) {
193
193
  }
194
194
  return t;
195
195
  }
196
- const Rt = 4;
196
+ const zt = 4;
197
197
  function st(e = [], n = "") {
198
198
  if (!e.length) return [];
199
199
  if (!n) return e;
@@ -202,7 +202,7 @@ function st(e = [], n = "") {
202
202
  const r = e[t], o = e.filter((i, s) => s !== t);
203
203
  return [r, ...o];
204
204
  }
205
- function Te({
205
+ function Se({
206
206
  property: e = "",
207
207
  chartType: n = "",
208
208
  categoricalProps: t = [],
@@ -214,7 +214,7 @@ function Te({
214
214
  function it({
215
215
  holeIds: e = [],
216
216
  focusedHoleId: n = "",
217
- plotCount: t = Rt,
217
+ plotCount: t = zt,
218
218
  defaultProp: r = "",
219
219
  categoricalProps: o = [],
220
220
  commentProps: i = [],
@@ -222,7 +222,7 @@ function it({
222
222
  } = {}) {
223
223
  const a = st(e, n);
224
224
  return Array.from({ length: t }).map((l, u) => {
225
- const c = a[u] || e[u] || "", d = Te({
225
+ const c = a[u] || e[u] || "", d = Se({
226
226
  property: r,
227
227
  chartType: "",
228
228
  categoricalProps: o,
@@ -236,7 +236,7 @@ function it({
236
236
  };
237
237
  });
238
238
  }
239
- function Ie(e = []) {
239
+ function Te(e = []) {
240
240
  const n = e.flatMap((a) => a.points || []), { numericCols: t, categoricalCols: r, commentCols: o, byType: i } = vt(n), s = t[0] || r[0] || "";
241
241
  return {
242
242
  numericProps: t,
@@ -246,15 +246,15 @@ function Ie(e = []) {
246
246
  defaultProp: s
247
247
  };
248
248
  }
249
- async function zt(e, n = null) {
250
- return await Ot(e);
249
+ async function Ft(e, n = null) {
250
+ return await xt(e);
251
251
  }
252
252
  async function $t(e, n, t = null) {
253
- return await xt(e, n);
253
+ return await Dt(e, n);
254
254
  }
255
255
  function kt(e = [], n = "") {
256
256
  if (!e.length) return null;
257
- const { numericProps: t, categoricalProps: r, commentProps: o, columnMeta: i, defaultProp: s } = Ie(e), a = e.map((u) => u.id || u.holeId).filter(Boolean), l = it({
257
+ const { numericProps: t, categoricalProps: r, commentProps: o, columnMeta: i, defaultProp: s } = Te(e), a = e.map((u) => u.id || u.holeId).filter(Boolean), l = it({
258
258
  holeIds: a,
259
259
  focusedHoleId: n,
260
260
  plotCount: 4,
@@ -273,34 +273,34 @@ function kt(e = [], n = "") {
273
273
  traceConfigs: l
274
274
  };
275
275
  }
276
- async function Dn(e, n = "", t = null) {
277
- const { holes: r } = await Dt(e, t), o = kt(r, n);
276
+ async function Rn(e, n = "", t = null) {
277
+ const { holes: r } = await Rt(e, t), o = kt(r, n);
278
278
  if (!o) throw new Error("No valid assay intervals found.");
279
279
  return o;
280
280
  }
281
- function Rn(e, n = null) {
281
+ function zn(e, n = null) {
282
282
  return new Promise((t, r) => {
283
283
  J.parse(e, {
284
284
  header: !0,
285
285
  dynamicTyping: !0,
286
286
  skipEmptyLines: !0,
287
287
  complete: (o) => {
288
- const i = o.data.map((s) => Ft(s, n)).filter((s) => s[N] && Number.isFinite(s[j]) && Number.isFinite(s[W]) && Number.isFinite(s[Y]));
288
+ const i = o.data.map((s) => wt(s, n)).filter((s) => s[N] && Number.isFinite(s[V]) && Number.isFinite(s[W]) && Number.isFinite(s[Y]));
289
289
  t(i);
290
290
  },
291
- error: (o) => r(G("parseSurveyCSV", o))
291
+ error: (o) => r(U("parseSurveyCSV", o))
292
292
  });
293
293
  });
294
294
  }
295
- function Ft(e, n = null) {
296
- const t = ie(e, null, n), r = t[N], o = t[de] || t.project || t.project_code, i = pe(t[re]), s = pe(t[oe]), a = pe(t[j]), l = pe(t[W]), u = pe(t[Y]), c = pe(t.maxdepth);
295
+ function wt(e, n = null) {
296
+ const t = ie(e, null, n), r = t[N], o = t[de] || t.project || t.project_code, i = he(t[re]), s = he(t[oe]), a = he(t[V]), l = he(t[W]), u = he(t[Y]), c = he(t.maxdepth);
297
297
  return {
298
298
  raw: t,
299
299
  [N]: r,
300
300
  [de]: o,
301
301
  [re]: i,
302
302
  [oe]: s,
303
- [j]: a,
303
+ [V]: a,
304
304
  [W]: l,
305
305
  [Y]: u,
306
306
  maxdepth: c,
@@ -311,90 +311,90 @@ function Ft(e, n = null) {
311
311
  surveydepth: a
312
312
  };
313
313
  }
314
- const pe = (e) => {
314
+ const he = (e) => {
315
315
  const n = Number(e);
316
316
  return Number.isFinite(n) ? n : void 0;
317
317
  };
318
- function zn(e, n) {
318
+ function Fn(e, n) {
319
319
  var u, c, d, m;
320
320
  const t = /* @__PURE__ */ new Map();
321
321
  e.forEach((f) => {
322
- const y = (f[N] || f.holeId || f.id || "").toString().trim();
323
- if (!y) return;
324
- const h = y.toLowerCase();
325
- t.has(h) || t.set(h, f);
322
+ const b = (f[N] || f.holeId || f.id || "").toString().trim();
323
+ if (!b) return;
324
+ const p = b.toLowerCase();
325
+ t.has(p) || t.set(p, f);
326
326
  });
327
327
  const r = ((u = e[0]) == null ? void 0 : u.lat) ?? ((c = e[0]) == null ? void 0 : c[re]) ?? 0, o = ((d = e[0]) == null ? void 0 : d.lng) ?? ((m = e[0]) == null ? void 0 : m[oe]) ?? 0, i = 111132, s = 111320 * Math.cos(r * Math.PI / 180), a = /* @__PURE__ */ new Map();
328
328
  n.forEach((f) => {
329
- const y = (f[N] || "").toString().trim();
330
- if (!y) return;
331
- const h = y.toLowerCase();
332
- a.has(h) || a.set(h, []), a.get(h).push(f);
329
+ const b = (f[N] || "").toString().trim();
330
+ if (!b) return;
331
+ const p = b.toLowerCase();
332
+ a.has(p) || a.set(p, []), a.get(p).push(f);
333
333
  });
334
334
  const l = [];
335
- return a.forEach((f, y) => {
336
- const h = t.get(y);
337
- if (!h) return;
338
- const b = f.filter((_) => Number.isFinite(_[j] ?? _.surveydepth)).sort((_, R) => (_[j] ?? _.surveydepth) - (R[j] ?? R.surveydepth));
339
- if (!b.length) return;
340
- const g = h.lat ?? h[re], A = h.lng ?? h[oe], P = 111132, U = 111320 * Math.cos(g * Math.PI / 180), $ = (A - o) * s, k = (g - r) * i, O = [];
341
- let D = 0, S = 0, p = 0;
342
- for (let _ = 0; _ < b.length; _ += 1) {
343
- const R = b[_], x = b[_ - 1], T = R[j] ?? R.surveydepth, v = R[Y] ?? R.azimuth, z = R[W] ?? R.dip;
344
- if (!x) {
345
- O.push({
346
- x: $ + D,
347
- y: k + S,
335
+ return a.forEach((f, b) => {
336
+ const p = t.get(b);
337
+ if (!p) return;
338
+ const v = f.filter((A) => Number.isFinite(A[V] ?? A.surveydepth)).sort((A, z) => (A[V] ?? A.surveydepth) - (z[V] ?? z.surveydepth));
339
+ if (!v.length) return;
340
+ const g = p.lat ?? p[re], L = p.lng ?? p[oe], C = 111132, j = 111320 * Math.cos(g * Math.PI / 180), H = (L - o) * s, $ = (g - r) * i, D = [];
341
+ let R = 0, G = 0, h = 0;
342
+ for (let A = 0; A < v.length; A += 1) {
343
+ const z = v[A], E = v[A - 1], _ = z[V] ?? z.surveydepth, y = z[Y] ?? z.azimuth, I = z[W] ?? z.dip;
344
+ if (!E) {
345
+ D.push({
346
+ x: H + R,
347
+ y: $ + G,
348
348
  z: 0,
349
- md: T,
350
- azimuth: v,
351
- dip: z
349
+ md: _,
350
+ azimuth: y,
351
+ dip: I
352
352
  });
353
353
  continue;
354
354
  }
355
- const F = x[j] ?? x.surveydepth, C = x[Y] ?? x.azimuth, B = x[W] ?? x.dip, V = T - F;
356
- if (V <= 0) continue;
357
- const w = Be(B), q = Be(z), X = $e(C), ae = $e(v), be = Math.acos(
358
- Math.sin(w) * Math.sin(q) * Math.cos(X - ae) + Math.cos(w) * Math.cos(q)
359
- ), me = be > 1e-6 ? 2 / be * Math.tan(be / 2) : 1, Pe = 0.5 * V * (Math.sin(w) * Math.cos(X) + Math.sin(q) * Math.cos(ae)) * me, fe = 0.5 * V * (Math.sin(w) * Math.sin(X) + Math.sin(q) * Math.sin(ae)) * me, _t = 0.5 * V * (Math.cos(w) + Math.cos(q)) * me;
360
- D += Pe, S += fe, p += _t, O.push({
361
- x: $ + D,
362
- y: k + S,
363
- z: -p,
355
+ const F = E[V] ?? E.surveydepth, T = E[Y] ?? E.azimuth, x = E[W] ?? E.dip, B = _ - F;
356
+ if (B <= 0) continue;
357
+ const k = Be(x), q = Be(I), X = Fe(T), ae = Fe(y), _e = Math.acos(
358
+ Math.sin(k) * Math.sin(q) * Math.cos(X - ae) + Math.cos(k) * Math.cos(q)
359
+ ), me = _e > 1e-6 ? 2 / _e * Math.tan(_e / 2) : 1, Me = 0.5 * B * (Math.sin(k) * Math.cos(X) + Math.sin(q) * Math.cos(ae)) * me, fe = 0.5 * B * (Math.sin(k) * Math.sin(X) + Math.sin(q) * Math.sin(ae)) * me, _t = 0.5 * B * (Math.cos(k) + Math.cos(q)) * me;
360
+ R += Me, G += fe, h += _t, D.push({
361
+ x: H + R,
362
+ y: $ + G,
363
+ z: -h,
364
364
  // render with z up; depth down
365
- md: T,
366
- azimuth: v,
367
- dip: z
365
+ md: _,
366
+ azimuth: y,
367
+ dip: I
368
368
  });
369
369
  }
370
- const I = O.map((_) => ({
371
- ..._,
372
- lat: g + _.y / P,
373
- lng: A + _.x / U
370
+ const P = D.map((A) => ({
371
+ ...A,
372
+ lat: g + A.y / C,
373
+ lng: L + A.x / j
374
374
  }));
375
375
  l.push({
376
- id: h[N] || h.holeId || y,
377
- project: h[de] || h.project_id || h.project || "",
378
- points: I,
379
- collar: h
376
+ id: p[N] || p.holeId || b,
377
+ project: p[de] || p.project_id || p.project || "",
378
+ points: P,
379
+ collar: p
380
380
  });
381
381
  }), l;
382
382
  }
383
- const $e = (e) => e * Math.PI / 180, Be = (e) => {
383
+ const Fe = (e) => e * Math.PI / 180, Be = (e) => {
384
384
  const n = Number(e), t = 90 + (Number.isFinite(n) ? n : 0), r = Math.min(180, Math.max(0, t));
385
- return $e(r);
385
+ return Fe(r);
386
386
  };
387
- function te(e, n = void 0) {
387
+ function ne(e, n = void 0) {
388
388
  const t = Number(e);
389
389
  return Number.isFinite(t) ? t : n;
390
390
  }
391
391
  function Ve(e) {
392
392
  return e == null ? "" : `${e}`.trim();
393
393
  }
394
- function Ce(e = [], n = null) {
394
+ function Le(e = [], n = null) {
395
395
  const t = n || "hole_id", o = [t, "hole_id", "holeId", "id"].find((i) => e.some((s) => Ve(s == null ? void 0 : s[i])));
396
396
  if (!o)
397
- throw G("canonicalizeHoleIdRows", new Error(`hole id column '${t}' not found`));
397
+ throw U("canonicalizeHoleIdRows", new Error(`hole id column '${t}' not found`));
398
398
  return {
399
399
  aliasCol: o,
400
400
  rows: e.map((i) => ({
@@ -410,7 +410,7 @@ function xe(e, n) {
410
410
  const t = je(e), r = je(n), o = Math.cos(r) * Math.sin(t), i = Math.cos(r) * Math.cos(t), s = Math.sin(r) * -1;
411
411
  return { ca: o, cb: i, cc: s };
412
412
  }
413
- function wt(e, n, t, r, o, i = "minimum_curvature") {
413
+ function Ut(e, n, t, r, o, i = "minimum_curvature") {
414
414
  const s = xe(n, t), a = xe(r, o);
415
415
  if (i === "tangential")
416
416
  return {
@@ -439,12 +439,12 @@ function wt(e, n, t, r, o, i = "minimum_curvature") {
439
439
  dip: o
440
440
  };
441
441
  }
442
- function Fe(e = [], n = [], t = {}) {
442
+ function ke(e = [], n = [], t = {}) {
443
443
  const {
444
444
  step: r = 1,
445
445
  holeIdCol: o = null,
446
446
  method: i = "minimum_curvature"
447
- } = t, s = Number.isFinite(Number(r)) && Number(r) > 0 ? Number(r) : 1, a = Ce(e, o), l = Ce(n, o || a.aliasCol);
447
+ } = t, s = Number.isFinite(Number(r)) && Number(r) > 0 ? Number(r) : 1, a = Le(e, o), l = Le(n, o || a.aliasCol);
448
448
  if (!a.rows.length || !l.rows.length) return [];
449
449
  const u = /* @__PURE__ */ new Map();
450
450
  a.rows.forEach((m) => {
@@ -456,81 +456,81 @@ function Fe(e = [], n = [], t = {}) {
456
456
  });
457
457
  const d = [];
458
458
  return c.forEach((m, f) => {
459
- const y = u.get(f);
460
- if (!y) return;
461
- const h = [...m].map((O) => ({
462
- ...O,
463
- from: te(O.from),
464
- azimuth: te(O.azimuth),
465
- dip: te(O.dip)
466
- })).filter((O) => Number.isFinite(O.from) && Number.isFinite(O.azimuth) && Number.isFinite(O.dip)).sort((O, D) => O.from - D.from);
467
- if (!h.length) return;
468
- let b = te(y.x, 0), g = te(y.y, 0), A = te(y.z, 0), P = h[0].from;
469
- const U = h[0].azimuth, $ = h[0].dip, k = {
459
+ const b = u.get(f);
460
+ if (!b) return;
461
+ const p = [...m].map((D) => ({
462
+ ...D,
463
+ from: ne(D.from),
464
+ azimuth: ne(D.azimuth),
465
+ dip: ne(D.dip)
466
+ })).filter((D) => Number.isFinite(D.from) && Number.isFinite(D.azimuth) && Number.isFinite(D.dip)).sort((D, R) => D.from - R.from);
467
+ if (!p.length) return;
468
+ let v = ne(b.x, 0), g = ne(b.y, 0), L = ne(b.z, 0), C = p[0].from;
469
+ const j = p[0].azimuth, H = p[0].dip, $ = {
470
470
  hole_id: f,
471
- md: P,
472
- x: b,
471
+ md: C,
472
+ x: v,
473
473
  y: g,
474
- z: A,
475
- azimuth: U,
476
- dip: $
474
+ z: L,
475
+ azimuth: j,
476
+ dip: H
477
477
  };
478
- a.aliasCol !== "hole_id" && y[a.aliasCol] !== void 0 && (k[a.aliasCol] = y[a.aliasCol]), d.push(k);
479
- for (let O = 0; O < h.length - 1; O += 1) {
480
- const D = h[O], S = h[O + 1], p = D.from, _ = S.from - p;
481
- if (_ <= 0) continue;
482
- const R = Math.max(1, Math.ceil(_ / s)), x = _ / R;
483
- for (let T = 0; T < R; T += 1) {
484
- P += x;
485
- const v = (P - p) / _, z = D.azimuth + v * (S.azimuth - D.azimuth), F = D.dip + v * (S.dip - D.dip), C = wt(x, D.azimuth, D.dip, S.azimuth, S.dip, i);
486
- b += C.dx, g += C.dy, A += C.dz;
487
- const B = {
478
+ a.aliasCol !== "hole_id" && b[a.aliasCol] !== void 0 && ($[a.aliasCol] = b[a.aliasCol]), d.push($);
479
+ for (let D = 0; D < p.length - 1; D += 1) {
480
+ const R = p[D], G = p[D + 1], h = R.from, A = G.from - h;
481
+ if (A <= 0) continue;
482
+ const z = Math.max(1, Math.ceil(A / s)), E = A / z;
483
+ for (let _ = 0; _ < z; _ += 1) {
484
+ C += E;
485
+ const y = (C - h) / A, I = R.azimuth + y * (G.azimuth - R.azimuth), F = R.dip + y * (G.dip - R.dip), T = Ut(E, R.azimuth, R.dip, G.azimuth, G.dip, i);
486
+ v += T.dx, g += T.dy, L += T.dz;
487
+ const x = {
488
488
  hole_id: f,
489
- md: P,
490
- x: b,
489
+ md: C,
490
+ x: v,
491
491
  y: g,
492
- z: A,
493
- azimuth: i === "minimum_curvature" ? z : C.azimuth,
494
- dip: i === "minimum_curvature" ? F : C.dip
492
+ z: L,
493
+ azimuth: i === "minimum_curvature" ? I : T.azimuth,
494
+ dip: i === "minimum_curvature" ? F : T.dip
495
495
  };
496
- a.aliasCol !== "hole_id" && y[a.aliasCol] !== void 0 && (B[a.aliasCol] = y[a.aliasCol]), d.push(B);
496
+ a.aliasCol !== "hole_id" && b[a.aliasCol] !== void 0 && (x[a.aliasCol] = b[a.aliasCol]), d.push(x);
497
497
  }
498
498
  }
499
499
  }), d;
500
500
  }
501
501
  function Ht(e, n, t = {}) {
502
- return Fe(e, n, { ...t, method: "minimum_curvature" });
502
+ return ke(e, n, { ...t, method: "minimum_curvature" });
503
503
  }
504
504
  function $n(e, n, t = {}) {
505
- return Fe(e, n, { ...t, method: "tangential" });
505
+ return ke(e, n, { ...t, method: "tangential" });
506
506
  }
507
507
  function kn(e, n, t = {}) {
508
- return Fe(e, n, { ...t, method: "balanced_tangential" });
508
+ return ke(e, n, { ...t, method: "balanced_tangential" });
509
509
  }
510
- function Fn(e, n, t = {}) {
510
+ function wn(e, n, t = {}) {
511
511
  return Ht(e, n, t);
512
512
  }
513
513
  function Gt(e, n) {
514
514
  if (!e.length || !Number.isFinite(n)) return null;
515
515
  let t = null, r = 1 / 0;
516
516
  for (let o = 0; o < e.length; o += 1) {
517
- const i = e[o], s = te(i.md);
517
+ const i = e[o], s = ne(i.md);
518
518
  if (!Number.isFinite(s)) continue;
519
519
  const a = Math.abs(s - n);
520
520
  a < r && (r = a, t = i);
521
521
  }
522
522
  return t;
523
523
  }
524
- function wn(e = [], n = [], t = {}) {
525
- const r = t.holeIdCol || "hole_id", o = Ce(e, r), i = Ce(n, r);
524
+ function Un(e = [], n = [], t = {}) {
525
+ const r = t.holeIdCol || "hole_id", o = Le(e, r), i = Le(n, r);
526
526
  if (!o.rows.length || !i.rows.length) return [...o.rows];
527
527
  const s = /* @__PURE__ */ new Map();
528
528
  return i.rows.forEach((a) => {
529
529
  a.hole_id && (s.has(a.hole_id) || s.set(a.hole_id, []), s.get(a.hole_id).push(a));
530
530
  }), s.forEach((a, l) => {
531
- s.set(l, [...a].sort((u, c) => te(u.md, 0) - te(c.md, 0)));
531
+ s.set(l, [...a].sort((u, c) => ne(u.md, 0) - ne(c.md, 0)));
532
532
  }), o.rows.map((a) => {
533
- const l = te(a.from), u = te(a.to), c = Number.isFinite(l) && Number.isFinite(u) ? 0.5 * (l + u) : void 0;
533
+ const l = ne(a.from), u = ne(a.to), c = Number.isFinite(l) && Number.isFinite(u) ? 0.5 * (l + u) : void 0;
534
534
  if (!a.hole_id || !Number.isFinite(c)) return { ...a };
535
535
  const d = Gt(s.get(a.hole_id) || [], c);
536
536
  if (!d) return { ...a };
@@ -549,14 +549,14 @@ function Hn(e, n = null) {
549
549
  complete: (o) => {
550
550
  const i = /* @__PURE__ */ new Map();
551
551
  o.data.forEach((a, l) => {
552
- const u = ie(a, null, n), c = u[N], d = c !== void 0 ? `${c}`.trim() : "", m = u[he] ?? u.x, f = u[ge] ?? u.y, y = u[Ae] ?? u.z, h = u.order ?? l;
553
- !d || m === null || m === void 0 || f === null || f === void 0 || y === null || y === void 0 || (i.has(d) || i.set(d, []), i.get(d).push({
552
+ const u = ie(a, null, n), c = u[N], d = c !== void 0 ? `${c}`.trim() : "", m = u[pe] ?? u.x, f = u[ge] ?? u.y, b = u[Ee] ?? u.z, p = u.order ?? l;
553
+ !d || m === null || m === void 0 || f === null || f === void 0 || b === null || b === void 0 || (i.has(d) || i.set(d, []), i.get(d).push({
554
554
  ...u,
555
555
  holeId: d,
556
- order: h,
556
+ order: p,
557
557
  x: Number(m) ?? 0,
558
558
  y: Number(f) ?? 0,
559
- z: Number(y) ?? 0
559
+ z: Number(b) ?? 0
560
560
  }));
561
561
  });
562
562
  const s = Array.from(i.entries()).map(([a, l]) => ({
@@ -570,11 +570,11 @@ function Hn(e, n = null) {
570
570
  }));
571
571
  t({ holes: s });
572
572
  },
573
- error: (o) => r(G("parseDrillholesCSV", o))
573
+ error: (o) => r(U("parseDrillholesCSV", o))
574
574
  });
575
575
  });
576
576
  }
577
- function ye(e) {
577
+ function be(e) {
578
578
  return e ? Array.isArray(e) ? [...e] : [] : [];
579
579
  }
580
580
  function Z(e) {
@@ -592,22 +592,22 @@ function Ne(e = [], n = []) {
592
592
  return 0;
593
593
  }), t;
594
594
  }
595
- function Ut(e = [], n = "Intervals") {
595
+ function Bt(e = [], n = "Intervals") {
596
596
  if (!e.length) return;
597
- const t = Ne(e, [N, L, M]), r = /* @__PURE__ */ new Map();
597
+ const t = Ne(e, [N, M, O]), r = /* @__PURE__ */ new Map();
598
598
  t.forEach((o) => {
599
- const i = `${(o == null ? void 0 : o[N]) ?? ""}`.trim(), s = Number(o == null ? void 0 : o[L]), a = Number(o == null ? void 0 : o[M]);
599
+ const i = `${(o == null ? void 0 : o[N]) ?? ""}`.trim(), s = Number(o == null ? void 0 : o[M]), a = Number(o == null ? void 0 : o[O]);
600
600
  if (!i || !Number.isFinite(s) || !Number.isFinite(a)) return;
601
601
  const l = r.get(i);
602
602
  if (Number.isFinite(l) && s < l)
603
- throw G(
603
+ throw U(
604
604
  "validateNoOverlappingIntervals",
605
605
  new Error(`${n} intervals overlap for hole '${i}': from=${s} is less than previous to=${l}`)
606
606
  );
607
607
  r.set(i, a);
608
608
  });
609
609
  }
610
- function Bt(e, n = {}) {
610
+ function Vt(e, n = {}) {
611
611
  return new Promise((t, r) => {
612
612
  J.parse(e, {
613
613
  header: !0,
@@ -615,14 +615,14 @@ function Bt(e, n = {}) {
615
615
  skipEmptyLines: !0,
616
616
  ...n,
617
617
  complete: (o) => t(Array.isArray(o == null ? void 0 : o.data) ? o.data : []),
618
- error: (o) => r(G("loadTable(csv)", o))
618
+ error: (o) => r(U("loadTable(csv)", o))
619
619
  });
620
620
  });
621
621
  }
622
- function Vt(e = [], n = null, t = null) {
622
+ function jt(e = [], n = null, t = null) {
623
623
  return e.map((r) => ie(r, n, t));
624
624
  }
625
- async function Me(e, n = {}) {
625
+ async function Ce(e, n = {}) {
626
626
  const {
627
627
  kind: t = "csv",
628
628
  columnMap: r = null,
@@ -631,11 +631,11 @@ async function Me(e, n = {}) {
631
631
  } = n;
632
632
  let s;
633
633
  if (Array.isArray(e))
634
- s = ye(e);
634
+ s = be(e);
635
635
  else if (t === "csv")
636
- s = await Bt(e, i);
637
- else throw t === "parquet" || t === "sql" ? G("loadTable", new Error(`Unsupported kind in JS runtime: ${t}`)) : G("loadTable", new Error(`Unsupported kind: ${t}`));
638
- return Vt(s, r, o);
636
+ s = await Vt(e, i);
637
+ else throw t === "parquet" || t === "sql" ? U("loadTable", new Error(`Unsupported kind in JS runtime: ${t}`)) : U("loadTable", new Error(`Unsupported kind: ${t}`));
638
+ return jt(s, r, o);
639
639
  }
640
640
  async function Gn(e, n = {}) {
641
641
  const {
@@ -643,102 +643,102 @@ async function Gn(e, n = {}) {
643
643
  sourceColumnMap: r = null,
644
644
  keepAll: o = !0,
645
645
  ...i
646
- } = n, s = await Me(e, { ...i, sourceColumnMap: r });
646
+ } = n, s = await Ce(e, { ...i, sourceColumnMap: r });
647
647
  if (!s.some((m) => N in m))
648
- throw G("loadCollars", new Error(`Collar table missing column: ${N}`));
649
- const l = s.some((m) => he in m && ge in m), u = s.some((m) => re in m && oe in m);
648
+ throw U("loadCollars", new Error(`Collar table missing column: ${N}`));
649
+ const l = s.some((m) => pe in m && ge in m), u = s.some((m) => re in m && oe in m);
650
650
  if (!l && !u)
651
- throw G("loadCollars", new Error("Collar table missing coordinate columns (need easting/northing or latitude/longitude)"));
651
+ throw U("loadCollars", new Error("Collar table missing coordinate columns (need easting/northing or latitude/longitude)"));
652
652
  const c = s.map((m) => {
653
653
  const f = { ...m };
654
654
  if (N in f) {
655
- const y = f[N];
656
- f[N] = y == null ? "" : `${y}`.trim();
655
+ const b = f[N];
656
+ f[N] = b == null ? "" : `${b}`.trim();
657
657
  }
658
- return re in f && (f[re] = Z(f[re])), oe in f && (f[oe] = Z(f[oe])), Ae in f && (f[Ae] = Z(f[Ae])), he in f && (f[he] = Z(f[he])), ge in f && (f[ge] = Z(f[ge])), !("datasource_hole_id" in f) && N in f && (f.datasource_hole_id = f[N]), f;
658
+ return re in f && (f[re] = Z(f[re])), oe in f && (f[oe] = Z(f[oe])), Ee in f && (f[Ee] = Z(f[Ee])), pe in f && (f[pe] = Z(f[pe])), ge in f && (f[ge] = Z(f[ge])), !("datasource_hole_id" in f) && N in f && (f.datasource_hole_id = f[N]), f;
659
659
  });
660
- if (!c.every((m) => !(!m[N] || u && (!Number.isFinite(m[re]) || !Number.isFinite(m[oe])) || l && !u && (!Number.isFinite(m[he]) || !Number.isFinite(m[ge])))))
661
- throw G("loadCollars", new Error("Collar table has missing required values"));
660
+ if (!c.every((m) => !(!m[N] || u && (!Number.isFinite(m[re]) || !Number.isFinite(m[oe])) || l && !u && (!Number.isFinite(m[pe]) || !Number.isFinite(m[ge])))))
661
+ throw U("loadCollars", new Error("Collar table has missing required values"));
662
662
  return c;
663
663
  }
664
- async function Un(e, n = {}) {
664
+ async function Bn(e, n = {}) {
665
665
  const {
666
666
  sourceColumnMap: t = null,
667
667
  keepAll: r = !0,
668
668
  ...o
669
- } = n, i = await Me(e, { ...o, sourceColumnMap: t }), s = [N, j, Y, W];
669
+ } = n, i = await Ce(e, { ...o, sourceColumnMap: t }), s = [N, V, Y, W];
670
670
  for (const u of s)
671
671
  if (!i.some((d) => u in d))
672
- throw G("loadSurveys", new Error(`Survey table missing column: ${u}`));
672
+ throw U("loadSurveys", new Error(`Survey table missing column: ${u}`));
673
673
  const a = i.map((u) => {
674
674
  const c = { ...u };
675
675
  if (N in c) {
676
676
  const d = c[N];
677
677
  c[N] = d == null ? "" : `${d}`.trim();
678
678
  }
679
- return j in c && (c[j] = Z(c[j])), M in c && (c[M] = Z(c[M])), Y in c && (c[Y] = Z(c[Y])), W in c && (c[W] = Z(c[W])), c;
679
+ return V in c && (c[V] = Z(c[V])), O in c && (c[O] = Z(c[O])), Y in c && (c[Y] = Z(c[Y])), W in c && (c[W] = Z(c[W])), c;
680
680
  });
681
- if (!a.every((u) => !(!u[N] || !Number.isFinite(u[j]) || !Number.isFinite(u[Y]) || !Number.isFinite(u[W]))))
682
- throw G("loadSurveys", new Error("Survey table has missing required values"));
683
- return Ne(a, [N, j]);
681
+ if (!a.every((u) => !(!u[N] || !Number.isFinite(u[V]) || !Number.isFinite(u[Y]) || !Number.isFinite(u[W]))))
682
+ throw U("loadSurveys", new Error("Survey table has missing required values"));
683
+ return Ne(a, [N, V]);
684
684
  }
685
- async function Bn(e, n = {}) {
685
+ async function Vn(e, n = {}) {
686
686
  const {
687
687
  sourceColumnMap: t = null,
688
688
  keepAll: r = !0,
689
689
  ...o
690
- } = n, i = await Me(e, { ...o, sourceColumnMap: t }), s = [N, L, M];
690
+ } = n, i = await Ce(e, { ...o, sourceColumnMap: t }), s = [N, M, O];
691
691
  for (const u of s)
692
692
  if (!i.some((d) => u in d))
693
- throw G("loadAssays", new Error(`Assay table missing column: ${u}`));
693
+ throw U("loadAssays", new Error(`Assay table missing column: ${u}`));
694
694
  const a = i.map((u) => {
695
695
  const c = { ...u };
696
696
  if (N in c) {
697
697
  const d = c[N];
698
698
  c[N] = d == null ? "" : `${d}`.trim();
699
699
  }
700
- return L in c && (c[L] = Z(c[L])), M in c && (c[M] = Z(c[M])), L in c && M in c && Number.isFinite(c[L]) && Number.isFinite(c[M]) && (c[ve] = 0.5 * (c[L] + c[M])), c;
700
+ return M in c && (c[M] = Z(c[M])), O in c && (c[O] = Z(c[O])), M in c && O in c && Number.isFinite(c[M]) && Number.isFinite(c[O]) && (c[ve] = 0.5 * (c[M] + c[O])), c;
701
701
  });
702
- if (!a.every((u) => !(!u[N] || !Number.isFinite(u[L]) || !Number.isFinite(u[M]) || !(u[M] > u[L]))))
703
- throw G("loadAssays", new Error("Assay table has missing required values"));
704
- return Ne(a, [N, L, M]);
702
+ if (!a.every((u) => !(!u[N] || !Number.isFinite(u[M]) || !Number.isFinite(u[O]) || !(u[O] > u[M]))))
703
+ throw U("loadAssays", new Error("Assay table has missing required values"));
704
+ return Ne(a, [N, M, O]);
705
705
  }
706
- async function Vn(e, n = {}) {
706
+ async function jn(e, n = {}) {
707
707
  const {
708
708
  sourceColumnMap: t = null,
709
709
  keepAll: r = !0,
710
710
  ...o
711
- } = n, i = await Me(e, { ...o, sourceColumnMap: t }), s = [N, L, M];
711
+ } = n, i = await Ce(e, { ...o, sourceColumnMap: t }), s = [N, M, O];
712
712
  for (const c of s)
713
713
  if (!i.some((m) => c in m))
714
- throw G("loadGeology", new Error(`Geology table missing column: ${c}`));
714
+ throw U("loadGeology", new Error(`Geology table missing column: ${c}`));
715
715
  const a = i.map((c) => {
716
716
  const d = { ...c };
717
717
  if (N in d) {
718
- const y = d[N];
719
- d[N] = y == null ? "" : `${y}`.trim();
718
+ const b = d[N];
719
+ d[N] = b == null ? "" : `${b}`.trim();
720
720
  }
721
- L in d && (d[L] = Z(d[L])), M in d && (d[M] = Z(d[M])), L in d && M in d && Number.isFinite(d[L]) && Number.isFinite(d[M]) && (d[M] === d[L] && (d[L] = Math.round(d[L] * 1e3) / 1e3, d[M] = d[L] + 1e-3), d[ve] = 0.5 * (d[L] + d[M]));
721
+ M in d && (d[M] = Z(d[M])), O in d && (d[O] = Z(d[O])), M in d && O in d && Number.isFinite(d[M]) && Number.isFinite(d[O]) && (d[O] === d[M] && (d[M] = Math.round(d[M] * 1e3) / 1e3, d[O] = d[M] + 1e-3), d[ve] = 0.5 * (d[M] + d[O]));
722
722
  const m = d[le] !== void 0 && d[le] !== null && `${d[le]}`.trim() !== "", f = d[ce] !== void 0 && d[ce] !== null && `${d[ce]}`.trim() !== "";
723
723
  return !m && f && (d[le] = d[ce]), m && !f && (d[ce] = d[le]), d;
724
724
  });
725
- if (!a.every((c) => !(!c[N] || !Number.isFinite(c[L]) || !Number.isFinite(c[M]) || !(c[M] > c[L]))))
726
- throw G("loadGeology", new Error("Geology table has missing or invalid interval values"));
725
+ if (!a.every((c) => !(!c[N] || !Number.isFinite(c[M]) || !Number.isFinite(c[O]) || !(c[O] > c[M]))))
726
+ throw U("loadGeology", new Error("Geology table has missing or invalid interval values"));
727
727
  if (!a.some((c) => {
728
728
  const d = c[le], m = c[ce];
729
729
  return d != null && `${d}`.trim() !== "" || m != null && `${m}`.trim() !== "";
730
730
  }))
731
- throw G("loadGeology", new Error(`Geology table missing categorical columns: ${le} or ${ce}`));
732
- if (Ut(a, "Geology"), !r) {
731
+ throw U("loadGeology", new Error(`Geology table missing categorical columns: ${le} or ${ce}`));
732
+ if (Bt(a, "Geology"), !r) {
733
733
  const c = new Set(Object.keys(Et));
734
734
  return Ne(
735
735
  a.map((d) => Object.fromEntries(Object.entries(d).filter(([m]) => c.has(m)))),
736
- [N, L, M]
736
+ [N, M, O]
737
737
  );
738
738
  }
739
- return Ne(a, [N, L, M]);
739
+ return Ne(a, [N, M, O]);
740
740
  }
741
- function jn(e = [], n = [], t = {}) {
741
+ function Yn(e = [], n = [], t = {}) {
742
742
  const r = Array.isArray(t.onCols) && t.onCols.length ? t.onCols : [N];
743
743
  if (!n.length) return [...e];
744
744
  const o = (s) => r.map((a) => `${(s == null ? void 0 : s[a]) ?? ""}`).join("|"), i = /* @__PURE__ */ new Map();
@@ -753,10 +753,10 @@ function jn(e = [], n = [], t = {}) {
753
753
  }), l;
754
754
  });
755
755
  }
756
- function Yn(e = [], n = null) {
756
+ function Wn(e = [], n = null) {
757
757
  return n == null ? [...e] : e.length ? e.some((r) => de in r) ? e.filter((r) => (r == null ? void 0 : r[de]) === n) : [...e] : [];
758
758
  }
759
- function Wn(e = [], n = []) {
759
+ function qn(e = [], n = []) {
760
760
  return e.map((t) => {
761
761
  const r = { ...t };
762
762
  return n.forEach((o) => {
@@ -766,7 +766,7 @@ function Wn(e = [], n = []) {
766
766
  }), r;
767
767
  });
768
768
  }
769
- function qn({
769
+ function Xn({
770
770
  collars: e = [],
771
771
  surveys: n = [],
772
772
  assays: t = [],
@@ -775,18 +775,18 @@ function qn({
775
775
  metadata: i = {}
776
776
  } = {}) {
777
777
  return {
778
- collars: ye(e),
779
- surveys: ye(n),
780
- assays: ye(t),
781
- geology: ye(r),
782
- structures: ye(o),
778
+ collars: be(e),
779
+ surveys: be(n),
780
+ assays: be(t),
781
+ geology: be(r),
782
+ structures: be(o),
783
783
  metadata: i || {}
784
784
  };
785
785
  }
786
786
  const we = (e, n = null) => ie(e, null, n);
787
- function jt(e) {
787
+ function Yt(e) {
788
788
  if (!e.length) return null;
789
- const n = e[0], t = L in n && M in n, r = j in n && !t;
789
+ const n = e[0], t = M in n && O in n, r = V in n && !t;
790
790
  return t ? "interval" : r ? "point" : null;
791
791
  }
792
792
  function se(e) {
@@ -796,10 +796,10 @@ function se(e) {
796
796
  function at(e) {
797
797
  const n = e[N] !== void 0 ? `${e[N]}`.trim() : "";
798
798
  if (!n) return null;
799
- const t = se(e[j]);
799
+ const t = se(e[V]);
800
800
  return t === null ? null : {
801
801
  [N]: n,
802
- [j]: t,
802
+ [V]: t,
803
803
  [W]: se(e[W]),
804
804
  [Y]: se(e[Y]),
805
805
  comments: e.comments != null ? `${e.comments}` : null,
@@ -809,13 +809,13 @@ function at(e) {
809
809
  function lt(e) {
810
810
  const n = e[N] !== void 0 ? `${e[N]}`.trim() : "";
811
811
  if (!n) return null;
812
- const t = se(e[L]), r = se(e[M]);
812
+ const t = se(e[M]), r = se(e[O]);
813
813
  if (t === null || r === null || r <= t) return null;
814
814
  const o = 0.5 * (t + r);
815
815
  return {
816
816
  [N]: n,
817
- [L]: t,
818
- [M]: r,
817
+ [M]: t,
818
+ [O]: r,
819
819
  mid: o,
820
820
  [W]: se(e[W]),
821
821
  [Y]: se(e[Y]),
@@ -824,7 +824,7 @@ function lt(e) {
824
824
  ...e
825
825
  };
826
826
  }
827
- function Xn(e) {
827
+ function Kn(e) {
828
828
  const n = [], t = [];
829
829
  for (const r of e) {
830
830
  const o = [], i = se(r[W]), s = se(r[Y]);
@@ -832,7 +832,7 @@ function Xn(e) {
832
832
  }
833
833
  return { valid: n, errors: t };
834
834
  }
835
- function Kn(e, n = null) {
835
+ function Zn(e, n = null) {
836
836
  return new Promise((t, r) => {
837
837
  const o = {
838
838
  header: !0,
@@ -846,13 +846,13 @@ function Kn(e, n = null) {
846
846
  }
847
847
  t(s);
848
848
  },
849
- error: (i) => r(G("parseStructuralPointsCSV", i))
849
+ error: (i) => r(U("parseStructuralPointsCSV", i))
850
850
  };
851
851
  typeof e == "string" && !e.startsWith("data:") && e.includes(`
852
852
  `) ? J.parse(e, o) : J.parse(e, o);
853
853
  });
854
854
  }
855
- function Zn(e, n = null) {
855
+ function Jn(e, n = null) {
856
856
  return new Promise((t, r) => {
857
857
  J.parse(e, {
858
858
  header: !0,
@@ -866,11 +866,11 @@ function Zn(e, n = null) {
866
866
  }
867
867
  t(i);
868
868
  },
869
- error: (o) => r(G("parseStructuralIntervalsCSV", o))
869
+ error: (o) => r(U("parseStructuralIntervalsCSV", o))
870
870
  });
871
871
  });
872
872
  }
873
- function Yt(e, n = N) {
873
+ function Wt(e, n = N) {
874
874
  const t = /* @__PURE__ */ new Map();
875
875
  for (const r of e) {
876
876
  const o = r[n] != null ? String(r[n]).trim() : "";
@@ -878,16 +878,16 @@ function Yt(e, n = N) {
878
878
  }
879
879
  return Array.from(t.values());
880
880
  }
881
- function Wt(e, n = null) {
881
+ function qt(e, n = null) {
882
882
  return new Promise((t, r) => {
883
883
  J.parse(e, {
884
884
  header: !0,
885
885
  dynamicTyping: !0,
886
886
  skipEmptyLines: !0,
887
887
  complete: (o) => {
888
- const i = o.data.map((l) => we(l, n)), s = jt(i);
888
+ const i = o.data.map((l) => we(l, n)), s = Yt(i);
889
889
  if (!s) {
890
- r(G(
890
+ r(U(
891
891
  "parseStructuralCSV",
892
892
  new Error("Structural CSV requires either 'depth' (point) or 'from'/'to' (interval) columns")
893
893
  ));
@@ -900,11 +900,11 @@ function Wt(e, n = null) {
900
900
  }
901
901
  t({ schema: s, rows: a });
902
902
  },
903
- error: (o) => r(G("parseStructuralCSV", o))
903
+ error: (o) => r(U("parseStructuralCSV", o))
904
904
  });
905
905
  });
906
906
  }
907
- function qt(e) {
907
+ function Xt(e) {
908
908
  return new Promise((n) => {
909
909
  J.parse(e, {
910
910
  header: !0,
@@ -915,30 +915,30 @@ function qt(e) {
915
915
  for (const i of t.data) {
916
916
  const s = ie(i), a = s[N] != null ? `${s[N]}`.trim() : "";
917
917
  if (!a) continue;
918
- const l = Number(s[L]), u = Number(s[M]);
918
+ const l = Number(s[M]), u = Number(s[O]);
919
919
  if (!Number.isFinite(l) || !Number.isFinite(u) || u <= l) continue;
920
- const c = (l + u) / 2, { [W]: d, [Y]: m, ...f } = s, y = {
920
+ const c = (l + u) / 2, { [W]: d, [Y]: m, ...f } = s, b = {
921
921
  ...f,
922
922
  [N]: a,
923
- [L]: l,
924
- [M]: u,
923
+ [M]: l,
924
+ [O]: u,
925
925
  [ve]: c,
926
- [j]: c,
926
+ [V]: c,
927
927
  // unified depth field for y-axis rendering
928
928
  _source: "assay"
929
929
  };
930
- r.has(a) || r.set(a, []), r.get(a).push(y);
930
+ r.has(a) || r.set(a, []), r.get(a).push(b);
931
931
  }
932
932
  const o = Array.from(r.entries()).map(([i, s]) => ({
933
933
  holeId: i,
934
- points: s.sort((a, l) => a[L] - l[L])
934
+ points: s.sort((a, l) => a[M] - l[M])
935
935
  }));
936
936
  n(o);
937
937
  }
938
938
  });
939
939
  });
940
940
  }
941
- function Xt(e) {
941
+ function Kt(e) {
942
942
  return new Promise((n) => {
943
943
  J.parse(e, {
944
944
  header: !0,
@@ -949,15 +949,15 @@ function Xt(e) {
949
949
  for (const o of t.data) {
950
950
  const i = ie(o), s = (i[N] ?? "").toString().trim();
951
951
  if (!s) continue;
952
- const a = Number(i[L]), l = Number(i[M]);
952
+ const a = Number(i[M]), l = Number(i[O]);
953
953
  if (!Number.isFinite(a) || !Number.isFinite(l) || l <= a) continue;
954
954
  const u = (a + l) / 2, { [W]: c, [Y]: d, ...m } = i, f = {
955
955
  ...m,
956
956
  [N]: s,
957
- [L]: a,
958
- [M]: l,
957
+ [M]: a,
958
+ [O]: l,
959
959
  [ve]: u,
960
- [j]: u,
960
+ [V]: u,
961
961
  _source: "geology"
962
962
  };
963
963
  r.has(s) || r.set(s, []), r.get(s).push(f);
@@ -965,20 +965,20 @@ function Xt(e) {
965
965
  n({
966
966
  holes: Array.from(r.entries()).map(([o, i]) => ({
967
967
  holeId: o,
968
- points: i.sort((s, a) => s[L] - a[L])
968
+ points: i.sort((s, a) => s[M] - a[M])
969
969
  }))
970
970
  });
971
971
  }
972
972
  });
973
973
  });
974
974
  }
975
- async function Jn({ assayCsv: e, structuralCsv: n, geologyCsv: t } = {}) {
975
+ async function Qn({ assayCsv: e, structuralCsv: n, geologyCsv: t } = {}) {
976
976
  const [r, o, i] = await Promise.all([
977
- e ? qt(e) : Promise.resolve([]),
978
- n ? Wt(n).then(
979
- ({ rows: a }) => Yt(a.map((l) => ({ ...l, _source: "structural" })))
977
+ e ? Xt(e) : Promise.resolve([]),
978
+ n ? qt(n).then(
979
+ ({ rows: a }) => Wt(a.map((l) => ({ ...l, _source: "structural" })))
980
980
  ) : Promise.resolve([]),
981
- t ? Xt(t).then(({ holes: a }) => a) : Promise.resolve([])
981
+ t ? Kt(t).then(({ holes: a }) => a) : Promise.resolve([])
982
982
  ]), s = new Map(r.map((a) => [a.holeId, { ...a, points: [...a.points] }]));
983
983
  for (const a of [...o, ...i]) {
984
984
  const l = a.holeId;
@@ -991,7 +991,7 @@ async function Jn({ assayCsv: e, structuralCsv: n, geologyCsv: t } = {}) {
991
991
  }
992
992
  return { holes: Array.from(s.values()) };
993
993
  }
994
- function Qn(e, n, t, r, o = {}) {
994
+ function er(e, n, t, r, o = {}) {
995
995
  const i = o.fromCol || "from", s = o.toCol || "to", a = o.holeCol || "hole_id";
996
996
  if (!e || !e.length) return [];
997
997
  const l = {};
@@ -1001,45 +1001,45 @@ function Qn(e, n, t, r, o = {}) {
1001
1001
  }
1002
1002
  const u = [];
1003
1003
  for (const [c, d] of Object.entries(l)) {
1004
- const f = [...d].sort((g, A) => Number(g[i]) - Number(A[i])).filter((g) => {
1005
- const A = Number(g[n]);
1006
- return Number.isFinite(A) && A >= t;
1004
+ const f = [...d].sort((g, L) => Number(g[i]) - Number(L[i])).filter((g) => {
1005
+ const L = Number(g[n]);
1006
+ return Number.isFinite(L) && L >= t;
1007
1007
  });
1008
1008
  if (!f.length) continue;
1009
- const y = [];
1010
- let h = [], b = null;
1009
+ const b = [];
1010
+ let p = [], v = null;
1011
1011
  for (const g of f) {
1012
- const A = Number(g[i]), P = Number(g[s]);
1013
- b === null || Math.abs(A - b) > 1e-6 ? (h.length && y.push(h), h = [g]) : h.push(g), b = P;
1012
+ const L = Number(g[i]), C = Number(g[s]);
1013
+ v === null || Math.abs(L - v) > 1e-6 ? (p.length && b.push(p), p = [g]) : p.push(g), v = C;
1014
1014
  }
1015
- h.length && y.push(h);
1016
- for (const g of y) {
1017
- const A = Number(g[0][i]), P = Number(g[g.length - 1][s]), U = P - A;
1018
- if (U < r) continue;
1019
- let $ = 0, k = 0;
1020
- for (const p of g) {
1021
- const I = Number(p[n]), _ = Number(p[s]) - Number(p[i]);
1022
- $ += I * _, k += _;
1015
+ p.length && b.push(p);
1016
+ for (const g of b) {
1017
+ const L = Number(g[0][i]), C = Number(g[g.length - 1][s]), j = C - L;
1018
+ if (j < r) continue;
1019
+ let H = 0, $ = 0;
1020
+ for (const h of g) {
1021
+ const P = Number(h[n]), A = Number(h[s]) - Number(h[i]);
1022
+ H += P * A, $ += A;
1023
1023
  }
1024
- const O = $ / k, D = g.length, S = `${U.toFixed(1)} m @ ${O.toFixed(2)} ${n}`;
1024
+ const D = H / $, R = g.length, G = `${j.toFixed(1)} m @ ${D.toFixed(2)} ${n}`;
1025
1025
  u.push({
1026
1026
  [a]: c,
1027
1027
  assay_field: n,
1028
- [i]: A,
1029
- [s]: P,
1030
- length: U,
1031
- avg_grade: O,
1032
- n_samples: D,
1033
- label: S
1028
+ [i]: L,
1029
+ [s]: C,
1030
+ length: j,
1031
+ avg_grade: D,
1032
+ n_samples: R,
1033
+ label: G
1034
1034
  });
1035
1035
  }
1036
1036
  }
1037
1037
  return u;
1038
1038
  }
1039
1039
  const ct = ["depth", "md", "measured_depth", "dept", "z"];
1040
- function Kt(e) {
1041
- if (e[j] !== void 0) {
1042
- const r = Number(e[j]);
1040
+ function Zt(e) {
1041
+ if (e[V] !== void 0) {
1042
+ const r = Number(e[V]);
1043
1043
  if (Number.isFinite(r)) return r;
1044
1044
  }
1045
1045
  for (const r of ct)
@@ -1047,12 +1047,12 @@ function Kt(e) {
1047
1047
  const o = Number(e[r]);
1048
1048
  if (Number.isFinite(o)) return o;
1049
1049
  }
1050
- const n = Number(e[L]), t = Number(e[M]);
1050
+ const n = Number(e[M]), t = Number(e[O]);
1051
1051
  return Number.isFinite(n) && Number.isFinite(t) && t >= n ? (n + t) / 2 : null;
1052
1052
  }
1053
- function Zt(e) {
1053
+ function Jt(e) {
1054
1054
  if (e.length === 0) return [];
1055
- const n = /* @__PURE__ */ new Set([N, j, L, M, ve, ...ct]);
1055
+ const n = /* @__PURE__ */ new Set([N, V, M, O, ve, ...ct]);
1056
1056
  return Object.keys(e[0]).filter((r) => !n.has(r)).filter((r) => {
1057
1057
  let o = 0;
1058
1058
  for (const i of e) {
@@ -1062,18 +1062,18 @@ function Zt(e) {
1062
1062
  return o / e.length > 0.5;
1063
1063
  });
1064
1064
  }
1065
- function er(e, n = null) {
1065
+ function tr(e, n = null) {
1066
1066
  const r = J.parse(e, {
1067
1067
  header: !0,
1068
1068
  skipEmptyLines: !0,
1069
1069
  dynamicTyping: !1
1070
1070
  }).data || [];
1071
1071
  if (r.length === 0) return [];
1072
- const o = r.map((l) => ie(l, null, n)), i = Zt(o), s = /* @__PURE__ */ new Map();
1072
+ const o = r.map((l) => ie(l, null, n)), i = Jt(o), s = /* @__PURE__ */ new Map();
1073
1073
  for (const l of o) {
1074
1074
  const u = l[N] != null ? `${l[N]}`.trim() : "";
1075
1075
  if (!u) continue;
1076
- const c = Kt(l);
1076
+ const c = Zt(l);
1077
1077
  c === null || c < 0 || (s.has(u) || s.set(u, []), s.get(u).push({ depth: c, row: l }));
1078
1078
  }
1079
1079
  const a = [];
@@ -1082,9 +1082,9 @@ function er(e, n = null) {
1082
1082
  const c = {};
1083
1083
  for (const d of i) {
1084
1084
  const m = [], f = [];
1085
- for (const { depth: y, row: h } of u) {
1086
- const b = Number(h[d]);
1087
- Number.isFinite(b) && b !== et && (m.push(y), f.push(b));
1085
+ for (const { depth: b, row: p } of u) {
1086
+ const v = Number(p[d]);
1087
+ Number.isFinite(v) && v !== et && (m.push(b), f.push(v));
1088
1088
  }
1089
1089
  m.length >= 2 && (c[d] = { depths: m, values: f });
1090
1090
  }
@@ -1092,7 +1092,7 @@ function er(e, n = null) {
1092
1092
  }
1093
1093
  return a;
1094
1094
  }
1095
- function tr(e, n = null, t = {}) {
1095
+ function nr(e, n = null, t = {}) {
1096
1096
  const r = [];
1097
1097
  for (const { holeId: o, channels: i } of e) {
1098
1098
  const s = n && i[n] ? n : Object.keys(i)[0];
@@ -1108,7 +1108,7 @@ function ut(e) {
1108
1108
  const t = e.slice(0, n).trim().toUpperCase(), r = e.slice(n + 1), o = r.match(/^(\S*)\s*(.*)/s), i = o ? o[1] : "", s = o ? o[2] : r, a = s.lastIndexOf(":"), l = a >= 0 ? s.slice(0, a).trim() : s.trim(), u = a >= 0 ? s.slice(a + 1).trim() : "";
1109
1109
  return { mnem: t, unit: i, value: l, description: u };
1110
1110
  }
1111
- function Jt(e) {
1111
+ function Qt(e) {
1112
1112
  const n = [];
1113
1113
  let t = null;
1114
1114
  for (const r of e.split(/\r?\n/)) {
@@ -1127,49 +1127,49 @@ function Ye(e = []) {
1127
1127
  }
1128
1128
  return n;
1129
1129
  }
1130
- function nr(e, n = {}) {
1131
- var g, A, P, U, $, k, O, D, S;
1132
- const t = Jt(e), r = t.find((p) => p.type === "V"), o = t.find((p) => p.type === "W"), i = t.find((p) => p.type === "C"), s = t.find((p) => p.type === "A");
1130
+ function rr(e, n = {}) {
1131
+ var g, L, C, j, H, $, D, R, G;
1132
+ const t = Qt(e), r = t.find((h) => h.type === "V"), o = t.find((h) => h.type === "W"), i = t.find((h) => h.type === "C"), s = t.find((h) => h.type === "A");
1133
1133
  if (!s) return [];
1134
1134
  const a = Ye(r == null ? void 0 : r.lines), l = Ye(o == null ? void 0 : o.lines), u = [];
1135
- for (const p of (i == null ? void 0 : i.lines) ?? []) {
1136
- const I = p.trimStart();
1137
- if (!I || I.startsWith("#")) continue;
1138
- const _ = ut(p);
1139
- _ && u.push(_);
1135
+ for (const h of (i == null ? void 0 : i.lines) ?? []) {
1136
+ const P = h.trimStart();
1137
+ if (!P || P.startsWith("#")) continue;
1138
+ const A = ut(h);
1139
+ A && u.push(A);
1140
1140
  }
1141
- (((A = (g = a.WRAP) == null ? void 0 : g.value) == null ? void 0 : A.trim().toUpperCase()) ?? "NO") === "YES" && console.warn(
1141
+ (((L = (g = a.WRAP) == null ? void 0 : g.value) == null ? void 0 : L.trim().toUpperCase()) ?? "NO") === "YES" && console.warn(
1142
1142
  "parseLasFile: WRAP YES is not supported. Data rows may be read incorrectly."
1143
1143
  );
1144
- const d = n.holeId ?? (((U = (P = l.WELL) == null ? void 0 : P.value) == null ? void 0 : U.trim()) || null) ?? (((k = ($ = l.UWI) == null ? void 0 : $.value) == null ? void 0 : k.trim()) || null) ?? (((D = (O = l.API) == null ? void 0 : O.value) == null ? void 0 : D.trim()) || null) ?? "unknown";
1144
+ const d = n.holeId ?? (((j = (C = l.WELL) == null ? void 0 : C.value) == null ? void 0 : j.trim()) || null) ?? ((($ = (H = l.UWI) == null ? void 0 : H.value) == null ? void 0 : $.trim()) || null) ?? (((R = (D = l.API) == null ? void 0 : D.value) == null ? void 0 : R.trim()) || null) ?? "unknown";
1145
1145
  let m = et;
1146
- if ((S = l.NULL) != null && S.value) {
1147
- const p = Number(l.NULL.value);
1148
- Number.isFinite(p) && (m = p);
1146
+ if ((G = l.NULL) != null && G.value) {
1147
+ const h = Number(l.NULL.value);
1148
+ Number.isFinite(h) && (m = h);
1149
1149
  }
1150
1150
  if (n.nullSentinel !== void 0 && (m = n.nullSentinel), u.length === 0) return [];
1151
- const f = u.slice(1), y = {};
1152
- for (const { mnem: p, unit: I } of f)
1153
- y[p.toLowerCase()] = I;
1154
- const h = {};
1155
- for (const { mnem: p } of f)
1156
- h[p.toLowerCase()] = { depths: [], values: [] };
1157
- for (const p of s.lines) {
1158
- const I = p.trimStart();
1159
- if (!I || I.startsWith("#")) continue;
1160
- const _ = I.split(/\s+/);
1161
- if (_.length < 2) continue;
1162
- const R = Number(_[0]);
1163
- if (!(!Number.isFinite(R) || R === m))
1164
- for (let x = 0; x < f.length; x++) {
1165
- const T = f[x].mnem.toLowerCase(), v = Number(_[x + 1]);
1166
- Number.isFinite(v) && v !== m && (h[T].depths.push(R), h[T].values.push(v));
1151
+ const f = u.slice(1), b = {};
1152
+ for (const { mnem: h, unit: P } of f)
1153
+ b[h.toLowerCase()] = P;
1154
+ const p = {};
1155
+ for (const { mnem: h } of f)
1156
+ p[h.toLowerCase()] = { depths: [], values: [] };
1157
+ for (const h of s.lines) {
1158
+ const P = h.trimStart();
1159
+ if (!P || P.startsWith("#")) continue;
1160
+ const A = P.split(/\s+/);
1161
+ if (A.length < 2) continue;
1162
+ const z = Number(A[0]);
1163
+ if (!(!Number.isFinite(z) || z === m))
1164
+ for (let E = 0; E < f.length; E++) {
1165
+ const _ = f[E].mnem.toLowerCase(), y = Number(A[E + 1]);
1166
+ Number.isFinite(y) && y !== m && (p[_].depths.push(z), p[_].values.push(y));
1167
1167
  }
1168
1168
  }
1169
- const b = {};
1170
- for (const [p, I] of Object.entries(h))
1171
- I.depths.length >= 2 && (b[p] = I);
1172
- return Object.keys(b).length === 0 ? [] : [{ holeId: d, units: y, channels: b }];
1169
+ const v = {};
1170
+ for (const [h, P] of Object.entries(p))
1171
+ P.depths.length >= 2 && (v[h] = P);
1172
+ return Object.keys(v).length === 0 ? [] : [{ holeId: d, units: b, channels: v }];
1173
1173
  }
1174
1174
  const dt = [
1175
1175
  "#0f172a",
@@ -1182,11 +1182,11 @@ const dt = [
1182
1182
  "#db2777",
1183
1183
  "#65a30d",
1184
1184
  "#9333ea"
1185
- ], Qt = { l: 42, r: 4, t: 4, b: 36 }, We = 10, qe = 11, en = 6;
1185
+ ], en = { l: 42, r: 4, t: 4, b: 36 }, We = 10, qe = 11, tn = 6;
1186
1186
  function mt(e = {}) {
1187
1187
  return {
1188
1188
  ...e,
1189
- margin: Qt,
1189
+ margin: en,
1190
1190
  autosize: !0,
1191
1191
  width: void 0,
1192
1192
  xaxis: {
@@ -1201,7 +1201,7 @@ function mt(e = {}) {
1201
1201
  ...e.xaxis && e.xaxis.title && e.xaxis.title.font || {},
1202
1202
  size: qe
1203
1203
  },
1204
- standoff: (e.xaxis && e.xaxis.title && e.xaxis.title.standoff) ?? en
1204
+ standoff: (e.xaxis && e.xaxis.title && e.xaxis.title.standoff) ?? tn
1205
1205
  }
1206
1206
  },
1207
1207
  yaxis: {
@@ -1221,51 +1221,51 @@ function mt(e = {}) {
1221
1221
  }
1222
1222
  };
1223
1223
  }
1224
- function tn(e, {
1224
+ function nn(e, {
1225
1225
  tailScale: n = 5,
1226
1226
  colorBy: t = null,
1227
1227
  palette: r = dt,
1228
- depthCol: o = j,
1228
+ depthCol: o = V,
1229
1229
  dipCol: i = W,
1230
1230
  azCol: s = Y,
1231
1231
  template: a = void 0
1232
1232
  } = {}) {
1233
1233
  const l = e.filter(
1234
- (h) => h[o] != null && h[i] != null && h[s] != null
1234
+ (p) => p[o] != null && p[i] != null && p[s] != null
1235
1235
  );
1236
1236
  if (!l.length)
1237
1237
  return { data: [], layout: {} };
1238
1238
  const u = {};
1239
- t && [...new Set(l.map((b) => b[t]).filter((b) => b != null))].sort().forEach((b, g) => {
1240
- u[b] = r[g % r.length];
1239
+ t && [...new Set(l.map((v) => v[t]).filter((v) => v != null))].sort().forEach((v, g) => {
1240
+ u[v] = r[g % r.length];
1241
1241
  });
1242
1242
  const c = /* @__PURE__ */ new Map(), d = [];
1243
- for (const h of l) {
1244
- const b = Number(h[o]), g = Number(h[i]), A = Number(h[s]), P = t ? h[t] ?? "_default" : "_default", U = t ? u[P] ?? "#0f172a" : "#0f172a";
1245
- c.has(P) || c.set(P, { xs: [], ys: [], dips: [], azs: [], color: U });
1246
- const $ = c.get(P);
1247
- $.xs.push(g), $.ys.push(b), $.dips.push(g), $.azs.push(A);
1248
- const k = A * Math.PI / 180, O = n * (Math.abs(g) / 90), D = Math.sin(k) * O, S = Math.cos(k) * O;
1243
+ for (const p of l) {
1244
+ const v = Number(p[o]), g = Number(p[i]), L = Number(p[s]), C = t ? p[t] ?? "_default" : "_default", j = t ? u[C] ?? "#0f172a" : "#0f172a";
1245
+ c.has(C) || c.set(C, { xs: [], ys: [], dips: [], azs: [], color: j });
1246
+ const H = c.get(C);
1247
+ H.xs.push(g), H.ys.push(v), H.dips.push(g), H.azs.push(L);
1248
+ const $ = L * Math.PI / 180, D = n * (Math.abs(g) / 90), R = Math.sin($) * D, G = Math.cos($) * D;
1249
1249
  d.push({
1250
1250
  type: "line",
1251
1251
  x0: g,
1252
- y0: b,
1253
- x1: g + D,
1254
- y1: b + S,
1255
- line: { color: U, width: 2 }
1252
+ y0: v,
1253
+ x1: g + R,
1254
+ y1: v + G,
1255
+ line: { color: j, width: 2 }
1256
1256
  });
1257
1257
  }
1258
1258
  const m = [], f = t && c.size > 1;
1259
- for (const [h, b] of c.entries())
1259
+ for (const [p, v] of c.entries())
1260
1260
  m.push({
1261
1261
  type: "scatter",
1262
- x: b.xs,
1263
- y: b.ys,
1262
+ x: v.xs,
1263
+ y: v.ys,
1264
1264
  mode: "markers",
1265
- name: h !== "_default" ? String(h) : void 0,
1266
- marker: { size: 8, color: b.color },
1267
- showlegend: f && h !== "_default",
1268
- customdata: b.dips.map((g, A) => [g, b.azs[A]]),
1265
+ name: p !== "_default" ? String(p) : void 0,
1266
+ marker: { size: 8, color: v.color },
1267
+ showlegend: f && p !== "_default",
1268
+ customdata: v.dips.map((g, L) => [g, v.azs[L]]),
1269
1269
  hovertemplate: "Depth: %{y}<br>Dip: %{customdata[0]}<br>Az: %{customdata[1]}<extra></extra>"
1270
1270
  });
1271
1271
  return { data: m, layout: {
@@ -1281,21 +1281,21 @@ function tn(e, {
1281
1281
  },
1282
1282
  yaxis: { title: "Depth (m)", autorange: "reversed" },
1283
1283
  showlegend: !!f,
1284
- template: a !== void 0 ? a : ke
1284
+ template: a !== void 0 ? a : $e
1285
1285
  } };
1286
1286
  }
1287
- function rr(e, {
1287
+ function or(e, {
1288
1288
  labelCol: n = "structure_type",
1289
1289
  palette: t = dt,
1290
- fromCol: r = L,
1291
- toCol: o = M,
1290
+ fromCol: r = M,
1291
+ toCol: o = O,
1292
1292
  template: i = void 0
1293
1293
  } = {}) {
1294
1294
  const s = e.filter((m) => m[r] != null && m[o] != null && Number(m[o]) > Number(m[r])).filter((m) => {
1295
1295
  const f = m[n];
1296
1296
  if (f == null) return !1;
1297
- const y = String(f).trim();
1298
- return y !== "" && !/^(nan|null|none)$/i.test(y);
1297
+ const b = String(f).trim();
1298
+ return b !== "" && !/^(nan|null|none)$/i.test(b);
1299
1299
  }).map((m) => ({ from: Number(m[r]), to: Number(m[o]), label: String(m[n]).trim() })).sort((m, f) => m.from - f.from);
1300
1300
  if (!s.length)
1301
1301
  return { data: [], layout: {} };
@@ -1328,7 +1328,7 @@ function rr(e, {
1328
1328
  xaxis: { range: [0, 1], visible: !1, fixedrange: !0 },
1329
1329
  yaxis: { title: "Depth (m)", autorange: "reversed" },
1330
1330
  showlegend: !1,
1331
- template: i !== void 0 ? i : ke
1331
+ template: i !== void 0 ? i : $e
1332
1332
  }) };
1333
1333
  }
1334
1334
  function Xe(e, n) {
@@ -1339,10 +1339,10 @@ function Xe(e, n) {
1339
1339
  o && o.length + 1 + i.length > n ? (r.push(o), o = i) : o = o ? `${o} ${i}` : i;
1340
1340
  return o && r.push(o), r.join("<br>");
1341
1341
  }
1342
- function nn(e, {
1342
+ function rn(e, {
1343
1343
  commentCol: n = "comments",
1344
- fromCol: t = L,
1345
- toCol: r = M,
1344
+ fromCol: t = M,
1345
+ toCol: r = O,
1346
1346
  bgColor: o = "#f1f5f9",
1347
1347
  borderColor: i = "#cbd5e1",
1348
1348
  textColor: s = "#1e293b",
@@ -1350,14 +1350,14 @@ function nn(e, {
1350
1350
  template: l = void 0
1351
1351
  } = {}) {
1352
1352
  const u = e.filter((g) => g[t] != null && g[r] != null && Number(g[r]) > Number(g[t])).map((g) => {
1353
- const A = g[n], P = A != null && String(A).trim() !== "" && String(A) !== "null" ? String(A).trim() : "";
1354
- return { from: Number(g[t]), to: Number(g[r]), comment: P };
1355
- }).sort((g, A) => g.from - A.from);
1353
+ const L = g[n], C = L != null && String(L).trim() !== "" && String(L) !== "null" ? String(L).trim() : "";
1354
+ return { from: Number(g[t]), to: Number(g[r]), comment: C };
1355
+ }).sort((g, L) => g.from - L.from);
1356
1356
  if (!u.length)
1357
1357
  return { data: [], layout: {} };
1358
- const c = [], d = [], m = [], f = [], y = [];
1358
+ const c = [], d = [], m = [], f = [], b = [];
1359
1359
  for (const g of u) {
1360
- const A = 0.5 * (g.from + g.to), P = !!g.comment;
1360
+ const L = 0.5 * (g.from + g.to), C = !!g.comment;
1361
1361
  c.push({
1362
1362
  type: "rect",
1363
1363
  xref: "x",
@@ -1366,10 +1366,10 @@ function nn(e, {
1366
1366
  x1: 1,
1367
1367
  y0: g.from,
1368
1368
  y1: g.to,
1369
- fillcolor: P ? o : "rgba(0,0,0,0)",
1369
+ fillcolor: C ? o : "rgba(0,0,0,0)",
1370
1370
  line: { color: i, width: 1 },
1371
1371
  layer: "below"
1372
- }), P && (d.push(0.5), m.push(A), f.push(Xe(g.comment, a)), y.push(`${g.from.toFixed(3)}–${g.to.toFixed(3)} m<br>${Xe(g.comment, 40)}`));
1372
+ }), C && (d.push(0.5), m.push(L), f.push(Xe(g.comment, a)), b.push(`${g.from.toFixed(3)}–${g.to.toFixed(3)} m<br>${Xe(g.comment, 40)}`));
1373
1373
  }
1374
1374
  return { data: d.length ? [{
1375
1375
  type: "scatter",
@@ -1379,7 +1379,7 @@ function nn(e, {
1379
1379
  text: f,
1380
1380
  textposition: "middle center",
1381
1381
  textfont: { color: s, size: 10 },
1382
- hovertext: y,
1382
+ hovertext: b,
1383
1383
  hoverinfo: "text",
1384
1384
  showlegend: !1
1385
1385
  }] : [], layout: mt({
@@ -1388,17 +1388,17 @@ function nn(e, {
1388
1388
  xaxis: { range: [0, 1], visible: !1, fixedrange: !0 },
1389
1389
  yaxis: { title: "Depth (m)", autorange: "reversed" },
1390
1390
  showlegend: !1,
1391
- template: l !== void 0 ? l : ke
1391
+ template: l !== void 0 ? l : $e
1392
1392
  }) };
1393
1393
  }
1394
- function or(e, {
1394
+ function sr(e, {
1395
1395
  symbolSize: n = 10,
1396
1396
  xCol: t = "easting",
1397
1397
  yCol: r = "northing"
1398
1398
  } = {}) {
1399
1399
  const o = e[t] != null ? Number(e[t]) : null, i = e[r] != null ? Number(e[r]) : null, s = e[W] != null ? Number(e[W]) : null, a = e[Y] != null ? Number(e[Y]) : null;
1400
1400
  if (o === null || i === null || s === null || a === null) return null;
1401
- const l = (a - 90 + 360) % 360, u = l * Math.PI / 180, c = a * Math.PI / 180, d = n * Math.sin(u), m = n * Math.cos(u), f = n * 0.4 * (s / 90), y = f * Math.sin(c), h = f * Math.cos(c);
1401
+ const l = (a - 90 + 360) % 360, u = l * Math.PI / 180, c = a * Math.PI / 180, d = n * Math.sin(u), m = n * Math.cos(u), f = n * 0.4 * (s / 90), b = f * Math.sin(c), p = f * Math.cos(c);
1402
1402
  return {
1403
1403
  strike: l,
1404
1404
  dipValue: s,
@@ -1408,11 +1408,11 @@ function or(e, {
1408
1408
  strikeY0: i - m,
1409
1409
  strikeX1: o + d,
1410
1410
  strikeY1: i + m,
1411
- tickX1: o + y,
1412
- tickY1: i + h
1411
+ tickX1: o + b,
1412
+ tickY1: i + p
1413
1413
  };
1414
1414
  }
1415
- function rn({
1415
+ function on({
1416
1416
  holeId: e,
1417
1417
  hole: n,
1418
1418
  holeOptions: t,
@@ -1437,7 +1437,7 @@ function ft(e, n) {
1437
1437
  if (!(typeof n != "string" || !n) && !(e == null || typeof e != "object"))
1438
1438
  return e[n];
1439
1439
  }
1440
- function on(e, n) {
1440
+ function sn(e, n) {
1441
1441
  const t = [], r = /* @__PURE__ */ new Set();
1442
1442
  for (const o of e || []) {
1443
1443
  const i = ft(o, n);
@@ -1445,10 +1445,10 @@ function on(e, n) {
1445
1445
  }
1446
1446
  return t;
1447
1447
  }
1448
- function sn(e, n, t) {
1448
+ function an(e, n, t) {
1449
1449
  return t == null || t === "" ? e || [] : (e || []).filter((r) => ft(r, n) === t);
1450
1450
  }
1451
- function an({
1451
+ function ln({
1452
1452
  chartOptions: e,
1453
1453
  showHoleSelect: n,
1454
1454
  showPropertySelect: t,
@@ -1460,11 +1460,11 @@ function an({
1460
1460
  chartType: r !== !1 && (e || []).length > 1
1461
1461
  };
1462
1462
  }
1463
- const pt = "markers+line";
1464
- function ln(e, n) {
1463
+ const ht = "markers+line";
1464
+ function cn(e, n) {
1465
1465
  var r;
1466
1466
  const t = nt(e);
1467
- return t.some((o) => o.value === n) ? n : ((r = t[0]) == null ? void 0 : r.value) || pt;
1467
+ return t.some((o) => o.value === n) ? n : ((r = t[0]) == null ? void 0 : r.value) || ht;
1468
1468
  }
1469
1469
  function Ke(e) {
1470
1470
  const n = typeof e == "string" ? e : e.holeId, t = typeof e == "string" ? e : e.label || e.holeId;
@@ -1474,11 +1474,11 @@ function Ze(e) {
1474
1474
  const n = typeof e == "string" ? e : e.value, t = typeof e == "string" ? e : e.label ?? e.value;
1475
1475
  return [n, t];
1476
1476
  }
1477
- function cn({ selector: e, holeOptions: n, selectedHoleId: t, onConfigChange: r }) {
1477
+ function un({ selector: e, holeOptions: n, selectedHoleId: t, onConfigChange: r }) {
1478
1478
  const o = (e == null ? void 0 : e.kind) || "hole";
1479
1479
  if (o === "field") {
1480
1480
  const s = e.value ?? "", a = e.options || [], l = e.label || "Selection";
1481
- return /* @__PURE__ */ H(
1481
+ return /* @__PURE__ */ w(
1482
1482
  "select",
1483
1483
  {
1484
1484
  className: "plot-select plot-select--field",
@@ -1487,20 +1487,20 @@ function cn({ selector: e, holeOptions: n, selectedHoleId: t, onConfigChange: r
1487
1487
  disabled: a.length === 0,
1488
1488
  "aria-label": l,
1489
1489
  children: [
1490
- a.length === 0 && /* @__PURE__ */ E("option", { value: "", children: "—" }),
1491
- !s && a.length > 0 && /* @__PURE__ */ E("option", { value: "", disabled: !0, hidden: !0, children: `Select ${l.toLowerCase()}` }),
1490
+ a.length === 0 && /* @__PURE__ */ S("option", { value: "", children: "—" }),
1491
+ !s && a.length > 0 && /* @__PURE__ */ S("option", { value: "", disabled: !0, hidden: !0, children: `Select ${l.toLowerCase()}` }),
1492
1492
  a.map((u) => {
1493
1493
  const [c, d] = Ze(u);
1494
- return /* @__PURE__ */ E("option", { value: c, children: d }, c);
1494
+ return /* @__PURE__ */ S("option", { value: c, children: d }, c);
1495
1495
  })
1496
1496
  ]
1497
1497
  }
1498
1498
  );
1499
1499
  }
1500
1500
  if (o === "group+hole") {
1501
- const s = e.groupBy, a = e.groupValue ?? "", l = e.groupLabel || "Group", u = e.groupOptions || on(n, s), c = sn(n, s, a);
1502
- return /* @__PURE__ */ H(Ct, { children: [
1503
- /* @__PURE__ */ H(
1501
+ const s = e.groupBy, a = e.groupValue ?? "", l = e.groupLabel || "Group", u = e.groupOptions || sn(n, s), c = an(n, s, a);
1502
+ return /* @__PURE__ */ w(Ct, { children: [
1503
+ /* @__PURE__ */ w(
1504
1504
  "select",
1505
1505
  {
1506
1506
  className: "plot-select plot-select--group",
@@ -1509,20 +1509,20 @@ function cn({ selector: e, holeOptions: n, selectedHoleId: t, onConfigChange: r
1509
1509
  disabled: u.length === 0,
1510
1510
  "aria-label": l,
1511
1511
  children: [
1512
- u.length === 0 && /* @__PURE__ */ H("option", { value: "", children: [
1512
+ u.length === 0 && /* @__PURE__ */ w("option", { value: "", children: [
1513
1513
  "No ",
1514
1514
  l.toLowerCase(),
1515
1515
  "s"
1516
1516
  ] }),
1517
- !a && u.length > 0 && /* @__PURE__ */ E("option", { value: "", disabled: !0, hidden: !0, children: `Select ${l.toLowerCase()}` }),
1517
+ !a && u.length > 0 && /* @__PURE__ */ S("option", { value: "", disabled: !0, hidden: !0, children: `Select ${l.toLowerCase()}` }),
1518
1518
  u.map((d) => {
1519
1519
  const [m, f] = Ze(d);
1520
- return /* @__PURE__ */ E("option", { value: m, children: f }, m);
1520
+ return /* @__PURE__ */ S("option", { value: m, children: f }, m);
1521
1521
  })
1522
1522
  ]
1523
1523
  }
1524
1524
  ),
1525
- /* @__PURE__ */ H(
1525
+ /* @__PURE__ */ w(
1526
1526
  "select",
1527
1527
  {
1528
1528
  className: "plot-select plot-select--hole",
@@ -1531,11 +1531,11 @@ function cn({ selector: e, holeOptions: n, selectedHoleId: t, onConfigChange: r
1531
1531
  disabled: c.length === 0,
1532
1532
  "aria-label": "Hole",
1533
1533
  children: [
1534
- c.length === 0 && /* @__PURE__ */ E("option", { value: "", children: "No holes" }),
1535
- !t && c.length > 0 && /* @__PURE__ */ E("option", { value: "", disabled: !0, hidden: !0, children: "Select a hole" }),
1534
+ c.length === 0 && /* @__PURE__ */ S("option", { value: "", children: "No holes" }),
1535
+ !t && c.length > 0 && /* @__PURE__ */ S("option", { value: "", disabled: !0, hidden: !0, children: "Select a hole" }),
1536
1536
  c.map((d) => {
1537
1537
  const [m, f] = Ke(d);
1538
- return /* @__PURE__ */ E("option", { value: m, children: f }, m);
1538
+ return /* @__PURE__ */ S("option", { value: m, children: f }, m);
1539
1539
  })
1540
1540
  ]
1541
1541
  }
@@ -1543,7 +1543,7 @@ function cn({ selector: e, holeOptions: n, selectedHoleId: t, onConfigChange: r
1543
1543
  ] });
1544
1544
  }
1545
1545
  const i = n.length > 0;
1546
- return /* @__PURE__ */ H(
1546
+ return /* @__PURE__ */ w(
1547
1547
  "select",
1548
1548
  {
1549
1549
  className: "plot-select plot-select--hole",
@@ -1552,132 +1552,165 @@ function cn({ selector: e, holeOptions: n, selectedHoleId: t, onConfigChange: r
1552
1552
  disabled: !i,
1553
1553
  "aria-label": "Hole",
1554
1554
  children: [
1555
- !i && /* @__PURE__ */ E("option", { value: "", children: "No holes loaded" }),
1556
- !t && i && /* @__PURE__ */ E("option", { value: "", disabled: !0, hidden: !0, children: "Select a hole" }),
1555
+ !i && /* @__PURE__ */ S("option", { value: "", children: "No holes loaded" }),
1556
+ !t && i && /* @__PURE__ */ S("option", { value: "", disabled: !0, hidden: !0, children: "Select a hole" }),
1557
1557
  n.map((s) => {
1558
1558
  const [a, l] = Ke(s);
1559
- return /* @__PURE__ */ E("option", { value: a, children: l }, a);
1559
+ return /* @__PURE__ */ S("option", { value: a, children: l }, a);
1560
1560
  })
1561
1561
  ]
1562
1562
  }
1563
1563
  );
1564
1564
  }
1565
- function sr({
1565
+ function ir({
1566
1566
  config: e,
1567
1567
  graph: n,
1568
1568
  holeOptions: t = [],
1569
1569
  propertyOptions: r = [],
1570
- onConfigChange: o,
1571
- template: i,
1572
- showHoleSelect: s = !0,
1573
- showPropertySelect: a = !0,
1574
- showChartTypeSelect: l = !0,
1575
- holeSelector: u
1570
+ propertyMeta: o,
1571
+ onConfigChange: i,
1572
+ template: s,
1573
+ showHoleSelect: a = !0,
1574
+ showPropertySelect: l = !0,
1575
+ showChartTypeSelect: u = !0,
1576
+ holeSelector: c
1576
1577
  }) {
1577
- const c = _e(null), d = n == null ? void 0 : n.hole, m = (n == null ? void 0 : n.points) || [], f = (e == null ? void 0 : e.property) || "", y = (e == null ? void 0 : e.chartType) || pt, h = (e == null ? void 0 : e.holeId) || "", b = (n == null ? void 0 : n.displayType) || (n != null && n.isComment ? ze : n != null && n.isCategorical ? Ue : At), g = nt(b), A = ln(b, y), [P, U] = K(""), $ = rn({
1578
- holeId: h,
1579
- hole: d,
1578
+ const d = ye(null), m = ye(null), f = n == null ? void 0 : n.hole, b = (n == null ? void 0 : n.points) || [], p = (e == null ? void 0 : e.property) || "", v = o == null ? void 0 : o[p], g = (e == null ? void 0 : e.chartType) || ht, L = (e == null ? void 0 : e.holeId) || "", C = (n == null ? void 0 : n.displayType) || (n != null && n.isComment ? ze : n != null && n.isCategorical ? Ge : At), j = nt(C), H = cn(C, g), [$, D] = K(""), [R, G] = K({ width: 0, height: 0 }), h = on({
1579
+ holeId: L,
1580
+ hole: f,
1580
1581
  holeOptions: t,
1581
- property: f,
1582
+ property: p,
1582
1583
  propertyOptions: r,
1583
- displayType: b,
1584
- points: m,
1585
- renderError: P
1586
- }), k = $.kind !== "chart", O = an({
1587
- chartOptions: g,
1588
- showHoleSelect: s,
1589
- showPropertySelect: a,
1590
- showChartTypeSelect: l
1591
- }), D = r.length > 0;
1592
- return ne(() => {
1593
- if ($.kind !== "chart") return;
1594
- const S = c.current;
1595
- if (!S) return;
1596
- const p = b === ze, I = b === tt;
1597
- let _;
1584
+ displayType: C,
1585
+ points: b,
1586
+ renderError: $
1587
+ }), P = h.kind !== "chart", A = ln({
1588
+ chartOptions: j,
1589
+ showHoleSelect: a,
1590
+ showPropertySelect: l,
1591
+ showChartTypeSelect: u
1592
+ }), z = r.length > 0;
1593
+ return te(() => {
1594
+ const E = d.current;
1595
+ if (!E || typeof ResizeObserver > "u") return;
1596
+ let _ = 0;
1597
+ const y = () => {
1598
+ _ && cancelAnimationFrame(_), _ = requestAnimationFrame(() => {
1599
+ const F = Math.max(0, Math.floor(E.clientWidth)), T = Math.max(0, Math.floor(E.clientHeight));
1600
+ G((x) => x.width === F && x.height === T ? x : { width: F, height: T });
1601
+ });
1602
+ };
1603
+ y();
1604
+ const I = new ResizeObserver(y);
1605
+ return I.observe(E), () => {
1606
+ _ && cancelAnimationFrame(_), I.disconnect();
1607
+ };
1608
+ }, []), te(() => {
1609
+ if (h.kind !== "chart") return;
1610
+ const E = m.current;
1611
+ if (!E || R.width <= 0 || R.height <= 0) return;
1612
+ const _ = C === ze, y = C === tt;
1613
+ let I;
1598
1614
  try {
1599
- p ? _ = nn(m, { commentCol: f, fromCol: "from", toCol: "to" }) : I ? _ = tn(m) : _ = St({
1600
- points: m,
1601
- isCategorical: b === Ue,
1602
- property: f,
1603
- chartType: A,
1604
- template: i
1615
+ _ ? I = rn(b, { commentCol: p, fromCol: "from", toCol: "to" }) : y ? I = nn(b) : I = St({
1616
+ points: b,
1617
+ isCategorical: C === Ge,
1618
+ property: p,
1619
+ chartType: H,
1620
+ template: s,
1621
+ meta: v
1605
1622
  });
1606
1623
  } catch (x) {
1607
- console.error("Plot build error", x), U((x == null ? void 0 : x.message) || "Plot build error");
1624
+ console.error("Plot build error", x), D((x == null ? void 0 : x.message) || "Plot build error");
1608
1625
  return;
1609
1626
  }
1610
- if ((!(_ != null && _.data) || _.data.length === 0) && !p)
1627
+ if ((!(I != null && I.data) || I.data.length === 0) && !_)
1611
1628
  return;
1612
- const R = {
1629
+ const F = {
1613
1630
  displayModeBar: !0,
1614
- responsive: !0,
1615
- useResizeHandler: !0,
1631
+ responsive: !1,
1616
1632
  modeBarButtonsToRemove: ["select2d", "lasso2d", "autoScale2d"]
1633
+ }, T = {
1634
+ ...I.layout,
1635
+ autosize: !1,
1636
+ width: R.width,
1637
+ height: R.height
1617
1638
  };
1618
1639
  try {
1619
- U(""), Ee.react(S, _.data, _.layout, R), requestAnimationFrame(() => {
1620
- S && S.parentElement && Ee.Plots.resize(S);
1621
- });
1640
+ D(""), Oe.react(E, I.data, T, F);
1622
1641
  } catch (x) {
1623
- console.error("Plot render error", x), U((x == null ? void 0 : x.message) || "Plot render error");
1642
+ console.error("Plot render error", x), D((x == null ? void 0 : x.message) || "Plot render error");
1624
1643
  }
1625
1644
  return () => {
1626
- if (S)
1645
+ if (E)
1627
1646
  try {
1628
- Ee.purge(S);
1647
+ Oe.purge(E);
1629
1648
  } catch (x) {
1630
1649
  console.warn("Plot purge error", x);
1631
1650
  }
1632
1651
  };
1633
- }, [$.kind, d, f, A, b, m, i]), ne(() => {
1634
- const S = c.current;
1635
- if (!S || typeof ResizeObserver > "u") return;
1636
- const p = new ResizeObserver(() => {
1652
+ }, [
1653
+ h.kind,
1654
+ f,
1655
+ p,
1656
+ v,
1657
+ H,
1658
+ C,
1659
+ b,
1660
+ s,
1661
+ R.width,
1662
+ R.height
1663
+ ]), te(() => {
1664
+ const E = m.current;
1665
+ if (!E || typeof ResizeObserver > "u") return;
1666
+ const _ = new ResizeObserver(() => {
1637
1667
  try {
1638
- S && S.data && Ee.Plots.resize(S);
1639
- } catch (I) {
1640
- console.warn("Plot resize error", I);
1668
+ if (E && E.data) {
1669
+ const y = Math.max(0, Math.floor(E.clientWidth)), I = Math.max(0, Math.floor(E.clientHeight));
1670
+ y > 0 && I > 0 && Oe.relayout(E, { width: y, height: I, autosize: !1 });
1671
+ }
1672
+ } catch (y) {
1673
+ console.warn("Plot resize error", y);
1641
1674
  }
1642
1675
  });
1643
- return p.observe(S), () => p.disconnect();
1644
- }, [$.kind]), /* @__PURE__ */ H("div", { className: `plot-card${k ? " empty" : ""}`, children: [
1645
- /* @__PURE__ */ H("header", { className: "plot-card__controls", children: [
1646
- O.hole && /* @__PURE__ */ E("div", { className: "plot-title", children: cn({
1647
- selector: u,
1676
+ return _.observe(E), () => _.disconnect();
1677
+ }, [h.kind]), /* @__PURE__ */ w("div", { className: `plot-card${P ? " empty" : ""}`, children: [
1678
+ /* @__PURE__ */ w("header", { className: "plot-card__controls", children: [
1679
+ A.hole && /* @__PURE__ */ S("div", { className: "plot-title", children: un({
1680
+ selector: c,
1648
1681
  holeOptions: t,
1649
- selectedHoleId: h,
1650
- onConfigChange: o
1682
+ selectedHoleId: L,
1683
+ onConfigChange: i
1651
1684
  }) }),
1652
- (O.property || O.chartType) && /* @__PURE__ */ H("div", { className: "plot-controls column", children: [
1653
- O.property && /* @__PURE__ */ H(
1685
+ (A.property || A.chartType) && /* @__PURE__ */ w("div", { className: "plot-controls column", children: [
1686
+ A.property && /* @__PURE__ */ w(
1654
1687
  "select",
1655
1688
  {
1656
1689
  className: "plot-select plot-select--property",
1657
- value: f,
1658
- onChange: (S) => o && o({ property: S.target.value }),
1659
- disabled: !D,
1690
+ value: p,
1691
+ onChange: (E) => i && i({ property: E.target.value }),
1692
+ disabled: !z,
1660
1693
  "aria-label": "Property",
1661
1694
  children: [
1662
- !D && /* @__PURE__ */ E("option", { value: "", children: "—" }),
1663
- !f && D && /* @__PURE__ */ E("option", { value: "", disabled: !0, hidden: !0, children: "Select a property" }),
1664
- r.map((S) => /* @__PURE__ */ E("option", { value: S, children: S }, S))
1695
+ !z && /* @__PURE__ */ S("option", { value: "", children: "—" }),
1696
+ !p && z && /* @__PURE__ */ S("option", { value: "", disabled: !0, hidden: !0, children: "Select a property" }),
1697
+ r.map((E) => /* @__PURE__ */ S("option", { value: E, children: Tt(E, o == null ? void 0 : o[E]) }, E))
1665
1698
  ]
1666
1699
  }
1667
1700
  ),
1668
- O.chartType && /* @__PURE__ */ E(
1701
+ A.chartType && /* @__PURE__ */ S(
1669
1702
  "select",
1670
1703
  {
1671
1704
  className: "plot-select plot-select--chart-type",
1672
- value: A,
1673
- onChange: (S) => o && o({ chartType: S.target.value }),
1705
+ value: H,
1706
+ onChange: (E) => i && i({ chartType: E.target.value }),
1674
1707
  "aria-label": "Chart type",
1675
- children: g.map((S) => /* @__PURE__ */ E("option", { value: S.value, children: S.label }, S.value))
1708
+ children: j.map((E) => /* @__PURE__ */ S("option", { value: E.value, children: E.label }, E.value))
1676
1709
  }
1677
1710
  )
1678
1711
  ] })
1679
1712
  ] }),
1680
- /* @__PURE__ */ E("div", { className: "plot-card__body", children: $.kind === "chart" ? /* @__PURE__ */ E("div", { className: "plotly-chart", ref: c }) : /* @__PURE__ */ E("div", { className: "placeholder", children: $.text }) })
1713
+ /* @__PURE__ */ S("div", { className: "plot-card__body", ref: d, children: h.kind === "chart" ? /* @__PURE__ */ S("div", { className: "plotly-chart", ref: m }) : /* @__PURE__ */ S("div", { className: "placeholder", children: h.text }) })
1681
1714
  ] });
1682
1715
  }
1683
1716
  function Je(e, n) {
@@ -1694,7 +1727,7 @@ function Je(e, n) {
1694
1727
  }
1695
1728
  return Array.from(t.values());
1696
1729
  }
1697
- function un(e, n) {
1730
+ function dn(e, n) {
1698
1731
  if (!e || !n) return [];
1699
1732
  const t = /* @__PURE__ */ new Set(), r = [];
1700
1733
  for (const o of e.points || []) {
@@ -1705,146 +1738,146 @@ function un(e, n) {
1705
1738
  }
1706
1739
  return r;
1707
1740
  }
1708
- function ir({
1741
+ function ar({
1709
1742
  initialFocusedHoleId: e = "",
1710
1743
  sourceFile: n = null,
1711
1744
  extraHoles: t = [],
1712
1745
  plotCount: r = 4
1713
1746
  } = {}) {
1714
- const [o, i] = K([]), [s, a] = K([]), [l, u] = K([]), [c, d] = K([]), [m, f] = K([]), [y, h] = K({}), [b, g] = K(""), [A, P] = K([]), [U, $] = K(""), [k, O] = K(e || ""), [D, S] = K([]), p = _e(null);
1715
- ne(() => {
1716
- !n || p.current === n || (p.current = n, zt(n).then((T) => {
1717
- if (!T) return;
1718
- const v = Array.from(new Map(T.map((z) => [z.holeId, z])).values());
1719
- a(v), P(it({
1720
- holeIds: v.map((z) => z.holeId),
1721
- focusedHoleId: k,
1747
+ const [o, i] = K([]), [s, a] = K([]), [l, u] = K([]), [c, d] = K([]), [m, f] = K([]), [b, p] = K({}), [v, g] = K(""), [L, C] = K([]), [j, H] = K(""), [$, D] = K(e || ""), [R, G] = K([]), h = ye(null);
1748
+ te(() => {
1749
+ !n || h.current === n || (h.current = n, Ft(n).then((_) => {
1750
+ if (!_) return;
1751
+ const y = Array.from(new Map(_.map((I) => [I.holeId, I])).values());
1752
+ a(y), C(it({
1753
+ holeIds: y.map((I) => I.holeId),
1754
+ focusedHoleId: $,
1722
1755
  plotCount: r,
1723
1756
  defaultProp: "",
1724
1757
  categoricalProps: c,
1725
1758
  commentProps: m,
1726
1759
  numericDefaultChartType: "markers+line"
1727
1760
  }));
1728
- }).catch((T) => {
1729
- console.info("Assay metadata load skipped:", T.message);
1761
+ }).catch((_) => {
1762
+ console.info("Assay metadata load skipped:", _.message);
1730
1763
  }));
1731
- }, [n, k, r, c, m]), ne(() => {
1764
+ }, [n, $, r, c, m]), te(() => {
1732
1765
  if (!(t != null && t.length)) return;
1733
- const T = t.map((v) => ({ holeId: v.id || v.holeId })).filter((v) => v.holeId);
1734
- a((v) => {
1735
- const z = new Set(v.map((C) => C.holeId)), F = T.filter((C) => !z.has(C.holeId));
1736
- return F.length ? [...v, ...F] : v;
1766
+ const _ = t.map((y) => ({ holeId: y.id || y.holeId })).filter((y) => y.holeId);
1767
+ a((y) => {
1768
+ const I = new Set(y.map((T) => T.holeId)), F = _.filter((T) => !I.has(T.holeId));
1769
+ return F.length ? [...y, ...F] : y;
1737
1770
  });
1738
- }, [t]), ne(() => {
1739
- $((T) => T && T.startsWith("Loading ") && T.includes(" for hole ") ? T : "");
1740
- }, [A]), ne(() => {
1771
+ }, [t]), te(() => {
1772
+ H((_) => _ && _.startsWith("Loading ") && _.includes(" for hole ") ? _ : "");
1773
+ }, [L]), te(() => {
1741
1774
  if (!s.length) {
1742
- P([]);
1775
+ C([]);
1743
1776
  return;
1744
1777
  }
1745
- const T = st(s.map((v) => v.holeId), k);
1746
- P((v) => Array.from({ length: r }).map((F, C) => {
1778
+ const _ = st(s.map((y) => y.holeId), $);
1779
+ C((y) => Array.from({ length: r }).map((F, T) => {
1747
1780
  var X;
1748
- const B = v[C] || {}, V = s.some((ae) => ae.holeId === B.holeId) ? B.holeId : T[C] || ((X = s[C]) == null ? void 0 : X.holeId) || "", w = B.property || b, q = Te({
1749
- property: w,
1750
- chartType: B.chartType,
1781
+ const x = y[T] || {}, B = s.some((ae) => ae.holeId === x.holeId) ? x.holeId : _[T] || ((X = s[T]) == null ? void 0 : X.holeId) || "", k = x.property || v, q = Se({
1782
+ property: k,
1783
+ chartType: x.chartType,
1751
1784
  categoricalProps: c,
1752
1785
  commentProps: m,
1753
1786
  numericDefaultChartType: "markers+line"
1754
1787
  });
1755
- return { holeId: V, property: w, chartType: q };
1788
+ return { holeId: B, property: k, chartType: q };
1756
1789
  }));
1757
- }, [s, k, b, c, m, r]), ne(() => {
1790
+ }, [s, $, v, c, m, r]), te(() => {
1758
1791
  if (!n) return;
1759
- A.map((v) => v.holeId).filter(Boolean).forEach((v) => {
1760
- const z = o.some((C) => (C.id || C.holeId) === v), F = D.includes(v);
1761
- z || F || (S((C) => [...C, v]), $t(n, v).then((C) => {
1762
- S((B) => B.filter((V) => V !== v)), C && i((B) => {
1763
- const V = Je(
1764
- [...B.filter((q) => (q.id || q.holeId) !== v), C],
1792
+ L.map((y) => y.holeId).filter(Boolean).forEach((y) => {
1793
+ const I = o.some((T) => (T.id || T.holeId) === y), F = R.includes(y);
1794
+ I || F || (G((T) => [...T, y]), $t(n, y).then((T) => {
1795
+ G((x) => x.filter((B) => B !== y)), T && i((x) => {
1796
+ const B = Je(
1797
+ [...x.filter((q) => (q.id || q.holeId) !== y), T],
1765
1798
  t
1766
- ), w = Ie(V);
1767
- return u(w.numericProps), d(w.categoricalProps), f(w.commentProps), h(w.columnMeta), !b && w.defaultProp && (g(w.defaultProp), P((q) => q.map((X) => ({
1799
+ ), k = Te(B);
1800
+ return u(k.numericProps), d(k.categoricalProps), f(k.commentProps), p(k.columnMeta), !v && k.defaultProp && (g(k.defaultProp), C((q) => q.map((X) => ({
1768
1801
  ...X,
1769
- property: X.property || w.defaultProp,
1770
- chartType: Te({
1771
- property: X.property || w.defaultProp,
1802
+ property: X.property || k.defaultProp,
1803
+ chartType: Se({
1804
+ property: X.property || k.defaultProp,
1772
1805
  chartType: X.chartType,
1773
- categoricalProps: w.categoricalProps,
1774
- commentProps: w.commentProps,
1806
+ categoricalProps: k.categoricalProps,
1807
+ commentProps: k.commentProps,
1775
1808
  numericDefaultChartType: "markers+line"
1776
1809
  })
1777
- })))), V;
1810
+ })))), B;
1778
1811
  });
1779
- }).catch((C) => {
1780
- console.error(C), S((B) => B.filter((V) => V !== v)), $(C.message || `Error loading hole ${v}`);
1812
+ }).catch((T) => {
1813
+ console.error(T), G((x) => x.filter((B) => B !== y)), H(T.message || `Error loading hole ${y}`);
1781
1814
  }));
1782
1815
  });
1783
- }, [A, n, o, D, b, t]), ne(() => {
1784
- t != null && t.length && i((T) => {
1785
- if (!T.length) {
1786
- const F = Ie(t);
1787
- return u(F.numericProps), d(F.categoricalProps), f(F.commentProps), h(F.columnMeta), !b && F.defaultProp && g(F.defaultProp), t;
1816
+ }, [L, n, o, R, v, t]), te(() => {
1817
+ t != null && t.length && i((_) => {
1818
+ if (!_.length) {
1819
+ const F = Te(t);
1820
+ return u(F.numericProps), d(F.categoricalProps), f(F.commentProps), p(F.columnMeta), !v && F.defaultProp && g(F.defaultProp), t;
1788
1821
  }
1789
- const v = Je(T, t), z = Ie(v);
1790
- return u(z.numericProps), d(z.categoricalProps), f(z.commentProps), h(z.columnMeta), !b && z.defaultProp && g(z.defaultProp), v;
1822
+ const y = Je(_, t), I = Te(y);
1823
+ return u(I.numericProps), d(I.categoricalProps), f(I.commentProps), p(I.columnMeta), !v && I.defaultProp && g(I.defaultProp), y;
1791
1824
  });
1792
1825
  }, [t]);
1793
- const I = ee(
1826
+ const P = ee(
1794
1827
  () => [...l, ...c, ...m],
1795
1828
  [l, c, m]
1796
- ), _ = ee(
1797
- () => s.map((T) => ({ holeId: T.holeId, label: T.holeId })).sort((T, v) => T.label.localeCompare(v.label)),
1829
+ ), A = ee(
1830
+ () => s.map((_) => ({ holeId: _.holeId, label: _.holeId })).sort((_, y) => _.label.localeCompare(y.label)),
1798
1831
  [s]
1799
- ), R = ee(() => {
1800
- const T = [...l, ...c, ...m];
1801
- return Array.from({ length: r }).map((v, z) => {
1802
- const F = A[z] || {}, C = o.find((fe) => (fe.id || fe.holeId) === F.holeId) || null, B = C ? T.filter((fe) => Tt(C, fe)) : T;
1803
- let V = F.property || b;
1804
- C && !B.includes(V) && (V = B[0] || V);
1805
- const w = m.includes(V), q = !w && c.includes(V), X = !w && !q && V === "dip", ae = w ? "comment" : X ? "tadpole" : q ? "categorical" : "numeric", be = X ? "tadpole" : F.chartType || (w ? "comment" : q ? "categorical" : "markers+line"), me = F.holeId || (C == null ? void 0 : C.id) || (C == null ? void 0 : C.holeId) || "", Pe = X ? (C == null ? void 0 : C.points) || [] : w ? un(C, V) : It(C, V, q);
1832
+ ), z = ee(() => {
1833
+ const _ = [...l, ...c, ...m];
1834
+ return Array.from({ length: r }).map((y, I) => {
1835
+ const F = L[I] || {}, T = o.find((fe) => (fe.id || fe.holeId) === F.holeId) || null, x = T ? _.filter((fe) => Lt(T, fe)) : _;
1836
+ let B = F.property || v;
1837
+ T && !x.includes(B) && (B = x[0] || B);
1838
+ const k = m.includes(B), q = !k && c.includes(B), X = !k && !q && B === "dip", ae = k ? "comment" : X ? "tadpole" : q ? "categorical" : "numeric", _e = X ? "tadpole" : F.chartType || (k ? "comment" : q ? "categorical" : "markers+line"), me = F.holeId || (T == null ? void 0 : T.id) || (T == null ? void 0 : T.holeId) || "", Me = X ? (T == null ? void 0 : T.points) || [] : k ? dn(T, B) : It(T, B, q);
1806
1839
  return {
1807
- config: { holeId: me, property: V, chartType: be },
1808
- hole: C,
1809
- loading: D.includes(F.holeId),
1840
+ config: { holeId: me, property: B, chartType: _e },
1841
+ hole: T,
1842
+ loading: R.includes(F.holeId),
1810
1843
  isCategorical: q,
1811
- isComment: w,
1844
+ isComment: k,
1812
1845
  isTadpole: X,
1813
1846
  displayType: ae,
1814
- points: Pe,
1815
- propertyOptions: B,
1847
+ points: Me,
1848
+ propertyOptions: x,
1816
1849
  label: me
1817
1850
  };
1818
1851
  });
1819
- }, [A, o, b, c, m, D, r, l]), x = (T, v) => {
1820
- P((z) => {
1821
- const F = [...z], B = { ...F[T] || {}, ...v };
1822
- return v.property && (B.chartType = Te({
1823
- property: v.property,
1824
- chartType: B.chartType,
1852
+ }, [L, o, v, c, m, R, r, l]), E = (_, y) => {
1853
+ C((I) => {
1854
+ const F = [...I], x = { ...F[_] || {}, ...y };
1855
+ return y.property && (x.chartType = Se({
1856
+ property: y.property,
1857
+ chartType: x.chartType,
1825
1858
  categoricalProps: c,
1826
1859
  commentProps: m,
1827
1860
  numericDefaultChartType: "markers+line"
1828
- })), F[T] = B, F;
1861
+ })), F[_] = x, F;
1829
1862
  });
1830
1863
  };
1831
1864
  return {
1832
- error: U,
1833
- focusedHoleId: k,
1834
- setFocusedHoleId: O,
1835
- setError: $,
1865
+ error: j,
1866
+ focusedHoleId: $,
1867
+ setFocusedHoleId: D,
1868
+ setError: H,
1836
1869
  holeCount: s.length,
1837
1870
  numericProps: l,
1838
1871
  categoricalProps: c,
1839
1872
  commentProps: m,
1840
- columnMeta: y,
1841
- propertyOptions: I,
1842
- labeledHoleOptions: _,
1843
- traceGraphs: R,
1844
- handleConfigChange: x
1873
+ columnMeta: b,
1874
+ propertyOptions: P,
1875
+ labeledHoleOptions: A,
1876
+ traceGraphs: z,
1877
+ handleConfigChange: E
1845
1878
  };
1846
1879
  }
1847
- function ht(e) {
1880
+ function pt(e) {
1848
1881
  return Array.isArray(e) ? e : [];
1849
1882
  }
1850
1883
  function De(e) {
@@ -1859,9 +1892,9 @@ function gt(e = {}) {
1859
1892
  z: De(e.z)
1860
1893
  };
1861
1894
  }
1862
- function dn(e = [], n = [0, 0], t = 0) {
1895
+ function mn(e = [], n = [0, 0], t = 0) {
1863
1896
  const [r, o] = n, i = Number(t) * Math.PI / 180, s = Math.cos(i), a = Math.sin(i);
1864
- return ht(e).map(gt).map((l) => {
1897
+ return pt(e).map(gt).map((l) => {
1865
1898
  if (!Number.isFinite(l.x) || !Number.isFinite(l.y)) return { ...l };
1866
1899
  const u = l.x - r, c = l.y - o;
1867
1900
  return {
@@ -1871,12 +1904,12 @@ function dn(e = [], n = [0, 0], t = 0) {
1871
1904
  };
1872
1905
  });
1873
1906
  }
1874
- function mn(e = [], n = [0, 0], t = 0, r = 50) {
1875
- const o = dn(e, n, t), i = 0.5 * Number(r || 0);
1907
+ function fn(e = [], n = [0, 0], t = 0, r = 50) {
1908
+ const o = mn(e, n, t), i = 0.5 * Number(r || 0);
1876
1909
  return !Number.isFinite(i) || i <= 0 ? o : o.filter((s) => Number.isFinite(s.across) && Math.abs(s.across) <= i);
1877
1910
  }
1878
- function ar(e = [], n = null, t = null) {
1879
- let r = ht(e).map(gt);
1911
+ function lr(e = [], n = null, t = null) {
1912
+ let r = pt(e).map(gt);
1880
1913
  if (Array.isArray(n) && n.length === 2) {
1881
1914
  const [o, i] = n;
1882
1915
  r = r.filter((s) => Number.isFinite(s.z) && s.z <= Number(o) && s.z >= Number(i));
@@ -1886,27 +1919,27 @@ function ar(e = [], n = null, t = null) {
1886
1919
  color_value: o == null ? void 0 : o[t]
1887
1920
  }))), r;
1888
1921
  }
1889
- function lr(e = [], n = [0, 0], t = 0, r = 50, o = null) {
1890
- let i = mn(e, n, t, r);
1922
+ function cr(e = [], n = [0, 0], t = 0, r = 50, o = null) {
1923
+ let i = fn(e, n, t, r);
1891
1924
  return o && (i = i.map((s) => ({
1892
1925
  ...s,
1893
1926
  color_value: s == null ? void 0 : s[o]
1894
1927
  }))), i;
1895
1928
  }
1896
- function He(e) {
1929
+ function Ue(e) {
1897
1930
  return Array.isArray(e) ? e : [];
1898
1931
  }
1899
- function Ge(e = {}) {
1932
+ function He(e = {}) {
1900
1933
  return e.hole_id ?? e.holeId ?? e.id;
1901
1934
  }
1902
1935
  function ue(e, n = void 0) {
1903
1936
  const t = Number(e);
1904
1937
  return Number.isFinite(t) ? t : n;
1905
1938
  }
1906
- function cr(e = [], n = null) {
1939
+ function ur(e = [], n = null) {
1907
1940
  const t = /* @__PURE__ */ new Map();
1908
- He(e).forEach((o) => {
1909
- const i = Ge(o);
1941
+ Ue(e).forEach((o) => {
1942
+ const i = He(o);
1910
1943
  if (i == null || `${i}`.trim() === "") return;
1911
1944
  const s = `${i}`;
1912
1945
  t.has(s) || t.set(s, []), t.get(s).push(o);
@@ -1923,9 +1956,9 @@ function cr(e = [], n = null) {
1923
1956
  n && (a.color = s.map((l) => l == null ? void 0 : l[n])), r.push(a);
1924
1957
  }), r;
1925
1958
  }
1926
- function ur(e = [], n = 1, t = null) {
1927
- return He(e).map((r) => ({
1928
- hole_id: Ge(r),
1959
+ function dr(e = [], n = 1, t = null) {
1960
+ return Ue(e).map((r) => ({
1961
+ hole_id: He(r),
1929
1962
  from: r == null ? void 0 : r.from,
1930
1963
  to: r == null ? void 0 : r.to,
1931
1964
  radius: n,
@@ -1933,14 +1966,14 @@ function ur(e = [], n = 1, t = null) {
1933
1966
  value: t ? r == null ? void 0 : r[t] : null
1934
1967
  }));
1935
1968
  }
1936
- function dr(e = [], n = null) {
1937
- return n ? He(e).filter((t) => Object.prototype.hasOwnProperty.call(t || {}, n)).map((t) => ({
1938
- hole_id: Ge(t),
1969
+ function mr(e = [], n = null) {
1970
+ return n ? Ue(e).filter((t) => Object.prototype.hasOwnProperty.call(t || {}, n)).map((t) => ({
1971
+ hole_id: He(t),
1939
1972
  label: t == null ? void 0 : t[n],
1940
1973
  depth: 0.5 * (ue(t == null ? void 0 : t.from, 0) + ue(t == null ? void 0 : t.to, 0))
1941
1974
  })) : [];
1942
1975
  }
1943
- function mr({
1976
+ function fr({
1944
1977
  controlMode: e = "orbit",
1945
1978
  onToggleFly: n = () => {
1946
1979
  },
@@ -1954,13 +1987,13 @@ function mr({
1954
1987
  onToggleDarkBackground: s = () => {
1955
1988
  }
1956
1989
  }) {
1957
- return /* @__PURE__ */ H("div", { className: "baselode-3d-controls", children: [
1958
- /* @__PURE__ */ E("button", { type: "button", className: "ghost-button", onClick: t, children: "Recenter to (0,0,0)" }),
1959
- /* @__PURE__ */ E("button", { type: "button", className: "ghost-button", onClick: r, children: "Look down" }),
1960
- /* @__PURE__ */ E("button", { type: "button", className: "ghost-button", onClick: o, children: "Fit to scene" }),
1961
- /* @__PURE__ */ E("button", { type: "button", className: "ghost-button", onClick: n, children: e === "orbit" ? "Enable fly controls" : "Disable fly controls" }),
1962
- /* @__PURE__ */ H("label", { className: "baselode-3d-controls-checkbox", children: [
1963
- /* @__PURE__ */ E(
1990
+ return /* @__PURE__ */ w("div", { className: "baselode-3d-controls", children: [
1991
+ /* @__PURE__ */ S("button", { type: "button", className: "ghost-button", onClick: t, children: "Recenter to (0,0,0)" }),
1992
+ /* @__PURE__ */ S("button", { type: "button", className: "ghost-button", onClick: r, children: "Look down" }),
1993
+ /* @__PURE__ */ S("button", { type: "button", className: "ghost-button", onClick: o, children: "Fit to scene" }),
1994
+ /* @__PURE__ */ S("button", { type: "button", className: "ghost-button", onClick: n, children: e === "orbit" ? "Enable fly controls" : "Disable fly controls" }),
1995
+ /* @__PURE__ */ w("label", { className: "baselode-3d-controls-checkbox", children: [
1996
+ /* @__PURE__ */ S(
1964
1997
  "input",
1965
1998
  {
1966
1999
  type: "checkbox",
@@ -1972,7 +2005,7 @@ function mr({
1972
2005
  ] })
1973
2006
  ] });
1974
2007
  }
1975
- function fr({
2008
+ function hr({
1976
2009
  properties: e = [],
1977
2010
  selectedProperty: n = "",
1978
2011
  onPropertyChange: t = () => {
@@ -1986,9 +2019,9 @@ function fr({
1986
2019
  }
1987
2020
  }) {
1988
2021
  var l, u;
1989
- return /* @__PURE__ */ H("div", { className: "bm-widget", children: [
1990
- /* @__PURE__ */ E("label", { className: "bm-widget__label", htmlFor: "bm-property-select", children: "Color by" }),
1991
- /* @__PURE__ */ H(
2022
+ return /* @__PURE__ */ w("div", { className: "bm-widget", children: [
2023
+ /* @__PURE__ */ S("label", { className: "bm-widget__label", htmlFor: "bm-property-select", children: "Color by" }),
2024
+ /* @__PURE__ */ w(
1992
2025
  "select",
1993
2026
  {
1994
2027
  id: "bm-property-select",
@@ -1996,19 +2029,19 @@ function fr({
1996
2029
  value: n,
1997
2030
  onChange: (c) => t(c.target.value),
1998
2031
  children: [
1999
- e.length === 0 && /* @__PURE__ */ E("option", { value: "", children: "— no attributes —" }),
2000
- e.map((c) => /* @__PURE__ */ E("option", { value: c, children: c }, c))
2032
+ e.length === 0 && /* @__PURE__ */ S("option", { value: "", children: "— no attributes —" }),
2033
+ e.map((c) => /* @__PURE__ */ S("option", { value: c, children: c }, c))
2001
2034
  ]
2002
2035
  }
2003
2036
  ),
2004
- i && i.type === "numeric" && /* @__PURE__ */ H("div", { className: "bm-widget__scale", children: [
2005
- /* @__PURE__ */ E("span", { className: "bm-widget__scale-label bm-widget__scale-label--min", children: ((l = i.min) == null ? void 0 : l.toFixed(2)) ?? "—" }),
2006
- /* @__PURE__ */ E("div", { className: "bm-widget__scale-bar" }),
2007
- /* @__PURE__ */ E("span", { className: "bm-widget__scale-label bm-widget__scale-label--max", children: ((u = i.max) == null ? void 0 : u.toFixed(2)) ?? "—" })
2037
+ i && i.type === "numeric" && /* @__PURE__ */ w("div", { className: "bm-widget__scale", children: [
2038
+ /* @__PURE__ */ S("span", { className: "bm-widget__scale-label bm-widget__scale-label--min", children: ((l = i.min) == null ? void 0 : l.toFixed(2)) ?? "—" }),
2039
+ /* @__PURE__ */ S("div", { className: "bm-widget__scale-bar" }),
2040
+ /* @__PURE__ */ S("span", { className: "bm-widget__scale-label bm-widget__scale-label--max", children: ((u = i.max) == null ? void 0 : u.toFixed(2)) ?? "—" })
2008
2041
  ] }),
2009
- i && i.type === "categorical" && /* @__PURE__ */ E("div", { className: "bm-widget__categories", children: (i.categories || []).map((c, d) => {
2042
+ i && i.type === "categorical" && /* @__PURE__ */ S("div", { className: "bm-widget__categories", children: (i.categories || []).map((c, d) => {
2010
2043
  const m = Math.round(d / Math.max(i.categories.length, 1) * 360);
2011
- return /* @__PURE__ */ E(
2044
+ return /* @__PURE__ */ S(
2012
2045
  "span",
2013
2046
  {
2014
2047
  className: "bm-widget__category-chip",
@@ -2018,12 +2051,12 @@ function fr({
2018
2051
  c
2019
2052
  );
2020
2053
  }) }),
2021
- /* @__PURE__ */ H("label", { className: "bm-widget__label", htmlFor: "bm-opacity-slider", children: [
2054
+ /* @__PURE__ */ w("label", { className: "bm-widget__label", htmlFor: "bm-opacity-slider", children: [
2022
2055
  "Opacity (",
2023
2056
  Math.round(r * 100),
2024
2057
  "%)"
2025
2058
  ] }),
2026
- /* @__PURE__ */ E(
2059
+ /* @__PURE__ */ S(
2027
2060
  "input",
2028
2061
  {
2029
2062
  id: "bm-opacity-slider",
@@ -2036,10 +2069,10 @@ function fr({
2036
2069
  onChange: (c) => o(parseFloat(c.target.value))
2037
2070
  }
2038
2071
  ),
2039
- s && /* @__PURE__ */ H("div", { className: "bm-widget__popup", children: [
2040
- /* @__PURE__ */ H("div", { className: "bm-widget__popup-header", children: [
2041
- /* @__PURE__ */ E("span", { children: "Block attributes" }),
2042
- /* @__PURE__ */ E(
2072
+ s && /* @__PURE__ */ w("div", { className: "bm-widget__popup", children: [
2073
+ /* @__PURE__ */ w("div", { className: "bm-widget__popup-header", children: [
2074
+ /* @__PURE__ */ S("span", { children: "Block attributes" }),
2075
+ /* @__PURE__ */ S(
2043
2076
  "button",
2044
2077
  {
2045
2078
  type: "button",
@@ -2050,19 +2083,19 @@ function fr({
2050
2083
  }
2051
2084
  )
2052
2085
  ] }),
2053
- /* @__PURE__ */ E("table", { className: "bm-widget__popup-table", children: /* @__PURE__ */ E("tbody", { children: Object.entries(s).map(([c, d]) => /* @__PURE__ */ H("tr", { children: [
2054
- /* @__PURE__ */ E("th", { children: c }),
2055
- /* @__PURE__ */ E("td", { children: d == null ? "—" : String(d) })
2086
+ /* @__PURE__ */ S("table", { className: "bm-widget__popup-table", children: /* @__PURE__ */ S("tbody", { children: Object.entries(s).map(([c, d]) => /* @__PURE__ */ w("tr", { children: [
2087
+ /* @__PURE__ */ S("th", { children: c }),
2088
+ /* @__PURE__ */ S("td", { children: d == null ? "—" : String(d) })
2056
2089
  ] }, c)) }) })
2057
2090
  ] })
2058
2091
  ] });
2059
2092
  }
2060
- const fn = [
2093
+ const hn = [
2061
2094
  { minZoom: 0, lodKey: "thumb" },
2062
2095
  { minZoom: 4, lodKey: "medium" },
2063
2096
  { minZoom: 7, lodKey: "full" }
2064
- ], yt = 50;
2065
- function pn(e, n, t = fn) {
2097
+ ], bt = 50;
2098
+ function pn(e, n, t = hn) {
2066
2099
  var i;
2067
2100
  const r = e.lod_urls;
2068
2101
  if (!r || typeof r != "object" || Array.isArray(r))
@@ -2072,10 +2105,10 @@ function pn(e, n, t = fn) {
2072
2105
  n >= s.minZoom && (o = s.lodKey);
2073
2106
  return r[o] || e.image_url || "";
2074
2107
  }
2075
- function hn(e) {
2108
+ function gn(e) {
2076
2109
  return [...e].sort((n, t) => (n.from_depth ?? 0) - (t.from_depth ?? 0));
2077
2110
  }
2078
- function gn(e) {
2111
+ function bn(e) {
2079
2112
  const n = {};
2080
2113
  for (const t of e) {
2081
2114
  const r = t.photo_set != null && t.photo_set !== "" ? String(t.photo_set) : "default";
@@ -2093,13 +2126,13 @@ function yn(e, n, t = 10) {
2093
2126
  }
2094
2127
  return r;
2095
2128
  }
2096
- function bn(e) {
2129
+ function _n(e) {
2097
2130
  return e >= 9 ? 1 : e >= 7 ? 2 : e >= 5 ? 5 : e >= 3 ? 10 : 20;
2098
2131
  }
2099
- function bt(e) {
2132
+ function yt(e) {
2100
2133
  return `tray_${String(e).padStart(3, "0")}.jpg`;
2101
2134
  }
2102
- function _n(e, n, t, r, o = "Tray Images", i = bt) {
2135
+ function Nn(e, n, t, r, o = "Tray Images", i = yt) {
2103
2136
  const s = (t ?? "").replace(/\/$/, ""), a = (r ?? "").replace(/\/$/, "");
2104
2137
  return n.map((l, u) => {
2105
2138
  const c = l.filename ?? i(u), d = l.photoSet ?? o;
@@ -2116,97 +2149,97 @@ function _n(e, n, t, r, o = "Tray Images", i = bt) {
2116
2149
  };
2117
2150
  });
2118
2151
  }
2119
- function pr(e, n, t = yt) {
2152
+ function pr(e, n, t = bt) {
2120
2153
  const r = n / 5;
2121
2154
  return Math.max(1, Math.round(e * t * r));
2122
2155
  }
2123
- const Re = 5, Qe = 1.12, Nn = 0.05, vn = 40;
2124
- function En({
2156
+ const Re = 5, Qe = 1.12, vn = 0.05, En = 40;
2157
+ function An({
2125
2158
  photos: e = [],
2126
2159
  holeId: n = "",
2127
2160
  initialZoom: t = 5,
2128
2161
  transform: r,
2129
2162
  onTransformChange: o
2130
2163
  }) {
2131
- const [i, s] = K({ scale: 1, tx: 0, ty: 0 }), a = r ?? i, l = _e(a);
2164
+ const [i, s] = K({ scale: 1, tx: 0, ty: 0 }), a = r ?? i, l = ye(a);
2132
2165
  l.current = a;
2133
- const u = Oe(
2134
- (p) => {
2135
- const I = typeof p == "function" ? p(l.current) : p;
2136
- o ? o(I) : s(I);
2166
+ const u = Pe(
2167
+ (h) => {
2168
+ const P = typeof h == "function" ? h(l.current) : h;
2169
+ o ? o(P) : s(P);
2137
2170
  },
2138
2171
  [o]
2139
- ), [c, d] = K(!1), m = _e(null), f = _e(null), y = ee(() => hn(e), [e]), h = ee(() => gn(y), [y]), b = ee(() => {
2140
- const p = /* @__PURE__ */ new Set();
2141
- for (const I of e) {
2142
- const _ = I.photo_set != null && I.photo_set !== "" ? String(I.photo_set) : "default";
2143
- p.add(_);
2172
+ ), [c, d] = K(!1), m = ye(null), f = ye(null), b = ee(() => gn(e), [e]), p = ee(() => bn(b), [b]), v = ee(() => {
2173
+ const h = /* @__PURE__ */ new Set();
2174
+ for (const P of e) {
2175
+ const A = P.photo_set != null && P.photo_set !== "" ? String(P.photo_set) : "default";
2176
+ h.add(A);
2144
2177
  }
2145
- return [...p];
2146
- }, [e]), { minDepth: g, maxDepth: A } = ee(() => {
2147
- if (!y.length) return { minDepth: 0, maxDepth: 0 };
2148
- const p = y.map((I) => I.to_depth ?? I.from_depth ?? 0);
2178
+ return [...h];
2179
+ }, [e]), { minDepth: g, maxDepth: L } = ee(() => {
2180
+ if (!b.length) return { minDepth: 0, maxDepth: 0 };
2181
+ const h = b.map((P) => P.to_depth ?? P.from_depth ?? 0);
2149
2182
  return {
2150
- minDepth: y[0].from_depth ?? 0,
2151
- maxDepth: Math.max(...p)
2183
+ minDepth: b[0].from_depth ?? 0,
2184
+ maxDepth: Math.max(...h)
2152
2185
  };
2153
- }, [y]), P = yt * Re / 5, U = ee(
2154
- () => Math.max(1, Math.round((A - g) * P)),
2155
- [g, A, P]
2156
- ), $ = ee(() => {
2157
- const p = bn(Re);
2158
- return yn(g, A, p);
2159
- }, [g, A]), k = 540 * Re / 5, O = ee(
2186
+ }, [b]), C = bt * Re / 5, j = ee(
2187
+ () => Math.max(1, Math.round((L - g) * C)),
2188
+ [g, L, C]
2189
+ ), H = ee(() => {
2190
+ const h = _n(Re);
2191
+ return yn(g, L, h);
2192
+ }, [g, L]), $ = 540 * Re / 5, D = ee(
2160
2193
  () => Math.max(1, Math.min(10, Math.round(t * a.scale))),
2161
2194
  [t, a.scale]
2162
- ), D = Oe((p) => {
2163
- p.preventDefault();
2164
- const I = p.deltaY < 0 ? Qe : 1 / Qe, _ = f.current.getBoundingClientRect(), R = p.clientX - _.left, x = p.clientY - _.top;
2165
- u((T) => {
2166
- const v = Math.max(Nn, Math.min(vn, T.scale * I)), z = v / T.scale;
2195
+ ), R = Pe((h) => {
2196
+ h.preventDefault();
2197
+ const P = h.deltaY < 0 ? Qe : 1 / Qe, A = f.current.getBoundingClientRect(), z = h.clientX - A.left, E = h.clientY - A.top;
2198
+ u((_) => {
2199
+ const y = Math.max(vn, Math.min(En, _.scale * P)), I = y / _.scale;
2167
2200
  return {
2168
- scale: v,
2169
- tx: R - (R - T.tx) * z,
2170
- ty: x - (x - T.ty) * z
2201
+ scale: y,
2202
+ tx: z - (z - _.tx) * I,
2203
+ ty: E - (E - _.ty) * I
2171
2204
  };
2172
2205
  });
2173
2206
  }, [u]);
2174
- ne(() => {
2175
- const p = f.current;
2176
- if (p)
2177
- return p.addEventListener("wheel", D, { passive: !1 }), () => p.removeEventListener("wheel", D);
2178
- }, [D]);
2179
- const S = Oe((p) => {
2180
- p.button === 0 && (p.preventDefault(), m.current = {
2181
- x: p.clientX,
2182
- y: p.clientY,
2207
+ te(() => {
2208
+ const h = f.current;
2209
+ if (h)
2210
+ return h.addEventListener("wheel", R, { passive: !1 }), () => h.removeEventListener("wheel", R);
2211
+ }, [R]);
2212
+ const G = Pe((h) => {
2213
+ h.button === 0 && (h.preventDefault(), m.current = {
2214
+ x: h.clientX,
2215
+ y: h.clientY,
2183
2216
  tx: l.current.tx,
2184
2217
  ty: l.current.ty
2185
2218
  }, d(!0));
2186
2219
  }, []);
2187
- return ne(() => {
2188
- const p = (_) => {
2220
+ return te(() => {
2221
+ const h = (A) => {
2189
2222
  if (!m.current) return;
2190
- const { tx: R, ty: x, x: T, y: v } = m.current;
2191
- u((z) => ({
2192
- ...z,
2193
- tx: R + (_.clientX - T),
2194
- ty: x + (_.clientY - v)
2223
+ const { tx: z, ty: E, x: _, y } = m.current;
2224
+ u((I) => ({
2225
+ ...I,
2226
+ tx: z + (A.clientX - _),
2227
+ ty: E + (A.clientY - y)
2195
2228
  }));
2196
- }, I = () => {
2229
+ }, P = () => {
2197
2230
  m.current = null, d(!1);
2198
2231
  };
2199
- return window.addEventListener("mousemove", p), window.addEventListener("mouseup", I), () => {
2200
- window.removeEventListener("mousemove", p), window.removeEventListener("mouseup", I);
2232
+ return window.addEventListener("mousemove", h), window.addEventListener("mouseup", P), () => {
2233
+ window.removeEventListener("mousemove", h), window.removeEventListener("mouseup", P);
2201
2234
  };
2202
- }, [u]), /* @__PURE__ */ H("div", { className: "core-photo-table", children: [
2203
- /* @__PURE__ */ H("div", { className: "core-photo-controls", children: [
2204
- n && /* @__PURE__ */ E("span", { className: "core-photo-hole-id", children: n }),
2205
- /* @__PURE__ */ H("span", { className: "core-photo-zoom-label", children: [
2235
+ }, [u]), /* @__PURE__ */ w("div", { className: "core-photo-table", children: [
2236
+ /* @__PURE__ */ w("div", { className: "core-photo-controls", children: [
2237
+ n && /* @__PURE__ */ S("span", { className: "core-photo-hole-id", children: n }),
2238
+ /* @__PURE__ */ w("span", { className: "core-photo-zoom-label", children: [
2206
2239
  Math.round(a.scale * 100),
2207
2240
  "%"
2208
2241
  ] }),
2209
- /* @__PURE__ */ E(
2242
+ /* @__PURE__ */ S(
2210
2243
  "button",
2211
2244
  {
2212
2245
  className: "core-photo-zoom-btn",
@@ -2217,92 +2250,92 @@ function En({
2217
2250
  }
2218
2251
  )
2219
2252
  ] }),
2220
- e.length > 0 && /* @__PURE__ */ H("div", { className: "core-photo-col-headers", children: [
2221
- /* @__PURE__ */ E("div", { className: "core-photo-ruler-spacer" }),
2222
- b.map((p) => /* @__PURE__ */ E(
2253
+ e.length > 0 && /* @__PURE__ */ w("div", { className: "core-photo-col-headers", children: [
2254
+ /* @__PURE__ */ S("div", { className: "core-photo-ruler-spacer" }),
2255
+ v.map((h) => /* @__PURE__ */ S(
2223
2256
  "div",
2224
2257
  {
2225
2258
  className: "core-photo-set-header",
2226
- style: { width: k },
2227
- children: p
2259
+ style: { width: $ },
2260
+ children: h
2228
2261
  },
2229
- p
2262
+ h
2230
2263
  ))
2231
2264
  ] }),
2232
- e.length === 0 ? /* @__PURE__ */ E("div", { className: "core-photo-empty", children: "No photos to display." }) : /* @__PURE__ */ E(
2265
+ e.length === 0 ? /* @__PURE__ */ S("div", { className: "core-photo-empty", children: "No photos to display." }) : /* @__PURE__ */ S(
2233
2266
  "div",
2234
2267
  {
2235
2268
  className: `core-photo-scroll${c ? " is-dragging" : ""}`,
2236
2269
  ref: f,
2237
- onMouseDown: S,
2238
- children: /* @__PURE__ */ H(
2270
+ onMouseDown: G,
2271
+ children: /* @__PURE__ */ w(
2239
2272
  "div",
2240
2273
  {
2241
2274
  className: "core-photo-inner",
2242
2275
  style: {
2243
- height: U,
2276
+ height: j,
2244
2277
  transform: `translate(${a.tx}px, ${a.ty}px) scale(${a.scale})`,
2245
2278
  transformOrigin: "0 0"
2246
2279
  },
2247
2280
  children: [
2248
- /* @__PURE__ */ E(
2281
+ /* @__PURE__ */ S(
2249
2282
  "div",
2250
2283
  {
2251
2284
  className: "core-photo-depth-ruler",
2252
- style: { height: U },
2253
- children: $.map(({ depth: p, label: I }) => /* @__PURE__ */ E(
2285
+ style: { height: j },
2286
+ children: H.map(({ depth: h, label: P }) => /* @__PURE__ */ S(
2254
2287
  "div",
2255
2288
  {
2256
2289
  className: "core-photo-depth-marker",
2257
2290
  style: {
2258
- top: Math.round((p - g) * P)
2291
+ top: Math.round((h - g) * C)
2259
2292
  },
2260
- children: I
2293
+ children: P
2261
2294
  },
2262
- p
2295
+ h
2263
2296
  ))
2264
2297
  }
2265
2298
  ),
2266
- b.map((p) => /* @__PURE__ */ E(
2299
+ v.map((h) => /* @__PURE__ */ S(
2267
2300
  "div",
2268
2301
  {
2269
2302
  className: "core-photo-col-body",
2270
- style: { height: U, width: k },
2271
- children: h[p].map((I) => {
2272
- const _ = I.from_depth ?? 0, R = I.to_depth ?? _, x = Math.round(
2273
- (_ - g) * P
2274
- ), T = Math.max(
2303
+ style: { height: j, width: $ },
2304
+ children: p[h].map((P) => {
2305
+ const A = P.from_depth ?? 0, z = P.to_depth ?? A, E = Math.round(
2306
+ (A - g) * C
2307
+ ), _ = Math.max(
2275
2308
  2,
2276
- Math.round((R - _) * P)
2277
- ), v = pn(I, O);
2278
- return /* @__PURE__ */ H(
2309
+ Math.round((z - A) * C)
2310
+ ), y = pn(P, D);
2311
+ return /* @__PURE__ */ w(
2279
2312
  "div",
2280
2313
  {
2281
2314
  className: "core-photo-item",
2282
- style: { top: x, height: T, width: k },
2283
- title: `${_}–${R} m`,
2315
+ style: { top: E, height: _, width: $ },
2316
+ title: `${A}–${z} m`,
2284
2317
  children: [
2285
- v ? /* @__PURE__ */ E(
2318
+ y ? /* @__PURE__ */ S(
2286
2319
  "img",
2287
2320
  {
2288
- src: v,
2289
- alt: `Core ${_}–${R} m`,
2321
+ src: y,
2322
+ alt: `Core ${A}–${z} m`,
2290
2323
  loading: "lazy"
2291
2324
  }
2292
- ) : /* @__PURE__ */ E("div", { className: "core-photo-no-image" }),
2293
- T >= 18 && /* @__PURE__ */ H("span", { className: "core-photo-item-label", children: [
2294
- _,
2325
+ ) : /* @__PURE__ */ S("div", { className: "core-photo-no-image" }),
2326
+ _ >= 18 && /* @__PURE__ */ w("span", { className: "core-photo-item-label", children: [
2327
+ A,
2295
2328
  "–",
2296
- R,
2329
+ z,
2297
2330
  " m"
2298
2331
  ] })
2299
2332
  ]
2300
2333
  },
2301
- `${I.hole_id ?? ""}-${_}-${R}-${p}`
2334
+ `${P.hole_id ?? ""}-${A}-${z}-${h}`
2302
2335
  );
2303
2336
  })
2304
2337
  },
2305
- p
2338
+ h
2306
2339
  ))
2307
2340
  ]
2308
2341
  }
@@ -2311,23 +2344,23 @@ function En({
2311
2344
  )
2312
2345
  ] });
2313
2346
  }
2314
- function hr({
2347
+ function gr({
2315
2348
  holeId: e = "",
2316
2349
  trays: n = [],
2317
2350
  thumbBaseUrl: t = "",
2318
2351
  fullBaseUrl: r = "",
2319
2352
  photoSet: o = "Tray Images",
2320
- getFilename: i = bt,
2353
+ getFilename: i = yt,
2321
2354
  initialZoom: s = 5,
2322
2355
  transform: a,
2323
2356
  onTransformChange: l
2324
2357
  }) {
2325
2358
  const u = ee(
2326
- () => _n(e, n, t, r, o, i),
2359
+ () => Nn(e, n, t, r, o, i),
2327
2360
  [e, n, t, r, o, i]
2328
2361
  );
2329
- return /* @__PURE__ */ E(
2330
- En,
2362
+ return /* @__PURE__ */ S(
2363
+ An,
2331
2364
  {
2332
2365
  photos: u,
2333
2366
  holeId: e,
@@ -2337,7 +2370,7 @@ function hr({
2337
2370
  }
2338
2371
  );
2339
2372
  }
2340
- function gr(e) {
2373
+ function br(e) {
2341
2374
  const n = typeof e == "string" ? JSON.parse(e) : e;
2342
2375
  if (n.schema_version !== "1.0")
2343
2376
  throw new Error(
@@ -2365,7 +2398,7 @@ function gr(e) {
2365
2398
  blocks: t
2366
2399
  };
2367
2400
  }
2368
- function An(e) {
2401
+ function Sn(e) {
2369
2402
  const n = new Q.BufferGeometry(), t = new Float32Array(e.vertices.length * 3);
2370
2403
  e.vertices.forEach(([o, i, s], a) => {
2371
2404
  t[a * 3] = o, t[a * 3 + 1] = i, t[a * 3 + 2] = s;
@@ -2378,8 +2411,8 @@ function An(e) {
2378
2411
  function yr(e, n, t = {}) {
2379
2412
  const { defaultOpacity: r = 1 } = t, o = new Q.Group();
2380
2413
  return n.blocks.forEach((i) => {
2381
- var h, b;
2382
- const s = An(i), a = ((h = i.material) == null ? void 0 : h.color) ?? "#888888", l = ((b = i.material) == null ? void 0 : b.opacity) ?? r, u = l < 1, c = new Q.MeshStandardMaterial({
2414
+ var p, v;
2415
+ const s = Sn(i), a = ((p = i.material) == null ? void 0 : p.color) ?? "#888888", l = ((v = i.material) == null ? void 0 : v.opacity) ?? r, u = l < 1, c = new Q.MeshStandardMaterial({
2383
2416
  color: new Q.Color(a),
2384
2417
  opacity: l,
2385
2418
  transparent: u,
@@ -2390,219 +2423,224 @@ function yr(e, n, t = {}) {
2390
2423
  id: i.id,
2391
2424
  attributes: i.attributes
2392
2425
  };
2393
- const m = new Q.EdgesGeometry(s, 15), f = new Q.LineBasicMaterial({ color: "#ffffbb", linewidth: 1 }), y = new Q.LineSegments(m, f);
2394
- y.visible = !1, d.add(y), o.add(d);
2426
+ const m = new Q.EdgesGeometry(s, 15), f = new Q.LineBasicMaterial({ color: "#ffffbb", linewidth: 1 }), b = new Q.LineSegments(m, f);
2427
+ b.visible = !1, d.add(b), o.add(d);
2395
2428
  }), e.add(o), o;
2396
2429
  }
2397
2430
  export {
2398
- Nr as ALPHA,
2399
- vr as ASSAY_COLOR_PALETTE_10,
2400
- Lt as ASSAY_NON_VALUE_FIELDS,
2431
+ vr as ALPHA,
2432
+ Er as ASSAY_COLOR_PALETTE_10,
2433
+ Mt as ASSAY_NON_VALUE_FIELDS,
2401
2434
  Y as AZIMUTH,
2402
- Er as BASELODE_COLORWAY,
2403
- Ar as BASELODE_DARK,
2404
- Sr as BASELODE_DARK_TEMPLATE,
2405
- Tr as BASELODE_DARK_TEMPLATE_NAME,
2435
+ Ar as BASELODE_COLORWAY,
2436
+ Sr as BASELODE_DARK,
2437
+ Tr as BASELODE_DARK_TEMPLATE,
2438
+ Lr as BASELODE_DARK_TEMPLATE_NAME,
2406
2439
  Ir as BASELODE_DATA_MODEL_DRILL_ASSAY,
2407
2440
  Cr as BASELODE_DATA_MODEL_DRILL_COLLAR,
2408
2441
  Et as BASELODE_DATA_MODEL_DRILL_GEOLOGY,
2409
- Lr as BASELODE_DATA_MODEL_DRILL_SURVEY,
2410
- Mr as BASELODE_DATA_MODEL_GEOPHYSICS,
2411
- Pr as BASELODE_DATA_MODEL_STRUCTURAL_POINT,
2412
- Or as BASELODE_DATA_MODEL_SURFACE_SAMPLE,
2413
- xr as BASELODE_LIGHT,
2414
- Dr as BASELODE_LIGHT_TEMPLATE,
2415
- Rr as BASELODE_LIGHT_TEMPLATE_NAME,
2416
- ke as BASELODE_TEMPLATE,
2417
- zr as BASELODE_TEMPLATE_NAME,
2418
- yt as BASE_PIXELS_PER_METRE,
2442
+ Mr as BASELODE_DATA_MODEL_DRILL_SURVEY,
2443
+ Pr as BASELODE_DATA_MODEL_GEOPHYSICS,
2444
+ Or as BASELODE_DATA_MODEL_STRUCTURAL_POINT,
2445
+ xr as BASELODE_DATA_MODEL_SURFACE_SAMPLE,
2446
+ Dr as BASELODE_LIGHT,
2447
+ Rr as BASELODE_LIGHT_TEMPLATE,
2448
+ zr as BASELODE_LIGHT_TEMPLATE_NAME,
2449
+ $e as BASELODE_TEMPLATE,
2450
+ Fr as BASELODE_TEMPLATE_NAME,
2451
+ bt as BASE_PIXELS_PER_METRE,
2419
2452
  $r as BETA,
2420
2453
  kr as BUILTIN_COLOUR_MAPS,
2421
- mr as Baselode3DControls,
2422
- Fr as Baselode3DScene,
2423
- fr as BlockModelWidget,
2424
- wr as CHART_OPTIONS,
2454
+ fr as Baselode3DControls,
2455
+ wr as Baselode3DScene,
2456
+ hr as BlockModelWidget,
2457
+ Ur as CHART_OPTIONS,
2425
2458
  Hr as COLLAR_ID,
2426
2459
  Gr as COMMENTS,
2427
- Ur as COMMENT_COLUMN_NAMES,
2428
- Br as COMMODITY_COLOURS,
2429
- Vr as CRS,
2430
- En as CorePhotoTable,
2431
- hr as CorePhotoViewer,
2432
- jr as DATASOURCE,
2433
- Yr as DATASOURCE_HOLE_ID,
2434
- Wr as DATASOURCE_SAMPLE_ID,
2435
- qr as DATASOURCE_SURFACE_SAMPLE_ID,
2436
- Xr as DATE_END,
2437
- Kr as DATE_START,
2438
- Zr as DEFAULT_COLUMN_MAP,
2439
- fn as DEFAULT_LOD_BREAKPOINTS,
2440
- j as DEPTH,
2460
+ Br as COMMENT_COLUMN_NAMES,
2461
+ Vr as COMMODITY_COLOURS,
2462
+ jr as CRS,
2463
+ An as CorePhotoTable,
2464
+ gr as CorePhotoViewer,
2465
+ Yr as DATASOURCE,
2466
+ Wr as DATASOURCE_HOLE_ID,
2467
+ qr as DATASOURCE_SAMPLE_ID,
2468
+ Xr as DATASOURCE_SURFACE_SAMPLE_ID,
2469
+ Kr as DATE_END,
2470
+ Zr as DATE_START,
2471
+ Jr as DEFAULT_ATTRIBUTE_COLUMN,
2472
+ Qr as DEFAULT_COLUMN_MAP,
2473
+ hn as DEFAULT_LOD_BREAKPOINTS,
2474
+ eo as DEFAULT_UNIT_COLUMN,
2475
+ V as DEPTH,
2441
2476
  W as DIP,
2442
- Ue as DISPLAY_CATEGORICAL,
2477
+ Ge as DISPLAY_CATEGORICAL,
2443
2478
  ze as DISPLAY_COMMENT,
2444
- Jr as DISPLAY_HIDDEN,
2479
+ to as DISPLAY_HIDDEN,
2445
2480
  At as DISPLAY_NUMERIC,
2446
2481
  tt as DISPLAY_TADPOLE,
2447
- he as EASTING,
2448
- Ae as ELEVATION,
2449
- Qr as ERROR_COLOR,
2450
- eo as EXTRA,
2451
- to as FALLBACK_COLOUR,
2452
- no as FOV_MAX_DEG,
2453
- ro as FOV_MIN_DEG,
2454
- L as FROM,
2482
+ pe as EASTING,
2483
+ Ee as ELEVATION,
2484
+ no as ERROR_COLOR,
2485
+ ro as EXTRA,
2486
+ oo as FALLBACK_COLOUR,
2487
+ so as FOV_MAX_DEG,
2488
+ io as FOV_MIN_DEG,
2489
+ M as FROM,
2455
2490
  le as GEOLOGY_CODE,
2456
2491
  ce as GEOLOGY_DESCRIPTION,
2457
- oo as GEOPHYSICS_NULL,
2492
+ ao as GEOPHYSICS_NULL,
2458
2493
  et as GEOPHYSICS_NULL_SENTINEL,
2459
- so as HIDDEN_COLUMNS,
2494
+ lo as HIDDEN_COLUMNS,
2460
2495
  N as HOLE_ID,
2461
- io as HOLE_TYPE,
2496
+ co as HOLE_TYPE,
2462
2497
  re as LATITUDE,
2463
- ao as LITHOLOGY_COLOURS,
2498
+ uo as LITHOLOGY_COLOURS,
2464
2499
  oe as LONGITUDE,
2465
- lo as MAX_DEPTH,
2500
+ mo as MAX_DEPTH,
2466
2501
  ve as MID,
2467
2502
  ge as NORTHING,
2468
- co as NUMERIC_LINE_COLOR,
2469
- uo as NUMERIC_MARKER_COLOR,
2503
+ fo as NUMERIC_LINE_COLOR,
2504
+ ho as NUMERIC_MARKER_COLOR,
2470
2505
  de as PROJECT_ID,
2471
- mo as REPORT_NUMBER,
2472
- fo as SAMPLE_ID,
2473
- po as STRIKE,
2474
- ho as STRIP_LOG_DEFAULT_COLOR,
2475
- go as STRIP_LOG_DEFAULT_LATERAL_OFFSET,
2476
- yo as STRIP_LOG_DEFAULT_PANEL_WIDTH,
2477
- bo as SURFACE_SAMPLE_ID,
2478
- _o as SURFACE_SAMPLE_TYPE,
2479
- No as SURVEY_TYPE,
2480
- M as TO,
2481
- sr as TracePlot,
2506
+ po as REPORT_NUMBER,
2507
+ go as SAMPLE_ID,
2508
+ bo as STRIKE,
2509
+ yo as STRIP_LOG_DEFAULT_COLOR,
2510
+ _o as STRIP_LOG_DEFAULT_LATERAL_OFFSET,
2511
+ No as STRIP_LOG_DEFAULT_PANEL_WIDTH,
2512
+ vo as SURFACE_SAMPLE_ID,
2513
+ Eo as SURFACE_SAMPLE_TYPE,
2514
+ Ao as SURVEY_TYPE,
2515
+ O as TO,
2516
+ ir as TracePlot,
2482
2517
  yr as addGradeBlocksToScene,
2483
- vo as addRasterOverlay,
2484
- Eo as alphaBetaToNormal,
2485
- dr as annotationsFromIntervals,
2486
- qn as assembleDataset,
2487
- wn as attachAssayPositions,
2518
+ So as addRasterOverlay,
2519
+ To as alphaBetaToNormal,
2520
+ mr as annotationsFromIntervals,
2521
+ Xn as assembleDataset,
2522
+ Un as attachAssayPositions,
2488
2523
  kn as balancedTangentialDesurvey,
2489
2524
  kt as buildAssayState,
2490
- Ao as buildCategoricalStripLogConfig,
2491
- nn as buildCommentsConfig,
2525
+ Lo as buildCategoricalStripLogConfig,
2526
+ rn as buildCommentsConfig,
2492
2527
  yn as buildDepthMarkers,
2493
- So as buildEqualRangeColorScale,
2528
+ Io as buildEqualRangeColorScale,
2494
2529
  It as buildIntervalPoints,
2495
2530
  St as buildPlotConfig,
2496
- or as buildStrikeDipSymbol,
2497
- To as buildStripLogGroup,
2498
- Io as buildStripLogLinePoints,
2499
- Co as buildStructuralDiscs,
2500
- rr as buildStructuralStripConfig,
2501
- tn as buildTadpoleConfig,
2502
- Fn as buildTraces,
2503
- _n as buildTrayPhotos,
2504
- Lo as buildViewSignature,
2505
- Mo as calculateBlockVolume,
2506
- Po as calculatePropertyStats,
2531
+ sr as buildStrikeDipSymbol,
2532
+ Co as buildStripLogGroup,
2533
+ Mo as buildStripLogLinePoints,
2534
+ Po as buildStructuralDiscs,
2535
+ or as buildStructuralStripConfig,
2536
+ nn as buildTadpoleConfig,
2537
+ wn as buildTraces,
2538
+ Nn as buildTrayPhotos,
2539
+ Oo as buildViewSignature,
2540
+ xo as calculateBlockVolume,
2541
+ Do as calculatePropertyStats,
2507
2542
  vt as classifyColumns,
2508
- Oo as clearRasterOverlays,
2509
- xo as clearStripLogs,
2510
- Wn as coerceNumeric,
2511
- Do as computeStructuralPositions,
2512
- Ro as createRasterOverlay,
2513
- zo as defaultChartType,
2514
- bt as defaultTrayFilename,
2543
+ Ro as clearRasterOverlays,
2544
+ zo as clearStripLogs,
2545
+ qn as coerceNumeric,
2546
+ Fo as computeStructuralPositions,
2547
+ $o as createRasterOverlay,
2548
+ ko as defaultChartType,
2549
+ yt as defaultTrayFilename,
2515
2550
  pr as depthIntervalToPixels,
2516
- bn as depthMarkerInterval,
2517
- Ie as deriveAssayProps,
2518
- zn as desurveyTraces,
2519
- $o as dipAzimuthToNormal,
2520
- ko as dolly,
2521
- Fo as emitViewChangeIfNeeded,
2522
- wo as filterBlocks,
2523
- Yn as filterByProject,
2524
- Ho as fitCameraToBounds,
2525
- Go as focusOnLastBounds,
2526
- tr as geophysicsToStripLogs,
2527
- Uo as getBlockStats,
2528
- Bo as getCategoryHexColor,
2551
+ _n as depthMarkerInterval,
2552
+ Te as deriveAssayProps,
2553
+ wo as derivePropertyMeta,
2554
+ Fn as desurveyTraces,
2555
+ Uo as dipAzimuthToNormal,
2556
+ Ho as dolly,
2557
+ Go as emitViewChangeIfNeeded,
2558
+ Bo as filterBlocks,
2559
+ Wn as filterByProject,
2560
+ Vo as fitCameraToBounds,
2561
+ jo as focusOnLastBounds,
2562
+ Tt as formatPropertyLabel,
2563
+ nr as geophysicsToStripLogs,
2564
+ Yo as getBlockStats,
2565
+ Wo as getCategoryHexColor,
2529
2566
  nt as getChartOptions,
2530
- Vo as getColorForValue,
2531
- jo as getColour,
2532
- Yo as getEqualRangeBinIndex,
2533
- Wo as getEqualRangeColor,
2534
- qo as getHoleVerticalExtent,
2535
- Xo as getRasterOverlay,
2536
- Ko as getViewState,
2537
- An as gradeBlockToThreeGeometry,
2538
- gn as groupPhotosBySet,
2539
- Yt as groupRowsByHole,
2540
- Tt as holeHasData,
2541
- Zo as interpolateTrace,
2542
- ur as intervalsAsTubes,
2543
- jn as joinAssaysToTraces,
2544
- Jo as listRasterOverlays,
2545
- Dn as loadAssayFile,
2567
+ qo as getColorForValue,
2568
+ Xo as getColour,
2569
+ Ko as getEqualRangeBinIndex,
2570
+ Zo as getEqualRangeColor,
2571
+ Jo as getHoleVerticalExtent,
2572
+ Qo as getRasterOverlay,
2573
+ es as getViewState,
2574
+ Sn as gradeBlockToThreeGeometry,
2575
+ bn as groupPhotosBySet,
2576
+ Wt as groupRowsByHole,
2577
+ Lt as holeHasData,
2578
+ ts as interpolateTrace,
2579
+ dr as intervalsAsTubes,
2580
+ Yn as joinAssaysToTraces,
2581
+ ns as listRasterOverlays,
2582
+ Rn as loadAssayFile,
2546
2583
  $t as loadAssayHole,
2547
- zt as loadAssayMetadata,
2548
- Bn as loadAssays,
2549
- Qo as loadBlockModelMetadata,
2584
+ Ft as loadAssayMetadata,
2585
+ Vn as loadAssays,
2586
+ rs as loadBlockModelMetadata,
2550
2587
  Gn as loadCollars,
2551
- Vn as loadGeology,
2552
- gr as loadGradeBlocksFromJson,
2553
- Un as loadSurveys,
2554
- Me as loadTable,
2555
- es as logDataInfo,
2556
- ts as logDataWarning,
2557
- ns as lookDown,
2588
+ jn as loadGeology,
2589
+ br as loadGradeBlocksFromJson,
2590
+ Bn as loadSurveys,
2591
+ Ce as loadTable,
2592
+ os as logDataInfo,
2593
+ ss as logDataWarning,
2594
+ is as lookDown,
2558
2595
  Ht as minimumCurvatureDesurvey,
2559
- rs as normalizeBlockRow,
2560
- os as normalizeBounds,
2561
- On as normalizeCsvRow,
2562
- Se as normalizeFieldName,
2563
- ss as normalizeStripLogOptions,
2564
- is as pan,
2565
- qt as parseAssayCsvTextToHoles,
2566
- xt as parseAssayHole,
2567
- Pn as parseAssayHoleIds,
2568
- Ot as parseAssayHoleIdsWithAssays,
2569
- Dt as parseAssaysCSV,
2570
- as as parseBlockModelCSV,
2596
+ as as normalizeBlockRow,
2597
+ ls as normalizeBounds,
2598
+ xn as normalizeCsvRow,
2599
+ Ae as normalizeFieldName,
2600
+ cs as normalizeStripLogOptions,
2601
+ us as pan,
2602
+ Xt as parseAssayCsvTextToHoles,
2603
+ Dt as parseAssayHole,
2604
+ On as parseAssayHoleIds,
2605
+ xt as parseAssayHoleIdsWithAssays,
2606
+ Rt as parseAssaysCSV,
2607
+ ds as parseBlockModelCSV,
2571
2608
  Hn as parseDrillholesCSV,
2572
- Xt as parseGeologyCsvText,
2573
- er as parseGeophysicsCSV,
2574
- nr as parseLasFile,
2575
- Wt as parseStructuralCSV,
2576
- Zn as parseStructuralIntervalsCSV,
2577
- Kn as parseStructuralPointsCSV,
2578
- Rn as parseSurveyCSV,
2579
- Jn as parseUnifiedDataset,
2580
- xn as pickFirstPresent,
2581
- ar as planView,
2582
- dn as projectTraceToSection,
2583
- ls as recenterCameraToOrigin,
2584
- cs as removeRasterOverlay,
2609
+ Kt as parseGeologyCsvText,
2610
+ tr as parseGeophysicsCSV,
2611
+ rr as parseLasFile,
2612
+ qt as parseStructuralCSV,
2613
+ Jn as parseStructuralIntervalsCSV,
2614
+ Zn as parseStructuralPointsCSV,
2615
+ zn as parseSurveyCSV,
2616
+ Qn as parseUnifiedDataset,
2617
+ Dn as pickFirstPresent,
2618
+ lr as planView,
2619
+ mn as projectTraceToSection,
2620
+ ms as recenterCameraToOrigin,
2621
+ fs as removeRasterOverlay,
2585
2622
  st as reorderHoleIds,
2586
- us as resolveColourMap,
2587
- lr as sectionView,
2588
- mn as sectionWindow,
2623
+ hs as resolveColourMap,
2624
+ ps as resolvePropertyLabelParts,
2625
+ cr as sectionView,
2626
+ fn as sectionWindow,
2589
2627
  pn as selectPhotoLodUrl,
2590
- ds as setControlMode,
2591
- ms as setFov,
2592
- fs as setRasterOverlayElevation,
2593
- ps as setRasterOverlayOpacity,
2594
- hs as setRasterOverlayVisibility,
2595
- gs as setStripLogs,
2596
- ys as setViewState,
2597
- Qn as significantIntercepts,
2598
- hn as sortPhotosByDepth,
2628
+ gs as setControlMode,
2629
+ bs as setFov,
2630
+ ys as setRasterOverlayElevation,
2631
+ _s as setRasterOverlayOpacity,
2632
+ Ns as setRasterOverlayVisibility,
2633
+ vs as setStripLogs,
2634
+ Es as setViewState,
2635
+ er as significantIntercepts,
2636
+ gn as sortPhotosByDepth,
2599
2637
  ie as standardizeColumns,
2600
- Mn as standardizeRowArray,
2638
+ Pn as standardizeRowArray,
2601
2639
  $n as tangentialDesurvey,
2602
- bs as toError,
2603
- cr as tracesAsSegments,
2604
- ir as useDrillholeTraceGrid,
2605
- Xn as validateStructuralPoints,
2606
- G as withDataErrorContext
2640
+ As as toError,
2641
+ ur as tracesAsSegments,
2642
+ ar as useDrillholeTraceGrid,
2643
+ Kn as validateStructuralPoints,
2644
+ U as withDataErrorContext
2607
2645
  };
2608
2646
  //# sourceMappingURL=baselode.js.map