| #!/usr/bin/env node |
|
|
| |
| |
| |
| |
| |
|
|
| const puppeteer = require('puppeteer'); |
| const fs = require('fs').promises; |
| const path = require('path'); |
|
|
| |
| const templateData = require('../components/template-data'); |
| const templates = templateData.templates || []; |
|
|
| const SCREENSHOT_DIR = path.join(process.cwd(), 'public', 'screenshots'); |
| const BASE_URL = process.env.SCREENSHOT_BASE_URL || 'http://localhost:3000'; |
|
|
| async function ensureDir(dir) { |
| try { |
| await fs.mkdir(dir, { recursive: true }); |
| } catch (err) { |
| console.error(`Error creating directory ${dir}:`, err); |
| } |
| } |
|
|
| async function captureTemplateScreenshot(browser, template) { |
| const page = await browser.newPage(); |
|
|
| |
| await page.emulateMediaFeatures([ |
| { name: 'prefers-color-scheme', value: 'dark' } |
| ]); |
|
|
| |
| await page.setViewport({ |
| width: 1920, |
| height: 1080, |
| deviceScaleFactor: 2, |
| }); |
|
|
| try { |
| const templateUrl = template.demoUrl || `${BASE_URL}/template/${template.id}`; |
| console.log(`πΈ Capturing screenshot for ${template.name}...`); |
|
|
| |
| await page.goto(templateUrl, { |
| waitUntil: ['networkidle0', 'domcontentloaded'], |
| timeout: 30000, |
| }); |
|
|
| |
| await page.waitForTimeout(2000); |
|
|
| |
| const screenshotPath = path.join(SCREENSHOT_DIR, `${template.id}.png`); |
| await page.screenshot({ |
| path: screenshotPath, |
| fullPage: false, |
| }); |
|
|
| |
| await page.setViewport({ |
| width: 800, |
| height: 600, |
| deviceScaleFactor: 2, |
| }); |
|
|
| const thumbnailPath = path.join(SCREENSHOT_DIR, `${template.id}-thumb.png`); |
| await page.screenshot({ |
| path: thumbnailPath, |
| fullPage: false, |
| }); |
|
|
| |
| await page.setViewport({ |
| width: 375, |
| height: 812, |
| deviceScaleFactor: 2, |
| isMobile: true, |
| hasTouch: true, |
| }); |
|
|
| const mobilePath = path.join(SCREENSHOT_DIR, `${template.id}-mobile.png`); |
| await page.screenshot({ |
| path: mobilePath, |
| fullPage: false, |
| }); |
|
|
| console.log(`β
Saved screenshots for ${template.name}`); |
|
|
| return { |
| success: true, |
| template: template.name, |
| screenshots: { |
| desktop: `${template.id}.png`, |
| thumbnail: `${template.id}-thumb.png`, |
| mobile: `${template.id}-mobile.png`, |
| } |
| }; |
| } catch (error) { |
| console.error(`β Error capturing ${template.name}:`, error.message); |
| return { |
| success: false, |
| template: template.name, |
| error: error.message, |
| }; |
| } finally { |
| await page.close(); |
| } |
| } |
|
|
| async function captureGalleryScreenshot(browser) { |
| const page = await browser.newPage(); |
|
|
| |
| await page.emulateMediaFeatures([ |
| { name: 'prefers-color-scheme', value: 'dark' } |
| ]); |
|
|
| await page.setViewport({ |
| width: 1920, |
| height: 1080, |
| deviceScaleFactor: 2, |
| }); |
|
|
| try { |
| console.log(`πΈ Capturing gallery homepage...`); |
|
|
| await page.goto(BASE_URL, { |
| waitUntil: ['networkidle0', 'domcontentloaded'], |
| timeout: 30000, |
| }); |
|
|
| await page.waitForTimeout(2000); |
|
|
| |
| const heroPath = path.join(SCREENSHOT_DIR, 'gallery-hero.png'); |
| await page.screenshot({ |
| path: heroPath, |
| fullPage: false, |
| }); |
|
|
| |
| await page.evaluate(() => { |
| window.scrollBy(0, window.innerHeight); |
| }); |
| await page.waitForTimeout(1000); |
|
|
| const templatesPath = path.join(SCREENSHOT_DIR, 'gallery-templates.png'); |
| await page.screenshot({ |
| path: templatesPath, |
| fullPage: false, |
| }); |
|
|
| |
| await page.evaluate(() => { |
| window.scrollTo(0, 0); |
| }); |
| await page.waitForTimeout(500); |
|
|
| const fullPagePath = path.join(SCREENSHOT_DIR, 'gallery-full.png'); |
| await page.screenshot({ |
| path: fullPagePath, |
| fullPage: true, |
| }); |
|
|
| console.log(`β
Saved gallery screenshots`); |
|
|
| return { success: true }; |
| } catch (error) { |
| console.error(`β Error capturing gallery:`, error.message); |
| return { success: false, error: error.message }; |
| } finally { |
| await page.close(); |
| } |
| } |
|
|
| async function main() { |
| console.log('π Starting Hanzo Template Gallery Screenshot Tool'); |
| console.log(`π Screenshots will be saved to: ${SCREENSHOT_DIR}`); |
| console.log(`π Base URL: ${BASE_URL}`); |
| console.log(`π Found ${templates.length} templates to capture`); |
| console.log(''); |
|
|
| |
| await ensureDir(SCREENSHOT_DIR); |
|
|
| |
| const browser = await puppeteer.launch({ |
| headless: 'new', |
| args: [ |
| '--no-sandbox', |
| '--disable-setuid-sandbox', |
| '--disable-dev-shm-usage', |
| '--disable-accelerated-2d-canvas', |
| '--no-first-run', |
| '--no-zygote', |
| '--disable-gpu', |
| ], |
| }); |
|
|
| try { |
| const results = []; |
|
|
| |
| const galleryResult = await captureGalleryScreenshot(browser); |
| results.push(galleryResult); |
|
|
| |
| for (const template of templates) { |
| const result = await captureTemplateScreenshot(browser, template); |
| results.push(result); |
|
|
| |
| await new Promise(resolve => setTimeout(resolve, 1000)); |
| } |
|
|
| |
| console.log('\nπ Screenshot Capture Summary:'); |
| console.log('================================'); |
|
|
| const successful = results.filter(r => r.success).length; |
| const failed = results.filter(r => !r.success).length; |
|
|
| console.log(`β
Successful: ${successful}`); |
| console.log(`β Failed: ${failed}`); |
|
|
| if (failed > 0) { |
| console.log('\nFailed captures:'); |
| results |
| .filter(r => !r.success) |
| .forEach(r => console.log(` - ${r.template}: ${r.error}`)); |
| } |
|
|
| |
| const metadata = { |
| capturedAt: new Date().toISOString(), |
| baseUrl: BASE_URL, |
| totalTemplates: templates.length, |
| captureResults: results.map(r => ({ |
| name: r.template || 'Gallery', |
| success: r.success, |
| screenshots: r.screenshots, |
| error: r.error, |
| })), |
| }; |
|
|
| const metadataPath = path.join(SCREENSHOT_DIR, 'metadata.json'); |
| await fs.writeFile(metadataPath, JSON.stringify(metadata, null, 2)); |
| console.log(`\nπΎ Metadata saved to ${metadataPath}`); |
|
|
| } catch (error) { |
| console.error('Fatal error:', error); |
| process.exit(1); |
| } finally { |
| await browser.close(); |
| } |
| } |
|
|
| |
| if (require.main === module) { |
| main().catch(console.error); |
| } |
|
|
| module.exports = { captureTemplateScreenshot, captureGalleryScreenshot }; |