{"version":3,"file":"angular-material-image-uploader.mjs","sources":["../../../projects/angular-material-image-uploader/src/lib/providers.ts","../../../projects/angular-material-image-uploader/src/lib/_config/uploader.config.ts","../../../projects/angular-material-image-uploader/src/lib/_services/alert.service.ts","../../../projects/angular-material-image-uploader/src/lib/angular-uploader/mat-confirm-dialog/mat-confirm-dialog.component.ts","../../../projects/angular-material-image-uploader/src/lib/angular-uploader/mat-confirm-dialog/mat-confirm-dialog.component.html","../../../projects/angular-material-image-uploader/src/lib/_services/dialog.service.ts","../../../projects/angular-material-image-uploader/src/lib/_services/image-util.service.ts","../../../projects/angular-material-image-uploader/src/lib/_services/upload.service.ts","../../../projects/angular-material-image-uploader/src/lib/angular-uploader/ng-image-cropper/ng-image-cropper.component.ts","../../../projects/angular-material-image-uploader/src/lib/angular-uploader/ng-image-cropper/ng-image-cropper.component.html","../../../projects/angular-material-image-uploader/src/lib/angular-uploader/image-preview-dialog/image-preview-dialog.component.ts","../../../projects/angular-material-image-uploader/src/lib/angular-uploader/image-preview-dialog/image-preview-dialog.component.html","../../../projects/angular-material-image-uploader/src/lib/angular-uploader/image-uploader/image-uploader.component.ts","../../../projects/angular-material-image-uploader/src/lib/angular-uploader/image-uploader/image-uploader.component.html","../../../projects/angular-material-image-uploader/src/public-api.ts","../../../projects/angular-material-image-uploader/src/angular-material-image-uploader.ts"],"sourcesContent":["import { EnvironmentProviders, Provider, makeEnvironmentProviders } from '@angular/core';\nimport { provideAnimationsAsync } from '@angular/platform-browser/animations/async';\nimport { provideHttpClient } from '@angular/common/http';\nimport { GlobalConfig, provideToastr } from 'ngx-toastr';\n\n/**\n * Registers everything the uploader needs: Material animations, HttpClient (for uploads)\n * and ngx-toastr. Add it to your application's providers:\n *\n *   bootstrapApplication(App, { providers: [provideAngularMaterialImageUploader()] });\n *\n * Skip it and register those three yourself if your app already provides them.\n */\nexport function provideAngularMaterialImageUploader(toastr?: Partial<GlobalConfig>): EnvironmentProviders {\n  const providers: (Provider | EnvironmentProviders)[] = [\n    provideAnimationsAsync(),\n    provideHttpClient(),\n    provideToastr({\n      progressBar: true,\n      progressAnimation: 'decreasing',\n      positionClass: 'toast-bottom-center',\n      preventDuplicates: true,\n      ...(toastr ?? {})\n    })\n  ];\n  return makeEnvironmentProviders(providers);\n}\n","export type AspectRatioKey = 'free' | '1:1' | '4:3' | '3:2' | '16:9' | '9:16';\nexport type OutputFormat = 'png' | 'jpeg' | 'webp';\n\nexport interface AspectRatioOption {\n  key: AspectRatioKey;\n  label: string;\n  value: number | null; // null = free-form\n}\n\nexport const ASPECT_RATIOS: AspectRatioOption[] = [\n  { key: 'free', label: 'Free', value: null },\n  { key: '1:1', label: '1:1', value: 1 },\n  { key: '4:3', label: '4:3', value: 4 / 3 },\n  { key: '3:2', label: '3:2', value: 3 / 2 },\n  { key: '16:9', label: '16:9', value: 16 / 9 },\n  { key: '9:16', label: '9:16', value: 9 / 16 }\n];\n\nexport const OUTPUT_FORMATS: { value: OutputFormat; label: string; mime: string; lossy: boolean }[] = [\n  { value: 'png', label: 'PNG (lossless)', mime: 'image/png', lossy: false },\n  { value: 'jpeg', label: 'JPEG', mime: 'image/jpeg', lossy: true },\n  { value: 'webp', label: 'WebP', mime: 'image/webp', lossy: true }\n];\n\n/**\n * Everything the uploader can be tuned with. Pass a partial object to\n * <app-image-uploader [config]=\"...\"> or edit DEFAULT_UPLOADER_CONFIG below.\n */\nexport interface UploaderConfig {\n  /** Allow picking / dropping / pasting several images at once. */\n  multiple: boolean;\n  /** Upper bound on items in the list (only enforced when `multiple` is true). */\n  maxFiles: number;\n  /** Per-file size limit in megabytes. */\n  maxFileSizeMB: number;\n  /** Accepted image subtypes (the part after \"image/\"). */\n  allowedTypes: string[];\n  /** Open the cropper for every picked image before it is added to the list. */\n  cropBeforeAdd: boolean;\n  /** Show a \"Use original\" button in the cropper so a file can skip cropping. */\n  allowSkipCrop: boolean;\n  /** Aspect ratio the cropper starts with. */\n  defaultAspectRatio: AspectRatioKey;\n  /** Format the cropped file is exported in. */\n  outputFormat: OutputFormat;\n  /** Quality (1-100) for lossy output formats. */\n  outputQuality: number;\n  /** Downscale cropped output to this width in px. 0 keeps the original scale. */\n  resizeToWidth: number;\n  /** Start uploading as soon as an image is added. */\n  autoUpload: boolean;\n  /** Allow drag-and-drop reordering of the list. */\n  allowReorder: boolean;\n  /** Accept images pasted from the clipboard (Ctrl/Cmd+V anywhere on the page). */\n  allowPaste: boolean;\n  /**\n   * Multipart upload endpoint. The file is POSTed as form-data (fields: file, originalName, cropped)\n   * with real progress events. Leave empty to simulate uploads in the UI.\n   */\n  uploadUrl: string;\n}\n\nexport const DEFAULT_UPLOADER_CONFIG: UploaderConfig = {\n  multiple: true,\n  maxFiles: 10,\n  maxFileSizeMB: 5,\n  allowedTypes: ['jpg', 'jpeg', 'png', 'webp'],\n  cropBeforeAdd: true,\n  allowSkipCrop: true,\n  defaultAspectRatio: 'free',\n  outputFormat: 'png',\n  outputQuality: 90,\n  resizeToWidth: 0,\n  autoUpload: false,\n  allowReorder: true,\n  allowPaste: true,\n  uploadUrl: ''\n};\n","import { Injectable, inject } from '@angular/core';\nimport { ToastrService } from 'ngx-toastr';\n\n@Injectable({ providedIn: 'root' })\nexport class AlertService {\n  private toastr = inject(ToastrService);\n\n  showSuccess(message: string, title = ''): void { this.toastr.success(message, title); }\n  showError(message: string, title = ''): void { this.toastr.error(message, title); }\n  showInfo(message: string, title = ''): void { this.toastr.info(message, title); }\n  showWarning(message: string, title = ''): void { this.toastr.warning(message, title); }\n}\n","import { Component, inject } from '@angular/core';\nimport { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\n\nexport interface ConfirmDialogData {\n  /** Plain-text question or notice. Rendered as text, never as HTML. */\n  message: string;\n  /** Optional item name shown on its own line (for example a file name). */\n  name?: string;\n  confirmYes?: string;\n  confirmNo: string;\n}\n\n@Component({\n  selector: 'app-mat-confirm-dialog',\n  imports: [MatDialogModule, MatButtonModule, MatIconModule],\n  templateUrl: './mat-confirm-dialog.component.html',\n  styleUrl: './mat-confirm-dialog.component.scss'\n})\nexport class MatConfirmDialogComponent {\n  readonly data = inject<ConfirmDialogData>(MAT_DIALOG_DATA);\n}\n","<h2 mat-dialog-title>Attention</h2>\n<mat-dialog-content>\n  <p>{{ data.message }}</p>\n  @if (data.name) {\n    <p class=\"target\"><mat-icon>image</mat-icon><span>{{ data.name }}</span></p>\n  }\n</mat-dialog-content>\n<mat-dialog-actions align=\"end\">\n  @if (data.confirmYes) {\n    <button mat-button color=\"warn\" id=\"yes-button\" [mat-dialog-close]=\"true\">{{ data.confirmYes }}</button>\n  }\n  <button mat-button id=\"no-button\" [mat-dialog-close]=\"false\">{{ data.confirmNo }}</button>\n</mat-dialog-actions>\n","import { Injectable, inject } from '@angular/core';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { MatConfirmDialogComponent, ConfirmDialogData } from '../angular-uploader/mat-confirm-dialog/mat-confirm-dialog.component';\n\n@Injectable({ providedIn: 'root' })\nexport class DialogService {\n  private dialog = inject(MatDialog);\n\n  /** Yes/No question. `name` (for example a file name) is shown as plain text under the message. */\n  openConfirmDialog(message: string, name?: string): MatDialogRef<MatConfirmDialogComponent, boolean> {\n    return this.dialog.open<MatConfirmDialogComponent, ConfirmDialogData, boolean>(MatConfirmDialogComponent, {\n      width: '390px',\n      disableClose: true,\n      autoFocus: false,\n      data: { message, name, confirmYes: 'Yes', confirmNo: 'No' }\n    });\n  }\n\n  popup(message: string): MatDialogRef<MatConfirmDialogComponent, boolean> {\n    return this.dialog.open<MatConfirmDialogComponent, ConfirmDialogData, boolean>(MatConfirmDialogComponent, {\n      width: '390px',\n      disableClose: true,\n      autoFocus: false,\n      data: { message, confirmNo: 'Ok' }\n    });\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { OUTPUT_FORMATS, OutputFormat } from '../_config/uploader.config';\n\n@Injectable({ providedIn: 'root' })\nexport class ImageUtilService {\n  private counter = 0;\n\n  uid(): string {\n    this.counter += 1;\n    return `${Date.now().toString(36)}-${this.counter}-${Math.random().toString(36).slice(2, 7)}`;\n  }\n\n  fileToDataUrl(file: File): Promise<string> {\n    return new Promise((resolve, reject) => {\n      const reader = new FileReader();\n      reader.onload = () => resolve(reader.result as string);\n      reader.onerror = () => reject(reader.error);\n      reader.readAsDataURL(file);\n    });\n  }\n\n  getImageDimensions(dataUrl: string): Promise<{ width: number; height: number }> {\n    return new Promise((resolve, reject) => {\n      const img = new Image();\n      img.onload = () => resolve({ width: img.naturalWidth, height: img.naturalHeight });\n      img.onerror = () => reject(new Error('Could not read image dimensions'));\n      img.src = dataUrl;\n    });\n  }\n\n  dataUrlToBlob(dataUrl: string): Blob {\n    const [header, data] = dataUrl.split(',');\n    const mimeMatch = /data:([^;]+)/.exec(header);\n    const mime = mimeMatch ? mimeMatch[1] : 'application/octet-stream';\n    const binary = atob(data);\n    const bytes = new Uint8Array(binary.length);\n    for (let i = 0; i < binary.length; i++) {\n      bytes[i] = binary.charCodeAt(i);\n    }\n    return new Blob([bytes], { type: mime });\n  }\n\n  dataUrlToFile(dataUrl: string, name: string): File {\n    const blob = this.dataUrlToBlob(dataUrl);\n    return new File([blob], name, { type: blob.type, lastModified: Date.now() });\n  }\n\n  /** Approximate decoded byte size of a base64 data URL without decoding it. */\n  estimateDataUrlBytes(dataUrl: string): number {\n    if (!dataUrl) { return 0; }\n    const data = dataUrl.substring(dataUrl.indexOf(',') + 1);\n    const padding = data.endsWith('==') ? 2 : data.endsWith('=') ? 1 : 0;\n    return Math.round(data.length * 3 / 4) - padding;\n  }\n\n  replaceExtension(name: string, format: OutputFormat): string {\n    const ext = format === 'jpeg' ? 'jpg' : format;\n    const dot = name.lastIndexOf('.');\n    const base = dot > 0 ? name.substring(0, dot) : name;\n    return `${base}.${ext}`;\n  }\n\n  mimeForFormat(format: OutputFormat): string {\n    const found = OUTPUT_FORMATS.find(f => f.value === format);\n    return found ? found.mime : 'image/png';\n  }\n\n  formatBytes(bytes: number): string {\n    if (!bytes) { return '0 B'; }\n    const units = ['B', 'KB', 'MB', 'GB'];\n    const i = Math.min(Math.floor(Math.log(bytes) / Math.log(1024)), units.length - 1);\n    const value = bytes / Math.pow(1024, i);\n    return `${value.toFixed(value < 10 && i > 0 ? 1 : 0)} ${units[i]}`;\n  }\n\n  download(file: Blob, name: string): void {\n    const url = URL.createObjectURL(file);\n    const a = document.createElement('a');\n    a.href = url;\n    a.download = name;\n    document.body.appendChild(a);\n    a.click();\n    document.body.removeChild(a);\n    setTimeout(() => URL.revokeObjectURL(url), 1000);\n  }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient, HttpEventType, HttpRequest } from '@angular/common/http';\nimport { Observable, timer } from 'rxjs';\nimport { filter, map, takeWhile } from 'rxjs/operators';\nimport { UploadItem } from '../_models/upload-item.model';\n\n/**\n * Uploads a single item and reports progress as 0-100.\n *\n * When `uploadUrl` is set the file is POSTed as multipart/form-data\n * (field name \"file\") with real progress events. When it is empty the upload is\n * simulated so the UI can be exercised without a backend.\n */\n@Injectable({ providedIn: 'root' })\nexport class UploadService {\n  private readonly http = inject(HttpClient);\n\n  upload(item: UploadItem, uploadUrl = ''): Observable<number> {\n    return uploadUrl ? this.uploadToServer(uploadUrl, item) : this.simulate(item);\n  }\n\n  private uploadToServer(url: string, item: UploadItem): Observable<number> {\n    const form = new FormData();\n    form.append('file', item.file, item.name);\n    form.append('originalName', item.originalFile.name);\n    form.append('cropped', String(item.cropped));\n    const req = new HttpRequest('POST', url, form, { reportProgress: true });\n    return this.http.request(req).pipe(\n      filter(event => event.type === HttpEventType.UploadProgress || event.type === HttpEventType.Response),\n      map(event => {\n        if (event.type === HttpEventType.UploadProgress) {\n          return event.total ? Math.round((100 * event.loaded) / event.total) : 0;\n        }\n        return 100;\n      })\n    );\n  }\n\n  private simulate(item: UploadItem): Observable<number> {\n    // Bigger files \"take longer\": roughly 1.5s per MB, at least 1.2s.\n    const durationMs = Math.max(1200, (item.size / 1024 / 1024) * 1500);\n    const tickMs = 80;\n    const ticks = Math.ceil(durationMs / tickMs);\n    return timer(0, tickMs).pipe(\n      map(i => Math.min(100, Math.round((i / ticks) * 100))),\n      takeWhile(p => p < 100, true)\n    );\n  }\n}\n","import { Component, OnInit, ViewChild, computed, inject, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSliderModule } from '@angular/material/slider';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { ImageCroppedEvent, ImageCropperComponent, ImageTransform } from 'ngx-image-cropper';\nimport { AlertService } from '../../_services/alert.service';\nimport { ImageUtilService } from '../../_services/image-util.service';\nimport { ASPECT_RATIOS, AspectRatioKey, OUTPUT_FORMATS, OutputFormat, UploaderConfig } from '../../_config/uploader.config';\nimport { CropResult } from '../../_models/upload-item.model';\n\nexport interface CropDialogData {\n  files: File[];\n  config: UploaderConfig;\n}\n\nexport interface CropDialogResult {\n  event: 'done' | 'cancel';\n  results: CropResult[];\n}\n\ninterface Size { width: number; height: number; }\n\n@Component({\n  selector: 'app-ng-image-cropper',\n  imports: [\n    FormsModule, ImageCropperComponent, MatDialogModule, MatButtonModule, MatButtonToggleModule,\n    MatFormFieldModule, MatIconModule, MatProgressBarModule, MatProgressSpinnerModule, MatSelectModule,\n    MatSliderModule, MatSlideToggleModule, MatTooltipModule\n  ],\n  templateUrl: './ng-image-cropper.component.html',\n  styleUrl: './ng-image-cropper.component.scss'\n})\nexport class NgImageCropperComponent implements OnInit {\n  @ViewChild(ImageCropperComponent) cropperCmp?: ImageCropperComponent;\n\n  private readonly alertService = inject(AlertService);\n  private readonly imageUtil = inject(ImageUtilService);\n  readonly dialogRef = inject<MatDialogRef<NgImageCropperComponent, CropDialogResult>>(MatDialogRef);\n  readonly data = inject<CropDialogData>(MAT_DIALOG_DATA);\n\n  readonly aspectRatios = ASPECT_RATIOS;\n  readonly outputFormats = OUTPUT_FORMATS;\n\n  // Batch state\n  readonly queue = signal<File[]>([]);\n  readonly index = signal(0);\n  readonly thumbs = signal<string[]>([]);\n  readonly currentFile = signal<File | undefined>(undefined);\n  readonly originalSize = signal<Size | null>(null);\n  private results: CropResult[] = [];\n  private currentDataUrl = '';\n\n  // Cropper state (edited through events / ngModel)\n  readonly loading = signal(true);\n  readonly aspectKey = signal<AspectRatioKey>('free');\n  readonly maintainAspectRatio = signal(false);\n  readonly aspectRatio = signal(4 / 3);\n  roundCropper = false;\n  readonly canvasRotation = signal(0);\n  readonly transform = signal<ImageTransform>({});\n  readonly zoom = signal(1);\n  format: OutputFormat = 'png';\n  quality = 90;\n  resizeToWidth = 0;\n\n  // Output state (emitted by the cropper library)\n  readonly croppedImage = signal('');\n  readonly croppedWidth = signal(0);\n  readonly croppedHeight = signal(0);\n  readonly croppedBytes = signal(0);\n\n  readonly total = computed(() => this.queue().length);\n  readonly isBatch = computed(() => this.total() > 1);\n  readonly isLast = computed(() => this.index() >= this.total() - 1);\n  readonly zoomPercent = computed(() => Math.round(this.zoom() * 100));\n  readonly currentName = computed(() => this.currentFile()?.name ?? '');\n  readonly currentSize = computed(() => this.currentFile()?.size ?? 0);\n\n  get isLossy(): boolean { return this.format !== 'png'; }\n  get canSkip(): boolean { return this.data.config.allowSkipCrop; }\n\n  ngOnInit(): void {\n    const cfg = this.data.config;\n    const files = [...(this.data.files || [])];\n    this.queue.set(files);\n    this.format = cfg.outputFormat;\n    this.quality = cfg.outputQuality;\n    this.resizeToWidth = cfg.resizeToWidth;\n    this.setAspect(cfg.defaultAspectRatio);\n    this.thumbs.set(files.map(() => ''));\n    files.forEach((file, i) =>\n      this.imageUtil.fileToDataUrl(file).then(url =>\n        this.thumbs.update(list => list.map((t, j) => (j === i ? url : t)))\n      )\n    );\n    this.loadCurrent();\n  }\n\n  // ---------- batch navigation ----------\n\n  private loadCurrent(): void {\n    const file = this.queue()[this.index()];\n    this.currentFile.set(file);\n    this.loading.set(true);\n    this.croppedImage.set('');\n    this.originalSize.set(null);\n    this.resetAdjustments();\n    if (!file) { return; }\n    this.imageUtil.fileToDataUrl(file).then(url => {\n      this.currentDataUrl = url;\n      return this.imageUtil.getImageDimensions(url);\n    }).then(dim => this.originalSize.set(dim))\n      .catch(() => this.loadImageFailed());\n  }\n\n  private advance(result: CropResult | null): void {\n    if (result) { this.results.push(result); }\n    if (this.isLast()) {\n      this.dialogRef.close({ event: 'done', results: this.results });\n      return;\n    }\n    this.index.update(i => i + 1);\n    this.loadCurrent();\n  }\n\n  cropAndNext(): void {\n    const file = this.currentFile();\n    if (!file) { return; }\n    const cropped = this.croppedImage();\n    if (!cropped) {\n      this.alertService.showWarning('The image is still loading, please wait a moment.');\n      return;\n    }\n    const name = this.imageUtil.replaceExtension(file.name, this.format);\n    this.advance({\n      originalFile: file,\n      file: this.imageUtil.dataUrlToFile(cropped, name),\n      dataUrl: cropped,\n      width: this.croppedWidth(),\n      height: this.croppedHeight(),\n      cropped: true\n    });\n  }\n\n  useOriginal(): void {\n    const file = this.currentFile();\n    if (!file) { return; }\n    const dim = this.originalSize() ?? { width: this.croppedWidth(), height: this.croppedHeight() };\n    this.advance({\n      originalFile: file,\n      file,\n      dataUrl: this.currentDataUrl,\n      width: dim.width,\n      height: dim.height,\n      cropped: false\n    });\n  }\n\n  removeFromBatch(): void {\n    if (this.isLast()) {\n      this.dialogRef.close({ event: this.results.length ? 'done' : 'cancel', results: this.results });\n      return;\n    }\n    const i = this.index();\n    this.queue.update(list => list.filter((_, j) => j !== i));\n    this.thumbs.update(list => list.filter((_, j) => j !== i));\n    this.loadCurrent();\n  }\n\n  cancel(): void {\n    this.dialogRef.close({ event: 'cancel', results: [] });\n  }\n\n  // ---------- cropper events ----------\n\n  imageCropped(event: ImageCroppedEvent): void {\n    const base64 = event.base64 ?? '';\n    this.croppedImage.set(base64);\n    this.croppedWidth.set(event.width);\n    this.croppedHeight.set(event.height);\n    this.croppedBytes.set(this.imageUtil.estimateDataUrlBytes(base64));\n  }\n\n  cropperReady(): void {\n    this.loading.set(false);\n  }\n\n  loadImageFailed(): void {\n    this.loading.set(false);\n    this.alertService.showError(`Unable to load \"${this.currentName() || 'image'}\".`);\n  }\n\n  // ---------- adjustments ----------\n\n  setAspect(key: AspectRatioKey): void {\n    const option = this.aspectRatios.find(a => a.key === key) ?? this.aspectRatios[0];\n    this.aspectKey.set(option.key);\n    if (option.value === null) {\n      this.maintainAspectRatio.set(false);\n      return;\n    }\n    const unchanged = this.maintainAspectRatio() && this.aspectRatio() === option.value;\n    this.maintainAspectRatio.set(true);\n    this.aspectRatio.set(option.value);\n    if (unchanged) {\n      this.cropperCmp?.resetCropperPosition();\n    }\n  }\n\n  rotate(direction: number): void {\n    this.canvasRotation.update(r => (r + direction + 4) % 4);\n  }\n\n  flip(axis: 'h' | 'v'): void {\n    this.transform.update(t => axis === 'h' ? { ...t, flipH: !t.flipH } : { ...t, flipV: !t.flipV });\n  }\n\n  setZoom(value: number | null): void {\n    const zoom = Math.min(3, Math.max(0.5, Number(value) || 1));\n    this.zoom.set(zoom);\n    this.transform.update(t => ({ ...t, scale: zoom }));\n  }\n\n  zoomBy(delta: number): void {\n    this.setZoom(Math.round((this.zoom() + delta) * 10) / 10);\n  }\n\n  resetAdjustments(): void {\n    this.canvasRotation.set(0);\n    this.zoom.set(1);\n    this.transform.set({});\n    this.roundCropper = false;\n    this.setAspect(this.data.config.defaultAspectRatio);\n  }\n\n  resetCropArea(): void {\n    this.cropperCmp?.resetCropperPosition();\n  }\n\n  formatBytes(bytes: number): string {\n    return this.imageUtil.formatBytes(bytes);\n  }\n}\n","<div class=\"crop-dialog\">\n  <div class=\"crop-header\">\n    <div class=\"crop-title\">\n      <mat-icon>crop</mat-icon>\n      <div>\n        <h2>Crop image</h2>\n        @if (currentFile()) {\n          <div class=\"crop-subtitle\">\n            <span class=\"file-name\" [matTooltip]=\"currentName()\">{{ currentName() }}</span>\n            @if (originalSize(); as size) {\n              <span class=\"dot\">·</span>\n              <span>{{ size.width }} × {{ size.height }} px</span>\n            }\n            <span class=\"dot\">·</span>\n            <span>{{ formatBytes(currentSize()) }}</span>\n          </div>\n        }\n      </div>\n    </div>\n    @if (isBatch()) {\n      <div class=\"crop-progress\">\n        <span class=\"badge\">{{ index() + 1 }} of {{ total() }}</span>\n        <mat-progress-bar mode=\"determinate\" [value]=\"(index() / total()) * 100\"></mat-progress-bar>\n      </div>\n    }\n    <button mat-icon-button (click)=\"cancel()\" matTooltip=\"Cancel all\" aria-label=\"Cancel\">\n      <mat-icon>close</mat-icon>\n    </button>\n  </div>\n\n  <mat-dialog-content class=\"crop-body\">\n    <div class=\"crop-stage\">\n      @if (loading()) {\n        <div class=\"stage-loading\">\n          <mat-spinner diameter=\"40\"></mat-spinner>\n        </div>\n      }\n      <image-cropper\n        [imageFile]=\"currentFile()\"\n        [maintainAspectRatio]=\"maintainAspectRatio()\"\n        [aspectRatio]=\"aspectRatio()\"\n        [roundCropper]=\"roundCropper\"\n        [canvasRotation]=\"canvasRotation()\"\n        [transform]=\"transform()\"\n        [format]=\"format\"\n        output=\"base64\"\n        [imageQuality]=\"quality\"\n        [resizeToWidth]=\"resizeToWidth\"\n        [onlyScaleDown]=\"true\"\n        backgroundColor=\"#ffffff\"\n        (imageCropped)=\"imageCropped($event)\"\n        (cropperReady)=\"cropperReady()\"\n        (loadImageFailed)=\"loadImageFailed()\">\n      </image-cropper>\n      <p class=\"stage-hint\">Drag the corners or edges to resize, drag inside to move. Arrow keys nudge the crop area.</p>\n    </div>\n\n    <aside class=\"crop-tools\">\n      <section>\n        <h4>Aspect ratio</h4>\n        <mat-button-toggle-group class=\"ratio-group\" [value]=\"aspectKey()\" (change)=\"setAspect($event.value)\" aria-label=\"Aspect ratio\">\n          @for (r of aspectRatios; track r.key) {\n            <mat-button-toggle [value]=\"r.key\">{{ r.label }}</mat-button-toggle>\n          }\n        </mat-button-toggle-group>\n        <mat-slide-toggle [(ngModel)]=\"roundCropper\" color=\"primary\">Round crop</mat-slide-toggle>\n      </section>\n\n      <section>\n        <h4>Adjust</h4>\n        <div class=\"tool-row\">\n          <button mat-stroked-button (click)=\"rotate(-1)\" matTooltip=\"Rotate left\"><mat-icon>rotate_left</mat-icon></button>\n          <button mat-stroked-button (click)=\"rotate(1)\" matTooltip=\"Rotate right\"><mat-icon>rotate_right</mat-icon></button>\n          <button mat-stroked-button (click)=\"flip('h')\" matTooltip=\"Flip horizontal\" [class.active]=\"transform().flipH\"><mat-icon>flip</mat-icon></button>\n          <button mat-stroked-button (click)=\"flip('v')\" matTooltip=\"Flip vertical\" [class.active]=\"transform().flipV\"><mat-icon class=\"rot90\">flip</mat-icon></button>\n        </div>\n        <div class=\"zoom-row\">\n          <button mat-icon-button (click)=\"zoomBy(-0.1)\" matTooltip=\"Zoom out\"><mat-icon>zoom_out</mat-icon></button>\n          <mat-slider min=\"0.5\" max=\"3\" step=\"0.1\" color=\"primary\">\n            <input matSliderThumb [value]=\"zoom()\" (valueChange)=\"setZoom($event)\" aria-label=\"Zoom\" />\n          </mat-slider>\n          <button mat-icon-button (click)=\"zoomBy(0.1)\" matTooltip=\"Zoom in\"><mat-icon>zoom_in</mat-icon></button>\n          <span class=\"zoom-value\">{{ zoomPercent() }}%</span>\n        </div>\n        <div class=\"tool-row\">\n          <button mat-button (click)=\"resetCropArea()\"><mat-icon>crop_free</mat-icon> Reset crop area</button>\n          <button mat-button (click)=\"resetAdjustments()\"><mat-icon>restart_alt</mat-icon> Reset all</button>\n        </div>\n      </section>\n\n      <section>\n        <h4>Output</h4>\n        <mat-form-field appearance=\"outline\" class=\"full\" subscriptSizing=\"dynamic\">\n          <mat-label>Format</mat-label>\n          <mat-select [(ngModel)]=\"format\">\n            @for (f of outputFormats; track f.value) {\n              <mat-option [value]=\"f.value\">{{ f.label }}</mat-option>\n            }\n          </mat-select>\n        </mat-form-field>\n        @if (isLossy) {\n          <div class=\"quality-row\">\n            <span>Quality</span>\n            <mat-slider min=\"10\" max=\"100\" step=\"5\" discrete color=\"primary\">\n              <input matSliderThumb [(ngModel)]=\"quality\" aria-label=\"Quality\" />\n            </mat-slider>\n            <span class=\"zoom-value\">{{ quality }}</span>\n          </div>\n        }\n        @if (croppedImage(); as preview) {\n          <div class=\"preview\">\n            <img [src]=\"preview\" [class.round]=\"roundCropper\" alt=\"Cropped preview\" />\n            <div class=\"preview-meta\">\n              <span>{{ croppedWidth() }} × {{ croppedHeight() }} px</span>\n              <span>≈ {{ formatBytes(croppedBytes()) }}</span>\n            </div>\n          </div>\n        }\n      </section>\n    </aside>\n  </mat-dialog-content>\n\n  @if (isBatch()) {\n    <div class=\"thumb-strip\">\n      @for (t of thumbs(); track $index; let i = $index) {\n        <div class=\"thumb\" [class.current]=\"i === index()\" [class.done]=\"i < index()\" [matTooltip]=\"queue()[i].name\">\n          @if (t) { <img [src]=\"t\" alt=\"\" /> }\n          @if (i < index()) { <mat-icon class=\"check\">check_circle</mat-icon> }\n          <span class=\"num\">{{ i + 1 }}</span>\n        </div>\n      }\n    </div>\n  }\n\n  <mat-dialog-actions class=\"crop-actions\">\n    <button mat-button (click)=\"cancel()\">Cancel</button>\n    <span class=\"spacer\"></span>\n    @if (isBatch()) {\n      <button mat-button color=\"warn\" (click)=\"removeFromBatch()\" matTooltip=\"Do not add this image\">\n        <mat-icon>delete_outline</mat-icon> Remove\n      </button>\n    }\n    @if (canSkip) {\n      <button mat-stroked-button (click)=\"useOriginal()\" [disabled]=\"loading()\" matTooltip=\"Add without cropping\">\n        Use original\n      </button>\n    }\n    <button mat-flat-button color=\"primary\" (click)=\"cropAndNext()\" [disabled]=\"loading() || !croppedImage()\">\n      <mat-icon>{{ isLast() ? 'check' : 'arrow_forward' }}</mat-icon>\n      {{ isLast() ? (isBatch() ? 'Crop & finish' : 'Crop & save') : 'Crop & next' }}\n    </button>\n  </mat-dialog-actions>\n</div>\n","import { Component, inject } from '@angular/core';\nimport { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { UploadItem } from '../../_models/upload-item.model';\nimport { ImageUtilService } from '../../_services/image-util.service';\n\nexport interface PreviewDialogData {\n  items: UploadItem[];\n  index: number;\n}\n\nexport interface PreviewDialogResult {\n  action: 'edit';\n  item: UploadItem;\n}\n\n@Component({\n  selector: 'app-image-preview-dialog',\n  imports: [MatDialogModule, MatButtonModule, MatIconModule, MatTooltipModule],\n  templateUrl: './image-preview-dialog.component.html',\n  styleUrl: './image-preview-dialog.component.scss'\n})\nexport class ImagePreviewDialogComponent {\n  private readonly imageUtil = inject(ImageUtilService);\n  readonly dialogRef = inject<MatDialogRef<ImagePreviewDialogComponent, PreviewDialogResult>>(MatDialogRef);\n  readonly data = inject<PreviewDialogData>(MAT_DIALOG_DATA);\n\n  index = this.data.index || 0;\n\n  get item(): UploadItem { return this.data.items[this.index]; }\n  get hasPrev(): boolean { return this.index > 0; }\n  get hasNext(): boolean { return this.index < this.data.items.length - 1; }\n\n  prev(): void { if (this.hasPrev) { this.index -= 1; } }\n  next(): void { if (this.hasNext) { this.index += 1; } }\n\n  onKey(event: KeyboardEvent): void {\n    if (event.key === 'ArrowLeft') { this.prev(); }\n    if (event.key === 'ArrowRight') { this.next(); }\n  }\n\n  download(): void {\n    this.imageUtil.download(this.item.file, this.item.name);\n  }\n\n  edit(): void {\n    this.dialogRef.close({ action: 'edit', item: this.item });\n  }\n\n  formatBytes(bytes: number): string {\n    return this.imageUtil.formatBytes(bytes);\n  }\n}\n","<div class=\"preview-dialog\" (keydown)=\"onKey($event)\" tabindex=\"0\">\n  <div class=\"preview-header\">\n    <div class=\"preview-title\">\n      <h2 [matTooltip]=\"item.name\">{{ item.name }}</h2>\n      <div class=\"meta\">\n        <span>{{ item.width }} × {{ item.height }} px</span>\n        <span>{{ formatBytes(item.size) }}</span>\n        <span>{{ item.type }}</span>\n        @if (item.cropped) { <span class=\"chip\"><mat-icon>crop</mat-icon> cropped</span> }\n        @if (item.status === 'done') { <span class=\"chip done\"><mat-icon>cloud_done</mat-icon> uploaded</span> }\n      </div>\n    </div>\n    @if (data.items.length > 1) { <span class=\"counter\">{{ index + 1 }} / {{ data.items.length }}</span> }\n    <button mat-icon-button mat-dialog-close aria-label=\"Close\"><mat-icon>close</mat-icon></button>\n  </div>\n\n  <mat-dialog-content class=\"preview-body\">\n    <button mat-icon-button class=\"nav prev\" (click)=\"prev()\" [disabled]=\"!hasPrev\" aria-label=\"Previous\">\n      <mat-icon>chevron_left</mat-icon>\n    </button>\n    <img [src]=\"item.previewUrl\" [alt]=\"item.name\" />\n    <button mat-icon-button class=\"nav next\" (click)=\"next()\" [disabled]=\"!hasNext\" aria-label=\"Next\">\n      <mat-icon>chevron_right</mat-icon>\n    </button>\n  </mat-dialog-content>\n\n  <mat-dialog-actions class=\"preview-actions\">\n    <button mat-button (click)=\"edit()\"><mat-icon>crop</mat-icon> Re-crop</button>\n    <button mat-button (click)=\"download()\"><mat-icon>download</mat-icon> Download</button>\n    <span class=\"spacer\"></span>\n    <button mat-flat-button color=\"primary\" mat-dialog-close>Close</button>\n  </mat-dialog-actions>\n</div>\n","import { Component, ElementRef, HostListener, Input, OnDestroy, ViewChild, computed, effect, inject, input, output, signal } from '@angular/core';\nimport { UpperCasePipe } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { CdkDrag, CdkDragDrop, CdkDragHandle, CdkDragPlaceholder, CdkDropList, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { MatDialog } from '@angular/material/dialog';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatRippleModule } from '@angular/material/core';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { Subscription, firstValueFrom } from 'rxjs';\nimport { AlertService } from '../../_services/alert.service';\nimport { DialogService } from '../../_services/dialog.service';\nimport { ImageUtilService } from '../../_services/image-util.service';\nimport { UploadService } from '../../_services/upload.service';\nimport { CropDialogData, CropDialogResult, NgImageCropperComponent } from '../ng-image-cropper/ng-image-cropper.component';\nimport { ImagePreviewDialogComponent, PreviewDialogData, PreviewDialogResult } from '../image-preview-dialog/image-preview-dialog.component';\nimport { CropResult, UploadItem } from '../../_models/upload-item.model';\nimport { ASPECT_RATIOS, DEFAULT_UPLOADER_CONFIG, OUTPUT_FORMATS, UploaderConfig } from '../../_config/uploader.config';\n\n@Component({\n  selector: 'app-angular-material-uploader, app-image-uploader',\n  imports: [\n    UpperCasePipe, FormsModule, CdkDropList, CdkDrag, CdkDragHandle, CdkDragPlaceholder,\n    MatButtonModule, MatRippleModule, MatFormFieldModule, MatIconModule, MatInputModule, MatMenuModule,\n    MatProgressBarModule, MatSelectModule, MatSlideToggleModule, MatTooltipModule\n  ],\n  templateUrl: './image-uploader.component.html',\n  styleUrl: './image-uploader.component.scss'\n})\nexport class ImageUploaderComponent implements OnDestroy {\n  /** Override any subset of the defaults from the parent: <app-image-uploader [config]=\"{ multiple: false }\"> */\n  @Input() set config(value: Partial<UploaderConfig> | null | undefined) {\n    this.cfg = { ...DEFAULT_UPLOADER_CONFIG, ...(value ?? {}) };\n  }\n  get config(): Partial<UploaderConfig> { return this.cfg; }\n\n  // ----- v1 inputs, kept so existing apps upgrade without template changes -----\n\n  /** @deprecated v1 name for `config.allowedTypes`. */\n  @Input() set allowImageType(value: string[] | null | undefined) {\n    if (value?.length) { this.cfg.allowedTypes = value.map(t => t.trim().replace(/^\\./, '').toLowerCase()); }\n  }\n  /** @deprecated v1 name for `config.maxFileSizeMB`. */\n  @Input() set sizeLimit(value: number | null | undefined) {\n    if (value != null) { this.cfg.maxFileSizeMB = Number(value); }\n  }\n  /** @deprecated v1 name for `config.cropBeforeAdd`. */\n  @Input() set Iscrop(value: boolean | null | undefined) {\n    if (value != null) { this.cfg.cropBeforeAdd = !!value; }\n  }\n\n  /** Show the gear icon that opens the in-page settings panel. */\n  readonly showSettingsButton = input(true);\n\n  /** Emits the current list whenever an image is added, edited, reordered, uploaded, or removed. */\n  readonly imageDetails = output<UploadItem[]>();\n\n  /** Emits an item when its upload finishes successfully. */\n  readonly uploadComplete = output<UploadItem>();\n\n  @ViewChild('uploader') uploadInput?: ElementRef<HTMLInputElement>;\n\n  private readonly dialog = inject(MatDialog);\n  private readonly alertService = inject(AlertService);\n  private readonly dialogService = inject(DialogService);\n  private readonly imageUtil = inject(ImageUtilService);\n  private readonly uploadService = inject(UploadService);\n\n  /** Settings are edited through ngModel, so a plain object is enough here. */\n  cfg: UploaderConfig = { ...DEFAULT_UPLOADER_CONFIG };\n\n  readonly items = signal<UploadItem[]>([]);\n  readonly isDragOver = signal(false);\n  readonly showSettings = signal(false);\n  readonly busy = signal(false);\n\n  readonly totalSize = computed(() => this.items().reduce((sum, i) => sum + i.size, 0));\n  readonly readyItems = computed(() => this.items().filter(i => i.status === 'ready' || i.status === 'error'));\n  readonly uploadingCount = computed(() => this.items().filter(i => i.status === 'uploading').length);\n  readonly doneCount = computed(() => this.items().filter(i => i.status === 'done').length);\n\n  readonly aspectRatios = ASPECT_RATIOS;\n  readonly outputFormats = OUTPUT_FORMATS;\n\n  private uploads = new Map<string, Subscription>();\n\n  constructor() {\n    effect(() => this.imageDetails.emit(this.items()));\n  }\n\n  ngOnDestroy(): void {\n    this.uploads.forEach(sub => sub.unsubscribe());\n  }\n\n  // ---------- derived state ----------\n\n  get acceptAttr(): string { return this.cfg.allowedTypes.map(t => `.${t}`).join(','); }\n  get allowedTypesLabel(): string { return this.cfg.allowedTypes.join(', '); }\n  get remainingSlots(): number { return this.cfg.multiple ? Math.max(0, this.cfg.maxFiles - this.items().length) : 1; }\n  get canAddMore(): boolean { return this.cfg.multiple ? this.remainingSlots > 0 : true; }\n\n  /** Re-emit the list after an item was mutated in place so the view refreshes. */\n  private touch(): void {\n    this.items.update(list => [...list]);\n  }\n\n  // ---------- picking files ----------\n\n  onFilesSelected(event: Event): void {\n    const input = event.target as HTMLInputElement;\n    const files = Array.from(input.files ?? []);\n    input.value = ''; // allow picking the same file again later\n    this.handleFiles(files);\n  }\n\n  onDragOver(event: DragEvent): void {\n    event.preventDefault();\n    event.stopPropagation();\n    this.isDragOver.set(true);\n  }\n\n  onDragLeave(event: DragEvent): void {\n    event.preventDefault();\n    this.isDragOver.set(false);\n  }\n\n  onDrop(event: DragEvent): void {\n    event.preventDefault();\n    event.stopPropagation();\n    this.isDragOver.set(false);\n    this.handleFiles(event.dataTransfer ? Array.from(event.dataTransfer.files) : []);\n  }\n\n  @HostListener('document:paste', ['$event'])\n  onPaste(event: ClipboardEvent): void {\n    if (!this.cfg.allowPaste || this.dialog.openDialogs.length || !event.clipboardData) { return; }\n    const files: File[] = [];\n    Array.from(event.clipboardData.items).forEach((item, i) => {\n      if (item.kind === 'file' && item.type.startsWith('image/')) {\n        const file = item.getAsFile();\n        if (file) {\n          const ext = file.type.split('/')[1] || 'png';\n          const name = file.name && file.name !== 'image.png' ? file.name : `pasted-${Date.now()}-${i + 1}.${ext}`;\n          files.push(new File([file], name, { type: file.type }));\n        }\n      }\n    });\n    if (files.length) {\n      event.preventDefault();\n      this.handleFiles(files);\n    }\n  }\n\n  private handleFiles(picked: File[]): void {\n    if (!picked.length || this.busy()) { return; }\n    let files = picked;\n\n    if (!this.cfg.multiple && files.length > 1) {\n      this.alertService.showInfo('Multiple upload is turned off, so only the first image was taken.');\n      files = [files[0]];\n    }\n    if (!this.cfg.multiple && this.items().length) {\n      // Single mode: the new image replaces the old one.\n      this.items().forEach(i => this.cancelUpload(i));\n      this.items.set([]);\n    }\n    if (this.cfg.multiple && files.length > this.remainingSlots) {\n      if (this.remainingSlots === 0) {\n        this.alertService.showWarning(`You can add at most ${this.cfg.maxFiles} images.`);\n        return;\n      }\n      this.alertService.showWarning(`Only ${this.remainingSlots} more image(s) can be added (limit ${this.cfg.maxFiles}).`);\n      files = files.slice(0, this.remainingSlots);\n    }\n\n    const valid = files.filter(f => this.validate(f));\n    if (!valid.length) { return; }\n\n    if (this.cfg.cropBeforeAdd) {\n      this.openCropper(valid).then(results => results.forEach(r => this.addResult(r)));\n    } else {\n      valid.forEach(f => this.addUncropped(f));\n    }\n  }\n\n  private validate(file: File): boolean {\n    const ext = (file.type.split('/')[1] || '').toLowerCase();\n    if (!file.type.startsWith('image/') || !this.cfg.allowedTypes.includes(ext)) {\n      this.alertService.showError(`\"${file.name}\" is not allowed. Use ${this.allowedTypesLabel}.`);\n      return false;\n    }\n    if (file.size / 1024 / 1024 > this.cfg.maxFileSizeMB) {\n      this.alertService.showError(`\"${file.name}\" is larger than ${this.cfg.maxFileSizeMB} MB.`);\n      return false;\n    }\n    if (this.items().some(i => i.originalFile.name === file.name && i.originalFile.size === file.size)) {\n      this.alertService.showWarning(`\"${file.name}\" is already in the list.`);\n      return false;\n    }\n    return true;\n  }\n\n  // ---------- cropping ----------\n\n  private async openCropper(files: File[]): Promise<CropResult[]> {\n    this.busy.set(true);\n    const data: CropDialogData = { files, config: this.cfg };\n    const ref = this.dialog.open<NgImageCropperComponent, CropDialogData, CropDialogResult>(NgImageCropperComponent, {\n      width: '960px',\n      maxWidth: '96vw',\n      maxHeight: '95vh',\n      data,\n      disableClose: true,\n      autoFocus: false,\n      panelClass: 'cropper-dialog'\n    });\n    const result = await firstValueFrom(ref.afterClosed());\n    this.busy.set(false);\n    return result && result.event === 'done' ? result.results : [];\n  }\n\n  editItem(item: UploadItem): void {\n    if (item.status === 'uploading') {\n      this.alertService.showInfo('Wait for the upload to finish before editing.');\n      return;\n    }\n    this.openCropper([item.originalFile]).then(results => {\n      if (!results.length) { return; }\n      const r = results[0];\n      Object.assign(item, {\n        name: r.file.name,\n        type: r.file.type,\n        size: r.file.size,\n        width: r.width,\n        height: r.height,\n        file: r.file,\n        previewUrl: r.dataUrl,\n        cropped: r.cropped,\n        status: 'ready',\n        progress: 0,\n        error: undefined\n      });\n      this.touch();\n      this.alertService.showSuccess(`\"${item.name}\" updated.`);\n      if (this.cfg.autoUpload) { this.upload(item); }\n    });\n  }\n\n  // ---------- list management ----------\n\n  private addResult(r: CropResult): void {\n    const item: UploadItem = {\n      id: this.imageUtil.uid(),\n      name: r.file.name,\n      type: r.file.type,\n      size: r.file.size,\n      width: r.width,\n      height: r.height,\n      originalFile: r.originalFile,\n      file: r.file,\n      previewUrl: r.dataUrl,\n      cropped: r.cropped,\n      status: 'ready',\n      progress: 0,\n      addedAt: new Date()\n    };\n    this.items.update(list => [...list, item]);\n    if (this.cfg.autoUpload) { this.upload(item); }\n  }\n\n  private addUncropped(file: File): void {\n    this.imageUtil.fileToDataUrl(file).then(url =>\n      this.imageUtil.getImageDimensions(url).then(dim =>\n        this.addResult({ originalFile: file, file, dataUrl: url, width: dim.width, height: dim.height, cropped: false })\n      )\n    ).catch(() => this.alertService.showError(`Could not read \"${file.name}\".`));\n  }\n\n  preview(item: UploadItem): void {\n    const data: PreviewDialogData = { items: this.items(), index: this.items().indexOf(item) };\n    this.dialog.open<ImagePreviewDialogComponent, PreviewDialogData, PreviewDialogResult>(ImagePreviewDialogComponent, {\n      width: '900px',\n      maxWidth: '96vw',\n      data,\n      autoFocus: false,\n      panelClass: 'preview-dialog-panel'\n    }).afterClosed().subscribe(res => {\n      if (res?.action === 'edit') { this.editItem(res.item); }\n    });\n  }\n\n  download(item: UploadItem): void {\n    this.imageUtil.download(item.file, item.name);\n  }\n\n  remove(item: UploadItem): void {\n    this.dialogService.openConfirmDialog('Remove this image from the list?', item.name)\n      .afterClosed().subscribe(yes => {\n        if (!yes) { return; }\n        this.cancelUpload(item);\n        this.items.update(list => list.filter(i => i !== item));\n      });\n  }\n\n  clearAll(): void {\n    if (!this.items().length) { return; }\n    this.dialogService.openConfirmDialog(`Remove all ${this.items().length} images?`)\n      .afterClosed().subscribe(yes => {\n        if (!yes) { return; }\n        this.items().forEach(i => this.cancelUpload(i));\n        this.items.set([]);\n      });\n  }\n\n  reorder(event: CdkDragDrop<UploadItem[]>): void {\n    this.items.update(list => {\n      const next = [...list];\n      moveItemInArray(next, event.previousIndex, event.currentIndex);\n      return next;\n    });\n  }\n\n  // ---------- uploading ----------\n\n  upload(item: UploadItem): void {\n    if (item.status === 'uploading' || item.status === 'done') { return; }\n    item.status = 'uploading';\n    item.progress = 0;\n    item.error = undefined;\n    this.touch();\n    const sub = this.uploadService.upload(item, this.cfg.uploadUrl).subscribe({\n      next: progress => { item.progress = progress; this.touch(); },\n      error: (err: unknown) => {\n        item.status = 'error';\n        item.error = (err instanceof Error && err.message) || 'Upload failed';\n        this.uploads.delete(item.id);\n        this.touch();\n        this.alertService.showError(`\"${item.name}\" failed to upload.`);\n      },\n      complete: () => {\n        item.status = 'done';\n        item.progress = 100;\n        this.uploads.delete(item.id);\n        this.touch();\n        this.uploadComplete.emit(item);\n        this.alertService.showSuccess(`\"${item.name}\" uploaded.`);\n      }\n    });\n    this.uploads.set(item.id, sub);\n  }\n\n  uploadAll(): void {\n    const pending = this.readyItems();\n    if (!pending.length) {\n      this.alertService.showInfo('Nothing to upload.');\n      return;\n    }\n    pending.forEach(i => this.upload(i));\n  }\n\n  cancelUpload(item: UploadItem): void {\n    const sub = this.uploads.get(item.id);\n    if (sub) {\n      sub.unsubscribe();\n      this.uploads.delete(item.id);\n    }\n    if (item.status === 'uploading') {\n      item.status = 'ready';\n      item.progress = 0;\n      this.touch();\n    }\n  }\n\n  // ---------- settings ----------\n\n  onMultipleChanged(): void {\n    if (!this.cfg.multiple && this.items().length > 1) {\n      this.alertService.showInfo('Single mode keeps only the first image.');\n      this.items().slice(1).forEach(i => this.cancelUpload(i));\n      this.items.update(list => list.slice(0, 1));\n    }\n  }\n\n  formatBytes(bytes: number): string {\n    return this.imageUtil.formatBytes(bytes);\n  }\n}\n","<div class=\"page-content\">\n  <div class=\"card\">\n    <div class=\"card-body\">\n      <div class=\"card-head\">\n        <div>\n          <h5 class=\"card-title\">Photos & Videos</h5>\n          <p class=\"card-hint\">\n            {{ cfg.multiple ? 'Up to ' + cfg.maxFiles + ' images' : 'One image' }} ·\n            max {{ cfg.maxFileSizeMB }} MB each · {{ allowedTypesLabel }}\n          </p>\n        </div>\n        @if (showSettingsButton()) {\n          <button mat-icon-button (click)=\"showSettings.set(!showSettings())\" [color]=\"showSettings() ? 'primary' : undefined\"\n                  matTooltip=\"Uploader settings\" aria-label=\"Settings\">\n            <mat-icon>settings</mat-icon>\n          </button>\n        }\n      </div>\n\n      @if (showSettingsButton() && showSettings()) {\n        <div class=\"settings\">\n          <div class=\"settings-grid\">\n            <mat-slide-toggle color=\"primary\" [(ngModel)]=\"cfg.multiple\" (change)=\"onMultipleChanged()\">Multiple upload</mat-slide-toggle>\n            <mat-slide-toggle color=\"primary\" [(ngModel)]=\"cfg.cropBeforeAdd\">Crop before adding</mat-slide-toggle>\n            <mat-slide-toggle color=\"primary\" [(ngModel)]=\"cfg.allowSkipCrop\" [disabled]=\"!cfg.cropBeforeAdd\">Allow \"Use original\"</mat-slide-toggle>\n            <mat-slide-toggle color=\"primary\" [(ngModel)]=\"cfg.autoUpload\">Auto upload</mat-slide-toggle>\n            <mat-slide-toggle color=\"primary\" [(ngModel)]=\"cfg.allowReorder\" [disabled]=\"!cfg.multiple\">Drag to reorder</mat-slide-toggle>\n            <mat-slide-toggle color=\"primary\" [(ngModel)]=\"cfg.allowPaste\">Paste from clipboard</mat-slide-toggle>\n          </div>\n          <div class=\"settings-grid fields\">\n            <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n              <mat-label>Max files</mat-label>\n              <input matInput type=\"number\" min=\"1\" max=\"100\" [(ngModel)]=\"cfg.maxFiles\" [disabled]=\"!cfg.multiple\" />\n            </mat-form-field>\n            <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n              <mat-label>Max size (MB)</mat-label>\n              <input matInput type=\"number\" min=\"1\" max=\"50\" [(ngModel)]=\"cfg.maxFileSizeMB\" />\n            </mat-form-field>\n            <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n              <mat-label>Default aspect ratio</mat-label>\n              <mat-select [(ngModel)]=\"cfg.defaultAspectRatio\">\n                @for (r of aspectRatios; track r.key) {\n                  <mat-option [value]=\"r.key\">{{ r.label }}</mat-option>\n                }\n              </mat-select>\n            </mat-form-field>\n            <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n              <mat-label>Output format</mat-label>\n              <mat-select [(ngModel)]=\"cfg.outputFormat\">\n                @for (f of outputFormats; track f.value) {\n                  <mat-option [value]=\"f.value\">{{ f.label }}</mat-option>\n                }\n              </mat-select>\n            </mat-form-field>\n            <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n              <mat-label>Resize width (px, 0 = keep)</mat-label>\n              <input matInput type=\"number\" min=\"0\" step=\"10\" [(ngModel)]=\"cfg.resizeToWidth\" />\n            </mat-form-field>\n          </div>\n        </div>\n      }\n\n      <div class=\"fileuploader fileuploader-theme-dragdrop\">\n        <input id=\"input-file\" type=\"file\" #uploader [accept]=\"acceptAttr\" [multiple]=\"cfg.multiple\"\n               (change)=\"onFilesSelected($event)\" class=\"cdk-visually-hidden\" />\n        <label for=\"input-file\" class=\"fileuploader-input\" [class.drag-over]=\"isDragOver()\" [class.disabled]=\"!canAddMore || busy()\"\n               (dragover)=\"onDragOver($event)\" (dragenter)=\"onDragOver($event)\" (dragleave)=\"onDragLeave($event)\" (drop)=\"onDrop($event)\">\n          <div class=\"fileuploader-input-inner\">\n            <mat-icon class=\"fileuploader-main-icon\">{{ isDragOver() ? 'file_download' : 'cloud_upload' }}</mat-icon>\n            <h5 class=\"fileuploader-input-caption\">\n              {{ isDragOver() ? 'Release to add' : (cfg.multiple ? 'Drop files here to upload' : 'Drop a file here to upload') }}\n            </h5>\n            <p>or</p>\n            <div class=\"fileuploader-input-button\" matRipple>\n              <span>{{ cfg.multiple ? 'Browse files' : 'Browse file' }}</span>\n            </div>\n            @if (cfg.allowPaste) {\n              <p class=\"paste-hint\">You can also paste an image with <kbd>Ctrl</kbd>+<kbd>V</kbd></p>\n            }\n            @if (!canAddMore) {\n              <p class=\"limit-hint\">Limit of {{ cfg.maxFiles }} images reached. Remove one to add more.</p>\n            }\n          </div>\n        </label>\n\n        @if (items().length) {\n          <div class=\"list-toolbar\">\n            <div class=\"summary\">\n              <strong>{{ items().length }}</strong> {{ items().length === 1 ? 'image' : 'images' }} · {{ formatBytes(totalSize()) }}\n              @if (doneCount()) { <span class=\"ok\">· {{ doneCount() }} uploaded</span> }\n              @if (uploadingCount()) { <span class=\"busy\">· {{ uploadingCount() }} uploading</span> }\n            </div>\n            <div class=\"toolbar-actions\">\n              <button mat-stroked-button color=\"warn\" (click)=\"clearAll()\" [disabled]=\"uploadingCount() > 0\">\n                <mat-icon>delete_sweep</mat-icon> Clear all\n              </button>\n              <button mat-flat-button color=\"primary\" (click)=\"uploadAll()\" [disabled]=\"!readyItems().length\">\n                <mat-icon>cloud_upload</mat-icon> Upload {{ readyItems().length ? '(' + readyItems().length + ')' : '' }}\n              </button>\n            </div>\n          </div>\n        }\n\n        <div class=\"fileuploader-items\" cdkDropList (cdkDropListDropped)=\"reorder($event)\" [cdkDropListDisabled]=\"!cfg.allowReorder || !cfg.multiple\">\n          @for (item of items(); track item.id) {\n            <div class=\"fileuploader-item\" cdkDrag [cdkDragDisabled]=\"!cfg.allowReorder || !cfg.multiple\"\n                 [class.status-done]=\"item.status === 'done'\" [class.status-error]=\"item.status === 'error'\">\n              <div class=\"drag-placeholder\" *cdkDragPlaceholder></div>\n              <div class=\"columns\">\n                @if (cfg.allowReorder && cfg.multiple) {\n                  <div class=\"drag-handle\" cdkDragHandle matTooltip=\"Drag to reorder\">\n                    <mat-icon>drag_indicator</mat-icon>\n                  </div>\n                }\n                <div class=\"columns-thumbnail\" (click)=\"preview(item)\" matTooltip=\"Preview\">\n                  <img [src]=\"item.previewUrl\" [alt]=\"item.name\" />\n                  <mat-icon class=\"zoom\">zoom_in</mat-icon>\n                </div>\n                <div class=\"column-title\">\n                  <h5 [matTooltip]=\"item.name\">{{ item.name }}</h5>\n                  <div class=\"meta\">\n                    <span>{{ item.width }} × {{ item.height }}</span>\n                    <span>{{ formatBytes(item.size) }}</span>\n                    <span>{{ item.type.replace('image/', '') | uppercase }}</span>\n                    @if (item.cropped) {\n                      <span class=\"chip\"><mat-icon>crop</mat-icon>cropped</span>\n                    } @else {\n                      <span class=\"chip plain\">original</span>\n                    }\n                  </div>\n                  @if (item.status === 'uploading') {\n                    <mat-progress-bar mode=\"determinate\" [value]=\"item.progress\" color=\"primary\"></mat-progress-bar>\n                  }\n                  @if (item.status !== 'ready') {\n                    <div class=\"status\" [class.ok]=\"item.status === 'done'\" [class.err]=\"item.status === 'error'\">\n                      @switch (item.status) {\n                        @case ('uploading') { Uploading… {{ item.progress }}% }\n                        @case ('done') { <mat-icon>check_circle</mat-icon> Uploaded }\n                        @case ('error') { <mat-icon>error</mat-icon> {{ item.error }} }\n                      }\n                    </div>\n                  }\n                </div>\n                <div class=\"columns-actions\">\n                  @if (item.status === 'ready' || item.status === 'error') {\n                    <button mat-icon-button (click)=\"upload(item)\" color=\"primary\"\n                            [matTooltip]=\"item.status === 'error' ? 'Retry upload' : 'Upload'\">\n                      <mat-icon>{{ item.status === 'error' ? 'refresh' : 'cloud_upload' }}</mat-icon>\n                    </button>\n                  }\n                  @if (item.status === 'uploading') {\n                    <button mat-icon-button (click)=\"cancelUpload(item)\" matTooltip=\"Cancel upload\">\n                      <mat-icon>pause_circle_outline</mat-icon>\n                    </button>\n                  }\n                  <button mat-icon-button [matMenuTriggerFor]=\"itemMenu\" matTooltip=\"More\" aria-label=\"More actions\">\n                    <mat-icon>more_vert</mat-icon>\n                  </button>\n                  <mat-menu #itemMenu=\"matMenu\">\n                    <button mat-menu-item (click)=\"preview(item)\"><mat-icon>visibility</mat-icon><span>Preview</span></button>\n                    <button mat-menu-item (click)=\"editItem(item)\" [disabled]=\"item.status === 'uploading'\"><mat-icon>crop</mat-icon><span>{{ item.cropped ? 'Re-crop' : 'Crop' }}</span></button>\n                    <button mat-menu-item (click)=\"download(item)\"><mat-icon>download</mat-icon><span>Download</span></button>\n                    <button mat-menu-item (click)=\"remove(item)\" class=\"danger\"><mat-icon>delete</mat-icon><span>Remove</span></button>\n                  </mat-menu>\n                </div>\n              </div>\n            </div>\n          }\n        </div>\n\n        <div class=\"fileuploader-info\">\n          Image specifications\n          <mat-icon [matTooltip]=\"'Image must be less than ' + cfg.maxFileSizeMB + ' MB. Allowed file types: ' + allowedTypesLabel + '.'\"\n                    matTooltipPosition=\"after\" class=\"help\">error_outline</mat-icon>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n","/*\n * Public API Surface of angular-material-image-uploader\n */\n\nexport * from './lib/providers';\nexport * from './lib/_config/uploader.config';\nexport * from './lib/_models/upload-item.model';\nexport * from './lib/_services/alert.service';\nexport * from './lib/_services/dialog.service';\nexport * from './lib/_services/image-util.service';\nexport * from './lib/_services/upload.service';\nexport * from './lib/angular-uploader/image-uploader/image-uploader.component';\nexport * from './lib/angular-uploader/ng-image-cropper/ng-image-cropper.component';\nexport * from './lib/angular-uploader/image-preview-dialog/image-preview-dialog.component';\nexport * from './lib/angular-uploader/mat-confirm-dialog/mat-confirm-dialog.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3","i6","i4","i5","i7","i8","i10"],"mappings":"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"}