import type { ExtensionWidgetOptions } from "./types.ts"; import type { WidgetScrollRequest, WidgetScrollState } from "./ui-types.js"; export interface ReactiveWidgetComponent { render(width: number): string[]; getScrollRequest?(): WidgetScrollRequest | undefined; onScroll?(state: WidgetScrollState): void; invalidate?(): void; dispose?(): void; } export type ReactiveWidgetFactory = (tui: unknown, theme: TTheme) => ReactiveWidgetComponent; export interface ReactiveWidgetUi { setWidget(key: string, factory: ReactiveWidgetFactory | undefined, options?: ExtensionWidgetOptions): void; requestRender?: () => void; onWidgetRelease?: (key: string, listener: () => void) => () => void; } export interface ReactiveWidgetTimerHandle { unref?: () => void; } export interface ReactiveWidgetTimerApi { setTimeout(handler: () => void, delayMs: number): ReactiveWidgetTimerHandle; clearTimeout(handle: ReactiveWidgetTimerHandle): void; } export interface ReactiveWidgetScheduler { queueMicrotask(handler: () => void): void; } export type ReactiveWidgetAction = "mount" | "unmount" | "update" | "none"; export type ReactiveWidgetRefreshReason = "initial" | "state" | "clock" | "manual"; export interface ReactiveWidgetRenderState { readonly mounted: boolean; readonly lines: readonly string[]; } export interface ReactiveWidgetRenderContext { theme: TTheme; width: number; now: number; } export interface ReactiveWidgetController { refresh(reason?: ReactiveWidgetRefreshReason): void; dispose(): void; isMounted(): boolean; } export interface ReactiveWidgetMountError { readonly cause: Error; readonly message: string; } export interface InstallReactiveWidgetOptions { ui: ReactiveWidgetUi; key: string; placement?: ExtensionWidgetOptions["placement"]; scroll?: ExtensionWidgetOptions["scroll"]; getScrollRequest?(): WidgetScrollRequest | undefined; onScroll?(state: WidgetScrollState): void; getSnapshot(): TSnapshot; subscribe?(listener: () => void): () => void; getPreviewLines(snapshot: TSnapshot, now: number): readonly string[]; render(snapshot: TSnapshot, context: ReactiveWidgetRenderContext): readonly string[]; getNextRefreshDelayMs?(snapshot: TSnapshot, now: number): number | undefined; now?: () => number; timers?: ReactiveWidgetTimerApi; scheduler?: ReactiveWidgetScheduler; coalesceRenderRequests?: boolean; requestRenderOnMount?: boolean; requestRenderOnUnmount?: boolean; requestRenderOnStateNoop?: boolean; isStaleError?: (error: unknown) => boolean; onMountError?: (error: ReactiveWidgetMountError) => void; } export declare function decideReactiveWidgetAction(prev: ReactiveWidgetRenderState, nextLines: readonly string[]): ReactiveWidgetAction; export declare function installReactiveWidget(options: InstallReactiveWidgetOptions): ReactiveWidgetController; //# sourceMappingURL=reactive-widget.d.ts.map