ngx-kit 6.3.0 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/README.md +3 -3
  2. package/angle-selector/README.md +34 -34
  3. package/box-shadow/README.md +33 -33
  4. package/color-picker/README.md +52 -49
  5. package/data-table/README.md +120 -113
  6. package/date-picker/README.md +74 -69
  7. package/dialog/README.md +92 -92
  8. package/drag-resize/README.md +55 -0
  9. package/dropzone/README.md +422 -422
  10. package/fesm2022/ngx-kit-angle-selector.mjs +2 -2
  11. package/fesm2022/ngx-kit-angle-selector.mjs.map +1 -1
  12. package/fesm2022/ngx-kit-box-shadow.mjs +2 -2
  13. package/fesm2022/ngx-kit-box-shadow.mjs.map +1 -1
  14. package/fesm2022/ngx-kit-color-picker.mjs +265 -73
  15. package/fesm2022/ngx-kit-color-picker.mjs.map +1 -1
  16. package/fesm2022/ngx-kit-data-table.mjs +2 -2
  17. package/fesm2022/ngx-kit-data-table.mjs.map +1 -1
  18. package/fesm2022/ngx-kit-date-picker.mjs +7 -9
  19. package/fesm2022/ngx-kit-date-picker.mjs.map +1 -1
  20. package/fesm2022/ngx-kit-dialog.mjs +3 -3
  21. package/fesm2022/ngx-kit-dialog.mjs.map +1 -1
  22. package/fesm2022/ngx-kit-drag-resize.mjs +1664 -0
  23. package/fesm2022/ngx-kit-drag-resize.mjs.map +1 -0
  24. package/fesm2022/ngx-kit-drawer-menu.mjs +389 -285
  25. package/fesm2022/ngx-kit-drawer-menu.mjs.map +1 -1
  26. package/fesm2022/ngx-kit-dropzone.mjs +2 -2
  27. package/fesm2022/ngx-kit-dropzone.mjs.map +1 -1
  28. package/fesm2022/ngx-kit-form-field.mjs +3 -5
  29. package/fesm2022/ngx-kit-form-field.mjs.map +1 -1
  30. package/fesm2022/ngx-kit-gallery.mjs +2 -2
  31. package/fesm2022/ngx-kit-gallery.mjs.map +1 -1
  32. package/fesm2022/ngx-kit-gradient-picker.mjs.map +1 -1
  33. package/fesm2022/ngx-kit-grid-layout.mjs +927 -0
  34. package/fesm2022/ngx-kit-grid-layout.mjs.map +1 -0
  35. package/fesm2022/ngx-kit-image-editor.mjs.map +1 -1
  36. package/fesm2022/ngx-kit-menu.mjs +8 -8
  37. package/fesm2022/ngx-kit-menu.mjs.map +1 -1
  38. package/fesm2022/ngx-kit-message.mjs.map +1 -1
  39. package/fesm2022/ngx-kit-notify.mjs +2 -2
  40. package/fesm2022/ngx-kit-notify.mjs.map +1 -1
  41. package/fesm2022/ngx-kit-shared.mjs +54 -3
  42. package/fesm2022/ngx-kit-shared.mjs.map +1 -1
  43. package/fesm2022/ngx-kit-time-picker.mjs +2 -2
  44. package/fesm2022/ngx-kit-time-picker.mjs.map +1 -1
  45. package/fesm2022/ngx-kit-virtual-scroll.mjs +392 -0
  46. package/fesm2022/ngx-kit-virtual-scroll.mjs.map +1 -0
  47. package/fesm2022/ngx-kit-webflow.mjs +709 -0
  48. package/fesm2022/ngx-kit-webflow.mjs.map +1 -0
  49. package/gallery/README.md +71 -71
  50. package/gradient-picker/README.md +41 -41
  51. package/grid-layout/README.md +64 -0
  52. package/image-editor/README.md +12 -12
  53. package/menu/README.md +85 -85
  54. package/message/README.md +70 -70
  55. package/notify/README.md +56 -58
  56. package/package.json +17 -1
  57. package/shared/README.md +117 -117
  58. package/time-picker/README.md +89 -95
  59. package/types/ngx-kit-color-picker.d.ts +72 -16
  60. package/types/ngx-kit-drag-resize.d.ts +368 -0
  61. package/types/ngx-kit-drawer-menu.d.ts +135 -86
  62. package/types/ngx-kit-grid-layout.d.ts +310 -0
  63. package/types/ngx-kit-image-editor.d.ts +1 -1
  64. package/types/ngx-kit-shared.d.ts +12 -1
  65. package/types/ngx-kit-virtual-scroll.d.ts +179 -0
  66. package/types/ngx-kit-webflow.d.ts +286 -0
  67. package/virtual-scroll/README.md +199 -0
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-kit-drawer-menu.mjs","sources":["../../../projects/libs/drawer-menu/components/drawer-menu.component.ts","../../../projects/libs/drawer-menu/components/drawer-menu.component.html","../../../projects/libs/drawer-menu/ngx-kit-drawer-menu.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n DOCUMENT,\n DestroyRef,\n computed,\n effect,\n inject,\n input,\n model,\n signal,\n} from '@angular/core';\nimport { DirectionService } from 'ngx-kit/shared';\nimport {\n NgxDrawerEffect,\n NgxDrawerMode,\n NgxDrawerResponsiveBehavior,\n NgxDrawerResponsiveConfig,\n NgxDrawerSide,\n} from '../contracts/drawer-menu-types';\n\n/**\n * Structural (not reference) equality for the `responsive` config.\n *\n * Consumers are expected to pass this as an inline object literal (see README),\n * which means the parent template creates a brand-new object on every change\n * detection run. Without this comparator, the `responsive` input signal sees a\n * \"change\" on every such run even when nothing actually changed, which re-triggers\n * the viewport-sync effect and forcibly resets `open` back to the configured\n * desktop/mobile default — silently overriding whatever the user just did by\n * dragging, clicking, or toggling the drawer.\n */\nfunction responsiveConfigsEqual(\n a: NgxDrawerResponsiveConfig,\n b: NgxDrawerResponsiveConfig,\n): boolean {\n return (\n a === b ||\n (a.mode === b.mode &&\n a.breakpoint === b.breakpoint &&\n a.desktopOpen === b.desktopOpen &&\n a.mobileOpen === b.mobileOpen &&\n a.desktopBehavior === b.desktopBehavior &&\n a.mobileBehavior === b.mobileBehavior &&\n a.respectPinned === b.respectPinned)\n );\n}\n\n@Component({\n selector: 'ngx-drawer-menu',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './drawer-menu.component.html',\n styleUrl: './drawer-menu.component.scss',\n host: {\n class: 'ngx-drawer-menu-host',\n '(keydown.escape)': 'onEscape()',\n },\n})\nexport class NgxDrawerMenuComponent {\n readonly side = input<NgxDrawerSide>('start');\n readonly mode = input<NgxDrawerMode>('overlay');\n /** When responsive mode is active, desktop/mobile can use different layout behavior. */\n readonly desktopBehavior = input<NgxDrawerResponsiveBehavior>('dock');\n readonly mobileBehavior = input<NgxDrawerResponsiveBehavior>('overlay');\n private readonly responsiveDesktopBehavior = signal<NgxDrawerResponsiveBehavior | null>(null);\n private readonly responsiveMobileBehavior = signal<NgxDrawerResponsiveBehavior | null>(null);\n readonly effect = input<NgxDrawerEffect>('fabric');\n\n readonly width = input<number>(300);\n readonly maxWidth = input<number>(420);\n readonly edgeSize = input<number>(34);\n readonly dragThreshold = input<number>(0.38);\n readonly velocityThreshold = input<number>(0.45);\n\n /** Opens/closes the panel from the edge and while the panel itself is dragged. */\n readonly swipeEnabled = input<boolean>(true);\n /** Allows closing by clicking the backdrop. */\n readonly backdropClose = input<boolean>(true);\n /** Allows Escape to close the drawer. */\n readonly escapeClose = input<boolean>(true);\n\n /** The drawer starts open unless explicitly configured otherwise. */\n readonly open = model<boolean>(true);\n /** Pinned drawers are intended for persistent desktop navigation. */\n readonly pinned = model<boolean>(false);\n\n /** Responsive behavior. Can be overridden with individual inputs below. */\n readonly responsive = input<NgxDrawerResponsiveConfig>(\n {\n mode: 'auto',\n breakpoint: 768,\n desktopOpen: true,\n mobileOpen: false,\n respectPinned: true,\n desktopBehavior: 'dock',\n mobileBehavior: 'overlay',\n } as any,\n // { equal: responsiveConfigsEqual },\n );\n\n /** Convenience aliases for the common responsive configuration. */\n readonly respondToViewport = input<boolean>(true);\n readonly mobileBreakpoint = input<number>(768);\n readonly openOnDesktop = input<boolean>(true);\n readonly openOnMobile = input<boolean>(false);\n\n /** Visual tuning. */\n readonly curtainStrips = input<number>(9);\n readonly backdropOpacity = input<number>(0.46);\n readonly transitionMs = input<number>(420);\n readonly focusOnOpen = input<boolean>(true);\n\n protected readonly dragProgress = signal<number | null>(null);\n protected readonly dragVelocity = signal<number>(0);\n protected readonly isMobile = signal<boolean>(false);\n protected readonly effectiveBehavior = computed<NgxDrawerResponsiveBehavior>(() => {\n if (!this.respondToViewport() || this.responsive().mode === 'off') {\n return this.mode() === 'push' ? 'dock' : 'overlay';\n }\n return this.isMobile()\n ? (this.responsiveMobileBehavior() ?? this.mobileBehavior())\n : (this.responsiveDesktopBehavior() ?? this.desktopBehavior());\n });\n protected readonly isDocked = computed(() =>\n this.respondToViewport() ? this.effectiveBehavior() === 'dock' : this.mode() === 'push',\n );\n protected readonly usesOverlay = computed(() => !this.isDocked());\n protected readonly isDragging = computed(() => this.dragProgress() !== null);\n protected readonly progress = computed(() => this.dragProgress() ?? (this.open() ? 1 : 0));\n protected readonly isActuallyOpen = computed(() => this.progress() > 0.001);\n protected readonly strips = computed(() =>\n Array.from({ length: Math.max(3, this.curtainStrips()) }, (_, i) => i),\n );\n\n /** Physical side: true means the drawer is attached to the physical left edge. */\n protected readonly isPhysicalLeft = computed(() => {\n const rtl = this.directionService.isRtl();\n return this.side() === 'start' ? !rtl : rtl;\n });\n\n protected readonly physicalSign = computed(() => (this.isPhysicalLeft() ? 1 : -1));\n protected readonly effectiveMode = computed<NgxDrawerMode>(() => {\n if (!this.respondToViewport() || this.responsive().mode === 'off') return this.mode();\n return this.effectiveBehavior() === 'dock' ? 'push' : 'overlay';\n });\n protected readonly duration = computed(() => `${this.transitionMs()}ms`);\n\n private readonly directionService = inject(DirectionService);\n private readonly document = inject(DOCUMENT);\n private readonly destroyRef = inject(DestroyRef);\n\n private pointerId: number | null = null;\n private dragStartX = 0;\n private dragStartProgress = 0;\n private dragLastX = 0;\n private dragLastTime = 0;\n private lastVelocity = 0;\n private activePointerTarget: HTMLElement | null = null;\n private resizeObserver?: ResizeObserver;\n private mediaQuery?: MediaQueryList;\n private mediaQueryListener?: (event: MediaQueryListEvent) => void;\n private lastManagedViewportState: boolean | null = null;\n\n constructor() {\n effect((onCleanup) => {\n const locked = this.open() && this.effectiveMode() === 'overlay';\n if (!locked) return;\n\n const body = this.document.body;\n const previous = body.style.overflow;\n body.style.overflow = 'hidden';\n onCleanup(() => (body.style.overflow = previous));\n });\n\n effect(() => {\n const config = this.responsive();\n const enabled = this.respondToViewport() && config.mode !== 'off';\n const breakpoint = config.breakpoint ?? this.mobileBreakpoint();\n const desktopOpen = config.desktopOpen ?? this.openOnDesktop();\n const mobileOpen = config.mobileOpen ?? this.openOnMobile();\n const desktopBehavior = config.desktopBehavior ?? this.desktopBehavior();\n const mobileBehavior = config.mobileBehavior ?? this.mobileBehavior();\n this.responsiveDesktopBehavior.set(desktopBehavior);\n this.responsiveMobileBehavior.set(mobileBehavior);\n\n this.setupViewportSync(\n enabled,\n breakpoint,\n desktopOpen,\n mobileOpen,\n config.respectPinned ?? true,\n );\n });\n\n this.destroyRef.onDestroy(() => {\n this.disposePointer();\n this.disposeViewportSync();\n });\n }\n\n toggle(): void {\n if (this.pinned() && this.open()) return;\n this.open.update((value) => !value);\n }\n\n openDrawer(): void {\n this.open.set(true);\n }\n\n closeDrawer(): void {\n if (!this.pinned()) this.open.set(false);\n }\n\n pin(): void {\n this.pinned.set(true);\n this.open.set(true);\n }\n\n unpin(): void {\n this.pinned.set(false);\n }\n\n protected onEscape(): void {\n if (this.escapeClose() && !this.pinned()) this.closeDrawer();\n }\n\n protected onBackdropPointerDown(event: PointerEvent): void {\n if (!this.backdropClose() || this.pinned() || !this.usesOverlay()) return;\n event.preventDefault();\n this.closeDrawer();\n }\n\n protected onEdgePointerDown(event: PointerEvent): void {\n if (!this.swipeEnabled() || this.open() || this.pinned()) return;\n this.beginDrag(event, 0);\n }\n\n protected onPanelPointerDown(event: PointerEvent): void {\n if (!this.swipeEnabled() || !this.open() || this.pinned()) return;\n if (event.button !== 0) return;\n this.beginDrag(event, 1);\n }\n\n private beginDrag(event: PointerEvent, startProgress: number): void {\n if (this.pointerId !== null) return;\n\n const target = event.currentTarget as HTMLElement | null;\n if (!target) return;\n\n this.pointerId = event.pointerId;\n this.activePointerTarget = target;\n this.dragStartX = event.clientX;\n this.dragLastX = event.clientX;\n this.dragLastTime = performance.now();\n this.dragStartProgress = startProgress;\n this.lastVelocity = 0;\n this.dragProgress.set(startProgress);\n\n target.setPointerCapture?.(event.pointerId);\n event.preventDefault();\n\n target.addEventListener('pointermove', this.onPointerMove);\n target.addEventListener('pointerup', this.onPointerUp);\n target.addEventListener('pointercancel', this.onPointerCancel);\n }\n\n private readonly onPointerMove = (event: PointerEvent): void => {\n if (event.pointerId !== this.pointerId) return;\n\n const now = performance.now();\n const dx = event.clientX - this.dragStartX;\n const signedDistance = dx * this.physicalSign();\n const next = this.clamp01(this.dragStartProgress + signedDistance / this.width());\n\n const dt = Math.max(8, now - this.dragLastTime);\n this.lastVelocity = ((event.clientX - this.dragLastX) * this.physicalSign()) / dt;\n this.dragVelocity.set(this.lastVelocity);\n this.dragLastX = event.clientX;\n this.dragLastTime = now;\n\n this.dragProgress.set(next);\n event.preventDefault();\n };\n\n private readonly onPointerUp = (event: PointerEvent): void => {\n if (event.pointerId !== this.pointerId) return;\n\n const progress = this.dragProgress() ?? this.dragStartProgress;\n const velocity = this.dragVelocity();\n const opening = velocity > this.velocityThreshold();\n const closing = velocity < -this.velocityThreshold();\n\n let shouldOpen: boolean;\n if (opening) shouldOpen = true;\n else if (closing) shouldOpen = false;\n else shouldOpen = progress >= this.dragThreshold();\n\n this.open.set(shouldOpen);\n this.dragProgress.set(null);\n this.dragVelocity.set(0);\n this.disposePointer(event.pointerId);\n };\n\n private readonly onPointerCancel = (event: PointerEvent): void => {\n if (event.pointerId !== this.pointerId) return;\n const progress = this.dragProgress() ?? this.dragStartProgress;\n this.open.set(progress >= 0.5);\n this.dragProgress.set(null);\n this.dragVelocity.set(0);\n this.disposePointer(event.pointerId);\n };\n\n private disposePointer(pointerId?: number): void {\n if (pointerId !== undefined && this.pointerId !== pointerId) return;\n\n const target = this.activePointerTarget;\n if (target) {\n target.removeEventListener('pointermove', this.onPointerMove);\n target.removeEventListener('pointerup', this.onPointerUp);\n target.removeEventListener('pointercancel', this.onPointerCancel);\n if (this.pointerId !== null) {\n try {\n target.releasePointerCapture?.(this.pointerId);\n } catch {\n // Pointer capture may already be released by the browser.\n }\n }\n }\n\n this.pointerId = null;\n this.activePointerTarget = null;\n }\n\n private setupViewportSync(\n enabled: boolean,\n breakpoint: number,\n desktopOpen: boolean,\n mobileOpen: boolean,\n respectPinned: boolean,\n ): void {\n this.disposeViewportSync();\n if (!enabled || typeof window === 'undefined') {\n this.isMobile.set(false);\n return;\n }\n\n this.mediaQuery = window.matchMedia(`(max-width: ${Math.max(0, breakpoint - 0.02)}px)`);\n\n const apply = (isMobile: boolean) => {\n this.isMobile.set(isMobile);\n if (respectPinned && this.pinned()) return;\n\n const next = isMobile ? mobileOpen : desktopOpen;\n if (this.lastManagedViewportState === next) return;\n this.lastManagedViewportState = next;\n this.open.set(next);\n };\n\n apply(this.mediaQuery.matches);\n this.mediaQueryListener = (event) => apply(event.matches);\n this.mediaQuery.addEventListener('change', this.mediaQueryListener);\n }\n\n private disposeViewportSync(): void {\n if (this.mediaQuery && this.mediaQueryListener) {\n this.mediaQuery.removeEventListener('change', this.mediaQueryListener);\n }\n this.mediaQuery = undefined;\n this.mediaQueryListener = undefined;\n this.lastManagedViewportState = null;\n }\n\n private clamp01(value: number): number {\n return Math.max(0, Math.min(1, value));\n }\n}\n","<div\n class=\"ngx-drawer\"\n [class.is-open]=\"isActuallyOpen()\"\n [class.is-dragging]=\"isDragging()\"\n [class.is-pinned]=\"pinned()\"\n [class.is-docked]=\"isDocked()\"\n [class.is-overlay]=\"usesOverlay()\"\n [class.side-start]=\"side() === 'start'\"\n [class.side-end]=\"side() === 'end'\"\n [class.physical-left]=\"isPhysicalLeft()\"\n [class.physical-right]=\"!isPhysicalLeft()\"\n [class.mode-overlay]=\"effectiveMode() === 'overlay'\"\n [class.mode-push]=\"effectiveMode() === 'push'\"\n [class.mode-reveal]=\"effectiveMode() === 'reveal'\"\n [class.effect-slide]=\"effect() === 'slide'\"\n [class.effect-spring]=\"effect() === 'spring'\"\n [class.effect-fabric]=\"effect() === 'fabric'\"\n [class.effect-curtain]=\"effect() === 'curtain'\"\n [class.effect-elastic]=\"effect() === 'elastic'\"\n [class.effect-reveal]=\"effect() === 'reveal'\"\n [style.--ngx-progress]=\"progress()\"\n [style.--ngx-width.px]=\"width()\"\n [style.--ngx-edge-size.px]=\"edgeSize()\"\n [style.--ngx-max-width.px]=\"maxWidth()\"\n [style.--ngx-duration]=\"duration()\"\n [style.--ngx-backdrop-opacity]=\"backdropOpacity()\"\n [style.--ngx-physical-sign]=\"physicalSign()\"\n [style.--ngx-closed-translate.px]=\"(1 - progress()) * -width() * physicalSign()\"\n [style.--ngx-transform-origin]=\"isPhysicalLeft() ? 'left center' : 'right center'\"\n [style.--ngx-fabric-skew]=\"(1 - progress()) * 10 + 'deg'\">\n @if (swipeEnabled() && !isActuallyOpen() && !pinned()) {\n <div\n class=\"ngx-drawer-edge-zone\"\n [class.edge-start]=\"side() === 'start'\"\n [class.edge-end]=\"side() === 'end'\"\n (pointerdown)=\"onEdgePointerDown($event)\"\n aria-hidden=\"true\"></div>\n }\n\n @if (isActuallyOpen() && usesOverlay()) {\n <button\n class=\"ngx-drawer-backdrop\"\n type=\"button\"\n tabindex=\"-1\"\n aria-label=\"Close navigation\"\n (pointerdown)=\"onBackdropPointerDown($event)\"></button>\n }\n\n <main class=\"ngx-drawer-main\">\n <ng-content></ng-content>\n </main>\n\n <aside\n class=\"ngx-drawer-panel\"\n [attr.aria-hidden]=\"!isActuallyOpen()\"\n [attr.inert]=\"!isActuallyOpen() ? '' : null\"\n role=\"navigation\">\n <div class=\"ngx-drawer-fabric\" aria-hidden=\"true\">\n <div class=\"ngx-fabric-fold fold-1\"></div>\n <div class=\"ngx-fabric-fold fold-2\"></div>\n <div class=\"ngx-fabric-fold fold-3\"></div>\n <div class=\"ngx-fabric-fold fold-4\"></div>\n <div class=\"ngx-fabric-edge\"></div>\n </div>\n\n <!-- Full-height drag affordance at the physical edge of the panel. -->\n @if (swipeEnabled() && !pinned()) {\n <div\n class=\"ngx-drawer-drag-handle\"\n [class.handle-start]=\"side() === 'start'\"\n [class.handle-end]=\"side() === 'end'\"\n (pointerdown)=\"onPanelPointerDown($event)\"\n aria-hidden=\"true\">\n <span></span>\n </div>\n }\n\n <div class=\"ngx-drawer-inner\">\n <div class=\"ngx-drawer-content\">\n <ng-content select=\"[drawerContent]\"></ng-content>\n </div>\n </div>\n\n @if (effect() === 'curtain') {\n <div class=\"ngx-drawer-curtain\" aria-hidden=\"true\">\n @for (i of strips(); track i) {\n <span\n class=\"ngx-drawer-strip\"\n [style.--strip-index]=\"i\"\n [style.--strip-count]=\"curtainStrips()\"></span>\n }\n </div>\n }\n </aside>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngx-kit-drawer-menu.mjs","sources":["../../../projects/libs/drawer-menu/contracts/drawer-menu-types.ts","../../../projects/libs/drawer-menu/components/drawer-menu.component.ts","../../../projects/libs/drawer-menu/components/drawer-menu.component.html","../../../projects/libs/drawer-menu/ngx-kit-drawer-menu.ts"],"sourcesContent":["/** Logical drawer placement. `start` is right in RTL and left in LTR. */\nexport type NgxDrawerSide = 'start' | 'end';\n\n/** Visual physics used by the drawer while opening/closing. */\nexport type NgxDrawerEffect =\n | 'none'\n | 'fabric'\n | 'slide'\n | 'push'\n | 'scale';\n\nexport type NgxDrawerBehavior =\n | 'dock'\n | 'overlay';\n\nexport type NgxDrawerResponsiveMode =\n | 'auto'\n | 'desktop'\n | 'mobile';\n\nexport interface NgxDrawerResponsive {\n /**\n * auto:\n * breakpoint determines desktop/mobile mode\n *\n * desktop:\n * always desktop\n *\n * mobile:\n * always mobile\n */\n mode?: NgxDrawerResponsiveMode;\n\n /**\n * Width at which the drawer switches\n * between desktop and mobile.\n */\n breakpoint?: number;\n\n /**\n * Initial/default state on desktop.\n */\n desktopOpen?: boolean;\n\n /**\n * Initial/default state on mobile.\n */\n mobileOpen?: boolean;\n\n /**\n * Desktop drawer behavior.\n */\n desktopBehavior?: NgxDrawerBehavior;\n\n /**\n * Mobile drawer behavior.\n */\n mobileBehavior?: NgxDrawerBehavior;\n\n /**\n * If true, pinned state is preserved\n * when switching between desktop/mobile.\n */\n respectPinned?: boolean;\n}\n\nexport const DEFAULT_DRAWER_RESPONSIVE: Required<NgxDrawerResponsive> = {\n mode: 'auto',\n breakpoint: 960,\n desktopOpen: true,\n mobileOpen: false,\n desktopBehavior: 'dock',\n mobileBehavior: 'overlay',\n respectPinned: true,\n};","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n HostBinding,\n PLATFORM_ID,\n Renderer2,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n model,\n signal,\n} from '@angular/core';\n\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n DEFAULT_DRAWER_RESPONSIVE,\n NgxDrawerBehavior,\n NgxDrawerEffect,\n NgxDrawerResponsive,\n NgxDrawerSide,\n} from '../contracts/drawer-menu-types';\n\n@Component({\n selector: 'ngx-drawer-menu',\n standalone: true,\n templateUrl: './drawer-menu.component.html',\n styleUrl: './drawer-menu.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgxDrawerMenuComponent {\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n private readonly renderer = inject(Renderer2);\n private readonly destroyRef = inject(DestroyRef);\n private readonly platformId = inject(PLATFORM_ID);\n\n // ---------------------------------------------------------------------------\n // Inputs\n // ---------------------------------------------------------------------------\n\n readonly side = input<NgxDrawerSide>('start');\n\n readonly effect = input<NgxDrawerEffect>('fabric');\n\n readonly width = input<number | string>(300);\n\n /**\n * Main drawer state.\n *\n * Usage:\n *\n * [(open)]=\"sidebarOpen\"\n */\n readonly open = model<boolean>(false);\n\n /**\n * Pinned state.\n *\n * Useful for desktop layouts.\n *\n * [(pinned)]=\"sidebarPinned\"\n */\n readonly pinned = model<boolean>(false);\n\n readonly responsive = input<NgxDrawerResponsive>(DEFAULT_DRAWER_RESPONSIVE);\n\n /**\n * Whether clicking backdrop closes drawer.\n */\n readonly closeOnBackdrop = input(true);\n\n /**\n * Whether Escape closes drawer.\n */\n readonly closeOnEscape = input(true);\n\n /**\n * Whether body scrolling should be locked\n * while an overlay drawer is open.\n */\n readonly lockBodyScroll = input(true);\n\n /**\n * Animation duration in milliseconds.\n */\n readonly animationDuration = input(280);\n\n /**\n * z-index.\n */\n readonly zIndex = input(1000);\n\n // ---------------------------------------------------------------------------\n // Internal state\n // ---------------------------------------------------------------------------\n\n private readonly isBrowser = isPlatformBrowser(this.platformId);\n\n readonly isMobile = signal(false);\n\n readonly initialized = signal(false);\n\n /**\n * Used to avoid applying responsive defaults repeatedly.\n */\n private previousResponsiveMode: 'desktop' | 'mobile' | null = null;\n\n private mediaQuery?: MediaQueryList;\n\n private removeMediaQueryListener?: () => void;\n\n // ---------------------------------------------------------------------------\n // Computed\n // ---------------------------------------------------------------------------\n\n readonly responsiveConfig = computed(() => {\n const config = this.responsive();\n\n return {\n ...DEFAULT_DRAWER_RESPONSIVE,\n ...config,\n };\n });\n\n readonly currentMode = computed<'desktop' | 'mobile'>(() => {\n const config = this.responsiveConfig();\n\n if (config.mode === 'desktop') {\n return 'desktop';\n }\n\n if (config.mode === 'mobile') {\n return 'mobile';\n }\n\n return this.isMobile() ? 'mobile' : 'desktop';\n });\n\n readonly currentBehavior = computed<NgxDrawerBehavior>(() => {\n const config = this.responsiveConfig();\n\n return this.currentMode() === 'mobile' ? config.mobileBehavior : config.desktopBehavior;\n });\n\n readonly isOverlay = computed(() => {\n return this.currentBehavior() === 'overlay';\n });\n\n readonly isDocked = computed(() => {\n return this.currentBehavior() === 'dock';\n });\n\n readonly shouldShowBackdrop = computed(() => {\n return this.isOverlay() && this.open();\n });\n\n readonly drawerWidth = computed(() => {\n const width = this.width();\n\n if (typeof width === 'number') {\n return `${width}px`;\n }\n\n return width;\n });\n\n readonly drawerVisible = computed(() => {\n return this.open();\n });\n\n readonly shouldPreservePinned = computed(() => {\n return this.responsiveConfig().respectPinned;\n });\n\n readonly isPinnedAndDesktop = computed(() => {\n return this.currentMode() === 'desktop' && this.pinned() && this.shouldPreservePinned();\n });\n\n // ---------------------------------------------------------------------------\n // Host bindings\n // ---------------------------------------------------------------------------\n\n @HostBinding('class.drawer-start')\n get drawerStart(): boolean {\n return this.side() === 'start';\n }\n\n @HostBinding('class.drawer-end')\n get drawerEnd(): boolean {\n return this.side() === 'end';\n }\n\n @HostBinding('class.drawer-open')\n get drawerOpen(): boolean {\n return this.open();\n }\n\n @HostBinding('class.drawer-mobile')\n get drawerMobile(): boolean {\n return this.currentMode() === 'mobile';\n }\n\n @HostBinding('class.drawer-desktop')\n get drawerDesktop(): boolean {\n return this.currentMode() === 'desktop';\n }\n\n @HostBinding('class.drawer-overlay')\n get drawerOverlay(): boolean {\n return this.isOverlay();\n }\n\n @HostBinding('class.drawer-dock')\n get drawerDock(): boolean {\n return this.isDocked();\n }\n\n @HostBinding('style.--ngx-drawer-width')\n get hostWidth(): string {\n return this.drawerWidth();\n }\n\n @HostBinding('style.--ngx-drawer-duration')\n get hostDuration(): string {\n return `${this.animationDuration()}ms`;\n }\n\n @HostBinding('style.--ngx-drawer-z-index')\n get hostZIndex(): number {\n return this.zIndex();\n }\n\n @HostBinding('class.effect-none')\n get effectNone(): boolean {\n return this.effect() === 'none';\n }\n\n @HostBinding('class.effect-fabric')\n get effectFabric(): boolean {\n return this.effect() === 'fabric';\n }\n\n @HostBinding('class.effect-slide')\n get effectSlide(): boolean {\n return this.effect() === 'slide';\n }\n\n @HostBinding('class.effect-push')\n get effectPush(): boolean {\n return this.effect() === 'push';\n }\n\n @HostBinding('class.effect-scale')\n get effectScale(): boolean {\n return this.effect() === 'scale';\n }\n\n // ---------------------------------------------------------------------------\n // Constructor\n // ---------------------------------------------------------------------------\n\n constructor() {\n this.setupResponsive();\n\n effect(() => {\n const mode = this.currentMode();\n\n if (!this.initialized()) {\n return;\n }\n\n this.handleResponsiveModeChange(mode);\n });\n\n effect(() => {\n const shouldLock = this.lockBodyScroll();\n const shouldLockNow = this.isOverlay() && this.open();\n\n if (!shouldLock) {\n return;\n }\n\n if (shouldLockNow) {\n this.lockScroll();\n } else {\n this.unlockScroll();\n }\n });\n\n this.destroyRef.onDestroy(() => {\n this.destroyResponsive();\n\n this.unlockScroll();\n });\n }\n\n // ---------------------------------------------------------------------------\n // Responsive\n // ---------------------------------------------------------------------------\n\n private setupResponsive(): void {\n if (!this.isBrowser) {\n return;\n }\n\n afterNextRender(() => {\n this.setupMediaQuery();\n\n this.initialized.set(true);\n\n const mode = this.currentMode();\n\n this.previousResponsiveMode = mode;\n\n this.applyInitialResponsiveState(mode);\n });\n }\n\n private setupMediaQuery(): void {\n const config = this.responsiveConfig();\n\n if (config.mode !== 'auto') {\n this.isMobile.set(config.mode === 'mobile');\n\n return;\n }\n\n const breakpoint = config.breakpoint;\n\n this.mediaQuery = window.matchMedia(`(max-width: ${breakpoint - 0.02}px)`);\n\n this.updateMobileState();\n\n const listener = () => {\n this.updateMobileState();\n };\n\n this.mediaQuery.addEventListener('change', listener);\n\n this.removeMediaQueryListener = () => {\n this.mediaQuery?.removeEventListener('change', listener);\n };\n }\n\n private updateMobileState(): void {\n if (!this.mediaQuery) {\n return;\n }\n\n this.isMobile.set(this.mediaQuery.matches);\n }\n\n private handleResponsiveModeChange(mode: 'desktop' | 'mobile'): void {\n if (this.previousResponsiveMode === null) {\n this.previousResponsiveMode = mode;\n return;\n }\n\n if (this.previousResponsiveMode === mode) {\n return;\n }\n\n const previousMode = this.previousResponsiveMode;\n\n this.previousResponsiveMode = mode;\n\n const config = this.responsiveConfig();\n\n /**\n * If pinned should be respected,\n * don't overwrite the current open state.\n */\n if (config.respectPinned && this.pinned()) {\n return;\n }\n\n if (mode === 'desktop') {\n this.open.set(config.desktopOpen);\n } else {\n this.open.set(config.mobileOpen);\n }\n\n this.renderer.setAttribute(this.elementRef.nativeElement, 'data-previous-mode', previousMode);\n }\n\n private applyInitialResponsiveState(mode: 'desktop' | 'mobile'): void {\n const config = this.responsiveConfig();\n\n if (config.respectPinned && this.pinned()) {\n return;\n }\n\n /**\n * Don't blindly overwrite an explicitly bound\n * [(open)] value after initialization.\n *\n * The default is only applied when the model\n * has not already been initialized.\n */\n if (mode === 'desktop') {\n this.open.set(config.desktopOpen);\n } else {\n this.open.set(config.mobileOpen);\n }\n }\n\n private destroyResponsive(): void {\n this.removeMediaQueryListener?.();\n\n this.mediaQuery = undefined;\n }\n\n // ---------------------------------------------------------------------------\n // Public API\n // ---------------------------------------------------------------------------\n\n toggle(): void {\n if (this.open()) {\n this.close();\n } else {\n this.openDrawer();\n }\n }\n\n openDrawer(): void {\n this.open.set(true);\n }\n\n close(): void {\n if (this.pinned() && this.isPinnedAndDesktop()) {\n return;\n }\n\n this.open.set(false);\n }\n\n pin(): void {\n this.pinned.set(true);\n this.open.set(true);\n }\n\n unpin(): void {\n this.pinned.set(false);\n }\n\n togglePinned(): void {\n if (this.pinned()) {\n this.unpin();\n } else {\n this.pin();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Events\n // ---------------------------------------------------------------------------\n\n onBackdropClick(): void {\n if (!this.closeOnBackdrop()) {\n return;\n }\n\n this.close();\n }\n\n onKeyDown(event: KeyboardEvent): void {\n if (event.key !== 'Escape') {\n return;\n }\n\n if (!this.closeOnEscape()) {\n return;\n }\n\n if (!this.open()) {\n return;\n }\n\n this.close();\n }\n\n // ---------------------------------------------------------------------------\n // Scroll locking\n // ---------------------------------------------------------------------------\n\n private lockScroll(): void {\n if (!this.isBrowser) {\n return;\n }\n\n if (!document.body) {\n return;\n }\n\n if (document.body.dataset['ngxDrawerScrollLocked'] === 'true') {\n return;\n }\n\n this.renderer.setAttribute(document.body, 'data-ngx-drawer-scroll-locked', 'true');\n\n this.renderer.setStyle(document.body, 'overflow', 'hidden');\n }\n\n private unlockScroll(): void {\n if (!this.isBrowser) {\n return;\n }\n\n if (!document.body) {\n return;\n }\n\n if (document.body.dataset['ngxDrawerScrollLocked'] !== 'true') {\n return;\n }\n\n this.renderer.removeAttribute(document.body, 'data-ngx-drawer-scroll-locked');\n\n this.renderer.removeStyle(document.body, 'overflow');\n }\n}\n","<div\n class=\"ngx-drawer-root\"\n [class.is-open]=\"drawerVisible()\"\n [class.is-closed]=\"!drawerVisible()\"\n [class.is-overlay]=\"isOverlay()\"\n [class.is-dock]=\"isDocked()\"\n [class.is-pinned]=\"pinned()\"\n [class.is-mobile]=\"currentMode() === 'mobile'\"\n [class.is-desktop]=\"currentMode() === 'desktop'\"\n (keydown)=\"onKeyDown($event)\"\n tabindex=\"-1\">\n <!-- ===================================================================== -->\n <!-- Backdrop -->\n <!-- ===================================================================== -->\n\n @if (shouldShowBackdrop()) {\n <div class=\"ngx-drawer-backdrop\" aria-hidden=\"true\" (click)=\"onBackdropClick()\"></div>\n }\n\n <!-- ===================================================================== -->\n <!-- Drawer -->\n <!-- ===================================================================== -->\n\n <aside\n class=\"ngx-drawer\"\n [attr.aria-hidden]=\"!drawerVisible()\"\n [attr.data-side]=\"side()\"\n [attr.data-mode]=\"currentMode()\"\n [attr.data-behavior]=\"currentBehavior()\"\n [attr.data-effect]=\"effect()\"\n [attr.data-pinned]=\"pinned()\">\n <div class=\"ngx-drawer-surface\">\n <!-- Drawer Content -->\n <div class=\"ngx-drawer-content\">\n <ng-content select=\"[drawerContent]\"></ng-content>\n </div>\n </div>\n </aside>\n\n <!-- ===================================================================== -->\n <!-- Main Content -->\n <!-- ===================================================================== -->\n\n <main class=\"ngx-drawer-main\">\n <div class=\"ngx-drawer-main-content\">\n <ng-content></ng-content>\n </div>\n </main>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -500,13 +500,13 @@ class NgxDropzoneComponent {
500
500
  this.filesChange.emit(this.files().map((f) => f.file));
501
501
  }
502
502
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxDropzoneComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
503
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxDropzoneComponent, isStandalone: true, selector: "ngx-dropzone", inputs: { accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, maxFileSize: { classPropertyName: "maxFileSize", publicName: "maxFileSize", isSignal: true, isRequired: false, transformFunction: null }, maxFiles: { classPropertyName: "maxFiles", publicName: "maxFiles", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, showFileList: { classPropertyName: "showFileList", publicName: "showFileList", isSignal: true, isRequired: false, transformFunction: null }, uploadUrl: { classPropertyName: "uploadUrl", publicName: "uploadUrl", isSignal: true, isRequired: false, transformFunction: null }, uploadAlias: { classPropertyName: "uploadAlias", publicName: "uploadAlias", isSignal: true, isRequired: false, transformFunction: null }, autoUpload: { classPropertyName: "autoUpload", publicName: "autoUpload", isSignal: true, isRequired: false, transformFunction: null }, maxParallel: { classPropertyName: "maxParallel", publicName: "maxParallel", isSignal: true, isRequired: false, transformFunction: null }, uploadMode: { classPropertyName: "uploadMode", publicName: "uploadMode", isSignal: true, isRequired: false, transformFunction: null }, uploadData: { classPropertyName: "uploadData", publicName: "uploadData", isSignal: true, isRequired: false, transformFunction: null }, uploadHeaders: { classPropertyName: "uploadHeaders", publicName: "uploadHeaders", isSignal: true, isRequired: false, transformFunction: null }, uploadWithCredentials: { classPropertyName: "uploadWithCredentials", publicName: "uploadWithCredentials", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { filesAdded: "filesAdded", filesRejected: "filesRejected", filesChange: "filesChange", uploadStarted: "uploadStarted", uploadProgress: "uploadProgress", uploadSuccess: "uploadSuccess", uploadError: "uploadError" }, host: { classAttribute: "ngx-dropzone-host" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\r\n class=\"ngx-dropzone\"\r\n [class.dragging]=\"isDragging()\"\r\n [class.disabled]=\"disabled()\"\r\n [class.has-files]=\"files().length > 0\"\r\n tabindex=\"0\"\r\n role=\"button\"\r\n [attr.aria-disabled]=\"disabled()\"\r\n (click)=\"onBrowseClick()\"\r\n (keydown)=\"onKeydown($event)\"\r\n (dragenter)=\"onDragEnter($event)\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\">\r\n <input\r\n #fileInput\r\n type=\"file\"\r\n class=\"ngx-dropzone-input\"\r\n [accept]=\"accept()\"\r\n [multiple]=\"multiple()\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"onFileInputChange($event)\" />\r\n\r\n <div class=\"ngx-dropzone-icon-wrap\">\r\n <ng-content select=\"[dropzone-icon]\">\r\n <svg class=\"ngx-dropzone-icon\" viewBox=\"0 0 24 24\" fill=\"none\" width=\"30\" height=\"30\">\r\n <path\r\n d=\"M12 16V4M12 4l-4 4M12 4l4 4M4 16v2a2 2 0 002 2h12a2 2 0 002-2v-2\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.8\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </ng-content>\r\n </div>\r\n\r\n <div class=\"ngx-dropzone-text\">\r\n <ng-content>\r\n <strong>Drop files here</strong>\r\n <span>or click to browse</span>\r\n </ng-content>\r\n </div>\r\n\r\n @if (hint()) {\r\n <div class=\"ngx-dropzone-hint\">{{ hint() }}</div>\r\n }\r\n</div>\r\n\r\n@if (!autoUpload() && uploadMode() === 'all' && pendingCount() > 0) {\r\n <div class=\"ngx-dropzone-actions\">\r\n <button\r\n type=\"button\"\r\n class=\"ngx-dropzone-upload-all\"\r\n [disabled]=\"disabled() || !hasUploadConfiguration()\"\r\n (click)=\"uploadAll(); $event.stopPropagation()\">\r\n Upload all\r\n <span>{{ pendingCount() }}</span>\r\n </button>\r\n </div>\r\n}\r\n\r\n@if (showFileList() && files().length) {\r\n <ul class=\"ngx-dropzone-list\">\r\n @for (item of files(); track item.id) {\r\n <li class=\"ngx-dropzone-item\" [class.is-uploading]=\"item.status === 'uploading'\">\r\n <div class=\"ngx-dropzone-thumb-wrap\">\r\n @if (item.previewUrl) {\r\n <img class=\"ngx-dropzone-thumb\" [src]=\"item.previewUrl\" [alt]=\"item.file.name\" />\r\n } @else {\r\n <span class=\"ngx-dropzone-file-icon\">\uD83D\uDCC4</span>\r\n }\r\n </div>\r\n\r\n <div class=\"ngx-dropzone-meta\">\r\n <span class=\"ngx-dropzone-name\" [title]=\"item.file.name\">{{ item.file.name }}</span>\r\n <span class=\"ngx-dropzone-size\">{{ formatSize(item.file.size) }}</span>\r\n\r\n @if (item.status === 'uploading' || item.status === 'uploaded') {\r\n <div\r\n class=\"ngx-dropzone-progress\"\r\n role=\"progressbar\"\r\n [attr.aria-valuenow]=\"item.progress\"\r\n aria-valuemin=\"0\"\r\n aria-valuemax=\"100\"\r\n [attr.aria-label]=\"'Upload progress for ' + item.file.name\">\r\n <span class=\"ngx-dropzone-progress-bar\" [style.width.%]=\"item.progress\"></span>\r\n </div>\r\n <span class=\"ngx-dropzone-progress-text\">{{ item.progress }}%</span>\r\n }\r\n\r\n @if (item.status === 'error') {\r\n <span class=\"ngx-dropzone-error\">Upload failed</span>\r\n }\r\n </div>\r\n\r\n <div class=\"ngx-dropzone-row-actions\">\r\n @if (!autoUpload() && uploadMode() === 'single' && isPending(item)) {\r\n <button\r\n type=\"button\"\r\n class=\"ngx-dropzone-upload\"\r\n [disabled]=\"disabled() || !hasUploadConfiguration()\"\r\n [attr.aria-label]=\"'Upload ' + item.file.name\"\r\n (click)=\"uploadSingle(item.id); $event.stopPropagation()\">\r\n Upload\r\n </button>\r\n }\r\n\r\n @if (item.status === 'error') {\r\n <button\r\n type=\"button\"\r\n class=\"ngx-dropzone-retry\"\r\n [disabled]=\"disabled() || !hasUploadConfiguration()\"\r\n [attr.aria-label]=\"'Retry upload for ' + item.file.name\"\r\n (click)=\"retryUpload(item.id); $event.stopPropagation()\">\r\n Retry\r\n </button>\r\n }\r\n\r\n @if (item.status === 'uploaded') {\r\n <span class=\"ngx-dropzone-status success\" aria-label=\"Uploaded\">\u2713</span>\r\n } @else if (item.status === 'uploading') {\r\n <span class=\"ngx-dropzone-status uploading\" aria-label=\"Uploading\"></span>\r\n } @else if (item.status === 'error') {\r\n <span class=\"ngx-dropzone-status error\" aria-label=\"Upload failed\">!</span>\r\n } @else {\r\n <span class=\"ngx-dropzone-status pending\" aria-label=\"Pending\">\u2022</span>\r\n }\r\n\r\n <button\r\n type=\"button\"\r\n class=\"ngx-dropzone-remove\"\r\n [attr.aria-label]=\"'Remove ' + item.file.name\"\r\n (click)=\"removeFile(item.id); $event.stopPropagation()\">\r\n \u2715\r\n </button>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n}\r\n", styles: ["@charset \"UTF-8\";:host{display:block}.ngx-dropzone{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.65rem;padding:2.25rem 1.5rem;border-radius:16px;cursor:pointer;text-align:center;overflow:hidden;background:light-dark(#fafbfc,#1a1a1e);border:2px dashed light-dark(#d6dae1,#35353c);transition:border-color .2s ease,background-color .2s ease,transform .2s cubic-bezier(.34,1.56,.64,1),box-shadow .2s ease}.ngx-dropzone:before{content:\"\";position:absolute;inset:0;background:radial-gradient(circle at 50% 0%,light-dark(rgba(37,99,235,.06),rgba(59,130,246,.1)),transparent 65%);opacity:0;transition:opacity .2s ease;pointer-events:none}.ngx-dropzone:hover:not(.disabled){border-color:light-dark(#93c5fd,#3b82f6);box-shadow:0 4px 18px light-dark(rgba(37,99,235,.08),rgba(0,0,0,.35))}.ngx-dropzone:hover:not(.disabled):before{opacity:1}.ngx-dropzone:focus-visible{outline:2px solid light-dark(#2563eb,#60a5fa);outline-offset:3px}.ngx-dropzone.dragging{border-color:light-dark(#2563eb,#60a5fa);border-style:solid;background:light-dark(#eff6ff,#16213a);transform:scale(1.015);box-shadow:0 8px 28px light-dark(rgba(37,99,235,.18),rgba(59,130,246,.25))}.ngx-dropzone.dragging:before{opacity:1}.ngx-dropzone.dragging .ngx-dropzone-icon-wrap{transform:translateY(-4px) scale(1.08)}.ngx-dropzone.disabled{cursor:not-allowed;opacity:.55}.ngx-dropzone.has-files{padding-block:1.5rem}.ngx-dropzone-input{position:absolute;inset-inline-start:-9999px;width:1px;height:1px;opacity:0}.ngx-dropzone-icon-wrap{display:flex;align-items:center;justify-content:center;inline-size:56px;block-size:56px;border-radius:50%;background:light-dark(#eef2ff,#232433);color:light-dark(#4f46e5,#818cf8);transition:transform .22s cubic-bezier(.34,1.56,.64,1);z-index:1}.ngx-dropzone-text{z-index:1;display:flex;flex-direction:column;gap:.15rem}.ngx-dropzone-text strong{font-size:.92rem;font-weight:600;color:light-dark(#1f2937,#e4e4e7)}.ngx-dropzone-text span{font-size:.8rem;color:light-dark(#9ca3af,#71717a)}.ngx-dropzone-hint{z-index:1;font-size:.72rem;color:light-dark(#9ca3af,#6b7280);background:light-dark(#f3f4f6,#232327);padding:.15rem .6rem;border-radius:999px}.ngx-dropzone-list{list-style:none;margin:.85rem 0 0;padding:0;display:flex;flex-direction:column;gap:.45rem}.ngx-dropzone-item{display:flex;align-items:center;gap:.7rem;padding:.5rem .6rem;border-radius:10px;background:light-dark(#ffffff,#1f1f24);border:1px solid light-dark(#eef0f3,#2d2d33);transition:transform .16s ease,box-shadow .16s ease;animation:ngx-dropzone-item-in .22s cubic-bezier(.22,.9,.32,1) both}.ngx-dropzone-item:hover{box-shadow:0 2px 10px light-dark(rgba(0,0,0,.06),rgba(0,0,0,.4))}@keyframes ngx-dropzone-item-in{0%{opacity:0;transform:translateY(-6px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.ngx-dropzone-thumb-wrap{flex-shrink:0;inline-size:38px;block-size:38px;border-radius:8px;overflow:hidden;background:light-dark(#f4f4f5,#29292f);display:flex;align-items:center;justify-content:center}.ngx-dropzone-thumb{inline-size:100%;block-size:100%;object-fit:cover}.ngx-dropzone-file-icon{font-size:1.1rem}.ngx-dropzone-meta{flex:1;min-inline-size:0;display:flex;flex-direction:column;gap:.1rem}.ngx-dropzone-name{font-size:.8rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:light-dark(#1f2937,#e4e4e7)}.ngx-dropzone-size{font-size:.7rem;color:light-dark(#9ca3af,#71717a)}.ngx-dropzone-status{flex-shrink:0;inline-size:20px;block-size:20px;border-radius:50%;background:light-dark(#dcfce7,#14532d);color:light-dark(#16a34a,#4ade80);font-size:.7rem;display:flex;align-items:center;justify-content:center}.ngx-dropzone-remove{flex-shrink:0;appearance:none;border:none;background:transparent;cursor:pointer;color:light-dark(#9ca3af,#71717a);font-size:.8rem;line-height:1;padding:.3rem;border-radius:6px;transition:background-color .14s ease,color .14s ease}.ngx-dropzone-remove:hover{color:light-dark(#dc2626,#f87171);background:light-dark(#fee2e2,#3f1d1d)}.ngx-dropzone-actions{display:flex;justify-content:flex-end;margin-top:.7rem}.ngx-dropzone-upload-all,.ngx-dropzone-upload,.ngx-dropzone-retry{appearance:none;border:1px solid light-dark(#dbe3f0,#3b3b45);border-radius:7px;background:light-dark(#2563eb,#3b82f6);color:#fff;cursor:pointer;font:inherit;font-size:.75rem;font-weight:600;padding:.35rem .65rem;transition:opacity .14s ease,transform .14s ease}.ngx-dropzone-upload:hover:not(:disabled),.ngx-dropzone-upload-all:hover:not(:disabled),.ngx-dropzone-retry:hover:not(:disabled){transform:translateY(-1px)}.ngx-dropzone-upload-all:disabled,.ngx-dropzone-upload:disabled,.ngx-dropzone-retry:disabled{cursor:not-allowed;opacity:.5}.ngx-dropzone-upload-all{display:inline-flex;align-items:center;gap:.45rem}.ngx-dropzone-upload-all span{min-inline-size:1.15rem;block-size:1.15rem;display:inline-flex;align-items:center;justify-content:center;border-radius:999px;background:#ffffff2e}.ngx-dropzone-retry{background:transparent;color:light-dark(#dc2626,#f87171)}.ngx-dropzone-row-actions{flex-shrink:0;display:flex;align-items:center;gap:.35rem}.ngx-dropzone-item.is-uploading .ngx-dropzone-status.uploading{animation:ngx-dropzone-upload-pulse 1.1s ease-in-out infinite}.ngx-dropzone-status.pending{background:light-dark(#f4f4f5,#29292f);color:light-dark(#a1a1aa,#71717a)}.ngx-dropzone-status.uploading{background:light-dark(#dbeafe,#172554);border:3px solid light-dark(#93c5fd,#3b82f6)}.ngx-dropzone-status.error{background:light-dark(#fee2e2,#450a0a);color:light-dark(#dc2626,#f87171);font-weight:700}.ngx-dropzone-status.success{background:light-dark(#dcfce7,#14532d);color:light-dark(#16a34a,#4ade80)}.ngx-dropzone-progress{position:relative;inline-size:100%;block-size:4px;margin-top:.35rem;overflow:hidden;border-radius:999px;background:light-dark(#e5e7eb,#303038)}.ngx-dropzone-progress-bar{display:block;block-size:100%;border-radius:inherit;background:light-dark(#2563eb,#60a5fa);transition:width .12s linear}.ngx-dropzone-progress-text{font-size:.65rem;color:light-dark(#6b7280,#a1a1aa)}.ngx-dropzone-error{font-size:.65rem;color:light-dark(#dc2626,#f87171)}@keyframes ngx-dropzone-upload-pulse{50%{opacity:.45}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
503
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxDropzoneComponent, isStandalone: true, selector: "ngx-dropzone", inputs: { accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, maxFileSize: { classPropertyName: "maxFileSize", publicName: "maxFileSize", isSignal: true, isRequired: false, transformFunction: null }, maxFiles: { classPropertyName: "maxFiles", publicName: "maxFiles", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, showFileList: { classPropertyName: "showFileList", publicName: "showFileList", isSignal: true, isRequired: false, transformFunction: null }, uploadUrl: { classPropertyName: "uploadUrl", publicName: "uploadUrl", isSignal: true, isRequired: false, transformFunction: null }, uploadAlias: { classPropertyName: "uploadAlias", publicName: "uploadAlias", isSignal: true, isRequired: false, transformFunction: null }, autoUpload: { classPropertyName: "autoUpload", publicName: "autoUpload", isSignal: true, isRequired: false, transformFunction: null }, maxParallel: { classPropertyName: "maxParallel", publicName: "maxParallel", isSignal: true, isRequired: false, transformFunction: null }, uploadMode: { classPropertyName: "uploadMode", publicName: "uploadMode", isSignal: true, isRequired: false, transformFunction: null }, uploadData: { classPropertyName: "uploadData", publicName: "uploadData", isSignal: true, isRequired: false, transformFunction: null }, uploadHeaders: { classPropertyName: "uploadHeaders", publicName: "uploadHeaders", isSignal: true, isRequired: false, transformFunction: null }, uploadWithCredentials: { classPropertyName: "uploadWithCredentials", publicName: "uploadWithCredentials", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { filesAdded: "filesAdded", filesRejected: "filesRejected", filesChange: "filesChange", uploadStarted: "uploadStarted", uploadProgress: "uploadProgress", uploadSuccess: "uploadSuccess", uploadError: "uploadError" }, host: { classAttribute: "ngx-dropzone-host" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n class=\"ngx-dropzone\"\n [class.dragging]=\"isDragging()\"\n [class.disabled]=\"disabled()\"\n [class.has-files]=\"files().length > 0\"\n tabindex=\"0\"\n role=\"button\"\n [attr.aria-disabled]=\"disabled()\"\n (click)=\"onBrowseClick()\"\n (keydown)=\"onKeydown($event)\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\">\n <input\n #fileInput\n type=\"file\"\n class=\"ngx-dropzone-input\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"disabled()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"onFileInputChange($event)\" />\n\n <div class=\"ngx-dropzone-icon-wrap\">\n <ng-content select=\"[dropzone-icon]\">\n <svg class=\"ngx-dropzone-icon\" viewBox=\"0 0 24 24\" fill=\"none\" width=\"30\" height=\"30\">\n <path\n d=\"M12 16V4M12 4l-4 4M12 4l4 4M4 16v2a2 2 0 002 2h12a2 2 0 002-2v-2\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </ng-content>\n </div>\n\n <div class=\"ngx-dropzone-text\">\n <ng-content>\n <strong>Drop files here</strong>\n <span>or click to browse</span>\n </ng-content>\n </div>\n\n @if (hint()) {\n <div class=\"ngx-dropzone-hint\">{{ hint() }}</div>\n }\n</div>\n\n@if (!autoUpload() && uploadMode() === 'all' && pendingCount() > 0) {\n <div class=\"ngx-dropzone-actions\">\n <button\n type=\"button\"\n class=\"ngx-dropzone-upload-all\"\n [disabled]=\"disabled() || !hasUploadConfiguration()\"\n (click)=\"uploadAll(); $event.stopPropagation()\">\n Upload all\n <span>{{ pendingCount() }}</span>\n </button>\n </div>\n}\n\n@if (showFileList() && files().length) {\n <ul class=\"ngx-dropzone-list\">\n @for (item of files(); track item.id) {\n <li class=\"ngx-dropzone-item\" [class.is-uploading]=\"item.status === 'uploading'\">\n <div class=\"ngx-dropzone-thumb-wrap\">\n @if (item.previewUrl) {\n <img class=\"ngx-dropzone-thumb\" [src]=\"item.previewUrl\" [alt]=\"item.file.name\" />\n } @else {\n <span class=\"ngx-dropzone-file-icon\">\uD83D\uDCC4</span>\n }\n </div>\n\n <div class=\"ngx-dropzone-meta\">\n <span class=\"ngx-dropzone-name\" [title]=\"item.file.name\">{{ item.file.name }}</span>\n <span class=\"ngx-dropzone-size\">{{ formatSize(item.file.size) }}</span>\n\n @if (item.status === 'uploading' || item.status === 'uploaded') {\n <div\n class=\"ngx-dropzone-progress\"\n role=\"progressbar\"\n [attr.aria-valuenow]=\"item.progress\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-label]=\"'Upload progress for ' + item.file.name\">\n <span class=\"ngx-dropzone-progress-bar\" [style.width.%]=\"item.progress\"></span>\n </div>\n <span class=\"ngx-dropzone-progress-text\">{{ item.progress }}%</span>\n }\n\n @if (item.status === 'error') {\n <span class=\"ngx-dropzone-error\">Upload failed</span>\n }\n </div>\n\n <div class=\"ngx-dropzone-row-actions\">\n @if (!autoUpload() && uploadMode() === 'single' && isPending(item)) {\n <button\n type=\"button\"\n class=\"ngx-dropzone-upload\"\n [disabled]=\"disabled() || !hasUploadConfiguration()\"\n [attr.aria-label]=\"'Upload ' + item.file.name\"\n (click)=\"uploadSingle(item.id); $event.stopPropagation()\">\n Upload\n </button>\n }\n\n @if (item.status === 'error') {\n <button\n type=\"button\"\n class=\"ngx-dropzone-retry\"\n [disabled]=\"disabled() || !hasUploadConfiguration()\"\n [attr.aria-label]=\"'Retry upload for ' + item.file.name\"\n (click)=\"retryUpload(item.id); $event.stopPropagation()\">\n Retry\n </button>\n }\n\n @if (item.status === 'uploaded') {\n <span class=\"ngx-dropzone-status success\" aria-label=\"Uploaded\">\u2713</span>\n } @else if (item.status === 'uploading') {\n <span class=\"ngx-dropzone-status uploading\" aria-label=\"Uploading\"></span>\n } @else if (item.status === 'error') {\n <span class=\"ngx-dropzone-status error\" aria-label=\"Upload failed\">!</span>\n } @else {\n <span class=\"ngx-dropzone-status pending\" aria-label=\"Pending\">\u2022</span>\n }\n\n <button\n type=\"button\"\n class=\"ngx-dropzone-remove\"\n [attr.aria-label]=\"'Remove ' + item.file.name\"\n (click)=\"removeFile(item.id); $event.stopPropagation()\">\n \u2715\n </button>\n </div>\n </li>\n }\n </ul>\n}\n", styles: ["@charset \"UTF-8\";:host{display:block}.ngx-dropzone{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.65rem;padding:2.25rem 1.5rem;border-radius:16px;cursor:pointer;text-align:center;overflow:hidden;background:light-dark(#fafbfc,#1a1a1e);border:2px dashed light-dark(#d6dae1,#35353c);transition:border-color .2s ease,background-color .2s ease,transform .2s cubic-bezier(.34,1.56,.64,1),box-shadow .2s ease}.ngx-dropzone:before{content:\"\";position:absolute;inset:0;background:radial-gradient(circle at 50% 0%,light-dark(rgba(37,99,235,.06),rgba(59,130,246,.1)),transparent 65%);opacity:0;transition:opacity .2s ease;pointer-events:none}.ngx-dropzone:hover:not(.disabled){border-color:light-dark(#93c5fd,#3b82f6);box-shadow:0 4px 18px light-dark(rgba(37,99,235,.08),rgba(0,0,0,.35))}.ngx-dropzone:hover:not(.disabled):before{opacity:1}.ngx-dropzone:focus-visible{outline:2px solid light-dark(#2563eb,#60a5fa);outline-offset:3px}.ngx-dropzone.dragging{border-color:light-dark(#2563eb,#60a5fa);border-style:solid;background:light-dark(#eff6ff,#16213a);transform:scale(1.015);box-shadow:0 8px 28px light-dark(rgba(37,99,235,.18),rgba(59,130,246,.25))}.ngx-dropzone.dragging:before{opacity:1}.ngx-dropzone.dragging .ngx-dropzone-icon-wrap{transform:translateY(-4px) scale(1.08)}.ngx-dropzone.disabled{cursor:not-allowed;opacity:.55}.ngx-dropzone.has-files{padding-block:1.5rem}.ngx-dropzone-input{position:absolute;inset-inline-start:-9999px;width:1px;height:1px;opacity:0}.ngx-dropzone-icon-wrap{display:flex;align-items:center;justify-content:center;inline-size:56px;block-size:56px;border-radius:50%;background:light-dark(#eef2ff,#232433);color:light-dark(#4f46e5,#818cf8);transition:transform .22s cubic-bezier(.34,1.56,.64,1);z-index:1}.ngx-dropzone-text{z-index:1;display:flex;flex-direction:column;gap:.15rem}.ngx-dropzone-text strong{font-size:.92rem;font-weight:600;color:light-dark(#1f2937,#e4e4e7)}.ngx-dropzone-text span{font-size:.8rem;color:light-dark(#9ca3af,#71717a)}.ngx-dropzone-hint{z-index:1;font-size:.72rem;color:light-dark(#9ca3af,#6b7280);background:light-dark(#f3f4f6,#232327);padding:.15rem .6rem;border-radius:999px}.ngx-dropzone-list{list-style:none;margin:.85rem 0 0;padding:0;display:flex;flex-direction:column;gap:.45rem}.ngx-dropzone-item{display:flex;align-items:center;gap:.7rem;padding:.5rem .6rem;border-radius:10px;background:light-dark(#ffffff,#1f1f24);border:1px solid light-dark(#eef0f3,#2d2d33);transition:transform .16s ease,box-shadow .16s ease;animation:ngx-dropzone-item-in .22s cubic-bezier(.22,.9,.32,1) both}.ngx-dropzone-item:hover{box-shadow:0 2px 10px light-dark(rgba(0,0,0,.06),rgba(0,0,0,.4))}@keyframes ngx-dropzone-item-in{0%{opacity:0;transform:translateY(-6px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.ngx-dropzone-thumb-wrap{flex-shrink:0;inline-size:38px;block-size:38px;border-radius:8px;overflow:hidden;background:light-dark(#f4f4f5,#29292f);display:flex;align-items:center;justify-content:center}.ngx-dropzone-thumb{inline-size:100%;block-size:100%;object-fit:cover}.ngx-dropzone-file-icon{font-size:1.1rem}.ngx-dropzone-meta{flex:1;min-inline-size:0;display:flex;flex-direction:column;gap:.1rem}.ngx-dropzone-name{font-size:.8rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:light-dark(#1f2937,#e4e4e7)}.ngx-dropzone-size{font-size:.7rem;color:light-dark(#9ca3af,#71717a)}.ngx-dropzone-status{flex-shrink:0;inline-size:20px;block-size:20px;border-radius:50%;background:light-dark(#dcfce7,#14532d);color:light-dark(#16a34a,#4ade80);font-size:.7rem;display:flex;align-items:center;justify-content:center}.ngx-dropzone-remove{flex-shrink:0;appearance:none;border:none;background:transparent;cursor:pointer;color:light-dark(#9ca3af,#71717a);font-size:.8rem;line-height:1;padding:.3rem;border-radius:6px;transition:background-color .14s ease,color .14s ease}.ngx-dropzone-remove:hover{color:light-dark(#dc2626,#f87171);background:light-dark(#fee2e2,#3f1d1d)}.ngx-dropzone-actions{display:flex;justify-content:flex-end;margin-top:.7rem}.ngx-dropzone-upload-all,.ngx-dropzone-upload,.ngx-dropzone-retry{appearance:none;border:1px solid light-dark(#dbe3f0,#3b3b45);border-radius:7px;background:light-dark(#2563eb,#3b82f6);color:#fff;cursor:pointer;font:inherit;font-size:.75rem;font-weight:600;padding:.35rem .65rem;transition:opacity .14s ease,transform .14s ease}.ngx-dropzone-upload:hover:not(:disabled),.ngx-dropzone-upload-all:hover:not(:disabled),.ngx-dropzone-retry:hover:not(:disabled){transform:translateY(-1px)}.ngx-dropzone-upload-all:disabled,.ngx-dropzone-upload:disabled,.ngx-dropzone-retry:disabled{cursor:not-allowed;opacity:.5}.ngx-dropzone-upload-all{display:inline-flex;align-items:center;gap:.45rem}.ngx-dropzone-upload-all span{min-inline-size:1.15rem;block-size:1.15rem;display:inline-flex;align-items:center;justify-content:center;border-radius:999px;background:#ffffff2e}.ngx-dropzone-retry{background:transparent;color:light-dark(#dc2626,#f87171)}.ngx-dropzone-row-actions{flex-shrink:0;display:flex;align-items:center;gap:.35rem}.ngx-dropzone-item.is-uploading .ngx-dropzone-status.uploading{animation:ngx-dropzone-upload-pulse 1.1s ease-in-out infinite}.ngx-dropzone-status.pending{background:light-dark(#f4f4f5,#29292f);color:light-dark(#a1a1aa,#71717a)}.ngx-dropzone-status.uploading{background:light-dark(#dbeafe,#172554);border:3px solid light-dark(#93c5fd,#3b82f6)}.ngx-dropzone-status.error{background:light-dark(#fee2e2,#450a0a);color:light-dark(#dc2626,#f87171);font-weight:700}.ngx-dropzone-status.success{background:light-dark(#dcfce7,#14532d);color:light-dark(#16a34a,#4ade80)}.ngx-dropzone-progress{position:relative;inline-size:100%;block-size:4px;margin-top:.35rem;overflow:hidden;border-radius:999px;background:light-dark(#e5e7eb,#303038)}.ngx-dropzone-progress-bar{display:block;block-size:100%;border-radius:inherit;background:light-dark(#2563eb,#60a5fa);transition:width .12s linear}.ngx-dropzone-progress-text{font-size:.65rem;color:light-dark(#6b7280,#a1a1aa)}.ngx-dropzone-error{font-size:.65rem;color:light-dark(#dc2626,#f87171)}@keyframes ngx-dropzone-upload-pulse{50%{opacity:.45}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
504
504
  }
505
505
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxDropzoneComponent, decorators: [{
506
506
  type: Component,
507
507
  args: [{ selector: 'ngx-dropzone', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, host: {
508
508
  class: 'ngx-dropzone-host',
509
- }, template: "<div\r\n class=\"ngx-dropzone\"\r\n [class.dragging]=\"isDragging()\"\r\n [class.disabled]=\"disabled()\"\r\n [class.has-files]=\"files().length > 0\"\r\n tabindex=\"0\"\r\n role=\"button\"\r\n [attr.aria-disabled]=\"disabled()\"\r\n (click)=\"onBrowseClick()\"\r\n (keydown)=\"onKeydown($event)\"\r\n (dragenter)=\"onDragEnter($event)\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\">\r\n <input\r\n #fileInput\r\n type=\"file\"\r\n class=\"ngx-dropzone-input\"\r\n [accept]=\"accept()\"\r\n [multiple]=\"multiple()\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"onFileInputChange($event)\" />\r\n\r\n <div class=\"ngx-dropzone-icon-wrap\">\r\n <ng-content select=\"[dropzone-icon]\">\r\n <svg class=\"ngx-dropzone-icon\" viewBox=\"0 0 24 24\" fill=\"none\" width=\"30\" height=\"30\">\r\n <path\r\n d=\"M12 16V4M12 4l-4 4M12 4l4 4M4 16v2a2 2 0 002 2h12a2 2 0 002-2v-2\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.8\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </ng-content>\r\n </div>\r\n\r\n <div class=\"ngx-dropzone-text\">\r\n <ng-content>\r\n <strong>Drop files here</strong>\r\n <span>or click to browse</span>\r\n </ng-content>\r\n </div>\r\n\r\n @if (hint()) {\r\n <div class=\"ngx-dropzone-hint\">{{ hint() }}</div>\r\n }\r\n</div>\r\n\r\n@if (!autoUpload() && uploadMode() === 'all' && pendingCount() > 0) {\r\n <div class=\"ngx-dropzone-actions\">\r\n <button\r\n type=\"button\"\r\n class=\"ngx-dropzone-upload-all\"\r\n [disabled]=\"disabled() || !hasUploadConfiguration()\"\r\n (click)=\"uploadAll(); $event.stopPropagation()\">\r\n Upload all\r\n <span>{{ pendingCount() }}</span>\r\n </button>\r\n </div>\r\n}\r\n\r\n@if (showFileList() && files().length) {\r\n <ul class=\"ngx-dropzone-list\">\r\n @for (item of files(); track item.id) {\r\n <li class=\"ngx-dropzone-item\" [class.is-uploading]=\"item.status === 'uploading'\">\r\n <div class=\"ngx-dropzone-thumb-wrap\">\r\n @if (item.previewUrl) {\r\n <img class=\"ngx-dropzone-thumb\" [src]=\"item.previewUrl\" [alt]=\"item.file.name\" />\r\n } @else {\r\n <span class=\"ngx-dropzone-file-icon\">\uD83D\uDCC4</span>\r\n }\r\n </div>\r\n\r\n <div class=\"ngx-dropzone-meta\">\r\n <span class=\"ngx-dropzone-name\" [title]=\"item.file.name\">{{ item.file.name }}</span>\r\n <span class=\"ngx-dropzone-size\">{{ formatSize(item.file.size) }}</span>\r\n\r\n @if (item.status === 'uploading' || item.status === 'uploaded') {\r\n <div\r\n class=\"ngx-dropzone-progress\"\r\n role=\"progressbar\"\r\n [attr.aria-valuenow]=\"item.progress\"\r\n aria-valuemin=\"0\"\r\n aria-valuemax=\"100\"\r\n [attr.aria-label]=\"'Upload progress for ' + item.file.name\">\r\n <span class=\"ngx-dropzone-progress-bar\" [style.width.%]=\"item.progress\"></span>\r\n </div>\r\n <span class=\"ngx-dropzone-progress-text\">{{ item.progress }}%</span>\r\n }\r\n\r\n @if (item.status === 'error') {\r\n <span class=\"ngx-dropzone-error\">Upload failed</span>\r\n }\r\n </div>\r\n\r\n <div class=\"ngx-dropzone-row-actions\">\r\n @if (!autoUpload() && uploadMode() === 'single' && isPending(item)) {\r\n <button\r\n type=\"button\"\r\n class=\"ngx-dropzone-upload\"\r\n [disabled]=\"disabled() || !hasUploadConfiguration()\"\r\n [attr.aria-label]=\"'Upload ' + item.file.name\"\r\n (click)=\"uploadSingle(item.id); $event.stopPropagation()\">\r\n Upload\r\n </button>\r\n }\r\n\r\n @if (item.status === 'error') {\r\n <button\r\n type=\"button\"\r\n class=\"ngx-dropzone-retry\"\r\n [disabled]=\"disabled() || !hasUploadConfiguration()\"\r\n [attr.aria-label]=\"'Retry upload for ' + item.file.name\"\r\n (click)=\"retryUpload(item.id); $event.stopPropagation()\">\r\n Retry\r\n </button>\r\n }\r\n\r\n @if (item.status === 'uploaded') {\r\n <span class=\"ngx-dropzone-status success\" aria-label=\"Uploaded\">\u2713</span>\r\n } @else if (item.status === 'uploading') {\r\n <span class=\"ngx-dropzone-status uploading\" aria-label=\"Uploading\"></span>\r\n } @else if (item.status === 'error') {\r\n <span class=\"ngx-dropzone-status error\" aria-label=\"Upload failed\">!</span>\r\n } @else {\r\n <span class=\"ngx-dropzone-status pending\" aria-label=\"Pending\">\u2022</span>\r\n }\r\n\r\n <button\r\n type=\"button\"\r\n class=\"ngx-dropzone-remove\"\r\n [attr.aria-label]=\"'Remove ' + item.file.name\"\r\n (click)=\"removeFile(item.id); $event.stopPropagation()\">\r\n \u2715\r\n </button>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n}\r\n", styles: ["@charset \"UTF-8\";:host{display:block}.ngx-dropzone{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.65rem;padding:2.25rem 1.5rem;border-radius:16px;cursor:pointer;text-align:center;overflow:hidden;background:light-dark(#fafbfc,#1a1a1e);border:2px dashed light-dark(#d6dae1,#35353c);transition:border-color .2s ease,background-color .2s ease,transform .2s cubic-bezier(.34,1.56,.64,1),box-shadow .2s ease}.ngx-dropzone:before{content:\"\";position:absolute;inset:0;background:radial-gradient(circle at 50% 0%,light-dark(rgba(37,99,235,.06),rgba(59,130,246,.1)),transparent 65%);opacity:0;transition:opacity .2s ease;pointer-events:none}.ngx-dropzone:hover:not(.disabled){border-color:light-dark(#93c5fd,#3b82f6);box-shadow:0 4px 18px light-dark(rgba(37,99,235,.08),rgba(0,0,0,.35))}.ngx-dropzone:hover:not(.disabled):before{opacity:1}.ngx-dropzone:focus-visible{outline:2px solid light-dark(#2563eb,#60a5fa);outline-offset:3px}.ngx-dropzone.dragging{border-color:light-dark(#2563eb,#60a5fa);border-style:solid;background:light-dark(#eff6ff,#16213a);transform:scale(1.015);box-shadow:0 8px 28px light-dark(rgba(37,99,235,.18),rgba(59,130,246,.25))}.ngx-dropzone.dragging:before{opacity:1}.ngx-dropzone.dragging .ngx-dropzone-icon-wrap{transform:translateY(-4px) scale(1.08)}.ngx-dropzone.disabled{cursor:not-allowed;opacity:.55}.ngx-dropzone.has-files{padding-block:1.5rem}.ngx-dropzone-input{position:absolute;inset-inline-start:-9999px;width:1px;height:1px;opacity:0}.ngx-dropzone-icon-wrap{display:flex;align-items:center;justify-content:center;inline-size:56px;block-size:56px;border-radius:50%;background:light-dark(#eef2ff,#232433);color:light-dark(#4f46e5,#818cf8);transition:transform .22s cubic-bezier(.34,1.56,.64,1);z-index:1}.ngx-dropzone-text{z-index:1;display:flex;flex-direction:column;gap:.15rem}.ngx-dropzone-text strong{font-size:.92rem;font-weight:600;color:light-dark(#1f2937,#e4e4e7)}.ngx-dropzone-text span{font-size:.8rem;color:light-dark(#9ca3af,#71717a)}.ngx-dropzone-hint{z-index:1;font-size:.72rem;color:light-dark(#9ca3af,#6b7280);background:light-dark(#f3f4f6,#232327);padding:.15rem .6rem;border-radius:999px}.ngx-dropzone-list{list-style:none;margin:.85rem 0 0;padding:0;display:flex;flex-direction:column;gap:.45rem}.ngx-dropzone-item{display:flex;align-items:center;gap:.7rem;padding:.5rem .6rem;border-radius:10px;background:light-dark(#ffffff,#1f1f24);border:1px solid light-dark(#eef0f3,#2d2d33);transition:transform .16s ease,box-shadow .16s ease;animation:ngx-dropzone-item-in .22s cubic-bezier(.22,.9,.32,1) both}.ngx-dropzone-item:hover{box-shadow:0 2px 10px light-dark(rgba(0,0,0,.06),rgba(0,0,0,.4))}@keyframes ngx-dropzone-item-in{0%{opacity:0;transform:translateY(-6px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.ngx-dropzone-thumb-wrap{flex-shrink:0;inline-size:38px;block-size:38px;border-radius:8px;overflow:hidden;background:light-dark(#f4f4f5,#29292f);display:flex;align-items:center;justify-content:center}.ngx-dropzone-thumb{inline-size:100%;block-size:100%;object-fit:cover}.ngx-dropzone-file-icon{font-size:1.1rem}.ngx-dropzone-meta{flex:1;min-inline-size:0;display:flex;flex-direction:column;gap:.1rem}.ngx-dropzone-name{font-size:.8rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:light-dark(#1f2937,#e4e4e7)}.ngx-dropzone-size{font-size:.7rem;color:light-dark(#9ca3af,#71717a)}.ngx-dropzone-status{flex-shrink:0;inline-size:20px;block-size:20px;border-radius:50%;background:light-dark(#dcfce7,#14532d);color:light-dark(#16a34a,#4ade80);font-size:.7rem;display:flex;align-items:center;justify-content:center}.ngx-dropzone-remove{flex-shrink:0;appearance:none;border:none;background:transparent;cursor:pointer;color:light-dark(#9ca3af,#71717a);font-size:.8rem;line-height:1;padding:.3rem;border-radius:6px;transition:background-color .14s ease,color .14s ease}.ngx-dropzone-remove:hover{color:light-dark(#dc2626,#f87171);background:light-dark(#fee2e2,#3f1d1d)}.ngx-dropzone-actions{display:flex;justify-content:flex-end;margin-top:.7rem}.ngx-dropzone-upload-all,.ngx-dropzone-upload,.ngx-dropzone-retry{appearance:none;border:1px solid light-dark(#dbe3f0,#3b3b45);border-radius:7px;background:light-dark(#2563eb,#3b82f6);color:#fff;cursor:pointer;font:inherit;font-size:.75rem;font-weight:600;padding:.35rem .65rem;transition:opacity .14s ease,transform .14s ease}.ngx-dropzone-upload:hover:not(:disabled),.ngx-dropzone-upload-all:hover:not(:disabled),.ngx-dropzone-retry:hover:not(:disabled){transform:translateY(-1px)}.ngx-dropzone-upload-all:disabled,.ngx-dropzone-upload:disabled,.ngx-dropzone-retry:disabled{cursor:not-allowed;opacity:.5}.ngx-dropzone-upload-all{display:inline-flex;align-items:center;gap:.45rem}.ngx-dropzone-upload-all span{min-inline-size:1.15rem;block-size:1.15rem;display:inline-flex;align-items:center;justify-content:center;border-radius:999px;background:#ffffff2e}.ngx-dropzone-retry{background:transparent;color:light-dark(#dc2626,#f87171)}.ngx-dropzone-row-actions{flex-shrink:0;display:flex;align-items:center;gap:.35rem}.ngx-dropzone-item.is-uploading .ngx-dropzone-status.uploading{animation:ngx-dropzone-upload-pulse 1.1s ease-in-out infinite}.ngx-dropzone-status.pending{background:light-dark(#f4f4f5,#29292f);color:light-dark(#a1a1aa,#71717a)}.ngx-dropzone-status.uploading{background:light-dark(#dbeafe,#172554);border:3px solid light-dark(#93c5fd,#3b82f6)}.ngx-dropzone-status.error{background:light-dark(#fee2e2,#450a0a);color:light-dark(#dc2626,#f87171);font-weight:700}.ngx-dropzone-status.success{background:light-dark(#dcfce7,#14532d);color:light-dark(#16a34a,#4ade80)}.ngx-dropzone-progress{position:relative;inline-size:100%;block-size:4px;margin-top:.35rem;overflow:hidden;border-radius:999px;background:light-dark(#e5e7eb,#303038)}.ngx-dropzone-progress-bar{display:block;block-size:100%;border-radius:inherit;background:light-dark(#2563eb,#60a5fa);transition:width .12s linear}.ngx-dropzone-progress-text{font-size:.65rem;color:light-dark(#6b7280,#a1a1aa)}.ngx-dropzone-error{font-size:.65rem;color:light-dark(#dc2626,#f87171)}@keyframes ngx-dropzone-upload-pulse{50%{opacity:.45}}\n"] }]
509
+ }, template: "<div\n class=\"ngx-dropzone\"\n [class.dragging]=\"isDragging()\"\n [class.disabled]=\"disabled()\"\n [class.has-files]=\"files().length > 0\"\n tabindex=\"0\"\n role=\"button\"\n [attr.aria-disabled]=\"disabled()\"\n (click)=\"onBrowseClick()\"\n (keydown)=\"onKeydown($event)\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\">\n <input\n #fileInput\n type=\"file\"\n class=\"ngx-dropzone-input\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"disabled()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"onFileInputChange($event)\" />\n\n <div class=\"ngx-dropzone-icon-wrap\">\n <ng-content select=\"[dropzone-icon]\">\n <svg class=\"ngx-dropzone-icon\" viewBox=\"0 0 24 24\" fill=\"none\" width=\"30\" height=\"30\">\n <path\n d=\"M12 16V4M12 4l-4 4M12 4l4 4M4 16v2a2 2 0 002 2h12a2 2 0 002-2v-2\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </ng-content>\n </div>\n\n <div class=\"ngx-dropzone-text\">\n <ng-content>\n <strong>Drop files here</strong>\n <span>or click to browse</span>\n </ng-content>\n </div>\n\n @if (hint()) {\n <div class=\"ngx-dropzone-hint\">{{ hint() }}</div>\n }\n</div>\n\n@if (!autoUpload() && uploadMode() === 'all' && pendingCount() > 0) {\n <div class=\"ngx-dropzone-actions\">\n <button\n type=\"button\"\n class=\"ngx-dropzone-upload-all\"\n [disabled]=\"disabled() || !hasUploadConfiguration()\"\n (click)=\"uploadAll(); $event.stopPropagation()\">\n Upload all\n <span>{{ pendingCount() }}</span>\n </button>\n </div>\n}\n\n@if (showFileList() && files().length) {\n <ul class=\"ngx-dropzone-list\">\n @for (item of files(); track item.id) {\n <li class=\"ngx-dropzone-item\" [class.is-uploading]=\"item.status === 'uploading'\">\n <div class=\"ngx-dropzone-thumb-wrap\">\n @if (item.previewUrl) {\n <img class=\"ngx-dropzone-thumb\" [src]=\"item.previewUrl\" [alt]=\"item.file.name\" />\n } @else {\n <span class=\"ngx-dropzone-file-icon\">\uD83D\uDCC4</span>\n }\n </div>\n\n <div class=\"ngx-dropzone-meta\">\n <span class=\"ngx-dropzone-name\" [title]=\"item.file.name\">{{ item.file.name }}</span>\n <span class=\"ngx-dropzone-size\">{{ formatSize(item.file.size) }}</span>\n\n @if (item.status === 'uploading' || item.status === 'uploaded') {\n <div\n class=\"ngx-dropzone-progress\"\n role=\"progressbar\"\n [attr.aria-valuenow]=\"item.progress\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-label]=\"'Upload progress for ' + item.file.name\">\n <span class=\"ngx-dropzone-progress-bar\" [style.width.%]=\"item.progress\"></span>\n </div>\n <span class=\"ngx-dropzone-progress-text\">{{ item.progress }}%</span>\n }\n\n @if (item.status === 'error') {\n <span class=\"ngx-dropzone-error\">Upload failed</span>\n }\n </div>\n\n <div class=\"ngx-dropzone-row-actions\">\n @if (!autoUpload() && uploadMode() === 'single' && isPending(item)) {\n <button\n type=\"button\"\n class=\"ngx-dropzone-upload\"\n [disabled]=\"disabled() || !hasUploadConfiguration()\"\n [attr.aria-label]=\"'Upload ' + item.file.name\"\n (click)=\"uploadSingle(item.id); $event.stopPropagation()\">\n Upload\n </button>\n }\n\n @if (item.status === 'error') {\n <button\n type=\"button\"\n class=\"ngx-dropzone-retry\"\n [disabled]=\"disabled() || !hasUploadConfiguration()\"\n [attr.aria-label]=\"'Retry upload for ' + item.file.name\"\n (click)=\"retryUpload(item.id); $event.stopPropagation()\">\n Retry\n </button>\n }\n\n @if (item.status === 'uploaded') {\n <span class=\"ngx-dropzone-status success\" aria-label=\"Uploaded\">\u2713</span>\n } @else if (item.status === 'uploading') {\n <span class=\"ngx-dropzone-status uploading\" aria-label=\"Uploading\"></span>\n } @else if (item.status === 'error') {\n <span class=\"ngx-dropzone-status error\" aria-label=\"Upload failed\">!</span>\n } @else {\n <span class=\"ngx-dropzone-status pending\" aria-label=\"Pending\">\u2022</span>\n }\n\n <button\n type=\"button\"\n class=\"ngx-dropzone-remove\"\n [attr.aria-label]=\"'Remove ' + item.file.name\"\n (click)=\"removeFile(item.id); $event.stopPropagation()\">\n \u2715\n </button>\n </div>\n </li>\n }\n </ul>\n}\n", styles: ["@charset \"UTF-8\";:host{display:block}.ngx-dropzone{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.65rem;padding:2.25rem 1.5rem;border-radius:16px;cursor:pointer;text-align:center;overflow:hidden;background:light-dark(#fafbfc,#1a1a1e);border:2px dashed light-dark(#d6dae1,#35353c);transition:border-color .2s ease,background-color .2s ease,transform .2s cubic-bezier(.34,1.56,.64,1),box-shadow .2s ease}.ngx-dropzone:before{content:\"\";position:absolute;inset:0;background:radial-gradient(circle at 50% 0%,light-dark(rgba(37,99,235,.06),rgba(59,130,246,.1)),transparent 65%);opacity:0;transition:opacity .2s ease;pointer-events:none}.ngx-dropzone:hover:not(.disabled){border-color:light-dark(#93c5fd,#3b82f6);box-shadow:0 4px 18px light-dark(rgba(37,99,235,.08),rgba(0,0,0,.35))}.ngx-dropzone:hover:not(.disabled):before{opacity:1}.ngx-dropzone:focus-visible{outline:2px solid light-dark(#2563eb,#60a5fa);outline-offset:3px}.ngx-dropzone.dragging{border-color:light-dark(#2563eb,#60a5fa);border-style:solid;background:light-dark(#eff6ff,#16213a);transform:scale(1.015);box-shadow:0 8px 28px light-dark(rgba(37,99,235,.18),rgba(59,130,246,.25))}.ngx-dropzone.dragging:before{opacity:1}.ngx-dropzone.dragging .ngx-dropzone-icon-wrap{transform:translateY(-4px) scale(1.08)}.ngx-dropzone.disabled{cursor:not-allowed;opacity:.55}.ngx-dropzone.has-files{padding-block:1.5rem}.ngx-dropzone-input{position:absolute;inset-inline-start:-9999px;width:1px;height:1px;opacity:0}.ngx-dropzone-icon-wrap{display:flex;align-items:center;justify-content:center;inline-size:56px;block-size:56px;border-radius:50%;background:light-dark(#eef2ff,#232433);color:light-dark(#4f46e5,#818cf8);transition:transform .22s cubic-bezier(.34,1.56,.64,1);z-index:1}.ngx-dropzone-text{z-index:1;display:flex;flex-direction:column;gap:.15rem}.ngx-dropzone-text strong{font-size:.92rem;font-weight:600;color:light-dark(#1f2937,#e4e4e7)}.ngx-dropzone-text span{font-size:.8rem;color:light-dark(#9ca3af,#71717a)}.ngx-dropzone-hint{z-index:1;font-size:.72rem;color:light-dark(#9ca3af,#6b7280);background:light-dark(#f3f4f6,#232327);padding:.15rem .6rem;border-radius:999px}.ngx-dropzone-list{list-style:none;margin:.85rem 0 0;padding:0;display:flex;flex-direction:column;gap:.45rem}.ngx-dropzone-item{display:flex;align-items:center;gap:.7rem;padding:.5rem .6rem;border-radius:10px;background:light-dark(#ffffff,#1f1f24);border:1px solid light-dark(#eef0f3,#2d2d33);transition:transform .16s ease,box-shadow .16s ease;animation:ngx-dropzone-item-in .22s cubic-bezier(.22,.9,.32,1) both}.ngx-dropzone-item:hover{box-shadow:0 2px 10px light-dark(rgba(0,0,0,.06),rgba(0,0,0,.4))}@keyframes ngx-dropzone-item-in{0%{opacity:0;transform:translateY(-6px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.ngx-dropzone-thumb-wrap{flex-shrink:0;inline-size:38px;block-size:38px;border-radius:8px;overflow:hidden;background:light-dark(#f4f4f5,#29292f);display:flex;align-items:center;justify-content:center}.ngx-dropzone-thumb{inline-size:100%;block-size:100%;object-fit:cover}.ngx-dropzone-file-icon{font-size:1.1rem}.ngx-dropzone-meta{flex:1;min-inline-size:0;display:flex;flex-direction:column;gap:.1rem}.ngx-dropzone-name{font-size:.8rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:light-dark(#1f2937,#e4e4e7)}.ngx-dropzone-size{font-size:.7rem;color:light-dark(#9ca3af,#71717a)}.ngx-dropzone-status{flex-shrink:0;inline-size:20px;block-size:20px;border-radius:50%;background:light-dark(#dcfce7,#14532d);color:light-dark(#16a34a,#4ade80);font-size:.7rem;display:flex;align-items:center;justify-content:center}.ngx-dropzone-remove{flex-shrink:0;appearance:none;border:none;background:transparent;cursor:pointer;color:light-dark(#9ca3af,#71717a);font-size:.8rem;line-height:1;padding:.3rem;border-radius:6px;transition:background-color .14s ease,color .14s ease}.ngx-dropzone-remove:hover{color:light-dark(#dc2626,#f87171);background:light-dark(#fee2e2,#3f1d1d)}.ngx-dropzone-actions{display:flex;justify-content:flex-end;margin-top:.7rem}.ngx-dropzone-upload-all,.ngx-dropzone-upload,.ngx-dropzone-retry{appearance:none;border:1px solid light-dark(#dbe3f0,#3b3b45);border-radius:7px;background:light-dark(#2563eb,#3b82f6);color:#fff;cursor:pointer;font:inherit;font-size:.75rem;font-weight:600;padding:.35rem .65rem;transition:opacity .14s ease,transform .14s ease}.ngx-dropzone-upload:hover:not(:disabled),.ngx-dropzone-upload-all:hover:not(:disabled),.ngx-dropzone-retry:hover:not(:disabled){transform:translateY(-1px)}.ngx-dropzone-upload-all:disabled,.ngx-dropzone-upload:disabled,.ngx-dropzone-retry:disabled{cursor:not-allowed;opacity:.5}.ngx-dropzone-upload-all{display:inline-flex;align-items:center;gap:.45rem}.ngx-dropzone-upload-all span{min-inline-size:1.15rem;block-size:1.15rem;display:inline-flex;align-items:center;justify-content:center;border-radius:999px;background:#ffffff2e}.ngx-dropzone-retry{background:transparent;color:light-dark(#dc2626,#f87171)}.ngx-dropzone-row-actions{flex-shrink:0;display:flex;align-items:center;gap:.35rem}.ngx-dropzone-item.is-uploading .ngx-dropzone-status.uploading{animation:ngx-dropzone-upload-pulse 1.1s ease-in-out infinite}.ngx-dropzone-status.pending{background:light-dark(#f4f4f5,#29292f);color:light-dark(#a1a1aa,#71717a)}.ngx-dropzone-status.uploading{background:light-dark(#dbeafe,#172554);border:3px solid light-dark(#93c5fd,#3b82f6)}.ngx-dropzone-status.error{background:light-dark(#fee2e2,#450a0a);color:light-dark(#dc2626,#f87171);font-weight:700}.ngx-dropzone-status.success{background:light-dark(#dcfce7,#14532d);color:light-dark(#16a34a,#4ade80)}.ngx-dropzone-progress{position:relative;inline-size:100%;block-size:4px;margin-top:.35rem;overflow:hidden;border-radius:999px;background:light-dark(#e5e7eb,#303038)}.ngx-dropzone-progress-bar{display:block;block-size:100%;border-radius:inherit;background:light-dark(#2563eb,#60a5fa);transition:width .12s linear}.ngx-dropzone-progress-text{font-size:.65rem;color:light-dark(#6b7280,#a1a1aa)}.ngx-dropzone-error{font-size:.65rem;color:light-dark(#dc2626,#f87171)}@keyframes ngx-dropzone-upload-pulse{50%{opacity:.45}}\n"] }]
510
510
  }], propDecorators: { accept: [{ type: i0.Input, args: [{ isSignal: true, alias: "accept", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], maxFileSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxFileSize", required: false }] }], maxFiles: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxFiles", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], showFileList: [{ type: i0.Input, args: [{ isSignal: true, alias: "showFileList", required: false }] }], uploadUrl: [{ type: i0.Input, args: [{ isSignal: true, alias: "uploadUrl", required: false }] }], uploadAlias: [{ type: i0.Input, args: [{ isSignal: true, alias: "uploadAlias", required: false }] }], autoUpload: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoUpload", required: false }] }], maxParallel: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxParallel", required: false }] }], uploadMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "uploadMode", required: false }] }], uploadData: [{ type: i0.Input, args: [{ isSignal: true, alias: "uploadData", required: false }] }], uploadHeaders: [{ type: i0.Input, args: [{ isSignal: true, alias: "uploadHeaders", required: false }] }], uploadWithCredentials: [{ type: i0.Input, args: [{ isSignal: true, alias: "uploadWithCredentials", required: false }] }], filesAdded: [{ type: i0.Output, args: ["filesAdded"] }], filesRejected: [{ type: i0.Output, args: ["filesRejected"] }], filesChange: [{ type: i0.Output, args: ["filesChange"] }], uploadStarted: [{ type: i0.Output, args: ["uploadStarted"] }], uploadProgress: [{ type: i0.Output, args: ["uploadProgress"] }], uploadSuccess: [{ type: i0.Output, args: ["uploadSuccess"] }], uploadError: [{ type: i0.Output, args: ["uploadError"] }], fileInput: [{ type: i0.ViewChild, args: ['fileInput', { isSignal: true }] }] } });
