모바일 메뉴와 주요 화면 UX 개선 및 시각 검수

This commit is contained in:
Yun Chan 2026-09-12 17:57:59 +09:00
parent 89b5093ec7
commit e8b770e4d9
50 changed files with 3189 additions and 457 deletions

View file

@ -381,6 +381,81 @@ test.describe("persona studio full sweep", () => {
await expect(page.locator(".ps-authoring-layout > .ps-rail")).toHaveCount(0);
});
test("keeps authoring steps in one row and exposes the editor at every target width", async ({
page,
}) => {
await signInAsTeacher(page);
await mockStudio(page, { catalog: [approvedP1], reviews: [] });
const viewports = [
{ width: 320, height: 844 },
{ width: 390, height: 844 },
{ width: 1440, height: 900 },
];
for (const viewport of viewports) {
await page.setViewportSize(viewport);
await page.goto("/teach/personas?view=personas&mode=create&step=edit");
const stepper = page.getByRole("navigation", { name: "페르소나 작성 단계" });
const steps = stepper.getByRole("button");
await expect(steps).toHaveCount(4);
const boxes = await steps.evaluateAll((elements) =>
elements.map((element) => {
const rect = element.getBoundingClientRect();
return { x: rect.x, y: rect.y, width: rect.width, height: rect.height };
}),
);
expect(Math.max(...boxes.map((box) => box.y)) - Math.min(...boxes.map((box) => box.y))).toBeLessThanOrEqual(1);
for (const box of boxes) {
expect(box.height).toBeGreaterThanOrEqual(44);
expect(box.x).toBeGreaterThanOrEqual(0);
expect(box.x + box.width).toBeLessThanOrEqual(viewport.width);
}
await expect(page.locator(".ps-editor__top")).toBeInViewport();
if (viewport.width <= 720) {
const undersizedActions = await page
.locator(".ps-root .vg-btn:not(:disabled), .ps-root .ps-tabs button:not(:disabled)")
.evaluateAll((elements) =>
elements.flatMap((element) => {
const rect = element.getBoundingClientRect();
if (rect.width === 0 || rect.height === 0) return [];
return rect.width >= 44 && rect.height >= 44
? []
: [{
selector: `${element.tagName.toLowerCase()}.${Array.from(element.classList).join(".")}`,
text: element.textContent?.trim(),
width: rect.width,
height: rect.height,
}];
}),
);
expect(undersizedActions).toEqual([]);
}
await expectNoHorizontalOverflow(page);
if (process.env.PERSONA_AUTHORING_CAPTURE_DIR) {
await page.screenshot({
path: `${process.env.PERSONA_AUTHORING_CAPTURE_DIR}/persona-authoring-${viewport.width}.png`,
fullPage: true,
});
}
}
for (const viewport of viewports) {
await page.setViewportSize(viewport);
await page.goto("/teach/personas?view=catalog");
await expect(page.getByRole("button", { name: "전체 페르소나 보기" })).toBeVisible();
await expectNoHorizontalOverflow(page);
if (process.env.PERSONA_AUTHORING_CAPTURE_DIR) {
await page.screenshot({
path: `${process.env.PERSONA_AUTHORING_CAPTURE_DIR}/persona-catalog-${viewport.width}.png`,
fullPage: true,
});
}
}
});
// checklist: persona-studio-inspector-review-actions
test("edits and approves review drafts from the inspector queue", async ({ page }) => {
await signInAsTeacher(page);