#!/usr/bin/env node /** * Capture les captures d'écran pour docs/guide-utilisateur/screenshots/ * * Pages publiques : sans identifiants. * App connectée : définir MOMENTO_DOC_EMAIL et MOMENTO_DOC_PASSWORD * * Usage (depuis memento-note/ — Playwright est installé là) : * node ../docs/guide-utilisateur/capture-screenshots.mjs * MOMENTO_DOC_EMAIL=you@example.com MOMENTO_DOC_PASSWORD=secret node ../docs/guide-utilisateur/capture-screenshots.mjs */ import { createRequire } from 'module' import path from 'path' import { fileURLToPath } from 'url' const __dirname = path.dirname(fileURLToPath(import.meta.url)) const appRoot = path.resolve(__dirname, '../../memento-note') const require = createRequire(path.join(appRoot, 'package.json')) const { chromium } = require('playwright') const OUT = path.join(__dirname, 'screenshots') function resolveBaseUrl() { if (process.env.MOMENTO_DOC_BASE_URL) return process.env.MOMENTO_DOC_BASE_URL.replace(/\/$/, '') try { const envPath = path.join(appRoot, '.env') const env = require('fs').readFileSync(envPath, 'utf8') const m = env.match(/^NEXTAUTH_URL=["']?([^"'\n]+)["']?/m) if (m) return m[1].replace(/\/$/, '') } catch { /* ignore */ } return 'http://localhost:3000' } const BASE = resolveBaseUrl() async function shot(page, url, name, opts = {}) { await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 60000 }) await page.waitForTimeout(opts.wait ?? 1000) if (opts.scrollId) { const el = page.locator(`#${opts.scrollId}`).first() if (await el.count()) await el.scrollIntoViewIfNeeded() } await page.waitForTimeout(400) await page.screenshot({ path: path.join(OUT, name), fullPage: !!opts.fullPage }) console.log('✓', name) } async function loginIfConfigured(page) { const email = process.env.MOMENTO_DOC_EMAIL const password = process.env.MOMENTO_DOC_PASSWORD if (!email || !password) { console.log('ℹ Connexion ignorée (MOMENTO_DOC_EMAIL / MOMENTO_DOC_PASSWORD non définis)') return false } console.log(`ℹ Connexion sur ${BASE}/login`) await page.goto(`${BASE}/login`, { waitUntil: 'networkidle' }) await page.locator('#email').fill(email) await page.locator('#password').fill(password) await page.locator('form button[type="submit"], form button').first().click() try { await page.waitForURL((u) => !u.pathname.includes('/login'), { timeout: 20000 }) } catch { const err = await page.locator('.text-red-500, [class*="error"]').first().textContent().catch(() => '') console.warn( `⚠ Connexion échouée (${err || 'timeout'}). Vérifiez MOMENTO_DOC_EMAIL, MOMENTO_DOC_PASSWORD et NEXTAUTH_URL=${BASE}`, ) return false } console.log('✓ Session connectée →', page.url()) return true } console.log(`ℹ Base URL: ${BASE}`) const browser = await chromium.launch({ headless: true }) const page = await browser.newPage({ viewport: { width: 1440, height: 900 } }) await page.goto(`${BASE}/`, { waitUntil: 'networkidle' }) for (const [id, name] of [ [null, '01-landing-hero.png'], ['features', '02-landing-features.png'], ['agents', '03-landing-agents.png'], ['brainstorm', '04-landing-brainstorm.png'], ['pricing', '05-landing-pricing.png'], ['tech', '06-landing-byok.png'], ]) { if (id) await page.goto(`${BASE}/#${id}`, { waitUntil: 'networkidle' }) else await page.evaluate(() => window.scrollTo(0, 0)) await page.waitForTimeout(600) if (id) { const el = page.locator(`#${id}`).first() if (await el.count()) await el.scrollIntoViewIfNeeded() } await page.waitForTimeout(400) await page.screenshot({ path: path.join(OUT, name) }) console.log('✓', name) } await shot(page, `${BASE}/login`, '07-login.png') await shot(page, `${BASE}/register`, '08-register.png') await shot(page, `${BASE}/forgot-password`, '09-forgot-password.png') const loggedIn = await loginIfConfigured(page) if (loggedIn) { for (const [route, name] of [ ['/home', '10-app-home.png'], ['/chat', '11-app-chat.png'], ['/agents', '12-app-agents.png'], ['/brainstorm', '13-app-brainstorm.png'], ['/lab', '14-app-lab.png'], ['/settings/ai', '15-settings-ai.png'], ['/settings/billing', '16-settings-billing.png'], ['/settings/profile', '17-settings-profile.png'], ['/admin', '18-admin-dashboard.png'], ]) { await shot(page, `${BASE}${route}`, name, { wait: 1500 }) } } await browser.close() console.log('\nCaptures enregistrées dans', OUT)