first version of self-rendering title bar

This commit is contained in:
fanlumaster committed 2026-03-27 00:18:18 +08:00
1 parent 9b1838b438
commit 623b3f15fa
2 files changed
+53 -5

No files matched your search

@@ -14,13 +14,13 @@
<span class="window-title">Settings</span>
</div>
<div class="titlebar-right window-controls" aria-label="Window controls">
<button class="window-button minimize" aria-label="Minimize window" data-tooltip="Minimize">
<button id="btn-minimize" class="window-button minimize" aria-label="Minimize window" data-tooltip="Minimize">
<img class="window-icon" src="/assets/minimize.svg" alt="" />
</button>
<button class="window-button maximize" aria-label="Maximize window" data-tooltip="Maximize">
<button id="btn-maximize" class="window-button maximize" aria-label="Maximize window" data-tooltip="Maximize">
<img class="window-icon" src="/assets/maximize.svg" alt="" />
</button>
<button class="window-button close" aria-label="Close window" data-tooltip="Close">
<button id="btn-close" class="window-button close" aria-label="Close window" data-tooltip="Close">
<img class="window-icon" src="/assets/close.svg" alt="" />
</button>
</div>
@@ -41,4 +41,4 @@
<script type="module" src="/src/main.ts"></script>
</body>
</html>
</html>
@@ -4,6 +4,9 @@ import { loadHTML, showOnlyCurrentModule } from './utils/common-utils';
import { loadContent, setupSidebar } from './modules/sidebar';
async function initializeApp() {
setupTitlebarButtons();
setupTitlebarDrag();
// 加载侧边栏
const sidebarHTML = await loadHTML('/src/partials/sidebar.html');
document.getElementById('sidebar-container')!.innerHTML = sidebarHTML;
@@ -25,5 +28,50 @@ async function initializeApp() {
container.style.visibility = 'visible';
}
function setupTitlebarButtons(): void {
const minimizeBtn = document.getElementById('btn-minimize');
const maximizeBtn = document.getElementById('btn-maximize');
const closeBtn = document.getElementById('btn-close');
document.addEventListener('DOMContentLoaded', initializeApp);
const postWindowMessage = (value: 'minimize' | 'maximize' | 'close') => {
if (window.chrome?.webview) {
window.chrome.webview.postMessage(
JSON.stringify({
type: 'windowControl',
data: value
})
);
} else {
console.warn('[windowControl] webview2 not available:', value);
}
};
minimizeBtn?.addEventListener('click', () => postWindowMessage('minimize'));
maximizeBtn?.addEventListener('click', () => postWindowMessage('maximize'));
closeBtn?.addEventListener('click', () => postWindowMessage('close'));
}
function setupTitlebarDrag(): void {
const titlebar = document.querySelector<HTMLElement>('.titlebar');
if (!titlebar) {
console.warn('[windowControl] titlebar not found');
return;
}
titlebar.addEventListener('mousedown', (e: MouseEvent) => {
const target = e.target as HTMLElement | null;
if (target?.closest('.window-controls')) {
return;
}
if (window.chrome?.webview) {
window.chrome.webview.postMessage(
JSON.stringify({
type: 'dragStart'
})
);
}
});
}
document.addEventListener('DOMContentLoaded', initializeApp);