From d263d63da972b8ac1c99fbc264670fcf48d4debb Mon Sep 17 00:00:00 2001 From: Danila Poyarkov Date: Tue, 31 Mar 2026 16:42:03 +0300 Subject: [PATCH] Fix rotated frame overlays and add snapshots --- packages/core/src/renderer/labels.ts | 29 +-- packages/core/src/renderer/overlays.ts | 124 +++------- packages/core/src/renderer/renderer.ts | 67 ++++-- .../core/src/renderer/selection-labels.ts | 211 ++++++++++++++++++ tests/e2e/canvas-manipulation.spec.ts | 133 +++++++++++ tests/e2e/frame-overlays.spec.ts | 118 ++++++++++ ...hild-hover-highlight-openpencil-darwin.png | Bin 0 -> 49543 bytes ...ame-selection-labels-openpencil-darwin.png | Bin 0 -> 44029 bytes ...ction-labels-preview-openpencil-darwin.png | Bin 0 -> 49577 bytes 9 files changed, 551 insertions(+), 131 deletions(-) create mode 100644 packages/core/src/renderer/selection-labels.ts create mode 100644 tests/e2e/frame-overlays.spec.ts create mode 100644 tests/e2e/frame-overlays.spec.ts-snapshots/rotated-frame-child-hover-highlight-openpencil-darwin.png create mode 100644 tests/e2e/frame-overlays.spec.ts-snapshots/rotated-frame-selection-labels-openpencil-darwin.png create mode 100644 tests/e2e/frame-overlays.spec.ts-snapshots/rotated-frame-selection-labels-preview-openpencil-darwin.png diff --git a/packages/core/src/renderer/labels.ts b/packages/core/src/renderer/labels.ts index b8cb9355e..7a460faea 100644 --- a/packages/core/src/renderer/labels.ts +++ b/packages/core/src/renderer/labels.ts @@ -73,26 +73,29 @@ function drawSectionTitle( const pillW = Math.min(textWidth + SECTION_TITLE_PADDING_X * 2, maxPillW) const pillH = SECTION_TITLE_HEIGHT - const pillX = screenX - const pillY = nested ? screenY + SECTION_TITLE_GAP : screenY - pillH - SECTION_TITLE_GAP - - if (node.fills.length > 0 && node.fills[0].visible) { - const c = r.resolveFillColor(node.fills[0], 0, node, graph) - r.auxFill.setColor(r.ck.Color4f(c.r, c.g, c.b, node.fills[0].opacity)) - } else { - r.auxFill.setColor(r.ck.Color4f(0.37, 0.37, 0.37, 1)) - } - const pillRect = r.ck.LTRBRect(pillX, pillY, pillX + pillW, pillY + pillH) - canvas.drawRRect(r.ck.RRectXY(pillRect, SECTION_TITLE_RADIUS, SECTION_TITLE_RADIUS), r.auxFill) + const localPillX = 0 + const localPillY = nested ? SECTION_TITLE_GAP : -pillH - SECTION_TITLE_GAP const pillColor = node.fills.length > 0 && node.fills[0].visible ? r.resolveFillColor(node.fills[0], 0, node, graph) : { r: 0.37, g: 0.37, b: 0.37, a: 1 } + + canvas.save() + canvas.translate(screenX, screenY) + if (node.rotation !== 0) { + canvas.rotate(node.rotation, 0, 0) + } + + r.auxFill.setColor(r.ck.Color4f(pillColor.r, pillColor.g, pillColor.b, pillColor.a)) + const pillRect = r.ck.LTRBRect(localPillX, localPillY, localPillX + pillW, localPillY + pillH) + canvas.drawRRect(r.ck.RRectXY(pillRect, SECTION_TITLE_RADIUS, SECTION_TITLE_RADIUS), r.auxFill) + const lum = 0.299 * pillColor.r + 0.587 * pillColor.g + 0.114 * pillColor.b r.auxFill.setColor(lum > 0.5 ? r.ck.BLACK : r.ck.WHITE) - const textY = pillY + pillH * 0.7 - canvas.drawText(displayText, pillX + SECTION_TITLE_PADDING_X, textY, r.auxFill, font) + const textY = localPillY + pillH * 0.7 + canvas.drawText(displayText, localPillX + SECTION_TITLE_PADDING_X, textY, r.auxFill, font) + canvas.restore() } export function drawComponentLabels(r: SkiaRenderer, canvas: Canvas, graph: SceneGraph): void { diff --git a/packages/core/src/renderer/overlays.ts b/packages/core/src/renderer/overlays.ts index 5cc580514..f9a580f6e 100644 --- a/packages/core/src/renderer/overlays.ts +++ b/packages/core/src/renderer/overlays.ts @@ -1,11 +1,5 @@ import { HANDLE_HALF_SIZE, - LABEL_OFFSET_Y, - SIZE_PILL_PADDING_X, - SIZE_PILL_PADDING_Y, - SIZE_PILL_HEIGHT, - SIZE_PILL_RADIUS, - SIZE_PILL_TEXT_OFFSET_Y, MARQUEE_FILL_ALPHA, SELECTION_DASH_ALPHA, LAYOUT_INDICATOR_STROKE, @@ -28,6 +22,21 @@ import type { Rect, Vector } from '../types' import type { SkiaRenderer, RenderOverlays } from './renderer' import type { Canvas } from 'canvaskit-wasm' +function getNodeTransformChain(graph: SceneGraph, node: SceneNode): SceneNode[] { + const chain: SceneNode[] = [] + let current = node + + for (;;) { + chain.unshift(current) + if (!current.parentId) break + const parent = graph.getNode(current.parentId) + if (!parent || parent.id === graph.rootId || parent.type === 'CANVAS') break + current = parent + } + + return chain +} + export function drawHoverHighlight( r: SkiaRenderer, canvas: Canvas, @@ -38,22 +47,23 @@ export function drawHoverHighlight( const node = graph.getNode(hoveredNodeId) if (!node) return - const abs = graph.getAbsolutePosition(node.id) - const sx = abs.x * r.zoom + r.panX - const sy = abs.y * r.zoom + r.panY - r.auxStroke.setStrokeWidth(1 / r.zoom) r.auxStroke.setColor(r.isComponentType(node.type) ? r.compColor() : r.selColor()) r.auxStroke.setPathEffect(null) + const chain = getNodeTransformChain(graph, node) + canvas.save() - canvas.translate(sx, sy) - if (node.rotation !== 0) { - const cx = (node.width / 2) * r.zoom - const cy = (node.height / 2) * r.zoom - canvas.rotate(node.rotation, cx, cy) - } + canvas.translate(r.panX, r.panY) canvas.scale(r.zoom, r.zoom) + + for (const item of chain) { + canvas.translate(item.x, item.y) + if (item.rotation !== 0) { + canvas.rotate(item.rotation, item.width / 2, item.height / 2) + } + } + r.strokeNodeShape(canvas, node, r.auxStroke) canvas.restore() } @@ -115,7 +125,7 @@ export function drawSelection( const rotation = overlays.rotationPreview?.nodeId === id ? overlays.rotationPreview.angle : node.rotation r.drawNodeSelection(canvas, node, rotation, graph) - r.drawSelectionLabels(canvas, graph, selectedIds) + r.drawSelectionLabels(canvas, graph, selectedIds, overlays) r.selectionPaint.setColor(r.selColor()) return @@ -144,7 +154,7 @@ export function drawSelection( if (nodes.length === 0) return r.drawGroupBounds(canvas, nodes, graph) - r.drawSelectionLabels(canvas, graph, selectedIds) + r.drawSelectionLabels(canvas, graph, selectedIds, overlays) } function withNodeBounds( @@ -194,82 +204,6 @@ export function drawNodeSelection( }) } -export function drawSelectionLabels( - r: SkiaRenderer, - canvas: Canvas, - graph: SceneGraph, - selectedIds: Set -): void { - if (!r.labelFont || !r.sizeFont) return - - let minX = Infinity - let minY = Infinity - let maxX = -Infinity - let maxY = -Infinity - const nodes: SceneNode[] = [] - - for (const id of selectedIds) { - const node = graph.getNode(id) - if (!node) continue - nodes.push(node) - const abs = graph.getAbsolutePosition(id) - minX = Math.min(minX, abs.x) - minY = Math.min(minY, abs.y) - maxX = Math.max(maxX, abs.x + node.width) - maxY = Math.max(maxY, abs.y + node.height) - } - - if (nodes.length === 0) return - - const sx1 = minX * r.zoom + r.panX - const sy1 = minY * r.zoom + r.panY - const sx2 = maxX * r.zoom + r.panX - const sy2 = maxY * r.zoom + r.panY - const smx = (sx1 + sx2) / 2 - - if (nodes.length === 1) { - const node = nodes[0] - const parentNode = node.parentId ? graph.getNode(node.parentId) : null - const isTopLevel = !parentNode || parentNode.type === 'CANVAS' || parentNode.type === 'SECTION' - if (node.type === 'FRAME' && isTopLevel) { - r.auxFill.setColor(r.selColor()) - canvas.drawText(node.name, sx1, sy1 - LABEL_OFFSET_Y, r.auxFill, r.labelFont) - } - } - - const w = Math.round(maxX - minX) - const h = Math.round(maxY - minY) - const sizeText = `${w} × ${h}` - const glyphIds = r.sizeFont.getGlyphIDs(sizeText) - const widths = r.sizeFont.getGlyphWidths(glyphIds) - let textWidth = 0 - for (const w of widths) textWidth += w - const pillW = textWidth + SIZE_PILL_PADDING_X * 2 - const pillH = SIZE_PILL_HEIGHT - const pillX = smx - pillW / 2 - const pillY = sy2 + SIZE_PILL_PADDING_Y - - const allComponents = nodes.length > 0 && nodes.every((n) => r.isComponentType(n.type)) - const pillColor = allComponents ? r.compColor() : r.selColor() - - r.auxFill.setColor(pillColor) - const rrect = r.ck.RRectXY( - r.ck.LTRBRect(pillX, pillY, pillX + pillW, pillY + pillH), - SIZE_PILL_RADIUS, - SIZE_PILL_RADIUS - ) - canvas.drawRRect(rrect, r.auxFill) - - r.auxFill.setColor(r.ck.WHITE) - canvas.drawText( - sizeText, - pillX + SIZE_PILL_PADDING_X, - pillY + SIZE_PILL_TEXT_OFFSET_Y, - r.auxFill, - r.sizeFont - ) -} - export function drawParentFrameOutlines( r: SkiaRenderer, canvas: Canvas, @@ -377,6 +311,8 @@ export function getRotatedCorners(r: SkiaRenderer, n: SceneNode, abs: Vector): V return rotatedCorners(cx, cy, hw, hh, n.rotation) } +export { drawSelectionLabels } from './selection-labels' + export function drawHandle(r: SkiaRenderer, canvas: Canvas, x: number, y: number): void { r.auxFill.setColor(r.ck.WHITE) const rect = r.ck.LTRBRect( diff --git a/packages/core/src/renderer/renderer.ts b/packages/core/src/renderer/renderer.ts index 8780b044d..6d2d7410a 100644 --- a/packages/core/src/renderer/renderer.ts +++ b/packages/core/src/renderer/renderer.ts @@ -1,3 +1,8 @@ +import { + resolveNodeFillColor, + resolveNodeStrokeColor, + type ResolvedRenderColor +} from '../color-management' /* eslint-disable max-lines -- SkiaRenderer class; text, pen-overlay, fills, scene already extracted */ import { SELECTION_COLOR, @@ -30,7 +35,6 @@ import { } from '../constants' import { computeAbsoluteBounds } from '../geometry' import { RenderProfiler } from '../profiler' -import { resolveNodeFillColor, resolveNodeStrokeColor, type ResolvedRenderColor } from '../color-management' import { drawAiOverlays as drawAiOverlaysFn } from './ai-overlays' import { getCachedDropShadow as getCachedDropShadowFn, @@ -570,25 +574,28 @@ export class SkiaRenderer { const widths = font.getGlyphWidths(glyphIds) let textW = 0 for (const w of widths) textW += w + const pillW = Math.min(textW + SECTION_TITLE_PADDING_X * 2, child.width * this.zoom) / this.zoom const pillH = SECTION_TITLE_HEIGHT / this.zoom const gap = SECTION_TITLE_GAP / this.zoom + const localX = canvasX - ax + const localY = canvasY - ay - const pillX = ax - let pillY: number - if (insideSection) { - pillY = ay + gap - } else { - pillY = ay - pillH - gap + let hitX = localX + let hitY = localY + if (child.rotation !== 0) { + const rad = (-child.rotation * Math.PI) / 180 + const cos = Math.cos(rad) + const sin = Math.sin(rad) + hitX = localX * cos - localY * sin + hitY = localX * sin + localY * cos } - if ( - canvasX >= pillX && - canvasX <= pillX + pillW && - canvasY >= pillY && - canvasY <= pillY + pillH - ) { + const pillX = 0 + const pillY = insideSection ? gap : -pillH - gap + + if (hitX >= pillX && hitX <= pillX + pillW && hitY >= pillY && hitY <= pillY + pillH) { result = child return } @@ -687,16 +694,23 @@ export class SkiaRenderer { const labelW = textW / this.zoom const labelH = LABEL_FONT_SIZE / this.zoom - const gap = LABEL_OFFSET_Y / this.zoom - const labelX = abs.x - const labelY = abs.y - gap - labelH + const localX = canvasX - abs.x + const localY = canvasY - abs.y - if ( - canvasX >= labelX && - canvasX <= labelX + labelW && - canvasY >= labelY && - canvasY <= labelY + labelH - ) { + let hitX = localX + let hitY = localY + if (node.rotation !== 0) { + const rad = (-node.rotation * Math.PI) / 180 + const cos = Math.cos(rad) + const sin = Math.sin(rad) + hitX = localX * cos - localY * sin + hitY = localX * sin + localY * cos + } + + const labelX = 0 + const labelY = -LABEL_OFFSET_Y / this.zoom - labelH + + if (hitX >= labelX && hitX <= labelX + labelW && hitY >= labelY && hitY <= labelY + labelH) { return node } @@ -1095,8 +1109,13 @@ export class SkiaRenderer { drawNodeSelectionFn(this, canvas, node, rotation, graph) } - drawSelectionLabels(canvas: Canvas, graph: SceneGraph, selectedIds: Set): void { - drawSelectionLabelsFn(this, canvas, graph, selectedIds) + drawSelectionLabels( + canvas: Canvas, + graph: SceneGraph, + selectedIds: Set, + overlays?: RenderOverlays + ): void { + drawSelectionLabelsFn(this, canvas, graph, selectedIds, overlays) } drawParentFrameOutlines(canvas: Canvas, graph: SceneGraph, selectedIds: Set): void { diff --git a/packages/core/src/renderer/selection-labels.ts b/packages/core/src/renderer/selection-labels.ts new file mode 100644 index 000000000..bf98f87dc --- /dev/null +++ b/packages/core/src/renderer/selection-labels.ts @@ -0,0 +1,211 @@ +import { + LABEL_OFFSET_Y, + SIZE_PILL_PADDING_X, + SIZE_PILL_PADDING_Y, + SIZE_PILL_HEIGHT, + SIZE_PILL_RADIUS, + SIZE_PILL_TEXT_OFFSET_Y +} from '../constants' +import { degToRad, rotatePoint, rotatedCorners } from '../geometry' + +import type { SceneNode, SceneGraph } from '../scene-graph' +import type { SkiaRenderer, RenderOverlays } from './renderer' +import type { Canvas } from 'canvaskit-wasm' + +function getOverlayRotation(node: SceneNode, overlays?: RenderOverlays): number { + return overlays?.rotationPreview?.nodeId === node.id + ? overlays.rotationPreview.angle + : node.rotation +} + +function accumulateSelectionBounds( + graph: SceneGraph, + selectedIds: Set, + overlays?: RenderOverlays +): { nodes: SceneNode[]; minX: number; minY: number; maxX: number; maxY: number } { + let minX = Infinity + let minY = Infinity + let maxX = -Infinity + let maxY = -Infinity + const nodes: SceneNode[] = [] + + for (const id of selectedIds) { + const node = graph.getNode(id) + if (!node) continue + nodes.push(node) + const abs = graph.getAbsolutePosition(id) + const rotation = getOverlayRotation(node, overlays) + if (rotation !== 0) { + const corners = rotatedCorners(abs.x, abs.y, node.width, node.height, rotation) + for (const corner of corners) { + minX = Math.min(minX, corner.x) + minY = Math.min(minY, corner.y) + maxX = Math.max(maxX, corner.x) + maxY = Math.max(maxY, corner.y) + } + continue + } + minX = Math.min(minX, abs.x) + minY = Math.min(minY, abs.y) + maxX = Math.max(maxX, abs.x + node.width) + maxY = Math.max(maxY, abs.y + node.height) + } + + return { nodes, minX, minY, maxX, maxY } +} + +function drawSingleFrameTitle( + r: SkiaRenderer, + canvas: Canvas, + graph: SceneGraph, + node: SceneNode, + overlays: RenderOverlays, + labelFont: NonNullable +): void { + const parentNode = node.parentId ? graph.getNode(node.parentId) : null + const isTopLevel = !parentNode || parentNode.type === 'CANVAS' || parentNode.type === 'SECTION' + if (node.type !== 'FRAME' || !isTopLevel) return + + const abs = graph.getAbsolutePosition(node.id) + const rotation = getOverlayRotation(node, overlays) + const anchor = + rotation === 0 + ? { x: abs.x, y: abs.y } + : rotatePoint( + abs.x, + abs.y, + abs.x + node.width / 2, + abs.y + node.height / 2, + degToRad(rotation) + ) + const labelX = anchor.x * r.zoom + r.panX + const labelY = anchor.y * r.zoom + r.panY - LABEL_OFFSET_Y + + r.auxFill.setColor(r.selColor()) + canvas.save() + canvas.translate(labelX, labelY) + if (rotation !== 0) { + canvas.rotate(rotation, 0, LABEL_OFFSET_Y) + } + canvas.drawText(node.name, 0, 0, r.auxFill, labelFont) + canvas.restore() +} + +function drawSingleSelectionSize( + r: SkiaRenderer, + canvas: Canvas, + graph: SceneGraph, + node: SceneNode, + overlays: RenderOverlays, + sizeFont: NonNullable +): void { + const sizeText = `${Math.round(node.width)} × ${Math.round(node.height)}` + const glyphIds = sizeFont.getGlyphIDs(sizeText) + const widths = sizeFont.getGlyphWidths(glyphIds) + let textWidth = 0 + for (const width of widths) textWidth += width + const pillW = textWidth + SIZE_PILL_PADDING_X * 2 + const pillH = SIZE_PILL_HEIGHT + const pillColor = r.isComponentType(node.type) ? r.compColor() : r.selColor() + const abs = graph.getAbsolutePosition(node.id) + const rotation = getOverlayRotation(node, overlays) + const cx = (abs.x + node.width / 2) * r.zoom + r.panX + const cy = (abs.y + node.height / 2) * r.zoom + r.panY + const localY = (node.height * r.zoom) / 2 + SIZE_PILL_PADDING_Y + + canvas.save() + canvas.translate(cx, cy) + if (rotation !== 0) { + canvas.rotate(rotation, 0, 0) + } + + r.auxFill.setColor(pillColor) + const rrect = r.ck.RRectXY( + r.ck.LTRBRect(-pillW / 2, localY, pillW / 2, localY + pillH), + SIZE_PILL_RADIUS, + SIZE_PILL_RADIUS + ) + canvas.drawRRect(rrect, r.auxFill) + + r.auxFill.setColor(r.ck.WHITE) + canvas.drawText( + sizeText, + -pillW / 2 + SIZE_PILL_PADDING_X, + localY + SIZE_PILL_TEXT_OFFSET_Y, + r.auxFill, + sizeFont + ) + canvas.restore() +} + +function drawMultiSelectionSize( + r: SkiaRenderer, + canvas: Canvas, + nodes: SceneNode[], + minX: number, + minY: number, + maxX: number, + maxY: number, + sizeFont: NonNullable +): void { + const sizeText = `${Math.round(maxX - minX)} × ${Math.round(maxY - minY)}` + const glyphIds = sizeFont.getGlyphIDs(sizeText) + const widths = sizeFont.getGlyphWidths(glyphIds) + let textWidth = 0 + for (const width of widths) textWidth += width + const pillW = textWidth + SIZE_PILL_PADDING_X * 2 + const pillH = SIZE_PILL_HEIGHT + const sx1 = minX * r.zoom + r.panX + const sx2 = maxX * r.zoom + r.panX + const sy2 = maxY * r.zoom + r.panY + const smx = (sx1 + sx2) / 2 + const pillX = smx - pillW / 2 + const pillY = sy2 + SIZE_PILL_PADDING_Y + const allComponents = nodes.length > 0 && nodes.every((n) => r.isComponentType(n.type)) + const pillColor = allComponents ? r.compColor() : r.selColor() + + r.auxFill.setColor(pillColor) + const rrect = r.ck.RRectXY( + r.ck.LTRBRect(pillX, pillY, pillX + pillW, pillY + pillH), + SIZE_PILL_RADIUS, + SIZE_PILL_RADIUS + ) + canvas.drawRRect(rrect, r.auxFill) + + r.auxFill.setColor(r.ck.WHITE) + canvas.drawText( + sizeText, + pillX + SIZE_PILL_PADDING_X, + pillY + SIZE_PILL_TEXT_OFFSET_Y, + r.auxFill, + sizeFont + ) +} + +export function drawSelectionLabels( + r: SkiaRenderer, + canvas: Canvas, + graph: SceneGraph, + selectedIds: Set, + overlays?: RenderOverlays +): void { + const labelFont = r.labelFont + const sizeFont = r.sizeFont + if (!labelFont || !sizeFont) return + + const activeOverlays = overlays ?? {} + const { nodes, minX, minY, maxX, maxY } = accumulateSelectionBounds( + graph, + selectedIds, + activeOverlays + ) + if (nodes.length === 0) return + + if (nodes.length === 1) { + drawSingleFrameTitle(r, canvas, graph, nodes[0], activeOverlays, labelFont) + drawSingleSelectionSize(r, canvas, graph, nodes[0], activeOverlays, sizeFont) + return + } + + drawMultiSelectionSize(r, canvas, nodes, minX, minY, maxX, maxY, sizeFont) +} diff --git a/tests/e2e/canvas-manipulation.spec.ts b/tests/e2e/canvas-manipulation.spec.ts index 86544f168..414ea81f3 100644 --- a/tests/e2e/canvas-manipulation.spec.ts +++ b/tests/e2e/canvas-manipulation.spec.ts @@ -181,3 +181,136 @@ test('hover highlight changes canvas rendering', async () => { expect(Buffer.compare(noHoverShot, hoverShot)).not.toBe(0) canvas.assertNoErrors() }) + +async function setupFrameChild(rotation: number) { + await canvas.clearCanvas() + + const setup = await page.evaluate((frameRotation) => { + const store = window.__OPEN_PENCIL_STORE__! + const frameId = store.createShape('FRAME', 180, 160, 240, 160) + if (!frameId) return null + store.updateNode(frameId, { rotation: frameRotation }) + const rectId = store.createShape('RECTANGLE', 245, 205, 60, 40) + if (!rectId) return null + store.graph.reparentNode(rectId, frameId) + store.updateNode(rectId, { x: 65, y: 45 }) + store.select([]) + store.requestRender() + return { frameId, rectId } + }, rotation) + + expect(setup).not.toBeNull() + await canvas.waitForRender() + + const state = await page.evaluate(() => { + const store = window.__OPEN_PENCIL_STORE__! + const pageId = store.state.currentPageId + const pageNode = store.graph.getNode(pageId) + const frame = pageNode?.childIds + .map((id: string) => store.graph.getNode(id)) + .find((node: { type: string } | undefined) => node?.type === 'FRAME') + if (!frame) return null + const child = frame.childIds + .map((childId: string) => store.graph.getNode(childId)) + .find((node: { type: string } | undefined) => node?.type === 'RECTANGLE') + if (!child) return null + const abs = store.graph.getAbsolutePosition(frame.id) + const cx = abs.x + frame.width / 2 + const cy = abs.y + frame.height / 2 + const childCx = abs.x + child.x + child.width / 2 + const childCy = abs.y + child.y + child.height / 2 + const rad = (frame.rotation * Math.PI) / 180 + const dx = childCx - cx + const dy = childCy - cy + return { + childId: child.id, + hitX: cx + dx * Math.cos(rad) - dy * Math.sin(rad), + hitY: cy + dx * Math.sin(rad) + dy * Math.cos(rad), + missX: abs.x + 20, + missY: abs.y + 20, + } + }) + + expect(state).not.toBeNull() + return state! +} + +test('frame children keep correct hover and click hit area without rotation', async () => { + const state = await setupFrameChild(0) + + await canvas.hover(state.hitX, state.hitY) + const hoveredId = await page.evaluate(() => window.__OPEN_PENCIL_STORE__!.state.hoveredNodeId) + expect(hoveredId).toBe(state.childId) + + await canvas.click(state.hitX, state.hitY) + await canvas.waitForRender() + const selected = await getSelectedNode(page) + expect(selected?.id).toBe(state.childId) + + await canvas.hover(state.missX, state.missY) + const hoveredMiss = await page.evaluate(() => window.__OPEN_PENCIL_STORE__!.state.hoveredNodeId) + expect(hoveredMiss).not.toBe(state.childId) + canvas.assertNoErrors() +}) + +test('rotated frame children keep correct hover and click hit area', async () => { + const state = await setupFrameChild(35) + + await canvas.hover(state.hitX, state.hitY) + const hoveredId = await page.evaluate(() => window.__OPEN_PENCIL_STORE__!.state.hoveredNodeId) + expect(hoveredId).toBe(state.childId) + + await canvas.click(state.hitX, state.hitY) + await canvas.waitForRender() + const selected = await getSelectedNode(page) + expect(selected?.id).toBe(state.childId) + + await canvas.hover(state.missX, state.missY) + const hoveredMiss = await page.evaluate(() => window.__OPEN_PENCIL_STORE__!.state.hoveredNodeId) + expect(hoveredMiss).not.toBe(state.childId) + canvas.assertNoErrors() +}) + + test('rotation drag exposes live rotation preview state', async () => { + await canvas.clearCanvas() + await canvas.drawRect(200, 200, 100, 100) + await canvas.click(250, 250) + await canvas.waitForRender() + + const viewport = await page.evaluate(() => { + const store = window.__OPEN_PENCIL_STORE__! + const id = [...store.state.selectedIds][0] + const n = store.graph.getNode(id) + if (!n) return null + const abs = store.graph.getAbsolutePosition(id) + const zoom = store.state.zoom + const panX = store.state.panX + const panY = store.state.panY + const cx = (abs.x + n.width / 2) * zoom + panX + const topMidY = abs.y * zoom + panY + return { cx, topMidY } + }) + expect(viewport).not.toBeNull() + + const box = await page.locator('canvas').boundingBox() + if (!box) throw new Error('No canvas') + + const rx = box.x + viewport!.cx + const ry = box.y + viewport!.topMidY - 24 + + await page.mouse.move(rx, ry) + await canvas.waitForRender() + await page.mouse.down() + await page.mouse.move(rx + 60, ry + 60, { steps: 15 }) + await canvas.waitForRender() + + const preview = await page.evaluate(() => window.__OPEN_PENCIL_STORE__!.state.rotationPreview) + expect(preview).not.toBeNull() + + await page.mouse.up() + await canvas.waitForRender() + + const clearedPreview = await page.evaluate(() => window.__OPEN_PENCIL_STORE__!.state.rotationPreview) + expect(clearedPreview).toBeNull() + canvas.assertNoErrors() +}) diff --git a/tests/e2e/frame-overlays.spec.ts b/tests/e2e/frame-overlays.spec.ts new file mode 100644 index 000000000..ce6f2c26e --- /dev/null +++ b/tests/e2e/frame-overlays.spec.ts @@ -0,0 +1,118 @@ +import { test, expect, type Page } from '@playwright/test' + +import { CanvasHelper } from '../helpers/canvas' + +let page: Page +let canvas: CanvasHelper + +test.describe.configure({ mode: 'serial' }) + +test.beforeAll(async ({ browser }) => { + page = await browser.newPage() + await page.goto('/?test&no-chrome') + canvas = new CanvasHelper(page) + await canvas.waitForInit() +}) + +test.afterAll(async () => { + await page.close() +}) + +test.beforeEach(async () => { + await canvas.clearCanvas() +}) + +async function expectCanvas(name: string) { + canvas.assertNoErrors() + const buffer = await canvas.canvas.screenshot() + expect(buffer).toMatchSnapshot(`${name}.png`) +} + +async function createOverlayDemo(rotation: number) { + await page.evaluate((frameRotation) => { + const store = window.__OPEN_PENCIL_STORE__! + const pageId = store.state.currentPageId + + const frame = store.graph.createNode('FRAME', pageId, { + name: 'Typography', + x: 140, + y: 140, + width: 300, + height: 120, + rotation: frameRotation, + cornerRadius: 16, + fills: [{ type: 'SOLID', color: { r: 1, g: 1, b: 1, a: 1 }, visible: true, opacity: 1 }], + strokes: [] + }) + + store.graph.createNode('TEXT', frame.id, { + name: 'Heading', + text: 'Heading', + x: 24, + y: 20, + width: 120, + height: 32, + fontSize: 22, + fontWeight: 700, + textAutoResize: 'WIDTH_AND_HEIGHT' + }) + + store.graph.createNode('TEXT', frame.id, { + name: 'Body', + text: 'The quick brown fox jumps.', + x: 24, + y: 62, + width: 220, + height: 24, + fontSize: 14, + textAutoResize: 'WIDTH_AND_HEIGHT' + }) + + const hoverTarget = store.graph.createNode('RECTANGLE', frame.id, { + name: 'Hover Target', + x: 210, + y: 28, + width: 56, + height: 40, + cornerRadius: 10, + fills: [ + { + type: 'SOLID', + color: { r: 0.42, g: 0.78, b: 0.58, a: 1 }, + visible: true, + opacity: 1 + } + ] + }) + + store.select([frame.id]) + store.state.hoveredNodeId = hoverTarget.id + store.requestRender() + }, rotation) + + await canvas.waitForRender() +} + +test('rotated frame selection labels render with hovered child', async () => { + await createOverlayDemo(18) + await expectCanvas('rotated-frame-selection-labels') +}) + +test('rotation preview updates frame labels before mouse up', async () => { + await createOverlayDemo(0) + + await page.evaluate(() => { + const store = window.__OPEN_PENCIL_STORE__! + const frameId = [...store.state.selectedIds][0] + store.state.rotationPreview = { nodeId: frameId, angle: 28 } + store.requestRepaint() + }) + + await canvas.waitForRender() + await expectCanvas('rotated-frame-selection-labels-preview') +}) + +test('hover highlight stays aligned for child inside rotated frame', async () => { + await createOverlayDemo(28) + await expectCanvas('rotated-frame-child-hover-highlight') +}) diff --git a/tests/e2e/frame-overlays.spec.ts-snapshots/rotated-frame-child-hover-highlight-openpencil-darwin.png b/tests/e2e/frame-overlays.spec.ts-snapshots/rotated-frame-child-hover-highlight-openpencil-darwin.png new file mode 100644 index 0000000000000000000000000000000000000000..4d91cf6c43b34b42e1eec0bc8ed26f6fd878ac3e GIT binary patch literal 49543 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 literal 0 HcmV?d00001 diff --git a/tests/e2e/frame-overlays.spec.ts-snapshots/rotated-frame-selection-labels-openpencil-darwin.png b/tests/e2e/frame-overlays.spec.ts-snapshots/rotated-frame-selection-labels-openpencil-darwin.png new file mode 100644 index 0000000000000000000000000000000000000000..95d391c72cf45cd0c0603ed5140eace341002a54 GIT binary patch literal 44029 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%0D2-VS1!7Z`a_1CSI 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 AHUIzs literal 0 HcmV?d00001 diff --git a/tests/e2e/frame-overlays.spec.ts-snapshots/rotated-frame-selection-labels-preview-openpencil-darwin.png b/tests/e2e/frame-overlays.spec.ts-snapshots/rotated-frame-selection-labels-preview-openpencil-darwin.png new file mode 100644 index 0000000000000000000000000000000000000000..d8ecd08e1fc9b12ff38d89de9ddc6d1fd1848557 GIT binary patch literal 49577 zcmdqJcT|(x+btSIL8Q4iDkws>KNXaYNUv5znoIwT>JzPw(zDz2OG zQ}4f43+b8M|I@Nw)F}UnqSgg@x8;$g*jR6D?8t>(l@QSer$}4*5-$0YOCf(t`wlg|um{F|?O>~LfA$k9>o<2Y~=Fm?m{i&fI1!$bV#g8iGPX*cK(xtKIj z(94lW8D~Dhq{RYBy6!vQJrb;PpZ3J2>X4x39fm0kPHCJp_Z5zNwByH}MeHEttp`0|WY5(v37}j(B&#z0r?SH#&|C>X-DO9QxE%NYB6KBn_Qzp(; zE1PEG{maR^SEBl+JiMxLEd3HNS z!IaDFQ_2cdaodwb*kIzW*E%U@x!t>JkNjX~uFA{@Axs39Mq{E#o_XB#3xwiu(!|Ps zQOJ#USMu5-r=QwVBOe3AAcNEQ3$a7+F7*+TmOuy&hTD;6nOkHozFco1TOERA+?xRl z$a6?c^;UG^C0f{yEBxU~6MSR-{)vZvUum1cf9V1j1ev$r<<_lAIs5aqkjkfxA368tjWC4XgCF&8>keet3*7V~Mw(0-!hW|}u(!cZnHiG_3u>W6m$*-)8Yak5%Nt?MRxvKw}X6iq& zidP;#_`}4Dq(5ZdUsUzig5&!dS`UUo7;WDt&O+ zJc&yQUGB1Pd&SjYb`F<8=oa54^=Jof#OGE1LE3?rkhVALBj=u))4t(vb57a3+JD^3 zWBP;op`?Em6*0qoE30^pL@3>paxyPhfVRbdsv$HTx{AwGwMFtM!{)0ng3OIo8~->gz0UFfN-*lGRa)9{=)myJ3Ld z7=*Dx_kUx&%VvBuuee{g9=nNCq{rsG&>;!Ondsa_<9+;U89t;=b^fWI4kiLUq=)Xh zhl`_wu#Ui=Jmbe!6wYEwaxC_DyP=QwW#0zC($dqzu8>)2x1|3F$y{5V6fdLDJ#f~y zx-LBKEe2Cw>|?njCwP|jQ~tS8{1WDBj><|Kzt1ytL>8;pBy%;6rL5aH6gfBuZD(t< zL*J7JgGneW@m2Y*`+xVZzKw{x8?>#vox^ef2+RE;Y$nP1H}rPfntM*vl3E+lv-7E~ zE5z{IH;Cy>JNU+LxZE45s@{`N@J$~F7pl}F)214oc~hjgBRd21W>gR0WJl&<^YJV# z{ttwo`&tSoD_te*6;3HvpjUopK3{(CV(O~SL=H_Ci^lCw*S2u4HjOEqH+}osiD}IF zf~S+IfyfcApunJsXzjq5Nq5S;N;3!?L7g6@3*wAv%Opvzo7E8DF1jKvb*a zDsX5>#)$~@DLd8U?TMcVqruL0_2H7(cxFv;TWfK|d?D(o{aH$6)hl9u(6)Y;)a~@P zVwdknNw+QbyP`8p`~}%{kI+NIBwj2ILN?<)H`cB;t9(yGlK{%Et01K=}@;+DF!kw zBm(1$634~Fk}qw`M%@im-RRyG)NsPS-ZFJA#KQIWYrb^N`mWFVuE=U@s~RUJNEk5D zzrL3N*1pNk=ABVh?;rlq@૽vvn_)B_wdYD=Me?L2(pic4K{g za3Sbc%wv-1F**ubn^i2(|T`iLA6!$Xd})VZtNd!qJ8q_eDUd-2HtU-gvu;7Kc)Poa(yFFb_ow4c*=*Dk1< zjON=DL=u#cKK3u4&3<+IH?mM`cf-@Ph)h#dcB#v)rP-=_ z3i-*xVAy>S6H~I^4%X7|E!dtRmNs{1nuF~Z<$}L;FE|lI;Y_A4$lq-79xGuxU<-L> zY=x!2ZMS>JZ}JKKBI{rit#N3oF(OxD*gJ(`DV+heaLUb+I6v&eP5c)gsSCdC`}@@@ znKuL{e_5aj-!>GA2!~SUz10=gqznv*gKv?`aM6o}EMHJ~u5d za9wHhSZUiCewN0&D3!wWlN4aouJEjyxH9f31Br?~L*VZWD(=7mvEq<#^|f zYkyX{CiQrTfF$gKmOd>dXBdTiMa#SXX6j(5b?!ztVY>~^g3tV3YG`-ZeS+aeGzN#C z%`{nhwNE_XotVztzJK|c0Eez+H$7de;lK(*d)Esap-N^Va6FQ;mt%E!#cg;+KmO5G zX_UFs&UIMVz*&$cR56#2)tWEf;XR14sz3;v&&fYaY+%xe1CyT-V(&&v+0pN;%x!Y;*f2(m>U47v%)0#SJ#zTzr-dq!B*-P^EZWmN7Q zOyvQ35ba{Qw3F5)n<%PMk>7JKvCOsnVlw?v?+Sn+Hx@{zZp>6|ZdwFyeGc;4+%my? zJk}rXI+;U^O;IIWlV?xn{8mf&CCEfEP5TyP1oZn0 zQLAwj$4?4gjX1)R$-E@ht=?Eo+W~5+fB3)RMA^DF?BUWKF0-u;>!&OTa-Up{N5abs zw)0Qs@b3KN-6_IeQ6BwqNy_cc!C7GNcFUiE@%7Tg2X%fH{{-`?ggwP(%`)3P2l9PW zvF-rp7YZla&c;^Rn4Mz_SYf`a-SBZv=2p7+g%qY#>tk2w8T%d!2&Nl8Qwx(|ecG}2 zrLCUG%;S#@I<~!8<}2L1|7ls_#ESA4rD8E_@gq|~LHO?nald7INMh~U1KWrM59LL8 zEMc_0Kk(!yb(`$kBl=F;-A*|xjpW(q4K;gUuYEkMe>?4;Gor(SrMj9KKP7nAO6&q< zuPrMxMaZ#v&1nGb=|zPQWzil8=Y4PnOh#Xd=MZGaWy1LA+qBB$$SJ<0LM6;)A*;?0 zjNP0fLWiSlW(QhY@?Ge9&J3V!>86$S@Eb2FLymV;6%S%o*&mz>%0(vwEN#9f^}nN_n|)a~X4oo0 zuvrK{Dp?LiE!)7aUL3ubm>}0Ob`Sz65O27N_1;ux(Z(>Yf^B{0Yk4PvYCt%QNa5ny zDxawvsH~QrqprV?{|j?k+$6;o9KO0{pWY^jSo4t7c%65(hi#!h+r7HgvUYH)kQ#TG zGm0G1JJN!>4u6Z4T(k)Oc1-^CK@xET>pqGmS-+S|o{nB9Yae-Z^7!H2K*zCf%Q;fc zEA{5M56}B2renZn<`7`lwe)g@(y?zj9|O-GGe^7@c{;d$BMM8h9ZUkpe^ zCS`}=&$V}C)g5H&#cjhunzsCw_a|+<9i{+xs;=cA?-FApD`sbLu=kvMrvnJzPPMma z^Tx~jqR%seGZs@K+GJU`e#4Ufl;ecv!w}ViCCB}Zz6_t4iTYCr@?RkPG&gM6t!NsR ztjgUZY^H~{+rK+=D%Bz3nFjq>8TY!vz_$Mrt_)Xjx$>ek(~-zt=Fchh%#o1biLde1 z57zw^*1EpPw;rqg68pu`m~y~DmGXnq1~*V3?&oXuN#_WsxY%Kzr|zw-$Oy~qMH1x0@DN;W35tnNn4E>$mYNbQPV+R9cjX|Vxg6rE?(mMc(TL8ud;}~*8Ik+cYCPPy{Oh*2@FSU(FxeG5jOU~B z$M?NP?)|fbhLQ|yRsAW=DYCJXxAdJ=1tD^>lVO_M_p{BQY`e^gzS-!uE&uAX%N?Vr7z0!J4*!R8R(__o?U9 zn~%Kzv7bzz$MGvH)g79ocBG=yRD;zV)Y#x?X|DCLiT%dG*z~!fw>9XL&bAxtg}f

r_xx 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%0Ajqqc#zKDkU;t;gV51}Qcg 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