openpencil/tests/e2e/properties/tracking-binding.spec.ts
Danila Poyarkov 77739c42a4
fix(bindings): resolve modes and preserve edit transactions (#671)
* fix(bindings): capture mode edits and expose unresolved values

* fix(bindings): correct unresolved accessibility metadata

* fix(bindings): distinguish mixed identities from unresolved values
2026-09-10 12:14:04 +03:00

50 lines
2.3 KiB
TypeScript

import { expect, test } from '@playwright/test'
import { CanvasHelper } from '#tests/helpers/canvas'
for (const theme of ['light', 'dark']) {
test(`letter spacing variable lifecycle in ${theme}`, async ({ page }) => {
await page.setViewportSize({ width: 1280, height: 1200 })
await page.goto('/?test')
await new CanvasHelper(page).waitForInit()
const id = await page.evaluate(async (mode) => {
const path = '/src/app/shell/theme.ts'
const module = await import(path)
module.useAppTheme().setTheme(mode)
const editor = window.openPencil?.getStore?.()
if (!editor) throw new Error('Editor unavailable')
const id = editor.createShape('TEXT', 100, 100, 240, 80)
editor.updateNode(id, { text: 'Tracking review', fontSize: 24, letterSpacing: 2 })
editor.select([id])
return id
}, theme)
const section = page.getByRole('region', { name: 'Typography', exact: true })
const field = section.locator('[data-property="letterSpacing"]')
await expect(field).toContainText('px')
await field.getByRole('button', { name: 'Apply variable' }).click()
await page.getByRole('button', { name: 'Create number variable from 2', exact: true }).click()
await page.getByPlaceholder('Variable name').fill('Typography/Tracking/Comfortable')
await page.getByRole('button', { name: 'Create', exact: true }).click()
await expect(field).toHaveAttribute('data-bound')
const input = section.getByRole('spinbutton', { name: 'Letter spacing', exact: true })
await input.focus()
await expect(field).toHaveAttribute('data-bound')
await input.fill('3')
await input.press('Enter')
await expect
.poll(() =>
page.evaluate((id) => window.openPencil?.getStore?.().graph.getNode(id)?.letterSpacing, id)
)
.toBe(3)
await expect(field).not.toHaveAttribute('data-bound')
await section.getByRole('heading', { name: 'Typography', exact: true }).click()
await page.keyboard.press(process.platform === 'darwin' ? 'Meta+z' : 'Control+z')
await expect(field).toHaveAttribute('data-bound')
await field.getByRole('button', { name: 'Apply variable' }).click()
await page.getByRole('button', { name: 'Detach variable', exact: true }).click()
await expect(field).not.toHaveAttribute('data-bound')
})
}