declare namespace BDV {
  interface PluginDefinition {
    name: string;
    isViewer?: boolean;
    /** Plugin settings */
    settings?: any;
    /** See: https://developers.bimdata.io/viewer/reference/plugin.html#i18n */
    i18n?: any;
    i18nTokenPrefix?: string;
    addToWindows?: string[];

    /** Vue 3 component */
    component?: Object;

    /** See: https://developers.bimdata.io/viewer/reference/plugin.html#startupscript */
    startupScript?: ($viewer: any) => void;

    /** Window plugin definition (see: https://developers.bimdata.io/viewer/reference/window.html#window-api) */
    window?: Window;

    /** Button plugin definition (see: https://developers.bimdata.io/viewer/reference/plugin.html#plugin-as-button) */
    button?: {
      position: string;
      content: string;
      icon?: { imgUri: string; };
      iconOpen?: { imgUri: string; };
      tooltip?: string;
      keepOpen?: boolean;
    };
  }

  interface PluginInstance extends PluginDefinition {
    /** Vue component instance */
    componentInstance: Object | null;

    shown: boolean;
    show(): void;
    hide(): void;

    // Button plugin instance
    loading: boolean;
    buttonText: string;
    isOpen: boolean;
    open(options?: any): Promise<void>;
    close(options?: any): Promise<void>;
  }
}
