import { type Element as GlassEaselElement } from '../element' import { type EventBubbleStatus, type EventOptions } from '../event' import { type Node as GlassEaselNode } from '../node' import { type BoundingClientRect, type GetAllComputedStylesResponses, type GetInheritedRulesResponses, type GetMatchedRulesResponses, type IntersectionStatus, type MediaQueryStatus, type Observer, type ResizeObserverMode, type ResizeStatus, type ScrollOffset, } from './shared' interface GetWrapper { get(): T } export type Element = { getAllComputedStyles(cb: (res: GetAllComputedStylesResponses) => void): void getPseudoComputedStyles( pseudoType: string, cb: (res: GetAllComputedStylesResponses) => void, ): void getBoundingClientRect(cb: (res: BoundingClientRect) => void): void getBoxModel( cb: ( res: { margin: BoundingClientRect border: BoundingClientRect padding: BoundingClientRect content: BoundingClientRect } | null, ) => void, ): void createIntersectionObserver( relativeElement: E | null, relativeElementMargin: string, thresholds: number[], listener: (res: IntersectionStatus) => void, ): Observer createResizeObserver(mode: ResizeObserverMode, listener: (res: ResizeStatus) => void): Observer getMatchedRules(cb: (res: GetMatchedRulesResponses) => void): void getPseudoMatchedRules(pseudoType: string, cb: (res: GetMatchedRulesResponses) => void): void getInheritedRules(cb: (res: GetInheritedRulesResponses) => void): void getScrollOffset(cb: (res: ScrollOffset) => void): void setScrollPosition(scrollLeft: number, scrollTop: number, duration: number): void getContext(cb: (res: unknown) => void): void getPseudoTypes(cb: (res: string[]) => void): void triggerNativeEvent(type: string, detail: unknown): void manipulateNativeNode(action: string, args: unknown, cb: (res: unknown) => void): void } export type ElementForDomLike = { getBoundingClientRect(): BoundingClientRect readonly scrollLeft: number readonly scrollTop: number readonly scrollWidth: number readonly scrollHeight: number } export interface Context { dropBackendAfterRelease?: boolean createContext( options: unknown, cb: (ContextWrapper: GetWrapper & Ctx>>) => void, ): void addPriorEventListener( listener: ( target: GlassEaselElement, type: string, detail: unknown, options: EventOptions, ) => EventBubbleStatus | void, ): void removePriorEventListener( listener: ( target: GlassEaselElement, type: string, detail: unknown, options: EventOptions, ) => EventBubbleStatus | void, ): void setFocusedNode(target: Elem): void getFocusedNode(cb: (node: GlassEaselNode | null) => void): void onWindowResize( cb: (res: { width: number; height: number; devicePixelRatio: number }) => void, ): void onThemeChange(cb: (res: { theme: string }) => void): void elementFromPoint(left: number, top: number, cb: (node: GlassEaselElement | null) => void): void createMediaQueryObserver( status: MediaQueryStatus, listener: (res: { matches: boolean }) => void, ): Observer // StyleSheet related addStyleSheetRule( mediaQueryStr: string, selector: string, callback: (ruleIndex: number | null) => void, ): void getStyleSheetIndexForNewRules(callback: (sheetIndex: number) => void): void resetStyleSheetRule( sheetIndex: number, ruleIndex: number, callback: (ruleIndex: number | null) => void, ): void modifyStyleSheetRuleSelector( sheetIndex: number, ruleIndex: number, selector: string, callback: (ruleIndex: number | null) => void, ): void addStyleSheetProperty( sheetIndex: number, ruleIndex: number, inlineStyle: string, callback: (propertyIndex: number | null) => void, ): void replaceStyleSheetAllProperties( sheetIndex: number, ruleIndex: number, inlineStyle: string, callback: (propertyIndex: number | null) => void, ): void setStyleSheetPropertyDisabled( sheetIndex: number, ruleIndex: number, propertyIndex: number, disabled: boolean, callback: (propertyIndex: number | null) => void, ): void removeStyleSheetProperty( sheetIndex: number, ruleIndex: number, propertyIndex: number, callback: (propertyIndex: number | null) => void, ): void replaceStyleSheetProperty( sheetIndex: number, ruleIndex: number, propertyIndex: number, inlineStyle: string, callback: (propertyIndex: number | null) => void, ): void performanceTraceStart(): number performanceTraceEnd( id: number, cb: (stats: { startTimestamp: number; endTimestamp: number }) => void, ): void startOverlayInspect(cb: (event: string, node: GlassEaselElement | null) => void): void stopOverlayInspect(): void getActiveElement(cb: (node: GlassEaselElement | null) => void): void } type UnshiftTarget = Fn extends (...args: infer Args) => infer Ret ? (target: T, ...args: Args) => Ret : never type UnshiftTargets = { [K in keyof T]: UnshiftTarget } export type ContextForDomLike = Context & UnshiftTargets, 'getBoundingClientRect' | 'getScrollOffset'>, Elem>