mirror of
https://github.com/vitest-dev/vitest.git
synced 2025-12-08 18:26:03 +00:00
47 lines
1.7 KiB
TypeScript
47 lines
1.7 KiB
TypeScript
import type { BrowserUI } from 'vitest'
|
|
import { findById } from './client'
|
|
import { customViewport, viewport } from './browser'
|
|
import { detailSizes } from '~/composables/navigation'
|
|
|
|
const ui: BrowserUI = {
|
|
setCurrentFileId(fileId: string) {
|
|
activeFileId.value = fileId
|
|
currentModule.value = findById(fileId)
|
|
showDashboard(false)
|
|
},
|
|
async setIframeViewport(width: number, height: number) {
|
|
// reset the button before setting a custom viewport
|
|
viewport.value = 'custom'
|
|
customViewport.value = [width, height]
|
|
await setIframeViewport(width, height)
|
|
},
|
|
}
|
|
|
|
// @ts-expect-error not typed global
|
|
window.__vitest_ui_api__ = ui
|
|
|
|
function recalculateDetailPanels() {
|
|
const iframe = getCurrentBrowserIframe()
|
|
const panel = document.querySelector<HTMLDivElement>('#details-splitpanes')!
|
|
const panelWidth = panel.clientWidth
|
|
const iframeWidth = iframe.clientWidth
|
|
const iframePercent = Math.min((iframeWidth / panelWidth) * 100, 95)
|
|
const detailsPercent = 100 - iframePercent
|
|
detailSizes.value = [iframePercent, detailsPercent]
|
|
}
|
|
|
|
export function getCurrentBrowserIframe() {
|
|
return document.querySelector<HTMLIFrameElement>('#tester-ui iframe[data-vitest]')!
|
|
}
|
|
|
|
export async function setIframeViewport(width: number | string, height: number | string) {
|
|
const iframe = getCurrentBrowserIframe()
|
|
// change the viewport of the iframe
|
|
iframe.style.width = typeof width === 'string' ? width : `${width}px`
|
|
iframe.style.height = typeof height === 'string' ? height : `${height}px`
|
|
// wait until it renders the new size and resize the panel to make the iframe visible
|
|
// this will not make it fully visible if viewport is too wide, but it's better than nothing
|
|
await new Promise(r => requestAnimationFrame(r))
|
|
recalculateDetailPanels()
|
|
}
|