// Control panel: mode toggle, buttons, status display export class Controls { constructor(container, callbacks) { this.callbacks = callbacks; this.mode = 'examples'; // 'examples' or 'rl' this.el = container; this.build(); } build() { this.el.innerHTML = `
Examples: 0
`; // Mode toggle this.el.querySelectorAll('.mode-btn').forEach(btn => { btn.addEventListener('click', () => this.setMode(btn.dataset.mode)); }); // Examples mode buttons this.el.querySelector('#btn-add').addEventListener('click', () => this.callbacks.onAddExample?.()); this.el.querySelector('#btn-train').addEventListener('click', () => this.callbacks.onTrain?.()); this.el.querySelector('#btn-randomize').addEventListener('click', () => this.callbacks.onRandomize?.()); this.el.querySelector('#btn-clear').addEventListener('click', () => this.callbacks.onClear?.()); // RL mode buttons this.el.querySelector('#btn-thumbsup').addEventListener('click', () => this.callbacks.onThumbsUp?.()); this.el.querySelector('#btn-thumbsdown').addEventListener('click', () => this.callbacks.onThumbsDown?.()); this.el.querySelector('#btn-rl-randomize').addEventListener('click', () => this.callbacks.onRandomize?.()); this.el.querySelector('#btn-rl-clear').addEventListener('click', () => this.callbacks.onClear?.()); } setMode(mode) { this.mode = mode; this.el.querySelectorAll('.mode-btn').forEach(btn => { btn.classList.toggle('active', btn.dataset.mode === mode); }); this.el.querySelector('#controls-examples').classList.toggle('hidden', mode !== 'examples'); this.el.querySelector('#controls-rl').classList.toggle('hidden', mode !== 'rl'); this.el.querySelector('#status-noise').classList.toggle('hidden', mode !== 'rl'); this.callbacks.onModeChange?.(mode); } updateStatus(exampleCount, loss, noiseLevel) { this.el.querySelector('#status-examples').textContent = `Examples: ${exampleCount}`; if (loss !== null && loss !== undefined) { this.el.querySelector('#status-loss').textContent = `Loss: ${loss.toFixed(5)}`; } if (noiseLevel !== undefined) { this.el.querySelector('#status-noise').textContent = `Noise: ${noiseLevel.toFixed(3)}`; } } }