diff --git a/docs/superpowers/plans/2026-04-24-inkling-vertical-slice.md b/docs/superpowers/plans/2026-04-24-inkling-vertical-slice.md index 968de85..b4bd534 100644 --- a/docs/superpowers/plans/2026-04-24-inkling-vertical-slice.md +++ b/docs/superpowers/plans/2026-04-24-inkling-vertical-slice.md @@ -181,10 +181,9 @@ If a version is not yet published, run `npm view version` and use the late "resolveJsonModule": true, "isolatedModules": true, "types": ["node"], - "baseUrl": ".", "paths": { - "@shared/*": ["src/shared/*"], - "@main/*": ["src/main/*"] + "@shared/*": ["./src/shared/*"], + "@main/*": ["./src/main/*"] } }, "include": ["src/**/*", "tests/**/*"], diff --git a/src/main/index.ts b/src/main/index.ts new file mode 100644 index 0000000..de1f4ee --- /dev/null +++ b/src/main/index.ts @@ -0,0 +1,12 @@ +import { app, BrowserWindow } from 'electron'; +import '@shared/types'; +import { createInboxWindow } from './windows/inboxWindow.js'; + +app.whenReady().then(() => { + createInboxWindow(); + app.on('activate', () => { + if (BrowserWindow.getAllWindows().length === 0) createInboxWindow(); + }); +}); + +app.on('before-quit', () => { app.isQuitting = true; }); diff --git a/src/main/windows/inboxWindow.ts b/src/main/windows/inboxWindow.ts new file mode 100644 index 0000000..7579c5d --- /dev/null +++ b/src/main/windows/inboxWindow.ts @@ -0,0 +1,46 @@ +import { BrowserWindow, app } from 'electron'; +import { join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +let inboxWindow: BrowserWindow | null = null; +const __dirname = fileURLToPath(new URL('.', import.meta.url)); + +export function getInboxWindow(): BrowserWindow | null { + return inboxWindow; +} + +export function createInboxWindow(): BrowserWindow { + if (inboxWindow && !inboxWindow.isDestroyed()) { + inboxWindow.show(); + inboxWindow.focus(); + return inboxWindow; + } + + inboxWindow = new BrowserWindow({ + width: 900, + height: 720, + show: false, + webPreferences: { + preload: join(__dirname, '../preload/index.js'), + contextIsolation: true, + nodeIntegration: false, + sandbox: false + } + }); + + if (process.env.ELECTRON_RENDERER_URL) { + inboxWindow.loadURL(`${process.env.ELECTRON_RENDERER_URL}/inbox/index.html`); + } else { + inboxWindow.loadFile(join(__dirname, '../renderer/inbox/index.html')); + } + + inboxWindow.on('close', (e) => { + if (!app.isQuitting) { + e.preventDefault(); + inboxWindow?.hide(); + } + }); + + inboxWindow.once('ready-to-show', () => inboxWindow?.show()); + return inboxWindow; +} diff --git a/src/renderer/inbox/index.html b/src/renderer/inbox/index.html new file mode 100644 index 0000000..e031d2c --- /dev/null +++ b/src/renderer/inbox/index.html @@ -0,0 +1,12 @@ + + + + + + Inkling + + +
+ + + diff --git a/src/shared/types.ts b/src/shared/types.ts new file mode 100644 index 0000000..431d541 --- /dev/null +++ b/src/shared/types.ts @@ -0,0 +1,6 @@ +declare global { + namespace Electron { + interface App { isQuitting?: boolean; } + } +} +export {}; diff --git a/tsconfig.json b/tsconfig.json index 5dd1776..d19c09a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,10 +13,9 @@ "resolveJsonModule": true, "isolatedModules": true, "types": ["node"], - "baseUrl": ".", "paths": { - "@shared/*": ["src/shared/*"], - "@main/*": ["src/main/*"] + "@shared/*": ["./src/shared/*"], + "@main/*": ["./src/main/*"] } }, "include": ["src/**/*", "tests/**/*"],