Every add-on panel was carrying a 32-px tab bar at the top listing every registered extension. That existed before the toolbar extension dock landed — now that the dock (per-extension buttons + puzzle dropdown at narrow widths) is the canonical switcher, doubling that inside the sidebar just wasted vertical space and made narrow panels feel cramped. Drops installPickerStrip() from sidebar-preload.js and the invocation from the DOMContentLoaded handler. The body-padding style that made room for the strip goes with it, so panels reclaim their top 33px. Resize grip on the left edge stays — unrelated feature. No panel HTML depends on the strip's padding — the wallets, notepad, relay, siawallet, and screenshot addon all start their own body flow from 0. Nothing else to change.
67 lines
3.3 KiB
JavaScript
67 lines
3.3 KiB
JavaScript
// Preload shared by every add-on sidebar panel. Exposes a small, safe
|
|
// surface to the add-on's HTML. Main-side handlers derive the add-on
|
|
// identity from the sender's URL (the panel is always loaded from
|
|
// somewhere inside <userData>/addons/<id>/), so a random page that
|
|
// happens to see the API shape can't touch another add-on's storage.
|
|
const { contextBridge, ipcRenderer } = require("electron");
|
|
contextBridge.exposeInMainWorld("silentmode", {
|
|
storage: {
|
|
get: (key, fallback = null) => ipcRenderer.invoke("addon-storage-get", key, fallback),
|
|
set: (key, value) => ipcRenderer.invoke("addon-storage-set", key, value),
|
|
all: () => ipcRenderer.invoke("addon-storage-all"),
|
|
},
|
|
// Ask main which panel is currently visible — panels may want to
|
|
// suspend expensive work when hidden.
|
|
onVisibility: (cb) => ipcRenderer.on("sidebar-visibility", (_e, visible) => cb(!!visible)),
|
|
// Call into the add-on's activate() context: resolves with whatever the
|
|
// matching api.onMessage handler returned (or rejects with its error).
|
|
invoke: (msg, payload) => ipcRenderer.invoke("addon-msg", String(msg), payload),
|
|
// Events the add-on pushes via api.emit while this panel is open.
|
|
on: (msg, cb) => ipcRenderer.on("addon-event", (_e, name, payload) => { if (name === msg) cb(payload); }),
|
|
});
|
|
|
|
// Panel picker strip was here — a 32-px tab bar injected at the top of
|
|
// every panel to switch between registered extensions. Removed: the
|
|
// toolbar extension dock (per-extension buttons + puzzle dropdown at
|
|
// narrow widths) is the canonical switcher now, and doubling that inside
|
|
// the sidebar wasted vertical space and made narrow panels feel cramped.
|
|
|
|
// Sidebar resize grip. Injected into every panel automatically so panel
|
|
// authors don't have to reinvent it. A thin strip along the LEFT edge
|
|
// (the boundary between the tab area and the sidebar) accepts mousedown
|
|
// and streams drag deltas to main until mouseup. Main clamps the width
|
|
// to [200, 800] and persists it in settings.sidebarWidth.
|
|
window.addEventListener("DOMContentLoaded", () => {
|
|
const grip = document.createElement("div");
|
|
grip.setAttribute("aria-label", "Resize sidebar");
|
|
grip.style.cssText = [
|
|
"position:fixed", "left:0", "top:0", "bottom:0",
|
|
"width:5px", "cursor:col-resize", "z-index:2147483647",
|
|
"background:transparent",
|
|
].join(";");
|
|
// A faint highlight on hover so the affordance is visible.
|
|
grip.addEventListener("mouseenter", () => { grip.style.background = "rgba(214,255,61,.20)"; });
|
|
grip.addEventListener("mouseleave", () => { if (!dragging) grip.style.background = "transparent"; });
|
|
document.body.appendChild(grip);
|
|
let dragging = false;
|
|
grip.addEventListener("mousedown", (e) => {
|
|
if (e.button !== 0) return;
|
|
e.preventDefault();
|
|
dragging = true;
|
|
document.body.style.userSelect = "none";
|
|
grip.style.background = "rgba(214,255,61,.35)";
|
|
});
|
|
window.addEventListener("mousemove", (e) => {
|
|
if (!dragging) return;
|
|
// Moving cursor LEFT = grow sidebar width. movementX is negative left.
|
|
if (e.movementX !== 0) ipcRenderer.invoke("sidebar-drag", -e.movementX);
|
|
});
|
|
const stop = () => {
|
|
if (!dragging) return;
|
|
dragging = false;
|
|
document.body.style.userSelect = "";
|
|
grip.style.background = "transparent";
|
|
};
|
|
window.addEventListener("mouseup", stop);
|
|
window.addEventListener("mouseleave", stop);
|
|
});
|