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 = ` -