diff --git a/src/main/main.ts b/src/main/main.ts index a52a337..e326b9e 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -48,6 +48,7 @@ function createWindow(): void { minHeight: 600, title: 'Blogging Desktop Server', backgroundColor: '#1e1e1e', // VS Code dark background + titleBarStyle: process.platform === 'darwin' ? 'hiddenInset' : 'default', webPreferences: { preload: path.join(__dirname, 'preload.js'), nodeIntegration: false, diff --git a/src/renderer/App.tsx b/src/renderer/App.tsx index a368d24..b54c315 100644 --- a/src/renderer/App.tsx +++ b/src/renderer/App.tsx @@ -1,5 +1,5 @@ import React, { useEffect } from 'react'; -import { ActivityBar, Sidebar, Editor, StatusBar, Panel, TabBar, ToastContainer, showToast, ResizablePanel } from './components'; +import { ActivityBar, Sidebar, Editor, StatusBar, Panel, TabBar, ToastContainer, showToast, ResizablePanel, WindowTitleBar } from './components'; import { useAppStore, PostData, MediaData, TaskProgress } from './store'; import { loadTabsForProject, saveTabsForProject } from './utils'; import './App.css'; @@ -315,6 +315,7 @@ const App: React.FC = () => { return (
+
{sidebarVisible && ( diff --git a/src/renderer/components/TabBar/TabBar.css b/src/renderer/components/TabBar/TabBar.css index b2f14ac..b0ed5e5 100644 --- a/src/renderer/components/TabBar/TabBar.css +++ b/src/renderer/components/TabBar/TabBar.css @@ -45,29 +45,6 @@ background-color: var(--vscode-toolbar-hoverBackground, rgba(90, 93, 94, 0.31)); } -/* Sidebar toggle button */ -.tab-bar-toggle-sidebar { - display: flex; - align-items: center; - justify-content: center; - width: 35px; - height: 100%; - background-color: transparent; - border: none; - border-right: 1px solid var(--vscode-tab-border, #252526); - color: var(--vscode-icon-foreground, #c5c5c5); - cursor: pointer; - flex-shrink: 0; -} - -.tab-bar-toggle-sidebar:hover { - background-color: var(--vscode-toolbar-hoverBackground, rgba(90, 93, 94, 0.31)); -} - -.tab-bar-toggle-sidebar:active { - background-color: var(--vscode-toolbar-activeBackground, rgba(99, 102, 103, 0.31)); -} - .tab-scroll-left { border-right: 1px solid var(--vscode-tab-border, #252526); } diff --git a/src/renderer/components/TabBar/TabBar.tsx b/src/renderer/components/TabBar/TabBar.tsx index 754e16d..e1663af 100644 --- a/src/renderer/components/TabBar/TabBar.tsx +++ b/src/renderer/components/TabBar/TabBar.tsx @@ -161,7 +161,6 @@ export const TabBar: React.FC = () => { media, activeProject, dirtyPosts, - sidebarVisible, toggleSidebar, setActiveTab, closeTab, @@ -475,18 +474,6 @@ export const TabBar: React.FC = () => { return (
- - {showLeftArrow && ( +
+
+ ); +}; + +export default WindowTitleBar; \ No newline at end of file diff --git a/src/renderer/components/WindowTitleBar/index.ts b/src/renderer/components/WindowTitleBar/index.ts new file mode 100644 index 0000000..0576a0b --- /dev/null +++ b/src/renderer/components/WindowTitleBar/index.ts @@ -0,0 +1 @@ +export { WindowTitleBar } from './WindowTitleBar'; diff --git a/src/renderer/components/index.ts b/src/renderer/components/index.ts index aa982f3..0a3ea90 100644 --- a/src/renderer/components/index.ts +++ b/src/renderer/components/index.ts @@ -22,3 +22,4 @@ export { AISuggestionsModal, type AISuggestions, type CurrentValues } from './AI export { ChatPanel } from './ChatPanel'; export { ImportAnalysisView } from './ImportAnalysisView'; export { InsertModal } from './InsertModal'; +export { WindowTitleBar } from './WindowTitleBar'; diff --git a/tests/renderer/components/WindowTitleBar.test.tsx b/tests/renderer/components/WindowTitleBar.test.tsx new file mode 100644 index 0000000..242d5b3 --- /dev/null +++ b/tests/renderer/components/WindowTitleBar.test.tsx @@ -0,0 +1,38 @@ +import React from 'react'; +import { describe, it, expect, beforeEach } from 'vitest'; +import { fireEvent, render, screen } from '@testing-library/react'; +import { WindowTitleBar } from '../../../src/renderer/components/WindowTitleBar/WindowTitleBar'; +import { useAppStore } from '../../../src/renderer/store'; + +describe('WindowTitleBar', () => { + beforeEach(() => { + useAppStore.setState({ + sidebarVisible: true, + }); + }); + + it('renders a right-side sidebar toggle button and toggles store state', () => { + render(); + + const toggleButton = screen.getByLabelText('Toggle Sidebar'); + expect(toggleButton).toBeInTheDocument(); + expect(toggleButton).toHaveAttribute('title', 'Hide Sidebar (Ctrl+B)'); + + fireEvent.click(toggleButton); + + expect(useAppStore.getState().sidebarVisible).toBe(false); + expect(toggleButton).toHaveAttribute('title', 'Show Sidebar (Ctrl+B)'); + }); + + it('uses a VS Code-like sidebar toggle icon shape', () => { + render(); + + const toggleButton = screen.getByLabelText('Toggle Sidebar'); + const svg = toggleButton.querySelector('svg'); + const paths = svg?.querySelectorAll('path'); + + expect(svg).not.toBeNull(); + expect(paths?.[0]?.getAttribute('d')).toBe('M3 3.75A1.75 1.75 0 0 1 4.75 2h6.5A1.75 1.75 0 0 1 13 3.75v8.5A1.75 1.75 0 0 1 11.25 14h-6.5A1.75 1.75 0 0 1 3 12.25v-8.5z'); + expect(paths?.[1]?.getAttribute('d')).toBe('M4.5 3.5h3.75v9H4.5z'); + }); +});