import { type DefinedTypedEvent, type DefineEvent, type TypedEvent } from '../../typed-event/typed-event.js';
import { type CustomElementTagName } from '../custom-tag-name.js';
/**
 * Base type for defining element events inside of an element definition.
 *
 * @category Internal
 */
export type EventsInitMap = Record<string, DefineEvent<any>>;
/**
 * Used to define element events, with a type.
 *
 * @category Element Definition
 * @example
 *
 * ```ts
 * import {html, defineElement, defineElementEvent, listen} from 'element-vir';
 *
 * const MyElement = defineElement()({
 *     tagName: 'my-element',
 *     events: {
 *         myOutput: defineElementEvent<number>(),
 *     },
 *     render({events, dispatch}) {
 *         return html`
 *             <div
 *                 ${listen('click', () => {
 *                     dispatch(new events.myOutput(1));
 *                 })}
 *             >
 *                 Some div
 *             </div>
 *         `;
 *     },
 * });
 * ```
 */
export declare function defineElementEvent<EventDetailGeneric>(): DefineEvent<EventDetailGeneric>;
/**
 * Extracts the detail type of the given event name from the given event init map.
 *
 * @category Internal
 */
export type EventInitMapEventDetailExtractor<EventTypeNameGeneric extends keyof EventsInitGeneric, EventsInitGeneric extends EventsInitMap> = EventsInitGeneric[EventTypeNameGeneric] extends DefineEvent<infer Detail> ? Detail : never;
/**
 * Maps the given element tag name and map of event names to their run-time event type strings.
 *
 * @category Internal
 */
export type EventDescriptorMap<TagName extends CustomElementTagName, EventsInitGeneric extends EventsInitMap> = {
    [CurrentEventTypeName in keyof EventsInitGeneric]: DefinedTypedEvent<CurrentEventTypeName extends string ? `${TagName}-${CurrentEventTypeName}` : never, EventInitMapEventDetailExtractor<CurrentEventTypeName, EventsInitGeneric>>;
};
/**
 * Extract the event detail type from a {@link TypedEvent}, {@link DefinedTypedEvent}, or
 * `CustomEvent.
 *
 * @category Internal
 */
export type EventDetail<ElementEvent extends TypedEvent<any, any> | DefinedTypedEvent<any, any> | CustomEvent> = ElementEvent extends TypedEvent<string, infer Detail> ? Detail : ElementEvent extends DefinedTypedEvent<any, infer Detail> ? Detail : ElementEvent extends CustomEvent<infer Detail> ? Detail : 'TYPE ERROR: failed to extract event detail type';
/**
 * Maps an element definition initialization's tag name and event map to a map of ready-to-construct
 * event classes. This also verifies that the input event init map has valid keys.
 *
 * @category Internal
 */
export declare function createEventDescriptorMap<TagName extends CustomElementTagName, EventsInitGeneric extends EventsInitMap>(tagName: CustomElementTagName, eventsInit: EventsInitGeneric | undefined): EventDescriptorMap<TagName, EventsInitGeneric>;
