@hypen-space/web 0.2.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.
Files changed (195) hide show
  1. package/dist/chunk-2s02mkzs.js +32 -0
  2. package/dist/chunk-2s02mkzs.js.map +9 -0
  3. package/dist/src/canvas/accessibility.js +152 -0
  4. package/dist/src/canvas/accessibility.js.map +10 -0
  5. package/dist/src/canvas/events.js +198 -0
  6. package/dist/src/canvas/events.js.map +10 -0
  7. package/dist/src/canvas/index.js +28 -0
  8. package/dist/src/canvas/index.js.map +9 -0
  9. package/dist/src/canvas/input.js +132 -0
  10. package/dist/src/canvas/input.js.map +10 -0
  11. package/dist/src/canvas/layout.js +309 -0
  12. package/dist/src/canvas/layout.js.map +10 -0
  13. package/dist/src/canvas/paint.js +878 -0
  14. package/dist/src/canvas/paint.js.map +10 -0
  15. package/dist/src/canvas/renderer.js +276 -0
  16. package/dist/src/canvas/renderer.js.map +10 -0
  17. package/dist/src/canvas/text.js +118 -0
  18. package/dist/src/canvas/text.js.map +10 -0
  19. package/dist/src/canvas/types.js +2 -0
  20. package/dist/src/canvas/types.js.map +9 -0
  21. package/dist/src/canvas/utils.js +139 -0
  22. package/dist/src/canvas/utils.js.map +10 -0
  23. package/dist/src/dom/applicators/advanced-layout.js +111 -0
  24. package/dist/src/dom/applicators/advanced-layout.js.map +10 -0
  25. package/dist/src/dom/applicators/background.js +54 -0
  26. package/dist/src/dom/applicators/background.js.map +10 -0
  27. package/dist/src/dom/applicators/border.js +33 -0
  28. package/dist/src/dom/applicators/border.js.map +10 -0
  29. package/dist/src/dom/applicators/color.js +36 -0
  30. package/dist/src/dom/applicators/color.js.map +10 -0
  31. package/dist/src/dom/applicators/display.js +57 -0
  32. package/dist/src/dom/applicators/display.js.map +10 -0
  33. package/dist/src/dom/applicators/effects.js +89 -0
  34. package/dist/src/dom/applicators/effects.js.map +10 -0
  35. package/dist/src/dom/applicators/events.js +518 -0
  36. package/dist/src/dom/applicators/events.js.map +10 -0
  37. package/dist/src/dom/applicators/font.js +39 -0
  38. package/dist/src/dom/applicators/font.js.map +10 -0
  39. package/dist/src/dom/applicators/index.js +296 -0
  40. package/dist/src/dom/applicators/index.js.map +10 -0
  41. package/dist/src/dom/applicators/layout.js +86 -0
  42. package/dist/src/dom/applicators/layout.js.map +10 -0
  43. package/dist/src/dom/applicators/margin.js +32 -0
  44. package/dist/src/dom/applicators/margin.js.map +10 -0
  45. package/dist/src/dom/applicators/padding.js +35 -0
  46. package/dist/src/dom/applicators/padding.js.map +10 -0
  47. package/dist/src/dom/applicators/size.js +42 -0
  48. package/dist/src/dom/applicators/size.js.map +10 -0
  49. package/dist/src/dom/applicators/transform.js +92 -0
  50. package/dist/src/dom/applicators/transform.js.map +10 -0
  51. package/dist/src/dom/applicators/transition.js +66 -0
  52. package/dist/src/dom/applicators/transition.js.map +10 -0
  53. package/dist/src/dom/applicators/typography.js +87 -0
  54. package/dist/src/dom/applicators/typography.js.map +10 -0
  55. package/dist/src/dom/canvas/index.js +50 -0
  56. package/dist/src/dom/canvas/index.js.map +10 -0
  57. package/dist/src/dom/components/audio.js +48 -0
  58. package/dist/src/dom/components/audio.js.map +10 -0
  59. package/dist/src/dom/components/avatar.js +58 -0
  60. package/dist/src/dom/components/avatar.js.map +10 -0
  61. package/dist/src/dom/components/badge.js +55 -0
  62. package/dist/src/dom/components/badge.js.map +10 -0
  63. package/dist/src/dom/components/button.js +29 -0
  64. package/dist/src/dom/components/button.js.map +10 -0
  65. package/dist/src/dom/components/card.js +33 -0
  66. package/dist/src/dom/components/card.js.map +10 -0
  67. package/dist/src/dom/components/center.js +32 -0
  68. package/dist/src/dom/components/center.js.map +10 -0
  69. package/dist/src/dom/components/checkbox.js +54 -0
  70. package/dist/src/dom/components/checkbox.js.map +10 -0
  71. package/dist/src/dom/components/column.js +31 -0
  72. package/dist/src/dom/components/column.js.map +10 -0
  73. package/dist/src/dom/components/container.js +29 -0
  74. package/dist/src/dom/components/container.js.map +10 -0
  75. package/dist/src/dom/components/divider.js +45 -0
  76. package/dist/src/dom/components/divider.js.map +10 -0
  77. package/dist/src/dom/components/grid.js +44 -0
  78. package/dist/src/dom/components/grid.js.map +10 -0
  79. package/dist/src/dom/components/heading.js +47 -0
  80. package/dist/src/dom/components/heading.js.map +10 -0
  81. package/dist/src/dom/components/image.js +39 -0
  82. package/dist/src/dom/components/image.js.map +10 -0
  83. package/dist/src/dom/components/index.js +217 -0
  84. package/dist/src/dom/components/index.js.map +10 -0
  85. package/dist/src/dom/components/input.js +41 -0
  86. package/dist/src/dom/components/input.js.map +10 -0
  87. package/dist/src/dom/components/link.js +42 -0
  88. package/dist/src/dom/components/link.js.map +10 -0
  89. package/dist/src/dom/components/list.js +42 -0
  90. package/dist/src/dom/components/list.js.map +10 -0
  91. package/dist/src/dom/components/paragraph.js +35 -0
  92. package/dist/src/dom/components/paragraph.js.map +10 -0
  93. package/dist/src/dom/components/progressbar.js +57 -0
  94. package/dist/src/dom/components/progressbar.js.map +10 -0
  95. package/dist/src/dom/components/route.js +44 -0
  96. package/dist/src/dom/components/route.js.map +10 -0
  97. package/dist/src/dom/components/router.js +33 -0
  98. package/dist/src/dom/components/router.js.map +10 -0
  99. package/dist/src/dom/components/row.js +31 -0
  100. package/dist/src/dom/components/row.js.map +10 -0
  101. package/dist/src/dom/components/select.js +57 -0
  102. package/dist/src/dom/components/select.js.map +10 -0
  103. package/dist/src/dom/components/slider.js +48 -0
  104. package/dist/src/dom/components/slider.js.map +10 -0
  105. package/dist/src/dom/components/spacer.js +30 -0
  106. package/dist/src/dom/components/spacer.js.map +10 -0
  107. package/dist/src/dom/components/spinner.js +65 -0
  108. package/dist/src/dom/components/spinner.js.map +10 -0
  109. package/dist/src/dom/components/stack.js +45 -0
  110. package/dist/src/dom/components/stack.js.map +10 -0
  111. package/dist/src/dom/components/switch.js +83 -0
  112. package/dist/src/dom/components/switch.js.map +10 -0
  113. package/dist/src/dom/components/text.js +37 -0
  114. package/dist/src/dom/components/text.js.map +10 -0
  115. package/dist/src/dom/components/textarea.js +51 -0
  116. package/dist/src/dom/components/textarea.js.map +10 -0
  117. package/dist/src/dom/components/video.js +51 -0
  118. package/dist/src/dom/components/video.js.map +10 -0
  119. package/dist/src/dom/debug.js +170 -0
  120. package/dist/src/dom/debug.js.map +10 -0
  121. package/dist/src/dom/events.js +112 -0
  122. package/dist/src/dom/events.js.map +10 -0
  123. package/dist/src/dom/index.js +73 -0
  124. package/dist/src/dom/index.js.map +9 -0
  125. package/dist/src/dom/renderer.js +277 -0
  126. package/dist/src/dom/renderer.js.map +10 -0
  127. package/dist/src/index.js +89 -0
  128. package/dist/src/index.js.map +9 -0
  129. package/package.json +84 -0
  130. package/src/canvas/QUICKSTART.md +421 -0
  131. package/src/canvas/README.md +376 -0
  132. package/src/canvas/accessibility.ts +218 -0
  133. package/src/canvas/events.ts +307 -0
  134. package/src/canvas/index.ts +35 -0
  135. package/src/canvas/input.ts +210 -0
  136. package/src/canvas/layout.ts +401 -0
  137. package/src/canvas/paint.ts +1321 -0
  138. package/src/canvas/renderer.ts +422 -0
  139. package/src/canvas/text.ts +182 -0
  140. package/src/canvas/types.ts +137 -0
  141. package/src/canvas/utils.ts +218 -0
  142. package/src/dom/README.md +265 -0
  143. package/src/dom/applicators/advanced-layout.ts +128 -0
  144. package/src/dom/applicators/background.ts +50 -0
  145. package/src/dom/applicators/border.ts +19 -0
  146. package/src/dom/applicators/color.ts +23 -0
  147. package/src/dom/applicators/display.ts +54 -0
  148. package/src/dom/applicators/effects.ts +97 -0
  149. package/src/dom/applicators/events.ts +689 -0
  150. package/src/dom/applicators/font.ts +27 -0
  151. package/src/dom/applicators/index.ts +354 -0
  152. package/src/dom/applicators/layout.ts +92 -0
  153. package/src/dom/applicators/margin.ts +18 -0
  154. package/src/dom/applicators/padding.ts +18 -0
  155. package/src/dom/applicators/size.ts +31 -0
  156. package/src/dom/applicators/transform.ts +93 -0
  157. package/src/dom/applicators/transition.ts +65 -0
  158. package/src/dom/applicators/typography.ts +91 -0
  159. package/src/dom/canvas/index.ts +60 -0
  160. package/src/dom/components/audio.ts +45 -0
  161. package/src/dom/components/avatar.ts +49 -0
  162. package/src/dom/components/badge.ts +45 -0
  163. package/src/dom/components/button.ts +13 -0
  164. package/src/dom/components/card.ts +19 -0
  165. package/src/dom/components/center.ts +16 -0
  166. package/src/dom/components/checkbox.ts +54 -0
  167. package/src/dom/components/column.ts +15 -0
  168. package/src/dom/components/container.ts +13 -0
  169. package/src/dom/components/divider.ts +37 -0
  170. package/src/dom/components/grid.ts +40 -0
  171. package/src/dom/components/heading.ts +41 -0
  172. package/src/dom/components/image.ts +27 -0
  173. package/src/dom/components/index.ts +115 -0
  174. package/src/dom/components/input.ts +29 -0
  175. package/src/dom/components/link.ts +35 -0
  176. package/src/dom/components/list.ts +30 -0
  177. package/src/dom/components/paragraph.ts +23 -0
  178. package/src/dom/components/progressbar.ts +51 -0
  179. package/src/dom/components/route.ts +37 -0
  180. package/src/dom/components/router.ts +22 -0
  181. package/src/dom/components/row.ts +15 -0
  182. package/src/dom/components/select.ts +56 -0
  183. package/src/dom/components/slider.ts +45 -0
  184. package/src/dom/components/spacer.ts +16 -0
  185. package/src/dom/components/spinner.ts +60 -0
  186. package/src/dom/components/stack.ts +34 -0
  187. package/src/dom/components/switch.ts +86 -0
  188. package/src/dom/components/text.ts +24 -0
  189. package/src/dom/components/textarea.ts +50 -0
  190. package/src/dom/components/video.ts +50 -0
  191. package/src/dom/debug.ts +247 -0
  192. package/src/dom/events.ts +168 -0
  193. package/src/dom/index.ts +11 -0
  194. package/src/dom/renderer.ts +327 -0
  195. package/src/index.ts +56 -0
