{"version":3,"file":"mayvio-ui-angular-src-fileupload.mjs","sources":["../../src/fileupload/fileupload.component.ts","../../src/fileupload/mayvio-ui-angular-src-fileupload.ts"],"sourcesContent":["import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  ElementRef,\n  ViewChild,\n  inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport 'mayvio-ui/fileupload/css';\n\n@Component({\n  selector: 'mv-fileupload',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"mv-fileupload\" [class]=\"className\">\n      <div\n        class=\"mv-fileupload-dropzone\"\n        [class.mv-fileupload-dropzone--drag-active]=\"isDragActive\"\n        [class.mv-fileupload-dropzone--disabled]=\"disabled\"\n        (dragover)=\"onDragOver($event)\"\n        (dragleave)=\"onDragLeave($event)\"\n        (drop)=\"onDrop($event)\"\n        (click)=\"fileInput.click()\"\n      >\n        <svg\n          class=\"mv-fileupload-icon\"\n          width=\"24\"\n          height=\"24\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n        >\n          <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path>\n          <polyline points=\"17 8 12 3 7 8\"></polyline>\n          <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\"></line>\n        </svg>\n        <div class=\"mv-fileupload-text\">{{ label }}</div>\n        <div class=\"mv-fileupload-hint\" *ngIf=\"hint\">{{ hint }}</div>\n\n        <input\n          #fileInput\n          type=\"file\"\n          class=\"mv-fileupload-input\"\n          [multiple]=\"multiple\"\n          [accept]=\"accept || '*'\"\n          [disabled]=\"disabled\"\n          (change)=\"onFileInputChange($event)\"\n        />\n      </div>\n\n      <div class=\"mv-fileupload-list\" *ngIf=\"files.length > 0\">\n        <div *ngFor=\"let file of files; let i = index\" class=\"mv-fileupload-item\">\n          <div class=\"mv-fileupload-item-info\">\n            <svg\n              width=\"16\"\n              height=\"16\"\n              viewBox=\"0 0 24 24\"\n              fill=\"none\"\n              stroke=\"currentColor\"\n              stroke-width=\"2\"\n              stroke-linecap=\"round\"\n              stroke-linejoin=\"round\"\n              style=\"color: var(--mv-color-text-muted); flex-shrink: 0;\"\n            >\n              <path d=\"M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z\"></path>\n              <polyline points=\"13 2 13 9 20 9\"></polyline>\n            </svg>\n            <span class=\"mv-fileupload-item-name\">{{ file.name }}</span>\n            <span class=\"mv-fileupload-item-size\">{{ formatSize(file.size) }}</span>\n          </div>\n          <button\n            type=\"button\"\n            class=\"mv-fileupload-item-remove\"\n            [attr.aria-label]=\"'Remove ' + file.name\"\n            (click)=\"removeFile(i)\"\n            [disabled]=\"disabled\"\n          >\n            <svg\n              width=\"16\"\n              height=\"16\"\n              viewBox=\"0 0 24 24\"\n              fill=\"none\"\n              stroke=\"currentColor\"\n              stroke-width=\"2\"\n              stroke-linecap=\"round\"\n              stroke-linejoin=\"round\"\n            >\n              <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n              <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n            </svg>\n          </button>\n        </div>\n      </div>\n    </div>\n  `,\n})\nexport class FileUploadComponent {\n  @Input() multiple = false;\n  @Input() accept?: string;\n  @Input() maxSize?: number;\n  @Input() disabled = false;\n  @Input() label = 'Drag and drop files here or click to browse';\n  @Input() hint = 'Max file size: 5MB';\n  @Input() className = '';\n\n  @Output() fileChange = new EventEmitter<File[]>();\n\n  @ViewChild('fileInput') fileInputRef!: ElementRef<HTMLInputElement>;\n\n  files: File[] = [];\n  isDragActive = false;\n  private cdr = inject(ChangeDetectorRef);\n\n  onDragOver(e: DragEvent) {\n    e.preventDefault();\n    if (!this.disabled) {\n      this.isDragActive = true;\n      this.cdr.markForCheck();\n    }\n  }\n\n  onDragLeave(e: DragEvent) {\n    e.preventDefault();\n    this.isDragActive = false;\n    this.cdr.markForCheck();\n  }\n\n  onDrop(e: DragEvent) {\n    e.preventDefault();\n    this.isDragActive = false;\n    if (this.disabled) return;\n\n    if (e.dataTransfer?.files && e.dataTransfer.files.length > 0) {\n      this.handleFiles(e.dataTransfer.files);\n    }\n    this.cdr.markForCheck();\n  }\n\n  onFileInputChange(e: Event) {\n    const target = e.target as HTMLInputElement;\n    if (target.files && target.files.length > 0) {\n      this.handleFiles(target.files);\n    }\n    if (this.fileInputRef?.nativeElement) {\n      this.fileInputRef.nativeElement.value = '';\n    }\n  }\n\n  handleFiles(fileList: FileList) {\n    let validFiles = Array.from(fileList);\n\n    if (this.maxSize) {\n      validFiles = validFiles.filter((f) => f.size <= this.maxSize!);\n    }\n\n    if (!this.multiple && validFiles.length > 0) {\n      validFiles = [validFiles[0]];\n    }\n\n    this.files = this.multiple ? [...this.files, ...validFiles] : validFiles;\n    this.fileChange.emit(this.files);\n    this.cdr.markForCheck();\n  }\n\n  removeFile(index: number) {\n    this.files.splice(index, 1);\n    this.files = [...this.files];\n    this.fileChange.emit(this.files);\n    this.cdr.markForCheck();\n  }\n\n  formatSize(bytes: number): string {\n    if (bytes === 0) return '0 B';\n    const k = 1024;\n    const sizes = ['B', 'KB', 'MB', 'GB'];\n    const i = Math.floor(Math.log(bytes) / Math.log(k));\n    return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i];\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}