// Fenster anlegen (KONZEPT § 4.2). Das Fenster zeigt an, sonst nichts — // kein Node-Zugriff, contextIsolation an, alles läuft über die Brücke // (src/bruecke) und den MessagePort zum Kern. // „Zustand merken" (Position/Größe) kommt mit den Einstellungen im UI (W-5). import { BrowserWindow } from 'electron' import { join } from 'node:path' import { fensterrandEntfernen } from './fensterrand' export function fensterErstellen(): BrowserWindow { const fenster = new BrowserWindow({ width: 1280, height: 820, minWidth: 860, minHeight: 560, show: true, autoHideMenuBar: true, // Eigene Titelleiste (Commander-Wunsch 01.09.2026): Der Windows-Rahmen // ist weg, Minimieren/Maximieren/Schließen sitzen im UI und gezogen // wird an der Kopfzeile (.ziehbar in fenster/stil.css). // // Wichtig: GRÖSSE ÄNDERN bleibt möglich. Electron setzt für rahmenlose // Fenster unter Windows weiterhin WS_THICKFRAME (Option `thickFrame`, // Standard true) — die Kanten lassen sich also weiter ziehen, und // Doppelklick auf die Ziehfläche maximiert wie gewohnt. frame: false, // Dunkler Grund SOFORT — sonst blitzt beim Start ein weißes Rechteck, // bevor React lädt. Das warme Bühnen-Schwarz des Kino-Mixes // (oklch(0.13 0.012 60), siehe fenster/stil.css). backgroundColor: '#171412', title: 'Rippy', webPreferences: { preload: join(__dirname, '../bruecke/index.js'), contextIsolation: true, nodeIntegration: false, sandbox: true, }, }) // electron-vite: Im dev-Modus bedient ein Vite-Server das Fenster // (ELECTRON_RENDERER_URL), gebaut wird aus out/fenster geladen. // RIPPY_START_BEREICH öffnet einen bestimmten Bereich (#einstellungen / // #bibliothek) — der Smoke-Beweis fotografiert damit auch diese Seiten. // Der DWM-Rand von Windows 11 (die feine helle Linie ums Fenster) — er // gehört nicht zum Fensterinhalt, mit CSS ist er nicht zu erreichen. // Ein Fehlschlag ist kein Ausfall: Unter Windows 10 gibt es ihn nicht. const rand = fensterrandEntfernen(fenster.getNativeWindowHandle()) if (!rand.ok) console.warn(`[haupt] Fensterrand bleibt: ${rand.fehler}`) const devUrl = process.env['ELECTRON_RENDERER_URL'] const startBereich = process.env['RIPPY_START_BEREICH'] ?? '' if (devUrl !== undefined && devUrl.length > 0) { void fenster.loadURL(startBereich.length > 0 ? `${devUrl}#${startBereich}` : devUrl) } else { void fenster.loadFile( join(__dirname, '../fenster/index.html'), startBereich.length > 0 ? { hash: startBereich } : undefined, ) } return fenster }