a608799689
A ?win=browser renderer (query before hash) so HashRouter cannot swallow the flag, and so one window per tab can focus instead of cloning.
32 lines
1.2 KiB
TypeScript
32 lines
1.2 KiB
TypeScript
// Popped-out in-app Browser windows. Same query-before-hash contract as
|
|
// session-windows / hud-url: `?win=browser` MUST sit in the search string
|
|
// before the '#', or HashRouter swallows it as part of the route.
|
|
|
|
import { pathToFileURL } from 'node:url'
|
|
|
|
export const BROWSER_WINDOW_WIDTH = 960
|
|
export const BROWSER_WINDOW_HEIGHT = 720
|
|
export const BROWSER_WINDOW_MIN_WIDTH = 480
|
|
export const BROWSER_WINDOW_MIN_HEIGHT = 400
|
|
|
|
/**
|
|
* Renderer URL for a popped-out Browser. `tab` is the `$previewTabs` id the
|
|
* window should show — the tab stays in storage so closing the window can
|
|
* dock it again. Absent/blank tab is still a valid Browser window (blank page).
|
|
*/
|
|
export function buildBrowserWindowUrl(
|
|
tabId: null | string | undefined,
|
|
{ devServer, rendererIndexPath }: { devServer?: null | string; rendererIndexPath?: string } = {}
|
|
): string {
|
|
const tab = typeof tabId === 'string' ? tabId.trim() : ''
|
|
const query = `?win=browser${tab ? `&tab=${encodeURIComponent(tab)}` : ''}`
|
|
|
|
if (devServer) {
|
|
const base = devServer.endsWith('/') ? devServer.slice(0, -1) : devServer
|
|
|
|
return `${base}/${query}#/`
|
|
}
|
|
|
|
return `${pathToFileURL(rendererIndexPath!).toString()}${query}#/`
|
|
}
|