Skip to content

Commit bbb4e35

Browse files
ozgesolidkeyclaude
andcommitted
Add resizable sidebar with drag handle
Adds a horizontal resize handle between the sidebar and main content area, allowing users to adjust sidebar width by dragging. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 39951f2 commit bbb4e35

3 files changed

Lines changed: 86 additions & 2 deletions

File tree

src/renderer/index.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,11 +167,15 @@
167167
<button id="btn-terminal-toggle" class="section-btn" title="Toggle Terminal (Ctrl+`)"></button>
168168
</div>
169169
<div id="terminal-panel" class="terminal-section-content hidden">
170+
<div id="terminal-resize-handle" class="terminal-resize-handle"></div>
170171
<div id="terminal-container" class="terminal-container"></div>
171172
</div>
172173
</div>
173174
</aside>
174175

176+
<!-- Sidebar Resize Handle -->
177+
<div id="sidebar-resize-handle" class="sidebar-resize-handle"></div>
178+
175179
<!-- Log Viewer -->
176180
<main class="log-viewer">
177181
<div id="editor-container" class="editor-container">

src/renderer/renderer.ts

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,8 +352,11 @@ const elements = {
352352
// Terminal
353353
terminalPanel: document.getElementById('terminal-panel') as HTMLDivElement,
354354
terminalContainer: document.getElementById('terminal-container') as HTMLDivElement,
355+
terminalResizeHandle: document.getElementById('terminal-resize-handle') as HTMLDivElement,
355356
btnTerminalToggle: document.getElementById('btn-terminal-toggle') as HTMLButtonElement,
356357
sectionTerminal: document.getElementById('section-terminal') as HTMLDivElement,
358+
// Sidebar resize
359+
sidebarResizeHandle: document.getElementById('sidebar-resize-handle') as HTMLDivElement,
357360
};
358361

359362
// Virtual Log Viewer
@@ -3700,6 +3703,47 @@ function init(): void {
37003703
// Terminal
37013704
elements.btnTerminalToggle.addEventListener('click', toggleTerminal);
37023705

3706+
// Sidebar resize (horizontal)
3707+
let isResizingSidebar = false;
3708+
let sidebarStartX = 0;
3709+
let sidebarStartWidth = 0;
3710+
3711+
elements.sidebarResizeHandle.addEventListener('mousedown', (e) => {
3712+
isResizingSidebar = true;
3713+
sidebarStartX = e.clientX;
3714+
sidebarStartWidth = elements.sidebar.offsetWidth;
3715+
elements.sidebarResizeHandle.classList.add('dragging');
3716+
document.body.style.cursor = 'ew-resize';
3717+
document.body.style.userSelect = 'none';
3718+
e.preventDefault();
3719+
});
3720+
3721+
document.addEventListener('mousemove', (e) => {
3722+
if (!isResizingSidebar) return;
3723+
3724+
const deltaX = e.clientX - sidebarStartX;
3725+
const newWidth = Math.max(200, Math.min(window.innerWidth * 0.5, sidebarStartWidth + deltaX));
3726+
elements.sidebar.style.width = `${newWidth}px`;
3727+
3728+
// Resize terminal to fit new width if visible
3729+
if (fitAddon && state.terminalVisible) {
3730+
fitAddon.fit();
3731+
const dims = fitAddon.proposeDimensions();
3732+
if (dims) {
3733+
window.api.terminalResize(dims.cols, dims.rows);
3734+
}
3735+
}
3736+
});
3737+
3738+
document.addEventListener('mouseup', () => {
3739+
if (isResizingSidebar) {
3740+
isResizingSidebar = false;
3741+
elements.sidebarResizeHandle.classList.remove('dragging');
3742+
document.body.style.cursor = '';
3743+
document.body.style.userSelect = '';
3744+
}
3745+
});
3746+
37033747
// Search
37043748
elements.btnSearch.addEventListener('click', performSearch);
37053749
elements.btnPrevResult.addEventListener('click', () => {

src/renderer/styles.css

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,24 @@ body {
234234
overflow: hidden;
235235
}
236236

237+
.sidebar-resize-handle {
238+
width: 6px;
239+
background: var(--bg-secondary);
240+
cursor: ew-resize;
241+
flex-shrink: 0;
242+
border-right: 1px solid var(--border-color);
243+
transition: background 0.15s;
244+
}
245+
246+
.sidebar-resize-handle:hover,
247+
.sidebar-resize-handle.dragging {
248+
background: var(--accent-color);
249+
}
250+
251+
.sidebar.collapsed + .sidebar-resize-handle {
252+
display: none;
253+
}
254+
237255
.sidebar-section {
238256
border-bottom: 1px solid var(--border-color);
239257
}
@@ -1792,19 +1810,37 @@ kbd {
17921810
/* Terminal Section in Sidebar */
17931811
.terminal-section-content {
17941812
height: 250px;
1795-
min-height: 150px;
1813+
min-height: 100px;
1814+
max-height: 80vh;
17961815
background: var(--bg-primary);
17971816
border-top: 1px solid var(--border-color);
1817+
display: flex;
1818+
flex-direction: column;
17981819
}
17991820

18001821
.terminal-section-content.hidden {
18011822
display: none;
18021823
}
18031824

1825+
.terminal-resize-handle {
1826+
height: 6px;
1827+
background: var(--bg-secondary);
1828+
cursor: ns-resize;
1829+
flex-shrink: 0;
1830+
border-bottom: 1px solid var(--border-color);
1831+
transition: background 0.15s;
1832+
}
1833+
1834+
.terminal-resize-handle:hover,
1835+
.terminal-resize-handle.dragging {
1836+
background: var(--accent-color);
1837+
}
1838+
18041839
.terminal-container {
1805-
height: 100%;
1840+
flex: 1;
18061841
padding: 4px;
18071842
overflow: hidden;
1843+
min-height: 0;
18081844
}
18091845

18101846
.terminal-container .xterm {

0 commit comments

Comments
 (0)