Skip to content

Commit c11ae99

Browse files
author
Brendan Gray
committed
feat: Monolith concept structural implementation - title bar 28px, activity bar 40px, status bar 20px, chat header 32px, accent tab underlines, user bubble styling, scrollbars, q-is-not-defined fix, OAuth timeout
1 parent 0e7ab3a commit c11ae99

7 files changed

Lines changed: 181 additions & 118 deletions

File tree

main/agenticChat.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ function register(ctx) {
295295
mainWindow.webContents.send('agentic-progress', { iteration, maxIterations: MAX_CLOUD_ITERATIONS });
296296
}
297297
if (mainWindow) mainWindow.webContents.send('llm-iteration-begin');
298-
q
298+
299299
// Token batching for cloud
300300
const tokenFlushMs = isBundledCloudProvider ? 50 : 25;
301301
const charsPerFlush = isBundledCloudProvider ? 4 : undefined;

src/components/Chat/ChatPanel.tsx

Lines changed: 96 additions & 43 deletions
Large diffs are not rendered by default.

src/components/Editor/TabBar.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,10 +190,11 @@ export const TabBar: React.FC<TabBarProps> = ({
190190
className={cn(
191191
'flex items-center group min-w-0 max-w-xs px-3 py-2 border-r border-border cursor-pointer transition-colors',
192192
'hover:bg-background-tertiary',
193-
isActive && 'bg-background border-t-2 border-t-border-focus',
193+
isActive && 'bg-background border-b-2',
194194
isDragged && 'opacity-50',
195-
isDragOver && 'bg-background-tertiary border-t-2 border-t-info'
195+
isDragOver && 'bg-background-tertiary border-b-2 border-b-info'
196196
)}
197+
style={isActive ? { borderBottomColor: 'var(--theme-accent)' } : undefined}
197198
onClick={() => handleTabClick(tab.id)}
198199
onAuxClick={(e) => handleTabMiddleClick(e, tab.id)}
199200
onKeyDown={(e) => handleKeyDown(e, tab.id)}

src/components/Layout/Layout.tsx

Lines changed: 39 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@ export const Layout: React.FC = () => {
5151
const [rootPath, setRootPath] = useState<string>('');
5252
const [sidebarView, setSidebarView] = useState<SidebarView>('explorer');
5353
const [sidebarVisible, setSidebarVisible] = useState(true);
54-
const [sidebarWidth, setSidebarWidth] = useState(260);
54+
const [sidebarWidth, setSidebarWidth] = useState(240);
5555
const [chatVisible, setChatVisible] = useState(true);
56-
const [chatWidth, setChatWidth] = useState(340);
56+
const [chatWidth, setChatWidth] = useState(320);
5757
const [terminalVisible, setTerminalVisible] = useState(true);
5858
const [terminalHeight, setTerminalHeight] = useState(250);
5959
const [_editorHasOpenTabs, setEditorHasOpenTabs] = useState(false);
@@ -216,13 +216,13 @@ export const Layout: React.FC = () => {
216216
rafId = null;
217217
if (type === 'sidebar') {
218218
// Cap sidebar so center panel always keeps MIN_CENTER_WIDTH
219-
// 48px activity bar + 4px handle + chatWidth + 4px handle = right-side overhead
220-
const maxSidebar = window.innerWidth - 48 - 8 - chatWidth - MIN_CENTER_WIDTH;
221-
setSidebarWidth(Math.max(180, Math.min(500, maxSidebar, e.clientX - 48)));
219+
// 40px activity bar + 4px handle + chatWidth + 4px handle = right-side overhead
220+
const maxSidebar = window.innerWidth - 40 - 8 - chatWidth - MIN_CENTER_WIDTH;
221+
setSidebarWidth(Math.max(180, Math.min(500, maxSidebar, e.clientX - 40)));
222222
} else if (type === 'chat') {
223223
// Cap chat so the center panel always keeps MIN_CENTER_WIDTH
224-
// 48px activity bar + sidebarWidth + 8px handles
225-
const maxChatBySpace = Math.max(280, window.innerWidth - 48 - sidebarWidth - 8 - MIN_CENTER_WIDTH);
224+
// 40px activity bar + sidebarWidth + 8px handles
225+
const maxChatBySpace = Math.max(280, window.innerWidth - 40 - sidebarWidth - 8 - MIN_CENTER_WIDTH);
226226
setChatWidth(Math.max(280, Math.min(600, maxChatBySpace, window.innerWidth - e.clientX)));
227227
}
228228
else if (type === 'terminal') setTerminalHeight(Math.max(100, Math.min(600, window.innerHeight - e.clientY - 24)));
@@ -376,11 +376,11 @@ export const Layout: React.FC = () => {
376376
return (
377377
<div className="flex flex-col h-screen overflow-hidden" style={{ backgroundColor: 'var(--theme-bg)', color: 'var(--theme-foreground)' }}>
378378
{/* Title Bar with Menu */}
379-
<div className="h-[34px] flex items-center select-none flex-shrink-0 relative z-50"
379+
<div className="h-[28px] flex items-center select-none flex-shrink-0 relative z-50"
380380
style={{ backgroundColor: 'var(--theme-title-bar)', WebkitAppRegion: 'drag' } as any}>
381-
<div className="flex items-center text-[12px]" style={{ color: 'var(--theme-foreground)', opacity: 0.8, WebkitAppRegion: 'no-drag' } as any}>
382-
<span className="px-2 flex items-center" title="guIDE by Brendan Gray">
383-
<img src="zzz.png" alt="guIDE" className="w-5 h-5" style={{ filter: 'brightness(1.2)' }} />
381+
<div className="flex items-center text-[11px]" style={{ color: 'var(--theme-foreground)', opacity: 0.8, WebkitAppRegion: 'no-drag' } as any}>
382+
<span className="px-1.5 flex items-center" title="guIDE by Brendan Gray">
383+
<img src="zzz.png" alt="guIDE" className="w-4 h-4" style={{ filter: 'brightness(1.2)' }} />
384384
</span>
385385
<MenuBar onAction={handleMenuAction} />
386386
</div>
@@ -390,12 +390,12 @@ export const Layout: React.FC = () => {
390390
style={{ WebkitAppRegion: 'no-drag' } as any}
391391
>
392392
<button
393-
className="flex items-center gap-2 h-[22px] rounded transition-all px-3 hover:opacity-100"
393+
className="flex items-center gap-2 h-[20px] rounded-[3px] transition-all px-2.5 hover:opacity-100"
394394
style={{
395395
backgroundColor: 'var(--theme-input-bg, rgba(255,255,255,0.06))',
396396
border: '1px solid var(--theme-border, rgba(255,255,255,0.10))',
397397
color: 'var(--theme-foreground-muted)',
398-
width: 'clamp(220px, 30vw, 440px)',
398+
width: 'clamp(200px, 28vw, 400px)',
399399
opacity: 0.75,
400400
}}
401401
onClick={() => handleMenuAction('command-palette')}
@@ -413,43 +413,43 @@ export const Layout: React.FC = () => {
413413
{/* VS Code–style layout toggle buttons */}
414414
<div className="flex items-center gap-0.5 mr-2" style={{ WebkitAppRegion: 'no-drag' } as any}>
415415
<button
416-
className="w-[28px] h-[28px] flex items-center justify-center rounded hover:bg-[#ffffff15] transition-colors"
416+
className="w-[24px] h-[24px] flex items-center justify-center rounded hover:bg-[#ffffff15] transition-colors"
417417
style={{ color: sidebarVisible ? 'var(--theme-foreground)' : 'var(--theme-foreground-muted)' }}
418418
onClick={() => setSidebarVisible(v => !v)}
419419
title="Toggle Primary Sidebar (Ctrl+B)"
420420
>
421-
<PanelLeft size={14} />
421+
<PanelLeft size={13} />
422422
</button>
423423
<button
424-
className="w-[28px] h-[28px] flex items-center justify-center rounded hover:bg-[#ffffff15] transition-colors"
424+
className="w-[24px] h-[24px] flex items-center justify-center rounded hover:bg-[#ffffff15] transition-colors"
425425
style={{ color: terminalVisible ? 'var(--theme-foreground)' : 'var(--theme-foreground-muted)' }}
426426
onClick={() => setTerminalVisible(v => !v)}
427427
title="Toggle Panel (Ctrl+J)"
428428
>
429-
<PanelBottom size={14} />
429+
<PanelBottom size={13} />
430430
</button>
431431
<button
432-
className="w-[28px] h-[28px] flex items-center justify-center rounded hover:bg-[#ffffff15] transition-colors"
432+
className="w-[24px] h-[24px] flex items-center justify-center rounded hover:bg-[#ffffff15] transition-colors"
433433
style={{ color: chatVisible ? 'var(--theme-foreground)' : 'var(--theme-foreground-muted)' }}
434434
onClick={() => setChatVisible(v => !v)}
435435
title="Toggle Secondary Sidebar (Ctrl+L)"
436436
>
437-
<PanelRight size={14} />
437+
<PanelRight size={13} />
438438
</button>
439439
</div>
440440
{currentFile && <span className="text-[12px] mr-2 truncate max-w-[150px] flex-shrink" style={{ color: 'var(--theme-foreground)', opacity: 0.4 }}>{currentFile.split(/[/\\]/).pop()}</span>}
441-
<span className="text-[10px] mr-[140px] select-none brand-font flex-shrink-0" style={{ color: 'var(--theme-foreground)', opacity: 0.2 }} title="guIDE by Brendan Gray">guIDE</span>
441+
<span className="text-[9px] mr-[140px] select-none brand-font flex-shrink-0" style={{ color: 'var(--theme-foreground)', opacity: 0.15 }} title="guIDE by Brendan Gray">guIDE</span>
442442
</div>
443443

444444
{/* Main */}
445445
<div className="flex flex-1 min-h-0">
446446
{/* Activity Bar */}
447-
<div className="w-[48px] flex flex-col items-center py-0 flex-shrink-0" style={{ backgroundColor: 'var(--theme-activity-bar)', borderRight: '1px solid var(--theme-sidebar-border)', overflow: 'visible', position: 'relative', zIndex: 10 }}>
447+
<div className="w-[40px] flex flex-col items-center py-0 flex-shrink-0" style={{ backgroundColor: 'var(--theme-activity-bar)', borderRight: '1px solid var(--theme-sidebar-border)', overflow: 'visible', position: 'relative', zIndex: 10 }}>
448448
{/* Primary icons */}
449449
{primaryBarItems.map(item => (
450450
<button
451451
key={item.id}
452-
className="w-[48px] h-[48px] flex items-center justify-center transition-all duration-150 flex-shrink-0 relative"
452+
className="w-[40px] h-[40px] flex items-center justify-center transition-all duration-150 flex-shrink-0 relative"
453453
style={{
454454
color: sidebarView === item.id && sidebarVisible ? 'var(--theme-foreground)' : 'var(--theme-foreground-muted)',
455455
backgroundColor: 'transparent',
@@ -464,13 +464,13 @@ export const Layout: React.FC = () => {
464464
{sidebarView === item.id && sidebarVisible && (
465465
<div className="absolute left-0 top-[25%] w-[2px] h-[50%] rounded-r" style={{ backgroundColor: 'var(--theme-accent)' }} />
466466
)}
467-
<item.icon size={22} />
467+
<item.icon size={18} />
468468
</button>
469469
))}
470470
{/* More Tools button */}
471471
<div className="relative flex-shrink-0">
472472
<button
473-
className="w-[48px] h-[48px] flex items-center justify-center transition-all duration-150 relative"
473+
className="w-[40px] h-[40px] flex items-center justify-center transition-all duration-150 relative"
474474
style={{
475475
color: isMoreToolActive || moreToolsOpen ? 'var(--theme-foreground)' : 'var(--theme-foreground-muted)',
476476
}}
@@ -479,13 +479,13 @@ export const Layout: React.FC = () => {
479479
aria-label="More Tools"
480480
>
481481
{(isMoreToolActive || moreToolsOpen) && <div className="absolute left-0 top-[25%] w-[2px] h-[50%] rounded-r" style={{ backgroundColor: 'var(--theme-accent)' }} />}
482-
<MoreHorizontal size={22} />
482+
<MoreHorizontal size={18} />
483483
</button>
484484
{/* More Tools popover */}
485485
{moreToolsOpen && (
486486
<>
487487
<div className="fixed inset-0 z-40" onClick={() => { setMoreToolsOpen(false); notifyBrowserOverlay(false); }} />
488-
<div className="absolute left-[48px] top-0 z-50 py-1 rounded-r-lg shadow-xl min-w-[180px] glass"
488+
<div className="absolute left-[40px] top-0 z-50 py-1 rounded-r-lg shadow-xl min-w-[180px] glass"
489489
style={{ backgroundColor: 'color-mix(in srgb, var(--theme-bg-secondary) 85%, transparent)', border: '1px solid color-mix(in srgb, var(--theme-border) 60%, transparent)' }}>
490490
{moreToolsItems.map(item => (
491491
<button
@@ -514,16 +514,16 @@ export const Layout: React.FC = () => {
514514
</div>
515515
<div className="flex-1" />
516516
<button
517-
className="w-[48px] h-[48px] flex items-center justify-center transition-colors"
517+
className="w-[40px] h-[40px] flex items-center justify-center transition-colors"
518518
style={{ color: 'var(--theme-foreground-muted)', borderLeft: '2px solid transparent' }}
519519
onClick={() => editorRef.current?.openBrowserTab()}
520520
title="Browser"
521521
aria-label="Browser"
522522
>
523-
<Globe size={24} />
523+
<Globe size={18} />
524524
</button>
525525
<button
526-
className="w-[48px] h-[48px] flex items-center justify-center transition-all duration-150 relative"
526+
className="w-[40px] h-[40px] flex items-center justify-center transition-all duration-150 relative"
527527
style={{
528528
color: chatVisible ? 'var(--theme-foreground)' : 'var(--theme-foreground-muted)',
529529
}}
@@ -532,10 +532,10 @@ export const Layout: React.FC = () => {
532532
aria-label="AI Chat"
533533
>
534534
{chatVisible && <div className="absolute left-0 top-[25%] w-[2px] h-[50%] rounded-r" style={{ backgroundColor: 'var(--theme-accent)' }} />}
535-
<MessageSquare size={22} />
535+
<MessageSquare size={18} />
536536
</button>
537537
<button
538-
className="w-[48px] h-[48px] flex items-center justify-center transition-all duration-150 relative"
538+
className="w-[40px] h-[40px] flex items-center justify-center transition-all duration-150 relative"
539539
style={{
540540
color: sidebarView === 'benchmark' && sidebarVisible ? 'var(--theme-foreground)' : 'var(--theme-foreground-muted)',
541541
}}
@@ -547,19 +547,19 @@ export const Layout: React.FC = () => {
547547
aria-label="Model Benchmark"
548548
>
549549
{sidebarView === 'benchmark' && sidebarVisible && <div className="absolute left-0 top-[25%] w-[2px] h-[50%] rounded-r" style={{ backgroundColor: 'var(--theme-accent)' }} />}
550-
<BarChart3 size={22} />
550+
<BarChart3 size={18} />
551551
</button>
552552
<button
553-
className="w-[48px] h-[48px] flex items-center justify-center transition-colors"
553+
className="w-[40px] h-[40px] flex items-center justify-center transition-colors"
554554
style={{ color: showThemePicker ? 'var(--theme-accent)' : 'var(--theme-foreground-muted)', borderLeft: '2px solid transparent' }}
555555
onClick={() => { setShowThemePicker(v => { const next = !v; notifyBrowserOverlay(next); return next; }); }}
556556
title="Theme"
557557
aria-label="Theme"
558558
>
559-
<Palette size={22} />
559+
<Palette size={18} />
560560
</button>
561561
<button
562-
className="w-[48px] h-[48px] flex items-center justify-center transition-all duration-150 relative group"
562+
className="w-[40px] h-[40px] flex items-center justify-center transition-all duration-150 relative group"
563563
style={{
564564
color: sidebarView === 'account' && sidebarVisible ? 'var(--theme-foreground)' : 'var(--theme-foreground-muted)',
565565
}}
@@ -572,12 +572,12 @@ export const Layout: React.FC = () => {
572572
>
573573
{sidebarView === 'account' && sidebarVisible && <div className="absolute left-0 top-[25%] w-[2px] h-[50%] rounded-r" style={{ backgroundColor: 'var(--theme-accent)' }} />}
574574
<div className="relative">
575-
<UserCircle size={24} />
575+
<UserCircle size={18} />
576576
<span className="absolute -top-1 -right-1 w-3 h-3 rounded-full animate-pulse" style={{ backgroundColor: 'var(--theme-accent)', boxShadow: '0 0 8px var(--theme-accent)' }} />
577577
</div>
578578
</button>
579579
<button
580-
className="w-[48px] h-[48px] flex items-center justify-center transition-colors"
580+
className="w-[40px] h-[40px] flex items-center justify-center transition-colors"
581581
style={{
582582
color: 'var(--theme-foreground-muted)',
583583
borderRadius: '8px',
@@ -586,7 +586,7 @@ export const Layout: React.FC = () => {
586586
title="Advanced Settings (Ctrl+,)"
587587
aria-label="Advanced Settings"
588588
>
589-
<Settings size={22} />
589+
<Settings size={18} />
590590
</button>
591591
</div>
592592

@@ -596,7 +596,7 @@ export const Layout: React.FC = () => {
596596
<>
597597
{/* Sidebar — always mounted so panels stay alive; width animates open/close */}
598598
<div className="flex flex-col flex-shrink-0 overflow-hidden" style={{ width: sidebarVisible ? sidebarWidth : 0, backgroundColor: 'var(--theme-sidebar)', borderRight: sidebarVisible ? '1px solid var(--theme-sidebar-border)' : 'none', transition: 'width 200ms cubic-bezier(0.4,0,0.2,1)', boxShadow: sidebarVisible ? '2px 0 8px rgba(0,0,0,0.28)' : 'none' }}>
599-
<div className="h-[30px] flex items-center px-4 text-[11px] font-semibold uppercase tracking-wider flex-shrink-0" style={{ color: 'var(--theme-foreground-subtle)', borderBottom: '1px solid var(--theme-sidebar-border)' }}>
599+
<div className="h-[28px] flex items-center px-4 text-[10px] font-semibold uppercase tracking-wider flex-shrink-0" style={{ color: 'var(--theme-foreground-subtle)', borderBottom: '1px solid var(--theme-sidebar-border)' }}>
600600
{sidebarView === 'explorer' && 'Explorer'}
601601
{sidebarView === 'search' && 'Search'}
602602
{sidebarView === 'git' && 'Source Control'}

src/components/Layout/StatusBar.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ export const StatusBar: React.FC<StatusBarProps> = ({
185185
const ctxPct = contextUsage.total > 0 ? Math.round((contextUsage.used / contextUsage.total) * 100) : 0;
186186

187187
return (
188-
<div className="h-[24px] flex items-center justify-between px-2 text-[12px] select-none flex-shrink-0 overflow-hidden" style={{ backgroundColor: 'var(--theme-status-bar)', borderTop: '1px solid var(--theme-border)', color: 'var(--theme-status-bar-fg)' }}>
188+
<div className="h-[20px] flex items-center justify-between px-1.5 text-[10px] select-none flex-shrink-0 overflow-hidden" style={{ backgroundColor: 'var(--theme-status-bar)', borderTop: '1px solid var(--theme-border)', color: 'var(--theme-status-bar-fg)' }}>
189189
{/* Left */}
190190
<div className="flex items-center gap-2 flex-shrink-0">
191191
{/* Git branch */}

0 commit comments

Comments
 (0)