screenshot-generator
Generate screenshots for web audio apps (desktop, mobile landscape, mobile portrait) using Playwright. Also captures component-level screenshots for documentation.
SKILL.mdskills/screenshot-generator/SKILL.md
GitHub๐ธ Screenshot Generator Skill
์น ์ฑ์ ์คํฌ๋ฆฐ์ท์ ์๋์ผ๋ก ์์ฑํฉ๋๋ค.
๐ฏ ์ฉ๋
- README.md ๋ฐ ๋ฌธ์์ฉ ์คํฌ๋ฆฐ์ท ์์ฑ
- Desktop, Mobile Landscape, Mobile Portrait ๋ทฐ ์บก์ฒ
- ๊ฐ๋ณ ์ปดํฌ๋ํธ(ํค๋, ํจ๋, ๋ ธ๋ธ ๋ฑ) ์คํฌ๋ฆฐ์ท
๐ ํ์ผ ๊ตฌ์กฐ
screenshot-generator/
โโโ SKILL.md # ์ด ํ์ผ
โโโ scripts/
โโโ generate_screenshots.js # ๋ฉ์ธ ์คํฌ๋ฆฝํธ
โ๏ธ ์๊ตฌ์ฌํญ
# Playwright ์ค์น
npm install playwright
npx playwright install chromium
๐ ์ฌ์ฉ๋ฒ
๊ธฐ๋ณธ ์คํ
# ํ๋ก์ ํธ ๋ฃจํธ์์
node scripts/generate_screenshots.js
์คํฌ๋ฆฝํธ ๋์
- ๋ก์ปฌ ์๋ฒ ์์:
http-server๋ก ์ฑ ์๋น (ํฌํธ 8080) - ๋ธ๋ผ์ฐ์ ์คํ: Playwright Chromium
- ์คํฌ๋ฆฐ์ท ์บก์ฒ:
screenshot-desktop.png(1280x800)screenshot-mobile-landscape.png(844x390)screenshot-mobile-portrait.png(iPhone 13 Pro)
- ์ปดํฌ๋ํธ ์บก์ฒ: ๊ฐ๋ณ UI ์์
- ์๋ฒ ์ข ๋ฃ
์ถ๋ ฅ ์์น
์คํฌ๋ฆฐ์ท์ assets/ ํด๋์ ์ ์ฅ๋ฉ๋๋ค.
๐ง ํ๋ก์ ํธ๋ณ ์ปค์คํฐ๋ง์ด์ง
๊ฐ ํ๋ก์ ํธ์์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ณต์ฌํ๊ณ ํ์์ ๋ง๊ฒ ์์ ํ์ธ์:
ํ์ ์์ ์ฌํญ
// 1. ์๋ฒ ํฌํธ (ํ์์)
const server = spawn('npx', ['-y', 'http-server', '-p', '8080', '-a', '127.0.0.1']);
// 2. ๋๊ธฐํ UI ์์ (ํ๋ก์ ํธ๋ณ๋ก ๋ค๋ฆ)
await page.waitForSelector('.your-main-element', { timeout: 10000 });
// 3. ์ปดํฌ๋ํธ ์
๋ ํฐ (ํ๋ก์ ํธ๋ณ๋ก ๋ค๋ฆ)
const header = page.locator('.your-header-class');
await header.screenshot({ path: path.join(assetsDir, 'header.png') });
์ ์คํฌ๋ฆฐ์ท ์ถ๊ฐ
// ์คํฌ๋ฆฝํธ ํ๋จ์ ์ถ๊ฐ
console.log('Taking New Feature Screenshot...');
const newFeature = page.locator('.your-selector');
await newFeature.screenshot({ path: path.join(assetsDir, 'new-feature.png') });
๐ ํ๋ก์ ํธ๋ณ ์ค์ ์์
acidBros
// ๋๊ธฐํ ์์
await page.waitForSelector('.step-303', { timeout: 10000 });
await page.waitForSelector('.step-909', { timeout: 10000 });
await page.waitForSelector('.rotary-knob', { timeout: 10000 });
// ์ปดํฌ๋ํธ
const transport = page.locator('.top-bar');
const tb303 = page.locator('.machine.tb-303').first();
const tr909 = page.locator('.machine.tr-909');
ddxx7
// ๋๊ธฐํ ์์
await page.waitForSelector('.operator-panel', { timeout: 10000 });
await page.waitForSelector('.algorithm-matrix', { timeout: 10000 });
// ์ปดํฌ๋ํธ
const header = page.locator('header');
const operatorPanel = page.locator('.operator-panel');
const libraryView = page.locator('.library-view');
uss44
// ๋๊ธฐํ ์์
await page.waitForSelector('.pad-grid', { timeout: 10000 });
await page.waitForSelector('.waveform-editor', { timeout: 10000 });
// ์ปดํฌ๋ํธ
const header = page.locator('header');
const padGrid = page.locator('.pad-grid');
const paramsPanel = page.locator('.params-panel');
โ ๏ธ ์ฃผ์์ฌํญ
- ์๋ฒ ์ถฉ๋: ์ด๋ฏธ 8080 ํฌํธ๊ฐ ์ฌ์ฉ ์ค์ด๋ฉด ์คํจ
- ํ์์์: ๋คํธ์ํฌ ๋๋ฆฌ๋ฉด waitForSelector ํ์์์ ์ฆ๊ฐ ํ์
- ํค๋๋ฆฌ์ค: ๊ธฐ๋ณธ์ ์ผ๋ก headless ๋ชจ๋ (ํ๋ฉด ํ์ ์์)