/* InterbankComponents custom elements bundle */

import { Components, JSX } from "../types/components";

interface IbkBadge extends Components.IbkBadge, HTMLElement {}
export const IbkBadge: {
  prototype: IbkBadge;
  new (): IbkBadge;
};

interface IbkBreadcrumb extends Components.IbkBreadcrumb, HTMLElement {}
export const IbkBreadcrumb: {
  prototype: IbkBreadcrumb;
  new (): IbkBreadcrumb;
};

interface IbkBreadcrumbItem extends Components.IbkBreadcrumbItem, HTMLElement {}
export const IbkBreadcrumbItem: {
  prototype: IbkBreadcrumbItem;
  new (): IbkBreadcrumbItem;
};

interface IbkButton extends Components.IbkButton, HTMLElement {}
export const IbkButton: {
  prototype: IbkButton;
  new (): IbkButton;
};

interface IbkButtonInline extends Components.IbkButtonInline, HTMLElement {}
export const IbkButtonInline: {
  prototype: IbkButtonInline;
  new (): IbkButtonInline;
};

interface IbkCalendar extends Components.IbkCalendar, HTMLElement {}
export const IbkCalendar: {
  prototype: IbkCalendar;
  new (): IbkCalendar;
};

interface IbkCheckbox extends Components.IbkCheckbox, HTMLElement {}
export const IbkCheckbox: {
  prototype: IbkCheckbox;
  new (): IbkCheckbox;
};

interface IbkCheckboxGroup extends Components.IbkCheckboxGroup, HTMLElement {}
export const IbkCheckboxGroup: {
  prototype: IbkCheckboxGroup;
  new (): IbkCheckboxGroup;
};

interface IbkDrawer extends Components.IbkDrawer, HTMLElement {}
export const IbkDrawer: {
  prototype: IbkDrawer;
  new (): IbkDrawer;
};

interface IbkDropdown extends Components.IbkDropdown, HTMLElement {}
export const IbkDropdown: {
  prototype: IbkDropdown;
  new (): IbkDropdown;
};

interface IbkDropdownItem extends Components.IbkDropdownItem, HTMLElement {}
export const IbkDropdownItem: {
  prototype: IbkDropdownItem;
  new (): IbkDropdownItem;
};

interface IbkForm extends Components.IbkForm, HTMLElement {}
export const IbkForm: {
  prototype: IbkForm;
  new (): IbkForm;
};

interface IbkFormGroup extends Components.IbkFormGroup, HTMLElement {}
export const IbkFormGroup: {
  prototype: IbkFormGroup;
  new (): IbkFormGroup;
};

interface IbkModal extends Components.IbkModal, HTMLElement {}
export const IbkModal: {
  prototype: IbkModal;
  new (): IbkModal;
};

interface IbkNotification extends Components.IbkNotification, HTMLElement {}
export const IbkNotification: {
  prototype: IbkNotification;
  new (): IbkNotification;
};

interface IbkNumberPicker extends Components.IbkNumberPicker, HTMLElement {}
export const IbkNumberPicker: {
  prototype: IbkNumberPicker;
  new (): IbkNumberPicker;
};

interface IbkRadio extends Components.IbkRadio, HTMLElement {}
export const IbkRadio: {
  prototype: IbkRadio;
  new (): IbkRadio;
};

interface IbkRadioGroup extends Components.IbkRadioGroup, HTMLElement {}
export const IbkRadioGroup: {
  prototype: IbkRadioGroup;
  new (): IbkRadioGroup;
};

interface IbkSearchResult extends Components.IbkSearchResult, HTMLElement {}
export const IbkSearchResult: {
  prototype: IbkSearchResult;
  new (): IbkSearchResult;
};

interface IbkSearchbar extends Components.IbkSearchbar, HTMLElement {}
export const IbkSearchbar: {
  prototype: IbkSearchbar;
  new (): IbkSearchbar;
};

interface IbkTable extends Components.IbkTable, HTMLElement {}
export const IbkTable: {
  prototype: IbkTable;
  new (): IbkTable;
};

interface IbkTag extends Components.IbkTag, HTMLElement {}
export const IbkTag: {
  prototype: IbkTag;
  new (): IbkTag;
};

interface IbkTextfield extends Components.IbkTextfield, HTMLElement {}
export const IbkTextfield: {
  prototype: IbkTextfield;
  new (): IbkTextfield;
};

interface IbkTooltip extends Components.IbkTooltip, HTMLElement {}
export const IbkTooltip: {
  prototype: IbkTooltip;
  new (): IbkTooltip;
};

/**
 * Utility to define all custom elements within this package using the tag name provided in the component's source. 
 * When defining each custom element, it will also check it's safe to define by:
 *
 * 1. Ensuring the "customElements" registry is available in the global context (window).
 * 2. The component tag name is not already defined.
 *
 * Use the standard [customElements.define()](https://developer.mozilla.org/en-US/docs/Web/API/CustomElementRegistry/define) 
 * method instead to define custom elements individually, or to provide a different tag name.
 */
export declare const defineCustomElements: (opts?: any) => void;

/**
 * Used to manually set the base path where assets can be found.
 * If the script is used as "module", it's recommended to use "import.meta.url",
 * such as "setAssetPath(import.meta.url)". Other options include
 * "setAssetPath(document.currentScript.src)", or using a bundler's replace plugin to
 * dynamically set the path at build time, such as "setAssetPath(process.env.ASSET_PATH)".
 * But do note that this configuration depends on how your script is bundled, or lack of
 * bunding, and where your assets can be loaded from. Additionally custom bundling
 * will have to ensure the static assets are copied to its build directory.
 */
export declare const setAssetPath: (path: string) => void;

export { Components, JSX };

export * from '../types';
