@geometra/renderer-canvas 0.2.0 → 0.2.1

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.
package/README.md ADDED
@@ -0,0 +1,31 @@
1
+ # @geometra/renderer-canvas
2
+
3
+ Canvas2D renderer for Geometra. Renders UI element trees to an HTML `<canvas>` element with full hit-testing and text selection support.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @geometra/renderer-canvas
9
+ ```
10
+
11
+ ## Key Exports
12
+
13
+ - `CanvasRenderer` -- renders Geometra element trees to a canvas context
14
+ - `enableSelection` -- enables text selection on the canvas
15
+ - `enableAccessibilityMirror` -- syncs a hidden accessibility DOM mirror from geometry
16
+
17
+ ## Usage
18
+
19
+ ```ts
20
+ import { CanvasRenderer, enableSelection } from '@geometra/renderer-canvas'
21
+
22
+ const canvas = document.getElementById('app') as HTMLCanvasElement
23
+ const renderer = new CanvasRenderer(canvas)
24
+
25
+ enableSelection(renderer)
26
+ renderer.render(tree, layout)
27
+ ```
28
+
29
+ ## Links
30
+
31
+ - [Main repo](https://github.com/AiGeekz/geometra)
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export { CanvasRenderer, enableSelection } from './renderer.js';
2
- export type { CanvasRendererOptions } from './renderer.js';
1
+ export { CanvasRenderer, enableSelection, enableAccessibilityMirror } from './renderer.js';
2
+ export type { CanvasRendererOptions, AccessibilityMirrorOptions } from './renderer.js';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/D,YAAY,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAA;AAC1F,YAAY,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAA"}
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export { CanvasRenderer, enableSelection } from './renderer.js';
1
+ export { CanvasRenderer, enableSelection, enableAccessibilityMirror } from './renderer.js';
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import type { ComputedLayout } from 'textura';
2
- import type { Renderer, UIElement, SelectionRange, TextNodeInfo } from '@geometra/core';
2
+ import type { Renderer, UIElement, SelectionRange, TextNodeInfo, AccessibilityNode } from '@geometra/core';
3
3
  export interface CanvasRendererOptions {
4
4
  /** Canvas element to render into. */
5
5
  canvas: HTMLCanvasElement;
@@ -7,8 +7,26 @@ export interface CanvasRendererOptions {
7
7
  dpr?: number;
8
8
  /** Background color for the canvas. Default: '#ffffff'. */
9
9
  background?: string;
10
- /** Highlight color for text selection. Default: 'rgba(59, 130, 246, 0.35)'. */
10
+ /** Highlight color for text selection. Default: 'rgba(59, 130, 246, 0.4)'. */
11
11
  selectionColor?: string;
12
+ /** Text color for selected text. Default: auto-computed from selectionColor for contrast. */
13
+ selectedTextColor?: string;
14
+ /** Called when an async image finishes loading. Use to trigger re-render. */
15
+ onImageLoaded?: () => void;
16
+ /** Stroke every layout rect (flex debugging). Default false. */
17
+ debugLayoutBounds?: boolean;
18
+ /** Draw a ring around the keyboard-focused box. Default true. */
19
+ showFocusRing?: boolean;
20
+ /** Focus ring stroke color. Default: rgba(59, 130, 246, 0.95). */
21
+ focusRingColor?: string;
22
+ /** Outset from the focused box in CSS pixels. Default 2. */
23
+ focusRingPadding?: number;
24
+ /** Skip debug/focus overlays during active drag interactions. Default true. */
25
+ optimizeOverlaysDuringInteraction?: boolean;
26
+ }
27
+ export interface AccessibilityMirrorOptions {
28
+ /** Label for the hidden accessibility region. */
29
+ rootLabel?: string;
12
30
  }
13
31
  export declare class CanvasRenderer implements Renderer {
14
32
  private ctx;
@@ -16,34 +34,61 @@ export declare class CanvasRenderer implements Renderer {
16
34
  private dpr;
17
35
  private background;
18
36
  private selectionColor;
37
+ private selectedTextColor;
38
+ private onImageLoaded?;
39
+ private debugLayoutBounds;
40
+ private showFocusRing;
41
+ private focusRingColor;
42
+ private focusRingPadding;
43
+ private optimizeOverlaysDuringInteraction;
44
+ private interactionActive;
45
+ /** Cache text wrapping + per-char metrics to avoid recomputing every frame. */
46
+ private textLineCache;
47
+ /** Cache child paint order by z-index per box element. */
48
+ private paintOrderCache;
49
+ /** Cached loaded images. */
50
+ private imageCache;
51
+ private pendingImages;
19
52
  /** Text nodes collected during the last render (for selection hit-testing). */
20
53
  textNodes: TextNodeInfo[];
54
+ /** Text nodes sorted by vertical position for faster hit prefilter. */
55
+ textNodesByY: TextNodeInfo[];
21
56
  /** Current text selection range, or null if nothing is selected. */
22
57
  selection: SelectionRange | null;
23
- /** Index used during rendering to assign text node indices. */
58
+ /** The last rendered tree + layout (for cursor queries). */
59
+ lastTree: UIElement | null;
60
+ lastLayout: ComputedLayout | null;
24
61
  private textNodeIndex;
25
62
  constructor(options: CanvasRendererOptions);
26
63
  render(layout: ComputedLayout, tree: UIElement): void;
27
- /** Compute character-level positions for a text node. */
28
64
  private computeTextNodeLines;
65
+ private zIndexOf;
66
+ private getChildrenByZAsc;
29
67
  private paintNode;
30
68
  private paintBox;
69
+ private paintImage;
31
70
  private paintText;
32
- /** Paint selection highlight rectangles for a text node. */
71
+ private getLineSelectionRanges;
33
72
  private paintSelectionHighlight;
34
73
  private wrapText;
35
74
  private roundRect;
36
- /** Get the currently selected text string, or empty if nothing selected. */
75
+ private paintLayoutDebug;
76
+ private paintFocusRingForTarget;
77
+ private strokeFocusRingOutline;
37
78
  getSelectedText(): string;
79
+ setInteractionActive(active: boolean): void;
80
+ /** Build an accessibility tree for the currently rendered frame. */
81
+ getAccessibilityTree(): AccessibilityNode | null;
38
82
  destroy(): void;
39
83
  }
40
84
  /**
41
- * Enable text selection on a canvas rendered by a CanvasRenderer.
42
- *
43
- * Attaches pointer and keyboard event listeners for click-drag selection
44
- * and Ctrl/Cmd+C copy. Returns a cleanup function.
85
+ * Enable text selection and cursor styles on a canvas rendered by a CanvasRenderer.
86
+ * Returns a cleanup function.
87
+ */
88
+ export declare function enableSelection(canvas: HTMLCanvasElement, renderer: CanvasRenderer, onSelectionChange?: () => void): () => void;
89
+ /**
90
+ * Mirror canvas semantics into a hidden DOM subtree for assistive tech.
91
+ * The mirror auto-syncs after every canvas render.
45
92
  */
46
- export declare function enableSelection(canvas: HTMLCanvasElement, renderer: CanvasRenderer,
47
- /** Called after selection changes so you can re-render. */
48
- onSelectionChange?: () => void): () => void;
93
+ export declare function enableAccessibilityMirror(host: HTMLElement, renderer: CanvasRenderer, options?: AccessibilityMirrorOptions): () => void;
49
94
  //# sourceMappingURL=renderer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAA2B,cAAc,EAAE,YAAY,EAAgB,MAAM,gBAAgB,CAAA;AAG9H,MAAM,WAAW,qBAAqB;IACpC,qCAAqC;IACrC,MAAM,EAAE,iBAAiB,CAAA;IACzB,gFAAgF;IAChF,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,+EAA+E;IAC/E,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,qBAAa,cAAe,YAAW,QAAQ;IAC7C,OAAO,CAAC,GAAG,CAA0B;IACrC,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,GAAG,CAAQ;IACnB,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,cAAc,CAAQ;IAE9B,+EAA+E;IAC/E,SAAS,EAAE,YAAY,EAAE,CAAK;IAC9B,oEAAoE;IACpE,SAAS,EAAE,cAAc,GAAG,IAAI,CAAO;IAEvC,+DAA+D;IAC/D,OAAO,CAAC,aAAa,CAAI;gBAEb,OAAO,EAAE,qBAAqB;IAW1C,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IA+BrD,yDAAyD;IACzD,OAAO,CAAC,oBAAoB;IA4B5B,OAAO,CAAC,SAAS;IAuBjB,OAAO,CAAC,QAAQ;IAqChB,OAAO,CAAC,SAAS;IA0CjB,4DAA4D;IAC5D,OAAO,CAAC,uBAAuB;IA8D/B,OAAO,CAAC,QAAQ;IAwBhB,OAAO,CAAC,SAAS;IAejB,4EAA4E;IAC5E,eAAe,IAAI,MAAM;IAKzB,OAAO,IAAI,IAAI;CAGhB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,iBAAiB,EACzB,QAAQ,EAAE,cAAc;AACxB,2DAA2D;AAC3D,iBAAiB,CAAC,EAAE,MAAM,IAAI,GAC7B,MAAM,IAAI,CAmFZ"}
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}
package/dist/renderer.js CHANGED
@@ -1,21 +1,76 @@
1
- import { collectTextNodes, getSelectedText, hitTestText } from '@geometra/core';
1
+ import { collectTextNodes, getSelectedText, hitTestText, getCursorAtPoint, focusedElement, toAccessibilityTree, } from '@geometra/core';
2
+ /** Parse a CSS color string into [r, g, b] (0-255). Supports #hex and rgba(). */
3
+ function parseColorRGB(color) {
4
+ if (color.startsWith('#')) {
5
+ const hex = color.slice(1);
6
+ const full = hex.length === 3
7
+ ? hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2]
8
+ : hex;
9
+ return [
10
+ parseInt(full.slice(0, 2), 16),
11
+ parseInt(full.slice(2, 4), 16),
12
+ parseInt(full.slice(4, 6), 16),
13
+ ];
14
+ }
15
+ const match = color.match(/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/);
16
+ if (match)
17
+ return [parseInt(match[1]), parseInt(match[2]), parseInt(match[3])];
18
+ return [59, 130, 246];
19
+ }
20
+ /** Compute relative luminance (0-1) from sRGB. */
21
+ function luminance(r, g, b) {
22
+ const [rs, gs, bs] = [r / 255, g / 255, b / 255].map(c => c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4));
23
+ return 0.2126 * rs + 0.7152 * gs + 0.0722 * bs;
24
+ }
2
25
  export class CanvasRenderer {
3
26
  ctx;
4
27
  canvas;
5
28
  dpr;
6
29
  background;
7
30
  selectionColor;
31
+ selectedTextColor;
32
+ onImageLoaded;
33
+ debugLayoutBounds;
34
+ showFocusRing;
35
+ focusRingColor;
36
+ focusRingPadding;
37
+ optimizeOverlaysDuringInteraction;
38
+ interactionActive = false;
39
+ /** Cache text wrapping + per-char metrics to avoid recomputing every frame. */
40
+ textLineCache = new Map();
41
+ /** Cache child paint order by z-index per box element. */
42
+ paintOrderCache = new WeakMap();
43
+ /** Cached loaded images. */
44
+ imageCache = new Map();
45
+ pendingImages = new Set();
8
46
  /** Text nodes collected during the last render (for selection hit-testing). */
9
47
  textNodes = [];
48
+ /** Text nodes sorted by vertical position for faster hit prefilter. */
49
+ textNodesByY = [];
10
50
  /** Current text selection range, or null if nothing is selected. */
11
51
  selection = null;
12
- /** Index used during rendering to assign text node indices. */
52
+ /** The last rendered tree + layout (for cursor queries). */
53
+ lastTree = null;
54
+ lastLayout = null;
13
55
  textNodeIndex = 0;
14
56
  constructor(options) {
15
57
  this.canvas = options.canvas;
16
58
  this.dpr = options.dpr ?? window.devicePixelRatio;
17
59
  this.background = options.background ?? '#ffffff';
18
- this.selectionColor = options.selectionColor ?? 'rgba(59, 130, 246, 0.35)';
60
+ this.selectionColor = options.selectionColor ?? 'rgba(59, 130, 246, 0.4)';
61
+ this.onImageLoaded = options.onImageLoaded;
62
+ this.debugLayoutBounds = options.debugLayoutBounds ?? false;
63
+ this.showFocusRing = options.showFocusRing ?? true;
64
+ this.focusRingColor = options.focusRingColor ?? 'rgba(59, 130, 246, 0.95)';
65
+ this.focusRingPadding = options.focusRingPadding ?? 2;
66
+ this.optimizeOverlaysDuringInteraction = options.optimizeOverlaysDuringInteraction ?? true;
67
+ if (options.selectedTextColor) {
68
+ this.selectedTextColor = options.selectedTextColor;
69
+ }
70
+ else {
71
+ const [r, g, b] = parseColorRGB(this.selectionColor);
72
+ this.selectedTextColor = luminance(r, g, b) > 0.4 ? '#000000' : '#ffffff';
73
+ }
19
74
  const ctx = this.canvas.getContext('2d');
20
75
  if (!ctx)
21
76
  throw new Error('Could not get 2d context');
@@ -23,50 +78,81 @@ export class CanvasRenderer {
23
78
  }
24
79
  render(layout, tree) {
25
80
  const { ctx, canvas, dpr } = this;
26
- // Size canvas to layout
27
81
  canvas.width = layout.width * dpr;
28
82
  canvas.height = layout.height * dpr;
29
83
  canvas.style.width = `${layout.width}px`;
30
84
  canvas.style.height = `${layout.height}px`;
31
85
  ctx.scale(dpr, dpr);
32
- // Clear
33
86
  ctx.fillStyle = this.background;
34
87
  ctx.fillRect(0, 0, layout.width, layout.height);
35
- // Collect selectable text nodes
36
88
  this.textNodes = [];
37
89
  collectTextNodes(tree, layout, 0, 0, this.textNodes);
38
- // Populate line info for each text node (needs ctx.measureText)
90
+ this.textNodesByY = [...this.textNodes].sort((a, b) => a.y - b.y);
39
91
  for (const node of this.textNodes) {
40
92
  this.computeTextNodeLines(node);
41
93
  }
42
- // Paint tree
43
94
  this.textNodeIndex = 0;
95
+ this.lastTree = tree;
96
+ this.lastLayout = layout;
44
97
  this.paintNode(tree, layout, 0, 0);
45
- // Reset transform for next frame
98
+ const skipOverlays = this.optimizeOverlaysDuringInteraction && this.interactionActive;
99
+ if (this.debugLayoutBounds && !skipOverlays) {
100
+ this.paintLayoutDebug(tree, layout, 0, 0);
101
+ }
102
+ if (this.showFocusRing && !skipOverlays) {
103
+ const f = focusedElement.peek();
104
+ if (f) {
105
+ this.paintFocusRingForTarget(tree, layout, 0, 0, f.element);
106
+ }
107
+ }
46
108
  ctx.setTransform(1, 0, 0, 1, 0, 0);
47
109
  }
48
- /** Compute character-level positions for a text node. */
49
110
  computeTextNodeLines(node) {
50
- const { ctx } = this;
51
- ctx.font = node.element.props.font;
52
- const { lineHeight } = node.element.props;
53
- const wrappedLines = this.wrapText(node.element.props.text, node.width);
54
- const lines = [];
55
- for (let i = 0; i < wrappedLines.length; i++) {
56
- const lineText = wrappedLines[i];
57
- const lineY = node.y + i * lineHeight;
58
- const charOffsets = [];
59
- const charWidths = [];
60
- let xOffset = 0;
61
- for (let c = 0; c < lineText.length; c++) {
62
- charOffsets.push(xOffset);
63
- const w = ctx.measureText(lineText[c]).width;
64
- charWidths.push(w);
65
- xOffset += w;
66
- }
67
- lines.push({ text: lineText, x: node.x, y: lineY, charOffsets, charWidths });
68
- }
69
- node.lines = lines;
111
+ const { lineHeight, font, text } = node.element.props;
112
+ const width = Math.max(1, Math.round(node.width * 1000) / 1000);
113
+ const cacheKey = `${font}|${lineHeight}|${width}|${text}`;
114
+ let cached = this.textLineCache.get(cacheKey);
115
+ if (!cached) {
116
+ const { ctx } = this;
117
+ ctx.font = font;
118
+ const wrappedLines = this.wrapText(text, width);
119
+ cached = wrappedLines.map((lineText) => {
120
+ const charOffsets = [];
121
+ const charWidths = [];
122
+ let xOffset = 0;
123
+ for (let c = 0; c < lineText.length; c++) {
124
+ charOffsets.push(xOffset);
125
+ const w = ctx.measureText(lineText[c]).width;
126
+ charWidths.push(w);
127
+ xOffset += w;
128
+ }
129
+ return { text: lineText, charOffsets, charWidths };
130
+ });
131
+ this.textLineCache.set(cacheKey, cached);
132
+ if (this.textLineCache.size > 500) {
133
+ this.textLineCache.clear();
134
+ }
135
+ }
136
+ node.lines = cached.map((line, i) => ({
137
+ text: line.text,
138
+ x: node.x,
139
+ y: node.y + i * lineHeight,
140
+ charOffsets: line.charOffsets,
141
+ charWidths: line.charWidths,
142
+ }));
143
+ }
144
+ zIndexOf(element) {
145
+ return element.props.zIndex ?? 0;
146
+ }
147
+ getChildrenByZAsc(box) {
148
+ const signature = box.children.map((c, i) => `${i}:${this.zIndexOf(c)}`).join('|');
149
+ const cached = this.paintOrderCache.get(box);
150
+ if (cached && cached.signature === signature) {
151
+ return cached.asc;
152
+ }
153
+ const asc = box.children.map((_, i) => i).sort((a, b) => this.zIndexOf(box.children[a]) - this.zIndexOf(box.children[b]));
154
+ this.paintOrderCache.set(box, { signature, asc });
155
+ return asc;
70
156
  }
71
157
  paintNode(element, layout, offsetX, offsetY) {
72
158
  const x = offsetX + layout.x;
@@ -74,12 +160,28 @@ export class CanvasRenderer {
74
160
  const { width, height } = layout;
75
161
  if (element.kind === 'box') {
76
162
  this.paintBox(element, layout, x, y, width, height);
77
- for (let i = 0; i < element.children.length; i++) {
163
+ const { overflow, scrollX, scrollY } = element.props;
164
+ const shouldClip = overflow === 'hidden' || overflow === 'scroll';
165
+ const childOffsetX = x - (scrollX ?? 0);
166
+ const childOffsetY = y - (scrollY ?? 0);
167
+ if (shouldClip) {
168
+ this.ctx.save();
169
+ this.ctx.beginPath();
170
+ this.ctx.rect(x, y, width, height);
171
+ this.ctx.clip();
172
+ }
173
+ for (const i of this.getChildrenByZAsc(element)) {
78
174
  const childLayout = layout.children[i];
79
175
  if (childLayout) {
80
- this.paintNode(element.children[i], childLayout, x, y);
176
+ this.paintNode(element.children[i], childLayout, childOffsetX, childOffsetY);
81
177
  }
82
178
  }
179
+ if (shouldClip) {
180
+ this.ctx.restore();
181
+ }
182
+ }
183
+ else if (element.kind === 'image') {
184
+ this.paintImage(element, x, y, width, height);
83
185
  }
84
186
  else {
85
187
  this.paintText(element, x, y, width, height);
@@ -87,10 +189,70 @@ export class CanvasRenderer {
87
189
  }
88
190
  paintBox(element, _layout, x, y, width, height) {
89
191
  const { ctx } = this;
90
- const { backgroundColor, borderColor, borderRadius, opacity } = element.props;
192
+ const { backgroundColor, borderColor, borderRadius, borderWidth, opacity, boxShadow, gradient } = element.props;
91
193
  if (opacity !== undefined)
92
194
  ctx.globalAlpha = opacity;
93
- if (backgroundColor) {
195
+ // Box shadow
196
+ if (boxShadow) {
197
+ ctx.save();
198
+ ctx.shadowOffsetX = boxShadow.offsetX;
199
+ ctx.shadowOffsetY = boxShadow.offsetY;
200
+ ctx.shadowBlur = boxShadow.blur;
201
+ ctx.shadowColor = boxShadow.color;
202
+ ctx.fillStyle = backgroundColor ?? '#000000';
203
+ if (borderRadius) {
204
+ this.roundRect(x, y, width, height, borderRadius);
205
+ ctx.fill();
206
+ }
207
+ else {
208
+ ctx.fillRect(x, y, width, height);
209
+ }
210
+ ctx.restore();
211
+ // If no gradient, the shadow fill already drew the background
212
+ if (!gradient) {
213
+ if (opacity !== undefined)
214
+ ctx.globalAlpha = 1;
215
+ // Still need border
216
+ if (borderColor) {
217
+ ctx.strokeStyle = borderColor;
218
+ ctx.lineWidth = borderWidth ?? 1;
219
+ if (borderRadius) {
220
+ this.roundRect(x, y, width, height, borderRadius);
221
+ ctx.stroke();
222
+ }
223
+ else {
224
+ ctx.strokeRect(x, y, width, height);
225
+ }
226
+ }
227
+ if (opacity !== undefined)
228
+ ctx.globalAlpha = 1;
229
+ return;
230
+ }
231
+ }
232
+ // Gradient or solid background
233
+ if (gradient && gradient.type === 'linear') {
234
+ const angle = ((gradient.angle ?? 180) * Math.PI) / 180;
235
+ const cx = x + width / 2;
236
+ const cy = y + height / 2;
237
+ const len = Math.max(width, height) / 2;
238
+ const x0 = cx - Math.sin(angle) * len;
239
+ const y0 = cy - Math.cos(angle) * len;
240
+ const x1 = cx + Math.sin(angle) * len;
241
+ const y1 = cy + Math.cos(angle) * len;
242
+ const grad = ctx.createLinearGradient(x0, y0, x1, y1);
243
+ for (const stop of gradient.stops) {
244
+ grad.addColorStop(stop.offset, stop.color);
245
+ }
246
+ ctx.fillStyle = grad;
247
+ if (borderRadius) {
248
+ this.roundRect(x, y, width, height, borderRadius);
249
+ ctx.fill();
250
+ }
251
+ else {
252
+ ctx.fillRect(x, y, width, height);
253
+ }
254
+ }
255
+ else if (backgroundColor && !boxShadow) {
94
256
  ctx.fillStyle = backgroundColor;
95
257
  if (borderRadius) {
96
258
  this.roundRect(x, y, width, height, borderRadius);
@@ -102,7 +264,7 @@ export class CanvasRenderer {
102
264
  }
103
265
  if (borderColor) {
104
266
  ctx.strokeStyle = borderColor;
105
- ctx.lineWidth = 1;
267
+ ctx.lineWidth = borderWidth ?? 1;
106
268
  if (borderRadius) {
107
269
  this.roundRect(x, y, width, height, borderRadius);
108
270
  ctx.stroke();
@@ -114,6 +276,62 @@ export class CanvasRenderer {
114
276
  if (opacity !== undefined)
115
277
  ctx.globalAlpha = 1;
116
278
  }
279
+ paintImage(element, x, y, width, height) {
280
+ const { ctx } = this;
281
+ const { src, objectFit, opacity, borderRadius } = element.props;
282
+ if (opacity !== undefined)
283
+ ctx.globalAlpha = opacity;
284
+ const cached = this.imageCache.get(src);
285
+ if (cached) {
286
+ if (borderRadius) {
287
+ ctx.save();
288
+ this.roundRect(x, y, width, height, borderRadius);
289
+ ctx.clip();
290
+ }
291
+ if (objectFit === 'cover' || objectFit === 'contain') {
292
+ const imgRatio = cached.naturalWidth / cached.naturalHeight;
293
+ const boxRatio = width / height;
294
+ let sw, sh, sx, sy;
295
+ if ((objectFit === 'cover' && imgRatio > boxRatio) || (objectFit === 'contain' && imgRatio < boxRatio)) {
296
+ sh = cached.naturalHeight;
297
+ sw = sh * boxRatio;
298
+ sx = (cached.naturalWidth - sw) / 2;
299
+ sy = 0;
300
+ }
301
+ else {
302
+ sw = cached.naturalWidth;
303
+ sh = sw / boxRatio;
304
+ sx = 0;
305
+ sy = (cached.naturalHeight - sh) / 2;
306
+ }
307
+ ctx.drawImage(cached, sx, sy, sw, sh, x, y, width, height);
308
+ }
309
+ else {
310
+ ctx.drawImage(cached, x, y, width, height);
311
+ }
312
+ if (borderRadius)
313
+ ctx.restore();
314
+ }
315
+ else if (!this.pendingImages.has(src)) {
316
+ // Start loading
317
+ this.pendingImages.add(src);
318
+ const img = new Image();
319
+ img.onload = () => {
320
+ this.imageCache.set(src, img);
321
+ this.pendingImages.delete(src);
322
+ this.onImageLoaded?.();
323
+ };
324
+ img.onerror = () => {
325
+ this.pendingImages.delete(src);
326
+ };
327
+ img.src = src;
328
+ // Placeholder
329
+ ctx.fillStyle = '#27272a';
330
+ ctx.fillRect(x, y, width, height);
331
+ }
332
+ if (opacity !== undefined)
333
+ ctx.globalAlpha = 1;
334
+ }
117
335
  paintText(element, x, y, _width, _height) {
118
336
  const { ctx } = this;
119
337
  const { text, font, color, backgroundColor, lineHeight, opacity, selectable } = element.props;
@@ -124,52 +342,108 @@ export class CanvasRenderer {
124
342
  ctx.fillRect(x, y, _width, _height);
125
343
  }
126
344
  ctx.font = font;
127
- ctx.fillStyle = color ?? '#000000';
128
345
  ctx.textBaseline = 'top';
129
346
  const lines = this.wrapText(text, _width);
130
- // If this is a selectable text node, paint selection highlights
131
- if (selectable && this.selection) {
132
- const nodeInfo = this.textNodes[this.textNodeIndex];
133
- if (nodeInfo) {
134
- this.paintSelectionHighlight(nodeInfo, lines, lineHeight);
135
- }
347
+ const textColor = color ?? '#000000';
348
+ const isSelectable = selectable !== false;
349
+ const nodeInfo = isSelectable && this.selection ? this.textNodes[this.textNodeIndex] : null;
350
+ const selRanges = nodeInfo ? this.getLineSelectionRanges(nodeInfo) : null;
351
+ if (selRanges) {
352
+ this.paintSelectionHighlight(nodeInfo, lines, lineHeight);
136
353
  }
137
354
  for (let i = 0; i < lines.length; i++) {
138
- ctx.fillText(lines[i], x, y + i * lineHeight);
355
+ const lineText = lines[i];
356
+ const lineY = y + i * lineHeight;
357
+ const lineSelRange = selRanges?.[i];
358
+ if (lineSelRange && lineSelRange.start < lineSelRange.end) {
359
+ const before = lineText.slice(0, lineSelRange.start);
360
+ const selected = lineText.slice(lineSelRange.start, lineSelRange.end);
361
+ const after = lineText.slice(lineSelRange.end);
362
+ let cx = x;
363
+ if (before) {
364
+ ctx.fillStyle = textColor;
365
+ ctx.fillText(before, cx, lineY);
366
+ cx += ctx.measureText(before).width;
367
+ }
368
+ if (selected) {
369
+ ctx.fillStyle = this.selectedTextColor;
370
+ ctx.fillText(selected, cx, lineY);
371
+ cx += ctx.measureText(selected).width;
372
+ }
373
+ if (after) {
374
+ ctx.fillStyle = textColor;
375
+ ctx.fillText(after, cx, lineY);
376
+ }
377
+ }
378
+ else {
379
+ ctx.fillStyle = textColor;
380
+ ctx.fillText(lineText, x, lineY);
381
+ }
139
382
  }
140
- if (selectable) {
383
+ if (isSelectable) {
141
384
  this.textNodeIndex++;
142
385
  }
143
386
  if (opacity !== undefined)
144
387
  ctx.globalAlpha = 1;
145
388
  }
146
- /** Paint selection highlight rectangles for a text node. */
389
+ getLineSelectionRanges(node) {
390
+ const sel = this.selection;
391
+ if (!sel)
392
+ return null;
393
+ let startNode = sel.anchorNode, startOffset = sel.anchorOffset;
394
+ let endNode = sel.focusNode, endOffset = sel.focusOffset;
395
+ if (startNode > endNode || (startNode === endNode && startOffset > endOffset)) {
396
+ ;
397
+ [startNode, endNode] = [endNode, startNode];
398
+ [startOffset, endOffset] = [endOffset, startOffset];
399
+ }
400
+ if (node.index < startNode || node.index > endNode)
401
+ return null;
402
+ const ranges = [];
403
+ let globalCharOffset = 0;
404
+ for (const line of node.lines) {
405
+ const lineStart = globalCharOffset, lineEnd = globalCharOffset + line.text.length;
406
+ let selStart, selEnd;
407
+ if (node.index === startNode && node.index === endNode) {
408
+ selStart = Math.max(startOffset, lineStart) - lineStart;
409
+ selEnd = Math.min(endOffset, lineEnd) - lineStart;
410
+ }
411
+ else if (node.index === startNode) {
412
+ selStart = Math.max(startOffset, lineStart) - lineStart;
413
+ selEnd = line.text.length;
414
+ }
415
+ else if (node.index === endNode) {
416
+ selStart = 0;
417
+ selEnd = Math.min(endOffset, lineEnd) - lineStart;
418
+ }
419
+ else {
420
+ selStart = 0;
421
+ selEnd = line.text.length;
422
+ }
423
+ ranges.push({ start: Math.max(0, selStart), end: Math.min(line.text.length, selEnd) });
424
+ globalCharOffset = lineEnd;
425
+ }
426
+ return ranges;
427
+ }
147
428
  paintSelectionHighlight(node, _lines, lineHeight) {
148
429
  const sel = this.selection;
149
430
  if (!sel)
150
431
  return;
151
- // Normalize selection direction
152
- let startNode = sel.anchorNode;
153
- let startOffset = sel.anchorOffset;
154
- let endNode = sel.focusNode;
155
- let endOffset = sel.focusOffset;
432
+ let startNode = sel.anchorNode, startOffset = sel.anchorOffset;
433
+ let endNode = sel.focusNode, endOffset = sel.focusOffset;
156
434
  if (startNode > endNode || (startNode === endNode && startOffset > endOffset)) {
157
435
  ;
158
436
  [startNode, endNode] = [endNode, startNode];
159
437
  [startOffset, endOffset] = [endOffset, startOffset];
160
438
  }
161
- // Check if this node is in the selection range
162
439
  if (node.index < startNode || node.index > endNode)
163
440
  return;
164
441
  const { ctx } = this;
165
442
  ctx.fillStyle = this.selectionColor;
166
443
  let globalCharOffset = 0;
167
444
  for (const line of node.lines) {
168
- const lineStart = globalCharOffset;
169
- const lineEnd = globalCharOffset + line.text.length;
170
- // Determine the selected portion of this line
171
- let selStart;
172
- let selEnd;
445
+ const lineStart = globalCharOffset, lineEnd = globalCharOffset + line.text.length;
446
+ let selStart, selEnd;
173
447
  if (node.index === startNode && node.index === endNode) {
174
448
  selStart = Math.max(startOffset, lineStart) - lineStart;
175
449
  selEnd = Math.min(endOffset, lineEnd) - lineStart;
@@ -191,8 +465,7 @@ export class CanvasRenderer {
191
465
  const endCharOffset = selEnd < line.charOffsets.length
192
466
  ? line.charOffsets[selEnd]
193
467
  : (line.charOffsets[line.charOffsets.length - 1] ?? 0) + (line.charWidths[line.charWidths.length - 1] ?? 0);
194
- const rectWidth = endCharOffset - (line.charOffsets[selStart] ?? 0);
195
- ctx.fillRect(rectX, line.y, rectWidth, lineHeight);
468
+ ctx.fillRect(rectX, line.y, endCharOffset - (line.charOffsets[selStart] ?? 0), lineHeight);
196
469
  }
197
470
  globalCharOffset = lineEnd;
198
471
  }
@@ -219,6 +492,7 @@ export class CanvasRenderer {
219
492
  return lines;
220
493
  }
221
494
  roundRect(x, y, w, h, r) {
495
+ r = Math.min(r, w / 2, h / 2);
222
496
  const { ctx } = this;
223
497
  ctx.beginPath();
224
498
  ctx.moveTo(x + r, y);
@@ -232,66 +506,223 @@ export class CanvasRenderer {
232
506
  ctx.quadraticCurveTo(x, y, x + r, y);
233
507
  ctx.closePath();
234
508
  }
235
- /** Get the currently selected text string, or empty if nothing selected. */
509
+ paintLayoutDebug(element, layout, offsetX, offsetY) {
510
+ const x = offsetX + layout.x;
511
+ const y = offsetY + layout.y;
512
+ const { width, height } = layout;
513
+ const { ctx } = this;
514
+ ctx.save();
515
+ ctx.strokeStyle = 'rgba(34, 197, 94, 0.45)';
516
+ ctx.lineWidth = 1;
517
+ const dw = Math.max(0, width - 1);
518
+ const dh = Math.max(0, height - 1);
519
+ ctx.strokeRect(x + 0.5, y + 0.5, dw, dh);
520
+ ctx.restore();
521
+ if (element.kind !== 'box')
522
+ return;
523
+ const { overflow, scrollX, scrollY } = element.props;
524
+ const shouldClip = overflow === 'hidden' || overflow === 'scroll';
525
+ const childOffsetX = x - (scrollX ?? 0);
526
+ const childOffsetY = y - (scrollY ?? 0);
527
+ if (shouldClip) {
528
+ this.ctx.save();
529
+ this.ctx.beginPath();
530
+ this.ctx.rect(x, y, width, height);
531
+ this.ctx.clip();
532
+ }
533
+ for (const i of this.getChildrenByZAsc(element)) {
534
+ const childLayout = layout.children[i];
535
+ if (childLayout) {
536
+ this.paintLayoutDebug(element.children[i], childLayout, childOffsetX, childOffsetY);
537
+ }
538
+ }
539
+ if (shouldClip) {
540
+ this.ctx.restore();
541
+ }
542
+ }
543
+ paintFocusRingForTarget(element, layout, offsetX, offsetY, target) {
544
+ const x = offsetX + layout.x;
545
+ const y = offsetY + layout.y;
546
+ const { width, height } = layout;
547
+ if (element.kind === 'box' && element === target) {
548
+ const pad = this.focusRingPadding;
549
+ const br = element.props.borderRadius ?? 0;
550
+ this.strokeFocusRingOutline(x - pad, y - pad, width + pad * 2, height + pad * 2, br > 0 ? br + pad * 0.5 : 0);
551
+ return true;
552
+ }
553
+ if (element.kind !== 'box')
554
+ return false;
555
+ const { overflow, scrollX, scrollY } = element.props;
556
+ const shouldClip = overflow === 'hidden' || overflow === 'scroll';
557
+ const childOffsetX = x - (scrollX ?? 0);
558
+ const childOffsetY = y - (scrollY ?? 0);
559
+ if (shouldClip) {
560
+ this.ctx.save();
561
+ this.ctx.beginPath();
562
+ this.ctx.rect(x, y, width, height);
563
+ this.ctx.clip();
564
+ }
565
+ for (const i of this.getChildrenByZAsc(element)) {
566
+ const childLayout = layout.children[i];
567
+ if (childLayout) {
568
+ if (this.paintFocusRingForTarget(element.children[i], childLayout, childOffsetX, childOffsetY, target)) {
569
+ if (shouldClip)
570
+ this.ctx.restore();
571
+ return true;
572
+ }
573
+ }
574
+ }
575
+ if (shouldClip) {
576
+ this.ctx.restore();
577
+ }
578
+ return false;
579
+ }
580
+ strokeFocusRingOutline(x, y, w, h, borderRadius) {
581
+ const { ctx } = this;
582
+ ctx.save();
583
+ ctx.strokeStyle = this.focusRingColor;
584
+ ctx.lineWidth = 2;
585
+ if (borderRadius > 0) {
586
+ this.roundRect(x, y, w, h, borderRadius);
587
+ ctx.stroke();
588
+ }
589
+ else {
590
+ ctx.strokeRect(x, y, w, h);
591
+ }
592
+ ctx.restore();
593
+ }
236
594
  getSelectedText() {
237
595
  if (!this.selection || this.textNodes.length === 0)
238
596
  return '';
239
597
  return getSelectedText(this.selection, this.textNodes);
240
598
  }
599
+ setInteractionActive(active) {
600
+ this.interactionActive = active;
601
+ }
602
+ /** Build an accessibility tree for the currently rendered frame. */
603
+ getAccessibilityTree() {
604
+ if (!this.lastTree || !this.lastLayout)
605
+ return null;
606
+ return toAccessibilityTree(this.lastTree, this.lastLayout);
607
+ }
241
608
  destroy() {
242
609
  // Nothing to clean up for canvas
243
610
  }
244
611
  }
612
+ function hitTestTextFast(textNodesByY, px, py) {
613
+ if (textNodesByY.length === 0)
614
+ return null;
615
+ let lo = 0;
616
+ let hi = textNodesByY.length - 1;
617
+ let start = textNodesByY.length;
618
+ while (lo <= hi) {
619
+ const mid = (lo + hi) >> 1;
620
+ const node = textNodesByY[mid];
621
+ if (node.y + node.height >= py) {
622
+ start = mid;
623
+ hi = mid - 1;
624
+ }
625
+ else {
626
+ lo = mid + 1;
627
+ }
628
+ }
629
+ if (start >= textNodesByY.length)
630
+ return null;
631
+ const candidates = [];
632
+ for (let i = start; i < textNodesByY.length; i++) {
633
+ const node = textNodesByY[i];
634
+ if (node.y > py)
635
+ break;
636
+ if (py >= node.y && py <= node.y + node.height) {
637
+ candidates.push(node);
638
+ }
639
+ }
640
+ if (candidates.length === 0)
641
+ return null;
642
+ return hitTestText(candidates, px, py);
643
+ }
245
644
  /**
246
- * Enable text selection on a canvas rendered by a CanvasRenderer.
247
- *
248
- * Attaches pointer and keyboard event listeners for click-drag selection
249
- * and Ctrl/Cmd+C copy. Returns a cleanup function.
645
+ * Enable text selection and cursor styles on a canvas rendered by a CanvasRenderer.
646
+ * Returns a cleanup function.
250
647
  */
251
- export function enableSelection(canvas, renderer,
252
- /** Called after selection changes so you can re-render. */
253
- onSelectionChange) {
648
+ export function enableSelection(canvas, renderer, onSelectionChange) {
254
649
  let isSelecting = false;
650
+ let rafId = null;
651
+ let hoverRafId = null;
652
+ let pendingHoverPos = null;
653
+ function scheduleSelectionChange() {
654
+ if (rafId !== null)
655
+ return;
656
+ rafId = requestAnimationFrame(() => {
657
+ rafId = null;
658
+ if (onSelectionChange) {
659
+ onSelectionChange();
660
+ return;
661
+ }
662
+ // Fast path: selection-only repaint from cached frame.
663
+ if (renderer.lastLayout && renderer.lastTree) {
664
+ renderer.render(renderer.lastLayout, renderer.lastTree);
665
+ }
666
+ });
667
+ }
255
668
  function getCanvasPos(e) {
256
669
  const rect = canvas.getBoundingClientRect();
257
670
  return { x: e.clientX - rect.left, y: e.clientY - rect.top };
258
671
  }
259
672
  function onPointerDown(e) {
260
673
  const pos = getCanvasPos(e);
261
- const hit = hitTestText(renderer.textNodes, pos.x, pos.y);
674
+ const hit = hitTestTextFast(renderer.textNodesByY, pos.x, pos.y);
262
675
  if (!hit) {
263
- // Clear selection if clicking outside text
264
676
  if (renderer.selection) {
265
677
  renderer.selection = null;
266
- onSelectionChange?.();
678
+ scheduleSelectionChange();
267
679
  }
268
680
  return;
269
681
  }
270
682
  isSelecting = true;
683
+ renderer.setInteractionActive(true);
271
684
  renderer.selection = {
272
- anchorNode: hit.nodeIndex,
273
- anchorOffset: hit.charOffset,
274
- focusNode: hit.nodeIndex,
275
- focusOffset: hit.charOffset,
685
+ anchorNode: hit.nodeIndex, anchorOffset: hit.charOffset,
686
+ focusNode: hit.nodeIndex, focusOffset: hit.charOffset,
276
687
  };
277
688
  canvas.setPointerCapture(e.pointerId);
278
- onSelectionChange?.();
689
+ scheduleSelectionChange();
279
690
  }
280
691
  function onPointerMove(e) {
281
692
  if (!isSelecting || !renderer.selection)
282
693
  return;
283
694
  const pos = getCanvasPos(e);
284
- const hit = hitTestText(renderer.textNodes, pos.x, pos.y);
695
+ const hit = hitTestTextFast(renderer.textNodesByY, pos.x, pos.y);
285
696
  if (hit) {
286
- renderer.selection.focusNode = hit.nodeIndex;
287
- renderer.selection.focusOffset = hit.charOffset;
288
- onSelectionChange?.();
697
+ if (renderer.selection.focusNode !== hit.nodeIndex ||
698
+ renderer.selection.focusOffset !== hit.charOffset) {
699
+ renderer.selection.focusNode = hit.nodeIndex;
700
+ renderer.selection.focusOffset = hit.charOffset;
701
+ scheduleSelectionChange();
702
+ }
289
703
  }
290
704
  }
291
- function onPointerUp(_e) {
705
+ function onPointerUp() {
292
706
  isSelecting = false;
707
+ renderer.setInteractionActive(false);
708
+ scheduleSelectionChange();
293
709
  }
294
710
  function onKeyDown(e) {
711
+ if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'a') {
712
+ if (renderer.textNodes.length > 0) {
713
+ const first = renderer.textNodes[0];
714
+ const last = renderer.textNodes[renderer.textNodes.length - 1];
715
+ renderer.selection = {
716
+ anchorNode: first.index,
717
+ anchorOffset: 0,
718
+ focusNode: last.index,
719
+ focusOffset: last.element.props.text.length,
720
+ };
721
+ scheduleSelectionChange();
722
+ e.preventDefault();
723
+ return;
724
+ }
725
+ }
295
726
  if ((e.metaKey || e.ctrlKey) && e.key === 'c') {
296
727
  const selectedText = renderer.getSelectedText();
297
728
  if (selectedText) {
@@ -300,24 +731,54 @@ onSelectionChange) {
300
731
  }
301
732
  }
302
733
  }
303
- // Use cursor to indicate selectable area
734
+ function flushHoverCursor() {
735
+ hoverRafId = null;
736
+ if (isSelecting || !pendingHoverPos)
737
+ return;
738
+ const pos = pendingHoverPos;
739
+ pendingHoverPos = null;
740
+ // Check for element cursor prop first
741
+ if (renderer.lastTree && renderer.lastLayout) {
742
+ const elementCursor = getCursorAtPoint(renderer.lastTree, renderer.lastLayout, pos.x, pos.y);
743
+ if (elementCursor) {
744
+ if (canvas.style.cursor !== elementCursor) {
745
+ canvas.style.cursor = elementCursor;
746
+ }
747
+ return;
748
+ }
749
+ }
750
+ // Fall back to text selection cursor
751
+ const hit = hitTestTextFast(renderer.textNodesByY, pos.x, pos.y);
752
+ const nextCursor = hit ? 'text' : 'default';
753
+ if (canvas.style.cursor !== nextCursor) {
754
+ canvas.style.cursor = nextCursor;
755
+ }
756
+ }
304
757
  function onMouseMove(e) {
305
- if (isSelecting)
758
+ pendingHoverPos = getCanvasPos(e);
759
+ if (hoverRafId !== null)
306
760
  return;
307
- const pos = getCanvasPos(e);
308
- const hit = hitTestText(renderer.textNodes, pos.x, pos.y);
309
- canvas.style.cursor = hit ? 'text' : 'default';
761
+ hoverRafId = requestAnimationFrame(flushHoverCursor);
310
762
  }
311
763
  canvas.addEventListener('pointerdown', onPointerDown);
312
764
  canvas.addEventListener('pointermove', onPointerMove);
313
765
  canvas.addEventListener('pointerup', onPointerUp);
314
766
  canvas.addEventListener('mousemove', onMouseMove);
315
767
  document.addEventListener('keydown', onKeyDown);
316
- // Make canvas focusable for keyboard events
317
768
  if (!canvas.hasAttribute('tabindex')) {
318
769
  canvas.setAttribute('tabindex', '0');
319
770
  }
320
771
  return () => {
772
+ renderer.setInteractionActive(false);
773
+ if (rafId !== null) {
774
+ cancelAnimationFrame(rafId);
775
+ rafId = null;
776
+ }
777
+ if (hoverRafId !== null) {
778
+ cancelAnimationFrame(hoverRafId);
779
+ hoverRafId = null;
780
+ }
781
+ pendingHoverPos = null;
321
782
  canvas.removeEventListener('pointerdown', onPointerDown);
322
783
  canvas.removeEventListener('pointermove', onPointerMove);
323
784
  canvas.removeEventListener('pointerup', onPointerUp);
@@ -325,4 +786,55 @@ onSelectionChange) {
325
786
  document.removeEventListener('keydown', onKeyDown);
326
787
  };
327
788
  }
789
+ function createAccessibilityElement(node, doc) {
790
+ const el = doc.createElement('div');
791
+ el.setAttribute('role', node.role);
792
+ if (node.name)
793
+ el.setAttribute('aria-label', node.name);
794
+ el.style.position = 'absolute';
795
+ el.style.left = `${node.bounds.x}px`;
796
+ el.style.top = `${node.bounds.y}px`;
797
+ el.style.width = `${Math.max(1, node.bounds.width)}px`;
798
+ el.style.height = `${Math.max(1, node.bounds.height)}px`;
799
+ el.style.pointerEvents = 'none';
800
+ el.style.background = 'transparent';
801
+ if (node.focusable)
802
+ el.setAttribute('tabindex', '0');
803
+ for (const child of node.children) {
804
+ el.appendChild(createAccessibilityElement(child, doc));
805
+ }
806
+ return el;
807
+ }
808
+ /**
809
+ * Mirror canvas semantics into a hidden DOM subtree for assistive tech.
810
+ * The mirror auto-syncs after every canvas render.
811
+ */
812
+ export function enableAccessibilityMirror(host, renderer, options = {}) {
813
+ const doc = host.ownerDocument;
814
+ const root = doc.createElement('div');
815
+ root.setAttribute('aria-label', options.rootLabel ?? 'Geometra accessibility mirror');
816
+ root.style.position = 'absolute';
817
+ root.style.left = '0';
818
+ root.style.top = '0';
819
+ root.style.width = '1px';
820
+ root.style.height = '1px';
821
+ root.style.overflow = 'hidden';
822
+ root.style.clipPath = 'inset(50%)';
823
+ root.style.whiteSpace = 'nowrap';
824
+ host.appendChild(root);
825
+ const originalRender = renderer.render.bind(renderer);
826
+ const patchedRender = (layout, tree) => {
827
+ originalRender(layout, tree);
828
+ const a11y = renderer.getAccessibilityTree();
829
+ root.replaceChildren();
830
+ if (a11y) {
831
+ root.appendChild(createAccessibilityElement(a11y, doc));
832
+ }
833
+ };
834
+ renderer.render = patchedRender;
835
+ return () => {
836
+ renderer.render = originalRender;
837
+ root.remove();
838
+ };
839
+ }
328
840
  //# sourceMappingURL=renderer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geometra/renderer-canvas",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Canvas2D renderer for Geometra — the singularity frontend framework",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -34,6 +34,6 @@
34
34
  "check": "tsc --noEmit"
35
35
  },
36
36
  "dependencies": {
37
- "@geometra/core": "^0.2.0"
37
+ "@geometra/core": "^0.2.1"
38
38
  }
39
39
  }