@effindomv2/runtime 0.1.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 (92) hide show
  1. package/LICENSE.md +6 -0
  2. package/dist/bridge.js +4 -0
  3. package/dist/bridge.js.map +7 -0
  4. package/dist/effindom.v2.manifest.json +68 -0
  5. package/dist/fonts/NotoColorEmoji.ttf +0 -0
  6. package/dist/fonts/NotoEmoji-Regular.ttf +0 -0
  7. package/dist/fonts/NotoSans-Bold.ttf +0 -0
  8. package/dist/fonts/NotoSans-BoldItalic.ttf +0 -0
  9. package/dist/fonts/NotoSans-Italic.ttf +0 -0
  10. package/dist/fonts/NotoSans-Regular.ttf +0 -0
  11. package/dist/fonts/NotoSansMono-Bold.ttf +0 -0
  12. package/dist/fonts/NotoSansMono-Regular.ttf +0 -0
  13. package/dist/fonts/NotoSansSymbols2-Regular.ttf +0 -0
  14. package/dist/harness.js +2 -0
  15. package/dist/harness.js.map +7 -0
  16. package/dist/index.html +53 -0
  17. package/dist/runtime/effindom-core-v2.wasm32-simd.JQXIaRaN0-JahfIVFiSLE49WzzCENvef_2EDEm09nJs.wasm +0 -0
  18. package/dist/runtime/effindom-core-v2.wasm32-simd.y7RzpkMARiFeRkpgiqKQsAfv4Hf17NYdpni-6aLNhMs.js.symbols +10079 -0
  19. package/dist/runtime/effindom-core-v2.wasm32-simd.yhT7DGUv4soEv4W91WVZl3T7T_ecKojk5_IcnwL79a0.js +1 -0
  20. package/dist/runtime/effindom-core-v2.wasm32.JSfMkp9ertJzSZxA-_xz3yacrJUhswxlwbqbJLRIuqw.wasm +0 -0
  21. package/dist/runtime/effindom-core-v2.wasm32.xNgsQv7dCwf8Uy-PfJSoRNyk9-q1OSogUwkk5g6ZBjk.js.symbols +10088 -0
  22. package/dist/runtime/effindom-core-v2.wasm32.yhT7DGUv4soEv4W91WVZl3T7T_ecKojk5_IcnwL79a0.js +1 -0
  23. package/dist/runtime/effindom-core-v2.wasm64-simd.GkByf-CPorNOs1CORny_8JjVk8Z3piiFq92r-uw1Syc.js +1 -0
  24. package/dist/runtime/effindom-core-v2.wasm64-simd.p4P98oRu2wEWxtRRW8RHr27JhGeWvWlziZXDM_z3Nc4.js.symbols +10286 -0
  25. package/dist/runtime/effindom-core-v2.wasm64-simd.y75FYXRwhQrpaDGYbZWrohGDv0AmjTb-EjXwOjBIgnM.wasm +0 -0
  26. package/dist/runtime/effindom-core-v2.wasm64.GkByf-CPorNOs1CORny_8JjVk8Z3piiFq92r-uw1Syc.js +1 -0
  27. package/dist/runtime/effindom-core-v2.wasm64.emhE1_CJs4_zXp8wiQS_5lYpUQ0OchmXgxksi0ykaBs.js.symbols +10298 -0
  28. package/dist/runtime/effindom-core-v2.wasm64.sO-Yu70cfN8Qs3a5iEp6cbFPaiOchqcMKUzryu4npNo.wasm +0 -0
  29. package/dist/runtime/effindom-ui-v2.wasm32-simd.0Mas1XD03eYvemryTioWaZOBuBA5ij7MFlTa8CgEZWs.wasm +0 -0
  30. package/dist/runtime/effindom-ui-v2.wasm32-simd.ThSDClMnSWdwf9d89JZfYor0G1Z6OxR4lOc75rNRuD4.js.symbols +1890 -0
  31. package/dist/runtime/effindom-ui-v2.wasm32-simd.wved0xEV4EKXVNBU3Sx7giD4faxD2YII9sQ2N_wCP4I.js +2 -0
  32. package/dist/runtime/effindom-ui-v2.wasm32.H7kYg99bT9ADGh0uUvj6H9Dk1L058nVFLv_4R79IXW8.js.symbols +1900 -0
  33. package/dist/runtime/effindom-ui-v2.wasm32.tp53X7nHfG_EUq29naDyElfnqhMw2D1Tr1T-BJAYO7w.wasm +0 -0
  34. package/dist/runtime/effindom-ui-v2.wasm32.wved0xEV4EKXVNBU3Sx7giD4faxD2YII9sQ2N_wCP4I.js +2 -0
  35. package/dist/runtime/effindom-ui-v2.wasm64-simd.86tk9Z3xIpgTOykET_8Nn9iUVJnp1AzOHW4fVQRGtQE.wasm +0 -0
  36. package/dist/runtime/effindom-ui-v2.wasm64-simd.RQaXil22Chu63-vxK9oOuX8wUY044kbo190oYIbBU4M.js.symbols +1918 -0
  37. package/dist/runtime/effindom-ui-v2.wasm64-simd.ZS1KEAg0XQex-VXkfgpBHE8MIoqPF8qpaf8nOjANb_U.js +2 -0
  38. package/dist/runtime/effindom-ui-v2.wasm64.YSwpMFbr-Q1SBe0Ze8mub1u1PqsvSz3QIYuA3eaUMME.js.symbols +1924 -0
  39. package/dist/runtime/effindom-ui-v2.wasm64.ZS1KEAg0XQex-VXkfgpBHE8MIoqPF8qpaf8nOjANb_U.js +2 -0
  40. package/dist/runtime/effindom-ui-v2.wasm64.ioQ9DuM6gR_EjlfRHdF8EvNPBcKCs0PQbbY9-cjTV6Y.wasm +0 -0
  41. package/dist/runtime/icudt_minimal.962CX1q0-Nbv-OqXPaub5piYTOLumUk-nEvemcvvnpw.dat +0 -0
  42. package/package.json +62 -0
  43. package/scripts/build.sh +279 -0
  44. package/scripts/build_assets.sh +51 -0
  45. package/scripts/font_assets.sh +52 -0
  46. package/scripts/generate_manifest.py +121 -0
  47. package/scripts/stage_package_assets.sh +42 -0
  48. package/src/bridge/commit-policy.ts +10 -0
  49. package/src/bridge/events/canvas-geometry.ts +78 -0
  50. package/src/bridge/events/key-router.ts +187 -0
  51. package/src/bridge/events/pointer-router.ts +619 -0
  52. package/src/bridge/events/semantic-hit-testing.ts +27 -0
  53. package/src/bridge/events.ts +54 -0
  54. package/src/bridge/find-dialog.ts +690 -0
  55. package/src/bridge/find-session.ts +158 -0
  56. package/src/bridge/font-catalog.ts +51 -0
  57. package/src/bridge/google-fonts.ts +63 -0
  58. package/src/bridge/incremental-font-packages.ts +216 -0
  59. package/src/bridge/init.ts +77 -0
  60. package/src/bridge/interaction/editor-model.ts +371 -0
  61. package/src/bridge/interaction/editor-mutations.ts +495 -0
  62. package/src/bridge/interaction/editor-session.ts +628 -0
  63. package/src/bridge/interaction/logs.ts +23 -0
  64. package/src/bridge/interaction/text-encoding.ts +51 -0
  65. package/src/bridge/interaction.ts +86 -0
  66. package/src/bridge/local-types.ts +105 -0
  67. package/src/bridge/platform.ts +68 -0
  68. package/src/bridge/pointer-move-coalescer.ts +41 -0
  69. package/src/bridge/pull-to-refresh.ts +124 -0
  70. package/src/bridge/render-loop.ts +268 -0
  71. package/src/bridge/runtime/asset-manager.ts +202 -0
  72. package/src/bridge/runtime/find-controller.ts +269 -0
  73. package/src/bridge/runtime/font-manager.ts +691 -0
  74. package/src/bridge/runtime/open-canvas-api.ts +72 -0
  75. package/src/bridge/runtime/semantic-controller.ts +133 -0
  76. package/src/bridge/runtime/text-documents.ts +234 -0
  77. package/src/bridge/runtime.ts +315 -0
  78. package/src/bridge/touch-gesture.ts +159 -0
  79. package/src/bridge/utils/assets.ts +572 -0
  80. package/src/bridge/utils/backends.ts +163 -0
  81. package/src/bridge/utils/encoding.ts +128 -0
  82. package/src/bridge/utils/fetch.ts +147 -0
  83. package/src/bridge/utils/heap.ts +118 -0
  84. package/src/bridge.ts +93 -0
  85. package/src/clipboard.ts +139 -0
  86. package/src/core-types.ts +595 -0
  87. package/src/find-on-page.ts +284 -0
  88. package/src/harness.ts +53 -0
  89. package/src/index.ts +40 -0
  90. package/src/open-canvas.ts +108 -0
  91. package/src/runtime-config.ts +96 -0
  92. package/src/semantic.ts +905 -0