package/package.json ADDED
@@ -0,0 +1,84 @@
1
+ {
2
+ "name": "@hypen-space/web",
3
+ "version": "0.2.0",
4
+ "description": "Hypen web renderers - DOM and Canvas rendering for browsers",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "browser": "./dist/index.js",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "browser": "./dist/index.js",
14
+ "bun": "./src/index.ts",
15
+ "import": "./dist/index.js",
16
+ "default": "./dist/index.js"
17
+ },
18
+ "./dom": {
19
+ "types": "./dist/dom/index.d.ts",
20
+ "browser": "./dist/dom/index.js",
21
+ "bun": "./src/dom/index.ts",
22
+ "import": "./dist/dom/index.js",
23
+ "default": "./dist/dom/index.js"
24
+ },
25
+ "./canvas": {
26
+ "types": "./dist/canvas/index.d.ts",
27
+ "browser": "./dist/canvas/index.js",
28
+ "bun": "./src/canvas/index.ts",
29
+ "import": "./dist/canvas/index.js",
30
+ "default": "./dist/canvas/index.js"
31
+ },
32
+ "./hypen": {
33
+ "types": "./dist/hypen.d.ts",
34
+ "browser": "./dist/hypen.js",
35
+ "bun": "./src/hypen.ts",
36
+ "import": "./dist/hypen.js",
37
+ "default": "./dist/hypen.js"
38
+ }
39
+ },
40
+ "files": [
41
+ "dist",
42
+ "src"
43
+ ],
44
+ "scripts": {
45
+ "build": "bun run build.ts",
46
+ "build:types": "tsc --emitDeclarationOnly",
47
+ "typecheck": "tsc --noEmit",
48
+ "clean": "rm -rf dist"
49
+ },
50
+ "dependencies": {
51
+ "@hypen-space/core": "workspace:*"
52
+ },
53
+ "devDependencies": {
54
+ "@types/bun": "latest",
55
+ "typescript": "^5"
56
+ },
57
+ "peerDependencies": {
58
+ "typescript": "^5"
59
+ },
60
+ "peerDependenciesMeta": {
61
+ "typescript": {
62
+ "optional": true
63
+ }
64
+ },
65
+ "keywords": [
66
+ "hypen",
67
+ "ui",
68
+ "dom",
69
+ "canvas",
70
+ "renderer",
71
+ "browser"
72
+ ],
73
+ "engines": {
74
+ "node": ">=18.0.0"
75
+ },
76
+ "sideEffects": false,
77
+ "author": "Ian Rumac",
78
+ "license": "MIT",
79
+ "repository": {
80
+ "type": "git",
81
+ "url": "https://github.com/hypen-lang/hypen-engine-rs.git",
82
+ "directory": "hypen-render-bun/packages/web"
83
+ }
84
+ }
@@ -0,0 +1,421 @@
1
+ # Canvas Renderer Quick Start
2
+
3
+ Get started with the Hypen Canvas Renderer in 5 minutes.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ bun add @hypen/core
9
+ ```
10
+
11
+ ## Basic Setup
12
+
13
+ ### 1. Create HTML File
14
+
15
+ ```html
16
+ <!DOCTYPE html>
17
+ <html>
18
+ <head>
19
+ <title>My Canvas App</title>
20
+ </head>
21
+ <body>
22
+ <canvas id="app" width="800" height="600"></canvas>
23
+ <script type="module" src="./app.ts"></script>
24
+ </body>
25
+ </html>
26
+ ```
27
+
28
+ ### 2. Create App (`app.ts`)
29
+
30
+ ```typescript
31
+ import { Engine, app, HypenModuleInstance } from "@hypen/core";
32
+ import { CanvasRenderer } from "@hypen/core/canvas";
33
+
34
+ // Define state
35
+ type AppState = {
36
+ count: number;
37
+ };
38
+
39
+ // Define module
40
+ const appModule = app
41
+ .defineState<AppState>({ count: 0 })
42
+ .onAction("increment", async (action, state, next) => {
43
+ state.count++;
44
+ next();
45
+ })
46
+ .build();
47
+
48
+ // Setup
49
+ async function main() {
50
+ // Get canvas
51
+ const canvas = document.getElementById("app") as HTMLCanvasElement;
52
+
53
+ // Initialize engine
54
+ const engine = new Engine();
55
+ await engine.init();
56
+
57
+ // Create renderer
58
+ const renderer = new CanvasRenderer(canvas, engine, {
59
+ devicePixelRatio: window.devicePixelRatio,
60
+ backgroundColor: "#ffffff",
61
+ });
62
+
63
+ // Connect renderer
64
+ engine.setRenderCallback((patches) => {
65
+ renderer.applyPatches(patches);
66
+ });
67
+
68
+ // Create module
69
+ const instance = new HypenModuleInstance(engine, appModule);
70
+
71
+ // Render UI
72
+ await engine.renderSource(`
73
+ Column {
74
+ padding: 20
75
+ gap: 10
76
+
77
+ Text("Count: \${state.count}") {
78
+ fontSize: 24
79
+ }
80
+
81
+ Button("@actions.increment") {
82
+ padding: 10
83
+ backgroundColor: #007bff
84
+ borderRadius: 4
85
+
86
+ Text("Increment") {
87
+ color: white
88
+ }
89
+ }
90
+ }
91
+ `);
92
+ }
93
+
94
+ main();
95
+ ```
96
+
97
+ ### 3. Run
98
+
99
+ ```bash
100
+ bun app.ts
101
+ ```
102
+
103
+ Open `http://localhost:3000` (or your dev server) and you'll see your app!
104
+
105
+ ## Features Overview
106
+
107
+ ### Layouts
108
+
109
+ ```typescript
110
+ // Vertical layout
111
+ Column {
112
+ gap: 10
113
+ padding: 20
114
+
115
+ Text("Item 1")
116
+ Text("Item 2")
117
+ }
118
+
119
+ // Horizontal layout
120
+ Row {
121
+ gap: 5
122
+ justifyContent: center
123
+
124
+ Text("Left")
125
+ Text("Right")
126
+ }
127
+ ```
128
+
129
+ ### Styling
130
+
131
+ ```typescript
132
+ Text("Styled Text") {
133
+ fontSize: 18
134
+ fontWeight: bold
135
+ color: #333333
136
+ padding: 10
137
+ backgroundColor: #f0f0f0
138
+ borderRadius: 4
139
+ }
140
+ ```
141
+
142
+ ### Buttons
143
+
144
+ ```typescript
145
+ Button("@actions.save") {
146
+ padding: 12
147
+ backgroundColor: #28a745
148
+ borderRadius: 6
149
+
150
+ Text("Save") {
151
+ color: white
152
+ fontSize: 16
153
+ fontWeight: 500
154
+ }
155
+ }
156
+ ```
157
+
158
+ ### Inputs
159
+
160
+ ```typescript
161
+ Input {
162
+ value: "\${state.name}"
163
+ placeholder: "Enter name"
164
+ padding: 8
165
+ fontSize: 14
166
+ }
167
+ ```
168
+
169
+ ## Common Patterns
170
+
171
+ ### Counter
172
+
173
+ ```typescript
174
+ Column {
175
+ Row {
176
+ gap: 10
177
+
178
+ Button("@actions.decrement") {
179
+ Text("-")
180
+ }
181
+
182
+ Text("\${state.count}") {
183
+ fontSize: 24
184
+ }
185
+
186
+ Button("@actions.increment") {
187
+ Text("+")
188
+ }
189
+ }
190
+ }
191
+ ```
192
+
193
+ ### Form
194
+
195
+ ```typescript
196
+ Column {
197
+ gap: 15
198
+ padding: 20
199
+
200
+ Text("Login") {
201
+ fontSize: 24
202
+ fontWeight: bold
203
+ }
204
+
205
+ Input {
206
+ placeholder: "Username"
207
+ value: "\${state.username}"
208
+ }
209
+
210
+ Input {
211
+ placeholder: "Password"
212
+ type: password
213
+ value: "\${state.password}"
214
+ }
215
+
216
+ Button("@actions.login") {
217
+ Text("Login")
218
+ }
219
+ }
220
+ ```
221
+
222
+ ### Card
223
+
224
+ ```typescript
225
+ Container {
226
+ padding: 20
227
+ backgroundColor: white
228
+ borderRadius: 8
229
+ borderWidth: 1
230
+ borderColor: #e0e0e0
231
+
232
+ Column {
233
+ gap: 10
234
+
235
+ Text("Card Title") {
236
+ fontSize: 20
237
+ fontWeight: bold
238
+ }
239
+
240
+ Text("Card content goes here")
241
+
242
+ Button("@actions.action") {
243
+ Text("Action")
244
+ }
245
+ }
246
+ }
247
+ ```
248
+
249
+ ## Configuration Options
250
+
251
+ ```typescript
252
+ const renderer = new CanvasRenderer(canvas, engine, {
253
+ // Display
254
+ devicePixelRatio: window.devicePixelRatio, // HiDPI support
255
+ backgroundColor: "#ffffff", // Canvas background
256
+
257
+ // Features
258
+ enableAccessibility: true, // Screen reader support
259
+ enableHitTesting: true, // Mouse events
260
+ enableInputOverlay: true, // Text input support
261
+
262
+ // Debug
263
+ showLayoutBounds: false, // Show red boxes around elements
264
+ logPerformance: false, // Log FPS to console
265
+ });
266
+ ```
267
+
268
+ ## Custom Painters
269
+
270
+ Draw custom components:
271
+
272
+ ```typescript
273
+ renderer.registerPainter("Circle", (ctx, node) => {
274
+ const layout = node.layout!;
275
+ const radius = Math.min(layout.width, layout.height) / 2;
276
+ const centerX = layout.x + layout.width / 2;
277
+ const centerY = layout.y + layout.height / 2;
278
+
279
+ ctx.fillStyle = node.props.color || "#000";
280
+ ctx.beginPath();
281
+ ctx.arc(centerX, centerY, radius, 0, Math.PI * 2);
282
+ ctx.fill();
283
+ });
284
+ ```
285
+
286
+ Use in Hypen DSL:
287
+
288
+ ```typescript
289
+ Circle {
290
+ width: 100
291
+ height: 100
292
+ color: #ff0000
293
+ }
294
+ ```
295
+
296
+ ## Responsive Canvas
297
+
298
+ Make canvas responsive:
299
+
300
+ ```typescript
301
+ function setupCanvas() {
302
+ const canvas = document.getElementById("app") as HTMLCanvasElement;
303
+
304
+ function resize() {
305
+ const dpr = window.devicePixelRatio;
306
+ canvas.width = window.innerWidth * dpr;
307
+ canvas.height = window.innerHeight * dpr;
308
+ canvas.style.width = `${window.innerWidth}px`;
309
+ canvas.style.height = `${window.innerHeight}px`;
310
+
311
+ // Trigger re-render
312
+ engine.renderSource(ui);
313
+ }
314
+
315
+ window.addEventListener("resize", resize);
316
+ resize();
317
+
318
+ return canvas;
319
+ }
320
+ ```
321
+
322
+ ## Performance Tips
323
+
324
+ ### 1. Batch Updates
325
+
326
+ ```typescript
327
+ // Bad: Multiple updates trigger multiple renders
328
+ state.count = 1;
329
+ state.name = "Alice";
330
+ state.active = true;
331
+
332
+ // Good: Single update
333
+ Object.assign(state, {
334
+ count: 1,
335
+ name: "Alice",
336
+ active: true,
337
+ });
338
+ ```
339
+
340
+ ### 2. Debounce Real-time Updates
341
+
342
+ ```typescript
343
+ let timeoutId: number;
344
+
345
+ .onAction("search", async (action, state, next) => {
346
+ clearTimeout(timeoutId);
347
+ timeoutId = setTimeout(() => {
348
+ // Do expensive search
349
+ state.results = search(action.query);
350
+ next();
351
+ }, 300);
352
+ })
353
+ ```
354
+
355
+ ### 3. Measure Performance
356
+
357
+ ```typescript
358
+ const renderer = new CanvasRenderer(canvas, engine, {
359
+ logPerformance: true, // Logs FPS and frame times
360
+ });
361
+ ```
362
+
363
+ ## Troubleshooting
364
+
365
+ ### Canvas is Blurry
366
+
367
+ Make sure to set `devicePixelRatio`:
368
+
369
+ ```typescript
370
+ const renderer = new CanvasRenderer(canvas, engine, {
371
+ devicePixelRatio: window.devicePixelRatio,
372
+ });
373
+ ```
374
+
375
+ ### Text Input Not Working
376
+
377
+ Ensure `enableInputOverlay` is true:
378
+
379
+ ```typescript
380
+ const renderer = new CanvasRenderer(canvas, engine, {
381
+ enableInputOverlay: true,
382
+ });
383
+ ```
384
+
385
+ ### Nothing Renders
386
+
387
+ 1. Check canvas size is not 0x0
388
+ 2. Ensure engine is initialized: `await engine.init()`
389
+ 3. Check console for errors
390
+ 4. Enable debug mode: `showLayoutBounds: true`
391
+
392
+ ### Poor Performance
393
+
394
+ 1. Enable performance logging: `logPerformance: true`
395
+ 2. Check if too many elements (> 1000)
396
+ 3. Reduce update frequency
397
+ 4. Consider layer caching (future feature)
398
+
399
+ ## Next Steps
400
+
401
+ - Read the [Canvas Renderer README](./README.md)
402
+ - See [Canvas vs DOM comparison](../../docs/CANVAS_VS_DOM.md)
403
+ - Check the [implementation plan](./plan.md)
404
+ - Try the [example](../../examples/canvas-counter.ts)
405
+
406
+ ## Getting Help
407
+
408
+ - Check the [main documentation](../../README.md)
409
+ - Look at [examples](../../examples/)
410
+ - File an issue on GitHub
411
+
412
+ Happy coding! 🎨
413
+
414
+
415
+
416
+
417
+
418
+
419
+
420
+
421
+