import { STATE, CONFIG } from '../core/State.js';
import { refreshHUDMetadata } from './HUD.js';
import { clearAllReliefs, renderComparison } from '../visualizer/ReliefRenderer.js';
import { showDimensionInspector, hideDimensionInspector } from '../visualizer/DimensionInspector.js';
import { showCustomModal } from './modals/CustomModal.js';
import { showNamingModal } from './modals/NamingModal.js';
import { buildReliefHUD } from './ReliefHUD.js';
import { buildPolarityPanel } from './panels/PolarityPanel.js';
import { buildTelemetryPanel } from './panels/TelemetryPanel.js';
import { buildVectorMathPanel } from './panels/VectorMathPanel.js';
import { buildThreadsPanel } from './panels/ThreadsPanel.js';
import { buildLayoutPanel } from './panels/LayoutPanel.js';
import { wireSaeMetricsPanel } from './panels/SaeMetricsPanel.js';
import { buildBookmarksPanel } from './panels/BookmarksPanel.js';
import { reliefIngestMarkup } from './panels/ReliefPanel.js';
import { initProgressPanel } from './panels/ProgressPanel.js';
import { OnboardingTour, autoStartOnboarding } from './OnboardingTour.js';
// Re-export shared utils so existing importers keep resolving them here.
export { showCustomModal, showNamingModal };
// Cross-panel refresh registry. Re-pointed to the active PanelContext.refresh on
// every createSidebar() call so the module-level applyComparison() (also exposed as
// window.applyComparison for DimensionInspector) can reach the relief panel's
// dimension-list refresher without a closure global.
let activeRefresh = {};
// Aplica el modo de comparación actual: modos A/B son 3D (renderComparison);
// el modo C es el panel 2D del inspector de dimensión. Punto único de entrada
// que la Sidebar invoca ante cualquier cambio (modo, docs, visibilidad, dim).
export function applyComparison() {
const scene = STATE.scene;
if (!scene) return;
if (STATE.comparisonMode === 'C') {
clearAllReliefs(scene);
if (!STATE.reliefInspectDims) STATE.reliefInspectDims = [];
const targetDim = STATE.reliefPinned ? STATE.reliefPinned.dimIndex : (STATE.reliefInspectDim || 0);
STATE.reliefInspectDim = targetDim;
if (!STATE.reliefInspectDims.some(d => d.dim === targetDim)) {
STATE.reliefInspectDims.push({ dim: targetDim, visible: true });
}
// Sync input field value
const inspectDimInput = document.getElementById('inspect-dim-input');
if (inspectDimInput) {
inspectDimInput.value = STATE.reliefInspectDim;
}
if (typeof activeRefresh.dimList === 'function') {
activeRefresh.dimList();
}
// El modo C reemplaza la escena 3D por el panel inspector 2D en fullscreen.
// Ocultar el HUD flotante de relieve y la lectura de coordenadas evita colisiones.
const hud = document.getElementById('relief-hud');
if (hud) hud.style.display = 'none';
const coords = document.getElementById('relief-coords');
if (coords) coords.style.display = 'none';
showDimensionInspector();
} else {
hideDimensionInspector();
renderComparison(scene);
}
}
export function createSidebar(onScan, onHunterQuery, onCalculate, onBatchLoad, onClearAll) {
// Cleanup old UI components
['hud-override', 'search-container', 'hunter-modal', 'arithmetic-panel', 'about-modal', 'hud-sidebar', 'app-modal-overlay'].forEach(id => {
const el = document.getElementById(id);
if (el) el.remove();
});
// PanelContext — the single contract handed to every panel builder. Shared
// state and cross-panel refresh flow through this object, not closure globals.
activeRefresh = {};
/** @type {import('./types.js').PanelContext} */
const ctx = {
STATE, CONFIG,
onScan, onHunterQuery, onCalculate, onBatchLoad, onClearAll,
applyComparison, showCustomModal, showNamingModal,
refresh: activeRefresh,
};
// Seam read by visualizer/DimensionInspector.js (set synchronously, as before).
window.applyComparison = applyComparison;
// Create Sidebar container using CSS classes
const sidebar = document.createElement('div');
sidebar.id = 'hud-sidebar';
sidebar.className = 'app-panel app-sidebar';
// Prevent propagation to 3D controls
['mousedown', 'click', 'keydown', 'keyup'].forEach(evt => {
sidebar.addEventListener(evt, (e) => e.stopPropagation());
});
// 1. Header (System Info and Telemetry status)
const header = document.createElement('div');
header.className = 'section-card';
header.innerHTML = `