Sublime-style Build-n versioning + About box

Build n = commit count, baked at build time into a gitignored
version.gen.ts (postinstall + all build scripts regenerate it). About
lives in the macOS app menu and as a footer row in the options popover
(the cross-platform path), showing build, commit, date and engines.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Jokin
2026-07-13 23:55:39 +02:00
co-authored by Claude Fable 5
parent 14b92b33a4
commit d80d5c23dc
9 changed files with 112 additions and 6 deletions
+19
View File
@@ -51,6 +51,7 @@ const events = {
openEditor: (_ctx: EditorOpenContext) => {},
settingsChanged: (_settings: AppSettings) => {},
openConnectionManager: () => {},
showAbout: () => {},
};
const rpc = createAppRPC({ registry, engine, store, settings, edits, contextMenu, events });
const url = await getMainViewUrl();
@@ -104,6 +105,20 @@ events.settingsChanged = (s) => {
manager.broadcastSettings(s);
};
events.openConnectionManager = () => manager.open();
function showAbout(): void {
const { build } = BRANDING;
void Utils.showMessageBox({
type: "info",
title: BRANDING.appName,
message: BRANDING.appName,
detail: `${BRANDING.buildLabel} (${build.commit}) · ${build.date}\n\nElectrobun ${build.electrobun} · Bun ${Bun.version}`,
buttons: ["OK"],
defaultId: 0,
cancelId: 0,
});
}
events.showAbout = showAbout;
// clean editors close with the main window; dirty ones get to ask first,
// and the modal manager has nothing to guard
win.on("close", () => {
@@ -204,6 +219,10 @@ ApplicationMenu.on("application-menu-clicked", (event) => {
manager.open();
return;
}
if (action === "about") {
showAbout();
return;
}
// the manager is modal to the main window — don't drive main behind it
if (manager.isOpen()) return;
rpc.send.menuAction({ action });
+3
View File
@@ -1,4 +1,5 @@
import { ApplicationMenu, type ApplicationMenuItemConfig } from "electrobun/bun";
import { BRANDING } from "../shared/branding";
import type { SavedConnection } from "../shared/types";
import type { ConnectionStore } from "./store/connections";
@@ -32,6 +33,8 @@ export async function applyApplicationMenu(store: ConnectionStore): Promise<void
ApplicationMenu.setApplicationMenu([
{
submenu: [
{ label: `About ${BRANDING.appName}`, action: "about" },
{ type: "separator" },
{ role: "hide" },
{ role: "hideOthers" },
{ role: "showAll" },
+7
View File
@@ -30,6 +30,7 @@ export interface AppDeps {
openEditor: (ctx: EditorOpenContext) => void;
settingsChanged: (settings: AppSettings) => void;
openConnectionManager: () => void;
showAbout: () => void;
};
}
@@ -294,6 +295,12 @@ export function createAppRPC({
events.openConnectionManager();
return {};
}),
showAbout: () =>
wrap(async () => {
events.showAbout();
return {};
}),
},
},
});