docs(ci): add CI verification note to trigger Actions (#2)

Reviewed-on: #2
Co-authored-by: Jaybe <master@jaybe.dev>
Co-committed-by: Jaybe <master@jaybe.dev>
This commit is contained in:
2025-11-14 09:45:10 +00:00
committed by jaybe
parent a9bbc357e7
commit d6510e2b05
5 changed files with 126 additions and 43 deletions
+44
View File
@@ -0,0 +1,44 @@
name: CI
on:
push:
branches: [ main, master ]
pull_request:
jobs:
test:
runs-on: [macos, host]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install deps
run: npm ci
- name: Unit/Component tests (Vitest)
run: npm test
env:
CI: true
- name: Install Playwright browsers
run: npx playwright install --with-deps
- name: E2E tests (Playwright)
run: npm run test:e2e -- --reporter=line
env:
CI: true
- name: Upload Playwright report
if: always()
uses: actions/upload-artifact@v4
with:
name: playwright-report
path: playwright-report
if-no-files-found: ignore
retention-days: 3
+1 -1
View File
@@ -7,7 +7,7 @@ on:
jobs: jobs:
test: test:
runs-on: ubuntu-latest runs-on: [macos, host]
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
+37 -25
View File
@@ -1,27 +1,39 @@
{ {
"app.title": "Landing Page Builder", "app": {
"builder.title": "Landing Page Builder", "title": "Landing Page Builder"
"builder.preview": "Preview (static)", },
"builder.field.title": "Title", "builder": {
"builder.field.locale": "Locale", "title": "Landing Page Builder",
"builder.field.primaryColor": "Primary Color", "preview": "Preview (static)",
"builder.field.fontFamily": "Font Family", "field": {
"builder.upload.hero": "Hero Image Upload", "title": "Title",
"builder.action.addHero": "Add Hero", "locale": "Locale",
"builder.action.addFAQ": "Add FAQ", "primaryColor": "Primary Color",
"builder.action.addCTA": "Add CTA", "fontFamily": "Font Family"
"builder.action.export": "Export ZIP", },
"builder.action.addText": "Add Text", "upload": {
"builder.action.addEmail": "Add Email", "hero": "Hero Image Upload"
"builder.action.addTel": "Add Tel", },
"builder.action.addDate": "Add Date", "action": {
"builder.action.addTextarea": "Add Textarea", "addHero": "Add Hero",
"builder.action.addCheckbox": "Add Checkbox", "addFAQ": "Add FAQ",
"builder.action.addSelect": "Add Select", "addCTA": "Add CTA",
"builder.action.addRadio": "Add Radio", "export": "Export ZIP",
"builder.sections": "Sections", "addText": "Add Text",
"builder.form.fields": "Form Fields", "addEmail": "Add Email",
"builder.form.actionUrl": "Action URL", "addTel": "Add Tel",
"builder.form.honeypot": "Honeypot Field", "addDate": "Add Date",
"builder.form.minSeconds": "Min Submit Seconds" "addTextarea": "Add Textarea",
"addCheckbox": "Add Checkbox",
"addSelect": "Add Select",
"addRadio": "Add Radio"
},
"sections": "Sections",
"form": {
"fields": "Form Fields",
"actionUrl": "Action URL",
"honeypot": "Honeypot Field",
"minSeconds": "Min Submit Seconds"
}
}
} }
+37 -14
View File
@@ -1,16 +1,39 @@
{ {
"app.title": "랜딩 페이지 빌더", "app": {
"builder.title": "랜딩 페이지 빌더", "title": "랜딩 페이지 빌더"
"builder.preview": "미리보기(정적)", },
"builder.field.title": "제목", "builder": {
"builder.field.locale": "로케일", "title": "랜딩 페이지 빌더",
"builder.field.primaryColor": "대표 색상", "preview": "미리보기(정적)",
"builder.field.fontFamily": "폰트", "field": {
"builder.upload.hero": "히어로 이미지 업로드", "title": "제목",
"builder.action.addHero": "히어로 추가", "locale": "로케일",
"builder.action.addFAQ": "FAQ 추가", "primaryColor": "대표 색상",
"builder.action.addCTA": "CTA 추가", "fontFamily": "폰트"
"builder.action.export": "ZIP 내보내기", },
"builder.sections": "섹션", "upload": {
"builder.form.fields": "폼 필드" "hero": "히어로 이미지 업로드"
},
"action": {
"addHero": "히어로 추가",
"addFAQ": "FAQ 추가",
"addCTA": "CTA 추가",
"export": "ZIP 내보내기",
"addText": "텍스트 필드 추가",
"addEmail": "이메일 필드 추가",
"addTel": "전화번호 필드 추가",
"addDate": "날짜 필드 추가",
"addTextarea": "텍스트영역 추가",
"addCheckbox": "체크박스 추가",
"addSelect": "셀렉트 추가",
"addRadio": "라디오 추가"
},
"sections": "섹션",
"form": {
"fields": "폼 필드",
"actionUrl": "액션 URL",
"honeypot": "허니팟 필드",
"minSeconds": "최소 제출 대기(초)"
}
}
} }
+7 -3
View File
@@ -4,10 +4,14 @@ const builderUrl = '/en/builder'
test('Preview viewport toggle via keyboard (Tab + Enter/Space)', async ({ page }) => { test('Preview viewport toggle via keyboard (Tab + Enter/Space)', async ({ page }) => {
await page.goto(builderUrl) await page.goto(builderUrl)
await page.waitForLoadState('domcontentloaded')
// Ensure the page has focus before sending keyboard events
await page.locator('body').click({ position: { x: 1, y: 1 } })
// Tab to first button (Desktop) // Focus the Desktop button explicitly to avoid flakiness from skip-link/initial focus
await page.keyboard.press('Tab') const desktopBtn = page.getByRole('button', { name: 'Desktop' })
await expect(page.getByRole('button', { name: 'Desktop' })).toBeFocused() await desktopBtn.focus()
await expect(desktopBtn).toBeFocused()
// Press Space to toggle Mobile (first ensure Desktop is selected, then move to Mobile with Tab) // Press Space to toggle Mobile (first ensure Desktop is selected, then move to Mobile with Tab)
await page.keyboard.press('Tab') await page.keyboard.press('Tab')