import { type NonEmptyString } from '../util/type.js';
/**
 * A custom event with strict types for details and the event's `type` property.
 *
 * @category Internal
 */
export declare class TypedEvent<EventTypeNameGeneric extends string = '', EventDetailGeneric = undefined> extends CustomEvent<EventDetailGeneric> {
    readonly _type: EventTypeNameGeneric;
    get type(): EventTypeNameGeneric;
    constructor(type: EventTypeNameGeneric | {
        type: EventTypeNameGeneric;
    }, value: EventDetailGeneric);
}
/**
 * A function that defines a typed event, used for defining element events in an element's
 * definition.
 *
 * @category Internal
 */
export type DefineEvent<EventDetailGeneric> = <EventTypeNameGeneric extends string>(eventType: NonEmptyString<EventTypeNameGeneric>) => DefinedTypedEvent<EventTypeNameGeneric, EventDetailGeneric>;
/**
 * A concrete typed event definition.
 *
 * @category Internal
 */
export type DefinedTypedEvent<EventTypeNameGeneric extends string, EventDetailGeneric> = (new (eventValue: EventDetailGeneric) => TypedEvent<EventTypeNameGeneric, EventDetailGeneric>) & {
    type: EventTypeNameGeneric;
};
/**
 * Define a stand-alone typed event that can be emitted and listened to inside of HTML templates.
 *
 * Make sure to use currying and call this function twice! (This is required by TypeScript's type
 * parameter inference system.)
 *
 * @category Element Definition
 * @example
 *
 * ```ts
 * import {defineTypedEvent} from 'element-vir';
 *
 * const myCustomEvent = defineTypedEvent<number>()('my-custom-event');
 *
 * const myCustomEvent2 = defineTypedEvent<// the event's `.detail` type
 * number>()(
 *     // the event's `.type` string
 *     'my-custom-event2',
 * );
 * ```
 */
export declare function defineTypedEvent<EventDetailGeneric>(): <
/**
 * EventTypeNameGeneric is used for the event type property but not for the event value
 * type... so it's named "name" instead of "type" cause type is overloaded here.
 */
EventTypeNameGeneric extends string>(eventType: NonEmptyString<EventTypeNameGeneric>) => DefinedTypedEvent<EventTypeNameGeneric, EventDetailGeneric>;
