diff --git a/src/sidebar/explorer-panel.js b/src/sidebar/explorer-panel.js
new file mode 100644
index 0000000..6ac0713
--- /dev/null
+++ b/src/sidebar/explorer-panel.js
@@ -0,0 +1,70 @@
+const path = require('path');
+
+function renderExplorerPanel(container, { listDirectory, onFileOpen, currentDir }) {
+ container.innerHTML = `
+
+ `;
+
+ document.getElementById('explorer-browse')?.addEventListener('click', async () => {
+ const dir = await listDirectory(null); // null means open folder dialog
+ if (dir) {
+ document.getElementById('explorer-path').value = dir.path;
+ renderTree(document.getElementById('explorer-tree'), dir.entries, listDirectory, onFileOpen, dir.path);
+ }
+ });
+
+ if (currentDir) {
+ listDirectory(currentDir).then(dir => {
+ if (dir) renderTree(document.getElementById('explorer-tree'), dir.entries, listDirectory, onFileOpen, currentDir);
+ });
+ }
+}
+
+function renderTree(container, entries, listDirectory, onFileOpen, basePath) {
+ container.innerHTML = entries.map(entry => {
+ if (entry.isDirectory) {
+ return ``;
+ }
+ return `
+ ${getFileIcon(entry.name)}
+ ${entry.name}
+
`;
+ }).join('');
+
+ container.querySelectorAll('.tree-folder').forEach(el => {
+ el.querySelector('.tree-name').addEventListener('click', async () => {
+ const isCollapsed = el.classList.contains('collapsed');
+ if (isCollapsed) {
+ const dir = await listDirectory(el.dataset.path);
+ if (dir) {
+ const childContainer = el.querySelector('.tree-children');
+ renderTree(childContainer, dir.entries, listDirectory, onFileOpen, el.dataset.path);
+ }
+ }
+ el.classList.toggle('collapsed');
+ el.querySelector('.tree-icon').textContent = el.classList.contains('collapsed') ? '\u25B6' : '\u25BC';
+ });
+ });
+
+ container.querySelectorAll('.tree-file').forEach(el => {
+ el.addEventListener('click', () => onFileOpen(el.dataset.path));
+ });
+}
+
+function getFileIcon(filename) {
+ const ext = filename.split('.').pop().toLowerCase();
+ const icons = { md: '\u{1F4DD}', js: '\u{1F4DC}', json: '{}', html: '\u{1F310}', css: '\u{1F3A8}', py: '\u{1F40D}', pdf: '\u{1F4D5}', txt: '\u{1F4C4}' };
+ return icons[ext] || '\u{1F4C4}';
+}
+
+module.exports = { renderExplorerPanel };