diff --git a/src/repl/repl-panel.js b/src/repl/repl-panel.js new file mode 100644 index 0000000..f9c8f6c --- /dev/null +++ b/src/repl/repl-panel.js @@ -0,0 +1,49 @@ +class ReplPanel { + constructor() { + this.panel = document.getElementById('bottom-panel'); + this.output = document.getElementById('repl-output'); + this.setupEventListeners(); + } + + setupEventListeners() { + document.getElementById('bottom-panel-toggle')?.addEventListener('click', () => this.toggle()); + document.getElementById('repl-clear')?.addEventListener('click', () => this.clear()); + } + + toggle() { + this.panel.classList.toggle('collapsed'); + const btn = document.getElementById('bottom-panel-toggle'); + if (btn) btn.textContent = this.panel.classList.contains('collapsed') ? '\u25BC' : '\u25B2'; + } + + show() { + this.panel.classList.remove('collapsed'); + const btn = document.getElementById('bottom-panel-toggle'); + if (btn) btn.textContent = '\u25B2'; + } + + clear() { + if (this.output) this.output.innerHTML = ''; + } + + appendOutput(command, result) { + const entry = document.createElement('div'); + entry.className = 'repl-entry'; + entry.innerHTML = ` +
\u25B6 ${command}
+ ${result.stdout ? `
${this.escapeHtml(result.stdout)}
` : ''} + ${result.stderr ? `
${this.escapeHtml(result.stderr)}
` : ''} + ${result.error ? `
Error: ${this.escapeHtml(result.error)}
` : ''} + `; + this.output?.appendChild(entry); + this.output?.scrollTo(0, this.output.scrollHeight); + } + + escapeHtml(text) { + const div = document.createElement('div'); + div.textContent = text; + return div.innerHTML; + } +} + +module.exports = { ReplPanel };