/* Bulmil custom elements bundle */

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * 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 interface SetPlatformOptions {
  raf?: (c: FrameRequestCallback) => number;
  ael?: (el: EventTarget, eventName: string, listener: EventListenerOrEventListenerObject, options: boolean | AddEventListenerOptions) => void;
  rel?: (el: EventTarget, eventName: string, listener: EventListenerOrEventListenerObject, options: boolean | AddEventListenerOptions) => void;
  ce?: (eventName: string, opts?: any) => CustomEvent;
}
export declare const setPlatformOptions: (opts: SetPlatformOptions) => void;

export type { Components, JSX };

export * from '../types';