511
511
 
512
512
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-kit-dropzone.mjs","sources":["../../../projects/libs/dropzone/services/ngx-dropzone-http-upload.service.ts","../../../projects/libs/dropzone/services/ngx-dropzone-upload.token.ts","../../../projects/libs/dropzone/utils/file-matching.ts","../../../projects/libs/dropzone/components/dropzone.component.ts","../../../projects/libs/dropzone/components/dropzone.component.html","../../../projects/libs/dropzone/ngx-kit-dropzone.ts"],"sourcesContent":["import {\r\n HttpClient,\r\n HttpEvent,\r\n HttpEventType,\r\n HttpHeaders,\r\n HttpResponse,\r\n type HttpUploadProgressEvent,\r\n} from '@angular/common/http';\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { Observable, filter, map } from 'rxjs';\r\nimport {\r\n NgxDropzoneUploadEvent,\r\n NgxDropzoneUploadRequest,\r\n NgxDropzoneUploadService,\r\n} from '../contracts/dropzone-upload';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class NgxDropzoneHttpUploadService implements NgxDropzoneUploadService {\r\n private readonly http = inject(HttpClient);\r\n\r\n upload<TResponse = unknown>(\r\n request: NgxDropzoneUploadRequest,\r\n ): Observable<NgxDropzoneUploadEvent<TResponse>> {\r\n const body = new FormData();\r\n body.append(request.alias, request.file, request.file.name);\r\n\r\n for (const [key, value] of Object.entries(request.data ?? {})) {\r\n body.append(key, value instanceof Blob ? value : String(value));\r\n }\r\n\r\n const headers =\r\n request.headers instanceof HttpHeaders ? request.headers : new HttpHeaders(request.headers);\r\n\r\n return this.http\r\n .post<TResponse>(request.url, body, {\r\n headers,\r\n withCredentials: request.withCredentials ?? false,\r\n observe: 'events',\r\n reportProgress: true,\r\n })\r\n .pipe(\r\n filter(\r\n (event): event is HttpUploadProgressEvent | HttpResponse<TResponse> =>\r\n event.type === HttpEventType.UploadProgress || event.type === HttpEventType.Response,\r\n ),\r\n map((event): NgxDropzoneUploadEvent<TResponse> => {\r\n if (event.type === HttpEventType.UploadProgress) {\r\n const total = event.total;\r\n\r\n return {\r\n type: 'progress',\r\n loaded: event.loaded,\r\n total,\r\n percent: total ? Math.min(100, Math.round((event.loaded / total) * 100)) : 0,\r\n };\r\n }\r\n\r\n return {\r\n type: 'response',\r\n response: event.body as TResponse,\r\n status: event.status,\r\n headers: event.headers,\r\n };\r\n }),\r\n );\r\n }\r\n}\r\n","import { InjectionToken, inject } from '@angular/core';\r\nimport { NgxDropzoneHttpUploadService } from './ngx-dropzone-http-upload.service';\r\nimport { NgxDropzoneUploadService } from '../contracts/dropzone-upload';\r\n\r\n/**\r\n * Upload adapter used by ngx-dropzone.\r\n *\r\n * Default: Angular HttpClient.\r\n * Override this token at application/component level to use Axios or any\r\n * other upload implementation.\r\n */\r\nexport const NGX_DROPZONE_UPLOAD_SERVICE = new InjectionToken<NgxDropzoneUploadService>(\r\n 'NGX_DROPZONE_UPLOAD_SERVICE',\r\n {\r\n providedIn: 'root',\r\n factory: () => inject(NgxDropzoneHttpUploadService),\r\n },\r\n);\r\n","/**\r\n * چک می‌کنه یه فایل با pattern رشته‌ای accept (مثل input[type=file])\r\n * مطابقت داره یا نه. پشتیبانی می‌شه از:\r\n * - MIME کامل: \"image/png\"\r\n * - MIME با wildcard: \"image/*\"\r\n * - پسوند فایل: \".png\", \".jpg\"\r\n * - لیست کاما-جدا از موارد بالا: \"image/*,.pdf,.docx\"\r\n */\r\nexport function matchesAccept(file: File, accept?: string): boolean {\r\n if (!accept || accept.trim() === '') return true;\r\n\r\n const patterns = accept\r\n .split(',')\r\n .map((p) => p.trim().toLowerCase())\r\n .filter(Boolean);\r\n\r\n if (!patterns.length) return true;\r\n\r\n const fileName = file.name.toLowerCase();\r\n const fileType = (file.type || '').toLowerCase();\r\n\r\n return patterns.some((pattern) => {\r\n if (pattern.startsWith('.')) {\r\n return fileName.endsWith(pattern);\r\n }\r\n if (pattern.endsWith('/*')) {\r\n const prefix = pattern.slice(0, -1); // \"image/\"\r\n return fileType.startsWith(prefix);\r\n }\r\n return fileType === pattern;\r\n });\r\n}\r\n\r\n/** تبدیل بایت به یه رشته‌ی خوانا (KB/MB/GB) */\r\nexport function formatBytes(bytes: number): string {\r\n if (bytes === 0) return '0 B';\r\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(1024));\r\n const value = bytes / Math.pow(1024, i);\r\n return `${value.toFixed(i === 0 ? 0 : 1)} ${units[i]}`;\r\n}\r\n\r\n/** استخراج فایل‌های واقعی از یک DataTransfer، شامل پیمایش بازگشتیِ پوشه‌ها (وقتی مرورگر پشتیبانی کنه) */\r\nexport async function extractFilesFromDataTransfer(dataTransfer: DataTransfer): Promise<File[]> {\r\n const items = Array.from(dataTransfer.items || []);\r\n const hasEntrySupport = items.length > 0 && typeof items[0].webkitGetAsEntry === 'function';\r\n\r\n if (!hasEntrySupport) {\r\n return Array.from(dataTransfer.files || []);\r\n }\r\n\r\n const entries = items\r\n .map((item) => item.webkitGetAsEntry?.())\r\n .filter((e): e is FileSystemEntry => !!e);\r\n\r\n if (!entries.length) {\r\n return Array.from(dataTransfer.files || []);\r\n }\r\n\r\n const files: File[] = [];\r\n await Promise.all(entries.map((entry) => walkEntry(entry, files)));\r\n return files;\r\n}\r\n\r\nfunction walkEntry(entry: FileSystemEntry, out: File[]): Promise<void> {\r\n return new Promise((resolve) => {\r\n if (entry.isFile) {\r\n (entry as FileSystemFileEntry).file(\r\n (file) => {\r\n out.push(file);\r\n resolve();\r\n },\r\n () => resolve(),\r\n );\r\n } else if (entry.isDirectory) {\r\n const reader = (entry as FileSystemDirectoryEntry).createReader();\r\n const readAll: FileSystemEntry[] = [];\r\n const readBatch = () => {\r\n reader.readEntries(\r\n async (batch) => {\r\n if (!batch.length) {\r\n await Promise.all(readAll.map((e) => walkEntry(e, out)));\r\n resolve();\r\n return;\r\n }\r\n readAll.push(...batch);\r\n readBatch();\r\n },\r\n () => resolve(),\r\n );\r\n };\r\n readBatch();\r\n } else {\r\n resolve();\r\n }\r\n });\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n OnDestroy,\r\n computed,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { Subscription, finalize } from 'rxjs';\r\nimport {\r\n NgxDropzoneFile,\r\n NgxDropzoneRejectedFile,\r\n NgxDropzoneRejectionReason,\r\n} from '../contracts/dropzone-file';\r\nimport {\r\n NgxDropzoneUploadProgressEvent,\r\n NgxDropzoneUploadService,\r\n} from '../contracts/dropzone-upload';\r\nimport { NGX_DROPZONE_UPLOAD_SERVICE } from '../services/ngx-dropzone-upload.token';\r\nimport { extractFilesFromDataTransfer, formatBytes, matchesAccept } from '../utils/file-matching';\r\n\r\nlet uidCounter = 0;\r\nfunction nextId(): string {\r\n return `ngx-dz-${Date.now().toString(36)}-${uidCounter++}`;\r\n}\r\n\r\nexport type NgxDropzoneUploadMode = 'all' | 'single';\r\n\r\n@Component({\r\n selector: 'ngx-dropzone',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './dropzone.component.html',\r\n styleUrl: './dropzone.component.scss',\r\n host: {\r\n class: 'ngx-dropzone-host',\r\n },\r\n})\r\nexport class NgxDropzoneComponent implements OnDestroy {\r\n /** الگوی accept مثل input[type=file]: \"image/*\", \".pdf,.docx\" و ... */\r\n accept = input<string>('');\r\n multiple = input<boolean>(true);\r\n /** حداکثر حجم هر فایل به بایت؛ undefined یعنی بدون محدودیت */\r\n maxFileSize = input<number | undefined>(undefined);\r\n /** حداکثر تعداد فایل مجاز؛ undefined یعنی بدون محدودیت */\r\n maxFiles = input<number | undefined>(undefined);\r\n disabled = input<boolean>(false);\r\n /** نمایش لیست/پیش‌نمایش فایل‌های انتخاب‌شده داخل خودِ کامپوننت */\r\n showFileList = input<boolean>(true);\r\n\r\n /** Upload endpoint. */\r\n uploadUrl = input<string>('');\r\n /** Multipart form-data field name. */\r\n uploadAlias = input<string>('file');\r\n /** Automatically enqueue newly accepted files for upload. */\r\n autoUpload = input<boolean>(false);\r\n /** Maximum number of simultaneous uploads. */\r\n maxParallel = input<number>(3);\r\n /**\r\n * Manual upload behavior:\r\n * - all: one \"Upload all\" action uploads all pending files.\r\n * - single: every pending row gets its own Upload button.\r\n */\r\n uploadMode = input<NgxDropzoneUploadMode>('all');\r\n /** Extra multipart form fields sent with every file. */\r\n uploadData = input<Record<string, string | Blob | number | boolean>>({});\r\n /** Optional request headers. */\r\n uploadHeaders = input<Record<string, string | string[]>>({});\r\n /** Send credentials/cookies with the upload request. */\r\n uploadWithCredentials = input<boolean>(false);\r\n\r\n filesAdded = output<File[]>();\r\n filesRejected = output<NgxDropzoneRejectedFile[]>();\r\n filesChange = output<File[]>();\r\n\r\n /** Emitted when an individual upload starts. */\r\n uploadStarted = output<NgxDropzoneFile>();\r\n /** Emitted for every upload progress update. */\r\n uploadProgress = output<NgxDropzoneUploadProgressEvent>();\r\n /** Emitted after a file is successfully uploaded. */\r\n uploadSuccess = output<NgxDropzoneFile>();\r\n /** Emitted when an upload fails. */\r\n uploadError = output<{ item: NgxDropzoneFile; error: unknown }>();\r\n\r\n protected readonly files = signal<NgxDropzoneFile[]>([]);\r\n protected readonly isDragging = signal(false);\r\n private dragCounter = 0;\r\n\r\n private readonly uploadService = inject<NgxDropzoneUploadService>(NGX_DROPZONE_UPLOAD_SERVICE);\r\n private readonly fileInput = viewChild<ElementRef<HTMLInputElement>>('fileInput');\r\n private readonly uploadSubscriptions = new Map<string, Subscription>();\r\n private readonly uploadQueue: string[] = [];\r\n private activeUploads = 0;\r\n private readonly activeUploadIds = new Set<string>();\r\n\r\n protected readonly pendingCount = computed(\r\n () => this.files().filter((item) => this.isPending(item)).length,\r\n );\r\n\r\n protected readonly hasUploadConfiguration = computed(() => this.uploadUrl().trim().length > 0);\r\n\r\n protected readonly hint = computed(() => {\r\n const parts: string[] = [];\r\n const accept = this.accept();\r\n if (accept) parts.push(accept);\r\n const max = this.maxFileSize();\r\n if (max) parts.push(`max ${formatBytes(max)}`);\r\n return parts.join(' · ');\r\n });\r\n\r\n protected formatSize(bytes: number): string {\r\n return formatBytes(bytes);\r\n }\r\n\r\n protected isPending(item: NgxDropzoneFile): boolean {\r\n return item.status === 'pending' || item.status === 'accepted';\r\n }\r\n\r\n protected trackById(_index: number, item: NgxDropzoneFile): string {\r\n return item.id;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n for (const subscription of this.uploadSubscriptions.values()) {\r\n subscription.unsubscribe();\r\n }\r\n this.uploadSubscriptions.clear();\r\n\r\n for (const item of this.files()) {\r\n if (item.previewUrl) URL.revokeObjectURL(item.previewUrl);\r\n }\r\n }\r\n\r\n protected onDragEnter(ev: DragEvent): void {\r\n ev.preventDefault();\r\n if (this.disabled()) return;\r\n this.dragCounter++;\r\n this.isDragging.set(true);\r\n }\r\n\r\n protected onDragOver(ev: DragEvent): void {\r\n ev.preventDefault();\r\n if (ev.dataTransfer) {\r\n ev.dataTransfer.dropEffect = this.disabled() ? 'none' : 'copy';\r\n }\r\n }\r\n\r\n protected onDragLeave(ev: DragEvent): void {\r\n ev.preventDefault();\r\n if (this.disabled()) return;\r\n this.dragCounter = Math.max(0, this.dragCounter - 1);\r\n if (this.dragCounter === 0) this.isDragging.set(false);\r\n }\r\n\r\n protected async onDrop(ev: DragEvent): Promise<void> {\r\n ev.preventDefault();\r\n this.dragCounter = 0;\r\n this.isDragging.set(false);\r\n if (this.disabled() || !ev.dataTransfer) return;\r\n\r\n const files = await extractFilesFromDataTransfer(ev.dataTransfer);\r\n this.handleIncomingFiles(files);\r\n }\r\n\r\n protected onBrowseClick(): void {\r\n if (this.disabled()) return;\r\n this.fileInput()?.nativeElement.click();\r\n }\r\n\r\n protected onKeydown(ev: KeyboardEvent): void {\r\n if (ev.key === 'Enter' || ev.key === ' ') {\r\n ev.preventDefault();\r\n this.onBrowseClick();\r\n }\r\n }\r\n\r\n protected onFileInputChange(ev: Event): void {\r\n const input = ev.target as HTMLInputElement;\r\n const files = Array.from(input.files ?? []);\r\n this.handleIncomingFiles(files);\r\n input.value = '';\r\n }\r\n\r\n protected removeFile(id: string): void {\r\n const target = this.files().find((f) => f.id === id);\r\n this.uploadSubscriptions.get(id)?.unsubscribe();\r\n this.uploadSubscriptions.delete(id);\r\n\r\n // Unsubscribing an HttpClient upload cancels the request. Release its\r\n // concurrency slot immediately; finalize() will see that the id is no\r\n // longer active and won't decrement twice.\r\n if (this.activeUploadIds.delete(id)) {\r\n this.activeUploads = Math.max(0, this.activeUploads - 1);\r\n }\r\n\r\n if (target?.previewUrl) URL.revokeObjectURL(target.previewUrl);\r\n\r\n this.files.update((list) => list.filter((f) => f.id !== id));\r\n\r\n // Remove stale queue entries. The queue is intentionally lazy, so an\r\n // entry can safely remain until pumpQueue() sees that it no longer exists.\r\n this.emitCurrentFiles();\r\n this.pumpQueue();\r\n }\r\n\r\n protected uploadAll(): void {\r\n this.enqueueUploads(\r\n this.files()\r\n .filter((item) => this.isPending(item))\r\n .map((item) => item.id),\r\n );\r\n }\r\n\r\n protected uploadSingle(id: string): void {\r\n this.enqueueUploads([id]);\r\n }\r\n\r\n protected retryUpload(id: string): void {\r\n this.files.update((list) =>\r\n list.map((item) =>\r\n item.id === id ? { ...item, status: 'pending', progress: 0, error: undefined } : item,\r\n ),\r\n );\r\n this.enqueueUploads([id]);\r\n }\r\n\r\n private handleIncomingFiles(incoming: File[]): void {\r\n if (!incoming.length) return;\r\n\r\n const accepted: NgxDropzoneFile[] = [];\r\n const rejected: NgxDropzoneRejectedFile[] = [];\r\n\r\n // A single-file dropzone behaves like a native single-select input:\r\n // selecting another file replaces the previous one.\r\n const existingCount = this.multiple() ? this.files().length : 0;\r\n const maxFiles = this.maxFiles();\r\n const maxSize = this.maxFileSize();\r\n const isMultiple = this.multiple();\r\n\r\n const pool = isMultiple ? incoming : incoming.slice(0, 1);\r\n\r\n for (const file of pool) {\r\n let reason: NgxDropzoneRejectionReason | undefined;\r\n\r\n if (!matchesAccept(file, this.accept())) {\r\n reason = 'type';\r\n } else if (maxSize != null && file.size > maxSize) {\r\n reason = 'size';\r\n } else if (maxFiles != null && existingCount + accepted.length >= maxFiles) {\r\n reason = 'count';\r\n }\r\n\r\n if (reason) {\r\n rejected.push({ file, reason });\r\n continue;\r\n }\r\n\r\n const isImage = file.type.startsWith('image/');\r\n accepted.push({\r\n id: nextId(),\r\n file,\r\n previewUrl: isImage ? URL.createObjectURL(file) : undefined,\r\n status: 'accepted',\r\n progress: 0,\r\n });\r\n }\r\n\r\n if (accepted.length) {\r\n if (!isMultiple) {\r\n for (const previous of this.files()) {\r\n this.uploadSubscriptions.get(previous.id)?.unsubscribe();\r\n this.uploadSubscriptions.delete(previous.id);\r\n this.activeUploadIds.delete(previous.id);\r\n if (previous.previewUrl) URL.revokeObjectURL(previous.previewUrl);\r\n }\r\n this.activeUploads = this.activeUploadIds.size;\r\n }\r\n\r\n this.files.update((list) => (isMultiple ? [...list, ...accepted] : accepted));\r\n this.filesAdded.emit(accepted.map((a) => a.file));\r\n this.emitCurrentFiles();\r\n\r\n if (this.autoUpload()) {\r\n this.enqueueUploads(accepted.map((item) => item.id));\r\n }\r\n }\r\n\r\n if (rejected.length) {\r\n this.filesRejected.emit(rejected);\r\n }\r\n }\r\n\r\n private enqueueUploads(ids: string[]): void {\r\n if (!this.uploadUrl().trim()) {\r\n const error = new Error('ngx-dropzone: uploadUrl is required for uploading files.');\r\n for (const id of ids) this.markUploadError(id, error, false);\r\n return;\r\n }\r\n\r\n const queued = new Set(this.uploadQueue);\r\n for (const id of ids) {\r\n const item = this.files().find((file) => file.id === id);\r\n if (!item || !this.isPending(item) || queued.has(id)) continue;\r\n this.uploadQueue.push(id);\r\n queued.add(id);\r\n }\r\n\r\n this.pumpQueue();\r\n }\r\n\r\n private pumpQueue(): void {\r\n const limit = Math.max(1, Math.floor(this.maxParallel() || 1));\r\n\r\n while (this.activeUploads < limit && this.uploadQueue.length) {\r\n const id = this.uploadQueue.shift()!;\r\n const item = this.files().find((file) => file.id === id);\r\n\r\n if (!item || !this.isPending(item)) continue;\r\n\r\n this.startUpload(item);\r\n }\r\n }\r\n\r\n private startUpload(item: NgxDropzoneFile): void {\r\n this.activeUploads++;\r\n this.activeUploadIds.add(item.id);\r\n\r\n this.updateFile(item.id, {\r\n status: 'uploading',\r\n progress: 0,\r\n error: undefined,\r\n });\r\n\r\n const current = this.files().find((file) => file.id === item.id);\r\n if (current) this.uploadStarted.emit(current);\r\n\r\n let subscription: Subscription;\r\n\r\n try {\r\n subscription = this.uploadService\r\n .upload({\r\n url: this.uploadUrl(),\r\n alias: this.uploadAlias() || 'file',\r\n file: item.file,\r\n data: this.uploadData(),\r\n headers: this.uploadHeaders(),\r\n withCredentials: this.uploadWithCredentials(),\r\n })\r\n .pipe(finalize(() => this.finishUpload(item.id)))\r\n .subscribe({\r\n next: (event) => {\r\n if (event.type === 'progress') {\r\n this.updateFile(item.id, {\r\n progress: event.percent,\r\n });\r\n\r\n const updated = this.files().find((file) => file.id === item.id);\r\n if (updated) {\r\n this.uploadProgress.emit({\r\n item: updated,\r\n loaded: event.loaded,\r\n total: event.total,\r\n percent: event.percent,\r\n });\r\n }\r\n return;\r\n }\r\n\r\n this.updateFile(item.id, {\r\n status: 'uploaded',\r\n progress: 100,\r\n response: event.response,\r\n error: undefined,\r\n });\r\n\r\n const updated = this.files().find((file) => file.id === item.id);\r\n if (updated) this.uploadSuccess.emit(updated);\r\n },\r\n error: (error) => {\r\n this.markUploadError(item.id, error, true);\r\n },\r\n });\r\n } catch (error) {\r\n this.markUploadError(item.id, error, true);\r\n this.finishUpload(item.id);\r\n return;\r\n }\r\n\r\n if (!subscription.closed) this.uploadSubscriptions.set(item.id, subscription);\r\n }\r\n\r\n private markUploadError(id: string, error: unknown, releaseActiveSlot: boolean): void {\r\n this.updateFile(id, {\r\n status: 'error',\r\n error,\r\n });\r\n\r\n const item = this.files().find((file) => file.id === id);\r\n if (item) this.uploadError.emit({ item, error });\r\n\r\n if (!releaseActiveSlot) {\r\n this.pumpQueue();\r\n }\r\n }\r\n\r\n private finishUpload(id: string): void {\r\n this.uploadSubscriptions.delete(id);\r\n\r\n if (this.activeUploadIds.delete(id)) {\r\n this.activeUploads = Math.max(0, this.activeUploads - 1);\r\n }\r\n\r\n this.pumpQueue();\r\n }\r\n\r\n private updateFile(id: string, patch: Partial<NgxDropzoneFile>): void {\r\n this.files.update((list) =>\r\n list.map((item) => (item.id === id ? { ...item, ...patch } : item)),\r\n );\r\n }\r\n\r\n private emitCurrentFiles(): void {\r\n this.filesChange.emit(this.files().map((f) => f.file));\r\n }\r\n}\r\n","<div\r\n class=\"ngx-dropzone\"\r\n [class.dragging]=\"isDragging()\"\r\n [class.disabled]=\"disabled()\"\r\n [class.has-files]=\"files().length > 0\"\r\n tabindex=\"0\"\r\n role=\"button\"\r\n [attr.aria-disabled]=\"disabled()\"\r\n (click)=\"onBrowseClick()\"\r\n (keydown)=\"onKeydown($event)\"\r\n (dragenter)=\"onDragEnter($event)\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\">\r\n <input\r\n #fileInput\r\n type=\"file\"\r\n class=\"ngx-dropzone-input\"\r\n [accept]=\"accept()\"\r\n [multiple]=\"multiple()\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"onFileInputChange($event)\" />\r\n\r\n <div class=\"ngx-dropzone-icon-wrap\">\r\n <ng-content select=\"[dropzone-icon]\">\r\n <svg class=\"ngx-dropzone-icon\" viewBox=\"0 0 24 24\" fill=\"none\" width=\"30\" height=\"30\">\r\n <path\r\n d=\"M12 16V4M12 4l-4 4M12 4l4 4M4 16v2a2 2 0 002 2h12a2 2 0 002-2v-2\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.8\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </ng-content>\r\n </div>\r\n\r\n <div class=\"ngx-dropzone-text\">\r\n <ng-content>\r\n <strong>Drop files here</strong>\r\n <span>or click to browse</span>\r\n </ng-content>\r\n </div>\r\n\r\n @if (hint()) {\r\n <div class=\"ngx-dropzone-hint\">{{ hint() }}</div>\r\n }\r\n</div>\r\n\r\n@if (!autoUpload() && uploadMode() === 'all' && pendingCount() > 0) {\r\n <div class=\"ngx-dropzone-actions\">\r\n <button\r\n type=\"button\"\r\n class=\"ngx-dropzone-upload-all\"\r\n [disabled]=\"disabled() || !hasUploadConfiguration()\"\r\n (click)=\"uploadAll(); $event.stopPropagation()\">\r\n Upload all\r\n <span>{{ pendingCount() }}</span>\r\n </button>\r\n </div>\r\n}\r\n\r\n@if (showFileList() && files().length) {\r\n <ul class=\"ngx-dropzone-list\">\r\n @for (item of files(); track item.id) {\r\n <li class=\"ngx-dropzone-item\" [class.is-uploading]=\"item.status === 'uploading'\">\r\n <div class=\"ngx-dropzone-thumb-wrap\">\r\n @if (item.previewUrl) {\r\n <img class=\"ngx-dropzone-thumb\" [src]=\"item.previewUrl\" [alt]=\"item.file.name\" />\r\n } @else {\r\n <span class=\"ngx-dropzone-file-icon\">📄</span>\r\n }\r\n </div>\r\n\r\n <div class=\"ngx-dropzone-meta\">\r\n <span class=\"ngx-dropzone-name\" [title]=\"item.file.name\">{{ item.file.name }}</span>\r\n <span class=\"ngx-dropzone-size\">{{ formatSize(item.file.size) }}</span>\r\n\r\n @if (item.status === 'uploading' || item.status === 'uploaded') {\r\n <div\r\n class=\"ngx-dropzone-progress\"\r\n role=\"progressbar\"\r\n [attr.aria-valuenow]=\"item.progress\"\r\n aria-valuemin=\"0\"\r\n aria-valuemax=\"100\"\r\n [attr.aria-label]=\"'Upload progress for ' + item.file.name\">\r\n <span class=\"ngx-dropzone-progress-bar\" [style.width.%]=\"item.progress\"></span>\r\n </div>\r\n <span class=\"ngx-dropzone-progress-text\">{{ item.progress }}%</span>\r\n }\r\n\r\n @if (item.status === 'error') {\r\n <span class=\"ngx-dropzone-error\">Upload failed</span>\r\n }\r\n </div>\r\n\r\n <div class=\"ngx-dropzone-row-actions\">\r\n @if (!autoUpload() && uploadMode() === 'single' && isPending(item)) {\r\n <button\r\n type=\"button\"\r\n class=\"ngx-dropzone-upload\"\r\n [disabled]=\"disabled() || !hasUploadConfiguration()\"\r\n [attr.aria-label]=\"'Upload ' + item.file.name\"\r\n (click)=\"uploadSingle(item.id); $event.stopPropagation()\">\r\n Upload\r\n </button>\r\n }\r\n\r\n @if (item.status === 'error') {\r\n <button\r\n type=\"button\"\r\n class=\"ngx-dropzone-retry\"\r\n [disabled]=\"disabled() || !hasUploadConfiguration()\"\r\n [attr.aria-label]=\"'Retry upload for ' + item.file.name\"\r\n (click)=\"retryUpload(item.id); $event.stopPropagation()\">\r\n Retry\r\n </button>\r\n }\r\n\r\n @if (item.status === 'uploaded') {\r\n <span class=\"ngx-dropzone-status success\" aria-label=\"Uploaded\">✓</span>\r\n } @else if (item.status === 'uploading') {\r\n <span class=\"ngx-dropzone-status uploading\" aria-label=\"Uploading\"></span>\r\n } @else if (item.status === 'error') {\r\n <span class=\"ngx-dropzone-status error\" aria-label=\"Upload failed\">!</span>\r\n } @else {\r\n <span class=\"ngx-dropzone-status pending\" aria-label=\"Pending\">•</span>\r\n }\r\n\r\n <button\r\n type=\"button\"\r\n class=\"ngx-dropzone-remove\"\r\n [attr.aria-label]=\"'Remove ' + item.file.name\"\r\n (click)=\"removeFile(item.id); $event.stopPropagation()\">\r\n ✕\r\n </button>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngx-kit-dropzone.mjs","sources":["../../../projects/libs/dropzone/services/ngx-dropzone-http-upload.service.ts","../../../projects/libs/dropzone/services/ngx-dropzone-upload.token.ts","../../../projects/libs/dropzone/utils/file-matching.ts","../../../projects/libs/dropzone/components/dropzone.component.ts","../../../projects/libs/dropzone/components/dropzone.component.html","../../../projects/libs/dropzone/ngx-kit-dropzone.ts"],"sourcesContent":["import {\n HttpClient,\n HttpEvent,\n HttpEventType,\n HttpHeaders,\n HttpResponse,\n HttpUploadProgressEvent,\n} from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { Observable, filter, map } from 'rxjs';\nimport {\n NgxDropzoneUploadEvent,\n NgxDropzoneUploadRequest,\n NgxDropzoneUploadService,\n} from '../contracts/dropzone-upload';\n\n@Injectable({ providedIn: 'root' })\nexport class NgxDropzoneHttpUploadService implements NgxDropzoneUploadService {\n private readonly http = inject(HttpClient);\n\n upload<TResponse = unknown>(\n request: NgxDropzoneUploadRequest,\n ): Observable<NgxDropzoneUploadEvent<TResponse>> {\n const body = new FormData();\n body.append(request.alias, request.file, request.file.name);\n\n for (const [key, value] of Object.entries(request.data ?? {})) {\n body.append(key, value instanceof Blob ? value : String(value));\n }\n\n const headers =\n request.headers instanceof HttpHeaders ? request.headers : new HttpHeaders(request.headers);\n\n return this.http\n .post<TResponse>(request.url, body, {\n headers,\n withCredentials: request.withCredentials ?? false,\n observe: 'events',\n reportProgress: true,\n })\n .pipe(\n filter(\n (event): event is HttpUploadProgressEvent | HttpResponse<TResponse> =>\n event.type === HttpEventType.UploadProgress || event.type === HttpEventType.Response,\n ),\n map((event): NgxDropzoneUploadEvent<TResponse> => {\n if (event.type === HttpEventType.UploadProgress) {\n const total = event.total;\n\n return {\n type: 'progress',\n loaded: event.loaded,\n total,\n percent: total ? Math.min(100, Math.round((event.loaded / total) * 100)) : 0,\n };\n }\n\n return {\n type: 'response',\n response: event.body as TResponse,\n status: event.status,\n headers: event.headers,\n };\n }),\n );\n }\n}\n","import { InjectionToken, inject } from '@angular/core';\nimport { NgxDropzoneHttpUploadService } from './ngx-dropzone-http-upload.service';\nimport { NgxDropzoneUploadService } from '../contracts/dropzone-upload';\n\n/**\n * Upload adapter used by ngx-dropzone.\n *\n * Default: Angular HttpClient.\n * Override this token at application/component level to use Axios or any\n * other upload implementation.\n */\nexport const NGX_DROPZONE_UPLOAD_SERVICE = new InjectionToken<NgxDropzoneUploadService>(\n 'NGX_DROPZONE_UPLOAD_SERVICE',\n {\n providedIn: 'root',\n factory: () => inject(NgxDropzoneHttpUploadService),\n },\n);\n","/**\n * چک می‌کنه یه فایل با pattern رشته‌ای accept (مثل input[type=file])\n * مطابقت داره یا نه. پشتیبانی می‌شه از:\n * - MIME کامل: \"image/png\"\n * - MIME با wildcard: \"image/*\"\n * - پسوند فایل: \".png\", \".jpg\"\n * - لیست کاما-جدا از موارد بالا: \"image/*,.pdf,.docx\"\n */\nexport function matchesAccept(file: File, accept?: string): boolean {\n if (!accept || accept.trim() === '') return true;\n\n const patterns = accept\n .split(',')\n .map((p) => p.trim().toLowerCase())\n .filter(Boolean);\n\n if (!patterns.length) return true;\n\n const fileName = file.name.toLowerCase();\n const fileType = (file.type || '').toLowerCase();\n\n return patterns.some((pattern) => {\n if (pattern.startsWith('.')) {\n return fileName.endsWith(pattern);\n }\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -1); // \"image/\"\n return fileType.startsWith(prefix);\n }\n return fileType === pattern;\n });\n}\n\n/** تبدیل بایت به یه رشته‌ی خوانا (KB/MB/GB) */\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(1024));\n const value = bytes / Math.pow(1024, i);\n return `${value.toFixed(i === 0 ? 0 : 1)} ${units[i]}`;\n}\n\n/** استخراج فایل‌های واقعی از یک DataTransfer، شامل پیمایش بازگشتیِ پوشه‌ها (وقتی مرورگر پشتیبانی کنه) */\nexport async function extractFilesFromDataTransfer(dataTransfer: DataTransfer): Promise<File[]> {\n const items = Array.from(dataTransfer.items || []);\n const hasEntrySupport = items.length > 0 && typeof items[0].webkitGetAsEntry === 'function';\n\n if (!hasEntrySupport) {\n return Array.from(dataTransfer.files || []);\n }\n\n const entries = items\n .map((item) => item.webkitGetAsEntry?.())\n .filter((e): e is FileSystemEntry => !!e);\n\n if (!entries.length) {\n return Array.from(dataTransfer.files || []);\n }\n\n const files: File[] = [];\n await Promise.all(entries.map((entry) => walkEntry(entry, files)));\n return files;\n}\n\nfunction walkEntry(entry: FileSystemEntry, out: File[]): Promise<void> {\n return new Promise((resolve) => {\n if (entry.isFile) {\n (entry as FileSystemFileEntry).file(\n (file) => {\n out.push(file);\n resolve();\n },\n () => resolve(),\n );\n } else if (entry.isDirectory) {\n const reader = (entry as FileSystemDirectoryEntry).createReader();\n const readAll: FileSystemEntry[] = [];\n const readBatch = () => {\n reader.readEntries(\n async (batch) => {\n if (!batch.length) {\n await Promise.all(readAll.map((e) => walkEntry(e, out)));\n resolve();\n return;\n }\n readAll.push(...batch);\n readBatch();\n },\n () => resolve(),\n );\n };\n readBatch();\n } else {\n resolve();\n }\n });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n computed,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { Subscription, finalize } from 'rxjs';\nimport {\n NgxDropzoneFile,\n NgxDropzoneRejectedFile,\n NgxDropzoneRejectionReason,\n} from '../contracts/dropzone-file';\nimport {\n NgxDropzoneUploadProgressEvent,\n NgxDropzoneUploadService,\n} from '../contracts/dropzone-upload';\nimport { NGX_DROPZONE_UPLOAD_SERVICE } from '../services/ngx-dropzone-upload.token';\nimport { extractFilesFromDataTransfer, formatBytes, matchesAccept } from '../utils/file-matching';\n\nlet uidCounter = 0;\nfunction nextId(): string {\n return `ngx-dz-${Date.now().toString(36)}-${uidCounter++}`;\n}\n\nexport type NgxDropzoneUploadMode = 'all' | 'single';\n\n@Component({\n selector: 'ngx-dropzone',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './dropzone.component.html',\n styleUrl: './dropzone.component.scss',\n host: {\n class: 'ngx-dropzone-host',\n },\n})\nexport class NgxDropzoneComponent implements OnDestroy {\n /** الگوی accept مثل input[type=file]: \"image/*\", \".pdf,.docx\" و ... */\n accept = input<string>('');\n multiple = input<boolean>(true);\n /** حداکثر حجم هر فایل به بایت؛ undefined یعنی بدون محدودیت */\n maxFileSize = input<number | undefined>(undefined);\n /** حداکثر تعداد فایل مجاز؛ undefined یعنی بدون محدودیت */\n maxFiles = input<number | undefined>(undefined);\n disabled = input<boolean>(false);\n /** نمایش لیست/پیش‌نمایش فایل‌های انتخاب‌شده داخل خودِ کامپوننت */\n showFileList = input<boolean>(true);\n\n /** Upload endpoint. */\n uploadUrl = input<string>('');\n /** Multipart form-data field name. */\n uploadAlias = input<string>('file');\n /** Automatically enqueue newly accepted files for upload. */\n autoUpload = input<boolean>(false);\n /** Maximum number of simultaneous uploads. */\n maxParallel = input<number>(3);\n /**\n * Manual upload behavior:\n * - all: one \"Upload all\" action uploads all pending files.\n * - single: every pending row gets its own Upload button.\n */\n uploadMode = input<NgxDropzoneUploadMode>('all');\n /** Extra multipart form fields sent with every file. */\n uploadData = input<Record<string, string | Blob | number | boolean>>({});\n /** Optional request headers. */\n uploadHeaders = input<Record<string, string | string[]>>({});\n /** Send credentials/cookies with the upload request. */\n uploadWithCredentials = input<boolean>(false);\n\n filesAdded = output<File[]>();\n filesRejected = output<NgxDropzoneRejectedFile[]>();\n filesChange = output<File[]>();\n\n /** Emitted when an individual upload starts. */\n uploadStarted = output<NgxDropzoneFile>();\n /** Emitted for every upload progress update. */\n uploadProgress = output<NgxDropzoneUploadProgressEvent>();\n /** Emitted after a file is successfully uploaded. */\n uploadSuccess = output<NgxDropzoneFile>();\n /** Emitted when an upload fails. */\n uploadError = output<{ item: NgxDropzoneFile; error: unknown }>();\n\n protected readonly files = signal<NgxDropzoneFile[]>([]);\n protected readonly isDragging = signal(false);\n private dragCounter = 0;\n\n private readonly uploadService = inject<NgxDropzoneUploadService>(NGX_DROPZONE_UPLOAD_SERVICE);\n private readonly fileInput = viewChild<ElementRef<HTMLInputElement>>('fileInput');\n private readonly uploadSubscriptions = new Map<string, Subscription>();\n private readonly uploadQueue: string[] = [];\n private activeUploads = 0;\n private readonly activeUploadIds = new Set<string>();\n\n protected readonly pendingCount = computed(\n () => this.files().filter((item) => this.isPending(item)).length,\n );\n\n protected readonly hasUploadConfiguration = computed(() => this.uploadUrl().trim().length > 0);\n\n protected readonly hint = computed(() => {\n const parts: string[] = [];\n const accept = this.accept();\n if (accept) parts.push(accept);\n const max = this.maxFileSize();\n if (max) parts.push(`max ${formatBytes(max)}`);\n return parts.join(' · ');\n });\n\n protected formatSize(bytes: number): string {\n return formatBytes(bytes);\n }\n\n protected isPending(item: NgxDropzoneFile): boolean {\n return item.status === 'pending' || item.status === 'accepted';\n }\n\n protected trackById(_index: number, item: NgxDropzoneFile): string {\n return item.id;\n }\n\n ngOnDestroy(): void {\n for (const subscription of this.uploadSubscriptions.values()) {\n subscription.unsubscribe();\n }\n this.uploadSubscriptions.clear();\n\n for (const item of this.files()) {\n if (item.previewUrl) URL.revokeObjectURL(item.previewUrl);\n }\n }\n\n protected onDragEnter(ev: DragEvent): void {\n ev.preventDefault();\n if (this.disabled()) return;\n this.dragCounter++;\n this.isDragging.set(true);\n }\n\n protected onDragOver(ev: DragEvent): void {\n ev.preventDefault();\n if (ev.dataTransfer) {\n ev.dataTransfer.dropEffect = this.disabled() ? 'none' : 'copy';\n }\n }\n\n protected onDragLeave(ev: DragEvent): void {\n ev.preventDefault();\n if (this.disabled()) return;\n this.dragCounter = Math.max(0, this.dragCounter - 1);\n if (this.dragCounter === 0) this.isDragging.set(false);\n }\n\n protected async onDrop(ev: DragEvent): Promise<void> {\n ev.preventDefault();\n this.dragCounter = 0;\n this.isDragging.set(false);\n if (this.disabled() || !ev.dataTransfer) return;\n\n const files = await extractFilesFromDataTransfer(ev.dataTransfer);\n this.handleIncomingFiles(files);\n }\n\n protected onBrowseClick(): void {\n if (this.disabled()) return;\n this.fileInput()?.nativeElement.click();\n }\n\n protected onKeydown(ev: KeyboardEvent): void {\n if (ev.key === 'Enter' || ev.key === ' ') {\n ev.preventDefault();\n this.onBrowseClick();\n }\n }\n\n protected onFileInputChange(ev: Event): void {\n const input = ev.target as HTMLInputElement;\n const files = Array.from(input.files ?? []);\n this.handleIncomingFiles(files);\n input.value = '';\n }\n\n protected removeFile(id: string): void {\n const target = this.files().find((f) => f.id === id);\n this.uploadSubscriptions.get(id)?.unsubscribe();\n this.uploadSubscriptions.delete(id);\n\n // Unsubscribing an HttpClient upload cancels the request. Release its\n // concurrency slot immediately; finalize() will see that the id is no\n // longer active and won't decrement twice.\n if (this.activeUploadIds.delete(id)) {\n this.activeUploads = Math.max(0, this.activeUploads - 1);\n }\n\n if (target?.previewUrl) URL.revokeObjectURL(target.previewUrl);\n\n this.files.update((list) => list.filter((f) => f.id !== id));\n\n // Remove stale queue entries. The queue is intentionally lazy, so an\n // entry can safely remain until pumpQueue() sees that it no longer exists.\n this.emitCurrentFiles();\n this.pumpQueue();\n }\n\n protected uploadAll(): void {\n this.enqueueUploads(\n this.files()\n .filter((item) => this.isPending(item))\n .map((item) => item.id),\n );\n }\n\n protected uploadSingle(id: string): void {\n this.enqueueUploads([id]);\n }\n\n protected retryUpload(id: string): void {\n this.files.update((list) =>\n list.map((item) =>\n item.id === id ? { ...item, status: 'pending', progress: 0, error: undefined } : item,\n ),\n );\n this.enqueueUploads([id]);\n }\n\n private handleIncomingFiles(incoming: File[]): void {\n if (!incoming.length) return;\n\n const accepted: NgxDropzoneFile[] = [];\n const rejected: NgxDropzoneRejectedFile[] = [];\n\n // A single-file dropzone behaves like a native single-select input:\n // selecting another file replaces the previous one.\n const existingCount = this.multiple() ? this.files().length : 0;\n const maxFiles = this.maxFiles();\n const maxSize = this.maxFileSize();\n const isMultiple = this.multiple();\n\n const pool = isMultiple ? incoming : incoming.slice(0, 1);\n\n for (const file of pool) {\n let reason: NgxDropzoneRejectionReason | undefined;\n\n if (!matchesAccept(file, this.accept())) {\n reason = 'type';\n } else if (maxSize != null && file.size > maxSize) {\n reason = 'size';\n } else if (maxFiles != null && existingCount + accepted.length >= maxFiles) {\n reason = 'count';\n }\n\n if (reason) {\n rejected.push({ file, reason });\n continue;\n }\n\n const isImage = file.type.startsWith('image/');\n accepted.push({\n id: nextId(),\n file,\n previewUrl: isImage ? URL.createObjectURL(file) : undefined,\n status: 'accepted',\n progress: 0,\n });\n }\n\n if (accepted.length) {\n if (!isMultiple) {\n for (const previous of this.files()) {\n this.uploadSubscriptions.get(previous.id)?.unsubscribe();\n this.uploadSubscriptions.delete(previous.id);\n this.activeUploadIds.delete(previous.id);\n if (previous.previewUrl) URL.revokeObjectURL(previous.previewUrl);\n }\n this.activeUploads = this.activeUploadIds.size;\n }\n\n this.files.update((list) => (isMultiple ? [...list, ...accepted] : accepted));\n this.filesAdded.emit(accepted.map((a) => a.file));\n this.emitCurrentFiles();\n\n if (this.autoUpload()) {\n this.enqueueUploads(accepted.map((item) => item.id));\n }\n }\n\n if (rejected.length) {\n this.filesRejected.emit(rejected);\n }\n }\n\n private enqueueUploads(ids: string[]): void {\n if (!this.uploadUrl().trim()) {\n const error = new Error('ngx-dropzone: uploadUrl is required for uploading files.');\n for (const id of ids) this.markUploadError(id, error, false);\n return;\n }\n\n const queued = new Set(this.uploadQueue);\n for (const id of ids) {\n const item = this.files().find((file) => file.id === id);\n if (!item || !this.isPending(item) || queued.has(id)) continue;\n this.uploadQueue.push(id);\n queued.add(id);\n }\n\n this.pumpQueue();\n }\n\n private pumpQueue(): void {\n const limit = Math.max(1, Math.floor(this.maxParallel() || 1));\n\n while (this.activeUploads < limit && this.uploadQueue.length) {\n const id = this.uploadQueue.shift()!;\n const item = this.files().find((file) => file.id === id);\n\n if (!item || !this.isPending(item)) continue;\n\n this.startUpload(item);\n }\n }\n\n private startUpload(item: NgxDropzoneFile): void {\n this.activeUploads++;\n this.activeUploadIds.add(item.id);\n\n this.updateFile(item.id, {\n status: 'uploading',\n progress: 0,\n error: undefined,\n });\n\n const current = this.files().find((file) => file.id === item.id);\n if (current) this.uploadStarted.emit(current);\n\n let subscription: Subscription;\n\n try {\n subscription = this.uploadService\n .upload({\n url: this.uploadUrl(),\n alias: this.uploadAlias() || 'file',\n file: item.file,\n data: this.uploadData(),\n headers: this.uploadHeaders(),\n withCredentials: this.uploadWithCredentials(),\n })\n .pipe(finalize(() => this.finishUpload(item.id)))\n .subscribe({\n next: (event) => {\n if (event.type === 'progress') {\n this.updateFile(item.id, {\n progress: event.percent,\n });\n\n const updated = this.files().find((file) => file.id === item.id);\n if (updated) {\n this.uploadProgress.emit({\n item: updated,\n loaded: event.loaded,\n total: event.total,\n percent: event.percent,\n });\n }\n return;\n }\n\n this.updateFile(item.id, {\n status: 'uploaded',\n progress: 100,\n response: event.response,\n error: undefined,\n });\n\n const updated = this.files().find((file) => file.id === item.id);\n if (updated) this.uploadSuccess.emit(updated);\n },\n error: (error) => {\n this.markUploadError(item.id, error, true);\n },\n });\n } catch (error) {\n this.markUploadError(item.id, error, true);\n this.finishUpload(item.id);\n return;\n }\n\n if (!subscription.closed) this.uploadSubscriptions.set(item.id, subscription);\n }\n\n private markUploadError(id: string, error: unknown, releaseActiveSlot: boolean): void {\n this.updateFile(id, {\n status: 'error',\n error,\n });\n\n const item = this.files().find((file) => file.id === id);\n if (item) this.uploadError.emit({ item, error });\n\n if (!releaseActiveSlot) {\n this.pumpQueue();\n }\n }\n\n private finishUpload(id: string): void {\n this.uploadSubscriptions.delete(id);\n\n if (this.activeUploadIds.delete(id)) {\n this.activeUploads = Math.max(0, this.activeUploads - 1);\n }\n\n this.pumpQueue();\n }\n\n private updateFile(id: string, patch: Partial<NgxDropzoneFile>): void {\n this.files.update((list) =>\n list.map((item) => (item.id === id ? { ...item, ...patch } : item)),\n );\n }\n\n private emitCurrentFiles(): void {\n this.filesChange.emit(this.files().map((f) => f.file));\n }\n}\n","<div\n class=\"ngx-dropzone\"\n [class.dragging]=\"isDragging()\"\n [class.disabled]=\"disabled()\"\n [class.has-files]=\"files().length > 0\"\n tabindex=\"0\"\n role=\"button\"\n [attr.aria-disabled]=\"disabled()\"\n (click)=\"onBrowseClick()\"\n (keydown)=\"onKeydown($event)\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\">\n <input\n #fileInput\n type=\"file\"\n class=\"ngx-dropzone-input\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"disabled()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"onFileInputChange($event)\" />\n\n <div class=\"ngx-dropzone-icon-wrap\">\n <ng-content select=\"[dropzone-icon]\">\n <svg class=\"ngx-dropzone-icon\" viewBox=\"0 0 24 24\" fill=\"none\" width=\"30\" height=\"30\">\n <path\n d=\"M12 16V4M12 4l-4 4M12 4l4 4M4 16v2a2 2 0 002 2h12a2 2 0 002-2v-2\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </ng-content>\n </div>\n\n <div class=\"ngx-dropzone-text\">\n <ng-content>\n <strong>Drop files here</strong>\n <span>or click to browse</span>\n </ng-content>\n </div>\n\n @if (hint()) {\n <div class=\"ngx-dropzone-hint\">{{ hint() }}</div>\n }\n</div>\n\n@if (!autoUpload() && uploadMode() === 'all' && pendingCount() > 0) {\n <div class=\"ngx-dropzone-actions\">\n <button\n type=\"button\"\n class=\"ngx-dropzone-upload-all\"\n [disabled]=\"disabled() || !hasUploadConfiguration()\"\n (click)=\"uploadAll(); $event.stopPropagation()\">\n Upload all\n <span>{{ pendingCount() }}</span>\n </button>\n </div>\n}\n\n@if (showFileList() && files().length) {\n <ul class=\"ngx-dropzone-list\">\n @for (item of files(); track item.id) {\n <li class=\"ngx-dropzone-item\" [class.is-uploading]=\"item.status === 'uploading'\">\n <div class=\"ngx-dropzone-thumb-wrap\">\n @if (item.previewUrl) {\n <img class=\"ngx-dropzone-thumb\" [src]=\"item.previewUrl\" [alt]=\"item.file.name\" />\n } @else {\n <span class=\"ngx-dropzone-file-icon\">📄</span>\n }\n </div>\n\n <div class=\"ngx-dropzone-meta\">\n <span class=\"ngx-dropzone-name\" [title]=\"item.file.name\">{{ item.file.name }}</span>\n <span class=\"ngx-dropzone-size\">{{ formatSize(item.file.size) }}</span>\n\n @if (item.status === 'uploading' || item.status === 'uploaded') {\n <div\n class=\"ngx-dropzone-progress\"\n role=\"progressbar\"\n [attr.aria-valuenow]=\"item.progress\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-label]=\"'Upload progress for ' + item.file.name\">\n <span class=\"ngx-dropzone-progress-bar\" [style.width.%]=\"item.progress\"></span>\n </div>\n <span class=\"ngx-dropzone-progress-text\">{{ item.progress }}%</span>\n }\n\n @if (item.status === 'error') {\n <span class=\"ngx-dropzone-error\">Upload failed</span>\n }\n </div>\n\n <div class=\"ngx-dropzone-row-actions\">\n @if (!autoUpload() && uploadMode() === 'single' && isPending(item)) {\n <button\n type=\"button\"\n class=\"ngx-dropzone-upload\"\n [disabled]=\"disabled() || !hasUploadConfiguration()\"\n [attr.aria-label]=\"'Upload ' + item.file.name\"\n (click)=\"uploadSingle(item.id); $event.stopPropagation()\">\n Upload\n </button>\n }\n\n @if (item.status === 'error') {\n <button\n type=\"button\"\n class=\"ngx-dropzone-retry\"\n [disabled]=\"disabled() || !hasUploadConfiguration()\"\n [attr.aria-label]=\"'Retry upload for ' + item.file.name\"\n (click)=\"retryUpload(item.id); $event.stopPropagation()\">\n Retry\n </button>\n }\n\n @if (item.status === 'uploaded') {\n <span class=\"ngx-dropzone-status success\" aria-label=\"Uploaded\">✓</span>\n } @else if (item.status === 'uploading') {\n <span class=\"ngx-dropzone-status uploading\" aria-label=\"Uploading\"></span>\n } @else if (item.status === 'error') {\n <span class=\"ngx-dropzone-status error\" aria-label=\"Upload failed\">!</span>\n } @else {\n <span class=\"ngx-dropzone-status pending\" aria-label=\"Pending\">•</span>\n }\n\n <button\n type=\"button\"\n class=\"ngx-dropzone-remove\"\n [attr.aria-label]=\"'Remove ' + item.file.name\"\n (click)=\"removeFile(item.id); $event.stopPropagation()\">\n ✕\n </button>\n </div>\n </li>\n }\n </ul>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}