mirror of
https://github.com/penpot/penpot.git
synced 2026-11-01 15:40:41 +00:00
* ♻️ Use DS icon buttons in the viewer thumbnails panel The expand, close and scroll buttons of the viewer thumbnails panel become ghost DS icon buttons. They had no accessible name; they are now labelled, and the expand button says whether the panel is expanded. The rotated legacy arrow gives way to the DS arrow icons. The thumbnails stay raw buttons, since they are list items. New keys: labels.expand and viewer.thumbnails.scroll-left/right (en, es). A visual test covers the panel collapsed, on hover and expanded. AI-assisted-by: claude-opus-5-5 * ♻️ Move viewer thumbnails panel styles off the deprecated styles Spacing, sizes, borders, typographies and color aliases move to DS tokens and logical properties, and the file no longer imports refactor/. The scroll buttons keep their 60px height through --button-height and still show only on hover; their tooltip wrappers take the grid cells. The DS body-small typography differs from the old one only in a more compact line-height, so the counter and the board names sit 1px higher. The panel z-index (10) has no DS token and keeps a TODO. AI-assisted-by: claude-opus-5-5
193 lines
5.5 KiB
JavaScript
193 lines
5.5 KiB
JavaScript
import { test, expect } from "@playwright/test";
|
|
import { ViewerPage } from "../pages/ViewerPage";
|
|
|
|
test.beforeEach(async ({ page }) => {
|
|
await ViewerPage.init(page);
|
|
});
|
|
|
|
const singleBoardFileId = "dd5cc0bb-91ff-81b9-8004-77df9cd3edb1";
|
|
const singleBoardPageId = "dd5cc0bb-91ff-81b9-8004-77df9cd3edb2";
|
|
|
|
test("User goes to an empty Viewer", async ({ page }) => {
|
|
const viewerPage = new ViewerPage(page);
|
|
await viewerPage.setupLoggedInUser();
|
|
await viewerPage.setupEmptyFile();
|
|
|
|
await viewerPage.goToViewer();
|
|
|
|
await expect(viewerPage.page.getByTestId("penpot-logo-link")).toBeVisible();
|
|
await expect(viewerPage.page).toHaveScreenshot();
|
|
});
|
|
|
|
test("User goes to the Viewer", async ({ page }) => {
|
|
const viewerPage = new ViewerPage(page);
|
|
await viewerPage.setupLoggedInUser();
|
|
await viewerPage.setupFileWithSingleBoard();
|
|
|
|
await viewerPage.goToViewer({
|
|
fileId: singleBoardFileId,
|
|
pageId: singleBoardPageId,
|
|
});
|
|
|
|
await expect(viewerPage.page.getByTestId("penpot-logo-link")).toBeVisible();
|
|
await expect(viewerPage.page).toHaveScreenshot();
|
|
});
|
|
|
|
test("User goes to the Viewer and opens zoom modal", async ({ page }) => {
|
|
const viewerPage = new ViewerPage(page);
|
|
await viewerPage.setupLoggedInUser();
|
|
await viewerPage.setupFileWithSingleBoard();
|
|
|
|
await viewerPage.goToViewer({
|
|
fileId: singleBoardFileId,
|
|
pageId: singleBoardPageId,
|
|
});
|
|
|
|
await viewerPage.page.getByTitle("Zoom").click();
|
|
|
|
await expect(viewerPage.page.getByTestId("penpot-logo-link")).toBeVisible();
|
|
await expect(viewerPage.page).toHaveScreenshot();
|
|
});
|
|
|
|
test("User goes to the Viewer Comments", async ({ page }) => {
|
|
const viewerPage = new ViewerPage(page);
|
|
await viewerPage.setupLoggedInUser();
|
|
await viewerPage.setupFileWithComments();
|
|
|
|
await viewerPage.goToViewer({
|
|
fileId: singleBoardFileId,
|
|
pageId: singleBoardPageId,
|
|
});
|
|
|
|
await viewerPage.showComments();
|
|
await viewerPage.showCommentsThread(1);
|
|
await expect(
|
|
viewerPage.page.getByRole("button", { name: "Post" }),
|
|
).toBeVisible();
|
|
|
|
await expect(viewerPage.page).toHaveScreenshot();
|
|
});
|
|
|
|
test("User opens Viewer comment list", async ({ page }) => {
|
|
const viewerPage = new ViewerPage(page);
|
|
await viewerPage.setupLoggedInUser();
|
|
await viewerPage.setupFileWithComments();
|
|
|
|
await viewerPage.goToViewer({
|
|
fileId: singleBoardFileId,
|
|
pageId: singleBoardPageId,
|
|
});
|
|
|
|
await viewerPage.showComments();
|
|
await viewerPage.page.getByTestId("viewer-comments-dropdown").click();
|
|
|
|
await viewerPage.page.getByText("Show comments list").click();
|
|
|
|
await expect(
|
|
viewerPage.page.getByRole("button", { name: "Show all comments" }),
|
|
).toBeVisible();
|
|
await expect(viewerPage.page).toHaveScreenshot();
|
|
});
|
|
|
|
test("User goes to the Viewer Inspect code", async ({ page }) => {
|
|
const viewerPage = new ViewerPage(page);
|
|
await viewerPage.setupLoggedInUser();
|
|
await viewerPage.setupFileWithComments();
|
|
|
|
await viewerPage.goToViewer({
|
|
fileId: singleBoardFileId,
|
|
pageId: singleBoardPageId,
|
|
});
|
|
|
|
await viewerPage.showCode();
|
|
|
|
await expect(
|
|
viewerPage.page.getByRole("button", {
|
|
name: "Toggle panel Size and position",
|
|
}),
|
|
).toBeVisible();
|
|
|
|
await expect(viewerPage.page).toHaveScreenshot();
|
|
});
|
|
|
|
test("User goes to the Viewer Inspect code, code tab", async ({ page }) => {
|
|
const viewerPage = new ViewerPage(page);
|
|
await viewerPage.setupLoggedInUser();
|
|
await viewerPage.setupFileWithComments();
|
|
|
|
await viewerPage.goToViewer({
|
|
fileId: singleBoardFileId,
|
|
pageId: singleBoardPageId,
|
|
});
|
|
|
|
await viewerPage.showCode();
|
|
await viewerPage.page
|
|
.getByRole("combobox")
|
|
.filter({ hasText: "Styles" })
|
|
.click();
|
|
await viewerPage.page.getByRole("option", { name: "Code" }).click();
|
|
|
|
await expect(
|
|
viewerPage.page.getByRole("button", { name: "Copy all code" }),
|
|
).toBeVisible();
|
|
|
|
await expect(viewerPage.page).toHaveScreenshot();
|
|
});
|
|
|
|
test("User opens Share modal", async ({ page }) => {
|
|
const viewerPage = new ViewerPage(page);
|
|
await viewerPage.setupLoggedInUser();
|
|
await viewerPage.setupFileWithSingleBoard();
|
|
|
|
await viewerPage.goToViewer({
|
|
fileId: singleBoardFileId,
|
|
pageId: singleBoardPageId,
|
|
});
|
|
|
|
await viewerPage.page.getByRole("button", { name: "Share" }).click();
|
|
|
|
await expect(
|
|
viewerPage.page.getByRole("button", { name: "Get link" }),
|
|
).toBeVisible();
|
|
await expect(viewerPage.page).toHaveScreenshot();
|
|
});
|
|
|
|
test.describe("Thumbnails panel", () => {
|
|
test("Shows the thumbnails panel collapsed and expanded", async ({
|
|
page,
|
|
}) => {
|
|
const viewerPage = new ViewerPage(page);
|
|
await viewerPage.setupLoggedInUser();
|
|
await viewerPage.setupFileWithMultipleBoards();
|
|
await viewerPage.goToViewer({
|
|
fileId: "dd5cc0bb-91ff-81b9-8004-77df9cd3edb0",
|
|
pageId: "dd5cc0bb-91ff-81b9-8004-77df9cd3edb3",
|
|
});
|
|
|
|
await page.locator("#current-frame").click();
|
|
const panel = page.locator("section").filter({ hasText: /boards/i });
|
|
await expect(panel).toBeVisible();
|
|
await page.mouse.move(640, 600);
|
|
// Collapsed: the summary with its expand and close buttons.
|
|
await expect(panel).toHaveScreenshot({
|
|
maxDiffPixelRatio: 0,
|
|
threshold: 0,
|
|
});
|
|
|
|
// The scroll handlers only show on hover.
|
|
await panel.locator("button").nth(3).hover();
|
|
await expect(panel).toHaveScreenshot({
|
|
maxDiffPixelRatio: 0,
|
|
threshold: 0,
|
|
});
|
|
|
|
await panel.locator("button").first().click();
|
|
await page.mouse.move(640, 700);
|
|
// Expanded: the expand arrow points up.
|
|
await expect(panel).toHaveScreenshot({
|
|
maxDiffPixelRatio: 0,
|
|
threshold: 0,
|
|
});
|
|
});
|
|
});
|