const { test, expect } = require('playwright/test'); // Framework-level: lake preserves SSR content during hydration test('framework: lake content is never raw SX during hydration', async ({ page }) => { await page.context().clearCookies(); await page.addInitScript(() => { window.__lakeStates = []; const observer = new MutationObserver(() => { const lake = document.querySelector('[data-sx-lake="home-preview"]'); if (lake) { const text = lake.textContent; if (text && text.length > 0) window.__lakeStates.push(text.slice(0, 200)); } }); document.addEventListener('DOMContentLoaded', () => { observer.observe(document.body, { childList: true, subtree: true, characterData: true }); }); }); await page.goto('http://localhost:8013/sx/', { waitUntil: 'networkidle' }); await page.waitForTimeout(8000); const states = await page.evaluate(() => window.__lakeStates); for (const state of states) { expect(state).not.toContain('~tw'); expect(state).not.toContain(':tokens'); } }); // Stepper: back then forward preserves structure test('stepper: back then forward keeps spans inside h1', async ({ page }) => { await page.context().clearCookies(); await page.goto('http://localhost:8013/sx/', { waitUntil: 'networkidle' }); await page.waitForTimeout(8000); const back = page.locator('button:has-text("◀")'); const fwd = page.locator('button:has-text("▶")'); for (let i = 0; i < 6; i++) { await back.click(); await page.waitForTimeout(500); } for (let i = 0; i < 6; i++) { await fwd.click(); await page.waitForTimeout(500); } await page.waitForTimeout(1000); const lake = page.locator('[data-sx-lake="home-preview"]'); const h1Spans = lake.locator('h1 span'); expect(await h1Spans.count()).toBe(4); });