@geometra/renderer-canvas 1.59.1 → 1.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,134 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { box, text, setFocus, clearFocus } from '@geometra/core';
3
- import { CanvasRenderer } from '../renderer.js';
4
- class FakeGradient {
5
- stops = [];
6
- addColorStop(offset, color) {
7
- this.stops.push({ offset, color });
8
- }
9
- }
10
- class FakeCtx {
11
- ops = [];
12
- fillStyle = '';
13
- strokeStyle = '';
14
- lineWidth = 1;
15
- font = '12px sans-serif';
16
- textBaseline = 'top';
17
- globalAlpha = 1;
18
- shadowOffsetX = 0;
19
- shadowOffsetY = 0;
20
- shadowBlur = 0;
21
- shadowColor = '';
22
- scale() { this.ops.push('scale'); }
23
- setTransform() { this.ops.push('setTransform'); }
24
- fillRect() { this.ops.push('fillRect'); }
25
- beginPath() { this.ops.push('beginPath'); }
26
- rect() { this.ops.push('rect'); }
27
- clip() { this.ops.push('clip'); }
28
- save() { this.ops.push('save'); }
29
- restore() { this.ops.push('restore'); }
30
- strokeRect() { this.ops.push('strokeRect'); }
31
- fillText() { this.ops.push('fillText'); }
32
- measureText(s) { return { width: s.length * 8 }; }
33
- createLinearGradient() {
34
- this.ops.push('createLinearGradient');
35
- return new FakeGradient();
36
- }
37
- }
38
- /** Extends fake context to record `ctx.font` whenever text is painted (font-sensitive regression). */
39
- class FontAuditCtx extends FakeCtx {
40
- fontsAtFillText = [];
41
- fillText() {
42
- this.fontsAtFillText.push(this.font);
43
- this.ops.push('fillText');
44
- }
45
- }
46
- function setWindowDpr(devicePixelRatio) {
47
- Object.defineProperty(globalThis, 'window', {
48
- value: { devicePixelRatio },
49
- configurable: true,
50
- writable: true,
51
- });
52
- }
53
- describe('canvas visual operation snapshots', () => {
54
- it('emits operations for selection, focus ring, gradient, and clipping', () => {
55
- setWindowDpr(1);
56
- const ctx = new FakeCtx();
57
- const canvas = {
58
- style: {},
59
- getContext: () => ctx,
60
- };
61
- const focused = box({ onKeyDown: () => undefined, width: 120, height: 30 }, [
62
- text({ text: 'Focused text', font: '14px Inter', lineHeight: 18 }),
63
- ]);
64
- const tree = box({ gradient: { type: 'linear', stops: [{ offset: 0, color: '#000' }, { offset: 1, color: '#fff' }] } }, [
65
- box({ overflow: 'hidden', width: 200, height: 80 }, [focused]),
66
- ]);
67
- const layout = {
68
- x: 0, y: 0, width: 260, height: 120,
69
- children: [{
70
- x: 20, y: 20, width: 200, height: 80,
71
- children: [{ x: 0, y: 0, width: 120, height: 30, children: [{ x: 0, y: 0, width: 100, height: 18, children: [] }] }],
72
- }],
73
- };
74
- const renderer = new CanvasRenderer({ canvas, showFocusRing: true });
75
- renderer.selection = { anchorNode: 0, anchorOffset: 0, focusNode: 0, focusOffset: 6 };
76
- setFocus(focused, layout.children[0].children[0]);
77
- renderer.render(layout, tree);
78
- clearFocus();
79
- expect(ctx.ops).toContain('createLinearGradient');
80
- expect(ctx.ops).toContain('clip');
81
- expect(ctx.ops).toContain('fillText');
82
- expect(ctx.ops).toContain('strokeRect');
83
- expect(ctx.ops).toMatchInlineSnapshot(`
84
- [
85
- "scale",
86
- "fillRect",
87
- "createLinearGradient",
88
- "fillRect",
89
- "save",
90
- "beginPath",
91
- "rect",
92
- "clip",
93
- "fillRect",
94
- "fillText",
95
- "fillText",
96
- "restore",
97
- "save",
98
- "beginPath",
99
- "rect",
100
- "clip",
101
- "save",
102
- "strokeRect",
103
- "restore",
104
- "restore",
105
- "setTransform",
106
- ]
107
- `);
108
- });
109
- it('applies distinct ctx.font values per text node (font stack regression)', () => {
110
- setWindowDpr(1);
111
- const ctx = new FontAuditCtx();
112
- const canvas = {
113
- style: {},
114
- getContext: () => ctx,
115
- };
116
- const tree = box({ flexDirection: 'column', gap: 4, padding: 8, width: 220, height: 80 }, [
117
- text({ text: 'Inter line', font: '14px Inter, sans-serif', lineHeight: 18 }),
118
- text({ text: 'Mono line', font: 'bold 12px ui-monospace, monospace', lineHeight: 16 }),
119
- ]);
120
- const layout = {
121
- x: 0, y: 0, width: 220, height: 80,
122
- children: [
123
- { x: 8, y: 8, width: 204, height: 18, children: [{ x: 0, y: 0, width: 80, height: 18, children: [] }] },
124
- { x: 8, y: 30, width: 204, height: 16, children: [{ x: 0, y: 0, width: 80, height: 16, children: [] }] },
125
- ],
126
- };
127
- const renderer = new CanvasRenderer({ canvas, showFocusRing: false });
128
- renderer.render(layout, tree);
129
- expect(ctx.fontsAtFillText.length).toBeGreaterThanOrEqual(2);
130
- expect(ctx.fontsAtFillText).toContain('14px Inter, sans-serif');
131
- expect(ctx.fontsAtFillText).toContain('bold 12px ui-monospace, monospace');
132
- });
133
- });
134
- //# sourceMappingURL=visual-regression.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"visual-regression.test.js","sourceRoot":"","sources":["../../src/__tests__/visual-regression.test.ts"],"names":[],"mappings":"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"}