import type { TerminalRenderPlane } from "../../core/render-plane.js"; import type { Terminal } from "../../core/types.js"; import type { RendererCapabilities } from "../capabilities.js"; import type { ThemePalette } from "../../core/ansi-palette.js"; export type CellMetrics = Readonly<{ cellWidth: number; cellHeight: number; }>; export type DomRendererAccessibilityRole = "application" | "region" | "textbox"; export type DomRendererAccessibilityOptions = Readonly<{ role?: DomRendererAccessibilityRole; label?: string; labelledBy?: string; describedBy?: string; live?: "off" | "polite" | "assertive"; multiline?: boolean; readonly?: boolean; }>; export type DomRendererSyncFlushDecision = Readonly<{ performed: boolean; deferredReason?: "budget"; rows: number; planes: number; cells: number; maxRows: number; maxCells: number; }>; export type DomRendererSyncFlushStats = Readonly<{ requested: number; performed: number; deferred: number; last: DomRendererSyncFlushDecision | null; }>; export type DomRendererFlushSample = Readonly<{ mode: "sync" | "deferred"; startedAt: number; durationMs: number; planeRows: number; planes: number; }>; export type DomRendererFlushStats = Readonly<{ count: number; last: DomRendererFlushSample | null; }>; export type DomRendererRowRenderStats = Readonly<{ rows: number; cacheHits: number; rowKeyPrepassChecks: number; rowKeyPrepassHits: number; rowKeyPrepassMisses: number; transparentBlankRows: number; plainTextRows: number; singleStyledRows: number; segmentReuseRows: number; fragmentRows: number; spansCreated: number; spansReused: number; textNodeUpdates: number; replaceChildren: number; }>; export type DomRendererRowRenderDebugStats = Readonly<{ total: DomRendererRowRenderStats; lastFlush: DomRendererRowRenderStats | null; }>; export type DomRendererRowKeyPrepassMode = boolean | "auto"; export type DomRendererLinkConfig = Readonly<{ allowRelative?: boolean; externalTarget?: "_blank" | "_self"; /** * Defaults to -1 so terminal links do not enter the browser tab order. * Set to 0 when the host explicitly wants native anchor keyboard focus. */ tabIndex?: number; /** `none` disables native anchor rendering for Style.href segments. */ activation?: "native" | "event" | "none"; onActivate?: (href: string, event: MouseEvent) => boolean | void; }>; export type DomRendererLinkOptions = boolean | DomRendererLinkConfig; export type DomRendererRowKeyPrepassDecision = "forced-enabled" | "forced-disabled" | "sampling" | "enabled" | "disabled"; export type DomRendererRowKeyPrepassDebugStats = Readonly<{ mode: DomRendererRowKeyPrepassMode; decision: DomRendererRowKeyPrepassDecision; sampleRows: number; sampleHits: number; sampleMisses: number; sampleHitRatio: number | null; lastSampleRows: number; lastSampleHitRatio: number | null; }>; export type DomRendererDebugStats = Readonly<{ syncFlush: DomRendererSyncFlushStats; flush: DomRendererFlushStats; rowRender: DomRendererRowRenderDebugStats; rowKeyPrepass: DomRendererRowKeyPrepassDebugStats; }>; export interface DomRenderer { readonly container: HTMLElement; readonly capabilities: RendererCapabilities; readonly debugStats: DomRendererDebugStats; readonly metrics: CellMetrics; dispose: () => void; refresh: () => void; updateTheme: (next: Readonly<{ palette?: ThemePalette | null; }>) => void; updateOptions: (next: Readonly<{ links?: DomRendererLinkOptions; onLinkClick?: DomRendererOptions["onLinkClick"]; }>) => void; setPlaneOffset: (plane: TerminalRenderPlane, offsetPx: number) => void; setPlaneViewport: (plane: TerminalRenderPlane, viewport: Readonly<{ topPx: number; heightPx: number; }> | null) => void; } export interface DomRendererOptions { /** * Init-only. Changing this after renderer creation requires recreating the renderer. * Browser accessibility contract for the renderer container. * Pass false when the host owns the accessible wrapper. */ accessibility?: false | DomRendererAccessibilityOptions; /** * Init-only. Changing this after renderer creation requires recreating the renderer. * Maximum dirty row count allowed for same-call DOM flush when commit({ sync: true }). * Larger updates are rAF-batched to avoid blocking the main thread. */ syncFlushMaxRows?: number; /** * Init-only. Changing this after renderer creation requires recreating the renderer. * Maximum estimated cell work for sync DOM flush: dirtyRows * cols * activePlanes. */ syncFlushCellBudget?: number; /** * Init-only because renderer capabilities are frozen at creation time. * Enables DOM line-node shifting for terminal scrollOperations. */ enableScrollOperations?: boolean; /** * Runtime-updatable. * Controls DOM anchor rendering for Style.href segments. */ links?: DomRendererLinkOptions; /** Runtime-updatable. */ onLinkClick?: (event: MouseEvent, href: string) => boolean | void; /** Runtime-updatable ANSI-name palette exposed as DOM CSS variables. */ palette?: ThemePalette | null; /** * Init-only. Changing this after renderer creation requires recreating the renderer. * Controls a key-only early bailout before row segment allocation. * The normal row cache remains enabled regardless of this option. * Defaults to "auto": sample cached-row hit ratio and keep prepass enabled only * when it pays for itself. */ enableRowKeyPrepass?: DomRendererRowKeyPrepassMode; } export declare function createDomRenderer(terminal: Terminal, container: HTMLElement, options?: DomRendererOptions): DomRenderer;