@effindomv2/runtime 0.1.0 → 0.1.2

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 (19) hide show
  1. package/dist/bridge.js +3 -3
  2. package/dist/bridge.js.map +3 -3
  3. package/dist/effindom.v2.manifest.json +17 -17
  4. package/dist/runtime/{effindom-ui-v2.wasm32-simd.ThSDClMnSWdwf9d89JZfYor0G1Z6OxR4lOc75rNRuD4.js.symbols → effindom-ui-v2.wasm32-simd.0xi4fGlqRJFxmbgnXvyIDcuMXBhbEzh5nGnuqg_PfmI.js.symbols} +966 -960
  5. package/dist/runtime/{effindom-ui-v2.wasm32.wved0xEV4EKXVNBU3Sx7giD4faxD2YII9sQ2N_wCP4I.js → effindom-ui-v2.wasm32-simd.45BtMlLa8o8Qf2e2okFB8YJgZWcUT1WDDIgtS_0jUxw.js} +1 -1
  6. package/dist/runtime/{effindom-ui-v2.wasm32-simd.0Mas1XD03eYvemryTioWaZOBuBA5ij7MFlTa8CgEZWs.wasm → effindom-ui-v2.wasm32-simd.JEwyB4hRYfEZPNeJaj0o66_MdEmUF5ZT_JpejBZ7gb4.wasm} +0 -0
  7. package/dist/runtime/{effindom-ui-v2.wasm32-simd.wved0xEV4EKXVNBU3Sx7giD4faxD2YII9sQ2N_wCP4I.js → effindom-ui-v2.wasm32.45BtMlLa8o8Qf2e2okFB8YJgZWcUT1WDDIgtS_0jUxw.js} +1 -1
  8. package/dist/runtime/{effindom-ui-v2.wasm32.tp53X7nHfG_EUq29naDyElfnqhMw2D1Tr1T-BJAYO7w.wasm → effindom-ui-v2.wasm32.QSYIka3OwSNk1LYADdyjtB6GxOyphGBWK3B0ImYo6A4.wasm} +0 -0
  9. package/dist/runtime/{effindom-ui-v2.wasm32.H7kYg99bT9ADGh0uUvj6H9Dk1L058nVFLv_4R79IXW8.js.symbols → effindom-ui-v2.wasm32.gLKQZGkzDC8oz-QmMIlr4ip7qZ3jHUx-nWN-GUZttFs.js.symbols} +1657 -1652
  10. package/dist/runtime/{effindom-ui-v2.wasm64-simd.RQaXil22Chu63-vxK9oOuX8wUY044kbo190oYIbBU4M.js.symbols → effindom-ui-v2.wasm64-simd.ChzyWiWKqlexTBfz-_t7pUTGlZpu70XKdI9RqIhmV6Y.js.symbols} +991 -985
  11. package/dist/runtime/{effindom-ui-v2.wasm64-simd.86tk9Z3xIpgTOykET_8Nn9iUVJnp1AzOHW4fVQRGtQE.wasm → effindom-ui-v2.wasm64-simd.SjylyjV2dXFBkejYTcLBILgsxI92YiWrluWV6vwH84U.wasm} +0 -0
  12. package/dist/runtime/{effindom-ui-v2.wasm64-simd.ZS1KEAg0XQex-VXkfgpBHE8MIoqPF8qpaf8nOjANb_U.js → effindom-ui-v2.wasm64-simd.nhbyYdlStHVWTLqcSR9k8whssMHhdz1r9FiTvUua5cM.js} +1 -1
  13. package/dist/runtime/{effindom-ui-v2.wasm64.ioQ9DuM6gR_EjlfRHdF8EvNPBcKCs0PQbbY9-cjTV6Y.wasm → effindom-ui-v2.wasm64.7u5yxjx9YPaeCU16NcNqyo2xpTN65DcccmSH_0UeX58.wasm} +0 -0
  14. package/dist/runtime/{effindom-ui-v2.wasm64.YSwpMFbr-Q1SBe0Ze8mub1u1PqsvSz3QIYuA3eaUMME.js.symbols → effindom-ui-v2.wasm64._AzZt9rUcw123RSAdjsdeCNSlvc57kvA0GK1Gmg_wD8.js.symbols} +1687 -1682
  15. package/dist/runtime/{effindom-ui-v2.wasm64.ZS1KEAg0XQex-VXkfgpBHE8MIoqPF8qpaf8nOjANb_U.js → effindom-ui-v2.wasm64.nhbyYdlStHVWTLqcSR9k8whssMHhdz1r9FiTvUua5cM.js} +1 -1
  16. package/package.json +1 -1
  17. package/src/bridge/interaction.ts +2 -1
  18. package/src/bridge/runtime/font-manager.ts +7 -4
  19. package/src/core-types.ts +2 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../v2/browser-bridge/src/core-types.ts", "../../../v2/browser-bridge/src/bridge/utils/encoding.ts", "../../../v2/browser-bridge/src/bridge/utils/backends.ts", "../../../v2/browser-bridge/src/bridge/utils/fetch.ts", "../../../v2/browser-bridge/src/bridge/utils/heap.ts", "../../../v2/browser-bridge/src/bridge/utils/assets.ts", "../../../v2/browser-bridge/src/bridge/find-session.ts", "../../../v2/browser-bridge/src/bridge/platform.ts", "../../../v2/browser-bridge/src/bridge/find-dialog.ts", "../../../v2/browser-bridge/src/bridge/pull-to-refresh.ts", "../../../v2/browser-bridge/src/bridge/events/canvas-geometry.ts", "../../../v2/browser-bridge/src/bridge/events/key-router.ts", "../../../v2/browser-bridge/src/bridge/commit-policy.ts", "../../../v2/browser-bridge/src/bridge/pointer-move-coalescer.ts", "../../../v2/browser-bridge/src/bridge/events/semantic-hit-testing.ts", "../../../v2/browser-bridge/src/bridge/touch-gesture.ts", "../../../v2/browser-bridge/src/bridge/events/pointer-router.ts", "../../../v2/browser-bridge/src/bridge/events.ts", "../../../v2/browser-bridge/src/bridge/font-catalog.ts", "../../../v2/browser-bridge/src/bridge/runtime/asset-manager.ts", "../../../v2/browser-bridge/src/bridge/google-fonts.ts", "../../../v2/browser-bridge/src/bridge/incremental-font-packages.ts", "../../../v2/browser-bridge/src/bridge/runtime/font-manager.ts", "../../../v2/browser-bridge/src/find-on-page.ts", "../../../v2/browser-bridge/src/bridge/runtime/find-controller.ts", "../../../v2/browser-bridge/src/semantic.ts", "../../../v2/browser-bridge/src/bridge/runtime/open-canvas-api.ts", "../../../v2/browser-bridge/src/bridge/runtime/semantic-controller.ts", "../../../v2/browser-bridge/src/bridge/runtime/text-documents.ts", "../../../v2/browser-bridge/src/bridge/runtime.ts", "../../../v2/browser-bridge/src/bridge/render-loop.ts", "../../../v2/browser-bridge/src/bridge/init.ts", "../../../v2/browser-bridge/src/clipboard.ts", "../../../v2/browser-bridge/src/bridge/interaction/text-encoding.ts", "../../../v2/browser-bridge/src/bridge/interaction/editor-model.ts", "../../../v2/browser-bridge/src/bridge/interaction/editor-mutations.ts", "../../../v2/browser-bridge/src/bridge/interaction/editor-session.ts", "../../../v2/browser-bridge/src/bridge/interaction/logs.ts", "../../../v2/browser-bridge/src/bridge/interaction.ts", "../../../v2/browser-bridge/src/bridge.ts"],
4
- "sourcesContent": ["import type {\n OpenCanvasApi,\n OpenCanvasFindMatch,\n OpenCanvasFindState,\n OpenCanvasTextDocument,\n SemanticNode,\n} from './open-canvas';\n\nexport type {\n OpenCanvasApi,\n OpenCanvasFindMatch,\n OpenCanvasFindOptions,\n OpenCanvasFindResults,\n OpenCanvasFindState,\n OpenCanvasHandle,\n OpenCanvasResolvedFindOptions,\n OpenCanvasTextDocument,\n SemanticBounds,\n SemanticNode,\n SemanticState,\n} from './open-canvas';\n\nexport type WasmHandleLike =\n | number\n | bigint\n | string\n | {\n valueOf(): unknown;\n toString(): string;\n };\n\nexport interface AssetLoadResult {\n readonly width: number;\n readonly height: number;\n}\n\nexport interface BridgeFontRegistration {\n readonly id: number;\n readonly url: string;\n readonly fallbackIds?: readonly number[];\n}\n\nexport interface BridgeFontStackRegistration {\n readonly primary: BridgeFontRegistration;\n readonly fallbacks?: readonly BridgeFontRegistration[];\n}\n\nexport interface CoreModule {\n HEAPU8: Uint8Array;\n HEAPU32: Uint32Array;\n wasmMemory?: WebAssembly.Memory;\n usesMemory64?: boolean;\n refreshHeapViews?(): void;\n locateFile?(path: string, prefix?: string): string;\n instantiateWasm?(\n imports: WebAssembly.Imports,\n successCallback: (instance: WebAssembly.Instance, module?: WebAssembly.Module) => void,\n ): object;\n onAbort?(what?: unknown): void;\n canvas?: HTMLCanvasElement;\n onRuntimeInitialized?: () => void;\n _malloc(size: number): WasmHandleLike;\n _free(ptr: WasmHandleLike): void;\n _ed_init(width: number, height: number, dpr: number): void;\n _ed_init_webgl(width: number, height: number, dpr: number): void;\n _ed_init_sw(width: number, height: number, dpr: number): void;\n _ed_resize(width: number, height: number, dpr: number): void;\n _ed_register_font(fontId: number, bytesPtr: WasmHandleLike, len: number): void;\n _ed_unregister_font(fontId: number): void;\n _ed_register_svg(svgId: number, bytesPtr: WasmHandleLike, len: number): void;\n _ed_execute_command_buffer(ptr: WasmHandleLike, length: number): void;\n _ed_register_texture_rgba(\n textureId: number,\n rgbaPtr: WasmHandleLike,\n width: number,\n height: number,\n byteLength: number,\n ): void;\n _ed_unregister_texture(textureId: number): void;\n _ed_reset_scene(): void;\n _ed_render_frame(currentTimeMs: number): void;\n _ed_clear_focus_state?(): void;\n _ed_clear_text_input_state?(): void;\n _ed_recover_device(): void;\n _ed_hit_test(x: number, y: number): WasmHandleLike;\n _ed_get_sw_framebuffer(): WasmHandleLike;\n _ed_get_backend_type(): number;\n _ed_get_device_state(): number;\n _ed_notify_webgl_context_lost?(): void;\n _ed_debug_simulate_device_lost?(): void;\n}\n\nexport const EdBackendType = {\n NONE: 0,\n WEBGPU: 1,\n WEBGL2: 2,\n CPU: 3,\n} as const;\n\nexport type EdBackendType = (typeof EdBackendType)[keyof typeof EdBackendType];\n\nexport const EdDeviceState = {\n OK: 0,\n LOST: 1,\n RECOVERING: 2,\n} as const;\n\nexport type EdDeviceState = (typeof EdDeviceState)[keyof typeof EdDeviceState];\n\nexport interface UiModule {\n HEAPU8: Uint8Array;\n HEAPU32: Uint32Array;\n HEAPF32: Float32Array;\n wasmMemory?: WebAssembly.Memory;\n usesMemory64?: boolean;\n refreshHeapViews?(): void;\n _malloc(size: number): WasmHandleLike;\n _free(ptr: WasmHandleLike): void;\n _ui_reset(): void;\n _ui_arena_alloc(size: number): WasmHandleLike;\n _ui_register_icu_data(ptr: WasmHandleLike, len: number): void;\n _ui_create_node(type: number): WasmHandleLike;\n _ui_delete_node(handle: WasmHandleLike): void;\n _ui_node_add_child(parent: WasmHandleLike, child: WasmHandleLike): void;\n _ui_set_root(handle: WasmHandleLike): void;\n _ui_set_node_id(handle: WasmHandleLike, strPtr: WasmHandleLike, len: number): void;\n _ui_set_semantic_role(handle: WasmHandleLike, role: number): void;\n _ui_set_semantic_label(handle: WasmHandleLike, strPtr: WasmHandleLike, len: number): void;\n _ui_set_semantic_checked(handle: WasmHandleLike, checkedState: number): void;\n _ui_set_semantic_selected(handle: WasmHandleLike, hasSelected: number, selected: number): void;\n _ui_set_semantic_expanded(handle: WasmHandleLike, hasExpanded: number, expanded: number): void;\n _ui_set_semantic_disabled(handle: WasmHandleLike, hasDisabled: number, disabled: number): void;\n _ui_set_semantic_value_range(\n handle: WasmHandleLike,\n hasValueRange: number,\n valueNow: number,\n valueMin: number,\n valueMax: number,\n ): void;\n _ui_set_semantic_orientation(handle: WasmHandleLike, orientation: number): void;\n _ui_request_semantic_announcement(handle: WasmHandleLike): void;\n _ui_push_semantic_scope(handle: WasmHandleLike): number;\n _ui_remove_semantic_scope(token: number): void;\n _ui_set_width(handle: WasmHandleLike, value: number, unit: number): void;\n _ui_set_height(handle: WasmHandleLike, value: number, unit: number): void;\n _ui_set_flex_direction(handle: WasmHandleLike, direction: number): void;\n _ui_set_flex_grow(handle: WasmHandleLike, grow: number): void;\n _ui_set_flex_basis(handle: WasmHandleLike, basis: number): void;\n _ui_set_justify_content(handle: WasmHandleLike, justify: number): void;\n _ui_set_align_items(handle: WasmHandleLike, align: number): void;\n _ui_set_padding(handle: WasmHandleLike, left: number, top: number, right: number, bottom: number): void;\n _ui_set_margin(handle: WasmHandleLike, left: number, top: number, right: number, bottom: number): void;\n _ui_set_position_type(handle: WasmHandleLike, positionType: number): void;\n _ui_set_position(handle: WasmHandleLike, left: number, top: number, right: number, bottom: number): void;\n _ui_node_remove_child(parent: WasmHandleLike, child: WasmHandleLike): void;\n _ui_set_is_portal(handle: WasmHandleLike, portal: number): void;\n _ui_set_is_shared_size_scope(handle: WasmHandleLike, isScope: number): void;\n _ui_grid_set_columns(handle: WasmHandleLike, count: number, valuesPtr: WasmHandleLike, typesPtr: WasmHandleLike): void;\n _ui_grid_set_rows(handle: WasmHandleLike, count: number, valuesPtr: WasmHandleLike, typesPtr: WasmHandleLike): void;\n _ui_grid_set_column_shared_size_group(handle: WasmHandleLike, index: number, strPtr: WasmHandleLike, len: number): void;\n _ui_grid_set_row_shared_size_group(handle: WasmHandleLike, index: number, strPtr: WasmHandleLike, len: number): void;\n _ui_node_set_grid_placement(handle: WasmHandleLike, row: number, col: number, rowSpan: number, colSpan: number): void;\n _ui_set_bg_color(handle: WasmHandleLike, color: number): void;\n _ui_set_box_style(\n handle: WasmHandleLike,\n bgColor: number,\n topLeftRadius: number,\n topRightRadius: number,\n bottomRightRadius: number,\n bottomLeftRadius: number,\n borderWidth: number,\n borderColor: number,\n borderStyle: number,\n borderDashOn: number,\n borderDashOff: number,\n ): void;\n _ui_set_drop_shadow(\n handle: WasmHandleLike,\n color: number,\n offsetX: number,\n offsetY: number,\n blurSigma: number,\n spread: number,\n ): void;\n _ui_set_layer_effect(handle: WasmHandleLike, opacity: number, blurSigma: number, blendMode: number): void;\n _ui_set_background_blur(handle: WasmHandleLike, blurSigma: number): void;\n _ui_set_image(handle: WasmHandleLike, textureId: number, objectFit: number): void;\n _ui_set_image_nine(\n handle: WasmHandleLike,\n textureId: number,\n insetLeft: number,\n insetTop: number,\n insetRight: number,\n insetBottom: number,\n ): void;\n _ui_set_svg(handle: WasmHandleLike, svgId: number, tintColor: number): void;\n _ui_set_linear_gradient(\n handle: WasmHandleLike,\n startX: number,\n startY: number,\n endX: number,\n endY: number,\n stopCount: number,\n offsetsPtr: WasmHandleLike,\n colorsPtr: WasmHandleLike,\n ): void;\n _ui_set_clip_to_bounds(handle: WasmHandleLike, clip: number): void;\n _ui_set_visibility(handle: WasmHandleLike, visibility: number): void;\n _ui_set_font(handle: WasmHandleLike, fontId: number, size: number): void;\n _ui_set_line_height(handle: WasmHandleLike, lineHeight: number): void;\n _ui_set_text(handle: WasmHandleLike, strPtr: WasmHandleLike, len: number): void;\n _ui_set_text_style_runs(handle: WasmHandleLike, runCount: number, runsWordsPtr: WasmHandleLike): void;\n _ui_set_text_color(handle: WasmHandleLike, color: number): void;\n _ui_set_text_align(handle: WasmHandleLike, align: number): void;\n _ui_set_text_vertical_align(handle: WasmHandleLike, align: number): void;\n _ui_set_text_limits(handle: WasmHandleLike, maxChars: number, maxLines: number): void;\n _ui_set_text_wrapping(handle: WasmHandleLike, wrap: number): void;\n _ui_set_text_overflow(handle: WasmHandleLike, overflow: number): void;\n _ui_set_text_overflow_fade(handle: WasmHandleLike, horizontal: number, vertical: number): void;\n _ui_set_text_obscured(handle: WasmHandleLike, obscured: number): void;\n _ui_set_scroll_offset(handle: WasmHandleLike, x: number, y: number): void;\n _ui_has_pending_visual_work(): number;\n _ui_needs_animation_frame(): number;\n _ui_has_pointer_autoscroll(): number;\n _ui_selection_autoscroll(x: number, y: number, edgeThreshold: number): WasmHandleLike;\n _ui_get_bounds(\n handle: WasmHandleLike,\n outX: WasmHandleLike,\n outY: WasmHandleLike,\n outWidth: WasmHandleLike,\n outHeight: WasmHandleLike,\n ): number;\n _ui_set_selectable(handle: WasmHandleLike, selectable: number, color: number): void;\n _ui_set_selection_area(handle: WasmHandleLike, isArea: number): void;\n _ui_set_selection_area_barrier(handle: WasmHandleLike, isBarrier: number): void;\n _ui_clear_selection(handle: WasmHandleLike): void;\n _ui_retarget_selection(fromHandle: WasmHandleLike, toHandle: WasmHandleLike): void;\n _ui_is_point_in_selection(x: number, y: number): number;\n _ui_set_text_selection_range(handle: WasmHandleLike, selectionStart: number, selectionEnd: number): void;\n _ui_get_text_scene_position_x(handle: WasmHandleLike, byteIndex: number): number;\n _ui_get_text_scene_position_y(handle: WasmHandleLike, byteIndex: number): number;\n _ui_get_text_snapshot_handle_count(): number;\n _ui_copy_text_snapshot_handles(outPtr: WasmHandleLike, maxHandleCount: number): number;\n _ui_set_text_find_match(handle: WasmHandleLike, start: number, end: number): number;\n _ui_clear_text_find_match(): void;\n _ui_push_text_find_highlight(handle: WasmHandleLike, start: number, end: number, color: number): number;\n _ui_clear_text_find_highlights(): void;\n _ui_get_text_document_utf8_length(handle: WasmHandleLike): number;\n _ui_copy_text_document_utf8(handle: WasmHandleLike, outPtr: WasmHandleLike, bufferLength: number): number;\n _ui_get_text_visible_bounds(\n handle: WasmHandleLike,\n outXPtr: WasmHandleLike,\n outYPtr: WasmHandleLike,\n outWidthPtr: WasmHandleLike,\n outHeightPtr: WasmHandleLike,\n ): number;\n _ui_get_text_range_rect_count(handle: WasmHandleLike, start: number, end: number): number;\n _ui_copy_text_range_rects(\n handle: WasmHandleLike,\n start: number,\n end: number,\n outPtr: WasmHandleLike,\n maxRectCount: number,\n ): number;\n _ui_reveal_text_range(handle: WasmHandleLike, start: number, end: number): number;\n _ui_clear_current_selection(): void;\n _ui_copy_current_selection(): void;\n _ui_can_undo_text_edit(handle: WasmHandleLike): number;\n _ui_can_redo_text_edit(handle: WasmHandleLike): number;\n _ui_has_text_selection(handle: WasmHandleLike): number;\n _ui_undo_text_edit(handle: WasmHandleLike): void;\n _ui_redo_text_edit(handle: WasmHandleLike): void;\n _ui_copy_text_selection(handle: WasmHandleLike): void;\n _ui_cut_text_selection(handle: WasmHandleLike): void;\n _ui_paste_text(handle: WasmHandleLike): void;\n _ui_select_all_text(handle: WasmHandleLike): void;\n _ui_set_interactive(handle: WasmHandleLike, interactive: number): void;\n _ui_set_scroll_proxy_target(handle: WasmHandleLike, scrollHandle: WasmHandleLike): void;\n _ui_set_scroll_enabled(handle: WasmHandleLike, enabledX: number, enabledY: number): void;\n _ui_set_show_scrollbars(handle: WasmHandleLike, showScrollbars: number): void;\n _ui_set_scroll_friction(handle: WasmHandleLike, friction: number): void;\n _ui_set_scroll_content_size(handle: WasmHandleLike, contentWidth: number, contentHeight: number): void;\n _ui_set_editable(handle: WasmHandleLike, editable: number): void;\n _ui_set_caret_color(handle: WasmHandleLike, color: number): void;\n _ui_set_focusable(handle: WasmHandleLike, focusable: number, tabIndex: number): void;\n _ui_request_focus(handle: WasmHandleLike): void;\n _ui_commit_frame(): void;\n _ui_get_command_buffer(outLenPtr: WasmHandleLike): WasmHandleLike;\n _ui_get_semantic_buffer(outLenPtr: WasmHandleLike): WasmHandleLike;\n _ui_resize_window(w: number, h: number): void;\n _ui_set_key_modifiers(modifiers: number): void;\n _ui_on_pointer_event(event: number, handle: WasmHandleLike, x: number, y: number): void;\n _ui_on_wheel_event(deltaX: number, deltaY: number): void;\n _ui_touch_scroll_begin(handle: WasmHandleLike, x: number, y: number): void;\n _ui_touch_scroll_update(deltaX: number, deltaY: number): void;\n _ui_touch_scroll_end(): void;\n _ui_clear_momentum_scroll(): void;\n _ui_touch_scroll_allows_pull_to_refresh(): number;\n _ui_set_coarse_pointer_mode(coarsePointerMode: number): void;\n _ui_set_platform_family(platformFamily: number): void;\n _ui_on_key_event(type: number, strPtr: WasmHandleLike, len: number, mods: number): void;\n _ui_on_ime_update(handle: WasmHandleLike, strPtr: WasmHandleLike, len: number, caretIdx: number): void;\n _ui_replace_text_range(\n handle: WasmHandleLike,\n startIdx: number,\n endIdx: number,\n strPtr: WasmHandleLike,\n len: number,\n caretIdx: number,\n ): void;\n _ui_on_paste_text(handle: WasmHandleLike, strPtr: WasmHandleLike, len: number): void;\n _ui_set_interaction_time(ms: WasmHandleLike): void;\n _ui_measure_text(\n strPtr: WasmHandleLike,\n len: number,\n fontId: number,\n size: number,\n maxWidth: number,\n outWidthPtr: WasmHandleLike,\n outHeightPtr: WasmHandleLike,\n ): void;\n _ui_register_font(id: number, bytesPtr: WasmHandleLike, len: number): number;\n _ui_register_font_fallback(fontId: number, fallbackFontId: number): void;\n _ui_unregister_font_fallback(fontId: number, fallbackFontId: number): number;\n _ui_unregister_font(fontId: number): number;\n _ui_font_loaded(fontId: number): void;\n}\n\nexport interface PointerEventLog {\n readonly handle: string;\n readonly eventType: number;\n}\n\nexport interface FocusEventLog {\n readonly handle: string;\n readonly isFocused: boolean;\n}\n\nexport interface TextChangeLog {\n readonly handle: string;\n readonly text: string;\n readonly textLength?: number;\n readonly truncated?: boolean;\n}\n\nexport interface SelectionChangeLog {\n readonly handle: string;\n readonly start: number;\n readonly end: number;\n}\n\nexport interface CrossSelectionChangeLog {\n readonly areaHandle: string;\n readonly text: string;\n}\n\nexport interface ScrollEventLog {\n readonly handle: string;\n readonly offsetX: number;\n readonly offsetY: number;\n readonly contentWidth: number;\n readonly contentHeight: number;\n readonly viewportWidth: number;\n readonly viewportHeight: number;\n}\n\nexport interface MissingFontCoverageLog {\n readonly fontId: number;\n readonly coverageKind: number;\n readonly sampleText: string;\n}\n\nexport interface IncrementalFontPackageRequestLog {\n readonly primaryFontId: number;\n readonly coverageKind: number;\n readonly packageId: string;\n readonly segmentIds: readonly string[];\n readonly sampleText: string;\n}\n\nexport type IncrementalFontAutoGrowBlockReason =\n | 'auto-grow-disabled'\n | 'font-not-allowed'\n | 'package-blocked';\n\nexport interface IncrementalFontPolicy {\n readonly autoGrow: boolean;\n readonly maxCachedShardFonts: number;\n readonly allowedFontIds: readonly number[] | null;\n readonly blockedPackageIds: readonly string[] | null;\n}\n\nexport interface IncrementalFontCacheState {\n readonly maxCachedShardFonts: number;\n readonly cachedShardCount: number;\n readonly cachedShardKeys: readonly string[];\n readonly evictedShardKeys: readonly string[];\n}\n\nexport interface IncrementalFontRuntimeState {\n readonly fontId: number;\n readonly sourceUrl: string | null;\n readonly sourceState: 'unknown' | 'known' | 'loading' | 'loaded' | 'failed';\n readonly loaded: boolean;\n readonly requestedSegmentIds: readonly string[];\n readonly pendingSegmentIds: readonly string[];\n readonly appliedSegmentIds: readonly string[];\n readonly evictedSegmentIds: readonly string[];\n readonly revision: number;\n readonly autoGrowAllowed: boolean;\n readonly blockedPackageIds: readonly string[];\n readonly lastBlockedReason: IncrementalFontAutoGrowBlockReason | null;\n}\n\nexport interface ClipboardRichTextPart {\n readonly text: string;\n readonly fontId?: number;\n readonly fontSize?: number;\n readonly color?: number;\n readonly bgColor?: number;\n readonly decorationFlags?: number;\n readonly fontUrl?: string;\n}\n\nexport interface ClipboardRichTextPayload {\n readonly version: 1;\n readonly parts: readonly ClipboardRichTextPart[];\n}\n\nexport interface ClipboardWritePayload {\n readonly plainText: string;\n readonly richText?: ClipboardRichTextPayload;\n}\n\nexport interface BridgeLogs {\n readonly pointerEvents: PointerEventLog[];\n readonly focusEvents: FocusEventLog[];\n readonly textChanges: TextChangeLog[];\n readonly selectionChanges: SelectionChangeLog[];\n readonly crossSelectionChanges: CrossSelectionChangeLog[];\n readonly clipboardWrites: string[];\n readonly clipboardReadRequests: string[];\n readonly scrollEvents: ScrollEventLog[];\n readonly missingFontCoverageRequests: MissingFontCoverageLog[];\n readonly incrementalFontPackageRequests: IncrementalFontPackageRequestLog[];\n}\n\nexport interface BridgeRuntime {\n readonly core: CoreModule;\n readonly ui: UiModule;\n readonly canvas: HTMLCanvasElement;\n readonly openCanvasApi: OpenCanvasApi;\n readonly logs: BridgeLogs;\n updateCanvasSize(): void;\n extractCommandBuffer(): Uint32Array;\n executeCommandBuffer(words: Uint32Array): void;\n syncCommandBufferToCore(): Uint32Array;\n flushPendingCommit(): Uint32Array | null;\n hasPendingCommit(): boolean;\n commitFrame(): void;\n requestFrame(): void;\n setFrameRequester(requester: (() => void) | null): void;\n getSemanticTree(): readonly SemanticNode[];\n getActiveTextHandle(): bigint | null;\n getCapturedPointerHandle(): bigint | null;\n setCapturedPointerHandle(handle: bigint | null): void;\n setAppFrameHandler(handler: ((timestampMs: number) => void) | null): void;\n runAppFrameHandler(timestampMs: number): void;\n uiHasPendingVisualWork(): boolean;\n uiNeedsAnimationFrame(): boolean;\n getHandleFromPoint(x: number, y: number): bigint;\n clearPointerHover(): void;\n refreshPointerHover(): void;\n getFindDocuments(): readonly OpenCanvasTextDocument[];\n activateFindMatch(match: OpenCanvasFindMatch | null, reveal?: boolean): boolean;\n syncFindSelection(clearOnMissing?: boolean): boolean;\n clearFindMatch(): boolean;\n ensureFont(fontId: number): Promise<void>;\n ensureBuiltInFont(fontId: number): Promise<void>;\n isFontLoaded(fontId: number, url?: string): boolean;\n getIncrementalFontState(fontId: number): IncrementalFontRuntimeState | null;\n getIncrementalFontCacheState(): IncrementalFontCacheState;\n getIncrementalFontPolicy(): IncrementalFontPolicy;\n setIncrementalFontPolicy(policy: Partial<IncrementalFontPolicy>): void;\n getClipboardFontUrl(fontId: number): string | null;\n registerLazyFont(fontId: number, url: string): void;\n registerFontFallback(fontId: number, fallbackFontId: number): void;\n handleMissingFontCoverage(fontId: number, coverageKind: number, sampleText: string): void;\n loadFont(fontId: number, url: string): Promise<void>;\n registerFont(font: BridgeFontRegistration): Promise<void>;\n registerFontStack(stack: BridgeFontStackRegistration): Promise<void>;\n loadSvg(svgId: number, url: string): Promise<AssetLoadResult>;\n loadTexture(textureId: number, url: string): Promise<AssetLoadResult>;\n releaseSvg(svgId: number): void;\n releaseTexture(textureId: number): void;\n replayLoadedAssets(): Promise<void>;\n resetLogs(): void;\n resetAppSession(): void;\n}\n\nexport interface BridgeState {\n readonly ready: Promise<BridgeRuntime>;\n getRuntime(): BridgeRuntime | null;\n recreateRuntime(): Promise<BridgeRuntime>;\n resetLogs(): void;\n handleToBigInt(handle: WasmHandleLike): bigint;\n handleToString(handle: WasmHandleLike): string;\n pointerToHeapOffset(pointer: WasmHandleLike): number;\n normalizePointerForWasm(\n module: Pick<UiModule | CoreModule, 'usesMemory64'>,\n pointer: WasmHandleLike,\n ): number | bigint;\n toHeapPointer(\n module: Pick<UiModule | CoreModule, 'usesMemory64'>,\n pointer: WasmHandleLike,\n ): { readonly ptr: number | bigint; readonly offset: number };\n}\n\nexport interface BridgeLoaderInfo {\n manifestHash: string | null;\n requestedWasmArchitecture: string;\n requestedRendererBackend: 'auto' | 'webgpu' | 'webgl2' | 'cpu';\n selectedWasmArchitecture: string;\n availableWasmArchitectures: readonly string[];\n memory64Supported: boolean;\n simdSupported: boolean;\n coreCompileMode: 'streaming' | 'buffer' | 'cached-module';\n uiCompileMode: 'streaming' | 'buffer' | 'cached-module';\n icuDataUrl: string | null;\n activeRenderer: 'none' | 'webgpu' | 'webgl2' | 'cpu';\n /** Incremented each time the renderer recovers from a device loss. Useful for tests. */\n deviceRecoveryCount: number;\n}\n\nexport interface EffinDomCallbacks {\n onPointerEvent?: (handle: WasmHandleLike, eventType: number) => void;\n onPointerEventWithCoords?: (eventType: number, handle: WasmHandleLike, x: number, y: number, modifiers?: number) => void;\n onBeforeContextMenuHitTest?: () => void;\n onContextMenu?: (handle: WasmHandleLike, x: number, y: number) => void;\n onKeyEventWithKey?: (eventType: number, key: string, modifiers: number) => boolean | void;\n onFocusChanged?: (handle: WasmHandleLike, isFocused: boolean) => void;\n onTextChanged?: (handle: WasmHandleLike, text: string) => void;\n onTextReplaced?: (handle: WasmHandleLike, start: number, end: number, text: string) => void;\n onSelectionChanged?: (handle: WasmHandleLike, start: number, end: number) => void;\n onScroll?: (\n handle: WasmHandleLike,\n offsetX: number,\n offsetY: number,\n contentWidth: number,\n contentHeight: number,\n viewportWidth: number,\n viewportHeight: number,\n ) => void;\n onClipboardWrite?: (payload: ClipboardWritePayload) => void;\n onClipboardRead?: (handle: WasmHandleLike) => void;\n onCrossSelectionChanged?: (areaHandle: WasmHandleLike, text: string) => void;\n onRequestFontLoad?: (fontId: number, url: string) => void;\n onMissingFontCoverage?: (fontId: number, coverageKind: number, sampleText: string) => void;\n onRequestSemanticAnnouncement?: (handle: WasmHandleLike) => void;\n}\n\nexport type UiFactory = (module?: object) => Promise<UiModule>;\n\ndeclare global {\n interface Window {\n Module?: CoreModule;\n EffinDomUiV2ModuleFactory?: UiFactory;\n __effindomCallbacks?: EffinDomCallbacks;\n __bridgeReady?: boolean;\n __bridgeError?: string;\n __bridgeState?: {\n readonly commandWordCount: number;\n readonly commandWords: readonly number[];\n readonly rootHandle: string;\n };\n __bridgeLogs?: BridgeLogs;\n __bridgeTextByHandle?: Record<string, string>;\n __bridgeSelectionsByHandle?: Record<string, { start: number; end: number }>;\n __bridgeActiveEditorWindow?: {\n readonly handle: string | null;\n readonly text: string;\n readonly docStart: number;\n readonly docEnd: number;\n };\n __bridgeFindMatch?: OpenCanvasFindMatch | null;\n __bridgeFindState?: OpenCanvasFindState | null;\n __bridgeSemanticTree?: readonly SemanticNode[];\n __bridgeLoaderInfo?: BridgeLoaderInfo;\n __OPEN_CANVAS_API__?: OpenCanvasApi;\n EffinDomBrowserBridge?: BridgeState;\n __bridgeDebug?: { forceDeviceLost(): void };\n }\n}\n\nexport {};\n", "import { EdBackendType, EdDeviceState } from '../../core-types';\nimport type {\n CoreModule,\n EdBackendType as EdBackendTypeValue,\n EdDeviceState as EdDeviceStateValue,\n UiModule,\n WasmHandleLike,\n} from '../../core-types';\n\nexport type WasmModuleMemoryView = Pick<UiModule | CoreModule, 'usesMemory64'>;\n\nfunction extractHandlePrimitive(handle: WasmHandleLike): bigint | number | string {\n if (typeof handle === 'bigint' || typeof handle === 'number' || typeof handle === 'string') {\n return handle;\n }\n const symbolPrimitive = (handle as { [Symbol.toPrimitive]?: (hint: string) => unknown })[Symbol.toPrimitive]?.('default');\n if (\n typeof symbolPrimitive === 'bigint' ||\n typeof symbolPrimitive === 'number' ||\n typeof symbolPrimitive === 'string'\n ) {\n return symbolPrimitive;\n }\n const primitive = handle.valueOf();\n if (typeof primitive === 'bigint' || typeof primitive === 'number' || typeof primitive === 'string') {\n return primitive;\n }\n const stringified = handle.toString();\n if (typeof stringified === 'string') {\n return stringified;\n }\n throw new TypeError(`Cannot convert ${String(handle)} to BigInt.`);\n}\n\nexport function handleToBigInt(handle: WasmHandleLike): bigint {\n const primitive = extractHandlePrimitive(handle);\n if (typeof primitive === 'bigint') {\n return primitive;\n }\n if (typeof primitive === 'number') {\n if (!Number.isInteger(primitive)) {\n throw new TypeError(`Cannot convert non-integer handle ${String(primitive)} to BigInt.`);\n }\n return BigInt(primitive);\n }\n if (typeof primitive === 'string') {\n return BigInt(primitive);\n }\n throw new TypeError(`Cannot convert ${String(handle)} to BigInt.`);\n}\n\nexport function handleToString(handle: WasmHandleLike): string {\n return handleToBigInt(handle).toString();\n}\n\nexport function pointerToHeapOffset(pointer: WasmHandleLike): number {\n if (typeof pointer === 'number') {\n if (!Number.isInteger(pointer)) {\n throw new TypeError(`Cannot convert non-integer pointer ${String(pointer)} to a heap offset.`);\n }\n return pointer;\n }\n const value = handleToBigInt(pointer);\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new RangeError(`Pointer ${value.toString()} exceeds JavaScript heap offset precision.`);\n }\n return Number(value);\n}\n\nexport function normalizePointerForWasm(\n module: WasmModuleMemoryView,\n pointer: WasmHandleLike,\n): number | bigint {\n return module.usesMemory64 === true ? handleToBigInt(pointer) : pointerToHeapOffset(pointer);\n}\n\nexport function toHeapPointer(\n module: WasmModuleMemoryView,\n pointer: WasmHandleLike,\n): { readonly ptr: number | bigint; readonly offset: number } {\n const ptr = normalizePointerForWasm(module, pointer);\n return {\n ptr,\n offset: pointerToHeapOffset(ptr),\n };\n}\n\nexport function normalizeBackendType(value: number): EdBackendTypeValue {\n switch (value) {\n case EdBackendType.WEBGPU:\n case EdBackendType.WEBGL2:\n case EdBackendType.CPU:\n return value;\n default:\n return EdBackendType.NONE;\n }\n}\n\nexport function normalizeDeviceState(value: number): EdDeviceStateValue {\n switch (value) {\n case EdDeviceState.LOST:\n case EdDeviceState.RECOVERING:\n return value;\n default:\n return EdDeviceState.OK;\n }\n}\n\ntype ModifierSource =\n | Pick<KeyboardEvent, 'shiftKey' | 'ctrlKey' | 'altKey' | 'metaKey'>\n | Pick<PointerEvent, 'shiftKey' | 'ctrlKey' | 'altKey' | 'metaKey'>;\n\nexport function computeModifiers(event: ModifierSource): number {\n let modifiers = 0;\n if (event.shiftKey) {\n modifiers |= 1 << 0;\n }\n if (event.ctrlKey) {\n modifiers |= 1 << 1;\n }\n if (event.altKey) {\n modifiers |= 1 << 2;\n }\n if (event.metaKey) {\n modifiers |= 1 << 3;\n }\n return modifiers;\n}\n", "import { EdBackendType, EdDeviceState } from '../../core-types';\nimport type { BridgeLoaderInfo, CoreModule, EdBackendType as EdBackendTypeValue } from '../../core-types';\nimport { normalizeBackendType, normalizeDeviceState } from './encoding';\n\nconst WEBGPU_INIT_TIMEOUT_MS = 1_500;\n\n// TEMPORARY: keep WebGPU disabled from the bridge until resize/device-loss stability\n// issues are resolved. Default to WebGL2 with software fallback.\nexport const DEFAULT_BACKEND_LADDER = [EdBackendType.WEBGL2, EdBackendType.CPU] as const;\n\nexport function backendTypeToRenderer(backendType: EdBackendTypeValue): BridgeLoaderInfo['activeRenderer'] {\n switch (backendType) {\n case EdBackendType.WEBGPU:\n return 'webgpu';\n case EdBackendType.WEBGL2:\n return 'webgl2';\n case EdBackendType.CPU:\n return 'cpu';\n default:\n return 'none';\n }\n}\n\nexport function setActiveRenderer(loaderInfo: BridgeLoaderInfo, backendType: EdBackendTypeValue): void {\n loaderInfo.activeRenderer = backendTypeToRenderer(backendType);\n window.__bridgeLoaderInfo = loaderInfo;\n}\n\nasync function waitForAnimationFrame(): Promise<void> {\n await new Promise<void>((resolve) => {\n requestAnimationFrame(() => {\n resolve();\n });\n });\n}\n\nexport async function waitForWebGpuInit(core: CoreModule): Promise<EdBackendTypeValue> {\n const deadline = performance.now() + WEBGPU_INIT_TIMEOUT_MS;\n while (performance.now() < deadline) {\n const backendType = normalizeBackendType(core._ed_get_backend_type());\n const deviceState = normalizeDeviceState(core._ed_get_device_state());\n if (backendType === EdBackendType.WEBGPU) {\n return backendType;\n }\n if (deviceState !== EdDeviceState.RECOVERING) {\n return backendType;\n }\n await waitForAnimationFrame();\n }\n return normalizeBackendType(core._ed_get_backend_type());\n}\n\nexport async function probeWebGpuAdapter(): Promise<boolean> {\n const nav = navigator as Navigator & { gpu?: { requestAdapter?: () => Promise<unknown> } };\n if (nav.gpu?.requestAdapter === undefined) {\n return false;\n }\n try {\n const adapter = await nav.gpu.requestAdapter();\n return adapter !== null && adapter !== undefined;\n } catch {\n return false;\n }\n}\n\nexport function backendLabel(backend: EdBackendTypeValue): string {\n if (backend === EdBackendType.WEBGPU) return 'WebGPU';\n if (backend === EdBackendType.WEBGL2) return 'WebGL2';\n if (backend === EdBackendType.CPU) return 'Software/Raster';\n return 'None';\n}\n\n// Attempts to initialise exactly one backend. Returns true on success.\n// Safe to call after a device loss \u2014 wraps all init calls in try/catch.\nexport async function tryReviveBackend(\n core: CoreModule,\n canvas: HTMLCanvasElement,\n dpr: number,\n backend: EdBackendTypeValue,\n): Promise<boolean> {\n const w = canvas.width;\n const h = canvas.height;\n try {\n if (backend === EdBackendType.WEBGPU) {\n if (!await probeWebGpuAdapter()) return false;\n core._ed_init(w, h, dpr);\n return await waitForWebGpuInit(core) === EdBackendType.WEBGPU;\n }\n if (backend === EdBackendType.WEBGL2) {\n core._ed_init_webgl(w, h, dpr);\n return normalizeBackendType(core._ed_get_backend_type()) === EdBackendType.WEBGL2;\n }\n core._ed_init_sw(w, h, dpr);\n return normalizeBackendType(core._ed_get_backend_type()) === EdBackendType.CPU;\n } catch {\n return false;\n }\n}\n\nexport async function initRenderer(\n core: CoreModule,\n canvas: HTMLCanvasElement,\n dpr: number,\n loaderInfo: BridgeLoaderInfo,\n backendLadder: readonly EdBackendTypeValue[] = DEFAULT_BACKEND_LADDER,\n): Promise<EdBackendTypeValue> {\n const physicalWidth = canvas.width;\n const physicalHeight = canvas.height;\n const ladder = backendLadder.length > 0 ? backendLadder : DEFAULT_BACKEND_LADDER;\n const firstBackend = ladder[0] ?? EdBackendType.WEBGPU;\n let webGpuAttempted = false;\n let webGl2Attempted = false;\n\n for (const backend of ladder) {\n if (backend === EdBackendType.WEBGPU) {\n // Probe the adapter before calling ed_init. On platforms like Ubuntu where\n // navigator.gpu exists but has no adapter (Vulkan blocklist, no GPU, etc.),\n // requestAdapter() returns null. Calling ed_init without checking locks the\n // canvas to a WebGPU context (even on failure), preventing WebGL2 init.\n if (!await probeWebGpuAdapter()) {\n continue;\n }\n webGpuAttempted = true;\n core._ed_init(physicalWidth, physicalHeight, dpr);\n const resolvedBackend = await waitForWebGpuInit(core);\n if (resolvedBackend === EdBackendType.WEBGPU) {\n setActiveRenderer(loaderInfo, resolvedBackend);\n return resolvedBackend;\n }\n continue;\n }\n\n if (backend === EdBackendType.WEBGL2) {\n webGl2Attempted = true;\n core._ed_init_webgl(physicalWidth, physicalHeight, dpr);\n if (normalizeBackendType(core._ed_get_backend_type()) === EdBackendType.WEBGL2) {\n if (webGpuAttempted || firstBackend === EdBackendType.WEBGPU) {\n console.warn('RENDERER FALLBACK: WebGPU failed to initialize or unavailable! Fell back to WebGL2');\n }\n setActiveRenderer(loaderInfo, EdBackendType.WEBGL2);\n return EdBackendType.WEBGL2;\n }\n continue;\n }\n\n core._ed_init_sw(physicalWidth, physicalHeight, dpr);\n if (normalizeBackendType(core._ed_get_backend_type()) === EdBackendType.CPU) {\n const triedBackends = [\n webGpuAttempted ? 'WebGPU' : null,\n webGl2Attempted ? 'WebGL2' : null,\n ].filter(Boolean).join(' and ');\n const reason = triedBackends.length > 0\n ? `${triedBackends} failed to initialize or unavailable!`\n : 'No GPU backend available.';\n console.error(`RENDERER FALLBACK: ${reason} Fell back to Software/Raster - performance will be painfully slow`);\n setActiveRenderer(loaderInfo, EdBackendType.CPU);\n return EdBackendType.CPU;\n }\n }\n\n setActiveRenderer(loaderInfo, EdBackendType.NONE);\n throw new Error('Failed to initialize any renderer backend.');\n}\n", "export const ASSET_FETCH_ATTEMPTS = 4;\nconst ASSET_RETRY_DELAY_MS = 100;\nconst scriptSourceCache = new Map<string, Promise<string>>();\n\nfunction delay(ms: number): Promise<void> {\n return new Promise<void>((resolve) => {\n window.setTimeout(resolve, ms);\n });\n}\n\nexport function resolveAssetUrl(url: string): string {\n return new URL(url, document.baseURI).toString();\n}\n\nexport function normalizeFetchIntegrity(integrity: string | null | undefined): string | null {\n if (integrity === null || integrity === undefined || integrity.length === 0) {\n return null;\n }\n const value = integrity;\n if (!value.startsWith('sha256-')) {\n return value;\n }\n let digest = value.slice(7).replace(/-/g, '+').replace(/_/g, '/');\n while ((digest.length % 4) !== 0) {\n digest += '=';\n }\n return `sha256-${digest}`;\n}\n\nexport function bytesToBase64(bytes: Uint8Array): string {\n let binary = '';\n for (let index = 0; index < bytes.length; index += 0x8000) {\n const chunk = bytes.subarray(index, Math.min(index + 0x8000, bytes.length));\n binary += String.fromCharCode(...chunk);\n }\n return window.btoa(binary);\n}\n\nexport async function verifyFetchedIntegrity(assetUrl: string, buffer: ArrayBuffer, integrity: string | null | undefined): Promise<ArrayBuffer> {\n const normalizedIntegrity = normalizeFetchIntegrity(integrity);\n if (normalizedIntegrity === null) {\n return buffer;\n }\n const digestBuffer = await globalThis.crypto.subtle.digest('SHA-256', buffer);\n const actualIntegrity = `sha256-${bytesToBase64(new Uint8Array(digestBuffer))}`;\n if (actualIntegrity !== normalizedIntegrity) {\n throw new Error(`Integrity mismatch for ${assetUrl}`);\n }\n return buffer;\n}\n\nexport function buildFetchInit(integrity: string | null | undefined, cache: RequestCache = 'force-cache'): RequestInit {\n const fetchIntegrity = normalizeFetchIntegrity(integrity);\n const init: RequestInit = {\n credentials: 'same-origin',\n cache,\n };\n if (fetchIntegrity !== null) {\n init.integrity = fetchIntegrity;\n }\n return init;\n}\n\nexport async function fetchWithRetry<T>(\n url: string,\n attempts: number,\n read: (response: Response) => T | Promise<T>,\n init?: RequestInit,\n): Promise<T> {\n let lastError: unknown = null;\n for (let attempt = 1; attempt <= attempts; attempt += 1) {\n try {\n const response = await fetch(url, init);\n if (!response.ok) {\n throw new Error(`Failed to fetch ${url}: ${String(response.status)}`);\n }\n return await read(response);\n } catch (error: unknown) {\n lastError = error;\n if (attempt === attempts) {\n break;\n }\n await delay(ASSET_RETRY_DELAY_MS * attempt);\n }\n }\n throw lastError instanceof Error ? lastError : new Error(`Failed to fetch ${url}`);\n}\n\nexport async function fetchBinaryAsset(url: string, integrity: string | null | undefined): Promise<Uint8Array> {\n const assetUrl = resolveAssetUrl(url);\n const buffer = await fetchWithRetry<ArrayBuffer>(\n assetUrl,\n ASSET_FETCH_ATTEMPTS,\n async (response) => await response.arrayBuffer(),\n buildFetchInit(integrity),\n );\n return new Uint8Array(await verifyFetchedIntegrity(assetUrl, buffer, integrity));\n}\n\nexport async function fetchResponseWithRetry(url: string, integrity: string | null | undefined): Promise<Response> {\n const assetUrl = resolveAssetUrl(url);\n return await fetchWithRetry<Response>(\n assetUrl,\n ASSET_FETCH_ATTEMPTS,\n (response) => response,\n buildFetchInit(integrity),\n );\n}\n\nexport async function loadScriptResource(scriptUrl: string, integrity: string | null | undefined): Promise<void> {\n const absoluteUrl = resolveAssetUrl(scriptUrl);\n const sourceText = await fetchScriptSource(absoluteUrl, integrity);\n const blobSource = sourceText.includes('//# sourceURL=')\n ? sourceText\n : `${sourceText}\\n//# sourceURL=${absoluteUrl.replace(/\\s/g, '%20')}`;\n const blobUrl = URL.createObjectURL(new Blob([blobSource], { type: 'application/javascript' }));\n try {\n await new Promise<void>((resolve, reject) => {\n const script = document.createElement('script');\n script.src = blobUrl;\n script.async = true;\n script.addEventListener('load', () => {\n script.remove();\n resolve();\n });\n script.addEventListener('error', () => {\n script.remove();\n reject(new Error(`Failed to execute ${absoluteUrl}`));\n });\n document.head.appendChild(script);\n });\n } finally {\n URL.revokeObjectURL(blobUrl);\n }\n}\n\nexport async function fetchScriptSource(scriptUrl: string, integrity: string | null | undefined): Promise<string> {\n const absoluteUrl = resolveAssetUrl(scriptUrl);\n const cacheKey = `${absoluteUrl}::${integrity ?? ''}`;\n let sourcePromise = scriptSourceCache.get(cacheKey);\n if (sourcePromise === undefined) {\n sourcePromise = fetchBinaryAsset(absoluteUrl, integrity).then((scriptBytes) =>\n new TextDecoder('utf-8').decode(scriptBytes));\n scriptSourceCache.set(cacheKey, sourcePromise);\n }\n return await sourcePromise;\n}\n", "import type { CoreModule, UiModule, WasmHandleLike } from '../../core-types';\nimport { normalizePointerForWasm, pointerToHeapOffset } from './encoding';\n\nconst textEncoder = new TextEncoder();\n\nexport function writeUtf8ToHeap(\n module: Pick<UiModule | CoreModule, 'HEAPU8' | '_malloc' | '_free' | 'refreshHeapViews' | 'usesMemory64'>,\n text: string,\n): { readonly ptr: WasmHandleLike; readonly offset: number; readonly len: number; dispose(): void } {\n const bytes = textEncoder.encode(text);\n const ptr = normalizePointerForWasm(module, bytes.byteLength === 0 ? 0 : module._malloc(bytes.byteLength));\n const offset = pointerToHeapOffset(ptr);\n module.refreshHeapViews?.();\n if (bytes.byteLength > 0 && offset === 0) {\n throw new Error('WASM string malloc failed.');\n }\n if (bytes.byteLength > 0) {\n module.HEAPU8.set(bytes, offset);\n }\n return {\n ptr,\n offset,\n len: bytes.byteLength,\n dispose: () => {\n if (offset !== 0) {\n module._free(ptr);\n }\n },\n };\n}\n\nexport function writeBytesToHeap(\n module: Pick<UiModule | CoreModule, 'HEAPU8' | '_malloc' | '_free' | 'refreshHeapViews' | 'usesMemory64'>,\n bytes: Uint8Array,\n): { readonly ptr: WasmHandleLike; readonly offset: number; readonly len: number; dispose(): void } {\n const ptr = normalizePointerForWasm(module, bytes.byteLength === 0 ? 0 : module._malloc(bytes.byteLength));\n const offset = pointerToHeapOffset(ptr);\n module.refreshHeapViews?.();\n if (bytes.byteLength > 0 && offset === 0) {\n throw new Error('WASM bytes malloc failed.');\n }\n if (bytes.byteLength > 0) {\n module.HEAPU8.set(bytes, offset);\n }\n return {\n ptr,\n offset,\n len: bytes.byteLength,\n dispose: () => {\n if (offset !== 0) {\n module._free(ptr);\n }\n },\n };\n}\n\nexport function extractCommandBuffer(ui: UiModule): Uint32Array {\n const lengthPtr = normalizePointerForWasm(ui, ui._malloc(4));\n const lengthOffset = pointerToHeapOffset(lengthPtr);\n if (lengthOffset === 0) {\n throw new Error('ui length malloc failed.');\n }\n\n try {\n const bufferPtr = ui._ui_get_command_buffer(lengthPtr);\n ui.refreshHeapViews?.();\n const wordCount = ui.HEAPU32[lengthOffset >>> 2] ?? 0;\n const bufferOffset = pointerToHeapOffset(normalizePointerForWasm(ui, bufferPtr));\n if (bufferOffset === 0 || wordCount === 0) {\n return new Uint32Array();\n }\n const wordOffset = bufferOffset >>> 2;\n return ui.HEAPU32.slice(wordOffset, wordOffset + wordCount);\n } finally {\n ui._free(lengthPtr);\n }\n}\n\nexport function extractSemanticBuffer(ui: UiModule): Uint32Array {\n const lengthPtr = normalizePointerForWasm(ui, ui._malloc(4));\n const lengthOffset = pointerToHeapOffset(lengthPtr);\n if (lengthOffset === 0) {\n throw new Error('ui semantic length malloc failed.');\n }\n\n try {\n const bufferPtr = ui._ui_get_semantic_buffer(lengthPtr);\n ui.refreshHeapViews?.();\n const wordCount = ui.HEAPU32[lengthOffset >>> 2] ?? 0;\n const bufferOffset = pointerToHeapOffset(normalizePointerForWasm(ui, bufferPtr));\n if (bufferOffset === 0 || wordCount === 0) {\n return new Uint32Array();\n }\n const wordOffset = bufferOffset >>> 2;\n return ui.HEAPU32.slice(wordOffset, wordOffset + wordCount);\n } finally {\n ui._free(lengthPtr);\n }\n}\n\nexport function executeCommandBuffer(core: CoreModule, words: Uint32Array): void {\n if (words.length === 0) {\n return;\n }\n const ptr = normalizePointerForWasm(core, core._malloc(words.byteLength));\n const offset = pointerToHeapOffset(ptr);\n core.refreshHeapViews?.();\n if (offset === 0) {\n throw new Error('core command malloc failed.');\n }\n\n try {\n core.HEAPU32.set(words, offset >>> 2);\n core._ed_execute_command_buffer(ptr, words.length);\n } finally {\n core._free(ptr);\n }\n}\n", "import { EdBackendType, EdDeviceState } from '../../core-types';\nimport type {\n BridgeLoaderInfo,\n BridgeLogs,\n CoreModule,\n UiFactory,\n UiModule,\n} from '../../core-types';\nimport type {\n ArchitectureSelection,\n PreparedRuntimeAssets,\n PreparedWasmAsset,\n RequestedRendererBackend,\n RuntimeManifest,\n} from '../local-types';\nimport type { EdBackendType as EdBackendTypeValue } from '../../core-types';\nimport { DEFAULT_BACKEND_LADDER } from './backends';\nimport { fetchBinaryAsset, fetchScriptSource, fetchWithRetry, loadScriptResource, resolveAssetUrl, verifyFetchedIntegrity, ASSET_FETCH_ATTEMPTS } from './fetch';\nimport { writeBytesToHeap } from './heap';\n\ndeclare const HEAPU8: Uint8Array | undefined;\ndeclare const HEAPU32: Uint32Array | undefined;\n\ndeclare global {\n interface EffinDomRuntimeConfig {\n manifestUrl?: string;\n }\n\n interface Window {\n __effindomRuntime?: EffinDomRuntimeConfig;\n }\n}\n\ninterface LoadedRuntimeManifest {\n readonly manifest: RuntimeManifest;\n readonly manifestUrl: string;\n}\n\nconst MEMORY64_VALIDATION_MODULE_BYTES = new Uint8Array([\n 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x0f, 0x03, 0x60,\n 0x02, 0x7f, 0x7e, 0x01, 0x7f, 0x60, 0x01, 0x7e, 0x00, 0x60, 0x00, 0x01,\n 0x7e, 0x03, 0x04, 0x03, 0x00, 0x01, 0x02, 0x04, 0x05, 0x01, 0x70, 0x05,\n 0x01, 0x01, 0x05, 0x06, 0x01, 0x05, 0x82, 0x02, 0x82, 0x02, 0x06, 0x08,\n 0x01, 0x7e, 0x01, 0x42, 0x80, 0x88, 0x04, 0x0b, 0x07, 0x68, 0x05, 0x06,\n 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00, 0x04, 0x6d, 0x61, 0x69,\n 0x6e, 0x00, 0x00, 0x19, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x72, 0x65,\n 0x63, 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f,\n 0x74, 0x61, 0x62, 0x6c, 0x65, 0x01, 0x00, 0x19, 0x5f, 0x65, 0x6d, 0x73,\n 0x63, 0x72, 0x69, 0x70, 0x74, 0x65, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x63,\n 0x6b, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x00, 0x01, 0x1c,\n 0x65, 0x6d, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x65, 0x6e, 0x5f, 0x73,\n 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x63, 0x75, 0x72,\n 0x72, 0x65, 0x6e, 0x74, 0x00, 0x02, 0x0a, 0x12, 0x03, 0x04, 0x00, 0x41,\n 0x00, 0x0b, 0x06, 0x00, 0x20, 0x00, 0x24, 0x00, 0x0b, 0x04, 0x00, 0x23,\n 0x00, 0x0b,\n]);\n\nconst SIMD_VALIDATION_MODULE_BYTES = new Uint8Array([\n 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00,\n 0x01, 0x04, 0x01, 0x60, 0x00, 0x00,\n 0x03, 0x02, 0x01, 0x00,\n 0x0a, 0x17, 0x01, 0x15, 0x00, 0xfd, 0x0c,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x1a, 0x0b,\n]);\n\nfunction requireTextElement(id: string): HTMLElement {\n const element = document.getElementById(id);\n if (!(element instanceof HTMLElement)) {\n throw new Error(`Expected #${id} element.`);\n }\n return element;\n}\n\nexport function showIcuError(message: string): void {\n const errorBox = document.getElementById('icu-error');\n const messageNode = document.getElementById('icu-error-message');\n if (errorBox instanceof HTMLElement && messageNode instanceof HTMLElement) {\n messageNode.textContent = message;\n errorBox.style.display = 'block';\n return;\n }\n\n const overlay = document.getElementById('effindom-loading-overlay');\n const overlayTitle = document.getElementById('effindom-loading-title');\n const overlayDetail = document.getElementById('effindom-loading-detail');\n if (\n overlay instanceof HTMLElement &&\n overlayTitle instanceof HTMLElement &&\n overlayDetail instanceof HTMLElement\n ) {\n overlay.dataset.state = 'error';\n overlay.hidden = false;\n overlay.setAttribute('aria-hidden', 'false');\n overlayTitle.textContent = 'The typesetter dragon sneezed on the runtime.';\n overlayDetail.textContent = message;\n }\n}\n\nexport function createErrorWithCause(message: string, cause: unknown): Error {\n const wrappedError = new Error(message) as Error & { cause?: unknown };\n wrappedError.cause = cause;\n return wrappedError;\n}\n\nexport async function waitForAnimationFrame(): Promise<void> {\n await new Promise<void>((resolve) => {\n requestAnimationFrame(() => {\n resolve();\n });\n });\n}\n\nexport function delay(ms: number): Promise<void> {\n return new Promise<void>((resolve) => {\n window.setTimeout(resolve, ms);\n });\n}\n\nexport function clearRecordMap<T>(recordMap: Record<string, T>): void {\n for (const key of Object.keys(recordMap)) {\n Reflect.deleteProperty(recordMap, key);\n }\n}\n\nexport function resetBridgeLogs(logs: BridgeLogs): void {\n logs.pointerEvents.length = 0;\n logs.focusEvents.length = 0;\n logs.textChanges.length = 0;\n logs.selectionChanges.length = 0;\n logs.crossSelectionChanges.length = 0;\n logs.clipboardWrites.length = 0;\n logs.clipboardReadRequests.length = 0;\n logs.scrollEvents.length = 0;\n logs.missingFontCoverageRequests.length = 0;\n logs.incrementalFontPackageRequests.length = 0;\n}\n\nfunction supportsMemory64(): boolean {\n try {\n new WebAssembly.Memory({ initial: 1, maximum: 1, index: 'i64' } as WebAssembly.MemoryDescriptor & { index: 'i64' });\n if (WebAssembly.validate !== undefined) {\n return WebAssembly.validate(MEMORY64_VALIDATION_MODULE_BYTES);\n }\n void new WebAssembly.Module(MEMORY64_VALIDATION_MODULE_BYTES);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction supportsSimd(): boolean {\n try {\n if (WebAssembly.validate !== undefined) {\n return WebAssembly.validate(SIMD_VALIDATION_MODULE_BYTES);\n }\n void new WebAssembly.Module(SIMD_VALIDATION_MODULE_BYTES);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction normalizeWasmArchitecture(requestedArchitecture: string | null | undefined): ArchitectureSelection['requestedArchitecture'] {\n const value = (requestedArchitecture ?? 'auto').toLowerCase();\n if (value === 'wasm32' || value === 'wasm32-simd' || value === 'wasm64' || value === 'wasm64-simd') {\n return value;\n }\n return 'auto';\n}\n\nfunction getManifestArchitectureEntry(\n manifest: RuntimeManifest,\n architecture: Exclude<ArchitectureSelection['requestedArchitecture'], 'auto'>,\n): ArchitectureSelection['manifestEntry'] | null {\n return manifest.architectures[architecture] ?? null;\n}\n\nfunction selectManifestArchitecture(manifest: RuntimeManifest, requestedArchitecture: string | null | undefined): ArchitectureSelection {\n const normalizedRequest = normalizeWasmArchitecture(requestedArchitecture);\n const memory64Supported = supportsMemory64();\n const simdSupported = supportsSimd();\n const availableArchitectures = Object.keys(manifest.architectures).filter((architecture) => manifest.architectures[architecture as Exclude<ArchitectureSelection['requestedArchitecture'], 'auto'>] !== undefined);\n let selectedArchitecture: Exclude<ArchitectureSelection['requestedArchitecture'], 'auto'> | null = null;\n let selectionReason: string;\n\n const architectureUsesMemory64 = (architecture: string): boolean => architecture.startsWith('wasm64');\n const architectureUsesSimd = (architecture: string): boolean => architecture.endsWith('-simd');\n\n if (normalizedRequest !== 'auto') {\n const explicitEntry = getManifestArchitectureEntry(manifest, normalizedRequest);\n if (explicitEntry === null) {\n throw new Error(`Manifest does not include ${normalizedRequest} bundles.`);\n }\n if (architectureUsesMemory64(normalizedRequest) && !memory64Supported) {\n throw new Error(`${normalizedRequest} was explicitly requested but this browser does not support Memory64.`);\n }\n if (architectureUsesSimd(normalizedRequest) && !simdSupported) {\n throw new Error(`${normalizedRequest} was explicitly requested but this browser does not support WebAssembly SIMD.`);\n }\n selectedArchitecture = normalizedRequest;\n selectionReason = `Explicit ${normalizedRequest} request.`;\n } else {\n const preferredArchitectures: Exclude<ArchitectureSelection['requestedArchitecture'], 'auto'>[] = [];\n if (memory64Supported && simdSupported) {\n preferredArchitectures.push('wasm64-simd');\n }\n if (memory64Supported) {\n preferredArchitectures.push('wasm64');\n }\n if (simdSupported) {\n preferredArchitectures.push('wasm32-simd');\n }\n preferredArchitectures.push('wasm32');\n\n for (const candidate of preferredArchitectures) {\n if (getManifestArchitectureEntry(manifest, candidate) !== null) {\n selectedArchitecture = candidate;\n break;\n }\n }\n\n if (selectedArchitecture === null) {\n throw new Error('Manifest does not expose any wasm bundle architectures compatible with this browser.');\n }\n\n if (selectedArchitecture === 'wasm64-simd') {\n selectionReason = 'Browser supports Memory64 + SIMD, so EffinDom selected the wasm64-simd bundle set.';\n } else if (selectedArchitecture === 'wasm64') {\n selectionReason = 'Browser supports Memory64, so EffinDom selected the wasm64 bundle set.';\n } else if (selectedArchitecture === 'wasm32-simd') {\n selectionReason = 'Browser supports SIMD, so EffinDom selected the wasm32-simd bundle set.';\n } else {\n selectionReason = 'Browser selected the wasm32 bundle set.';\n }\n }\n\n const manifestEntry = getManifestArchitectureEntry(manifest, selectedArchitecture);\n if (manifestEntry === null) {\n throw new Error(`Manifest entry for ${selectedArchitecture} is missing.`);\n }\n\n return {\n requestedArchitecture: normalizedRequest,\n selectedArchitecture,\n availableArchitectures,\n memory64Supported,\n simdSupported,\n selectionReason,\n manifestEntry,\n };\n}\n\nfunction readManifestUrl(): string {\n const runtimeConfig = window.__effindomRuntime;\n if (runtimeConfig === undefined) {\n throw new Error('Missing effindom-runtime-config.js. Expected window.__effindomRuntime.manifestUrl before bridge.js loads.');\n }\n if (typeof runtimeConfig.manifestUrl !== 'string' || runtimeConfig.manifestUrl.length === 0) {\n throw new Error('Malformed effindom-runtime-config.js. Expected window.__effindomRuntime.manifestUrl to be a non-empty string.');\n }\n return runtimeConfig.manifestUrl;\n}\n\nfunction resolveManifestAssetUrl(manifestUrl: string, assetUrl: string): string {\n return new URL(assetUrl, manifestUrl).toString();\n}\n\nasync function loadRuntimeManifest(): Promise<LoadedRuntimeManifest> {\n const manifestUrl = resolveAssetUrl(readManifestUrl());\n const manifest = await fetchWithRetry<RuntimeManifest>(\n manifestUrl,\n ASSET_FETCH_ATTEMPTS,\n async (response) => await response.json() as RuntimeManifest,\n { cache: 'no-store' },\n );\n return {\n manifest,\n manifestUrl,\n };\n}\n\nasync function instantiatePreparedWasm(\n preparedAsset: PreparedWasmAsset,\n imports: WebAssembly.Imports,\n): Promise<{ readonly instance: WebAssembly.Instance; readonly module: WebAssembly.Module; readonly compileMode: 'cached-module' }> {\n const module = await preparedAsset.modulePromise;\n const instance = await WebAssembly.instantiate(module, imports);\n return { instance, module, compileMode: 'cached-module' };\n}\n\nexport async function loadIcuData(ui: UiModule, preparedAssets: PreparedRuntimeAssets): Promise<void> {\n const bytes = await preparedAssets.icu.bytesPromise;\n const heapBytes = writeBytesToHeap(ui, bytes);\n try {\n ui._ui_register_icu_data(heapBytes.ptr, heapBytes.len);\n } finally {\n heapBytes.dispose();\n }\n}\n\nfunction describeAbortReason(value: unknown, fallback: string): string {\n if (typeof value === 'string' && value.length > 0) {\n return value;\n }\n if (value instanceof Error && value.message.length > 0) {\n return value.message;\n }\n return fallback;\n}\n\nfunction prepareWasmAsset(url: string, integrity: string | null): PreparedWasmAsset {\n const requestInit: RequestInit = {\n credentials: 'same-origin',\n cache: 'force-cache',\n };\n if (integrity !== null) {\n requestInit.integrity = integrity;\n }\n const bytesPromise = fetchWithRetry<ArrayBuffer>(\n url,\n ASSET_FETCH_ATTEMPTS,\n async (response) => await response.arrayBuffer(),\n requestInit,\n ).then(async (buffer) => await verifyFetchedIntegrity(url, buffer, integrity));\n return {\n url,\n integrity,\n bytesPromise,\n modulePromise: bytesPromise.then(async (buffer) => await WebAssembly.compile(buffer)),\n };\n}\n\nconst coreScriptRunnerCache = new Map<string, Promise<(module: CoreModule) => void>>();\n\nasync function getCoreScriptRunner(scriptUrl: string, integrity: string | null | undefined): Promise<(module: CoreModule) => void> {\n const absoluteUrl = resolveAssetUrl(scriptUrl);\n const cacheKey = `${absoluteUrl}::${integrity ?? ''}`;\n let runnerPromise = coreScriptRunnerCache.get(cacheKey);\n if (runnerPromise === undefined) {\n runnerPromise = fetchScriptSource(absoluteUrl, integrity).then((sourceText) => {\n const wrappedSource = `${sourceText}\\n//# sourceURL=${absoluteUrl.replace(/\\s/g, '%20')}`;\n return new Function('Module', wrappedSource) as (module: CoreModule) => void;\n });\n coreScriptRunnerCache.set(cacheKey, runnerPromise);\n }\n return await runnerPromise;\n}\n\nexport async function loadCoreModule(\n bundle: PreparedRuntimeAssets['coreBundle'],\n preparedWasm: PreparedWasmAsset,\n canvas: HTMLCanvasElement,\n loaderInfo: BridgeLoaderInfo,\n): Promise<CoreModule> {\n return await new Promise<CoreModule>((resolve, reject) => {\n const module: CoreModule = {\n HEAPU8: new Uint8Array(),\n HEAPU32: new Uint32Array(),\n usesMemory64: loaderInfo.selectedWasmArchitecture.startsWith('wasm64'),\n locateFile: (path) => {\n if (path.endsWith('.wasm')) {\n return resolveAssetUrl(bundle.wasm);\n }\n return resolveAssetUrl(path);\n },\n instantiateWasm: (imports, receiveInstance) => {\n void instantiatePreparedWasm(preparedWasm, imports).then((result) => {\n loaderInfo.coreCompileMode = result.compileMode;\n receiveInstance(result.instance, result.module);\n }).catch((error: unknown) => {\n reject(createErrorWithCause('Failed to instantiate Core wasm.', error));\n });\n return {};\n },\n onAbort: (what) => {\n reject(new Error(describeAbortReason(what, 'Core wasm aborted.')));\n },\n refreshHeapViews: () => {\n if (module.wasmMemory !== undefined) {\n const buffer = module.wasmMemory.buffer;\n module.HEAPU8 = new Uint8Array(buffer);\n module.HEAPU32 = new Uint32Array(buffer);\n } else if (typeof HEAPU8 !== 'undefined') {\n // Fallback for older Emscripten builds that don't expose Module[\"memory\"].\n module.HEAPU8 = HEAPU8;\n if (typeof HEAPU32 !== 'undefined') {\n module.HEAPU32 = HEAPU32;\n }\n }\n },\n canvas,\n onRuntimeInitialized: () => {\n // Emscripten assigns Module[\"memory\"] = wasmMemory when the WASM instance\n // is processed, before onRuntimeInitialized fires.\n const emMemory = (module as { memory?: unknown }).memory;\n if (emMemory instanceof WebAssembly.Memory) {\n module.wasmMemory = emMemory;\n }\n module.refreshHeapViews?.();\n resolve(module);\n },\n _malloc: () => 0,\n _free: () => undefined,\n _ed_init: () => undefined,\n _ed_init_webgl: () => undefined,\n _ed_init_sw: () => undefined,\n _ed_resize: () => undefined,\n _ed_register_font: () => undefined,\n _ed_unregister_font: () => undefined,\n _ed_register_svg: () => undefined,\n _ed_register_texture_rgba: () => undefined,\n _ed_unregister_texture: () => undefined,\n _ed_execute_command_buffer: () => undefined,\n _ed_reset_scene: () => undefined,\n _ed_render_frame: () => undefined,\n _ed_clear_focus_state: () => undefined,\n _ed_clear_text_input_state: () => undefined,\n _ed_recover_device: () => undefined,\n _ed_hit_test: () => 0,\n _ed_get_sw_framebuffer: () => 0,\n _ed_get_backend_type: () => EdBackendType.NONE,\n _ed_get_device_state: () => EdDeviceState.OK,\n _ed_notify_webgl_context_lost: () => undefined,\n _ed_debug_simulate_device_lost: () => undefined,\n };\n void getCoreScriptRunner(bundle.js, bundle.js_integrity ?? null).then((runCoreScript) => {\n runCoreScript(module);\n }).catch(reject);\n });\n}\n\nexport async function loadUiModule(\n bundle: PreparedRuntimeAssets['uiBundle'],\n preparedWasm: PreparedWasmAsset,\n loaderInfo: BridgeLoaderInfo,\n): Promise<UiModule> {\n if (window.EffinDomUiV2ModuleFactory === undefined) {\n await loadScriptResource(bundle.js, bundle.js_integrity ?? null);\n }\n if (window.EffinDomUiV2ModuleFactory === undefined) {\n throw new Error('EffinDomUiV2ModuleFactory did not load.');\n }\n let rejectInstantiation: ((reason: unknown) => void) | null = null;\n const instantiationFailure = new Promise<never>((_, reject) => {\n rejectInstantiation = reject;\n });\n const modulePromise = window.EffinDomUiV2ModuleFactory({\n locateFile: (path: string) => {\n if (path.endsWith('.wasm')) {\n return resolveAssetUrl(bundle.wasm);\n }\n return resolveAssetUrl(path);\n },\n instantiateWasm: (imports: WebAssembly.Imports, receiveInstance: (instance: WebAssembly.Instance, module?: WebAssembly.Module) => void) => {\n void instantiatePreparedWasm(preparedWasm, imports).then((result) => {\n loaderInfo.uiCompileMode = result.compileMode;\n receiveInstance(result.instance, result.module);\n }).catch((error: unknown) => {\n rejectInstantiation?.(createErrorWithCause('Failed to instantiate Ui wasm.', error));\n });\n return {};\n },\n onAbort: (what: unknown) => {\n rejectInstantiation?.(new Error(describeAbortReason(what, 'Ui wasm aborted.')));\n },\n });\n const ui = await Promise.race([modulePromise, instantiationFailure]);\n ui.usesMemory64 = loaderInfo.selectedWasmArchitecture.startsWith('wasm64');\n const uiEmMemory = (ui as { memory?: unknown }).memory;\n if (uiEmMemory instanceof WebAssembly.Memory) {\n ui.wasmMemory = uiEmMemory;\n }\n ui.refreshHeapViews = () => {\n if (ui.wasmMemory !== undefined) {\n const buffer = ui.wasmMemory.buffer;\n ui.HEAPU8 = new Uint8Array(buffer);\n ui.HEAPU32 = new Uint32Array(buffer);\n }\n };\n ui.refreshHeapViews();\n return ui;\n}\n\nfunction readRequestedArchitecture(): string | null {\n return new URLSearchParams(window.location.search).get('arch');\n}\n\nfunction readRequestedRendererBackend(): RequestedRendererBackend {\n const value = new URLSearchParams(window.location.search).get('backend')?.toLowerCase() ?? 'auto';\n if (value === 'webgpu' || value === 'graphite') {\n return 'webgpu';\n }\n if (value === 'webgl2' || value === 'ganesh') {\n return 'webgl2';\n }\n if (value === 'software' || value === 'raster' || value === 'cpu') {\n return 'cpu';\n }\n return 'auto';\n}\n\nexport function buildBackendLadder(requestedBackend: RequestedRendererBackend): readonly EdBackendTypeValue[] {\n if (requestedBackend === 'webgpu') {\n // TEMPORARY: explicit ?backend=webgpu currently downgrades to WebGL2/CPU.\n return [EdBackendType.WEBGL2, EdBackendType.CPU];\n }\n if (requestedBackend === 'webgl2') {\n return [EdBackendType.WEBGL2, EdBackendType.CPU];\n }\n if (requestedBackend === 'cpu') {\n return [EdBackendType.CPU];\n }\n return DEFAULT_BACKEND_LADDER;\n}\n\nexport async function prepareRuntimeAssets(): Promise<PreparedRuntimeAssets> {\n const loadedManifest = await loadRuntimeManifest();\n const manifest = loadedManifest.manifest;\n const manifestUrl = loadedManifest.manifestUrl;\n const selection = selectManifestArchitecture(manifest, readRequestedArchitecture());\n const requestedRendererBackend = readRequestedRendererBackend();\n const coreBundle = {\n ...selection.manifestEntry.core,\n js: resolveManifestAssetUrl(manifestUrl, selection.manifestEntry.core.js),\n wasm: resolveManifestAssetUrl(manifestUrl, selection.manifestEntry.core.wasm),\n };\n const uiBundle = {\n ...selection.manifestEntry.ui,\n js: resolveManifestAssetUrl(manifestUrl, selection.manifestEntry.ui.js),\n wasm: resolveManifestAssetUrl(manifestUrl, selection.manifestEntry.ui.wasm),\n };\n const icuAsset = manifest.assets?.icu;\n if (icuAsset === undefined) {\n throw new Error('Manifest is missing the ICU asset descriptor.');\n }\n\n const loaderInfo: BridgeLoaderInfo = {\n manifestHash: manifest.manifest_hash ?? null,\n requestedWasmArchitecture: selection.requestedArchitecture,\n requestedRendererBackend,\n selectedWasmArchitecture: selection.selectedArchitecture,\n availableWasmArchitectures: selection.availableArchitectures,\n memory64Supported: selection.memory64Supported,\n simdSupported: selection.simdSupported,\n coreCompileMode: 'buffer',\n uiCompileMode: 'buffer',\n icuDataUrl: resolveManifestAssetUrl(manifestUrl, icuAsset.url),\n activeRenderer: 'none',\n deviceRecoveryCount: 0,\n };\n\n return {\n manifest,\n selection,\n loaderInfo,\n coreBundle,\n uiBundle,\n coreWasm: {\n ...prepareWasmAsset(coreBundle.wasm, coreBundle.wasm_integrity ?? null),\n },\n uiWasm: {\n ...prepareWasmAsset(uiBundle.wasm, uiBundle.wasm_integrity ?? null),\n },\n icu: {\n url: resolveManifestAssetUrl(manifestUrl, icuAsset.url),\n integrity: icuAsset.integrity ?? null,\n bytesPromise: fetchBinaryAsset(resolveManifestAssetUrl(manifestUrl, icuAsset.url), icuAsset.integrity ?? null),\n },\n };\n}\n", "import type {\n OpenCanvasFindMatch,\n OpenCanvasFindOptions,\n OpenCanvasFindResults,\n OpenCanvasResolvedFindOptions,\n OpenCanvasTextDocument,\n} from '../core-types';\n\nconst combiningMarkPattern = /\\p{Mark}+/gu;\nconst wordLikeCharPattern = /[\\p{Letter}\\p{Number}\\p{Mark}_]/u;\nconst textEncoder = new TextEncoder();\n\ninterface SearchToken {\n readonly start: number;\n readonly end: number;\n}\n\ninterface SearchText {\n readonly text: string;\n readonly tokens: readonly SearchToken[];\n}\n\nexport const DEFAULT_OPEN_CANVAS_FIND_OPTIONS: OpenCanvasResolvedFindOptions = {\n highlightAll: false,\n matchCase: false,\n matchDiacritics: false,\n wholeWords: false,\n};\n\nexport function normalizeOpenCanvasFindOptions(\n options?: OpenCanvasFindOptions,\n): OpenCanvasResolvedFindOptions {\n return {\n highlightAll: options?.highlightAll ?? DEFAULT_OPEN_CANVAS_FIND_OPTIONS.highlightAll,\n matchCase: options?.matchCase ?? DEFAULT_OPEN_CANVAS_FIND_OPTIONS.matchCase,\n matchDiacritics: options?.matchDiacritics ?? DEFAULT_OPEN_CANVAS_FIND_OPTIONS.matchDiacritics,\n wholeWords: options?.wholeWords ?? DEFAULT_OPEN_CANVAS_FIND_OPTIONS.wholeWords,\n };\n}\n\nfunction utf8ByteOffsetFromCodeUnitIndex(text: string, codeUnitIndex: number): number {\n const clampedIndex = Math.max(0, Math.min(codeUnitIndex, text.length));\n return textEncoder.encode(text.slice(0, clampedIndex)).byteLength;\n}\n\nfunction codePointBefore(text: string, boundary: number): string | null {\n if (boundary <= 0) {\n return null;\n }\n let start = boundary - 1;\n const low = text.charCodeAt(start);\n if (\n start > 0 &&\n low >= 0xDC00 &&\n low <= 0xDFFF\n ) {\n const high = text.charCodeAt(start - 1);\n if (high >= 0xD800 && high <= 0xDBFF) {\n start -= 1;\n }\n }\n return text.slice(start, boundary);\n}\n\nfunction codePointAt(text: string, boundary: number): string | null {\n const codePoint = text.codePointAt(boundary);\n return codePoint === undefined ? null : String.fromCodePoint(codePoint);\n}\n\nfunction isWordLikeChar(value: string | null): boolean {\n return value !== null && wordLikeCharPattern.test(value);\n}\n\nfunction isWholeWordMatch(text: string, start: number, end: number): boolean {\n return !isWordLikeChar(codePointBefore(text, start)) &&\n !isWordLikeChar(codePointAt(text, end));\n}\n\nfunction buildSearchText(\n source: string,\n options: OpenCanvasResolvedFindOptions,\n): SearchText {\n const tokens: SearchToken[] = [];\n let output = '';\n let sourceIndex = 0;\n for (const segment of source) {\n const start = sourceIndex;\n sourceIndex += segment.length;\n const end = sourceIndex;\n let searchable = options.matchDiacritics\n ? segment\n : segment.normalize('NFD').replace(combiningMarkPattern, '');\n searchable = options.matchCase ? searchable : searchable.toLocaleLowerCase();\n output += searchable;\n for (let index = 0; index < searchable.length; index += 1) {\n tokens.push({ start, end });\n }\n }\n return { text: output, tokens };\n}\n\nexport function findTextInOpenCanvasDocuments(\n documents: readonly OpenCanvasTextDocument[],\n query: string,\n options?: OpenCanvasFindOptions,\n): OpenCanvasFindResults {\n const resolvedOptions = normalizeOpenCanvasFindOptions(options);\n if (query.length === 0) {\n return {\n query,\n options: resolvedOptions,\n matches: [],\n };\n }\n\n const normalizedQuery = buildSearchText(query, resolvedOptions).text;\n if (normalizedQuery.length === 0) {\n return {\n query,\n options: resolvedOptions,\n matches: [],\n };\n }\n\n const matches: OpenCanvasFindMatch[] = [];\n for (const document of documents) {\n const searchableDocument = buildSearchText(document.text, resolvedOptions);\n let searchStart = 0;\n while (searchStart <= searchableDocument.text.length - normalizedQuery.length) {\n const matchStart = searchableDocument.text.indexOf(normalizedQuery, searchStart);\n if (matchStart < 0) {\n break;\n }\n const matchEnd = matchStart + normalizedQuery.length;\n const startToken = searchableDocument.tokens[matchStart];\n const endToken = searchableDocument.tokens[matchEnd - 1];\n if (startToken === undefined || endToken === undefined) {\n break;\n }\n const sourceStart = startToken.start;\n const sourceEnd = endToken.end;\n if (!resolvedOptions.wholeWords || isWholeWordMatch(document.text, sourceStart, sourceEnd)) {\n matches.push({\n handle: document.handle,\n start: utf8ByteOffsetFromCodeUnitIndex(document.text, sourceStart),\n end: utf8ByteOffsetFromCodeUnitIndex(document.text, sourceEnd),\n });\n }\n searchStart = matchStart + Math.max(normalizedQuery.length, 1);\n }\n }\n\n return {\n query,\n options: resolvedOptions,\n matches,\n };\n}\n", "export enum PlatformFamily {\n Unknown = 0,\n Apple = 1,\n Windows = 2,\n Linux = 3,\n}\n\nexport function isMobileBrowser(): boolean {\n const navigatorWithUserAgentData = navigator as Navigator & {\n userAgentData?: {\n mobile?: boolean;\n };\n };\n if (navigatorWithUserAgentData.userAgentData?.mobile === true) {\n return true;\n }\n if (/Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent)) {\n return true;\n }\n return navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1;\n}\n\nexport function detectPlatformFamily(): PlatformFamily {\n const navigatorWithUserAgentData = navigator as Navigator & {\n userAgentData?: {\n platform?: string;\n };\n };\n const platform = (\n navigatorWithUserAgentData.userAgentData?.platform ??\n navigator.platform ??\n navigator.userAgent\n ).toLowerCase();\n if (\n platform.includes('mac') ||\n platform.includes('iphone') ||\n platform.includes('ipad') ||\n platform.includes('ipod') ||\n platform.includes('ios')\n ) {\n return PlatformFamily.Apple;\n }\n if (platform.includes('win')) {\n return PlatformFamily.Windows;\n }\n if (\n platform.includes('linux') ||\n platform.includes('android') ||\n platform.includes('x11') ||\n platform.includes('cros')\n ) {\n return PlatformFamily.Linux;\n }\n return PlatformFamily.Unknown;\n}\n\nexport function isPlatformShortcutKey(\n event: Pick<KeyboardEvent, 'ctrlKey' | 'metaKey' | 'altKey'>,\n platformFamily = detectPlatformFamily(),\n): boolean {\n if (event.altKey) {\n return false;\n }\n if (platformFamily === PlatformFamily.Apple) {\n return event.metaKey && !event.ctrlKey;\n }\n return event.ctrlKey && !event.metaKey;\n}\n", "import type {\n BridgeRuntime,\n OpenCanvasFindMatch,\n OpenCanvasFindState,\n OpenCanvasResolvedFindOptions,\n} from '../core-types';\nimport { DEFAULT_OPEN_CANVAS_FIND_OPTIONS } from './find-session';\nimport { isMobileBrowser, isPlatformShortcutKey } from './platform';\n\ntype FindOptionKey = keyof OpenCanvasResolvedFindOptions;\ntype FindIconKind = 'chevronUp' | 'chevronDown' | 'filter' | 'close';\n\ninterface FindDialogPalette {\n readonly colorScheme: 'dark' | 'light';\n readonly shellBackground: string;\n readonly shellBorder: string;\n readonly divider: string;\n readonly panelBackground: string;\n readonly text: string;\n readonly mutedText: string;\n readonly errorText: string;\n readonly buttonText: string;\n readonly buttonMutedText: string;\n readonly buttonActiveBackground: string;\n readonly buttonPlainHoverBackground: string;\n readonly filterButtonBackground: string;\n readonly filterButtonActiveBackground: string;\n readonly optionHoverBackground: string;\n readonly toggleTrackOff: string;\n readonly toggleTrackOn: string;\n readonly toggleThumb: string;\n}\n\nfunction isFindShortcut(event: Pick<KeyboardEvent, 'key' | 'ctrlKey' | 'metaKey' | 'altKey'>): boolean {\n return isPlatformShortcutKey(event) &&\n (event.key === 'f' || event.key === 'F');\n}\n\nfunction isNextShortcut(event: Pick<KeyboardEvent, 'key' | 'ctrlKey' | 'metaKey' | 'altKey' | 'shiftKey'>): boolean {\n return isPlatformShortcutKey(event) &&\n (event.key === 'g' || event.key === 'G');\n}\n\nfunction createSvgIcon(kind: FindIconKind): SVGSVGElement {\n const ns = 'http://www.w3.org/2000/svg';\n const svg = document.createElementNS(ns, 'svg');\n svg.setAttribute('viewBox', '0 0 16 16');\n svg.setAttribute('fill', 'none');\n svg.setAttribute('stroke', 'currentColor');\n svg.setAttribute('stroke-width', kind === 'filter' ? '1.6' : '1.8');\n svg.setAttribute('stroke-linecap', 'round');\n svg.setAttribute('stroke-linejoin', 'round');\n svg.setAttribute('aria-hidden', 'true');\n svg.style.display = 'block';\n svg.style.width = '16px';\n svg.style.height = '16px';\n\n const appendPath = (d: string): void => {\n const path = document.createElementNS(ns, 'path');\n path.setAttribute('d', d);\n svg.appendChild(path);\n };\n\n switch (kind) {\n case 'chevronUp':\n appendPath('M4.5 10.25L8 6.75L11.5 10.25');\n break;\n case 'chevronDown':\n appendPath('M4.5 5.75L8 9.25L11.5 5.75');\n break;\n case 'filter':\n appendPath('M3 4.5H13');\n appendPath('M5 8H11');\n appendPath('M6.75 11.5H9.25');\n break;\n case 'close':\n appendPath('M4.75 4.75L11.25 11.25');\n appendPath('M11.25 4.75L4.75 11.25');\n break;\n }\n\n return svg;\n}\n\nfunction createIconButton(\n label: string,\n icon: FindIconKind,\n variant: 'plain' | 'filter' = 'plain',\n): HTMLButtonElement {\n const button = document.createElement('button');\n button.type = 'button';\n button.setAttribute('aria-label', label);\n button.setAttribute('data-ed-find-icon-variant', variant);\n button.appendChild(createSvgIcon(icon));\n button.style.width = '32px';\n button.style.height = '32px';\n button.style.display = 'inline-flex';\n button.style.alignItems = 'center';\n button.style.justifyContent = 'center';\n button.style.padding = '0';\n button.style.border = 'none';\n button.style.borderRadius = '10px';\n button.style.background = 'transparent';\n button.style.outline = 'none';\n button.style.appearance = 'none';\n button.style.webkitAppearance = 'none';\n button.style.boxShadow = 'none';\n button.style.cursor = 'pointer';\n button.style.userSelect = 'none';\n button.style.webkitUserSelect = 'none';\n button.style.flex = '0 0 auto';\n button.style.transition = 'background 120ms ease, color 120ms ease, opacity 120ms ease';\n button.dataset.edHovered = '0';\n return button;\n}\n\nfunction sameMatch(left: OpenCanvasFindMatch | null, right: OpenCanvasFindMatch | null): boolean {\n return left?.handle === right?.handle &&\n left?.start === right?.start &&\n left?.end === right?.end;\n}\n\nexport class DesktopFindDialogController {\n private readonly runtime: BridgeRuntime;\n private readonly root: HTMLDivElement;\n private readonly input: HTMLInputElement;\n private readonly status: HTMLSpanElement;\n private readonly advancedPanel: HTMLDivElement;\n private readonly previousButton: HTMLButtonElement;\n private readonly nextButton: HTMLButtonElement;\n private readonly disclosureButton: HTMLButtonElement;\n private readonly closeButton: HTMLButtonElement;\n private readonly optionButtons: Record<FindOptionKey, HTMLButtonElement>;\n private readonly optionTracks: Record<FindOptionKey, HTMLSpanElement>;\n private readonly optionThumbs: Record<FindOptionKey, HTMLSpanElement>;\n private readonly themeMedia: MediaQueryList | null;\n private matches: OpenCanvasFindMatch[] = [];\n private activeMatchIndex = -1;\n private options: OpenCanvasResolvedFindOptions = { ...DEFAULT_OPEN_CANVAS_FIND_OPTIONS };\n private optionsExpanded = false;\n\n private readonly handleThemeChange = (): void => {\n this.syncThemeUi();\n };\n\n public constructor(runtime: BridgeRuntime, _canvas: HTMLCanvasElement) {\n this.runtime = runtime;\n const parent = document.body ?? document.documentElement;\n if (!(parent instanceof HTMLElement)) {\n throw new Error('Expected document root for desktop Find dialog.');\n }\n\n const root = document.createElement('div');\n root.setAttribute('data-ed-find-dialog', '1');\n root.setAttribute('data-ed-open', '0');\n root.setAttribute('role', 'dialog');\n root.setAttribute('aria-label', 'Find on page');\n root.style.position = 'fixed';\n root.style.top = '6px';\n root.style.right = '6px';\n root.style.display = 'none';\n root.style.flexDirection = 'column';\n root.style.width = 'min(356px, calc(100vw - 12px))';\n root.style.boxSizing = 'border-box';\n root.style.borderRadius = '14px';\n root.style.border = '1px solid transparent';\n root.style.overflow = 'hidden';\n root.style.pointerEvents = 'auto';\n root.style.zIndex = '2147483647';\n root.style.boxShadow = '0 10px 24px rgba(0, 0, 0, 0.22)';\n root.style.backdropFilter = 'blur(10px)';\n root.style.font = '500 13px/1.2 system-ui, sans-serif';\n\n const topRow = document.createElement('div');\n topRow.style.display = 'flex';\n topRow.style.alignItems = 'center';\n topRow.style.minHeight = '42px';\n topRow.style.padding = '0 8px 0 12px';\n\n const searchShell = document.createElement('div');\n searchShell.style.flex = '1 1 auto';\n searchShell.style.minWidth = '0';\n searchShell.style.display = 'flex';\n searchShell.style.alignItems = 'center';\n searchShell.style.paddingRight = '6px';\n\n const input = document.createElement('input');\n input.type = 'text';\n input.autocomplete = 'off';\n input.spellcheck = false;\n input.placeholder = 'Find text';\n input.setAttribute('aria-label', 'Find query');\n input.style.width = '100%';\n input.style.minWidth = '0';\n input.style.height = '24px';\n input.style.padding = '0';\n input.style.margin = '0';\n input.style.border = 'none';\n input.style.outline = 'none';\n input.style.background = 'transparent';\n input.style.font = '500 13px/1.2 system-ui, sans-serif';\n searchShell.appendChild(input);\n\n const status = document.createElement('span');\n status.setAttribute('aria-live', 'polite');\n status.style.minWidth = '36px';\n status.style.textAlign = 'center';\n status.style.font = '500 13px/1.2 system-ui, sans-serif';\n status.style.padding = '0 4px 0 2px';\n\n const divider = document.createElement('div');\n divider.setAttribute('aria-hidden', 'true');\n divider.style.width = '1px';\n divider.style.height = '20px';\n divider.style.margin = '0 6px 0 4px';\n divider.style.flex = '0 0 auto';\n\n const previousButton = createIconButton('Previous result', 'chevronUp');\n const nextButton = createIconButton('Next result', 'chevronDown');\n const disclosureButton = createIconButton('Show advanced find options', 'filter', 'filter');\n const closeButton = createIconButton('Close find dialog', 'close');\n\n const navigationGroup = document.createElement('div');\n navigationGroup.style.display = 'flex';\n navigationGroup.style.alignItems = 'center';\n navigationGroup.style.gap = '2px';\n navigationGroup.append(previousButton, nextButton, disclosureButton, closeButton);\n\n topRow.append(searchShell, status, divider, navigationGroup);\n\n const advancedPanel = document.createElement('div');\n advancedPanel.style.display = 'none';\n advancedPanel.style.flexDirection = 'column';\n advancedPanel.style.padding = '2px 0';\n\n const createToggleRow = (\n key: FindOptionKey,\n label: string,\n ): { readonly button: HTMLButtonElement; readonly track: HTMLSpanElement; readonly thumb: HTMLSpanElement } => {\n const button = document.createElement('button');\n button.type = 'button';\n button.setAttribute('data-ed-find-option', key);\n button.setAttribute('aria-label', label);\n button.setAttribute('role', 'switch');\n button.style.width = '100%';\n button.style.height = '38px';\n button.style.display = 'flex';\n button.style.alignItems = 'center';\n button.style.justifyContent = 'space-between';\n button.style.padding = '0 12px';\n button.style.border = 'none';\n button.style.background = 'transparent';\n button.style.cursor = 'pointer';\n button.style.textAlign = 'left';\n button.style.font = '500 12px/1.2 system-ui, sans-serif';\n\n const labelSpan = document.createElement('span');\n labelSpan.textContent = label;\n labelSpan.style.pointerEvents = 'none';\n labelSpan.style.font = 'inherit';\n\n const track = document.createElement('span');\n track.setAttribute('aria-hidden', 'true');\n track.style.position = 'relative';\n track.style.display = 'inline-flex';\n track.style.alignItems = 'center';\n track.style.width = '30px';\n track.style.height = '18px';\n track.style.borderRadius = '999px';\n track.style.transition = 'background 120ms ease';\n track.style.pointerEvents = 'none';\n\n const thumb = document.createElement('span');\n thumb.style.position = 'absolute';\n thumb.style.top = '2px';\n thumb.style.left = '2px';\n thumb.style.width = '14px';\n thumb.style.height = '14px';\n thumb.style.borderRadius = '999px';\n thumb.style.boxShadow = '0 1px 2px rgba(0, 0, 0, 0.24)';\n thumb.style.transition = 'transform 120ms ease';\n thumb.style.pointerEvents = 'none';\n track.appendChild(thumb);\n\n button.append(labelSpan, track);\n return { button, track, thumb };\n };\n\n const highlightAllRow = createToggleRow('highlightAll', 'Highlight all');\n const matchCaseRow = createToggleRow('matchCase', 'Match case');\n const matchDiacriticsRow = createToggleRow('matchDiacritics', 'Match diacritics');\n const wholeWordsRow = createToggleRow('wholeWords', 'Match whole word');\n const optionButtons = {\n highlightAll: highlightAllRow.button,\n matchCase: matchCaseRow.button,\n matchDiacritics: matchDiacriticsRow.button,\n wholeWords: wholeWordsRow.button,\n } satisfies Record<FindOptionKey, HTMLButtonElement>;\n const optionTracks = {\n highlightAll: highlightAllRow.track,\n matchCase: matchCaseRow.track,\n matchDiacritics: matchDiacriticsRow.track,\n wholeWords: wholeWordsRow.track,\n } satisfies Record<FindOptionKey, HTMLSpanElement>;\n const optionThumbs = {\n highlightAll: highlightAllRow.thumb,\n matchCase: matchCaseRow.thumb,\n matchDiacritics: matchDiacriticsRow.thumb,\n wholeWords: wholeWordsRow.thumb,\n } satisfies Record<FindOptionKey, HTMLSpanElement>;\n advancedPanel.append(\n optionButtons.highlightAll,\n optionButtons.matchCase,\n optionButtons.matchDiacritics,\n optionButtons.wholeWords,\n );\n\n root.append(topRow, advancedPanel);\n parent.appendChild(root);\n\n const preserveInputFocus = (): void => {\n this.restoreInputFocus(false);\n };\n const setButtonHovered = (\n button: HTMLButtonElement,\n hovered: boolean,\n ): void => {\n button.dataset.edHovered = hovered ? '1' : '0';\n this.syncStatusUi();\n };\n const bindNonBlurringButton = (\n button: HTMLButtonElement,\n callback: () => void,\n ): void => {\n button.addEventListener('pointerdown', (event) => {\n event.preventDefault();\n });\n button.addEventListener('pointerenter', () => {\n setButtonHovered(button, true);\n });\n button.addEventListener('pointerleave', () => {\n setButtonHovered(button, false);\n });\n button.addEventListener('click', () => {\n callback();\n preserveInputFocus();\n });\n };\n\n root.addEventListener('keydown', (event) => {\n event.stopPropagation();\n });\n input.addEventListener('input', () => {\n this.refreshMatches(false);\n });\n input.addEventListener('keydown', (event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n this.step(event.shiftKey ? -1 : 1);\n return;\n }\n if (event.key === 'ArrowDown' && !event.altKey && !event.ctrlKey && !event.metaKey) {\n event.preventDefault();\n this.step(1);\n return;\n }\n if (event.key === 'ArrowUp' && !event.altKey && !event.ctrlKey && !event.metaKey) {\n event.preventDefault();\n this.step(-1);\n return;\n }\n if (event.key === 'Escape') {\n event.preventDefault();\n this.hide();\n }\n });\n bindNonBlurringButton(previousButton, () => {\n this.step(-1);\n });\n bindNonBlurringButton(nextButton, () => {\n this.step(1);\n });\n bindNonBlurringButton(disclosureButton, () => {\n this.optionsExpanded = !this.optionsExpanded;\n this.syncOptionUi();\n });\n bindNonBlurringButton(closeButton, () => {\n this.hide();\n });\n for (const [key, button] of Object.entries(optionButtons) as [FindOptionKey, HTMLButtonElement][]) {\n bindNonBlurringButton(button, () => {\n this.options = {\n ...this.options,\n [key]: !this.options[key],\n };\n this.syncOptionUi();\n this.refreshMatches(true);\n });\n }\n\n this.root = root;\n this.input = input;\n this.status = status;\n this.advancedPanel = advancedPanel;\n this.previousButton = previousButton;\n this.nextButton = nextButton;\n this.disclosureButton = disclosureButton;\n this.closeButton = closeButton;\n this.optionButtons = optionButtons;\n this.optionTracks = optionTracks;\n this.optionThumbs = optionThumbs;\n this.themeMedia = typeof window.matchMedia === 'function'\n ? window.matchMedia('(prefers-color-scheme: dark)')\n : null;\n this.themeMedia?.addEventListener?.('change', this.handleThemeChange);\n this.syncOptionUi();\n this.syncThemeUi();\n }\n\n public consumeGlobalKeyEvent(event: KeyboardEvent, type: 'down' | 'up'): boolean {\n if (isMobileBrowser()) {\n return false;\n }\n\n if (isFindShortcut(event)) {\n event.preventDefault();\n event.stopPropagation();\n if (type === 'down') {\n this.show();\n }\n return true;\n }\n\n if (type === 'down' && this.isOpen() && !event.altKey && !event.ctrlKey && !event.metaKey && event.key === 'F3') {\n event.preventDefault();\n this.step(event.shiftKey ? -1 : 1);\n return true;\n }\n\n if (type === 'down' && this.isOpen() && isNextShortcut(event)) {\n event.preventDefault();\n this.step(event.shiftKey ? -1 : 1);\n return true;\n }\n\n if (this.containsTarget(event.target)) {\n return true;\n }\n\n return false;\n }\n\n public containsTarget(target: EventTarget | null): boolean {\n return target instanceof Node && this.root.contains(target);\n }\n\n public destroy(): void {\n this.themeMedia?.removeEventListener?.('change', this.handleThemeChange);\n this.root.remove();\n }\n\n private getPalette(): FindDialogPalette {\n const darkMode = this.themeMedia?.matches ?? true;\n if (darkMode) {\n return {\n colorScheme: 'dark',\n shellBackground: 'rgba(36, 36, 36, 0.98)',\n shellBorder: 'rgba(255, 255, 255, 0.08)',\n divider: 'rgba(255, 255, 255, 0.12)',\n panelBackground: 'rgba(0, 0, 0, 0.10)',\n text: '#f5f5f5',\n mutedText: '#cfcfcf',\n errorText: '#fca5a5',\n buttonText: '#d9d9d9',\n buttonMutedText: '#7c7c7c',\n buttonActiveBackground: 'rgba(255, 255, 255, 0.08)',\n buttonPlainHoverBackground: 'rgba(255, 255, 255, 0.06)',\n filterButtonBackground: 'transparent',\n filterButtonActiveBackground: 'rgba(255, 255, 255, 0.20)',\n optionHoverBackground: 'rgba(255, 255, 255, 0.03)',\n toggleTrackOff: '#5a5a5a',\n toggleTrackOn: '#818cf8',\n toggleThumb: '#ffffff',\n };\n }\n return {\n colorScheme: 'light',\n shellBackground: 'rgba(251, 251, 251, 0.98)',\n shellBorder: 'rgba(15, 23, 42, 0.12)',\n divider: 'rgba(15, 23, 42, 0.12)',\n panelBackground: 'rgba(15, 23, 42, 0.03)',\n text: '#111827',\n mutedText: '#4b5563',\n errorText: '#dc2626',\n buttonText: '#374151',\n buttonMutedText: '#9ca3af',\n buttonActiveBackground: 'rgba(15, 23, 42, 0.08)',\n buttonPlainHoverBackground: 'rgba(15, 23, 42, 0.05)',\n filterButtonBackground: 'transparent',\n filterButtonActiveBackground: 'rgba(15, 23, 42, 0.16)',\n optionHoverBackground: 'rgba(15, 23, 42, 0.03)',\n toggleTrackOff: '#d1d5db',\n toggleTrackOn: '#818cf8',\n toggleThumb: '#ffffff',\n };\n }\n\n private isOpen(): boolean {\n return this.root.style.display !== 'none';\n }\n\n private restoreInputFocus(selectAll: boolean): void {\n const selectionStart = this.input.selectionStart ?? this.input.value.length;\n const selectionEnd = this.input.selectionEnd ?? selectionStart;\n queueMicrotask(() => {\n if (!this.isOpen()) {\n return;\n }\n this.input.focus({ preventScroll: true });\n if (selectAll) {\n this.input.select();\n return;\n }\n this.input.setSelectionRange(selectionStart, selectionEnd);\n });\n }\n\n private syncThemeUi(): void {\n const palette = this.getPalette();\n this.root.style.colorScheme = palette.colorScheme;\n this.root.style.background = palette.shellBackground;\n this.root.style.borderColor = palette.shellBorder;\n this.root.style.color = palette.text;\n this.advancedPanel.style.background = palette.panelBackground;\n this.advancedPanel.style.borderTop = this.optionsExpanded ? `1px solid ${palette.divider}` : 'none';\n this.input.style.color = palette.text;\n this.input.style.caretColor = palette.text;\n this.status.style.color = palette.mutedText;\n this.previousButton.style.color = palette.buttonText;\n this.nextButton.style.color = palette.buttonText;\n this.closeButton.style.color = palette.buttonText;\n this.disclosureButton.style.color = palette.buttonText;\n this.previousButton.style.background = 'transparent';\n this.nextButton.style.background = 'transparent';\n this.closeButton.style.background = 'transparent';\n this.disclosureButton.style.background = this.optionsExpanded\n ? palette.filterButtonActiveBackground\n : palette.filterButtonBackground;\n this.syncOptionUi();\n this.syncStatusUi();\n }\n\n private syncOptionUi(): void {\n const palette = this.getPalette();\n this.root.setAttribute('data-ed-open', this.isOpen() ? '1' : '0');\n this.advancedPanel.style.display = this.optionsExpanded ? 'flex' : 'none';\n this.advancedPanel.style.borderTop = this.optionsExpanded ? `1px solid ${palette.divider}` : 'none';\n this.disclosureButton.setAttribute(\n 'aria-label',\n this.optionsExpanded ? 'Hide advanced find options' : 'Show advanced find options',\n );\n for (const [key, button] of Object.entries(this.optionButtons) as [FindOptionKey, HTMLButtonElement][]) {\n const pressed = this.options[key];\n button.setAttribute('aria-checked', pressed ? 'true' : 'false');\n button.style.color = palette.text;\n button.style.background = 'transparent';\n const track = this.optionTracks[key];\n const thumb = this.optionThumbs[key];\n track.style.background = pressed ? palette.toggleTrackOn : palette.toggleTrackOff;\n thumb.style.background = palette.toggleThumb;\n thumb.style.transform = pressed ? 'translateX(12px)' : 'translateX(0)';\n }\n }\n\n private syncStatusUi(): void {\n const palette = this.getPalette();\n const query = this.input.value;\n if (query.length === 0) {\n this.status.textContent = '';\n this.status.style.color = palette.mutedText;\n } else if (this.matches.length === 0 || this.activeMatchIndex < 0) {\n this.status.textContent = '0/0';\n this.status.style.color = palette.errorText;\n } else {\n this.status.textContent = `${String(this.activeMatchIndex + 1)}/${String(this.matches.length)}`;\n this.status.style.color = palette.mutedText;\n }\n const hasMatches = this.matches.length > 0;\n const syncButtonState = (button: HTMLButtonElement, variant: 'plain' | 'filter'): void => {\n button.disabled = !hasMatches && button !== this.disclosureButton && button !== this.closeButton;\n const enabled = !button.disabled;\n const hovered = button.dataset.edHovered === '1';\n button.style.opacity = enabled ? '1' : '0.45';\n button.style.cursor = enabled ? 'pointer' : 'default';\n if (variant === 'filter') {\n if (this.optionsExpanded) {\n button.style.background = palette.filterButtonActiveBackground;\n } else if (enabled && hovered) {\n button.style.background = palette.buttonPlainHoverBackground;\n } else {\n button.style.background = palette.filterButtonBackground;\n }\n } else {\n button.style.background = enabled && hovered\n ? palette.buttonPlainHoverBackground\n : 'transparent';\n }\n button.style.color = enabled ? palette.buttonText : palette.buttonMutedText;\n };\n syncButtonState(this.previousButton, 'plain');\n syncButtonState(this.nextButton, 'plain');\n syncButtonState(this.disclosureButton, 'filter');\n syncButtonState(this.closeButton, 'plain');\n }\n\n private show(): void {\n this.root.style.display = 'flex';\n this.root.setAttribute('data-ed-open', '1');\n this.syncThemeUi();\n this.refreshMatches(true);\n this.restoreInputFocus(true);\n }\n\n private hide(): void {\n this.root.style.display = 'none';\n this.root.setAttribute('data-ed-open', '0');\n this.previousButton.dataset.edHovered = '0';\n this.nextButton.dataset.edHovered = '0';\n this.disclosureButton.dataset.edHovered = '0';\n this.closeButton.dataset.edHovered = '0';\n this.runtime.openCanvasApi.setFindState(null);\n }\n\n private refreshMatches(preserveCurrentMatch: boolean): void {\n const query = this.input.value;\n const previousMatch =\n preserveCurrentMatch && this.activeMatchIndex >= 0\n ? this.matches[this.activeMatchIndex] ?? null\n : null;\n const results = this.runtime.openCanvasApi.findText(query, this.options);\n this.options = { ...results.options };\n this.matches = results.matches.map((match) => ({ ...match }));\n if (this.matches.length === 0) {\n this.activeMatchIndex = -1;\n this.runtime.openCanvasApi.setFindState(null);\n this.syncOptionUi();\n this.syncStatusUi();\n this.restoreInputFocus(false);\n return;\n }\n\n if (previousMatch !== null) {\n const preservedIndex = this.matches.findIndex((entry) => sameMatch(entry, previousMatch));\n this.activeMatchIndex = preservedIndex >= 0 ? preservedIndex : 0;\n } else if (this.activeMatchIndex < 0 || this.activeMatchIndex >= this.matches.length) {\n this.activeMatchIndex = 0;\n }\n\n this.applyCurrentState(true);\n }\n\n private step(delta: 1 | -1): void {\n if (this.matches.length === 0) {\n this.refreshMatches(false);\n return;\n }\n this.activeMatchIndex = (this.activeMatchIndex + delta + this.matches.length) % this.matches.length;\n this.applyCurrentState(true);\n }\n\n private applyCurrentState(revealActive: boolean): void {\n const state: OpenCanvasFindState | null =\n this.matches.length === 0 || this.activeMatchIndex < 0 || this.activeMatchIndex >= this.matches.length\n ? null\n : {\n query: this.input.value,\n options: { ...this.options },\n matches: this.matches.map((match) => ({ ...match })),\n activeMatchIndex: this.activeMatchIndex,\n };\n if (state === null || !this.runtime.openCanvasApi.setFindState(state, revealActive)) {\n this.matches = [];\n this.activeMatchIndex = -1;\n this.runtime.openCanvasApi.setFindState(null);\n }\n this.syncOptionUi();\n this.syncStatusUi();\n this.restoreInputFocus(false);\n }\n}\n", "const PULL_TO_REFRESH_ID = 'effindom-pull-to-refresh';\nconst PULL_TO_REFRESH_TRIGGER_DISTANCE = 88;\nconst PULL_TO_REFRESH_MAX_TRAVEL = 78;\n\nexport const PULL_TO_REFRESH_THRESHOLD = PULL_TO_REFRESH_TRIGGER_DISTANCE;\n\ninterface PullToRefreshElements {\n readonly root: HTMLDivElement;\n readonly icon: HTMLSpanElement;\n}\n\nfunction ensurePullToRefreshElements(): PullToRefreshElements {\n const existing = document.getElementById(PULL_TO_REFRESH_ID);\n if (existing instanceof HTMLDivElement) {\n const icon = existing.firstElementChild;\n if (icon instanceof HTMLSpanElement) {\n return { root: existing, icon };\n }\n existing.remove();\n }\n\n const root = document.createElement('div');\n const icon = document.createElement('span');\n root.id = PULL_TO_REFRESH_ID;\n root.hidden = true;\n root.dataset.visible = 'false';\n root.dataset.armed = 'false';\n root.setAttribute('aria-hidden', 'true');\n root.style.position = 'fixed';\n root.style.left = '50%';\n root.style.top = '12px';\n root.style.width = '48px';\n root.style.height = '48px';\n root.style.display = 'flex';\n root.style.alignItems = 'center';\n root.style.justifyContent = 'center';\n root.style.borderRadius = '999px';\n root.style.background = 'rgba(248, 250, 252, 0.96)';\n root.style.color = '#0f172a';\n root.style.boxShadow = '0 10px 28px rgba(15, 23, 42, 0.22)';\n root.style.backdropFilter = 'blur(12px)';\n root.style.pointerEvents = 'none';\n root.style.opacity = '0';\n root.style.transform = 'translate(-50%, -18px)';\n root.style.transition = 'opacity 120ms ease, transform 120ms ease';\n root.style.zIndex = '2147483647';\n\n icon.textContent = '\u21BB';\n icon.style.display = 'block';\n icon.style.font = '600 24px/1 system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif';\n icon.style.transform = 'rotate(0deg)';\n icon.style.transition = 'transform 90ms linear';\n root.appendChild(icon);\n (document.body ?? document.documentElement).appendChild(root);\n return { root, icon };\n}\n\nexport interface PullToRefreshOverlay {\n show(pullDistance: number): void;\n hide(immediate?: boolean): void;\n destroy(): void;\n}\n\nexport function createPullToRefreshOverlay(): PullToRefreshOverlay {\n const { root, icon } = ensurePullToRefreshElements();\n let visible = false;\n let hideTimer = 0;\n\n return {\n show(pullDistance: number): void {\n if (hideTimer !== 0) {\n window.clearTimeout(hideTimer);\n hideTimer = 0;\n }\n visible = true;\n const distance = Math.max(0, pullDistance);\n const normalized = Math.max(0, Math.min(distance / PULL_TO_REFRESH_TRIGGER_DISTANCE, 1));\n const travel = Math.min(distance * 0.75, PULL_TO_REFRESH_MAX_TRAVEL);\n root.hidden = false;\n root.dataset.visible = 'true';\n root.dataset.armed = normalized >= 1 ? 'true' : 'false';\n root.style.transition = 'none';\n root.style.opacity = distance <= 0 ? '0' : `${0.15 + (normalized * 0.85)}`;\n root.style.transform = `translate(-50%, ${travel - 18}px)`;\n root.style.background = normalized >= 1 ? 'rgba(219, 234, 254, 0.98)' : 'rgba(248, 250, 252, 0.96)';\n icon.style.transform = `rotate(${Math.round(normalized * 360)}deg)`;\n },\n hide(immediate = false): void {\n if (!visible && root.hidden) {\n return;\n }\n visible = false;\n root.dataset.visible = 'false';\n root.dataset.armed = 'false';\n root.style.transition = immediate\n ? 'none'\n : 'opacity 90ms ease-out, transform 90ms ease-out, background 90ms ease-out';\n root.style.opacity = '0';\n root.style.transform = 'translate(-50%, -18px)';\n root.style.background = 'rgba(248, 250, 252, 0.96)';\n icon.style.transform = 'rotate(0deg)';\n if (immediate) {\n if (hideTimer !== 0) {\n window.clearTimeout(hideTimer);\n hideTimer = 0;\n }\n root.hidden = true;\n return;\n }\n hideTimer = window.setTimeout(() => {\n if (root.dataset.visible === 'false') {\n root.hidden = true;\n }\n hideTimer = 0;\n }, 100);\n },\n destroy(): void {\n if (hideTimer !== 0) {\n window.clearTimeout(hideTimer);\n }\n root.remove();\n },\n };\n}\n", "const DEFAULT_LOGICAL_WIDTH = 320;\nconst DEFAULT_LOGICAL_HEIGHT = 220;\n\nexport function ensureCanvasLogicalSize(canvas: HTMLCanvasElement): void {\n const rect = canvas.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) {\n canvas.style.width = `${String(DEFAULT_LOGICAL_WIDTH)}px`;\n canvas.style.height = `${String(DEFAULT_LOGICAL_HEIGHT)}px`;\n }\n}\n\nexport function getCanvasSizeSource(canvas: HTMLCanvasElement): HTMLElement | HTMLCanvasElement {\n const source = canvas.closest('[data-effindom-canvas-size-source]');\n return source instanceof HTMLElement ? source : canvas;\n}\n\nexport function readCanvasLogicalSize(canvas: HTMLCanvasElement): { readonly width: number; readonly height: number } {\n const sizeSource = getCanvasSizeSource(canvas);\n if (sizeSource.clientWidth > 0 && sizeSource.clientHeight > 0) {\n return {\n width: sizeSource.clientWidth,\n height: sizeSource.clientHeight,\n };\n }\n const styleWidth = Number.parseFloat(canvas.style.width);\n const styleHeight = Number.parseFloat(canvas.style.height);\n if (Number.isFinite(styleWidth) && styleWidth > 0 && Number.isFinite(styleHeight) && styleHeight > 0) {\n return { width: styleWidth, height: styleHeight };\n }\n return {\n width: canvas.clientWidth || DEFAULT_LOGICAL_WIDTH,\n height: canvas.clientHeight || DEFAULT_LOGICAL_HEIGHT,\n };\n}\n\nexport function getPointerPosition(\n canvas: HTMLCanvasElement,\n event: { readonly clientX: number; readonly clientY: number },\n): { readonly x: number; readonly y: number } {\n const sizeSource = getCanvasSizeSource(canvas);\n const rect = sizeSource.getBoundingClientRect();\n const logicalSize = readCanvasLogicalSize(canvas);\n const contentLeft = rect.left + sizeSource.clientLeft;\n const contentTop = rect.top + sizeSource.clientTop;\n const displayWidth = sizeSource.clientWidth || (rect.width - (sizeSource.clientLeft + sizeSource.clientLeft)) || DEFAULT_LOGICAL_WIDTH;\n const displayHeight = sizeSource.clientHeight || (rect.height - (sizeSource.clientTop + sizeSource.clientTop)) || DEFAULT_LOGICAL_HEIGHT;\n const x = displayWidth > 0 ? ((event.clientX - contentLeft) / displayWidth) * logicalSize.width : 0;\n const y = displayHeight > 0 ? ((event.clientY - contentTop) / displayHeight) * logicalSize.height : 0;\n return { x, y };\n}\n\nexport function isPointerInsideCanvas(\n canvas: HTMLCanvasElement,\n event: { readonly clientX: number; readonly clientY: number },\n): boolean {\n const rect = getCanvasSizeSource(canvas).getBoundingClientRect();\n return event.clientX >= rect.left &&\n event.clientX <= rect.right &&\n event.clientY >= rect.top &&\n event.clientY <= rect.bottom;\n}\n\nexport function normalizeWheelDelta(event: WheelEvent, canvas: HTMLCanvasElement): { readonly x: number; readonly y: number } {\n let deltaX = event.deltaX;\n let deltaY = event.deltaY;\n if (event.deltaMode === WheelEvent.DOM_DELTA_LINE) {\n deltaX *= 16.0;\n deltaY *= 16.0;\n } else if (event.deltaMode === WheelEvent.DOM_DELTA_PAGE) {\n const logicalSize = readCanvasLogicalSize(canvas);\n deltaX *= logicalSize.width;\n deltaY *= logicalSize.height;\n }\n if (event.shiftKey && Math.abs(deltaX) < 0.001 && Math.abs(deltaY) > 0.0) {\n return { x: deltaY, y: 0.0 };\n }\n return { x: deltaX, y: deltaY };\n}\n", "import type { BridgeRuntime } from '../../core-types';\nimport type { BridgeInteractionState } from '../local-types';\nimport { DesktopFindDialogController } from '../find-dialog';\nimport { computeModifiers } from '../utils/encoding';\nimport { writeUtf8ToHeap } from '../utils/heap';\n\nconst UI_KEY_EVENT_DOWN = 1;\nconst UI_KEY_EVENT_UP = 2;\n\nfunction currentInteractionTimeMs(): bigint {\n return BigInt(Math.floor(performance.now()));\n}\n\nfunction isVerticalCanvasNavigationKey(key: string): boolean {\n return key === 'ArrowUp' ||\n key === 'ArrowDown' ||\n key === 'PageUp' ||\n key === 'PageDown' ||\n key === 'Home' ||\n key === 'End';\n}\n\nfunction isTextNavigationKey(key: string): boolean {\n return key === 'ArrowLeft' ||\n key === 'ArrowRight' ||\n key === 'ArrowUp' ||\n key === 'ArrowDown' ||\n key === 'PageUp' ||\n key === 'PageDown' ||\n key === 'Home' ||\n key === 'End';\n}\n\nexport function installKeyAndWindowHandlers(\n runtime: BridgeRuntime,\n interactionState: BridgeInteractionState,\n desktopFindDialog: DesktopFindDialogController,\n): () => void {\n const { ui } = runtime;\n\n const forwardKeyEvent = (type: number) => (event: KeyboardEvent): void => {\n if (desktopFindDialog.consumeGlobalKeyEvent(event, type === UI_KEY_EVENT_DOWN ? 'down' : 'up')) {\n return;\n }\n const modifiers = computeModifiers(event);\n const activeTextHandle = interactionState.getActiveTextHandle();\n const activeTextEditable = interactionState.getActiveTextEditable();\n const activeTextMultiline = interactionState.getActiveTextMultiline();\n const activeTextInputFocused = interactionState.isActiveTextInputFocused();\n const activeEditableTextOwnsNativeEditingKey =\n activeTextHandle !== null &&\n activeTextEditable &&\n activeTextInputFocused &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey &&\n (\n event.key.length === 1 ||\n (activeTextMultiline && event.key === 'Enter') ||\n event.key === 'Backspace' ||\n event.key === 'Delete'\n );\n const activeEditableTextNeedsRuntimeEditingFallback =\n activeTextHandle !== null &&\n activeTextEditable &&\n !activeTextInputFocused &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey &&\n (\n event.key.length === 1 ||\n (activeTextMultiline && event.key === 'Enter') ||\n event.key === 'Backspace' ||\n event.key === 'Delete'\n );\n if (activeEditableTextOwnsNativeEditingKey) {\n if (\n type === UI_KEY_EVENT_DOWN &&\n (event.key === 'Backspace' || event.key === 'Delete') &&\n interactionState.applyActiveTextDeletion(event.key === 'Delete')\n ) {\n event.preventDefault();\n }\n return;\n }\n const activeTextOwnsRuntimeNavigationKey =\n activeTextHandle !== null &&\n isTextNavigationKey(event.key);\n const activeReadonlyTextOwnsRuntimeKey =\n activeTextHandle !== null &&\n !activeTextEditable &&\n (\n event.key.length === 1 ||\n event.key === 'Backspace' ||\n event.key === 'Delete' ||\n isTextNavigationKey(event.key)\n );\n if (\n activeEditableTextNeedsRuntimeEditingFallback ||\n activeTextOwnsRuntimeNavigationKey ||\n activeReadonlyTextOwnsRuntimeKey\n ) {\n event.preventDefault();\n }\n ui._ui_set_interaction_time(currentInteractionTimeMs());\n const shouldAlwaysPreventDefault =\n event.key === 'Tab' ||\n ((event.ctrlKey || event.metaKey) &&\n (\n event.key === 'c' || event.key === 'C' ||\n event.key === 'a' || event.key === 'A' ||\n event.key === 'x' || event.key === 'X' ||\n event.key === 'v' || event.key === 'V' ||\n event.key === 'z' || event.key === 'Z' ||\n event.key === 'y' || event.key === 'Y'\n ));\n if (shouldAlwaysPreventDefault) {\n event.preventDefault();\n }\n const heapString = writeUtf8ToHeap(ui, event.key);\n let callbackHandled = false;\n try {\n ui._ui_on_key_event(type, heapString.ptr, heapString.len, modifiers);\n if (\n !activeEditableTextNeedsRuntimeEditingFallback &&\n !activeTextOwnsRuntimeNavigationKey &&\n !activeReadonlyTextOwnsRuntimeKey\n ) {\n callbackHandled = window.__effindomCallbacks?.onKeyEventWithKey?.(type, event.key, modifiers) === true;\n }\n } finally {\n heapString.dispose();\n }\n if (\n type === UI_KEY_EVENT_DOWN &&\n (\n callbackHandled ||\n (!event.ctrlKey && !event.altKey && !event.metaKey && isVerticalCanvasNavigationKey(event.key))\n )\n ) {\n event.preventDefault();\n }\n runtime.commitFrame();\n if (interactionState.getActiveTextHandle() !== null && !interactionState.isActiveTextInputFocused()) {\n interactionState.refocusActiveTextInput();\n }\n };\n\n const handleKeyDown = forwardKeyEvent(UI_KEY_EVENT_DOWN);\n const handleKeyUp = forwardKeyEvent(UI_KEY_EVENT_UP);\n const keyListenerCapture = true;\n const reconcileFindSelection = (): void => {\n requestAnimationFrame(() => {\n runtime.syncFindSelection(true);\n });\n };\n const handleWindowBlur = (): void => {\n if (interactionState.getActiveTextHandle() === null) {\n reconcileFindSelection();\n return;\n }\n ui._ui_request_focus(0n);\n runtime.commitFrame();\n reconcileFindSelection();\n };\n const handleWindowFocus = (): void => {\n reconcileFindSelection();\n };\n const handleResize = (): void => {\n runtime.updateCanvasSize();\n runtime.commitFrame();\n };\n\n window.addEventListener('keydown', handleKeyDown, keyListenerCapture);\n window.addEventListener('keyup', handleKeyUp, keyListenerCapture);\n window.addEventListener('blur', handleWindowBlur);\n window.addEventListener('focus', handleWindowFocus);\n window.addEventListener('resize', handleResize);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown, keyListenerCapture);\n window.removeEventListener('keyup', handleKeyUp, keyListenerCapture);\n window.removeEventListener('blur', handleWindowBlur);\n window.removeEventListener('focus', handleWindowFocus);\n window.removeEventListener('resize', handleResize);\n };\n}\n", "import type { BridgeRuntime } from '../core-types';\n\nexport function commitIfVisualWork(runtime: BridgeRuntime): boolean {\n if (!runtime.uiHasPendingVisualWork()) {\n return false;\n }\n runtime.commitFrame();\n return true;\n}\n\n", "export class PointerMoveCoalescer<T> {\n private pendingMove: T | null = null;\n private frameScheduled = false;\n\n constructor(private readonly flushMove: (move: T) => void) {}\n\n enqueue(move: T): void {\n this.pendingMove = move;\n this.scheduleFlush();\n }\n\n takePending(): T | null {\n const pending = this.pendingMove;\n this.pendingMove = null;\n return pending;\n }\n\n clear(): void {\n this.pendingMove = null;\n }\n\n private scheduleFlush(): void {\n if (this.frameScheduled) {\n return;\n }\n this.frameScheduled = true;\n requestAnimationFrame(() => {\n this.frameScheduled = false;\n const pending = this.pendingMove;\n this.pendingMove = null;\n if (pending === null) {\n return;\n }\n this.flushMove(pending);\n if (this.pendingMove !== null) {\n this.scheduleFlush();\n }\n });\n }\n}\n\n", "import type { BridgeRuntime } from '../../core-types';\nimport { handleToBigInt } from '../utils/encoding';\n\nfunction pointInSemanticBounds(\n bounds: { readonly x: number; readonly y: number; readonly width: number; readonly height: number },\n x: number,\n y: number,\n): boolean {\n return x >= bounds.x &&\n x <= (bounds.x + bounds.width) &&\n y >= bounds.y &&\n y <= (bounds.y + bounds.height);\n}\n\nexport function findSemanticTextboxHandleAtPoint(runtime: BridgeRuntime, x: number, y: number): bigint {\n const tree = runtime.getSemanticTree();\n for (let i = tree.length - 1; i >= 0; i -= 1) {\n const node = tree[i];\n if (node?.roleName !== 'textbox') {\n continue;\n }\n if (pointInSemanticBounds(node.bounds, x, y)) {\n return handleToBigInt(node.handle);\n }\n }\n return 0n;\n}\n", "/**\n * Touch gesture state machine.\n * Models the lifecycle of touch interactions from pointer-down through scroll/tap completion.\n */\n\nexport type TouchGesturePhase = 'pressed' | 'scrolling';\n\nexport interface TouchGestureState {\n pointerId: number;\n phase: TouchGesturePhase;\n startX: number;\n startY: number;\n lastX: number;\n lastY: number;\n startedOnTextbox: boolean;\n pendingTapTextHandle: bigint | null;\n axisMode: 'x' | 'y' | 'xy' | null;\n pullToRefreshEligible: boolean;\n pullToRefreshCaptured: boolean;\n pullToRefreshDistance: number;\n // Note: breakoutTravel is tracked separately outside the reducer to avoid churn;\n // see touchGestureBreakoutTravel in events.ts\n}\n\nexport type TouchGestureEvent =\n | {\n type: 'press-start';\n pointerId: number;\n x: number;\n y: number;\n startedOnTextbox: boolean;\n pendingTextHandle: bigint | null;\n }\n | {\n type: 'move';\n x: number;\n y: number;\n }\n | {\n type: 'scroll-threshold-crossed';\n axis: 'x' | 'y';\n }\n | {\n type: 'axis-unlocked';\n }\n | {\n type: 'pull-to-refresh-captured';\n }\n | {\n type: 'pull-to-refresh-released';\n }\n | {\n type: 'cancel';\n }\n | {\n type: 'ended';\n triggered: boolean;\n };\n\n/**\n * Transition reducer for touch gesture state.\n * Returns the new state after applying an event, or null if the gesture ended.\n */\nexport function transitionTouchGesture(\n state: TouchGestureState | null,\n event: TouchGestureEvent,\n): TouchGestureState | null {\n if (state === null) {\n if (event.type === 'press-start') {\n return {\n pointerId: event.pointerId,\n phase: 'pressed',\n startX: event.x,\n startY: event.y,\n lastX: event.x,\n lastY: event.y,\n startedOnTextbox: event.startedOnTextbox,\n pendingTapTextHandle: event.pendingTextHandle,\n axisMode: null,\n pullToRefreshEligible: false,\n pullToRefreshCaptured: false,\n pullToRefreshDistance: 0.0,\n };\n }\n return null;\n }\n\n switch (state.phase) {\n case 'pressed': {\n switch (event.type) {\n case 'scroll-threshold-crossed': {\n const primaryAxis = event.axis;\n return {\n ...state,\n phase: 'scrolling',\n axisMode: primaryAxis,\n pullToRefreshEligible: primaryAxis === 'y',\n pendingTapTextHandle: null,\n };\n }\n case 'move': {\n return {\n ...state,\n lastX: event.x,\n lastY: event.y,\n };\n }\n case 'cancel':\n case 'ended': {\n return null;\n }\n default: {\n return state;\n }\n }\n }\n\n case 'scrolling': {\n switch (event.type) {\n case 'move': {\n return {\n ...state,\n lastX: event.x,\n lastY: event.y,\n };\n }\n case 'axis-unlocked': {\n return {\n ...state,\n axisMode: 'xy',\n pullToRefreshEligible: false,\n pullToRefreshCaptured: false,\n pullToRefreshDistance: 0.0,\n };\n }\n case 'pull-to-refresh-captured': {\n return {\n ...state,\n pullToRefreshCaptured: true,\n };\n }\n case 'pull-to-refresh-released': {\n return {\n ...state,\n pullToRefreshCaptured: false,\n pullToRefreshDistance: 0.0,\n };\n }\n case 'cancel':\n case 'ended': {\n return null;\n }\n default: {\n return state;\n }\n }\n }\n }\n}\n", "import type { BridgeRuntime } from '../../core-types';\nimport type { BridgeInteractionState } from '../local-types';\nimport { commitIfVisualWork } from '../commit-policy';\nimport { PointerMoveCoalescer } from '../pointer-move-coalescer';\nimport { PULL_TO_REFRESH_THRESHOLD, type PullToRefreshOverlay } from '../pull-to-refresh';\nimport {\n getPointerPosition,\n isPointerInsideCanvas,\n normalizeWheelDelta,\n} from './canvas-geometry';\nimport { findSemanticTextboxHandleAtPoint } from './semantic-hit-testing';\nimport {\n type TouchGestureState,\n transitionTouchGesture,\n} from '../touch-gesture';\nimport { computeModifiers, handleToBigInt } from '../utils/encoding';\n\nconst UI_EVENT_POINTER_DOWN = 1;\nconst UI_EVENT_POINTER_UP = 2;\nconst UI_EVENT_POINTER_MOVE = 3;\nconst UI_EVENT_POINTER_LEAVE = 5;\nconst EDGE_AUTOSCROLL_THRESHOLD = 30;\nconst TOUCH_SCROLL_THRESHOLD = 8;\nconst TOUCH_AXIS_LOCK_DOMINANCE_RATIO = 1.25;\nconst TOUCH_AXIS_BREAKOUT_DISTANCE = 32;\nconst TOUCH_AXIS_BREAKOUT_RATIO = 0.72;\nconst TOUCH_AXIS_BREAKOUT_STEP_THRESHOLD = 8;\n\ninterface PendingPointerMove {\n handle: bigint;\n x: number;\n y: number;\n clientX: number;\n clientY: number;\n pointerInsideCanvas: boolean;\n modifiers: number;\n}\n\nfunction resolvePrimaryTouchAxis(deltaX: number, deltaY: number): 'x' | 'y' {\n const absX = Math.abs(deltaX);\n const absY = Math.abs(deltaY);\n if (absX >= absY * TOUCH_AXIS_LOCK_DOMINANCE_RATIO) {\n return 'x';\n }\n if (absY >= absX * TOUCH_AXIS_LOCK_DOMINANCE_RATIO) {\n return 'y';\n }\n return absX >= absY ? 'x' : 'y';\n}\n\nfunction shouldUnlockTouchAxis(axisMode: 'x' | 'y' | 'xy' | null, travelX: number, travelY: number): boolean {\n if (axisMode === null || axisMode === 'xy') {\n return false;\n }\n const primaryTravel = axisMode === 'x' ? travelX : travelY;\n const secondaryTravel = axisMode === 'x' ? travelY : travelX;\n if (primaryTravel < TOUCH_AXIS_BREAKOUT_DISTANCE || secondaryTravel < TOUCH_AXIS_BREAKOUT_DISTANCE) {\n return false;\n }\n return secondaryTravel >= TOUCH_AXIS_BREAKOUT_DISTANCE &&\n secondaryTravel >= primaryTravel * TOUCH_AXIS_BREAKOUT_RATIO;\n}\n\nfunction currentInteractionTimeMs(): bigint {\n return BigInt(Math.floor(performance.now()));\n}\n\nfunction semanticRoleAtHandle(runtime: BridgeRuntime, handle: bigint): string | null {\n const handleKey = handle.toString();\n const node = runtime.getSemanticTree().find((entry) => entry.handle === handleKey);\n return node?.roleName ?? null;\n}\n\nexport function installPointerHandlers(\n runtime: BridgeRuntime,\n interactionState: BridgeInteractionState,\n pullToRefresh: PullToRefreshOverlay,\n): () => void {\n const { canvas, ui } = runtime;\n let primaryPointerDown = false;\n let activePrimaryPointerId: number | null = null;\n let suppressedContextMenuPointerId: number | null = null;\n let edgeAutoScrollTickScheduled = false;\n let activePrimaryPointerType: string | null = null;\n let activeTouchGesture: TouchGestureState | null = null;\n let touchGestureBreakoutTravel = { x: 0.0, y: 0.0 };\n\n const applySelectionAutoScroll = (x: number, y: number): void => {\n if (!primaryPointerDown || activePrimaryPointerType === 'touch') {\n return;\n }\n if (handleToBigInt(ui._ui_selection_autoscroll(x, y, EDGE_AUTOSCROLL_THRESHOLD)) === 0n) {\n return;\n }\n runtime.flushPendingCommit();\n runtime.requestFrame();\n };\n\n const processPointerMove = (pending: PendingPointerMove): void => {\n interactionState.setPointerInsideCanvas(pending.pointerInsideCanvas);\n interactionState.setLastPointerClientPosition(pending.clientX, pending.clientY);\n interactionState.setLastPointerPosition(pending.x, pending.y);\n interactionState.setLastPointerModifiers(pending.modifiers);\n ui._ui_set_interaction_time(currentInteractionTimeMs());\n ui._ui_on_pointer_event(UI_EVENT_POINTER_MOVE, pending.handle, pending.x, pending.y);\n commitIfVisualWork(runtime);\n if (pending.handle === 0n) {\n const appCapturedHandle = runtime.getCapturedPointerHandle();\n if (appCapturedHandle !== null) {\n window.__effindomCallbacks?.onPointerEventWithCoords?.(\n UI_EVENT_POINTER_MOVE,\n appCapturedHandle,\n pending.x,\n pending.y,\n pending.modifiers,\n );\n }\n }\n applySelectionAutoScroll(pending.x, pending.y);\n scheduleEdgeAutoScrollTick();\n };\n const pointerMoveCoalescer = new PointerMoveCoalescer<PendingPointerMove>(processPointerMove);\n\n const scheduleEdgeAutoScrollTick = (): void => {\n if (edgeAutoScrollTickScheduled || !primaryPointerDown || activePrimaryPointerType === 'touch') {\n return;\n }\n edgeAutoScrollTickScheduled = true;\n requestAnimationFrame(() => {\n edgeAutoScrollTickScheduled = false;\n if (!primaryPointerDown) {\n return;\n }\n const { x, y } = interactionState.getLastPointerPosition();\n if (handleToBigInt(ui._ui_selection_autoscroll(x, y, EDGE_AUTOSCROLL_THRESHOLD)) === 0n) {\n return;\n }\n runtime.commitFrame();\n runtime.flushPendingCommit();\n runtime.requestFrame();\n scheduleEdgeAutoScrollTick();\n });\n };\n\n const releaseCanvasPointerCapture = (pointerId: number): void => {\n if (canvas.hasPointerCapture(pointerId)) {\n canvas.releasePointerCapture(pointerId);\n }\n };\n\n const captureCanvasPointer = (pointerId: number): void => {\n try {\n canvas.setPointerCapture(pointerId);\n } catch {\n // Synthetic touch events in tests and some browser/device combinations can reject explicit capture.\n }\n };\n\n const cancelPressedPointerInteraction = (x: number, y: number): void => {\n const capturedHandle = interactionState.getCapturedPointerHandle();\n interactionState.setCapturedPointerHandle(null);\n primaryPointerDown = false;\n activePrimaryPointerId = null;\n activePrimaryPointerType = null;\n pointerMoveCoalescer.clear();\n ui._ui_set_interaction_time(currentInteractionTimeMs());\n ui._ui_on_pointer_event(UI_EVENT_POINTER_LEAVE, capturedHandle ?? 0n, x, y);\n runtime.commitFrame();\n };\n\n const handleTouchPointerScroll = (\n event: PointerEvent,\n position: { readonly x: number; readonly y: number },\n modifiers: number,\n ): boolean => {\n if (event.pointerType !== 'touch' || activeTouchGesture?.pointerId !== event.pointerId) {\n return false;\n }\n\n const deltaFromStartX = position.x - activeTouchGesture.startX;\n const deltaFromStartY = position.y - activeTouchGesture.startY;\n const distanceSquared = (deltaFromStartX * deltaFromStartX) + (deltaFromStartY * deltaFromStartY);\n\n if (activeTouchGesture.phase === 'pressed') {\n if (distanceSquared < TOUCH_SCROLL_THRESHOLD * TOUCH_SCROLL_THRESHOLD) {\n event.preventDefault();\n return true;\n }\n const primaryAxis = resolvePrimaryTouchAxis(deltaFromStartX, deltaFromStartY);\n activeTouchGesture = transitionTouchGesture(activeTouchGesture, {\n type: 'scroll-threshold-crossed',\n axis: primaryAxis,\n });\n if (activeTouchGesture === null) {\n return true;\n }\n interactionState.cancelTouchTextFocusDeferral();\n cancelPressedPointerInteraction(position.x, position.y);\n ui._ui_touch_scroll_begin(\n runtime.getHandleFromPoint(activeTouchGesture.startX, activeTouchGesture.startY),\n activeTouchGesture.startX,\n activeTouchGesture.startY,\n );\n touchGestureBreakoutTravel = { x: 0.0, y: 0.0 };\n }\n\n const prevState = activeTouchGesture;\n activeTouchGesture = transitionTouchGesture(activeTouchGesture, {\n type: 'move',\n x: position.x,\n y: position.y,\n });\n if (activeTouchGesture === null) {\n return true;\n }\n\n const deltaX = prevState.lastX - position.x;\n const deltaY = prevState.lastY - position.y;\n const absDeltaX = Math.abs(deltaX);\n const absDeltaY = Math.abs(deltaY);\n\n if (absDeltaX >= TOUCH_AXIS_BREAKOUT_STEP_THRESHOLD && absDeltaY >= TOUCH_AXIS_BREAKOUT_STEP_THRESHOLD) {\n touchGestureBreakoutTravel.x += absDeltaX;\n touchGestureBreakoutTravel.y += absDeltaY;\n } else {\n touchGestureBreakoutTravel = { x: 0.0, y: 0.0 };\n }\n\n if (shouldUnlockTouchAxis(\n activeTouchGesture.axisMode,\n touchGestureBreakoutTravel.x,\n touchGestureBreakoutTravel.y,\n )) {\n activeTouchGesture = transitionTouchGesture(activeTouchGesture, {\n type: 'axis-unlocked',\n });\n if (activeTouchGesture === null) {\n return true;\n }\n touchGestureBreakoutTravel = { x: 0.0, y: 0.0 };\n }\n\n const scrollDeltaX = activeTouchGesture.axisMode === 'x' || activeTouchGesture.axisMode === 'xy' ? deltaX : 0.0;\n const scrollDeltaY = activeTouchGesture.axisMode === 'y' || activeTouchGesture.axisMode === 'xy' ? deltaY : 0.0;\n\n if (!activeTouchGesture.startedOnTextbox && !activeTouchGesture.pullToRefreshCaptured) {\n const canCapturePullToRefresh =\n activeTouchGesture.pullToRefreshEligible &&\n deltaFromStartY > 0.0 &&\n ui._ui_touch_scroll_allows_pull_to_refresh() !== 0;\n if (canCapturePullToRefresh) {\n activeTouchGesture = transitionTouchGesture(activeTouchGesture, {\n type: 'pull-to-refresh-captured',\n }) ?? activeTouchGesture;\n }\n }\n\n const appliedScrollDeltaY = activeTouchGesture.pullToRefreshCaptured ? 0.0 : scrollDeltaY;\n\n interactionState.setPointerInsideCanvas(isPointerInsideCanvas(canvas, event));\n interactionState.setLastPointerClientPosition(event.clientX, event.clientY);\n interactionState.setLastPointerPosition(position.x, position.y);\n interactionState.setLastPointerModifiers(modifiers);\n ui._ui_set_interaction_time(currentInteractionTimeMs());\n ui._ui_on_pointer_event(UI_EVENT_POINTER_MOVE, runtime.getHandleFromPoint(position.x, position.y), position.x, position.y);\n ui._ui_touch_scroll_update(scrollDeltaX, appliedScrollDeltaY);\n\n const pullToRefreshDistance = activeTouchGesture.pullToRefreshCaptured\n ? Math.max(0.0, deltaFromStartY)\n : 0.0;\n\n activeTouchGesture.pullToRefreshDistance = pullToRefreshDistance;\n\n if (activeTouchGesture.pullToRefreshCaptured) {\n pullToRefresh.show(pullToRefreshDistance);\n } else {\n pullToRefresh.hide();\n }\n runtime.commitFrame();\n event.preventDefault();\n return true;\n };\n\n const forwardPointerEvent = (type: number, useHitTest = true) => (event: PointerEvent): void => {\n const modifiers = computeModifiers(event);\n const pointerInsideCanvas = type === UI_EVENT_POINTER_LEAVE ? false : isPointerInsideCanvas(canvas, event);\n const position = getPointerPosition(canvas, event);\n if (event.pointerType === 'touch' && event.cancelable) {\n event.preventDefault();\n }\n if (type === UI_EVENT_POINTER_DOWN && event.button === 2) {\n window.__effindomCallbacks?.onBeforeContextMenuHitTest?.();\n const handle = runtime.getHandleFromPoint(position.x, position.y);\n const activeTextHandle = interactionState.getActiveTextHandle();\n const refocusActiveTextInputAfterContextMenu =\n activeTextHandle !== null &&\n handle === activeTextHandle;\n suppressedContextMenuPointerId = event.pointerId;\n interactionState.setPointerInsideCanvas(pointerInsideCanvas);\n interactionState.setLastPointerClientPosition(event.clientX, event.clientY);\n interactionState.setLastPointerPosition(position.x, position.y);\n interactionState.setLastPointerModifiers(modifiers);\n if (!refocusActiveTextInputAfterContextMenu) {\n canvas.focus({ preventScroll: true });\n }\n ui._ui_set_interaction_time(currentInteractionTimeMs());\n window.__effindomCallbacks?.onContextMenu?.(\n handle,\n position.x,\n position.y,\n );\n if (refocusActiveTextInputAfterContextMenu) {\n interactionState.refocusActiveTextInput();\n }\n event.preventDefault();\n return;\n }\n if (suppressedContextMenuPointerId === event.pointerId) {\n interactionState.setPointerInsideCanvas(pointerInsideCanvas);\n interactionState.setLastPointerClientPosition(event.clientX, event.clientY);\n interactionState.setLastPointerPosition(position.x, position.y);\n interactionState.setLastPointerModifiers(modifiers);\n if (type === UI_EVENT_POINTER_UP || type === UI_EVENT_POINTER_LEAVE) {\n suppressedContextMenuPointerId = null;\n }\n event.preventDefault();\n return;\n }\n const isTouchEvent = event.pointerType === 'touch';\n const isPointerCancel = event.type === 'pointercancel';\n let touchTapCandidateHandle: bigint | null = null;\n let touchTapDiscarded = false;\n\n if (type === UI_EVENT_POINTER_DOWN) {\n captureCanvasPointer(event.pointerId);\n primaryPointerDown = true;\n activePrimaryPointerId = event.pointerId;\n activePrimaryPointerType = event.pointerType;\n if (isTouchEvent) {\n ui._ui_clear_momentum_scroll();\n\n activeTouchGesture = transitionTouchGesture(null, {\n type: 'press-start',\n pointerId: event.pointerId,\n x: position.x,\n y: position.y,\n startedOnTextbox: false,\n pendingTextHandle: null,\n });\n touchGestureBreakoutTravel = { x: 0.0, y: 0.0 };\n }\n } else if (activeTouchGesture !== null && activeTouchGesture.pointerId === event.pointerId) {\n if (type === UI_EVENT_POINTER_MOVE && handleTouchPointerScroll(event, position, modifiers)) {\n return;\n }\n if (type === UI_EVENT_POINTER_UP || type === UI_EVENT_POINTER_LEAVE) {\n const pendingTapTextHandle = activeTouchGesture.pendingTapTextHandle;\n const wasCancelled = isPointerCancel || type === UI_EVENT_POINTER_LEAVE;\n const scrolling = activeTouchGesture.phase === 'scrolling';\n const pullToRefreshDistance = activeTouchGesture.pullToRefreshDistance;\n\n activeTouchGesture = transitionTouchGesture(activeTouchGesture, {\n type: wasCancelled ? 'cancel' : 'ended',\n triggered: false,\n });\n\n const triggerRefresh = scrolling && pullToRefreshDistance >= PULL_TO_REFRESH_THRESHOLD;\n if (scrolling) {\n interactionState.cancelTouchTextFocusDeferral();\n interactionState.setCapturedPointerHandle(null);\n primaryPointerDown = false;\n activePrimaryPointerId = null;\n activePrimaryPointerType = null;\n pointerMoveCoalescer.clear();\n ui._ui_touch_scroll_end();\n if (triggerRefresh) {\n pullToRefresh.hide(true);\n window.location.reload();\n } else {\n pullToRefresh.hide();\n }\n releaseCanvasPointerCapture(event.pointerId);\n event.preventDefault();\n return;\n }\n if (wasCancelled || type !== UI_EVENT_POINTER_UP) {\n interactionState.cancelTouchTextFocusDeferral();\n touchTapDiscarded = true;\n } else {\n touchTapCandidateHandle = pendingTapTextHandle;\n }\n pullToRefresh.hide(true);\n }\n }\n const capturedHandle = interactionState.getCapturedPointerHandle();\n const activeTextHandle = interactionState.getActiveTextHandle();\n const rawHitHandle = useHitTest ? runtime.getHandleFromPoint(position.x, position.y) : 0n;\n const semanticTextboxHandle =\n (type === UI_EVENT_POINTER_DOWN || activeTextHandle !== null) && useHitTest\n ? findSemanticTextboxHandleAtPoint(runtime, position.x, position.y)\n : 0n;\n const shouldPreferSemanticTextbox =\n semanticTextboxHandle !== 0n &&\n (rawHitHandle === 0n || semanticRoleAtHandle(runtime, rawHitHandle) !== 'textbox') &&\n (type === UI_EVENT_POINTER_DOWN ||\n semanticTextboxHandle === activeTextHandle ||\n semanticTextboxHandle === capturedHandle);\n const hitHandle = shouldPreferSemanticTextbox ? semanticTextboxHandle : rawHitHandle;\n const handle = type === UI_EVENT_POINTER_DOWN\n ? hitHandle\n : ((useHitTest && pointerInsideCanvas) ? hitHandle : (capturedHandle ?? hitHandle));\n const refocusActiveTextInputAfterPointerDown =\n type === UI_EVENT_POINTER_DOWN &&\n activeTextHandle !== null &&\n handle === activeTextHandle &&\n !isTouchEvent;\n const delayCanvasFocusUntilAfterPointerDown =\n type === UI_EVENT_POINTER_DOWN &&\n activeTextHandle !== null &&\n handle !== activeTextHandle;\n const keepTouchEditorFocusedOnPointerDown =\n type === UI_EVENT_POINTER_DOWN &&\n isTouchEvent &&\n activeTextHandle !== null &&\n handle === activeTextHandle &&\n interactionState.isActiveTextInputFocused();\n const refocusActiveTextInputAfterPointerUp =\n type === UI_EVENT_POINTER_UP &&\n activeTextHandle !== null &&\n handle === activeTextHandle &&\n !isTouchEvent;\n const shouldCommitDeferredTouchFocus =\n isTouchEvent &&\n type === UI_EVENT_POINTER_UP &&\n !touchTapDiscarded &&\n touchTapCandidateHandle !== null &&\n handle === touchTapCandidateHandle;\n if (type === UI_EVENT_POINTER_UP || type === UI_EVENT_POINTER_LEAVE) {\n const pending = pointerMoveCoalescer.takePending();\n if (pending !== null) {\n processPointerMove(pending);\n }\n }\n if (type === UI_EVENT_POINTER_DOWN) {\n if (isTouchEvent) {\n const touchDownTextboxHandle = semanticRoleAtHandle(runtime, handle) === 'textbox' ? handle : 0n;\n if (touchDownTextboxHandle !== 0n) {\n const touchDownOnAlreadyFocusedText =\n activeTextHandle !== null &&\n touchDownTextboxHandle === activeTextHandle &&\n interactionState.isActiveTextInputFocused();\n if (activeTouchGesture !== null) {\n activeTouchGesture.startedOnTextbox = true;\n activeTouchGesture.pendingTapTextHandle = touchDownOnAlreadyFocusedText ? null : touchDownTextboxHandle;\n }\n interactionState.beginTouchTextFocusDeferral(touchDownTextboxHandle);\n } else {\n interactionState.cancelTouchTextFocusDeferral();\n }\n }\n interactionState.setPointerInsideCanvas(pointerInsideCanvas);\n interactionState.setLastPointerClientPosition(event.clientX, event.clientY);\n interactionState.setLastPointerPosition(position.x, position.y);\n interactionState.setLastPointerModifiers(modifiers);\n if (!refocusActiveTextInputAfterPointerDown &&\n !delayCanvasFocusUntilAfterPointerDown &&\n !keepTouchEditorFocusedOnPointerDown) {\n canvas.focus({ preventScroll: true });\n }\n interactionState.setCapturedPointerHandle(handle === 0n ? null : handle);\n ui._ui_set_interaction_time(currentInteractionTimeMs());\n ui._ui_on_pointer_event(type, handle, position.x, position.y);\n runtime.commitFrame();\n if (delayCanvasFocusUntilAfterPointerDown && interactionState.getActiveTextHandle() === null) {\n canvas.focus({ preventScroll: true });\n }\n if (refocusActiveTextInputAfterPointerDown) {\n interactionState.refocusActiveTextInput();\n } else if (!isTouchEvent && interactionState.getActiveTextHandle() !== null && !interactionState.isActiveTextInputFocused()) {\n interactionState.refocusActiveTextInput();\n }\n scheduleEdgeAutoScrollTick();\n } else if (type === UI_EVENT_POINTER_MOVE) {\n pointerMoveCoalescer.enqueue({\n handle,\n x: position.x,\n y: position.y,\n clientX: event.clientX,\n clientY: event.clientY,\n pointerInsideCanvas,\n modifiers,\n });\n return;\n } else {\n interactionState.setPointerInsideCanvas(pointerInsideCanvas);\n interactionState.setLastPointerClientPosition(event.clientX, event.clientY);\n interactionState.setLastPointerPosition(position.x, position.y);\n interactionState.setLastPointerModifiers(modifiers);\n ui._ui_set_interaction_time(currentInteractionTimeMs());\n ui._ui_on_pointer_event(type, handle, position.x, position.y);\n runtime.commitFrame();\n if (shouldCommitDeferredTouchFocus) {\n interactionState.commitTouchTextFocusDeferral(handle);\n } else if (refocusActiveTextInputAfterPointerUp) {\n interactionState.refocusActiveTextInput();\n } else if (!isTouchEvent && interactionState.getActiveTextHandle() !== null && !interactionState.isActiveTextInputFocused()) {\n interactionState.refocusActiveTextInput();\n }\n if (isTouchEvent && type === UI_EVENT_POINTER_UP && !shouldCommitDeferredTouchFocus) {\n interactionState.cancelTouchTextFocusDeferral();\n }\n if (handle === 0n) {\n const appCapturedHandle = runtime.getCapturedPointerHandle();\n if (appCapturedHandle !== null) {\n window.__effindomCallbacks?.onPointerEventWithCoords?.(type, appCapturedHandle, position.x, position.y, modifiers);\n }\n }\n scheduleEdgeAutoScrollTick();\n }\n if (type === UI_EVENT_POINTER_UP || type === UI_EVENT_POINTER_LEAVE) {\n primaryPointerDown = false;\n activePrimaryPointerId = null;\n activePrimaryPointerType = null;\n interactionState.setCapturedPointerHandle(null);\n }\n if (type === UI_EVENT_POINTER_UP || type === UI_EVENT_POINTER_LEAVE) {\n releaseCanvasPointerCapture(event.pointerId);\n }\n };\n\n const handleContextMenu = (event: Event): void => {\n event.preventDefault();\n };\n const handlePointerDown = forwardPointerEvent(UI_EVENT_POINTER_DOWN);\n const handlePointerUp = forwardPointerEvent(UI_EVENT_POINTER_UP);\n const handlePointerMove = forwardPointerEvent(UI_EVENT_POINTER_MOVE);\n const handleCapturedPointerExit = (event: PointerEvent): void => {\n if (canvas.hasPointerCapture(event.pointerId)) {\n if (primaryPointerDown) {\n forwardPointerEvent(UI_EVENT_POINTER_MOVE, false)(event);\n }\n return;\n }\n forwardPointerEvent(UI_EVENT_POINTER_LEAVE, false)(event);\n };\n const handlePointerLeave = (event: PointerEvent): void => {\n handleCapturedPointerExit(event);\n };\n const handlePointerOut = (event: PointerEvent): void => {\n handleCapturedPointerExit(event);\n };\n const handlePointerCancel = (event: PointerEvent): void => {\n forwardPointerEvent(UI_EVENT_POINTER_LEAVE, false)(event);\n };\n const shouldHandleWindowPointerEvent = (event: PointerEvent): boolean => {\n return primaryPointerDown &&\n activePrimaryPointerId !== null &&\n event.pointerId === activePrimaryPointerId &&\n event.target !== canvas;\n };\n const handleWindowPointerMove = (event: PointerEvent): void => {\n if (!shouldHandleWindowPointerEvent(event)) {\n return;\n }\n handlePointerMove(event);\n };\n const handleWindowPointerUp = (event: PointerEvent): void => {\n if (!shouldHandleWindowPointerEvent(event)) {\n return;\n }\n handlePointerUp(event);\n };\n const handleWindowPointerCancel = (event: PointerEvent): void => {\n if (!shouldHandleWindowPointerEvent(event)) {\n return;\n }\n handlePointerCancel(event);\n };\n const handleWheel = (event: WheelEvent): void => {\n event.preventDefault();\n const position = getPointerPosition(canvas, event);\n interactionState.setPointerInsideCanvas(isPointerInsideCanvas(canvas, event));\n interactionState.setLastPointerClientPosition(event.clientX, event.clientY);\n interactionState.setLastPointerPosition(position.x, position.y);\n interactionState.setLastPointerModifiers(computeModifiers(event));\n ui._ui_set_interaction_time(currentInteractionTimeMs());\n const handle = runtime.getHandleFromPoint(position.x, position.y);\n ui._ui_on_pointer_event(UI_EVENT_POINTER_MOVE, handle, position.x, position.y);\n const delta = normalizeWheelDelta(event, canvas);\n ui._ui_on_wheel_event(delta.x, delta.y);\n commitIfVisualWork(runtime);\n };\n\n canvas.addEventListener('contextmenu', handleContextMenu);\n canvas.addEventListener('pointerdown', handlePointerDown, { passive: false });\n canvas.addEventListener('pointerup', handlePointerUp, { passive: false });\n canvas.addEventListener('pointermove', handlePointerMove, { passive: false });\n canvas.addEventListener('pointerleave', handlePointerLeave, { passive: false });\n canvas.addEventListener('pointerout', handlePointerOut, { passive: false });\n canvas.addEventListener('pointercancel', handlePointerCancel, { passive: false });\n window.addEventListener('pointermove', handleWindowPointerMove, { passive: false });\n window.addEventListener('pointerup', handleWindowPointerUp, { passive: false });\n window.addEventListener('pointercancel', handleWindowPointerCancel, { passive: false });\n canvas.addEventListener('wheel', handleWheel, { passive: false });\n\n return () => {\n canvas.removeEventListener('contextmenu', handleContextMenu);\n canvas.removeEventListener('pointerdown', handlePointerDown);\n canvas.removeEventListener('pointerup', handlePointerUp);\n canvas.removeEventListener('pointermove', handlePointerMove);\n canvas.removeEventListener('pointerleave', handlePointerLeave);\n canvas.removeEventListener('pointerout', handlePointerOut);\n canvas.removeEventListener('pointercancel', handlePointerCancel);\n window.removeEventListener('pointermove', handleWindowPointerMove);\n window.removeEventListener('pointerup', handleWindowPointerUp);\n window.removeEventListener('pointercancel', handleWindowPointerCancel);\n canvas.removeEventListener('wheel', handleWheel);\n };\n}\n", "import type { BridgeRuntime } from '../core-types';\nimport type { BridgeInteractionState } from './local-types';\nimport { DesktopFindDialogController } from './find-dialog';\nimport { detectPlatformFamily } from './platform';\nimport { createPullToRefreshOverlay } from './pull-to-refresh';\nexport {\n ensureCanvasLogicalSize,\n getCanvasSizeSource,\n readCanvasLogicalSize,\n} from './events/canvas-geometry';\nimport {\n ensureCanvasLogicalSize,\n getCanvasSizeSource,\n readCanvasLogicalSize,\n} from './events/canvas-geometry';\nimport { installKeyAndWindowHandlers } from './events/key-router';\nimport { installPointerHandlers } from './events/pointer-router';\n\nfunction detectCoarsePointerMode(): boolean {\n return window.matchMedia('(pointer: coarse)').matches || navigator.maxTouchPoints > 0;\n}\n\nexport function installEventHandlers(runtime: BridgeRuntime, interactionState: BridgeInteractionState): () => void {\n const { canvas, ui } = runtime;\n const desktopFindDialog = new DesktopFindDialogController(runtime, canvas);\n const pullToRefresh = createPullToRefreshOverlay();\n const coarsePointerQuery = window.matchMedia('(pointer: coarse)');\n\n canvas.tabIndex = 0;\n canvas.style.touchAction = 'none';\n canvas.style.outline = 'none';\n\n const updateCoarsePointerMode = (): void => {\n ui._ui_set_coarse_pointer_mode(detectCoarsePointerMode() ? 1 : 0);\n };\n const updatePlatformFamily = (): void => {\n ui._ui_set_platform_family(detectPlatformFamily());\n };\n\n updateCoarsePointerMode();\n updatePlatformFamily();\n coarsePointerQuery.addEventListener?.('change', updateCoarsePointerMode);\n\n const removePointerHandlers = installPointerHandlers(runtime, interactionState, pullToRefresh);\n const removeKeyAndWindowHandlers = installKeyAndWindowHandlers(runtime, interactionState, desktopFindDialog);\n\n return () => {\n removeKeyAndWindowHandlers();\n removePointerHandlers();\n desktopFindDialog.destroy();\n pullToRefresh.destroy();\n coarsePointerQuery.removeEventListener?.('change', updateCoarsePointerMode);\n };\n}\n", "export interface BridgeFontDefinition {\n readonly id: number;\n readonly assetFile: string;\n readonly fallbackIds: readonly number[];\n readonly preload: boolean;\n}\n\nexport const BUILT_IN_FONT_BODY = 1;\nexport const BUILT_IN_FONT_HEADING = 2;\nexport const BUILT_IN_FONT_SYMBOLS = 3;\nexport const BUILT_IN_FONT_EMOJI = 4;\nexport const BUILT_IN_FONT_MONO = 5;\nexport const BUILT_IN_FONT_MONO_BOLD = 6;\nexport const BUILT_IN_FONT_BODY_ITALIC = 9;\nexport const BUILT_IN_FONT_BODY_BOLD_ITALIC = 10;\n\nconst BUILT_IN_BRIDGE_FONTS: readonly BridgeFontDefinition[] = [\n { id: BUILT_IN_FONT_BODY, assetFile: 'NotoSans-Regular.ttf', fallbackIds: [BUILT_IN_FONT_EMOJI, BUILT_IN_FONT_SYMBOLS], preload: true },\n { id: BUILT_IN_FONT_HEADING, assetFile: 'NotoSans-Bold.ttf', fallbackIds: [BUILT_IN_FONT_EMOJI, BUILT_IN_FONT_SYMBOLS], preload: true },\n { id: BUILT_IN_FONT_BODY_ITALIC, assetFile: 'NotoSans-Italic.ttf', fallbackIds: [BUILT_IN_FONT_EMOJI, BUILT_IN_FONT_SYMBOLS], preload: true },\n { id: BUILT_IN_FONT_BODY_BOLD_ITALIC, assetFile: 'NotoSans-BoldItalic.ttf', fallbackIds: [BUILT_IN_FONT_EMOJI, BUILT_IN_FONT_SYMBOLS], preload: true },\n { id: BUILT_IN_FONT_SYMBOLS, assetFile: 'NotoSansSymbols2-Regular.ttf', fallbackIds: [], preload: true },\n { id: BUILT_IN_FONT_EMOJI, assetFile: 'NotoEmoji-Regular.ttf', fallbackIds: [], preload: true },\n { id: BUILT_IN_FONT_MONO, assetFile: 'NotoSansMono-Regular.ttf', fallbackIds: [BUILT_IN_FONT_EMOJI, BUILT_IN_FONT_SYMBOLS], preload: false },\n { id: BUILT_IN_FONT_MONO_BOLD, assetFile: 'NotoSansMono-Bold.ttf', fallbackIds: [BUILT_IN_FONT_EMOJI, BUILT_IN_FONT_SYMBOLS], preload: false },\n];\n\nexport const STARTUP_BRIDGE_FONTS: readonly BridgeFontDefinition[] = BUILT_IN_BRIDGE_FONTS.filter((font) => font.preload);\n\nexport function getBuiltInBridgeFont(fontId: number): BridgeFontDefinition | undefined {\n return BUILT_IN_BRIDGE_FONTS.find((font) => font.id === fontId);\n}\n\nexport function getBridgeAssetBaseUrl(): string {\n const runtimeConfig = window as Window & {\n __effindomRuntime?: { manifestUrl?: string };\n };\n const manifestUrl = runtimeConfig.__effindomRuntime?.manifestUrl;\n if (typeof manifestUrl === 'string' && manifestUrl.length > 0) {\n return new URL('./', new URL(manifestUrl, document.baseURI)).toString();\n }\n const currentScript = document.currentScript;\n if (currentScript instanceof HTMLScriptElement && currentScript.src.length > 0) {\n return new URL('./', currentScript.src).toString();\n }\n return new URL('./', document.baseURI).toString();\n}\n\nexport function getBridgeAssetUrl(assetFile: string): string {\n return new URL(`../fonts/${assetFile}`, getBridgeAssetBaseUrl()).toString();\n}\n", "import type { AssetLoadResult, CoreModule } from '../../core-types';\nimport { writeBytesToHeap } from '../utils/heap';\nimport { IncrementalFontManager } from './font-manager';\n\ninterface BitmapLike {\n readonly width: number;\n readonly height: number;\n close?(): void;\n}\n\nconst svgTextDecoder = new TextDecoder();\n\nfunction createDecodeCanvas(width: number, height: number): HTMLCanvasElement {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n return canvas;\n}\n\nasync function decodeBlobToBitmap(blob: Blob): Promise<ImageBitmap> {\n if (createImageBitmap === undefined) {\n throw new Error('createImageBitmap is unavailable for texture decoding.');\n }\n return await createImageBitmap(blob);\n}\n\nfunction extractBitmapRgba(bitmap: CanvasImageSource & BitmapLike): Uint8Array {\n const canvas = createDecodeCanvas(bitmap.width, bitmap.height);\n const context = canvas.getContext('2d', { willReadFrequently: true });\n if (context === null) {\n throw new Error('Failed to allocate a 2D canvas for texture decoding.');\n }\n context.clearRect(0, 0, bitmap.width, bitmap.height);\n context.drawImage(bitmap, 0, 0);\n const imageData = context.getImageData(0, 0, bitmap.width, bitmap.height);\n return new Uint8Array(\n imageData.data.buffer.slice(\n imageData.data.byteOffset,\n imageData.data.byteOffset + imageData.data.byteLength,\n ),\n );\n}\n\nfunction parseSvgLength(value: string | null): number | null {\n if (value === null) {\n return null;\n }\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n return null;\n }\n const match = /^([+-]?(?:\\d+\\.?\\d*|\\.\\d+))/.exec(trimmed);\n const numericPrefix = match?.[1];\n if (numericPrefix === undefined) {\n return null;\n }\n const parsed = Number.parseFloat(numericPrefix);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : null;\n}\n\nfunction parseSvgViewBox(value: string | null): AssetLoadResult | null {\n if (value === null) {\n return null;\n }\n const parts = value\n .trim()\n .split(/[\\s,]+/)\n .map((entry) => Number.parseFloat(entry))\n .filter((entry) => Number.isFinite(entry));\n if (parts.length !== 4) {\n return null;\n }\n const width = parts[2];\n const height = parts[3];\n if (width === undefined || height === undefined) {\n return null;\n }\n if (width <= 0 || height <= 0) {\n return null;\n }\n return { width, height };\n}\n\nfunction parseSvgIntrinsicSize(bytes: Uint8Array): AssetLoadResult {\n const markup = svgTextDecoder.decode(bytes);\n const documentRoot = new DOMParser().parseFromString(markup, 'image/svg+xml').documentElement;\n const width = parseSvgLength(documentRoot.getAttribute('width'));\n const height = parseSvgLength(documentRoot.getAttribute('height'));\n if (width !== null && height !== null) {\n return { width, height };\n }\n const viewBox = parseSvgViewBox(documentRoot.getAttribute('viewBox'));\n if (viewBox !== null) {\n return viewBox;\n }\n return { width: 1, height: 1 };\n}\n\nexport class AssetManager {\n private readonly loadedSvgs = new Map<number, string>();\n private readonly loadedTextures = new Map<number, string>();\n\n public constructor(\n private readonly core: CoreModule,\n private readonly fontManager: IncrementalFontManager,\n private readonly onCommitFrame: () => void,\n ) {}\n\n public async loadSvg(svgId: number, url: string): Promise<AssetLoadResult> {\n this.loadedSvgs.set(svgId, url);\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch SVG ${url}: ${String(response.status)}`);\n }\n const bytes = new Uint8Array(await response.arrayBuffer());\n const size = parseSvgIntrinsicSize(bytes);\n const svgBytes = writeBytesToHeap(this.core, bytes);\n try {\n this.core._ed_register_svg(svgId, svgBytes.ptr, svgBytes.len);\n } finally {\n svgBytes.dispose();\n }\n this.onCommitFrame();\n return size;\n }\n\n public async loadTexture(textureId: number, url: string): Promise<AssetLoadResult> {\n this.loadedTextures.set(textureId, url);\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch texture ${url}: ${String(response.status)}`);\n }\n const blob = await response.blob();\n const bitmap = await decodeBlobToBitmap(blob);\n const width = bitmap.width;\n const height = bitmap.height;\n try {\n const rgba = extractBitmapRgba(bitmap);\n const textureBytes = writeBytesToHeap(this.core, rgba);\n try {\n this.core._ed_register_texture_rgba(textureId, textureBytes.ptr, width, height, textureBytes.len);\n } finally {\n textureBytes.dispose();\n }\n } finally {\n bitmap.close?.();\n }\n this.onCommitFrame();\n return {\n width,\n height,\n };\n }\n\n public releaseSvg(svgId: number): void {\n this.loadedSvgs.delete(svgId);\n }\n\n public releaseTexture(textureId: number): void {\n this.loadedTextures.delete(textureId);\n this.core._ed_unregister_texture(textureId);\n this.onCommitFrame();\n }\n\n public async replayLoadedAssets(): Promise<void> {\n await Promise.all([\n this.fontManager.replayLoadedFonts(),\n ...Array.from(this.loadedSvgs.entries(), async ([svgId, url]) => {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to refetch SVG ${url}: ${String(response.status)}`);\n }\n const bytes = new Uint8Array(await response.arrayBuffer());\n const svgBytes = writeBytesToHeap(this.core, bytes);\n try {\n this.core._ed_register_svg(svgId, svgBytes.ptr, svgBytes.len);\n } finally {\n svgBytes.dispose();\n }\n }),\n ...Array.from(this.loadedTextures.entries(), async ([textureId, url]) => {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to refetch texture ${url}: ${String(response.status)}`);\n }\n const blob = await response.blob();\n const bitmap = await decodeBlobToBitmap(blob);\n try {\n const rgba = extractBitmapRgba(bitmap);\n const textureBytes = writeBytesToHeap(this.core, rgba);\n try {\n this.core._ed_register_texture_rgba(textureId, textureBytes.ptr, bitmap.width, bitmap.height, textureBytes.len);\n } finally {\n textureBytes.dispose();\n }\n } finally {\n bitmap.close?.();\n }\n }),\n ]);\n }\n}\n", "export interface GoogleFontShardBytes {\n readonly url: string;\n readonly bytes: Uint8Array;\n}\n\nconst GOOGLE_FONTS_STYLESHEET_ORIGIN = 'https://fonts.googleapis.com';\nconst GOOGLE_FONTS_BINARY_ORIGIN = 'https://fonts.gstatic.com';\n\nfunction ensureLinkTag(rel: string, href: string, crossOrigin?: '' | 'anonymous'): void {\n const existing = document.head.querySelector(`link[rel=\"${rel}\"][href=\"${href}\"]`);\n if (existing instanceof HTMLLinkElement) {\n return;\n }\n const link = document.createElement('link');\n link.rel = rel;\n link.href = href;\n if (crossOrigin !== undefined) {\n link.crossOrigin = crossOrigin;\n }\n document.head.appendChild(link);\n}\n\nexport function ensureGoogleFontShardPreconnect(): void {\n ensureLinkTag('preconnect', GOOGLE_FONTS_STYLESHEET_ORIGIN);\n ensureLinkTag('preconnect', GOOGLE_FONTS_BINARY_ORIGIN, 'anonymous');\n}\n\nexport function buildGoogleFontStylesheetUrl(googleFamily: string, text: string): string {\n const params = new URLSearchParams();\n params.set('family', `${googleFamily}:wght@400`);\n params.set('text', text);\n params.set('display', 'swap');\n return `${GOOGLE_FONTS_STYLESHEET_ORIGIN}/css2?${params.toString()}`;\n}\n\nexport function parseGoogleFontBinaryUrl(stylesheetText: string): string {\n const match = /src:\\s*url\\(([^)]+)\\)\\s*format\\((['\"]?)(woff2|woff|truetype|opentype)\\2\\)/.exec(stylesheetText);\n if (match?.[1] === undefined) {\n throw new Error('Google Fonts stylesheet did not expose a usable shard URL.');\n }\n return match[1].trim();\n}\n\nexport async function fetchGoogleFontShardBytes(\n googleFamily: string,\n text: string,\n): Promise<GoogleFontShardBytes> {\n ensureGoogleFontShardPreconnect();\n const stylesheetUrl = buildGoogleFontStylesheetUrl(googleFamily, text);\n const stylesheetResponse = await fetch(stylesheetUrl, { mode: 'cors' });\n if (!stylesheetResponse.ok) {\n throw new Error(`Failed to fetch Google Fonts stylesheet ${stylesheetUrl}: ${String(stylesheetResponse.status)}`);\n }\n const binaryUrl = parseGoogleFontBinaryUrl(await stylesheetResponse.text());\n const binaryResponse = await fetch(binaryUrl);\n if (!binaryResponse.ok) {\n throw new Error(`Failed to fetch font ${binaryUrl}: ${String(binaryResponse.status)}`);\n }\n return {\n url: binaryUrl,\n bytes: new Uint8Array(await binaryResponse.arrayBuffer()),\n };\n}\n", "import {\n BUILT_IN_FONT_BODY,\n BUILT_IN_FONT_BODY_BOLD_ITALIC,\n BUILT_IN_FONT_BODY_ITALIC,\n BUILT_IN_FONT_HEADING,\n BUILT_IN_FONT_MONO,\n BUILT_IN_FONT_MONO_BOLD,\n} from './font-catalog';\n\nexport const UI_MISSING_FONT_COVERAGE_UNKNOWN = 0;\nexport const UI_MISSING_FONT_COVERAGE_ARABIC = 1;\nexport const UI_MISSING_FONT_COVERAGE_THAI = 2;\nexport const UI_MISSING_FONT_COVERAGE_CJK = 3;\nexport const UI_MISSING_FONT_COVERAGE_SUPPLEMENTAL = 4;\n\nexport interface ResolvedIncrementalFontShardRequest {\n readonly packageId: string;\n readonly coverageKind: number;\n readonly familyKey: string;\n readonly googleFamily: string;\n readonly text: string;\n}\n\nconst AUTO_EXTENDABLE_PRIMARY_FONT_IDS = new Set<number>([\n BUILT_IN_FONT_BODY,\n BUILT_IN_FONT_HEADING,\n BUILT_IN_FONT_BODY_ITALIC,\n BUILT_IN_FONT_BODY_BOLD_ITALIC,\n BUILT_IN_FONT_MONO,\n BUILT_IN_FONT_MONO_BOLD,\n]);\n\ninterface SupplementalFamilyDefinition {\n readonly familyKey: string;\n readonly googleFamily: string;\n readonly ranges: readonly [number, number][];\n}\n\nconst SUPPLEMENTAL_FAMILIES: readonly SupplementalFamilyDefinition[] = [\n { familyKey: 'hebrew', googleFamily: 'Noto Sans Hebrew', ranges: [[0x0590, 0x05FF]] },\n { familyKey: 'armenian', googleFamily: 'Noto Sans Armenian', ranges: [[0x0530, 0x058F]] },\n { familyKey: 'georgian', googleFamily: 'Noto Sans Georgian', ranges: [[0x10A0, 0x10FF], [0x2D00, 0x2D2F]] },\n { familyKey: 'devanagari', googleFamily: 'Noto Sans Devanagari', ranges: [[0x0900, 0x097F]] },\n { familyKey: 'bengali', googleFamily: 'Noto Sans Bengali', ranges: [[0x0980, 0x09FF]] },\n { familyKey: 'gurmukhi', googleFamily: 'Noto Sans Gurmukhi', ranges: [[0x0A00, 0x0A7F]] },\n { familyKey: 'gujarati', googleFamily: 'Noto Sans Gujarati', ranges: [[0x0A80, 0x0AFF]] },\n { familyKey: 'oriya', googleFamily: 'Noto Sans Oriya', ranges: [[0x0B00, 0x0B7F]] },\n { familyKey: 'tamil', googleFamily: 'Noto Sans Tamil', ranges: [[0x0B80, 0x0BFF]] },\n { familyKey: 'telugu', googleFamily: 'Noto Sans Telugu', ranges: [[0x0C00, 0x0C7F]] },\n { familyKey: 'kannada', googleFamily: 'Noto Sans Kannada', ranges: [[0x0C80, 0x0CFF]] },\n { familyKey: 'malayalam', googleFamily: 'Noto Sans Malayalam', ranges: [[0x0D00, 0x0D7F]] },\n { familyKey: 'sinhala', googleFamily: 'Noto Sans Sinhala', ranges: [[0x0D80, 0x0DFF]] },\n { familyKey: 'lao', googleFamily: 'Noto Sans Lao', ranges: [[0x0E80, 0x0EFF]] },\n { familyKey: 'myanmar', googleFamily: 'Noto Sans Myanmar', ranges: [[0x1000, 0x109F]] },\n { familyKey: 'khmer', googleFamily: 'Noto Sans Khmer', ranges: [[0x1780, 0x17FF]] },\n { familyKey: 'ethiopic', googleFamily: 'Noto Sans Ethiopic', ranges: [[0x1200, 0x137F], [0x1380, 0x139F], [0x2D80, 0x2DDF]] },\n] as const;\n\nfunction inRanges(codePoint: number, ranges: readonly [number, number][]): boolean {\n return ranges.some(([start, end]) => codePoint >= start && codePoint <= end);\n}\n\nfunction uniqueCodePoints(text: string): readonly string[] {\n const seen = new Set<string>();\n const ordered: string[] = [];\n for (const character of text) {\n if (seen.has(character)) {\n continue;\n }\n seen.add(character);\n ordered.push(character);\n }\n return ordered;\n}\n\nfunction isCjkPunctuation(codePoint: number): boolean {\n return (codePoint >= 0x3000 && codePoint <= 0x303F)\n || (codePoint >= 0xFF01 && codePoint <= 0xFF0F)\n || (codePoint >= 0xFF1A && codePoint <= 0xFF20)\n || (codePoint >= 0xFF3B && codePoint <= 0xFF40)\n || (codePoint >= 0xFF5B && codePoint <= 0xFF65);\n}\n\nfunction buildShardRequest(\n packageId: string,\n coverageKind: number,\n familyKey: string,\n googleFamily: string,\n characters: readonly string[],\n): ResolvedIncrementalFontShardRequest | null {\n if (characters.length === 0) {\n return null;\n }\n const text = characters.join('');\n return {\n packageId,\n coverageKind,\n familyKey,\n googleFamily,\n text,\n };\n}\n\nfunction resolveCjkRequests(sampleText: string): readonly ResolvedIncrementalFontShardRequest[] {\n const codePoints = uniqueCodePoints(sampleText);\n const kana: string[] = [];\n const hangul: string[] = [];\n const han: string[] = [];\n const punctuation: string[] = [];\n for (const character of codePoints) {\n const codePoint = character.codePointAt(0);\n if (codePoint === undefined) {\n continue;\n }\n if (isCjkPunctuation(codePoint)) {\n punctuation.push(character);\n continue;\n }\n if ((codePoint >= 0x3040 && codePoint <= 0x30FF) || (codePoint >= 0x31F0 && codePoint <= 0x31FF)) {\n kana.push(character);\n continue;\n }\n if (codePoint >= 0xAC00 && codePoint <= 0xD7AF) {\n hangul.push(character);\n continue;\n }\n if (\n (codePoint >= 0x3400 && codePoint <= 0x4DBF)\n || (codePoint >= 0x4E00 && codePoint <= 0x9FFF)\n || (codePoint >= 0xF900 && codePoint <= 0xFAFF)\n ) {\n han.push(character);\n }\n }\n\n const requests: ResolvedIncrementalFontShardRequest[] = [];\n if (kana.length > 0) {\n requests.push(\n buildShardRequest('cjk-sans', UI_MISSING_FONT_COVERAGE_CJK, 'cjk-jp', 'Noto Sans JP', [...kana, ...han, ...punctuation])!,\n );\n }\n if (hangul.length > 0) {\n requests.push(\n buildShardRequest('cjk-sans', UI_MISSING_FONT_COVERAGE_CJK, 'cjk-kr', 'Noto Sans KR', [...hangul, ...(kana.length === 0 ? han : []), ...punctuation])!,\n );\n }\n if (han.length > 0 && kana.length === 0 && hangul.length === 0) {\n requests.push(\n buildShardRequest('cjk-sans', UI_MISSING_FONT_COVERAGE_CJK, 'cjk-sc', 'Noto Sans SC', [...han, ...punctuation])!,\n );\n }\n if (requests.length === 0 && punctuation.length > 0) {\n requests.push(\n buildShardRequest('cjk-sans', UI_MISSING_FONT_COVERAGE_CJK, 'cjk-sc', 'Noto Sans SC', punctuation)!,\n );\n }\n return requests;\n}\n\nfunction resolveSupplementalRequests(sampleText: string): readonly ResolvedIncrementalFontShardRequest[] {\n const codePoints = uniqueCodePoints(sampleText);\n const textByFamily = new Map<string, string[]>();\n for (const character of codePoints) {\n const codePoint = character.codePointAt(0);\n if (codePoint === undefined) {\n continue;\n }\n const family = SUPPLEMENTAL_FAMILIES.find((entry) => inRanges(codePoint, entry.ranges));\n if (family === undefined) {\n continue;\n }\n const current = textByFamily.get(family.familyKey) ?? [];\n current.push(character);\n textByFamily.set(family.familyKey, current);\n }\n return SUPPLEMENTAL_FAMILIES\n .map((family) => buildShardRequest(\n 'supplemental-sans',\n UI_MISSING_FONT_COVERAGE_SUPPLEMENTAL,\n family.familyKey,\n family.googleFamily,\n textByFamily.get(family.familyKey) ?? [],\n ))\n .filter((request): request is ResolvedIncrementalFontShardRequest => request !== null);\n}\n\nexport function resolveIncrementalFontPackageRequests(\n primaryFontId: number,\n coverageKind: number,\n sampleText: string,\n): readonly ResolvedIncrementalFontShardRequest[] {\n if (!AUTO_EXTENDABLE_PRIMARY_FONT_IDS.has(primaryFontId) || sampleText.length === 0) {\n return [];\n }\n const uniqueText = uniqueCodePoints(sampleText).join('');\n if (uniqueText.length === 0) {\n return [];\n }\n if (coverageKind === UI_MISSING_FONT_COVERAGE_ARABIC) {\n return [\n buildShardRequest('arabic-sans', coverageKind, 'arabic-core', 'Noto Naskh Arabic', Array.from(uniqueText))!,\n ];\n }\n if (coverageKind === UI_MISSING_FONT_COVERAGE_THAI) {\n return [\n buildShardRequest('thai-sans', coverageKind, 'thai-core', 'Noto Sans Thai', Array.from(uniqueText))!,\n ];\n }\n if (coverageKind === UI_MISSING_FONT_COVERAGE_CJK) {\n return resolveCjkRequests(uniqueText);\n }\n if (coverageKind === UI_MISSING_FONT_COVERAGE_SUPPLEMENTAL) {\n return resolveSupplementalRequests(uniqueText);\n }\n return [];\n}\n", "import type {\n BridgeFontRegistration,\n BridgeFontStackRegistration,\n BridgeLogs,\n CoreModule,\n IncrementalFontAutoGrowBlockReason,\n IncrementalFontCacheState,\n IncrementalFontPolicy,\n IncrementalFontRuntimeState,\n UiModule,\n} from '../../core-types';\nimport { getBridgeAssetUrl, getBuiltInBridgeFont } from '../font-catalog';\nimport { fetchGoogleFontShardBytes } from '../google-fonts';\nimport {\n resolveIncrementalFontPackageRequests,\n type ResolvedIncrementalFontShardRequest,\n} from '../incremental-font-packages';\nimport { writeBytesToHeap } from '../utils/heap';\n\ntype InternalFontLoadState = 'known' | 'loading' | 'loaded' | 'failed';\n\ninterface InternalIncrementalFontState {\n sourceUrl: string | null;\n sourceState: 'unknown' | InternalFontLoadState;\n requestedSegmentIds: Set<string>;\n pendingSegmentIds: Set<string>;\n appliedSegmentIds: Set<string>;\n evictedSegmentIds: Set<string>;\n requestedCharactersByFamily: Map<string, Set<string>>;\n revision: number;\n blockedPackageIds: Set<string>;\n lastBlockedReason: IncrementalFontAutoGrowBlockReason | null;\n}\n\ninterface InternalIncrementalShardCacheEntry {\n shardKey: string;\n fontId: number;\n sizeBytes: number;\n primaryFontIds: Set<number>;\n lastAccessTick: number;\n}\n\ninterface NormalizedIncrementalFontPolicy {\n autoGrow: boolean;\n maxCachedShardFonts: number;\n allowedFontIds: Set<number> | null;\n blockedPackageIds: Set<string> | null;\n}\n\nconst DEFAULT_INCREMENTAL_FONT_POLICY: IncrementalFontPolicy = {\n autoGrow: true,\n maxCachedShardFonts: 8,\n allowedFontIds: null,\n blockedPackageIds: null,\n};\n\nexport class IncrementalFontManager {\n private readonly loadedFonts = new Map<number, string>();\n private readonly fontLoadStates = new Map<number, { readonly url: string; readonly state: InternalFontLoadState }>();\n private readonly incrementalFontStates = new Map<number, InternalIncrementalFontState>();\n private readonly fontFallbacks = new Map<number, number[]>();\n private readonly lazyFontSources = new Map<number, string>();\n private readonly pendingFontLoads = new Map<number, Promise<void>>();\n private readonly pendingIncrementalShardLoads = new Map<string, Promise<number>>();\n private readonly pendingIncrementalFamilyRequests = new Map<string, {\n packageId: string;\n coverageKind: number;\n familyKey: string;\n googleFamily: string;\n characters: Set<string>;\n }>();\n private readonly scheduledIncrementalFamilyFlushes = new Set<string>();\n private readonly incrementalShardCache = new Map<string, InternalIncrementalShardCacheEntry>();\n private readonly shardKeysByPrimaryFont = new Map<number, Set<string>>();\n private readonly evictedShardKeys: string[] = [];\n private nextIncrementalFontId = 0x7F000100;\n private shardAccessTick = 0;\n private incrementalFontPolicy: IncrementalFontPolicy = DEFAULT_INCREMENTAL_FONT_POLICY;\n private normalizedIncrementalFontPolicy: NormalizedIncrementalFontPolicy = {\n autoGrow: DEFAULT_INCREMENTAL_FONT_POLICY.autoGrow,\n maxCachedShardFonts: DEFAULT_INCREMENTAL_FONT_POLICY.maxCachedShardFonts,\n allowedFontIds: null,\n blockedPackageIds: null,\n };\n\n public constructor(\n private readonly core: CoreModule,\n private readonly ui: UiModule,\n private readonly logs: BridgeLogs,\n private readonly onCommitFrame: () => void,\n ) {}\n\n private normalizePolicy(policy: IncrementalFontPolicy): NormalizedIncrementalFontPolicy {\n return {\n autoGrow: policy.autoGrow,\n maxCachedShardFonts: Math.max(1, Math.floor(policy.maxCachedShardFonts)),\n allowedFontIds: policy.allowedFontIds === null ? null : new Set(policy.allowedFontIds),\n blockedPackageIds: policy.blockedPackageIds === null ? null : new Set(policy.blockedPackageIds),\n };\n }\n\n private registerFontBytes(fontId: number, bytes: Uint8Array): void {\n const coreBytes = writeBytesToHeap(this.core, bytes);\n const uiBytes = writeBytesToHeap(this.ui, bytes);\n try {\n this.core._ed_register_font(fontId, coreBytes.ptr, coreBytes.len);\n if (this.ui._ui_register_font(fontId, uiBytes.ptr, uiBytes.len) === 0) {\n throw new Error(`Ui rejected font ${String(fontId)}.`);\n }\n this.ui._ui_font_loaded(fontId);\n } finally {\n coreBytes.dispose();\n uiBytes.dispose();\n }\n }\n\n private unregisterFont(fontId: number): void {\n this.core._ed_unregister_font(fontId);\n this.ui._ui_unregister_font(fontId);\n this.loadedFonts.delete(fontId);\n this.fontLoadStates.delete(fontId);\n }\n\n private updateShardAccess(shardKey: string): void {\n const shard = this.incrementalShardCache.get(shardKey);\n if (shard === undefined) {\n return;\n }\n this.shardAccessTick += 1;\n shard.lastAccessTick = this.shardAccessTick;\n }\n\n private getAutoGrowBlockReason(\n fontId: number,\n packageId: string | null,\n ): IncrementalFontAutoGrowBlockReason | null {\n if (!this.normalizedIncrementalFontPolicy.autoGrow) {\n return 'auto-grow-disabled';\n }\n if (\n this.normalizedIncrementalFontPolicy.allowedFontIds !== null\n && !this.normalizedIncrementalFontPolicy.allowedFontIds.has(fontId)\n ) {\n return 'font-not-allowed';\n }\n if (\n packageId !== null\n && this.normalizedIncrementalFontPolicy.blockedPackageIds !== null\n && this.normalizedIncrementalFontPolicy.blockedPackageIds.has(packageId)\n ) {\n return 'package-blocked';\n }\n return null;\n }\n\n private releasePrimaryFontShardReference(primaryFontId: number, shardKey: string, shardFontId: number): void {\n const fontState = this.ensureIncrementalFontState(primaryFontId);\n fontState.appliedSegmentIds.delete(shardKey);\n fontState.evictedSegmentIds.add(shardKey);\n fontState.revision += 1;\n\n const trackedShardKeys = this.shardKeysByPrimaryFont.get(primaryFontId);\n trackedShardKeys?.delete(shardKey);\n if (trackedShardKeys !== undefined && trackedShardKeys.size === 0) {\n this.shardKeysByPrimaryFont.delete(primaryFontId);\n }\n\n const fallbacks = this.fontFallbacks.get(primaryFontId);\n if (fallbacks !== undefined) {\n this.fontFallbacks.set(\n primaryFontId,\n fallbacks.filter((fallbackId) => fallbackId !== shardFontId),\n );\n }\n this.ui._ui_unregister_font_fallback(primaryFontId, shardFontId);\n this.ui._ui_font_loaded(primaryFontId);\n }\n\n private evictIncrementalShard(shardKey: string): void {\n const shard = this.incrementalShardCache.get(shardKey);\n if (shard === undefined) {\n return;\n }\n for (const primaryFontId of shard.primaryFontIds) {\n this.releasePrimaryFontShardReference(primaryFontId, shardKey, shard.fontId);\n }\n this.incrementalShardCache.delete(shardKey);\n this.evictedShardKeys.push(shardKey);\n if (this.evictedShardKeys.length > 32) {\n this.evictedShardKeys.splice(0, this.evictedShardKeys.length - 32);\n }\n this.unregisterFont(shard.fontId);\n this.onCommitFrame();\n }\n\n private ensureShardCacheCapacityForNewEntry(): void {\n while (this.incrementalShardCache.size >= this.normalizedIncrementalFontPolicy.maxCachedShardFonts) {\n let leastRecentlyUsed: InternalIncrementalShardCacheEntry | null = null;\n for (const shard of this.incrementalShardCache.values()) {\n if (leastRecentlyUsed === null || shard.lastAccessTick < leastRecentlyUsed.lastAccessTick) {\n leastRecentlyUsed = shard;\n }\n }\n if (leastRecentlyUsed === null) {\n return;\n }\n this.evictIncrementalShard(leastRecentlyUsed.shardKey);\n }\n }\n\n private trimShardCacheToPolicyLimit(): void {\n while (this.incrementalShardCache.size > this.normalizedIncrementalFontPolicy.maxCachedShardFonts) {\n let leastRecentlyUsed: InternalIncrementalShardCacheEntry | null = null;\n for (const shard of this.incrementalShardCache.values()) {\n if (leastRecentlyUsed === null || shard.lastAccessTick < leastRecentlyUsed.lastAccessTick) {\n leastRecentlyUsed = shard;\n }\n }\n if (leastRecentlyUsed === null) {\n return;\n }\n this.evictIncrementalShard(leastRecentlyUsed.shardKey);\n }\n }\n\n private ensureIncrementalFontState(fontId: number): InternalIncrementalFontState {\n let state = this.incrementalFontStates.get(fontId);\n if (state !== undefined) {\n return state;\n }\n state = {\n sourceUrl: null,\n sourceState: 'unknown',\n requestedSegmentIds: new Set<string>(),\n pendingSegmentIds: new Set<string>(),\n appliedSegmentIds: new Set<string>(),\n evictedSegmentIds: new Set<string>(),\n requestedCharactersByFamily: new Map<string, Set<string>>(),\n revision: 0,\n blockedPackageIds: new Set<string>(),\n lastBlockedReason: null,\n };\n this.incrementalFontStates.set(fontId, state);\n return state;\n }\n\n private rememberFontSource(fontId: number, url: string): void {\n const current = this.fontLoadStates.get(fontId);\n if (current !== undefined && current.url === url && (current.state === 'loading' || current.state === 'loaded')) {\n return;\n }\n this.fontLoadStates.set(fontId, { url, state: 'known' });\n const state = this.ensureIncrementalFontState(fontId);\n const previousUrl = state.sourceUrl;\n state.sourceUrl = url;\n if (state.sourceState === 'unknown' || state.sourceState === 'failed' || previousUrl !== url) {\n state.sourceState = 'known';\n }\n }\n\n private markFontLoading(fontId: number, url: string): void {\n this.fontLoadStates.set(fontId, { url, state: 'loading' });\n const state = this.ensureIncrementalFontState(fontId);\n state.sourceUrl = url;\n state.sourceState = 'loading';\n }\n\n private markFontLoaded(fontId: number, url: string): void {\n this.fontLoadStates.set(fontId, { url, state: 'loaded' });\n const state = this.ensureIncrementalFontState(fontId);\n state.sourceUrl = url;\n state.sourceState = 'loaded';\n }\n\n private markFontLoadFailed(fontId: number, url: string): void {\n this.fontLoadStates.set(fontId, { url, state: 'failed' });\n const state = this.ensureIncrementalFontState(fontId);\n state.sourceUrl = url;\n state.sourceState = 'failed';\n }\n\n public isFontLoaded(fontId: number, url?: string): boolean {\n const current = this.fontLoadStates.get(fontId);\n return current !== undefined\n && current.state === 'loaded'\n && (url === undefined || current.url === url);\n }\n\n private async fetchFontBytes(url: string, replay = false): Promise<Uint8Array> {\n const response = await fetch(url);\n if (!response.ok) {\n const verb = replay ? 'refetch' : 'fetch';\n throw new Error(`Failed to ${verb} font ${url}: ${String(response.status)}`);\n }\n return new Uint8Array(await response.arrayBuffer());\n }\n\n private reportBridgeError(error: unknown): void {\n (window as Window & { __bridgeError?: string }).__bridgeError =\n error instanceof Error ? error.message : String(error);\n }\n\n private applyFontFallbacks(fontId: number, fallbackIds: readonly number[]): void {\n this.fontFallbacks.set(fontId, [...fallbackIds]);\n for (const fallbackId of fallbackIds) {\n this.ui._ui_register_font_fallback(fontId, fallbackId);\n }\n }\n\n private async ensureRegisteredFont(\n fontId: number,\n url: string,\n fallbackIds: readonly number[] = [],\n ): Promise<void> {\n this.rememberFontSource(fontId, url);\n const pending = this.pendingFontLoads.get(fontId);\n if (pending !== undefined) {\n await pending;\n return;\n }\n const request = this.registerFont(\n fallbackIds.length > 0\n ? {\n id: fontId,\n url,\n fallbackIds,\n }\n : {\n id: fontId,\n url,\n },\n ).finally(() => {\n this.pendingFontLoads.delete(fontId);\n });\n this.pendingFontLoads.set(fontId, request);\n await request;\n }\n\n private async ensureFontWithFallbacks(fontId: number, visited = new Set<number>()): Promise<void> {\n if (visited.has(fontId)) {\n return;\n }\n visited.add(fontId);\n if (!this.isFontLoaded(fontId)) {\n const lazyUrl = this.lazyFontSources.get(fontId);\n if (lazyUrl !== undefined) {\n await this.ensureRegisteredFont(fontId, lazyUrl);\n } else {\n const builtInFont = getBuiltInBridgeFont(fontId);\n if (builtInFont !== undefined) {\n await this.ensureRegisteredFont(\n builtInFont.id,\n getBridgeAssetUrl(builtInFont.assetFile),\n builtInFont.fallbackIds,\n );\n }\n }\n }\n const fallbackIds = this.fontFallbacks.get(fontId) ?? [];\n await Promise.all(fallbackIds.map((fallbackId) => this.ensureFontWithFallbacks(fallbackId, visited)));\n }\n\n private registerSingleFontFallback(fontId: number, fallbackFontId: number): void {\n const existingFallbacks = this.fontFallbacks.get(fontId) ?? [];\n if (!existingFallbacks.includes(fallbackFontId)) {\n this.fontFallbacks.set(fontId, [...existingFallbacks, fallbackFontId]);\n }\n this.ui._ui_register_font_fallback(fontId, fallbackFontId);\n }\n\n private async ensureIncrementalShardFont(\n request: ResolvedIncrementalFontShardRequest & { readonly shardKey: string },\n ): Promise<number> {\n const cachedShard = this.incrementalShardCache.get(request.shardKey);\n if (cachedShard !== undefined) {\n this.updateShardAccess(request.shardKey);\n return cachedShard.fontId;\n }\n const existing = this.pendingIncrementalShardLoads.get(request.shardKey);\n if (existing !== undefined) {\n return await existing;\n }\n const pending = (async () => {\n this.ensureShardCacheCapacityForNewEntry();\n const fontId = this.nextIncrementalFontId;\n this.nextIncrementalFontId += 1;\n const shard = await fetchGoogleFontShardBytes(request.googleFamily, request.text);\n this.registerFontBytes(fontId, shard.bytes);\n this.loadedFonts.set(fontId, shard.url);\n this.markFontLoaded(fontId, shard.url);\n this.shardAccessTick += 1;\n this.incrementalShardCache.set(request.shardKey, {\n shardKey: request.shardKey,\n fontId,\n sizeBytes: shard.bytes.byteLength,\n primaryFontIds: new Set<number>(),\n lastAccessTick: this.shardAccessTick,\n });\n return fontId;\n })().finally(() => {\n this.pendingIncrementalShardLoads.delete(request.shardKey);\n });\n this.pendingIncrementalShardLoads.set(request.shardKey, pending);\n return await pending;\n }\n\n private async flushPendingIncrementalFamilyRequest(primaryFontId: number, familyKey: string): Promise<void> {\n const pendingKey = `${String(primaryFontId)}:${familyKey}`;\n this.scheduledIncrementalFamilyFlushes.delete(pendingKey);\n const pendingRequest = this.pendingIncrementalFamilyRequests.get(pendingKey);\n if (pendingRequest === undefined) {\n return;\n }\n this.pendingIncrementalFamilyRequests.delete(pendingKey);\n\n const fontState = this.ensureIncrementalFontState(primaryFontId);\n const text = Array.from(pendingRequest.characters.values()).join('');\n if (text.length === 0) {\n return;\n }\n const shardKey = `${pendingRequest.familyKey}:${text}`;\n fontState.requestedSegmentIds.add(shardKey);\n fontState.pendingSegmentIds.add(shardKey);\n this.logs.incrementalFontPackageRequests.push({\n primaryFontId,\n coverageKind: pendingRequest.coverageKind,\n packageId: pendingRequest.packageId,\n segmentIds: [shardKey],\n sampleText: text,\n });\n\n try {\n const shardFontId = await this.ensureIncrementalShardFont({\n packageId: pendingRequest.packageId,\n coverageKind: pendingRequest.coverageKind,\n familyKey: pendingRequest.familyKey,\n googleFamily: pendingRequest.googleFamily,\n text,\n shardKey,\n });\n this.registerSingleFontFallback(primaryFontId, shardFontId);\n const shard = this.incrementalShardCache.get(shardKey);\n if (shard !== undefined) {\n shard.primaryFontIds.add(primaryFontId);\n this.updateShardAccess(shardKey);\n }\n let primaryShardKeys = this.shardKeysByPrimaryFont.get(primaryFontId);\n if (primaryShardKeys === undefined) {\n primaryShardKeys = new Set<string>();\n this.shardKeysByPrimaryFont.set(primaryFontId, primaryShardKeys);\n }\n primaryShardKeys.add(shardKey);\n if (!fontState.appliedSegmentIds.has(shardKey)) {\n fontState.appliedSegmentIds.add(shardKey);\n fontState.revision += 1;\n }\n fontState.pendingSegmentIds.delete(shardKey);\n fontState.evictedSegmentIds.delete(shardKey);\n this.ui._ui_font_loaded(primaryFontId);\n this.onCommitFrame();\n } catch (error: unknown) {\n fontState.requestedSegmentIds.delete(shardKey);\n fontState.pendingSegmentIds.delete(shardKey);\n const requestedCharacters = fontState.requestedCharactersByFamily.get(pendingRequest.familyKey);\n if (requestedCharacters !== undefined) {\n for (const character of text) {\n requestedCharacters.delete(character);\n }\n if (requestedCharacters.size === 0) {\n fontState.requestedCharactersByFamily.delete(pendingRequest.familyKey);\n }\n }\n this.reportBridgeError(error);\n throw error;\n }\n }\n\n public async ensureFont(fontId: number): Promise<void> {\n await this.ensureFontWithFallbacks(fontId);\n }\n\n public async ensureBuiltInFont(fontId: number): Promise<void> {\n const builtInFont = getBuiltInBridgeFont(fontId);\n if (builtInFont === undefined) {\n throw new Error(`Unknown built-in font id ${String(fontId)}.`);\n }\n await this.ensureRegisteredFont(\n builtInFont.id,\n getBridgeAssetUrl(builtInFont.assetFile),\n builtInFont.fallbackIds,\n );\n }\n\n public getIncrementalFontCacheState(): IncrementalFontCacheState {\n return {\n maxCachedShardFonts: this.incrementalFontPolicy.maxCachedShardFonts,\n cachedShardCount: this.incrementalShardCache.size,\n cachedShardKeys: Array.from(this.incrementalShardCache.keys()),\n evictedShardKeys: [...this.evictedShardKeys],\n };\n }\n\n public getIncrementalFontPolicy(): IncrementalFontPolicy {\n return {\n autoGrow: this.incrementalFontPolicy.autoGrow,\n maxCachedShardFonts: this.incrementalFontPolicy.maxCachedShardFonts,\n allowedFontIds: this.incrementalFontPolicy.allowedFontIds === null\n ? null\n : [...this.incrementalFontPolicy.allowedFontIds],\n blockedPackageIds: this.incrementalFontPolicy.blockedPackageIds === null\n ? null\n : [...this.incrementalFontPolicy.blockedPackageIds],\n };\n }\n\n public setIncrementalFontPolicy(policy: Partial<IncrementalFontPolicy>): void {\n const nextPolicy: IncrementalFontPolicy = {\n autoGrow: policy.autoGrow ?? this.incrementalFontPolicy.autoGrow,\n maxCachedShardFonts: policy.maxCachedShardFonts ?? this.incrementalFontPolicy.maxCachedShardFonts,\n allowedFontIds: 'allowedFontIds' in policy\n ? (policy.allowedFontIds ?? null)\n : this.incrementalFontPolicy.allowedFontIds,\n blockedPackageIds: 'blockedPackageIds' in policy\n ? (policy.blockedPackageIds ?? null)\n : this.incrementalFontPolicy.blockedPackageIds,\n };\n this.normalizedIncrementalFontPolicy = this.normalizePolicy(nextPolicy);\n this.incrementalFontPolicy = {\n ...nextPolicy,\n maxCachedShardFonts: this.normalizedIncrementalFontPolicy.maxCachedShardFonts,\n };\n this.trimShardCacheToPolicyLimit();\n }\n\n public getIncrementalFontState(fontId: number): IncrementalFontRuntimeState | null {\n const state = this.incrementalFontStates.get(fontId);\n if (state === undefined) {\n return null;\n }\n return {\n fontId,\n sourceUrl: state.sourceUrl,\n sourceState: state.sourceState,\n loaded: this.isFontLoaded(fontId),\n requestedSegmentIds: Array.from(state.requestedSegmentIds.values()),\n pendingSegmentIds: Array.from(state.pendingSegmentIds.values()),\n appliedSegmentIds: Array.from(state.appliedSegmentIds.values()),\n evictedSegmentIds: Array.from(state.evictedSegmentIds.values()),\n revision: state.revision,\n autoGrowAllowed: this.getAutoGrowBlockReason(fontId, null) === null,\n blockedPackageIds: Array.from(state.blockedPackageIds.values()),\n lastBlockedReason: state.lastBlockedReason,\n };\n }\n\n public getClipboardFontUrl(fontId: number): string | null {\n const loadedUrl = this.loadedFonts.get(fontId);\n if (loadedUrl !== undefined) {\n return loadedUrl;\n }\n const trackedUrl = this.fontLoadStates.get(fontId)?.url;\n if (trackedUrl !== undefined) {\n return trackedUrl;\n }\n const lazyUrl = this.lazyFontSources.get(fontId);\n if (lazyUrl !== undefined) {\n return lazyUrl;\n }\n const builtInFont = getBuiltInBridgeFont(fontId);\n return builtInFont === undefined ? null : getBridgeAssetUrl(builtInFont.assetFile);\n }\n\n public registerLazyFont(fontId: number, url: string): void {\n this.lazyFontSources.set(fontId, url);\n this.rememberFontSource(fontId, url);\n if (this.loadedFonts.get(fontId) !== url) {\n this.loadedFonts.delete(fontId);\n }\n }\n\n public registerFontFallback(fontId: number, fallbackFontId: number): void {\n this.registerSingleFontFallback(fontId, fallbackFontId);\n }\n\n public handleMissingFontCoverage(fontId: number, coverageKind: number, sampleText: string): void {\n const fontState = this.ensureIncrementalFontState(fontId);\n const resolvedRequests = resolveIncrementalFontPackageRequests(fontId, coverageKind, sampleText);\n for (const request of resolvedRequests) {\n const blockReason = this.getAutoGrowBlockReason(fontId, request.packageId);\n if (blockReason !== null) {\n fontState.blockedPackageIds.add(request.packageId);\n fontState.lastBlockedReason = blockReason;\n continue;\n }\n fontState.blockedPackageIds.delete(request.packageId);\n if (fontState.blockedPackageIds.size === 0) {\n fontState.lastBlockedReason = null;\n }\n let requestedCharacters = fontState.requestedCharactersByFamily.get(request.familyKey);\n if (requestedCharacters === undefined) {\n requestedCharacters = new Set<string>();\n fontState.requestedCharactersByFamily.set(request.familyKey, requestedCharacters);\n }\n const pendingKey = `${String(fontId)}:${request.familyKey}`;\n let pendingRequest = this.pendingIncrementalFamilyRequests.get(pendingKey);\n if (pendingRequest === undefined) {\n pendingRequest = {\n packageId: request.packageId,\n coverageKind: request.coverageKind,\n familyKey: request.familyKey,\n googleFamily: request.googleFamily,\n characters: new Set<string>(),\n };\n this.pendingIncrementalFamilyRequests.set(pendingKey, pendingRequest);\n }\n let hasNovelCharacter = false;\n for (const character of request.text) {\n if (requestedCharacters.has(character)) {\n continue;\n }\n requestedCharacters.add(character);\n pendingRequest.characters.add(character);\n hasNovelCharacter = true;\n }\n if (!hasNovelCharacter || this.scheduledIncrementalFamilyFlushes.has(pendingKey)) {\n continue;\n }\n this.scheduledIncrementalFamilyFlushes.add(pendingKey);\n queueMicrotask(() => {\n void this.flushPendingIncrementalFamilyRequest(fontId, request.familyKey).catch(() => undefined);\n });\n }\n }\n\n public async loadFont(fontId: number, url: string): Promise<void> {\n if (this.isFontLoaded(fontId, url)) {\n return;\n }\n this.rememberFontSource(fontId, url);\n this.markFontLoading(fontId, url);\n try {\n const bytes = await this.fetchFontBytes(url);\n this.registerFontBytes(fontId, bytes);\n this.loadedFonts.set(fontId, url);\n this.markFontLoaded(fontId, url);\n this.onCommitFrame();\n } catch (error) {\n if (this.loadedFonts.get(fontId) === url) {\n this.loadedFonts.delete(fontId);\n }\n this.markFontLoadFailed(fontId, url);\n throw error;\n }\n }\n\n public async registerFont(font: BridgeFontRegistration): Promise<void> {\n if (!this.isFontLoaded(font.id, font.url)) {\n await this.loadFont(font.id, font.url);\n }\n if (font.fallbackIds !== undefined) {\n this.applyFontFallbacks(font.id, font.fallbackIds);\n }\n this.onCommitFrame();\n }\n\n public async registerFontStack(stack: BridgeFontStackRegistration): Promise<void> {\n const fallbackFonts = stack.fallbacks ?? [];\n await Promise.all([\n this.loadFont(stack.primary.id, stack.primary.url),\n ...fallbackFonts.map((fallback) => this.loadFont(fallback.id, fallback.url)),\n ]);\n this.applyFontFallbacks(\n stack.primary.id,\n fallbackFonts.map((fallback) => fallback.id),\n );\n this.onCommitFrame();\n }\n\n public async replayLoadedFonts(): Promise<void> {\n const fontReloads = Array.from(this.loadedFonts.entries(), async ([fontId, url]) => {\n const bytes = await this.fetchFontBytes(url, true);\n this.registerFontBytes(fontId, bytes);\n });\n await Promise.all(fontReloads);\n for (const [fontId, fallbackIds] of this.fontFallbacks.entries()) {\n for (const fallbackId of fallbackIds) {\n this.ui._ui_register_font_fallback(fontId, fallbackId);\n }\n }\n }\n}\n", "const textEncoder = new TextEncoder();\n\nexport interface FindOnPageDocument {\n readonly handle: string;\n readonly text: string;\n}\n\nexport interface ResolvedFindSelection {\n readonly handle: string;\n readonly start: number;\n readonly end: number;\n}\n\nfunction utf8ByteLength(text: string): number {\n return textEncoder.encode(text).byteLength;\n}\n\nfunction closestElement(node: Node | null): Element | null {\n if (node instanceof Element) {\n return node;\n }\n return node?.parentElement ?? null;\n}\n\nfunction utf8ByteOffsetFromCodeUnitIndex(text: string, codeUnitIndex: number): number {\n const clampedIndex = Math.max(0, Math.min(codeUnitIndex, text.length));\n return utf8ByteLength(text.slice(0, clampedIndex));\n}\n\nfunction codeUnitIndexFromUtf8ByteOffset(text: string, byteOffset: number): number {\n const target = Math.max(0, Math.min(byteOffset, utf8ByteLength(text)));\n let currentByteOffset = 0;\n let currentIndex = 0;\n while (currentIndex < text.length) {\n const codePoint = text.codePointAt(currentIndex) ?? 0;\n const nextIndex = currentIndex + (codePoint > 0xFFFF ? 2 : 1);\n const nextByteOffset = utf8ByteOffsetFromCodeUnitIndex(text, nextIndex);\n if (nextByteOffset > target) {\n break;\n }\n currentIndex = nextIndex;\n currentByteOffset = nextByteOffset;\n if (currentByteOffset === target) {\n break;\n }\n }\n return currentIndex;\n}\n\nfunction readBoundaryCodeUnitOffset(fragment: HTMLElement, container: Node, offset: number): number | null {\n const range = document.createRange();\n range.selectNodeContents(fragment);\n try {\n range.setEnd(container, offset);\n } catch {\n return null;\n }\n return range.toString().length;\n}\n\nfunction ensureProjectedElement(\n layer: HTMLElement,\n byHandle: Map<string, HTMLDivElement>,\n canvasId: string,\n entry: FindOnPageDocument,\n): HTMLDivElement {\n const existing = byHandle.get(entry.handle);\n if (existing !== undefined) {\n return existing;\n }\n\n const created = document.createElement('div');\n created.setAttribute('data-ed-find-fragment', '1');\n created.setAttribute('data-ed-canvas-id', canvasId);\n created.style.display = 'block';\n created.style.position = 'relative';\n created.style.whiteSpace = 'pre-wrap';\n created.style.wordBreak = 'break-word';\n created.style.pointerEvents = 'none';\n created.style.userSelect = 'text';\n layer.appendChild(created);\n byHandle.set(entry.handle, created);\n return created;\n}\n\nexport class FindOnPageProjector {\n private readonly layer: HTMLDivElement;\n private readonly content: HTMLDivElement;\n private readonly canvasId: string;\n private readonly elementsByHandle = new Map<string, HTMLDivElement>();\n\n public constructor(canvas: HTMLCanvasElement, canvasId: string) {\n const parent = canvas.parentElement;\n if (!(parent instanceof HTMLElement)) {\n throw new Error('Expected scene shell for Find-on-Page projection.');\n }\n\n const layer = document.createElement('div');\n layer.id = `find-on-page-layer-${canvasId}`;\n layer.style.position = 'absolute';\n layer.style.left = '0';\n layer.style.top = '0';\n layer.style.pointerEvents = 'none';\n layer.style.opacity = '0';\n layer.style.overflow = 'hidden';\n layer.style.userSelect = 'text';\n layer.setAttribute('aria-hidden', 'true');\n layer.setAttribute('data-ed-find-root', '1');\n layer.setAttribute('data-ed-canvas-id', canvasId);\n\n const content = document.createElement('div');\n content.id = `find-on-page-content-${canvasId}`;\n content.style.position = 'absolute';\n content.style.left = '0';\n content.style.top = '0';\n content.style.width = '100%';\n content.style.minHeight = '100%';\n content.style.pointerEvents = 'none';\n content.style.userSelect = 'text';\n content.style.whiteSpace = 'pre-wrap';\n content.style.color = 'transparent';\n content.style.background = 'transparent';\n layer.appendChild(content);\n parent.appendChild(layer);\n\n this.layer = layer;\n this.content = content;\n this.canvasId = canvasId;\n }\n\n public syncSize(logicalWidth: number, logicalHeight: number): void {\n const width = `${String(logicalWidth)}px`;\n const height = `${String(logicalHeight)}px`;\n this.layer.style.width = width;\n this.layer.style.height = height;\n }\n\n public update(documents: readonly FindOnPageDocument[]): void {\n const seenHandles = new Set<string>();\n const orderedElements: HTMLDivElement[] = [];\n\n for (const entry of documents) {\n seenHandles.add(entry.handle);\n const element = ensureProjectedElement(this.content, this.elementsByHandle, this.canvasId, entry);\n element.setAttribute('data-ed-handle', entry.handle);\n element.setAttribute('data-ed-start', '0');\n element.setAttribute('data-ed-end', String(utf8ByteLength(entry.text)));\n if (element.textContent !== entry.text) {\n element.textContent = entry.text;\n }\n orderedElements.push(element);\n }\n\n this.content.replaceChildren(...orderedElements);\n for (const [handle] of this.elementsByHandle.entries()) {\n if (seenHandles.has(handle)) {\n continue;\n }\n this.elementsByHandle.delete(handle);\n }\n }\n\n public resolveSelection(selection: Selection | null): ResolvedFindSelection | null {\n if (\n selection === null ||\n selection.rangeCount === 0 ||\n selection.isCollapsed ||\n document.activeElement?.getAttribute('data-effindom-hidden-editor') === 'true'\n ) {\n return null;\n }\n\n const range = selection.getRangeAt(0);\n const startElement = closestElement(range.startContainer);\n const endElement = closestElement(range.endContainer);\n if (\n startElement?.closest('[data-effindom-hidden-editor=\"true\"]') !== null ||\n endElement?.closest('[data-effindom-hidden-editor=\"true\"]') !== null\n ) {\n return null;\n }\n\n const startRoot = startElement?.closest('[data-ed-find-root=\"1\"]');\n const endRoot = endElement?.closest('[data-ed-find-root=\"1\"]');\n const startFragment = startElement?.closest('[data-ed-find-fragment=\"1\"]');\n const endFragment = endElement?.closest('[data-ed-find-fragment=\"1\"]');\n if (\n !(startRoot instanceof HTMLElement) ||\n !(endRoot instanceof HTMLElement) ||\n !(startFragment instanceof HTMLElement) ||\n !(endFragment instanceof HTMLElement) ||\n startRoot !== endRoot ||\n startFragment !== endFragment ||\n startRoot.dataset.edCanvasId !== this.canvasId ||\n startFragment.dataset.edCanvasId !== this.canvasId\n ) {\n return null;\n }\n\n const handle = startFragment.dataset.edHandle;\n const fragmentStart = Number(startFragment.dataset.edStart);\n const fragmentEnd = Number(startFragment.dataset.edEnd);\n if (\n handle === undefined ||\n !Number.isFinite(fragmentStart) ||\n !Number.isFinite(fragmentEnd) ||\n fragmentStart < 0 ||\n fragmentEnd < fragmentStart\n ) {\n return null;\n }\n\n const text = startFragment.textContent ?? '';\n const localStart = readBoundaryCodeUnitOffset(startFragment, range.startContainer, range.startOffset);\n const localEnd = readBoundaryCodeUnitOffset(startFragment, range.endContainer, range.endOffset);\n if (localStart === null || localEnd === null) {\n return null;\n }\n\n const start = fragmentStart + utf8ByteOffsetFromCodeUnitIndex(text, localStart);\n const end = fragmentStart + utf8ByteOffsetFromCodeUnitIndex(text, localEnd);\n if (start >= end || end > fragmentEnd) {\n return null;\n }\n\n return {\n handle,\n start,\n end,\n };\n }\n\n public selectMatch(match: ResolvedFindSelection | null): boolean {\n const selection = document.getSelection();\n if (selection === null) {\n return false;\n }\n if (match === null) {\n selection.removeAllRanges();\n return true;\n }\n\n const fragment = this.elementsByHandle.get(match.handle);\n if (!(fragment instanceof HTMLElement)) {\n return false;\n }\n\n const fragmentStart = Number(fragment.dataset.edStart);\n const fragmentEnd = Number(fragment.dataset.edEnd);\n if (\n !Number.isFinite(fragmentStart) ||\n !Number.isFinite(fragmentEnd) ||\n match.start < fragmentStart ||\n match.end > fragmentEnd ||\n match.start >= match.end\n ) {\n return false;\n }\n\n const text = fragment.textContent ?? '';\n const localStart = match.start - fragmentStart;\n const localEnd = match.end - fragmentStart;\n const startIndex = codeUnitIndexFromUtf8ByteOffset(text, localStart);\n const endIndex = codeUnitIndexFromUtf8ByteOffset(text, localEnd);\n const textNode = fragment.firstChild instanceof Text\n ? fragment.firstChild\n : document.createTextNode(text);\n if (fragment.firstChild !== textNode) {\n fragment.replaceChildren(textNode);\n }\n\n const range = document.createRange();\n range.setStart(textNode, startIndex);\n range.setEnd(textNode, endIndex);\n selection.removeAllRanges();\n selection.addRange(range);\n return true;\n }\n\n public destroy(): void {\n this.elementsByHandle.clear();\n this.layer.remove();\n }\n}\n", "import { FindOnPageProjector, type ResolvedFindSelection } from '../../find-on-page';\nimport type { OpenCanvasFindMatch, OpenCanvasFindState, OpenCanvasTextDocument, UiModule } from '../../core-types';\nimport { DEFAULT_OPEN_CANVAS_FIND_OPTIONS, normalizeOpenCanvasFindOptions } from '../find-session';\nimport { TextDocumentController } from './text-documents';\n\nconst OPEN_CANVAS_FIND_BACKGROUND_COLOR = 0xFFEB3B38;\n\ninterface FindControllerOptions {\n readonly canvas: HTMLCanvasElement;\n readonly ui: UiModule;\n readonly textDocuments: TextDocumentController;\n readonly commitFrame: () => void;\n readonly flushPendingCommit: () => Uint32Array | null;\n}\n\nexport class FindController {\n private readonly findProjector: FindOnPageProjector;\n private activeFindMatch: OpenCanvasFindMatch | null = null;\n private activeFindState: OpenCanvasFindState | null = null;\n private selectionPollTimer: ReturnType<typeof setInterval> | null = null;\n private selectionClearTimer: number | null = null;\n\n public constructor(private readonly options: FindControllerOptions) {\n const runtimeCanvasId = `ed-canvas-${Math.random().toString(36).slice(2, 10)}`;\n this.findProjector = new FindOnPageProjector(options.canvas, runtimeCanvasId);\n window.__bridgeFindMatch = null;\n window.__bridgeFindState = null;\n\n const handleDocumentSelectionChange = () => {\n this.handleSelectionChange();\n };\n document.addEventListener('selectionchange', handleDocumentSelectionChange);\n this.selectionPollTimer = setInterval(() => {\n if (document.hidden) {\n return;\n }\n this.handleSelectionChange();\n }, 100);\n\n this.destroy = (() => {\n if (this.selectionPollTimer !== null) {\n clearInterval(this.selectionPollTimer);\n this.selectionPollTimer = null;\n }\n this.cancelPendingFindClear();\n document.removeEventListener('selectionchange', handleDocumentSelectionChange);\n this.storeFindState(null);\n this.storeFindMatch(null);\n this.findProjector.destroy();\n }).bind(this);\n }\n\n public syncSize(logicalWidth: number, logicalHeight: number): void {\n this.findProjector.syncSize(logicalWidth, logicalHeight);\n }\n\n public syncDocuments(): void {\n this.findProjector.update(this.options.textDocuments.readFindDocuments());\n }\n\n public getFindDocuments(): readonly OpenCanvasTextDocument[] {\n return this.options.textDocuments.readFindDocuments().map((document) => ({ ...document }));\n }\n\n public getFindState(): OpenCanvasFindState | null {\n return this.activeFindState === null\n ? null\n : {\n query: this.activeFindState.query,\n options: { ...this.activeFindState.options },\n matches: this.activeFindState.matches.map((match) => ({ ...match })),\n activeMatchIndex: this.activeFindState.activeMatchIndex,\n };\n }\n\n public activateFindMatch(match: OpenCanvasFindMatch | null, reveal = true): boolean {\n return this.applyRetainedFindMatch(match, reveal);\n }\n\n public setFindState(state: OpenCanvasFindState | null, revealActive = false): boolean {\n return this.applyRetainedFindState(state, revealActive);\n }\n\n public syncFindSelection(clearOnMissing = false): boolean {\n return this.handleSelectionChange(clearOnMissing);\n }\n\n public clearFindMatch(): boolean {\n this.findProjector.selectMatch(null);\n return this.applyRetainedFindMatch(null, false);\n }\n\n public destroy(): void {}\n\n private isBridgeFindDialogOpen(): boolean {\n return document.querySelector('[data-ed-find-dialog=\"1\"][data-ed-open=\"1\"]') !== null;\n }\n\n private cancelPendingFindClear(): void {\n if (this.selectionClearTimer !== null) {\n clearTimeout(this.selectionClearTimer);\n this.selectionClearTimer = null;\n }\n }\n\n private schedulePendingFindClear(): void {\n this.cancelPendingFindClear();\n this.selectionClearTimer = window.setTimeout(() => {\n this.selectionClearTimer = null;\n if (this.isBridgeFindDialogOpen()) {\n return;\n }\n if (this.findProjector.resolveSelection(document.getSelection()) !== null) {\n return;\n }\n if (this.activeFindMatch !== null) {\n this.applyRetainedFindState(null, false);\n }\n }, 150);\n }\n\n private storeFindMatch(match: ResolvedFindSelection | null): void {\n this.activeFindMatch = match === null ? null : { ...match };\n window.__bridgeFindMatch = this.activeFindMatch;\n }\n\n private storeFindState(state: OpenCanvasFindState | null): void {\n this.activeFindState = state === null\n ? null\n : {\n query: state.query,\n options: { ...state.options },\n matches: state.matches.map((match) => ({ ...match })),\n activeMatchIndex: state.activeMatchIndex,\n };\n window.__bridgeFindState = this.activeFindState;\n }\n\n private applyRetainedFindState(\n state: OpenCanvasFindState | null,\n revealActive: boolean,\n ): boolean {\n if (state === null) {\n this.options.ui._ui_clear_text_find_highlights();\n this.options.ui._ui_clear_text_find_match();\n this.options.commitFrame();\n this.options.flushPendingCommit();\n this.storeFindState(null);\n this.storeFindMatch(null);\n return true;\n }\n\n const normalizedOptions = normalizeOpenCanvasFindOptions(state.options);\n if (\n state.activeMatchIndex < -1 ||\n state.activeMatchIndex >= state.matches.length ||\n (state.matches.length === 0 && state.activeMatchIndex !== -1)\n ) {\n return false;\n }\n\n const normalizedMatches: Array<{ readonly handleArg: number | bigint; readonly match: ResolvedFindSelection }> = [];\n for (const match of state.matches) {\n const range = this.options.textDocuments.resolveTextRange(match.handle, match.start, match.end);\n if (range === null) {\n return false;\n }\n normalizedMatches.push({\n handleArg: range.handleArg,\n match: {\n handle: match.handle,\n start: range.start,\n end: range.end,\n },\n });\n }\n\n this.options.ui._ui_clear_text_find_highlights();\n if (normalizedOptions.highlightAll) {\n for (let index = 0; index < normalizedMatches.length; index += 1) {\n if (index === state.activeMatchIndex) {\n continue;\n }\n const entry = normalizedMatches[index];\n if (entry === undefined) {\n continue;\n }\n if (\n this.options.ui._ui_push_text_find_highlight(\n entry.handleArg,\n entry.match.start,\n entry.match.end,\n OPEN_CANVAS_FIND_BACKGROUND_COLOR,\n ) === 0\n ) {\n this.options.ui._ui_clear_text_find_highlights();\n return false;\n }\n }\n }\n\n const activeEntry = state.activeMatchIndex >= 0\n ? normalizedMatches[state.activeMatchIndex] ?? null\n : null;\n if (activeEntry === null) {\n this.options.ui._ui_clear_text_find_match();\n } else {\n if (this.options.ui._ui_set_text_find_match(activeEntry.handleArg, activeEntry.match.start, activeEntry.match.end) === 0) {\n this.options.ui._ui_clear_text_find_highlights();\n return false;\n }\n if (\n revealActive &&\n this.options.ui._ui_reveal_text_range(activeEntry.handleArg, activeEntry.match.start, activeEntry.match.end) === 0\n ) {\n this.options.ui._ui_clear_text_find_highlights();\n return false;\n }\n }\n\n this.options.commitFrame();\n this.options.flushPendingCommit();\n this.storeFindState({\n query: state.query,\n options: normalizedOptions,\n matches: normalizedMatches.map((entry) => ({ ...entry.match })),\n activeMatchIndex: activeEntry === null ? -1 : state.activeMatchIndex,\n });\n this.storeFindMatch(activeEntry?.match ?? null);\n return true;\n }\n\n private applyRetainedFindMatch(\n match: ResolvedFindSelection | null,\n reveal: boolean,\n ): boolean {\n return this.applyRetainedFindState(\n match === null\n ? null\n : {\n query: '',\n options: { ...DEFAULT_OPEN_CANVAS_FIND_OPTIONS },\n matches: [{ ...match }],\n activeMatchIndex: 0,\n },\n reveal,\n );\n }\n\n private handleSelectionChange(clearOnMissing = false): boolean {\n const match = this.findProjector.resolveSelection(document.getSelection());\n if (match === null) {\n if (clearOnMissing && !this.isBridgeFindDialogOpen() && this.activeFindMatch !== null) {\n this.schedulePendingFindClear();\n }\n return false;\n }\n this.cancelPendingFindClear();\n if (\n this.activeFindMatch !== null &&\n this.activeFindMatch.handle === match.handle &&\n this.activeFindMatch.start === match.start &&\n this.activeFindMatch.end === match.end\n ) {\n return true;\n }\n return this.applyRetainedFindMatch(match, true);\n }\n}\n", "import type { SemanticBounds, SemanticNode } from './core-types';\n\nconst ROLE_NONE = 0;\nconst ROLE_BUTTON = 1;\nconst ROLE_TEXTBOX = 2;\nconst ROLE_LINK = 3;\nconst ROLE_HEADING = 4;\nconst ROLE_FORM = 5;\nconst ROLE_LIST = 6;\nconst ROLE_LIST_ITEM = 7;\nconst ROLE_IMAGE = 8;\nconst ROLE_DIALOG = 9;\nconst ROLE_STATIC_TEXT = 10;\nconst ROLE_CHECKBOX = 11;\nconst ROLE_RADIO = 12;\nconst ROLE_RADIO_GROUP = 13;\nconst ROLE_SWITCH = 14;\nconst ROLE_SLIDER = 15;\nconst ROLE_COMBOBOX = 16;\n\nconst STATE_HAS_SELECTED = 1 << 0;\nconst STATE_IS_SELECTED = 1 << 1;\nconst STATE_HAS_EXPANDED = 1 << 2;\nconst STATE_IS_EXPANDED = 1 << 3;\nconst STATE_HAS_DISABLED = 1 << 4;\nconst STATE_IS_DISABLED = 1 << 5;\nconst STATE_HAS_VALUE_RANGE = 1 << 6;\nconst STATE_HAS_READONLY = 1 << 7;\nconst STATE_IS_READONLY = 1 << 8;\nconst STATE_HAS_MULTILINE = 1 << 9;\nconst STATE_IS_MULTILINE = 1 << 10;\n\nconst CHECKED_NONE = 0;\nconst CHECKED_FALSE = 1;\nconst CHECKED_TRUE = 2;\nconst CHECKED_MIXED = 3;\n\nconst ORIENTATION_NONE = 0;\nconst ORIENTATION_HORIZONTAL = 1;\nconst ORIENTATION_VERTICAL = 2;\n\nconst textDecoder = new TextDecoder();\nconst floatWordView = new DataView(new ArrayBuffer(4));\nconst textRunFitCache = new WeakMap<HTMLSpanElement, {\n readonly key: string;\n readonly scaleX: number;\n readonly scaleY: number;\n readonly translateX: number;\n readonly translateY: number;\n}>();\n\ninterface SemanticRoleDescriptor {\n readonly roleName: string;\n readonly tagName: string;\n readonly ariaRole: string | null;\n}\n\ninterface SemanticTextLayout {\n readonly bounds: SemanticBounds;\n}\n\nconst SEMANTIC_ROLE_DESCRIPTORS: Record<number, SemanticRoleDescriptor> = {\n [ROLE_NONE]: { roleName: 'none', tagName: 'span', ariaRole: null },\n [ROLE_BUTTON]: { roleName: 'button', tagName: 'button', ariaRole: 'button' },\n [ROLE_TEXTBOX]: { roleName: 'textbox', tagName: 'input', ariaRole: 'textbox' },\n [ROLE_LINK]: { roleName: 'link', tagName: 'a', ariaRole: 'link' },\n [ROLE_HEADING]: { roleName: 'heading', tagName: 'h1', ariaRole: 'heading' },\n [ROLE_FORM]: { roleName: 'form', tagName: 'form', ariaRole: 'form' },\n [ROLE_LIST]: { roleName: 'list', tagName: 'ul', ariaRole: 'list' },\n [ROLE_LIST_ITEM]: { roleName: 'listitem', tagName: 'li', ariaRole: 'listitem' },\n [ROLE_IMAGE]: { roleName: 'img', tagName: 'div', ariaRole: 'img' },\n [ROLE_DIALOG]: { roleName: 'dialog', tagName: 'dialog', ariaRole: 'dialog' },\n [ROLE_STATIC_TEXT]: { roleName: 'text', tagName: 'p', ariaRole: null },\n [ROLE_CHECKBOX]: { roleName: 'checkbox', tagName: 'input', ariaRole: 'checkbox' },\n [ROLE_RADIO]: { roleName: 'radio', tagName: 'input', ariaRole: 'radio' },\n [ROLE_RADIO_GROUP]: { roleName: 'radiogroup', tagName: 'div', ariaRole: 'radiogroup' },\n [ROLE_SWITCH]: { roleName: 'switch', tagName: 'button', ariaRole: 'switch' },\n [ROLE_SLIDER]: { roleName: 'slider', tagName: 'div', ariaRole: 'slider' },\n [ROLE_COMBOBOX]: { roleName: 'combobox', tagName: 'div', ariaRole: 'combobox' },\n};\n\nfunction decodeCheckedState(checkedState: number): 'false' | 'true' | 'mixed' | undefined {\n if (checkedState === CHECKED_FALSE) {\n return 'false';\n }\n if (checkedState === CHECKED_TRUE) {\n return 'true';\n }\n if (checkedState === CHECKED_MIXED) {\n return 'mixed';\n }\n return undefined;\n}\n\nfunction decodeOrientation(orientation: number): 'horizontal' | 'vertical' | undefined {\n if (orientation === ORIENTATION_HORIZONTAL) {\n return 'horizontal';\n }\n if (orientation === ORIENTATION_VERTICAL) {\n return 'vertical';\n }\n return undefined;\n}\n\nfunction wordToFloat(word: number): number {\n floatWordView.setUint32(0, word >>> 0, true);\n return floatWordView.getFloat32(0, true);\n}\n\nfunction describeRole(role: number): SemanticRoleDescriptor {\n return SEMANTIC_ROLE_DESCRIPTORS[role] ?? {\n roleName: `unknown-${String(role)}`,\n tagName: 'span',\n ariaRole: null,\n };\n}\n\nfunction resolveTagName(node: SemanticNode, descriptor: SemanticRoleDescriptor): string {\n if (node.role === ROLE_TEXTBOX && node.state.multiline === true) {\n return 'textarea';\n }\n return descriptor.tagName;\n}\n\nfunction decodeLabel(words: Uint32Array, startWordIndex: number, labelLength: number): string {\n if (labelLength === 0) {\n return '';\n }\n const byteOffset = words.byteOffset + (startWordIndex * 4);\n const paddedByteLength = Math.ceil(labelLength / 4) * 4;\n const labelBytes = new Uint8Array(words.buffer, byteOffset, paddedByteLength);\n return textDecoder.decode(labelBytes.subarray(0, labelLength));\n}\n\nexport function parseSemanticBuffer(words: Uint32Array): SemanticNode[] {\n if (words.length === 0) {\n return [];\n }\n\n const recordCount = words[0] ?? 0;\n if (recordCount === 0) {\n return [];\n }\n\n let index = 1;\n const nodes: SemanticNode[] = [];\n nodes.length = 0;\n\n for (let recordIndex = 0; recordIndex < recordCount; recordIndex += 1) {\n if ((index + 14) > words.length) {\n throw new Error('Semantic buffer ended mid-record.');\n }\n\n const role = words[index] ?? ROLE_NONE;\n const handleLow = words[index + 1] ?? 0;\n const handleHigh = words[index + 2] ?? 0;\n const stateFlags = words[index + 7] ?? 0;\n const checkedState = words[index + 8] ?? CHECKED_NONE;\n const orientation = words[index + 9] ?? ORIENTATION_NONE;\n const valueNow = wordToFloat(words[index + 10] ?? 0);\n const valueMin = wordToFloat(words[index + 11] ?? 0);\n const valueMax = wordToFloat(words[index + 12] ?? 0);\n const labelLength = words[index + 13] ?? 0;\n const labelWordCount = Math.ceil(labelLength / 4);\n const descriptor = describeRole(role);\n const handle = ((BigInt(handleHigh) << 32n) | BigInt(handleLow)).toString();\n const bounds: SemanticBounds = {\n x: wordToFloat(words[index + 3] ?? 0),\n y: wordToFloat(words[index + 4] ?? 0),\n width: wordToFloat(words[index + 5] ?? 0),\n height: wordToFloat(words[index + 6] ?? 0),\n };\n const state: {\n checked?: 'false' | 'true' | 'mixed';\n selected?: boolean;\n expanded?: boolean;\n disabled?: boolean;\n readonly?: boolean;\n multiline?: boolean;\n orientation?: 'horizontal' | 'vertical';\n valueNow?: number;\n valueMin?: number;\n valueMax?: number;\n } = {};\n const checked = decodeCheckedState(checkedState);\n if (checked !== undefined) {\n state.checked = checked;\n }\n if ((stateFlags & STATE_HAS_SELECTED) !== 0) {\n state.selected = (stateFlags & STATE_IS_SELECTED) !== 0;\n }\n if ((stateFlags & STATE_HAS_EXPANDED) !== 0) {\n state.expanded = (stateFlags & STATE_IS_EXPANDED) !== 0;\n }\n if ((stateFlags & STATE_HAS_DISABLED) !== 0) {\n state.disabled = (stateFlags & STATE_IS_DISABLED) !== 0;\n }\n if ((stateFlags & STATE_HAS_READONLY) !== 0) {\n state.readonly = (stateFlags & STATE_IS_READONLY) !== 0;\n }\n if ((stateFlags & STATE_HAS_MULTILINE) !== 0) {\n state.multiline = (stateFlags & STATE_IS_MULTILINE) !== 0;\n }\n const decodedOrientation = decodeOrientation(orientation);\n if (decodedOrientation !== undefined) {\n state.orientation = decodedOrientation;\n }\n if ((stateFlags & STATE_HAS_VALUE_RANGE) !== 0) {\n state.valueNow = valueNow;\n state.valueMin = valueMin;\n state.valueMax = valueMax;\n }\n index += 14;\n if ((index + labelWordCount) > words.length) {\n throw new Error('Semantic buffer label exceeded record bounds.');\n }\n const label = decodeLabel(words, index, labelLength);\n index += labelWordCount;\n nodes.push({\n role,\n roleName: descriptor.roleName,\n handle,\n bounds,\n label,\n state,\n });\n }\n\n return nodes;\n}\n\nfunction applyNodeFrame(element: HTMLElement, bounds: SemanticBounds): void {\n element.style.left = `${String(bounds.x)}px`;\n element.style.top = `${String(bounds.y)}px`;\n element.style.width = `${String(bounds.width)}px`;\n element.style.height = `${String(bounds.height)}px`;\n}\n\nfunction ensureTextRun(element: HTMLElement): HTMLSpanElement {\n const existing = element.firstElementChild;\n if (existing instanceof HTMLSpanElement && existing.getAttribute('data-semantic-text-run') === 'true') {\n return existing;\n }\n const textRun = document.createElement('span');\n textRun.setAttribute('data-semantic-text-run', 'true');\n textRun.style.position = 'absolute';\n textRun.style.left = '0';\n textRun.style.top = '0';\n textRun.style.display = 'block';\n textRun.style.pointerEvents = 'none';\n textRun.style.margin = '0';\n textRun.style.padding = '0';\n textRun.style.border = '0';\n element.replaceChildren(textRun);\n return textRun;\n}\n\nfunction ensureTextRunContent(textRun: HTMLSpanElement): HTMLSpanElement {\n const existing = textRun.firstElementChild;\n if (existing instanceof HTMLSpanElement && existing.getAttribute('data-semantic-text-content') === 'true') {\n return existing;\n }\n const textContent = document.createElement('span');\n textContent.setAttribute('data-semantic-text-content', 'true');\n textContent.style.display = 'inline-block';\n textContent.style.margin = '0';\n textContent.style.padding = '0';\n textContent.style.border = '0';\n textContent.style.whiteSpace = 'pre-wrap';\n textContent.style.overflowWrap = 'break-word';\n textContent.style.color = 'inherit';\n textContent.style.webkitTextFillColor = 'inherit';\n textContent.style.transformOrigin = 'top left';\n textRun.replaceChildren(textContent);\n return textContent;\n}\n\nfunction ensureTextNode(textContent: HTMLSpanElement): Text {\n if (textContent.childNodes.length === 1) {\n const onlyChild = textContent.firstChild;\n if (onlyChild instanceof Text) {\n return onlyChild;\n }\n }\n const textNode = document.createTextNode('');\n textContent.replaceChildren(textNode);\n return textNode;\n}\n\nfunction clearTextRun(element: HTMLElement): void {\n const existing = element.firstElementChild;\n if (existing instanceof HTMLSpanElement && existing.getAttribute('data-semantic-text-run') === 'true') {\n textRunFitCache.delete(existing);\n existing.remove();\n }\n}\n\nfunction applyTextRunLayout(\n textRun: HTMLSpanElement,\n nodeBounds: SemanticBounds,\n textLayout: SemanticTextLayout | undefined,\n): void {\n if (textLayout === undefined) {\n textRunFitCache.delete(textRun);\n const textContent = ensureTextRunContent(textRun);\n textRun.style.left = '0';\n textRun.style.top = '0';\n textRun.style.width = '';\n textRun.style.height = '';\n textRun.style.overflow = 'visible';\n textContent.style.width = '';\n textContent.style.height = '';\n textContent.style.transform = '';\n return;\n }\n\n const textContent = ensureTextRunContent(textRun);\n const offsetX = textLayout.bounds.x - nodeBounds.x;\n const offsetY = textLayout.bounds.y - nodeBounds.y;\n textRun.style.left = `${String(offsetX)}px`;\n textRun.style.top = `${String(offsetY)}px`;\n textRun.style.width = `${String(textLayout.bounds.width)}px`;\n textRun.style.height = `${String(textLayout.bounds.height)}px`;\n textRun.style.overflow = 'hidden';\n textContent.style.width = `${String(textLayout.bounds.width)}px`;\n textContent.style.height = '';\n textContent.style.transform = '';\n const firstChild = textContent.firstChild;\n const textValue = firstChild instanceof Text ? firstChild.data : '';\n const fitKey = [\n textValue,\n textLayout.bounds.width.toFixed(3),\n textLayout.bounds.height.toFixed(3),\n ].join('\\u001f');\n const cachedFit = textRunFitCache.get(textRun);\n if (cachedFit?.key === fitKey) {\n textContent.style.transform = `matrix(${String(cachedFit.scaleX)}, 0, 0, ${String(cachedFit.scaleY)}, ${String(cachedFit.translateX)}, ${String(cachedFit.translateY)})`;\n return;\n }\n const measuredChild = textContent.firstChild;\n let scaleX = 1;\n let scaleY = 1;\n let translateX = 0;\n let translateY = 0;\n if (measuredChild instanceof Text && measuredChild.data.length > 0) {\n const range = document.createRange();\n range.selectNodeContents(measuredChild);\n const measured = range.getBoundingClientRect();\n const contentRect = textContent.getBoundingClientRect();\n const nextScaleX = measured.width > 0 ? textLayout.bounds.width / measured.width : 1;\n const nextScaleY = measured.height > 0 ? textLayout.bounds.height / measured.height : 1;\n scaleX = Number.isFinite(nextScaleX) && nextScaleX > 0 ? nextScaleX : 1;\n scaleY = Number.isFinite(nextScaleY) && nextScaleY > 0 ? nextScaleY : 1;\n const localX = measured.x - contentRect.x;\n const localY = measured.y - contentRect.y;\n translateX = Number.isFinite(localX) ? -(localX * scaleX) : 0;\n translateY = Number.isFinite(localY) ? -(localY * scaleY) : 0;\n }\n textContent.style.transform = `matrix(${String(scaleX)}, 0, 0, ${String(scaleY)}, ${String(translateX)}, ${String(translateY)})`;\n textRunFitCache.set(textRun, {\n key: fitKey,\n scaleX,\n scaleY,\n translateX,\n translateY,\n });\n}\n\nfunction syncOrderedChildren(container: HTMLElement, orderedElements: readonly HTMLElement[]): void {\n let nextChild = container.firstElementChild as HTMLElement | null;\n for (const element of orderedElements) {\n if (element === nextChild) {\n nextChild = nextChild.nextElementSibling as HTMLElement | null;\n continue;\n }\n container.insertBefore(element, nextChild);\n }\n while (nextChild !== null) {\n const stale = nextChild;\n nextChild = stale.nextElementSibling as HTMLElement | null;\n stale.remove();\n }\n}\n\nfunction boundsContain(container: SemanticBounds, candidate: SemanticBounds): boolean {\n return candidate.x >= container.x &&\n candidate.y >= container.y &&\n (candidate.x + candidate.width) <= (container.x + container.width) &&\n (candidate.y + candidate.height) <= (container.y + container.height);\n}\n\nfunction ensureProjectedElement(\n layer: HTMLElement,\n byHandle: Map<string, HTMLElement>,\n node: SemanticNode,\n): HTMLElement {\n const descriptor = describeRole(node.role);\n const tagName = resolveTagName(node, descriptor);\n const existing = byHandle.get(node.handle);\n if (existing?.tagName.toLowerCase() === tagName) {\n return existing;\n }\n\n const created = document.createElement(tagName);\n created.setAttribute('data-handle', node.handle);\n created.style.position = 'absolute';\n created.style.pointerEvents = 'none';\n created.style.margin = '0';\n created.style.padding = '0';\n created.style.boxSizing = 'border-box';\n created.style.background = 'transparent';\n created.style.border = '0';\n created.style.outline = 'none';\n created.style.appearance = 'none';\n created.style.webkitAppearance = 'none';\n created.style.color = 'transparent';\n created.style.webkitTextFillColor = 'transparent';\n created.style.caretColor = 'transparent';\n created.style.lineHeight = 'normal';\n created.tabIndex = -1;\n\n if (tagName === 'input') {\n const input = created as HTMLInputElement;\n if (node.role === ROLE_CHECKBOX) {\n input.type = 'checkbox';\n } else if (node.role === ROLE_RADIO) {\n input.type = 'radio';\n } else {\n input.type = 'text';\n }\n input.readOnly = node.state.readonly ?? true;\n } else if (tagName === 'textarea') {\n const textarea = created as HTMLTextAreaElement;\n textarea.readOnly = node.state.readonly ?? true;\n textarea.rows = 1;\n textarea.style.resize = 'none';\n }\n\n if (node.role === ROLE_TEXTBOX && node.state.multiline === true) {\n created.setAttribute('aria-multiline', 'true');\n }\n\n if (existing?.parentElement === layer) {\n layer.replaceChild(created, existing);\n } else {\n layer.appendChild(created);\n }\n\n byHandle.set(node.handle, created);\n return created;\n}\n\nfunction cloneNode(node: SemanticNode): SemanticNode {\n return {\n role: node.role,\n roleName: node.roleName,\n handle: node.handle,\n bounds: {\n x: node.bounds.x,\n y: node.bounds.y,\n width: node.bounds.width,\n height: node.bounds.height,\n },\n label: node.label,\n state: { ...node.state },\n };\n}\n\nfunction roleNeedsAriaLabel(role: number): boolean {\n return role === ROLE_BUTTON ||\n role === ROLE_TEXTBOX ||\n role === ROLE_IMAGE ||\n role === ROLE_DIALOG ||\n role === ROLE_CHECKBOX ||\n role === ROLE_RADIO ||\n role === ROLE_SLIDER ||\n role === ROLE_COMBOBOX;\n}\n\nfunction roleUsesTextContent(role: number): boolean {\n return role !== ROLE_BUTTON && role !== ROLE_IMAGE;\n}\n\nfunction describeAnnouncementRole(node: SemanticNode): string {\n switch (node.role) {\n case ROLE_BUTTON:\n return 'button';\n case ROLE_TEXTBOX:\n return node.state.multiline === true ? 'text area' : 'text input';\n case ROLE_LINK:\n return 'link';\n case ROLE_HEADING:\n return 'heading';\n case ROLE_FORM:\n return 'form';\n case ROLE_LIST:\n return 'list';\n case ROLE_LIST_ITEM:\n return 'list item';\n case ROLE_IMAGE:\n return 'image';\n case ROLE_DIALOG:\n return 'dialog';\n case ROLE_STATIC_TEXT:\n return 'text';\n case ROLE_CHECKBOX:\n return 'checkbox';\n case ROLE_RADIO:\n return 'radio button';\n case ROLE_RADIO_GROUP:\n return 'radio group';\n case ROLE_SWITCH:\n return 'switch';\n case ROLE_SLIDER:\n return 'slider';\n case ROLE_COMBOBOX:\n return 'combo box';\n default:\n return node.roleName;\n }\n}\n\nfunction buildNodeAnnouncement(\n node: SemanticNode,\n textByHandle: Readonly<Record<string, string>>,\n): string {\n const parts: string[] = [];\n const label = node.role === ROLE_TEXTBOX && node.label.length === 0\n ? (textByHandle[node.handle] ?? '')\n : node.label;\n if (label.length > 0) {\n parts.push(label);\n }\n if (!(node.role === ROLE_SLIDER && label.length > 0)) {\n parts.push(describeAnnouncementRole(node));\n }\n if (node.state.checked === 'mixed') {\n parts.push('mixed');\n } else if (node.state.checked === 'true') {\n parts.push('checked');\n } else if (\n node.state.checked === 'false' &&\n (node.role === ROLE_CHECKBOX || node.role === ROLE_RADIO || node.role === ROLE_SWITCH)\n ) {\n parts.push('unchecked');\n }\n if (node.state.selected === true) {\n parts.push('selected');\n }\n if (node.state.expanded === true) {\n parts.push('expanded');\n } else if (node.state.expanded === false) {\n parts.push('collapsed');\n }\n if (node.state.readonly === true) {\n parts.push('read only');\n }\n if (node.state.disabled === true) {\n parts.push('disabled');\n }\n if (node.state.valueNow !== undefined && Number.isFinite(node.state.valueNow)) {\n parts.push(`value ${String(node.state.valueNow)}`);\n }\n return parts.join(', ');\n}\n\nclass LiveAnnouncer {\n private readonly element: HTMLOutputElement;\n private pendingFrame: number | null = null;\n private pendingTimer: ReturnType<typeof setTimeout> | null = null;\n private clearTimer: ReturnType<typeof setTimeout> | null = null;\n\n public constructor(root: ShadowRoot) {\n const element = document.createElement('output');\n element.id = 'semantic-live-announcer';\n element.setAttribute('role', 'status');\n element.setAttribute('aria-live', 'polite');\n element.setAttribute('aria-atomic', 'true');\n element.setAttribute('data-effindom-live-announcer', 'true');\n element.style.position = 'absolute';\n element.style.width = '1px';\n element.style.height = '1px';\n element.style.margin = '-1px';\n element.style.padding = '0';\n element.style.border = '0';\n element.style.overflow = 'hidden';\n element.style.clip = 'rect(0 0 0 0)';\n element.style.clipPath = 'inset(50%)';\n element.style.whiteSpace = 'nowrap';\n element.style.opacity = '0';\n element.textContent = '\\u00A0';\n root.appendChild(element);\n this.element = element;\n }\n\n public announce(message: string): void {\n if (message.length === 0) {\n return;\n }\n if (this.pendingFrame !== null) {\n cancelAnimationFrame(this.pendingFrame);\n this.pendingFrame = null;\n }\n if (this.pendingTimer !== null) {\n clearTimeout(this.pendingTimer);\n this.pendingTimer = null;\n }\n if (this.clearTimer !== null) {\n clearTimeout(this.clearTimer);\n this.clearTimer = null;\n }\n this.element.textContent = '\\u00A0';\n this.pendingFrame = requestAnimationFrame(() => {\n this.pendingFrame = null;\n this.pendingTimer = setTimeout(() => {\n this.pendingTimer = null;\n this.element.textContent = message;\n this.clearTimer = setTimeout(() => {\n this.clearTimer = null;\n this.element.textContent = '\\u00A0';\n }, 1500);\n }, 50);\n });\n }\n\n public destroy(): void {\n if (this.pendingFrame !== null) {\n cancelAnimationFrame(this.pendingFrame);\n this.pendingFrame = null;\n }\n if (this.pendingTimer !== null) {\n clearTimeout(this.pendingTimer);\n this.pendingTimer = null;\n }\n if (this.clearTimer !== null) {\n clearTimeout(this.clearTimer);\n this.clearTimer = null;\n }\n this.element.remove();\n }\n}\n\nexport class HiddenDomProjector {\n private readonly canvas: HTMLCanvasElement;\n private readonly shell: HTMLDivElement;\n private readonly layer: HTMLDivElement;\n private readonly content: HTMLDivElement;\n private readonly announcer: LiveAnnouncer;\n private readonly elementsByHandle = new Map<string, HTMLElement>();\n\n public constructor(canvas: HTMLCanvasElement) {\n const parent = canvas.parentElement;\n if (!(parent instanceof HTMLElement)) {\n throw new Error('Expected canvas parent element for semantic projection.');\n }\n\n const shell = document.createElement('div');\n shell.id = 'scene-shell';\n shell.style.position = 'relative';\n shell.style.display = 'inline-block';\n shell.style.lineHeight = '0';\n parent.replaceChild(shell, canvas);\n\n const layer = document.createElement('div');\n layer.id = 'semantic-layer';\n layer.style.position = 'absolute';\n layer.style.left = '0';\n layer.style.top = '0';\n layer.style.pointerEvents = 'none';\n layer.style.overflow = 'hidden';\n layer.style.lineHeight = 'normal';\n layer.setAttribute('data-visibility', 'screen-reader-only');\n const shadowRoot = layer.attachShadow({ mode: 'open' });\n\n const content = document.createElement('div');\n content.id = 'semantic-content';\n content.style.position = 'absolute';\n content.style.left = '0';\n content.style.top = '0';\n content.style.width = '100%';\n content.style.height = '100%';\n content.style.padding = '0';\n content.style.border = '0';\n content.style.overflow = 'hidden';\n content.style.whiteSpace = 'nowrap';\n content.style.color = 'transparent';\n content.style.webkitTextFillColor = 'transparent';\n content.style.lineHeight = 'normal';\n shadowRoot.appendChild(content);\n const announcer = new LiveAnnouncer(shadowRoot);\n\n shell.appendChild(canvas);\n shell.appendChild(layer);\n\n canvas.setAttribute('role', 'application');\n canvas.setAttribute('aria-label', 'EffinDom application');\n\n this.canvas = canvas;\n this.shell = shell;\n this.layer = layer;\n this.content = content;\n this.announcer = announcer;\n }\n\n public syncSize(logicalWidth: number, logicalHeight: number): void {\n const width = `${String(logicalWidth)}px`;\n const height = `${String(logicalHeight)}px`;\n this.shell.style.width = width;\n this.shell.style.height = height;\n this.layer.style.width = width;\n this.layer.style.height = height;\n }\n\n public update(\n nodes: readonly SemanticNode[],\n textByHandle: Readonly<Record<string, string>>,\n textLayoutsByHandle: Readonly<Record<string, SemanticTextLayout | undefined>>,\n ): void {\n const seenHandles = new Set<string>();\n const orderedElements: HTMLElement[] = [];\n\n for (const node of nodes) {\n seenHandles.add(node.handle);\n const descriptor = describeRole(node.role);\n const element = ensureProjectedElement(this.content, this.elementsByHandle, node);\n orderedElements.push(element);\n const label = node.role === ROLE_TEXTBOX && node.label.length === 0\n ? (textByHandle[node.handle] ?? '')\n : node.label;\n\n if (descriptor.ariaRole === null) {\n element.removeAttribute('role');\n } else {\n element.setAttribute('role', descriptor.ariaRole);\n }\n if (label.length === 0 || !roleNeedsAriaLabel(node.role)) {\n element.removeAttribute('aria-label');\n } else {\n element.setAttribute('aria-label', label);\n }\n if (node.role === ROLE_DIALOG) {\n element.setAttribute('aria-modal', 'true');\n if (element instanceof HTMLDialogElement) {\n element.setAttribute('open', '');\n }\n } else {\n element.removeAttribute('aria-modal');\n }\n if (node.state.checked === undefined) {\n element.removeAttribute('aria-checked');\n } else {\n element.setAttribute('aria-checked', node.state.checked);\n }\n if (node.state.selected === undefined) {\n element.removeAttribute('aria-selected');\n } else {\n element.setAttribute('aria-selected', node.state.selected ? 'true' : 'false');\n }\n if (node.state.expanded === undefined) {\n element.removeAttribute('aria-expanded');\n } else {\n element.setAttribute('aria-expanded', node.state.expanded ? 'true' : 'false');\n }\n if (node.state.disabled === undefined) {\n element.removeAttribute('aria-disabled');\n } else {\n element.setAttribute('aria-disabled', node.state.disabled ? 'true' : 'false');\n }\n if (node.state.readonly === undefined) {\n element.removeAttribute('aria-readonly');\n } else {\n element.setAttribute('aria-readonly', node.state.readonly ? 'true' : 'false');\n }\n if (node.state.multiline === undefined) {\n element.removeAttribute('aria-multiline');\n } else {\n element.setAttribute('aria-multiline', node.state.multiline ? 'true' : 'false');\n }\n if (node.state.orientation === undefined) {\n element.removeAttribute('aria-orientation');\n } else {\n element.setAttribute('aria-orientation', node.state.orientation);\n }\n if (node.state.valueNow === undefined) {\n element.removeAttribute('aria-valuenow');\n element.removeAttribute('aria-valuemin');\n element.removeAttribute('aria-valuemax');\n } else {\n element.setAttribute('aria-valuenow', String(node.state.valueNow));\n element.setAttribute('aria-valuemin', String(node.state.valueMin ?? 0));\n element.setAttribute('aria-valuemax', String(node.state.valueMax ?? 0));\n }\n element.id = `semantic-node-${node.handle}`;\n element.setAttribute('data-role', node.roleName);\n applyNodeFrame(element, node.bounds);\n\n if (element instanceof HTMLInputElement) {\n if (node.role === ROLE_CHECKBOX) {\n element.checked = node.state.checked === 'true';\n element.indeterminate = node.state.checked === 'mixed';\n } else if (node.role === ROLE_RADIO) {\n element.checked = node.state.checked === 'true';\n } else {\n const nextValue = textByHandle[node.handle] ?? '';\n if (element.value !== nextValue) {\n element.value = nextValue;\n }\n element.readOnly = node.state.readonly ?? true;\n }\n } else if (element instanceof HTMLTextAreaElement) {\n const nextValue = textByHandle[node.handle] ?? '';\n if (element.value !== nextValue) {\n element.value = nextValue;\n }\n element.readOnly = node.state.readonly ?? true;\n } else if (roleUsesTextContent(node.role)) {\n const textRun = ensureTextRun(element);\n const textNode = ensureTextNode(ensureTextRunContent(textRun));\n if (textNode.data !== label) {\n textNode.data = label;\n }\n applyTextRunLayout(textRun, node.bounds, textLayoutsByHandle[node.handle]);\n } else {\n clearTextRun(element);\n if (element.textContent !== '') {\n element.textContent = '';\n }\n }\n }\n\n for (const node of nodes) {\n if (node.role !== ROLE_DIALOG) {\n continue;\n }\n const dialogElement = this.elementsByHandle.get(node.handle);\n if (!(dialogElement instanceof HTMLElement)) {\n continue;\n }\n\n const heading = nodes.find((candidate) =>\n candidate.handle !== node.handle &&\n candidate.role === ROLE_HEADING &&\n boundsContain(node.bounds, candidate.bounds));\n const descriptionNodes = nodes.filter((candidate) =>\n candidate.handle !== node.handle &&\n candidate.role === ROLE_STATIC_TEXT &&\n boundsContain(node.bounds, candidate.bounds));\n\n if (heading !== undefined) {\n dialogElement.setAttribute('aria-labelledby', `semantic-node-${heading.handle}`);\n } else {\n dialogElement.removeAttribute('aria-labelledby');\n }\n\n if (descriptionNodes.length > 0) {\n dialogElement.setAttribute(\n 'aria-describedby',\n descriptionNodes.map((candidate) => `semantic-node-${candidate.handle}`).join(' '),\n );\n } else {\n dialogElement.removeAttribute('aria-describedby');\n }\n }\n\n for (const [handle, element] of this.elementsByHandle.entries()) {\n if (seenHandles.has(handle)) {\n continue;\n }\n element.remove();\n this.elementsByHandle.delete(handle);\n }\n syncOrderedChildren(this.content, orderedElements);\n }\n\n public announceNode(\n handle: string,\n nodes: readonly SemanticNode[],\n textByHandle: Readonly<Record<string, string>>,\n ): void {\n const node = nodes.find((candidate) => candidate.handle === handle);\n if (node === undefined) {\n return;\n }\n this.announcer.announce(buildNodeAnnouncement(node, textByHandle));\n }\n\n public destroy(): void {\n this.announcer.destroy();\n for (const element of this.elementsByHandle.values()) {\n element.remove();\n }\n this.elementsByHandle.clear();\n this.layer.remove();\n const parent = this.shell.parentElement;\n if (parent !== null) {\n parent.replaceChild(this.canvas, this.shell);\n } else {\n this.shell.remove();\n }\n }\n}\n\nexport function cloneSemanticTree(nodes: readonly SemanticNode[]): SemanticNode[] {\n return nodes.map((node) => cloneNode(node));\n}\n", "import { cloneSemanticTree } from '../../semantic';\nimport type {\n OpenCanvasApi,\n OpenCanvasFindOptions,\n UiModule,\n} from '../../core-types';\nimport { findTextInOpenCanvasDocuments } from '../find-session';\nimport { FindController } from './find-controller';\nimport { SemanticController } from './semantic-controller';\nimport { TextDocumentController } from './text-documents';\n\ninterface OpenCanvasApiAdapterOptions {\n readonly ui: UiModule;\n readonly semantic: SemanticController;\n readonly find: FindController;\n readonly textDocuments: TextDocumentController;\n readonly commitFrame: () => void;\n readonly flushPendingCommit: () => Uint32Array | null;\n}\n\nexport class OpenCanvasApiAdapter {\n private readonly api: OpenCanvasApi;\n\n public constructor(private readonly options: OpenCanvasApiAdapterOptions) {\n this.api = {\n getSemanticTree: () => cloneSemanticTree(this.options.semantic.getSemanticTree()),\n getBoundingBox: (handle: string) => this.options.semantic.getBoundingBox(handle),\n getTextVisibleBounds: (handle: string) => {\n const bounds = this.options.textDocuments.readVisibleTextBounds(handle);\n return bounds === null ? null : { ...bounds };\n },\n getTextDocument: (handle: string) => {\n const snapshot = this.options.textDocuments.readTextDocumentSnapshot(handle);\n return snapshot === null ? null : { ...snapshot.document };\n },\n getRangeRects: (handle: string, start: number, end: number) =>\n this.options.textDocuments.readRangeRects(handle, start, end).map((rect) => ({ ...rect })),\n findText: (query: string, options?: OpenCanvasFindOptions) => {\n const results = findTextInOpenCanvasDocuments(this.options.textDocuments.readFindDocuments(), query, options);\n return {\n query: results.query,\n options: { ...results.options },\n matches: results.matches.map((match) => ({ ...match })),\n };\n },\n setFindState: (state, revealActive = false) => this.options.find.setFindState(state, revealActive),\n getFindState: () => this.options.find.getFindState(),\n setFindMatch: (match) => this.options.find.activateFindMatch(match, false),\n revealRange: (handle: string, start: number, end: number) => {\n const range = this.options.textDocuments.resolveTextRange(handle, start, end);\n if (range === null) {\n return false;\n }\n if (this.options.ui._ui_reveal_text_range(range.handleArg, range.start, range.end) === 0) {\n return false;\n }\n this.options.commitFrame();\n this.options.flushPendingCommit();\n return true;\n },\n };\n window.__OPEN_CANVAS_API__ = this.api;\n }\n\n public getApi(): OpenCanvasApi {\n return this.api;\n }\n\n public destroy(): void {\n delete window.__OPEN_CANVAS_API__;\n }\n}\n", "import { cloneSemanticTree, HiddenDomProjector, parseSemanticBuffer } from '../../semantic';\nimport type { SemanticNode, UiModule } from '../../core-types';\nimport type { BridgeInteractionState } from '../local-types';\nimport { extractSemanticBuffer } from '../utils/heap';\nimport { TextDocumentController } from './text-documents';\n\nconst SEMANTIC_ANNOUNCEMENT_DELAY_MS = 50;\n\nexport class SemanticController {\n private readonly projector: HiddenDomProjector;\n private semanticTree: SemanticNode[] = [];\n private semanticTextLayoutsByHandle: Record<string, {\n readonly bounds: SemanticNode['bounds'];\n } | undefined> = {};\n private semanticAnnouncementTimer: number | null = null;\n private scheduledSemanticAnnouncementHandle: string | null = null;\n\n public constructor(\n canvas: HTMLCanvasElement,\n private readonly ui: UiModule,\n private readonly interactionState: BridgeInteractionState,\n private readonly textDocuments: TextDocumentController,\n ) {\n this.projector = new HiddenDomProjector(canvas);\n }\n\n public syncSize(logicalWidth: number, logicalHeight: number): void {\n this.projector.syncSize(logicalWidth, logicalHeight);\n }\n\n public syncSemanticState(): void {\n this.semanticTree = parseSemanticBuffer(extractSemanticBuffer(this.ui));\n for (const node of this.semanticTree) {\n if (node.roleName !== 'textbox') {\n continue;\n }\n if (this.interactionState.textByHandle[node.handle] !== undefined) {\n continue;\n }\n if (node.label.length === 0) {\n continue;\n }\n this.interactionState.textByHandle[node.handle] = node.label;\n }\n this.semanticTextLayoutsByHandle = this.buildSemanticTextLayouts();\n this.projector.update(\n this.semanticTree,\n this.interactionState.textByHandle,\n this.semanticTextLayoutsByHandle,\n );\n const focusedHandle = this.interactionState.getFocusedHandle();\n for (const handle of this.interactionState.consumePendingSemanticAnnouncements()) {\n if (focusedHandle !== null && focusedHandle === handle) {\n this.scheduleSemanticAnnouncement(handle);\n }\n }\n window.__bridgeSemanticTree = cloneSemanticTree(this.semanticTree);\n }\n\n public getSemanticTree(): readonly SemanticNode[] {\n return this.semanticTree;\n }\n\n public getBoundingBox(handle: string): SemanticNode['bounds'] | null {\n const node = this.semanticTree.find((entry) => entry.handle === handle);\n return node === undefined ? null : { ...node.bounds };\n }\n\n public destroy(): void {\n this.cancelPendingSemanticAnnouncement();\n this.semanticTree = [];\n this.semanticTextLayoutsByHandle = {};\n window.__bridgeSemanticTree = [];\n this.projector.destroy();\n }\n\n private cancelPendingSemanticAnnouncement(): void {\n if (this.semanticAnnouncementTimer !== null) {\n window.clearTimeout(this.semanticAnnouncementTimer);\n this.semanticAnnouncementTimer = null;\n }\n this.scheduledSemanticAnnouncementHandle = null;\n }\n\n private scheduleSemanticAnnouncement(handle: string): void {\n this.scheduledSemanticAnnouncementHandle = handle;\n if (this.semanticAnnouncementTimer !== null) {\n window.clearTimeout(this.semanticAnnouncementTimer);\n }\n this.semanticAnnouncementTimer = window.setTimeout(() => {\n this.semanticAnnouncementTimer = null;\n const targetHandle = this.scheduledSemanticAnnouncementHandle;\n this.scheduledSemanticAnnouncementHandle = null;\n if (targetHandle === null || this.interactionState.getFocusedHandle() !== targetHandle) {\n return;\n }\n this.projector.announceNode(targetHandle, this.semanticTree, this.interactionState.textByHandle);\n }, SEMANTIC_ANNOUNCEMENT_DELAY_MS);\n }\n\n private buildSemanticTextLayouts(): Record<string, {\n readonly bounds: SemanticNode['bounds'];\n } | undefined> {\n const layouts = Object.create(null) as Record<string, {\n readonly bounds: SemanticNode['bounds'];\n } | undefined>;\n for (const node of this.semanticTree) {\n if (node.label.length === 0) {\n continue;\n }\n const visibleTextBounds = this.textDocuments.readVisibleTextBounds(node.handle);\n if (visibleTextBounds === null) {\n continue;\n }\n const left = Math.max(node.bounds.x, visibleTextBounds.x);\n const top = Math.max(node.bounds.y, visibleTextBounds.y);\n const right = Math.min(node.bounds.x + node.bounds.width, visibleTextBounds.x + visibleTextBounds.width);\n const bottom = Math.min(node.bounds.y + node.bounds.height, visibleTextBounds.y + visibleTextBounds.height);\n if (right <= left || bottom <= top) {\n continue;\n }\n layouts[node.handle] = {\n bounds: {\n x: left,\n y: top,\n width: right - left,\n height: bottom - top,\n },\n };\n }\n return layouts;\n }\n}\n", "import type {\n OpenCanvasTextDocument,\n SemanticNode,\n UiModule,\n} from '../../core-types';\nimport type { FindOnPageDocument } from '../../find-on-page';\nimport { handleToBigInt, toHeapPointer } from '../utils/encoding';\n\nconst INVALID_TEXT_DOCUMENT_LENGTH = 0xFFFFFFFF;\nconst openCanvasTextDecoder = new TextDecoder();\n\nexport interface TextDocumentMeta {\n readonly handleArg: number | bigint;\n readonly byteLength: number;\n}\n\nexport interface ResolvedTextRange extends TextDocumentMeta {\n readonly start: number;\n readonly end: number;\n}\n\nexport class TextDocumentController {\n public constructor(private readonly ui: UiModule) {}\n\n public readTextDocumentMeta(handle: string): TextDocumentMeta | null {\n const handleArg = this.toUiHandleArgument(handle);\n if (handleArg === null) {\n return null;\n }\n const byteLength = this.ui._ui_get_text_document_utf8_length(handleArg);\n if (byteLength < 0 || (byteLength >>> 0) === INVALID_TEXT_DOCUMENT_LENGTH) {\n return null;\n }\n return { handleArg, byteLength };\n }\n\n public resolveTextRange(handle: string, start: number, end: number): ResolvedTextRange | null {\n const meta = this.readTextDocumentMeta(handle);\n const range = this.normalizeByteRange(start, end);\n if (meta === null || range === null || range.end > meta.byteLength) {\n return null;\n }\n return {\n handleArg: meta.handleArg,\n byteLength: meta.byteLength,\n start: range.start,\n end: range.end,\n };\n }\n\n public readTextDocumentSnapshot(\n handle: string,\n ): { readonly document: OpenCanvasTextDocument; readonly byteLength: number } | null {\n const meta = this.readTextDocumentMeta(handle);\n if (meta === null) {\n return null;\n }\n if (meta.byteLength === 0) {\n return {\n document: { handle, text: '' },\n byteLength: 0,\n };\n }\n\n const textAllocation = toHeapPointer(this.ui, this.ui._malloc(meta.byteLength));\n const textPtr = textAllocation.ptr;\n const textOffset = textAllocation.offset;\n if (textOffset === 0) {\n throw new Error('ui text document malloc failed.');\n }\n\n try {\n const copied = this.ui._ui_copy_text_document_utf8(meta.handleArg, textPtr, meta.byteLength);\n this.ui.refreshHeapViews?.();\n if (copied === 0) {\n return null;\n }\n const text = openCanvasTextDecoder.decode(this.ui.HEAPU8.slice(textOffset, textOffset + meta.byteLength));\n return {\n document: { handle, text },\n byteLength: meta.byteLength,\n };\n } finally {\n this.ui._free(textPtr);\n }\n }\n\n public readVisibleTextBounds(handle: string): SemanticNode['bounds'] | null {\n const handleArg = this.toUiHandleArgument(handle);\n if (handleArg === null) {\n return null;\n }\n const allocation = toHeapPointer(this.ui, this.ui._malloc(16));\n if (allocation.offset === 0) {\n throw new Error('ui visible text bounds malloc failed.');\n }\n const xPtr = allocation.ptr;\n const yPtr = this.addPointerOffset(allocation.ptr, 4);\n const widthPtr = this.addPointerOffset(allocation.ptr, 8);\n const heightPtr = this.addPointerOffset(allocation.ptr, 12);\n try {\n const copied = this.ui._ui_get_text_visible_bounds(handleArg, xPtr, yPtr, widthPtr, heightPtr);\n this.ui.refreshHeapViews?.();\n if (copied === 0) {\n return null;\n }\n const base = allocation.offset >>> 2;\n return {\n x: this.ui.HEAPF32[base] ?? 0,\n y: this.ui.HEAPF32[base + 1] ?? 0,\n width: this.ui.HEAPF32[base + 2] ?? 0,\n height: this.ui.HEAPF32[base + 3] ?? 0,\n };\n } finally {\n this.ui._free(allocation.ptr);\n }\n }\n\n public readRangeRects(handle: string, start: number, end: number): SemanticNode['bounds'][] {\n const range = this.resolveTextRange(handle, start, end);\n if (range === null) {\n return [];\n }\n\n const rectCount = this.ui._ui_get_text_range_rect_count(range.handleArg, range.start, range.end);\n if (rectCount === 0) {\n return [];\n }\n\n const rectWordsAllocation = toHeapPointer(this.ui, this.ui._malloc(rectCount * 16));\n const rectWordsPtr = rectWordsAllocation.ptr;\n const rectWordsOffset = rectWordsAllocation.offset;\n if (rectWordsOffset === 0) {\n throw new Error('ui range rect malloc failed.');\n }\n\n try {\n const copiedCount = this.ui._ui_copy_text_range_rects(\n range.handleArg,\n range.start,\n range.end,\n rectWordsPtr,\n rectCount,\n );\n this.ui.refreshHeapViews?.();\n if (copiedCount === 0) {\n return [];\n }\n const words = this.ui.HEAPF32.slice(rectWordsOffset >>> 2, (rectWordsOffset >>> 2) + (copiedCount * 4));\n const rects: SemanticNode['bounds'][] = [];\n for (let index = 0; index < copiedCount; index += 1) {\n const base = index * 4;\n rects.push({\n x: words[base] ?? 0,\n y: words[base + 1] ?? 0,\n width: words[base + 2] ?? 0,\n height: words[base + 3] ?? 0,\n });\n }\n return rects;\n } finally {\n this.ui._free(rectWordsPtr);\n }\n }\n\n public readFindDocuments(): FindOnPageDocument[] {\n const documents: FindOnPageDocument[] = [];\n for (const handle of this.readTextSnapshotHandles()) {\n const snapshot = this.readTextDocumentSnapshot(handle);\n if (snapshot === null) {\n continue;\n }\n documents.push(snapshot.document);\n }\n return documents;\n }\n\n private readTextSnapshotHandles(): string[] {\n const handleCount = this.ui._ui_get_text_snapshot_handle_count();\n if (handleCount === 0) {\n return [];\n }\n\n const handleWordsAllocation = toHeapPointer(this.ui, this.ui._malloc(handleCount * 8));\n const handleWordsPtr = handleWordsAllocation.ptr;\n const handleWordsOffset = handleWordsAllocation.offset;\n if (handleWordsOffset === 0) {\n throw new Error('ui text snapshot handle malloc failed.');\n }\n\n try {\n const copiedCount = this.ui._ui_copy_text_snapshot_handles(handleWordsPtr, handleCount);\n this.ui.refreshHeapViews?.();\n if (copiedCount === 0) {\n return [];\n }\n const words = this.ui.HEAPU32.slice(handleWordsOffset >>> 2, (handleWordsOffset >>> 2) + (copiedCount * 2));\n const handles: string[] = [];\n for (let index = 0; index < copiedCount; index += 1) {\n const low = words[index * 2] ?? 0;\n const high = words[(index * 2) + 1] ?? 0;\n handles.push(((BigInt(high) << 32n) | BigInt(low)).toString());\n }\n return handles;\n } finally {\n this.ui._free(handleWordsPtr);\n }\n }\n\n private toUiHandleArgument(handle: string): bigint | null {\n try {\n return handleToBigInt(handle);\n } catch {\n return null;\n }\n }\n\n private normalizeByteRange(\n start: number,\n end: number,\n ): { readonly start: number; readonly end: number } | null {\n if (!Number.isInteger(start) || !Number.isInteger(end) || start < 0 || end < 0) {\n return null;\n }\n return {\n start: Math.min(start, end),\n end: Math.max(start, end),\n };\n }\n\n private addPointerOffset(pointer: number | bigint, offset: number): number | bigint {\n return typeof pointer === 'bigint' ? pointer + BigInt(offset) : pointer + offset;\n }\n}\n", "import type {\n BridgeFontRegistration,\n BridgeFontStackRegistration,\n BridgeLoaderInfo,\n BridgeRuntime,\n CoreModule,\n UiModule,\n} from '../core-types';\nimport type { BridgeInteractionState } from './local-types';\nimport { resetBridgeLogs } from './utils/assets';\nimport { normalizeBackendType, handleToBigInt } from './utils/encoding';\nimport { executeCommandBuffer, extractCommandBuffer } from './utils/heap';\nimport { setActiveRenderer } from './utils/backends';\nimport { getCanvasSizeSource, readCanvasLogicalSize } from './events';\nimport { AssetManager } from './runtime/asset-manager';\nimport { IncrementalFontManager } from './runtime/font-manager';\nimport { FindController } from './runtime/find-controller';\nimport { OpenCanvasApiAdapter } from './runtime/open-canvas-api';\nimport { SemanticController } from './runtime/semantic-controller';\nimport { TextDocumentController } from './runtime/text-documents';\n\nconst DEFAULT_LOGICAL_WIDTH = 320;\nconst DEFAULT_LOGICAL_HEIGHT = 220;\nconst UI_EVENT_POINTER_ENTER = 4;\nconst UI_EVENT_POINTER_LEAVE = 5;\n\nexport function createBridgeRuntime(\n core: CoreModule,\n ui: UiModule,\n canvas: HTMLCanvasElement,\n interactionState: BridgeInteractionState,\n loaderInfo: BridgeLoaderInfo,\n): { runtime: BridgeRuntime; destroy(): void } {\n let logicalWidth = DEFAULT_LOGICAL_WIDTH;\n let logicalHeight = DEFAULT_LOGICAL_HEIGHT;\n let needsCommit = false;\n let appFrameHandler: ((timestampMs: number) => void) | null = null;\n let frameRequester: (() => void) | null = null;\n let runtime!: BridgeRuntime;\n\n const fontManager = new IncrementalFontManager(core, ui, interactionState.logs, () => runtime.commitFrame());\n const assetManager = new AssetManager(core, fontManager, () => runtime.commitFrame());\n const textDocuments = new TextDocumentController(ui);\n const semanticController = new SemanticController(canvas, ui, interactionState, textDocuments);\n const findController = new FindController({\n canvas,\n ui,\n textDocuments,\n commitFrame: () => runtime.commitFrame(),\n flushPendingCommit: () => runtime.flushPendingCommit(),\n });\n const openCanvasApiAdapter = new OpenCanvasApiAdapter({\n ui,\n semantic: semanticController,\n find: findController,\n textDocuments,\n commitFrame: () => runtime.commitFrame(),\n flushPendingCommit: () => runtime.flushPendingCommit(),\n });\n\n const syncSemanticAndFindState = (): void => {\n semanticController.syncSemanticState();\n findController.syncDocuments();\n };\n\n const dispatchAppPointerEvent = (eventType: number, handle: bigint, x: number, y: number, modifiers = 0): void => {\n if (handle === 0n) {\n return;\n }\n window.__effindomCallbacks?.onPointerEventWithCoords?.(eventType, handle, x, y, modifiers);\n };\n\n const isLastPointerStillOverCanvas = (): boolean => {\n const { x, y } = interactionState.getLastPointerClientPosition();\n if (x === null || y === null) {\n return false;\n }\n const rect = canvas.getBoundingClientRect();\n return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom;\n };\n\n const syncAppPointerHover = (): void => {\n const { x, y } = interactionState.getLastPointerPosition();\n const previousHandle = interactionState.getLastInteractivePointerHandle();\n const capturedHandle = interactionState.getCapturedPointerHandle();\n if (capturedHandle !== null) {\n if (previousHandle === capturedHandle) {\n return;\n }\n if (previousHandle !== null) {\n dispatchAppPointerEvent(UI_EVENT_POINTER_LEAVE, previousHandle, x, y);\n }\n interactionState.setLastInteractivePointerHandle(capturedHandle);\n dispatchAppPointerEvent(UI_EVENT_POINTER_ENTER, capturedHandle, x, y);\n return;\n }\n const pointerInsideCanvas = interactionState.isPointerInsideCanvas() || isLastPointerStillOverCanvas();\n if (!pointerInsideCanvas) {\n if (previousHandle !== null) {\n interactionState.setLastInteractivePointerHandle(null);\n dispatchAppPointerEvent(UI_EVENT_POINTER_LEAVE, previousHandle, x, y);\n }\n return;\n }\n\n const hitHandle = handleToBigInt(core._ed_hit_test(x, y));\n const currentHandle = hitHandle === 0n ? null : hitHandle;\n if (currentHandle === previousHandle) {\n return;\n }\n if (previousHandle !== null) {\n dispatchAppPointerEvent(UI_EVENT_POINTER_LEAVE, previousHandle, x, y);\n }\n interactionState.setLastInteractivePointerHandle(currentHandle);\n if (currentHandle !== null) {\n dispatchAppPointerEvent(UI_EVENT_POINTER_ENTER, currentHandle, x, y);\n }\n };\n\n const updateCanvasSize = (): void => {\n const dpr = Math.max(1, window.devicePixelRatio || 1);\n const size = readCanvasLogicalSize(canvas);\n logicalWidth = size.width;\n logicalHeight = size.height;\n const physicalWidth = Math.round(logicalWidth * dpr);\n const physicalHeight = Math.round(logicalHeight * dpr);\n\n canvas.style.width = `${String(logicalWidth)}px`;\n canvas.style.height = `${String(logicalHeight)}px`;\n if (physicalWidth !== canvas.width || physicalHeight !== canvas.height) {\n canvas.width = physicalWidth;\n canvas.height = physicalHeight;\n }\n\n semanticController.syncSize(logicalWidth, logicalHeight);\n findController.syncSize(logicalWidth, logicalHeight);\n core._ed_resize(physicalWidth, physicalHeight, dpr);\n ui._ui_resize_window(logicalWidth, logicalHeight);\n syncSemanticAndFindState();\n setActiveRenderer(loaderInfo, normalizeBackendType(core._ed_get_backend_type()));\n };\n\n runtime = {\n core,\n ui,\n canvas,\n openCanvasApi: openCanvasApiAdapter.getApi(),\n logs: interactionState.logs,\n updateCanvasSize,\n extractCommandBuffer: () => extractCommandBuffer(ui),\n executeCommandBuffer: (words: Uint32Array) => {\n executeCommandBuffer(core, words);\n },\n syncCommandBufferToCore: () => {\n const words = extractCommandBuffer(ui);\n executeCommandBuffer(core, words);\n syncSemanticAndFindState();\n syncAppPointerHover();\n return words;\n },\n flushPendingCommit: () => {\n if (!needsCommit && !interactionState.hasPendingTextMutations()) {\n return null;\n }\n if (interactionState.hasPendingTextMutations()) {\n if (needsCommit) {\n needsCommit = false;\n runtime.syncCommandBufferToCore();\n }\n if (interactionState.materializePendingTextMutations()) {\n ui._ui_commit_frame();\n needsCommit = true;\n }\n }\n if (!needsCommit) {\n return null;\n }\n needsCommit = false;\n return runtime.syncCommandBufferToCore();\n },\n hasPendingCommit: () => needsCommit || interactionState.hasPendingTextMutations(),\n commitFrame: () => {\n if (interactionState.hasPendingTextMutations()) {\n if (needsCommit) {\n runtime.flushPendingCommit();\n }\n if (interactionState.materializePendingTextMutations()) {\n ui._ui_commit_frame();\n needsCommit = true;\n frameRequester?.();\n return;\n }\n }\n if (needsCommit) {\n runtime.flushPendingCommit();\n }\n ui._ui_commit_frame();\n needsCommit = true;\n frameRequester?.();\n },\n requestFrame: () => {\n frameRequester?.();\n },\n setFrameRequester: (requester: (() => void) | null) => {\n frameRequester = requester;\n },\n getSemanticTree: () => semanticController.getSemanticTree(),\n getActiveTextHandle: () => interactionState.getActiveTextHandle(),\n getCapturedPointerHandle: () => interactionState.getCapturedPointerHandle(),\n setCapturedPointerHandle: (handle: bigint | null) => {\n interactionState.setCapturedPointerHandle(handle);\n },\n setAppFrameHandler: (handler: ((timestampMs: number) => void) | null) => {\n appFrameHandler = handler;\n frameRequester?.();\n },\n runAppFrameHandler: (timestampMs: number) => {\n appFrameHandler?.(timestampMs);\n },\n uiHasPendingVisualWork: () => ui._ui_has_pending_visual_work() !== 0,\n uiNeedsAnimationFrame: () => ui._ui_needs_animation_frame() !== 0,\n getHandleFromPoint: (x: number, y: number) => handleToBigInt(core._ed_hit_test(x, y)),\n clearPointerHover: () => {\n interactionState.setLastInteractivePointerHandle(null);\n },\n refreshPointerHover: () => {\n syncAppPointerHover();\n },\n getFindDocuments: () => findController.getFindDocuments(),\n activateFindMatch: (match, reveal = true) => findController.activateFindMatch(match, reveal),\n syncFindSelection: (clearOnMissing = false) => findController.syncFindSelection(clearOnMissing),\n clearFindMatch: () => findController.clearFindMatch(),\n ensureFont: async (fontId: number) => {\n await fontManager.ensureFont(fontId);\n },\n ensureBuiltInFont: async (fontId: number) => {\n await fontManager.ensureBuiltInFont(fontId);\n },\n isFontLoaded: (fontId: number, url?: string) => fontManager.isFontLoaded(fontId, url),\n getIncrementalFontState: (fontId: number) => fontManager.getIncrementalFontState(fontId),\n getIncrementalFontCacheState: () => fontManager.getIncrementalFontCacheState(),\n getIncrementalFontPolicy: () => fontManager.getIncrementalFontPolicy(),\n setIncrementalFontPolicy: (policy) => {\n fontManager.setIncrementalFontPolicy(policy);\n },\n getClipboardFontUrl: (fontId: number) => fontManager.getClipboardFontUrl(fontId),\n registerLazyFont: (fontId: number, url: string) => {\n fontManager.registerLazyFont(fontId, url);\n },\n registerFontFallback: (fontId: number, fallbackFontId: number) => {\n fontManager.registerFontFallback(fontId, fallbackFontId);\n },\n handleMissingFontCoverage: (fontId: number, coverageKind: number, sampleText: string) => {\n fontManager.handleMissingFontCoverage(fontId, coverageKind, sampleText);\n },\n loadFont: async (fontId: number, url: string) => {\n await fontManager.loadFont(fontId, url);\n },\n registerFont: async (font: BridgeFontRegistration) => {\n await fontManager.registerFont(font);\n },\n registerFontStack: async (stack: BridgeFontStackRegistration) => {\n await fontManager.registerFontStack(stack);\n },\n loadSvg: async (svgId: number, url: string) => {\n return await assetManager.loadSvg(svgId, url);\n },\n loadTexture: async (textureId: number, url: string) => {\n return await assetManager.loadTexture(textureId, url);\n },\n releaseSvg: (svgId: number) => {\n assetManager.releaseSvg(svgId);\n },\n releaseTexture: (textureId: number) => {\n assetManager.releaseTexture(textureId);\n },\n replayLoadedAssets: async () => {\n await assetManager.replayLoadedAssets();\n },\n resetLogs: () => {\n resetBridgeLogs(interactionState.logs);\n },\n resetAppSession: () => {\n interactionState.resetAppSession();\n },\n };\n\n const refreshCanvas = (): void => {\n runtime.updateCanvasSize();\n runtime.commitFrame();\n };\n\n const canvasSizeSource = getCanvasSizeSource(canvas);\n const resizeObserver = typeof ResizeObserver !== 'undefined'\n ? new ResizeObserver(() => {\n refreshCanvas();\n })\n : null;\n if (resizeObserver !== null) {\n resizeObserver.observe(canvasSizeSource);\n }\n\n return {\n runtime,\n destroy: () => {\n resizeObserver?.disconnect();\n runtime.setFrameRequester(null);\n runtime.clearPointerHover();\n openCanvasApiAdapter.destroy();\n findController.destroy();\n semanticController.destroy();\n canvas.style.cursor = 'default';\n },\n };\n}\n", "import { EdBackendType, EdDeviceState } from '../core-types';\nimport type { BridgeLoaderInfo, BridgeRuntime, EdBackendType as EdBackendTypeValue, CoreModule } from '../core-types';\nimport type { SoftwarePresenter } from './local-types';\nimport { normalizeBackendType, normalizeDeviceState, normalizePointerForWasm, pointerToHeapOffset } from './utils/encoding';\nimport { backendLabel, DEFAULT_BACKEND_LADDER, setActiveRenderer, tryReviveBackend } from './utils/backends';\nimport { delay } from './utils/assets';\n\nconst DEVICE_LOST_RETRY_DELAYS_MS = [500, 1_000, 2_000, 4_000] as const;\n\nfunction ensureSoftwarePresenter(\n presenter: SoftwarePresenter | null,\n canvas: HTMLCanvasElement,\n): SoftwarePresenter {\n if (presenter !== null) {\n return presenter;\n }\n const overlay = document.createElement('canvas');\n overlay.dataset.effindomSoftwareOverlay = 'true';\n overlay.setAttribute('aria-hidden', 'true');\n overlay.style.position = 'absolute';\n overlay.style.pointerEvents = 'none';\n overlay.style.display = 'none';\n overlay.style.zIndex = '1';\n\n const parent = canvas.parentElement;\n if (parent !== null) {\n if (getComputedStyle(parent).position === 'static') {\n parent.style.position = 'relative';\n }\n parent.appendChild(overlay);\n } else {\n document.body.appendChild(overlay);\n }\n\n const ctx = overlay.getContext('2d');\n if (ctx === null) {\n throw new Error('Canvas 2D context is unavailable for software rendering.');\n }\n return {\n canvas: overlay,\n ctx,\n imageData: null,\n width: 0,\n height: 0,\n };\n}\n\nfunction presentSoftwareFrame(\n core: CoreModule,\n canvas: HTMLCanvasElement,\n presenter: SoftwarePresenter,\n): void {\n const ptr = normalizePointerForWasm(core, core._ed_get_sw_framebuffer());\n const offset = pointerToHeapOffset(ptr);\n if (offset === 0) {\n return;\n }\n presenter.canvas.style.left = `${String(canvas.offsetLeft)}px`;\n presenter.canvas.style.top = `${String(canvas.offsetTop)}px`;\n presenter.canvas.style.width = canvas.style.width || `${String(canvas.clientWidth)}px`;\n presenter.canvas.style.height = canvas.style.height || `${String(canvas.clientHeight)}px`;\n presenter.canvas.style.borderRadius = getComputedStyle(canvas).borderRadius;\n presenter.canvas.style.display = '';\n if (presenter.imageData === null || presenter.width !== canvas.width || presenter.height !== canvas.height) {\n presenter.canvas.width = canvas.width;\n presenter.canvas.height = canvas.height;\n presenter.imageData = presenter.ctx.createImageData(canvas.width, canvas.height);\n presenter.width = canvas.width;\n presenter.height = canvas.height;\n }\n const byteLength = canvas.width * canvas.height * 4;\n const src = core.HEAPU8.subarray(offset, offset + byteLength);\n presenter.imageData.data.set(src);\n presenter.ctx.putImageData(presenter.imageData, 0, 0);\n}\n\nexport function installRenderLoop(\n runtime: BridgeRuntime,\n loaderInfo: BridgeLoaderInfo,\n fallbackLadder: readonly EdBackendTypeValue[] = DEFAULT_BACKEND_LADDER,\n): () => void {\n const { core, canvas } = runtime;\n let activeBackend = normalizeBackendType(core._ed_get_backend_type());\n let softwarePresenter: SoftwarePresenter | null = null;\n let frameScheduled = false;\n let disposed = false;\n\n // Recovery state:\n // - lastAttemptedBackend the backend we're trying to revive (set on first loss,\n // kept after a permanent fallback so wake-up can try again)\n // - recoveryAttempts how many retries of lastAttemptedBackend have been tried\n // - recoveryExhausted true after all retries failed and we permanently fell back\n // - recoveryPromise non-null while an async recovery cycle is in progress\n let lastAttemptedBackend: EdBackendTypeValue = activeBackend;\n let recoveryAttempts = 0;\n let recoveryExhausted = false;\n let recoveryPromise: Promise<void> | null = null;\n\n // Retry the same backend with exponential backoff, then permanently fall back.\n // Mutates recoveryAttempts, recoveryExhausted, activeBackend.\n async function runRecovery(): Promise<void> {\n const dpr = Math.max(1, window.devicePixelRatio || 1);\n\n while (recoveryAttempts < DEVICE_LOST_RETRY_DELAYS_MS.length) {\n const delayMs = DEVICE_LOST_RETRY_DELAYS_MS[recoveryAttempts] as number;\n await delay(delayMs);\n\n if (await tryReviveBackend(core, canvas, dpr, lastAttemptedBackend)) {\n recoveryAttempts = 0;\n recoveryExhausted = false;\n activeBackend = lastAttemptedBackend;\n loaderInfo.deviceRecoveryCount += 1;\n setActiveRenderer(loaderInfo, lastAttemptedBackend);\n await runtime.replayLoadedAssets();\n console.info(`RENDERER RECOVERY: ${backendLabel(lastAttemptedBackend)} recovered successfully.`);\n runtime.commitFrame();\n return;\n }\n\n recoveryAttempts += 1;\n }\n\n // All retries exhausted \u2014 permanently fall to the next available backend.\n recoveryExhausted = true;\n const nextIndex = fallbackLadder.indexOf(lastAttemptedBackend) + 1;\n for (let i = nextIndex; i < fallbackLadder.length; i += 1) {\n const fallback = fallbackLadder[i]!;\n if (await tryReviveBackend(core, canvas, dpr, fallback)) {\n activeBackend = fallback;\n loaderInfo.deviceRecoveryCount += 1;\n setActiveRenderer(loaderInfo, fallback);\n await runtime.replayLoadedAssets();\n if (fallback === EdBackendType.CPU) {\n console.error(\n `RENDERER FALLBACK: ${backendLabel(lastAttemptedBackend)} device lost and recovery failed!` +\n ' Fell back to Software/Raster - performance will be painfully slow',\n );\n } else {\n console.warn(\n `RENDERER FALLBACK: ${backendLabel(lastAttemptedBackend)} device lost and recovery failed!` +\n ` Fell back to ${backendLabel(fallback)}`,\n );\n }\n runtime.commitFrame();\n return;\n }\n }\n\n throw new Error(\n `Renderer recovery failed: all backends exhausted after ${backendLabel(lastAttemptedBackend)} device loss.`,\n );\n }\n\n function scheduleRecovery(lostBackend: EdBackendTypeValue): void {\n if (recoveryPromise !== null) return;\n lastAttemptedBackend = lostBackend;\n recoveryAttempts = 0;\n recoveryExhausted = false;\n setActiveRenderer(loaderInfo, EdBackendType.NONE);\n recoveryPromise = runRecovery()\n .catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n window.__bridgeError = message;\n })\n .finally(() => {\n recoveryPromise = null;\n });\n }\n\n const scheduleFrame = (): void => {\n if (disposed) {\n return;\n }\n if (frameScheduled) {\n return;\n }\n frameScheduled = true;\n requestAnimationFrame(frame);\n };\n\n runtime.setFrameRequester(scheduleFrame);\n\n const handleWebGlContextLost = (event: Event): void => {\n event.preventDefault();\n core._ed_notify_webgl_context_lost?.();\n scheduleRecovery(activeBackend);\n scheduleFrame();\n };\n canvas.addEventListener('webglcontextlost', handleWebGlContextLost, false);\n\n // When the page becomes visible after being hidden (e.g. lid open after sleep),\n // the GPU may have recovered. If a previous recovery cycle exhausted all retries\n // and permanently fell back, optimistically try to revive the original backend.\n const handleVisibilityChange = (): void => {\n if (disposed) return;\n if (document.visibilityState !== 'visible') return;\n if (!recoveryExhausted) return;\n if (recoveryPromise !== null) return;\n console.info(\n `RENDERER RECOVERY: Page visible \u2014 attempting to revive ${backendLabel(lastAttemptedBackend)} after sleep/wake.`,\n );\n recoveryAttempts = 0;\n recoveryPromise = runRecovery()\n .catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n window.__bridgeError = message;\n })\n .finally(() => {\n recoveryPromise = null;\n });\n };\n document.addEventListener('visibilitychange', handleVisibilityChange);\n\n const frame = (now: number): void => {\n if (disposed) {\n frameScheduled = false;\n return;\n }\n frameScheduled = false;\n if (recoveryPromise !== null) {\n scheduleFrame();\n return;\n }\n // Rebuild heap views from the live WebAssembly.Memory buffer each frame.\n // Emscripten updates closure-scoped heap vars on memory growth but not\n // Module['HEAPU8'], leaving it pointing to a detached ArrayBuffer.\n // Reading module.wasmMemory.buffer always returns the current live buffer.\n core.refreshHeapViews?.();\n runtime.ui.refreshHeapViews?.();\n runtime.runAppFrameHandler(now);\n if (!runtime.hasPendingCommit() && runtime.uiNeedsAnimationFrame() && runtime.uiHasPendingVisualWork()) {\n runtime.commitFrame();\n }\n runtime.flushPendingCommit();\n core._ed_render_frame(now);\n core.refreshHeapViews?.(); // Ensure heap views are up\u2011to\u2011date after potential memory growth\n const deviceState = normalizeDeviceState(core._ed_get_device_state());\n const backendType = normalizeBackendType(core._ed_get_backend_type());\n if (deviceState === EdDeviceState.LOST) {\n scheduleRecovery(activeBackend);\n scheduleFrame();\n return;\n }\n activeBackend = backendType;\n setActiveRenderer(loaderInfo, backendType);\n if (backendType === EdBackendType.CPU) {\n softwarePresenter = ensureSoftwarePresenter(softwarePresenter, canvas);\n presentSoftwareFrame(core, canvas, softwarePresenter);\n } else if (softwarePresenter !== null) {\n softwarePresenter.canvas.style.display = 'none';\n }\n if (runtime.hasPendingCommit() || runtime.uiNeedsAnimationFrame()) {\n scheduleFrame();\n }\n };\n scheduleFrame();\n return () => {\n disposed = true;\n frameScheduled = false;\n runtime.setFrameRequester(null);\n canvas.removeEventListener('webglcontextlost', handleWebGlContextLost, false);\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n if (softwarePresenter !== null) {\n softwarePresenter.canvas.remove();\n softwarePresenter = null;\n }\n };\n}\n", "import type { BridgeRuntime } from '../core-types';\nimport type { PreparedRuntimeAssets, BridgeInteractionState } from './local-types';\nimport { buildBackendLadder, createErrorWithCause, loadCoreModule, loadIcuData, loadUiModule, showIcuError } from './utils/assets';\nimport { initRenderer } from './utils/backends';\nimport { ensureCanvasLogicalSize, installEventHandlers } from './events';\nimport { getBridgeAssetUrl, STARTUP_BRIDGE_FONTS } from './font-catalog';\nimport { createBridgeRuntime } from './runtime';\nimport { installRenderLoop } from './render-loop';\n\nexport interface BridgeSession {\n readonly runtime: BridgeRuntime;\n destroy(): void;\n}\n\nexport interface BridgeSessionOptions {\n readonly interactionState: BridgeInteractionState;\n readonly preparedAssets: PreparedRuntimeAssets;\n readonly runtimeRef: { current: BridgeRuntime | null };\n}\n\nfunction requireCanvas(id: string): HTMLCanvasElement {\n const element = document.getElementById(id);\n if (!(element instanceof HTMLCanvasElement)) {\n throw new Error(`Expected #${id} canvas.`);\n }\n return element;\n}\n\nexport async function createBridgeSession(options: BridgeSessionOptions): Promise<BridgeSession> {\n const canvas = requireCanvas('fui-canvas');\n ensureCanvasLogicalSize(canvas);\n\n const { interactionState, preparedAssets, runtimeRef } = options;\n window.__bridgeLoaderInfo = preparedAssets.loaderInfo;\n const [core, ui] = await Promise.all([\n loadCoreModule(preparedAssets.coreBundle, preparedAssets.coreWasm, canvas, preparedAssets.loaderInfo),\n loadUiModule(preparedAssets.uiBundle, preparedAssets.uiWasm, preparedAssets.loaderInfo),\n ]);\n const runtimeState = createBridgeRuntime(core, ui, canvas, interactionState, preparedAssets.loaderInfo);\n const runtime = runtimeState.runtime;\n runtimeRef.current = runtime;\n\n const dpr = Math.max(1, window.devicePixelRatio || 1);\n const fallbackLadder = buildBackendLadder(preparedAssets.loaderInfo.requestedRendererBackend);\n await initRenderer(core, canvas, dpr, preparedAssets.loaderInfo, fallbackLadder);\n ui._ui_reset();\n try {\n await loadIcuData(ui, preparedAssets);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to load text engine.';\n showIcuError(message);\n throw createErrorWithCause(message, error);\n }\n runtime.updateCanvasSize();\n const disposeEventHandlers = installEventHandlers(runtime, interactionState);\n const disposeRenderLoop = installRenderLoop(runtime, preparedAssets.loaderInfo, fallbackLadder);\n await Promise.all(\n STARTUP_BRIDGE_FONTS.map((font) => runtime.registerFont({\n id: font.id,\n url: getBridgeAssetUrl(font.assetFile),\n fallbackIds: font.fallbackIds,\n })),\n );\n\n delete window.__bridgeError;\n return {\n runtime,\n destroy: () => {\n disposeEventHandlers();\n disposeRenderLoop();\n runtimeState.destroy();\n if (runtimeRef.current === runtime) {\n runtimeRef.current = null;\n }\n },\n };\n}\n", "import type { ClipboardRichTextPart, ClipboardRichTextPayload, ClipboardWritePayload } from './core-types';\n\nexport const EFFINDOM_RICH_TEXT_CLIPBOARD_MIME = 'web application/x-effindom-richtext+json';\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\nfunction colorToCss(color: number): string {\n const red = (color >>> 24) & 0xff;\n const green = (color >>> 16) & 0xff;\n const blue = (color >>> 8) & 0xff;\n const alpha = color & 0xff;\n if (alpha >= 0xff) {\n return `rgb(${String(red)} ${String(green)} ${String(blue)})`;\n }\n return `rgb(${String(red)} ${String(green)} ${String(blue)} / ${(alpha / 255).toFixed(3)})`;\n}\n\nfunction inferClipboardCssFontFamily(fontUrl: string | undefined): string | null {\n if (fontUrl === undefined) {\n return null;\n }\n if (/mono/i.test(fontUrl)) {\n return 'monospace';\n }\n return null;\n}\n\nfunction partStyleToCss(part: ClipboardRichTextPart): string {\n const styles: string[] = [];\n if (part.color !== undefined) {\n styles.push(`color: ${colorToCss(part.color)};`);\n }\n if (part.bgColor !== undefined && part.bgColor !== 0) {\n styles.push(`background-color: ${colorToCss(part.bgColor)};`);\n }\n if (part.fontSize !== undefined) {\n styles.push(`font-size: ${String(part.fontSize)}px;`);\n }\n const fontFamily = inferClipboardCssFontFamily(part.fontUrl);\n if (fontFamily !== null) {\n styles.push(`font-family: ${fontFamily};`);\n }\n const decorationFlags = part.decorationFlags ?? 0;\n const textDecorations: string[] = [];\n if ((decorationFlags & 1) !== 0) {\n textDecorations.push('underline');\n }\n if ((decorationFlags & 2) !== 0) {\n textDecorations.push('line-through');\n }\n if (textDecorations.length > 0) {\n styles.push(`text-decoration: ${textDecorations.join(' ')};`);\n }\n return styles.join(' ');\n}\n\nfunction buildClipboardHtml(richText: ClipboardRichTextPayload): string {\n let html = '<div data-effindom-richtext=\"1\" style=\"white-space: pre-wrap;\">';\n for (const part of richText.parts) {\n const escapedText = escapeHtml(part.text);\n const style = partStyleToCss(part);\n if (style.length > 0) {\n html += `<span style=\"${style}\">${escapedText}</span>`;\n continue;\n }\n html += escapedText;\n }\n html += '</div>';\n return html;\n}\n\nexport function enrichClipboardPayload(\n payload: ClipboardWritePayload,\n resolveFontUrl: (fontId: number) => string | null,\n): ClipboardWritePayload {\n const richText = payload.richText;\n if (richText === undefined) {\n return payload;\n }\n return {\n plainText: payload.plainText,\n richText: {\n version: richText.version,\n parts: richText.parts.map((part) => {\n if (part.fontId === undefined || part.fontUrl !== undefined) {\n return part;\n }\n const fontUrl = resolveFontUrl(part.fontId);\n return fontUrl === null ? part : { ...part, fontUrl };\n }),\n },\n };\n}\n\nasync function tryWriteClipboardItems(items: Record<string, Blob>): Promise<boolean> {\n if (navigator.clipboard === undefined || navigator.clipboard.write === undefined || typeof ClipboardItem === 'undefined') {\n return false;\n }\n try {\n await navigator.clipboard.write([new ClipboardItem(items)]);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function writeClipboardPayload(payload: ClipboardWritePayload): Promise<void> {\n const plainText = payload.plainText;\n const richText = payload.richText;\n const html = richText === undefined ? null : buildClipboardHtml(richText);\n if (richText !== undefined && html !== null) {\n const richJson = JSON.stringify(richText);\n const fullWriteSucceeded = await tryWriteClipboardItems({\n 'text/plain': new Blob([plainText], { type: 'text/plain' }),\n 'text/html': new Blob([html], { type: 'text/html' }),\n [EFFINDOM_RICH_TEXT_CLIPBOARD_MIME]: new Blob([richJson], { type: EFFINDOM_RICH_TEXT_CLIPBOARD_MIME }),\n });\n if (fullWriteSucceeded) {\n return;\n }\n const htmlWriteSucceeded = await tryWriteClipboardItems({\n 'text/plain': new Blob([plainText], { type: 'text/plain' }),\n 'text/html': new Blob([html], { type: 'text/html' }),\n });\n if (htmlWriteSucceeded) {\n return;\n }\n }\n if (navigator.clipboard !== undefined && navigator.clipboard.writeText !== undefined) {\n await navigator.clipboard.writeText(plainText);\n }\n}\n", "export function utf8ByteLengthForCodePoint(codePoint: number): number {\n if (codePoint <= 0x7f) {\n return 1;\n }\n if (codePoint <= 0x7ff) {\n return 2;\n }\n if (codePoint <= 0xffff) {\n return 3;\n }\n return 4;\n}\n\nexport function advanceCodeUnitIndex(text: string, index: number): number {\n const codePoint = text.codePointAt(index) ?? 0;\n return index + (codePoint > 0xffff ? 2 : 1);\n}\n\nexport function retreatCodeUnitIndex(text: string, index: number): number {\n const clampedIndex = Math.max(0, Math.min(index, text.length));\n if (clampedIndex <= 0) {\n return 0;\n }\n const previousIndex = clampedIndex - 1;\n const previousUnit = text.charCodeAt(previousIndex);\n if (\n previousIndex > 0 &&\n previousUnit >= 0xdc00 &&\n previousUnit <= 0xdfff\n ) {\n const leadUnit = text.charCodeAt(previousIndex - 1);\n if (leadUnit >= 0xd800 && leadUnit <= 0xdbff) {\n return previousIndex - 1;\n }\n }\n return previousIndex;\n}\n\nexport function codeUnitIndexToUtf8ByteOffset(text: string, index: number): number {\n const clampedIndex = Math.max(0, Math.min(index, text.length));\n let byteOffset = 0;\n for (let current = 0; current < clampedIndex; current = advanceCodeUnitIndex(text, current)) {\n const codePoint = text.codePointAt(current) ?? 0;\n byteOffset += utf8ByteLengthForCodePoint(codePoint);\n }\n return byteOffset;\n}\n\nexport function utf8ByteLength(text: string): number {\n return codeUnitIndexToUtf8ByteOffset(text, text.length);\n}\n", "import type { TextChangeLog } from '../../core-types';\nimport {\n advanceCodeUnitIndex,\n codeUnitIndexToUtf8ByteOffset,\n utf8ByteLengthForCodePoint,\n utf8ByteLength,\n} from './text-encoding';\n\nexport type HiddenTextEditor = HTMLInputElement | HTMLTextAreaElement;\n\nexport interface ReplacementEdit {\n readonly start: number;\n readonly end: number;\n readonly insertedText: string;\n}\n\nexport interface HiddenEditorWindow {\n readonly text: string;\n readonly docStart: number;\n readonly docEnd: number;\n readonly textStart: number;\n readonly textEnd: number;\n}\n\nexport interface PendingLocalReplacementEcho {\n readonly handle: string;\n readonly start: number;\n readonly end: number;\n readonly text: string;\n}\n\nexport interface PendingLocalSelectionEcho {\n readonly handle: string;\n readonly start: number;\n readonly end: number;\n}\n\nexport interface PendingTextMutationBatch {\n readonly handle: string;\n readonly docStart: number;\n readonly baseWindowText: string;\n readonly currentWindowText: string;\n readonly caret: number;\n readonly interactionTime: bigint;\n readonly kind: 'typing' | 'paste';\n readonly mutationCount: number;\n}\n\nexport interface PendingPasteInput {\n readonly handle: string;\n readonly docStart: number;\n readonly selectionStart: number;\n readonly selectionEnd: number;\n readonly text: string;\n}\n\ninterface TextClampRange {\n readonly start: number;\n readonly end: number;\n}\n\nconst HIDDEN_EDITOR_WINDOW_OVERSCAN = 2048;\nconst HIDDEN_EDITOR_WINDOW_MIN_LENGTH = 4096;\nconst HIDDEN_EDITOR_WINDOW_REUSE_MARGIN = 512;\nconst TEXT_CHANGE_LOG_PREVIEW_LIMIT = 256;\nconst TEXTBOX_HARD_CLAMP_MAX_CODEPOINTS = 10000;\n\nfunction isLineBreakCodeUnit(text: string, index: number): boolean {\n if (index < 0 || index >= text.length) {\n return false;\n }\n const codeUnit = text.charCodeAt(index);\n return codeUnit === 0x0a || codeUnit === 0x0d;\n}\n\nfunction collectTextboxHardLineClampRanges(text: string): readonly TextClampRange[] {\n const ranges: TextClampRange[] = [];\n let index = 0;\n while (index < text.length) {\n let lineCapEnd = index;\n let lineEnd = index;\n let codePointCount = 0;\n while (lineEnd < text.length && !isLineBreakCodeUnit(text, lineEnd)) {\n const next = advanceCodeUnitIndex(text, lineEnd);\n if (codePointCount < TEXTBOX_HARD_CLAMP_MAX_CODEPOINTS) {\n lineCapEnd = next;\n }\n codePointCount += 1;\n lineEnd = next;\n }\n if (codePointCount > TEXTBOX_HARD_CLAMP_MAX_CODEPOINTS) {\n ranges.push({ start: lineCapEnd, end: lineEnd });\n }\n if (lineEnd >= text.length) {\n break;\n }\n if (text.charCodeAt(lineEnd) === 0x0d && lineEnd + 1 < text.length && text.charCodeAt(lineEnd + 1) === 0x0a) {\n index = lineEnd + 2;\n } else {\n index = lineEnd + 1;\n }\n }\n return ranges;\n}\n\nfunction mapClampedTextIndex(index: number, ranges: readonly TextClampRange[]): number {\n const clampedIndex = Math.max(0, index);\n let removedBefore = 0;\n for (const range of ranges) {\n if (clampedIndex <= range.start) {\n break;\n }\n if (clampedIndex < range.end) {\n return range.start - removedBefore;\n }\n removedBefore += range.end - range.start;\n }\n return clampedIndex - removedBefore;\n}\n\nfunction clampTextboxHardLines(text: string): {\n readonly text: string;\n readonly changed: boolean;\n mapIndex(index: number): number;\n} {\n const ranges = collectTextboxHardLineClampRanges(text);\n if (ranges.length === 0) {\n return {\n text,\n changed: false,\n mapIndex: (index: number) => Math.max(0, Math.min(index, text.length)),\n };\n }\n let result = '';\n let cursor = 0;\n for (const range of ranges) {\n result += text.slice(cursor, range.start);\n cursor = range.end;\n }\n result += text.slice(cursor);\n return {\n text: result,\n changed: true,\n mapIndex: (index: number) => mapClampedTextIndex(index, ranges),\n };\n}\n\nexport function utf8ByteOffsetToCodeUnitIndex(text: string, byteOffset: number, textByteLength?: number): number {\n const byteLimit = textByteLength ?? utf8ByteLength(text);\n const target = Math.max(0, Math.min(byteOffset, byteLimit));\n let currentByteOffset = 0;\n let currentIndex = 0;\n while (currentIndex < text.length) {\n const codePoint = text.codePointAt(currentIndex) ?? 0;\n const nextByteOffset = currentByteOffset + utf8ByteLengthForCodePoint(codePoint);\n if (nextByteOffset > target) {\n break;\n }\n currentByteOffset = nextByteOffset;\n currentIndex = advanceCodeUnitIndex(text, currentIndex);\n if (currentByteOffset === target) {\n break;\n }\n }\n return currentIndex;\n}\n\nexport function computeReplacementEdit(previousText: string, nextText: string): ReplacementEdit | null {\n if (previousText === nextText) {\n return null;\n }\n const sharedPrefixLimit = Math.min(previousText.length, nextText.length);\n let prefix = 0;\n while (prefix < sharedPrefixLimit && previousText.charCodeAt(prefix) === nextText.charCodeAt(prefix)) {\n prefix += 1;\n }\n\n let suffix = 0;\n while (\n suffix < (previousText.length - prefix) &&\n suffix < (nextText.length - prefix) &&\n previousText.charCodeAt(previousText.length - suffix - 1) === nextText.charCodeAt(nextText.length - suffix - 1)\n ) {\n suffix += 1;\n }\n\n return {\n start: prefix,\n end: previousText.length - suffix,\n insertedText: nextText.slice(prefix, nextText.length - suffix),\n };\n}\n\nexport function applyUtf8ByteReplacementEdit(text: string, start: number, end: number, insertedText: string): string {\n const clampedStart = utf8ByteOffsetToCodeUnitIndex(text, Math.max(0, start));\n const clampedEnd = utf8ByteOffsetToCodeUnitIndex(text, Math.max(clampedStart, end));\n return `${text.slice(0, clampedStart)}${insertedText}${text.slice(clampedEnd)}`;\n}\n\nexport function mapPendingBatchCurrentIndexToBaseIndex(batch: PendingTextMutationBatch, index: number): number {\n const clampedIndex = Math.max(0, Math.min(index, batch.currentWindowText.length));\n const replacement = computeReplacementEdit(batch.baseWindowText, batch.currentWindowText);\n if (replacement === null) {\n return Math.max(0, Math.min(clampedIndex, batch.baseWindowText.length));\n }\n const insertedStart = replacement.start;\n const insertedEnd = replacement.start + replacement.insertedText.length;\n if (clampedIndex <= insertedStart) {\n return clampedIndex;\n }\n if (clampedIndex <= insertedEnd) {\n return replacement.start;\n }\n const delta = replacement.insertedText.length - (replacement.end - replacement.start);\n return Math.max(0, Math.min(clampedIndex - delta, batch.baseWindowText.length));\n}\n\nexport function buildClampedTextboxEdit(\n fullPreviousText: string,\n absoluteStart: number,\n absoluteEnd: number,\n insertedText: string,\n absoluteCaret: number,\n): {\n readonly fullNextText: string;\n readonly replacement: ReplacementEdit | null;\n readonly caretByte: number;\n readonly clampChanged: boolean;\n} {\n const replaceStart = utf8ByteOffsetToCodeUnitIndex(fullPreviousText, absoluteStart);\n const replaceEnd = utf8ByteOffsetToCodeUnitIndex(fullPreviousText, absoluteEnd);\n const intendedFullNextText =\n `${fullPreviousText.slice(0, replaceStart)}${insertedText}${fullPreviousText.slice(replaceEnd)}`;\n const intendedCaret = utf8ByteOffsetToCodeUnitIndex(intendedFullNextText, absoluteCaret);\n const clamped = clampTextboxHardLines(intendedFullNextText);\n const finalCaret = clamped.mapIndex(intendedCaret);\n return {\n fullNextText: clamped.text,\n replacement: computeReplacementEdit(fullPreviousText, clamped.text),\n caretByte: codeUnitIndexToUtf8ByteOffset(clamped.text, finalCaret),\n clampChanged: clamped.changed,\n };\n}\n\nexport function summarizeTextChange(handle: string, text: string): TextChangeLog {\n if (text.length <= TEXT_CHANGE_LOG_PREVIEW_LIMIT) {\n return { handle, text };\n }\n return {\n handle,\n text: `${text.slice(0, TEXT_CHANGE_LOG_PREVIEW_LIMIT)}\u2026`,\n textLength: text.length,\n truncated: true,\n };\n}\n\nexport function buildHiddenEditorWindow(\n text: string,\n start: number,\n end: number,\n textByteLength: number,\n previousWindow?: HiddenEditorWindow,\n): HiddenEditorWindow {\n const normalizedStart = Math.max(0, Math.min(start, text.length));\n const normalizedEnd = Math.max(normalizedStart, Math.min(end, text.length));\n const selectionSpan = normalizedEnd - normalizedStart;\n const targetLength = Math.max(\n HIDDEN_EDITOR_WINDOW_MIN_LENGTH,\n selectionSpan + (HIDDEN_EDITOR_WINDOW_OVERSCAN * 2),\n );\n if (text.length <= targetLength) {\n return {\n text,\n docStart: 0,\n docEnd: textByteLength,\n textStart: 0,\n textEnd: text.length,\n };\n }\n\n if (previousWindow !== undefined) {\n const previousLength = previousWindow.textEnd - previousWindow.textStart;\n const clampedPreviousStart = Math.max(0, Math.min(previousWindow.textStart, text.length));\n const clampedPreviousEnd = Math.max(clampedPreviousStart, Math.min(previousWindow.textEnd, text.length));\n if (previousLength > 0 &&\n clampedPreviousEnd > clampedPreviousStart &&\n clampedPreviousEnd - clampedPreviousStart >= targetLength) {\n const reuseMargin = Math.min(\n HIDDEN_EDITOR_WINDOW_REUSE_MARGIN,\n Math.max(0, Math.floor((clampedPreviousEnd - clampedPreviousStart) / 4)),\n );\n const reusableStart = clampedPreviousStart + reuseMargin;\n const reusableEnd = clampedPreviousEnd - reuseMargin;\n if (normalizedStart >= reusableStart && normalizedEnd <= reusableEnd) {\n return {\n text: text.slice(clampedPreviousStart, clampedPreviousEnd),\n docStart: previousWindow.docStart,\n docEnd: previousWindow.docEnd,\n textStart: clampedPreviousStart,\n textEnd: clampedPreviousEnd,\n };\n }\n }\n }\n\n let docStart = Math.max(0, normalizedStart - HIDDEN_EDITOR_WINDOW_OVERSCAN);\n let docEnd = Math.min(text.length, normalizedEnd + HIDDEN_EDITOR_WINDOW_OVERSCAN);\n const currentLength = docEnd - docStart;\n if (currentLength < targetLength) {\n let remaining = targetLength - currentLength;\n const extendBefore = Math.min(docStart, Math.floor(remaining / 2));\n docStart -= extendBefore;\n remaining -= extendBefore;\n const extendAfter = Math.min(text.length - docEnd, remaining);\n docEnd += extendAfter;\n remaining -= extendAfter;\n if (remaining > 0) {\n const extraBefore = Math.min(docStart, remaining);\n docStart -= extraBefore;\n remaining -= extraBefore;\n if (remaining > 0) {\n docEnd = Math.min(text.length, docEnd + remaining);\n }\n }\n }\n\n return {\n text: text.slice(docStart, docEnd),\n docStart: codeUnitIndexToUtf8ByteOffset(text, docStart),\n docEnd: codeUnitIndexToUtf8ByteOffset(text, docEnd),\n textStart: docStart,\n textEnd: docEnd,\n };\n}\n\nexport function createHiddenTextEditor(multiline: boolean): HiddenTextEditor {\n const editor = multiline ? document.createElement('textarea') : document.createElement('input');\n if (editor instanceof HTMLInputElement) {\n editor.type = 'text';\n } else {\n editor.rows = 1;\n editor.wrap = 'off';\n editor.style.resize = 'none';\n editor.style.whiteSpace = 'pre';\n }\n editor.autocapitalize = 'off';\n editor.autocomplete = 'off';\n editor.autocorrect = false;\n editor.spellcheck = false;\n editor.tabIndex = -1;\n editor.dataset.effindomHiddenEditor = 'true';\n editor.setAttribute('aria-hidden', 'true');\n editor.style.position = 'fixed';\n editor.style.left = '-9999px';\n editor.style.top = '0';\n editor.style.width = '1px';\n editor.style.height = '1px';\n editor.style.opacity = '0';\n editor.style.pointerEvents = 'none';\n editor.style.font = '16px \"Noto Sans Symbols 2\", \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Noto Color Emoji\", monospace';\n editor.style.overflow = 'hidden';\n document.body.appendChild(editor);\n return editor;\n}\n\nexport function clearHiddenTextEditor(editor: HiddenTextEditor): void {\n if (editor.value.length !== 0) {\n editor.value = '';\n }\n editor.setSelectionRange(0, 0, 'none');\n}\n", "import type { BridgeRuntime } from '../../core-types';\nimport { commitIfVisualWork } from '../commit-policy';\nimport { handleToBigInt } from '../utils/encoding';\nimport { writeUtf8ToHeap } from '../utils/heap';\nimport { advanceCodeUnitIndex, codeUnitIndexToUtf8ByteOffset, retreatCodeUnitIndex, utf8ByteLength } from './text-encoding';\nimport {\n applyUtf8ByteReplacementEdit,\n buildClampedTextboxEdit,\n computeReplacementEdit,\n mapPendingBatchCurrentIndexToBaseIndex,\n type HiddenEditorWindow,\n type HiddenTextEditor,\n type PendingLocalReplacementEcho,\n type PendingLocalSelectionEcho,\n type PendingPasteInput,\n type PendingTextMutationBatch,\n type ReplacementEdit,\n} from './editor-model';\n\nconst MAX_BUFFERED_TYPING_MUTATIONS = 5;\n\nfunction currentInteractionTimeMs(): bigint {\n return BigInt(Math.floor(performance.now()));\n}\n\nexport interface EditorMutationController {\n applyActiveTextDeletion(forward: boolean): boolean;\n attachHiddenEditorListeners(editor: HiddenTextEditor): void;\n clearPendingTextMutations(): void;\n flushPendingTextMutationsToRuntime(): void;\n hasPendingTextMutations(): boolean;\n materializePendingTextMutations(): boolean;\n reset(): void;\n}\n\ninterface EditorMutationControllerOptions {\n readonly runtimeRef: { current: BridgeRuntime | null };\n readonly textByHandle: Record<string, string>;\n readonly selectionsByHandle: Record<string, { start: number; end: number }>;\n readonly textByteLengthsByHandle: Record<string, number>;\n getActiveEditor(): HiddenTextEditor;\n getActiveEditorWindow(): HiddenEditorWindow;\n getActiveTextEditable(): boolean;\n getActiveTextHandle(): bigint | null;\n isActiveEditorFocused(): boolean;\n setPendingLocalReplacementEcho(value: PendingLocalReplacementEcho | null): void;\n setPendingLocalSelectionEcho(value: PendingLocalSelectionEcho | null): void;\n syncFocusedInputState(): void;\n updateActiveEditorWindowText(text: string): void;\n}\n\nexport function createEditorMutationController(\n options: EditorMutationControllerOptions,\n): EditorMutationController {\n let hiddenInputIsComposing = false;\n let pendingTextMutationFlushFrame: number | null = null;\n let pendingTextMutationBatch: PendingTextMutationBatch | null = null;\n let pendingPasteInput: PendingPasteInput | null = null;\n let pendingPasteText = '';\n\n const clearPendingTextMutations = (): void => {\n if (pendingTextMutationFlushFrame !== null) {\n cancelAnimationFrame(pendingTextMutationFlushFrame);\n pendingTextMutationFlushFrame = null;\n }\n pendingTextMutationBatch = null;\n pendingPasteInput = null;\n pendingPasteText = '';\n };\n\n const materializePendingTextMutations = (): boolean => {\n const runtime = options.runtimeRef.current;\n const batch = pendingTextMutationBatch;\n if (runtime === null || batch === null) {\n return false;\n }\n pendingTextMutationBatch = null;\n const handle = handleToBigInt(batch.handle);\n const absoluteCaret = batch.docStart + codeUnitIndexToUtf8ByteOffset(batch.currentWindowText, batch.caret);\n runtime.ui._ui_set_interaction_time(batch.interactionTime);\n const replacement = computeReplacementEdit(batch.baseWindowText, batch.currentWindowText);\n if (replacement === null) {\n options.setPendingLocalSelectionEcho({\n handle: batch.handle,\n start: absoluteCaret,\n end: absoluteCaret,\n });\n runtime.ui._ui_set_text_selection_range(handle, absoluteCaret, absoluteCaret);\n return true;\n }\n\n const absoluteStart = batch.docStart + codeUnitIndexToUtf8ByteOffset(batch.baseWindowText, replacement.start);\n const absoluteEnd = batch.docStart + codeUnitIndexToUtf8ByteOffset(batch.baseWindowText, replacement.end);\n options.setPendingLocalReplacementEcho({\n handle: batch.handle,\n start: absoluteStart,\n end: absoluteEnd,\n text: replacement.insertedText,\n });\n options.setPendingLocalSelectionEcho({\n handle: batch.handle,\n start: absoluteCaret,\n end: absoluteCaret,\n });\n const heapString = writeUtf8ToHeap(runtime.ui, replacement.insertedText);\n try {\n runtime.ui._ui_replace_text_range(\n handle,\n absoluteStart,\n absoluteEnd,\n heapString.ptr,\n heapString.len,\n absoluteCaret,\n );\n } finally {\n heapString.dispose();\n }\n return true;\n };\n\n const restorePendingTypingState = (editor: HiddenTextEditor): boolean => {\n const batch = pendingTextMutationBatch;\n const activeTextHandle = options.getActiveTextHandle();\n const activeEditorWindow = options.getActiveEditorWindow();\n if (\n batch === null ||\n batch.kind !== 'typing' ||\n batch.mutationCount < MAX_BUFFERED_TYPING_MUTATIONS ||\n activeTextHandle === null ||\n batch.handle !== activeTextHandle.toString() ||\n batch.docStart !== activeEditorWindow.docStart\n ) {\n return false;\n }\n editor.value = batch.currentWindowText;\n editor.setSelectionRange(batch.caret, batch.caret, 'none');\n return true;\n };\n\n const flushPendingTextMutationsToRuntime = (): void => {\n const runtime = options.runtimeRef.current;\n if (runtime === null || pendingTextMutationBatch === null) {\n return;\n }\n if (materializePendingTextMutations()) {\n runtime.commitFrame();\n }\n };\n\n const schedulePendingTextMutationFlush = (): void => {\n if (pendingTextMutationFlushFrame !== null) {\n return;\n }\n pendingTextMutationFlushFrame = requestAnimationFrame(() => {\n pendingTextMutationFlushFrame = null;\n options.runtimeRef.current?.flushPendingCommit();\n });\n };\n\n const commitReplacementEdit = (\n previousText: string,\n nextText: string,\n replacement: ReplacementEdit,\n caret: number,\n kind: 'typing' | 'paste' = 'typing',\n replacePendingBatch = false,\n ): void => {\n const runtime = options.runtimeRef.current;\n const activeTextHandle = options.getActiveTextHandle();\n const activeEditorWindow = options.getActiveEditorWindow();\n if (runtime === null || activeTextHandle === null) {\n return;\n }\n const clampedStart = Math.max(0, Math.min(replacement.start, previousText.length));\n const clampedEnd = Math.max(clampedStart, Math.min(replacement.end, previousText.length));\n const activeHandleKey = activeTextHandle.toString();\n if (pendingTextMutationBatch === null && runtime.hasPendingCommit()) {\n runtime.flushPendingCommit();\n }\n\n const absoluteStart = activeEditorWindow.docStart + codeUnitIndexToUtf8ByteOffset(previousText, clampedStart);\n const absoluteEnd = activeEditorWindow.docStart + codeUnitIndexToUtf8ByteOffset(previousText, clampedEnd);\n const intendedAbsoluteCaret =\n activeEditorWindow.docStart + codeUnitIndexToUtf8ByteOffset(nextText, Math.max(0, Math.min(caret, nextText.length)));\n let fullPreviousText = options.textByHandle[activeHandleKey] ?? '';\n if (\n replacePendingBatch &&\n pendingTextMutationBatch !== null &&\n pendingTextMutationBatch.handle === activeHandleKey &&\n pendingTextMutationBatch.docStart === activeEditorWindow.docStart\n ) {\n const pendingReplacement = computeReplacementEdit(\n pendingTextMutationBatch.baseWindowText,\n pendingTextMutationBatch.currentWindowText,\n );\n if (pendingReplacement !== null) {\n const pendingAbsoluteStart =\n pendingTextMutationBatch.docStart +\n codeUnitIndexToUtf8ByteOffset(pendingTextMutationBatch.baseWindowText, pendingReplacement.start);\n const pendingAbsoluteEnd = pendingAbsoluteStart + utf8ByteLength(pendingReplacement.insertedText);\n fullPreviousText = applyUtf8ByteReplacementEdit(\n fullPreviousText,\n pendingAbsoluteStart,\n pendingAbsoluteEnd,\n pendingTextMutationBatch.baseWindowText.slice(pendingReplacement.start, pendingReplacement.end),\n );\n }\n }\n const clampedEdit = buildClampedTextboxEdit(\n fullPreviousText,\n absoluteStart,\n absoluteEnd,\n replacement.insertedText,\n intendedAbsoluteCaret,\n );\n if (clampedEdit.clampChanged) {\n if (pendingTextMutationBatch !== null) {\n if (materializePendingTextMutations()) {\n runtime.commitFrame();\n }\n }\n if (runtime.hasPendingCommit()) {\n runtime.flushPendingCommit();\n }\n clearPendingTextMutations();\n options.textByHandle[activeHandleKey] = clampedEdit.fullNextText;\n options.textByteLengthsByHandle[activeHandleKey] = utf8ByteLength(clampedEdit.fullNextText);\n options.selectionsByHandle[activeHandleKey] = { start: clampedEdit.caretByte, end: clampedEdit.caretByte };\n options.syncFocusedInputState();\n } else {\n options.textByHandle[activeHandleKey] = clampedEdit.fullNextText;\n options.textByteLengthsByHandle[activeHandleKey] = utf8ByteLength(clampedEdit.fullNextText);\n options.selectionsByHandle[activeHandleKey] = { start: clampedEdit.caretByte, end: clampedEdit.caretByte };\n options.updateActiveEditorWindowText(nextText);\n }\n\n if (clampedEdit.replacement === null) {\n return;\n }\n if (clampedEdit.clampChanged) {\n const replacementStartByte = codeUnitIndexToUtf8ByteOffset(fullPreviousText, clampedEdit.replacement.start);\n const replacementEndByte = codeUnitIndexToUtf8ByteOffset(fullPreviousText, clampedEdit.replacement.end);\n options.setPendingLocalReplacementEcho({\n handle: activeHandleKey,\n start: replacementStartByte,\n end: replacementEndByte,\n text: clampedEdit.replacement.insertedText,\n });\n options.setPendingLocalSelectionEcho({\n handle: activeHandleKey,\n start: clampedEdit.caretByte,\n end: clampedEdit.caretByte,\n });\n runtime.ui._ui_set_interaction_time(currentInteractionTimeMs());\n const heapString = writeUtf8ToHeap(runtime.ui, clampedEdit.replacement.insertedText);\n try {\n runtime.ui._ui_replace_text_range(\n activeTextHandle,\n replacementStartByte,\n replacementEndByte,\n heapString.ptr,\n heapString.len,\n clampedEdit.caretByte,\n );\n } finally {\n heapString.dispose();\n }\n runtime.commitFrame();\n return;\n }\n\n if (\n pendingTextMutationBatch !== null &&\n (\n pendingTextMutationBatch.handle !== activeHandleKey ||\n pendingTextMutationBatch.docStart !== activeEditorWindow.docStart ||\n (!replacePendingBatch && pendingTextMutationBatch.kind !== kind)\n )\n ) {\n if (materializePendingTextMutations()) {\n runtime.commitFrame();\n }\n runtime.flushPendingCommit();\n }\n\n const activeEditor = options.getActiveEditor();\n pendingTextMutationBatch = pendingTextMutationBatch === null || replacePendingBatch\n ? {\n handle: activeHandleKey,\n docStart: activeEditorWindow.docStart,\n baseWindowText: previousText,\n currentWindowText: activeEditor.value,\n caret: activeEditor.selectionStart ?? activeEditor.value.length,\n interactionTime: currentInteractionTimeMs(),\n kind,\n mutationCount: 1,\n }\n : {\n ...pendingTextMutationBatch,\n currentWindowText: activeEditor.value,\n caret: activeEditor.selectionStart ?? activeEditor.value.length,\n interactionTime: currentInteractionTimeMs(),\n mutationCount: kind === 'paste' ? 1 : pendingTextMutationBatch.mutationCount + 1,\n };\n schedulePendingTextMutationFlush();\n runtime.requestFrame();\n };\n\n const commitImeEdit = (\n text: string,\n caret: number,\n kind: 'typing' | 'paste' = 'typing',\n replacePendingBatch = false,\n ): void => {\n const previousText = options.getActiveEditorWindow().text;\n const replacement = computeReplacementEdit(previousText, text);\n if (replacement === null) {\n const runtime = options.runtimeRef.current;\n if (runtime !== null) {\n commitIfVisualWork(runtime);\n }\n return;\n }\n commitReplacementEdit(previousText, text, replacement, caret, kind, replacePendingBatch);\n };\n\n const applyActiveTextDeletion = (forward: boolean): boolean => {\n if (\n options.getActiveTextHandle() === null ||\n !options.getActiveTextEditable() ||\n hiddenInputIsComposing ||\n !options.isActiveEditorFocused()\n ) {\n return false;\n }\n const editor = options.getActiveEditor();\n const text = editor.value;\n const selectionStart = editor.selectionStart ?? text.length;\n const selectionEnd = editor.selectionEnd ?? selectionStart;\n const rangeStart = Math.min(selectionStart, selectionEnd);\n const rangeEnd = Math.max(selectionStart, selectionEnd);\n let nextText = text;\n let nextCaret = rangeStart;\n let replacementStart = rangeStart;\n let replacementEnd = rangeEnd;\n if (rangeStart !== rangeEnd) {\n nextText = text.slice(0, rangeStart) + text.slice(rangeEnd);\n } else if (forward) {\n if (rangeStart >= text.length) {\n return true;\n }\n replacementEnd = advanceCodeUnitIndex(text, rangeStart);\n nextText = text.slice(0, rangeStart) + text.slice(replacementEnd);\n } else {\n if (rangeStart === 0) {\n return true;\n }\n replacementStart = retreatCodeUnitIndex(text, rangeStart);\n nextCaret = replacementStart;\n nextText = text.slice(0, nextCaret) + text.slice(rangeStart);\n }\n editor.value = nextText;\n editor.setSelectionRange(nextCaret, nextCaret, 'none');\n commitReplacementEdit(\n text,\n nextText,\n {\n start: replacementStart,\n end: replacementEnd,\n insertedText: '',\n },\n nextCaret,\n );\n return true;\n };\n\n const attachHiddenEditorListeners = (editor: HiddenTextEditor): void => {\n editor.addEventListener('paste', (event) => {\n const clipboardEvent = event as ClipboardEvent;\n pendingPasteText = clipboardEvent.clipboardData?.getData('text/plain') ?? '';\n });\n\n editor.addEventListener('beforeinput', (event) => {\n const activeTextHandle = options.getActiveTextHandle();\n const activeEditorWindow = options.getActiveEditorWindow();\n if (!(event instanceof InputEvent) || event.inputType !== 'insertFromPaste' || activeTextHandle === null) {\n return;\n }\n const handleKey = activeTextHandle.toString();\n if (\n pendingTextMutationBatch !== null &&\n pendingTextMutationBatch.handle === handleKey &&\n pendingTextMutationBatch.docStart === activeEditorWindow.docStart &&\n pendingTextMutationBatch.kind !== 'paste'\n ) {\n flushPendingTextMutationsToRuntime();\n }\n const selectionStart = editor.selectionStart ?? editor.value.length;\n const selectionEnd = editor.selectionEnd ?? selectionStart;\n pendingPasteInput = {\n handle: handleKey,\n docStart: activeEditorWindow.docStart,\n selectionStart,\n selectionEnd,\n text: typeof event.data === 'string' ? event.data : pendingPasteText,\n };\n pendingPasteText = '';\n });\n\n editor.addEventListener('compositionstart', () => {\n hiddenInputIsComposing = true;\n });\n\n editor.addEventListener('input', (event) => {\n const activeTextHandle = options.getActiveTextHandle();\n const activeEditorWindow = options.getActiveEditorWindow();\n if (hiddenInputIsComposing) {\n return;\n }\n if (event instanceof InputEvent && event.inputType === 'insertText' && restorePendingTypingState(editor)) {\n return;\n }\n if (event instanceof InputEvent && event.inputType === 'insertFromPaste') {\n const pasteInput = pendingPasteInput;\n pendingPasteInput = null;\n pendingPasteText = '';\n if (\n pasteInput !== null &&\n activeTextHandle !== null &&\n activeTextHandle.toString() === pasteInput.handle &&\n activeEditorWindow.docStart === pasteInput.docStart\n ) {\n const pendingBatch = pendingTextMutationBatch !== null &&\n pendingTextMutationBatch.handle === pasteInput.handle &&\n pendingTextMutationBatch.docStart === pasteInput.docStart &&\n pendingTextMutationBatch.kind === 'paste'\n ? pendingTextMutationBatch\n : null;\n const baseWindowText = pendingBatch?.baseWindowText ?? activeEditorWindow.text;\n let selectionStart = pasteInput.selectionStart;\n let selectionEnd = pasteInput.selectionEnd;\n if (pendingBatch !== null) {\n selectionStart = mapPendingBatchCurrentIndexToBaseIndex(pendingBatch, selectionStart);\n selectionEnd = mapPendingBatchCurrentIndexToBaseIndex(pendingBatch, selectionEnd);\n }\n const rangeStart = Math.min(selectionStart, selectionEnd);\n const rangeEnd = Math.max(selectionStart, selectionEnd);\n const nextText =\n `${baseWindowText.slice(0, rangeStart)}${pasteInput.text}${baseWindowText.slice(rangeEnd)}`;\n const nextCaret = rangeStart + pasteInput.text.length;\n if (editor.value !== nextText) {\n editor.value = nextText;\n }\n editor.setSelectionRange(nextCaret, nextCaret, 'none');\n commitReplacementEdit(\n baseWindowText,\n nextText,\n {\n start: rangeStart,\n end: rangeEnd,\n insertedText: pasteInput.text,\n },\n nextCaret,\n 'paste',\n pendingBatch !== null,\n );\n return;\n }\n }\n pendingPasteInput = null;\n pendingPasteText = '';\n commitImeEdit(editor.value, editor.selectionStart ?? editor.value.length, 'typing');\n });\n\n editor.addEventListener('compositionend', () => {\n hiddenInputIsComposing = false;\n pendingPasteInput = null;\n pendingPasteText = '';\n commitImeEdit(editor.value, editor.selectionStart ?? editor.value.length, 'typing');\n });\n };\n\n return {\n applyActiveTextDeletion,\n attachHiddenEditorListeners,\n clearPendingTextMutations,\n flushPendingTextMutationsToRuntime,\n hasPendingTextMutations: () => pendingTextMutationBatch !== null,\n materializePendingTextMutations,\n reset: () => {\n hiddenInputIsComposing = false;\n clearPendingTextMutations();\n },\n };\n}\n", "import type {\n BridgeLogs,\n BridgeRuntime,\n FocusEventLog,\n SelectionChangeLog,\n WasmHandleLike,\n} from '../../core-types';\nimport type { BridgeInteractionState } from '../local-types';\nimport { codeUnitIndexToUtf8ByteOffset, utf8ByteLength } from './text-encoding';\nimport {\n applyUtf8ByteReplacementEdit,\n buildClampedTextboxEdit,\n buildHiddenEditorWindow,\n clearHiddenTextEditor,\n createHiddenTextEditor,\n type HiddenEditorWindow,\n type HiddenTextEditor,\n type PendingLocalReplacementEcho,\n type PendingLocalSelectionEcho,\n summarizeTextChange,\n utf8ByteOffsetToCodeUnitIndex,\n} from './editor-model';\nimport { createEditorMutationController } from './editor-mutations';\nimport { handleToBigInt } from '../utils/encoding';\nimport { writeUtf8ToHeap } from '../utils/heap';\n\nexport interface EditorSession extends BridgeInteractionState {\n handleClipboardRead(handle: WasmHandleLike): void;\n handleFocusChanged(handle: WasmHandleLike, isFocused: boolean): void;\n handleRequestSemanticAnnouncement(handle: WasmHandleLike): void;\n handleSelectionChanged(handle: WasmHandleLike, start: number, end: number): void;\n handleTextChanged(handle: WasmHandleLike, text: string): void;\n handleTextReplaced(handle: WasmHandleLike, start: number, end: number, text: string): void;\n}\n\nconst CARET_BLINK_INTERVAL_MS = 500;\n\nfunction currentInteractionTimeMs(): bigint {\n return BigInt(Math.floor(performance.now()));\n}\n\nexport function createEditorSession(\n runtimeRef: { current: BridgeRuntime | null },\n logs: BridgeLogs,\n): EditorSession {\n const textByHandle = Object.create(null) as Record<string, string>;\n const selectionsByHandle = Object.create(null) as Record<string, { start: number; end: number }>;\n const hiddenInput = createHiddenTextEditor(false) as HTMLInputElement;\n const hiddenTextarea = createHiddenTextEditor(true) as HTMLTextAreaElement;\n let activeTextHandle: bigint | null = null;\n let lastPointerClientX: number | null = null;\n let lastPointerClientY: number | null = null;\n let lastPointerX = 0;\n let lastPointerY = 0;\n let lastPointerModifiers = 0;\n let lastInteractivePointerHandle: bigint | null = null;\n let capturedPointerHandle: bigint | null = null;\n let pointerInsideCanvas = false;\n let appSessionVersion = 0;\n let activeTextEditable = false;\n let activeTextMultiline = false;\n let activeEditorWindow: HiddenEditorWindow = { text: '', docStart: 0, docEnd: 0, textStart: 0, textEnd: 0 };\n const textByteLengthsByHandle = Object.create(null) as Record<string, number>;\n const pendingCaretRevealByHandle = Object.create(null) as Record<string, boolean>;\n let pendingCaretRevealFrame: number | null = null;\n let pendingLocalReplacementEcho: PendingLocalReplacementEcho | null = null;\n let pendingLocalSelectionEcho: PendingLocalSelectionEcho | null = null;\n let deferredTouchFocusHandle: string | null = null;\n let caretBlinkTimer: ReturnType<typeof setTimeout> | null = null;\n let focusedHandle: string | null = null;\n const pendingSemanticAnnouncements = new Set<string>();\n window.__bridgeLogs = logs;\n window.__bridgeTextByHandle = textByHandle;\n window.__bridgeSelectionsByHandle = selectionsByHandle;\n window.__bridgeActiveEditorWindow = { handle: null, ...activeEditorWindow };\n\n const getActiveEditor = (): HiddenTextEditor => (activeTextMultiline ? hiddenTextarea : hiddenInput);\n\n const isActiveEditorFocused = (): boolean => document.activeElement === getActiveEditor();\n\n const queueSemanticAnnouncement = (handleKey: string): void => {\n pendingSemanticAnnouncements.add(handleKey);\n runtimeRef.current?.requestFrame();\n };\n\n const clampSelectionToText = (\n length: number,\n selection: { start: number; end: number },\n ): { start: number; end: number } => ({\n start: Math.max(0, Math.min(selection.start, length)),\n end: Math.max(0, Math.min(selection.end, length)),\n });\n\n const clearCaretBlinkTimer = (): void => {\n if (caretBlinkTimer !== null) {\n clearTimeout(caretBlinkTimer);\n caretBlinkTimer = null;\n }\n };\n\n const shouldRunCaretBlinkTimer = (): boolean => {\n if (activeTextHandle === null || !isActiveEditorFocused()) {\n return false;\n }\n const handleKey = activeTextHandle.toString();\n const text = textByHandle[handleKey] ?? '';\n const textByteLength = textByteLengthsByHandle[handleKey] ?? utf8ByteLength(text);\n const selection = selectionsByHandle[handleKey] ?? { start: textByteLength, end: textByteLength };\n const { start, end } = clampSelectionToText(textByteLength, selection);\n return start === end;\n };\n\n const armCaretBlinkTimer = (): void => {\n if (caretBlinkTimer !== null) {\n return;\n }\n caretBlinkTimer = setTimeout(() => {\n caretBlinkTimer = null;\n if (!shouldRunCaretBlinkTimer()) {\n return;\n }\n runtimeRef.current?.requestFrame();\n armCaretBlinkTimer();\n }, CARET_BLINK_INTERVAL_MS);\n };\n\n const updateCaretBlinkTimer = (resetPhase = false): void => {\n if (!shouldRunCaretBlinkTimer()) {\n clearCaretBlinkTimer();\n return;\n }\n if (resetPhase) {\n clearCaretBlinkTimer();\n }\n armCaretBlinkTimer();\n };\n\n const syncActiveEditorWindowDebug = (handle: string | null): void => {\n window.__bridgeActiveEditorWindow = {\n handle,\n text: activeEditorWindow.text,\n docStart: activeEditorWindow.docStart,\n docEnd: activeEditorWindow.docEnd,\n };\n };\n\n const clearActiveEditorWindow = (): void => {\n activeEditorWindow = { text: '', docStart: 0, docEnd: 0, textStart: 0, textEnd: 0 };\n syncActiveEditorWindowDebug(null);\n };\n\n const clearPendingCaretReveal = (): void => {\n if (pendingCaretRevealFrame !== null) {\n cancelAnimationFrame(pendingCaretRevealFrame);\n pendingCaretRevealFrame = null;\n }\n for (const key of Object.keys(pendingCaretRevealByHandle)) {\n delete pendingCaretRevealByHandle[key];\n }\n };\n\n const updateActiveEditorWindowText = (text: string): void => {\n activeEditorWindow = {\n text,\n docStart: activeEditorWindow.docStart,\n docEnd: activeEditorWindow.docStart + utf8ByteLength(text),\n textStart: activeEditorWindow.textStart,\n textEnd: activeEditorWindow.textStart + text.length,\n };\n syncActiveEditorWindowDebug(activeTextHandle?.toString() ?? null);\n };\n\n const detachBridgeTextInput = (): void => {\n hiddenInput.blur();\n hiddenTextarea.blur();\n };\n\n const getTextboxState = (\n handleKey: string,\n ): { isTextbox: boolean; isEditable: boolean; isMultiline: boolean } => {\n const runtime = runtimeRef.current;\n if (runtime === null) {\n return { isTextbox: false, isEditable: false, isMultiline: false };\n }\n const node = runtime.getSemanticTree().find((entry) => entry.handle === handleKey);\n if (node?.roleName !== 'textbox') {\n return { isTextbox: false, isEditable: false, isMultiline: false };\n }\n return {\n isTextbox: true,\n isEditable: node.state.readonly !== true,\n isMultiline: node.state.multiline === true,\n };\n };\n\n const syncFocusedInputState = (): void => {\n if (activeTextHandle === null) {\n clearCaretBlinkTimer();\n clearActiveEditorWindow();\n detachBridgeTextInput();\n clearHiddenTextEditor(hiddenInput);\n clearHiddenTextEditor(hiddenTextarea);\n return;\n }\n\n const activeEditor = getActiveEditor();\n const handleKey = activeTextHandle.toString();\n const text = textByHandle[handleKey] ?? '';\n const textByteLength = textByteLengthsByHandle[handleKey] ?? utf8ByteLength(text);\n textByteLengthsByHandle[handleKey] = textByteLength;\n const selection = selectionsByHandle[handleKey] ?? { start: textByteLength, end: textByteLength };\n const { start: startByte, end: endByte } = clampSelectionToText(textByteLength, selection);\n const start = utf8ByteOffsetToCodeUnitIndex(text, startByte, textByteLength);\n const end = utf8ByteOffsetToCodeUnitIndex(text, endByte, textByteLength);\n const direction = start === end ? 'none' : (startByte < endByte ? 'forward' : 'backward');\n const normalizedStart = Math.min(start, end);\n const normalizedEnd = Math.max(start, end);\n activeEditorWindow = buildHiddenEditorWindow(text, normalizedStart, normalizedEnd, textByteLength, activeEditorWindow);\n syncActiveEditorWindowDebug(handleKey);\n const localStart = normalizedStart - activeEditorWindow.textStart;\n const localEnd = normalizedEnd - activeEditorWindow.textStart;\n if (activeEditor.value !== activeEditorWindow.text) {\n activeEditor.value = activeEditorWindow.text;\n }\n activeEditor.readOnly = !activeTextEditable;\n activeEditor.setSelectionRange(localStart, localEnd, direction);\n updateCaretBlinkTimer();\n };\n\n const mutationController = createEditorMutationController({\n runtimeRef,\n textByHandle,\n selectionsByHandle,\n textByteLengthsByHandle,\n getActiveEditor,\n getActiveEditorWindow: () => activeEditorWindow,\n getActiveTextEditable: () => activeTextEditable,\n getActiveTextHandle: () => activeTextHandle,\n isActiveEditorFocused,\n setPendingLocalReplacementEcho: (value) => {\n pendingLocalReplacementEcho = value;\n },\n setPendingLocalSelectionEcho: (value) => {\n pendingLocalSelectionEcho = value;\n },\n syncFocusedInputState,\n updateActiveEditorWindowText,\n });\n\n const clearPendingTextMutations = (): void => {\n mutationController.clearPendingTextMutations();\n };\n\n const focusHiddenEditorNow = (): void => {\n getActiveEditor().focus({ preventScroll: true });\n syncFocusedInputState();\n updateCaretBlinkTimer(true);\n };\n\n const refocusActiveTextInput = (): void => {\n if (activeTextHandle === null) {\n if (deferredTouchFocusHandle === null) {\n return;\n }\n const textboxState = getTextboxState(deferredTouchFocusHandle);\n if (!textboxState.isTextbox) {\n return;\n }\n activeTextHandle = handleToBigInt(deferredTouchFocusHandle);\n activeTextEditable = textboxState.isEditable;\n activeTextMultiline = textboxState.isMultiline;\n syncFocusedInputState();\n focusHiddenEditorNow();\n return;\n }\n focusHiddenEditorNow();\n };\n\n const beginTouchTextFocusDeferral = (handle: bigint): void => {\n deferredTouchFocusHandle = handle.toString();\n };\n\n const cancelTouchTextFocusDeferral = (): void => {\n deferredTouchFocusHandle = null;\n };\n\n const commitTouchTextFocusDeferral = (handle: bigint): void => {\n const handleKey = handle.toString();\n if (deferredTouchFocusHandle !== handleKey) {\n return;\n }\n deferredTouchFocusHandle = null;\n if (activeTextHandle?.toString() !== handleKey) {\n return;\n }\n if (!isActiveEditorFocused()) {\n focusHiddenEditorNow();\n }\n };\n\n const scheduleCaretRevealReplay = (handleKey: string): void => {\n if (!pendingCaretRevealByHandle[handleKey] || activeTextHandle?.toString() !== handleKey) {\n return;\n }\n if (pendingCaretRevealFrame !== null) {\n return;\n }\n pendingCaretRevealFrame = requestAnimationFrame(() => {\n pendingCaretRevealFrame = null;\n if (!pendingCaretRevealByHandle[handleKey] || activeTextHandle?.toString() !== handleKey) {\n return;\n }\n delete pendingCaretRevealByHandle[handleKey];\n const runtime = runtimeRef.current;\n if (runtime === null) {\n return;\n }\n const text = textByHandle[handleKey] ?? '';\n const textByteLength = utf8ByteLength(text);\n const selection = selectionsByHandle[handleKey] ?? { start: textByteLength, end: textByteLength };\n const { start, end } = clampSelectionToText(textByteLength, selection);\n runtime.ui._ui_set_text_selection_range(handleToBigInt(handleKey), start, end);\n });\n };\n\n const clearRecordMap = <T>(record: Record<string, T>): void => {\n for (const key of Object.keys(record)) {\n delete record[key];\n }\n };\n\n const resetAppSession = (): void => {\n appSessionVersion += 1;\n clearRecordMap(textByHandle);\n clearRecordMap(textByteLengthsByHandle);\n clearRecordMap(selectionsByHandle);\n clearPendingCaretReveal();\n mutationController.reset();\n pendingLocalReplacementEcho = null;\n pendingLocalSelectionEcho = null;\n deferredTouchFocusHandle = null;\n clearCaretBlinkTimer();\n activeTextHandle = null;\n activeTextEditable = false;\n activeTextMultiline = false;\n clearActiveEditorWindow();\n focusedHandle = null;\n pendingSemanticAnnouncements.clear();\n lastInteractivePointerHandle = null;\n capturedPointerHandle = null;\n hiddenInput.value = '';\n hiddenInput.setSelectionRange(0, 0, 'none');\n hiddenTextarea.value = '';\n hiddenTextarea.setSelectionRange(0, 0, 'none');\n detachBridgeTextInput();\n };\n mutationController.attachHiddenEditorListeners(hiddenInput);\n mutationController.attachHiddenEditorListeners(hiddenTextarea);\n\n const handleFocusChanged = (handle: WasmHandleLike, isFocused: boolean): void => {\n const handleKey = handle.toString();\n const entry: FocusEventLog = { handle: handleKey, isFocused };\n logs.focusEvents.push(entry);\n if (isFocused) {\n focusedHandle = handleKey;\n } else if (focusedHandle === handleKey) {\n focusedHandle = null;\n }\n if (isFocused) {\n const textboxState = getTextboxState(handleKey);\n if (!textboxState.isTextbox) {\n deferredTouchFocusHandle = null;\n delete pendingCaretRevealByHandle[handleKey];\n activeTextHandle = null;\n activeTextEditable = false;\n activeTextMultiline = false;\n syncFocusedInputState();\n updateCaretBlinkTimer();\n queueSemanticAnnouncement(handleKey);\n return;\n }\n activeTextHandle = handleToBigInt(handle);\n activeTextEditable = textboxState.isEditable;\n activeTextMultiline = textboxState.isMultiline;\n syncFocusedInputState();\n if (deferredTouchFocusHandle === handleKey) {\n updateCaretBlinkTimer();\n queueSemanticAnnouncement(handleKey);\n return;\n }\n window.setTimeout(() => {\n if (activeTextHandle !== null && activeTextHandle.toString() === handleKey) {\n focusHiddenEditorNow();\n }\n }, 0);\n } else if (activeTextHandle !== null && activeTextHandle.toString() === handleKey) {\n if (deferredTouchFocusHandle === handleKey) {\n updateCaretBlinkTimer();\n return;\n }\n deferredTouchFocusHandle = null;\n runtimeRef.current?.flushPendingCommit();\n delete pendingCaretRevealByHandle[handleKey];\n pendingLocalReplacementEcho = null;\n pendingLocalSelectionEcho = null;\n clearPendingTextMutations();\n activeTextHandle = null;\n activeTextEditable = false;\n activeTextMultiline = false;\n syncFocusedInputState();\n }\n updateCaretBlinkTimer();\n if (isFocused) {\n queueSemanticAnnouncement(handleKey);\n }\n };\n\n const handleTextChanged = (handle: WasmHandleLike, text: string): void => {\n const handleKey = handle.toString();\n if (pendingLocalReplacementEcho !== null && pendingLocalReplacementEcho.handle === handleKey) {\n pendingLocalReplacementEcho = null;\n }\n textByHandle[handleKey] = text;\n textByteLengthsByHandle[handleKey] = utf8ByteLength(text);\n logs.textChanges.push(summarizeTextChange(handleKey, text));\n if (activeTextHandle !== null && activeTextHandle.toString() === handleKey) {\n pendingCaretRevealByHandle[handleKey] = true;\n if (!isActiveEditorFocused()) {\n focusHiddenEditorNow();\n updateCaretBlinkTimer(true);\n return;\n }\n syncFocusedInputState();\n updateCaretBlinkTimer(true);\n }\n };\n\n const handleRequestSemanticAnnouncement = (handle: WasmHandleLike): void => {\n queueSemanticAnnouncement(handle.toString());\n };\n\n const handleTextReplaced = (handle: WasmHandleLike, start: number, end: number, text: string): void => {\n const handleKey = handle.toString();\n const previousText = textByHandle[handleKey] ?? '';\n const previousTextByteLength = textByteLengthsByHandle[handleKey] ?? utf8ByteLength(previousText);\n const isLocalEcho = pendingLocalReplacementEcho !== null\n && pendingLocalReplacementEcho.handle === handleKey\n && pendingLocalReplacementEcho.start === start\n && pendingLocalReplacementEcho.end === end\n && pendingLocalReplacementEcho.text === text\n && activeTextHandle !== null\n && activeTextHandle.toString() === handleKey\n && isActiveEditorFocused();\n const nextText = isLocalEcho\n ? previousText\n : applyUtf8ByteReplacementEdit(previousText, start, end, text);\n if (!isLocalEcho) {\n textByHandle[handleKey] = nextText;\n textByteLengthsByHandle[handleKey] = previousTextByteLength - (end - start) + utf8ByteLength(text);\n }\n if (isLocalEcho) {\n pendingLocalReplacementEcho = null;\n }\n logs.textChanges.push(summarizeTextChange(handleKey, nextText));\n if (activeTextHandle !== null && activeTextHandle.toString() === handleKey) {\n pendingCaretRevealByHandle[handleKey] = true;\n if (!isActiveEditorFocused()) {\n focusHiddenEditorNow();\n updateCaretBlinkTimer(true);\n return;\n }\n if (!isLocalEcho) {\n syncFocusedInputState();\n }\n updateCaretBlinkTimer(true);\n }\n };\n\n const handleSelectionChanged = (handle: WasmHandleLike, start: number, end: number): void => {\n const handleKey = handle.toString();\n const isLocalEcho = pendingLocalSelectionEcho !== null\n && pendingLocalSelectionEcho.handle === handleKey\n && pendingLocalSelectionEcho.start === start\n && pendingLocalSelectionEcho.end === end\n && activeTextHandle !== null\n && activeTextHandle.toString() === handleKey\n && isActiveEditorFocused();\n selectionsByHandle[handleKey] = { start, end };\n if (pendingLocalSelectionEcho !== null && pendingLocalSelectionEcho.handle === handleKey) {\n pendingLocalSelectionEcho = null;\n }\n const entry: SelectionChangeLog = { handle: handleKey, start, end };\n logs.selectionChanges.push(entry);\n if (activeTextHandle !== null && activeTextHandle.toString() === handleKey) {\n if (!isActiveEditorFocused()) {\n focusHiddenEditorNow();\n updateCaretBlinkTimer(true);\n return;\n }\n if (!isLocalEcho) {\n syncFocusedInputState();\n }\n updateCaretBlinkTimer(true);\n scheduleCaretRevealReplay(handleKey);\n }\n };\n\n const handleClipboardRead = (handle: WasmHandleLike): void => {\n const runtime = runtimeRef.current;\n if (runtime === null) {\n return;\n }\n const handleValue = handleToBigInt(handle);\n const requestSessionVersion = appSessionVersion;\n logs.clipboardReadRequests.push(handleValue.toString());\n void navigator.clipboard.readText().then((text) => {\n if (requestSessionVersion !== appSessionVersion) {\n return;\n }\n const handleKey = handleValue.toString();\n const currentText = textByHandle[handleKey] ?? '';\n const currentTextByteLength = textByteLengthsByHandle[handleKey] ?? utf8ByteLength(currentText);\n const selection = selectionsByHandle[handleKey] ?? { start: currentTextByteLength, end: currentTextByteLength };\n const rangeStart = Math.max(0, Math.min(selection.start, selection.end));\n const rangeEnd = Math.max(rangeStart, Math.min(currentTextByteLength, Math.max(selection.start, selection.end)));\n const clampedEdit = buildClampedTextboxEdit(\n currentText,\n rangeStart,\n rangeEnd,\n text,\n rangeStart + utf8ByteLength(text),\n );\n textByHandle[handleKey] = clampedEdit.fullNextText;\n textByteLengthsByHandle[handleKey] = utf8ByteLength(clampedEdit.fullNextText);\n selectionsByHandle[handleKey] = { start: clampedEdit.caretByte, end: clampedEdit.caretByte };\n if (activeTextHandle !== null && activeTextHandle.toString() === handleKey) {\n syncFocusedInputState();\n }\n if (clampedEdit.replacement === null) {\n return;\n }\n runtime.ui._ui_set_interaction_time(currentInteractionTimeMs());\n const replacementStartByte = codeUnitIndexToUtf8ByteOffset(currentText, clampedEdit.replacement.start);\n const replacementEndByte = codeUnitIndexToUtf8ByteOffset(currentText, clampedEdit.replacement.end);\n pendingLocalReplacementEcho = {\n handle: handleKey,\n start: replacementStartByte,\n end: replacementEndByte,\n text: clampedEdit.replacement.insertedText,\n };\n pendingLocalSelectionEcho = {\n handle: handleKey,\n start: clampedEdit.caretByte,\n end: clampedEdit.caretByte,\n };\n const heapString = writeUtf8ToHeap(runtime.ui, clampedEdit.replacement.insertedText);\n try {\n runtime.ui._ui_replace_text_range(\n handleValue,\n replacementStartByte,\n replacementEndByte,\n heapString.ptr,\n heapString.len,\n clampedEdit.caretByte,\n );\n } finally {\n heapString.dispose();\n }\n runtime.commitFrame();\n }).catch(() => undefined);\n };\n\n return {\n logs,\n textByHandle,\n selectionsByHandle,\n hasPendingTextMutations: mutationController.hasPendingTextMutations,\n materializePendingTextMutations: mutationController.materializePendingTextMutations,\n getActiveTextEditable: () => activeTextEditable,\n getActiveTextHandle: () => activeTextHandle,\n getActiveTextMultiline: () => activeTextMultiline,\n getCapturedPointerHandle: () => capturedPointerHandle,\n getLastPointerClientPosition: () => ({ x: lastPointerClientX, y: lastPointerClientY }),\n getLastPointerPosition: () => ({ x: lastPointerX, y: lastPointerY }),\n getLastPointerModifiers: () => lastPointerModifiers,\n getLastInteractivePointerHandle: () => lastInteractivePointerHandle,\n isActiveTextInputFocused: isActiveEditorFocused,\n isPointerInsideCanvas: () => pointerInsideCanvas,\n applyActiveTextDeletion: mutationController.applyActiveTextDeletion,\n beginTouchTextFocusDeferral,\n cancelTouchTextFocusDeferral,\n commitTouchTextFocusDeferral,\n refocusActiveTextInput,\n resetAppSession,\n consumePendingSemanticAnnouncements: () => {\n const handles = Array.from(pendingSemanticAnnouncements.values());\n pendingSemanticAnnouncements.clear();\n return handles;\n },\n getFocusedHandle: () => focusedHandle,\n setCapturedPointerHandle: (handle: bigint | null) => {\n capturedPointerHandle = handle;\n },\n setLastPointerClientPosition: (x: number, y: number) => {\n lastPointerClientX = x;\n lastPointerClientY = y;\n },\n setLastPointerModifiers: (modifiers: number) => {\n lastPointerModifiers = modifiers;\n },\n setLastPointerPosition: (x: number, y: number) => {\n lastPointerX = x;\n lastPointerY = y;\n },\n setLastInteractivePointerHandle: (handle: bigint | null) => {\n lastInteractivePointerHandle = handle;\n },\n setPointerInsideCanvas: (flag: boolean) => {\n pointerInsideCanvas = flag;\n },\n handleClipboardRead,\n handleFocusChanged,\n handleRequestSemanticAnnouncement,\n handleSelectionChanged,\n handleTextChanged,\n handleTextReplaced,\n };\n}\n", "import type {\n BridgeLogs,\n FocusEventLog,\n PointerEventLog,\n ScrollEventLog,\n SelectionChangeLog,\n TextChangeLog,\n} from '../../core-types';\n\nexport function createBridgeLogs(): BridgeLogs {\n return {\n pointerEvents: [] as PointerEventLog[],\n focusEvents: [] as FocusEventLog[],\n textChanges: [] as TextChangeLog[],\n selectionChanges: [] as SelectionChangeLog[],\n crossSelectionChanges: [] as { areaHandle: string; text: string }[],\n clipboardWrites: [] as string[],\n clipboardReadRequests: [] as string[],\n scrollEvents: [] as ScrollEventLog[],\n missingFontCoverageRequests: [] as { fontId: number; coverageKind: number; sampleText: string }[],\n incrementalFontPackageRequests: [] as { primaryFontId: number; coverageKind: number; packageId: string; segmentIds: readonly string[]; sampleText: string }[],\n } satisfies BridgeLogs;\n}\n", "import type {\n BridgeRuntime,\n ClipboardWritePayload,\n EffinDomCallbacks,\n PointerEventLog,\n ScrollEventLog,\n} from '../core-types';\nimport { enrichClipboardPayload, writeClipboardPayload } from '../clipboard';\nimport { createEditorSession, type EditorSession } from './interaction/editor-session';\nimport { createBridgeLogs } from './interaction/logs';\nimport { handleToString } from './utils/encoding';\n\nexport function installCallbacks(runtimeRef: { current: BridgeRuntime | null }): EditorSession {\n const logs = createBridgeLogs();\n const editorSession = createEditorSession(runtimeRef, logs);\n\n const callbacks: EffinDomCallbacks = {\n onPointerEvent: (handle, eventType) => {\n const { x, y } = editorSession.getLastPointerPosition();\n const modifiers = editorSession.getLastPointerModifiers();\n const entry: PointerEventLog = { handle: handleToString(handle), eventType };\n logs.pointerEvents.push(entry);\n window.__effindomCallbacks?.onPointerEventWithCoords?.(\n eventType,\n handle,\n x,\n y,\n modifiers,\n );\n },\n onFocusChanged: editorSession.handleFocusChanged,\n onTextChanged: editorSession.handleTextChanged,\n onRequestSemanticAnnouncement: editorSession.handleRequestSemanticAnnouncement,\n onTextReplaced: editorSession.handleTextReplaced,\n onSelectionChanged: editorSession.handleSelectionChanged,\n onScroll: (handle, offsetX, offsetY, contentWidth, contentHeight, viewportWidth, viewportHeight) => {\n const entry: ScrollEventLog = {\n handle: handleToString(handle),\n offsetX,\n offsetY,\n contentWidth,\n contentHeight,\n viewportWidth,\n viewportHeight,\n };\n logs.scrollEvents.push(entry);\n },\n onCrossSelectionChanged: (areaHandle, text) => {\n logs.crossSelectionChanges.push({ areaHandle: handleToString(areaHandle), text });\n },\n onClipboardWrite: (payload: ClipboardWritePayload) => {\n logs.clipboardWrites.push(payload.plainText);\n const runtime = runtimeRef.current;\n const enrichedPayload =\n runtime === null\n ? payload\n : enrichClipboardPayload(payload, (fontId) => runtime.getClipboardFontUrl(fontId));\n void writeClipboardPayload(enrichedPayload).catch(() => undefined);\n },\n onClipboardRead: editorSession.handleClipboardRead,\n onRequestFontLoad: (fontId, url) => {\n const runtime = runtimeRef.current;\n if (runtime === null || url.length === 0) {\n return;\n }\n void runtime.loadFont(fontId, url).catch((error: unknown) => {\n window.__bridgeError = error instanceof Error ? error.message : String(error);\n });\n },\n onMissingFontCoverage: (fontId, coverageKind, sampleText) => {\n const runtime = runtimeRef.current;\n if (runtime === null) {\n return;\n }\n logs.missingFontCoverageRequests.push({\n fontId,\n coverageKind,\n sampleText,\n });\n runtime.handleMissingFontCoverage(fontId, coverageKind, sampleText);\n },\n };\n\n window.__effindomCallbacks = callbacks;\n return editorSession;\n}\n", "import type { BridgeRuntime, BridgeState } from './core-types';\nimport { createBridgeSession, type BridgeSession } from './bridge/init';\nimport { installCallbacks } from './bridge/interaction';\nimport { prepareRuntimeAssets } from './bridge/utils/assets';\nimport {\n handleToBigInt,\n handleToString,\n normalizePointerForWasm,\n pointerToHeapOffset,\n toHeapPointer,\n} from './bridge/utils/encoding';\n\nlet currentRuntime: BridgeRuntime | null = null;\nlet currentSession: BridgeSession | null = null;\nlet bridgeReadyPromise: Promise<BridgeRuntime> | null = null;\nlet sessionChain: Promise<void> = Promise.resolve();\n\nconst runtimeRef: { current: BridgeRuntime | null } = { current: null };\nconst interactionState = installCallbacks(runtimeRef);\nconst preparedAssetsPromise = prepareRuntimeAssets();\n\nasync function bootRuntimeSession(): Promise<BridgeRuntime> {\n currentRuntime?.resetLogs();\n currentSession?.destroy();\n currentSession = null;\n\n const preparedAssets = await preparedAssetsPromise;\n const session = await createBridgeSession({\n interactionState,\n preparedAssets,\n runtimeRef,\n });\n currentSession = session;\n currentRuntime = session.runtime;\n window.__bridgeReady = true;\n window.__bridgeDebug = {\n forceDeviceLost() {\n session.runtime.core._ed_debug_simulate_device_lost?.();\n session.runtime.requestFrame();\n },\n };\n delete window.__bridgeError;\n return session.runtime;\n}\n\nfunction queueRuntimeBoot(): Promise<BridgeRuntime> {\n sessionChain = sessionChain\n .catch(() => undefined)\n .then(async () => {\n await bootRuntimeSession();\n });\n return sessionChain.then(() => {\n if (currentRuntime === null) {\n throw new Error('Bridge runtime failed to boot.');\n }\n return currentRuntime;\n });\n}\n\nbridgeReadyPromise = queueRuntimeBoot().catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n window.__bridgeReady = false;\n window.__bridgeError = message;\n throw error;\n});\n\nconst bridgeState: BridgeState = {\n get ready(): Promise<BridgeRuntime> {\n return bridgeReadyPromise ?? Promise.reject(new Error('Bridge runtime is not booting.'));\n },\n getRuntime: () => currentRuntime,\n recreateRuntime: async () => {\n bridgeReadyPromise = queueRuntimeBoot();\n return await bridgeReadyPromise;\n },\n resetLogs: () => {\n if (currentRuntime !== null) {\n currentRuntime.resetLogs();\n }\n },\n handleToBigInt,\n handleToString,\n pointerToHeapOffset,\n normalizePointerForWasm,\n toHeapPointer,\n};\n\nwindow.__bridgeReady = false;\nwindow.EffinDomBrowserBridge = bridgeState;\n\nvoid bridgeReadyPromise.catch(() => undefined);\n\nexport {};\n"],
5
- "mappings": "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",
6
- "names": ["EdBackendType", "EdDeviceState", "extractHandlePrimitive", "handle", "symbolPrimitive", "primitive", "stringified", "handleToBigInt", "handleToString", "pointerToHeapOffset", "pointer", "value", "normalizePointerForWasm", "module", "toHeapPointer", "ptr", "normalizeBackendType", "EdBackendType", "normalizeDeviceState", "EdDeviceState", "computeModifiers", "event", "modifiers", "WEBGPU_INIT_TIMEOUT_MS", "DEFAULT_BACKEND_LADDER", "EdBackendType", "backendTypeToRenderer", "backendType", "setActiveRenderer", "loaderInfo", "waitForAnimationFrame", "resolve", "waitForWebGpuInit", "core", "deadline", "normalizeBackendType", "deviceState", "normalizeDeviceState", "EdDeviceState", "probeWebGpuAdapter", "nav", "adapter", "backendLabel", "backend", "tryReviveBackend", "canvas", "dpr", "w", "h", "initRenderer", "backendLadder", "physicalWidth", "physicalHeight", "ladder", "firstBackend", "webGpuAttempted", "webGl2Attempted", "resolvedBackend", "triedBackends", "reason", "scriptSourceCache", "delay", "ms", "resolve", "resolveAssetUrl", "url", "normalizeFetchIntegrity", "integrity", "value", "digest", "bytesToBase64", "bytes", "binary", "index", "chunk", "verifyFetchedIntegrity", "assetUrl", "buffer", "normalizedIntegrity", "digestBuffer", "buildFetchInit", "cache", "fetchIntegrity", "init", "fetchWithRetry", "attempts", "read", "lastError", "attempt", "response", "error", "fetchBinaryAsset", "loadScriptResource", "scriptUrl", "integrity", "absoluteUrl", "resolveAssetUrl", "sourceText", "fetchScriptSource", "blobSource", "blobUrl", "resolve", "reject", "script", "cacheKey", "sourcePromise", "scriptSourceCache", "fetchBinaryAsset", "scriptBytes", "textEncoder", "writeUtf8ToHeap", "module", "text", "bytes", "ptr", "normalizePointerForWasm", "offset", "pointerToHeapOffset", "writeBytesToHeap", "extractCommandBuffer", "ui", "lengthPtr", "lengthOffset", "bufferPtr", "wordCount", "bufferOffset", "wordOffset", "extractSemanticBuffer", "executeCommandBuffer", "core", "words", "MEMORY64_VALIDATION_MODULE_BYTES", "SIMD_VALIDATION_MODULE_BYTES", "showIcuError", "message", "errorBox", "messageNode", "overlay", "overlayTitle", "overlayDetail", "createErrorWithCause", "cause", "wrappedError", "delay", "ms", "resolve", "resetBridgeLogs", "logs", "supportsMemory64", "MEMORY64_VALIDATION_MODULE_BYTES", "supportsSimd", "SIMD_VALIDATION_MODULE_BYTES", "normalizeWasmArchitecture", "requestedArchitecture", "value", "getManifestArchitectureEntry", "manifest", "architecture", "selectManifestArchitecture", "normalizedRequest", "memory64Supported", "simdSupported", "availableArchitectures", "selectedArchitecture", "selectionReason", "architectureUsesMemory64", "architectureUsesSimd", "preferredArchitectures", "candidate", "manifestEntry", "readManifestUrl", "runtimeConfig", "resolveManifestAssetUrl", "manifestUrl", "assetUrl", "loadRuntimeManifest", "resolveAssetUrl", "fetchWithRetry", "response", "instantiatePreparedWasm", "preparedAsset", "imports", "module", "loadIcuData", "ui", "preparedAssets", "bytes", "heapBytes", "writeBytesToHeap", "describeAbortReason", "fallback", "prepareWasmAsset", "url", "integrity", "requestInit", "bytesPromise", "buffer", "verifyFetchedIntegrity", "coreScriptRunnerCache", "getCoreScriptRunner", "scriptUrl", "absoluteUrl", "cacheKey", "runnerPromise", "fetchScriptSource", "sourceText", "wrappedSource", "loadCoreModule", "bundle", "preparedWasm", "canvas", "loaderInfo", "resolve", "reject", "path", "receiveInstance", "result", "error", "createErrorWithCause", "what", "emMemory", "EdBackendType", "EdDeviceState", "runCoreScript", "loadUiModule", "loadScriptResource", "rejectInstantiation", "instantiationFailure", "_", "modulePromise", "uiEmMemory", "readRequestedArchitecture", "readRequestedRendererBackend", "buildBackendLadder", "requestedBackend", "DEFAULT_BACKEND_LADDER", "prepareRuntimeAssets", "loadedManifest", "selection", "requestedRendererBackend", "coreBundle", "uiBundle", "icuAsset", "fetchBinaryAsset", "combiningMarkPattern", "wordLikeCharPattern", "textEncoder", "DEFAULT_OPEN_CANVAS_FIND_OPTIONS", "normalizeOpenCanvasFindOptions", "options", "utf8ByteOffsetFromCodeUnitIndex", "text", "codeUnitIndex", "clampedIndex", "codePointBefore", "boundary", "start", "low", "high", "codePointAt", "codePoint", "isWordLikeChar", "value", "isWholeWordMatch", "end", "buildSearchText", "source", "tokens", "output", "sourceIndex", "segment", "searchable", "index", "findTextInOpenCanvasDocuments", "documents", "query", "resolvedOptions", "normalizedQuery", "matches", "document", "searchableDocument", "searchStart", "matchStart", "matchEnd", "startToken", "endToken", "sourceStart", "sourceEnd", "isMobileBrowser", "detectPlatformFamily", "platform", "isPlatformShortcutKey", "event", "platformFamily", "isFindShortcut", "event", "isPlatformShortcutKey", "isNextShortcut", "createSvgIcon", "kind", "ns", "svg", "appendPath", "d", "path", "createIconButton", "label", "icon", "variant", "button", "sameMatch", "left", "right", "DesktopFindDialogController", "runtime", "_canvas", "DEFAULT_OPEN_CANVAS_FIND_OPTIONS", "parent", "root", "topRow", "searchShell", "input", "status", "divider", "previousButton", "nextButton", "disclosureButton", "closeButton", "navigationGroup", "advancedPanel", "createToggleRow", "key", "labelSpan", "track", "thumb", "highlightAllRow", "matchCaseRow", "matchDiacriticsRow", "wholeWordsRow", "optionButtons", "optionTracks", "optionThumbs", "preserveInputFocus", "setButtonHovered", "hovered", "bindNonBlurringButton", "callback", "type", "isMobileBrowser", "target", "selectAll", "selectionStart", "selectionEnd", "palette", "pressed", "hasMatches", "syncButtonState", "enabled", "preserveCurrentMatch", "query", "previousMatch", "results", "match", "preservedIndex", "entry", "delta", "revealActive", "state", "PULL_TO_REFRESH_ID", "ensurePullToRefreshElements", "existing", "PULL_TO_REFRESH_ID", "icon", "root", "createPullToRefreshOverlay", "visible", "hideTimer", "pullDistance", "distance", "normalized", "travel", "immediate", "ensureCanvasLogicalSize", "canvas", "rect", "getCanvasSizeSource", "source", "readCanvasLogicalSize", "sizeSource", "styleWidth", "styleHeight", "getPointerPosition", "event", "logicalSize", "contentLeft", "contentTop", "displayWidth", "displayHeight", "x", "y", "isPointerInsideCanvas", "normalizeWheelDelta", "deltaX", "deltaY", "UI_KEY_EVENT_DOWN", "UI_KEY_EVENT_UP", "currentInteractionTimeMs", "isVerticalCanvasNavigationKey", "key", "isTextNavigationKey", "installKeyAndWindowHandlers", "runtime", "interactionState", "desktopFindDialog", "ui", "forwardKeyEvent", "type", "event", "modifiers", "computeModifiers", "activeTextHandle", "activeTextEditable", "activeTextMultiline", "activeTextInputFocused", "activeEditableTextOwnsNativeEditingKey", "activeEditableTextNeedsRuntimeEditingFallback", "activeTextOwnsRuntimeNavigationKey", "activeReadonlyTextOwnsRuntimeKey", "heapString", "writeUtf8ToHeap", "callbackHandled", "handleKeyDown", "handleKeyUp", "keyListenerCapture", "reconcileFindSelection", "handleWindowBlur", "handleWindowFocus", "handleResize", "commitIfVisualWork", "runtime", "PointerMoveCoalescer", "flushMove", "move", "pending", "pointInSemanticBounds", "bounds", "x", "y", "findSemanticTextboxHandleAtPoint", "runtime", "tree", "node", "handleToBigInt", "transitionTouchGesture", "state", "event", "primaryAxis", "UI_EVENT_POINTER_DOWN", "UI_EVENT_POINTER_UP", "UI_EVENT_POINTER_MOVE", "UI_EVENT_POINTER_LEAVE", "EDGE_AUTOSCROLL_THRESHOLD", "TOUCH_SCROLL_THRESHOLD", "TOUCH_AXIS_LOCK_DOMINANCE_RATIO", "TOUCH_AXIS_BREAKOUT_DISTANCE", "TOUCH_AXIS_BREAKOUT_RATIO", "TOUCH_AXIS_BREAKOUT_STEP_THRESHOLD", "resolvePrimaryTouchAxis", "deltaX", "deltaY", "absX", "absY", "shouldUnlockTouchAxis", "axisMode", "travelX", "travelY", "primaryTravel", "secondaryTravel", "currentInteractionTimeMs", "semanticRoleAtHandle", "runtime", "handle", "handleKey", "entry", "installPointerHandlers", "interactionState", "pullToRefresh", "canvas", "ui", "primaryPointerDown", "activePrimaryPointerId", "suppressedContextMenuPointerId", "edgeAutoScrollTickScheduled", "activePrimaryPointerType", "activeTouchGesture", "touchGestureBreakoutTravel", "applySelectionAutoScroll", "x", "y", "handleToBigInt", "processPointerMove", "pending", "commitIfVisualWork", "appCapturedHandle", "scheduleEdgeAutoScrollTick", "pointerMoveCoalescer", "PointerMoveCoalescer", "releaseCanvasPointerCapture", "pointerId", "captureCanvasPointer", "cancelPressedPointerInteraction", "capturedHandle", "handleTouchPointerScroll", "event", "position", "modifiers", "deltaFromStartX", "deltaFromStartY", "distanceSquared", "primaryAxis", "transitionTouchGesture", "prevState", "absDeltaX", "absDeltaY", "scrollDeltaX", "scrollDeltaY", "appliedScrollDeltaY", "isPointerInsideCanvas", "pullToRefreshDistance", "forwardPointerEvent", "type", "useHitTest", "computeModifiers", "pointerInsideCanvas", "getPointerPosition", "activeTextHandle", "refocusActiveTextInputAfterContextMenu", "isTouchEvent", "isPointerCancel", "touchTapCandidateHandle", "touchTapDiscarded", "pendingTapTextHandle", "wasCancelled", "scrolling", "triggerRefresh", "rawHitHandle", "semanticTextboxHandle", "findSemanticTextboxHandleAtPoint", "hitHandle", "refocusActiveTextInputAfterPointerDown", "delayCanvasFocusUntilAfterPointerDown", "keepTouchEditorFocusedOnPointerDown", "refocusActiveTextInputAfterPointerUp", "shouldCommitDeferredTouchFocus", "touchDownTextboxHandle", "touchDownOnAlreadyFocusedText", "handleContextMenu", "handlePointerDown", "handlePointerUp", "handlePointerMove", "handleCapturedPointerExit", "handlePointerLeave", "handlePointerOut", "handlePointerCancel", "shouldHandleWindowPointerEvent", "handleWindowPointerMove", "handleWindowPointerUp", "handleWindowPointerCancel", "handleWheel", "delta", "normalizeWheelDelta", "detectCoarsePointerMode", "installEventHandlers", "runtime", "interactionState", "canvas", "ui", "desktopFindDialog", "DesktopFindDialogController", "pullToRefresh", "createPullToRefreshOverlay", "coarsePointerQuery", "updateCoarsePointerMode", "updatePlatformFamily", "detectPlatformFamily", "removePointerHandlers", "installPointerHandlers", "removeKeyAndWindowHandlers", "installKeyAndWindowHandlers", "BUILT_IN_BRIDGE_FONTS", "STARTUP_BRIDGE_FONTS", "font", "getBuiltInBridgeFont", "fontId", "getBridgeAssetBaseUrl", "manifestUrl", "currentScript", "getBridgeAssetUrl", "assetFile", "svgTextDecoder", "createDecodeCanvas", "width", "height", "canvas", "decodeBlobToBitmap", "blob", "extractBitmapRgba", "bitmap", "context", "imageData", "parseSvgLength", "value", "trimmed", "numericPrefix", "parsed", "parseSvgViewBox", "parts", "entry", "parseSvgIntrinsicSize", "bytes", "markup", "documentRoot", "viewBox", "AssetManager", "core", "fontManager", "onCommitFrame", "svgId", "url", "response", "size", "svgBytes", "writeBytesToHeap", "textureId", "rgba", "textureBytes", "GOOGLE_FONTS_STYLESHEET_ORIGIN", "GOOGLE_FONTS_BINARY_ORIGIN", "ensureLinkTag", "rel", "href", "crossOrigin", "link", "ensureGoogleFontShardPreconnect", "buildGoogleFontStylesheetUrl", "googleFamily", "text", "params", "parseGoogleFontBinaryUrl", "stylesheetText", "match", "fetchGoogleFontShardBytes", "stylesheetUrl", "stylesheetResponse", "binaryUrl", "binaryResponse", "UI_MISSING_FONT_COVERAGE_ARABIC", "UI_MISSING_FONT_COVERAGE_THAI", "UI_MISSING_FONT_COVERAGE_CJK", "UI_MISSING_FONT_COVERAGE_SUPPLEMENTAL", "AUTO_EXTENDABLE_PRIMARY_FONT_IDS", "SUPPLEMENTAL_FAMILIES", "inRanges", "codePoint", "ranges", "start", "end", "uniqueCodePoints", "text", "seen", "ordered", "character", "isCjkPunctuation", "buildShardRequest", "packageId", "coverageKind", "familyKey", "googleFamily", "characters", "resolveCjkRequests", "sampleText", "codePoints", "kana", "hangul", "han", "punctuation", "requests", "resolveSupplementalRequests", "textByFamily", "family", "entry", "current", "request", "resolveIncrementalFontPackageRequests", "primaryFontId", "uniqueText", "DEFAULT_INCREMENTAL_FONT_POLICY", "IncrementalFontManager", "core", "ui", "logs", "onCommitFrame", "policy", "fontId", "bytes", "coreBytes", "writeBytesToHeap", "uiBytes", "shardKey", "shard", "packageId", "primaryFontId", "shardFontId", "fontState", "trackedShardKeys", "fallbacks", "fallbackId", "leastRecentlyUsed", "state", "url", "current", "previousUrl", "replay", "response", "verb", "error", "fallbackIds", "pending", "request", "visited", "lazyUrl", "builtInFont", "getBuiltInBridgeFont", "getBridgeAssetUrl", "fallbackFontId", "existingFallbacks", "cachedShard", "existing", "fetchGoogleFontShardBytes", "familyKey", "pendingKey", "pendingRequest", "text", "primaryShardKeys", "requestedCharacters", "character", "nextPolicy", "loadedUrl", "trackedUrl", "coverageKind", "sampleText", "resolvedRequests", "resolveIncrementalFontPackageRequests", "blockReason", "hasNovelCharacter", "font", "stack", "fallbackFonts", "fallback", "fontReloads", "textEncoder", "utf8ByteLength", "text", "closestElement", "node", "utf8ByteOffsetFromCodeUnitIndex", "codeUnitIndex", "clampedIndex", "codeUnitIndexFromUtf8ByteOffset", "byteOffset", "target", "currentByteOffset", "currentIndex", "codePoint", "nextIndex", "nextByteOffset", "readBoundaryCodeUnitOffset", "fragment", "container", "offset", "range", "ensureProjectedElement", "layer", "byHandle", "canvasId", "entry", "existing", "created", "FindOnPageProjector", "canvas", "parent", "content", "logicalWidth", "logicalHeight", "width", "height", "documents", "seenHandles", "orderedElements", "element", "handle", "selection", "startElement", "endElement", "startRoot", "endRoot", "startFragment", "endFragment", "fragmentStart", "fragmentEnd", "localStart", "localEnd", "start", "end", "match", "startIndex", "endIndex", "textNode", "OPEN_CANVAS_FIND_BACKGROUND_COLOR", "FindController", "options", "runtimeCanvasId", "FindOnPageProjector", "handleDocumentSelectionChange", "logicalWidth", "logicalHeight", "document", "match", "reveal", "state", "revealActive", "clearOnMissing", "normalizedOptions", "normalizeOpenCanvasFindOptions", "normalizedMatches", "range", "index", "entry", "activeEntry", "DEFAULT_OPEN_CANVAS_FIND_OPTIONS", "textDecoder", "floatWordView", "textRunFitCache", "SEMANTIC_ROLE_DESCRIPTORS", "decodeCheckedState", "checkedState", "decodeOrientation", "orientation", "wordToFloat", "word", "describeRole", "role", "resolveTagName", "node", "descriptor", "decodeLabel", "words", "startWordIndex", "labelLength", "byteOffset", "paddedByteLength", "labelBytes", "parseSemanticBuffer", "recordCount", "index", "nodes", "recordIndex", "handleLow", "handleHigh", "stateFlags", "valueNow", "valueMin", "valueMax", "labelWordCount", "handle", "bounds", "state", "checked", "decodedOrientation", "label", "applyNodeFrame", "element", "ensureTextRun", "existing", "textRun", "ensureTextRunContent", "textContent", "ensureTextNode", "onlyChild", "textNode", "clearTextRun", "applyTextRunLayout", "nodeBounds", "textLayout", "offsetX", "offsetY", "firstChild", "fitKey", "cachedFit", "measuredChild", "scaleX", "scaleY", "translateX", "translateY", "range", "measured", "contentRect", "nextScaleX", "nextScaleY", "localX", "localY", "syncOrderedChildren", "container", "orderedElements", "nextChild", "stale", "boundsContain", "candidate", "ensureProjectedElement", "layer", "byHandle", "tagName", "created", "input", "textarea", "cloneNode", "roleNeedsAriaLabel", "roleUsesTextContent", "describeAnnouncementRole", "buildNodeAnnouncement", "textByHandle", "parts", "LiveAnnouncer", "root", "message", "HiddenDomProjector", "canvas", "parent", "shell", "shadowRoot", "content", "announcer", "logicalWidth", "logicalHeight", "width", "height", "textLayoutsByHandle", "seenHandles", "nextValue", "dialogElement", "heading", "descriptionNodes", "cloneSemanticTree", "OpenCanvasApiAdapter", "options", "cloneSemanticTree", "handle", "bounds", "snapshot", "start", "end", "rect", "query", "results", "findTextInOpenCanvasDocuments", "match", "state", "revealActive", "range", "SEMANTIC_ANNOUNCEMENT_DELAY_MS", "SemanticController", "canvas", "ui", "interactionState", "textDocuments", "HiddenDomProjector", "logicalWidth", "logicalHeight", "parseSemanticBuffer", "extractSemanticBuffer", "node", "focusedHandle", "handle", "cloneSemanticTree", "entry", "targetHandle", "layouts", "visibleTextBounds", "left", "top", "right", "bottom", "INVALID_TEXT_DOCUMENT_LENGTH", "openCanvasTextDecoder", "TextDocumentController", "ui", "handle", "handleArg", "byteLength", "start", "end", "meta", "range", "textAllocation", "toHeapPointer", "textPtr", "textOffset", "copied", "text", "allocation", "xPtr", "yPtr", "widthPtr", "heightPtr", "base", "rectCount", "rectWordsAllocation", "rectWordsPtr", "rectWordsOffset", "copiedCount", "words", "rects", "index", "documents", "snapshot", "handleCount", "handleWordsAllocation", "handleWordsPtr", "handleWordsOffset", "handles", "low", "high", "handleToBigInt", "pointer", "offset", "DEFAULT_LOGICAL_WIDTH", "DEFAULT_LOGICAL_HEIGHT", "UI_EVENT_POINTER_ENTER", "UI_EVENT_POINTER_LEAVE", "createBridgeRuntime", "core", "ui", "canvas", "interactionState", "loaderInfo", "logicalWidth", "logicalHeight", "needsCommit", "appFrameHandler", "frameRequester", "runtime", "fontManager", "IncrementalFontManager", "assetManager", "AssetManager", "textDocuments", "TextDocumentController", "semanticController", "SemanticController", "findController", "FindController", "openCanvasApiAdapter", "OpenCanvasApiAdapter", "syncSemanticAndFindState", "dispatchAppPointerEvent", "eventType", "handle", "x", "y", "modifiers", "isLastPointerStillOverCanvas", "rect", "syncAppPointerHover", "previousHandle", "capturedHandle", "hitHandle", "handleToBigInt", "currentHandle", "updateCanvasSize", "dpr", "size", "readCanvasLogicalSize", "physicalWidth", "physicalHeight", "setActiveRenderer", "normalizeBackendType", "extractCommandBuffer", "words", "executeCommandBuffer", "requester", "handler", "timestampMs", "match", "reveal", "clearOnMissing", "fontId", "url", "policy", "fallbackFontId", "coverageKind", "sampleText", "font", "stack", "svgId", "textureId", "resetBridgeLogs", "refreshCanvas", "canvasSizeSource", "getCanvasSizeSource", "resizeObserver", "DEVICE_LOST_RETRY_DELAYS_MS", "ensureSoftwarePresenter", "presenter", "canvas", "overlay", "parent", "ctx", "presentSoftwareFrame", "core", "ptr", "normalizePointerForWasm", "offset", "pointerToHeapOffset", "byteLength", "src", "installRenderLoop", "runtime", "loaderInfo", "fallbackLadder", "DEFAULT_BACKEND_LADDER", "activeBackend", "normalizeBackendType", "softwarePresenter", "frameScheduled", "disposed", "lastAttemptedBackend", "recoveryAttempts", "recoveryExhausted", "recoveryPromise", "runRecovery", "dpr", "delayMs", "delay", "tryReviveBackend", "setActiveRenderer", "backendLabel", "nextIndex", "i", "fallback", "EdBackendType", "scheduleRecovery", "lostBackend", "error", "message", "scheduleFrame", "frame", "handleWebGlContextLost", "event", "handleVisibilityChange", "now", "deviceState", "normalizeDeviceState", "backendType", "EdDeviceState", "requireCanvas", "id", "element", "createBridgeSession", "options", "canvas", "ensureCanvasLogicalSize", "interactionState", "preparedAssets", "runtimeRef", "core", "ui", "loadCoreModule", "loadUiModule", "runtimeState", "createBridgeRuntime", "runtime", "dpr", "fallbackLadder", "buildBackendLadder", "initRenderer", "loadIcuData", "error", "message", "showIcuError", "createErrorWithCause", "disposeEventHandlers", "installEventHandlers", "disposeRenderLoop", "installRenderLoop", "STARTUP_BRIDGE_FONTS", "font", "getBridgeAssetUrl", "EFFINDOM_RICH_TEXT_CLIPBOARD_MIME", "escapeHtml", "text", "colorToCss", "color", "red", "green", "blue", "alpha", "inferClipboardCssFontFamily", "fontUrl", "partStyleToCss", "part", "styles", "fontFamily", "decorationFlags", "textDecorations", "buildClipboardHtml", "richText", "html", "escapedText", "style", "enrichClipboardPayload", "payload", "resolveFontUrl", "tryWriteClipboardItems", "items", "writeClipboardPayload", "plainText", "richJson", "utf8ByteLengthForCodePoint", "codePoint", "advanceCodeUnitIndex", "text", "index", "retreatCodeUnitIndex", "clampedIndex", "previousIndex", "previousUnit", "leadUnit", "codeUnitIndexToUtf8ByteOffset", "byteOffset", "current", "utf8ByteLength", "HIDDEN_EDITOR_WINDOW_OVERSCAN", "HIDDEN_EDITOR_WINDOW_MIN_LENGTH", "HIDDEN_EDITOR_WINDOW_REUSE_MARGIN", "TEXT_CHANGE_LOG_PREVIEW_LIMIT", "TEXTBOX_HARD_CLAMP_MAX_CODEPOINTS", "isLineBreakCodeUnit", "text", "index", "codeUnit", "collectTextboxHardLineClampRanges", "ranges", "lineCapEnd", "lineEnd", "codePointCount", "next", "advanceCodeUnitIndex", "mapClampedTextIndex", "clampedIndex", "removedBefore", "range", "clampTextboxHardLines", "result", "cursor", "utf8ByteOffsetToCodeUnitIndex", "byteOffset", "textByteLength", "byteLimit", "utf8ByteLength", "target", "currentByteOffset", "currentIndex", "codePoint", "nextByteOffset", "utf8ByteLengthForCodePoint", "computeReplacementEdit", "previousText", "nextText", "sharedPrefixLimit", "prefix", "suffix", "applyUtf8ByteReplacementEdit", "start", "end", "insertedText", "clampedStart", "clampedEnd", "mapPendingBatchCurrentIndexToBaseIndex", "batch", "replacement", "insertedStart", "insertedEnd", "delta", "buildClampedTextboxEdit", "fullPreviousText", "absoluteStart", "absoluteEnd", "absoluteCaret", "replaceStart", "replaceEnd", "intendedFullNextText", "intendedCaret", "clamped", "finalCaret", "codeUnitIndexToUtf8ByteOffset", "summarizeTextChange", "handle", "buildHiddenEditorWindow", "previousWindow", "normalizedStart", "normalizedEnd", "selectionSpan", "targetLength", "previousLength", "clampedPreviousStart", "clampedPreviousEnd", "reuseMargin", "reusableStart", "reusableEnd", "docStart", "docEnd", "currentLength", "remaining", "extendBefore", "extendAfter", "extraBefore", "createHiddenTextEditor", "multiline", "editor", "clearHiddenTextEditor", "MAX_BUFFERED_TYPING_MUTATIONS", "currentInteractionTimeMs", "createEditorMutationController", "options", "hiddenInputIsComposing", "pendingTextMutationFlushFrame", "pendingTextMutationBatch", "pendingPasteInput", "pendingPasteText", "clearPendingTextMutations", "materializePendingTextMutations", "runtime", "batch", "handle", "handleToBigInt", "absoluteCaret", "codeUnitIndexToUtf8ByteOffset", "replacement", "computeReplacementEdit", "absoluteStart", "absoluteEnd", "heapString", "writeUtf8ToHeap", "restorePendingTypingState", "editor", "activeTextHandle", "activeEditorWindow", "flushPendingTextMutationsToRuntime", "schedulePendingTextMutationFlush", "commitReplacementEdit", "previousText", "nextText", "caret", "kind", "replacePendingBatch", "clampedStart", "clampedEnd", "activeHandleKey", "intendedAbsoluteCaret", "fullPreviousText", "pendingReplacement", "pendingAbsoluteStart", "pendingAbsoluteEnd", "utf8ByteLength", "applyUtf8ByteReplacementEdit", "clampedEdit", "buildClampedTextboxEdit", "replacementStartByte", "replacementEndByte", "activeEditor", "commitImeEdit", "text", "commitIfVisualWork", "forward", "selectionStart", "selectionEnd", "rangeStart", "rangeEnd", "nextCaret", "replacementStart", "replacementEnd", "advanceCodeUnitIndex", "retreatCodeUnitIndex", "event", "handleKey", "pasteInput", "pendingBatch", "baseWindowText", "mapPendingBatchCurrentIndexToBaseIndex", "CARET_BLINK_INTERVAL_MS", "currentInteractionTimeMs", "createEditorSession", "runtimeRef", "logs", "textByHandle", "selectionsByHandle", "hiddenInput", "createHiddenTextEditor", "hiddenTextarea", "activeTextHandle", "lastPointerClientX", "lastPointerClientY", "lastPointerX", "lastPointerY", "lastPointerModifiers", "lastInteractivePointerHandle", "capturedPointerHandle", "pointerInsideCanvas", "appSessionVersion", "activeTextEditable", "activeTextMultiline", "activeEditorWindow", "textByteLengthsByHandle", "pendingCaretRevealByHandle", "pendingCaretRevealFrame", "pendingLocalReplacementEcho", "pendingLocalSelectionEcho", "deferredTouchFocusHandle", "caretBlinkTimer", "focusedHandle", "pendingSemanticAnnouncements", "getActiveEditor", "isActiveEditorFocused", "queueSemanticAnnouncement", "handleKey", "clampSelectionToText", "length", "selection", "clearCaretBlinkTimer", "shouldRunCaretBlinkTimer", "text", "textByteLength", "utf8ByteLength", "start", "end", "armCaretBlinkTimer", "updateCaretBlinkTimer", "resetPhase", "syncActiveEditorWindowDebug", "handle", "clearActiveEditorWindow", "clearPendingCaretReveal", "key", "updateActiveEditorWindowText", "detachBridgeTextInput", "getTextboxState", "runtime", "node", "entry", "syncFocusedInputState", "clearHiddenTextEditor", "activeEditor", "startByte", "endByte", "utf8ByteOffsetToCodeUnitIndex", "direction", "normalizedStart", "normalizedEnd", "buildHiddenEditorWindow", "localStart", "localEnd", "mutationController", "createEditorMutationController", "value", "clearPendingTextMutations", "focusHiddenEditorNow", "refocusActiveTextInput", "textboxState", "handleToBigInt", "beginTouchTextFocusDeferral", "cancelTouchTextFocusDeferral", "commitTouchTextFocusDeferral", "scheduleCaretRevealReplay", "clearRecordMap", "record", "resetAppSession", "handleFocusChanged", "isFocused", "handleTextChanged", "summarizeTextChange", "handleRequestSemanticAnnouncement", "handleTextReplaced", "previousText", "previousTextByteLength", "isLocalEcho", "nextText", "applyUtf8ByteReplacementEdit", "handleSelectionChanged", "handleClipboardRead", "handleValue", "requestSessionVersion", "currentText", "currentTextByteLength", "rangeStart", "rangeEnd", "clampedEdit", "buildClampedTextboxEdit", "replacementStartByte", "codeUnitIndexToUtf8ByteOffset", "replacementEndByte", "heapString", "writeUtf8ToHeap", "handles", "x", "y", "modifiers", "flag", "createBridgeLogs", "installCallbacks", "runtimeRef", "logs", "createBridgeLogs", "editorSession", "createEditorSession", "callbacks", "handle", "eventType", "x", "y", "modifiers", "entry", "handleToString", "offsetX", "offsetY", "contentWidth", "contentHeight", "viewportWidth", "viewportHeight", "areaHandle", "text", "payload", "runtime", "enrichedPayload", "enrichClipboardPayload", "fontId", "writeClipboardPayload", "url", "error", "coverageKind", "sampleText", "currentRuntime", "currentSession", "bridgeReadyPromise", "sessionChain", "runtimeRef", "interactionState", "installCallbacks", "preparedAssetsPromise", "prepareRuntimeAssets", "bootRuntimeSession", "preparedAssets", "session", "createBridgeSession", "queueRuntimeBoot", "error", "message", "bridgeState", "handleToBigInt", "handleToString", "pointerToHeapOffset", "normalizePointerForWasm", "toHeapPointer"]
4
+ "sourcesContent": ["import type {\n OpenCanvasApi,\n OpenCanvasFindMatch,\n OpenCanvasFindState,\n OpenCanvasTextDocument,\n SemanticNode,\n} from './open-canvas';\n\nexport type {\n OpenCanvasApi,\n OpenCanvasFindMatch,\n OpenCanvasFindOptions,\n OpenCanvasFindResults,\n OpenCanvasFindState,\n OpenCanvasHandle,\n OpenCanvasResolvedFindOptions,\n OpenCanvasTextDocument,\n SemanticBounds,\n SemanticNode,\n SemanticState,\n} from './open-canvas';\n\nexport type WasmHandleLike =\n | number\n | bigint\n | string\n | {\n valueOf(): unknown;\n toString(): string;\n };\n\nexport interface AssetLoadResult {\n readonly width: number;\n readonly height: number;\n}\n\nexport interface BridgeFontRegistration {\n readonly id: number;\n readonly url: string;\n readonly fallbackIds?: readonly number[];\n}\n\nexport interface BridgeFontStackRegistration {\n readonly primary: BridgeFontRegistration;\n readonly fallbacks?: readonly BridgeFontRegistration[];\n}\n\nexport interface CoreModule {\n HEAPU8: Uint8Array;\n HEAPU32: Uint32Array;\n wasmMemory?: WebAssembly.Memory;\n usesMemory64?: boolean;\n refreshHeapViews?(): void;\n locateFile?(path: string, prefix?: string): string;\n instantiateWasm?(\n imports: WebAssembly.Imports,\n successCallback: (instance: WebAssembly.Instance, module?: WebAssembly.Module) => void,\n ): object;\n onAbort?(what?: unknown): void;\n canvas?: HTMLCanvasElement;\n onRuntimeInitialized?: () => void;\n _malloc(size: number): WasmHandleLike;\n _free(ptr: WasmHandleLike): void;\n _ed_init(width: number, height: number, dpr: number): void;\n _ed_init_webgl(width: number, height: number, dpr: number): void;\n _ed_init_sw(width: number, height: number, dpr: number): void;\n _ed_resize(width: number, height: number, dpr: number): void;\n _ed_register_font(fontId: number, bytesPtr: WasmHandleLike, len: number): void;\n _ed_unregister_font(fontId: number): void;\n _ed_register_svg(svgId: number, bytesPtr: WasmHandleLike, len: number): void;\n _ed_execute_command_buffer(ptr: WasmHandleLike, length: number): void;\n _ed_register_texture_rgba(\n textureId: number,\n rgbaPtr: WasmHandleLike,\n width: number,\n height: number,\n byteLength: number,\n ): void;\n _ed_unregister_texture(textureId: number): void;\n _ed_reset_scene(): void;\n _ed_render_frame(currentTimeMs: number): void;\n _ed_clear_focus_state?(): void;\n _ed_clear_text_input_state?(): void;\n _ed_recover_device(): void;\n _ed_hit_test(x: number, y: number): WasmHandleLike;\n _ed_get_sw_framebuffer(): WasmHandleLike;\n _ed_get_backend_type(): number;\n _ed_get_device_state(): number;\n _ed_notify_webgl_context_lost?(): void;\n _ed_debug_simulate_device_lost?(): void;\n}\n\nexport const EdBackendType = {\n NONE: 0,\n WEBGPU: 1,\n WEBGL2: 2,\n CPU: 3,\n} as const;\n\nexport type EdBackendType = (typeof EdBackendType)[keyof typeof EdBackendType];\n\nexport const EdDeviceState = {\n OK: 0,\n LOST: 1,\n RECOVERING: 2,\n} as const;\n\nexport type EdDeviceState = (typeof EdDeviceState)[keyof typeof EdDeviceState];\n\nexport interface UiModule {\n HEAPU8: Uint8Array;\n HEAPU32: Uint32Array;\n HEAPF32: Float32Array;\n wasmMemory?: WebAssembly.Memory;\n usesMemory64?: boolean;\n refreshHeapViews?(): void;\n _malloc(size: number): WasmHandleLike;\n _free(ptr: WasmHandleLike): void;\n _ui_reset(): void;\n _ui_arena_alloc(size: number): WasmHandleLike;\n _ui_register_icu_data(ptr: WasmHandleLike, len: number): void;\n _ui_create_node(type: number): WasmHandleLike;\n _ui_delete_node(handle: WasmHandleLike): void;\n _ui_node_add_child(parent: WasmHandleLike, child: WasmHandleLike): void;\n _ui_set_root(handle: WasmHandleLike): void;\n _ui_set_node_id(handle: WasmHandleLike, strPtr: WasmHandleLike, len: number): void;\n _ui_set_semantic_role(handle: WasmHandleLike, role: number): void;\n _ui_set_semantic_label(handle: WasmHandleLike, strPtr: WasmHandleLike, len: number): void;\n _ui_set_semantic_checked(handle: WasmHandleLike, checkedState: number): void;\n _ui_set_semantic_selected(handle: WasmHandleLike, hasSelected: number, selected: number): void;\n _ui_set_semantic_expanded(handle: WasmHandleLike, hasExpanded: number, expanded: number): void;\n _ui_set_semantic_disabled(handle: WasmHandleLike, hasDisabled: number, disabled: number): void;\n _ui_set_semantic_value_range(\n handle: WasmHandleLike,\n hasValueRange: number,\n valueNow: number,\n valueMin: number,\n valueMax: number,\n ): void;\n _ui_set_semantic_orientation(handle: WasmHandleLike, orientation: number): void;\n _ui_request_semantic_announcement(handle: WasmHandleLike): void;\n _ui_push_semantic_scope(handle: WasmHandleLike): number;\n _ui_remove_semantic_scope(token: number): void;\n _ui_set_width(handle: WasmHandleLike, value: number, unit: number): void;\n _ui_set_height(handle: WasmHandleLike, value: number, unit: number): void;\n _ui_set_fill_width(handle: WasmHandleLike, fill: number): void;\n _ui_set_fill_height(handle: WasmHandleLike, fill: number): void;\n _ui_set_flex_direction(handle: WasmHandleLike, direction: number): void;\n _ui_set_flex_basis(handle: WasmHandleLike, basis: number): void;\n _ui_set_justify_content(handle: WasmHandleLike, justify: number): void;\n _ui_set_align_items(handle: WasmHandleLike, align: number): void;\n _ui_set_padding(handle: WasmHandleLike, left: number, top: number, right: number, bottom: number): void;\n _ui_set_margin(handle: WasmHandleLike, left: number, top: number, right: number, bottom: number): void;\n _ui_set_position_type(handle: WasmHandleLike, positionType: number): void;\n _ui_set_position(handle: WasmHandleLike, left: number, top: number, right: number, bottom: number): void;\n _ui_node_remove_child(parent: WasmHandleLike, child: WasmHandleLike): void;\n _ui_set_is_portal(handle: WasmHandleLike, portal: number): void;\n _ui_set_is_shared_size_scope(handle: WasmHandleLike, isScope: number): void;\n _ui_grid_set_columns(handle: WasmHandleLike, count: number, valuesPtr: WasmHandleLike, typesPtr: WasmHandleLike): void;\n _ui_grid_set_rows(handle: WasmHandleLike, count: number, valuesPtr: WasmHandleLike, typesPtr: WasmHandleLike): void;\n _ui_grid_set_column_shared_size_group(handle: WasmHandleLike, index: number, strPtr: WasmHandleLike, len: number): void;\n _ui_grid_set_row_shared_size_group(handle: WasmHandleLike, index: number, strPtr: WasmHandleLike, len: number): void;\n _ui_node_set_grid_placement(handle: WasmHandleLike, row: number, col: number, rowSpan: number, colSpan: number): void;\n _ui_set_bg_color(handle: WasmHandleLike, color: number): void;\n _ui_set_box_style(\n handle: WasmHandleLike,\n bgColor: number,\n topLeftRadius: number,\n topRightRadius: number,\n bottomRightRadius: number,\n bottomLeftRadius: number,\n borderWidth: number,\n borderColor: number,\n borderStyle: number,\n borderDashOn: number,\n borderDashOff: number,\n ): void;\n _ui_set_drop_shadow(\n handle: WasmHandleLike,\n color: number,\n offsetX: number,\n offsetY: number,\n blurSigma: number,\n spread: number,\n ): void;\n _ui_set_layer_effect(handle: WasmHandleLike, opacity: number, blurSigma: number, blendMode: number): void;\n _ui_set_background_blur(handle: WasmHandleLike, blurSigma: number): void;\n _ui_set_image(handle: WasmHandleLike, textureId: number, objectFit: number): void;\n _ui_set_image_nine(\n handle: WasmHandleLike,\n textureId: number,\n insetLeft: number,\n insetTop: number,\n insetRight: number,\n insetBottom: number,\n ): void;\n _ui_set_svg(handle: WasmHandleLike, svgId: number, tintColor: number): void;\n _ui_set_linear_gradient(\n handle: WasmHandleLike,\n startX: number,\n startY: number,\n endX: number,\n endY: number,\n stopCount: number,\n offsetsPtr: WasmHandleLike,\n colorsPtr: WasmHandleLike,\n ): void;\n _ui_set_clip_to_bounds(handle: WasmHandleLike, clip: number): void;\n _ui_set_visibility(handle: WasmHandleLike, visibility: number): void;\n _ui_set_font(handle: WasmHandleLike, fontId: number, size: number): void;\n _ui_set_line_height(handle: WasmHandleLike, lineHeight: number): void;\n _ui_set_text(handle: WasmHandleLike, strPtr: WasmHandleLike, len: number): void;\n _ui_set_text_style_runs(handle: WasmHandleLike, runCount: number, runsWordsPtr: WasmHandleLike): void;\n _ui_set_text_color(handle: WasmHandleLike, color: number): void;\n _ui_set_text_align(handle: WasmHandleLike, align: number): void;\n _ui_set_text_vertical_align(handle: WasmHandleLike, align: number): void;\n _ui_set_text_limits(handle: WasmHandleLike, maxChars: number, maxLines: number): void;\n _ui_set_text_wrapping(handle: WasmHandleLike, wrap: number): void;\n _ui_set_text_overflow(handle: WasmHandleLike, overflow: number): void;\n _ui_set_text_overflow_fade(handle: WasmHandleLike, horizontal: number, vertical: number): void;\n _ui_set_text_obscured(handle: WasmHandleLike, obscured: number): void;\n _ui_set_scroll_offset(handle: WasmHandleLike, x: number, y: number): void;\n _ui_has_pending_visual_work(): number;\n _ui_needs_animation_frame(): number;\n _ui_has_pointer_autoscroll(): number;\n _ui_selection_autoscroll(x: number, y: number, edgeThreshold: number): WasmHandleLike;\n _ui_get_bounds(\n handle: WasmHandleLike,\n outX: WasmHandleLike,\n outY: WasmHandleLike,\n outWidth: WasmHandleLike,\n outHeight: WasmHandleLike,\n ): number;\n _ui_set_selectable(handle: WasmHandleLike, selectable: number, color: number): void;\n _ui_set_selection_area(handle: WasmHandleLike, isArea: number): void;\n _ui_set_selection_area_barrier(handle: WasmHandleLike, isBarrier: number): void;\n _ui_clear_selection(handle: WasmHandleLike): void;\n _ui_retarget_selection(fromHandle: WasmHandleLike, toHandle: WasmHandleLike): void;\n _ui_is_point_in_selection(x: number, y: number): number;\n _ui_set_text_selection_range(handle: WasmHandleLike, selectionStart: number, selectionEnd: number): void;\n _ui_get_text_scene_position_x(handle: WasmHandleLike, byteIndex: number): number;\n _ui_get_text_scene_position_y(handle: WasmHandleLike, byteIndex: number): number;\n _ui_get_text_snapshot_handle_count(): number;\n _ui_copy_text_snapshot_handles(outPtr: WasmHandleLike, maxHandleCount: number): number;\n _ui_set_text_find_match(handle: WasmHandleLike, start: number, end: number): number;\n _ui_clear_text_find_match(): void;\n _ui_push_text_find_highlight(handle: WasmHandleLike, start: number, end: number, color: number): number;\n _ui_clear_text_find_highlights(): void;\n _ui_get_text_document_utf8_length(handle: WasmHandleLike): number;\n _ui_copy_text_document_utf8(handle: WasmHandleLike, outPtr: WasmHandleLike, bufferLength: number): number;\n _ui_get_text_visible_bounds(\n handle: WasmHandleLike,\n outXPtr: WasmHandleLike,\n outYPtr: WasmHandleLike,\n outWidthPtr: WasmHandleLike,\n outHeightPtr: WasmHandleLike,\n ): number;\n _ui_get_text_range_rect_count(handle: WasmHandleLike, start: number, end: number): number;\n _ui_copy_text_range_rects(\n handle: WasmHandleLike,\n start: number,\n end: number,\n outPtr: WasmHandleLike,\n maxRectCount: number,\n ): number;\n _ui_reveal_text_range(handle: WasmHandleLike, start: number, end: number): number;\n _ui_clear_current_selection(): void;\n _ui_copy_current_selection(): void;\n _ui_can_undo_text_edit(handle: WasmHandleLike): number;\n _ui_can_redo_text_edit(handle: WasmHandleLike): number;\n _ui_has_text_selection(handle: WasmHandleLike): number;\n _ui_undo_text_edit(handle: WasmHandleLike): void;\n _ui_redo_text_edit(handle: WasmHandleLike): void;\n _ui_copy_text_selection(handle: WasmHandleLike): void;\n _ui_cut_text_selection(handle: WasmHandleLike): void;\n _ui_paste_text(handle: WasmHandleLike): void;\n _ui_select_all_text(handle: WasmHandleLike): void;\n _ui_set_interactive(handle: WasmHandleLike, interactive: number): void;\n _ui_set_scroll_proxy_target(handle: WasmHandleLike, scrollHandle: WasmHandleLike): void;\n _ui_set_scroll_enabled(handle: WasmHandleLike, enabledX: number, enabledY: number): void;\n _ui_set_show_scrollbars(handle: WasmHandleLike, showScrollbars: number): void;\n _ui_set_scroll_friction(handle: WasmHandleLike, friction: number): void;\n _ui_set_scroll_content_size(handle: WasmHandleLike, contentWidth: number, contentHeight: number): void;\n _ui_set_editable(handle: WasmHandleLike, editable: number): void;\n _ui_set_caret_color(handle: WasmHandleLike, color: number): void;\n _ui_set_focusable(handle: WasmHandleLike, focusable: number, tabIndex: number): void;\n _ui_request_focus(handle: WasmHandleLike): void;\n _ui_commit_frame(): void;\n _ui_get_command_buffer(outLenPtr: WasmHandleLike): WasmHandleLike;\n _ui_get_semantic_buffer(outLenPtr: WasmHandleLike): WasmHandleLike;\n _ui_resize_window(w: number, h: number): void;\n _ui_set_key_modifiers(modifiers: number): void;\n _ui_on_pointer_event(event: number, handle: WasmHandleLike, x: number, y: number): void;\n _ui_on_wheel_event(deltaX: number, deltaY: number): void;\n _ui_touch_scroll_begin(handle: WasmHandleLike, x: number, y: number): void;\n _ui_touch_scroll_update(deltaX: number, deltaY: number): void;\n _ui_touch_scroll_end(): void;\n _ui_clear_momentum_scroll(): void;\n _ui_touch_scroll_allows_pull_to_refresh(): number;\n _ui_set_coarse_pointer_mode(coarsePointerMode: number): void;\n _ui_set_platform_family(platformFamily: number): void;\n _ui_on_key_event(type: number, strPtr: WasmHandleLike, len: number, mods: number): void;\n _ui_on_ime_update(handle: WasmHandleLike, strPtr: WasmHandleLike, len: number, caretIdx: number): void;\n _ui_replace_text_range(\n handle: WasmHandleLike,\n startIdx: number,\n endIdx: number,\n strPtr: WasmHandleLike,\n len: number,\n caretIdx: number,\n ): void;\n _ui_on_paste_text(handle: WasmHandleLike, strPtr: WasmHandleLike, len: number): void;\n _ui_set_interaction_time(ms: WasmHandleLike): void;\n _ui_measure_text(\n strPtr: WasmHandleLike,\n len: number,\n fontId: number,\n size: number,\n maxWidth: number,\n outWidthPtr: WasmHandleLike,\n outHeightPtr: WasmHandleLike,\n ): void;\n _ui_register_font(id: number, bytesPtr: WasmHandleLike, len: number): number;\n _ui_register_font_fallback(fontId: number, fallbackFontId: number): void;\n _ui_unregister_font_fallback(fontId: number, fallbackFontId: number): number;\n _ui_unregister_font(fontId: number): number;\n _ui_font_loaded(fontId: number): void;\n}\n\nexport interface PointerEventLog {\n readonly handle: string;\n readonly eventType: number;\n}\n\nexport interface FocusEventLog {\n readonly handle: string;\n readonly isFocused: boolean;\n}\n\nexport interface TextChangeLog {\n readonly handle: string;\n readonly text: string;\n readonly textLength?: number;\n readonly truncated?: boolean;\n}\n\nexport interface SelectionChangeLog {\n readonly handle: string;\n readonly start: number;\n readonly end: number;\n}\n\nexport interface CrossSelectionChangeLog {\n readonly areaHandle: string;\n readonly text: string;\n}\n\nexport interface ScrollEventLog {\n readonly handle: string;\n readonly offsetX: number;\n readonly offsetY: number;\n readonly contentWidth: number;\n readonly contentHeight: number;\n readonly viewportWidth: number;\n readonly viewportHeight: number;\n}\n\nexport interface MissingFontCoverageLog {\n readonly fontId: number;\n readonly coverageKind: number;\n readonly sampleText: string;\n}\n\nexport interface IncrementalFontPackageRequestLog {\n readonly primaryFontId: number;\n readonly coverageKind: number;\n readonly packageId: string;\n readonly segmentIds: readonly string[];\n readonly sampleText: string;\n}\n\nexport type IncrementalFontAutoGrowBlockReason =\n | 'auto-grow-disabled'\n | 'font-not-allowed'\n | 'package-blocked';\n\nexport interface IncrementalFontPolicy {\n readonly autoGrow: boolean;\n readonly maxCachedShardFonts: number;\n readonly allowedFontIds: readonly number[] | null;\n readonly blockedPackageIds: readonly string[] | null;\n}\n\nexport interface IncrementalFontCacheState {\n readonly maxCachedShardFonts: number;\n readonly cachedShardCount: number;\n readonly cachedShardKeys: readonly string[];\n readonly evictedShardKeys: readonly string[];\n}\n\nexport interface IncrementalFontRuntimeState {\n readonly fontId: number;\n readonly sourceUrl: string | null;\n readonly sourceState: 'unknown' | 'known' | 'loading' | 'loaded' | 'failed';\n readonly loaded: boolean;\n readonly requestedSegmentIds: readonly string[];\n readonly pendingSegmentIds: readonly string[];\n readonly appliedSegmentIds: readonly string[];\n readonly evictedSegmentIds: readonly string[];\n readonly revision: number;\n readonly autoGrowAllowed: boolean;\n readonly blockedPackageIds: readonly string[];\n readonly lastBlockedReason: IncrementalFontAutoGrowBlockReason | null;\n}\n\nexport interface ClipboardRichTextPart {\n readonly text: string;\n readonly fontId?: number;\n readonly fontSize?: number;\n readonly color?: number;\n readonly bgColor?: number;\n readonly decorationFlags?: number;\n readonly fontUrl?: string;\n}\n\nexport interface ClipboardRichTextPayload {\n readonly version: 1;\n readonly parts: readonly ClipboardRichTextPart[];\n}\n\nexport interface ClipboardWritePayload {\n readonly plainText: string;\n readonly richText?: ClipboardRichTextPayload;\n}\n\nexport interface BridgeLogs {\n readonly pointerEvents: PointerEventLog[];\n readonly focusEvents: FocusEventLog[];\n readonly textChanges: TextChangeLog[];\n readonly selectionChanges: SelectionChangeLog[];\n readonly crossSelectionChanges: CrossSelectionChangeLog[];\n readonly clipboardWrites: string[];\n readonly clipboardReadRequests: string[];\n readonly scrollEvents: ScrollEventLog[];\n readonly missingFontCoverageRequests: MissingFontCoverageLog[];\n readonly incrementalFontPackageRequests: IncrementalFontPackageRequestLog[];\n}\n\nexport interface BridgeRuntime {\n readonly core: CoreModule;\n readonly ui: UiModule;\n readonly canvas: HTMLCanvasElement;\n readonly openCanvasApi: OpenCanvasApi;\n readonly logs: BridgeLogs;\n updateCanvasSize(): void;\n extractCommandBuffer(): Uint32Array;\n executeCommandBuffer(words: Uint32Array): void;\n syncCommandBufferToCore(): Uint32Array;\n flushPendingCommit(): Uint32Array | null;\n hasPendingCommit(): boolean;\n commitFrame(): void;\n requestFrame(): void;\n setFrameRequester(requester: (() => void) | null): void;\n getSemanticTree(): readonly SemanticNode[];\n getActiveTextHandle(): bigint | null;\n getCapturedPointerHandle(): bigint | null;\n setCapturedPointerHandle(handle: bigint | null): void;\n setAppFrameHandler(handler: ((timestampMs: number) => void) | null): void;\n runAppFrameHandler(timestampMs: number): void;\n uiHasPendingVisualWork(): boolean;\n uiNeedsAnimationFrame(): boolean;\n getHandleFromPoint(x: number, y: number): bigint;\n clearPointerHover(): void;\n refreshPointerHover(): void;\n getFindDocuments(): readonly OpenCanvasTextDocument[];\n activateFindMatch(match: OpenCanvasFindMatch | null, reveal?: boolean): boolean;\n syncFindSelection(clearOnMissing?: boolean): boolean;\n clearFindMatch(): boolean;\n ensureFont(fontId: number): Promise<void>;\n ensureBuiltInFont(fontId: number): Promise<void>;\n isFontLoaded(fontId: number, url?: string): boolean;\n getIncrementalFontState(fontId: number): IncrementalFontRuntimeState | null;\n getIncrementalFontCacheState(): IncrementalFontCacheState;\n getIncrementalFontPolicy(): IncrementalFontPolicy;\n setIncrementalFontPolicy(policy: Partial<IncrementalFontPolicy>): void;\n getClipboardFontUrl(fontId: number): string | null;\n registerLazyFont(fontId: number, url: string): void;\n registerFontFallback(fontId: number, fallbackFontId: number): void;\n handleMissingFontCoverage(fontId: number, coverageKind: number, sampleText: string): void;\n loadFont(fontId: number, url: string): Promise<void>;\n registerFont(font: BridgeFontRegistration): Promise<void>;\n registerFontStack(stack: BridgeFontStackRegistration): Promise<void>;\n loadSvg(svgId: number, url: string): Promise<AssetLoadResult>;\n loadTexture(textureId: number, url: string): Promise<AssetLoadResult>;\n releaseSvg(svgId: number): void;\n releaseTexture(textureId: number): void;\n replayLoadedAssets(): Promise<void>;\n resetLogs(): void;\n resetAppSession(): void;\n}\n\nexport interface BridgeState {\n readonly ready: Promise<BridgeRuntime>;\n getRuntime(): BridgeRuntime | null;\n recreateRuntime(): Promise<BridgeRuntime>;\n resetLogs(): void;\n handleToBigInt(handle: WasmHandleLike): bigint;\n handleToString(handle: WasmHandleLike): string;\n pointerToHeapOffset(pointer: WasmHandleLike): number;\n normalizePointerForWasm(\n module: Pick<UiModule | CoreModule, 'usesMemory64'>,\n pointer: WasmHandleLike,\n ): number | bigint;\n toHeapPointer(\n module: Pick<UiModule | CoreModule, 'usesMemory64'>,\n pointer: WasmHandleLike,\n ): { readonly ptr: number | bigint; readonly offset: number };\n}\n\nexport interface BridgeLoaderInfo {\n manifestHash: string | null;\n requestedWasmArchitecture: string;\n requestedRendererBackend: 'auto' | 'webgpu' | 'webgl2' | 'cpu';\n selectedWasmArchitecture: string;\n availableWasmArchitectures: readonly string[];\n memory64Supported: boolean;\n simdSupported: boolean;\n coreCompileMode: 'streaming' | 'buffer' | 'cached-module';\n uiCompileMode: 'streaming' | 'buffer' | 'cached-module';\n icuDataUrl: string | null;\n activeRenderer: 'none' | 'webgpu' | 'webgl2' | 'cpu';\n /** Incremented each time the renderer recovers from a device loss. Useful for tests. */\n deviceRecoveryCount: number;\n}\n\nexport interface EffinDomCallbacks {\n onPointerEvent?: (handle: WasmHandleLike, eventType: number) => void;\n onPointerEventWithCoords?: (eventType: number, handle: WasmHandleLike, x: number, y: number, modifiers?: number) => void;\n onBeforeContextMenuHitTest?: () => void;\n onContextMenu?: (handle: WasmHandleLike, x: number, y: number) => void;\n onKeyEventWithKey?: (eventType: number, key: string, modifiers: number) => boolean | void;\n onFocusChanged?: (handle: WasmHandleLike, isFocused: boolean) => void;\n onTextChanged?: (handle: WasmHandleLike, text: string) => void;\n onTextReplaced?: (handle: WasmHandleLike, start: number, end: number, text: string) => void;\n onSelectionChanged?: (handle: WasmHandleLike, start: number, end: number) => void;\n onScroll?: (\n handle: WasmHandleLike,\n offsetX: number,\n offsetY: number,\n contentWidth: number,\n contentHeight: number,\n viewportWidth: number,\n viewportHeight: number,\n ) => void;\n onClipboardWrite?: (payload: ClipboardWritePayload) => void;\n onClipboardRead?: (handle: WasmHandleLike) => void;\n onCrossSelectionChanged?: (areaHandle: WasmHandleLike, text: string) => void;\n onRequestFontLoad?: (fontId: number, url: string) => void;\n onMissingFontCoverage?: (fontId: number, coverageKind: number, sampleText: string) => void;\n onRequestSemanticAnnouncement?: (handle: WasmHandleLike) => void;\n}\n\nexport type UiFactory = (module?: object) => Promise<UiModule>;\n\ndeclare global {\n interface Window {\n Module?: CoreModule;\n EffinDomUiV2ModuleFactory?: UiFactory;\n __effindomCallbacks?: EffinDomCallbacks;\n __bridgeReady?: boolean;\n __bridgeError?: string;\n __bridgeState?: {\n readonly commandWordCount: number;\n readonly commandWords: readonly number[];\n readonly rootHandle: string;\n };\n __bridgeLogs?: BridgeLogs;\n __bridgeTextByHandle?: Record<string, string>;\n __bridgeSelectionsByHandle?: Record<string, { start: number; end: number }>;\n __bridgeActiveEditorWindow?: {\n readonly handle: string | null;\n readonly text: string;\n readonly docStart: number;\n readonly docEnd: number;\n };\n __bridgeFindMatch?: OpenCanvasFindMatch | null;\n __bridgeFindState?: OpenCanvasFindState | null;\n __bridgeSemanticTree?: readonly SemanticNode[];\n __bridgeLoaderInfo?: BridgeLoaderInfo;\n __OPEN_CANVAS_API__?: OpenCanvasApi;\n EffinDomBrowserBridge?: BridgeState;\n __bridgeDebug?: { forceDeviceLost(): void };\n }\n}\n\nexport {};\n", "import { EdBackendType, EdDeviceState } from '../../core-types';\nimport type {\n CoreModule,\n EdBackendType as EdBackendTypeValue,\n EdDeviceState as EdDeviceStateValue,\n UiModule,\n WasmHandleLike,\n} from '../../core-types';\n\nexport type WasmModuleMemoryView = Pick<UiModule | CoreModule, 'usesMemory64'>;\n\nfunction extractHandlePrimitive(handle: WasmHandleLike): bigint | number | string {\n if (typeof handle === 'bigint' || typeof handle === 'number' || typeof handle === 'string') {\n return handle;\n }\n const symbolPrimitive = (handle as { [Symbol.toPrimitive]?: (hint: string) => unknown })[Symbol.toPrimitive]?.('default');\n if (\n typeof symbolPrimitive === 'bigint' ||\n typeof symbolPrimitive === 'number' ||\n typeof symbolPrimitive === 'string'\n ) {\n return symbolPrimitive;\n }\n const primitive = handle.valueOf();\n if (typeof primitive === 'bigint' || typeof primitive === 'number' || typeof primitive === 'string') {\n return primitive;\n }\n const stringified = handle.toString();\n if (typeof stringified === 'string') {\n return stringified;\n }\n throw new TypeError(`Cannot convert ${String(handle)} to BigInt.`);\n}\n\nexport function handleToBigInt(handle: WasmHandleLike): bigint {\n const primitive = extractHandlePrimitive(handle);\n if (typeof primitive === 'bigint') {\n return primitive;\n }\n if (typeof primitive === 'number') {\n if (!Number.isInteger(primitive)) {\n throw new TypeError(`Cannot convert non-integer handle ${String(primitive)} to BigInt.`);\n }\n return BigInt(primitive);\n }\n if (typeof primitive === 'string') {\n return BigInt(primitive);\n }\n throw new TypeError(`Cannot convert ${String(handle)} to BigInt.`);\n}\n\nexport function handleToString(handle: WasmHandleLike): string {\n return handleToBigInt(handle).toString();\n}\n\nexport function pointerToHeapOffset(pointer: WasmHandleLike): number {\n if (typeof pointer === 'number') {\n if (!Number.isInteger(pointer)) {\n throw new TypeError(`Cannot convert non-integer pointer ${String(pointer)} to a heap offset.`);\n }\n return pointer;\n }\n const value = handleToBigInt(pointer);\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new RangeError(`Pointer ${value.toString()} exceeds JavaScript heap offset precision.`);\n }\n return Number(value);\n}\n\nexport function normalizePointerForWasm(\n module: WasmModuleMemoryView,\n pointer: WasmHandleLike,\n): number | bigint {\n return module.usesMemory64 === true ? handleToBigInt(pointer) : pointerToHeapOffset(pointer);\n}\n\nexport function toHeapPointer(\n module: WasmModuleMemoryView,\n pointer: WasmHandleLike,\n): { readonly ptr: number | bigint; readonly offset: number } {\n const ptr = normalizePointerForWasm(module, pointer);\n return {\n ptr,\n offset: pointerToHeapOffset(ptr),\n };\n}\n\nexport function normalizeBackendType(value: number): EdBackendTypeValue {\n switch (value) {\n case EdBackendType.WEBGPU:\n case EdBackendType.WEBGL2:\n case EdBackendType.CPU:\n return value;\n default:\n return EdBackendType.NONE;\n }\n}\n\nexport function normalizeDeviceState(value: number): EdDeviceStateValue {\n switch (value) {\n case EdDeviceState.LOST:\n case EdDeviceState.RECOVERING:\n return value;\n default:\n return EdDeviceState.OK;\n }\n}\n\ntype ModifierSource =\n | Pick<KeyboardEvent, 'shiftKey' | 'ctrlKey' | 'altKey' | 'metaKey'>\n | Pick<PointerEvent, 'shiftKey' | 'ctrlKey' | 'altKey' | 'metaKey'>;\n\nexport function computeModifiers(event: ModifierSource): number {\n let modifiers = 0;\n if (event.shiftKey) {\n modifiers |= 1 << 0;\n }\n if (event.ctrlKey) {\n modifiers |= 1 << 1;\n }\n if (event.altKey) {\n modifiers |= 1 << 2;\n }\n if (event.metaKey) {\n modifiers |= 1 << 3;\n }\n return modifiers;\n}\n", "import { EdBackendType, EdDeviceState } from '../../core-types';\nimport type { BridgeLoaderInfo, CoreModule, EdBackendType as EdBackendTypeValue } from '../../core-types';\nimport { normalizeBackendType, normalizeDeviceState } from './encoding';\n\nconst WEBGPU_INIT_TIMEOUT_MS = 1_500;\n\n// TEMPORARY: keep WebGPU disabled from the bridge until resize/device-loss stability\n// issues are resolved. Default to WebGL2 with software fallback.\nexport const DEFAULT_BACKEND_LADDER = [EdBackendType.WEBGL2, EdBackendType.CPU] as const;\n\nexport function backendTypeToRenderer(backendType: EdBackendTypeValue): BridgeLoaderInfo['activeRenderer'] {\n switch (backendType) {\n case EdBackendType.WEBGPU:\n return 'webgpu';\n case EdBackendType.WEBGL2:\n return 'webgl2';\n case EdBackendType.CPU:\n return 'cpu';\n default:\n return 'none';\n }\n}\n\nexport function setActiveRenderer(loaderInfo: BridgeLoaderInfo, backendType: EdBackendTypeValue): void {\n loaderInfo.activeRenderer = backendTypeToRenderer(backendType);\n window.__bridgeLoaderInfo = loaderInfo;\n}\n\nasync function waitForAnimationFrame(): Promise<void> {\n await new Promise<void>((resolve) => {\n requestAnimationFrame(() => {\n resolve();\n });\n });\n}\n\nexport async function waitForWebGpuInit(core: CoreModule): Promise<EdBackendTypeValue> {\n const deadline = performance.now() + WEBGPU_INIT_TIMEOUT_MS;\n while (performance.now() < deadline) {\n const backendType = normalizeBackendType(core._ed_get_backend_type());\n const deviceState = normalizeDeviceState(core._ed_get_device_state());\n if (backendType === EdBackendType.WEBGPU) {\n return backendType;\n }\n if (deviceState !== EdDeviceState.RECOVERING) {\n return backendType;\n }\n await waitForAnimationFrame();\n }\n return normalizeBackendType(core._ed_get_backend_type());\n}\n\nexport async function probeWebGpuAdapter(): Promise<boolean> {\n const nav = navigator as Navigator & { gpu?: { requestAdapter?: () => Promise<unknown> } };\n if (nav.gpu?.requestAdapter === undefined) {\n return false;\n }\n try {\n const adapter = await nav.gpu.requestAdapter();\n return adapter !== null && adapter !== undefined;\n } catch {\n return false;\n }\n}\n\nexport function backendLabel(backend: EdBackendTypeValue): string {\n if (backend === EdBackendType.WEBGPU) return 'WebGPU';\n if (backend === EdBackendType.WEBGL2) return 'WebGL2';\n if (backend === EdBackendType.CPU) return 'Software/Raster';\n return 'None';\n}\n\n// Attempts to initialise exactly one backend. Returns true on success.\n// Safe to call after a device loss \u2014 wraps all init calls in try/catch.\nexport async function tryReviveBackend(\n core: CoreModule,\n canvas: HTMLCanvasElement,\n dpr: number,\n backend: EdBackendTypeValue,\n): Promise<boolean> {\n const w = canvas.width;\n const h = canvas.height;\n try {\n if (backend === EdBackendType.WEBGPU) {\n if (!await probeWebGpuAdapter()) return false;\n core._ed_init(w, h, dpr);\n return await waitForWebGpuInit(core) === EdBackendType.WEBGPU;\n }\n if (backend === EdBackendType.WEBGL2) {\n core._ed_init_webgl(w, h, dpr);\n return normalizeBackendType(core._ed_get_backend_type()) === EdBackendType.WEBGL2;\n }\n core._ed_init_sw(w, h, dpr);\n return normalizeBackendType(core._ed_get_backend_type()) === EdBackendType.CPU;\n } catch {\n return false;\n }\n}\n\nexport async function initRenderer(\n core: CoreModule,\n canvas: HTMLCanvasElement,\n dpr: number,\n loaderInfo: BridgeLoaderInfo,\n backendLadder: readonly EdBackendTypeValue[] = DEFAULT_BACKEND_LADDER,\n): Promise<EdBackendTypeValue> {\n const physicalWidth = canvas.width;\n const physicalHeight = canvas.height;\n const ladder = backendLadder.length > 0 ? backendLadder : DEFAULT_BACKEND_LADDER;\n const firstBackend = ladder[0] ?? EdBackendType.WEBGPU;\n let webGpuAttempted = false;\n let webGl2Attempted = false;\n\n for (const backend of ladder) {\n if (backend === EdBackendType.WEBGPU) {\n // Probe the adapter before calling ed_init. On platforms like Ubuntu where\n // navigator.gpu exists but has no adapter (Vulkan blocklist, no GPU, etc.),\n // requestAdapter() returns null. Calling ed_init without checking locks the\n // canvas to a WebGPU context (even on failure), preventing WebGL2 init.\n if (!await probeWebGpuAdapter()) {\n continue;\n }\n webGpuAttempted = true;\n core._ed_init(physicalWidth, physicalHeight, dpr);\n const resolvedBackend = await waitForWebGpuInit(core);\n if (resolvedBackend === EdBackendType.WEBGPU) {\n setActiveRenderer(loaderInfo, resolvedBackend);\n return resolvedBackend;\n }\n continue;\n }\n\n if (backend === EdBackendType.WEBGL2) {\n webGl2Attempted = true;\n core._ed_init_webgl(physicalWidth, physicalHeight, dpr);\n if (normalizeBackendType(core._ed_get_backend_type()) === EdBackendType.WEBGL2) {\n if (webGpuAttempted || firstBackend === EdBackendType.WEBGPU) {\n console.warn('RENDERER FALLBACK: WebGPU failed to initialize or unavailable! Fell back to WebGL2');\n }\n setActiveRenderer(loaderInfo, EdBackendType.WEBGL2);\n return EdBackendType.WEBGL2;\n }\n continue;\n }\n\n core._ed_init_sw(physicalWidth, physicalHeight, dpr);\n if (normalizeBackendType(core._ed_get_backend_type()) === EdBackendType.CPU) {\n const triedBackends = [\n webGpuAttempted ? 'WebGPU' : null,\n webGl2Attempted ? 'WebGL2' : null,\n ].filter(Boolean).join(' and ');\n const reason = triedBackends.length > 0\n ? `${triedBackends} failed to initialize or unavailable!`\n : 'No GPU backend available.';\n console.error(`RENDERER FALLBACK: ${reason} Fell back to Software/Raster - performance will be painfully slow`);\n setActiveRenderer(loaderInfo, EdBackendType.CPU);\n return EdBackendType.CPU;\n }\n }\n\n setActiveRenderer(loaderInfo, EdBackendType.NONE);\n throw new Error('Failed to initialize any renderer backend.');\n}\n", "export const ASSET_FETCH_ATTEMPTS = 4;\nconst ASSET_RETRY_DELAY_MS = 100;\nconst scriptSourceCache = new Map<string, Promise<string>>();\n\nfunction delay(ms: number): Promise<void> {\n return new Promise<void>((resolve) => {\n window.setTimeout(resolve, ms);\n });\n}\n\nexport function resolveAssetUrl(url: string): string {\n return new URL(url, document.baseURI).toString();\n}\n\nexport function normalizeFetchIntegrity(integrity: string | null | undefined): string | null {\n if (integrity === null || integrity === undefined || integrity.length === 0) {\n return null;\n }\n const value = integrity;\n if (!value.startsWith('sha256-')) {\n return value;\n }\n let digest = value.slice(7).replace(/-/g, '+').replace(/_/g, '/');\n while ((digest.length % 4) !== 0) {\n digest += '=';\n }\n return `sha256-${digest}`;\n}\n\nexport function bytesToBase64(bytes: Uint8Array): string {\n let binary = '';\n for (let index = 0; index < bytes.length; index += 0x8000) {\n const chunk = bytes.subarray(index, Math.min(index + 0x8000, bytes.length));\n binary += String.fromCharCode(...chunk);\n }\n return window.btoa(binary);\n}\n\nexport async function verifyFetchedIntegrity(assetUrl: string, buffer: ArrayBuffer, integrity: string | null | undefined): Promise<ArrayBuffer> {\n const normalizedIntegrity = normalizeFetchIntegrity(integrity);\n if (normalizedIntegrity === null) {\n return buffer;\n }\n const digestBuffer = await globalThis.crypto.subtle.digest('SHA-256', buffer);\n const actualIntegrity = `sha256-${bytesToBase64(new Uint8Array(digestBuffer))}`;\n if (actualIntegrity !== normalizedIntegrity) {\n throw new Error(`Integrity mismatch for ${assetUrl}`);\n }\n return buffer;\n}\n\nexport function buildFetchInit(integrity: string | null | undefined, cache: RequestCache = 'force-cache'): RequestInit {\n const fetchIntegrity = normalizeFetchIntegrity(integrity);\n const init: RequestInit = {\n credentials: 'same-origin',\n cache,\n };\n if (fetchIntegrity !== null) {\n init.integrity = fetchIntegrity;\n }\n return init;\n}\n\nexport async function fetchWithRetry<T>(\n url: string,\n attempts: number,\n read: (response: Response) => T | Promise<T>,\n init?: RequestInit,\n): Promise<T> {\n let lastError: unknown = null;\n for (let attempt = 1; attempt <= attempts; attempt += 1) {\n try {\n const response = await fetch(url, init);\n if (!response.ok) {\n throw new Error(`Failed to fetch ${url}: ${String(response.status)}`);\n }\n return await read(response);\n } catch (error: unknown) {\n lastError = error;\n if (attempt === attempts) {\n break;\n }\n await delay(ASSET_RETRY_DELAY_MS * attempt);\n }\n }\n throw lastError instanceof Error ? lastError : new Error(`Failed to fetch ${url}`);\n}\n\nexport async function fetchBinaryAsset(url: string, integrity: string | null | undefined): Promise<Uint8Array> {\n const assetUrl = resolveAssetUrl(url);\n const buffer = await fetchWithRetry<ArrayBuffer>(\n assetUrl,\n ASSET_FETCH_ATTEMPTS,\n async (response) => await response.arrayBuffer(),\n buildFetchInit(integrity),\n );\n return new Uint8Array(await verifyFetchedIntegrity(assetUrl, buffer, integrity));\n}\n\nexport async function fetchResponseWithRetry(url: string, integrity: string | null | undefined): Promise<Response> {\n const assetUrl = resolveAssetUrl(url);\n return await fetchWithRetry<Response>(\n assetUrl,\n ASSET_FETCH_ATTEMPTS,\n (response) => response,\n buildFetchInit(integrity),\n );\n}\n\nexport async function loadScriptResource(scriptUrl: string, integrity: string | null | undefined): Promise<void> {\n const absoluteUrl = resolveAssetUrl(scriptUrl);\n const sourceText = await fetchScriptSource(absoluteUrl, integrity);\n const blobSource = sourceText.includes('//# sourceURL=')\n ? sourceText\n : `${sourceText}\\n//# sourceURL=${absoluteUrl.replace(/\\s/g, '%20')}`;\n const blobUrl = URL.createObjectURL(new Blob([blobSource], { type: 'application/javascript' }));\n try {\n await new Promise<void>((resolve, reject) => {\n const script = document.createElement('script');\n script.src = blobUrl;\n script.async = true;\n script.addEventListener('load', () => {\n script.remove();\n resolve();\n });\n script.addEventListener('error', () => {\n script.remove();\n reject(new Error(`Failed to execute ${absoluteUrl}`));\n });\n document.head.appendChild(script);\n });\n } finally {\n URL.revokeObjectURL(blobUrl);\n }\n}\n\nexport async function fetchScriptSource(scriptUrl: string, integrity: string | null | undefined): Promise<string> {\n const absoluteUrl = resolveAssetUrl(scriptUrl);\n const cacheKey = `${absoluteUrl}::${integrity ?? ''}`;\n let sourcePromise = scriptSourceCache.get(cacheKey);\n if (sourcePromise === undefined) {\n sourcePromise = fetchBinaryAsset(absoluteUrl, integrity).then((scriptBytes) =>\n new TextDecoder('utf-8').decode(scriptBytes));\n scriptSourceCache.set(cacheKey, sourcePromise);\n }\n return await sourcePromise;\n}\n", "import type { CoreModule, UiModule, WasmHandleLike } from '../../core-types';\nimport { normalizePointerForWasm, pointerToHeapOffset } from './encoding';\n\nconst textEncoder = new TextEncoder();\n\nexport function writeUtf8ToHeap(\n module: Pick<UiModule | CoreModule, 'HEAPU8' | '_malloc' | '_free' | 'refreshHeapViews' | 'usesMemory64'>,\n text: string,\n): { readonly ptr: WasmHandleLike; readonly offset: number; readonly len: number; dispose(): void } {\n const bytes = textEncoder.encode(text);\n const ptr = normalizePointerForWasm(module, bytes.byteLength === 0 ? 0 : module._malloc(bytes.byteLength));\n const offset = pointerToHeapOffset(ptr);\n module.refreshHeapViews?.();\n if (bytes.byteLength > 0 && offset === 0) {\n throw new Error('WASM string malloc failed.');\n }\n if (bytes.byteLength > 0) {\n module.HEAPU8.set(bytes, offset);\n }\n return {\n ptr,\n offset,\n len: bytes.byteLength,\n dispose: () => {\n if (offset !== 0) {\n module._free(ptr);\n }\n },\n };\n}\n\nexport function writeBytesToHeap(\n module: Pick<UiModule | CoreModule, 'HEAPU8' | '_malloc' | '_free' | 'refreshHeapViews' | 'usesMemory64'>,\n bytes: Uint8Array,\n): { readonly ptr: WasmHandleLike; readonly offset: number; readonly len: number; dispose(): void } {\n const ptr = normalizePointerForWasm(module, bytes.byteLength === 0 ? 0 : module._malloc(bytes.byteLength));\n const offset = pointerToHeapOffset(ptr);\n module.refreshHeapViews?.();\n if (bytes.byteLength > 0 && offset === 0) {\n throw new Error('WASM bytes malloc failed.');\n }\n if (bytes.byteLength > 0) {\n module.HEAPU8.set(bytes, offset);\n }\n return {\n ptr,\n offset,\n len: bytes.byteLength,\n dispose: () => {\n if (offset !== 0) {\n module._free(ptr);\n }\n },\n };\n}\n\nexport function extractCommandBuffer(ui: UiModule): Uint32Array {\n const lengthPtr = normalizePointerForWasm(ui, ui._malloc(4));\n const lengthOffset = pointerToHeapOffset(lengthPtr);\n if (lengthOffset === 0) {\n throw new Error('ui length malloc failed.');\n }\n\n try {\n const bufferPtr = ui._ui_get_command_buffer(lengthPtr);\n ui.refreshHeapViews?.();\n const wordCount = ui.HEAPU32[lengthOffset >>> 2] ?? 0;\n const bufferOffset = pointerToHeapOffset(normalizePointerForWasm(ui, bufferPtr));\n if (bufferOffset === 0 || wordCount === 0) {\n return new Uint32Array();\n }\n const wordOffset = bufferOffset >>> 2;\n return ui.HEAPU32.slice(wordOffset, wordOffset + wordCount);\n } finally {\n ui._free(lengthPtr);\n }\n}\n\nexport function extractSemanticBuffer(ui: UiModule): Uint32Array {\n const lengthPtr = normalizePointerForWasm(ui, ui._malloc(4));\n const lengthOffset = pointerToHeapOffset(lengthPtr);\n if (lengthOffset === 0) {\n throw new Error('ui semantic length malloc failed.');\n }\n\n try {\n const bufferPtr = ui._ui_get_semantic_buffer(lengthPtr);\n ui.refreshHeapViews?.();\n const wordCount = ui.HEAPU32[lengthOffset >>> 2] ?? 0;\n const bufferOffset = pointerToHeapOffset(normalizePointerForWasm(ui, bufferPtr));\n if (bufferOffset === 0 || wordCount === 0) {\n return new Uint32Array();\n }\n const wordOffset = bufferOffset >>> 2;\n return ui.HEAPU32.slice(wordOffset, wordOffset + wordCount);\n } finally {\n ui._free(lengthPtr);\n }\n}\n\nexport function executeCommandBuffer(core: CoreModule, words: Uint32Array): void {\n if (words.length === 0) {\n return;\n }\n const ptr = normalizePointerForWasm(core, core._malloc(words.byteLength));\n const offset = pointerToHeapOffset(ptr);\n core.refreshHeapViews?.();\n if (offset === 0) {\n throw new Error('core command malloc failed.');\n }\n\n try {\n core.HEAPU32.set(words, offset >>> 2);\n core._ed_execute_command_buffer(ptr, words.length);\n } finally {\n core._free(ptr);\n }\n}\n", "import { EdBackendType, EdDeviceState } from '../../core-types';\nimport type {\n BridgeLoaderInfo,\n BridgeLogs,\n CoreModule,\n UiFactory,\n UiModule,\n} from '../../core-types';\nimport type {\n ArchitectureSelection,\n PreparedRuntimeAssets,\n PreparedWasmAsset,\n RequestedRendererBackend,\n RuntimeManifest,\n} from '../local-types';\nimport type { EdBackendType as EdBackendTypeValue } from '../../core-types';\nimport { DEFAULT_BACKEND_LADDER } from './backends';\nimport { fetchBinaryAsset, fetchScriptSource, fetchWithRetry, loadScriptResource, resolveAssetUrl, verifyFetchedIntegrity, ASSET_FETCH_ATTEMPTS } from './fetch';\nimport { writeBytesToHeap } from './heap';\n\ndeclare const HEAPU8: Uint8Array | undefined;\ndeclare const HEAPU32: Uint32Array | undefined;\n\ndeclare global {\n interface EffinDomRuntimeConfig {\n manifestUrl?: string;\n }\n\n interface Window {\n __effindomRuntime?: EffinDomRuntimeConfig;\n }\n}\n\ninterface LoadedRuntimeManifest {\n readonly manifest: RuntimeManifest;\n readonly manifestUrl: string;\n}\n\nconst MEMORY64_VALIDATION_MODULE_BYTES = new Uint8Array([\n 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x0f, 0x03, 0x60,\n 0x02, 0x7f, 0x7e, 0x01, 0x7f, 0x60, 0x01, 0x7e, 0x00, 0x60, 0x00, 0x01,\n 0x7e, 0x03, 0x04, 0x03, 0x00, 0x01, 0x02, 0x04, 0x05, 0x01, 0x70, 0x05,\n 0x01, 0x01, 0x05, 0x06, 0x01, 0x05, 0x82, 0x02, 0x82, 0x02, 0x06, 0x08,\n 0x01, 0x7e, 0x01, 0x42, 0x80, 0x88, 0x04, 0x0b, 0x07, 0x68, 0x05, 0x06,\n 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00, 0x04, 0x6d, 0x61, 0x69,\n 0x6e, 0x00, 0x00, 0x19, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x72, 0x65,\n 0x63, 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f,\n 0x74, 0x61, 0x62, 0x6c, 0x65, 0x01, 0x00, 0x19, 0x5f, 0x65, 0x6d, 0x73,\n 0x63, 0x72, 0x69, 0x70, 0x74, 0x65, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x63,\n 0x6b, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x00, 0x01, 0x1c,\n 0x65, 0x6d, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x65, 0x6e, 0x5f, 0x73,\n 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x63, 0x75, 0x72,\n 0x72, 0x65, 0x6e, 0x74, 0x00, 0x02, 0x0a, 0x12, 0x03, 0x04, 0x00, 0x41,\n 0x00, 0x0b, 0x06, 0x00, 0x20, 0x00, 0x24, 0x00, 0x0b, 0x04, 0x00, 0x23,\n 0x00, 0x0b,\n]);\n\nconst SIMD_VALIDATION_MODULE_BYTES = new Uint8Array([\n 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00,\n 0x01, 0x04, 0x01, 0x60, 0x00, 0x00,\n 0x03, 0x02, 0x01, 0x00,\n 0x0a, 0x17, 0x01, 0x15, 0x00, 0xfd, 0x0c,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x1a, 0x0b,\n]);\n\nfunction requireTextElement(id: string): HTMLElement {\n const element = document.getElementById(id);\n if (!(element instanceof HTMLElement)) {\n throw new Error(`Expected #${id} element.`);\n }\n return element;\n}\n\nexport function showIcuError(message: string): void {\n const errorBox = document.getElementById('icu-error');\n const messageNode = document.getElementById('icu-error-message');\n if (errorBox instanceof HTMLElement && messageNode instanceof HTMLElement) {\n messageNode.textContent = message;\n errorBox.style.display = 'block';\n return;\n }\n\n const overlay = document.getElementById('effindom-loading-overlay');\n const overlayTitle = document.getElementById('effindom-loading-title');\n const overlayDetail = document.getElementById('effindom-loading-detail');\n if (\n overlay instanceof HTMLElement &&\n overlayTitle instanceof HTMLElement &&\n overlayDetail instanceof HTMLElement\n ) {\n overlay.dataset.state = 'error';\n overlay.hidden = false;\n overlay.setAttribute('aria-hidden', 'false');\n overlayTitle.textContent = 'The typesetter dragon sneezed on the runtime.';\n overlayDetail.textContent = message;\n }\n}\n\nexport function createErrorWithCause(message: string, cause: unknown): Error {\n const wrappedError = new Error(message) as Error & { cause?: unknown };\n wrappedError.cause = cause;\n return wrappedError;\n}\n\nexport async function waitForAnimationFrame(): Promise<void> {\n await new Promise<void>((resolve) => {\n requestAnimationFrame(() => {\n resolve();\n });\n });\n}\n\nexport function delay(ms: number): Promise<void> {\n return new Promise<void>((resolve) => {\n window.setTimeout(resolve, ms);\n });\n}\n\nexport function clearRecordMap<T>(recordMap: Record<string, T>): void {\n for (const key of Object.keys(recordMap)) {\n Reflect.deleteProperty(recordMap, key);\n }\n}\n\nexport function resetBridgeLogs(logs: BridgeLogs): void {\n logs.pointerEvents.length = 0;\n logs.focusEvents.length = 0;\n logs.textChanges.length = 0;\n logs.selectionChanges.length = 0;\n logs.crossSelectionChanges.length = 0;\n logs.clipboardWrites.length = 0;\n logs.clipboardReadRequests.length = 0;\n logs.scrollEvents.length = 0;\n logs.missingFontCoverageRequests.length = 0;\n logs.incrementalFontPackageRequests.length = 0;\n}\n\nfunction supportsMemory64(): boolean {\n try {\n new WebAssembly.Memory({ initial: 1, maximum: 1, index: 'i64' } as WebAssembly.MemoryDescriptor & { index: 'i64' });\n if (WebAssembly.validate !== undefined) {\n return WebAssembly.validate(MEMORY64_VALIDATION_MODULE_BYTES);\n }\n void new WebAssembly.Module(MEMORY64_VALIDATION_MODULE_BYTES);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction supportsSimd(): boolean {\n try {\n if (WebAssembly.validate !== undefined) {\n return WebAssembly.validate(SIMD_VALIDATION_MODULE_BYTES);\n }\n void new WebAssembly.Module(SIMD_VALIDATION_MODULE_BYTES);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction normalizeWasmArchitecture(requestedArchitecture: string | null | undefined): ArchitectureSelection['requestedArchitecture'] {\n const value = (requestedArchitecture ?? 'auto').toLowerCase();\n if (value === 'wasm32' || value === 'wasm32-simd' || value === 'wasm64' || value === 'wasm64-simd') {\n return value;\n }\n return 'auto';\n}\n\nfunction getManifestArchitectureEntry(\n manifest: RuntimeManifest,\n architecture: Exclude<ArchitectureSelection['requestedArchitecture'], 'auto'>,\n): ArchitectureSelection['manifestEntry'] | null {\n return manifest.architectures[architecture] ?? null;\n}\n\nfunction selectManifestArchitecture(manifest: RuntimeManifest, requestedArchitecture: string | null | undefined): ArchitectureSelection {\n const normalizedRequest = normalizeWasmArchitecture(requestedArchitecture);\n const memory64Supported = supportsMemory64();\n const simdSupported = supportsSimd();\n const availableArchitectures = Object.keys(manifest.architectures).filter((architecture) => manifest.architectures[architecture as Exclude<ArchitectureSelection['requestedArchitecture'], 'auto'>] !== undefined);\n let selectedArchitecture: Exclude<ArchitectureSelection['requestedArchitecture'], 'auto'> | null = null;\n let selectionReason: string;\n\n const architectureUsesMemory64 = (architecture: string): boolean => architecture.startsWith('wasm64');\n const architectureUsesSimd = (architecture: string): boolean => architecture.endsWith('-simd');\n\n if (normalizedRequest !== 'auto') {\n const explicitEntry = getManifestArchitectureEntry(manifest, normalizedRequest);\n if (explicitEntry === null) {\n throw new Error(`Manifest does not include ${normalizedRequest} bundles.`);\n }\n if (architectureUsesMemory64(normalizedRequest) && !memory64Supported) {\n throw new Error(`${normalizedRequest} was explicitly requested but this browser does not support Memory64.`);\n }\n if (architectureUsesSimd(normalizedRequest) && !simdSupported) {\n throw new Error(`${normalizedRequest} was explicitly requested but this browser does not support WebAssembly SIMD.`);\n }\n selectedArchitecture = normalizedRequest;\n selectionReason = `Explicit ${normalizedRequest} request.`;\n } else {\n const preferredArchitectures: Exclude<ArchitectureSelection['requestedArchitecture'], 'auto'>[] = [];\n if (memory64Supported && simdSupported) {\n preferredArchitectures.push('wasm64-simd');\n }\n if (memory64Supported) {\n preferredArchitectures.push('wasm64');\n }\n if (simdSupported) {\n preferredArchitectures.push('wasm32-simd');\n }\n preferredArchitectures.push('wasm32');\n\n for (const candidate of preferredArchitectures) {\n if (getManifestArchitectureEntry(manifest, candidate) !== null) {\n selectedArchitecture = candidate;\n break;\n }\n }\n\n if (selectedArchitecture === null) {\n throw new Error('Manifest does not expose any wasm bundle architectures compatible with this browser.');\n }\n\n if (selectedArchitecture === 'wasm64-simd') {\n selectionReason = 'Browser supports Memory64 + SIMD, so EffinDom selected the wasm64-simd bundle set.';\n } else if (selectedArchitecture === 'wasm64') {\n selectionReason = 'Browser supports Memory64, so EffinDom selected the wasm64 bundle set.';\n } else if (selectedArchitecture === 'wasm32-simd') {\n selectionReason = 'Browser supports SIMD, so EffinDom selected the wasm32-simd bundle set.';\n } else {\n selectionReason = 'Browser selected the wasm32 bundle set.';\n }\n }\n\n const manifestEntry = getManifestArchitectureEntry(manifest, selectedArchitecture);\n if (manifestEntry === null) {\n throw new Error(`Manifest entry for ${selectedArchitecture} is missing.`);\n }\n\n return {\n requestedArchitecture: normalizedRequest,\n selectedArchitecture,\n availableArchitectures,\n memory64Supported,\n simdSupported,\n selectionReason,\n manifestEntry,\n };\n}\n\nfunction readManifestUrl(): string {\n const runtimeConfig = window.__effindomRuntime;\n if (runtimeConfig === undefined) {\n throw new Error('Missing effindom-runtime-config.js. Expected window.__effindomRuntime.manifestUrl before bridge.js loads.');\n }\n if (typeof runtimeConfig.manifestUrl !== 'string' || runtimeConfig.manifestUrl.length === 0) {\n throw new Error('Malformed effindom-runtime-config.js. Expected window.__effindomRuntime.manifestUrl to be a non-empty string.');\n }\n return runtimeConfig.manifestUrl;\n}\n\nfunction resolveManifestAssetUrl(manifestUrl: string, assetUrl: string): string {\n return new URL(assetUrl, manifestUrl).toString();\n}\n\nasync function loadRuntimeManifest(): Promise<LoadedRuntimeManifest> {\n const manifestUrl = resolveAssetUrl(readManifestUrl());\n const manifest = await fetchWithRetry<RuntimeManifest>(\n manifestUrl,\n ASSET_FETCH_ATTEMPTS,\n async (response) => await response.json() as RuntimeManifest,\n { cache: 'no-store' },\n );\n return {\n manifest,\n manifestUrl,\n };\n}\n\nasync function instantiatePreparedWasm(\n preparedAsset: PreparedWasmAsset,\n imports: WebAssembly.Imports,\n): Promise<{ readonly instance: WebAssembly.Instance; readonly module: WebAssembly.Module; readonly compileMode: 'cached-module' }> {\n const module = await preparedAsset.modulePromise;\n const instance = await WebAssembly.instantiate(module, imports);\n return { instance, module, compileMode: 'cached-module' };\n}\n\nexport async function loadIcuData(ui: UiModule, preparedAssets: PreparedRuntimeAssets): Promise<void> {\n const bytes = await preparedAssets.icu.bytesPromise;\n const heapBytes = writeBytesToHeap(ui, bytes);\n try {\n ui._ui_register_icu_data(heapBytes.ptr, heapBytes.len);\n } finally {\n heapBytes.dispose();\n }\n}\n\nfunction describeAbortReason(value: unknown, fallback: string): string {\n if (typeof value === 'string' && value.length > 0) {\n return value;\n }\n if (value instanceof Error && value.message.length > 0) {\n return value.message;\n }\n return fallback;\n}\n\nfunction prepareWasmAsset(url: string, integrity: string | null): PreparedWasmAsset {\n const requestInit: RequestInit = {\n credentials: 'same-origin',\n cache: 'force-cache',\n };\n if (integrity !== null) {\n requestInit.integrity = integrity;\n }\n const bytesPromise = fetchWithRetry<ArrayBuffer>(\n url,\n ASSET_FETCH_ATTEMPTS,\n async (response) => await response.arrayBuffer(),\n requestInit,\n ).then(async (buffer) => await verifyFetchedIntegrity(url, buffer, integrity));\n return {\n url,\n integrity,\n bytesPromise,\n modulePromise: bytesPromise.then(async (buffer) => await WebAssembly.compile(buffer)),\n };\n}\n\nconst coreScriptRunnerCache = new Map<string, Promise<(module: CoreModule) => void>>();\n\nasync function getCoreScriptRunner(scriptUrl: string, integrity: string | null | undefined): Promise<(module: CoreModule) => void> {\n const absoluteUrl = resolveAssetUrl(scriptUrl);\n const cacheKey = `${absoluteUrl}::${integrity ?? ''}`;\n let runnerPromise = coreScriptRunnerCache.get(cacheKey);\n if (runnerPromise === undefined) {\n runnerPromise = fetchScriptSource(absoluteUrl, integrity).then((sourceText) => {\n const wrappedSource = `${sourceText}\\n//# sourceURL=${absoluteUrl.replace(/\\s/g, '%20')}`;\n return new Function('Module', wrappedSource) as (module: CoreModule) => void;\n });\n coreScriptRunnerCache.set(cacheKey, runnerPromise);\n }\n return await runnerPromise;\n}\n\nexport async function loadCoreModule(\n bundle: PreparedRuntimeAssets['coreBundle'],\n preparedWasm: PreparedWasmAsset,\n canvas: HTMLCanvasElement,\n loaderInfo: BridgeLoaderInfo,\n): Promise<CoreModule> {\n return await new Promise<CoreModule>((resolve, reject) => {\n const module: CoreModule = {\n HEAPU8: new Uint8Array(),\n HEAPU32: new Uint32Array(),\n usesMemory64: loaderInfo.selectedWasmArchitecture.startsWith('wasm64'),\n locateFile: (path) => {\n if (path.endsWith('.wasm')) {\n return resolveAssetUrl(bundle.wasm);\n }\n return resolveAssetUrl(path);\n },\n instantiateWasm: (imports, receiveInstance) => {\n void instantiatePreparedWasm(preparedWasm, imports).then((result) => {\n loaderInfo.coreCompileMode = result.compileMode;\n receiveInstance(result.instance, result.module);\n }).catch((error: unknown) => {\n reject(createErrorWithCause('Failed to instantiate Core wasm.', error));\n });\n return {};\n },\n onAbort: (what) => {\n reject(new Error(describeAbortReason(what, 'Core wasm aborted.')));\n },\n refreshHeapViews: () => {\n if (module.wasmMemory !== undefined) {\n const buffer = module.wasmMemory.buffer;\n module.HEAPU8 = new Uint8Array(buffer);\n module.HEAPU32 = new Uint32Array(buffer);\n } else if (typeof HEAPU8 !== 'undefined') {\n // Fallback for older Emscripten builds that don't expose Module[\"memory\"].\n module.HEAPU8 = HEAPU8;\n if (typeof HEAPU32 !== 'undefined') {\n module.HEAPU32 = HEAPU32;\n }\n }\n },\n canvas,\n onRuntimeInitialized: () => {\n // Emscripten assigns Module[\"memory\"] = wasmMemory when the WASM instance\n // is processed, before onRuntimeInitialized fires.\n const emMemory = (module as { memory?: unknown }).memory;\n if (emMemory instanceof WebAssembly.Memory) {\n module.wasmMemory = emMemory;\n }\n module.refreshHeapViews?.();\n resolve(module);\n },\n _malloc: () => 0,\n _free: () => undefined,\n _ed_init: () => undefined,\n _ed_init_webgl: () => undefined,\n _ed_init_sw: () => undefined,\n _ed_resize: () => undefined,\n _ed_register_font: () => undefined,\n _ed_unregister_font: () => undefined,\n _ed_register_svg: () => undefined,\n _ed_register_texture_rgba: () => undefined,\n _ed_unregister_texture: () => undefined,\n _ed_execute_command_buffer: () => undefined,\n _ed_reset_scene: () => undefined,\n _ed_render_frame: () => undefined,\n _ed_clear_focus_state: () => undefined,\n _ed_clear_text_input_state: () => undefined,\n _ed_recover_device: () => undefined,\n _ed_hit_test: () => 0,\n _ed_get_sw_framebuffer: () => 0,\n _ed_get_backend_type: () => EdBackendType.NONE,\n _ed_get_device_state: () => EdDeviceState.OK,\n _ed_notify_webgl_context_lost: () => undefined,\n _ed_debug_simulate_device_lost: () => undefined,\n };\n void getCoreScriptRunner(bundle.js, bundle.js_integrity ?? null).then((runCoreScript) => {\n runCoreScript(module);\n }).catch(reject);\n });\n}\n\nexport async function loadUiModule(\n bundle: PreparedRuntimeAssets['uiBundle'],\n preparedWasm: PreparedWasmAsset,\n loaderInfo: BridgeLoaderInfo,\n): Promise<UiModule> {\n if (window.EffinDomUiV2ModuleFactory === undefined) {\n await loadScriptResource(bundle.js, bundle.js_integrity ?? null);\n }\n if (window.EffinDomUiV2ModuleFactory === undefined) {\n throw new Error('EffinDomUiV2ModuleFactory did not load.');\n }\n let rejectInstantiation: ((reason: unknown) => void) | null = null;\n const instantiationFailure = new Promise<never>((_, reject) => {\n rejectInstantiation = reject;\n });\n const modulePromise = window.EffinDomUiV2ModuleFactory({\n locateFile: (path: string) => {\n if (path.endsWith('.wasm')) {\n return resolveAssetUrl(bundle.wasm);\n }\n return resolveAssetUrl(path);\n },\n instantiateWasm: (imports: WebAssembly.Imports, receiveInstance: (instance: WebAssembly.Instance, module?: WebAssembly.Module) => void) => {\n void instantiatePreparedWasm(preparedWasm, imports).then((result) => {\n loaderInfo.uiCompileMode = result.compileMode;\n receiveInstance(result.instance, result.module);\n }).catch((error: unknown) => {\n rejectInstantiation?.(createErrorWithCause('Failed to instantiate Ui wasm.', error));\n });\n return {};\n },\n onAbort: (what: unknown) => {\n rejectInstantiation?.(new Error(describeAbortReason(what, 'Ui wasm aborted.')));\n },\n });\n const ui = await Promise.race([modulePromise, instantiationFailure]);\n ui.usesMemory64 = loaderInfo.selectedWasmArchitecture.startsWith('wasm64');\n const uiEmMemory = (ui as { memory?: unknown }).memory;\n if (uiEmMemory instanceof WebAssembly.Memory) {\n ui.wasmMemory = uiEmMemory;\n }\n ui.refreshHeapViews = () => {\n if (ui.wasmMemory !== undefined) {\n const buffer = ui.wasmMemory.buffer;\n ui.HEAPU8 = new Uint8Array(buffer);\n ui.HEAPU32 = new Uint32Array(buffer);\n }\n };\n ui.refreshHeapViews();\n return ui;\n}\n\nfunction readRequestedArchitecture(): string | null {\n return new URLSearchParams(window.location.search).get('arch');\n}\n\nfunction readRequestedRendererBackend(): RequestedRendererBackend {\n const value = new URLSearchParams(window.location.search).get('backend')?.toLowerCase() ?? 'auto';\n if (value === 'webgpu' || value === 'graphite') {\n return 'webgpu';\n }\n if (value === 'webgl2' || value === 'ganesh') {\n return 'webgl2';\n }\n if (value === 'software' || value === 'raster' || value === 'cpu') {\n return 'cpu';\n }\n return 'auto';\n}\n\nexport function buildBackendLadder(requestedBackend: RequestedRendererBackend): readonly EdBackendTypeValue[] {\n if (requestedBackend === 'webgpu') {\n // TEMPORARY: explicit ?backend=webgpu currently downgrades to WebGL2/CPU.\n return [EdBackendType.WEBGL2, EdBackendType.CPU];\n }\n if (requestedBackend === 'webgl2') {\n return [EdBackendType.WEBGL2, EdBackendType.CPU];\n }\n if (requestedBackend === 'cpu') {\n return [EdBackendType.CPU];\n }\n return DEFAULT_BACKEND_LADDER;\n}\n\nexport async function prepareRuntimeAssets(): Promise<PreparedRuntimeAssets> {\n const loadedManifest = await loadRuntimeManifest();\n const manifest = loadedManifest.manifest;\n const manifestUrl = loadedManifest.manifestUrl;\n const selection = selectManifestArchitecture(manifest, readRequestedArchitecture());\n const requestedRendererBackend = readRequestedRendererBackend();\n const coreBundle = {\n ...selection.manifestEntry.core,\n js: resolveManifestAssetUrl(manifestUrl, selection.manifestEntry.core.js),\n wasm: resolveManifestAssetUrl(manifestUrl, selection.manifestEntry.core.wasm),\n };\n const uiBundle = {\n ...selection.manifestEntry.ui,\n js: resolveManifestAssetUrl(manifestUrl, selection.manifestEntry.ui.js),\n wasm: resolveManifestAssetUrl(manifestUrl, selection.manifestEntry.ui.wasm),\n };\n const icuAsset = manifest.assets?.icu;\n if (icuAsset === undefined) {\n throw new Error('Manifest is missing the ICU asset descriptor.');\n }\n\n const loaderInfo: BridgeLoaderInfo = {\n manifestHash: manifest.manifest_hash ?? null,\n requestedWasmArchitecture: selection.requestedArchitecture,\n requestedRendererBackend,\n selectedWasmArchitecture: selection.selectedArchitecture,\n availableWasmArchitectures: selection.availableArchitectures,\n memory64Supported: selection.memory64Supported,\n simdSupported: selection.simdSupported,\n coreCompileMode: 'buffer',\n uiCompileMode: 'buffer',\n icuDataUrl: resolveManifestAssetUrl(manifestUrl, icuAsset.url),\n activeRenderer: 'none',\n deviceRecoveryCount: 0,\n };\n\n return {\n manifest,\n selection,\n loaderInfo,\n coreBundle,\n uiBundle,\n coreWasm: {\n ...prepareWasmAsset(coreBundle.wasm, coreBundle.wasm_integrity ?? null),\n },\n uiWasm: {\n ...prepareWasmAsset(uiBundle.wasm, uiBundle.wasm_integrity ?? null),\n },\n icu: {\n url: resolveManifestAssetUrl(manifestUrl, icuAsset.url),\n integrity: icuAsset.integrity ?? null,\n bytesPromise: fetchBinaryAsset(resolveManifestAssetUrl(manifestUrl, icuAsset.url), icuAsset.integrity ?? null),\n },\n };\n}\n", "import type {\n OpenCanvasFindMatch,\n OpenCanvasFindOptions,\n OpenCanvasFindResults,\n OpenCanvasResolvedFindOptions,\n OpenCanvasTextDocument,\n} from '../core-types';\n\nconst combiningMarkPattern = /\\p{Mark}+/gu;\nconst wordLikeCharPattern = /[\\p{Letter}\\p{Number}\\p{Mark}_]/u;\nconst textEncoder = new TextEncoder();\n\ninterface SearchToken {\n readonly start: number;\n readonly end: number;\n}\n\ninterface SearchText {\n readonly text: string;\n readonly tokens: readonly SearchToken[];\n}\n\nexport const DEFAULT_OPEN_CANVAS_FIND_OPTIONS: OpenCanvasResolvedFindOptions = {\n highlightAll: false,\n matchCase: false,\n matchDiacritics: false,\n wholeWords: false,\n};\n\nexport function normalizeOpenCanvasFindOptions(\n options?: OpenCanvasFindOptions,\n): OpenCanvasResolvedFindOptions {\n return {\n highlightAll: options?.highlightAll ?? DEFAULT_OPEN_CANVAS_FIND_OPTIONS.highlightAll,\n matchCase: options?.matchCase ?? DEFAULT_OPEN_CANVAS_FIND_OPTIONS.matchCase,\n matchDiacritics: options?.matchDiacritics ?? DEFAULT_OPEN_CANVAS_FIND_OPTIONS.matchDiacritics,\n wholeWords: options?.wholeWords ?? DEFAULT_OPEN_CANVAS_FIND_OPTIONS.wholeWords,\n };\n}\n\nfunction utf8ByteOffsetFromCodeUnitIndex(text: string, codeUnitIndex: number): number {\n const clampedIndex = Math.max(0, Math.min(codeUnitIndex, text.length));\n return textEncoder.encode(text.slice(0, clampedIndex)).byteLength;\n}\n\nfunction codePointBefore(text: string, boundary: number): string | null {\n if (boundary <= 0) {\n return null;\n }\n let start = boundary - 1;\n const low = text.charCodeAt(start);\n if (\n start > 0 &&\n low >= 0xDC00 &&\n low <= 0xDFFF\n ) {\n const high = text.charCodeAt(start - 1);\n if (high >= 0xD800 && high <= 0xDBFF) {\n start -= 1;\n }\n }\n return text.slice(start, boundary);\n}\n\nfunction codePointAt(text: string, boundary: number): string | null {\n const codePoint = text.codePointAt(boundary);\n return codePoint === undefined ? null : String.fromCodePoint(codePoint);\n}\n\nfunction isWordLikeChar(value: string | null): boolean {\n return value !== null && wordLikeCharPattern.test(value);\n}\n\nfunction isWholeWordMatch(text: string, start: number, end: number): boolean {\n return !isWordLikeChar(codePointBefore(text, start)) &&\n !isWordLikeChar(codePointAt(text, end));\n}\n\nfunction buildSearchText(\n source: string,\n options: OpenCanvasResolvedFindOptions,\n): SearchText {\n const tokens: SearchToken[] = [];\n let output = '';\n let sourceIndex = 0;\n for (const segment of source) {\n const start = sourceIndex;\n sourceIndex += segment.length;\n const end = sourceIndex;\n let searchable = options.matchDiacritics\n ? segment\n : segment.normalize('NFD').replace(combiningMarkPattern, '');\n searchable = options.matchCase ? searchable : searchable.toLocaleLowerCase();\n output += searchable;\n for (let index = 0; index < searchable.length; index += 1) {\n tokens.push({ start, end });\n }\n }\n return { text: output, tokens };\n}\n\nexport function findTextInOpenCanvasDocuments(\n documents: readonly OpenCanvasTextDocument[],\n query: string,\n options?: OpenCanvasFindOptions,\n): OpenCanvasFindResults {\n const resolvedOptions = normalizeOpenCanvasFindOptions(options);\n if (query.length === 0) {\n return {\n query,\n options: resolvedOptions,\n matches: [],\n };\n }\n\n const normalizedQuery = buildSearchText(query, resolvedOptions).text;\n if (normalizedQuery.length === 0) {\n return {\n query,\n options: resolvedOptions,\n matches: [],\n };\n }\n\n const matches: OpenCanvasFindMatch[] = [];\n for (const document of documents) {\n const searchableDocument = buildSearchText(document.text, resolvedOptions);\n let searchStart = 0;\n while (searchStart <= searchableDocument.text.length - normalizedQuery.length) {\n const matchStart = searchableDocument.text.indexOf(normalizedQuery, searchStart);\n if (matchStart < 0) {\n break;\n }\n const matchEnd = matchStart + normalizedQuery.length;\n const startToken = searchableDocument.tokens[matchStart];\n const endToken = searchableDocument.tokens[matchEnd - 1];\n if (startToken === undefined || endToken === undefined) {\n break;\n }\n const sourceStart = startToken.start;\n const sourceEnd = endToken.end;\n if (!resolvedOptions.wholeWords || isWholeWordMatch(document.text, sourceStart, sourceEnd)) {\n matches.push({\n handle: document.handle,\n start: utf8ByteOffsetFromCodeUnitIndex(document.text, sourceStart),\n end: utf8ByteOffsetFromCodeUnitIndex(document.text, sourceEnd),\n });\n }\n searchStart = matchStart + Math.max(normalizedQuery.length, 1);\n }\n }\n\n return {\n query,\n options: resolvedOptions,\n matches,\n };\n}\n", "export enum PlatformFamily {\n Unknown = 0,\n Apple = 1,\n Windows = 2,\n Linux = 3,\n}\n\nexport function isMobileBrowser(): boolean {\n const navigatorWithUserAgentData = navigator as Navigator & {\n userAgentData?: {\n mobile?: boolean;\n };\n };\n if (navigatorWithUserAgentData.userAgentData?.mobile === true) {\n return true;\n }\n if (/Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent)) {\n return true;\n }\n return navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1;\n}\n\nexport function detectPlatformFamily(): PlatformFamily {\n const navigatorWithUserAgentData = navigator as Navigator & {\n userAgentData?: {\n platform?: string;\n };\n };\n const platform = (\n navigatorWithUserAgentData.userAgentData?.platform ??\n navigator.platform ??\n navigator.userAgent\n ).toLowerCase();\n if (\n platform.includes('mac') ||\n platform.includes('iphone') ||\n platform.includes('ipad') ||\n platform.includes('ipod') ||\n platform.includes('ios')\n ) {\n return PlatformFamily.Apple;\n }\n if (platform.includes('win')) {\n return PlatformFamily.Windows;\n }\n if (\n platform.includes('linux') ||\n platform.includes('android') ||\n platform.includes('x11') ||\n platform.includes('cros')\n ) {\n return PlatformFamily.Linux;\n }\n return PlatformFamily.Unknown;\n}\n\nexport function isPlatformShortcutKey(\n event: Pick<KeyboardEvent, 'ctrlKey' | 'metaKey' | 'altKey'>,\n platformFamily = detectPlatformFamily(),\n): boolean {\n if (event.altKey) {\n return false;\n }\n if (platformFamily === PlatformFamily.Apple) {\n return event.metaKey && !event.ctrlKey;\n }\n return event.ctrlKey && !event.metaKey;\n}\n", "import type {\n BridgeRuntime,\n OpenCanvasFindMatch,\n OpenCanvasFindState,\n OpenCanvasResolvedFindOptions,\n} from '../core-types';\nimport { DEFAULT_OPEN_CANVAS_FIND_OPTIONS } from './find-session';\nimport { isMobileBrowser, isPlatformShortcutKey } from './platform';\n\ntype FindOptionKey = keyof OpenCanvasResolvedFindOptions;\ntype FindIconKind = 'chevronUp' | 'chevronDown' | 'filter' | 'close';\n\ninterface FindDialogPalette {\n readonly colorScheme: 'dark' | 'light';\n readonly shellBackground: string;\n readonly shellBorder: string;\n readonly divider: string;\n readonly panelBackground: string;\n readonly text: string;\n readonly mutedText: string;\n readonly errorText: string;\n readonly buttonText: string;\n readonly buttonMutedText: string;\n readonly buttonActiveBackground: string;\n readonly buttonPlainHoverBackground: string;\n readonly filterButtonBackground: string;\n readonly filterButtonActiveBackground: string;\n readonly optionHoverBackground: string;\n readonly toggleTrackOff: string;\n readonly toggleTrackOn: string;\n readonly toggleThumb: string;\n}\n\nfunction isFindShortcut(event: Pick<KeyboardEvent, 'key' | 'ctrlKey' | 'metaKey' | 'altKey'>): boolean {\n return isPlatformShortcutKey(event) &&\n (event.key === 'f' || event.key === 'F');\n}\n\nfunction isNextShortcut(event: Pick<KeyboardEvent, 'key' | 'ctrlKey' | 'metaKey' | 'altKey' | 'shiftKey'>): boolean {\n return isPlatformShortcutKey(event) &&\n (event.key === 'g' || event.key === 'G');\n}\n\nfunction createSvgIcon(kind: FindIconKind): SVGSVGElement {\n const ns = 'http://www.w3.org/2000/svg';\n const svg = document.createElementNS(ns, 'svg');\n svg.setAttribute('viewBox', '0 0 16 16');\n svg.setAttribute('fill', 'none');\n svg.setAttribute('stroke', 'currentColor');\n svg.setAttribute('stroke-width', kind === 'filter' ? '1.6' : '1.8');\n svg.setAttribute('stroke-linecap', 'round');\n svg.setAttribute('stroke-linejoin', 'round');\n svg.setAttribute('aria-hidden', 'true');\n svg.style.display = 'block';\n svg.style.width = '16px';\n svg.style.height = '16px';\n\n const appendPath = (d: string): void => {\n const path = document.createElementNS(ns, 'path');\n path.setAttribute('d', d);\n svg.appendChild(path);\n };\n\n switch (kind) {\n case 'chevronUp':\n appendPath('M4.5 10.25L8 6.75L11.5 10.25');\n break;\n case 'chevronDown':\n appendPath('M4.5 5.75L8 9.25L11.5 5.75');\n break;\n case 'filter':\n appendPath('M3 4.5H13');\n appendPath('M5 8H11');\n appendPath('M6.75 11.5H9.25');\n break;\n case 'close':\n appendPath('M4.75 4.75L11.25 11.25');\n appendPath('M11.25 4.75L4.75 11.25');\n break;\n }\n\n return svg;\n}\n\nfunction createIconButton(\n label: string,\n icon: FindIconKind,\n variant: 'plain' | 'filter' = 'plain',\n): HTMLButtonElement {\n const button = document.createElement('button');\n button.type = 'button';\n button.setAttribute('aria-label', label);\n button.setAttribute('data-ed-find-icon-variant', variant);\n button.appendChild(createSvgIcon(icon));\n button.style.width = '32px';\n button.style.height = '32px';\n button.style.display = 'inline-flex';\n button.style.alignItems = 'center';\n button.style.justifyContent = 'center';\n button.style.padding = '0';\n button.style.border = 'none';\n button.style.borderRadius = '10px';\n button.style.background = 'transparent';\n button.style.outline = 'none';\n button.style.appearance = 'none';\n button.style.webkitAppearance = 'none';\n button.style.boxShadow = 'none';\n button.style.cursor = 'pointer';\n button.style.userSelect = 'none';\n button.style.webkitUserSelect = 'none';\n button.style.flex = '0 0 auto';\n button.style.transition = 'background 120ms ease, color 120ms ease, opacity 120ms ease';\n button.dataset.edHovered = '0';\n return button;\n}\n\nfunction sameMatch(left: OpenCanvasFindMatch | null, right: OpenCanvasFindMatch | null): boolean {\n return left?.handle === right?.handle &&\n left?.start === right?.start &&\n left?.end === right?.end;\n}\n\nexport class DesktopFindDialogController {\n private readonly runtime: BridgeRuntime;\n private readonly root: HTMLDivElement;\n private readonly input: HTMLInputElement;\n private readonly status: HTMLSpanElement;\n private readonly advancedPanel: HTMLDivElement;\n private readonly previousButton: HTMLButtonElement;\n private readonly nextButton: HTMLButtonElement;\n private readonly disclosureButton: HTMLButtonElement;\n private readonly closeButton: HTMLButtonElement;\n private readonly optionButtons: Record<FindOptionKey, HTMLButtonElement>;\n private readonly optionTracks: Record<FindOptionKey, HTMLSpanElement>;\n private readonly optionThumbs: Record<FindOptionKey, HTMLSpanElement>;\n private readonly themeMedia: MediaQueryList | null;\n private matches: OpenCanvasFindMatch[] = [];\n private activeMatchIndex = -1;\n private options: OpenCanvasResolvedFindOptions = { ...DEFAULT_OPEN_CANVAS_FIND_OPTIONS };\n private optionsExpanded = false;\n\n private readonly handleThemeChange = (): void => {\n this.syncThemeUi();\n };\n\n public constructor(runtime: BridgeRuntime, _canvas: HTMLCanvasElement) {\n this.runtime = runtime;\n const parent = document.body ?? document.documentElement;\n if (!(parent instanceof HTMLElement)) {\n throw new Error('Expected document root for desktop Find dialog.');\n }\n\n const root = document.createElement('div');\n root.setAttribute('data-ed-find-dialog', '1');\n root.setAttribute('data-ed-open', '0');\n root.setAttribute('role', 'dialog');\n root.setAttribute('aria-label', 'Find on page');\n root.style.position = 'fixed';\n root.style.top = '6px';\n root.style.right = '6px';\n root.style.display = 'none';\n root.style.flexDirection = 'column';\n root.style.width = 'min(356px, calc(100vw - 12px))';\n root.style.boxSizing = 'border-box';\n root.style.borderRadius = '14px';\n root.style.border = '1px solid transparent';\n root.style.overflow = 'hidden';\n root.style.pointerEvents = 'auto';\n root.style.zIndex = '2147483647';\n root.style.boxShadow = '0 10px 24px rgba(0, 0, 0, 0.22)';\n root.style.backdropFilter = 'blur(10px)';\n root.style.font = '500 13px/1.2 system-ui, sans-serif';\n\n const topRow = document.createElement('div');\n topRow.style.display = 'flex';\n topRow.style.alignItems = 'center';\n topRow.style.minHeight = '42px';\n topRow.style.padding = '0 8px 0 12px';\n\n const searchShell = document.createElement('div');\n searchShell.style.flex = '1 1 auto';\n searchShell.style.minWidth = '0';\n searchShell.style.display = 'flex';\n searchShell.style.alignItems = 'center';\n searchShell.style.paddingRight = '6px';\n\n const input = document.createElement('input');\n input.type = 'text';\n input.autocomplete = 'off';\n input.spellcheck = false;\n input.placeholder = 'Find text';\n input.setAttribute('aria-label', 'Find query');\n input.style.width = '100%';\n input.style.minWidth = '0';\n input.style.height = '24px';\n input.style.padding = '0';\n input.style.margin = '0';\n input.style.border = 'none';\n input.style.outline = 'none';\n input.style.background = 'transparent';\n input.style.font = '500 13px/1.2 system-ui, sans-serif';\n searchShell.appendChild(input);\n\n const status = document.createElement('span');\n status.setAttribute('aria-live', 'polite');\n status.style.minWidth = '36px';\n status.style.textAlign = 'center';\n status.style.font = '500 13px/1.2 system-ui, sans-serif';\n status.style.padding = '0 4px 0 2px';\n\n const divider = document.createElement('div');\n divider.setAttribute('aria-hidden', 'true');\n divider.style.width = '1px';\n divider.style.height = '20px';\n divider.style.margin = '0 6px 0 4px';\n divider.style.flex = '0 0 auto';\n\n const previousButton = createIconButton('Previous result', 'chevronUp');\n const nextButton = createIconButton('Next result', 'chevronDown');\n const disclosureButton = createIconButton('Show advanced find options', 'filter', 'filter');\n const closeButton = createIconButton('Close find dialog', 'close');\n\n const navigationGroup = document.createElement('div');\n navigationGroup.style.display = 'flex';\n navigationGroup.style.alignItems = 'center';\n navigationGroup.style.gap = '2px';\n navigationGroup.append(previousButton, nextButton, disclosureButton, closeButton);\n\n topRow.append(searchShell, status, divider, navigationGroup);\n\n const advancedPanel = document.createElement('div');\n advancedPanel.style.display = 'none';\n advancedPanel.style.flexDirection = 'column';\n advancedPanel.style.padding = '2px 0';\n\n const createToggleRow = (\n key: FindOptionKey,\n label: string,\n ): { readonly button: HTMLButtonElement; readonly track: HTMLSpanElement; readonly thumb: HTMLSpanElement } => {\n const button = document.createElement('button');\n button.type = 'button';\n button.setAttribute('data-ed-find-option', key);\n button.setAttribute('aria-label', label);\n button.setAttribute('role', 'switch');\n button.style.width = '100%';\n button.style.height = '38px';\n button.style.display = 'flex';\n button.style.alignItems = 'center';\n button.style.justifyContent = 'space-between';\n button.style.padding = '0 12px';\n button.style.border = 'none';\n button.style.background = 'transparent';\n button.style.cursor = 'pointer';\n button.style.textAlign = 'left';\n button.style.font = '500 12px/1.2 system-ui, sans-serif';\n\n const labelSpan = document.createElement('span');\n labelSpan.textContent = label;\n labelSpan.style.pointerEvents = 'none';\n labelSpan.style.font = 'inherit';\n\n const track = document.createElement('span');\n track.setAttribute('aria-hidden', 'true');\n track.style.position = 'relative';\n track.style.display = 'inline-flex';\n track.style.alignItems = 'center';\n track.style.width = '30px';\n track.style.height = '18px';\n track.style.borderRadius = '999px';\n track.style.transition = 'background 120ms ease';\n track.style.pointerEvents = 'none';\n\n const thumb = document.createElement('span');\n thumb.style.position = 'absolute';\n thumb.style.top = '2px';\n thumb.style.left = '2px';\n thumb.style.width = '14px';\n thumb.style.height = '14px';\n thumb.style.borderRadius = '999px';\n thumb.style.boxShadow = '0 1px 2px rgba(0, 0, 0, 0.24)';\n thumb.style.transition = 'transform 120ms ease';\n thumb.style.pointerEvents = 'none';\n track.appendChild(thumb);\n\n button.append(labelSpan, track);\n return { button, track, thumb };\n };\n\n const highlightAllRow = createToggleRow('highlightAll', 'Highlight all');\n const matchCaseRow = createToggleRow('matchCase', 'Match case');\n const matchDiacriticsRow = createToggleRow('matchDiacritics', 'Match diacritics');\n const wholeWordsRow = createToggleRow('wholeWords', 'Match whole word');\n const optionButtons = {\n highlightAll: highlightAllRow.button,\n matchCase: matchCaseRow.button,\n matchDiacritics: matchDiacriticsRow.button,\n wholeWords: wholeWordsRow.button,\n } satisfies Record<FindOptionKey, HTMLButtonElement>;\n const optionTracks = {\n highlightAll: highlightAllRow.track,\n matchCase: matchCaseRow.track,\n matchDiacritics: matchDiacriticsRow.track,\n wholeWords: wholeWordsRow.track,\n } satisfies Record<FindOptionKey, HTMLSpanElement>;\n const optionThumbs = {\n highlightAll: highlightAllRow.thumb,\n matchCase: matchCaseRow.thumb,\n matchDiacritics: matchDiacriticsRow.thumb,\n wholeWords: wholeWordsRow.thumb,\n } satisfies Record<FindOptionKey, HTMLSpanElement>;\n advancedPanel.append(\n optionButtons.highlightAll,\n optionButtons.matchCase,\n optionButtons.matchDiacritics,\n optionButtons.wholeWords,\n );\n\n root.append(topRow, advancedPanel);\n parent.appendChild(root);\n\n const preserveInputFocus = (): void => {\n this.restoreInputFocus(false);\n };\n const setButtonHovered = (\n button: HTMLButtonElement,\n hovered: boolean,\n ): void => {\n button.dataset.edHovered = hovered ? '1' : '0';\n this.syncStatusUi();\n };\n const bindNonBlurringButton = (\n button: HTMLButtonElement,\n callback: () => void,\n ): void => {\n button.addEventListener('pointerdown', (event) => {\n event.preventDefault();\n });\n button.addEventListener('pointerenter', () => {\n setButtonHovered(button, true);\n });\n button.addEventListener('pointerleave', () => {\n setButtonHovered(button, false);\n });\n button.addEventListener('click', () => {\n callback();\n preserveInputFocus();\n });\n };\n\n root.addEventListener('keydown', (event) => {\n event.stopPropagation();\n });\n input.addEventListener('input', () => {\n this.refreshMatches(false);\n });\n input.addEventListener('keydown', (event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n this.step(event.shiftKey ? -1 : 1);\n return;\n }\n if (event.key === 'ArrowDown' && !event.altKey && !event.ctrlKey && !event.metaKey) {\n event.preventDefault();\n this.step(1);\n return;\n }\n if (event.key === 'ArrowUp' && !event.altKey && !event.ctrlKey && !event.metaKey) {\n event.preventDefault();\n this.step(-1);\n return;\n }\n if (event.key === 'Escape') {\n event.preventDefault();\n this.hide();\n }\n });\n bindNonBlurringButton(previousButton, () => {\n this.step(-1);\n });\n bindNonBlurringButton(nextButton, () => {\n this.step(1);\n });\n bindNonBlurringButton(disclosureButton, () => {\n this.optionsExpanded = !this.optionsExpanded;\n this.syncOptionUi();\n });\n bindNonBlurringButton(closeButton, () => {\n this.hide();\n });\n for (const [key, button] of Object.entries(optionButtons) as [FindOptionKey, HTMLButtonElement][]) {\n bindNonBlurringButton(button, () => {\n this.options = {\n ...this.options,\n [key]: !this.options[key],\n };\n this.syncOptionUi();\n this.refreshMatches(true);\n });\n }\n\n this.root = root;\n this.input = input;\n this.status = status;\n this.advancedPanel = advancedPanel;\n this.previousButton = previousButton;\n this.nextButton = nextButton;\n this.disclosureButton = disclosureButton;\n this.closeButton = closeButton;\n this.optionButtons = optionButtons;\n this.optionTracks = optionTracks;\n this.optionThumbs = optionThumbs;\n this.themeMedia = typeof window.matchMedia === 'function'\n ? window.matchMedia('(prefers-color-scheme: dark)')\n : null;\n this.themeMedia?.addEventListener?.('change', this.handleThemeChange);\n this.syncOptionUi();\n this.syncThemeUi();\n }\n\n public consumeGlobalKeyEvent(event: KeyboardEvent, type: 'down' | 'up'): boolean {\n if (isMobileBrowser()) {\n return false;\n }\n\n if (isFindShortcut(event)) {\n event.preventDefault();\n event.stopPropagation();\n if (type === 'down') {\n this.show();\n }\n return true;\n }\n\n if (type === 'down' && this.isOpen() && !event.altKey && !event.ctrlKey && !event.metaKey && event.key === 'F3') {\n event.preventDefault();\n this.step(event.shiftKey ? -1 : 1);\n return true;\n }\n\n if (type === 'down' && this.isOpen() && isNextShortcut(event)) {\n event.preventDefault();\n this.step(event.shiftKey ? -1 : 1);\n return true;\n }\n\n if (this.containsTarget(event.target)) {\n return true;\n }\n\n return false;\n }\n\n public containsTarget(target: EventTarget | null): boolean {\n return target instanceof Node && this.root.contains(target);\n }\n\n public destroy(): void {\n this.themeMedia?.removeEventListener?.('change', this.handleThemeChange);\n this.root.remove();\n }\n\n private getPalette(): FindDialogPalette {\n const darkMode = this.themeMedia?.matches ?? true;\n if (darkMode) {\n return {\n colorScheme: 'dark',\n shellBackground: 'rgba(36, 36, 36, 0.98)',\n shellBorder: 'rgba(255, 255, 255, 0.08)',\n divider: 'rgba(255, 255, 255, 0.12)',\n panelBackground: 'rgba(0, 0, 0, 0.10)',\n text: '#f5f5f5',\n mutedText: '#cfcfcf',\n errorText: '#fca5a5',\n buttonText: '#d9d9d9',\n buttonMutedText: '#7c7c7c',\n buttonActiveBackground: 'rgba(255, 255, 255, 0.08)',\n buttonPlainHoverBackground: 'rgba(255, 255, 255, 0.06)',\n filterButtonBackground: 'transparent',\n filterButtonActiveBackground: 'rgba(255, 255, 255, 0.20)',\n optionHoverBackground: 'rgba(255, 255, 255, 0.03)',\n toggleTrackOff: '#5a5a5a',\n toggleTrackOn: '#818cf8',\n toggleThumb: '#ffffff',\n };\n }\n return {\n colorScheme: 'light',\n shellBackground: 'rgba(251, 251, 251, 0.98)',\n shellBorder: 'rgba(15, 23, 42, 0.12)',\n divider: 'rgba(15, 23, 42, 0.12)',\n panelBackground: 'rgba(15, 23, 42, 0.03)',\n text: '#111827',\n mutedText: '#4b5563',\n errorText: '#dc2626',\n buttonText: '#374151',\n buttonMutedText: '#9ca3af',\n buttonActiveBackground: 'rgba(15, 23, 42, 0.08)',\n buttonPlainHoverBackground: 'rgba(15, 23, 42, 0.05)',\n filterButtonBackground: 'transparent',\n filterButtonActiveBackground: 'rgba(15, 23, 42, 0.16)',\n optionHoverBackground: 'rgba(15, 23, 42, 0.03)',\n toggleTrackOff: '#d1d5db',\n toggleTrackOn: '#818cf8',\n toggleThumb: '#ffffff',\n };\n }\n\n private isOpen(): boolean {\n return this.root.style.display !== 'none';\n }\n\n private restoreInputFocus(selectAll: boolean): void {\n const selectionStart = this.input.selectionStart ?? this.input.value.length;\n const selectionEnd = this.input.selectionEnd ?? selectionStart;\n queueMicrotask(() => {\n if (!this.isOpen()) {\n return;\n }\n this.input.focus({ preventScroll: true });\n if (selectAll) {\n this.input.select();\n return;\n }\n this.input.setSelectionRange(selectionStart, selectionEnd);\n });\n }\n\n private syncThemeUi(): void {\n const palette = this.getPalette();\n this.root.style.colorScheme = palette.colorScheme;\n this.root.style.background = palette.shellBackground;\n this.root.style.borderColor = palette.shellBorder;\n this.root.style.color = palette.text;\n this.advancedPanel.style.background = palette.panelBackground;\n this.advancedPanel.style.borderTop = this.optionsExpanded ? `1px solid ${palette.divider}` : 'none';\n this.input.style.color = palette.text;\n this.input.style.caretColor = palette.text;\n this.status.style.color = palette.mutedText;\n this.previousButton.style.color = palette.buttonText;\n this.nextButton.style.color = palette.buttonText;\n this.closeButton.style.color = palette.buttonText;\n this.disclosureButton.style.color = palette.buttonText;\n this.previousButton.style.background = 'transparent';\n this.nextButton.style.background = 'transparent';\n this.closeButton.style.background = 'transparent';\n this.disclosureButton.style.background = this.optionsExpanded\n ? palette.filterButtonActiveBackground\n : palette.filterButtonBackground;\n this.syncOptionUi();\n this.syncStatusUi();\n }\n\n private syncOptionUi(): void {\n const palette = this.getPalette();\n this.root.setAttribute('data-ed-open', this.isOpen() ? '1' : '0');\n this.advancedPanel.style.display = this.optionsExpanded ? 'flex' : 'none';\n this.advancedPanel.style.borderTop = this.optionsExpanded ? `1px solid ${palette.divider}` : 'none';\n this.disclosureButton.setAttribute(\n 'aria-label',\n this.optionsExpanded ? 'Hide advanced find options' : 'Show advanced find options',\n );\n for (const [key, button] of Object.entries(this.optionButtons) as [FindOptionKey, HTMLButtonElement][]) {\n const pressed = this.options[key];\n button.setAttribute('aria-checked', pressed ? 'true' : 'false');\n button.style.color = palette.text;\n button.style.background = 'transparent';\n const track = this.optionTracks[key];\n const thumb = this.optionThumbs[key];\n track.style.background = pressed ? palette.toggleTrackOn : palette.toggleTrackOff;\n thumb.style.background = palette.toggleThumb;\n thumb.style.transform = pressed ? 'translateX(12px)' : 'translateX(0)';\n }\n }\n\n private syncStatusUi(): void {\n const palette = this.getPalette();\n const query = this.input.value;\n if (query.length === 0) {\n this.status.textContent = '';\n this.status.style.color = palette.mutedText;\n } else if (this.matches.length === 0 || this.activeMatchIndex < 0) {\n this.status.textContent = '0/0';\n this.status.style.color = palette.errorText;\n } else {\n this.status.textContent = `${String(this.activeMatchIndex + 1)}/${String(this.matches.length)}`;\n this.status.style.color = palette.mutedText;\n }\n const hasMatches = this.matches.length > 0;\n const syncButtonState = (button: HTMLButtonElement, variant: 'plain' | 'filter'): void => {\n button.disabled = !hasMatches && button !== this.disclosureButton && button !== this.closeButton;\n const enabled = !button.disabled;\n const hovered = button.dataset.edHovered === '1';\n button.style.opacity = enabled ? '1' : '0.45';\n button.style.cursor = enabled ? 'pointer' : 'default';\n if (variant === 'filter') {\n if (this.optionsExpanded) {\n button.style.background = palette.filterButtonActiveBackground;\n } else if (enabled && hovered) {\n button.style.background = palette.buttonPlainHoverBackground;\n } else {\n button.style.background = palette.filterButtonBackground;\n }\n } else {\n button.style.background = enabled && hovered\n ? palette.buttonPlainHoverBackground\n : 'transparent';\n }\n button.style.color = enabled ? palette.buttonText : palette.buttonMutedText;\n };\n syncButtonState(this.previousButton, 'plain');\n syncButtonState(this.nextButton, 'plain');\n syncButtonState(this.disclosureButton, 'filter');\n syncButtonState(this.closeButton, 'plain');\n }\n\n private show(): void {\n this.root.style.display = 'flex';\n this.root.setAttribute('data-ed-open', '1');\n this.syncThemeUi();\n this.refreshMatches(true);\n this.restoreInputFocus(true);\n }\n\n private hide(): void {\n this.root.style.display = 'none';\n this.root.setAttribute('data-ed-open', '0');\n this.previousButton.dataset.edHovered = '0';\n this.nextButton.dataset.edHovered = '0';\n this.disclosureButton.dataset.edHovered = '0';\n this.closeButton.dataset.edHovered = '0';\n this.runtime.openCanvasApi.setFindState(null);\n }\n\n private refreshMatches(preserveCurrentMatch: boolean): void {\n const query = this.input.value;\n const previousMatch =\n preserveCurrentMatch && this.activeMatchIndex >= 0\n ? this.matches[this.activeMatchIndex] ?? null\n : null;\n const results = this.runtime.openCanvasApi.findText(query, this.options);\n this.options = { ...results.options };\n this.matches = results.matches.map((match) => ({ ...match }));\n if (this.matches.length === 0) {\n this.activeMatchIndex = -1;\n this.runtime.openCanvasApi.setFindState(null);\n this.syncOptionUi();\n this.syncStatusUi();\n this.restoreInputFocus(false);\n return;\n }\n\n if (previousMatch !== null) {\n const preservedIndex = this.matches.findIndex((entry) => sameMatch(entry, previousMatch));\n this.activeMatchIndex = preservedIndex >= 0 ? preservedIndex : 0;\n } else if (this.activeMatchIndex < 0 || this.activeMatchIndex >= this.matches.length) {\n this.activeMatchIndex = 0;\n }\n\n this.applyCurrentState(true);\n }\n\n private step(delta: 1 | -1): void {\n if (this.matches.length === 0) {\n this.refreshMatches(false);\n return;\n }\n this.activeMatchIndex = (this.activeMatchIndex + delta + this.matches.length) % this.matches.length;\n this.applyCurrentState(true);\n }\n\n private applyCurrentState(revealActive: boolean): void {\n const state: OpenCanvasFindState | null =\n this.matches.length === 0 || this.activeMatchIndex < 0 || this.activeMatchIndex >= this.matches.length\n ? null\n : {\n query: this.input.value,\n options: { ...this.options },\n matches: this.matches.map((match) => ({ ...match })),\n activeMatchIndex: this.activeMatchIndex,\n };\n if (state === null || !this.runtime.openCanvasApi.setFindState(state, revealActive)) {\n this.matches = [];\n this.activeMatchIndex = -1;\n this.runtime.openCanvasApi.setFindState(null);\n }\n this.syncOptionUi();\n this.syncStatusUi();\n this.restoreInputFocus(false);\n }\n}\n", "const PULL_TO_REFRESH_ID = 'effindom-pull-to-refresh';\nconst PULL_TO_REFRESH_TRIGGER_DISTANCE = 88;\nconst PULL_TO_REFRESH_MAX_TRAVEL = 78;\n\nexport const PULL_TO_REFRESH_THRESHOLD = PULL_TO_REFRESH_TRIGGER_DISTANCE;\n\ninterface PullToRefreshElements {\n readonly root: HTMLDivElement;\n readonly icon: HTMLSpanElement;\n}\n\nfunction ensurePullToRefreshElements(): PullToRefreshElements {\n const existing = document.getElementById(PULL_TO_REFRESH_ID);\n if (existing instanceof HTMLDivElement) {\n const icon = existing.firstElementChild;\n if (icon instanceof HTMLSpanElement) {\n return { root: existing, icon };\n }\n existing.remove();\n }\n\n const root = document.createElement('div');\n const icon = document.createElement('span');\n root.id = PULL_TO_REFRESH_ID;\n root.hidden = true;\n root.dataset.visible = 'false';\n root.dataset.armed = 'false';\n root.setAttribute('aria-hidden', 'true');\n root.style.position = 'fixed';\n root.style.left = '50%';\n root.style.top = '12px';\n root.style.width = '48px';\n root.style.height = '48px';\n root.style.display = 'flex';\n root.style.alignItems = 'center';\n root.style.justifyContent = 'center';\n root.style.borderRadius = '999px';\n root.style.background = 'rgba(248, 250, 252, 0.96)';\n root.style.color = '#0f172a';\n root.style.boxShadow = '0 10px 28px rgba(15, 23, 42, 0.22)';\n root.style.backdropFilter = 'blur(12px)';\n root.style.pointerEvents = 'none';\n root.style.opacity = '0';\n root.style.transform = 'translate(-50%, -18px)';\n root.style.transition = 'opacity 120ms ease, transform 120ms ease';\n root.style.zIndex = '2147483647';\n\n icon.textContent = '\u21BB';\n icon.style.display = 'block';\n icon.style.font = '600 24px/1 system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif';\n icon.style.transform = 'rotate(0deg)';\n icon.style.transition = 'transform 90ms linear';\n root.appendChild(icon);\n (document.body ?? document.documentElement).appendChild(root);\n return { root, icon };\n}\n\nexport interface PullToRefreshOverlay {\n show(pullDistance: number): void;\n hide(immediate?: boolean): void;\n destroy(): void;\n}\n\nexport function createPullToRefreshOverlay(): PullToRefreshOverlay {\n const { root, icon } = ensurePullToRefreshElements();\n let visible = false;\n let hideTimer = 0;\n\n return {\n show(pullDistance: number): void {\n if (hideTimer !== 0) {\n window.clearTimeout(hideTimer);\n hideTimer = 0;\n }\n visible = true;\n const distance = Math.max(0, pullDistance);\n const normalized = Math.max(0, Math.min(distance / PULL_TO_REFRESH_TRIGGER_DISTANCE, 1));\n const travel = Math.min(distance * 0.75, PULL_TO_REFRESH_MAX_TRAVEL);\n root.hidden = false;\n root.dataset.visible = 'true';\n root.dataset.armed = normalized >= 1 ? 'true' : 'false';\n root.style.transition = 'none';\n root.style.opacity = distance <= 0 ? '0' : `${0.15 + (normalized * 0.85)}`;\n root.style.transform = `translate(-50%, ${travel - 18}px)`;\n root.style.background = normalized >= 1 ? 'rgba(219, 234, 254, 0.98)' : 'rgba(248, 250, 252, 0.96)';\n icon.style.transform = `rotate(${Math.round(normalized * 360)}deg)`;\n },\n hide(immediate = false): void {\n if (!visible && root.hidden) {\n return;\n }\n visible = false;\n root.dataset.visible = 'false';\n root.dataset.armed = 'false';\n root.style.transition = immediate\n ? 'none'\n : 'opacity 90ms ease-out, transform 90ms ease-out, background 90ms ease-out';\n root.style.opacity = '0';\n root.style.transform = 'translate(-50%, -18px)';\n root.style.background = 'rgba(248, 250, 252, 0.96)';\n icon.style.transform = 'rotate(0deg)';\n if (immediate) {\n if (hideTimer !== 0) {\n window.clearTimeout(hideTimer);\n hideTimer = 0;\n }\n root.hidden = true;\n return;\n }\n hideTimer = window.setTimeout(() => {\n if (root.dataset.visible === 'false') {\n root.hidden = true;\n }\n hideTimer = 0;\n }, 100);\n },\n destroy(): void {\n if (hideTimer !== 0) {\n window.clearTimeout(hideTimer);\n }\n root.remove();\n },\n };\n}\n", "const DEFAULT_LOGICAL_WIDTH = 320;\nconst DEFAULT_LOGICAL_HEIGHT = 220;\n\nexport function ensureCanvasLogicalSize(canvas: HTMLCanvasElement): void {\n const rect = canvas.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) {\n canvas.style.width = `${String(DEFAULT_LOGICAL_WIDTH)}px`;\n canvas.style.height = `${String(DEFAULT_LOGICAL_HEIGHT)}px`;\n }\n}\n\nexport function getCanvasSizeSource(canvas: HTMLCanvasElement): HTMLElement | HTMLCanvasElement {\n const source = canvas.closest('[data-effindom-canvas-size-source]');\n return source instanceof HTMLElement ? source : canvas;\n}\n\nexport function readCanvasLogicalSize(canvas: HTMLCanvasElement): { readonly width: number; readonly height: number } {\n const sizeSource = getCanvasSizeSource(canvas);\n if (sizeSource.clientWidth > 0 && sizeSource.clientHeight > 0) {\n return {\n width: sizeSource.clientWidth,\n height: sizeSource.clientHeight,\n };\n }\n const styleWidth = Number.parseFloat(canvas.style.width);\n const styleHeight = Number.parseFloat(canvas.style.height);\n if (Number.isFinite(styleWidth) && styleWidth > 0 && Number.isFinite(styleHeight) && styleHeight > 0) {\n return { width: styleWidth, height: styleHeight };\n }\n return {\n width: canvas.clientWidth || DEFAULT_LOGICAL_WIDTH,\n height: canvas.clientHeight || DEFAULT_LOGICAL_HEIGHT,\n };\n}\n\nexport function getPointerPosition(\n canvas: HTMLCanvasElement,\n event: { readonly clientX: number; readonly clientY: number },\n): { readonly x: number; readonly y: number } {\n const sizeSource = getCanvasSizeSource(canvas);\n const rect = sizeSource.getBoundingClientRect();\n const logicalSize = readCanvasLogicalSize(canvas);\n const contentLeft = rect.left + sizeSource.clientLeft;\n const contentTop = rect.top + sizeSource.clientTop;\n const displayWidth = sizeSource.clientWidth || (rect.width - (sizeSource.clientLeft + sizeSource.clientLeft)) || DEFAULT_LOGICAL_WIDTH;\n const displayHeight = sizeSource.clientHeight || (rect.height - (sizeSource.clientTop + sizeSource.clientTop)) || DEFAULT_LOGICAL_HEIGHT;\n const x = displayWidth > 0 ? ((event.clientX - contentLeft) / displayWidth) * logicalSize.width : 0;\n const y = displayHeight > 0 ? ((event.clientY - contentTop) / displayHeight) * logicalSize.height : 0;\n return { x, y };\n}\n\nexport function isPointerInsideCanvas(\n canvas: HTMLCanvasElement,\n event: { readonly clientX: number; readonly clientY: number },\n): boolean {\n const rect = getCanvasSizeSource(canvas).getBoundingClientRect();\n return event.clientX >= rect.left &&\n event.clientX <= rect.right &&\n event.clientY >= rect.top &&\n event.clientY <= rect.bottom;\n}\n\nexport function normalizeWheelDelta(event: WheelEvent, canvas: HTMLCanvasElement): { readonly x: number; readonly y: number } {\n let deltaX = event.deltaX;\n let deltaY = event.deltaY;\n if (event.deltaMode === WheelEvent.DOM_DELTA_LINE) {\n deltaX *= 16.0;\n deltaY *= 16.0;\n } else if (event.deltaMode === WheelEvent.DOM_DELTA_PAGE) {\n const logicalSize = readCanvasLogicalSize(canvas);\n deltaX *= logicalSize.width;\n deltaY *= logicalSize.height;\n }\n if (event.shiftKey && Math.abs(deltaX) < 0.001 && Math.abs(deltaY) > 0.0) {\n return { x: deltaY, y: 0.0 };\n }\n return { x: deltaX, y: deltaY };\n}\n", "import type { BridgeRuntime } from '../../core-types';\nimport type { BridgeInteractionState } from '../local-types';\nimport { DesktopFindDialogController } from '../find-dialog';\nimport { computeModifiers } from '../utils/encoding';\nimport { writeUtf8ToHeap } from '../utils/heap';\n\nconst UI_KEY_EVENT_DOWN = 1;\nconst UI_KEY_EVENT_UP = 2;\n\nfunction currentInteractionTimeMs(): bigint {\n return BigInt(Math.floor(performance.now()));\n}\n\nfunction isVerticalCanvasNavigationKey(key: string): boolean {\n return key === 'ArrowUp' ||\n key === 'ArrowDown' ||\n key === 'PageUp' ||\n key === 'PageDown' ||\n key === 'Home' ||\n key === 'End';\n}\n\nfunction isTextNavigationKey(key: string): boolean {\n return key === 'ArrowLeft' ||\n key === 'ArrowRight' ||\n key === 'ArrowUp' ||\n key === 'ArrowDown' ||\n key === 'PageUp' ||\n key === 'PageDown' ||\n key === 'Home' ||\n key === 'End';\n}\n\nexport function installKeyAndWindowHandlers(\n runtime: BridgeRuntime,\n interactionState: BridgeInteractionState,\n desktopFindDialog: DesktopFindDialogController,\n): () => void {\n const { ui } = runtime;\n\n const forwardKeyEvent = (type: number) => (event: KeyboardEvent): void => {\n if (desktopFindDialog.consumeGlobalKeyEvent(event, type === UI_KEY_EVENT_DOWN ? 'down' : 'up')) {\n return;\n }\n const modifiers = computeModifiers(event);\n const activeTextHandle = interactionState.getActiveTextHandle();\n const activeTextEditable = interactionState.getActiveTextEditable();\n const activeTextMultiline = interactionState.getActiveTextMultiline();\n const activeTextInputFocused = interactionState.isActiveTextInputFocused();\n const activeEditableTextOwnsNativeEditingKey =\n activeTextHandle !== null &&\n activeTextEditable &&\n activeTextInputFocused &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey &&\n (\n event.key.length === 1 ||\n (activeTextMultiline && event.key === 'Enter') ||\n event.key === 'Backspace' ||\n event.key === 'Delete'\n );\n const activeEditableTextNeedsRuntimeEditingFallback =\n activeTextHandle !== null &&\n activeTextEditable &&\n !activeTextInputFocused &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey &&\n (\n event.key.length === 1 ||\n (activeTextMultiline && event.key === 'Enter') ||\n event.key === 'Backspace' ||\n event.key === 'Delete'\n );\n if (activeEditableTextOwnsNativeEditingKey) {\n if (\n type === UI_KEY_EVENT_DOWN &&\n (event.key === 'Backspace' || event.key === 'Delete') &&\n interactionState.applyActiveTextDeletion(event.key === 'Delete')\n ) {\n event.preventDefault();\n }\n return;\n }\n const activeTextOwnsRuntimeNavigationKey =\n activeTextHandle !== null &&\n isTextNavigationKey(event.key);\n const activeReadonlyTextOwnsRuntimeKey =\n activeTextHandle !== null &&\n !activeTextEditable &&\n (\n event.key.length === 1 ||\n event.key === 'Backspace' ||\n event.key === 'Delete' ||\n isTextNavigationKey(event.key)\n );\n if (\n activeEditableTextNeedsRuntimeEditingFallback ||\n activeTextOwnsRuntimeNavigationKey ||\n activeReadonlyTextOwnsRuntimeKey\n ) {\n event.preventDefault();\n }\n ui._ui_set_interaction_time(currentInteractionTimeMs());\n const shouldAlwaysPreventDefault =\n event.key === 'Tab' ||\n ((event.ctrlKey || event.metaKey) &&\n (\n event.key === 'c' || event.key === 'C' ||\n event.key === 'a' || event.key === 'A' ||\n event.key === 'x' || event.key === 'X' ||\n event.key === 'v' || event.key === 'V' ||\n event.key === 'z' || event.key === 'Z' ||\n event.key === 'y' || event.key === 'Y'\n ));\n if (shouldAlwaysPreventDefault) {\n event.preventDefault();\n }\n const heapString = writeUtf8ToHeap(ui, event.key);\n let callbackHandled = false;\n try {\n ui._ui_on_key_event(type, heapString.ptr, heapString.len, modifiers);\n if (\n !activeEditableTextNeedsRuntimeEditingFallback &&\n !activeTextOwnsRuntimeNavigationKey &&\n !activeReadonlyTextOwnsRuntimeKey\n ) {\n callbackHandled = window.__effindomCallbacks?.onKeyEventWithKey?.(type, event.key, modifiers) === true;\n }\n } finally {\n heapString.dispose();\n }\n if (\n type === UI_KEY_EVENT_DOWN &&\n (\n callbackHandled ||\n (!event.ctrlKey && !event.altKey && !event.metaKey && isVerticalCanvasNavigationKey(event.key))\n )\n ) {\n event.preventDefault();\n }\n runtime.commitFrame();\n if (interactionState.getActiveTextHandle() !== null && !interactionState.isActiveTextInputFocused()) {\n interactionState.refocusActiveTextInput();\n }\n };\n\n const handleKeyDown = forwardKeyEvent(UI_KEY_EVENT_DOWN);\n const handleKeyUp = forwardKeyEvent(UI_KEY_EVENT_UP);\n const keyListenerCapture = true;\n const reconcileFindSelection = (): void => {\n requestAnimationFrame(() => {\n runtime.syncFindSelection(true);\n });\n };\n const handleWindowBlur = (): void => {\n if (interactionState.getActiveTextHandle() === null) {\n reconcileFindSelection();\n return;\n }\n ui._ui_request_focus(0n);\n runtime.commitFrame();\n reconcileFindSelection();\n };\n const handleWindowFocus = (): void => {\n reconcileFindSelection();\n };\n const handleResize = (): void => {\n runtime.updateCanvasSize();\n runtime.commitFrame();\n };\n\n window.addEventListener('keydown', handleKeyDown, keyListenerCapture);\n window.addEventListener('keyup', handleKeyUp, keyListenerCapture);\n window.addEventListener('blur', handleWindowBlur);\n window.addEventListener('focus', handleWindowFocus);\n window.addEventListener('resize', handleResize);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown, keyListenerCapture);\n window.removeEventListener('keyup', handleKeyUp, keyListenerCapture);\n window.removeEventListener('blur', handleWindowBlur);\n window.removeEventListener('focus', handleWindowFocus);\n window.removeEventListener('resize', handleResize);\n };\n}\n", "import type { BridgeRuntime } from '../core-types';\n\nexport function commitIfVisualWork(runtime: BridgeRuntime): boolean {\n if (!runtime.uiHasPendingVisualWork()) {\n return false;\n }\n runtime.commitFrame();\n return true;\n}\n\n", "export class PointerMoveCoalescer<T> {\n private pendingMove: T | null = null;\n private frameScheduled = false;\n\n constructor(private readonly flushMove: (move: T) => void) {}\n\n enqueue(move: T): void {\n this.pendingMove = move;\n this.scheduleFlush();\n }\n\n takePending(): T | null {\n const pending = this.pendingMove;\n this.pendingMove = null;\n return pending;\n }\n\n clear(): void {\n this.pendingMove = null;\n }\n\n private scheduleFlush(): void {\n if (this.frameScheduled) {\n return;\n }\n this.frameScheduled = true;\n requestAnimationFrame(() => {\n this.frameScheduled = false;\n const pending = this.pendingMove;\n this.pendingMove = null;\n if (pending === null) {\n return;\n }\n this.flushMove(pending);\n if (this.pendingMove !== null) {\n this.scheduleFlush();\n }\n });\n }\n}\n\n", "import type { BridgeRuntime } from '../../core-types';\nimport { handleToBigInt } from '../utils/encoding';\n\nfunction pointInSemanticBounds(\n bounds: { readonly x: number; readonly y: number; readonly width: number; readonly height: number },\n x: number,\n y: number,\n): boolean {\n return x >= bounds.x &&\n x <= (bounds.x + bounds.width) &&\n y >= bounds.y &&\n y <= (bounds.y + bounds.height);\n}\n\nexport function findSemanticTextboxHandleAtPoint(runtime: BridgeRuntime, x: number, y: number): bigint {\n const tree = runtime.getSemanticTree();\n for (let i = tree.length - 1; i >= 0; i -= 1) {\n const node = tree[i];\n if (node?.roleName !== 'textbox') {\n continue;\n }\n if (pointInSemanticBounds(node.bounds, x, y)) {\n return handleToBigInt(node.handle);\n }\n }\n return 0n;\n}\n", "/**\n * Touch gesture state machine.\n * Models the lifecycle of touch interactions from pointer-down through scroll/tap completion.\n */\n\nexport type TouchGesturePhase = 'pressed' | 'scrolling';\n\nexport interface TouchGestureState {\n pointerId: number;\n phase: TouchGesturePhase;\n startX: number;\n startY: number;\n lastX: number;\n lastY: number;\n startedOnTextbox: boolean;\n pendingTapTextHandle: bigint | null;\n axisMode: 'x' | 'y' | 'xy' | null;\n pullToRefreshEligible: boolean;\n pullToRefreshCaptured: boolean;\n pullToRefreshDistance: number;\n // Note: breakoutTravel is tracked separately outside the reducer to avoid churn;\n // see touchGestureBreakoutTravel in events.ts\n}\n\nexport type TouchGestureEvent =\n | {\n type: 'press-start';\n pointerId: number;\n x: number;\n y: number;\n startedOnTextbox: boolean;\n pendingTextHandle: bigint | null;\n }\n | {\n type: 'move';\n x: number;\n y: number;\n }\n | {\n type: 'scroll-threshold-crossed';\n axis: 'x' | 'y';\n }\n | {\n type: 'axis-unlocked';\n }\n | {\n type: 'pull-to-refresh-captured';\n }\n | {\n type: 'pull-to-refresh-released';\n }\n | {\n type: 'cancel';\n }\n | {\n type: 'ended';\n triggered: boolean;\n };\n\n/**\n * Transition reducer for touch gesture state.\n * Returns the new state after applying an event, or null if the gesture ended.\n */\nexport function transitionTouchGesture(\n state: TouchGestureState | null,\n event: TouchGestureEvent,\n): TouchGestureState | null {\n if (state === null) {\n if (event.type === 'press-start') {\n return {\n pointerId: event.pointerId,\n phase: 'pressed',\n startX: event.x,\n startY: event.y,\n lastX: event.x,\n lastY: event.y,\n startedOnTextbox: event.startedOnTextbox,\n pendingTapTextHandle: event.pendingTextHandle,\n axisMode: null,\n pullToRefreshEligible: false,\n pullToRefreshCaptured: false,\n pullToRefreshDistance: 0.0,\n };\n }\n return null;\n }\n\n switch (state.phase) {\n case 'pressed': {\n switch (event.type) {\n case 'scroll-threshold-crossed': {\n const primaryAxis = event.axis;\n return {\n ...state,\n phase: 'scrolling',\n axisMode: primaryAxis,\n pullToRefreshEligible: primaryAxis === 'y',\n pendingTapTextHandle: null,\n };\n }\n case 'move': {\n return {\n ...state,\n lastX: event.x,\n lastY: event.y,\n };\n }\n case 'cancel':\n case 'ended': {\n return null;\n }\n default: {\n return state;\n }\n }\n }\n\n case 'scrolling': {\n switch (event.type) {\n case 'move': {\n return {\n ...state,\n lastX: event.x,\n lastY: event.y,\n };\n }\n case 'axis-unlocked': {\n return {\n ...state,\n axisMode: 'xy',\n pullToRefreshEligible: false,\n pullToRefreshCaptured: false,\n pullToRefreshDistance: 0.0,\n };\n }\n case 'pull-to-refresh-captured': {\n return {\n ...state,\n pullToRefreshCaptured: true,\n };\n }\n case 'pull-to-refresh-released': {\n return {\n ...state,\n pullToRefreshCaptured: false,\n pullToRefreshDistance: 0.0,\n };\n }\n case 'cancel':\n case 'ended': {\n return null;\n }\n default: {\n return state;\n }\n }\n }\n }\n}\n", "import type { BridgeRuntime } from '../../core-types';\nimport type { BridgeInteractionState } from '../local-types';\nimport { commitIfVisualWork } from '../commit-policy';\nimport { PointerMoveCoalescer } from '../pointer-move-coalescer';\nimport { PULL_TO_REFRESH_THRESHOLD, type PullToRefreshOverlay } from '../pull-to-refresh';\nimport {\n getPointerPosition,\n isPointerInsideCanvas,\n normalizeWheelDelta,\n} from './canvas-geometry';\nimport { findSemanticTextboxHandleAtPoint } from './semantic-hit-testing';\nimport {\n type TouchGestureState,\n transitionTouchGesture,\n} from '../touch-gesture';\nimport { computeModifiers, handleToBigInt } from '../utils/encoding';\n\nconst UI_EVENT_POINTER_DOWN = 1;\nconst UI_EVENT_POINTER_UP = 2;\nconst UI_EVENT_POINTER_MOVE = 3;\nconst UI_EVENT_POINTER_LEAVE = 5;\nconst EDGE_AUTOSCROLL_THRESHOLD = 30;\nconst TOUCH_SCROLL_THRESHOLD = 8;\nconst TOUCH_AXIS_LOCK_DOMINANCE_RATIO = 1.25;\nconst TOUCH_AXIS_BREAKOUT_DISTANCE = 32;\nconst TOUCH_AXIS_BREAKOUT_RATIO = 0.72;\nconst TOUCH_AXIS_BREAKOUT_STEP_THRESHOLD = 8;\n\ninterface PendingPointerMove {\n handle: bigint;\n x: number;\n y: number;\n clientX: number;\n clientY: number;\n pointerInsideCanvas: boolean;\n modifiers: number;\n}\n\nfunction resolvePrimaryTouchAxis(deltaX: number, deltaY: number): 'x' | 'y' {\n const absX = Math.abs(deltaX);\n const absY = Math.abs(deltaY);\n if (absX >= absY * TOUCH_AXIS_LOCK_DOMINANCE_RATIO) {\n return 'x';\n }\n if (absY >= absX * TOUCH_AXIS_LOCK_DOMINANCE_RATIO) {\n return 'y';\n }\n return absX >= absY ? 'x' : 'y';\n}\n\nfunction shouldUnlockTouchAxis(axisMode: 'x' | 'y' | 'xy' | null, travelX: number, travelY: number): boolean {\n if (axisMode === null || axisMode === 'xy') {\n return false;\n }\n const primaryTravel = axisMode === 'x' ? travelX : travelY;\n const secondaryTravel = axisMode === 'x' ? travelY : travelX;\n if (primaryTravel < TOUCH_AXIS_BREAKOUT_DISTANCE || secondaryTravel < TOUCH_AXIS_BREAKOUT_DISTANCE) {\n return false;\n }\n return secondaryTravel >= TOUCH_AXIS_BREAKOUT_DISTANCE &&\n secondaryTravel >= primaryTravel * TOUCH_AXIS_BREAKOUT_RATIO;\n}\n\nfunction currentInteractionTimeMs(): bigint {\n return BigInt(Math.floor(performance.now()));\n}\n\nfunction semanticRoleAtHandle(runtime: BridgeRuntime, handle: bigint): string | null {\n const handleKey = handle.toString();\n const node = runtime.getSemanticTree().find((entry) => entry.handle === handleKey);\n return node?.roleName ?? null;\n}\n\nexport function installPointerHandlers(\n runtime: BridgeRuntime,\n interactionState: BridgeInteractionState,\n pullToRefresh: PullToRefreshOverlay,\n): () => void {\n const { canvas, ui } = runtime;\n let primaryPointerDown = false;\n let activePrimaryPointerId: number | null = null;\n let suppressedContextMenuPointerId: number | null = null;\n let edgeAutoScrollTickScheduled = false;\n let activePrimaryPointerType: string | null = null;\n let activeTouchGesture: TouchGestureState | null = null;\n let touchGestureBreakoutTravel = { x: 0.0, y: 0.0 };\n\n const applySelectionAutoScroll = (x: number, y: number): void => {\n if (!primaryPointerDown || activePrimaryPointerType === 'touch') {\n return;\n }\n if (handleToBigInt(ui._ui_selection_autoscroll(x, y, EDGE_AUTOSCROLL_THRESHOLD)) === 0n) {\n return;\n }\n runtime.flushPendingCommit();\n runtime.requestFrame();\n };\n\n const processPointerMove = (pending: PendingPointerMove): void => {\n interactionState.setPointerInsideCanvas(pending.pointerInsideCanvas);\n interactionState.setLastPointerClientPosition(pending.clientX, pending.clientY);\n interactionState.setLastPointerPosition(pending.x, pending.y);\n interactionState.setLastPointerModifiers(pending.modifiers);\n ui._ui_set_interaction_time(currentInteractionTimeMs());\n ui._ui_on_pointer_event(UI_EVENT_POINTER_MOVE, pending.handle, pending.x, pending.y);\n commitIfVisualWork(runtime);\n if (pending.handle === 0n) {\n const appCapturedHandle = runtime.getCapturedPointerHandle();\n if (appCapturedHandle !== null) {\n window.__effindomCallbacks?.onPointerEventWithCoords?.(\n UI_EVENT_POINTER_MOVE,\n appCapturedHandle,\n pending.x,\n pending.y,\n pending.modifiers,\n );\n }\n }\n applySelectionAutoScroll(pending.x, pending.y);\n scheduleEdgeAutoScrollTick();\n };\n const pointerMoveCoalescer = new PointerMoveCoalescer<PendingPointerMove>(processPointerMove);\n\n const scheduleEdgeAutoScrollTick = (): void => {\n if (edgeAutoScrollTickScheduled || !primaryPointerDown || activePrimaryPointerType === 'touch') {\n return;\n }\n edgeAutoScrollTickScheduled = true;\n requestAnimationFrame(() => {\n edgeAutoScrollTickScheduled = false;\n if (!primaryPointerDown) {\n return;\n }\n const { x, y } = interactionState.getLastPointerPosition();\n if (handleToBigInt(ui._ui_selection_autoscroll(x, y, EDGE_AUTOSCROLL_THRESHOLD)) === 0n) {\n return;\n }\n runtime.commitFrame();\n runtime.flushPendingCommit();\n runtime.requestFrame();\n scheduleEdgeAutoScrollTick();\n });\n };\n\n const releaseCanvasPointerCapture = (pointerId: number): void => {\n if (canvas.hasPointerCapture(pointerId)) {\n canvas.releasePointerCapture(pointerId);\n }\n };\n\n const captureCanvasPointer = (pointerId: number): void => {\n try {\n canvas.setPointerCapture(pointerId);\n } catch {\n // Synthetic touch events in tests and some browser/device combinations can reject explicit capture.\n }\n };\n\n const cancelPressedPointerInteraction = (x: number, y: number): void => {\n const capturedHandle = interactionState.getCapturedPointerHandle();\n interactionState.setCapturedPointerHandle(null);\n primaryPointerDown = false;\n activePrimaryPointerId = null;\n activePrimaryPointerType = null;\n pointerMoveCoalescer.clear();\n ui._ui_set_interaction_time(currentInteractionTimeMs());\n ui._ui_on_pointer_event(UI_EVENT_POINTER_LEAVE, capturedHandle ?? 0n, x, y);\n runtime.commitFrame();\n };\n\n const handleTouchPointerScroll = (\n event: PointerEvent,\n position: { readonly x: number; readonly y: number },\n modifiers: number,\n ): boolean => {\n if (event.pointerType !== 'touch' || activeTouchGesture?.pointerId !== event.pointerId) {\n return false;\n }\n\n const deltaFromStartX = position.x - activeTouchGesture.startX;\n const deltaFromStartY = position.y - activeTouchGesture.startY;\n const distanceSquared = (deltaFromStartX * deltaFromStartX) + (deltaFromStartY * deltaFromStartY);\n\n if (activeTouchGesture.phase === 'pressed') {\n if (distanceSquared < TOUCH_SCROLL_THRESHOLD * TOUCH_SCROLL_THRESHOLD) {\n event.preventDefault();\n return true;\n }\n const primaryAxis = resolvePrimaryTouchAxis(deltaFromStartX, deltaFromStartY);\n activeTouchGesture = transitionTouchGesture(activeTouchGesture, {\n type: 'scroll-threshold-crossed',\n axis: primaryAxis,\n });\n if (activeTouchGesture === null) {\n return true;\n }\n interactionState.cancelTouchTextFocusDeferral();\n cancelPressedPointerInteraction(position.x, position.y);\n ui._ui_touch_scroll_begin(\n runtime.getHandleFromPoint(activeTouchGesture.startX, activeTouchGesture.startY),\n activeTouchGesture.startX,\n activeTouchGesture.startY,\n );\n touchGestureBreakoutTravel = { x: 0.0, y: 0.0 };\n }\n\n const prevState = activeTouchGesture;\n activeTouchGesture = transitionTouchGesture(activeTouchGesture, {\n type: 'move',\n x: position.x,\n y: position.y,\n });\n if (activeTouchGesture === null) {\n return true;\n }\n\n const deltaX = prevState.lastX - position.x;\n const deltaY = prevState.lastY - position.y;\n const absDeltaX = Math.abs(deltaX);\n const absDeltaY = Math.abs(deltaY);\n\n if (absDeltaX >= TOUCH_AXIS_BREAKOUT_STEP_THRESHOLD && absDeltaY >= TOUCH_AXIS_BREAKOUT_STEP_THRESHOLD) {\n touchGestureBreakoutTravel.x += absDeltaX;\n touchGestureBreakoutTravel.y += absDeltaY;\n } else {\n touchGestureBreakoutTravel = { x: 0.0, y: 0.0 };\n }\n\n if (shouldUnlockTouchAxis(\n activeTouchGesture.axisMode,\n touchGestureBreakoutTravel.x,\n touchGestureBreakoutTravel.y,\n )) {\n activeTouchGesture = transitionTouchGesture(activeTouchGesture, {\n type: 'axis-unlocked',\n });\n if (activeTouchGesture === null) {\n return true;\n }\n touchGestureBreakoutTravel = { x: 0.0, y: 0.0 };\n }\n\n const scrollDeltaX = activeTouchGesture.axisMode === 'x' || activeTouchGesture.axisMode === 'xy' ? deltaX : 0.0;\n const scrollDeltaY = activeTouchGesture.axisMode === 'y' || activeTouchGesture.axisMode === 'xy' ? deltaY : 0.0;\n\n if (!activeTouchGesture.startedOnTextbox && !activeTouchGesture.pullToRefreshCaptured) {\n const canCapturePullToRefresh =\n activeTouchGesture.pullToRefreshEligible &&\n deltaFromStartY > 0.0 &&\n ui._ui_touch_scroll_allows_pull_to_refresh() !== 0;\n if (canCapturePullToRefresh) {\n activeTouchGesture = transitionTouchGesture(activeTouchGesture, {\n type: 'pull-to-refresh-captured',\n }) ?? activeTouchGesture;\n }\n }\n\n const appliedScrollDeltaY = activeTouchGesture.pullToRefreshCaptured ? 0.0 : scrollDeltaY;\n\n interactionState.setPointerInsideCanvas(isPointerInsideCanvas(canvas, event));\n interactionState.setLastPointerClientPosition(event.clientX, event.clientY);\n interactionState.setLastPointerPosition(position.x, position.y);\n interactionState.setLastPointerModifiers(modifiers);\n ui._ui_set_interaction_time(currentInteractionTimeMs());\n ui._ui_on_pointer_event(UI_EVENT_POINTER_MOVE, runtime.getHandleFromPoint(position.x, position.y), position.x, position.y);\n ui._ui_touch_scroll_update(scrollDeltaX, appliedScrollDeltaY);\n\n const pullToRefreshDistance = activeTouchGesture.pullToRefreshCaptured\n ? Math.max(0.0, deltaFromStartY)\n : 0.0;\n\n activeTouchGesture.pullToRefreshDistance = pullToRefreshDistance;\n\n if (activeTouchGesture.pullToRefreshCaptured) {\n pullToRefresh.show(pullToRefreshDistance);\n } else {\n pullToRefresh.hide();\n }\n runtime.commitFrame();\n event.preventDefault();\n return true;\n };\n\n const forwardPointerEvent = (type: number, useHitTest = true) => (event: PointerEvent): void => {\n const modifiers = computeModifiers(event);\n const pointerInsideCanvas = type === UI_EVENT_POINTER_LEAVE ? false : isPointerInsideCanvas(canvas, event);\n const position = getPointerPosition(canvas, event);\n if (event.pointerType === 'touch' && event.cancelable) {\n event.preventDefault();\n }\n if (type === UI_EVENT_POINTER_DOWN && event.button === 2) {\n window.__effindomCallbacks?.onBeforeContextMenuHitTest?.();\n const handle = runtime.getHandleFromPoint(position.x, position.y);\n const activeTextHandle = interactionState.getActiveTextHandle();\n const refocusActiveTextInputAfterContextMenu =\n activeTextHandle !== null &&\n handle === activeTextHandle;\n suppressedContextMenuPointerId = event.pointerId;\n interactionState.setPointerInsideCanvas(pointerInsideCanvas);\n interactionState.setLastPointerClientPosition(event.clientX, event.clientY);\n interactionState.setLastPointerPosition(position.x, position.y);\n interactionState.setLastPointerModifiers(modifiers);\n if (!refocusActiveTextInputAfterContextMenu) {\n canvas.focus({ preventScroll: true });\n }\n ui._ui_set_interaction_time(currentInteractionTimeMs());\n window.__effindomCallbacks?.onContextMenu?.(\n handle,\n position.x,\n position.y,\n );\n if (refocusActiveTextInputAfterContextMenu) {\n interactionState.refocusActiveTextInput();\n }\n event.preventDefault();\n return;\n }\n if (suppressedContextMenuPointerId === event.pointerId) {\n interactionState.setPointerInsideCanvas(pointerInsideCanvas);\n interactionState.setLastPointerClientPosition(event.clientX, event.clientY);\n interactionState.setLastPointerPosition(position.x, position.y);\n interactionState.setLastPointerModifiers(modifiers);\n if (type === UI_EVENT_POINTER_UP || type === UI_EVENT_POINTER_LEAVE) {\n suppressedContextMenuPointerId = null;\n }\n event.preventDefault();\n return;\n }\n const isTouchEvent = event.pointerType === 'touch';\n const isPointerCancel = event.type === 'pointercancel';\n let touchTapCandidateHandle: bigint | null = null;\n let touchTapDiscarded = false;\n\n if (type === UI_EVENT_POINTER_DOWN) {\n captureCanvasPointer(event.pointerId);\n primaryPointerDown = true;\n activePrimaryPointerId = event.pointerId;\n activePrimaryPointerType = event.pointerType;\n if (isTouchEvent) {\n ui._ui_clear_momentum_scroll();\n\n activeTouchGesture = transitionTouchGesture(null, {\n type: 'press-start',\n pointerId: event.pointerId,\n x: position.x,\n y: position.y,\n startedOnTextbox: false,\n pendingTextHandle: null,\n });\n touchGestureBreakoutTravel = { x: 0.0, y: 0.0 };\n }\n } else if (activeTouchGesture !== null && activeTouchGesture.pointerId === event.pointerId) {\n if (type === UI_EVENT_POINTER_MOVE && handleTouchPointerScroll(event, position, modifiers)) {\n return;\n }\n if (type === UI_EVENT_POINTER_UP || type === UI_EVENT_POINTER_LEAVE) {\n const pendingTapTextHandle = activeTouchGesture.pendingTapTextHandle;\n const wasCancelled = isPointerCancel || type === UI_EVENT_POINTER_LEAVE;\n const scrolling = activeTouchGesture.phase === 'scrolling';\n const pullToRefreshDistance = activeTouchGesture.pullToRefreshDistance;\n\n activeTouchGesture = transitionTouchGesture(activeTouchGesture, {\n type: wasCancelled ? 'cancel' : 'ended',\n triggered: false,\n });\n\n const triggerRefresh = scrolling && pullToRefreshDistance >= PULL_TO_REFRESH_THRESHOLD;\n if (scrolling) {\n interactionState.cancelTouchTextFocusDeferral();\n interactionState.setCapturedPointerHandle(null);\n primaryPointerDown = false;\n activePrimaryPointerId = null;\n activePrimaryPointerType = null;\n pointerMoveCoalescer.clear();\n ui._ui_touch_scroll_end();\n if (triggerRefresh) {\n pullToRefresh.hide(true);\n window.location.reload();\n } else {\n pullToRefresh.hide();\n }\n releaseCanvasPointerCapture(event.pointerId);\n event.preventDefault();\n return;\n }\n if (wasCancelled || type !== UI_EVENT_POINTER_UP) {\n interactionState.cancelTouchTextFocusDeferral();\n touchTapDiscarded = true;\n } else {\n touchTapCandidateHandle = pendingTapTextHandle;\n }\n pullToRefresh.hide(true);\n }\n }\n const capturedHandle = interactionState.getCapturedPointerHandle();\n const activeTextHandle = interactionState.getActiveTextHandle();\n const rawHitHandle = useHitTest ? runtime.getHandleFromPoint(position.x, position.y) : 0n;\n const semanticTextboxHandle =\n (type === UI_EVENT_POINTER_DOWN || activeTextHandle !== null) && useHitTest\n ? findSemanticTextboxHandleAtPoint(runtime, position.x, position.y)\n : 0n;\n const shouldPreferSemanticTextbox =\n semanticTextboxHandle !== 0n &&\n (rawHitHandle === 0n || semanticRoleAtHandle(runtime, rawHitHandle) !== 'textbox') &&\n (type === UI_EVENT_POINTER_DOWN ||\n semanticTextboxHandle === activeTextHandle ||\n semanticTextboxHandle === capturedHandle);\n const hitHandle = shouldPreferSemanticTextbox ? semanticTextboxHandle : rawHitHandle;\n const handle = type === UI_EVENT_POINTER_DOWN\n ? hitHandle\n : ((useHitTest && pointerInsideCanvas) ? hitHandle : (capturedHandle ?? hitHandle));\n const refocusActiveTextInputAfterPointerDown =\n type === UI_EVENT_POINTER_DOWN &&\n activeTextHandle !== null &&\n handle === activeTextHandle &&\n !isTouchEvent;\n const delayCanvasFocusUntilAfterPointerDown =\n type === UI_EVENT_POINTER_DOWN &&\n activeTextHandle !== null &&\n handle !== activeTextHandle;\n const keepTouchEditorFocusedOnPointerDown =\n type === UI_EVENT_POINTER_DOWN &&\n isTouchEvent &&\n activeTextHandle !== null &&\n handle === activeTextHandle &&\n interactionState.isActiveTextInputFocused();\n const refocusActiveTextInputAfterPointerUp =\n type === UI_EVENT_POINTER_UP &&\n activeTextHandle !== null &&\n handle === activeTextHandle &&\n !isTouchEvent;\n const shouldCommitDeferredTouchFocus =\n isTouchEvent &&\n type === UI_EVENT_POINTER_UP &&\n !touchTapDiscarded &&\n touchTapCandidateHandle !== null &&\n handle === touchTapCandidateHandle;\n if (type === UI_EVENT_POINTER_UP || type === UI_EVENT_POINTER_LEAVE) {\n const pending = pointerMoveCoalescer.takePending();\n if (pending !== null) {\n processPointerMove(pending);\n }\n }\n if (type === UI_EVENT_POINTER_DOWN) {\n if (isTouchEvent) {\n const touchDownTextboxHandle = semanticRoleAtHandle(runtime, handle) === 'textbox' ? handle : 0n;\n if (touchDownTextboxHandle !== 0n) {\n const touchDownOnAlreadyFocusedText =\n activeTextHandle !== null &&\n touchDownTextboxHandle === activeTextHandle &&\n interactionState.isActiveTextInputFocused();\n if (activeTouchGesture !== null) {\n activeTouchGesture.startedOnTextbox = true;\n activeTouchGesture.pendingTapTextHandle = touchDownOnAlreadyFocusedText ? null : touchDownTextboxHandle;\n }\n interactionState.beginTouchTextFocusDeferral(touchDownTextboxHandle);\n } else {\n interactionState.cancelTouchTextFocusDeferral();\n }\n }\n interactionState.setPointerInsideCanvas(pointerInsideCanvas);\n interactionState.setLastPointerClientPosition(event.clientX, event.clientY);\n interactionState.setLastPointerPosition(position.x, position.y);\n interactionState.setLastPointerModifiers(modifiers);\n if (!refocusActiveTextInputAfterPointerDown &&\n !delayCanvasFocusUntilAfterPointerDown &&\n !keepTouchEditorFocusedOnPointerDown) {\n canvas.focus({ preventScroll: true });\n }\n interactionState.setCapturedPointerHandle(handle === 0n ? null : handle);\n ui._ui_set_interaction_time(currentInteractionTimeMs());\n ui._ui_on_pointer_event(type, handle, position.x, position.y);\n runtime.commitFrame();\n if (delayCanvasFocusUntilAfterPointerDown && interactionState.getActiveTextHandle() === null) {\n canvas.focus({ preventScroll: true });\n }\n if (refocusActiveTextInputAfterPointerDown) {\n interactionState.refocusActiveTextInput();\n } else if (!isTouchEvent && interactionState.getActiveTextHandle() !== null && !interactionState.isActiveTextInputFocused()) {\n interactionState.refocusActiveTextInput();\n }\n scheduleEdgeAutoScrollTick();\n } else if (type === UI_EVENT_POINTER_MOVE) {\n pointerMoveCoalescer.enqueue({\n handle,\n x: position.x,\n y: position.y,\n clientX: event.clientX,\n clientY: event.clientY,\n pointerInsideCanvas,\n modifiers,\n });\n return;\n } else {\n interactionState.setPointerInsideCanvas(pointerInsideCanvas);\n interactionState.setLastPointerClientPosition(event.clientX, event.clientY);\n interactionState.setLastPointerPosition(position.x, position.y);\n interactionState.setLastPointerModifiers(modifiers);\n ui._ui_set_interaction_time(currentInteractionTimeMs());\n ui._ui_on_pointer_event(type, handle, position.x, position.y);\n runtime.commitFrame();\n if (shouldCommitDeferredTouchFocus) {\n interactionState.commitTouchTextFocusDeferral(handle);\n } else if (refocusActiveTextInputAfterPointerUp) {\n interactionState.refocusActiveTextInput();\n } else if (!isTouchEvent && interactionState.getActiveTextHandle() !== null && !interactionState.isActiveTextInputFocused()) {\n interactionState.refocusActiveTextInput();\n }\n if (isTouchEvent && type === UI_EVENT_POINTER_UP && !shouldCommitDeferredTouchFocus) {\n interactionState.cancelTouchTextFocusDeferral();\n }\n if (handle === 0n) {\n const appCapturedHandle = runtime.getCapturedPointerHandle();\n if (appCapturedHandle !== null) {\n window.__effindomCallbacks?.onPointerEventWithCoords?.(type, appCapturedHandle, position.x, position.y, modifiers);\n }\n }\n scheduleEdgeAutoScrollTick();\n }\n if (type === UI_EVENT_POINTER_UP || type === UI_EVENT_POINTER_LEAVE) {\n primaryPointerDown = false;\n activePrimaryPointerId = null;\n activePrimaryPointerType = null;\n interactionState.setCapturedPointerHandle(null);\n }\n if (type === UI_EVENT_POINTER_UP || type === UI_EVENT_POINTER_LEAVE) {\n releaseCanvasPointerCapture(event.pointerId);\n }\n };\n\n const handleContextMenu = (event: Event): void => {\n event.preventDefault();\n };\n const handlePointerDown = forwardPointerEvent(UI_EVENT_POINTER_DOWN);\n const handlePointerUp = forwardPointerEvent(UI_EVENT_POINTER_UP);\n const handlePointerMove = forwardPointerEvent(UI_EVENT_POINTER_MOVE);\n const handleCapturedPointerExit = (event: PointerEvent): void => {\n if (canvas.hasPointerCapture(event.pointerId)) {\n if (primaryPointerDown) {\n forwardPointerEvent(UI_EVENT_POINTER_MOVE, false)(event);\n }\n return;\n }\n forwardPointerEvent(UI_EVENT_POINTER_LEAVE, false)(event);\n };\n const handlePointerLeave = (event: PointerEvent): void => {\n handleCapturedPointerExit(event);\n };\n const handlePointerOut = (event: PointerEvent): void => {\n handleCapturedPointerExit(event);\n };\n const handlePointerCancel = (event: PointerEvent): void => {\n forwardPointerEvent(UI_EVENT_POINTER_LEAVE, false)(event);\n };\n const shouldHandleWindowPointerEvent = (event: PointerEvent): boolean => {\n return primaryPointerDown &&\n activePrimaryPointerId !== null &&\n event.pointerId === activePrimaryPointerId &&\n event.target !== canvas;\n };\n const handleWindowPointerMove = (event: PointerEvent): void => {\n if (!shouldHandleWindowPointerEvent(event)) {\n return;\n }\n handlePointerMove(event);\n };\n const handleWindowPointerUp = (event: PointerEvent): void => {\n if (!shouldHandleWindowPointerEvent(event)) {\n return;\n }\n handlePointerUp(event);\n };\n const handleWindowPointerCancel = (event: PointerEvent): void => {\n if (!shouldHandleWindowPointerEvent(event)) {\n return;\n }\n handlePointerCancel(event);\n };\n const handleWheel = (event: WheelEvent): void => {\n event.preventDefault();\n const position = getPointerPosition(canvas, event);\n interactionState.setPointerInsideCanvas(isPointerInsideCanvas(canvas, event));\n interactionState.setLastPointerClientPosition(event.clientX, event.clientY);\n interactionState.setLastPointerPosition(position.x, position.y);\n interactionState.setLastPointerModifiers(computeModifiers(event));\n ui._ui_set_interaction_time(currentInteractionTimeMs());\n const handle = runtime.getHandleFromPoint(position.x, position.y);\n ui._ui_on_pointer_event(UI_EVENT_POINTER_MOVE, handle, position.x, position.y);\n const delta = normalizeWheelDelta(event, canvas);\n ui._ui_on_wheel_event(delta.x, delta.y);\n commitIfVisualWork(runtime);\n };\n\n canvas.addEventListener('contextmenu', handleContextMenu);\n canvas.addEventListener('pointerdown', handlePointerDown, { passive: false });\n canvas.addEventListener('pointerup', handlePointerUp, { passive: false });\n canvas.addEventListener('pointermove', handlePointerMove, { passive: false });\n canvas.addEventListener('pointerleave', handlePointerLeave, { passive: false });\n canvas.addEventListener('pointerout', handlePointerOut, { passive: false });\n canvas.addEventListener('pointercancel', handlePointerCancel, { passive: false });\n window.addEventListener('pointermove', handleWindowPointerMove, { passive: false });\n window.addEventListener('pointerup', handleWindowPointerUp, { passive: false });\n window.addEventListener('pointercancel', handleWindowPointerCancel, { passive: false });\n canvas.addEventListener('wheel', handleWheel, { passive: false });\n\n return () => {\n canvas.removeEventListener('contextmenu', handleContextMenu);\n canvas.removeEventListener('pointerdown', handlePointerDown);\n canvas.removeEventListener('pointerup', handlePointerUp);\n canvas.removeEventListener('pointermove', handlePointerMove);\n canvas.removeEventListener('pointerleave', handlePointerLeave);\n canvas.removeEventListener('pointerout', handlePointerOut);\n canvas.removeEventListener('pointercancel', handlePointerCancel);\n window.removeEventListener('pointermove', handleWindowPointerMove);\n window.removeEventListener('pointerup', handleWindowPointerUp);\n window.removeEventListener('pointercancel', handleWindowPointerCancel);\n canvas.removeEventListener('wheel', handleWheel);\n };\n}\n", "import type { BridgeRuntime } from '../core-types';\nimport type { BridgeInteractionState } from './local-types';\nimport { DesktopFindDialogController } from './find-dialog';\nimport { detectPlatformFamily } from './platform';\nimport { createPullToRefreshOverlay } from './pull-to-refresh';\nexport {\n ensureCanvasLogicalSize,\n getCanvasSizeSource,\n readCanvasLogicalSize,\n} from './events/canvas-geometry';\nimport {\n ensureCanvasLogicalSize,\n getCanvasSizeSource,\n readCanvasLogicalSize,\n} from './events/canvas-geometry';\nimport { installKeyAndWindowHandlers } from './events/key-router';\nimport { installPointerHandlers } from './events/pointer-router';\n\nfunction detectCoarsePointerMode(): boolean {\n return window.matchMedia('(pointer: coarse)').matches || navigator.maxTouchPoints > 0;\n}\n\nexport function installEventHandlers(runtime: BridgeRuntime, interactionState: BridgeInteractionState): () => void {\n const { canvas, ui } = runtime;\n const desktopFindDialog = new DesktopFindDialogController(runtime, canvas);\n const pullToRefresh = createPullToRefreshOverlay();\n const coarsePointerQuery = window.matchMedia('(pointer: coarse)');\n\n canvas.tabIndex = 0;\n canvas.style.touchAction = 'none';\n canvas.style.outline = 'none';\n\n const updateCoarsePointerMode = (): void => {\n ui._ui_set_coarse_pointer_mode(detectCoarsePointerMode() ? 1 : 0);\n };\n const updatePlatformFamily = (): void => {\n ui._ui_set_platform_family(detectPlatformFamily());\n };\n\n updateCoarsePointerMode();\n updatePlatformFamily();\n coarsePointerQuery.addEventListener?.('change', updateCoarsePointerMode);\n\n const removePointerHandlers = installPointerHandlers(runtime, interactionState, pullToRefresh);\n const removeKeyAndWindowHandlers = installKeyAndWindowHandlers(runtime, interactionState, desktopFindDialog);\n\n return () => {\n removeKeyAndWindowHandlers();\n removePointerHandlers();\n desktopFindDialog.destroy();\n pullToRefresh.destroy();\n coarsePointerQuery.removeEventListener?.('change', updateCoarsePointerMode);\n };\n}\n", "export interface BridgeFontDefinition {\n readonly id: number;\n readonly assetFile: string;\n readonly fallbackIds: readonly number[];\n readonly preload: boolean;\n}\n\nexport const BUILT_IN_FONT_BODY = 1;\nexport const BUILT_IN_FONT_HEADING = 2;\nexport const BUILT_IN_FONT_SYMBOLS = 3;\nexport const BUILT_IN_FONT_EMOJI = 4;\nexport const BUILT_IN_FONT_MONO = 5;\nexport const BUILT_IN_FONT_MONO_BOLD = 6;\nexport const BUILT_IN_FONT_BODY_ITALIC = 9;\nexport const BUILT_IN_FONT_BODY_BOLD_ITALIC = 10;\n\nconst BUILT_IN_BRIDGE_FONTS: readonly BridgeFontDefinition[] = [\n { id: BUILT_IN_FONT_BODY, assetFile: 'NotoSans-Regular.ttf', fallbackIds: [BUILT_IN_FONT_EMOJI, BUILT_IN_FONT_SYMBOLS], preload: true },\n { id: BUILT_IN_FONT_HEADING, assetFile: 'NotoSans-Bold.ttf', fallbackIds: [BUILT_IN_FONT_EMOJI, BUILT_IN_FONT_SYMBOLS], preload: true },\n { id: BUILT_IN_FONT_BODY_ITALIC, assetFile: 'NotoSans-Italic.ttf', fallbackIds: [BUILT_IN_FONT_EMOJI, BUILT_IN_FONT_SYMBOLS], preload: true },\n { id: BUILT_IN_FONT_BODY_BOLD_ITALIC, assetFile: 'NotoSans-BoldItalic.ttf', fallbackIds: [BUILT_IN_FONT_EMOJI, BUILT_IN_FONT_SYMBOLS], preload: true },\n { id: BUILT_IN_FONT_SYMBOLS, assetFile: 'NotoSansSymbols2-Regular.ttf', fallbackIds: [], preload: true },\n { id: BUILT_IN_FONT_EMOJI, assetFile: 'NotoEmoji-Regular.ttf', fallbackIds: [], preload: true },\n { id: BUILT_IN_FONT_MONO, assetFile: 'NotoSansMono-Regular.ttf', fallbackIds: [BUILT_IN_FONT_EMOJI, BUILT_IN_FONT_SYMBOLS], preload: false },\n { id: BUILT_IN_FONT_MONO_BOLD, assetFile: 'NotoSansMono-Bold.ttf', fallbackIds: [BUILT_IN_FONT_EMOJI, BUILT_IN_FONT_SYMBOLS], preload: false },\n];\n\nexport const STARTUP_BRIDGE_FONTS: readonly BridgeFontDefinition[] = BUILT_IN_BRIDGE_FONTS.filter((font) => font.preload);\n\nexport function getBuiltInBridgeFont(fontId: number): BridgeFontDefinition | undefined {\n return BUILT_IN_BRIDGE_FONTS.find((font) => font.id === fontId);\n}\n\nexport function getBridgeAssetBaseUrl(): string {\n const runtimeConfig = window as Window & {\n __effindomRuntime?: { manifestUrl?: string };\n };\n const manifestUrl = runtimeConfig.__effindomRuntime?.manifestUrl;\n if (typeof manifestUrl === 'string' && manifestUrl.length > 0) {\n return new URL('./', new URL(manifestUrl, document.baseURI)).toString();\n }\n const currentScript = document.currentScript;\n if (currentScript instanceof HTMLScriptElement && currentScript.src.length > 0) {\n return new URL('./', currentScript.src).toString();\n }\n return new URL('./', document.baseURI).toString();\n}\n\nexport function getBridgeAssetUrl(assetFile: string): string {\n return new URL(`../fonts/${assetFile}`, getBridgeAssetBaseUrl()).toString();\n}\n", "import type { AssetLoadResult, CoreModule } from '../../core-types';\nimport { writeBytesToHeap } from '../utils/heap';\nimport { IncrementalFontManager } from './font-manager';\n\ninterface BitmapLike {\n readonly width: number;\n readonly height: number;\n close?(): void;\n}\n\nconst svgTextDecoder = new TextDecoder();\n\nfunction createDecodeCanvas(width: number, height: number): HTMLCanvasElement {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n return canvas;\n}\n\nasync function decodeBlobToBitmap(blob: Blob): Promise<ImageBitmap> {\n if (createImageBitmap === undefined) {\n throw new Error('createImageBitmap is unavailable for texture decoding.');\n }\n return await createImageBitmap(blob);\n}\n\nfunction extractBitmapRgba(bitmap: CanvasImageSource & BitmapLike): Uint8Array {\n const canvas = createDecodeCanvas(bitmap.width, bitmap.height);\n const context = canvas.getContext('2d', { willReadFrequently: true });\n if (context === null) {\n throw new Error('Failed to allocate a 2D canvas for texture decoding.');\n }\n context.clearRect(0, 0, bitmap.width, bitmap.height);\n context.drawImage(bitmap, 0, 0);\n const imageData = context.getImageData(0, 0, bitmap.width, bitmap.height);\n return new Uint8Array(\n imageData.data.buffer.slice(\n imageData.data.byteOffset,\n imageData.data.byteOffset + imageData.data.byteLength,\n ),\n );\n}\n\nfunction parseSvgLength(value: string | null): number | null {\n if (value === null) {\n return null;\n }\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n return null;\n }\n const match = /^([+-]?(?:\\d+\\.?\\d*|\\.\\d+))/.exec(trimmed);\n const numericPrefix = match?.[1];\n if (numericPrefix === undefined) {\n return null;\n }\n const parsed = Number.parseFloat(numericPrefix);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : null;\n}\n\nfunction parseSvgViewBox(value: string | null): AssetLoadResult | null {\n if (value === null) {\n return null;\n }\n const parts = value\n .trim()\n .split(/[\\s,]+/)\n .map((entry) => Number.parseFloat(entry))\n .filter((entry) => Number.isFinite(entry));\n if (parts.length !== 4) {\n return null;\n }\n const width = parts[2];\n const height = parts[3];\n if (width === undefined || height === undefined) {\n return null;\n }\n if (width <= 0 || height <= 0) {\n return null;\n }\n return { width, height };\n}\n\nfunction parseSvgIntrinsicSize(bytes: Uint8Array): AssetLoadResult {\n const markup = svgTextDecoder.decode(bytes);\n const documentRoot = new DOMParser().parseFromString(markup, 'image/svg+xml').documentElement;\n const width = parseSvgLength(documentRoot.getAttribute('width'));\n const height = parseSvgLength(documentRoot.getAttribute('height'));\n if (width !== null && height !== null) {\n return { width, height };\n }\n const viewBox = parseSvgViewBox(documentRoot.getAttribute('viewBox'));\n if (viewBox !== null) {\n return viewBox;\n }\n return { width: 1, height: 1 };\n}\n\nexport class AssetManager {\n private readonly loadedSvgs = new Map<number, string>();\n private readonly loadedTextures = new Map<number, string>();\n\n public constructor(\n private readonly core: CoreModule,\n private readonly fontManager: IncrementalFontManager,\n private readonly onCommitFrame: () => void,\n ) {}\n\n public async loadSvg(svgId: number, url: string): Promise<AssetLoadResult> {\n this.loadedSvgs.set(svgId, url);\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch SVG ${url}: ${String(response.status)}`);\n }\n const bytes = new Uint8Array(await response.arrayBuffer());\n const size = parseSvgIntrinsicSize(bytes);\n const svgBytes = writeBytesToHeap(this.core, bytes);\n try {\n this.core._ed_register_svg(svgId, svgBytes.ptr, svgBytes.len);\n } finally {\n svgBytes.dispose();\n }\n this.onCommitFrame();\n return size;\n }\n\n public async loadTexture(textureId: number, url: string): Promise<AssetLoadResult> {\n this.loadedTextures.set(textureId, url);\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch texture ${url}: ${String(response.status)}`);\n }\n const blob = await response.blob();\n const bitmap = await decodeBlobToBitmap(blob);\n const width = bitmap.width;\n const height = bitmap.height;\n try {\n const rgba = extractBitmapRgba(bitmap);\n const textureBytes = writeBytesToHeap(this.core, rgba);\n try {\n this.core._ed_register_texture_rgba(textureId, textureBytes.ptr, width, height, textureBytes.len);\n } finally {\n textureBytes.dispose();\n }\n } finally {\n bitmap.close?.();\n }\n this.onCommitFrame();\n return {\n width,\n height,\n };\n }\n\n public releaseSvg(svgId: number): void {\n this.loadedSvgs.delete(svgId);\n }\n\n public releaseTexture(textureId: number): void {\n this.loadedTextures.delete(textureId);\n this.core._ed_unregister_texture(textureId);\n this.onCommitFrame();\n }\n\n public async replayLoadedAssets(): Promise<void> {\n await Promise.all([\n this.fontManager.replayLoadedFonts(),\n ...Array.from(this.loadedSvgs.entries(), async ([svgId, url]) => {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to refetch SVG ${url}: ${String(response.status)}`);\n }\n const bytes = new Uint8Array(await response.arrayBuffer());\n const svgBytes = writeBytesToHeap(this.core, bytes);\n try {\n this.core._ed_register_svg(svgId, svgBytes.ptr, svgBytes.len);\n } finally {\n svgBytes.dispose();\n }\n }),\n ...Array.from(this.loadedTextures.entries(), async ([textureId, url]) => {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to refetch texture ${url}: ${String(response.status)}`);\n }\n const blob = await response.blob();\n const bitmap = await decodeBlobToBitmap(blob);\n try {\n const rgba = extractBitmapRgba(bitmap);\n const textureBytes = writeBytesToHeap(this.core, rgba);\n try {\n this.core._ed_register_texture_rgba(textureId, textureBytes.ptr, bitmap.width, bitmap.height, textureBytes.len);\n } finally {\n textureBytes.dispose();\n }\n } finally {\n bitmap.close?.();\n }\n }),\n ]);\n }\n}\n", "export interface GoogleFontShardBytes {\n readonly url: string;\n readonly bytes: Uint8Array;\n}\n\nconst GOOGLE_FONTS_STYLESHEET_ORIGIN = 'https://fonts.googleapis.com';\nconst GOOGLE_FONTS_BINARY_ORIGIN = 'https://fonts.gstatic.com';\n\nfunction ensureLinkTag(rel: string, href: string, crossOrigin?: '' | 'anonymous'): void {\n const existing = document.head.querySelector(`link[rel=\"${rel}\"][href=\"${href}\"]`);\n if (existing instanceof HTMLLinkElement) {\n return;\n }\n const link = document.createElement('link');\n link.rel = rel;\n link.href = href;\n if (crossOrigin !== undefined) {\n link.crossOrigin = crossOrigin;\n }\n document.head.appendChild(link);\n}\n\nexport function ensureGoogleFontShardPreconnect(): void {\n ensureLinkTag('preconnect', GOOGLE_FONTS_STYLESHEET_ORIGIN);\n ensureLinkTag('preconnect', GOOGLE_FONTS_BINARY_ORIGIN, 'anonymous');\n}\n\nexport function buildGoogleFontStylesheetUrl(googleFamily: string, text: string): string {\n const params = new URLSearchParams();\n params.set('family', `${googleFamily}:wght@400`);\n params.set('text', text);\n params.set('display', 'swap');\n return `${GOOGLE_FONTS_STYLESHEET_ORIGIN}/css2?${params.toString()}`;\n}\n\nexport function parseGoogleFontBinaryUrl(stylesheetText: string): string {\n const match = /src:\\s*url\\(([^)]+)\\)\\s*format\\((['\"]?)(woff2|woff|truetype|opentype)\\2\\)/.exec(stylesheetText);\n if (match?.[1] === undefined) {\n throw new Error('Google Fonts stylesheet did not expose a usable shard URL.');\n }\n return match[1].trim();\n}\n\nexport async function fetchGoogleFontShardBytes(\n googleFamily: string,\n text: string,\n): Promise<GoogleFontShardBytes> {\n ensureGoogleFontShardPreconnect();\n const stylesheetUrl = buildGoogleFontStylesheetUrl(googleFamily, text);\n const stylesheetResponse = await fetch(stylesheetUrl, { mode: 'cors' });\n if (!stylesheetResponse.ok) {\n throw new Error(`Failed to fetch Google Fonts stylesheet ${stylesheetUrl}: ${String(stylesheetResponse.status)}`);\n }\n const binaryUrl = parseGoogleFontBinaryUrl(await stylesheetResponse.text());\n const binaryResponse = await fetch(binaryUrl);\n if (!binaryResponse.ok) {\n throw new Error(`Failed to fetch font ${binaryUrl}: ${String(binaryResponse.status)}`);\n }\n return {\n url: binaryUrl,\n bytes: new Uint8Array(await binaryResponse.arrayBuffer()),\n };\n}\n", "import {\n BUILT_IN_FONT_BODY,\n BUILT_IN_FONT_BODY_BOLD_ITALIC,\n BUILT_IN_FONT_BODY_ITALIC,\n BUILT_IN_FONT_HEADING,\n BUILT_IN_FONT_MONO,\n BUILT_IN_FONT_MONO_BOLD,\n} from './font-catalog';\n\nexport const UI_MISSING_FONT_COVERAGE_UNKNOWN = 0;\nexport const UI_MISSING_FONT_COVERAGE_ARABIC = 1;\nexport const UI_MISSING_FONT_COVERAGE_THAI = 2;\nexport const UI_MISSING_FONT_COVERAGE_CJK = 3;\nexport const UI_MISSING_FONT_COVERAGE_SUPPLEMENTAL = 4;\n\nexport interface ResolvedIncrementalFontShardRequest {\n readonly packageId: string;\n readonly coverageKind: number;\n readonly familyKey: string;\n readonly googleFamily: string;\n readonly text: string;\n}\n\nconst AUTO_EXTENDABLE_PRIMARY_FONT_IDS = new Set<number>([\n BUILT_IN_FONT_BODY,\n BUILT_IN_FONT_HEADING,\n BUILT_IN_FONT_BODY_ITALIC,\n BUILT_IN_FONT_BODY_BOLD_ITALIC,\n BUILT_IN_FONT_MONO,\n BUILT_IN_FONT_MONO_BOLD,\n]);\n\ninterface SupplementalFamilyDefinition {\n readonly familyKey: string;\n readonly googleFamily: string;\n readonly ranges: readonly [number, number][];\n}\n\nconst SUPPLEMENTAL_FAMILIES: readonly SupplementalFamilyDefinition[] = [\n { familyKey: 'hebrew', googleFamily: 'Noto Sans Hebrew', ranges: [[0x0590, 0x05FF]] },\n { familyKey: 'armenian', googleFamily: 'Noto Sans Armenian', ranges: [[0x0530, 0x058F]] },\n { familyKey: 'georgian', googleFamily: 'Noto Sans Georgian', ranges: [[0x10A0, 0x10FF], [0x2D00, 0x2D2F]] },\n { familyKey: 'devanagari', googleFamily: 'Noto Sans Devanagari', ranges: [[0x0900, 0x097F]] },\n { familyKey: 'bengali', googleFamily: 'Noto Sans Bengali', ranges: [[0x0980, 0x09FF]] },\n { familyKey: 'gurmukhi', googleFamily: 'Noto Sans Gurmukhi', ranges: [[0x0A00, 0x0A7F]] },\n { familyKey: 'gujarati', googleFamily: 'Noto Sans Gujarati', ranges: [[0x0A80, 0x0AFF]] },\n { familyKey: 'oriya', googleFamily: 'Noto Sans Oriya', ranges: [[0x0B00, 0x0B7F]] },\n { familyKey: 'tamil', googleFamily: 'Noto Sans Tamil', ranges: [[0x0B80, 0x0BFF]] },\n { familyKey: 'telugu', googleFamily: 'Noto Sans Telugu', ranges: [[0x0C00, 0x0C7F]] },\n { familyKey: 'kannada', googleFamily: 'Noto Sans Kannada', ranges: [[0x0C80, 0x0CFF]] },\n { familyKey: 'malayalam', googleFamily: 'Noto Sans Malayalam', ranges: [[0x0D00, 0x0D7F]] },\n { familyKey: 'sinhala', googleFamily: 'Noto Sans Sinhala', ranges: [[0x0D80, 0x0DFF]] },\n { familyKey: 'lao', googleFamily: 'Noto Sans Lao', ranges: [[0x0E80, 0x0EFF]] },\n { familyKey: 'myanmar', googleFamily: 'Noto Sans Myanmar', ranges: [[0x1000, 0x109F]] },\n { familyKey: 'khmer', googleFamily: 'Noto Sans Khmer', ranges: [[0x1780, 0x17FF]] },\n { familyKey: 'ethiopic', googleFamily: 'Noto Sans Ethiopic', ranges: [[0x1200, 0x137F], [0x1380, 0x139F], [0x2D80, 0x2DDF]] },\n] as const;\n\nfunction inRanges(codePoint: number, ranges: readonly [number, number][]): boolean {\n return ranges.some(([start, end]) => codePoint >= start && codePoint <= end);\n}\n\nfunction uniqueCodePoints(text: string): readonly string[] {\n const seen = new Set<string>();\n const ordered: string[] = [];\n for (const character of text) {\n if (seen.has(character)) {\n continue;\n }\n seen.add(character);\n ordered.push(character);\n }\n return ordered;\n}\n\nfunction isCjkPunctuation(codePoint: number): boolean {\n return (codePoint >= 0x3000 && codePoint <= 0x303F)\n || (codePoint >= 0xFF01 && codePoint <= 0xFF0F)\n || (codePoint >= 0xFF1A && codePoint <= 0xFF20)\n || (codePoint >= 0xFF3B && codePoint <= 0xFF40)\n || (codePoint >= 0xFF5B && codePoint <= 0xFF65);\n}\n\nfunction buildShardRequest(\n packageId: string,\n coverageKind: number,\n familyKey: string,\n googleFamily: string,\n characters: readonly string[],\n): ResolvedIncrementalFontShardRequest | null {\n if (characters.length === 0) {\n return null;\n }\n const text = characters.join('');\n return {\n packageId,\n coverageKind,\n familyKey,\n googleFamily,\n text,\n };\n}\n\nfunction resolveCjkRequests(sampleText: string): readonly ResolvedIncrementalFontShardRequest[] {\n const codePoints = uniqueCodePoints(sampleText);\n const kana: string[] = [];\n const hangul: string[] = [];\n const han: string[] = [];\n const punctuation: string[] = [];\n for (const character of codePoints) {\n const codePoint = character.codePointAt(0);\n if (codePoint === undefined) {\n continue;\n }\n if (isCjkPunctuation(codePoint)) {\n punctuation.push(character);\n continue;\n }\n if ((codePoint >= 0x3040 && codePoint <= 0x30FF) || (codePoint >= 0x31F0 && codePoint <= 0x31FF)) {\n kana.push(character);\n continue;\n }\n if (codePoint >= 0xAC00 && codePoint <= 0xD7AF) {\n hangul.push(character);\n continue;\n }\n if (\n (codePoint >= 0x3400 && codePoint <= 0x4DBF)\n || (codePoint >= 0x4E00 && codePoint <= 0x9FFF)\n || (codePoint >= 0xF900 && codePoint <= 0xFAFF)\n ) {\n han.push(character);\n }\n }\n\n const requests: ResolvedIncrementalFontShardRequest[] = [];\n if (kana.length > 0) {\n requests.push(\n buildShardRequest('cjk-sans', UI_MISSING_FONT_COVERAGE_CJK, 'cjk-jp', 'Noto Sans JP', [...kana, ...han, ...punctuation])!,\n );\n }\n if (hangul.length > 0) {\n requests.push(\n buildShardRequest('cjk-sans', UI_MISSING_FONT_COVERAGE_CJK, 'cjk-kr', 'Noto Sans KR', [...hangul, ...(kana.length === 0 ? han : []), ...punctuation])!,\n );\n }\n if (han.length > 0 && kana.length === 0 && hangul.length === 0) {\n requests.push(\n buildShardRequest('cjk-sans', UI_MISSING_FONT_COVERAGE_CJK, 'cjk-sc', 'Noto Sans SC', [...han, ...punctuation])!,\n );\n }\n if (requests.length === 0 && punctuation.length > 0) {\n requests.push(\n buildShardRequest('cjk-sans', UI_MISSING_FONT_COVERAGE_CJK, 'cjk-sc', 'Noto Sans SC', punctuation)!,\n );\n }\n return requests;\n}\n\nfunction resolveSupplementalRequests(sampleText: string): readonly ResolvedIncrementalFontShardRequest[] {\n const codePoints = uniqueCodePoints(sampleText);\n const textByFamily = new Map<string, string[]>();\n for (const character of codePoints) {\n const codePoint = character.codePointAt(0);\n if (codePoint === undefined) {\n continue;\n }\n const family = SUPPLEMENTAL_FAMILIES.find((entry) => inRanges(codePoint, entry.ranges));\n if (family === undefined) {\n continue;\n }\n const current = textByFamily.get(family.familyKey) ?? [];\n current.push(character);\n textByFamily.set(family.familyKey, current);\n }\n return SUPPLEMENTAL_FAMILIES\n .map((family) => buildShardRequest(\n 'supplemental-sans',\n UI_MISSING_FONT_COVERAGE_SUPPLEMENTAL,\n family.familyKey,\n family.googleFamily,\n textByFamily.get(family.familyKey) ?? [],\n ))\n .filter((request): request is ResolvedIncrementalFontShardRequest => request !== null);\n}\n\nexport function resolveIncrementalFontPackageRequests(\n primaryFontId: number,\n coverageKind: number,\n sampleText: string,\n): readonly ResolvedIncrementalFontShardRequest[] {\n if (!AUTO_EXTENDABLE_PRIMARY_FONT_IDS.has(primaryFontId) || sampleText.length === 0) {\n return [];\n }\n const uniqueText = uniqueCodePoints(sampleText).join('');\n if (uniqueText.length === 0) {\n return [];\n }\n if (coverageKind === UI_MISSING_FONT_COVERAGE_ARABIC) {\n return [\n buildShardRequest('arabic-sans', coverageKind, 'arabic-core', 'Noto Naskh Arabic', Array.from(uniqueText))!,\n ];\n }\n if (coverageKind === UI_MISSING_FONT_COVERAGE_THAI) {\n return [\n buildShardRequest('thai-sans', coverageKind, 'thai-core', 'Noto Sans Thai', Array.from(uniqueText))!,\n ];\n }\n if (coverageKind === UI_MISSING_FONT_COVERAGE_CJK) {\n return resolveCjkRequests(uniqueText);\n }\n if (coverageKind === UI_MISSING_FONT_COVERAGE_SUPPLEMENTAL) {\n return resolveSupplementalRequests(uniqueText);\n }\n return [];\n}\n", "import type {\n BridgeFontRegistration,\n BridgeFontStackRegistration,\n BridgeLogs,\n CoreModule,\n IncrementalFontAutoGrowBlockReason,\n IncrementalFontCacheState,\n IncrementalFontPolicy,\n IncrementalFontRuntimeState,\n UiModule,\n} from '../../core-types';\nimport { getBridgeAssetUrl, getBuiltInBridgeFont } from '../font-catalog';\nimport { fetchGoogleFontShardBytes } from '../google-fonts';\nimport {\n resolveIncrementalFontPackageRequests,\n type ResolvedIncrementalFontShardRequest,\n} from '../incremental-font-packages';\nimport { writeBytesToHeap } from '../utils/heap';\n\ntype InternalFontLoadState = 'known' | 'loading' | 'loaded' | 'failed';\n\ninterface InternalIncrementalFontState {\n sourceUrl: string | null;\n sourceState: 'unknown' | InternalFontLoadState;\n requestedSegmentIds: Set<string>;\n pendingSegmentIds: Set<string>;\n appliedSegmentIds: Set<string>;\n evictedSegmentIds: Set<string>;\n requestedCharactersByFamily: Map<string, Set<string>>;\n revision: number;\n blockedPackageIds: Set<string>;\n lastBlockedReason: IncrementalFontAutoGrowBlockReason | null;\n}\n\ninterface InternalIncrementalShardCacheEntry {\n shardKey: string;\n fontId: number;\n sizeBytes: number;\n primaryFontIds: Set<number>;\n lastAccessTick: number;\n}\n\ninterface NormalizedIncrementalFontPolicy {\n autoGrow: boolean;\n maxCachedShardFonts: number;\n allowedFontIds: Set<number> | null;\n blockedPackageIds: Set<string> | null;\n}\n\nconst DEFAULT_INCREMENTAL_FONT_POLICY: IncrementalFontPolicy = {\n autoGrow: true,\n maxCachedShardFonts: 8,\n allowedFontIds: null,\n blockedPackageIds: null,\n};\n\nexport class IncrementalFontManager {\n private readonly loadedFonts = new Map<number, string>();\n private readonly fontLoadStates = new Map<number, { readonly url: string; readonly state: InternalFontLoadState }>();\n private readonly incrementalFontStates = new Map<number, InternalIncrementalFontState>();\n private readonly fontFallbacks = new Map<number, number[]>();\n private readonly lazyFontSources = new Map<number, string>();\n private readonly pendingFontLoads = new Map<number, Promise<void>>();\n private readonly pendingIncrementalShardLoads = new Map<string, Promise<number>>();\n private readonly pendingIncrementalFamilyRequests = new Map<string, {\n packageId: string;\n coverageKind: number;\n familyKey: string;\n googleFamily: string;\n characters: Set<string>;\n }>();\n private readonly scheduledIncrementalFamilyFlushes = new Set<string>();\n private readonly incrementalShardCache = new Map<string, InternalIncrementalShardCacheEntry>();\n private readonly shardKeysByPrimaryFont = new Map<number, Set<string>>();\n private readonly evictedShardKeys: string[] = [];\n private nextIncrementalFontId = 0x7F000100;\n private shardAccessTick = 0;\n private incrementalFontPolicy: IncrementalFontPolicy = DEFAULT_INCREMENTAL_FONT_POLICY;\n private normalizedIncrementalFontPolicy: NormalizedIncrementalFontPolicy = {\n autoGrow: DEFAULT_INCREMENTAL_FONT_POLICY.autoGrow,\n maxCachedShardFonts: DEFAULT_INCREMENTAL_FONT_POLICY.maxCachedShardFonts,\n allowedFontIds: null,\n blockedPackageIds: null,\n };\n\n public constructor(\n private readonly core: CoreModule,\n private readonly ui: UiModule,\n private readonly logs: BridgeLogs,\n private readonly onCommitFrame: () => void,\n ) {}\n\n private normalizePolicy(policy: IncrementalFontPolicy): NormalizedIncrementalFontPolicy {\n return {\n autoGrow: policy.autoGrow,\n maxCachedShardFonts: Math.max(1, Math.floor(policy.maxCachedShardFonts)),\n allowedFontIds: policy.allowedFontIds === null ? null : new Set(policy.allowedFontIds),\n blockedPackageIds: policy.blockedPackageIds === null ? null : new Set(policy.blockedPackageIds),\n };\n }\n\n private registerFontBytes(fontId: number, bytes: Uint8Array): void {\n const coreBytes = writeBytesToHeap(this.core, bytes);\n const uiBytes = writeBytesToHeap(this.ui, bytes);\n try {\n this.core._ed_register_font(fontId, coreBytes.ptr, coreBytes.len);\n if (this.ui._ui_register_font(fontId, uiBytes.ptr, uiBytes.len) === 0) {\n throw new Error(`Ui rejected font ${String(fontId)}.`);\n }\n this.ui._ui_font_loaded(fontId);\n } finally {\n coreBytes.dispose();\n uiBytes.dispose();\n }\n }\n\n private unregisterFont(fontId: number): void {\n this.core._ed_unregister_font(fontId);\n this.ui._ui_unregister_font(fontId);\n this.loadedFonts.delete(fontId);\n this.fontLoadStates.delete(fontId);\n }\n\n private updateShardAccess(shardKey: string): void {\n const shard = this.incrementalShardCache.get(shardKey);\n if (shard === undefined) {\n return;\n }\n this.shardAccessTick += 1;\n shard.lastAccessTick = this.shardAccessTick;\n }\n\n private getAutoGrowBlockReason(\n fontId: number,\n packageId: string | null,\n ): IncrementalFontAutoGrowBlockReason | null {\n if (!this.normalizedIncrementalFontPolicy.autoGrow) {\n return 'auto-grow-disabled';\n }\n if (\n this.normalizedIncrementalFontPolicy.allowedFontIds !== null\n && !this.normalizedIncrementalFontPolicy.allowedFontIds.has(fontId)\n ) {\n return 'font-not-allowed';\n }\n if (\n packageId !== null\n && this.normalizedIncrementalFontPolicy.blockedPackageIds !== null\n && this.normalizedIncrementalFontPolicy.blockedPackageIds.has(packageId)\n ) {\n return 'package-blocked';\n }\n return null;\n }\n\n private releasePrimaryFontShardReference(primaryFontId: number, shardKey: string, shardFontId: number): void {\n const fontState = this.ensureIncrementalFontState(primaryFontId);\n fontState.appliedSegmentIds.delete(shardKey);\n fontState.evictedSegmentIds.add(shardKey);\n fontState.revision += 1;\n\n const trackedShardKeys = this.shardKeysByPrimaryFont.get(primaryFontId);\n trackedShardKeys?.delete(shardKey);\n if (trackedShardKeys !== undefined && trackedShardKeys.size === 0) {\n this.shardKeysByPrimaryFont.delete(primaryFontId);\n }\n\n const fallbacks = this.fontFallbacks.get(primaryFontId);\n if (fallbacks !== undefined) {\n this.fontFallbacks.set(\n primaryFontId,\n fallbacks.filter((fallbackId) => fallbackId !== shardFontId),\n );\n }\n this.ui._ui_unregister_font_fallback(primaryFontId, shardFontId);\n this.ui._ui_font_loaded(primaryFontId);\n }\n\n private evictIncrementalShard(shardKey: string): void {\n const shard = this.incrementalShardCache.get(shardKey);\n if (shard === undefined) {\n return;\n }\n for (const primaryFontId of shard.primaryFontIds) {\n this.releasePrimaryFontShardReference(primaryFontId, shardKey, shard.fontId);\n }\n this.incrementalShardCache.delete(shardKey);\n this.evictedShardKeys.push(shardKey);\n if (this.evictedShardKeys.length > 32) {\n this.evictedShardKeys.splice(0, this.evictedShardKeys.length - 32);\n }\n this.unregisterFont(shard.fontId);\n this.onCommitFrame();\n }\n\n private ensureShardCacheCapacityForNewEntry(): void {\n while (this.incrementalShardCache.size >= this.normalizedIncrementalFontPolicy.maxCachedShardFonts) {\n let leastRecentlyUsed: InternalIncrementalShardCacheEntry | null = null;\n for (const shard of this.incrementalShardCache.values()) {\n if (leastRecentlyUsed === null || shard.lastAccessTick < leastRecentlyUsed.lastAccessTick) {\n leastRecentlyUsed = shard;\n }\n }\n if (leastRecentlyUsed === null) {\n return;\n }\n this.evictIncrementalShard(leastRecentlyUsed.shardKey);\n }\n }\n\n private trimShardCacheToPolicyLimit(): void {\n while (this.incrementalShardCache.size > this.normalizedIncrementalFontPolicy.maxCachedShardFonts) {\n let leastRecentlyUsed: InternalIncrementalShardCacheEntry | null = null;\n for (const shard of this.incrementalShardCache.values()) {\n if (leastRecentlyUsed === null || shard.lastAccessTick < leastRecentlyUsed.lastAccessTick) {\n leastRecentlyUsed = shard;\n }\n }\n if (leastRecentlyUsed === null) {\n return;\n }\n this.evictIncrementalShard(leastRecentlyUsed.shardKey);\n }\n }\n\n private ensureIncrementalFontState(fontId: number): InternalIncrementalFontState {\n let state = this.incrementalFontStates.get(fontId);\n if (state !== undefined) {\n return state;\n }\n state = {\n sourceUrl: null,\n sourceState: 'unknown',\n requestedSegmentIds: new Set<string>(),\n pendingSegmentIds: new Set<string>(),\n appliedSegmentIds: new Set<string>(),\n evictedSegmentIds: new Set<string>(),\n requestedCharactersByFamily: new Map<string, Set<string>>(),\n revision: 0,\n blockedPackageIds: new Set<string>(),\n lastBlockedReason: null,\n };\n this.incrementalFontStates.set(fontId, state);\n return state;\n }\n\n private rememberFontSource(fontId: number, url: string): void {\n const current = this.fontLoadStates.get(fontId);\n if (current !== undefined && current.url === url && (current.state === 'loading' || current.state === 'loaded')) {\n return;\n }\n this.fontLoadStates.set(fontId, { url, state: 'known' });\n const state = this.ensureIncrementalFontState(fontId);\n const previousUrl = state.sourceUrl;\n state.sourceUrl = url;\n if (state.sourceState === 'unknown' || state.sourceState === 'failed' || previousUrl !== url) {\n state.sourceState = 'known';\n }\n }\n\n private markFontLoading(fontId: number, url: string): void {\n this.fontLoadStates.set(fontId, { url, state: 'loading' });\n const state = this.ensureIncrementalFontState(fontId);\n state.sourceUrl = url;\n state.sourceState = 'loading';\n }\n\n private markFontLoaded(fontId: number, url: string): void {\n this.fontLoadStates.set(fontId, { url, state: 'loaded' });\n const state = this.ensureIncrementalFontState(fontId);\n state.sourceUrl = url;\n state.sourceState = 'loaded';\n }\n\n private markFontLoadFailed(fontId: number, url: string): void {\n this.fontLoadStates.set(fontId, { url, state: 'failed' });\n const state = this.ensureIncrementalFontState(fontId);\n state.sourceUrl = url;\n state.sourceState = 'failed';\n }\n\n public isFontLoaded(fontId: number, url?: string): boolean {\n const current = this.fontLoadStates.get(fontId);\n return current !== undefined\n && current.state === 'loaded'\n && (url === undefined || current.url === url);\n }\n\n private async fetchFontBytes(url: string, replay = false): Promise<Uint8Array> {\n const response = await fetch(url);\n if (!response.ok) {\n const verb = replay ? 'refetch' : 'fetch';\n throw new Error(`Failed to ${verb} font ${url}: ${String(response.status)}`);\n }\n return new Uint8Array(await response.arrayBuffer());\n }\n\n private reportNonFatalFontError(context: string, error: unknown): void {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`[fui_host] ${context}: ${message}`);\n }\n\n private applyFontFallbacks(fontId: number, fallbackIds: readonly number[]): void {\n this.fontFallbacks.set(fontId, [...fallbackIds]);\n for (const fallbackId of fallbackIds) {\n this.ui._ui_register_font_fallback(fontId, fallbackId);\n }\n }\n\n private async ensureRegisteredFont(\n fontId: number,\n url: string,\n fallbackIds: readonly number[] = [],\n ): Promise<void> {\n this.rememberFontSource(fontId, url);\n const pending = this.pendingFontLoads.get(fontId);\n if (pending !== undefined) {\n await pending;\n return;\n }\n const request = this.registerFont(\n fallbackIds.length > 0\n ? {\n id: fontId,\n url,\n fallbackIds,\n }\n : {\n id: fontId,\n url,\n },\n ).finally(() => {\n this.pendingFontLoads.delete(fontId);\n });\n this.pendingFontLoads.set(fontId, request);\n await request;\n }\n\n private async ensureFontWithFallbacks(fontId: number, visited = new Set<number>()): Promise<void> {\n if (visited.has(fontId)) {\n return;\n }\n visited.add(fontId);\n if (!this.isFontLoaded(fontId)) {\n const lazyUrl = this.lazyFontSources.get(fontId);\n if (lazyUrl !== undefined) {\n await this.ensureRegisteredFont(fontId, lazyUrl);\n } else {\n const builtInFont = getBuiltInBridgeFont(fontId);\n if (builtInFont !== undefined) {\n await this.ensureRegisteredFont(\n builtInFont.id,\n getBridgeAssetUrl(builtInFont.assetFile),\n builtInFont.fallbackIds,\n );\n }\n }\n }\n const fallbackIds = this.fontFallbacks.get(fontId) ?? [];\n await Promise.all(fallbackIds.map((fallbackId) => this.ensureFontWithFallbacks(fallbackId, visited)));\n }\n\n private registerSingleFontFallback(fontId: number, fallbackFontId: number): void {\n const existingFallbacks = this.fontFallbacks.get(fontId) ?? [];\n if (!existingFallbacks.includes(fallbackFontId)) {\n this.fontFallbacks.set(fontId, [...existingFallbacks, fallbackFontId]);\n }\n this.ui._ui_register_font_fallback(fontId, fallbackFontId);\n }\n\n private async ensureIncrementalShardFont(\n request: ResolvedIncrementalFontShardRequest & { readonly shardKey: string },\n ): Promise<number> {\n const cachedShard = this.incrementalShardCache.get(request.shardKey);\n if (cachedShard !== undefined) {\n this.updateShardAccess(request.shardKey);\n return cachedShard.fontId;\n }\n const existing = this.pendingIncrementalShardLoads.get(request.shardKey);\n if (existing !== undefined) {\n return await existing;\n }\n const pending = (async () => {\n this.ensureShardCacheCapacityForNewEntry();\n const fontId = this.nextIncrementalFontId;\n this.nextIncrementalFontId += 1;\n const shard = await fetchGoogleFontShardBytes(request.googleFamily, request.text);\n this.registerFontBytes(fontId, shard.bytes);\n this.loadedFonts.set(fontId, shard.url);\n this.markFontLoaded(fontId, shard.url);\n this.shardAccessTick += 1;\n this.incrementalShardCache.set(request.shardKey, {\n shardKey: request.shardKey,\n fontId,\n sizeBytes: shard.bytes.byteLength,\n primaryFontIds: new Set<number>(),\n lastAccessTick: this.shardAccessTick,\n });\n return fontId;\n })().finally(() => {\n this.pendingIncrementalShardLoads.delete(request.shardKey);\n });\n this.pendingIncrementalShardLoads.set(request.shardKey, pending);\n return await pending;\n }\n\n private async flushPendingIncrementalFamilyRequest(primaryFontId: number, familyKey: string): Promise<void> {\n const pendingKey = `${String(primaryFontId)}:${familyKey}`;\n this.scheduledIncrementalFamilyFlushes.delete(pendingKey);\n const pendingRequest = this.pendingIncrementalFamilyRequests.get(pendingKey);\n if (pendingRequest === undefined) {\n return;\n }\n this.pendingIncrementalFamilyRequests.delete(pendingKey);\n\n const fontState = this.ensureIncrementalFontState(primaryFontId);\n const text = Array.from(pendingRequest.characters.values()).join('');\n if (text.length === 0) {\n return;\n }\n const shardKey = `${pendingRequest.familyKey}:${text}`;\n fontState.requestedSegmentIds.add(shardKey);\n fontState.pendingSegmentIds.add(shardKey);\n this.logs.incrementalFontPackageRequests.push({\n primaryFontId,\n coverageKind: pendingRequest.coverageKind,\n packageId: pendingRequest.packageId,\n segmentIds: [shardKey],\n sampleText: text,\n });\n\n try {\n const shardFontId = await this.ensureIncrementalShardFont({\n packageId: pendingRequest.packageId,\n coverageKind: pendingRequest.coverageKind,\n familyKey: pendingRequest.familyKey,\n googleFamily: pendingRequest.googleFamily,\n text,\n shardKey,\n });\n this.registerSingleFontFallback(primaryFontId, shardFontId);\n const shard = this.incrementalShardCache.get(shardKey);\n if (shard !== undefined) {\n shard.primaryFontIds.add(primaryFontId);\n this.updateShardAccess(shardKey);\n }\n let primaryShardKeys = this.shardKeysByPrimaryFont.get(primaryFontId);\n if (primaryShardKeys === undefined) {\n primaryShardKeys = new Set<string>();\n this.shardKeysByPrimaryFont.set(primaryFontId, primaryShardKeys);\n }\n primaryShardKeys.add(shardKey);\n if (!fontState.appliedSegmentIds.has(shardKey)) {\n fontState.appliedSegmentIds.add(shardKey);\n fontState.revision += 1;\n }\n fontState.pendingSegmentIds.delete(shardKey);\n fontState.evictedSegmentIds.delete(shardKey);\n this.ui._ui_font_loaded(primaryFontId);\n this.onCommitFrame();\n } catch (error: unknown) {\n fontState.requestedSegmentIds.delete(shardKey);\n fontState.pendingSegmentIds.delete(shardKey);\n const requestedCharacters = fontState.requestedCharactersByFamily.get(pendingRequest.familyKey);\n if (requestedCharacters !== undefined) {\n for (const character of text) {\n requestedCharacters.delete(character);\n }\n if (requestedCharacters.size === 0) {\n fontState.requestedCharactersByFamily.delete(pendingRequest.familyKey);\n }\n }\n this.reportNonFatalFontError(\n `incremental font shard fetch failed for ${pendingRequest.googleFamily} (${shardKey})`,\n error,\n );\n throw error;\n }\n }\n\n public async ensureFont(fontId: number): Promise<void> {\n await this.ensureFontWithFallbacks(fontId);\n }\n\n public async ensureBuiltInFont(fontId: number): Promise<void> {\n const builtInFont = getBuiltInBridgeFont(fontId);\n if (builtInFont === undefined) {\n throw new Error(`Unknown built-in font id ${String(fontId)}.`);\n }\n await this.ensureRegisteredFont(\n builtInFont.id,\n getBridgeAssetUrl(builtInFont.assetFile),\n builtInFont.fallbackIds,\n );\n }\n\n public getIncrementalFontCacheState(): IncrementalFontCacheState {\n return {\n maxCachedShardFonts: this.incrementalFontPolicy.maxCachedShardFonts,\n cachedShardCount: this.incrementalShardCache.size,\n cachedShardKeys: Array.from(this.incrementalShardCache.keys()),\n evictedShardKeys: [...this.evictedShardKeys],\n };\n }\n\n public getIncrementalFontPolicy(): IncrementalFontPolicy {\n return {\n autoGrow: this.incrementalFontPolicy.autoGrow,\n maxCachedShardFonts: this.incrementalFontPolicy.maxCachedShardFonts,\n allowedFontIds: this.incrementalFontPolicy.allowedFontIds === null\n ? null\n : [...this.incrementalFontPolicy.allowedFontIds],\n blockedPackageIds: this.incrementalFontPolicy.blockedPackageIds === null\n ? null\n : [...this.incrementalFontPolicy.blockedPackageIds],\n };\n }\n\n public setIncrementalFontPolicy(policy: Partial<IncrementalFontPolicy>): void {\n const nextPolicy: IncrementalFontPolicy = {\n autoGrow: policy.autoGrow ?? this.incrementalFontPolicy.autoGrow,\n maxCachedShardFonts: policy.maxCachedShardFonts ?? this.incrementalFontPolicy.maxCachedShardFonts,\n allowedFontIds: 'allowedFontIds' in policy\n ? (policy.allowedFontIds ?? null)\n : this.incrementalFontPolicy.allowedFontIds,\n blockedPackageIds: 'blockedPackageIds' in policy\n ? (policy.blockedPackageIds ?? null)\n : this.incrementalFontPolicy.blockedPackageIds,\n };\n this.normalizedIncrementalFontPolicy = this.normalizePolicy(nextPolicy);\n this.incrementalFontPolicy = {\n ...nextPolicy,\n maxCachedShardFonts: this.normalizedIncrementalFontPolicy.maxCachedShardFonts,\n };\n this.trimShardCacheToPolicyLimit();\n }\n\n public getIncrementalFontState(fontId: number): IncrementalFontRuntimeState | null {\n const state = this.incrementalFontStates.get(fontId);\n if (state === undefined) {\n return null;\n }\n return {\n fontId,\n sourceUrl: state.sourceUrl,\n sourceState: state.sourceState,\n loaded: this.isFontLoaded(fontId),\n requestedSegmentIds: Array.from(state.requestedSegmentIds.values()),\n pendingSegmentIds: Array.from(state.pendingSegmentIds.values()),\n appliedSegmentIds: Array.from(state.appliedSegmentIds.values()),\n evictedSegmentIds: Array.from(state.evictedSegmentIds.values()),\n revision: state.revision,\n autoGrowAllowed: this.getAutoGrowBlockReason(fontId, null) === null,\n blockedPackageIds: Array.from(state.blockedPackageIds.values()),\n lastBlockedReason: state.lastBlockedReason,\n };\n }\n\n public getClipboardFontUrl(fontId: number): string | null {\n const loadedUrl = this.loadedFonts.get(fontId);\n if (loadedUrl !== undefined) {\n return loadedUrl;\n }\n const trackedUrl = this.fontLoadStates.get(fontId)?.url;\n if (trackedUrl !== undefined) {\n return trackedUrl;\n }\n const lazyUrl = this.lazyFontSources.get(fontId);\n if (lazyUrl !== undefined) {\n return lazyUrl;\n }\n const builtInFont = getBuiltInBridgeFont(fontId);\n return builtInFont === undefined ? null : getBridgeAssetUrl(builtInFont.assetFile);\n }\n\n public registerLazyFont(fontId: number, url: string): void {\n this.lazyFontSources.set(fontId, url);\n this.rememberFontSource(fontId, url);\n if (this.loadedFonts.get(fontId) !== url) {\n this.loadedFonts.delete(fontId);\n }\n }\n\n public registerFontFallback(fontId: number, fallbackFontId: number): void {\n this.registerSingleFontFallback(fontId, fallbackFontId);\n }\n\n public handleMissingFontCoverage(fontId: number, coverageKind: number, sampleText: string): void {\n const fontState = this.ensureIncrementalFontState(fontId);\n const resolvedRequests = resolveIncrementalFontPackageRequests(fontId, coverageKind, sampleText);\n for (const request of resolvedRequests) {\n const blockReason = this.getAutoGrowBlockReason(fontId, request.packageId);\n if (blockReason !== null) {\n fontState.blockedPackageIds.add(request.packageId);\n fontState.lastBlockedReason = blockReason;\n continue;\n }\n fontState.blockedPackageIds.delete(request.packageId);\n if (fontState.blockedPackageIds.size === 0) {\n fontState.lastBlockedReason = null;\n }\n let requestedCharacters = fontState.requestedCharactersByFamily.get(request.familyKey);\n if (requestedCharacters === undefined) {\n requestedCharacters = new Set<string>();\n fontState.requestedCharactersByFamily.set(request.familyKey, requestedCharacters);\n }\n const pendingKey = `${String(fontId)}:${request.familyKey}`;\n let pendingRequest = this.pendingIncrementalFamilyRequests.get(pendingKey);\n if (pendingRequest === undefined) {\n pendingRequest = {\n packageId: request.packageId,\n coverageKind: request.coverageKind,\n familyKey: request.familyKey,\n googleFamily: request.googleFamily,\n characters: new Set<string>(),\n };\n this.pendingIncrementalFamilyRequests.set(pendingKey, pendingRequest);\n }\n let hasNovelCharacter = false;\n for (const character of request.text) {\n if (requestedCharacters.has(character)) {\n continue;\n }\n requestedCharacters.add(character);\n pendingRequest.characters.add(character);\n hasNovelCharacter = true;\n }\n if (!hasNovelCharacter || this.scheduledIncrementalFamilyFlushes.has(pendingKey)) {\n continue;\n }\n this.scheduledIncrementalFamilyFlushes.add(pendingKey);\n queueMicrotask(() => {\n void this.flushPendingIncrementalFamilyRequest(fontId, request.familyKey).catch(() => undefined);\n });\n }\n }\n\n public async loadFont(fontId: number, url: string): Promise<void> {\n if (this.isFontLoaded(fontId, url)) {\n return;\n }\n this.rememberFontSource(fontId, url);\n this.markFontLoading(fontId, url);\n try {\n const bytes = await this.fetchFontBytes(url);\n this.registerFontBytes(fontId, bytes);\n this.loadedFonts.set(fontId, url);\n this.markFontLoaded(fontId, url);\n this.onCommitFrame();\n } catch (error) {\n if (this.loadedFonts.get(fontId) === url) {\n this.loadedFonts.delete(fontId);\n }\n this.markFontLoadFailed(fontId, url);\n throw error;\n }\n }\n\n public async registerFont(font: BridgeFontRegistration): Promise<void> {\n if (!this.isFontLoaded(font.id, font.url)) {\n await this.loadFont(font.id, font.url);\n }\n if (font.fallbackIds !== undefined) {\n this.applyFontFallbacks(font.id, font.fallbackIds);\n }\n this.onCommitFrame();\n }\n\n public async registerFontStack(stack: BridgeFontStackRegistration): Promise<void> {\n const fallbackFonts = stack.fallbacks ?? [];\n await Promise.all([\n this.loadFont(stack.primary.id, stack.primary.url),\n ...fallbackFonts.map((fallback) => this.loadFont(fallback.id, fallback.url)),\n ]);\n this.applyFontFallbacks(\n stack.primary.id,\n fallbackFonts.map((fallback) => fallback.id),\n );\n this.onCommitFrame();\n }\n\n public async replayLoadedFonts(): Promise<void> {\n const fontReloads = Array.from(this.loadedFonts.entries(), async ([fontId, url]) => {\n const bytes = await this.fetchFontBytes(url, true);\n this.registerFontBytes(fontId, bytes);\n });\n await Promise.all(fontReloads);\n for (const [fontId, fallbackIds] of this.fontFallbacks.entries()) {\n for (const fallbackId of fallbackIds) {\n this.ui._ui_register_font_fallback(fontId, fallbackId);\n }\n }\n }\n}\n", "const textEncoder = new TextEncoder();\n\nexport interface FindOnPageDocument {\n readonly handle: string;\n readonly text: string;\n}\n\nexport interface ResolvedFindSelection {\n readonly handle: string;\n readonly start: number;\n readonly end: number;\n}\n\nfunction utf8ByteLength(text: string): number {\n return textEncoder.encode(text).byteLength;\n}\n\nfunction closestElement(node: Node | null): Element | null {\n if (node instanceof Element) {\n return node;\n }\n return node?.parentElement ?? null;\n}\n\nfunction utf8ByteOffsetFromCodeUnitIndex(text: string, codeUnitIndex: number): number {\n const clampedIndex = Math.max(0, Math.min(codeUnitIndex, text.length));\n return utf8ByteLength(text.slice(0, clampedIndex));\n}\n\nfunction codeUnitIndexFromUtf8ByteOffset(text: string, byteOffset: number): number {\n const target = Math.max(0, Math.min(byteOffset, utf8ByteLength(text)));\n let currentByteOffset = 0;\n let currentIndex = 0;\n while (currentIndex < text.length) {\n const codePoint = text.codePointAt(currentIndex) ?? 0;\n const nextIndex = currentIndex + (codePoint > 0xFFFF ? 2 : 1);\n const nextByteOffset = utf8ByteOffsetFromCodeUnitIndex(text, nextIndex);\n if (nextByteOffset > target) {\n break;\n }\n currentIndex = nextIndex;\n currentByteOffset = nextByteOffset;\n if (currentByteOffset === target) {\n break;\n }\n }\n return currentIndex;\n}\n\nfunction readBoundaryCodeUnitOffset(fragment: HTMLElement, container: Node, offset: number): number | null {\n const range = document.createRange();\n range.selectNodeContents(fragment);\n try {\n range.setEnd(container, offset);\n } catch {\n return null;\n }\n return range.toString().length;\n}\n\nfunction ensureProjectedElement(\n layer: HTMLElement,\n byHandle: Map<string, HTMLDivElement>,\n canvasId: string,\n entry: FindOnPageDocument,\n): HTMLDivElement {\n const existing = byHandle.get(entry.handle);\n if (existing !== undefined) {\n return existing;\n }\n\n const created = document.createElement('div');\n created.setAttribute('data-ed-find-fragment', '1');\n created.setAttribute('data-ed-canvas-id', canvasId);\n created.style.display = 'block';\n created.style.position = 'relative';\n created.style.whiteSpace = 'pre-wrap';\n created.style.wordBreak = 'break-word';\n created.style.pointerEvents = 'none';\n created.style.userSelect = 'text';\n layer.appendChild(created);\n byHandle.set(entry.handle, created);\n return created;\n}\n\nexport class FindOnPageProjector {\n private readonly layer: HTMLDivElement;\n private readonly content: HTMLDivElement;\n private readonly canvasId: string;\n private readonly elementsByHandle = new Map<string, HTMLDivElement>();\n\n public constructor(canvas: HTMLCanvasElement, canvasId: string) {\n const parent = canvas.parentElement;\n if (!(parent instanceof HTMLElement)) {\n throw new Error('Expected scene shell for Find-on-Page projection.');\n }\n\n const layer = document.createElement('div');\n layer.id = `find-on-page-layer-${canvasId}`;\n layer.style.position = 'absolute';\n layer.style.left = '0';\n layer.style.top = '0';\n layer.style.pointerEvents = 'none';\n layer.style.opacity = '0';\n layer.style.overflow = 'hidden';\n layer.style.userSelect = 'text';\n layer.setAttribute('aria-hidden', 'true');\n layer.setAttribute('data-ed-find-root', '1');\n layer.setAttribute('data-ed-canvas-id', canvasId);\n\n const content = document.createElement('div');\n content.id = `find-on-page-content-${canvasId}`;\n content.style.position = 'absolute';\n content.style.left = '0';\n content.style.top = '0';\n content.style.width = '100%';\n content.style.minHeight = '100%';\n content.style.pointerEvents = 'none';\n content.style.userSelect = 'text';\n content.style.whiteSpace = 'pre-wrap';\n content.style.color = 'transparent';\n content.style.background = 'transparent';\n layer.appendChild(content);\n parent.appendChild(layer);\n\n this.layer = layer;\n this.content = content;\n this.canvasId = canvasId;\n }\n\n public syncSize(logicalWidth: number, logicalHeight: number): void {\n const width = `${String(logicalWidth)}px`;\n const height = `${String(logicalHeight)}px`;\n this.layer.style.width = width;\n this.layer.style.height = height;\n }\n\n public update(documents: readonly FindOnPageDocument[]): void {\n const seenHandles = new Set<string>();\n const orderedElements: HTMLDivElement[] = [];\n\n for (const entry of documents) {\n seenHandles.add(entry.handle);\n const element = ensureProjectedElement(this.content, this.elementsByHandle, this.canvasId, entry);\n element.setAttribute('data-ed-handle', entry.handle);\n element.setAttribute('data-ed-start', '0');\n element.setAttribute('data-ed-end', String(utf8ByteLength(entry.text)));\n if (element.textContent !== entry.text) {\n element.textContent = entry.text;\n }\n orderedElements.push(element);\n }\n\n this.content.replaceChildren(...orderedElements);\n for (const [handle] of this.elementsByHandle.entries()) {\n if (seenHandles.has(handle)) {\n continue;\n }\n this.elementsByHandle.delete(handle);\n }\n }\n\n public resolveSelection(selection: Selection | null): ResolvedFindSelection | null {\n if (\n selection === null ||\n selection.rangeCount === 0 ||\n selection.isCollapsed ||\n document.activeElement?.getAttribute('data-effindom-hidden-editor') === 'true'\n ) {\n return null;\n }\n\n const range = selection.getRangeAt(0);\n const startElement = closestElement(range.startContainer);\n const endElement = closestElement(range.endContainer);\n if (\n startElement?.closest('[data-effindom-hidden-editor=\"true\"]') !== null ||\n endElement?.closest('[data-effindom-hidden-editor=\"true\"]') !== null\n ) {\n return null;\n }\n\n const startRoot = startElement?.closest('[data-ed-find-root=\"1\"]');\n const endRoot = endElement?.closest('[data-ed-find-root=\"1\"]');\n const startFragment = startElement?.closest('[data-ed-find-fragment=\"1\"]');\n const endFragment = endElement?.closest('[data-ed-find-fragment=\"1\"]');\n if (\n !(startRoot instanceof HTMLElement) ||\n !(endRoot instanceof HTMLElement) ||\n !(startFragment instanceof HTMLElement) ||\n !(endFragment instanceof HTMLElement) ||\n startRoot !== endRoot ||\n startFragment !== endFragment ||\n startRoot.dataset.edCanvasId !== this.canvasId ||\n startFragment.dataset.edCanvasId !== this.canvasId\n ) {\n return null;\n }\n\n const handle = startFragment.dataset.edHandle;\n const fragmentStart = Number(startFragment.dataset.edStart);\n const fragmentEnd = Number(startFragment.dataset.edEnd);\n if (\n handle === undefined ||\n !Number.isFinite(fragmentStart) ||\n !Number.isFinite(fragmentEnd) ||\n fragmentStart < 0 ||\n fragmentEnd < fragmentStart\n ) {\n return null;\n }\n\n const text = startFragment.textContent ?? '';\n const localStart = readBoundaryCodeUnitOffset(startFragment, range.startContainer, range.startOffset);\n const localEnd = readBoundaryCodeUnitOffset(startFragment, range.endContainer, range.endOffset);\n if (localStart === null || localEnd === null) {\n return null;\n }\n\n const start = fragmentStart + utf8ByteOffsetFromCodeUnitIndex(text, localStart);\n const end = fragmentStart + utf8ByteOffsetFromCodeUnitIndex(text, localEnd);\n if (start >= end || end > fragmentEnd) {\n return null;\n }\n\n return {\n handle,\n start,\n end,\n };\n }\n\n public selectMatch(match: ResolvedFindSelection | null): boolean {\n const selection = document.getSelection();\n if (selection === null) {\n return false;\n }\n if (match === null) {\n selection.removeAllRanges();\n return true;\n }\n\n const fragment = this.elementsByHandle.get(match.handle);\n if (!(fragment instanceof HTMLElement)) {\n return false;\n }\n\n const fragmentStart = Number(fragment.dataset.edStart);\n const fragmentEnd = Number(fragment.dataset.edEnd);\n if (\n !Number.isFinite(fragmentStart) ||\n !Number.isFinite(fragmentEnd) ||\n match.start < fragmentStart ||\n match.end > fragmentEnd ||\n match.start >= match.end\n ) {\n return false;\n }\n\n const text = fragment.textContent ?? '';\n const localStart = match.start - fragmentStart;\n const localEnd = match.end - fragmentStart;\n const startIndex = codeUnitIndexFromUtf8ByteOffset(text, localStart);\n const endIndex = codeUnitIndexFromUtf8ByteOffset(text, localEnd);\n const textNode = fragment.firstChild instanceof Text\n ? fragment.firstChild\n : document.createTextNode(text);\n if (fragment.firstChild !== textNode) {\n fragment.replaceChildren(textNode);\n }\n\n const range = document.createRange();\n range.setStart(textNode, startIndex);\n range.setEnd(textNode, endIndex);\n selection.removeAllRanges();\n selection.addRange(range);\n return true;\n }\n\n public destroy(): void {\n this.elementsByHandle.clear();\n this.layer.remove();\n }\n}\n", "import { FindOnPageProjector, type ResolvedFindSelection } from '../../find-on-page';\nimport type { OpenCanvasFindMatch, OpenCanvasFindState, OpenCanvasTextDocument, UiModule } from '../../core-types';\nimport { DEFAULT_OPEN_CANVAS_FIND_OPTIONS, normalizeOpenCanvasFindOptions } from '../find-session';\nimport { TextDocumentController } from './text-documents';\n\nconst OPEN_CANVAS_FIND_BACKGROUND_COLOR = 0xFFEB3B38;\n\ninterface FindControllerOptions {\n readonly canvas: HTMLCanvasElement;\n readonly ui: UiModule;\n readonly textDocuments: TextDocumentController;\n readonly commitFrame: () => void;\n readonly flushPendingCommit: () => Uint32Array | null;\n}\n\nexport class FindController {\n private readonly findProjector: FindOnPageProjector;\n private activeFindMatch: OpenCanvasFindMatch | null = null;\n private activeFindState: OpenCanvasFindState | null = null;\n private selectionPollTimer: ReturnType<typeof setInterval> | null = null;\n private selectionClearTimer: number | null = null;\n\n public constructor(private readonly options: FindControllerOptions) {\n const runtimeCanvasId = `ed-canvas-${Math.random().toString(36).slice(2, 10)}`;\n this.findProjector = new FindOnPageProjector(options.canvas, runtimeCanvasId);\n window.__bridgeFindMatch = null;\n window.__bridgeFindState = null;\n\n const handleDocumentSelectionChange = () => {\n this.handleSelectionChange();\n };\n document.addEventListener('selectionchange', handleDocumentSelectionChange);\n this.selectionPollTimer = setInterval(() => {\n if (document.hidden) {\n return;\n }\n this.handleSelectionChange();\n }, 100);\n\n this.destroy = (() => {\n if (this.selectionPollTimer !== null) {\n clearInterval(this.selectionPollTimer);\n this.selectionPollTimer = null;\n }\n this.cancelPendingFindClear();\n document.removeEventListener('selectionchange', handleDocumentSelectionChange);\n this.storeFindState(null);\n this.storeFindMatch(null);\n this.findProjector.destroy();\n }).bind(this);\n }\n\n public syncSize(logicalWidth: number, logicalHeight: number): void {\n this.findProjector.syncSize(logicalWidth, logicalHeight);\n }\n\n public syncDocuments(): void {\n this.findProjector.update(this.options.textDocuments.readFindDocuments());\n }\n\n public getFindDocuments(): readonly OpenCanvasTextDocument[] {\n return this.options.textDocuments.readFindDocuments().map((document) => ({ ...document }));\n }\n\n public getFindState(): OpenCanvasFindState | null {\n return this.activeFindState === null\n ? null\n : {\n query: this.activeFindState.query,\n options: { ...this.activeFindState.options },\n matches: this.activeFindState.matches.map((match) => ({ ...match })),\n activeMatchIndex: this.activeFindState.activeMatchIndex,\n };\n }\n\n public activateFindMatch(match: OpenCanvasFindMatch | null, reveal = true): boolean {\n return this.applyRetainedFindMatch(match, reveal);\n }\n\n public setFindState(state: OpenCanvasFindState | null, revealActive = false): boolean {\n return this.applyRetainedFindState(state, revealActive);\n }\n\n public syncFindSelection(clearOnMissing = false): boolean {\n return this.handleSelectionChange(clearOnMissing);\n }\n\n public clearFindMatch(): boolean {\n this.findProjector.selectMatch(null);\n return this.applyRetainedFindMatch(null, false);\n }\n\n public destroy(): void {}\n\n private isBridgeFindDialogOpen(): boolean {\n return document.querySelector('[data-ed-find-dialog=\"1\"][data-ed-open=\"1\"]') !== null;\n }\n\n private cancelPendingFindClear(): void {\n if (this.selectionClearTimer !== null) {\n clearTimeout(this.selectionClearTimer);\n this.selectionClearTimer = null;\n }\n }\n\n private schedulePendingFindClear(): void {\n this.cancelPendingFindClear();\n this.selectionClearTimer = window.setTimeout(() => {\n this.selectionClearTimer = null;\n if (this.isBridgeFindDialogOpen()) {\n return;\n }\n if (this.findProjector.resolveSelection(document.getSelection()) !== null) {\n return;\n }\n if (this.activeFindMatch !== null) {\n this.applyRetainedFindState(null, false);\n }\n }, 150);\n }\n\n private storeFindMatch(match: ResolvedFindSelection | null): void {\n this.activeFindMatch = match === null ? null : { ...match };\n window.__bridgeFindMatch = this.activeFindMatch;\n }\n\n private storeFindState(state: OpenCanvasFindState | null): void {\n this.activeFindState = state === null\n ? null\n : {\n query: state.query,\n options: { ...state.options },\n matches: state.matches.map((match) => ({ ...match })),\n activeMatchIndex: state.activeMatchIndex,\n };\n window.__bridgeFindState = this.activeFindState;\n }\n\n private applyRetainedFindState(\n state: OpenCanvasFindState | null,\n revealActive: boolean,\n ): boolean {\n if (state === null) {\n this.options.ui._ui_clear_text_find_highlights();\n this.options.ui._ui_clear_text_find_match();\n this.options.commitFrame();\n this.options.flushPendingCommit();\n this.storeFindState(null);\n this.storeFindMatch(null);\n return true;\n }\n\n const normalizedOptions = normalizeOpenCanvasFindOptions(state.options);\n if (\n state.activeMatchIndex < -1 ||\n state.activeMatchIndex >= state.matches.length ||\n (state.matches.length === 0 && state.activeMatchIndex !== -1)\n ) {\n return false;\n }\n\n const normalizedMatches: Array<{ readonly handleArg: number | bigint; readonly match: ResolvedFindSelection }> = [];\n for (const match of state.matches) {\n const range = this.options.textDocuments.resolveTextRange(match.handle, match.start, match.end);\n if (range === null) {\n return false;\n }\n normalizedMatches.push({\n handleArg: range.handleArg,\n match: {\n handle: match.handle,\n start: range.start,\n end: range.end,\n },\n });\n }\n\n this.options.ui._ui_clear_text_find_highlights();\n if (normalizedOptions.highlightAll) {\n for (let index = 0; index < normalizedMatches.length; index += 1) {\n if (index === state.activeMatchIndex) {\n continue;\n }\n const entry = normalizedMatches[index];\n if (entry === undefined) {\n continue;\n }\n if (\n this.options.ui._ui_push_text_find_highlight(\n entry.handleArg,\n entry.match.start,\n entry.match.end,\n OPEN_CANVAS_FIND_BACKGROUND_COLOR,\n ) === 0\n ) {\n this.options.ui._ui_clear_text_find_highlights();\n return false;\n }\n }\n }\n\n const activeEntry = state.activeMatchIndex >= 0\n ? normalizedMatches[state.activeMatchIndex] ?? null\n : null;\n if (activeEntry === null) {\n this.options.ui._ui_clear_text_find_match();\n } else {\n if (this.options.ui._ui_set_text_find_match(activeEntry.handleArg, activeEntry.match.start, activeEntry.match.end) === 0) {\n this.options.ui._ui_clear_text_find_highlights();\n return false;\n }\n if (\n revealActive &&\n this.options.ui._ui_reveal_text_range(activeEntry.handleArg, activeEntry.match.start, activeEntry.match.end) === 0\n ) {\n this.options.ui._ui_clear_text_find_highlights();\n return false;\n }\n }\n\n this.options.commitFrame();\n this.options.flushPendingCommit();\n this.storeFindState({\n query: state.query,\n options: normalizedOptions,\n matches: normalizedMatches.map((entry) => ({ ...entry.match })),\n activeMatchIndex: activeEntry === null ? -1 : state.activeMatchIndex,\n });\n this.storeFindMatch(activeEntry?.match ?? null);\n return true;\n }\n\n private applyRetainedFindMatch(\n match: ResolvedFindSelection | null,\n reveal: boolean,\n ): boolean {\n return this.applyRetainedFindState(\n match === null\n ? null\n : {\n query: '',\n options: { ...DEFAULT_OPEN_CANVAS_FIND_OPTIONS },\n matches: [{ ...match }],\n activeMatchIndex: 0,\n },\n reveal,\n );\n }\n\n private handleSelectionChange(clearOnMissing = false): boolean {\n const match = this.findProjector.resolveSelection(document.getSelection());\n if (match === null) {\n if (clearOnMissing && !this.isBridgeFindDialogOpen() && this.activeFindMatch !== null) {\n this.schedulePendingFindClear();\n }\n return false;\n }\n this.cancelPendingFindClear();\n if (\n this.activeFindMatch !== null &&\n this.activeFindMatch.handle === match.handle &&\n this.activeFindMatch.start === match.start &&\n this.activeFindMatch.end === match.end\n ) {\n return true;\n }\n return this.applyRetainedFindMatch(match, true);\n }\n}\n", "import type { SemanticBounds, SemanticNode } from './core-types';\n\nconst ROLE_NONE = 0;\nconst ROLE_BUTTON = 1;\nconst ROLE_TEXTBOX = 2;\nconst ROLE_LINK = 3;\nconst ROLE_HEADING = 4;\nconst ROLE_FORM = 5;\nconst ROLE_LIST = 6;\nconst ROLE_LIST_ITEM = 7;\nconst ROLE_IMAGE = 8;\nconst ROLE_DIALOG = 9;\nconst ROLE_STATIC_TEXT = 10;\nconst ROLE_CHECKBOX = 11;\nconst ROLE_RADIO = 12;\nconst ROLE_RADIO_GROUP = 13;\nconst ROLE_SWITCH = 14;\nconst ROLE_SLIDER = 15;\nconst ROLE_COMBOBOX = 16;\n\nconst STATE_HAS_SELECTED = 1 << 0;\nconst STATE_IS_SELECTED = 1 << 1;\nconst STATE_HAS_EXPANDED = 1 << 2;\nconst STATE_IS_EXPANDED = 1 << 3;\nconst STATE_HAS_DISABLED = 1 << 4;\nconst STATE_IS_DISABLED = 1 << 5;\nconst STATE_HAS_VALUE_RANGE = 1 << 6;\nconst STATE_HAS_READONLY = 1 << 7;\nconst STATE_IS_READONLY = 1 << 8;\nconst STATE_HAS_MULTILINE = 1 << 9;\nconst STATE_IS_MULTILINE = 1 << 10;\n\nconst CHECKED_NONE = 0;\nconst CHECKED_FALSE = 1;\nconst CHECKED_TRUE = 2;\nconst CHECKED_MIXED = 3;\n\nconst ORIENTATION_NONE = 0;\nconst ORIENTATION_HORIZONTAL = 1;\nconst ORIENTATION_VERTICAL = 2;\n\nconst textDecoder = new TextDecoder();\nconst floatWordView = new DataView(new ArrayBuffer(4));\nconst textRunFitCache = new WeakMap<HTMLSpanElement, {\n readonly key: string;\n readonly scaleX: number;\n readonly scaleY: number;\n readonly translateX: number;\n readonly translateY: number;\n}>();\n\ninterface SemanticRoleDescriptor {\n readonly roleName: string;\n readonly tagName: string;\n readonly ariaRole: string | null;\n}\n\ninterface SemanticTextLayout {\n readonly bounds: SemanticBounds;\n}\n\nconst SEMANTIC_ROLE_DESCRIPTORS: Record<number, SemanticRoleDescriptor> = {\n [ROLE_NONE]: { roleName: 'none', tagName: 'span', ariaRole: null },\n [ROLE_BUTTON]: { roleName: 'button', tagName: 'button', ariaRole: 'button' },\n [ROLE_TEXTBOX]: { roleName: 'textbox', tagName: 'input', ariaRole: 'textbox' },\n [ROLE_LINK]: { roleName: 'link', tagName: 'a', ariaRole: 'link' },\n [ROLE_HEADING]: { roleName: 'heading', tagName: 'h1', ariaRole: 'heading' },\n [ROLE_FORM]: { roleName: 'form', tagName: 'form', ariaRole: 'form' },\n [ROLE_LIST]: { roleName: 'list', tagName: 'ul', ariaRole: 'list' },\n [ROLE_LIST_ITEM]: { roleName: 'listitem', tagName: 'li', ariaRole: 'listitem' },\n [ROLE_IMAGE]: { roleName: 'img', tagName: 'div', ariaRole: 'img' },\n [ROLE_DIALOG]: { roleName: 'dialog', tagName: 'dialog', ariaRole: 'dialog' },\n [ROLE_STATIC_TEXT]: { roleName: 'text', tagName: 'p', ariaRole: null },\n [ROLE_CHECKBOX]: { roleName: 'checkbox', tagName: 'input', ariaRole: 'checkbox' },\n [ROLE_RADIO]: { roleName: 'radio', tagName: 'input', ariaRole: 'radio' },\n [ROLE_RADIO_GROUP]: { roleName: 'radiogroup', tagName: 'div', ariaRole: 'radiogroup' },\n [ROLE_SWITCH]: { roleName: 'switch', tagName: 'button', ariaRole: 'switch' },\n [ROLE_SLIDER]: { roleName: 'slider', tagName: 'div', ariaRole: 'slider' },\n [ROLE_COMBOBOX]: { roleName: 'combobox', tagName: 'div', ariaRole: 'combobox' },\n};\n\nfunction decodeCheckedState(checkedState: number): 'false' | 'true' | 'mixed' | undefined {\n if (checkedState === CHECKED_FALSE) {\n return 'false';\n }\n if (checkedState === CHECKED_TRUE) {\n return 'true';\n }\n if (checkedState === CHECKED_MIXED) {\n return 'mixed';\n }\n return undefined;\n}\n\nfunction decodeOrientation(orientation: number): 'horizontal' | 'vertical' | undefined {\n if (orientation === ORIENTATION_HORIZONTAL) {\n return 'horizontal';\n }\n if (orientation === ORIENTATION_VERTICAL) {\n return 'vertical';\n }\n return undefined;\n}\n\nfunction wordToFloat(word: number): number {\n floatWordView.setUint32(0, word >>> 0, true);\n return floatWordView.getFloat32(0, true);\n}\n\nfunction describeRole(role: number): SemanticRoleDescriptor {\n return SEMANTIC_ROLE_DESCRIPTORS[role] ?? {\n roleName: `unknown-${String(role)}`,\n tagName: 'span',\n ariaRole: null,\n };\n}\n\nfunction resolveTagName(node: SemanticNode, descriptor: SemanticRoleDescriptor): string {\n if (node.role === ROLE_TEXTBOX && node.state.multiline === true) {\n return 'textarea';\n }\n return descriptor.tagName;\n}\n\nfunction decodeLabel(words: Uint32Array, startWordIndex: number, labelLength: number): string {\n if (labelLength === 0) {\n return '';\n }\n const byteOffset = words.byteOffset + (startWordIndex * 4);\n const paddedByteLength = Math.ceil(labelLength / 4) * 4;\n const labelBytes = new Uint8Array(words.buffer, byteOffset, paddedByteLength);\n return textDecoder.decode(labelBytes.subarray(0, labelLength));\n}\n\nexport function parseSemanticBuffer(words: Uint32Array): SemanticNode[] {\n if (words.length === 0) {\n return [];\n }\n\n const recordCount = words[0] ?? 0;\n if (recordCount === 0) {\n return [];\n }\n\n let index = 1;\n const nodes: SemanticNode[] = [];\n nodes.length = 0;\n\n for (let recordIndex = 0; recordIndex < recordCount; recordIndex += 1) {\n if ((index + 14) > words.length) {\n throw new Error('Semantic buffer ended mid-record.');\n }\n\n const role = words[index] ?? ROLE_NONE;\n const handleLow = words[index + 1] ?? 0;\n const handleHigh = words[index + 2] ?? 0;\n const stateFlags = words[index + 7] ?? 0;\n const checkedState = words[index + 8] ?? CHECKED_NONE;\n const orientation = words[index + 9] ?? ORIENTATION_NONE;\n const valueNow = wordToFloat(words[index + 10] ?? 0);\n const valueMin = wordToFloat(words[index + 11] ?? 0);\n const valueMax = wordToFloat(words[index + 12] ?? 0);\n const labelLength = words[index + 13] ?? 0;\n const labelWordCount = Math.ceil(labelLength / 4);\n const descriptor = describeRole(role);\n const handle = ((BigInt(handleHigh) << 32n) | BigInt(handleLow)).toString();\n const bounds: SemanticBounds = {\n x: wordToFloat(words[index + 3] ?? 0),\n y: wordToFloat(words[index + 4] ?? 0),\n width: wordToFloat(words[index + 5] ?? 0),\n height: wordToFloat(words[index + 6] ?? 0),\n };\n const state: {\n checked?: 'false' | 'true' | 'mixed';\n selected?: boolean;\n expanded?: boolean;\n disabled?: boolean;\n readonly?: boolean;\n multiline?: boolean;\n orientation?: 'horizontal' | 'vertical';\n valueNow?: number;\n valueMin?: number;\n valueMax?: number;\n } = {};\n const checked = decodeCheckedState(checkedState);\n if (checked !== undefined) {\n state.checked = checked;\n }\n if ((stateFlags & STATE_HAS_SELECTED) !== 0) {\n state.selected = (stateFlags & STATE_IS_SELECTED) !== 0;\n }\n if ((stateFlags & STATE_HAS_EXPANDED) !== 0) {\n state.expanded = (stateFlags & STATE_IS_EXPANDED) !== 0;\n }\n if ((stateFlags & STATE_HAS_DISABLED) !== 0) {\n state.disabled = (stateFlags & STATE_IS_DISABLED) !== 0;\n }\n if ((stateFlags & STATE_HAS_READONLY) !== 0) {\n state.readonly = (stateFlags & STATE_IS_READONLY) !== 0;\n }\n if ((stateFlags & STATE_HAS_MULTILINE) !== 0) {\n state.multiline = (stateFlags & STATE_IS_MULTILINE) !== 0;\n }\n const decodedOrientation = decodeOrientation(orientation);\n if (decodedOrientation !== undefined) {\n state.orientation = decodedOrientation;\n }\n if ((stateFlags & STATE_HAS_VALUE_RANGE) !== 0) {\n state.valueNow = valueNow;\n state.valueMin = valueMin;\n state.valueMax = valueMax;\n }\n index += 14;\n if ((index + labelWordCount) > words.length) {\n throw new Error('Semantic buffer label exceeded record bounds.');\n }\n const label = decodeLabel(words, index, labelLength);\n index += labelWordCount;\n nodes.push({\n role,\n roleName: descriptor.roleName,\n handle,\n bounds,\n label,\n state,\n });\n }\n\n return nodes;\n}\n\nfunction applyNodeFrame(element: HTMLElement, bounds: SemanticBounds): void {\n element.style.left = `${String(bounds.x)}px`;\n element.style.top = `${String(bounds.y)}px`;\n element.style.width = `${String(bounds.width)}px`;\n element.style.height = `${String(bounds.height)}px`;\n}\n\nfunction ensureTextRun(element: HTMLElement): HTMLSpanElement {\n const existing = element.firstElementChild;\n if (existing instanceof HTMLSpanElement && existing.getAttribute('data-semantic-text-run') === 'true') {\n return existing;\n }\n const textRun = document.createElement('span');\n textRun.setAttribute('data-semantic-text-run', 'true');\n textRun.style.position = 'absolute';\n textRun.style.left = '0';\n textRun.style.top = '0';\n textRun.style.display = 'block';\n textRun.style.pointerEvents = 'none';\n textRun.style.margin = '0';\n textRun.style.padding = '0';\n textRun.style.border = '0';\n element.replaceChildren(textRun);\n return textRun;\n}\n\nfunction ensureTextRunContent(textRun: HTMLSpanElement): HTMLSpanElement {\n const existing = textRun.firstElementChild;\n if (existing instanceof HTMLSpanElement && existing.getAttribute('data-semantic-text-content') === 'true') {\n return existing;\n }\n const textContent = document.createElement('span');\n textContent.setAttribute('data-semantic-text-content', 'true');\n textContent.style.display = 'inline-block';\n textContent.style.margin = '0';\n textContent.style.padding = '0';\n textContent.style.border = '0';\n textContent.style.whiteSpace = 'pre-wrap';\n textContent.style.overflowWrap = 'break-word';\n textContent.style.color = 'inherit';\n textContent.style.webkitTextFillColor = 'inherit';\n textContent.style.transformOrigin = 'top left';\n textRun.replaceChildren(textContent);\n return textContent;\n}\n\nfunction ensureTextNode(textContent: HTMLSpanElement): Text {\n if (textContent.childNodes.length === 1) {\n const onlyChild = textContent.firstChild;\n if (onlyChild instanceof Text) {\n return onlyChild;\n }\n }\n const textNode = document.createTextNode('');\n textContent.replaceChildren(textNode);\n return textNode;\n}\n\nfunction clearTextRun(element: HTMLElement): void {\n const existing = element.firstElementChild;\n if (existing instanceof HTMLSpanElement && existing.getAttribute('data-semantic-text-run') === 'true') {\n textRunFitCache.delete(existing);\n existing.remove();\n }\n}\n\nfunction applyTextRunLayout(\n textRun: HTMLSpanElement,\n nodeBounds: SemanticBounds,\n textLayout: SemanticTextLayout | undefined,\n): void {\n if (textLayout === undefined) {\n textRunFitCache.delete(textRun);\n const textContent = ensureTextRunContent(textRun);\n textRun.style.left = '0';\n textRun.style.top = '0';\n textRun.style.width = '';\n textRun.style.height = '';\n textRun.style.overflow = 'visible';\n textContent.style.width = '';\n textContent.style.height = '';\n textContent.style.transform = '';\n return;\n }\n\n const textContent = ensureTextRunContent(textRun);\n const offsetX = textLayout.bounds.x - nodeBounds.x;\n const offsetY = textLayout.bounds.y - nodeBounds.y;\n textRun.style.left = `${String(offsetX)}px`;\n textRun.style.top = `${String(offsetY)}px`;\n textRun.style.width = `${String(textLayout.bounds.width)}px`;\n textRun.style.height = `${String(textLayout.bounds.height)}px`;\n textRun.style.overflow = 'hidden';\n textContent.style.width = `${String(textLayout.bounds.width)}px`;\n textContent.style.height = '';\n textContent.style.transform = '';\n const firstChild = textContent.firstChild;\n const textValue = firstChild instanceof Text ? firstChild.data : '';\n const fitKey = [\n textValue,\n textLayout.bounds.width.toFixed(3),\n textLayout.bounds.height.toFixed(3),\n ].join('\\u001f');\n const cachedFit = textRunFitCache.get(textRun);\n if (cachedFit?.key === fitKey) {\n textContent.style.transform = `matrix(${String(cachedFit.scaleX)}, 0, 0, ${String(cachedFit.scaleY)}, ${String(cachedFit.translateX)}, ${String(cachedFit.translateY)})`;\n return;\n }\n const measuredChild = textContent.firstChild;\n let scaleX = 1;\n let scaleY = 1;\n let translateX = 0;\n let translateY = 0;\n if (measuredChild instanceof Text && measuredChild.data.length > 0) {\n const range = document.createRange();\n range.selectNodeContents(measuredChild);\n const measured = range.getBoundingClientRect();\n const contentRect = textContent.getBoundingClientRect();\n const nextScaleX = measured.width > 0 ? textLayout.bounds.width / measured.width : 1;\n const nextScaleY = measured.height > 0 ? textLayout.bounds.height / measured.height : 1;\n scaleX = Number.isFinite(nextScaleX) && nextScaleX > 0 ? nextScaleX : 1;\n scaleY = Number.isFinite(nextScaleY) && nextScaleY > 0 ? nextScaleY : 1;\n const localX = measured.x - contentRect.x;\n const localY = measured.y - contentRect.y;\n translateX = Number.isFinite(localX) ? -(localX * scaleX) : 0;\n translateY = Number.isFinite(localY) ? -(localY * scaleY) : 0;\n }\n textContent.style.transform = `matrix(${String(scaleX)}, 0, 0, ${String(scaleY)}, ${String(translateX)}, ${String(translateY)})`;\n textRunFitCache.set(textRun, {\n key: fitKey,\n scaleX,\n scaleY,\n translateX,\n translateY,\n });\n}\n\nfunction syncOrderedChildren(container: HTMLElement, orderedElements: readonly HTMLElement[]): void {\n let nextChild = container.firstElementChild as HTMLElement | null;\n for (const element of orderedElements) {\n if (element === nextChild) {\n nextChild = nextChild.nextElementSibling as HTMLElement | null;\n continue;\n }\n container.insertBefore(element, nextChild);\n }\n while (nextChild !== null) {\n const stale = nextChild;\n nextChild = stale.nextElementSibling as HTMLElement | null;\n stale.remove();\n }\n}\n\nfunction boundsContain(container: SemanticBounds, candidate: SemanticBounds): boolean {\n return candidate.x >= container.x &&\n candidate.y >= container.y &&\n (candidate.x + candidate.width) <= (container.x + container.width) &&\n (candidate.y + candidate.height) <= (container.y + container.height);\n}\n\nfunction ensureProjectedElement(\n layer: HTMLElement,\n byHandle: Map<string, HTMLElement>,\n node: SemanticNode,\n): HTMLElement {\n const descriptor = describeRole(node.role);\n const tagName = resolveTagName(node, descriptor);\n const existing = byHandle.get(node.handle);\n if (existing?.tagName.toLowerCase() === tagName) {\n return existing;\n }\n\n const created = document.createElement(tagName);\n created.setAttribute('data-handle', node.handle);\n created.style.position = 'absolute';\n created.style.pointerEvents = 'none';\n created.style.margin = '0';\n created.style.padding = '0';\n created.style.boxSizing = 'border-box';\n created.style.background = 'transparent';\n created.style.border = '0';\n created.style.outline = 'none';\n created.style.appearance = 'none';\n created.style.webkitAppearance = 'none';\n created.style.color = 'transparent';\n created.style.webkitTextFillColor = 'transparent';\n created.style.caretColor = 'transparent';\n created.style.lineHeight = 'normal';\n created.tabIndex = -1;\n\n if (tagName === 'input') {\n const input = created as HTMLInputElement;\n if (node.role === ROLE_CHECKBOX) {\n input.type = 'checkbox';\n } else if (node.role === ROLE_RADIO) {\n input.type = 'radio';\n } else {\n input.type = 'text';\n }\n input.readOnly = node.state.readonly ?? true;\n } else if (tagName === 'textarea') {\n const textarea = created as HTMLTextAreaElement;\n textarea.readOnly = node.state.readonly ?? true;\n textarea.rows = 1;\n textarea.style.resize = 'none';\n }\n\n if (node.role === ROLE_TEXTBOX && node.state.multiline === true) {\n created.setAttribute('aria-multiline', 'true');\n }\n\n if (existing?.parentElement === layer) {\n layer.replaceChild(created, existing);\n } else {\n layer.appendChild(created);\n }\n\n byHandle.set(node.handle, created);\n return created;\n}\n\nfunction cloneNode(node: SemanticNode): SemanticNode {\n return {\n role: node.role,\n roleName: node.roleName,\n handle: node.handle,\n bounds: {\n x: node.bounds.x,\n y: node.bounds.y,\n width: node.bounds.width,\n height: node.bounds.height,\n },\n label: node.label,\n state: { ...node.state },\n };\n}\n\nfunction roleNeedsAriaLabel(role: number): boolean {\n return role === ROLE_BUTTON ||\n role === ROLE_TEXTBOX ||\n role === ROLE_IMAGE ||\n role === ROLE_DIALOG ||\n role === ROLE_CHECKBOX ||\n role === ROLE_RADIO ||\n role === ROLE_SLIDER ||\n role === ROLE_COMBOBOX;\n}\n\nfunction roleUsesTextContent(role: number): boolean {\n return role !== ROLE_BUTTON && role !== ROLE_IMAGE;\n}\n\nfunction describeAnnouncementRole(node: SemanticNode): string {\n switch (node.role) {\n case ROLE_BUTTON:\n return 'button';\n case ROLE_TEXTBOX:\n return node.state.multiline === true ? 'text area' : 'text input';\n case ROLE_LINK:\n return 'link';\n case ROLE_HEADING:\n return 'heading';\n case ROLE_FORM:\n return 'form';\n case ROLE_LIST:\n return 'list';\n case ROLE_LIST_ITEM:\n return 'list item';\n case ROLE_IMAGE:\n return 'image';\n case ROLE_DIALOG:\n return 'dialog';\n case ROLE_STATIC_TEXT:\n return 'text';\n case ROLE_CHECKBOX:\n return 'checkbox';\n case ROLE_RADIO:\n return 'radio button';\n case ROLE_RADIO_GROUP:\n return 'radio group';\n case ROLE_SWITCH:\n return 'switch';\n case ROLE_SLIDER:\n return 'slider';\n case ROLE_COMBOBOX:\n return 'combo box';\n default:\n return node.roleName;\n }\n}\n\nfunction buildNodeAnnouncement(\n node: SemanticNode,\n textByHandle: Readonly<Record<string, string>>,\n): string {\n const parts: string[] = [];\n const label = node.role === ROLE_TEXTBOX && node.label.length === 0\n ? (textByHandle[node.handle] ?? '')\n : node.label;\n if (label.length > 0) {\n parts.push(label);\n }\n if (!(node.role === ROLE_SLIDER && label.length > 0)) {\n parts.push(describeAnnouncementRole(node));\n }\n if (node.state.checked === 'mixed') {\n parts.push('mixed');\n } else if (node.state.checked === 'true') {\n parts.push('checked');\n } else if (\n node.state.checked === 'false' &&\n (node.role === ROLE_CHECKBOX || node.role === ROLE_RADIO || node.role === ROLE_SWITCH)\n ) {\n parts.push('unchecked');\n }\n if (node.state.selected === true) {\n parts.push('selected');\n }\n if (node.state.expanded === true) {\n parts.push('expanded');\n } else if (node.state.expanded === false) {\n parts.push('collapsed');\n }\n if (node.state.readonly === true) {\n parts.push('read only');\n }\n if (node.state.disabled === true) {\n parts.push('disabled');\n }\n if (node.state.valueNow !== undefined && Number.isFinite(node.state.valueNow)) {\n parts.push(`value ${String(node.state.valueNow)}`);\n }\n return parts.join(', ');\n}\n\nclass LiveAnnouncer {\n private readonly element: HTMLOutputElement;\n private pendingFrame: number | null = null;\n private pendingTimer: ReturnType<typeof setTimeout> | null = null;\n private clearTimer: ReturnType<typeof setTimeout> | null = null;\n\n public constructor(root: ShadowRoot) {\n const element = document.createElement('output');\n element.id = 'semantic-live-announcer';\n element.setAttribute('role', 'status');\n element.setAttribute('aria-live', 'polite');\n element.setAttribute('aria-atomic', 'true');\n element.setAttribute('data-effindom-live-announcer', 'true');\n element.style.position = 'absolute';\n element.style.width = '1px';\n element.style.height = '1px';\n element.style.margin = '-1px';\n element.style.padding = '0';\n element.style.border = '0';\n element.style.overflow = 'hidden';\n element.style.clip = 'rect(0 0 0 0)';\n element.style.clipPath = 'inset(50%)';\n element.style.whiteSpace = 'nowrap';\n element.style.opacity = '0';\n element.textContent = '\\u00A0';\n root.appendChild(element);\n this.element = element;\n }\n\n public announce(message: string): void {\n if (message.length === 0) {\n return;\n }\n if (this.pendingFrame !== null) {\n cancelAnimationFrame(this.pendingFrame);\n this.pendingFrame = null;\n }\n if (this.pendingTimer !== null) {\n clearTimeout(this.pendingTimer);\n this.pendingTimer = null;\n }\n if (this.clearTimer !== null) {\n clearTimeout(this.clearTimer);\n this.clearTimer = null;\n }\n this.element.textContent = '\\u00A0';\n this.pendingFrame = requestAnimationFrame(() => {\n this.pendingFrame = null;\n this.pendingTimer = setTimeout(() => {\n this.pendingTimer = null;\n this.element.textContent = message;\n this.clearTimer = setTimeout(() => {\n this.clearTimer = null;\n this.element.textContent = '\\u00A0';\n }, 1500);\n }, 50);\n });\n }\n\n public destroy(): void {\n if (this.pendingFrame !== null) {\n cancelAnimationFrame(this.pendingFrame);\n this.pendingFrame = null;\n }\n if (this.pendingTimer !== null) {\n clearTimeout(this.pendingTimer);\n this.pendingTimer = null;\n }\n if (this.clearTimer !== null) {\n clearTimeout(this.clearTimer);\n this.clearTimer = null;\n }\n this.element.remove();\n }\n}\n\nexport class HiddenDomProjector {\n private readonly canvas: HTMLCanvasElement;\n private readonly shell: HTMLDivElement;\n private readonly layer: HTMLDivElement;\n private readonly content: HTMLDivElement;\n private readonly announcer: LiveAnnouncer;\n private readonly elementsByHandle = new Map<string, HTMLElement>();\n\n public constructor(canvas: HTMLCanvasElement) {\n const parent = canvas.parentElement;\n if (!(parent instanceof HTMLElement)) {\n throw new Error('Expected canvas parent element for semantic projection.');\n }\n\n const shell = document.createElement('div');\n shell.id = 'scene-shell';\n shell.style.position = 'relative';\n shell.style.display = 'inline-block';\n shell.style.lineHeight = '0';\n parent.replaceChild(shell, canvas);\n\n const layer = document.createElement('div');\n layer.id = 'semantic-layer';\n layer.style.position = 'absolute';\n layer.style.left = '0';\n layer.style.top = '0';\n layer.style.pointerEvents = 'none';\n layer.style.overflow = 'hidden';\n layer.style.lineHeight = 'normal';\n layer.setAttribute('data-visibility', 'screen-reader-only');\n const shadowRoot = layer.attachShadow({ mode: 'open' });\n\n const content = document.createElement('div');\n content.id = 'semantic-content';\n content.style.position = 'absolute';\n content.style.left = '0';\n content.style.top = '0';\n content.style.width = '100%';\n content.style.height = '100%';\n content.style.padding = '0';\n content.style.border = '0';\n content.style.overflow = 'hidden';\n content.style.whiteSpace = 'nowrap';\n content.style.color = 'transparent';\n content.style.webkitTextFillColor = 'transparent';\n content.style.lineHeight = 'normal';\n shadowRoot.appendChild(content);\n const announcer = new LiveAnnouncer(shadowRoot);\n\n shell.appendChild(canvas);\n shell.appendChild(layer);\n\n canvas.setAttribute('role', 'application');\n canvas.setAttribute('aria-label', 'EffinDom application');\n\n this.canvas = canvas;\n this.shell = shell;\n this.layer = layer;\n this.content = content;\n this.announcer = announcer;\n }\n\n public syncSize(logicalWidth: number, logicalHeight: number): void {\n const width = `${String(logicalWidth)}px`;\n const height = `${String(logicalHeight)}px`;\n this.shell.style.width = width;\n this.shell.style.height = height;\n this.layer.style.width = width;\n this.layer.style.height = height;\n }\n\n public update(\n nodes: readonly SemanticNode[],\n textByHandle: Readonly<Record<string, string>>,\n textLayoutsByHandle: Readonly<Record<string, SemanticTextLayout | undefined>>,\n ): void {\n const seenHandles = new Set<string>();\n const orderedElements: HTMLElement[] = [];\n\n for (const node of nodes) {\n seenHandles.add(node.handle);\n const descriptor = describeRole(node.role);\n const element = ensureProjectedElement(this.content, this.elementsByHandle, node);\n orderedElements.push(element);\n const label = node.role === ROLE_TEXTBOX && node.label.length === 0\n ? (textByHandle[node.handle] ?? '')\n : node.label;\n\n if (descriptor.ariaRole === null) {\n element.removeAttribute('role');\n } else {\n element.setAttribute('role', descriptor.ariaRole);\n }\n if (label.length === 0 || !roleNeedsAriaLabel(node.role)) {\n element.removeAttribute('aria-label');\n } else {\n element.setAttribute('aria-label', label);\n }\n if (node.role === ROLE_DIALOG) {\n element.setAttribute('aria-modal', 'true');\n if (element instanceof HTMLDialogElement) {\n element.setAttribute('open', '');\n }\n } else {\n element.removeAttribute('aria-modal');\n }\n if (node.state.checked === undefined) {\n element.removeAttribute('aria-checked');\n } else {\n element.setAttribute('aria-checked', node.state.checked);\n }\n if (node.state.selected === undefined) {\n element.removeAttribute('aria-selected');\n } else {\n element.setAttribute('aria-selected', node.state.selected ? 'true' : 'false');\n }\n if (node.state.expanded === undefined) {\n element.removeAttribute('aria-expanded');\n } else {\n element.setAttribute('aria-expanded', node.state.expanded ? 'true' : 'false');\n }\n if (node.state.disabled === undefined) {\n element.removeAttribute('aria-disabled');\n } else {\n element.setAttribute('aria-disabled', node.state.disabled ? 'true' : 'false');\n }\n if (node.state.readonly === undefined) {\n element.removeAttribute('aria-readonly');\n } else {\n element.setAttribute('aria-readonly', node.state.readonly ? 'true' : 'false');\n }\n if (node.state.multiline === undefined) {\n element.removeAttribute('aria-multiline');\n } else {\n element.setAttribute('aria-multiline', node.state.multiline ? 'true' : 'false');\n }\n if (node.state.orientation === undefined) {\n element.removeAttribute('aria-orientation');\n } else {\n element.setAttribute('aria-orientation', node.state.orientation);\n }\n if (node.state.valueNow === undefined) {\n element.removeAttribute('aria-valuenow');\n element.removeAttribute('aria-valuemin');\n element.removeAttribute('aria-valuemax');\n } else {\n element.setAttribute('aria-valuenow', String(node.state.valueNow));\n element.setAttribute('aria-valuemin', String(node.state.valueMin ?? 0));\n element.setAttribute('aria-valuemax', String(node.state.valueMax ?? 0));\n }\n element.id = `semantic-node-${node.handle}`;\n element.setAttribute('data-role', node.roleName);\n applyNodeFrame(element, node.bounds);\n\n if (element instanceof HTMLInputElement) {\n if (node.role === ROLE_CHECKBOX) {\n element.checked = node.state.checked === 'true';\n element.indeterminate = node.state.checked === 'mixed';\n } else if (node.role === ROLE_RADIO) {\n element.checked = node.state.checked === 'true';\n } else {\n const nextValue = textByHandle[node.handle] ?? '';\n if (element.value !== nextValue) {\n element.value = nextValue;\n }\n element.readOnly = node.state.readonly ?? true;\n }\n } else if (element instanceof HTMLTextAreaElement) {\n const nextValue = textByHandle[node.handle] ?? '';\n if (element.value !== nextValue) {\n element.value = nextValue;\n }\n element.readOnly = node.state.readonly ?? true;\n } else if (roleUsesTextContent(node.role)) {\n const textRun = ensureTextRun(element);\n const textNode = ensureTextNode(ensureTextRunContent(textRun));\n if (textNode.data !== label) {\n textNode.data = label;\n }\n applyTextRunLayout(textRun, node.bounds, textLayoutsByHandle[node.handle]);\n } else {\n clearTextRun(element);\n if (element.textContent !== '') {\n element.textContent = '';\n }\n }\n }\n\n for (const node of nodes) {\n if (node.role !== ROLE_DIALOG) {\n continue;\n }\n const dialogElement = this.elementsByHandle.get(node.handle);\n if (!(dialogElement instanceof HTMLElement)) {\n continue;\n }\n\n const heading = nodes.find((candidate) =>\n candidate.handle !== node.handle &&\n candidate.role === ROLE_HEADING &&\n boundsContain(node.bounds, candidate.bounds));\n const descriptionNodes = nodes.filter((candidate) =>\n candidate.handle !== node.handle &&\n candidate.role === ROLE_STATIC_TEXT &&\n boundsContain(node.bounds, candidate.bounds));\n\n if (heading !== undefined) {\n dialogElement.setAttribute('aria-labelledby', `semantic-node-${heading.handle}`);\n } else {\n dialogElement.removeAttribute('aria-labelledby');\n }\n\n if (descriptionNodes.length > 0) {\n dialogElement.setAttribute(\n 'aria-describedby',\n descriptionNodes.map((candidate) => `semantic-node-${candidate.handle}`).join(' '),\n );\n } else {\n dialogElement.removeAttribute('aria-describedby');\n }\n }\n\n for (const [handle, element] of this.elementsByHandle.entries()) {\n if (seenHandles.has(handle)) {\n continue;\n }\n element.remove();\n this.elementsByHandle.delete(handle);\n }\n syncOrderedChildren(this.content, orderedElements);\n }\n\n public announceNode(\n handle: string,\n nodes: readonly SemanticNode[],\n textByHandle: Readonly<Record<string, string>>,\n ): void {\n const node = nodes.find((candidate) => candidate.handle === handle);\n if (node === undefined) {\n return;\n }\n this.announcer.announce(buildNodeAnnouncement(node, textByHandle));\n }\n\n public destroy(): void {\n this.announcer.destroy();\n for (const element of this.elementsByHandle.values()) {\n element.remove();\n }\n this.elementsByHandle.clear();\n this.layer.remove();\n const parent = this.shell.parentElement;\n if (parent !== null) {\n parent.replaceChild(this.canvas, this.shell);\n } else {\n this.shell.remove();\n }\n }\n}\n\nexport function cloneSemanticTree(nodes: readonly SemanticNode[]): SemanticNode[] {\n return nodes.map((node) => cloneNode(node));\n}\n", "import { cloneSemanticTree } from '../../semantic';\nimport type {\n OpenCanvasApi,\n OpenCanvasFindOptions,\n UiModule,\n} from '../../core-types';\nimport { findTextInOpenCanvasDocuments } from '../find-session';\nimport { FindController } from './find-controller';\nimport { SemanticController } from './semantic-controller';\nimport { TextDocumentController } from './text-documents';\n\ninterface OpenCanvasApiAdapterOptions {\n readonly ui: UiModule;\n readonly semantic: SemanticController;\n readonly find: FindController;\n readonly textDocuments: TextDocumentController;\n readonly commitFrame: () => void;\n readonly flushPendingCommit: () => Uint32Array | null;\n}\n\nexport class OpenCanvasApiAdapter {\n private readonly api: OpenCanvasApi;\n\n public constructor(private readonly options: OpenCanvasApiAdapterOptions) {\n this.api = {\n getSemanticTree: () => cloneSemanticTree(this.options.semantic.getSemanticTree()),\n getBoundingBox: (handle: string) => this.options.semantic.getBoundingBox(handle),\n getTextVisibleBounds: (handle: string) => {\n const bounds = this.options.textDocuments.readVisibleTextBounds(handle);\n return bounds === null ? null : { ...bounds };\n },\n getTextDocument: (handle: string) => {\n const snapshot = this.options.textDocuments.readTextDocumentSnapshot(handle);\n return snapshot === null ? null : { ...snapshot.document };\n },\n getRangeRects: (handle: string, start: number, end: number) =>\n this.options.textDocuments.readRangeRects(handle, start, end).map((rect) => ({ ...rect })),\n findText: (query: string, options?: OpenCanvasFindOptions) => {\n const results = findTextInOpenCanvasDocuments(this.options.textDocuments.readFindDocuments(), query, options);\n return {\n query: results.query,\n options: { ...results.options },\n matches: results.matches.map((match) => ({ ...match })),\n };\n },\n setFindState: (state, revealActive = false) => this.options.find.setFindState(state, revealActive),\n getFindState: () => this.options.find.getFindState(),\n setFindMatch: (match) => this.options.find.activateFindMatch(match, false),\n revealRange: (handle: string, start: number, end: number) => {\n const range = this.options.textDocuments.resolveTextRange(handle, start, end);\n if (range === null) {\n return false;\n }\n if (this.options.ui._ui_reveal_text_range(range.handleArg, range.start, range.end) === 0) {\n return false;\n }\n this.options.commitFrame();\n this.options.flushPendingCommit();\n return true;\n },\n };\n window.__OPEN_CANVAS_API__ = this.api;\n }\n\n public getApi(): OpenCanvasApi {\n return this.api;\n }\n\n public destroy(): void {\n delete window.__OPEN_CANVAS_API__;\n }\n}\n", "import { cloneSemanticTree, HiddenDomProjector, parseSemanticBuffer } from '../../semantic';\nimport type { SemanticNode, UiModule } from '../../core-types';\nimport type { BridgeInteractionState } from '../local-types';\nimport { extractSemanticBuffer } from '../utils/heap';\nimport { TextDocumentController } from './text-documents';\n\nconst SEMANTIC_ANNOUNCEMENT_DELAY_MS = 50;\n\nexport class SemanticController {\n private readonly projector: HiddenDomProjector;\n private semanticTree: SemanticNode[] = [];\n private semanticTextLayoutsByHandle: Record<string, {\n readonly bounds: SemanticNode['bounds'];\n } | undefined> = {};\n private semanticAnnouncementTimer: number | null = null;\n private scheduledSemanticAnnouncementHandle: string | null = null;\n\n public constructor(\n canvas: HTMLCanvasElement,\n private readonly ui: UiModule,\n private readonly interactionState: BridgeInteractionState,\n private readonly textDocuments: TextDocumentController,\n ) {\n this.projector = new HiddenDomProjector(canvas);\n }\n\n public syncSize(logicalWidth: number, logicalHeight: number): void {\n this.projector.syncSize(logicalWidth, logicalHeight);\n }\n\n public syncSemanticState(): void {\n this.semanticTree = parseSemanticBuffer(extractSemanticBuffer(this.ui));\n for (const node of this.semanticTree) {\n if (node.roleName !== 'textbox') {\n continue;\n }\n if (this.interactionState.textByHandle[node.handle] !== undefined) {\n continue;\n }\n if (node.label.length === 0) {\n continue;\n }\n this.interactionState.textByHandle[node.handle] = node.label;\n }\n this.semanticTextLayoutsByHandle = this.buildSemanticTextLayouts();\n this.projector.update(\n this.semanticTree,\n this.interactionState.textByHandle,\n this.semanticTextLayoutsByHandle,\n );\n const focusedHandle = this.interactionState.getFocusedHandle();\n for (const handle of this.interactionState.consumePendingSemanticAnnouncements()) {\n if (focusedHandle !== null && focusedHandle === handle) {\n this.scheduleSemanticAnnouncement(handle);\n }\n }\n window.__bridgeSemanticTree = cloneSemanticTree(this.semanticTree);\n }\n\n public getSemanticTree(): readonly SemanticNode[] {\n return this.semanticTree;\n }\n\n public getBoundingBox(handle: string): SemanticNode['bounds'] | null {\n const node = this.semanticTree.find((entry) => entry.handle === handle);\n return node === undefined ? null : { ...node.bounds };\n }\n\n public destroy(): void {\n this.cancelPendingSemanticAnnouncement();\n this.semanticTree = [];\n this.semanticTextLayoutsByHandle = {};\n window.__bridgeSemanticTree = [];\n this.projector.destroy();\n }\n\n private cancelPendingSemanticAnnouncement(): void {\n if (this.semanticAnnouncementTimer !== null) {\n window.clearTimeout(this.semanticAnnouncementTimer);\n this.semanticAnnouncementTimer = null;\n }\n this.scheduledSemanticAnnouncementHandle = null;\n }\n\n private scheduleSemanticAnnouncement(handle: string): void {\n this.scheduledSemanticAnnouncementHandle = handle;\n if (this.semanticAnnouncementTimer !== null) {\n window.clearTimeout(this.semanticAnnouncementTimer);\n }\n this.semanticAnnouncementTimer = window.setTimeout(() => {\n this.semanticAnnouncementTimer = null;\n const targetHandle = this.scheduledSemanticAnnouncementHandle;\n this.scheduledSemanticAnnouncementHandle = null;\n if (targetHandle === null || this.interactionState.getFocusedHandle() !== targetHandle) {\n return;\n }\n this.projector.announceNode(targetHandle, this.semanticTree, this.interactionState.textByHandle);\n }, SEMANTIC_ANNOUNCEMENT_DELAY_MS);\n }\n\n private buildSemanticTextLayouts(): Record<string, {\n readonly bounds: SemanticNode['bounds'];\n } | undefined> {\n const layouts = Object.create(null) as Record<string, {\n readonly bounds: SemanticNode['bounds'];\n } | undefined>;\n for (const node of this.semanticTree) {\n if (node.label.length === 0) {\n continue;\n }\n const visibleTextBounds = this.textDocuments.readVisibleTextBounds(node.handle);\n if (visibleTextBounds === null) {\n continue;\n }\n const left = Math.max(node.bounds.x, visibleTextBounds.x);\n const top = Math.max(node.bounds.y, visibleTextBounds.y);\n const right = Math.min(node.bounds.x + node.bounds.width, visibleTextBounds.x + visibleTextBounds.width);\n const bottom = Math.min(node.bounds.y + node.bounds.height, visibleTextBounds.y + visibleTextBounds.height);\n if (right <= left || bottom <= top) {\n continue;\n }\n layouts[node.handle] = {\n bounds: {\n x: left,\n y: top,\n width: right - left,\n height: bottom - top,\n },\n };\n }\n return layouts;\n }\n}\n", "import type {\n OpenCanvasTextDocument,\n SemanticNode,\n UiModule,\n} from '../../core-types';\nimport type { FindOnPageDocument } from '../../find-on-page';\nimport { handleToBigInt, toHeapPointer } from '../utils/encoding';\n\nconst INVALID_TEXT_DOCUMENT_LENGTH = 0xFFFFFFFF;\nconst openCanvasTextDecoder = new TextDecoder();\n\nexport interface TextDocumentMeta {\n readonly handleArg: number | bigint;\n readonly byteLength: number;\n}\n\nexport interface ResolvedTextRange extends TextDocumentMeta {\n readonly start: number;\n readonly end: number;\n}\n\nexport class TextDocumentController {\n public constructor(private readonly ui: UiModule) {}\n\n public readTextDocumentMeta(handle: string): TextDocumentMeta | null {\n const handleArg = this.toUiHandleArgument(handle);\n if (handleArg === null) {\n return null;\n }\n const byteLength = this.ui._ui_get_text_document_utf8_length(handleArg);\n if (byteLength < 0 || (byteLength >>> 0) === INVALID_TEXT_DOCUMENT_LENGTH) {\n return null;\n }\n return { handleArg, byteLength };\n }\n\n public resolveTextRange(handle: string, start: number, end: number): ResolvedTextRange | null {\n const meta = this.readTextDocumentMeta(handle);\n const range = this.normalizeByteRange(start, end);\n if (meta === null || range === null || range.end > meta.byteLength) {\n return null;\n }\n return {\n handleArg: meta.handleArg,\n byteLength: meta.byteLength,\n start: range.start,\n end: range.end,\n };\n }\n\n public readTextDocumentSnapshot(\n handle: string,\n ): { readonly document: OpenCanvasTextDocument; readonly byteLength: number } | null {\n const meta = this.readTextDocumentMeta(handle);\n if (meta === null) {\n return null;\n }\n if (meta.byteLength === 0) {\n return {\n document: { handle, text: '' },\n byteLength: 0,\n };\n }\n\n const textAllocation = toHeapPointer(this.ui, this.ui._malloc(meta.byteLength));\n const textPtr = textAllocation.ptr;\n const textOffset = textAllocation.offset;\n if (textOffset === 0) {\n throw new Error('ui text document malloc failed.');\n }\n\n try {\n const copied = this.ui._ui_copy_text_document_utf8(meta.handleArg, textPtr, meta.byteLength);\n this.ui.refreshHeapViews?.();\n if (copied === 0) {\n return null;\n }\n const text = openCanvasTextDecoder.decode(this.ui.HEAPU8.slice(textOffset, textOffset + meta.byteLength));\n return {\n document: { handle, text },\n byteLength: meta.byteLength,\n };\n } finally {\n this.ui._free(textPtr);\n }\n }\n\n public readVisibleTextBounds(handle: string): SemanticNode['bounds'] | null {\n const handleArg = this.toUiHandleArgument(handle);\n if (handleArg === null) {\n return null;\n }\n const allocation = toHeapPointer(this.ui, this.ui._malloc(16));\n if (allocation.offset === 0) {\n throw new Error('ui visible text bounds malloc failed.');\n }\n const xPtr = allocation.ptr;\n const yPtr = this.addPointerOffset(allocation.ptr, 4);\n const widthPtr = this.addPointerOffset(allocation.ptr, 8);\n const heightPtr = this.addPointerOffset(allocation.ptr, 12);\n try {\n const copied = this.ui._ui_get_text_visible_bounds(handleArg, xPtr, yPtr, widthPtr, heightPtr);\n this.ui.refreshHeapViews?.();\n if (copied === 0) {\n return null;\n }\n const base = allocation.offset >>> 2;\n return {\n x: this.ui.HEAPF32[base] ?? 0,\n y: this.ui.HEAPF32[base + 1] ?? 0,\n width: this.ui.HEAPF32[base + 2] ?? 0,\n height: this.ui.HEAPF32[base + 3] ?? 0,\n };\n } finally {\n this.ui._free(allocation.ptr);\n }\n }\n\n public readRangeRects(handle: string, start: number, end: number): SemanticNode['bounds'][] {\n const range = this.resolveTextRange(handle, start, end);\n if (range === null) {\n return [];\n }\n\n const rectCount = this.ui._ui_get_text_range_rect_count(range.handleArg, range.start, range.end);\n if (rectCount === 0) {\n return [];\n }\n\n const rectWordsAllocation = toHeapPointer(this.ui, this.ui._malloc(rectCount * 16));\n const rectWordsPtr = rectWordsAllocation.ptr;\n const rectWordsOffset = rectWordsAllocation.offset;\n if (rectWordsOffset === 0) {\n throw new Error('ui range rect malloc failed.');\n }\n\n try {\n const copiedCount = this.ui._ui_copy_text_range_rects(\n range.handleArg,\n range.start,\n range.end,\n rectWordsPtr,\n rectCount,\n );\n this.ui.refreshHeapViews?.();\n if (copiedCount === 0) {\n return [];\n }\n const words = this.ui.HEAPF32.slice(rectWordsOffset >>> 2, (rectWordsOffset >>> 2) + (copiedCount * 4));\n const rects: SemanticNode['bounds'][] = [];\n for (let index = 0; index < copiedCount; index += 1) {\n const base = index * 4;\n rects.push({\n x: words[base] ?? 0,\n y: words[base + 1] ?? 0,\n width: words[base + 2] ?? 0,\n height: words[base + 3] ?? 0,\n });\n }\n return rects;\n } finally {\n this.ui._free(rectWordsPtr);\n }\n }\n\n public readFindDocuments(): FindOnPageDocument[] {\n const documents: FindOnPageDocument[] = [];\n for (const handle of this.readTextSnapshotHandles()) {\n const snapshot = this.readTextDocumentSnapshot(handle);\n if (snapshot === null) {\n continue;\n }\n documents.push(snapshot.document);\n }\n return documents;\n }\n\n private readTextSnapshotHandles(): string[] {\n const handleCount = this.ui._ui_get_text_snapshot_handle_count();\n if (handleCount === 0) {\n return [];\n }\n\n const handleWordsAllocation = toHeapPointer(this.ui, this.ui._malloc(handleCount * 8));\n const handleWordsPtr = handleWordsAllocation.ptr;\n const handleWordsOffset = handleWordsAllocation.offset;\n if (handleWordsOffset === 0) {\n throw new Error('ui text snapshot handle malloc failed.');\n }\n\n try {\n const copiedCount = this.ui._ui_copy_text_snapshot_handles(handleWordsPtr, handleCount);\n this.ui.refreshHeapViews?.();\n if (copiedCount === 0) {\n return [];\n }\n const words = this.ui.HEAPU32.slice(handleWordsOffset >>> 2, (handleWordsOffset >>> 2) + (copiedCount * 2));\n const handles: string[] = [];\n for (let index = 0; index < copiedCount; index += 1) {\n const low = words[index * 2] ?? 0;\n const high = words[(index * 2) + 1] ?? 0;\n handles.push(((BigInt(high) << 32n) | BigInt(low)).toString());\n }\n return handles;\n } finally {\n this.ui._free(handleWordsPtr);\n }\n }\n\n private toUiHandleArgument(handle: string): bigint | null {\n try {\n return handleToBigInt(handle);\n } catch {\n return null;\n }\n }\n\n private normalizeByteRange(\n start: number,\n end: number,\n ): { readonly start: number; readonly end: number } | null {\n if (!Number.isInteger(start) || !Number.isInteger(end) || start < 0 || end < 0) {\n return null;\n }\n return {\n start: Math.min(start, end),\n end: Math.max(start, end),\n };\n }\n\n private addPointerOffset(pointer: number | bigint, offset: number): number | bigint {\n return typeof pointer === 'bigint' ? pointer + BigInt(offset) : pointer + offset;\n }\n}\n", "import type {\n BridgeFontRegistration,\n BridgeFontStackRegistration,\n BridgeLoaderInfo,\n BridgeRuntime,\n CoreModule,\n UiModule,\n} from '../core-types';\nimport type { BridgeInteractionState } from './local-types';\nimport { resetBridgeLogs } from './utils/assets';\nimport { normalizeBackendType, handleToBigInt } from './utils/encoding';\nimport { executeCommandBuffer, extractCommandBuffer } from './utils/heap';\nimport { setActiveRenderer } from './utils/backends';\nimport { getCanvasSizeSource, readCanvasLogicalSize } from './events';\nimport { AssetManager } from './runtime/asset-manager';\nimport { IncrementalFontManager } from './runtime/font-manager';\nimport { FindController } from './runtime/find-controller';\nimport { OpenCanvasApiAdapter } from './runtime/open-canvas-api';\nimport { SemanticController } from './runtime/semantic-controller';\nimport { TextDocumentController } from './runtime/text-documents';\n\nconst DEFAULT_LOGICAL_WIDTH = 320;\nconst DEFAULT_LOGICAL_HEIGHT = 220;\nconst UI_EVENT_POINTER_ENTER = 4;\nconst UI_EVENT_POINTER_LEAVE = 5;\n\nexport function createBridgeRuntime(\n core: CoreModule,\n ui: UiModule,\n canvas: HTMLCanvasElement,\n interactionState: BridgeInteractionState,\n loaderInfo: BridgeLoaderInfo,\n): { runtime: BridgeRuntime; destroy(): void } {\n let logicalWidth = DEFAULT_LOGICAL_WIDTH;\n let logicalHeight = DEFAULT_LOGICAL_HEIGHT;\n let needsCommit = false;\n let appFrameHandler: ((timestampMs: number) => void) | null = null;\n let frameRequester: (() => void) | null = null;\n let runtime!: BridgeRuntime;\n\n const fontManager = new IncrementalFontManager(core, ui, interactionState.logs, () => runtime.commitFrame());\n const assetManager = new AssetManager(core, fontManager, () => runtime.commitFrame());\n const textDocuments = new TextDocumentController(ui);\n const semanticController = new SemanticController(canvas, ui, interactionState, textDocuments);\n const findController = new FindController({\n canvas,\n ui,\n textDocuments,\n commitFrame: () => runtime.commitFrame(),\n flushPendingCommit: () => runtime.flushPendingCommit(),\n });\n const openCanvasApiAdapter = new OpenCanvasApiAdapter({\n ui,\n semantic: semanticController,\n find: findController,\n textDocuments,\n commitFrame: () => runtime.commitFrame(),\n flushPendingCommit: () => runtime.flushPendingCommit(),\n });\n\n const syncSemanticAndFindState = (): void => {\n semanticController.syncSemanticState();\n findController.syncDocuments();\n };\n\n const dispatchAppPointerEvent = (eventType: number, handle: bigint, x: number, y: number, modifiers = 0): void => {\n if (handle === 0n) {\n return;\n }\n window.__effindomCallbacks?.onPointerEventWithCoords?.(eventType, handle, x, y, modifiers);\n };\n\n const isLastPointerStillOverCanvas = (): boolean => {\n const { x, y } = interactionState.getLastPointerClientPosition();\n if (x === null || y === null) {\n return false;\n }\n const rect = canvas.getBoundingClientRect();\n return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom;\n };\n\n const syncAppPointerHover = (): void => {\n const { x, y } = interactionState.getLastPointerPosition();\n const previousHandle = interactionState.getLastInteractivePointerHandle();\n const capturedHandle = interactionState.getCapturedPointerHandle();\n if (capturedHandle !== null) {\n if (previousHandle === capturedHandle) {\n return;\n }\n if (previousHandle !== null) {\n dispatchAppPointerEvent(UI_EVENT_POINTER_LEAVE, previousHandle, x, y);\n }\n interactionState.setLastInteractivePointerHandle(capturedHandle);\n dispatchAppPointerEvent(UI_EVENT_POINTER_ENTER, capturedHandle, x, y);\n return;\n }\n const pointerInsideCanvas = interactionState.isPointerInsideCanvas() || isLastPointerStillOverCanvas();\n if (!pointerInsideCanvas) {\n if (previousHandle !== null) {\n interactionState.setLastInteractivePointerHandle(null);\n dispatchAppPointerEvent(UI_EVENT_POINTER_LEAVE, previousHandle, x, y);\n }\n return;\n }\n\n const hitHandle = handleToBigInt(core._ed_hit_test(x, y));\n const currentHandle = hitHandle === 0n ? null : hitHandle;\n if (currentHandle === previousHandle) {\n return;\n }\n if (previousHandle !== null) {\n dispatchAppPointerEvent(UI_EVENT_POINTER_LEAVE, previousHandle, x, y);\n }\n interactionState.setLastInteractivePointerHandle(currentHandle);\n if (currentHandle !== null) {\n dispatchAppPointerEvent(UI_EVENT_POINTER_ENTER, currentHandle, x, y);\n }\n };\n\n const updateCanvasSize = (): void => {\n const dpr = Math.max(1, window.devicePixelRatio || 1);\n const size = readCanvasLogicalSize(canvas);\n logicalWidth = size.width;\n logicalHeight = size.height;\n const physicalWidth = Math.round(logicalWidth * dpr);\n const physicalHeight = Math.round(logicalHeight * dpr);\n\n canvas.style.width = `${String(logicalWidth)}px`;\n canvas.style.height = `${String(logicalHeight)}px`;\n if (physicalWidth !== canvas.width || physicalHeight !== canvas.height) {\n canvas.width = physicalWidth;\n canvas.height = physicalHeight;\n }\n\n semanticController.syncSize(logicalWidth, logicalHeight);\n findController.syncSize(logicalWidth, logicalHeight);\n core._ed_resize(physicalWidth, physicalHeight, dpr);\n ui._ui_resize_window(logicalWidth, logicalHeight);\n syncSemanticAndFindState();\n setActiveRenderer(loaderInfo, normalizeBackendType(core._ed_get_backend_type()));\n };\n\n runtime = {\n core,\n ui,\n canvas,\n openCanvasApi: openCanvasApiAdapter.getApi(),\n logs: interactionState.logs,\n updateCanvasSize,\n extractCommandBuffer: () => extractCommandBuffer(ui),\n executeCommandBuffer: (words: Uint32Array) => {\n executeCommandBuffer(core, words);\n },\n syncCommandBufferToCore: () => {\n const words = extractCommandBuffer(ui);\n executeCommandBuffer(core, words);\n syncSemanticAndFindState();\n syncAppPointerHover();\n return words;\n },\n flushPendingCommit: () => {\n if (!needsCommit && !interactionState.hasPendingTextMutations()) {\n return null;\n }\n if (interactionState.hasPendingTextMutations()) {\n if (needsCommit) {\n needsCommit = false;\n runtime.syncCommandBufferToCore();\n }\n if (interactionState.materializePendingTextMutations()) {\n ui._ui_commit_frame();\n needsCommit = true;\n }\n }\n if (!needsCommit) {\n return null;\n }\n needsCommit = false;\n return runtime.syncCommandBufferToCore();\n },\n hasPendingCommit: () => needsCommit || interactionState.hasPendingTextMutations(),\n commitFrame: () => {\n if (interactionState.hasPendingTextMutations()) {\n if (needsCommit) {\n runtime.flushPendingCommit();\n }\n if (interactionState.materializePendingTextMutations()) {\n ui._ui_commit_frame();\n needsCommit = true;\n frameRequester?.();\n return;\n }\n }\n if (needsCommit) {\n runtime.flushPendingCommit();\n }\n ui._ui_commit_frame();\n needsCommit = true;\n frameRequester?.();\n },\n requestFrame: () => {\n frameRequester?.();\n },\n setFrameRequester: (requester: (() => void) | null) => {\n frameRequester = requester;\n },\n getSemanticTree: () => semanticController.getSemanticTree(),\n getActiveTextHandle: () => interactionState.getActiveTextHandle(),\n getCapturedPointerHandle: () => interactionState.getCapturedPointerHandle(),\n setCapturedPointerHandle: (handle: bigint | null) => {\n interactionState.setCapturedPointerHandle(handle);\n },\n setAppFrameHandler: (handler: ((timestampMs: number) => void) | null) => {\n appFrameHandler = handler;\n frameRequester?.();\n },\n runAppFrameHandler: (timestampMs: number) => {\n appFrameHandler?.(timestampMs);\n },\n uiHasPendingVisualWork: () => ui._ui_has_pending_visual_work() !== 0,\n uiNeedsAnimationFrame: () => ui._ui_needs_animation_frame() !== 0,\n getHandleFromPoint: (x: number, y: number) => handleToBigInt(core._ed_hit_test(x, y)),\n clearPointerHover: () => {\n interactionState.setLastInteractivePointerHandle(null);\n },\n refreshPointerHover: () => {\n syncAppPointerHover();\n },\n getFindDocuments: () => findController.getFindDocuments(),\n activateFindMatch: (match, reveal = true) => findController.activateFindMatch(match, reveal),\n syncFindSelection: (clearOnMissing = false) => findController.syncFindSelection(clearOnMissing),\n clearFindMatch: () => findController.clearFindMatch(),\n ensureFont: async (fontId: number) => {\n await fontManager.ensureFont(fontId);\n },\n ensureBuiltInFont: async (fontId: number) => {\n await fontManager.ensureBuiltInFont(fontId);\n },\n isFontLoaded: (fontId: number, url?: string) => fontManager.isFontLoaded(fontId, url),\n getIncrementalFontState: (fontId: number) => fontManager.getIncrementalFontState(fontId),\n getIncrementalFontCacheState: () => fontManager.getIncrementalFontCacheState(),\n getIncrementalFontPolicy: () => fontManager.getIncrementalFontPolicy(),\n setIncrementalFontPolicy: (policy) => {\n fontManager.setIncrementalFontPolicy(policy);\n },\n getClipboardFontUrl: (fontId: number) => fontManager.getClipboardFontUrl(fontId),\n registerLazyFont: (fontId: number, url: string) => {\n fontManager.registerLazyFont(fontId, url);\n },\n registerFontFallback: (fontId: number, fallbackFontId: number) => {\n fontManager.registerFontFallback(fontId, fallbackFontId);\n },\n handleMissingFontCoverage: (fontId: number, coverageKind: number, sampleText: string) => {\n fontManager.handleMissingFontCoverage(fontId, coverageKind, sampleText);\n },\n loadFont: async (fontId: number, url: string) => {\n await fontManager.loadFont(fontId, url);\n },\n registerFont: async (font: BridgeFontRegistration) => {\n await fontManager.registerFont(font);\n },\n registerFontStack: async (stack: BridgeFontStackRegistration) => {\n await fontManager.registerFontStack(stack);\n },\n loadSvg: async (svgId: number, url: string) => {\n return await assetManager.loadSvg(svgId, url);\n },\n loadTexture: async (textureId: number, url: string) => {\n return await assetManager.loadTexture(textureId, url);\n },\n releaseSvg: (svgId: number) => {\n assetManager.releaseSvg(svgId);\n },\n releaseTexture: (textureId: number) => {\n assetManager.releaseTexture(textureId);\n },\n replayLoadedAssets: async () => {\n await assetManager.replayLoadedAssets();\n },\n resetLogs: () => {\n resetBridgeLogs(interactionState.logs);\n },\n resetAppSession: () => {\n interactionState.resetAppSession();\n },\n };\n\n const refreshCanvas = (): void => {\n runtime.updateCanvasSize();\n runtime.commitFrame();\n };\n\n const canvasSizeSource = getCanvasSizeSource(canvas);\n const resizeObserver = typeof ResizeObserver !== 'undefined'\n ? new ResizeObserver(() => {\n refreshCanvas();\n })\n : null;\n if (resizeObserver !== null) {\n resizeObserver.observe(canvasSizeSource);\n }\n\n return {\n runtime,\n destroy: () => {\n resizeObserver?.disconnect();\n runtime.setFrameRequester(null);\n runtime.clearPointerHover();\n openCanvasApiAdapter.destroy();\n findController.destroy();\n semanticController.destroy();\n canvas.style.cursor = 'default';\n },\n };\n}\n", "import { EdBackendType, EdDeviceState } from '../core-types';\nimport type { BridgeLoaderInfo, BridgeRuntime, EdBackendType as EdBackendTypeValue, CoreModule } from '../core-types';\nimport type { SoftwarePresenter } from './local-types';\nimport { normalizeBackendType, normalizeDeviceState, normalizePointerForWasm, pointerToHeapOffset } from './utils/encoding';\nimport { backendLabel, DEFAULT_BACKEND_LADDER, setActiveRenderer, tryReviveBackend } from './utils/backends';\nimport { delay } from './utils/assets';\n\nconst DEVICE_LOST_RETRY_DELAYS_MS = [500, 1_000, 2_000, 4_000] as const;\n\nfunction ensureSoftwarePresenter(\n presenter: SoftwarePresenter | null,\n canvas: HTMLCanvasElement,\n): SoftwarePresenter {\n if (presenter !== null) {\n return presenter;\n }\n const overlay = document.createElement('canvas');\n overlay.dataset.effindomSoftwareOverlay = 'true';\n overlay.setAttribute('aria-hidden', 'true');\n overlay.style.position = 'absolute';\n overlay.style.pointerEvents = 'none';\n overlay.style.display = 'none';\n overlay.style.zIndex = '1';\n\n const parent = canvas.parentElement;\n if (parent !== null) {\n if (getComputedStyle(parent).position === 'static') {\n parent.style.position = 'relative';\n }\n parent.appendChild(overlay);\n } else {\n document.body.appendChild(overlay);\n }\n\n const ctx = overlay.getContext('2d');\n if (ctx === null) {\n throw new Error('Canvas 2D context is unavailable for software rendering.');\n }\n return {\n canvas: overlay,\n ctx,\n imageData: null,\n width: 0,\n height: 0,\n };\n}\n\nfunction presentSoftwareFrame(\n core: CoreModule,\n canvas: HTMLCanvasElement,\n presenter: SoftwarePresenter,\n): void {\n const ptr = normalizePointerForWasm(core, core._ed_get_sw_framebuffer());\n const offset = pointerToHeapOffset(ptr);\n if (offset === 0) {\n return;\n }\n presenter.canvas.style.left = `${String(canvas.offsetLeft)}px`;\n presenter.canvas.style.top = `${String(canvas.offsetTop)}px`;\n presenter.canvas.style.width = canvas.style.width || `${String(canvas.clientWidth)}px`;\n presenter.canvas.style.height = canvas.style.height || `${String(canvas.clientHeight)}px`;\n presenter.canvas.style.borderRadius = getComputedStyle(canvas).borderRadius;\n presenter.canvas.style.display = '';\n if (presenter.imageData === null || presenter.width !== canvas.width || presenter.height !== canvas.height) {\n presenter.canvas.width = canvas.width;\n presenter.canvas.height = canvas.height;\n presenter.imageData = presenter.ctx.createImageData(canvas.width, canvas.height);\n presenter.width = canvas.width;\n presenter.height = canvas.height;\n }\n const byteLength = canvas.width * canvas.height * 4;\n const src = core.HEAPU8.subarray(offset, offset + byteLength);\n presenter.imageData.data.set(src);\n presenter.ctx.putImageData(presenter.imageData, 0, 0);\n}\n\nexport function installRenderLoop(\n runtime: BridgeRuntime,\n loaderInfo: BridgeLoaderInfo,\n fallbackLadder: readonly EdBackendTypeValue[] = DEFAULT_BACKEND_LADDER,\n): () => void {\n const { core, canvas } = runtime;\n let activeBackend = normalizeBackendType(core._ed_get_backend_type());\n let softwarePresenter: SoftwarePresenter | null = null;\n let frameScheduled = false;\n let disposed = false;\n\n // Recovery state:\n // - lastAttemptedBackend the backend we're trying to revive (set on first loss,\n // kept after a permanent fallback so wake-up can try again)\n // - recoveryAttempts how many retries of lastAttemptedBackend have been tried\n // - recoveryExhausted true after all retries failed and we permanently fell back\n // - recoveryPromise non-null while an async recovery cycle is in progress\n let lastAttemptedBackend: EdBackendTypeValue = activeBackend;\n let recoveryAttempts = 0;\n let recoveryExhausted = false;\n let recoveryPromise: Promise<void> | null = null;\n\n // Retry the same backend with exponential backoff, then permanently fall back.\n // Mutates recoveryAttempts, recoveryExhausted, activeBackend.\n async function runRecovery(): Promise<void> {\n const dpr = Math.max(1, window.devicePixelRatio || 1);\n\n while (recoveryAttempts < DEVICE_LOST_RETRY_DELAYS_MS.length) {\n const delayMs = DEVICE_LOST_RETRY_DELAYS_MS[recoveryAttempts] as number;\n await delay(delayMs);\n\n if (await tryReviveBackend(core, canvas, dpr, lastAttemptedBackend)) {\n recoveryAttempts = 0;\n recoveryExhausted = false;\n activeBackend = lastAttemptedBackend;\n loaderInfo.deviceRecoveryCount += 1;\n setActiveRenderer(loaderInfo, lastAttemptedBackend);\n await runtime.replayLoadedAssets();\n console.info(`RENDERER RECOVERY: ${backendLabel(lastAttemptedBackend)} recovered successfully.`);\n runtime.commitFrame();\n return;\n }\n\n recoveryAttempts += 1;\n }\n\n // All retries exhausted \u2014 permanently fall to the next available backend.\n recoveryExhausted = true;\n const nextIndex = fallbackLadder.indexOf(lastAttemptedBackend) + 1;\n for (let i = nextIndex; i < fallbackLadder.length; i += 1) {\n const fallback = fallbackLadder[i]!;\n if (await tryReviveBackend(core, canvas, dpr, fallback)) {\n activeBackend = fallback;\n loaderInfo.deviceRecoveryCount += 1;\n setActiveRenderer(loaderInfo, fallback);\n await runtime.replayLoadedAssets();\n if (fallback === EdBackendType.CPU) {\n console.error(\n `RENDERER FALLBACK: ${backendLabel(lastAttemptedBackend)} device lost and recovery failed!` +\n ' Fell back to Software/Raster - performance will be painfully slow',\n );\n } else {\n console.warn(\n `RENDERER FALLBACK: ${backendLabel(lastAttemptedBackend)} device lost and recovery failed!` +\n ` Fell back to ${backendLabel(fallback)}`,\n );\n }\n runtime.commitFrame();\n return;\n }\n }\n\n throw new Error(\n `Renderer recovery failed: all backends exhausted after ${backendLabel(lastAttemptedBackend)} device loss.`,\n );\n }\n\n function scheduleRecovery(lostBackend: EdBackendTypeValue): void {\n if (recoveryPromise !== null) return;\n lastAttemptedBackend = lostBackend;\n recoveryAttempts = 0;\n recoveryExhausted = false;\n setActiveRenderer(loaderInfo, EdBackendType.NONE);\n recoveryPromise = runRecovery()\n .catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n window.__bridgeError = message;\n })\n .finally(() => {\n recoveryPromise = null;\n });\n }\n\n const scheduleFrame = (): void => {\n if (disposed) {\n return;\n }\n if (frameScheduled) {\n return;\n }\n frameScheduled = true;\n requestAnimationFrame(frame);\n };\n\n runtime.setFrameRequester(scheduleFrame);\n\n const handleWebGlContextLost = (event: Event): void => {\n event.preventDefault();\n core._ed_notify_webgl_context_lost?.();\n scheduleRecovery(activeBackend);\n scheduleFrame();\n };\n canvas.addEventListener('webglcontextlost', handleWebGlContextLost, false);\n\n // When the page becomes visible after being hidden (e.g. lid open after sleep),\n // the GPU may have recovered. If a previous recovery cycle exhausted all retries\n // and permanently fell back, optimistically try to revive the original backend.\n const handleVisibilityChange = (): void => {\n if (disposed) return;\n if (document.visibilityState !== 'visible') return;\n if (!recoveryExhausted) return;\n if (recoveryPromise !== null) return;\n console.info(\n `RENDERER RECOVERY: Page visible \u2014 attempting to revive ${backendLabel(lastAttemptedBackend)} after sleep/wake.`,\n );\n recoveryAttempts = 0;\n recoveryPromise = runRecovery()\n .catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n window.__bridgeError = message;\n })\n .finally(() => {\n recoveryPromise = null;\n });\n };\n document.addEventListener('visibilitychange', handleVisibilityChange);\n\n const frame = (now: number): void => {\n if (disposed) {\n frameScheduled = false;\n return;\n }\n frameScheduled = false;\n if (recoveryPromise !== null) {\n scheduleFrame();\n return;\n }\n // Rebuild heap views from the live WebAssembly.Memory buffer each frame.\n // Emscripten updates closure-scoped heap vars on memory growth but not\n // Module['HEAPU8'], leaving it pointing to a detached ArrayBuffer.\n // Reading module.wasmMemory.buffer always returns the current live buffer.\n core.refreshHeapViews?.();\n runtime.ui.refreshHeapViews?.();\n runtime.runAppFrameHandler(now);\n if (!runtime.hasPendingCommit() && runtime.uiNeedsAnimationFrame() && runtime.uiHasPendingVisualWork()) {\n runtime.commitFrame();\n }\n runtime.flushPendingCommit();\n core._ed_render_frame(now);\n core.refreshHeapViews?.(); // Ensure heap views are up\u2011to\u2011date after potential memory growth\n const deviceState = normalizeDeviceState(core._ed_get_device_state());\n const backendType = normalizeBackendType(core._ed_get_backend_type());\n if (deviceState === EdDeviceState.LOST) {\n scheduleRecovery(activeBackend);\n scheduleFrame();\n return;\n }\n activeBackend = backendType;\n setActiveRenderer(loaderInfo, backendType);\n if (backendType === EdBackendType.CPU) {\n softwarePresenter = ensureSoftwarePresenter(softwarePresenter, canvas);\n presentSoftwareFrame(core, canvas, softwarePresenter);\n } else if (softwarePresenter !== null) {\n softwarePresenter.canvas.style.display = 'none';\n }\n if (runtime.hasPendingCommit() || runtime.uiNeedsAnimationFrame()) {\n scheduleFrame();\n }\n };\n scheduleFrame();\n return () => {\n disposed = true;\n frameScheduled = false;\n runtime.setFrameRequester(null);\n canvas.removeEventListener('webglcontextlost', handleWebGlContextLost, false);\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n if (softwarePresenter !== null) {\n softwarePresenter.canvas.remove();\n softwarePresenter = null;\n }\n };\n}\n", "import type { BridgeRuntime } from '../core-types';\nimport type { PreparedRuntimeAssets, BridgeInteractionState } from './local-types';\nimport { buildBackendLadder, createErrorWithCause, loadCoreModule, loadIcuData, loadUiModule, showIcuError } from './utils/assets';\nimport { initRenderer } from './utils/backends';\nimport { ensureCanvasLogicalSize, installEventHandlers } from './events';\nimport { getBridgeAssetUrl, STARTUP_BRIDGE_FONTS } from './font-catalog';\nimport { createBridgeRuntime } from './runtime';\nimport { installRenderLoop } from './render-loop';\n\nexport interface BridgeSession {\n readonly runtime: BridgeRuntime;\n destroy(): void;\n}\n\nexport interface BridgeSessionOptions {\n readonly interactionState: BridgeInteractionState;\n readonly preparedAssets: PreparedRuntimeAssets;\n readonly runtimeRef: { current: BridgeRuntime | null };\n}\n\nfunction requireCanvas(id: string): HTMLCanvasElement {\n const element = document.getElementById(id);\n if (!(element instanceof HTMLCanvasElement)) {\n throw new Error(`Expected #${id} canvas.`);\n }\n return element;\n}\n\nexport async function createBridgeSession(options: BridgeSessionOptions): Promise<BridgeSession> {\n const canvas = requireCanvas('fui-canvas');\n ensureCanvasLogicalSize(canvas);\n\n const { interactionState, preparedAssets, runtimeRef } = options;\n window.__bridgeLoaderInfo = preparedAssets.loaderInfo;\n const [core, ui] = await Promise.all([\n loadCoreModule(preparedAssets.coreBundle, preparedAssets.coreWasm, canvas, preparedAssets.loaderInfo),\n loadUiModule(preparedAssets.uiBundle, preparedAssets.uiWasm, preparedAssets.loaderInfo),\n ]);\n const runtimeState = createBridgeRuntime(core, ui, canvas, interactionState, preparedAssets.loaderInfo);\n const runtime = runtimeState.runtime;\n runtimeRef.current = runtime;\n\n const dpr = Math.max(1, window.devicePixelRatio || 1);\n const fallbackLadder = buildBackendLadder(preparedAssets.loaderInfo.requestedRendererBackend);\n await initRenderer(core, canvas, dpr, preparedAssets.loaderInfo, fallbackLadder);\n ui._ui_reset();\n try {\n await loadIcuData(ui, preparedAssets);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to load text engine.';\n showIcuError(message);\n throw createErrorWithCause(message, error);\n }\n runtime.updateCanvasSize();\n const disposeEventHandlers = installEventHandlers(runtime, interactionState);\n const disposeRenderLoop = installRenderLoop(runtime, preparedAssets.loaderInfo, fallbackLadder);\n await Promise.all(\n STARTUP_BRIDGE_FONTS.map((font) => runtime.registerFont({\n id: font.id,\n url: getBridgeAssetUrl(font.assetFile),\n fallbackIds: font.fallbackIds,\n })),\n );\n\n delete window.__bridgeError;\n return {\n runtime,\n destroy: () => {\n disposeEventHandlers();\n disposeRenderLoop();\n runtimeState.destroy();\n if (runtimeRef.current === runtime) {\n runtimeRef.current = null;\n }\n },\n };\n}\n", "import type { ClipboardRichTextPart, ClipboardRichTextPayload, ClipboardWritePayload } from './core-types';\n\nexport const EFFINDOM_RICH_TEXT_CLIPBOARD_MIME = 'web application/x-effindom-richtext+json';\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\nfunction colorToCss(color: number): string {\n const red = (color >>> 24) & 0xff;\n const green = (color >>> 16) & 0xff;\n const blue = (color >>> 8) & 0xff;\n const alpha = color & 0xff;\n if (alpha >= 0xff) {\n return `rgb(${String(red)} ${String(green)} ${String(blue)})`;\n }\n return `rgb(${String(red)} ${String(green)} ${String(blue)} / ${(alpha / 255).toFixed(3)})`;\n}\n\nfunction inferClipboardCssFontFamily(fontUrl: string | undefined): string | null {\n if (fontUrl === undefined) {\n return null;\n }\n if (/mono/i.test(fontUrl)) {\n return 'monospace';\n }\n return null;\n}\n\nfunction partStyleToCss(part: ClipboardRichTextPart): string {\n const styles: string[] = [];\n if (part.color !== undefined) {\n styles.push(`color: ${colorToCss(part.color)};`);\n }\n if (part.bgColor !== undefined && part.bgColor !== 0) {\n styles.push(`background-color: ${colorToCss(part.bgColor)};`);\n }\n if (part.fontSize !== undefined) {\n styles.push(`font-size: ${String(part.fontSize)}px;`);\n }\n const fontFamily = inferClipboardCssFontFamily(part.fontUrl);\n if (fontFamily !== null) {\n styles.push(`font-family: ${fontFamily};`);\n }\n const decorationFlags = part.decorationFlags ?? 0;\n const textDecorations: string[] = [];\n if ((decorationFlags & 1) !== 0) {\n textDecorations.push('underline');\n }\n if ((decorationFlags & 2) !== 0) {\n textDecorations.push('line-through');\n }\n if (textDecorations.length > 0) {\n styles.push(`text-decoration: ${textDecorations.join(' ')};`);\n }\n return styles.join(' ');\n}\n\nfunction buildClipboardHtml(richText: ClipboardRichTextPayload): string {\n let html = '<div data-effindom-richtext=\"1\" style=\"white-space: pre-wrap;\">';\n for (const part of richText.parts) {\n const escapedText = escapeHtml(part.text);\n const style = partStyleToCss(part);\n if (style.length > 0) {\n html += `<span style=\"${style}\">${escapedText}</span>`;\n continue;\n }\n html += escapedText;\n }\n html += '</div>';\n return html;\n}\n\nexport function enrichClipboardPayload(\n payload: ClipboardWritePayload,\n resolveFontUrl: (fontId: number) => string | null,\n): ClipboardWritePayload {\n const richText = payload.richText;\n if (richText === undefined) {\n return payload;\n }\n return {\n plainText: payload.plainText,\n richText: {\n version: richText.version,\n parts: richText.parts.map((part) => {\n if (part.fontId === undefined || part.fontUrl !== undefined) {\n return part;\n }\n const fontUrl = resolveFontUrl(part.fontId);\n return fontUrl === null ? part : { ...part, fontUrl };\n }),\n },\n };\n}\n\nasync function tryWriteClipboardItems(items: Record<string, Blob>): Promise<boolean> {\n if (navigator.clipboard === undefined || navigator.clipboard.write === undefined || typeof ClipboardItem === 'undefined') {\n return false;\n }\n try {\n await navigator.clipboard.write([new ClipboardItem(items)]);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function writeClipboardPayload(payload: ClipboardWritePayload): Promise<void> {\n const plainText = payload.plainText;\n const richText = payload.richText;\n const html = richText === undefined ? null : buildClipboardHtml(richText);\n if (richText !== undefined && html !== null) {\n const richJson = JSON.stringify(richText);\n const fullWriteSucceeded = await tryWriteClipboardItems({\n 'text/plain': new Blob([plainText], { type: 'text/plain' }),\n 'text/html': new Blob([html], { type: 'text/html' }),\n [EFFINDOM_RICH_TEXT_CLIPBOARD_MIME]: new Blob([richJson], { type: EFFINDOM_RICH_TEXT_CLIPBOARD_MIME }),\n });\n if (fullWriteSucceeded) {\n return;\n }\n const htmlWriteSucceeded = await tryWriteClipboardItems({\n 'text/plain': new Blob([plainText], { type: 'text/plain' }),\n 'text/html': new Blob([html], { type: 'text/html' }),\n });\n if (htmlWriteSucceeded) {\n return;\n }\n }\n if (navigator.clipboard !== undefined && navigator.clipboard.writeText !== undefined) {\n await navigator.clipboard.writeText(plainText);\n }\n}\n", "export function utf8ByteLengthForCodePoint(codePoint: number): number {\n if (codePoint <= 0x7f) {\n return 1;\n }\n if (codePoint <= 0x7ff) {\n return 2;\n }\n if (codePoint <= 0xffff) {\n return 3;\n }\n return 4;\n}\n\nexport function advanceCodeUnitIndex(text: string, index: number): number {\n const codePoint = text.codePointAt(index) ?? 0;\n return index + (codePoint > 0xffff ? 2 : 1);\n}\n\nexport function retreatCodeUnitIndex(text: string, index: number): number {\n const clampedIndex = Math.max(0, Math.min(index, text.length));\n if (clampedIndex <= 0) {\n return 0;\n }\n const previousIndex = clampedIndex - 1;\n const previousUnit = text.charCodeAt(previousIndex);\n if (\n previousIndex > 0 &&\n previousUnit >= 0xdc00 &&\n previousUnit <= 0xdfff\n ) {\n const leadUnit = text.charCodeAt(previousIndex - 1);\n if (leadUnit >= 0xd800 && leadUnit <= 0xdbff) {\n return previousIndex - 1;\n }\n }\n return previousIndex;\n}\n\nexport function codeUnitIndexToUtf8ByteOffset(text: string, index: number): number {\n const clampedIndex = Math.max(0, Math.min(index, text.length));\n let byteOffset = 0;\n for (let current = 0; current < clampedIndex; current = advanceCodeUnitIndex(text, current)) {\n const codePoint = text.codePointAt(current) ?? 0;\n byteOffset += utf8ByteLengthForCodePoint(codePoint);\n }\n return byteOffset;\n}\n\nexport function utf8ByteLength(text: string): number {\n return codeUnitIndexToUtf8ByteOffset(text, text.length);\n}\n", "import type { TextChangeLog } from '../../core-types';\nimport {\n advanceCodeUnitIndex,\n codeUnitIndexToUtf8ByteOffset,\n utf8ByteLengthForCodePoint,\n utf8ByteLength,\n} from './text-encoding';\n\nexport type HiddenTextEditor = HTMLInputElement | HTMLTextAreaElement;\n\nexport interface ReplacementEdit {\n readonly start: number;\n readonly end: number;\n readonly insertedText: string;\n}\n\nexport interface HiddenEditorWindow {\n readonly text: string;\n readonly docStart: number;\n readonly docEnd: number;\n readonly textStart: number;\n readonly textEnd: number;\n}\n\nexport interface PendingLocalReplacementEcho {\n readonly handle: string;\n readonly start: number;\n readonly end: number;\n readonly text: string;\n}\n\nexport interface PendingLocalSelectionEcho {\n readonly handle: string;\n readonly start: number;\n readonly end: number;\n}\n\nexport interface PendingTextMutationBatch {\n readonly handle: string;\n readonly docStart: number;\n readonly baseWindowText: string;\n readonly currentWindowText: string;\n readonly caret: number;\n readonly interactionTime: bigint;\n readonly kind: 'typing' | 'paste';\n readonly mutationCount: number;\n}\n\nexport interface PendingPasteInput {\n readonly handle: string;\n readonly docStart: number;\n readonly selectionStart: number;\n readonly selectionEnd: number;\n readonly text: string;\n}\n\ninterface TextClampRange {\n readonly start: number;\n readonly end: number;\n}\n\nconst HIDDEN_EDITOR_WINDOW_OVERSCAN = 2048;\nconst HIDDEN_EDITOR_WINDOW_MIN_LENGTH = 4096;\nconst HIDDEN_EDITOR_WINDOW_REUSE_MARGIN = 512;\nconst TEXT_CHANGE_LOG_PREVIEW_LIMIT = 256;\nconst TEXTBOX_HARD_CLAMP_MAX_CODEPOINTS = 10000;\n\nfunction isLineBreakCodeUnit(text: string, index: number): boolean {\n if (index < 0 || index >= text.length) {\n return false;\n }\n const codeUnit = text.charCodeAt(index);\n return codeUnit === 0x0a || codeUnit === 0x0d;\n}\n\nfunction collectTextboxHardLineClampRanges(text: string): readonly TextClampRange[] {\n const ranges: TextClampRange[] = [];\n let index = 0;\n while (index < text.length) {\n let lineCapEnd = index;\n let lineEnd = index;\n let codePointCount = 0;\n while (lineEnd < text.length && !isLineBreakCodeUnit(text, lineEnd)) {\n const next = advanceCodeUnitIndex(text, lineEnd);\n if (codePointCount < TEXTBOX_HARD_CLAMP_MAX_CODEPOINTS) {\n lineCapEnd = next;\n }\n codePointCount += 1;\n lineEnd = next;\n }\n if (codePointCount > TEXTBOX_HARD_CLAMP_MAX_CODEPOINTS) {\n ranges.push({ start: lineCapEnd, end: lineEnd });\n }\n if (lineEnd >= text.length) {\n break;\n }\n if (text.charCodeAt(lineEnd) === 0x0d && lineEnd + 1 < text.length && text.charCodeAt(lineEnd + 1) === 0x0a) {\n index = lineEnd + 2;\n } else {\n index = lineEnd + 1;\n }\n }\n return ranges;\n}\n\nfunction mapClampedTextIndex(index: number, ranges: readonly TextClampRange[]): number {\n const clampedIndex = Math.max(0, index);\n let removedBefore = 0;\n for (const range of ranges) {\n if (clampedIndex <= range.start) {\n break;\n }\n if (clampedIndex < range.end) {\n return range.start - removedBefore;\n }\n removedBefore += range.end - range.start;\n }\n return clampedIndex - removedBefore;\n}\n\nfunction clampTextboxHardLines(text: string): {\n readonly text: string;\n readonly changed: boolean;\n mapIndex(index: number): number;\n} {\n const ranges = collectTextboxHardLineClampRanges(text);\n if (ranges.length === 0) {\n return {\n text,\n changed: false,\n mapIndex: (index: number) => Math.max(0, Math.min(index, text.length)),\n };\n }\n let result = '';\n let cursor = 0;\n for (const range of ranges) {\n result += text.slice(cursor, range.start);\n cursor = range.end;\n }\n result += text.slice(cursor);\n return {\n text: result,\n changed: true,\n mapIndex: (index: number) => mapClampedTextIndex(index, ranges),\n };\n}\n\nexport function utf8ByteOffsetToCodeUnitIndex(text: string, byteOffset: number, textByteLength?: number): number {\n const byteLimit = textByteLength ?? utf8ByteLength(text);\n const target = Math.max(0, Math.min(byteOffset, byteLimit));\n let currentByteOffset = 0;\n let currentIndex = 0;\n while (currentIndex < text.length) {\n const codePoint = text.codePointAt(currentIndex) ?? 0;\n const nextByteOffset = currentByteOffset + utf8ByteLengthForCodePoint(codePoint);\n if (nextByteOffset > target) {\n break;\n }\n currentByteOffset = nextByteOffset;\n currentIndex = advanceCodeUnitIndex(text, currentIndex);\n if (currentByteOffset === target) {\n break;\n }\n }\n return currentIndex;\n}\n\nexport function computeReplacementEdit(previousText: string, nextText: string): ReplacementEdit | null {\n if (previousText === nextText) {\n return null;\n }\n const sharedPrefixLimit = Math.min(previousText.length, nextText.length);\n let prefix = 0;\n while (prefix < sharedPrefixLimit && previousText.charCodeAt(prefix) === nextText.charCodeAt(prefix)) {\n prefix += 1;\n }\n\n let suffix = 0;\n while (\n suffix < (previousText.length - prefix) &&\n suffix < (nextText.length - prefix) &&\n previousText.charCodeAt(previousText.length - suffix - 1) === nextText.charCodeAt(nextText.length - suffix - 1)\n ) {\n suffix += 1;\n }\n\n return {\n start: prefix,\n end: previousText.length - suffix,\n insertedText: nextText.slice(prefix, nextText.length - suffix),\n };\n}\n\nexport function applyUtf8ByteReplacementEdit(text: string, start: number, end: number, insertedText: string): string {\n const clampedStart = utf8ByteOffsetToCodeUnitIndex(text, Math.max(0, start));\n const clampedEnd = utf8ByteOffsetToCodeUnitIndex(text, Math.max(clampedStart, end));\n return `${text.slice(0, clampedStart)}${insertedText}${text.slice(clampedEnd)}`;\n}\n\nexport function mapPendingBatchCurrentIndexToBaseIndex(batch: PendingTextMutationBatch, index: number): number {\n const clampedIndex = Math.max(0, Math.min(index, batch.currentWindowText.length));\n const replacement = computeReplacementEdit(batch.baseWindowText, batch.currentWindowText);\n if (replacement === null) {\n return Math.max(0, Math.min(clampedIndex, batch.baseWindowText.length));\n }\n const insertedStart = replacement.start;\n const insertedEnd = replacement.start + replacement.insertedText.length;\n if (clampedIndex <= insertedStart) {\n return clampedIndex;\n }\n if (clampedIndex <= insertedEnd) {\n return replacement.start;\n }\n const delta = replacement.insertedText.length - (replacement.end - replacement.start);\n return Math.max(0, Math.min(clampedIndex - delta, batch.baseWindowText.length));\n}\n\nexport function buildClampedTextboxEdit(\n fullPreviousText: string,\n absoluteStart: number,\n absoluteEnd: number,\n insertedText: string,\n absoluteCaret: number,\n): {\n readonly fullNextText: string;\n readonly replacement: ReplacementEdit | null;\n readonly caretByte: number;\n readonly clampChanged: boolean;\n} {\n const replaceStart = utf8ByteOffsetToCodeUnitIndex(fullPreviousText, absoluteStart);\n const replaceEnd = utf8ByteOffsetToCodeUnitIndex(fullPreviousText, absoluteEnd);\n const intendedFullNextText =\n `${fullPreviousText.slice(0, replaceStart)}${insertedText}${fullPreviousText.slice(replaceEnd)}`;\n const intendedCaret = utf8ByteOffsetToCodeUnitIndex(intendedFullNextText, absoluteCaret);\n const clamped = clampTextboxHardLines(intendedFullNextText);\n const finalCaret = clamped.mapIndex(intendedCaret);\n return {\n fullNextText: clamped.text,\n replacement: computeReplacementEdit(fullPreviousText, clamped.text),\n caretByte: codeUnitIndexToUtf8ByteOffset(clamped.text, finalCaret),\n clampChanged: clamped.changed,\n };\n}\n\nexport function summarizeTextChange(handle: string, text: string): TextChangeLog {\n if (text.length <= TEXT_CHANGE_LOG_PREVIEW_LIMIT) {\n return { handle, text };\n }\n return {\n handle,\n text: `${text.slice(0, TEXT_CHANGE_LOG_PREVIEW_LIMIT)}\u2026`,\n textLength: text.length,\n truncated: true,\n };\n}\n\nexport function buildHiddenEditorWindow(\n text: string,\n start: number,\n end: number,\n textByteLength: number,\n previousWindow?: HiddenEditorWindow,\n): HiddenEditorWindow {\n const normalizedStart = Math.max(0, Math.min(start, text.length));\n const normalizedEnd = Math.max(normalizedStart, Math.min(end, text.length));\n const selectionSpan = normalizedEnd - normalizedStart;\n const targetLength = Math.max(\n HIDDEN_EDITOR_WINDOW_MIN_LENGTH,\n selectionSpan + (HIDDEN_EDITOR_WINDOW_OVERSCAN * 2),\n );\n if (text.length <= targetLength) {\n return {\n text,\n docStart: 0,\n docEnd: textByteLength,\n textStart: 0,\n textEnd: text.length,\n };\n }\n\n if (previousWindow !== undefined) {\n const previousLength = previousWindow.textEnd - previousWindow.textStart;\n const clampedPreviousStart = Math.max(0, Math.min(previousWindow.textStart, text.length));\n const clampedPreviousEnd = Math.max(clampedPreviousStart, Math.min(previousWindow.textEnd, text.length));\n if (previousLength > 0 &&\n clampedPreviousEnd > clampedPreviousStart &&\n clampedPreviousEnd - clampedPreviousStart >= targetLength) {\n const reuseMargin = Math.min(\n HIDDEN_EDITOR_WINDOW_REUSE_MARGIN,\n Math.max(0, Math.floor((clampedPreviousEnd - clampedPreviousStart) / 4)),\n );\n const reusableStart = clampedPreviousStart + reuseMargin;\n const reusableEnd = clampedPreviousEnd - reuseMargin;\n if (normalizedStart >= reusableStart && normalizedEnd <= reusableEnd) {\n return {\n text: text.slice(clampedPreviousStart, clampedPreviousEnd),\n docStart: previousWindow.docStart,\n docEnd: previousWindow.docEnd,\n textStart: clampedPreviousStart,\n textEnd: clampedPreviousEnd,\n };\n }\n }\n }\n\n let docStart = Math.max(0, normalizedStart - HIDDEN_EDITOR_WINDOW_OVERSCAN);\n let docEnd = Math.min(text.length, normalizedEnd + HIDDEN_EDITOR_WINDOW_OVERSCAN);\n const currentLength = docEnd - docStart;\n if (currentLength < targetLength) {\n let remaining = targetLength - currentLength;\n const extendBefore = Math.min(docStart, Math.floor(remaining / 2));\n docStart -= extendBefore;\n remaining -= extendBefore;\n const extendAfter = Math.min(text.length - docEnd, remaining);\n docEnd += extendAfter;\n remaining -= extendAfter;\n if (remaining > 0) {\n const extraBefore = Math.min(docStart, remaining);\n docStart -= extraBefore;\n remaining -= extraBefore;\n if (remaining > 0) {\n docEnd = Math.min(text.length, docEnd + remaining);\n }\n }\n }\n\n return {\n text: text.slice(docStart, docEnd),\n docStart: codeUnitIndexToUtf8ByteOffset(text, docStart),\n docEnd: codeUnitIndexToUtf8ByteOffset(text, docEnd),\n textStart: docStart,\n textEnd: docEnd,\n };\n}\n\nexport function createHiddenTextEditor(multiline: boolean): HiddenTextEditor {\n const editor = multiline ? document.createElement('textarea') : document.createElement('input');\n if (editor instanceof HTMLInputElement) {\n editor.type = 'text';\n } else {\n editor.rows = 1;\n editor.wrap = 'off';\n editor.style.resize = 'none';\n editor.style.whiteSpace = 'pre';\n }\n editor.autocapitalize = 'off';\n editor.autocomplete = 'off';\n editor.autocorrect = false;\n editor.spellcheck = false;\n editor.tabIndex = -1;\n editor.dataset.effindomHiddenEditor = 'true';\n editor.setAttribute('aria-hidden', 'true');\n editor.style.position = 'fixed';\n editor.style.left = '-9999px';\n editor.style.top = '0';\n editor.style.width = '1px';\n editor.style.height = '1px';\n editor.style.opacity = '0';\n editor.style.pointerEvents = 'none';\n editor.style.font = '16px \"Noto Sans Symbols 2\", \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Noto Color Emoji\", monospace';\n editor.style.overflow = 'hidden';\n document.body.appendChild(editor);\n return editor;\n}\n\nexport function clearHiddenTextEditor(editor: HiddenTextEditor): void {\n if (editor.value.length !== 0) {\n editor.value = '';\n }\n editor.setSelectionRange(0, 0, 'none');\n}\n", "import type { BridgeRuntime } from '../../core-types';\nimport { commitIfVisualWork } from '../commit-policy';\nimport { handleToBigInt } from '../utils/encoding';\nimport { writeUtf8ToHeap } from '../utils/heap';\nimport { advanceCodeUnitIndex, codeUnitIndexToUtf8ByteOffset, retreatCodeUnitIndex, utf8ByteLength } from './text-encoding';\nimport {\n applyUtf8ByteReplacementEdit,\n buildClampedTextboxEdit,\n computeReplacementEdit,\n mapPendingBatchCurrentIndexToBaseIndex,\n type HiddenEditorWindow,\n type HiddenTextEditor,\n type PendingLocalReplacementEcho,\n type PendingLocalSelectionEcho,\n type PendingPasteInput,\n type PendingTextMutationBatch,\n type ReplacementEdit,\n} from './editor-model';\n\nconst MAX_BUFFERED_TYPING_MUTATIONS = 5;\n\nfunction currentInteractionTimeMs(): bigint {\n return BigInt(Math.floor(performance.now()));\n}\n\nexport interface EditorMutationController {\n applyActiveTextDeletion(forward: boolean): boolean;\n attachHiddenEditorListeners(editor: HiddenTextEditor): void;\n clearPendingTextMutations(): void;\n flushPendingTextMutationsToRuntime(): void;\n hasPendingTextMutations(): boolean;\n materializePendingTextMutations(): boolean;\n reset(): void;\n}\n\ninterface EditorMutationControllerOptions {\n readonly runtimeRef: { current: BridgeRuntime | null };\n readonly textByHandle: Record<string, string>;\n readonly selectionsByHandle: Record<string, { start: number; end: number }>;\n readonly textByteLengthsByHandle: Record<string, number>;\n getActiveEditor(): HiddenTextEditor;\n getActiveEditorWindow(): HiddenEditorWindow;\n getActiveTextEditable(): boolean;\n getActiveTextHandle(): bigint | null;\n isActiveEditorFocused(): boolean;\n setPendingLocalReplacementEcho(value: PendingLocalReplacementEcho | null): void;\n setPendingLocalSelectionEcho(value: PendingLocalSelectionEcho | null): void;\n syncFocusedInputState(): void;\n updateActiveEditorWindowText(text: string): void;\n}\n\nexport function createEditorMutationController(\n options: EditorMutationControllerOptions,\n): EditorMutationController {\n let hiddenInputIsComposing = false;\n let pendingTextMutationFlushFrame: number | null = null;\n let pendingTextMutationBatch: PendingTextMutationBatch | null = null;\n let pendingPasteInput: PendingPasteInput | null = null;\n let pendingPasteText = '';\n\n const clearPendingTextMutations = (): void => {\n if (pendingTextMutationFlushFrame !== null) {\n cancelAnimationFrame(pendingTextMutationFlushFrame);\n pendingTextMutationFlushFrame = null;\n }\n pendingTextMutationBatch = null;\n pendingPasteInput = null;\n pendingPasteText = '';\n };\n\n const materializePendingTextMutations = (): boolean => {\n const runtime = options.runtimeRef.current;\n const batch = pendingTextMutationBatch;\n if (runtime === null || batch === null) {\n return false;\n }\n pendingTextMutationBatch = null;\n const handle = handleToBigInt(batch.handle);\n const absoluteCaret = batch.docStart + codeUnitIndexToUtf8ByteOffset(batch.currentWindowText, batch.caret);\n runtime.ui._ui_set_interaction_time(batch.interactionTime);\n const replacement = computeReplacementEdit(batch.baseWindowText, batch.currentWindowText);\n if (replacement === null) {\n options.setPendingLocalSelectionEcho({\n handle: batch.handle,\n start: absoluteCaret,\n end: absoluteCaret,\n });\n runtime.ui._ui_set_text_selection_range(handle, absoluteCaret, absoluteCaret);\n return true;\n }\n\n const absoluteStart = batch.docStart + codeUnitIndexToUtf8ByteOffset(batch.baseWindowText, replacement.start);\n const absoluteEnd = batch.docStart + codeUnitIndexToUtf8ByteOffset(batch.baseWindowText, replacement.end);\n options.setPendingLocalReplacementEcho({\n handle: batch.handle,\n start: absoluteStart,\n end: absoluteEnd,\n text: replacement.insertedText,\n });\n options.setPendingLocalSelectionEcho({\n handle: batch.handle,\n start: absoluteCaret,\n end: absoluteCaret,\n });\n const heapString = writeUtf8ToHeap(runtime.ui, replacement.insertedText);\n try {\n runtime.ui._ui_replace_text_range(\n handle,\n absoluteStart,\n absoluteEnd,\n heapString.ptr,\n heapString.len,\n absoluteCaret,\n );\n } finally {\n heapString.dispose();\n }\n return true;\n };\n\n const restorePendingTypingState = (editor: HiddenTextEditor): boolean => {\n const batch = pendingTextMutationBatch;\n const activeTextHandle = options.getActiveTextHandle();\n const activeEditorWindow = options.getActiveEditorWindow();\n if (\n batch === null ||\n batch.kind !== 'typing' ||\n batch.mutationCount < MAX_BUFFERED_TYPING_MUTATIONS ||\n activeTextHandle === null ||\n batch.handle !== activeTextHandle.toString() ||\n batch.docStart !== activeEditorWindow.docStart\n ) {\n return false;\n }\n editor.value = batch.currentWindowText;\n editor.setSelectionRange(batch.caret, batch.caret, 'none');\n return true;\n };\n\n const flushPendingTextMutationsToRuntime = (): void => {\n const runtime = options.runtimeRef.current;\n if (runtime === null || pendingTextMutationBatch === null) {\n return;\n }\n if (materializePendingTextMutations()) {\n runtime.commitFrame();\n }\n };\n\n const schedulePendingTextMutationFlush = (): void => {\n if (pendingTextMutationFlushFrame !== null) {\n return;\n }\n pendingTextMutationFlushFrame = requestAnimationFrame(() => {\n pendingTextMutationFlushFrame = null;\n options.runtimeRef.current?.flushPendingCommit();\n });\n };\n\n const commitReplacementEdit = (\n previousText: string,\n nextText: string,\n replacement: ReplacementEdit,\n caret: number,\n kind: 'typing' | 'paste' = 'typing',\n replacePendingBatch = false,\n ): void => {\n const runtime = options.runtimeRef.current;\n const activeTextHandle = options.getActiveTextHandle();\n const activeEditorWindow = options.getActiveEditorWindow();\n if (runtime === null || activeTextHandle === null) {\n return;\n }\n const clampedStart = Math.max(0, Math.min(replacement.start, previousText.length));\n const clampedEnd = Math.max(clampedStart, Math.min(replacement.end, previousText.length));\n const activeHandleKey = activeTextHandle.toString();\n if (pendingTextMutationBatch === null && runtime.hasPendingCommit()) {\n runtime.flushPendingCommit();\n }\n\n const absoluteStart = activeEditorWindow.docStart + codeUnitIndexToUtf8ByteOffset(previousText, clampedStart);\n const absoluteEnd = activeEditorWindow.docStart + codeUnitIndexToUtf8ByteOffset(previousText, clampedEnd);\n const intendedAbsoluteCaret =\n activeEditorWindow.docStart + codeUnitIndexToUtf8ByteOffset(nextText, Math.max(0, Math.min(caret, nextText.length)));\n let fullPreviousText = options.textByHandle[activeHandleKey] ?? '';\n if (\n replacePendingBatch &&\n pendingTextMutationBatch !== null &&\n pendingTextMutationBatch.handle === activeHandleKey &&\n pendingTextMutationBatch.docStart === activeEditorWindow.docStart\n ) {\n const pendingReplacement = computeReplacementEdit(\n pendingTextMutationBatch.baseWindowText,\n pendingTextMutationBatch.currentWindowText,\n );\n if (pendingReplacement !== null) {\n const pendingAbsoluteStart =\n pendingTextMutationBatch.docStart +\n codeUnitIndexToUtf8ByteOffset(pendingTextMutationBatch.baseWindowText, pendingReplacement.start);\n const pendingAbsoluteEnd = pendingAbsoluteStart + utf8ByteLength(pendingReplacement.insertedText);\n fullPreviousText = applyUtf8ByteReplacementEdit(\n fullPreviousText,\n pendingAbsoluteStart,\n pendingAbsoluteEnd,\n pendingTextMutationBatch.baseWindowText.slice(pendingReplacement.start, pendingReplacement.end),\n );\n }\n }\n const clampedEdit = buildClampedTextboxEdit(\n fullPreviousText,\n absoluteStart,\n absoluteEnd,\n replacement.insertedText,\n intendedAbsoluteCaret,\n );\n if (clampedEdit.clampChanged) {\n if (pendingTextMutationBatch !== null) {\n if (materializePendingTextMutations()) {\n runtime.commitFrame();\n }\n }\n if (runtime.hasPendingCommit()) {\n runtime.flushPendingCommit();\n }\n clearPendingTextMutations();\n options.textByHandle[activeHandleKey] = clampedEdit.fullNextText;\n options.textByteLengthsByHandle[activeHandleKey] = utf8ByteLength(clampedEdit.fullNextText);\n options.selectionsByHandle[activeHandleKey] = { start: clampedEdit.caretByte, end: clampedEdit.caretByte };\n options.syncFocusedInputState();\n } else {\n options.textByHandle[activeHandleKey] = clampedEdit.fullNextText;\n options.textByteLengthsByHandle[activeHandleKey] = utf8ByteLength(clampedEdit.fullNextText);\n options.selectionsByHandle[activeHandleKey] = { start: clampedEdit.caretByte, end: clampedEdit.caretByte };\n options.updateActiveEditorWindowText(nextText);\n }\n\n if (clampedEdit.replacement === null) {\n return;\n }\n if (clampedEdit.clampChanged) {\n const replacementStartByte = codeUnitIndexToUtf8ByteOffset(fullPreviousText, clampedEdit.replacement.start);\n const replacementEndByte = codeUnitIndexToUtf8ByteOffset(fullPreviousText, clampedEdit.replacement.end);\n options.setPendingLocalReplacementEcho({\n handle: activeHandleKey,\n start: replacementStartByte,\n end: replacementEndByte,\n text: clampedEdit.replacement.insertedText,\n });\n options.setPendingLocalSelectionEcho({\n handle: activeHandleKey,\n start: clampedEdit.caretByte,\n end: clampedEdit.caretByte,\n });\n runtime.ui._ui_set_interaction_time(currentInteractionTimeMs());\n const heapString = writeUtf8ToHeap(runtime.ui, clampedEdit.replacement.insertedText);\n try {\n runtime.ui._ui_replace_text_range(\n activeTextHandle,\n replacementStartByte,\n replacementEndByte,\n heapString.ptr,\n heapString.len,\n clampedEdit.caretByte,\n );\n } finally {\n heapString.dispose();\n }\n runtime.commitFrame();\n return;\n }\n\n if (\n pendingTextMutationBatch !== null &&\n (\n pendingTextMutationBatch.handle !== activeHandleKey ||\n pendingTextMutationBatch.docStart !== activeEditorWindow.docStart ||\n (!replacePendingBatch && pendingTextMutationBatch.kind !== kind)\n )\n ) {\n if (materializePendingTextMutations()) {\n runtime.commitFrame();\n }\n runtime.flushPendingCommit();\n }\n\n const activeEditor = options.getActiveEditor();\n pendingTextMutationBatch = pendingTextMutationBatch === null || replacePendingBatch\n ? {\n handle: activeHandleKey,\n docStart: activeEditorWindow.docStart,\n baseWindowText: previousText,\n currentWindowText: activeEditor.value,\n caret: activeEditor.selectionStart ?? activeEditor.value.length,\n interactionTime: currentInteractionTimeMs(),\n kind,\n mutationCount: 1,\n }\n : {\n ...pendingTextMutationBatch,\n currentWindowText: activeEditor.value,\n caret: activeEditor.selectionStart ?? activeEditor.value.length,\n interactionTime: currentInteractionTimeMs(),\n mutationCount: kind === 'paste' ? 1 : pendingTextMutationBatch.mutationCount + 1,\n };\n schedulePendingTextMutationFlush();\n runtime.requestFrame();\n };\n\n const commitImeEdit = (\n text: string,\n caret: number,\n kind: 'typing' | 'paste' = 'typing',\n replacePendingBatch = false,\n ): void => {\n const previousText = options.getActiveEditorWindow().text;\n const replacement = computeReplacementEdit(previousText, text);\n if (replacement === null) {\n const runtime = options.runtimeRef.current;\n if (runtime !== null) {\n commitIfVisualWork(runtime);\n }\n return;\n }\n commitReplacementEdit(previousText, text, replacement, caret, kind, replacePendingBatch);\n };\n\n const applyActiveTextDeletion = (forward: boolean): boolean => {\n if (\n options.getActiveTextHandle() === null ||\n !options.getActiveTextEditable() ||\n hiddenInputIsComposing ||\n !options.isActiveEditorFocused()\n ) {\n return false;\n }\n const editor = options.getActiveEditor();\n const text = editor.value;\n const selectionStart = editor.selectionStart ?? text.length;\n const selectionEnd = editor.selectionEnd ?? selectionStart;\n const rangeStart = Math.min(selectionStart, selectionEnd);\n const rangeEnd = Math.max(selectionStart, selectionEnd);\n let nextText = text;\n let nextCaret = rangeStart;\n let replacementStart = rangeStart;\n let replacementEnd = rangeEnd;\n if (rangeStart !== rangeEnd) {\n nextText = text.slice(0, rangeStart) + text.slice(rangeEnd);\n } else if (forward) {\n if (rangeStart >= text.length) {\n return true;\n }\n replacementEnd = advanceCodeUnitIndex(text, rangeStart);\n nextText = text.slice(0, rangeStart) + text.slice(replacementEnd);\n } else {\n if (rangeStart === 0) {\n return true;\n }\n replacementStart = retreatCodeUnitIndex(text, rangeStart);\n nextCaret = replacementStart;\n nextText = text.slice(0, nextCaret) + text.slice(rangeStart);\n }\n editor.value = nextText;\n editor.setSelectionRange(nextCaret, nextCaret, 'none');\n commitReplacementEdit(\n text,\n nextText,\n {\n start: replacementStart,\n end: replacementEnd,\n insertedText: '',\n },\n nextCaret,\n );\n return true;\n };\n\n const attachHiddenEditorListeners = (editor: HiddenTextEditor): void => {\n editor.addEventListener('paste', (event) => {\n const clipboardEvent = event as ClipboardEvent;\n pendingPasteText = clipboardEvent.clipboardData?.getData('text/plain') ?? '';\n });\n\n editor.addEventListener('beforeinput', (event) => {\n const activeTextHandle = options.getActiveTextHandle();\n const activeEditorWindow = options.getActiveEditorWindow();\n if (!(event instanceof InputEvent) || event.inputType !== 'insertFromPaste' || activeTextHandle === null) {\n return;\n }\n const handleKey = activeTextHandle.toString();\n if (\n pendingTextMutationBatch !== null &&\n pendingTextMutationBatch.handle === handleKey &&\n pendingTextMutationBatch.docStart === activeEditorWindow.docStart &&\n pendingTextMutationBatch.kind !== 'paste'\n ) {\n flushPendingTextMutationsToRuntime();\n }\n const selectionStart = editor.selectionStart ?? editor.value.length;\n const selectionEnd = editor.selectionEnd ?? selectionStart;\n pendingPasteInput = {\n handle: handleKey,\n docStart: activeEditorWindow.docStart,\n selectionStart,\n selectionEnd,\n text: typeof event.data === 'string' ? event.data : pendingPasteText,\n };\n pendingPasteText = '';\n });\n\n editor.addEventListener('compositionstart', () => {\n hiddenInputIsComposing = true;\n });\n\n editor.addEventListener('input', (event) => {\n const activeTextHandle = options.getActiveTextHandle();\n const activeEditorWindow = options.getActiveEditorWindow();\n if (hiddenInputIsComposing) {\n return;\n }\n if (event instanceof InputEvent && event.inputType === 'insertText' && restorePendingTypingState(editor)) {\n return;\n }\n if (event instanceof InputEvent && event.inputType === 'insertFromPaste') {\n const pasteInput = pendingPasteInput;\n pendingPasteInput = null;\n pendingPasteText = '';\n if (\n pasteInput !== null &&\n activeTextHandle !== null &&\n activeTextHandle.toString() === pasteInput.handle &&\n activeEditorWindow.docStart === pasteInput.docStart\n ) {\n const pendingBatch = pendingTextMutationBatch !== null &&\n pendingTextMutationBatch.handle === pasteInput.handle &&\n pendingTextMutationBatch.docStart === pasteInput.docStart &&\n pendingTextMutationBatch.kind === 'paste'\n ? pendingTextMutationBatch\n : null;\n const baseWindowText = pendingBatch?.baseWindowText ?? activeEditorWindow.text;\n let selectionStart = pasteInput.selectionStart;\n let selectionEnd = pasteInput.selectionEnd;\n if (pendingBatch !== null) {\n selectionStart = mapPendingBatchCurrentIndexToBaseIndex(pendingBatch, selectionStart);\n selectionEnd = mapPendingBatchCurrentIndexToBaseIndex(pendingBatch, selectionEnd);\n }\n const rangeStart = Math.min(selectionStart, selectionEnd);\n const rangeEnd = Math.max(selectionStart, selectionEnd);\n const nextText =\n `${baseWindowText.slice(0, rangeStart)}${pasteInput.text}${baseWindowText.slice(rangeEnd)}`;\n const nextCaret = rangeStart + pasteInput.text.length;\n if (editor.value !== nextText) {\n editor.value = nextText;\n }\n editor.setSelectionRange(nextCaret, nextCaret, 'none');\n commitReplacementEdit(\n baseWindowText,\n nextText,\n {\n start: rangeStart,\n end: rangeEnd,\n insertedText: pasteInput.text,\n },\n nextCaret,\n 'paste',\n pendingBatch !== null,\n );\n return;\n }\n }\n pendingPasteInput = null;\n pendingPasteText = '';\n commitImeEdit(editor.value, editor.selectionStart ?? editor.value.length, 'typing');\n });\n\n editor.addEventListener('compositionend', () => {\n hiddenInputIsComposing = false;\n pendingPasteInput = null;\n pendingPasteText = '';\n commitImeEdit(editor.value, editor.selectionStart ?? editor.value.length, 'typing');\n });\n };\n\n return {\n applyActiveTextDeletion,\n attachHiddenEditorListeners,\n clearPendingTextMutations,\n flushPendingTextMutationsToRuntime,\n hasPendingTextMutations: () => pendingTextMutationBatch !== null,\n materializePendingTextMutations,\n reset: () => {\n hiddenInputIsComposing = false;\n clearPendingTextMutations();\n },\n };\n}\n", "import type {\n BridgeLogs,\n BridgeRuntime,\n FocusEventLog,\n SelectionChangeLog,\n WasmHandleLike,\n} from '../../core-types';\nimport type { BridgeInteractionState } from '../local-types';\nimport { codeUnitIndexToUtf8ByteOffset, utf8ByteLength } from './text-encoding';\nimport {\n applyUtf8ByteReplacementEdit,\n buildClampedTextboxEdit,\n buildHiddenEditorWindow,\n clearHiddenTextEditor,\n createHiddenTextEditor,\n type HiddenEditorWindow,\n type HiddenTextEditor,\n type PendingLocalReplacementEcho,\n type PendingLocalSelectionEcho,\n summarizeTextChange,\n utf8ByteOffsetToCodeUnitIndex,\n} from './editor-model';\nimport { createEditorMutationController } from './editor-mutations';\nimport { handleToBigInt } from '../utils/encoding';\nimport { writeUtf8ToHeap } from '../utils/heap';\n\nexport interface EditorSession extends BridgeInteractionState {\n handleClipboardRead(handle: WasmHandleLike): void;\n handleFocusChanged(handle: WasmHandleLike, isFocused: boolean): void;\n handleRequestSemanticAnnouncement(handle: WasmHandleLike): void;\n handleSelectionChanged(handle: WasmHandleLike, start: number, end: number): void;\n handleTextChanged(handle: WasmHandleLike, text: string): void;\n handleTextReplaced(handle: WasmHandleLike, start: number, end: number, text: string): void;\n}\n\nconst CARET_BLINK_INTERVAL_MS = 500;\n\nfunction currentInteractionTimeMs(): bigint {\n return BigInt(Math.floor(performance.now()));\n}\n\nexport function createEditorSession(\n runtimeRef: { current: BridgeRuntime | null },\n logs: BridgeLogs,\n): EditorSession {\n const textByHandle = Object.create(null) as Record<string, string>;\n const selectionsByHandle = Object.create(null) as Record<string, { start: number; end: number }>;\n const hiddenInput = createHiddenTextEditor(false) as HTMLInputElement;\n const hiddenTextarea = createHiddenTextEditor(true) as HTMLTextAreaElement;\n let activeTextHandle: bigint | null = null;\n let lastPointerClientX: number | null = null;\n let lastPointerClientY: number | null = null;\n let lastPointerX = 0;\n let lastPointerY = 0;\n let lastPointerModifiers = 0;\n let lastInteractivePointerHandle: bigint | null = null;\n let capturedPointerHandle: bigint | null = null;\n let pointerInsideCanvas = false;\n let appSessionVersion = 0;\n let activeTextEditable = false;\n let activeTextMultiline = false;\n let activeEditorWindow: HiddenEditorWindow = { text: '', docStart: 0, docEnd: 0, textStart: 0, textEnd: 0 };\n const textByteLengthsByHandle = Object.create(null) as Record<string, number>;\n const pendingCaretRevealByHandle = Object.create(null) as Record<string, boolean>;\n let pendingCaretRevealFrame: number | null = null;\n let pendingLocalReplacementEcho: PendingLocalReplacementEcho | null = null;\n let pendingLocalSelectionEcho: PendingLocalSelectionEcho | null = null;\n let deferredTouchFocusHandle: string | null = null;\n let caretBlinkTimer: ReturnType<typeof setTimeout> | null = null;\n let focusedHandle: string | null = null;\n const pendingSemanticAnnouncements = new Set<string>();\n window.__bridgeLogs = logs;\n window.__bridgeTextByHandle = textByHandle;\n window.__bridgeSelectionsByHandle = selectionsByHandle;\n window.__bridgeActiveEditorWindow = { handle: null, ...activeEditorWindow };\n\n const getActiveEditor = (): HiddenTextEditor => (activeTextMultiline ? hiddenTextarea : hiddenInput);\n\n const isActiveEditorFocused = (): boolean => document.activeElement === getActiveEditor();\n\n const queueSemanticAnnouncement = (handleKey: string): void => {\n pendingSemanticAnnouncements.add(handleKey);\n runtimeRef.current?.requestFrame();\n };\n\n const clampSelectionToText = (\n length: number,\n selection: { start: number; end: number },\n ): { start: number; end: number } => ({\n start: Math.max(0, Math.min(selection.start, length)),\n end: Math.max(0, Math.min(selection.end, length)),\n });\n\n const clearCaretBlinkTimer = (): void => {\n if (caretBlinkTimer !== null) {\n clearTimeout(caretBlinkTimer);\n caretBlinkTimer = null;\n }\n };\n\n const shouldRunCaretBlinkTimer = (): boolean => {\n if (activeTextHandle === null || !isActiveEditorFocused()) {\n return false;\n }\n const handleKey = activeTextHandle.toString();\n const text = textByHandle[handleKey] ?? '';\n const textByteLength = textByteLengthsByHandle[handleKey] ?? utf8ByteLength(text);\n const selection = selectionsByHandle[handleKey] ?? { start: textByteLength, end: textByteLength };\n const { start, end } = clampSelectionToText(textByteLength, selection);\n return start === end;\n };\n\n const armCaretBlinkTimer = (): void => {\n if (caretBlinkTimer !== null) {\n return;\n }\n caretBlinkTimer = setTimeout(() => {\n caretBlinkTimer = null;\n if (!shouldRunCaretBlinkTimer()) {\n return;\n }\n runtimeRef.current?.requestFrame();\n armCaretBlinkTimer();\n }, CARET_BLINK_INTERVAL_MS);\n };\n\n const updateCaretBlinkTimer = (resetPhase = false): void => {\n if (!shouldRunCaretBlinkTimer()) {\n clearCaretBlinkTimer();\n return;\n }\n if (resetPhase) {\n clearCaretBlinkTimer();\n }\n armCaretBlinkTimer();\n };\n\n const syncActiveEditorWindowDebug = (handle: string | null): void => {\n window.__bridgeActiveEditorWindow = {\n handle,\n text: activeEditorWindow.text,\n docStart: activeEditorWindow.docStart,\n docEnd: activeEditorWindow.docEnd,\n };\n };\n\n const clearActiveEditorWindow = (): void => {\n activeEditorWindow = { text: '', docStart: 0, docEnd: 0, textStart: 0, textEnd: 0 };\n syncActiveEditorWindowDebug(null);\n };\n\n const clearPendingCaretReveal = (): void => {\n if (pendingCaretRevealFrame !== null) {\n cancelAnimationFrame(pendingCaretRevealFrame);\n pendingCaretRevealFrame = null;\n }\n for (const key of Object.keys(pendingCaretRevealByHandle)) {\n delete pendingCaretRevealByHandle[key];\n }\n };\n\n const updateActiveEditorWindowText = (text: string): void => {\n activeEditorWindow = {\n text,\n docStart: activeEditorWindow.docStart,\n docEnd: activeEditorWindow.docStart + utf8ByteLength(text),\n textStart: activeEditorWindow.textStart,\n textEnd: activeEditorWindow.textStart + text.length,\n };\n syncActiveEditorWindowDebug(activeTextHandle?.toString() ?? null);\n };\n\n const detachBridgeTextInput = (): void => {\n hiddenInput.blur();\n hiddenTextarea.blur();\n };\n\n const getTextboxState = (\n handleKey: string,\n ): { isTextbox: boolean; isEditable: boolean; isMultiline: boolean } => {\n const runtime = runtimeRef.current;\n if (runtime === null) {\n return { isTextbox: false, isEditable: false, isMultiline: false };\n }\n const node = runtime.getSemanticTree().find((entry) => entry.handle === handleKey);\n if (node?.roleName !== 'textbox') {\n return { isTextbox: false, isEditable: false, isMultiline: false };\n }\n return {\n isTextbox: true,\n isEditable: node.state.readonly !== true,\n isMultiline: node.state.multiline === true,\n };\n };\n\n const syncFocusedInputState = (): void => {\n if (activeTextHandle === null) {\n clearCaretBlinkTimer();\n clearActiveEditorWindow();\n detachBridgeTextInput();\n clearHiddenTextEditor(hiddenInput);\n clearHiddenTextEditor(hiddenTextarea);\n return;\n }\n\n const activeEditor = getActiveEditor();\n const handleKey = activeTextHandle.toString();\n const text = textByHandle[handleKey] ?? '';\n const textByteLength = textByteLengthsByHandle[handleKey] ?? utf8ByteLength(text);\n textByteLengthsByHandle[handleKey] = textByteLength;\n const selection = selectionsByHandle[handleKey] ?? { start: textByteLength, end: textByteLength };\n const { start: startByte, end: endByte } = clampSelectionToText(textByteLength, selection);\n const start = utf8ByteOffsetToCodeUnitIndex(text, startByte, textByteLength);\n const end = utf8ByteOffsetToCodeUnitIndex(text, endByte, textByteLength);\n const direction = start === end ? 'none' : (startByte < endByte ? 'forward' : 'backward');\n const normalizedStart = Math.min(start, end);\n const normalizedEnd = Math.max(start, end);\n activeEditorWindow = buildHiddenEditorWindow(text, normalizedStart, normalizedEnd, textByteLength, activeEditorWindow);\n syncActiveEditorWindowDebug(handleKey);\n const localStart = normalizedStart - activeEditorWindow.textStart;\n const localEnd = normalizedEnd - activeEditorWindow.textStart;\n if (activeEditor.value !== activeEditorWindow.text) {\n activeEditor.value = activeEditorWindow.text;\n }\n activeEditor.readOnly = !activeTextEditable;\n activeEditor.setSelectionRange(localStart, localEnd, direction);\n updateCaretBlinkTimer();\n };\n\n const mutationController = createEditorMutationController({\n runtimeRef,\n textByHandle,\n selectionsByHandle,\n textByteLengthsByHandle,\n getActiveEditor,\n getActiveEditorWindow: () => activeEditorWindow,\n getActiveTextEditable: () => activeTextEditable,\n getActiveTextHandle: () => activeTextHandle,\n isActiveEditorFocused,\n setPendingLocalReplacementEcho: (value) => {\n pendingLocalReplacementEcho = value;\n },\n setPendingLocalSelectionEcho: (value) => {\n pendingLocalSelectionEcho = value;\n },\n syncFocusedInputState,\n updateActiveEditorWindowText,\n });\n\n const clearPendingTextMutations = (): void => {\n mutationController.clearPendingTextMutations();\n };\n\n const focusHiddenEditorNow = (): void => {\n getActiveEditor().focus({ preventScroll: true });\n syncFocusedInputState();\n updateCaretBlinkTimer(true);\n };\n\n const refocusActiveTextInput = (): void => {\n if (activeTextHandle === null) {\n if (deferredTouchFocusHandle === null) {\n return;\n }\n const textboxState = getTextboxState(deferredTouchFocusHandle);\n if (!textboxState.isTextbox) {\n return;\n }\n activeTextHandle = handleToBigInt(deferredTouchFocusHandle);\n activeTextEditable = textboxState.isEditable;\n activeTextMultiline = textboxState.isMultiline;\n syncFocusedInputState();\n focusHiddenEditorNow();\n return;\n }\n focusHiddenEditorNow();\n };\n\n const beginTouchTextFocusDeferral = (handle: bigint): void => {\n deferredTouchFocusHandle = handle.toString();\n };\n\n const cancelTouchTextFocusDeferral = (): void => {\n deferredTouchFocusHandle = null;\n };\n\n const commitTouchTextFocusDeferral = (handle: bigint): void => {\n const handleKey = handle.toString();\n if (deferredTouchFocusHandle !== handleKey) {\n return;\n }\n deferredTouchFocusHandle = null;\n if (activeTextHandle?.toString() !== handleKey) {\n return;\n }\n if (!isActiveEditorFocused()) {\n focusHiddenEditorNow();\n }\n };\n\n const scheduleCaretRevealReplay = (handleKey: string): void => {\n if (!pendingCaretRevealByHandle[handleKey] || activeTextHandle?.toString() !== handleKey) {\n return;\n }\n if (pendingCaretRevealFrame !== null) {\n return;\n }\n pendingCaretRevealFrame = requestAnimationFrame(() => {\n pendingCaretRevealFrame = null;\n if (!pendingCaretRevealByHandle[handleKey] || activeTextHandle?.toString() !== handleKey) {\n return;\n }\n delete pendingCaretRevealByHandle[handleKey];\n const runtime = runtimeRef.current;\n if (runtime === null) {\n return;\n }\n const text = textByHandle[handleKey] ?? '';\n const textByteLength = utf8ByteLength(text);\n const selection = selectionsByHandle[handleKey] ?? { start: textByteLength, end: textByteLength };\n const { start, end } = clampSelectionToText(textByteLength, selection);\n runtime.ui._ui_set_text_selection_range(handleToBigInt(handleKey), start, end);\n });\n };\n\n const clearRecordMap = <T>(record: Record<string, T>): void => {\n for (const key of Object.keys(record)) {\n delete record[key];\n }\n };\n\n const resetAppSession = (): void => {\n appSessionVersion += 1;\n clearRecordMap(textByHandle);\n clearRecordMap(textByteLengthsByHandle);\n clearRecordMap(selectionsByHandle);\n clearPendingCaretReveal();\n mutationController.reset();\n pendingLocalReplacementEcho = null;\n pendingLocalSelectionEcho = null;\n deferredTouchFocusHandle = null;\n clearCaretBlinkTimer();\n activeTextHandle = null;\n activeTextEditable = false;\n activeTextMultiline = false;\n clearActiveEditorWindow();\n focusedHandle = null;\n pendingSemanticAnnouncements.clear();\n lastInteractivePointerHandle = null;\n capturedPointerHandle = null;\n hiddenInput.value = '';\n hiddenInput.setSelectionRange(0, 0, 'none');\n hiddenTextarea.value = '';\n hiddenTextarea.setSelectionRange(0, 0, 'none');\n detachBridgeTextInput();\n };\n mutationController.attachHiddenEditorListeners(hiddenInput);\n mutationController.attachHiddenEditorListeners(hiddenTextarea);\n\n const handleFocusChanged = (handle: WasmHandleLike, isFocused: boolean): void => {\n const handleKey = handle.toString();\n const entry: FocusEventLog = { handle: handleKey, isFocused };\n logs.focusEvents.push(entry);\n if (isFocused) {\n focusedHandle = handleKey;\n } else if (focusedHandle === handleKey) {\n focusedHandle = null;\n }\n if (isFocused) {\n const textboxState = getTextboxState(handleKey);\n if (!textboxState.isTextbox) {\n deferredTouchFocusHandle = null;\n delete pendingCaretRevealByHandle[handleKey];\n activeTextHandle = null;\n activeTextEditable = false;\n activeTextMultiline = false;\n syncFocusedInputState();\n updateCaretBlinkTimer();\n queueSemanticAnnouncement(handleKey);\n return;\n }\n activeTextHandle = handleToBigInt(handle);\n activeTextEditable = textboxState.isEditable;\n activeTextMultiline = textboxState.isMultiline;\n syncFocusedInputState();\n if (deferredTouchFocusHandle === handleKey) {\n updateCaretBlinkTimer();\n queueSemanticAnnouncement(handleKey);\n return;\n }\n window.setTimeout(() => {\n if (activeTextHandle !== null && activeTextHandle.toString() === handleKey) {\n focusHiddenEditorNow();\n }\n }, 0);\n } else if (activeTextHandle !== null && activeTextHandle.toString() === handleKey) {\n if (deferredTouchFocusHandle === handleKey) {\n updateCaretBlinkTimer();\n return;\n }\n deferredTouchFocusHandle = null;\n runtimeRef.current?.flushPendingCommit();\n delete pendingCaretRevealByHandle[handleKey];\n pendingLocalReplacementEcho = null;\n pendingLocalSelectionEcho = null;\n clearPendingTextMutations();\n activeTextHandle = null;\n activeTextEditable = false;\n activeTextMultiline = false;\n syncFocusedInputState();\n }\n updateCaretBlinkTimer();\n if (isFocused) {\n queueSemanticAnnouncement(handleKey);\n }\n };\n\n const handleTextChanged = (handle: WasmHandleLike, text: string): void => {\n const handleKey = handle.toString();\n if (pendingLocalReplacementEcho !== null && pendingLocalReplacementEcho.handle === handleKey) {\n pendingLocalReplacementEcho = null;\n }\n textByHandle[handleKey] = text;\n textByteLengthsByHandle[handleKey] = utf8ByteLength(text);\n logs.textChanges.push(summarizeTextChange(handleKey, text));\n if (activeTextHandle !== null && activeTextHandle.toString() === handleKey) {\n pendingCaretRevealByHandle[handleKey] = true;\n if (!isActiveEditorFocused()) {\n focusHiddenEditorNow();\n updateCaretBlinkTimer(true);\n return;\n }\n syncFocusedInputState();\n updateCaretBlinkTimer(true);\n }\n };\n\n const handleRequestSemanticAnnouncement = (handle: WasmHandleLike): void => {\n queueSemanticAnnouncement(handle.toString());\n };\n\n const handleTextReplaced = (handle: WasmHandleLike, start: number, end: number, text: string): void => {\n const handleKey = handle.toString();\n const previousText = textByHandle[handleKey] ?? '';\n const previousTextByteLength = textByteLengthsByHandle[handleKey] ?? utf8ByteLength(previousText);\n const isLocalEcho = pendingLocalReplacementEcho !== null\n && pendingLocalReplacementEcho.handle === handleKey\n && pendingLocalReplacementEcho.start === start\n && pendingLocalReplacementEcho.end === end\n && pendingLocalReplacementEcho.text === text\n && activeTextHandle !== null\n && activeTextHandle.toString() === handleKey\n && isActiveEditorFocused();\n const nextText = isLocalEcho\n ? previousText\n : applyUtf8ByteReplacementEdit(previousText, start, end, text);\n if (!isLocalEcho) {\n textByHandle[handleKey] = nextText;\n textByteLengthsByHandle[handleKey] = previousTextByteLength - (end - start) + utf8ByteLength(text);\n }\n if (isLocalEcho) {\n pendingLocalReplacementEcho = null;\n }\n logs.textChanges.push(summarizeTextChange(handleKey, nextText));\n if (activeTextHandle !== null && activeTextHandle.toString() === handleKey) {\n pendingCaretRevealByHandle[handleKey] = true;\n if (!isActiveEditorFocused()) {\n focusHiddenEditorNow();\n updateCaretBlinkTimer(true);\n return;\n }\n if (!isLocalEcho) {\n syncFocusedInputState();\n }\n updateCaretBlinkTimer(true);\n }\n };\n\n const handleSelectionChanged = (handle: WasmHandleLike, start: number, end: number): void => {\n const handleKey = handle.toString();\n const isLocalEcho = pendingLocalSelectionEcho !== null\n && pendingLocalSelectionEcho.handle === handleKey\n && pendingLocalSelectionEcho.start === start\n && pendingLocalSelectionEcho.end === end\n && activeTextHandle !== null\n && activeTextHandle.toString() === handleKey\n && isActiveEditorFocused();\n selectionsByHandle[handleKey] = { start, end };\n if (pendingLocalSelectionEcho !== null && pendingLocalSelectionEcho.handle === handleKey) {\n pendingLocalSelectionEcho = null;\n }\n const entry: SelectionChangeLog = { handle: handleKey, start, end };\n logs.selectionChanges.push(entry);\n if (activeTextHandle !== null && activeTextHandle.toString() === handleKey) {\n if (!isActiveEditorFocused()) {\n focusHiddenEditorNow();\n updateCaretBlinkTimer(true);\n return;\n }\n if (!isLocalEcho) {\n syncFocusedInputState();\n }\n updateCaretBlinkTimer(true);\n scheduleCaretRevealReplay(handleKey);\n }\n };\n\n const handleClipboardRead = (handle: WasmHandleLike): void => {\n const runtime = runtimeRef.current;\n if (runtime === null) {\n return;\n }\n const handleValue = handleToBigInt(handle);\n const requestSessionVersion = appSessionVersion;\n logs.clipboardReadRequests.push(handleValue.toString());\n void navigator.clipboard.readText().then((text) => {\n if (requestSessionVersion !== appSessionVersion) {\n return;\n }\n const handleKey = handleValue.toString();\n const currentText = textByHandle[handleKey] ?? '';\n const currentTextByteLength = textByteLengthsByHandle[handleKey] ?? utf8ByteLength(currentText);\n const selection = selectionsByHandle[handleKey] ?? { start: currentTextByteLength, end: currentTextByteLength };\n const rangeStart = Math.max(0, Math.min(selection.start, selection.end));\n const rangeEnd = Math.max(rangeStart, Math.min(currentTextByteLength, Math.max(selection.start, selection.end)));\n const clampedEdit = buildClampedTextboxEdit(\n currentText,\n rangeStart,\n rangeEnd,\n text,\n rangeStart + utf8ByteLength(text),\n );\n textByHandle[handleKey] = clampedEdit.fullNextText;\n textByteLengthsByHandle[handleKey] = utf8ByteLength(clampedEdit.fullNextText);\n selectionsByHandle[handleKey] = { start: clampedEdit.caretByte, end: clampedEdit.caretByte };\n if (activeTextHandle !== null && activeTextHandle.toString() === handleKey) {\n syncFocusedInputState();\n }\n if (clampedEdit.replacement === null) {\n return;\n }\n runtime.ui._ui_set_interaction_time(currentInteractionTimeMs());\n const replacementStartByte = codeUnitIndexToUtf8ByteOffset(currentText, clampedEdit.replacement.start);\n const replacementEndByte = codeUnitIndexToUtf8ByteOffset(currentText, clampedEdit.replacement.end);\n pendingLocalReplacementEcho = {\n handle: handleKey,\n start: replacementStartByte,\n end: replacementEndByte,\n text: clampedEdit.replacement.insertedText,\n };\n pendingLocalSelectionEcho = {\n handle: handleKey,\n start: clampedEdit.caretByte,\n end: clampedEdit.caretByte,\n };\n const heapString = writeUtf8ToHeap(runtime.ui, clampedEdit.replacement.insertedText);\n try {\n runtime.ui._ui_replace_text_range(\n handleValue,\n replacementStartByte,\n replacementEndByte,\n heapString.ptr,\n heapString.len,\n clampedEdit.caretByte,\n );\n } finally {\n heapString.dispose();\n }\n runtime.commitFrame();\n }).catch(() => undefined);\n };\n\n return {\n logs,\n textByHandle,\n selectionsByHandle,\n hasPendingTextMutations: mutationController.hasPendingTextMutations,\n materializePendingTextMutations: mutationController.materializePendingTextMutations,\n getActiveTextEditable: () => activeTextEditable,\n getActiveTextHandle: () => activeTextHandle,\n getActiveTextMultiline: () => activeTextMultiline,\n getCapturedPointerHandle: () => capturedPointerHandle,\n getLastPointerClientPosition: () => ({ x: lastPointerClientX, y: lastPointerClientY }),\n getLastPointerPosition: () => ({ x: lastPointerX, y: lastPointerY }),\n getLastPointerModifiers: () => lastPointerModifiers,\n getLastInteractivePointerHandle: () => lastInteractivePointerHandle,\n isActiveTextInputFocused: isActiveEditorFocused,\n isPointerInsideCanvas: () => pointerInsideCanvas,\n applyActiveTextDeletion: mutationController.applyActiveTextDeletion,\n beginTouchTextFocusDeferral,\n cancelTouchTextFocusDeferral,\n commitTouchTextFocusDeferral,\n refocusActiveTextInput,\n resetAppSession,\n consumePendingSemanticAnnouncements: () => {\n const handles = Array.from(pendingSemanticAnnouncements.values());\n pendingSemanticAnnouncements.clear();\n return handles;\n },\n getFocusedHandle: () => focusedHandle,\n setCapturedPointerHandle: (handle: bigint | null) => {\n capturedPointerHandle = handle;\n },\n setLastPointerClientPosition: (x: number, y: number) => {\n lastPointerClientX = x;\n lastPointerClientY = y;\n },\n setLastPointerModifiers: (modifiers: number) => {\n lastPointerModifiers = modifiers;\n },\n setLastPointerPosition: (x: number, y: number) => {\n lastPointerX = x;\n lastPointerY = y;\n },\n setLastInteractivePointerHandle: (handle: bigint | null) => {\n lastInteractivePointerHandle = handle;\n },\n setPointerInsideCanvas: (flag: boolean) => {\n pointerInsideCanvas = flag;\n },\n handleClipboardRead,\n handleFocusChanged,\n handleRequestSemanticAnnouncement,\n handleSelectionChanged,\n handleTextChanged,\n handleTextReplaced,\n };\n}\n", "import type {\n BridgeLogs,\n FocusEventLog,\n PointerEventLog,\n ScrollEventLog,\n SelectionChangeLog,\n TextChangeLog,\n} from '../../core-types';\n\nexport function createBridgeLogs(): BridgeLogs {\n return {\n pointerEvents: [] as PointerEventLog[],\n focusEvents: [] as FocusEventLog[],\n textChanges: [] as TextChangeLog[],\n selectionChanges: [] as SelectionChangeLog[],\n crossSelectionChanges: [] as { areaHandle: string; text: string }[],\n clipboardWrites: [] as string[],\n clipboardReadRequests: [] as string[],\n scrollEvents: [] as ScrollEventLog[],\n missingFontCoverageRequests: [] as { fontId: number; coverageKind: number; sampleText: string }[],\n incrementalFontPackageRequests: [] as { primaryFontId: number; coverageKind: number; packageId: string; segmentIds: readonly string[]; sampleText: string }[],\n } satisfies BridgeLogs;\n}\n", "import type {\n BridgeRuntime,\n ClipboardWritePayload,\n EffinDomCallbacks,\n PointerEventLog,\n ScrollEventLog,\n} from '../core-types';\nimport { enrichClipboardPayload, writeClipboardPayload } from '../clipboard';\nimport { createEditorSession, type EditorSession } from './interaction/editor-session';\nimport { createBridgeLogs } from './interaction/logs';\nimport { handleToString } from './utils/encoding';\n\nexport function installCallbacks(runtimeRef: { current: BridgeRuntime | null }): EditorSession {\n const logs = createBridgeLogs();\n const editorSession = createEditorSession(runtimeRef, logs);\n\n const callbacks: EffinDomCallbacks = {\n onPointerEvent: (handle, eventType) => {\n const { x, y } = editorSession.getLastPointerPosition();\n const modifiers = editorSession.getLastPointerModifiers();\n const entry: PointerEventLog = { handle: handleToString(handle), eventType };\n logs.pointerEvents.push(entry);\n window.__effindomCallbacks?.onPointerEventWithCoords?.(\n eventType,\n handle,\n x,\n y,\n modifiers,\n );\n },\n onFocusChanged: editorSession.handleFocusChanged,\n onTextChanged: editorSession.handleTextChanged,\n onRequestSemanticAnnouncement: editorSession.handleRequestSemanticAnnouncement,\n onTextReplaced: editorSession.handleTextReplaced,\n onSelectionChanged: editorSession.handleSelectionChanged,\n onScroll: (handle, offsetX, offsetY, contentWidth, contentHeight, viewportWidth, viewportHeight) => {\n const entry: ScrollEventLog = {\n handle: handleToString(handle),\n offsetX,\n offsetY,\n contentWidth,\n contentHeight,\n viewportWidth,\n viewportHeight,\n };\n logs.scrollEvents.push(entry);\n },\n onCrossSelectionChanged: (areaHandle, text) => {\n logs.crossSelectionChanges.push({ areaHandle: handleToString(areaHandle), text });\n },\n onClipboardWrite: (payload: ClipboardWritePayload) => {\n logs.clipboardWrites.push(payload.plainText);\n const runtime = runtimeRef.current;\n const enrichedPayload =\n runtime === null\n ? payload\n : enrichClipboardPayload(payload, (fontId) => runtime.getClipboardFontUrl(fontId));\n void writeClipboardPayload(enrichedPayload).catch(() => undefined);\n },\n onClipboardRead: editorSession.handleClipboardRead,\n onRequestFontLoad: (fontId, url) => {\n const runtime = runtimeRef.current;\n if (runtime === null || url.length === 0) {\n return;\n }\n void runtime.loadFont(fontId, url).catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`[fui_host] font ${String(fontId)} failed lazy load from ${url}: ${message}`);\n });\n },\n onMissingFontCoverage: (fontId, coverageKind, sampleText) => {\n const runtime = runtimeRef.current;\n if (runtime === null) {\n return;\n }\n logs.missingFontCoverageRequests.push({\n fontId,\n coverageKind,\n sampleText,\n });\n runtime.handleMissingFontCoverage(fontId, coverageKind, sampleText);\n },\n };\n\n window.__effindomCallbacks = callbacks;\n return editorSession;\n}\n", "import type { BridgeRuntime, BridgeState } from './core-types';\nimport { createBridgeSession, type BridgeSession } from './bridge/init';\nimport { installCallbacks } from './bridge/interaction';\nimport { prepareRuntimeAssets } from './bridge/utils/assets';\nimport {\n handleToBigInt,\n handleToString,\n normalizePointerForWasm,\n pointerToHeapOffset,\n toHeapPointer,\n} from './bridge/utils/encoding';\n\nlet currentRuntime: BridgeRuntime | null = null;\nlet currentSession: BridgeSession | null = null;\nlet bridgeReadyPromise: Promise<BridgeRuntime> | null = null;\nlet sessionChain: Promise<void> = Promise.resolve();\n\nconst runtimeRef: { current: BridgeRuntime | null } = { current: null };\nconst interactionState = installCallbacks(runtimeRef);\nconst preparedAssetsPromise = prepareRuntimeAssets();\n\nasync function bootRuntimeSession(): Promise<BridgeRuntime> {\n currentRuntime?.resetLogs();\n currentSession?.destroy();\n currentSession = null;\n\n const preparedAssets = await preparedAssetsPromise;\n const session = await createBridgeSession({\n interactionState,\n preparedAssets,\n runtimeRef,\n });\n currentSession = session;\n currentRuntime = session.runtime;\n window.__bridgeReady = true;\n window.__bridgeDebug = {\n forceDeviceLost() {\n session.runtime.core._ed_debug_simulate_device_lost?.();\n session.runtime.requestFrame();\n },\n };\n delete window.__bridgeError;\n return session.runtime;\n}\n\nfunction queueRuntimeBoot(): Promise<BridgeRuntime> {\n sessionChain = sessionChain\n .catch(() => undefined)\n .then(async () => {\n await bootRuntimeSession();\n });\n return sessionChain.then(() => {\n if (currentRuntime === null) {\n throw new Error('Bridge runtime failed to boot.');\n }\n return currentRuntime;\n });\n}\n\nbridgeReadyPromise = queueRuntimeBoot().catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n window.__bridgeReady = false;\n window.__bridgeError = message;\n throw error;\n});\n\nconst bridgeState: BridgeState = {\n get ready(): Promise<BridgeRuntime> {\n return bridgeReadyPromise ?? Promise.reject(new Error('Bridge runtime is not booting.'));\n },\n getRuntime: () => currentRuntime,\n recreateRuntime: async () => {\n bridgeReadyPromise = queueRuntimeBoot();\n return await bridgeReadyPromise;\n },\n resetLogs: () => {\n if (currentRuntime !== null) {\n currentRuntime.resetLogs();\n }\n },\n handleToBigInt,\n handleToString,\n pointerToHeapOffset,\n normalizePointerForWasm,\n toHeapPointer,\n};\n\nwindow.__bridgeReady = false;\nwindow.EffinDomBrowserBridge = bridgeState;\n\nvoid bridgeReadyPromise.catch(() => undefined);\n\nexport {};\n"],
5
+ "mappings": "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",
6
+ "names": ["EdBackendType", "EdDeviceState", "extractHandlePrimitive", "handle", "symbolPrimitive", "primitive", "stringified", "handleToBigInt", "handleToString", "pointerToHeapOffset", "pointer", "value", "normalizePointerForWasm", "module", "toHeapPointer", "ptr", "normalizeBackendType", "EdBackendType", "normalizeDeviceState", "EdDeviceState", "computeModifiers", "event", "modifiers", "WEBGPU_INIT_TIMEOUT_MS", "DEFAULT_BACKEND_LADDER", "EdBackendType", "backendTypeToRenderer", "backendType", "setActiveRenderer", "loaderInfo", "waitForAnimationFrame", "resolve", "waitForWebGpuInit", "core", "deadline", "normalizeBackendType", "deviceState", "normalizeDeviceState", "EdDeviceState", "probeWebGpuAdapter", "nav", "adapter", "backendLabel", "backend", "tryReviveBackend", "canvas", "dpr", "w", "h", "initRenderer", "backendLadder", "physicalWidth", "physicalHeight", "ladder", "firstBackend", "webGpuAttempted", "webGl2Attempted", "resolvedBackend", "triedBackends", "reason", "scriptSourceCache", "delay", "ms", "resolve", "resolveAssetUrl", "url", "normalizeFetchIntegrity", "integrity", "value", "digest", "bytesToBase64", "bytes", "binary", "index", "chunk", "verifyFetchedIntegrity", "assetUrl", "buffer", "normalizedIntegrity", "digestBuffer", "buildFetchInit", "cache", "fetchIntegrity", "init", "fetchWithRetry", "attempts", "read", "lastError", "attempt", "response", "error", "fetchBinaryAsset", "loadScriptResource", "scriptUrl", "integrity", "absoluteUrl", "resolveAssetUrl", "sourceText", "fetchScriptSource", "blobSource", "blobUrl", "resolve", "reject", "script", "cacheKey", "sourcePromise", "scriptSourceCache", "fetchBinaryAsset", "scriptBytes", "textEncoder", "writeUtf8ToHeap", "module", "text", "bytes", "ptr", "normalizePointerForWasm", "offset", "pointerToHeapOffset", "writeBytesToHeap", "extractCommandBuffer", "ui", "lengthPtr", "lengthOffset", "bufferPtr", "wordCount", "bufferOffset", "wordOffset", "extractSemanticBuffer", "executeCommandBuffer", "core", "words", "MEMORY64_VALIDATION_MODULE_BYTES", "SIMD_VALIDATION_MODULE_BYTES", "showIcuError", "message", "errorBox", "messageNode", "overlay", "overlayTitle", "overlayDetail", "createErrorWithCause", "cause", "wrappedError", "delay", "ms", "resolve", "resetBridgeLogs", "logs", "supportsMemory64", "MEMORY64_VALIDATION_MODULE_BYTES", "supportsSimd", "SIMD_VALIDATION_MODULE_BYTES", "normalizeWasmArchitecture", "requestedArchitecture", "value", "getManifestArchitectureEntry", "manifest", "architecture", "selectManifestArchitecture", "normalizedRequest", "memory64Supported", "simdSupported", "availableArchitectures", "selectedArchitecture", "selectionReason", "architectureUsesMemory64", "architectureUsesSimd", "preferredArchitectures", "candidate", "manifestEntry", "readManifestUrl", "runtimeConfig", "resolveManifestAssetUrl", "manifestUrl", "assetUrl", "loadRuntimeManifest", "resolveAssetUrl", "fetchWithRetry", "response", "instantiatePreparedWasm", "preparedAsset", "imports", "module", "loadIcuData", "ui", "preparedAssets", "bytes", "heapBytes", "writeBytesToHeap", "describeAbortReason", "fallback", "prepareWasmAsset", "url", "integrity", "requestInit", "bytesPromise", "buffer", "verifyFetchedIntegrity", "coreScriptRunnerCache", "getCoreScriptRunner", "scriptUrl", "absoluteUrl", "cacheKey", "runnerPromise", "fetchScriptSource", "sourceText", "wrappedSource", "loadCoreModule", "bundle", "preparedWasm", "canvas", "loaderInfo", "resolve", "reject", "path", "receiveInstance", "result", "error", "createErrorWithCause", "what", "emMemory", "EdBackendType", "EdDeviceState", "runCoreScript", "loadUiModule", "loadScriptResource", "rejectInstantiation", "instantiationFailure", "_", "modulePromise", "uiEmMemory", "readRequestedArchitecture", "readRequestedRendererBackend", "buildBackendLadder", "requestedBackend", "DEFAULT_BACKEND_LADDER", "prepareRuntimeAssets", "loadedManifest", "selection", "requestedRendererBackend", "coreBundle", "uiBundle", "icuAsset", "fetchBinaryAsset", "combiningMarkPattern", "wordLikeCharPattern", "textEncoder", "DEFAULT_OPEN_CANVAS_FIND_OPTIONS", "normalizeOpenCanvasFindOptions", "options", "utf8ByteOffsetFromCodeUnitIndex", "text", "codeUnitIndex", "clampedIndex", "codePointBefore", "boundary", "start", "low", "high", "codePointAt", "codePoint", "isWordLikeChar", "value", "isWholeWordMatch", "end", "buildSearchText", "source", "tokens", "output", "sourceIndex", "segment", "searchable", "index", "findTextInOpenCanvasDocuments", "documents", "query", "resolvedOptions", "normalizedQuery", "matches", "document", "searchableDocument", "searchStart", "matchStart", "matchEnd", "startToken", "endToken", "sourceStart", "sourceEnd", "isMobileBrowser", "detectPlatformFamily", "platform", "isPlatformShortcutKey", "event", "platformFamily", "isFindShortcut", "event", "isPlatformShortcutKey", "isNextShortcut", "createSvgIcon", "kind", "ns", "svg", "appendPath", "d", "path", "createIconButton", "label", "icon", "variant", "button", "sameMatch", "left", "right", "DesktopFindDialogController", "runtime", "_canvas", "DEFAULT_OPEN_CANVAS_FIND_OPTIONS", "parent", "root", "topRow", "searchShell", "input", "status", "divider", "previousButton", "nextButton", "disclosureButton", "closeButton", "navigationGroup", "advancedPanel", "createToggleRow", "key", "labelSpan", "track", "thumb", "highlightAllRow", "matchCaseRow", "matchDiacriticsRow", "wholeWordsRow", "optionButtons", "optionTracks", "optionThumbs", "preserveInputFocus", "setButtonHovered", "hovered", "bindNonBlurringButton", "callback", "type", "isMobileBrowser", "target", "selectAll", "selectionStart", "selectionEnd", "palette", "pressed", "hasMatches", "syncButtonState", "enabled", "preserveCurrentMatch", "query", "previousMatch", "results", "match", "preservedIndex", "entry", "delta", "revealActive", "state", "PULL_TO_REFRESH_ID", "ensurePullToRefreshElements", "existing", "PULL_TO_REFRESH_ID", "icon", "root", "createPullToRefreshOverlay", "visible", "hideTimer", "pullDistance", "distance", "normalized", "travel", "immediate", "ensureCanvasLogicalSize", "canvas", "rect", "getCanvasSizeSource", "source", "readCanvasLogicalSize", "sizeSource", "styleWidth", "styleHeight", "getPointerPosition", "event", "logicalSize", "contentLeft", "contentTop", "displayWidth", "displayHeight", "x", "y", "isPointerInsideCanvas", "normalizeWheelDelta", "deltaX", "deltaY", "UI_KEY_EVENT_DOWN", "UI_KEY_EVENT_UP", "currentInteractionTimeMs", "isVerticalCanvasNavigationKey", "key", "isTextNavigationKey", "installKeyAndWindowHandlers", "runtime", "interactionState", "desktopFindDialog", "ui", "forwardKeyEvent", "type", "event", "modifiers", "computeModifiers", "activeTextHandle", "activeTextEditable", "activeTextMultiline", "activeTextInputFocused", "activeEditableTextOwnsNativeEditingKey", "activeEditableTextNeedsRuntimeEditingFallback", "activeTextOwnsRuntimeNavigationKey", "activeReadonlyTextOwnsRuntimeKey", "heapString", "writeUtf8ToHeap", "callbackHandled", "handleKeyDown", "handleKeyUp", "keyListenerCapture", "reconcileFindSelection", "handleWindowBlur", "handleWindowFocus", "handleResize", "commitIfVisualWork", "runtime", "PointerMoveCoalescer", "flushMove", "move", "pending", "pointInSemanticBounds", "bounds", "x", "y", "findSemanticTextboxHandleAtPoint", "runtime", "tree", "i", "node", "handleToBigInt", "transitionTouchGesture", "state", "event", "primaryAxis", "UI_EVENT_POINTER_DOWN", "UI_EVENT_POINTER_UP", "UI_EVENT_POINTER_MOVE", "UI_EVENT_POINTER_LEAVE", "EDGE_AUTOSCROLL_THRESHOLD", "TOUCH_SCROLL_THRESHOLD", "TOUCH_AXIS_LOCK_DOMINANCE_RATIO", "TOUCH_AXIS_BREAKOUT_DISTANCE", "TOUCH_AXIS_BREAKOUT_RATIO", "TOUCH_AXIS_BREAKOUT_STEP_THRESHOLD", "resolvePrimaryTouchAxis", "deltaX", "deltaY", "absX", "absY", "shouldUnlockTouchAxis", "axisMode", "travelX", "travelY", "primaryTravel", "secondaryTravel", "currentInteractionTimeMs", "semanticRoleAtHandle", "runtime", "handle", "handleKey", "entry", "installPointerHandlers", "interactionState", "pullToRefresh", "canvas", "ui", "primaryPointerDown", "activePrimaryPointerId", "suppressedContextMenuPointerId", "edgeAutoScrollTickScheduled", "activePrimaryPointerType", "activeTouchGesture", "touchGestureBreakoutTravel", "applySelectionAutoScroll", "x", "y", "handleToBigInt", "processPointerMove", "pending", "commitIfVisualWork", "appCapturedHandle", "scheduleEdgeAutoScrollTick", "pointerMoveCoalescer", "PointerMoveCoalescer", "releaseCanvasPointerCapture", "pointerId", "captureCanvasPointer", "cancelPressedPointerInteraction", "capturedHandle", "handleTouchPointerScroll", "event", "position", "modifiers", "deltaFromStartX", "deltaFromStartY", "distanceSquared", "primaryAxis", "transitionTouchGesture", "prevState", "absDeltaX", "absDeltaY", "scrollDeltaX", "scrollDeltaY", "appliedScrollDeltaY", "isPointerInsideCanvas", "pullToRefreshDistance", "forwardPointerEvent", "type", "useHitTest", "computeModifiers", "pointerInsideCanvas", "getPointerPosition", "activeTextHandle", "refocusActiveTextInputAfterContextMenu", "isTouchEvent", "isPointerCancel", "touchTapCandidateHandle", "touchTapDiscarded", "pendingTapTextHandle", "wasCancelled", "scrolling", "triggerRefresh", "rawHitHandle", "semanticTextboxHandle", "findSemanticTextboxHandleAtPoint", "hitHandle", "refocusActiveTextInputAfterPointerDown", "delayCanvasFocusUntilAfterPointerDown", "keepTouchEditorFocusedOnPointerDown", "refocusActiveTextInputAfterPointerUp", "shouldCommitDeferredTouchFocus", "touchDownTextboxHandle", "touchDownOnAlreadyFocusedText", "handleContextMenu", "handlePointerDown", "handlePointerUp", "handlePointerMove", "handleCapturedPointerExit", "handlePointerLeave", "handlePointerOut", "handlePointerCancel", "shouldHandleWindowPointerEvent", "handleWindowPointerMove", "handleWindowPointerUp", "handleWindowPointerCancel", "handleWheel", "delta", "normalizeWheelDelta", "detectCoarsePointerMode", "installEventHandlers", "runtime", "interactionState", "canvas", "ui", "desktopFindDialog", "DesktopFindDialogController", "pullToRefresh", "createPullToRefreshOverlay", "coarsePointerQuery", "updateCoarsePointerMode", "updatePlatformFamily", "detectPlatformFamily", "removePointerHandlers", "installPointerHandlers", "removeKeyAndWindowHandlers", "installKeyAndWindowHandlers", "BUILT_IN_BRIDGE_FONTS", "STARTUP_BRIDGE_FONTS", "font", "getBuiltInBridgeFont", "fontId", "getBridgeAssetBaseUrl", "manifestUrl", "currentScript", "getBridgeAssetUrl", "assetFile", "svgTextDecoder", "createDecodeCanvas", "width", "height", "canvas", "decodeBlobToBitmap", "blob", "extractBitmapRgba", "bitmap", "context", "imageData", "parseSvgLength", "value", "trimmed", "numericPrefix", "parsed", "parseSvgViewBox", "parts", "entry", "parseSvgIntrinsicSize", "bytes", "markup", "documentRoot", "viewBox", "AssetManager", "core", "fontManager", "onCommitFrame", "svgId", "url", "response", "size", "svgBytes", "writeBytesToHeap", "textureId", "rgba", "textureBytes", "GOOGLE_FONTS_STYLESHEET_ORIGIN", "GOOGLE_FONTS_BINARY_ORIGIN", "ensureLinkTag", "rel", "href", "crossOrigin", "link", "ensureGoogleFontShardPreconnect", "buildGoogleFontStylesheetUrl", "googleFamily", "text", "params", "parseGoogleFontBinaryUrl", "stylesheetText", "match", "fetchGoogleFontShardBytes", "stylesheetUrl", "stylesheetResponse", "binaryUrl", "binaryResponse", "UI_MISSING_FONT_COVERAGE_ARABIC", "UI_MISSING_FONT_COVERAGE_THAI", "UI_MISSING_FONT_COVERAGE_CJK", "UI_MISSING_FONT_COVERAGE_SUPPLEMENTAL", "AUTO_EXTENDABLE_PRIMARY_FONT_IDS", "SUPPLEMENTAL_FAMILIES", "inRanges", "codePoint", "ranges", "start", "end", "uniqueCodePoints", "text", "seen", "ordered", "character", "isCjkPunctuation", "buildShardRequest", "packageId", "coverageKind", "familyKey", "googleFamily", "characters", "resolveCjkRequests", "sampleText", "codePoints", "kana", "hangul", "han", "punctuation", "requests", "resolveSupplementalRequests", "textByFamily", "family", "entry", "current", "request", "resolveIncrementalFontPackageRequests", "primaryFontId", "uniqueText", "DEFAULT_INCREMENTAL_FONT_POLICY", "IncrementalFontManager", "core", "ui", "logs", "onCommitFrame", "policy", "fontId", "bytes", "coreBytes", "writeBytesToHeap", "uiBytes", "shardKey", "shard", "packageId", "primaryFontId", "shardFontId", "fontState", "trackedShardKeys", "fallbacks", "fallbackId", "leastRecentlyUsed", "state", "url", "current", "previousUrl", "replay", "response", "verb", "context", "error", "message", "fallbackIds", "pending", "request", "visited", "lazyUrl", "builtInFont", "getBuiltInBridgeFont", "getBridgeAssetUrl", "fallbackFontId", "existingFallbacks", "cachedShard", "existing", "fetchGoogleFontShardBytes", "familyKey", "pendingKey", "pendingRequest", "text", "primaryShardKeys", "requestedCharacters", "character", "nextPolicy", "loadedUrl", "trackedUrl", "coverageKind", "sampleText", "resolvedRequests", "resolveIncrementalFontPackageRequests", "blockReason", "hasNovelCharacter", "font", "stack", "fallbackFonts", "fallback", "fontReloads", "textEncoder", "utf8ByteLength", "text", "closestElement", "node", "utf8ByteOffsetFromCodeUnitIndex", "codeUnitIndex", "clampedIndex", "codeUnitIndexFromUtf8ByteOffset", "byteOffset", "target", "currentByteOffset", "currentIndex", "codePoint", "nextIndex", "nextByteOffset", "readBoundaryCodeUnitOffset", "fragment", "container", "offset", "range", "ensureProjectedElement", "layer", "byHandle", "canvasId", "entry", "existing", "created", "FindOnPageProjector", "canvas", "parent", "content", "logicalWidth", "logicalHeight", "width", "height", "documents", "seenHandles", "orderedElements", "element", "handle", "selection", "startElement", "endElement", "startRoot", "endRoot", "startFragment", "endFragment", "fragmentStart", "fragmentEnd", "localStart", "localEnd", "start", "end", "match", "startIndex", "endIndex", "textNode", "OPEN_CANVAS_FIND_BACKGROUND_COLOR", "FindController", "options", "runtimeCanvasId", "FindOnPageProjector", "handleDocumentSelectionChange", "logicalWidth", "logicalHeight", "document", "match", "reveal", "state", "revealActive", "clearOnMissing", "normalizedOptions", "normalizeOpenCanvasFindOptions", "normalizedMatches", "range", "index", "entry", "activeEntry", "DEFAULT_OPEN_CANVAS_FIND_OPTIONS", "textDecoder", "floatWordView", "textRunFitCache", "SEMANTIC_ROLE_DESCRIPTORS", "decodeCheckedState", "checkedState", "decodeOrientation", "orientation", "wordToFloat", "word", "describeRole", "role", "resolveTagName", "node", "descriptor", "decodeLabel", "words", "startWordIndex", "labelLength", "byteOffset", "paddedByteLength", "labelBytes", "parseSemanticBuffer", "recordCount", "index", "nodes", "recordIndex", "handleLow", "handleHigh", "stateFlags", "valueNow", "valueMin", "valueMax", "labelWordCount", "handle", "bounds", "state", "checked", "decodedOrientation", "label", "applyNodeFrame", "element", "ensureTextRun", "existing", "textRun", "ensureTextRunContent", "textContent", "ensureTextNode", "onlyChild", "textNode", "clearTextRun", "applyTextRunLayout", "nodeBounds", "textLayout", "offsetX", "offsetY", "firstChild", "fitKey", "cachedFit", "measuredChild", "scaleX", "scaleY", "translateX", "translateY", "range", "measured", "contentRect", "nextScaleX", "nextScaleY", "localX", "localY", "syncOrderedChildren", "container", "orderedElements", "nextChild", "stale", "boundsContain", "candidate", "ensureProjectedElement", "layer", "byHandle", "tagName", "created", "input", "textarea", "cloneNode", "roleNeedsAriaLabel", "roleUsesTextContent", "describeAnnouncementRole", "buildNodeAnnouncement", "textByHandle", "parts", "LiveAnnouncer", "root", "message", "HiddenDomProjector", "canvas", "parent", "shell", "shadowRoot", "content", "announcer", "logicalWidth", "logicalHeight", "width", "height", "textLayoutsByHandle", "seenHandles", "nextValue", "dialogElement", "heading", "descriptionNodes", "cloneSemanticTree", "OpenCanvasApiAdapter", "options", "cloneSemanticTree", "handle", "bounds", "snapshot", "start", "end", "rect", "query", "results", "findTextInOpenCanvasDocuments", "match", "state", "revealActive", "range", "SEMANTIC_ANNOUNCEMENT_DELAY_MS", "SemanticController", "canvas", "ui", "interactionState", "textDocuments", "HiddenDomProjector", "logicalWidth", "logicalHeight", "parseSemanticBuffer", "extractSemanticBuffer", "node", "focusedHandle", "handle", "cloneSemanticTree", "entry", "targetHandle", "layouts", "visibleTextBounds", "left", "top", "right", "bottom", "INVALID_TEXT_DOCUMENT_LENGTH", "openCanvasTextDecoder", "TextDocumentController", "ui", "handle", "handleArg", "byteLength", "start", "end", "meta", "range", "textAllocation", "toHeapPointer", "textPtr", "textOffset", "copied", "text", "allocation", "xPtr", "yPtr", "widthPtr", "heightPtr", "base", "rectCount", "rectWordsAllocation", "rectWordsPtr", "rectWordsOffset", "copiedCount", "words", "rects", "index", "documents", "snapshot", "handleCount", "handleWordsAllocation", "handleWordsPtr", "handleWordsOffset", "handles", "low", "high", "handleToBigInt", "pointer", "offset", "DEFAULT_LOGICAL_WIDTH", "DEFAULT_LOGICAL_HEIGHT", "UI_EVENT_POINTER_ENTER", "UI_EVENT_POINTER_LEAVE", "createBridgeRuntime", "core", "ui", "canvas", "interactionState", "loaderInfo", "logicalWidth", "logicalHeight", "needsCommit", "appFrameHandler", "frameRequester", "runtime", "fontManager", "IncrementalFontManager", "assetManager", "AssetManager", "textDocuments", "TextDocumentController", "semanticController", "SemanticController", "findController", "FindController", "openCanvasApiAdapter", "OpenCanvasApiAdapter", "syncSemanticAndFindState", "dispatchAppPointerEvent", "eventType", "handle", "x", "y", "modifiers", "isLastPointerStillOverCanvas", "rect", "syncAppPointerHover", "previousHandle", "capturedHandle", "hitHandle", "handleToBigInt", "currentHandle", "updateCanvasSize", "dpr", "size", "readCanvasLogicalSize", "physicalWidth", "physicalHeight", "setActiveRenderer", "normalizeBackendType", "extractCommandBuffer", "words", "executeCommandBuffer", "requester", "handler", "timestampMs", "match", "reveal", "clearOnMissing", "fontId", "url", "policy", "fallbackFontId", "coverageKind", "sampleText", "font", "stack", "svgId", "textureId", "resetBridgeLogs", "refreshCanvas", "canvasSizeSource", "getCanvasSizeSource", "resizeObserver", "DEVICE_LOST_RETRY_DELAYS_MS", "ensureSoftwarePresenter", "presenter", "canvas", "overlay", "parent", "ctx", "presentSoftwareFrame", "core", "ptr", "normalizePointerForWasm", "offset", "pointerToHeapOffset", "byteLength", "src", "installRenderLoop", "runtime", "loaderInfo", "fallbackLadder", "DEFAULT_BACKEND_LADDER", "activeBackend", "normalizeBackendType", "softwarePresenter", "frameScheduled", "disposed", "lastAttemptedBackend", "recoveryAttempts", "recoveryExhausted", "recoveryPromise", "runRecovery", "dpr", "delayMs", "delay", "tryReviveBackend", "setActiveRenderer", "backendLabel", "nextIndex", "i", "fallback", "EdBackendType", "scheduleRecovery", "lostBackend", "error", "message", "scheduleFrame", "frame", "handleWebGlContextLost", "event", "handleVisibilityChange", "now", "deviceState", "normalizeDeviceState", "backendType", "EdDeviceState", "requireCanvas", "id", "element", "createBridgeSession", "options", "canvas", "ensureCanvasLogicalSize", "interactionState", "preparedAssets", "runtimeRef", "core", "ui", "loadCoreModule", "loadUiModule", "runtimeState", "createBridgeRuntime", "runtime", "dpr", "fallbackLadder", "buildBackendLadder", "initRenderer", "loadIcuData", "error", "message", "showIcuError", "createErrorWithCause", "disposeEventHandlers", "installEventHandlers", "disposeRenderLoop", "installRenderLoop", "STARTUP_BRIDGE_FONTS", "font", "getBridgeAssetUrl", "EFFINDOM_RICH_TEXT_CLIPBOARD_MIME", "escapeHtml", "text", "colorToCss", "color", "red", "green", "blue", "alpha", "inferClipboardCssFontFamily", "fontUrl", "partStyleToCss", "part", "styles", "fontFamily", "decorationFlags", "textDecorations", "buildClipboardHtml", "richText", "html", "escapedText", "style", "enrichClipboardPayload", "payload", "resolveFontUrl", "tryWriteClipboardItems", "items", "writeClipboardPayload", "plainText", "richJson", "utf8ByteLengthForCodePoint", "codePoint", "advanceCodeUnitIndex", "text", "index", "retreatCodeUnitIndex", "clampedIndex", "previousIndex", "previousUnit", "leadUnit", "codeUnitIndexToUtf8ByteOffset", "byteOffset", "current", "utf8ByteLength", "HIDDEN_EDITOR_WINDOW_OVERSCAN", "HIDDEN_EDITOR_WINDOW_MIN_LENGTH", "HIDDEN_EDITOR_WINDOW_REUSE_MARGIN", "TEXT_CHANGE_LOG_PREVIEW_LIMIT", "TEXTBOX_HARD_CLAMP_MAX_CODEPOINTS", "isLineBreakCodeUnit", "text", "index", "codeUnit", "collectTextboxHardLineClampRanges", "ranges", "lineCapEnd", "lineEnd", "codePointCount", "next", "advanceCodeUnitIndex", "mapClampedTextIndex", "clampedIndex", "removedBefore", "range", "clampTextboxHardLines", "result", "cursor", "utf8ByteOffsetToCodeUnitIndex", "byteOffset", "textByteLength", "byteLimit", "utf8ByteLength", "target", "currentByteOffset", "currentIndex", "codePoint", "nextByteOffset", "utf8ByteLengthForCodePoint", "computeReplacementEdit", "previousText", "nextText", "sharedPrefixLimit", "prefix", "suffix", "applyUtf8ByteReplacementEdit", "start", "end", "insertedText", "clampedStart", "clampedEnd", "mapPendingBatchCurrentIndexToBaseIndex", "batch", "replacement", "insertedStart", "insertedEnd", "delta", "buildClampedTextboxEdit", "fullPreviousText", "absoluteStart", "absoluteEnd", "absoluteCaret", "replaceStart", "replaceEnd", "intendedFullNextText", "intendedCaret", "clamped", "finalCaret", "codeUnitIndexToUtf8ByteOffset", "summarizeTextChange", "handle", "buildHiddenEditorWindow", "previousWindow", "normalizedStart", "normalizedEnd", "selectionSpan", "targetLength", "previousLength", "clampedPreviousStart", "clampedPreviousEnd", "reuseMargin", "reusableStart", "reusableEnd", "docStart", "docEnd", "currentLength", "remaining", "extendBefore", "extendAfter", "extraBefore", "createHiddenTextEditor", "multiline", "editor", "clearHiddenTextEditor", "MAX_BUFFERED_TYPING_MUTATIONS", "currentInteractionTimeMs", "createEditorMutationController", "options", "hiddenInputIsComposing", "pendingTextMutationFlushFrame", "pendingTextMutationBatch", "pendingPasteInput", "pendingPasteText", "clearPendingTextMutations", "materializePendingTextMutations", "runtime", "batch", "handle", "handleToBigInt", "absoluteCaret", "codeUnitIndexToUtf8ByteOffset", "replacement", "computeReplacementEdit", "absoluteStart", "absoluteEnd", "heapString", "writeUtf8ToHeap", "restorePendingTypingState", "editor", "activeTextHandle", "activeEditorWindow", "flushPendingTextMutationsToRuntime", "schedulePendingTextMutationFlush", "commitReplacementEdit", "previousText", "nextText", "caret", "kind", "replacePendingBatch", "clampedStart", "clampedEnd", "activeHandleKey", "intendedAbsoluteCaret", "fullPreviousText", "pendingReplacement", "pendingAbsoluteStart", "pendingAbsoluteEnd", "utf8ByteLength", "applyUtf8ByteReplacementEdit", "clampedEdit", "buildClampedTextboxEdit", "replacementStartByte", "replacementEndByte", "activeEditor", "commitImeEdit", "text", "commitIfVisualWork", "forward", "selectionStart", "selectionEnd", "rangeStart", "rangeEnd", "nextCaret", "replacementStart", "replacementEnd", "advanceCodeUnitIndex", "retreatCodeUnitIndex", "event", "handleKey", "pasteInput", "pendingBatch", "baseWindowText", "mapPendingBatchCurrentIndexToBaseIndex", "CARET_BLINK_INTERVAL_MS", "currentInteractionTimeMs", "createEditorSession", "runtimeRef", "logs", "textByHandle", "selectionsByHandle", "hiddenInput", "createHiddenTextEditor", "hiddenTextarea", "activeTextHandle", "lastPointerClientX", "lastPointerClientY", "lastPointerX", "lastPointerY", "lastPointerModifiers", "lastInteractivePointerHandle", "capturedPointerHandle", "pointerInsideCanvas", "appSessionVersion", "activeTextEditable", "activeTextMultiline", "activeEditorWindow", "textByteLengthsByHandle", "pendingCaretRevealByHandle", "pendingCaretRevealFrame", "pendingLocalReplacementEcho", "pendingLocalSelectionEcho", "deferredTouchFocusHandle", "caretBlinkTimer", "focusedHandle", "pendingSemanticAnnouncements", "getActiveEditor", "isActiveEditorFocused", "queueSemanticAnnouncement", "handleKey", "clampSelectionToText", "length", "selection", "clearCaretBlinkTimer", "shouldRunCaretBlinkTimer", "text", "textByteLength", "utf8ByteLength", "start", "end", "armCaretBlinkTimer", "updateCaretBlinkTimer", "resetPhase", "syncActiveEditorWindowDebug", "handle", "clearActiveEditorWindow", "clearPendingCaretReveal", "key", "updateActiveEditorWindowText", "detachBridgeTextInput", "getTextboxState", "runtime", "node", "entry", "syncFocusedInputState", "clearHiddenTextEditor", "activeEditor", "startByte", "endByte", "utf8ByteOffsetToCodeUnitIndex", "direction", "normalizedStart", "normalizedEnd", "buildHiddenEditorWindow", "localStart", "localEnd", "mutationController", "createEditorMutationController", "value", "clearPendingTextMutations", "focusHiddenEditorNow", "refocusActiveTextInput", "textboxState", "handleToBigInt", "beginTouchTextFocusDeferral", "cancelTouchTextFocusDeferral", "commitTouchTextFocusDeferral", "scheduleCaretRevealReplay", "clearRecordMap", "record", "resetAppSession", "handleFocusChanged", "isFocused", "handleTextChanged", "summarizeTextChange", "handleRequestSemanticAnnouncement", "handleTextReplaced", "previousText", "previousTextByteLength", "isLocalEcho", "nextText", "applyUtf8ByteReplacementEdit", "handleSelectionChanged", "handleClipboardRead", "handleValue", "requestSessionVersion", "currentText", "currentTextByteLength", "rangeStart", "rangeEnd", "clampedEdit", "buildClampedTextboxEdit", "replacementStartByte", "codeUnitIndexToUtf8ByteOffset", "replacementEndByte", "heapString", "writeUtf8ToHeap", "handles", "x", "y", "modifiers", "flag", "createBridgeLogs", "installCallbacks", "runtimeRef", "logs", "createBridgeLogs", "editorSession", "createEditorSession", "callbacks", "handle", "eventType", "x", "y", "modifiers", "entry", "handleToString", "offsetX", "offsetY", "contentWidth", "contentHeight", "viewportWidth", "viewportHeight", "areaHandle", "text", "payload", "runtime", "enrichedPayload", "enrichClipboardPayload", "fontId", "writeClipboardPayload", "url", "error", "message", "coverageKind", "sampleText", "currentRuntime", "currentSession", "bridgeReadyPromise", "sessionChain", "runtimeRef", "interactionState", "installCallbacks", "preparedAssetsPromise", "prepareRuntimeAssets", "bootRuntimeSession", "preparedAssets", "session", "createBridgeSession", "queueRuntimeBoot", "error", "message", "bridgeState", "handleToBigInt", "handleToString", "pointerToHeapOffset", "normalizePointerForWasm", "toHeapPointer"]
7
7
  }