openpencil/tests/e2e/settings/general.spec.ts
Danila Poyarkov 91e759d7fd feat(editor): add configurable snapping and guides
- Snap vector points, moved layers, and resized edges to geometry, objects, guides, and pixels
- Add persistent snapping preferences with browser and native menu controls
- Normalize canvas and layout guides across Scene Graph and .fig conversion
- Clear transient snapping feedback across interrupted interactions
2026-08-18 19:11:48 +03:00

76 lines
3 KiB
TypeScript

import { expect, test } from '@playwright/test'
import { CanvasHelper } from '#tests/helpers/canvas'
test('general snapping preferences persist and apply to editor sessions', async ({ page }) => {
await page.goto('/?test')
const canvas = new CanvasHelper(page)
await canvas.waitForInit()
await page.getByTestId('app-settings-trigger').click()
await expect(page.getByTestId('settings-general-panel')).toBeVisible()
const geometry = page.getByRole('switch', { name: 'Snap to geometry' })
const objects = page.getByRole('switch', { name: 'Snap to objects' })
const pixelGrid = page.getByRole('switch', { name: 'Snap to pixel grid' })
await expect(geometry).toBeChecked()
await expect(objects).toBeChecked()
await expect(pixelGrid).toBeChecked()
await geometry.click()
await objects.click()
await pixelGrid.click()
await expect
.poll(() =>
page.evaluate(() => window.openPencil?.getStore?.().state.snappingPreferences ?? null)
)
.toEqual({ geometry: false, objects: false, pixelGrid: false })
await page.getByTestId('app-settings-done').click()
await page.reload()
await canvas.waitForInit()
await page.getByTestId('app-settings-trigger').click()
await expect(geometry).not.toBeChecked()
await expect(objects).not.toBeChecked()
await expect(pixelGrid).not.toBeChecked()
await expect(
page.evaluate(() => window.openPencil?.getStore?.().state.snappingPreferences ?? null)
).resolves.toEqual({ geometry: false, objects: false, pixelGrid: false })
await geometry.click()
await objects.click()
await pixelGrid.click()
})
test('Preferences menu snapping controls use the same preferences', async ({ page }) => {
await page.goto('/?test')
const canvas = new CanvasHelper(page)
await canvas.waitForInit()
await page.getByTestId('menubar-view').click()
await page.getByRole('menuitem', { name: 'Preferences' }).hover()
const geometry = page.getByRole('menuitemcheckbox', { name: 'Snap to geometry' })
const objects = page.getByRole('menuitemcheckbox', { name: 'Snap to objects' })
const pixelGrid = page.getByRole('menuitemcheckbox', { name: 'Snap to pixel grid' })
await expect(geometry).toBeChecked()
await expect(objects).toBeChecked()
await expect(pixelGrid).toBeChecked()
await objects.click()
await page.getByTestId('app-settings-trigger').click()
await expect(page.getByRole('switch', { name: 'Snap to objects' })).not.toBeChecked()
await page.getByRole('switch', { name: 'Snap to objects' }).click()
})
test('settings shortcut preserves the last visited section', async ({ page }) => {
await page.goto('/?test')
const canvas = new CanvasHelper(page)
await canvas.waitForInit()
await page.getByTestId('app-settings-trigger').click()
await page.getByTestId('settings-section-media').click()
await page.getByTestId('app-settings-done').click()
await page.keyboard.press(process.platform === 'darwin' ? 'Meta+,' : 'Control+,')
await expect(page.getByTestId('settings-media-panel')).toBeVisible()
})