baselode 0.1.20 → 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.
@@ -1 +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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"}
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\nconst PropertyMetaSchema = z.object({\n label: z.string().optional(),\n unit: z.string().nullish(),\n sourceAttribute: z.string().nullish(),\n});\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 propertyMeta: z.record(z.string(), PropertyMetaSchema).optional(),\n deriveMetaFromRows: z.boolean().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 {\n DEFAULT_ATTRIBUTE_COLUMN,\n DEFAULT_UNIT_COLUMN,\n derivePropertyMeta,\n formatPropertyLabel,\n} from '../data/propertyLabels.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 propertyMeta,\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 meta = propertyMeta?.[track.property];\n const trackLabel = formatPropertyLabel(track.label || track.property, meta);\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 meta,\n });\n return {\n data: nextConfig.data,\n layout: applyDepthRange(nextConfig.layout, depthRange),\n };\n }, [depthRange, isCategorical, meta, 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 ${trackLabel}`));\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 trackLabel,\n isCategorical,\n ]);\n\n return (\n <section className=\"baselode-tool-strip-log__track\" aria-label={trackLabel}>\n <div className=\"baselode-tool-strip-log__track-title\">{trackLabel}</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}>\n {formatPropertyLabel(option, propertyMeta?.[option])}\n </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 propertyMeta,\n deriveMetaFromRows = false,\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 // Per-property unit / source metadata. Explicit `propertyMeta` always wins;\n // when `deriveMetaFromRows` is enabled, keys absent from `propertyMeta` are\n // back-filled from the rows' `analysis_uom` / `analyte_attribute` columns.\n // With neither supplied, output is identical to the pre-metadata behaviour.\n const resolvedPropertyMeta = useMemo(() => {\n const explicit = (propertyMeta && typeof propertyMeta === 'object') ? propertyMeta : null;\n if (!deriveMetaFromRows) return explicit ?? undefined;\n // Exclude the row-level metadata columns themselves so they don't count as\n // populated \"measurement\" properties when derivePropertyMeta checks each\n // row for a single unambiguous target.\n const allProperties = [...classified.numericCols, ...classified.categoricalCols]\n .filter((property) => property !== DEFAULT_UNIT_COLUMN && property !== DEFAULT_ATTRIBUTE_COLUMN);\n const derived = derivePropertyMeta(hole?.points || [], allProperties);\n if (!explicit) return derived;\n const merged = { ...derived };\n Object.entries(explicit).forEach(([key, value]) => {\n merged[key] = { ...derived[key], ...value };\n });\n return merged;\n }, [propertyMeta, deriveMetaFromRows, classified, hole]);\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 propertyMeta={resolvedPropertyMeta}\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","PropertyMetaSchema","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","propertyMeta","height","showModeBar","onTrackChange","onIntervalClick","onDepthRangeChange","ref","useRef","isCategorical","meta","trackLabel","formatPropertyLabel","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","deriveMetaFromRows","defaultDepthRange","onPropertyChange","classifyColumns","resolvedPropertyMeta","explicit","allProperties","DEFAULT_UNIT_COLUMN","DEFAULT_ATTRIBUTE_COLUMN","derived","derivePropertyMeta","merged","key","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.20",
3
+ "version": "0.1.22",
4
4
  "description": "Geoscience drillhole data processing and visualization toolkit",
5
5
  "license": "GPL-3.0-or-later",
6
6
  "repository": {