export interface RouteRequestedEvent { readonly name: "route.requested"; readonly page: string; readonly path?: string; } export interface RouteChangedEvent { readonly name: "route.changed"; readonly page: string; } export interface OverlayRequestedEvent { readonly content: Element; readonly name: "overlay.requested"; readonly title: string; } export interface OverlayDismissedEvent { readonly name: "overlay.dismissed"; } export interface TabSelectedEvent { readonly name: "tab.selected"; readonly page: string; readonly tab: string; } export interface NodeRequestedEvent { readonly id: string; readonly line: number | null; readonly name: "node.requested"; } export type AppEvent = | NodeRequestedEvent | OverlayDismissedEvent | OverlayRequestedEvent | RouteChangedEvent | RouteRequestedEvent | TabSelectedEvent; export type EventName = AppEvent["name"]; export type EventOf = Extract; export type EventListener = (event: T) => void;