export interface PropConfig {
    /** Canonical defineProps name, e.g. "color", "fill" */
    name: string;
    /**
     * The TS type EXPRESSION for this prop:
     * primitive keyword (`string`/`boolean`) used inline; otherwise a union body
     * literal from which the generator emits `export type <Component><Prop> = <this>`.
     */
    tsType: string;
    /** Optional JSDoc line for the generated prop */
    jsdoc?: string;
    /** INFRA-F59 appearance-axis tag: 'fill'|'kind'|'color'|'state'|'size'. When set,
     *  audit-prop-naming asserts `name` === prop-naming-conventions.json conventions[axis]. */
    axis?: 'fill' | 'kind' | 'color' | 'state' | 'size';
}
export interface VModelConfig {
    /** React controlled-value prop name, e.g. "value" */
    reactValueProp: string;
    /** React change-handler prop name, e.g. "onChange" */
    reactChangeProp: string;
    /** Custom-element DOM property name for the bound value, e.g. "modelValue" */
    elementProperty: string;
    /** Vue emit event name, e.g. "update:modelValue" */
    updateEvent: string;
    /** CustomEvent.detail index holding the new value, e.g. 0 */
    detailIndex: number;
    /** TypeScript value type string, e.g. "string" */
    valueType: string;
}
export interface EventConfig {
    /** React handler prop name, e.g. "onClick" */
    reactHandlerProp: string;
    /** Native/custom DOM event name to listen to, e.g. "click" */
    domEvent: string;
    /** TypeScript handler signature string, e.g. "(e: Event) => void" */
    handlerType: string;
    /**
     * CustomEvent.detail index holding the emitted value, e.g. 0.
     * present → Vue custom emit: unwrap CustomEvent.detail[detailIndex] and call the
     *           handler with that value (handlerType is e.g. `(value: number) => void`);
     * absent  → native DOM event: pass the Event object directly to the handler
     *           (handlerType is e.g. `(e: Event) => void`).
     */
    detailIndex?: number;
}
export interface ComponentConfig {
    /** React export name, e.g. "Button" */
    name: string;
    /** Custom element tag, e.g. "tvu-button" */
    tag: string;
    /** SFC import name used in the generated Vue binding, e.g. "ButtonBridge" */
    canonicalImport: string;
    /** Relative path from the generated file to the canonical SFC, e.g. "../canonical/ButtonBridge.vue" */
    canonicalPath: string;
    /** Figma Code Connect manifest filter key, e.g. "Button" */
    figmaCodeComponent: string;
    /** Simple value props set via element property (excludes v-model prop) */
    props: PropConfig[];
    /** Native/custom events mapped to React handler props */
    events: EventConfig[];
    /** v-model binding config, or null if the component has no v-model */
    vModel: VModelConfig | null;
    /** Whether the component accepts React children via its default slot */
    hasDefaultSlot: boolean;
    /** Named slots other than the default slot, e.g. ["label"] */
    namedSlots: string[];
    /**
     * Custom-element shadow-DOM mode (Vue 3.5 `defineCustomElement` option).
     * Omitted or `true` → default shadow DOM (styles encapsulated in the shadow root).
     * `false` → LIGHT DOM: the SFC's styles are injected into the document head, so
     *   (a) content teleported out of the element via `<Teleport to="body">` is still
     *       styled (scoped CSS no longer trapped in the shadow root), and
     *   (b) document-level ancestor selectors like `[data-theme='light']` match.
     * Required for overlay/teleport components (PopupBox, DropDownListSelect).
     */
    shadowRoot?: boolean;
    /**
     * For shadowRoot:false components whose `<style>` lives in a base/child SFC (not the
     * canonical wrapper itself), list those extra style-source modules. Their compiled
     * `styles` are ALSO injected into the document head. Vue 3.5 injects NO styles in
     * light-DOM mode (it warns instead — see runtime-dom `_applyStyles` guard), so the
     * generated register.ts injects them manually via `injectLightDomStyles`. A missing
     * source surfaces as A_TRUE_DRIFT in the render gate (unstyled teleported content).
     * Only meaningful when `shadowRoot === false`.
     */
    lightDomStyleSources?: {
        importName: string;
        path: string;
    }[];
}
export declare const COMPONENT_CONFIGS: ComponentConfig[];
