/**
* JQHTML v2 Component Registry
*
* Global registry for component classes and templates
* Enables dynamic component instantiation and template association
*/
import { Jqhtml_Component } from './component.js';
import { Jqhtml_Markup } from './markup.js';
export type TemplateFunction = (this: Jqhtml_Component, data: Record, args: Record, content: any, jqhtml?: any) => Jqhtml_Markup | {
_slots: Record Jqhtml_Markup>;
};
export interface TemplateDefinition {
name: string;
tag: string;
defaultAttributes?: Record;
extends?: string;
render: TemplateFunction;
}
export type ComponentConstructor = new (args: Record, element?: any) => Jqhtml_Component;
/**
* Register a component class with optional template
*/
export declare function register_component(name: string, component_class: ComponentConstructor, template?: TemplateDefinition): void;
export declare function register_component(component_class: ComponentConstructor): void;
/**
* Get a component class by name
* If no class found, walks the template extends chain to find parent class
*/
export declare function get_component_class(name: string): ComponentConstructor | undefined;
/**
* Register a template - name is extracted from template.name property
* Returns true if registered, false if duplicate
*/
export declare function register_template(template_def: TemplateDefinition): boolean;
/**
* Get template for a component by name
*/
export declare function get_template(name: string): TemplateDefinition;
/**
* Check a template's `extends=""` against its component's JS class (CLAUDE.md "Template
* Inheritance"). Returns an error message on conflict, null otherwise.
*
* The rule: list the class's JS ancestors up to Jqhtml_Component that have a template of
* their own. An empty list (the class extends Jqhtml_Component directly, or only plain
* helper classes sit in between) cannot conflict. Otherwise `extends=` must name one of
* them - any ancestor, so a template may skip an intermediate layer. A template-only
* component (no class registered under the template's name) and an `extends=` target
* that has no template (resolution falls back to the prototype chain) are not conflicts.
*
* @param template_def The template being rendered
* @param instance_class The rendering instance's class, used when no class is registered
* under the template's name but the instance's class carries that name
*/
export declare function extends_conflict(template_def: TemplateDefinition, instance_class?: any): string | null;
/**
* Get template for a component class - walks up inheritance chain
*/
export declare function get_template_by_class(component_class: ComponentConstructor): TemplateDefinition;
/**
* Create a component instance by name
* If no component class is registered, uses the default Component class
*/
export declare function create_component(name: string, element?: any, args?: Record): Jqhtml_Component;
/**
* Check if a component is registered
*/
export declare function has_component(name: string): boolean;
/**
* Get all registered component names
*/
export declare function get_component_names(): string[];
/**
* Get all registered template names
*/
export declare function get_registered_templates(): string[];
/**
* List all registered components with their template status
*/
export declare function list_components(): Record;
/**
* Unified registration function - auto-detects source type and delegates
*
* Accepts either:
* - A compiled JQHTML template (has __jqhtml_template: true)
* - A component class extending Jqhtml_Component (has static __jqhtml_component: true and static component_name)
*
* @param source - Compiled template or component class
*/
export declare function register(source: TemplateDefinition | ComponentConstructor): void;
//# sourceMappingURL=component-registry.d.ts.map