From 41b89e8161523ccfd54c02849a914171bbd8ec3e Mon Sep 17 00:00:00 2001 From: Jaybe Date: Fri, 14 Nov 2025 17:20:33 +0900 Subject: [PATCH 1/9] docs(ci): add CI verification note to trigger Actions --- MAIN_PLAN.md | 1 + 1 file changed, 1 insertion(+) diff --git a/MAIN_PLAN.md b/MAIN_PLAN.md index bf52680..3933508 100644 --- a/MAIN_PLAN.md +++ b/MAIN_PLAN.md @@ -121,6 +121,7 @@ - 새로 추가된 테스트(헤딩 레벨 전수, 색/폰트 스모크) CI 통합 확인 - 작업 브랜치 푸시 완료: `chore/ci-verify-a11y-headings` (원격: origin) - PR 생성 및 Actions 결과 기록 예정(base: main) +- CI verification note: 러너 온라인 이후, 사소 변경으로 CI 트리거 검증 예정 ### 다음 스프린트 후보 과제 - Exporter 회귀 스냅샷 보강(폼 토큰/검증 토큰 범위 확대) -- 2.52.0 From a76e4b8e882dc80919756ec734407de6186be8f3 Mon Sep 17 00:00:00 2001 From: Jaybe Date: Fri, 14 Nov 2025 17:24:31 +0900 Subject: [PATCH 2/9] ci: target self-hosted runner labels [macos, host] --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cb0b1e0..04a4d8b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,7 +7,7 @@ on: jobs: test: - runs-on: ubuntu-latest + runs-on: [macos, host] steps: - name: Checkout uses: actions/checkout@v4 -- 2.52.0 From 4327a90f360efcceba658878941148f8cceafee1 Mon Sep 17 00:00:00 2001 From: Jaybe Date: Fri, 14 Nov 2025 17:30:21 +0900 Subject: [PATCH 3/9] ci(gitea): add .gitea workflow using self-hosted runner [macos, host] --- .gitea/workflows/ci.yml | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 .gitea/workflows/ci.yml diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml new file mode 100644 index 0000000..04a4d8b --- /dev/null +++ b/.gitea/workflows/ci.yml @@ -0,0 +1,35 @@ +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 + env: + CI: true -- 2.52.0 From 23e2112e72933be1051d15ad430f5e543ee7410b Mon Sep 17 00:00:00 2001 From: Jaybe Date: Fri, 14 Nov 2025 17:42:13 +0900 Subject: [PATCH 4/9] ci(gitea): verbose E2E + upload Playwright report artifact --- .gitea/workflows/ci.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 04a4d8b..59f7af2 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -30,6 +30,15 @@ jobs: run: npx playwright install --with-deps - name: E2E tests (Playwright) - run: npm run test:e2e + 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 -- 2.52.0 From 819d646dfb2ff8696efb3c9ee42e69bdaae3c572 Mon Sep 17 00:00:00 2001 From: Jaybe Date: Fri, 14 Nov 2025 17:48:05 +0900 Subject: [PATCH 5/9] i18n(en): convert flat dotted keys to nested object for next-intl --- messages/en.json | 62 +++++++++++++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 25 deletions(-) diff --git a/messages/en.json b/messages/en.json index e83f3b0..e2e4df2 100644 --- a/messages/en.json +++ b/messages/en.json @@ -1,27 +1,39 @@ { - "app.title": "Landing Page Builder", - "builder.title": "Landing Page Builder", - "builder.preview": "Preview (static)", - "builder.field.title": "Title", - "builder.field.locale": "Locale", - "builder.field.primaryColor": "Primary Color", - "builder.field.fontFamily": "Font Family", - "builder.upload.hero": "Hero Image Upload", - "builder.action.addHero": "Add Hero", - "builder.action.addFAQ": "Add FAQ", - "builder.action.addCTA": "Add CTA", - "builder.action.export": "Export ZIP", - "builder.action.addText": "Add Text", - "builder.action.addEmail": "Add Email", - "builder.action.addTel": "Add Tel", - "builder.action.addDate": "Add Date", - "builder.action.addTextarea": "Add Textarea", - "builder.action.addCheckbox": "Add Checkbox", - "builder.action.addSelect": "Add Select", - "builder.action.addRadio": "Add Radio", - "builder.sections": "Sections", - "builder.form.fields": "Form Fields", - "builder.form.actionUrl": "Action URL", - "builder.form.honeypot": "Honeypot Field", - "builder.form.minSeconds": "Min Submit Seconds" + "app": { + "title": "Landing Page Builder" + }, + "builder": { + "title": "Landing Page Builder", + "preview": "Preview (static)", + "field": { + "title": "Title", + "locale": "Locale", + "primaryColor": "Primary Color", + "fontFamily": "Font Family" + }, + "upload": { + "hero": "Hero Image Upload" + }, + "action": { + "addHero": "Add Hero", + "addFAQ": "Add FAQ", + "addCTA": "Add CTA", + "export": "Export ZIP", + "addText": "Add Text", + "addEmail": "Add Email", + "addTel": "Add Tel", + "addDate": "Add Date", + "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" + } + } } -- 2.52.0 From b24ada3397710735804d512b38571a92d30575f2 Mon Sep 17 00:00:00 2001 From: Jaybe Date: Fri, 14 Nov 2025 17:49:57 +0900 Subject: [PATCH 6/9] i18n(ko): convert flat dotted keys to nested object and add missing keys --- messages/ko.json | 51 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/messages/ko.json b/messages/ko.json index 6ffb530..f12ee70 100644 --- a/messages/ko.json +++ b/messages/ko.json @@ -1,16 +1,39 @@ { - "app.title": "랜딩 페이지 빌더", - "builder.title": "랜딩 페이지 빌더", - "builder.preview": "미리보기(정적)", - "builder.field.title": "제목", - "builder.field.locale": "로케일", - "builder.field.primaryColor": "대표 색상", - "builder.field.fontFamily": "폰트", - "builder.upload.hero": "히어로 이미지 업로드", - "builder.action.addHero": "히어로 추가", - "builder.action.addFAQ": "FAQ 추가", - "builder.action.addCTA": "CTA 추가", - "builder.action.export": "ZIP 내보내기", - "builder.sections": "섹션", - "builder.form.fields": "폼 필드" + "app": { + "title": "랜딩 페이지 빌더" + }, + "builder": { + "title": "랜딩 페이지 빌더", + "preview": "미리보기(정적)", + "field": { + "title": "제목", + "locale": "로케일", + "primaryColor": "대표 색상", + "fontFamily": "폰트" + }, + "upload": { + "hero": "히어로 이미지 업로드" + }, + "action": { + "addHero": "히어로 추가", + "addFAQ": "FAQ 추가", + "addCTA": "CTA 추가", + "export": "ZIP 내보내기", + "addText": "텍스트 필드 추가", + "addEmail": "이메일 필드 추가", + "addTel": "전화번호 필드 추가", + "addDate": "날짜 필드 추가", + "addTextarea": "텍스트영역 추가", + "addCheckbox": "체크박스 추가", + "addSelect": "셀렉트 추가", + "addRadio": "라디오 추가" + }, + "sections": "섹션", + "form": { + "fields": "폼 필드", + "actionUrl": "액션 URL", + "honeypot": "허니팟 필드", + "minSeconds": "최소 제출 대기(초)" + } + } } -- 2.52.0 From f09dc5320bc7db5e4afe601f8ecbe9c766be9848 Mon Sep 17 00:00:00 2001 From: Jaybe Date: Fri, 14 Nov 2025 18:23:29 +0900 Subject: [PATCH 7/9] test(e2e): account for skip-link initial focus (double Tab before Desktop) --- tests/e2e/viewport-toggle.kbd.e2e.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/e2e/viewport-toggle.kbd.e2e.ts b/tests/e2e/viewport-toggle.kbd.e2e.ts index 0a39c2f..d165357 100644 --- a/tests/e2e/viewport-toggle.kbd.e2e.ts +++ b/tests/e2e/viewport-toggle.kbd.e2e.ts @@ -7,6 +7,7 @@ test('Preview viewport toggle via keyboard (Tab + Enter/Space)', async ({ page } // Tab to first button (Desktop) await page.keyboard.press('Tab') + await page.keyboard.press('Tab') await expect(page.getByRole('button', { name: 'Desktop' })).toBeFocused() // Press Space to toggle Mobile (first ensure Desktop is selected, then move to Mobile with Tab) -- 2.52.0 From 233ff7e9008cfb8fad26c2997e944c848a8baa3f Mon Sep 17 00:00:00 2001 From: Jaybe Date: Fri, 14 Nov 2025 18:30:30 +0900 Subject: [PATCH 8/9] docs(ci): ping to retrigger workflow --- MAIN_PLAN.md | 1 + 1 file changed, 1 insertion(+) diff --git a/MAIN_PLAN.md b/MAIN_PLAN.md index 3933508..388c030 100644 --- a/MAIN_PLAN.md +++ b/MAIN_PLAN.md @@ -122,6 +122,7 @@ - 작업 브랜치 푸시 완료: `chore/ci-verify-a11y-headings` (원격: origin) - PR 생성 및 Actions 결과 기록 예정(base: main) - CI verification note: 러너 온라인 이후, 사소 변경으로 CI 트리거 검증 예정 + - CI rerun: 워크플로 재실행용 ping 커밋 ### 다음 스프린트 후보 과제 - Exporter 회귀 스냅샷 보강(폼 토큰/검증 토큰 범위 확대) -- 2.52.0 From 7a0bfcf60f2f9dc3b2cf167c56e26336b68654c9 Mon Sep 17 00:00:00 2001 From: Jaybe Date: Fri, 14 Nov 2025 18:33:37 +0900 Subject: [PATCH 9/9] test(e2e): explicitly focus Desktop to stabilize keyboard flow --- tests/e2e/viewport-toggle.kbd.e2e.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/tests/e2e/viewport-toggle.kbd.e2e.ts b/tests/e2e/viewport-toggle.kbd.e2e.ts index d165357..599527b 100644 --- a/tests/e2e/viewport-toggle.kbd.e2e.ts +++ b/tests/e2e/viewport-toggle.kbd.e2e.ts @@ -4,11 +4,14 @@ const builderUrl = '/en/builder' test('Preview viewport toggle via keyboard (Tab + Enter/Space)', async ({ page }) => { 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) - await page.keyboard.press('Tab') - await page.keyboard.press('Tab') - await expect(page.getByRole('button', { name: 'Desktop' })).toBeFocused() + // Focus the Desktop button explicitly to avoid flakiness from skip-link/initial focus + const desktopBtn = page.getByRole('button', { name: 'Desktop' }) + await desktopBtn.focus() + await expect(desktopBtn).toBeFocused() // Press Space to toggle Mobile (first ensure Desktop is selected, then move to Mobile with Tab) await page.keyboard.press('Tab') -- 2.52.0