baselode 0.1.17 → 0.1.19
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 +1530 -3660
- package/dist/baselode.js.map +1 -1
- package/dist/baselode3dScene-DbELmWnr.js +2252 -0
- package/dist/baselode3dScene-DbELmWnr.js.map +1 -0
- package/dist/tool-ui.js +521 -0
- package/dist/tool-ui.js.map +1 -0
- package/package.json +12 -7
- package/src/tool-ui/style.css +188 -0
package/dist/tool-ui.js
ADDED
|
@@ -0,0 +1,521 @@
|
|
|
1
|
+
import { z as t } from "zod";
|
|
2
|
+
import { jsxs as w, jsx as c } from "react/jsx-runtime";
|
|
3
|
+
import { useMemo as x, useState as J, useEffect as F, useRef as K } from "react";
|
|
4
|
+
import H from "plotly.js-dist-min";
|
|
5
|
+
import { r as ee, C as oe, c as te, i as R, k as q, an as W, o as le, l as ne, s as re, g as ie, Q as se, am as ae } from "./baselode3dScene-DbELmWnr.js";
|
|
6
|
+
const pe = t.union([t.string(), t.number(), t.boolean(), t.null()]), v = t.record(t.string(), t.unknown()), Q = t.tuple([t.number(), t.number()]), de = t.object({
|
|
7
|
+
id: t.string().optional(),
|
|
8
|
+
property: t.string().min(1),
|
|
9
|
+
label: t.string().optional(),
|
|
10
|
+
displayType: t.enum(["numeric", "categorical"]).default("numeric"),
|
|
11
|
+
chartType: t.enum(["bar", "markers", "line", "markers+line", "categorical"]).optional(),
|
|
12
|
+
colourMap: t.union([t.string(), t.record(t.string(), t.string())]).optional(),
|
|
13
|
+
propertyOptions: t.array(t.string().min(1)).optional(),
|
|
14
|
+
allowPropertySelection: t.boolean().optional(),
|
|
15
|
+
allowChartTypeSelection: t.boolean().optional(),
|
|
16
|
+
showLegend: t.boolean().optional()
|
|
17
|
+
}), ue = t.object({
|
|
18
|
+
id: t.string().min(1),
|
|
19
|
+
title: t.string().optional(),
|
|
20
|
+
subtitle: t.string().optional(),
|
|
21
|
+
hole: t.object({
|
|
22
|
+
id: t.string().min(1),
|
|
23
|
+
points: t.array(v),
|
|
24
|
+
metadata: t.record(t.string(), pe).optional()
|
|
25
|
+
}),
|
|
26
|
+
tracks: t.array(de).min(1),
|
|
27
|
+
height: t.number().positive().max(1200).optional(),
|
|
28
|
+
template: t.enum(["baselode", "baselode-dark", "plotly-default"]).optional(),
|
|
29
|
+
showModeBar: t.boolean().optional(),
|
|
30
|
+
propertyOptions: t.array(t.string().min(1)).optional(),
|
|
31
|
+
allowPropertySelection: t.boolean().optional(),
|
|
32
|
+
allowChartTypeSelection: t.boolean().optional(),
|
|
33
|
+
showLegend: t.boolean().optional(),
|
|
34
|
+
depthRange: Q.optional(),
|
|
35
|
+
defaultDepthRange: Q.optional()
|
|
36
|
+
});
|
|
37
|
+
function Le(o) {
|
|
38
|
+
const e = ue.safeParse(o);
|
|
39
|
+
return e.success ? e.data : null;
|
|
40
|
+
}
|
|
41
|
+
const ye = t.object({
|
|
42
|
+
id: t.string().min(1),
|
|
43
|
+
title: t.string().optional(),
|
|
44
|
+
subtitle: t.string().optional(),
|
|
45
|
+
height: t.number().positive().max(1400).optional(),
|
|
46
|
+
background: t.enum(["white", "black"]).optional(),
|
|
47
|
+
controlMode: t.enum(["orbit", "fly"]).optional(),
|
|
48
|
+
drillholes: t.object({
|
|
49
|
+
holes: t.array(v),
|
|
50
|
+
options: v.optional()
|
|
51
|
+
}).optional(),
|
|
52
|
+
stripLogs: t.array(v).optional(),
|
|
53
|
+
structuralDiscs: t.object({
|
|
54
|
+
structures: t.array(v),
|
|
55
|
+
options: v.optional(),
|
|
56
|
+
visible: t.boolean().optional()
|
|
57
|
+
}).optional(),
|
|
58
|
+
blocks: t.object({
|
|
59
|
+
data: t.array(v),
|
|
60
|
+
selectedProperty: t.string().min(1),
|
|
61
|
+
stats: v.optional(),
|
|
62
|
+
options: v.optional()
|
|
63
|
+
}).optional(),
|
|
64
|
+
rasterOverlays: t.array(t.object({
|
|
65
|
+
id: t.string().optional(),
|
|
66
|
+
name: t.string().optional(),
|
|
67
|
+
source: t.object({
|
|
68
|
+
type: t.literal("url"),
|
|
69
|
+
url: t.string().min(1)
|
|
70
|
+
}),
|
|
71
|
+
bounds: v,
|
|
72
|
+
elevation: t.number().optional(),
|
|
73
|
+
opacity: t.number().optional(),
|
|
74
|
+
visible: t.boolean().optional(),
|
|
75
|
+
renderOrder: t.number().optional()
|
|
76
|
+
})).optional(),
|
|
77
|
+
camera: t.object({
|
|
78
|
+
viewState: v.optional(),
|
|
79
|
+
fitToBounds: t.boolean().optional(),
|
|
80
|
+
focusPadding: t.number().positive().optional()
|
|
81
|
+
}).optional()
|
|
82
|
+
});
|
|
83
|
+
function Ae(o) {
|
|
84
|
+
const e = ye.safeParse(o);
|
|
85
|
+
return e.success ? e.data : null;
|
|
86
|
+
}
|
|
87
|
+
function ce(o) {
|
|
88
|
+
return {
|
|
89
|
+
"--baselode-tool-bg": o.bg,
|
|
90
|
+
"--baselode-tool-panel": o.panel,
|
|
91
|
+
"--baselode-tool-ink": o.ink,
|
|
92
|
+
"--baselode-tool-ink-soft": o.ink_soft,
|
|
93
|
+
"--baselode-tool-grid": o.grid,
|
|
94
|
+
"--baselode-tool-line": o.line,
|
|
95
|
+
"--baselode-tool-accent": o.accent,
|
|
96
|
+
"--baselode-tool-muted-1": o.muted_1,
|
|
97
|
+
"--baselode-tool-muted-2": o.muted_2,
|
|
98
|
+
"--baselode-tool-muted-3": o.muted_3,
|
|
99
|
+
"--baselode-tool-primary": o.primary || o.accent
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function C(o) {
|
|
103
|
+
return o === "baselode-dark" || o === "black" ? "baselode-dark" : "baselode";
|
|
104
|
+
}
|
|
105
|
+
function X(o) {
|
|
106
|
+
return ce(
|
|
107
|
+
C(o) === "baselode-dark" ? ee : oe
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
function be(o) {
|
|
111
|
+
return o === "baselode-dark" ? re : o === "plotly-default" ? null : ie;
|
|
112
|
+
}
|
|
113
|
+
function G(o) {
|
|
114
|
+
if (!Array.isArray(o) || o.length !== 2) return null;
|
|
115
|
+
const e = Number(o[0]), n = Number(o[1]);
|
|
116
|
+
return !Number.isFinite(e) || !Number.isFinite(n) || e === n ? null : e < n ? [e, n] : [n, e];
|
|
117
|
+
}
|
|
118
|
+
function me(o) {
|
|
119
|
+
if (o)
|
|
120
|
+
return [o[1], o[0]];
|
|
121
|
+
}
|
|
122
|
+
function fe(o) {
|
|
123
|
+
if (!o || typeof o != "object") return null;
|
|
124
|
+
const e = o["yaxis.range"];
|
|
125
|
+
if (Array.isArray(e) && e.length === 2)
|
|
126
|
+
return G(e);
|
|
127
|
+
const n = o["yaxis.range[0]"], i = o["yaxis.range[1]"];
|
|
128
|
+
return n !== void 0 && i !== void 0 ? G([n, i]) : null;
|
|
129
|
+
}
|
|
130
|
+
function Z(o, e) {
|
|
131
|
+
return !!(o && o !== e);
|
|
132
|
+
}
|
|
133
|
+
function k(o, e) {
|
|
134
|
+
const n = [...o.numericCols, ...o.categoricalCols];
|
|
135
|
+
if (!(e != null && e.length)) return n;
|
|
136
|
+
const i = new Set(n);
|
|
137
|
+
return e.filter((b) => i.has(b));
|
|
138
|
+
}
|
|
139
|
+
function Y(o, {
|
|
140
|
+
trackIndex: e = 0,
|
|
141
|
+
selectableProperties: n,
|
|
142
|
+
classified: i,
|
|
143
|
+
allowPropertySelection: b,
|
|
144
|
+
allowChartTypeSelection: B,
|
|
145
|
+
showLegend: p
|
|
146
|
+
}) {
|
|
147
|
+
const S = k(i, o.propertyOptions ?? n), d = S.includes(o.property) ? o.property : S[0] ?? o.property, m = i.byType[d] === R ? R : "numeric", a = o.chartType === "categorical" || o.displayType === R ? R : m, g = q(a).some((P) => P.value === o.chartType) ? o.chartType : W(a);
|
|
148
|
+
return {
|
|
149
|
+
...o,
|
|
150
|
+
id: o.id || `${d}-${e + 1}`,
|
|
151
|
+
property: d,
|
|
152
|
+
label: Z(o.label, o.property) ? o.label : void 0,
|
|
153
|
+
displayType: a,
|
|
154
|
+
chartType: g,
|
|
155
|
+
propertyOptions: S,
|
|
156
|
+
allowPropertySelection: o.allowPropertySelection ?? b ?? !1,
|
|
157
|
+
allowChartTypeSelection: o.allowChartTypeSelection ?? B ?? !1,
|
|
158
|
+
showLegend: o.showLegend ?? p ?? a === R
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
function ge(o) {
|
|
162
|
+
return !Array.isArray(o) || !o.length ? [] : o.map((e) => {
|
|
163
|
+
var b;
|
|
164
|
+
const n = (b = e == null ? void 0 : e.marker) == null ? void 0 : b.color, i = e == null ? void 0 : e.name;
|
|
165
|
+
return !i || typeof n != "string" ? null : { label: i, color: n };
|
|
166
|
+
}).filter(Boolean);
|
|
167
|
+
}
|
|
168
|
+
function he(o, e) {
|
|
169
|
+
return e ? {
|
|
170
|
+
...o,
|
|
171
|
+
yaxis: {
|
|
172
|
+
...o.yaxis || {},
|
|
173
|
+
autorange: !1,
|
|
174
|
+
range: me(e)
|
|
175
|
+
}
|
|
176
|
+
} : o;
|
|
177
|
+
}
|
|
178
|
+
function Se({
|
|
179
|
+
hole: o,
|
|
180
|
+
track: e,
|
|
181
|
+
height: n,
|
|
182
|
+
template: i,
|
|
183
|
+
showModeBar: b,
|
|
184
|
+
depthRange: B,
|
|
185
|
+
onTrackChange: p,
|
|
186
|
+
onIntervalClick: S,
|
|
187
|
+
onDepthRangeChange: d
|
|
188
|
+
}) {
|
|
189
|
+
const m = K(null), a = e.displayType === R || e.chartType === "categorical", u = x(
|
|
190
|
+
() => le(o, e.property, a),
|
|
191
|
+
[o, a, e.property]
|
|
192
|
+
), g = x(() => {
|
|
193
|
+
const l = ne({
|
|
194
|
+
points: u,
|
|
195
|
+
isCategorical: a,
|
|
196
|
+
property: e.label || e.property,
|
|
197
|
+
chartType: e.chartType || (a ? "categorical" : "markers+line"),
|
|
198
|
+
colourMap: e.colourMap,
|
|
199
|
+
template: be(i)
|
|
200
|
+
});
|
|
201
|
+
return {
|
|
202
|
+
data: l.data,
|
|
203
|
+
layout: he(l.layout, B)
|
|
204
|
+
};
|
|
205
|
+
}, [B, a, u, i, e.chartType, e.colourMap, e.label, e.property]), P = x(
|
|
206
|
+
() => e.showLegend && a ? ge(g.data) : [],
|
|
207
|
+
[a, g.data, e.showLegend]
|
|
208
|
+
), N = x(
|
|
209
|
+
() => q(e.displayType),
|
|
210
|
+
[e.displayType]
|
|
211
|
+
);
|
|
212
|
+
return F(() => {
|
|
213
|
+
var r, j, _, f;
|
|
214
|
+
const l = m.current;
|
|
215
|
+
if (!l) return;
|
|
216
|
+
if (!g.data.length) {
|
|
217
|
+
l.replaceChildren(document.createTextNode(`No data for ${e.property}`));
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const I = (L) => {
|
|
221
|
+
var z, O;
|
|
222
|
+
const h = (z = L == null ? void 0 : L.points) == null ? void 0 : z[0];
|
|
223
|
+
if (!h || !S) return;
|
|
224
|
+
const A = Array.isArray(h.customdata) ? h.customdata : [];
|
|
225
|
+
S({
|
|
226
|
+
trackId: e.id || e.property,
|
|
227
|
+
property: e.property,
|
|
228
|
+
value: a ? (O = h.data) == null ? void 0 : O.name : h.x,
|
|
229
|
+
from: Number(A[0]),
|
|
230
|
+
to: Number(A[1]),
|
|
231
|
+
pointIndex: h.pointIndex
|
|
232
|
+
});
|
|
233
|
+
}, E = (L) => {
|
|
234
|
+
const h = fe(L);
|
|
235
|
+
h && d && d({
|
|
236
|
+
trackId: e.id || e.property,
|
|
237
|
+
depthRange: h
|
|
238
|
+
});
|
|
239
|
+
};
|
|
240
|
+
return (r = l.removeAllListeners) == null || r.call(l, "plotly_click"), (j = l.removeAllListeners) == null || j.call(l, "plotly_relayout"), H.react(
|
|
241
|
+
l,
|
|
242
|
+
g.data,
|
|
243
|
+
{
|
|
244
|
+
...g.layout,
|
|
245
|
+
height: n,
|
|
246
|
+
title: void 0,
|
|
247
|
+
margin: { ...g.layout.margin, t: 12 }
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
displayModeBar: b,
|
|
251
|
+
responsive: !0
|
|
252
|
+
}
|
|
253
|
+
), S && ((_ = l.on) == null || _.call(l, "plotly_click", I)), d && ((f = l.on) == null || f.call(l, "plotly_relayout", E)), () => {
|
|
254
|
+
H.purge(l);
|
|
255
|
+
};
|
|
256
|
+
}, [
|
|
257
|
+
n,
|
|
258
|
+
d,
|
|
259
|
+
S,
|
|
260
|
+
g.data,
|
|
261
|
+
g.layout,
|
|
262
|
+
b,
|
|
263
|
+
e.id,
|
|
264
|
+
e.property,
|
|
265
|
+
a
|
|
266
|
+
]), /* @__PURE__ */ w("section", { className: "baselode-tool-strip-log__track", "aria-label": e.label || e.property, children: [
|
|
267
|
+
/* @__PURE__ */ c("div", { className: "baselode-tool-strip-log__track-title", children: e.label || e.property }),
|
|
268
|
+
(e.allowPropertySelection || e.allowChartTypeSelection && N.length > 1) && /* @__PURE__ */ w("div", { className: "baselode-tool-strip-log__controls", children: [
|
|
269
|
+
e.allowPropertySelection && e.propertyOptions.length > 0 && /* @__PURE__ */ w("label", { className: "baselode-tool-strip-log__control", children: [
|
|
270
|
+
/* @__PURE__ */ c("span", { children: "Property" }),
|
|
271
|
+
/* @__PURE__ */ c(
|
|
272
|
+
"select",
|
|
273
|
+
{
|
|
274
|
+
value: e.property,
|
|
275
|
+
onChange: (l) => {
|
|
276
|
+
p == null || p({
|
|
277
|
+
...e,
|
|
278
|
+
property: l.target.value
|
|
279
|
+
});
|
|
280
|
+
},
|
|
281
|
+
children: e.propertyOptions.map((l) => /* @__PURE__ */ c("option", { value: l, children: l }, l))
|
|
282
|
+
}
|
|
283
|
+
)
|
|
284
|
+
] }),
|
|
285
|
+
e.allowChartTypeSelection && N.length > 1 && /* @__PURE__ */ w("label", { className: "baselode-tool-strip-log__control", children: [
|
|
286
|
+
/* @__PURE__ */ c("span", { children: "Chart" }),
|
|
287
|
+
/* @__PURE__ */ c(
|
|
288
|
+
"select",
|
|
289
|
+
{
|
|
290
|
+
value: e.chartType,
|
|
291
|
+
onChange: (l) => {
|
|
292
|
+
p == null || p({
|
|
293
|
+
...e,
|
|
294
|
+
chartType: l.target.value
|
|
295
|
+
});
|
|
296
|
+
},
|
|
297
|
+
children: N.map((l) => /* @__PURE__ */ c("option", { value: l.value, children: l.label }, l.value))
|
|
298
|
+
}
|
|
299
|
+
)
|
|
300
|
+
] })
|
|
301
|
+
] }),
|
|
302
|
+
/* @__PURE__ */ c("div", { className: "baselode-tool-strip-log__plot", ref: m }),
|
|
303
|
+
P.length > 0 && /* @__PURE__ */ c("div", { className: "baselode-tool-strip-log__legend", children: P.map((l) => /* @__PURE__ */ w("div", { className: "baselode-tool-strip-log__legend-row", children: [
|
|
304
|
+
/* @__PURE__ */ c(
|
|
305
|
+
"span",
|
|
306
|
+
{
|
|
307
|
+
className: "baselode-tool-strip-log__legend-swatch",
|
|
308
|
+
style: { backgroundColor: l.color }
|
|
309
|
+
}
|
|
310
|
+
),
|
|
311
|
+
/* @__PURE__ */ c("span", { children: l.label })
|
|
312
|
+
] }, l.label)) })
|
|
313
|
+
] });
|
|
314
|
+
}
|
|
315
|
+
function Be({
|
|
316
|
+
id: o,
|
|
317
|
+
title: e,
|
|
318
|
+
subtitle: n,
|
|
319
|
+
hole: i,
|
|
320
|
+
tracks: b,
|
|
321
|
+
height: B = 420,
|
|
322
|
+
template: p = "baselode",
|
|
323
|
+
showModeBar: S = !1,
|
|
324
|
+
propertyOptions: d,
|
|
325
|
+
allowPropertySelection: m = !1,
|
|
326
|
+
allowChartTypeSelection: a = !1,
|
|
327
|
+
showLegend: u,
|
|
328
|
+
depthRange: g,
|
|
329
|
+
defaultDepthRange: P,
|
|
330
|
+
onPropertyChange: N,
|
|
331
|
+
onTrackChange: l,
|
|
332
|
+
onIntervalClick: I,
|
|
333
|
+
onDepthRangeChange: E
|
|
334
|
+
}) {
|
|
335
|
+
const r = x(
|
|
336
|
+
() => te((i == null ? void 0 : i.points) || []),
|
|
337
|
+
[i]
|
|
338
|
+
), j = x(
|
|
339
|
+
() => k(r, d),
|
|
340
|
+
[r, d]
|
|
341
|
+
), _ = x(
|
|
342
|
+
() => b.map((y, T) => Y(y, {
|
|
343
|
+
trackIndex: T,
|
|
344
|
+
selectableProperties: j,
|
|
345
|
+
classified: r,
|
|
346
|
+
allowPropertySelection: m,
|
|
347
|
+
allowChartTypeSelection: a,
|
|
348
|
+
showLegend: u
|
|
349
|
+
})),
|
|
350
|
+
[a, m, r, j, u, b]
|
|
351
|
+
), f = G(g), L = f ?? G(P), [h, A] = J(_), [z, O] = J(L);
|
|
352
|
+
F(() => {
|
|
353
|
+
A(_);
|
|
354
|
+
}, [_]), F(() => {
|
|
355
|
+
f && O(f);
|
|
356
|
+
}, [f == null ? void 0 : f[0], f == null ? void 0 : f[1]]);
|
|
357
|
+
const U = f ?? z;
|
|
358
|
+
function $(y) {
|
|
359
|
+
const T = h.map((s) => {
|
|
360
|
+
if ((s.id || s.property) !== (y.id || y.property))
|
|
361
|
+
return s;
|
|
362
|
+
const V = y.property ?? s.property, D = r.byType[V] === R ? R : "numeric", M = Y({
|
|
363
|
+
...s,
|
|
364
|
+
...y,
|
|
365
|
+
property: V,
|
|
366
|
+
displayType: y.chartType === "categorical" ? R : D,
|
|
367
|
+
chartType: y.property && y.property !== s.property ? W(D) : y.chartType ?? s.chartType,
|
|
368
|
+
label: Z(s.label, s.property) ? s.label : void 0
|
|
369
|
+
}, {
|
|
370
|
+
selectableProperties: j,
|
|
371
|
+
classified: r,
|
|
372
|
+
allowPropertySelection: m,
|
|
373
|
+
allowChartTypeSelection: a,
|
|
374
|
+
showLegend: u
|
|
375
|
+
});
|
|
376
|
+
return l == null || l(M), V !== s.property && (N == null || N({
|
|
377
|
+
trackId: M.id || M.property,
|
|
378
|
+
property: M.property,
|
|
379
|
+
displayType: M.displayType,
|
|
380
|
+
chartType: M.chartType
|
|
381
|
+
})), M;
|
|
382
|
+
});
|
|
383
|
+
A(T);
|
|
384
|
+
}
|
|
385
|
+
return /* @__PURE__ */ w(
|
|
386
|
+
"article",
|
|
387
|
+
{
|
|
388
|
+
className: "baselode-tool-strip-log",
|
|
389
|
+
"data-tool-ui-id": o,
|
|
390
|
+
"data-baselode-theme": C(p),
|
|
391
|
+
style: X(p),
|
|
392
|
+
children: [
|
|
393
|
+
/* @__PURE__ */ w("header", { className: "baselode-tool-strip-log__header", children: [
|
|
394
|
+
/* @__PURE__ */ w("div", { children: [
|
|
395
|
+
/* @__PURE__ */ c("div", { className: "baselode-tool-strip-log__eyebrow", children: i.id }),
|
|
396
|
+
/* @__PURE__ */ c("h3", { children: e || "Strip log" })
|
|
397
|
+
] }),
|
|
398
|
+
n && /* @__PURE__ */ c("p", { children: n })
|
|
399
|
+
] }),
|
|
400
|
+
/* @__PURE__ */ c("div", { className: "baselode-tool-strip-log__tracks", children: h.map((y) => /* @__PURE__ */ c(
|
|
401
|
+
Se,
|
|
402
|
+
{
|
|
403
|
+
hole: i,
|
|
404
|
+
track: y,
|
|
405
|
+
height: B,
|
|
406
|
+
template: p,
|
|
407
|
+
showModeBar: S,
|
|
408
|
+
depthRange: U,
|
|
409
|
+
onTrackChange: $,
|
|
410
|
+
onIntervalClick: I,
|
|
411
|
+
onDepthRangeChange: (T) => {
|
|
412
|
+
!f && (T != null && T.depthRange) && O(T.depthRange), E == null || E(T);
|
|
413
|
+
}
|
|
414
|
+
},
|
|
415
|
+
y.id || y.property
|
|
416
|
+
)) })
|
|
417
|
+
]
|
|
418
|
+
}
|
|
419
|
+
);
|
|
420
|
+
}
|
|
421
|
+
function Pe({
|
|
422
|
+
id: o,
|
|
423
|
+
title: e,
|
|
424
|
+
subtitle: n,
|
|
425
|
+
height: i = 520,
|
|
426
|
+
background: b = "white",
|
|
427
|
+
controlMode: B = "orbit",
|
|
428
|
+
drillholes: p,
|
|
429
|
+
stripLogs: S = [],
|
|
430
|
+
structuralDiscs: d,
|
|
431
|
+
blocks: m,
|
|
432
|
+
rasterOverlays: a = [],
|
|
433
|
+
camera: u
|
|
434
|
+
}) {
|
|
435
|
+
const g = K(null), P = K(null), [N, l] = J("");
|
|
436
|
+
return F(() => {
|
|
437
|
+
const I = g.current;
|
|
438
|
+
if (!I) return;
|
|
439
|
+
let E = !1;
|
|
440
|
+
const r = new se();
|
|
441
|
+
P.current = r;
|
|
442
|
+
async function j() {
|
|
443
|
+
var f, L, h, A, z, O, U, $, y, T;
|
|
444
|
+
try {
|
|
445
|
+
l(""), r.init(I), r.setBackground(b), r.setControlMode(B);
|
|
446
|
+
const s = (p == null ? void 0 : p.holes) || [];
|
|
447
|
+
s.length && r.setDrillholes(s, (p == null ? void 0 : p.options) || {}), s.length && S.length && r.setStripLogs(s, S), (f = d == null ? void 0 : d.structures) != null && f.length && (r.setStructuralDiscs(
|
|
448
|
+
d.structures,
|
|
449
|
+
s,
|
|
450
|
+
d.options || {}
|
|
451
|
+
), d.visible !== void 0 && r.setStructuralDiscsVisible(d.visible)), (L = m == null ? void 0 : m.data) != null && L.length && r.setBlocks(
|
|
452
|
+
m.data,
|
|
453
|
+
m.selectedProperty,
|
|
454
|
+
m.stats || {},
|
|
455
|
+
m.options || {}
|
|
456
|
+
);
|
|
457
|
+
for (const V of a) {
|
|
458
|
+
const D = await ae(V);
|
|
459
|
+
if (E) {
|
|
460
|
+
(z = (A = (h = D.mesh) == null ? void 0 : h.geometry) == null ? void 0 : A.dispose) == null || z.call(A), ($ = (U = (O = D.mesh) == null ? void 0 : O.material) == null ? void 0 : U.dispose) == null || $.call(U), (T = (y = D.texture) == null ? void 0 : y.dispose) == null || T.call(y);
|
|
461
|
+
return;
|
|
462
|
+
}
|
|
463
|
+
r.addRasterOverlay(D);
|
|
464
|
+
}
|
|
465
|
+
u != null && u.viewState ? r.setViewState(u.viewState) : (u == null ? void 0 : u.fitToBounds) !== !1 && r.focusOnLastBounds((u == null ? void 0 : u.focusPadding) || 1.2);
|
|
466
|
+
} catch (s) {
|
|
467
|
+
console.error("Baselode 3D Tool UI render error", s), l((s == null ? void 0 : s.message) || "3D scene render error");
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
j();
|
|
471
|
+
const _ = typeof ResizeObserver < "u" ? new ResizeObserver(() => r.resize()) : null;
|
|
472
|
+
return _ == null || _.observe(I), () => {
|
|
473
|
+
E = !0, _ == null || _.disconnect(), r.dispose(), P.current = null;
|
|
474
|
+
};
|
|
475
|
+
}, [
|
|
476
|
+
b,
|
|
477
|
+
m,
|
|
478
|
+
u,
|
|
479
|
+
B,
|
|
480
|
+
p,
|
|
481
|
+
a,
|
|
482
|
+
S,
|
|
483
|
+
d
|
|
484
|
+
]), /* @__PURE__ */ w(
|
|
485
|
+
"article",
|
|
486
|
+
{
|
|
487
|
+
className: "baselode-tool-3d-scene",
|
|
488
|
+
"data-tool-ui-id": o,
|
|
489
|
+
"data-baselode-theme": C(b),
|
|
490
|
+
style: X(b),
|
|
491
|
+
children: [
|
|
492
|
+
(e || n) && /* @__PURE__ */ w("header", { className: "baselode-tool-3d-scene__header", children: [
|
|
493
|
+
e && /* @__PURE__ */ c("h3", { children: e }),
|
|
494
|
+
n && /* @__PURE__ */ c("p", { children: n })
|
|
495
|
+
] }),
|
|
496
|
+
N && /* @__PURE__ */ w("div", { className: "baselode-tool-3d-scene__error", children: [
|
|
497
|
+
"Scene error: ",
|
|
498
|
+
N
|
|
499
|
+
] }),
|
|
500
|
+
/* @__PURE__ */ c(
|
|
501
|
+
"div",
|
|
502
|
+
{
|
|
503
|
+
className: "baselode-tool-3d-scene__viewport",
|
|
504
|
+
ref: g,
|
|
505
|
+
style: { height: i }
|
|
506
|
+
}
|
|
507
|
+
)
|
|
508
|
+
]
|
|
509
|
+
}
|
|
510
|
+
);
|
|
511
|
+
}
|
|
512
|
+
export {
|
|
513
|
+
Pe as Baselode3DSceneToolUI,
|
|
514
|
+
Be as BaselodeStripLogToolUI,
|
|
515
|
+
ye as SerializableBaselode3DSceneSchema,
|
|
516
|
+
ue as SerializableBaselodeStripLogSchema,
|
|
517
|
+
de as SerializableBaselodeStripLogTrackSchema,
|
|
518
|
+
Ae as safeParseSerializableBaselode3DScene,
|
|
519
|
+
Le as safeParseSerializableBaselodeStripLog
|
|
520
|
+
};
|
|
521
|
+
//# sourceMappingURL=tool-ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-ui.js","sources":["../src/tool-ui/schema.js","../src/tool-ui/theme.js","../src/tool-ui/BaselodeStripLogToolUI.jsx","../src/tool-ui/Baselode3DSceneToolUI.jsx"],"sourcesContent":["/*\n * Copyright (C) 2026 Darkmine Pty Ltd\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\nimport { z } from 'zod';\n\nconst PrimitiveJsonSchema = z.union([z.string(), z.number(), z.boolean(), z.null()]);\nconst JsonObjectSchema = z.record(z.string(), z.unknown());\nconst DepthRangeSchema = z.tuple([z.number(), z.number()]);\n\nexport const SerializableBaselodeStripLogTrackSchema = z.object({\n id: z.string().optional(),\n property: z.string().min(1),\n label: z.string().optional(),\n displayType: z.enum(['numeric', 'categorical']).default('numeric'),\n chartType: z.enum(['bar', 'markers', 'line', 'markers+line', 'categorical']).optional(),\n colourMap: z.union([z.string(), z.record(z.string(), z.string())]).optional(),\n propertyOptions: z.array(z.string().min(1)).optional(),\n allowPropertySelection: z.boolean().optional(),\n allowChartTypeSelection: z.boolean().optional(),\n showLegend: z.boolean().optional(),\n});\n\nexport const SerializableBaselodeStripLogSchema = z.object({\n id: z.string().min(1),\n title: z.string().optional(),\n subtitle: z.string().optional(),\n hole: z.object({\n id: z.string().min(1),\n points: z.array(JsonObjectSchema),\n metadata: z.record(z.string(), PrimitiveJsonSchema).optional(),\n }),\n tracks: z.array(SerializableBaselodeStripLogTrackSchema).min(1),\n height: z.number().positive().max(1200).optional(),\n template: z.enum(['baselode', 'baselode-dark', 'plotly-default']).optional(),\n showModeBar: z.boolean().optional(),\n propertyOptions: z.array(z.string().min(1)).optional(),\n allowPropertySelection: z.boolean().optional(),\n allowChartTypeSelection: z.boolean().optional(),\n showLegend: z.boolean().optional(),\n depthRange: DepthRangeSchema.optional(),\n defaultDepthRange: DepthRangeSchema.optional(),\n});\n\nexport function safeParseSerializableBaselodeStripLog(value) {\n const parsed = SerializableBaselodeStripLogSchema.safeParse(value);\n return parsed.success ? parsed.data : null;\n}\n\nexport const SerializableBaselode3DSceneSchema = z.object({\n id: z.string().min(1),\n title: z.string().optional(),\n subtitle: z.string().optional(),\n height: z.number().positive().max(1400).optional(),\n background: z.enum(['white', 'black']).optional(),\n controlMode: z.enum(['orbit', 'fly']).optional(),\n drillholes: z.object({\n holes: z.array(JsonObjectSchema),\n options: JsonObjectSchema.optional(),\n }).optional(),\n stripLogs: z.array(JsonObjectSchema).optional(),\n structuralDiscs: z.object({\n structures: z.array(JsonObjectSchema),\n options: JsonObjectSchema.optional(),\n visible: z.boolean().optional(),\n }).optional(),\n blocks: z.object({\n data: z.array(JsonObjectSchema),\n selectedProperty: z.string().min(1),\n stats: JsonObjectSchema.optional(),\n options: JsonObjectSchema.optional(),\n }).optional(),\n rasterOverlays: z.array(z.object({\n id: z.string().optional(),\n name: z.string().optional(),\n source: z.object({\n type: z.literal('url'),\n url: z.string().min(1),\n }),\n bounds: JsonObjectSchema,\n elevation: z.number().optional(),\n opacity: z.number().optional(),\n visible: z.boolean().optional(),\n renderOrder: z.number().optional(),\n })).optional(),\n camera: z.object({\n viewState: JsonObjectSchema.optional(),\n fitToBounds: z.boolean().optional(),\n focusPadding: z.number().positive().optional(),\n }).optional(),\n});\n\nexport function safeParseSerializableBaselode3DScene(value) {\n const parsed = SerializableBaselode3DSceneSchema.safeParse(value);\n return parsed.success ? parsed.data : null;\n}\n","/*\n * Copyright (C) 2026 Darkmine Pty Ltd\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\nimport { BASELODE_LIGHT } from '../viz/baselodeTemplate.js';\nimport { BASELODE_DARK } from '../viz/baselodeDarkTemplate.js';\n\nfunction toToolUiThemeVars(palette) {\n return {\n '--baselode-tool-bg': palette.bg,\n '--baselode-tool-panel': palette.panel,\n '--baselode-tool-ink': palette.ink,\n '--baselode-tool-ink-soft': palette.ink_soft,\n '--baselode-tool-grid': palette.grid,\n '--baselode-tool-line': palette.line,\n '--baselode-tool-accent': palette.accent,\n '--baselode-tool-muted-1': palette.muted_1,\n '--baselode-tool-muted-2': palette.muted_2,\n '--baselode-tool-muted-3': palette.muted_3,\n '--baselode-tool-primary': palette.primary || palette.accent,\n };\n}\n\nexport function getToolUiThemeName(theme) {\n return theme === 'baselode-dark' || theme === 'black' ? 'baselode-dark' : 'baselode';\n}\n\nexport function getToolUiThemeStyle(theme) {\n return toToolUiThemeVars(\n getToolUiThemeName(theme) === 'baselode-dark' ? BASELODE_DARK : BASELODE_LIGHT\n );\n}\n","/*\n * Copyright (C) 2026 Darkmine Pty Ltd\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport Plotly from 'plotly.js-dist-min';\nimport {\n DISPLAY_CATEGORICAL,\n classifyColumns,\n defaultChartType,\n getChartOptions,\n} from '../data/columnMeta.js';\nimport {\n BASELODE_TEMPLATE,\n} from '../viz/baselodeTemplate.js';\nimport {\n BASELODE_DARK_TEMPLATE,\n} from '../viz/baselodeDarkTemplate.js';\nimport {\n buildIntervalPoints,\n buildPlotConfig,\n} from '../viz/drillholeViz.js';\nimport { getToolUiThemeName, getToolUiThemeStyle } from './theme.js';\n\nfunction resolveTemplate(template) {\n if (template === 'baselode-dark') return BASELODE_DARK_TEMPLATE;\n if (template === 'plotly-default') return null;\n return BASELODE_TEMPLATE;\n}\n\nfunction normalizeDepthRange(range) {\n if (!Array.isArray(range) || range.length !== 2) return null;\n const start = Number(range[0]);\n const end = Number(range[1]);\n if (!Number.isFinite(start) || !Number.isFinite(end)) return null;\n if (start === end) return null;\n return start < end ? [start, end] : [end, start];\n}\n\nfunction toPlotlyDepthRange(range) {\n if (!range) return undefined;\n return [range[1], range[0]];\n}\n\nfunction extractDepthRange(update) {\n if (!update || typeof update !== 'object') return null;\n const arrayRange = update['yaxis.range'];\n if (Array.isArray(arrayRange) && arrayRange.length === 2) {\n return normalizeDepthRange(arrayRange);\n }\n const start = update['yaxis.range[0]'];\n const end = update['yaxis.range[1]'];\n if (start !== undefined && end !== undefined) {\n return normalizeDepthRange([start, end]);\n }\n return null;\n}\n\nfunction isCustomTrackLabel(label, property) {\n return Boolean(label && label !== property);\n}\n\nfunction getSelectableProperties(classified, explicitOptions) {\n const builtin = [...classified.numericCols, ...classified.categoricalCols];\n if (!explicitOptions?.length) return builtin;\n\n const allowed = new Set(builtin);\n return explicitOptions.filter((property) => allowed.has(property));\n}\n\nfunction normalizeTrackConfig(track, {\n trackIndex = 0,\n selectableProperties,\n classified,\n allowPropertySelection,\n allowChartTypeSelection,\n showLegend,\n}) {\n const propertyOptions = getSelectableProperties(classified, track.propertyOptions ?? selectableProperties);\n const property = propertyOptions.includes(track.property)\n ? track.property\n : propertyOptions[0] ?? track.property;\n const inferredDisplayType = classified.byType[property] === DISPLAY_CATEGORICAL\n ? DISPLAY_CATEGORICAL\n : 'numeric';\n const displayType = track.chartType === 'categorical' || track.displayType === DISPLAY_CATEGORICAL\n ? DISPLAY_CATEGORICAL\n : inferredDisplayType;\n const chartOptions = getChartOptions(displayType);\n const chartType = chartOptions.some((option) => option.value === track.chartType)\n ? track.chartType\n : defaultChartType(displayType);\n\n return {\n ...track,\n id: track.id || `${property}-${trackIndex + 1}`,\n property,\n label: isCustomTrackLabel(track.label, track.property) ? track.label : undefined,\n displayType,\n chartType,\n propertyOptions,\n allowPropertySelection: track.allowPropertySelection ?? allowPropertySelection ?? false,\n allowChartTypeSelection: track.allowChartTypeSelection ?? allowChartTypeSelection ?? false,\n showLegend: track.showLegend ?? showLegend ?? displayType === DISPLAY_CATEGORICAL,\n };\n}\n\nfunction getLegendItems(plotData) {\n if (!Array.isArray(plotData) || !plotData.length) return [];\n\n return plotData\n .map((trace) => {\n const colour = trace?.marker?.color;\n const label = trace?.name;\n if (!label || typeof colour !== 'string') return null;\n return { label, color: colour };\n })\n .filter(Boolean);\n}\n\nfunction applyDepthRange(layout, depthRange) {\n if (!depthRange) return layout;\n\n return {\n ...layout,\n yaxis: {\n ...(layout.yaxis || {}),\n autorange: false,\n range: toPlotlyDepthRange(depthRange),\n },\n };\n}\n\nfunction StripLogTrack({\n hole,\n track,\n height,\n template,\n showModeBar,\n depthRange,\n onTrackChange,\n onIntervalClick,\n onDepthRangeChange,\n}) {\n const ref = useRef(null);\n const isCategorical = track.displayType === DISPLAY_CATEGORICAL || track.chartType === 'categorical';\n const points = useMemo(\n () => buildIntervalPoints(hole, track.property, isCategorical),\n [hole, isCategorical, track.property]\n );\n const plotConfig = useMemo(() => {\n const nextConfig = buildPlotConfig({\n points,\n isCategorical,\n property: track.label || track.property,\n chartType: track.chartType || (isCategorical ? 'categorical' : 'markers+line'),\n colourMap: track.colourMap,\n template: resolveTemplate(template),\n });\n return {\n data: nextConfig.data,\n layout: applyDepthRange(nextConfig.layout, depthRange),\n };\n }, [depthRange, isCategorical, points, template, track.chartType, track.colourMap, track.label, track.property]);\n const legendItems = useMemo(\n () => (track.showLegend && isCategorical ? getLegendItems(plotConfig.data) : []),\n [isCategorical, plotConfig.data, track.showLegend]\n );\n const chartOptions = useMemo(\n () => getChartOptions(track.displayType),\n [track.displayType]\n );\n\n useEffect(() => {\n const target = ref.current;\n if (!target) return undefined;\n\n if (!plotConfig.data.length) {\n target.replaceChildren(document.createTextNode(`No data for ${track.property}`));\n return undefined;\n }\n\n const handleClick = (event) => {\n const point = event?.points?.[0];\n if (!point || !onIntervalClick) return;\n const bounds = Array.isArray(point.customdata) ? point.customdata : [];\n onIntervalClick({\n trackId: track.id || track.property,\n property: track.property,\n value: isCategorical ? point.data?.name : point.x,\n from: Number(bounds[0]),\n to: Number(bounds[1]),\n pointIndex: point.pointIndex,\n });\n };\n\n const handleRelayout = (update) => {\n const nextRange = extractDepthRange(update);\n if (nextRange && onDepthRangeChange) {\n onDepthRangeChange({\n trackId: track.id || track.property,\n depthRange: nextRange,\n });\n }\n };\n\n target.removeAllListeners?.('plotly_click');\n target.removeAllListeners?.('plotly_relayout');\n\n Plotly.react(\n target,\n plotConfig.data,\n {\n ...plotConfig.layout,\n height,\n title: undefined,\n margin: { ...plotConfig.layout.margin, t: 12 },\n },\n {\n displayModeBar: showModeBar,\n responsive: true,\n }\n );\n\n if (onIntervalClick) {\n target.on?.('plotly_click', handleClick);\n }\n if (onDepthRangeChange) {\n target.on?.('plotly_relayout', handleRelayout);\n }\n\n return () => {\n Plotly.purge(target);\n };\n }, [\n height,\n onDepthRangeChange,\n onIntervalClick,\n plotConfig.data,\n plotConfig.layout,\n showModeBar,\n track.id,\n track.property,\n isCategorical,\n ]);\n\n return (\n <section className=\"baselode-tool-strip-log__track\" aria-label={track.label || track.property}>\n <div className=\"baselode-tool-strip-log__track-title\">{track.label || track.property}</div>\n\n {(track.allowPropertySelection || (track.allowChartTypeSelection && chartOptions.length > 1)) && (\n <div className=\"baselode-tool-strip-log__controls\">\n {track.allowPropertySelection && track.propertyOptions.length > 0 && (\n <label className=\"baselode-tool-strip-log__control\">\n <span>Property</span>\n <select\n value={track.property}\n onChange={(event) => {\n onTrackChange?.({\n ...track,\n property: event.target.value,\n });\n }}\n >\n {track.propertyOptions.map((option) => (\n <option key={option} value={option}>{option}</option>\n ))}\n </select>\n </label>\n )}\n\n {track.allowChartTypeSelection && chartOptions.length > 1 && (\n <label className=\"baselode-tool-strip-log__control\">\n <span>Chart</span>\n <select\n value={track.chartType}\n onChange={(event) => {\n onTrackChange?.({\n ...track,\n chartType: event.target.value,\n });\n }}\n >\n {chartOptions.map((option) => (\n <option key={option.value} value={option.value}>{option.label}</option>\n ))}\n </select>\n </label>\n )}\n </div>\n )}\n\n <div className=\"baselode-tool-strip-log__plot\" ref={ref} />\n\n {legendItems.length > 0 && (\n <div className=\"baselode-tool-strip-log__legend\">\n {legendItems.map((item) => (\n <div key={item.label} className=\"baselode-tool-strip-log__legend-row\">\n <span\n className=\"baselode-tool-strip-log__legend-swatch\"\n style={{ backgroundColor: item.color }}\n />\n <span>{item.label}</span>\n </div>\n ))}\n </div>\n )}\n </section>\n );\n}\n\nexport function BaselodeStripLogToolUI({\n id,\n title,\n subtitle,\n hole,\n tracks,\n height = 420,\n template = 'baselode',\n showModeBar = false,\n propertyOptions,\n allowPropertySelection = false,\n allowChartTypeSelection = false,\n showLegend,\n depthRange,\n defaultDepthRange,\n onPropertyChange,\n onTrackChange,\n onIntervalClick,\n onDepthRangeChange,\n}) {\n const classified = useMemo(\n () => classifyColumns(hole?.points || []),\n [hole]\n );\n const selectableProperties = useMemo(\n () => getSelectableProperties(classified, propertyOptions),\n [classified, propertyOptions]\n );\n const normalizedInitialTracks = useMemo(\n () => tracks.map((track, trackIndex) => normalizeTrackConfig(track, {\n trackIndex,\n selectableProperties,\n classified,\n allowPropertySelection,\n allowChartTypeSelection,\n showLegend,\n })),\n [allowChartTypeSelection, allowPropertySelection, classified, selectableProperties, showLegend, tracks]\n );\n const controlledDepthRange = normalizeDepthRange(depthRange);\n const initialDepthRange = controlledDepthRange ?? normalizeDepthRange(defaultDepthRange);\n const [trackState, setTrackState] = useState(normalizedInitialTracks);\n const [localDepthRange, setLocalDepthRange] = useState(initialDepthRange);\n\n useEffect(() => {\n setTrackState(normalizedInitialTracks);\n }, [normalizedInitialTracks]);\n\n useEffect(() => {\n if (controlledDepthRange) {\n setLocalDepthRange(controlledDepthRange);\n }\n }, [controlledDepthRange?.[0], controlledDepthRange?.[1]]);\n\n const resolvedDepthRange = controlledDepthRange ?? localDepthRange;\n\n function handleTrackChange(nextTrack) {\n const nextState = trackState.map((track) => {\n if ((track.id || track.property) !== (nextTrack.id || nextTrack.property)) {\n return track;\n }\n\n const property = nextTrack.property ?? track.property;\n const nextDisplayType = classified.byType[property] === DISPLAY_CATEGORICAL\n ? DISPLAY_CATEGORICAL\n : 'numeric';\n const normalized = normalizeTrackConfig({\n ...track,\n ...nextTrack,\n property,\n displayType: nextTrack.chartType === 'categorical' ? DISPLAY_CATEGORICAL : nextDisplayType,\n chartType: nextTrack.property && nextTrack.property !== track.property\n ? defaultChartType(nextDisplayType)\n : nextTrack.chartType ?? track.chartType,\n label: isCustomTrackLabel(track.label, track.property) ? track.label : undefined,\n }, {\n selectableProperties,\n classified,\n allowPropertySelection,\n allowChartTypeSelection,\n showLegend,\n });\n onTrackChange?.(normalized);\n if (property !== track.property) {\n onPropertyChange?.({\n trackId: normalized.id || normalized.property,\n property: normalized.property,\n displayType: normalized.displayType,\n chartType: normalized.chartType,\n });\n }\n return normalized;\n });\n\n setTrackState(nextState);\n }\n\n return (\n <article\n className=\"baselode-tool-strip-log\"\n data-tool-ui-id={id}\n data-baselode-theme={getToolUiThemeName(template)}\n style={getToolUiThemeStyle(template)}\n >\n <header className=\"baselode-tool-strip-log__header\">\n <div>\n <div className=\"baselode-tool-strip-log__eyebrow\">{hole.id}</div>\n <h3>{title || 'Strip log'}</h3>\n </div>\n {subtitle && <p>{subtitle}</p>}\n </header>\n <div className=\"baselode-tool-strip-log__tracks\">\n {trackState.map((track) => (\n <StripLogTrack\n key={track.id || track.property}\n hole={hole}\n track={track}\n height={height}\n template={template}\n showModeBar={showModeBar}\n depthRange={resolvedDepthRange}\n onTrackChange={handleTrackChange}\n onIntervalClick={onIntervalClick}\n onDepthRangeChange={(event) => {\n if (!controlledDepthRange && event?.depthRange) {\n setLocalDepthRange(event.depthRange);\n }\n onDepthRangeChange?.(event);\n }}\n />\n ))}\n </div>\n </article>\n );\n}\n","/*\n * Copyright (C) 2026 Darkmine Pty Ltd\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\nimport { useEffect, useRef, useState } from 'react';\nimport Baselode3DScene from '../viz/baselode3dScene.js';\nimport { createRasterOverlay } from '../viz/rasterOverlayScene.js';\nimport { getToolUiThemeName, getToolUiThemeStyle } from './theme.js';\n\nexport function Baselode3DSceneToolUI({\n id,\n title,\n subtitle,\n height = 520,\n background = 'white',\n controlMode = 'orbit',\n drillholes,\n stripLogs = [],\n structuralDiscs,\n blocks,\n rasterOverlays = [],\n camera,\n}) {\n const containerRef = useRef(null);\n const sceneRef = useRef(null);\n const [renderError, setRenderError] = useState('');\n\n useEffect(() => {\n const target = containerRef.current;\n if (!target) return undefined;\n\n let disposed = false;\n const scene = new Baselode3DScene();\n sceneRef.current = scene;\n\n async function renderScene() {\n try {\n setRenderError('');\n scene.init(target);\n scene.setBackground(background);\n scene.setControlMode(controlMode);\n\n const holes = drillholes?.holes || [];\n if (holes.length) {\n scene.setDrillholes(holes, drillholes?.options || {});\n }\n\n if (holes.length && stripLogs.length) {\n scene.setStripLogs(holes, stripLogs);\n }\n\n if (structuralDiscs?.structures?.length) {\n scene.setStructuralDiscs(\n structuralDiscs.structures,\n holes,\n structuralDiscs.options || {}\n );\n if (structuralDiscs.visible !== undefined) {\n scene.setStructuralDiscsVisible(structuralDiscs.visible);\n }\n }\n\n if (blocks?.data?.length) {\n scene.setBlocks(\n blocks.data,\n blocks.selectedProperty,\n blocks.stats || {},\n blocks.options || {}\n );\n }\n\n for (const overlay of rasterOverlays) {\n const layer = await createRasterOverlay(overlay);\n if (disposed) {\n layer.mesh?.geometry?.dispose?.();\n layer.mesh?.material?.dispose?.();\n layer.texture?.dispose?.();\n return;\n }\n scene.addRasterOverlay(layer);\n }\n\n if (camera?.viewState) {\n scene.setViewState(camera.viewState);\n } else if (camera?.fitToBounds !== false) {\n scene.focusOnLastBounds(camera?.focusPadding || 1.2);\n }\n } catch (err) {\n console.error('Baselode 3D Tool UI render error', err);\n setRenderError(err?.message || '3D scene render error');\n }\n }\n\n void renderScene();\n\n const resizeObserver = typeof ResizeObserver !== 'undefined'\n ? new ResizeObserver(() => scene.resize())\n : null;\n resizeObserver?.observe(target);\n\n return () => {\n disposed = true;\n resizeObserver?.disconnect();\n scene.dispose();\n sceneRef.current = null;\n };\n }, [\n background,\n blocks,\n camera,\n controlMode,\n drillholes,\n rasterOverlays,\n stripLogs,\n structuralDiscs,\n ]);\n\n return (\n <article\n className=\"baselode-tool-3d-scene\"\n data-tool-ui-id={id}\n data-baselode-theme={getToolUiThemeName(background)}\n style={getToolUiThemeStyle(background)}\n >\n {(title || subtitle) && (\n <header className=\"baselode-tool-3d-scene__header\">\n {title && <h3>{title}</h3>}\n {subtitle && <p>{subtitle}</p>}\n </header>\n )}\n {renderError && (\n <div className=\"baselode-tool-3d-scene__error\">Scene error: {renderError}</div>\n )}\n <div\n className=\"baselode-tool-3d-scene__viewport\"\n ref={containerRef}\n style={{ height }}\n />\n </article>\n );\n}\n"],"names":["PrimitiveJsonSchema","z","JsonObjectSchema","DepthRangeSchema","SerializableBaselodeStripLogTrackSchema","SerializableBaselodeStripLogSchema","safeParseSerializableBaselodeStripLog","value","parsed","SerializableBaselode3DSceneSchema","safeParseSerializableBaselode3DScene","toToolUiThemeVars","palette","getToolUiThemeName","theme","getToolUiThemeStyle","BASELODE_DARK","BASELODE_LIGHT","resolveTemplate","template","BASELODE_DARK_TEMPLATE","BASELODE_TEMPLATE","normalizeDepthRange","range","start","end","toPlotlyDepthRange","extractDepthRange","update","arrayRange","isCustomTrackLabel","label","property","getSelectableProperties","classified","explicitOptions","builtin","allowed","normalizeTrackConfig","track","trackIndex","selectableProperties","allowPropertySelection","allowChartTypeSelection","showLegend","propertyOptions","inferredDisplayType","DISPLAY_CATEGORICAL","displayType","chartType","getChartOptions","option","defaultChartType","getLegendItems","plotData","trace","colour","_a","applyDepthRange","layout","depthRange","StripLogTrack","hole","height","showModeBar","onTrackChange","onIntervalClick","onDepthRangeChange","ref","useRef","isCategorical","points","useMemo","buildIntervalPoints","plotConfig","nextConfig","buildPlotConfig","legendItems","chartOptions","useEffect","target","handleClick","event","point","bounds","_b","handleRelayout","nextRange","Plotly","_c","_d","jsxs","jsx","item","BaselodeStripLogToolUI","id","title","subtitle","tracks","defaultDepthRange","onPropertyChange","classifyColumns","normalizedInitialTracks","controlledDepthRange","initialDepthRange","trackState","setTrackState","useState","localDepthRange","setLocalDepthRange","resolvedDepthRange","handleTrackChange","nextTrack","nextState","nextDisplayType","normalized","Baselode3DSceneToolUI","background","controlMode","drillholes","stripLogs","structuralDiscs","blocks","rasterOverlays","camera","containerRef","sceneRef","renderError","setRenderError","disposed","scene","Baselode3DScene","renderScene","holes","overlay","layer","createRasterOverlay","_e","_h","_g","_f","_j","_i","err","resizeObserver"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "baselode",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.19",
|
|
4
4
|
"description": "Geoscience drillhole data processing and visualization toolkit",
|
|
5
5
|
"license": "GPL-3.0-or-later",
|
|
6
6
|
"repository": {
|
|
@@ -22,12 +22,15 @@
|
|
|
22
22
|
".": {
|
|
23
23
|
"import": "./dist/baselode.js"
|
|
24
24
|
},
|
|
25
|
-
"./style.css": "./dist/style.css"
|
|
25
|
+
"./style.css": "./dist/style.css",
|
|
26
|
+
"./tool-ui": {
|
|
27
|
+
"import": "./dist/tool-ui.js"
|
|
28
|
+
},
|
|
29
|
+
"./tool-ui/style.css": "./src/tool-ui/style.css"
|
|
26
30
|
},
|
|
27
31
|
"files": [
|
|
28
|
-
"dist
|
|
29
|
-
"
|
|
30
|
-
"dist/style.css",
|
|
32
|
+
"dist",
|
|
33
|
+
"src/tool-ui/style.css",
|
|
31
34
|
"README.md"
|
|
32
35
|
],
|
|
33
36
|
"sideEffects": [
|
|
@@ -51,11 +54,13 @@
|
|
|
51
54
|
"react": ">=18.0.0",
|
|
52
55
|
"react-dom": ">=18.0.0",
|
|
53
56
|
"three": ">=0.150.0",
|
|
54
|
-
"three-viewport-gizmo": ">=2.0.0"
|
|
57
|
+
"three-viewport-gizmo": ">=2.0.0",
|
|
58
|
+
"zod": ">=3.0.0"
|
|
55
59
|
},
|
|
56
60
|
"devDependencies": {
|
|
57
61
|
"@vitejs/plugin-react": "^4.2.1",
|
|
58
62
|
"vite": "^5.0.8",
|
|
59
|
-
"vitest": "^2.1.8"
|
|
63
|
+
"vitest": "^2.1.8",
|
|
64
|
+
"zod": "^3.25.76"
|
|
60
65
|
}
|
|
61
66
|
}
|