diff --git a/plugins/_browser/webui/browser-store.js b/plugins/_browser/webui/browser-store.js
index df45b12e4..05d946de6 100644
--- a/plugins/_browser/webui/browser-store.js
+++ b/plugins/_browser/webui/browser-store.js
@@ -7,7 +7,11 @@ import { store as chatInputStore } from "/components/chat/input/input-store.js";
import { store as pluginSettingsStore } from "/components/plugins/plugin-settings-store.js";
import { store as chatsStore } from "/components/sidebar/chats/chats-store.js";
import { store as rightCanvasStore } from "/components/canvas/right-canvas-store.js";
-import { openLatest as openLatestSurface, registerUrlHandler } from "/js/surfaces.js";
+import {
+ openLatest as openLatestSurface,
+ placeSurfaceModalHeaderAction,
+ registerUrlHandler,
+} from "/js/surfaces.js";
const websocket = getNamespacedClient("/ws");
websocket.addHandlers(["ws_webui"]);
@@ -2634,6 +2638,27 @@ const model = {
};
clampGeometry();
+ const newAction = globalThis.document.createElement("div");
+ newAction.className = "browser-header-actions surface-modal-new-action";
+ newAction.innerHTML = `
+
+ `;
+ const newButton = newAction.querySelector(".browser-header-new-button");
+ const onNewClick = async () => {
+ if (!newButton || newButton.disabled || this.isBusy()) return;
+ newButton.disabled = true;
+ try {
+ await this.openNewBrowser();
+ } finally {
+ if (globalThis.document?.contains?.(newButton)) newButton.disabled = false;
+ }
+ };
+ newButton?.addEventListener("click", onNewClick);
+ placeSurfaceModalHeaderAction(header, newAction, "new");
+
const focusButton = globalThis.document.createElement("button");
focusButton.type = "button";
focusButton.className = "surface-button browser-modal-focus-button";
@@ -2658,12 +2683,7 @@ const model = {
updateFocusButton(false);
};
updateFocusButton(false);
- const closeButton = inner.querySelector(".modal-close");
- if (closeButton) {
- closeButton.insertAdjacentElement("beforebegin", focusButton);
- } else {
- header.appendChild(focusButton);
- }
+ placeSurfaceModalHeaderAction(header, focusButton, "window");
const onFocusClick = () => setFocusMode(!inner.classList.contains("is-focus-mode"));
focusButton.addEventListener("click", onFocusClick);
@@ -2723,6 +2743,8 @@ const model = {
header.addEventListener("pointerdown", onPointerDown);
this._floatingCleanup = () => {
+ newButton?.removeEventListener("click", onNewClick);
+ newAction.remove();
focusButton.removeEventListener("click", onFocusClick);
focusButton.remove();
header.removeEventListener("pointerdown", onPointerDown);
diff --git a/plugins/_browser/webui/main.html b/plugins/_browser/webui/main.html
index 50d363cc9..f09dbabb7 100644
--- a/plugins/_browser/webui/main.html
+++ b/plugins/_browser/webui/main.html
@@ -2,7 +2,7 @@
class="browser-modal"
data-surface-id="browser"
data-surface-modal-path="/plugins/_browser/webui/main.html"
- data-surface-dock-title="Open Browser in surface"
+ data-surface-dock-title="Open Browser in canvas"
data-surface-dock-icon="dock_to_right"
data-canvas-surface="browser"
data-canvas-modal-path="/plugins/_browser/webui/main.html"
diff --git a/plugins/_desktop/webui/desktop-panel.html b/plugins/_desktop/webui/desktop-panel.html
index 593da7d8e..1bbe300c3 100644
--- a/plugins/_desktop/webui/desktop-panel.html
+++ b/plugins/_desktop/webui/desktop-panel.html
@@ -137,7 +137,7 @@
}
.modal-inner.office-modal .modal-header {
- grid-template-columns: minmax(0, 1fr) repeat(5, auto);
+ grid-template-columns: minmax(0, 1fr) auto auto;
}
.office-modal-input-shield {
diff --git a/plugins/_desktop/webui/desktop-store.js b/plugins/_desktop/webui/desktop-store.js
index 7c597e82a..a8acd6a53 100644
--- a/plugins/_desktop/webui/desktop-store.js
+++ b/plugins/_desktop/webui/desktop-store.js
@@ -2,7 +2,7 @@ import { createStore } from "/js/AlpineStore.js";
import { callJsonApi } from "/js/api.js";
import { getNamespacedClient } from "/js/websocket.js";
import { store as fileBrowserStore } from "/components/modals/file-browser/file-browser-store.js";
-import { handleUrlIntent } from "/js/surfaces.js";
+import { handleUrlIntent, placeSurfaceModalHeaderAction } from "/js/surfaces.js";
const officeSocket = getNamespacedClient("/ws");
officeSocket.addHandlers(["ws_webui"]);
@@ -2337,9 +2337,9 @@ const model = {
if (!header || header.querySelector(".office-header-actions")) return () => {};
const root = globalThis.document.createElement("div");
- root.className = "office-header-actions";
+ root.className = "office-header-actions surface-modal-new-action";
root.innerHTML = `
-