import { ElementRef, EventEmitter } from '@angular/core';
import { AvatarUploadError, AvatarUploadMetadata, AvatarUploadResult } from './types';
import * as i0 from "@angular/core";
/**
 * AvatarUploadComponent
 *
 * A complete avatar upload solution with:
 * - Image selection from device
 * - Crop modal with round preview
 * - Automatic compression and thumbnail generation
 * - Upload to Firebase Storage
 * - Backend sync via AuthService
 *
 * @example Basic usage
 * ```html
 * <val-avatar-upload
 *   [props]="{
 *     currentUrl: user()?.avatarUrl,
 *     initials: 'JD',
 *     size: 120
 *   }"
 *   (uploaded)="onAvatarUploaded($event)"
 *   (error)="onError($event)"
 * />
 * ```
 */
export declare class AvatarUploadComponent {
    private imageService;
    private storageService;
    private authService;
    private i18n;
    fileInput: ElementRef<HTMLInputElement>;
    /** Component configuration */
    readonly props: import("@angular/core").InputSignal<AvatarUploadMetadata>;
    /** Emitted after successful upload and backend sync */
    uploaded: EventEmitter<AvatarUploadResult>;
    /** Emitted on any error during the process */
    error: EventEmitter<AvatarUploadError>;
    /** Emitted when upload starts */
    uploadStart: EventEmitter<void>;
    protected loading: import("@angular/core").WritableSignal<boolean>;
    protected showCropModal: import("@angular/core").WritableSignal<boolean>;
    protected showViewModal: import("@angular/core").WritableSignal<boolean>;
    protected selectedFile: import("@angular/core").WritableSignal<File>;
    protected previewUrl: import("@angular/core").WritableSignal<string>;
    protected imageLoadError: import("@angular/core").WritableSignal<boolean>;
    /** Merged config with defaults */
    protected config: import("@angular/core").Signal<{
        currentUrl?: string;
        initials?: string;
        backgroundColor: string;
        size: number;
        editable: boolean;
        storagePath: string;
        i18nNamespace: string;
        maxFileSize: number;
        compressQuality: number;
        maxWidth: number;
        thumbnailSize: number;
        showViewButton: boolean;
    }>;
    /** URL to display (preview takes priority over current) */
    protected displayUrl: import("@angular/core").Signal<string>;
    /** Aria label for edit button */
    protected editButtonLabel: import("@angular/core").Signal<string>;
    /** Label for view photo button */
    protected viewPhotoLabel: import("@angular/core").Signal<string>;
    /** Label for close button inside photo viewer */
    protected closePhotoLabel: import("@angular/core").Signal<string>;
    /** Open file picker dialog */
    openFilePicker(): void;
    /** Handle file selection */
    onFileSelected(event: Event): void;
    /** Handle crop completion */
    onCropComplete(croppedBlob: Blob): Promise<void>;
    /** Handle crop cancel */
    onCropCancel(): void;
    /** Handle crop load failure */
    onCropLoadFailed(): void;
    /** Handle image load error */
    onImageError(): void;
    /** Timeout for upload operations (30 seconds) */
    private static readonly UPLOAD_TIMEOUT_MS;
    /** Process cropped image and upload */
    private processAndUpload;
    /** Emit error event */
    private emitError;
    static ɵfac: i0.ɵɵFactoryDeclaration<AvatarUploadComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<AvatarUploadComponent, "val-avatar-upload", never, { "props": { "alias": "props"; "required": false; "isSignal": true; }; }, { "uploaded": "uploaded"; "error": "error"; "uploadStart": "uploadStart"; }, never, never, true, never>;
}
