baselode 0.1.18 → 0.1.20

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.
@@ -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 F, useEffect as V, useRef as H } from "react";
4
+ import Y from "plotly.js-dist-min";
5
+ import { s as ee, J as oe, c as te, i as R, k as Q, aH as W, o as le, l as ne, t as re, g as ie, U as se, aG as ae } from "./baselode3dScene-qMfVRKxK.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 K(o) {
103
+ return o === "baselode-dark" || o === "black" ? "baselode-dark" : "baselode";
104
+ }
105
+ function X(o) {
106
+ return ce(
107
+ K(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 $(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 fe(o) {
119
+ if (o)
120
+ return [o[1], o[0]];
121
+ }
122
+ function me(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 $(e);
127
+ const n = o["yaxis.range[0]"], i = o["yaxis.range[1]"];
128
+ return n !== void 0 && i !== void 0 ? $([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 C(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, f = i.byType[d] === R ? R : "numeric", a = o.chartType === "categorical" || o.displayType === R ? R : f, 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: fe(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 f = H(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 V(() => {
213
+ var r, j, _, m;
214
+ const l = f.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 = me(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"), Y.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 && ((m = l.on) == null || m.call(l, "plotly_relayout", E)), () => {
254
+ Y.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: f }),
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: f = !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) => C(y, {
343
+ trackIndex: T,
344
+ selectableProperties: j,
345
+ classified: r,
346
+ allowPropertySelection: f,
347
+ allowChartTypeSelection: a,
348
+ showLegend: u
349
+ })),
350
+ [a, f, r, j, u, b]
351
+ ), m = $(g), L = m ?? $(P), [h, A] = F(_), [z, O] = F(L);
352
+ V(() => {
353
+ A(_);
354
+ }, [_]), V(() => {
355
+ m && O(m);
356
+ }, [m == null ? void 0 : m[0], m == null ? void 0 : m[1]]);
357
+ const U = m ?? z;
358
+ function J(y) {
359
+ const T = h.map((s) => {
360
+ if ((s.id || s.property) !== (y.id || y.property))
361
+ return s;
362
+ const G = y.property ?? s.property, D = r.byType[G] === R ? R : "numeric", M = C({
363
+ ...s,
364
+ ...y,
365
+ property: G,
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: f,
373
+ allowChartTypeSelection: a,
374
+ showLegend: u
375
+ });
376
+ return l == null || l(M), G !== 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": K(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: J,
410
+ onIntervalClick: I,
411
+ onDepthRangeChange: (T) => {
412
+ !m && (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: f,
432
+ rasterOverlays: a = [],
433
+ camera: u
434
+ }) {
435
+ const g = H(null), P = H(null), [N, l] = F("");
436
+ return V(() => {
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 m, L, h, A, z, O, U, J, 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), (m = d == null ? void 0 : d.structures) != null && m.length && (r.setStructuralDiscs(
448
+ d.structures,
449
+ s,
450
+ d.options || {}
451
+ ), d.visible !== void 0 && r.setStructuralDiscsVisible(d.visible)), (L = f == null ? void 0 : f.data) != null && L.length && r.setBlocks(
452
+ f.data,
453
+ f.selectedProperty,
454
+ f.stats || {},
455
+ f.options || {}
456
+ );
457
+ for (const G of a) {
458
+ const D = await ae(G);
459
+ if (E) {
460
+ (z = (A = (h = D.mesh) == null ? void 0 : h.geometry) == null ? void 0 : A.dispose) == null || z.call(A), (J = (U = (O = D.mesh) == null ? void 0 : O.material) == null ? void 0 : U.dispose) == null || J.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
+ f,
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": K(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.18",
3
+ "version": "0.1.20",
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/baselode.js",
29
- "dist/baselode.js.map",
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
  }