feat: 운영 안정성과 세션 음성 경험 개선

This commit is contained in:
Yun Chan 2026-07-31 00:13:08 +09:00
parent facc4ad2d9
commit c788343467
95 changed files with 8431 additions and 1785 deletions

View file

@ -426,6 +426,22 @@ test.describe("layout visual gate @single-run", () => {
await ensureShotDir();
});
// 이 게이트는 다크 표면을 기준으로 레이아웃을 캡처하고, 라이트 검사는 각 테스트가
// "라이트 모드로" 버튼을 눌러 명시적으로 전환한 뒤에만 한다. 예전에는 앱이 저장값
// 없을 때 무조건 dark 로 떨어져서 이 전제가 공짜로 성립했다. 2026-07-27 부터
// readInitialTheme() 이 prefers-color-scheme 을 따르므로(소유자 결정), 이 프로젝트에
// colorScheme 설정이 없으면 Chromium 기본값인 light 로 시작해 게이트가 깨진다.
// 게이트가 자기 전제를 직접 심는다. 테마 store 의 "저장값 우선" 규칙을 그대로 쓴다.
test.beforeEach(async ({ page }) => {
await page.addInitScript(() => {
try {
localStorage.setItem("vignette.theme", "dark");
} catch {
/* storage 접근 불가 환경에서는 앱 폴백(dark)에 맡긴다 */
}
});
});
test("learner home stays contained and legible across all widths", async ({ page }) => {
await page.request.post("/api/auth/dev-login", {
data: {
@ -788,7 +804,7 @@ test.describe("layout visual gate @single-run", () => {
]) {
await page.setViewportSize(viewport);
await expectNoHorizontalOverflow(page);
const scrollReport = await page.locator(".ad-user-table-scroll").evaluate((element) => {
const scrollReport = await page.locator(".vgops-user-table-scroll").evaluate((element) => {
element.scrollLeft = 0;
const report = {
clientWidth: element.clientWidth,
@ -805,7 +821,7 @@ test.describe("layout visual gate @single-run", () => {
scrollReport.initialScroll,
);
await expect(page.getByRole("columnheader", { name: /작업/ })).toBeVisible();
await page.locator(".ad-user-table-scroll").evaluate((element) => {
await page.locator(".vgops-user-table-scroll").evaluate((element) => {
element.scrollLeft = 0;
});
await page.screenshot({