// Run preview first: npx vite --config vite.lightning-preview.config.ts // CHROMIUM_PATH=/usr/bin/chromium node previews/lightning/smoke.mjs import { chromium } from '@playwright/test' import assert from 'node:assert/strict' const browser = await chromium.launch({ headless: true, ...(process.env.CHROMIUM_PATH ? { executablePath: process.env.CHROMIUM_PATH } : {}) }) try { const page = await browser.newPage() const errors = [] page.on('pageerror', e => errors.push(e.message)) await page.goto('http://127.0.0.1:8194/') for (const viewport of [{ width: 1280, height: 900 }, { width: 390, height: 844 }]) { await page.setViewportSize(viewport) await page.getByRole('button', { name: 'Buy inbound channel', exact: true }).click() await page.getByText('Node ready.', { exact: false }).waitFor() const dialog = page.getByRole('dialog') assert.equal(await dialog.count(), 1) for (let i = 0; i < 8; i++) { await page.keyboard.press('Tab') assert.equal(await page.evaluate(() => !!document.activeElement?.closest('[role="dialog"]')), true) } assert.equal(await page.evaluate(() => document.documentElement.scrollWidth > innerWidth), false) // Pixel-based trackpad-style scrolling: modal content scrolls, footer stays reachable. const scroller = dialog.locator('.overflow-y-auto') await scroller.hover() await page.mouse.wheel(0, 500) await page.getByRole('link', { name: 'Continue to ZEUS' }).scrollIntoViewIfNeeded() page.once('dialog', async prompt => { assert.match(prompt.message(), /Demo only/); await prompt.accept() }) await page.getByRole('link', { name: 'Continue to ZEUS' }).click() assert.equal(page.url(), 'http://127.0.0.1:8194/') await page.keyboard.press('Escape') await dialog.waitFor({ state: 'hidden' }) } assert.deepEqual(errors, []) console.log('PASS: desktop/mobile dialog, pixel scroll, safe demo handoff, Escape, no horizontal overflow or page errors') } finally { await browser.close() }