import { Signal, TemplateRef, Type } from '@angular/core';
import { Observable } from 'rxjs';
/**
 * Nombres de templates de skeleton disponibles.
 */
export type SkeletonTemplateName = 'list' | 'list-avatar' | 'grid' | 'grid-cards' | 'form' | 'form-compact' | 'profile' | 'profile-full' | 'detail' | 'table';
/**
 * Configuracion para un skeleton template.
 */
export interface SkeletonTemplateConfig {
    /** Numero de items skeleton a mostrar */
    count?: number;
    /** Variante del layout */
    variant?: string;
    /** Gap entre items (valor CSS) */
    gap?: string;
    /** Ancho personalizado */
    width?: string;
    /** Animacion habilitada */
    animated?: boolean;
    /** Clases CSS adicionales */
    cssClass?: string;
    /** Numero de columnas (para grid/table) */
    columns?: number;
    /** Numero de filas (para table) */
    rows?: number;
    /** Numero de secciones (para detail) */
    sections?: number;
}
/**
 * Fuente de estado de carga - puede ser Signal, Observable o Promise.
 */
export type LoadingSource<T = boolean> = Signal<T> | Observable<T> | Promise<T> | boolean;
/**
 * Configuracion para la directiva valSkeleton.
 */
export interface SkeletonDirectiveConfig {
    /** Mostrar skeleton cuando esto sea truthy */
    when: LoadingSource;
    /** Nombre del template o componente a usar */
    template?: SkeletonTemplateName | string;
    /** Configuracion del template */
    config?: SkeletonTemplateConfig;
    /** Delay antes de mostrar skeleton (ms) - previene flash */
    delay?: number;
    /** Tiempo minimo de visualizacion (ms) - previene parpadeo */
    minTime?: number;
}
/**
 * Configuracion para la directiva valLoading.
 */
export interface LoadingDirectiveConfig {
    /** Fuente de estado de carga */
    loading: LoadingSource;
    /** Template de skeleton a mostrar durante carga */
    skeleton?: SkeletonTemplateName | string;
    /** Configuracion del skeleton */
    skeletonConfig?: SkeletonTemplateConfig;
    /** Template ref personalizado para skeleton */
    skeletonTemplate?: TemplateRef<unknown>;
    /** Mostrar spinner en lugar de skeleton */
    spinner?: boolean;
    /** Delay antes de mostrar estado de carga (ms) */
    delay?: number;
    /** Tiempo minimo de carga (ms) */
    minTime?: number;
}
/**
 * Template de skeleton registrado.
 */
export interface RegisteredSkeletonTemplate {
    name: string;
    component: Type<unknown>;
    defaultConfig?: SkeletonTemplateConfig;
}
/**
 * Configuracion para provideValtechSkeleton().
 */
export interface SkeletonConfig {
    /** Animacion habilitada por defecto */
    animated?: boolean;
    /** Delay global antes de mostrar skeletons */
    defaultDelay?: number;
    /** Tiempo minimo de visualizacion global */
    defaultMinTime?: number;
    /** Templates de skeleton personalizados a registrar */
    templates?: RegisteredSkeletonTemplate[];
    /** Template por defecto para listas */
    defaultListTemplate?: SkeletonTemplateName;
    /** Template por defecto para grids */
    defaultGridTemplate?: SkeletonTemplateName;
}
/**
 * Configuracion por defecto para el sistema de skeletons.
 */
export declare const DEFAULT_SKELETON_CONFIG: SkeletonConfig;
/**
 * Contexto para templates de skeleton en directivas.
 */
export interface SkeletonTemplateContext {
    /** Configuracion del skeleton */
    config: SkeletonTemplateConfig;
    /** Estado de animacion */
    animated: boolean;
}
/**
 * Tipo base para componentes de skeleton template.
 */
export interface SkeletonTemplateComponent {
    config: SkeletonTemplateConfig;
}