@@ -0,0 +1,595 @@
1
+ import type {
2
+ OpenCanvasApi,
3
+ OpenCanvasFindMatch,
4
+ OpenCanvasFindState,
5
+ OpenCanvasTextDocument,
6
+ SemanticNode,
7
+ } from './open-canvas';
8
+
9
+ export type {
10
+ OpenCanvasApi,
11
+ OpenCanvasFindMatch,
12
+ OpenCanvasFindOptions,
13
+ OpenCanvasFindResults,
14
+ OpenCanvasFindState,
15
+ OpenCanvasHandle,
16
+ OpenCanvasResolvedFindOptions,
17
+ OpenCanvasTextDocument,
18
+ SemanticBounds,
19
+ SemanticNode,
20
+ SemanticState,
21
+ } from './open-canvas';
22
+
23
+ export type WasmHandleLike =
24
+ | number
25
+ | bigint
26
+ | string
27
+ | {
28
+ valueOf(): unknown;
29
+ toString(): string;
30
+ };
31
+
32
+ export interface AssetLoadResult {
33
+ readonly width: number;
34
+ readonly height: number;
35
+ }
36
+
37
+ export interface BridgeFontRegistration {
38
+ readonly id: number;
39
+ readonly url: string;
40
+ readonly fallbackIds?: readonly number[];
41
+ }
42
+
43
+ export interface BridgeFontStackRegistration {
44
+ readonly primary: BridgeFontRegistration;
45
+ readonly fallbacks?: readonly BridgeFontRegistration[];
46
+ }
47
+
48
+ export interface CoreModule {
49
+ HEAPU8: Uint8Array;
50
+ HEAPU32: Uint32Array;
51
+ wasmMemory?: WebAssembly.Memory;
52
+ usesMemory64?: boolean;
53
+ refreshHeapViews?(): void;
54
+ locateFile?(path: string, prefix?: string): string;
55
+ instantiateWasm?(
56
+ imports: WebAssembly.Imports,
57
+ successCallback: (instance: WebAssembly.Instance, module?: WebAssembly.Module) => void,
58
+ ): object;
59
+ onAbort?(what?: unknown): void;
60
+ canvas?: HTMLCanvasElement;
61
+ onRuntimeInitialized?: () => void;
62
+ _malloc(size: number): WasmHandleLike;
63
+ _free(ptr: WasmHandleLike): void;
64
+ _ed_init(width: number, height: number, dpr: number): void;
65
+ _ed_init_webgl(width: number, height: number, dpr: number): void;
66
+ _ed_init_sw(width: number, height: number, dpr: number): void;
67
+ _ed_resize(width: number, height: number, dpr: number): void;
68
+ _ed_register_font(fontId: number, bytesPtr: WasmHandleLike, len: number): void;
69
+ _ed_unregister_font(fontId: number): void;
70
+ _ed_register_svg(svgId: number, bytesPtr: WasmHandleLike, len: number): void;
71
+ _ed_execute_command_buffer(ptr: WasmHandleLike, length: number): void;
72
+ _ed_register_texture_rgba(
73
+ textureId: number,
74
+ rgbaPtr: WasmHandleLike,
75
+ width: number,
76
+ height: number,
77
+ byteLength: number,
78
+ ): void;
79
+ _ed_unregister_texture(textureId: number): void;
80
+ _ed_reset_scene(): void;
81
+ _ed_render_frame(currentTimeMs: number): void;
82
+ _ed_clear_focus_state?(): void;
83
+ _ed_clear_text_input_state?(): void;
84
+ _ed_recover_device(): void;
85
+ _ed_hit_test(x: number, y: number): WasmHandleLike;
86
+ _ed_get_sw_framebuffer(): WasmHandleLike;
87
+ _ed_get_backend_type(): number;
88
+ _ed_get_device_state(): number;
89
+ _ed_notify_webgl_context_lost?(): void;
90
+ _ed_debug_simulate_device_lost?(): void;
91
+ }
92
+
93
+ export const EdBackendType = {
94
+ NONE: 0,
95
+ WEBGPU: 1,
96
+ WEBGL2: 2,
97
+ CPU: 3,
98
+ } as const;
99
+
100
+ export type EdBackendType = (typeof EdBackendType)[keyof typeof EdBackendType];
101
+
102
+ export const EdDeviceState = {
103
+ OK: 0,
104
+ LOST: 1,
105
+ RECOVERING: 2,
106
+ } as const;
107
+
108
+ export type EdDeviceState = (typeof EdDeviceState)[keyof typeof EdDeviceState];
109
+
110
+ export interface UiModule {
111
+ HEAPU8: Uint8Array;
112
+ HEAPU32: Uint32Array;
113
+ HEAPF32: Float32Array;
114
+ wasmMemory?: WebAssembly.Memory;
115
+ usesMemory64?: boolean;
116
+ refreshHeapViews?(): void;
117
+ _malloc(size: number): WasmHandleLike;
118
+ _free(ptr: WasmHandleLike): void;
119
+ _ui_reset(): void;
120
+ _ui_arena_alloc(size: number): WasmHandleLike;
121
+ _ui_register_icu_data(ptr: WasmHandleLike, len: number): void;
122
+ _ui_create_node(type: number): WasmHandleLike;
123
+ _ui_delete_node(handle: WasmHandleLike): void;
124
+ _ui_node_add_child(parent: WasmHandleLike, child: WasmHandleLike): void;
125
+ _ui_set_root(handle: WasmHandleLike): void;
126
+ _ui_set_node_id(handle: WasmHandleLike, strPtr: WasmHandleLike, len: number): void;
127
+ _ui_set_semantic_role(handle: WasmHandleLike, role: number): void;
128
+ _ui_set_semantic_label(handle: WasmHandleLike, strPtr: WasmHandleLike, len: number): void;
129
+ _ui_set_semantic_checked(handle: WasmHandleLike, checkedState: number): void;
130
+ _ui_set_semantic_selected(handle: WasmHandleLike, hasSelected: number, selected: number): void;
131
+ _ui_set_semantic_expanded(handle: WasmHandleLike, hasExpanded: number, expanded: number): void;
132
+ _ui_set_semantic_disabled(handle: WasmHandleLike, hasDisabled: number, disabled: number): void;
133
+ _ui_set_semantic_value_range(
134
+ handle: WasmHandleLike,
135
+ hasValueRange: number,
136
+ valueNow: number,
137
+ valueMin: number,
138
+ valueMax: number,
139
+ ): void;
140
+ _ui_set_semantic_orientation(handle: WasmHandleLike, orientation: number): void;
141
+ _ui_request_semantic_announcement(handle: WasmHandleLike): void;
142
+ _ui_push_semantic_scope(handle: WasmHandleLike): number;
143
+ _ui_remove_semantic_scope(token: number): void;
144
+ _ui_set_width(handle: WasmHandleLike, value: number, unit: number): void;
145
+ _ui_set_height(handle: WasmHandleLike, value: number, unit: number): void;
146
+ _ui_set_flex_direction(handle: WasmHandleLike, direction: number): void;
147
+ _ui_set_flex_grow(handle: WasmHandleLike, grow: number): void;
148
+ _ui_set_flex_basis(handle: WasmHandleLike, basis: number): void;
149
+ _ui_set_justify_content(handle: WasmHandleLike, justify: number): void;
150
+ _ui_set_align_items(handle: WasmHandleLike, align: number): void;
151
+ _ui_set_padding(handle: WasmHandleLike, left: number, top: number, right: number, bottom: number): void;
152
+ _ui_set_margin(handle: WasmHandleLike, left: number, top: number, right: number, bottom: number): void;
153
+ _ui_set_position_type(handle: WasmHandleLike, positionType: number): void;
154
+ _ui_set_position(handle: WasmHandleLike, left: number, top: number, right: number, bottom: number): void;
155
+ _ui_node_remove_child(parent: WasmHandleLike, child: WasmHandleLike): void;
156
+ _ui_set_is_portal(handle: WasmHandleLike, portal: number): void;
157
+ _ui_set_is_shared_size_scope(handle: WasmHandleLike, isScope: number): void;
158
+ _ui_grid_set_columns(handle: WasmHandleLike, count: number, valuesPtr: WasmHandleLike, typesPtr: WasmHandleLike): void;
159
+ _ui_grid_set_rows(handle: WasmHandleLike, count: number, valuesPtr: WasmHandleLike, typesPtr: WasmHandleLike): void;
160
+ _ui_grid_set_column_shared_size_group(handle: WasmHandleLike, index: number, strPtr: WasmHandleLike, len: number): void;
161
+ _ui_grid_set_row_shared_size_group(handle: WasmHandleLike, index: number, strPtr: WasmHandleLike, len: number): void;
162
+ _ui_node_set_grid_placement(handle: WasmHandleLike, row: number, col: number, rowSpan: number, colSpan: number): void;
163
+ _ui_set_bg_color(handle: WasmHandleLike, color: number): void;
164
+ _ui_set_box_style(
165
+ handle: WasmHandleLike,
166
+ bgColor: number,
167
+ topLeftRadius: number,
168
+ topRightRadius: number,
169
+ bottomRightRadius: number,
170
+ bottomLeftRadius: number,
171
+ borderWidth: number,
172
+ borderColor: number,
173
+ borderStyle: number,
174
+ borderDashOn: number,
175
+ borderDashOff: number,
176
+ ): void;
177
+ _ui_set_drop_shadow(
178
+ handle: WasmHandleLike,
179
+ color: number,
180
+ offsetX: number,
181
+ offsetY: number,
182
+ blurSigma: number,
183
+ spread: number,
184
+ ): void;
185
+ _ui_set_layer_effect(handle: WasmHandleLike, opacity: number, blurSigma: number, blendMode: number): void;
186
+ _ui_set_background_blur(handle: WasmHandleLike, blurSigma: number): void;
187
+ _ui_set_image(handle: WasmHandleLike, textureId: number, objectFit: number): void;
188
+ _ui_set_image_nine(
189
+ handle: WasmHandleLike,
190
+ textureId: number,
191
+ insetLeft: number,
192
+ insetTop: number,
193
+ insetRight: number,
194
+ insetBottom: number,
195
+ ): void;
196
+ _ui_set_svg(handle: WasmHandleLike, svgId: number, tintColor: number): void;
197
+ _ui_set_linear_gradient(
198
+ handle: WasmHandleLike,
199
+ startX: number,
200
+ startY: number,
201
+ endX: number,
202
+ endY: number,
203
+ stopCount: number,
204
+ offsetsPtr: WasmHandleLike,
205
+ colorsPtr: WasmHandleLike,
206
+ ): void;
207
+ _ui_set_clip_to_bounds(handle: WasmHandleLike, clip: number): void;
208
+ _ui_set_visibility(handle: WasmHandleLike, visibility: number): void;
209
+ _ui_set_font(handle: WasmHandleLike, fontId: number, size: number): void;
210
+ _ui_set_line_height(handle: WasmHandleLike, lineHeight: number): void;
211
+ _ui_set_text(handle: WasmHandleLike, strPtr: WasmHandleLike, len: number): void;
212
+ _ui_set_text_style_runs(handle: WasmHandleLike, runCount: number, runsWordsPtr: WasmHandleLike): void;
213
+ _ui_set_text_color(handle: WasmHandleLike, color: number): void;
214
+ _ui_set_text_align(handle: WasmHandleLike, align: number): void;
215
+ _ui_set_text_vertical_align(handle: WasmHandleLike, align: number): void;
216
+ _ui_set_text_limits(handle: WasmHandleLike, maxChars: number, maxLines: number): void;
217
+ _ui_set_text_wrapping(handle: WasmHandleLike, wrap: number): void;
218
+ _ui_set_text_overflow(handle: WasmHandleLike, overflow: number): void;
219
+ _ui_set_text_overflow_fade(handle: WasmHandleLike, horizontal: number, vertical: number): void;
220
+ _ui_set_text_obscured(handle: WasmHandleLike, obscured: number): void;
221
+ _ui_set_scroll_offset(handle: WasmHandleLike, x: number, y: number): void;
222
+ _ui_has_pending_visual_work(): number;
223
+ _ui_needs_animation_frame(): number;
224
+ _ui_has_pointer_autoscroll(): number;
225
+ _ui_selection_autoscroll(x: number, y: number, edgeThreshold: number): WasmHandleLike;
226
+ _ui_get_bounds(
227
+ handle: WasmHandleLike,
228
+ outX: WasmHandleLike,
229
+ outY: WasmHandleLike,
230
+ outWidth: WasmHandleLike,
231
+ outHeight: WasmHandleLike,
232
+ ): number;
233
+ _ui_set_selectable(handle: WasmHandleLike, selectable: number, color: number): void;
234
+ _ui_set_selection_area(handle: WasmHandleLike, isArea: number): void;
235
+ _ui_set_selection_area_barrier(handle: WasmHandleLike, isBarrier: number): void;
236
+ _ui_clear_selection(handle: WasmHandleLike): void;
237
+ _ui_retarget_selection(fromHandle: WasmHandleLike, toHandle: WasmHandleLike): void;
238
+ _ui_is_point_in_selection(x: number, y: number): number;
239
+ _ui_set_text_selection_range(handle: WasmHandleLike, selectionStart: number, selectionEnd: number): void;
240
+ _ui_get_text_scene_position_x(handle: WasmHandleLike, byteIndex: number): number;
241
+ _ui_get_text_scene_position_y(handle: WasmHandleLike, byteIndex: number): number;
242
+ _ui_get_text_snapshot_handle_count(): number;
243
+ _ui_copy_text_snapshot_handles(outPtr: WasmHandleLike, maxHandleCount: number): number;
244
+ _ui_set_text_find_match(handle: WasmHandleLike, start: number, end: number): number;
245
+ _ui_clear_text_find_match(): void;
246
+ _ui_push_text_find_highlight(handle: WasmHandleLike, start: number, end: number, color: number): number;
247
+ _ui_clear_text_find_highlights(): void;
248
+ _ui_get_text_document_utf8_length(handle: WasmHandleLike): number;
249
+ _ui_copy_text_document_utf8(handle: WasmHandleLike, outPtr: WasmHandleLike, bufferLength: number): number;
250
+ _ui_get_text_visible_bounds(
251
+ handle: WasmHandleLike,
252
+ outXPtr: WasmHandleLike,
253
+ outYPtr: WasmHandleLike,
254
+ outWidthPtr: WasmHandleLike,
255
+ outHeightPtr: WasmHandleLike,
256
+ ): number;
257
+ _ui_get_text_range_rect_count(handle: WasmHandleLike, start: number, end: number): number;
258
+ _ui_copy_text_range_rects(
259
+ handle: WasmHandleLike,
260
+ start: number,
261
+ end: number,
262
+ outPtr: WasmHandleLike,
263
+ maxRectCount: number,
264
+ ): number;
265
+ _ui_reveal_text_range(handle: WasmHandleLike, start: number, end: number): number;
266
+ _ui_clear_current_selection(): void;
267
+ _ui_copy_current_selection(): void;
268
+ _ui_can_undo_text_edit(handle: WasmHandleLike): number;
269
+ _ui_can_redo_text_edit(handle: WasmHandleLike): number;
270
+ _ui_has_text_selection(handle: WasmHandleLike): number;
271
+ _ui_undo_text_edit(handle: WasmHandleLike): void;
272
+ _ui_redo_text_edit(handle: WasmHandleLike): void;
273
+ _ui_copy_text_selection(handle: WasmHandleLike): void;
274
+ _ui_cut_text_selection(handle: WasmHandleLike): void;
275
+ _ui_paste_text(handle: WasmHandleLike): void;
276
+ _ui_select_all_text(handle: WasmHandleLike): void;
277
+ _ui_set_interactive(handle: WasmHandleLike, interactive: number): void;
278
+ _ui_set_scroll_proxy_target(handle: WasmHandleLike, scrollHandle: WasmHandleLike): void;
279
+ _ui_set_scroll_enabled(handle: WasmHandleLike, enabledX: number, enabledY: number): void;
280
+ _ui_set_show_scrollbars(handle: WasmHandleLike, showScrollbars: number): void;
281
+ _ui_set_scroll_friction(handle: WasmHandleLike, friction: number): void;
282
+ _ui_set_scroll_content_size(handle: WasmHandleLike, contentWidth: number, contentHeight: number): void;
283
+ _ui_set_editable(handle: WasmHandleLike, editable: number): void;
284
+ _ui_set_caret_color(handle: WasmHandleLike, color: number): void;
285
+ _ui_set_focusable(handle: WasmHandleLike, focusable: number, tabIndex: number): void;
286
+ _ui_request_focus(handle: WasmHandleLike): void;
287
+ _ui_commit_frame(): void;
288
+ _ui_get_command_buffer(outLenPtr: WasmHandleLike): WasmHandleLike;
289
+ _ui_get_semantic_buffer(outLenPtr: WasmHandleLike): WasmHandleLike;
290
+ _ui_resize_window(w: number, h: number): void;
291
+ _ui_set_key_modifiers(modifiers: number): void;
292
+ _ui_on_pointer_event(event: number, handle: WasmHandleLike, x: number, y: number): void;
293
+ _ui_on_wheel_event(deltaX: number, deltaY: number): void;
294
+ _ui_touch_scroll_begin(handle: WasmHandleLike, x: number, y: number): void;
295
+ _ui_touch_scroll_update(deltaX: number, deltaY: number): void;
296
+ _ui_touch_scroll_end(): void;
297
+ _ui_clear_momentum_scroll(): void;
298
+ _ui_touch_scroll_allows_pull_to_refresh(): number;
299
+ _ui_set_coarse_pointer_mode(coarsePointerMode: number): void;
300
+ _ui_set_platform_family(platformFamily: number): void;
301
+ _ui_on_key_event(type: number, strPtr: WasmHandleLike, len: number, mods: number): void;
302
+ _ui_on_ime_update(handle: WasmHandleLike, strPtr: WasmHandleLike, len: number, caretIdx: number): void;
303
+ _ui_replace_text_range(
304
+ handle: WasmHandleLike,
305
+ startIdx: number,
306
+ endIdx: number,
307
+ strPtr: WasmHandleLike,
308
+ len: number,
309
+ caretIdx: number,
310
+ ): void;
311
+ _ui_on_paste_text(handle: WasmHandleLike, strPtr: WasmHandleLike, len: number): void;
312
+ _ui_set_interaction_time(ms: WasmHandleLike): void;
313
+ _ui_measure_text(
314
+ strPtr: WasmHandleLike,
315
+ len: number,
316
+ fontId: number,
317
+ size: number,
318
+ maxWidth: number,
319
+ outWidthPtr: WasmHandleLike,
320
+ outHeightPtr: WasmHandleLike,
321
+ ): void;
322
+ _ui_register_font(id: number, bytesPtr: WasmHandleLike, len: number): number;
323
+ _ui_register_font_fallback(fontId: number, fallbackFontId: number): void;
324
+ _ui_unregister_font_fallback(fontId: number, fallbackFontId: number): number;
325
+ _ui_unregister_font(fontId: number): number;
326
+ _ui_font_loaded(fontId: number): void;
327
+ }
328
+
329
+ export interface PointerEventLog {
330
+ readonly handle: string;
331
+ readonly eventType: number;
332
+ }
333
+
334
+ export interface FocusEventLog {
335
+ readonly handle: string;
336
+ readonly isFocused: boolean;
337
+ }
338
+
339
+ export interface TextChangeLog {
340
+ readonly handle: string;
341
+ readonly text: string;
342
+ readonly textLength?: number;
343
+ readonly truncated?: boolean;
344
+ }
345
+
346
+ export interface SelectionChangeLog {
347
+ readonly handle: string;
348
+ readonly start: number;
349
+ readonly end: number;
350
+ }
351
+
352
+ export interface CrossSelectionChangeLog {
353
+ readonly areaHandle: string;
354
+ readonly text: string;
355
+ }
356
+
357
+ export interface ScrollEventLog {
358
+ readonly handle: string;
359
+ readonly offsetX: number;
360
+ readonly offsetY: number;
361
+ readonly contentWidth: number;
362
+ readonly contentHeight: number;
363
+ readonly viewportWidth: number;
364
+ readonly viewportHeight: number;
365
+ }
366
+
367
+ export interface MissingFontCoverageLog {
368
+ readonly fontId: number;
369
+ readonly coverageKind: number;
370
+ readonly sampleText: string;
371
+ }
372
+
373
+ export interface IncrementalFontPackageRequestLog {
374
+ readonly primaryFontId: number;
375
+ readonly coverageKind: number;
376
+ readonly packageId: string;
377
+ readonly segmentIds: readonly string[];
378
+ readonly sampleText: string;
379
+ }
380
+
381
+ export type IncrementalFontAutoGrowBlockReason =
382
+ | 'auto-grow-disabled'
383
+ | 'font-not-allowed'
384
+ | 'package-blocked';
385
+
386
+ export interface IncrementalFontPolicy {
387
+ readonly autoGrow: boolean;
388
+ readonly maxCachedShardFonts: number;
389
+ readonly allowedFontIds: readonly number[] | null;
390
+ readonly blockedPackageIds: readonly string[] | null;
391
+ }
392
+
393
+ export interface IncrementalFontCacheState {
394
+ readonly maxCachedShardFonts: number;
395
+ readonly cachedShardCount: number;
396
+ readonly cachedShardKeys: readonly string[];
397
+ readonly evictedShardKeys: readonly string[];
398
+ }
399
+
400
+ export interface IncrementalFontRuntimeState {
401
+ readonly fontId: number;
402
+ readonly sourceUrl: string | null;
403
+ readonly sourceState: 'unknown' | 'known' | 'loading' | 'loaded' | 'failed';
404
+ readonly loaded: boolean;
405
+ readonly requestedSegmentIds: readonly string[];
406
+ readonly pendingSegmentIds: readonly string[];
407
+ readonly appliedSegmentIds: readonly string[];
408
+ readonly evictedSegmentIds: readonly string[];
409
+ readonly revision: number;
410
+ readonly autoGrowAllowed: boolean;
411
+ readonly blockedPackageIds: readonly string[];
412
+ readonly lastBlockedReason: IncrementalFontAutoGrowBlockReason | null;
413
+ }
414
+
415
+ export interface ClipboardRichTextPart {
416
+ readonly text: string;
417
+ readonly fontId?: number;
418
+ readonly fontSize?: number;
419
+ readonly color?: number;
420
+ readonly bgColor?: number;
421
+ readonly decorationFlags?: number;
422
+ readonly fontUrl?: string;
423
+ }
424
+
425
+ export interface ClipboardRichTextPayload {
426
+ readonly version: 1;
427
+ readonly parts: readonly ClipboardRichTextPart[];
428
+ }
429
+
430
+ export interface ClipboardWritePayload {
431
+ readonly plainText: string;
432
+ readonly richText?: ClipboardRichTextPayload;
433
+ }
434
+
435
+ export interface BridgeLogs {
436
+ readonly pointerEvents: PointerEventLog[];
437
+ readonly focusEvents: FocusEventLog[];
438
+ readonly textChanges: TextChangeLog[];
439
+ readonly selectionChanges: SelectionChangeLog[];
440
+ readonly crossSelectionChanges: CrossSelectionChangeLog[];
441
+ readonly clipboardWrites: string[];
442
+ readonly clipboardReadRequests: string[];
443
+ readonly scrollEvents: ScrollEventLog[];
444
+ readonly missingFontCoverageRequests: MissingFontCoverageLog[];
445
+ readonly incrementalFontPackageRequests: IncrementalFontPackageRequestLog[];
446
+ }
447
+
448
+ export interface BridgeRuntime {
449
+ readonly core: CoreModule;
450
+ readonly ui: UiModule;
451
+ readonly canvas: HTMLCanvasElement;
452
+ readonly openCanvasApi: OpenCanvasApi;
453
+ readonly logs: BridgeLogs;
454
+ updateCanvasSize(): void;
455
+ extractCommandBuffer(): Uint32Array;
456
+ executeCommandBuffer(words: Uint32Array): void;
457
+ syncCommandBufferToCore(): Uint32Array;
458
+ flushPendingCommit(): Uint32Array | null;
459
+ hasPendingCommit(): boolean;
460
+ commitFrame(): void;
461
+ requestFrame(): void;
462
+ setFrameRequester(requester: (() => void) | null): void;
463
+ getSemanticTree(): readonly SemanticNode[];
464
+ getActiveTextHandle(): bigint | null;
465
+ getCapturedPointerHandle(): bigint | null;
466
+ setCapturedPointerHandle(handle: bigint | null): void;
467
+ setAppFrameHandler(handler: ((timestampMs: number) => void) | null): void;
468
+ runAppFrameHandler(timestampMs: number): void;
469
+ uiHasPendingVisualWork(): boolean;
470
+ uiNeedsAnimationFrame(): boolean;
471
+ getHandleFromPoint(x: number, y: number): bigint;
472
+ clearPointerHover(): void;
473
+ refreshPointerHover(): void;
474
+ getFindDocuments(): readonly OpenCanvasTextDocument[];
475
+ activateFindMatch(match: OpenCanvasFindMatch | null, reveal?: boolean): boolean;
476
+ syncFindSelection(clearOnMissing?: boolean): boolean;
477
+ clearFindMatch(): boolean;
478
+ ensureFont(fontId: number): Promise<void>;
479
+ ensureBuiltInFont(fontId: number): Promise<void>;
480
+ isFontLoaded(fontId: number, url?: string): boolean;
481
+ getIncrementalFontState(fontId: number): IncrementalFontRuntimeState | null;
482
+ getIncrementalFontCacheState(): IncrementalFontCacheState;
483
+ getIncrementalFontPolicy(): IncrementalFontPolicy;
484
+ setIncrementalFontPolicy(policy: Partial<IncrementalFontPolicy>): void;
485
+ getClipboardFontUrl(fontId: number): string | null;
486
+ registerLazyFont(fontId: number, url: string): void;
487
+ registerFontFallback(fontId: number, fallbackFontId: number): void;
488
+ handleMissingFontCoverage(fontId: number, coverageKind: number, sampleText: string): void;
489
+ loadFont(fontId: number, url: string): Promise<void>;
490
+ registerFont(font: BridgeFontRegistration): Promise<void>;
491
+ registerFontStack(stack: BridgeFontStackRegistration): Promise<void>;
492
+ loadSvg(svgId: number, url: string): Promise<AssetLoadResult>;
493
+ loadTexture(textureId: number, url: string): Promise<AssetLoadResult>;
494
+ releaseSvg(svgId: number): void;
495
+ releaseTexture(textureId: number): void;
496
+ replayLoadedAssets(): Promise<void>;
497
+ resetLogs(): void;
498
+ resetAppSession(): void;
499
+ }
500
+
501
+ export interface BridgeState {
502
+ readonly ready: Promise<BridgeRuntime>;
503
+ getRuntime(): BridgeRuntime | null;
504
+ recreateRuntime(): Promise<BridgeRuntime>;
505
+ resetLogs(): void;
506
+ handleToBigInt(handle: WasmHandleLike): bigint;
507
+ handleToString(handle: WasmHandleLike): string;
508
+ pointerToHeapOffset(pointer: WasmHandleLike): number;
509
+ normalizePointerForWasm(
510
+ module: Pick<UiModule | CoreModule, 'usesMemory64'>,
511
+ pointer: WasmHandleLike,
512
+ ): number | bigint;
513
+ toHeapPointer(
514
+ module: Pick<UiModule | CoreModule, 'usesMemory64'>,
515
+ pointer: WasmHandleLike,
516
+ ): { readonly ptr: number | bigint; readonly offset: number };
517
+ }
518
+
519
+ export interface BridgeLoaderInfo {
520
+ manifestHash: string | null;
521
+ requestedWasmArchitecture: string;
522
+ requestedRendererBackend: 'auto' | 'webgpu' | 'webgl2' | 'cpu';
523
+ selectedWasmArchitecture: string;
524
+ availableWasmArchitectures: readonly string[];
525
+ memory64Supported: boolean;
526
+ simdSupported: boolean;
527
+ coreCompileMode: 'streaming' | 'buffer' | 'cached-module';
528
+ uiCompileMode: 'streaming' | 'buffer' | 'cached-module';
529
+ icuDataUrl: string | null;
530
+ activeRenderer: 'none' | 'webgpu' | 'webgl2' | 'cpu';
531
+ /** Incremented each time the renderer recovers from a device loss. Useful for tests. */
532
+ deviceRecoveryCount: number;
533
+ }
534
+
535
+ export interface EffinDomCallbacks {
536
+ onPointerEvent?: (handle: WasmHandleLike, eventType: number) => void;
537
+ onPointerEventWithCoords?: (eventType: number, handle: WasmHandleLike, x: number, y: number, modifiers?: number) => void;
538
+ onBeforeContextMenuHitTest?: () => void;
539
+ onContextMenu?: (handle: WasmHandleLike, x: number, y: number) => void;
540
+ onKeyEventWithKey?: (eventType: number, key: string, modifiers: number) => boolean | void;
541
+ onFocusChanged?: (handle: WasmHandleLike, isFocused: boolean) => void;
542
+ onTextChanged?: (handle: WasmHandleLike, text: string) => void;
543
+ onTextReplaced?: (handle: WasmHandleLike, start: number, end: number, text: string) => void;
544
+ onSelectionChanged?: (handle: WasmHandleLike, start: number, end: number) => void;
545
+ onScroll?: (
546
+ handle: WasmHandleLike,
547
+ offsetX: number,
548
+ offsetY: number,
549
+ contentWidth: number,
550
+ contentHeight: number,
551
+ viewportWidth: number,
552
+ viewportHeight: number,
553
+ ) => void;
554
+ onClipboardWrite?: (payload: ClipboardWritePayload) => void;
555
+ onClipboardRead?: (handle: WasmHandleLike) => void;
556
+ onCrossSelectionChanged?: (areaHandle: WasmHandleLike, text: string) => void;
557
+ onRequestFontLoad?: (fontId: number, url: string) => void;
558
+ onMissingFontCoverage?: (fontId: number, coverageKind: number, sampleText: string) => void;
559
+ onRequestSemanticAnnouncement?: (handle: WasmHandleLike) => void;
560
+ }
561
+
562
+ export type UiFactory = (module?: object) => Promise<UiModule>;
563
+
564
+ declare global {
565
+ interface Window {
566
+ Module?: CoreModule;
567
+ EffinDomUiV2ModuleFactory?: UiFactory;
568
+ __effindomCallbacks?: EffinDomCallbacks;
569
+ __bridgeReady?: boolean;
570
+ __bridgeError?: string;
571
+ __bridgeState?: {
572
+ readonly commandWordCount: number;
573
+ readonly commandWords: readonly number[];
574
+ readonly rootHandle: string;
575
+ };
576
+ __bridgeLogs?: BridgeLogs;
577
+ __bridgeTextByHandle?: Record<string, string>;
578
+ __bridgeSelectionsByHandle?: Record<string, { start: number; end: number }>;
579
+ __bridgeActiveEditorWindow?: {
580
+ readonly handle: string | null;
581
+ readonly text: string;
582
+ readonly docStart: number;
583
+ readonly docEnd: number;
584
+ };
585
+ __bridgeFindMatch?: OpenCanvasFindMatch | null;
586
+ __bridgeFindState?: OpenCanvasFindState | null;
587
+ __bridgeSemanticTree?: readonly SemanticNode[];
588
+ __bridgeLoaderInfo?: BridgeLoaderInfo;
589
+ __OPEN_CANVAS_API__?: OpenCanvasApi;
590
+ EffinDomBrowserBridge?: BridgeState;
591
+ __bridgeDebug?: { forceDeviceLost(): void };
592
+ }
593
+ }
594
+
595
+ export {};