@shival99/z-ui 2.0.23 → 2.0.25
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.
|
@@ -234,6 +234,7 @@ class ZGalleryItemComponent {
|
|
|
234
234
|
icon: style.icon,
|
|
235
235
|
};
|
|
236
236
|
}, ...(ngDevMode ? [{ debugName: "categoryStyle" }] : []));
|
|
237
|
+
fileTypeClasses = computed(() => zMergeClasses('inline-flex min-w-14 items-center justify-center rounded-sm border border-black/5 px-2.5 py-1 text-[0.6875rem] font-semibold tracking-wide dark:border-white/10', this.categoryStyle().bg, this.categoryStyle().text), ...(ngDevMode ? [{ debugName: "fileTypeClasses" }] : []));
|
|
237
238
|
canPreview = computed(() => isPreviewable(this.file()), ...(ngDevMode ? [{ debugName: "canPreview" }] : []));
|
|
238
239
|
onImageLoad() {
|
|
239
240
|
this.isLoading.set(false);
|
|
@@ -397,7 +398,7 @@ class ZGalleryItemComponent {
|
|
|
397
398
|
</div>
|
|
398
399
|
} @else {
|
|
399
400
|
<div
|
|
400
|
-
class="group border-border bg-card hover:border-primary/35 flex cursor-pointer items-center gap-3 rounded-
|
|
401
|
+
class="group border-border bg-card hover:border-primary/35 flex cursor-pointer items-center gap-3 rounded-sm border px-3 py-2.5 shadow-sm transition-all duration-200 hover:shadow-md"
|
|
401
402
|
[class.border-primary]="zSelected()"
|
|
402
403
|
[class.ring-1]="zSelected()"
|
|
403
404
|
[class.ring-primary/30]="zSelected()"
|
|
@@ -416,18 +417,24 @@ class ZGalleryItemComponent {
|
|
|
416
417
|
}
|
|
417
418
|
|
|
418
419
|
<div
|
|
419
|
-
class="flex size-11 shrink-0 items-center justify-center rounded-
|
|
420
|
-
[class]="categoryStyle().bg"
|
|
420
|
+
class="relative flex size-11 shrink-0 items-center justify-center overflow-hidden rounded-sm border border-black/5 bg-white/40 shadow-sm backdrop-blur-sm dark:border-white/10 dark:bg-white/5"
|
|
421
421
|
>
|
|
422
422
|
@if (isImage() && (file().thumbnailUrl || file().url)) {
|
|
423
423
|
<img
|
|
424
424
|
[src]="file().thumbnailUrl || file().url"
|
|
425
425
|
[alt]="file().name"
|
|
426
|
-
class="size-full rounded-
|
|
426
|
+
class="size-full rounded-sm object-cover"
|
|
427
427
|
loading="lazy"
|
|
428
428
|
/>
|
|
429
429
|
} @else {
|
|
430
|
-
<
|
|
430
|
+
<span class="absolute inset-0 opacity-30 dark:opacity-20" [class]="categoryStyle().bg"></span>
|
|
431
|
+
<i
|
|
432
|
+
z-icon
|
|
433
|
+
[zType]="categoryStyle().icon"
|
|
434
|
+
zSize="18"
|
|
435
|
+
class="relative z-10"
|
|
436
|
+
[class]="categoryStyle().text"
|
|
437
|
+
></i>
|
|
431
438
|
}
|
|
432
439
|
</div>
|
|
433
440
|
|
|
@@ -439,9 +446,7 @@ class ZGalleryItemComponent {
|
|
|
439
446
|
</div>
|
|
440
447
|
|
|
441
448
|
<div class="ml-auto flex shrink-0 items-center gap-1.5">
|
|
442
|
-
<span
|
|
443
|
-
class="text-muted-foreground bg-muted/60 inline-flex min-w-14 items-center justify-center rounded-full border px-2.5 py-1 text-[0.6875rem] font-semibold tracking-wide"
|
|
444
|
-
>
|
|
449
|
+
<span [class]="fileTypeClasses()">
|
|
445
450
|
{{ fileExtension() }}
|
|
446
451
|
</span>
|
|
447
452
|
@if (zShowPreview() && canPreview()) {
|
|
@@ -624,7 +629,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
|
|
|
624
629
|
</div>
|
|
625
630
|
} @else {
|
|
626
631
|
<div
|
|
627
|
-
class="group border-border bg-card hover:border-primary/35 flex cursor-pointer items-center gap-3 rounded-
|
|
632
|
+
class="group border-border bg-card hover:border-primary/35 flex cursor-pointer items-center gap-3 rounded-sm border px-3 py-2.5 shadow-sm transition-all duration-200 hover:shadow-md"
|
|
628
633
|
[class.border-primary]="zSelected()"
|
|
629
634
|
[class.ring-1]="zSelected()"
|
|
630
635
|
[class.ring-primary/30]="zSelected()"
|
|
@@ -643,18 +648,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
|
|
|
643
648
|
}
|
|
644
649
|
|
|
645
650
|
<div
|
|
646
|
-
class="flex size-11 shrink-0 items-center justify-center rounded-
|
|
647
|
-
[class]="categoryStyle().bg"
|
|
651
|
+
class="relative flex size-11 shrink-0 items-center justify-center overflow-hidden rounded-sm border border-black/5 bg-white/40 shadow-sm backdrop-blur-sm dark:border-white/10 dark:bg-white/5"
|
|
648
652
|
>
|
|
649
653
|
@if (isImage() && (file().thumbnailUrl || file().url)) {
|
|
650
654
|
<img
|
|
651
655
|
[src]="file().thumbnailUrl || file().url"
|
|
652
656
|
[alt]="file().name"
|
|
653
|
-
class="size-full rounded-
|
|
657
|
+
class="size-full rounded-sm object-cover"
|
|
654
658
|
loading="lazy"
|
|
655
659
|
/>
|
|
656
660
|
} @else {
|
|
657
|
-
<
|
|
661
|
+
<span class="absolute inset-0 opacity-30 dark:opacity-20" [class]="categoryStyle().bg"></span>
|
|
662
|
+
<i
|
|
663
|
+
z-icon
|
|
664
|
+
[zType]="categoryStyle().icon"
|
|
665
|
+
zSize="18"
|
|
666
|
+
class="relative z-10"
|
|
667
|
+
[class]="categoryStyle().text"
|
|
668
|
+
></i>
|
|
658
669
|
}
|
|
659
670
|
</div>
|
|
660
671
|
|
|
@@ -666,9 +677,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
|
|
|
666
677
|
</div>
|
|
667
678
|
|
|
668
679
|
<div class="ml-auto flex shrink-0 items-center gap-1.5">
|
|
669
|
-
<span
|
|
670
|
-
class="text-muted-foreground bg-muted/60 inline-flex min-w-14 items-center justify-center rounded-full border px-2.5 py-1 text-[0.6875rem] font-semibold tracking-wide"
|
|
671
|
-
>
|
|
680
|
+
<span [class]="fileTypeClasses()">
|
|
672
681
|
{{ fileExtension() }}
|
|
673
682
|
</span>
|
|
674
683
|
@if (zShowPreview() && canPreview()) {
|
|
@@ -1828,7 +1837,7 @@ class ZGalleryComponent {
|
|
|
1828
1837
|
<div class="flex items-center gap-3">
|
|
1829
1838
|
@if (zTitle()) {
|
|
1830
1839
|
@if (zLoading()) {
|
|
1831
|
-
<z-skeleton
|
|
1840
|
+
<z-skeleton zWidth="7rem" zHeight="1.25rem" />
|
|
1832
1841
|
} @else {
|
|
1833
1842
|
<h3 class="text-sm font-medium">{{ zTitle() }}</h3>
|
|
1834
1843
|
}
|
|
@@ -1836,7 +1845,7 @@ class ZGalleryComponent {
|
|
|
1836
1845
|
|
|
1837
1846
|
@if (zShowSearch()) {
|
|
1838
1847
|
@if (zLoading()) {
|
|
1839
|
-
<z-skeleton
|
|
1848
|
+
<z-skeleton zWidth="16rem" [zHeight]="headerControlHeight()" zRadius="0.375rem" />
|
|
1840
1849
|
} @else {
|
|
1841
1850
|
<z-input
|
|
1842
1851
|
zSearch
|
|
@@ -1854,7 +1863,7 @@ class ZGalleryComponent {
|
|
|
1854
1863
|
|
|
1855
1864
|
@if (zShowModeToggle() && (zFiles().length > 0 || zLoading())) {
|
|
1856
1865
|
@if (zLoading()) {
|
|
1857
|
-
<z-skeleton
|
|
1866
|
+
<z-skeleton zWidth="5rem" [zHeight]="headerControlHeight()" zRadius="0.375rem" />
|
|
1858
1867
|
} @else {
|
|
1859
1868
|
<z-button-group [(zActive)]="modeIndex">
|
|
1860
1869
|
<button z-button zType="outline" [zSize]="zToggleSize()" z-button-group-item>
|
|
@@ -1874,10 +1883,9 @@ class ZGalleryComponent {
|
|
|
1874
1883
|
<div class="grid gap-4" [class]="gridColumnsClass()" [style.gridTemplateColumns]="gridTemplateColumns()">
|
|
1875
1884
|
@for (item of skeletonItems(); track item) {
|
|
1876
1885
|
<div class="border-border bg-card overflow-hidden rounded-md border shadow-sm">
|
|
1877
|
-
<z-skeleton
|
|
1878
|
-
<div class="
|
|
1879
|
-
<z-skeleton
|
|
1880
|
-
<z-skeleton class="w-2/5" zHeight="0.75rem" />
|
|
1886
|
+
<z-skeleton [zHeight]="skeletonMediaHeight()" zRadius="0" />
|
|
1887
|
+
<div class="p-3">
|
|
1888
|
+
<z-skeleton zWidth="75%" zHeight="0.875rem" />
|
|
1881
1889
|
</div>
|
|
1882
1890
|
</div>
|
|
1883
1891
|
}
|
|
@@ -1885,13 +1893,13 @@ class ZGalleryComponent {
|
|
|
1885
1893
|
} @else {
|
|
1886
1894
|
<div class="flex flex-col gap-2">
|
|
1887
1895
|
@for (item of skeletonItems(); track item) {
|
|
1888
|
-
<div class="border-border bg-card flex items-center gap-3 rounded-
|
|
1889
|
-
<z-skeleton class="
|
|
1896
|
+
<div class="border-border bg-card flex items-center gap-3 rounded-sm border px-3 py-2.5 shadow-sm">
|
|
1897
|
+
<z-skeleton class="shrink-0" zWidth="2.75rem" zHeight="2.75rem" zRadius="0.125rem" />
|
|
1890
1898
|
<div class="min-w-0 flex-1 space-y-2">
|
|
1891
|
-
<z-skeleton
|
|
1892
|
-
<z-skeleton
|
|
1899
|
+
<z-skeleton zWidth="40%" zHeight="0.875rem" />
|
|
1900
|
+
<z-skeleton zWidth="25%" zHeight="0.75rem" />
|
|
1893
1901
|
</div>
|
|
1894
|
-
<z-skeleton class="
|
|
1902
|
+
<z-skeleton class="shrink-0" zWidth="3.5rem" zHeight="1.5rem" zRadius="0.125rem" />
|
|
1895
1903
|
</div>
|
|
1896
1904
|
}
|
|
1897
1905
|
</div>
|
|
@@ -2041,7 +2049,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
|
|
|
2041
2049
|
<div class="flex items-center gap-3">
|
|
2042
2050
|
@if (zTitle()) {
|
|
2043
2051
|
@if (zLoading()) {
|
|
2044
|
-
<z-skeleton
|
|
2052
|
+
<z-skeleton zWidth="7rem" zHeight="1.25rem" />
|
|
2045
2053
|
} @else {
|
|
2046
2054
|
<h3 class="text-sm font-medium">{{ zTitle() }}</h3>
|
|
2047
2055
|
}
|
|
@@ -2049,7 +2057,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
|
|
|
2049
2057
|
|
|
2050
2058
|
@if (zShowSearch()) {
|
|
2051
2059
|
@if (zLoading()) {
|
|
2052
|
-
<z-skeleton
|
|
2060
|
+
<z-skeleton zWidth="16rem" [zHeight]="headerControlHeight()" zRadius="0.375rem" />
|
|
2053
2061
|
} @else {
|
|
2054
2062
|
<z-input
|
|
2055
2063
|
zSearch
|
|
@@ -2067,7 +2075,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
|
|
|
2067
2075
|
|
|
2068
2076
|
@if (zShowModeToggle() && (zFiles().length > 0 || zLoading())) {
|
|
2069
2077
|
@if (zLoading()) {
|
|
2070
|
-
<z-skeleton
|
|
2078
|
+
<z-skeleton zWidth="5rem" [zHeight]="headerControlHeight()" zRadius="0.375rem" />
|
|
2071
2079
|
} @else {
|
|
2072
2080
|
<z-button-group [(zActive)]="modeIndex">
|
|
2073
2081
|
<button z-button zType="outline" [zSize]="zToggleSize()" z-button-group-item>
|
|
@@ -2087,10 +2095,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
|
|
|
2087
2095
|
<div class="grid gap-4" [class]="gridColumnsClass()" [style.gridTemplateColumns]="gridTemplateColumns()">
|
|
2088
2096
|
@for (item of skeletonItems(); track item) {
|
|
2089
2097
|
<div class="border-border bg-card overflow-hidden rounded-md border shadow-sm">
|
|
2090
|
-
<z-skeleton
|
|
2091
|
-
<div class="
|
|
2092
|
-
<z-skeleton
|
|
2093
|
-
<z-skeleton class="w-2/5" zHeight="0.75rem" />
|
|
2098
|
+
<z-skeleton [zHeight]="skeletonMediaHeight()" zRadius="0" />
|
|
2099
|
+
<div class="p-3">
|
|
2100
|
+
<z-skeleton zWidth="75%" zHeight="0.875rem" />
|
|
2094
2101
|
</div>
|
|
2095
2102
|
</div>
|
|
2096
2103
|
}
|
|
@@ -2098,13 +2105,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
|
|
|
2098
2105
|
} @else {
|
|
2099
2106
|
<div class="flex flex-col gap-2">
|
|
2100
2107
|
@for (item of skeletonItems(); track item) {
|
|
2101
|
-
<div class="border-border bg-card flex items-center gap-3 rounded-
|
|
2102
|
-
<z-skeleton class="
|
|
2108
|
+
<div class="border-border bg-card flex items-center gap-3 rounded-sm border px-3 py-2.5 shadow-sm">
|
|
2109
|
+
<z-skeleton class="shrink-0" zWidth="2.75rem" zHeight="2.75rem" zRadius="0.125rem" />
|
|
2103
2110
|
<div class="min-w-0 flex-1 space-y-2">
|
|
2104
|
-
<z-skeleton
|
|
2105
|
-
<z-skeleton
|
|
2111
|
+
<z-skeleton zWidth="40%" zHeight="0.875rem" />
|
|
2112
|
+
<z-skeleton zWidth="25%" zHeight="0.75rem" />
|
|
2106
2113
|
</div>
|
|
2107
|
-
<z-skeleton class="
|
|
2114
|
+
<z-skeleton class="shrink-0" zWidth="3.5rem" zHeight="1.5rem" zRadius="0.125rem" />
|
|
2108
2115
|
</div>
|
|
2109
2116
|
}
|
|
2110
2117
|
</div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shival99-z-ui-components-z-gallery.mjs","sources":["../../../../libs/core-ui/components/z-gallery/z-gallery.types.ts","../../../../libs/core-ui/components/z-gallery/z-gallery.utils.ts","../../../../libs/core-ui/components/z-gallery/z-gallery-item.component.ts","../../../../libs/core-ui/components/z-gallery/z-gallery-preview.component.ts","../../../../libs/core-ui/components/z-gallery/z-gallery.variants.ts","../../../../libs/core-ui/components/z-gallery/z-gallery.component.ts","../../../../libs/core-ui/components/z-gallery/z-gallery-file-icon.component.ts","../../../../libs/core-ui/components/z-gallery/z-gallery-preview.ref.ts","../../../../libs/core-ui/components/z-gallery/z-gallery-preview.service.ts","../../../../libs/core-ui/components/z-gallery/shival99-z-ui-components-z-gallery.ts"],"sourcesContent":["export type ZGalleryMode = 'grid' | 'list';\nexport type ZGallerySize = 'sm' | 'default' | 'lg';\nexport type ZGalleryToggleSize = 'xs' | 'sm' | 'default' | 'lg';\n\nexport interface ZGalleryFile {\n id: string;\n name: string;\n size: number;\n type: string;\n url?: string;\n downloadUrl?: string;\n thumbnailUrl?: string;\n createdAt?: Date;\n updatedAt?: Date;\n}\n\nexport type ZFileCategory =\n | 'image'\n | 'pdf'\n | 'word'\n | 'excel'\n | 'powerpoint'\n | 'video'\n | 'audio'\n | 'archive'\n | 'code'\n | 'text'\n | 'unknown';\n\nexport interface ZFileCategoryStyle {\n bg: string;\n text: string;\n label: string;\n icon: string;\n}\n\nexport const FILE_CATEGORY_STYLES: Record<ZFileCategory, ZFileCategoryStyle> = {\n image: {\n bg: 'bg-purple-100 dark:bg-purple-900/30',\n text: 'text-purple-600 dark:text-purple-400',\n label: 'IMG',\n icon: 'lucideImage',\n },\n pdf: {\n bg: 'bg-red-100 dark:bg-red-900/30',\n text: 'text-red-600 dark:text-red-400',\n label: 'PDF',\n icon: 'lucideFileText',\n },\n word: {\n bg: 'bg-blue-100 dark:bg-blue-900/30',\n text: 'text-blue-600 dark:text-blue-400',\n label: 'DOC',\n icon: 'lucideFileText',\n },\n excel: {\n bg: 'bg-green-100 dark:bg-green-900/30',\n text: 'text-green-600 dark:text-green-400',\n label: 'XLS',\n icon: 'lucideFileSpreadsheet',\n },\n powerpoint: {\n bg: 'bg-orange-100 dark:bg-orange-900/30',\n text: 'text-orange-600 dark:text-orange-400',\n label: 'PPT',\n icon: 'lucideFileText',\n },\n video: {\n bg: 'bg-pink-100 dark:bg-pink-900/30',\n text: 'text-pink-600 dark:text-pink-400',\n label: 'VID',\n icon: 'lucideVideo',\n },\n audio: {\n bg: 'bg-yellow-100 dark:bg-yellow-900/30',\n text: 'text-yellow-700 dark:text-yellow-400',\n label: 'AUD',\n icon: 'lucideMusic',\n },\n archive: {\n bg: 'bg-amber-100 dark:bg-amber-900/30',\n text: 'text-amber-600 dark:text-amber-400',\n label: 'ZIP',\n icon: 'lucideFileArchive',\n },\n code: {\n bg: 'bg-slate-100 dark:bg-slate-800',\n text: 'text-slate-600 dark:text-slate-400',\n label: 'CODE',\n icon: 'lucideCode',\n },\n text: {\n bg: 'bg-gray-100 dark:bg-gray-800',\n text: 'text-gray-600 dark:text-gray-400',\n label: 'TXT',\n icon: 'lucideFileText',\n },\n unknown: {\n bg: 'bg-gray-100 dark:bg-gray-800',\n text: 'text-gray-500 dark:text-gray-400',\n label: 'FILE',\n icon: 'lucideFile',\n },\n};\n\nexport interface ZGalleryControl {\n setMode: (mode: ZGalleryMode) => void;\n getMode: () => ZGalleryMode;\n getFiles: () => ZGalleryFile[];\n openPreview: (file: ZGalleryFile) => void;\n closePreview: () => void;\n // Selection methods\n selectAll: () => void;\n deselectAll: () => void;\n toggleSelection: (file: ZGalleryFile) => void;\n getSelectedFiles: () => ZGalleryFile[];\n isSelected: (file: ZGalleryFile) => boolean;\n}\n\n/**\n * Action types emitted by gallery events\n */\nexport type ZGalleryActionType =\n | 'select'\n | 'deselect'\n | 'select-all'\n | 'deselect-all'\n | 'delete'\n | 'download'\n | 'preview';\n\n/**\n * Event payload for zOnAction output\n */\nexport interface ZGalleryActionEvent {\n type: ZGalleryActionType;\n file?: ZGalleryFile;\n files?: ZGalleryFile[];\n}\n\n/**\n * Selection change event\n */\nexport interface ZGallerySelectionChange {\n selectedFiles: ZGalleryFile[];\n addedFiles?: ZGalleryFile[];\n removedFiles?: ZGalleryFile[];\n}\n\nexport interface ZGalleryPreviewOptions {\n file: ZGalleryFile;\n files?: ZGalleryFile[];\n zDownload?: boolean;\n zShowRemove?: boolean;\n zTrustedResourceOrigins?: string[];\n zOnClose?: () => void;\n zOnDownload?: (file: ZGalleryFile) => void;\n zOnNavigate?: (file: ZGalleryFile) => void;\n zOnRemove?: (file: ZGalleryFile) => void;\n}\n","import type { ZFileCategory, ZGalleryFile } from './z-gallery.types';\n\nconst IMAGE_EXTENSIONS = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'bmp', 'ico'];\nconst VIDEO_EXTENSIONS = ['mp4', 'avi', 'mov', 'wmv', 'flv', 'webm', 'mkv'];\nconst AUDIO_EXTENSIONS = ['mp3', 'wav', 'ogg', 'flac', 'aac', 'm4a'];\nconst ARCHIVE_EXTENSIONS = ['zip', 'rar', 'tar', 'gz', '7z', 'bz2'];\nconst CODE_EXTENSIONS = [\n 'js',\n 'ts',\n 'jsx',\n 'tsx',\n 'html',\n 'css',\n 'scss',\n 'json',\n 'xml',\n 'py',\n 'java',\n 'c',\n 'cpp',\n 'go',\n 'rs',\n 'php',\n 'rb',\n 'swift',\n 'kt',\n];\nconst TEXT_EXTENSIONS = ['txt', 'md', 'log'];\nconst WORD_EXTENSIONS = ['doc', 'docx', 'odt', 'rtf'];\nconst EXCEL_EXTENSIONS = ['xls', 'xlsx', 'csv', 'ods'];\nconst POWERPOINT_EXTENSIONS = ['ppt', 'pptx', 'odp'];\n\nconst FILE_SIZE_UNITS = ['B', 'KB', 'MB', 'GB'];\nconst FILE_SIZE_BASE = 1024;\n\nexport const getFileCategory = (file: ZGalleryFile): ZFileCategory => {\n const type = file.type?.toLowerCase() || '';\n const name = file.name?.toLowerCase() || '';\n const ext = name.split('.').pop() || '';\n\n if (type.startsWith('image/') || IMAGE_EXTENSIONS.includes(ext)) {\n return 'image';\n }\n\n if (type === 'application/pdf' || ext === 'pdf') {\n return 'pdf';\n }\n\n if (type.includes('excel') || type.includes('spreadsheet') || EXCEL_EXTENSIONS.includes(ext)) {\n return 'excel';\n }\n\n if (type.includes('powerpoint') || type.includes('presentation') || POWERPOINT_EXTENSIONS.includes(ext)) {\n return 'powerpoint';\n }\n\n if (type.includes('word') || type.includes('wordprocessingml') || WORD_EXTENSIONS.includes(ext)) {\n return 'word';\n }\n\n if (type.startsWith('video/') || VIDEO_EXTENSIONS.includes(ext)) {\n return 'video';\n }\n\n if (type.startsWith('audio/') || AUDIO_EXTENSIONS.includes(ext)) {\n return 'audio';\n }\n\n if (\n type.includes('zip') ||\n type.includes('rar') ||\n type.includes('tar') ||\n type.includes('compressed') ||\n ARCHIVE_EXTENSIONS.includes(ext)\n ) {\n return 'archive';\n }\n\n if (CODE_EXTENSIONS.includes(ext)) {\n return 'code';\n }\n\n if (type.startsWith('text/') || TEXT_EXTENSIONS.includes(ext)) {\n return 'text';\n }\n\n return 'unknown';\n};\n\nexport const formatFileSize = (bytes: number): string => {\n if (bytes === 0) {\n return '0 B';\n }\n\n const i = Math.floor(Math.log(bytes) / Math.log(FILE_SIZE_BASE));\n const size = bytes / Math.pow(FILE_SIZE_BASE, i);\n return `${size.toFixed(i > 0 ? 1 : 0)} ${FILE_SIZE_UNITS[i]}`;\n};\n\nexport const isPreviewable = (file: ZGalleryFile): boolean => {\n const category = getFileCategory(file);\n return (\n category === 'image' ||\n category === 'pdf' ||\n category === 'video' ||\n category === 'word' ||\n category === 'excel' ||\n category === 'text' ||\n category === 'code'\n );\n};\n\nexport const isImage = (file: ZGalleryFile): boolean => getFileCategory(file) === 'image';\n","import { ChangeDetectionStrategy, Component, computed, input, output, signal, ViewEncapsulation } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ZButtonComponent } from '@shival99/z-ui/components/z-button';\nimport { ZIconComponent, type ZIcon } from '@shival99/z-ui/components/z-icon';\nimport { ZSkeletonComponent } from '@shival99/z-ui/components/z-skeleton';\nimport { ZTooltipDirective } from '@shival99/z-ui/components/z-tooltip';\nimport {\n FILE_CATEGORY_STYLES,\n type ZFileCategoryStyle,\n type ZGalleryFile,\n type ZGalleryMode,\n type ZGallerySize,\n} from './z-gallery.types';\nimport { formatFileSize, getFileCategory, isPreviewable } from './z-gallery.utils';\n\n@Component({\n selector: 'z-gallery-item',\n imports: [ZButtonComponent, ZIconComponent, ZTooltipDirective, ZSkeletonComponent, TranslatePipe],\n standalone: true,\n template: `\n @if (zMode() === 'grid') {\n <div\n class=\"group border-border bg-card hover:border-primary/30 relative cursor-pointer overflow-hidden rounded-md border shadow-sm transition-all duration-300 hover:shadow-lg\"\n [class.border-primary]=\"zSelected()\"\n [class.ring-1]=\"zSelected()\"\n [class.ring-primary/35]=\"zSelected()\"\n (click)=\"onItemClick()\"\n >\n @if (zSelectable()) {\n <div\n class=\"bg-primary shadow-card absolute top-3 right-3 z-20 flex size-6 items-center justify-center rounded-full transition-all duration-200\"\n [class.scale-100]=\"zSelected()\"\n [class.opacity-100]=\"zSelected()\"\n [class.scale-90]=\"!zSelected()\"\n [class.opacity-0]=\"!zSelected()\"\n >\n <i z-icon zType=\"lucideCheck\" zSize=\"14\" class=\"text-primary-foreground\"></i>\n </div>\n }\n\n <div class=\"relative overflow-hidden\" [class]=\"mediaHeightClass()\">\n @if (isImage()) {\n @if (isLoading()) {\n <div class=\"absolute inset-0\">\n <z-skeleton class=\"size-full\" />\n </div>\n }\n <img\n [src]=\"file().thumbnailUrl || file().url\"\n [alt]=\"file().name\"\n class=\"size-full object-cover transition-all duration-500\"\n [class.opacity-0]=\"isLoading()\"\n [class.scale-100]=\"!isLoading()\"\n [class.group-hover:scale-110]=\"!isLoading()\"\n loading=\"lazy\"\n (load)=\"onImageLoad()\"\n (error)=\"onImageError()\"\n />\n } @else {\n <div\n class=\"flex size-full flex-col items-center justify-center gap-2 bg-gradient-to-br\"\n [class]=\"categoryStyle().bg\"\n >\n <i z-icon [zType]=\"categoryStyle().icon\" zSize=\"34\" [class]=\"categoryStyle().text\"></i>\n <span class=\"text-xs font-semibold tracking-wide\" [class]=\"categoryStyle().text\">\n {{ categoryStyle().label }}\n </span>\n </div>\n }\n\n <div class=\"absolute inset-x-0 top-0 z-10 flex items-start justify-between p-3\">\n <span\n class=\"rounded-full border border-white/35 bg-black/45 px-2.5 py-1 text-[0.6875rem] font-semibold tracking-wide text-white backdrop-blur-md\"\n >\n {{ fileExtension() }}\n </span>\n <span\n class=\"rounded-full border border-white/25 bg-black/35 px-2 py-1 text-[0.625rem] font-medium text-white/95 backdrop-blur-md\"\n >\n {{ formattedSize() }}\n </span>\n </div>\n\n <div\n class=\"absolute inset-x-0 bottom-0 h-24 bg-gradient-to-t from-black/70 via-black/30 to-transparent opacity-85 transition-opacity duration-300 group-hover:opacity-100\"\n ></div>\n\n <div\n class=\"absolute right-3 bottom-3 z-20 flex items-center gap-1.5 rounded-full border border-white/20 bg-black/40 p-1 opacity-0 backdrop-blur-md transition-all duration-200 group-hover:opacity-100\"\n >\n @if (zShowPreview() && canPreview()) {\n <button\n z-button\n zType=\"secondary\"\n zSize=\"xs\"\n zShape=\"circle\"\n class=\"shadow-lg\"\n (click)=\"onPreviewClick($event)\"\n z-tooltip\n [zContent]=\"'i18n_z_ui_gallery_preview' | translate\"\n >\n <i z-icon zType=\"lucideEye\" zSize=\"14\"></i>\n </button>\n }\n @if (zShowDownload() && (file().downloadUrl || file().url)) {\n <button\n z-button\n zType=\"secondary\"\n zSize=\"xs\"\n zShape=\"circle\"\n class=\"shadow-lg\"\n (click)=\"onDownload($event)\"\n z-tooltip\n [zContent]=\"'i18n_z_ui_gallery_download' | translate\"\n >\n <i z-icon zType=\"lucideDownload\" zSize=\"14\"></i>\n </button>\n }\n @if (zShowRemove()) {\n <button\n z-button\n zType=\"secondary\"\n zSize=\"xs\"\n zShape=\"circle\"\n class=\"shadow-lg\"\n (click)=\"onRemove($event)\"\n z-tooltip\n [zContent]=\"'i18n_z_ui_gallery_remove' | translate\"\n >\n <i z-icon zType=\"lucideTrash2\" zSize=\"14\"></i>\n </button>\n }\n </div>\n </div>\n\n <div class=\"p-3\">\n <p class=\"text-foreground truncate text-sm leading-normal font-semibold\" z-tooltip [zContent]=\"file().name\">\n {{ file().name }}\n </p>\n @if (formattedDate()) {\n <p class=\"text-muted-foreground mt-1 text-xs\">{{ formattedDate() }}</p>\n }\n </div>\n </div>\n } @else {\n <div\n class=\"group border-border bg-card hover:border-primary/35 flex cursor-pointer items-center gap-3 rounded-xl border px-3 py-2.5 shadow-sm transition-all duration-200 hover:shadow-md\"\n [class.border-primary]=\"zSelected()\"\n [class.ring-1]=\"zSelected()\"\n [class.ring-primary/30]=\"zSelected()\"\n (click)=\"onItemClick()\"\n >\n @if (zSelectable()) {\n <div\n class=\"bg-primary -ml-1 flex size-5 shrink-0 items-center justify-center rounded-full transition-all duration-200\"\n [class.scale-100]=\"zSelected()\"\n [class.opacity-100]=\"zSelected()\"\n [class.scale-90]=\"!zSelected()\"\n [class.opacity-0]=\"!zSelected()\"\n >\n <i z-icon zType=\"lucideCheck\" zSize=\"12\" class=\"text-primary-foreground\"></i>\n </div>\n }\n\n <div\n class=\"flex size-11 shrink-0 items-center justify-center rounded-xl border border-white/40 shadow-sm\"\n [class]=\"categoryStyle().bg\"\n >\n @if (isImage() && (file().thumbnailUrl || file().url)) {\n <img\n [src]=\"file().thumbnailUrl || file().url\"\n [alt]=\"file().name\"\n class=\"size-full rounded-xl object-cover\"\n loading=\"lazy\"\n />\n } @else {\n <i z-icon [zType]=\"categoryStyle().icon\" zSize=\"18\" [class]=\"categoryStyle().text\"></i>\n }\n </div>\n\n <div class=\"min-w-0 flex-1\">\n <p class=\"text-foreground truncate text-sm font-medium\" z-tooltip [zContent]=\"file().name\">\n {{ file().name }}\n </p>\n <p class=\"text-muted-foreground truncate text-xs\">{{ formattedSize() }} · {{ categoryStyle().label }}</p>\n </div>\n\n <div class=\"ml-auto flex shrink-0 items-center gap-1.5\">\n <span\n class=\"text-muted-foreground bg-muted/60 inline-flex min-w-14 items-center justify-center rounded-full border px-2.5 py-1 text-[0.6875rem] font-semibold tracking-wide\"\n >\n {{ fileExtension() }}\n </span>\n @if (zShowPreview() && canPreview()) {\n <button\n z-button\n zType=\"ghost\"\n zSize=\"xs\"\n zShape=\"circle\"\n class=\"text-muted-foreground hover:text-foreground\"\n (click)=\"onPreviewClick($event)\"\n z-tooltip\n [zContent]=\"'i18n_z_ui_gallery_preview' | translate\"\n >\n <i z-icon zType=\"lucideEye\" zSize=\"16\"></i>\n </button>\n }\n @if (zShowDownload() && (file().downloadUrl || file().url)) {\n <button\n z-button\n zType=\"ghost\"\n zSize=\"xs\"\n zShape=\"circle\"\n class=\"text-muted-foreground hover:text-foreground\"\n (click)=\"onDownload($event)\"\n z-tooltip\n [zContent]=\"'i18n_z_ui_gallery_download' | translate\"\n >\n <i z-icon zType=\"lucideDownload\" zSize=\"16\"></i>\n </button>\n }\n @if (zShowRemove()) {\n <button\n z-button\n zType=\"ghost\"\n zSize=\"xs\"\n zShape=\"circle\"\n class=\"text-muted-foreground hover:text-destructive\"\n (click)=\"onRemove($event)\"\n z-tooltip\n [zContent]=\"'i18n_z_ui_gallery_remove' | translate\"\n >\n <i z-icon zType=\"lucideTrash2\" zSize=\"16\"></i>\n </button>\n }\n </div>\n </div>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'z-gallery-item block',\n },\n})\nexport class ZGalleryItemComponent {\n public readonly file = input.required<ZGalleryFile>();\n public readonly zMode = input<ZGalleryMode>('grid');\n public readonly zSize = input<ZGallerySize>('default');\n public readonly zShowDownload = input(true);\n public readonly zShowPreview = input(true);\n public readonly zShowRemove = input(false);\n public readonly zSelectable = input(false);\n public readonly zSelected = input(false);\n\n public readonly zOnDownload = output<ZGalleryFile>();\n public readonly zOnPreview = output<ZGalleryFile>();\n public readonly zOnRemove = output<ZGalleryFile>();\n public readonly zOnSelect = output<ZGalleryFile>();\n\n protected readonly isLoading = signal(true);\n protected readonly formattedSize = computed(() => formatFileSize(this.file().size));\n protected readonly category = computed(() => getFileCategory(this.file()));\n protected readonly isImage = computed(() => this.category() === 'image');\n protected readonly fileExtension = computed(() => {\n const fileName = this.file().name;\n const parts = fileName.split('.');\n if (parts.length < 2) {\n return 'FILE';\n }\n\n return parts[parts.length - 1].toUpperCase();\n });\n\n protected readonly mediaHeightClass = computed(() => {\n const size = this.zSize();\n switch (size) {\n case 'sm':\n return 'h-36';\n case 'lg':\n return 'h-56';\n default:\n return 'h-44';\n }\n });\n\n protected readonly formattedDate = computed(() => {\n const file = this.file();\n const date = file.updatedAt || file.createdAt;\n if (!date) {\n return null;\n }\n\n return new Intl.DateTimeFormat(undefined, {\n month: 'short',\n day: '2-digit',\n year: 'numeric',\n }).format(date);\n });\n\n protected readonly categoryStyle = computed<ZFileCategoryStyle & { icon: ZIcon }>(() => {\n const style = FILE_CATEGORY_STYLES[this.category()];\n return {\n ...style,\n icon: style.icon as ZIcon,\n };\n });\n\n protected readonly canPreview = computed(() => isPreviewable(this.file()));\n\n protected onImageLoad(): void {\n this.isLoading.set(false);\n }\n\n protected onImageError(): void {\n this.isLoading.set(false);\n }\n\n protected onDownload(event: Event): void {\n event.stopPropagation();\n this.zOnDownload.emit(this.file());\n }\n\n protected onPreviewClick(event: Event): void {\n event.stopPropagation();\n this.zOnPreview.emit(this.file());\n }\n\n protected onPreview(): void {\n if (this.canPreview()) {\n this.zOnPreview.emit(this.file());\n }\n }\n\n protected onItemClick(): void {\n if (this.zSelectable()) {\n this.zOnSelect.emit(this.file());\n return;\n }\n\n this.onPreview();\n }\n\n protected onRemove(event: Event): void {\n event.stopPropagation();\n this.zOnRemove.emit(this.file());\n }\n\n protected onSelectClick(event: Event): void {\n event.stopPropagation();\n this.zOnSelect.emit(this.file());\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml, SafeResourceUrl } from '@angular/platform-browser';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ZButtonComponent } from '@shival99/z-ui/components/z-button';\nimport { ZIconComponent, type ZIcon } from '@shival99/z-ui/components/z-icon';\nimport { ZSkeletonComponent } from '@shival99/z-ui/components/z-skeleton';\nimport { ZTooltipDirective } from '@shival99/z-ui/components/z-tooltip';\nimport type { ZGalleryFile } from './z-gallery.types';\nimport { formatFileSize, getFileCategory, isImage, isPreviewable } from './z-gallery.utils';\n\n@Component({\n selector: 'z-gallery-preview',\n imports: [ZButtonComponent, ZIconComponent, ZSkeletonComponent, ZTooltipDirective, TranslatePipe],\n standalone: true,\n template: `\n <div\n class=\"animate-in fade-in fixed inset-0 z-50 flex items-center justify-center bg-black/80 backdrop-blur-sm duration-200\"\n (click)=\"onBackdropClick($event)\"\n >\n <button\n z-button\n zType=\"ghost\"\n zShape=\"circle\"\n class=\"absolute top-4 right-4 z-10 text-white hover:bg-white/20\"\n (click)=\"close()\"\n >\n <i z-icon zType=\"lucideX\" zSize=\"24\"></i>\n </button>\n\n @if (hasPrev()) {\n <button\n z-button\n zType=\"ghost\"\n zShape=\"circle\"\n class=\"absolute left-4 z-10 text-white hover:bg-white/20\"\n (click)=\"navigate(-1)\"\n >\n <i z-icon zType=\"lucideChevronLeft\" zSize=\"32\"></i>\n </button>\n }\n\n @if (hasNext()) {\n <button\n z-button\n zType=\"ghost\"\n zShape=\"circle\"\n class=\"absolute right-4 z-10 text-white hover:bg-white/20\"\n (click)=\"navigate(1)\"\n >\n <i z-icon zType=\"lucideChevronRight\" zSize=\"32\"></i>\n </button>\n }\n\n <div class=\"flex h-full w-full flex-col items-center\" (click)=\"$event.stopPropagation()\">\n <div\n class=\"dark:!border-border absolute top-4 left-1/2 z-10 flex -translate-x-1/2 items-center gap-2 rounded-[0.375rem] border !border-transparent bg-black/60 px-4 py-2 text-sm text-white backdrop-blur-sm dark:border\"\n >\n <div class=\"flex min-w-0 items-baseline gap-1.5\">\n <span class=\"max-w-[12.5rem] truncate font-medium\">{{ file().name }}</span>\n <span class=\"shrink-0 text-white/70\">({{ formattedSize() }})</span>\n </div>\n\n @if (files().length > 1) {\n <span class=\"text-white/70\">{{ currentIndex() + 1 }} / {{ files().length }}</span>\n }\n\n <div class=\"ml-1 flex items-center gap-0.5\">\n @if (isImageFile()) {\n <button\n z-button\n zType=\"ghost\"\n zSize=\"xs\"\n zShape=\"circle\"\n class=\"text-white hover:bg-white/20\"\n z-tooltip\n [zContent]=\"'i18n_z_ui_gallery_rotate_left' | translate\"\n (click)=\"rotateLeft()\"\n >\n <i z-icon zType=\"lucideUndo\" zSize=\"14\"></i>\n </button>\n <button\n z-button\n zType=\"ghost\"\n zSize=\"xs\"\n zShape=\"circle\"\n class=\"text-white hover:bg-white/20\"\n z-tooltip\n [zContent]=\"'i18n_z_ui_gallery_rotate_right' | translate\"\n (click)=\"rotateRight()\"\n >\n <i z-icon zType=\"lucideRedo\" zSize=\"14\"></i>\n </button>\n }\n\n <button\n z-button\n zType=\"ghost\"\n zSize=\"xs\"\n zShape=\"circle\"\n class=\"text-white hover:bg-white/20\"\n z-tooltip\n [zContent]=\"'i18n_z_ui_gallery_download' | translate\"\n (click)=\"download()\"\n >\n <i z-icon zType=\"lucideDownload\" zSize=\"14\"></i>\n </button>\n\n @if (zShowRemove()) {\n <button\n z-button\n zType=\"ghost\"\n zSize=\"xs\"\n zShape=\"circle\"\n class=\"text-white hover:bg-white/20\"\n z-tooltip\n [zContent]=\"'i18n_z_ui_gallery_delete' | translate\"\n (click)=\"remove()\"\n >\n <i z-icon zType=\"lucideTrash2\" zSize=\"14\"></i>\n </button>\n }\n </div>\n </div>\n\n <div class=\"relative flex flex-1 items-center justify-center pt-16\">\n @if (isImageFile()) {\n <div class=\"relative flex h-[60vh] w-[70vw] items-center justify-center\">\n @if (isLoading()) {\n <z-skeleton class=\"absolute inset-0 rounded-lg\" />\n }\n <img\n [src]=\"file().url || file().thumbnailUrl\"\n [alt]=\"file().name\"\n class=\"max-h-full max-w-full rounded-lg object-contain shadow-2xl transition-opacity duration-300\"\n [class.opacity-0]=\"isLoading()\"\n [class.opacity-100]=\"!isLoading()\"\n [class.cursor-zoom-in]=\"!zoomed()\"\n [class.cursor-zoom-out]=\"zoomed()\"\n [style.transform]=\"imageTransform()\"\n (load)=\"onImageLoad()\"\n (error)=\"onMediaError()\"\n (click)=\"toggleZoom()\"\n />\n </div>\n } @else if (isPdf() && safePdfUrl()) {\n <div class=\"relative h-[75vh] w-[85vw]\">\n @if (isLoading()) {\n <z-skeleton class=\"absolute inset-0 rounded-lg\" />\n }\n <iframe\n [src]=\"safePdfUrl()\"\n class=\"absolute inset-0 size-full rounded-lg bg-white shadow-2xl transition-opacity duration-300\"\n [class.opacity-0]=\"isLoading()\"\n [class.opacity-100]=\"!isLoading()\"\n frameborder=\"0\"\n referrerpolicy=\"no-referrer\"\n (load)=\"onPdfLoad()\"\n ></iframe>\n </div>\n } @else if (isVideo()) {\n <div class=\"relative flex h-[60vh] w-[70vw] items-center justify-center\">\n @if (isLoading()) {\n <z-skeleton class=\"absolute inset-0 rounded-lg\" />\n }\n <video\n [src]=\"file().url\"\n controls\n autoplay\n class=\"max-h-full max-w-full rounded-lg shadow-2xl transition-opacity duration-300\"\n [class.opacity-0]=\"isLoading()\"\n [class.opacity-100]=\"!isLoading()\"\n (loadeddata)=\"onVideoLoad()\"\n (error)=\"onMediaError()\"\n >\n Your browser does not support the video tag.\n </video>\n </div>\n } @else if (isWordFile()) {\n <div class=\"relative h-[75vh] w-[85vw]\">\n @if (isLoading() || isConverting()) {\n <z-skeleton class=\"absolute inset-0 rounded-lg\" />\n }\n @if (conversionError()) {\n <div class=\"bg-card flex size-full flex-col items-center justify-center rounded-lg p-12 shadow-2xl\">\n <div class=\"bg-muted mb-4 flex size-24 items-center justify-center rounded-xl\">\n <i z-icon [zType]=\"fileIcon()\" zSize=\"40\" class=\"text-muted-foreground\"></i>\n </div>\n <span class=\"text-foreground mb-2 text-lg font-medium\">{{ file().name }}</span>\n <span class=\"text-muted-foreground rounded-md bg-red-100 px-3 py-1.5 text-xs dark:bg-red-900/30\">\n <span class=\"text-red-700 dark:text-red-300\">{{ conversionError() }}</span>\n </span>\n </div>\n } @else if (docHtmlContent()) {\n <div\n class=\"absolute inset-0 overflow-auto rounded-lg bg-white p-8 text-gray-950 shadow-2xl\"\n [innerHTML]=\"docHtmlContent()\"\n ></div>\n }\n </div>\n } @else if (isExcelFile()) {\n <div class=\"relative h-[75vh] w-[85vw]\">\n @if (isLoading() || isConverting()) {\n <z-skeleton class=\"absolute inset-0 rounded-lg\" />\n }\n @if (conversionError()) {\n <div class=\"bg-card flex size-full flex-col items-center justify-center rounded-lg p-12 shadow-2xl\">\n <div class=\"bg-muted mb-4 flex size-24 items-center justify-center rounded-xl\">\n <i z-icon [zType]=\"fileIcon()\" zSize=\"40\" class=\"text-muted-foreground\"></i>\n </div>\n <span class=\"text-foreground mb-2 text-lg font-medium\">{{ file().name }}</span>\n <span class=\"text-muted-foreground rounded-md bg-red-100 px-3 py-1.5 text-xs dark:bg-red-900/30\">\n <span class=\"text-red-700 dark:text-red-300\">{{ conversionError() }}</span>\n </span>\n </div>\n } @else if (docHtmlContent()) {\n <div\n class=\"absolute inset-0 overflow-auto rounded-lg bg-white p-4 text-gray-950 shadow-2xl\"\n [innerHTML]=\"docHtmlContent()\"\n ></div>\n }\n </div>\n } @else if (isTextFile()) {\n <div class=\"relative h-[75vh] w-[85vw]\">\n @if (isLoading() || isConverting()) {\n <z-skeleton class=\"absolute inset-0 rounded-lg\" />\n }\n @if (conversionError()) {\n <div class=\"bg-card flex size-full flex-col items-center justify-center rounded-lg p-12 shadow-2xl\">\n <div class=\"bg-muted mb-4 flex size-24 items-center justify-center rounded-xl\">\n <i z-icon [zType]=\"fileIcon()\" zSize=\"40\" class=\"text-muted-foreground\"></i>\n </div>\n <span class=\"text-foreground mb-2 text-lg font-medium\">{{ file().name }}</span>\n <span class=\"text-muted-foreground rounded-md bg-red-100 px-3 py-1.5 text-xs dark:bg-red-900/30\">\n <span class=\"text-red-700 dark:text-red-300\">{{ conversionError() }}</span>\n </span>\n </div>\n } @else if (textContent()) {\n <div class=\"absolute inset-0 overflow-auto rounded-lg bg-gray-950 p-6 shadow-2xl\">\n <pre class=\"font-mono text-sm leading-relaxed whitespace-pre-wrap text-gray-100\">{{\n textContent()\n }}</pre>\n </div>\n }\n </div>\n } @else {\n <div class=\"bg-card flex flex-col items-center justify-center rounded-lg p-12 shadow-2xl\">\n <div class=\"bg-muted mb-4 flex size-24 items-center justify-center rounded-xl\">\n <i z-icon [zType]=\"fileIcon()\" zSize=\"40\" class=\"text-muted-foreground\"></i>\n </div>\n <span class=\"text-foreground mb-2 text-lg font-medium\">{{ file().name }}</span>\n <span class=\"text-muted-foreground mb-4 text-sm\">{{ formattedSize() }}</span>\n <span class=\"text-muted-foreground rounded-md bg-amber-100 px-3 py-1.5 text-xs dark:bg-amber-900/30\">\n <i\n z-icon\n zType=\"lucideInfo\"\n zSize=\"14\"\n class=\"mr-1 inline-block align-middle text-amber-600 dark:text-amber-400\"\n ></i>\n <span class=\"align-middle text-amber-700 dark:text-amber-300\">\n {{ 'i18n_z_ui_gallery_preview_not_supported' | translate }}\n </span>\n </span>\n </div>\n }\n </div>\n </div>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'z-gallery-preview z-[9999]',\n '(document:keydown)': 'onKeyDown($event)',\n },\n})\nexport class ZGalleryPreviewComponent {\n private readonly _sanitizer = inject(DomSanitizer);\n\n public readonly file = input.required<ZGalleryFile>();\n public readonly files = input<ZGalleryFile[]>([]);\n public readonly zShowRemove = input(false);\n public readonly zTrustedResourceOrigins = input<string[]>([]);\n\n public readonly zOnClose = output<void>();\n public readonly zOnDownload = output<ZGalleryFile>();\n public readonly zOnNavigate = output<ZGalleryFile>();\n public readonly zOnRemove = output<ZGalleryFile>();\n\n protected readonly zoomed = signal(false);\n protected readonly isLoading = signal(true);\n protected readonly rotation = signal(0);\n protected readonly isConverting = signal(false);\n protected readonly conversionError = signal<string | null>(null);\n protected readonly docHtmlContent = signal<SafeHtml | null>(null);\n protected readonly textContent = signal<string>('');\n\n private readonly _mediaLoaded = signal(false);\n private _loadingStartTime = 0;\n private readonly _minLoadingTime = 300;\n\n constructor() {\n effect(() => {\n const currentFile = this.file();\n if (!currentFile) {\n return;\n }\n\n this.isLoading.set(true);\n this._mediaLoaded.set(false);\n this._loadingStartTime = Date.now();\n this.zoomed.set(false);\n this.rotation.set(0);\n this.isConverting.set(false);\n this.conversionError.set(null);\n this.docHtmlContent.set(null);\n this.textContent.set('');\n\n const category = getFileCategory(currentFile);\n if (category === 'word' || category === 'excel' || category === 'text' || category === 'code') {\n void this._loadFileContent(currentFile, category);\n }\n });\n }\n\n private async _loadFileContent(file: ZGalleryFile, category: string): Promise<void> {\n const url = file.url || file.downloadUrl;\n if (!url) {\n this.conversionError.set('No URL available for preview');\n this._completeLoading();\n return;\n }\n\n this.isConverting.set(true);\n\n try {\n if (category === 'word') {\n await this._loadDocx(url);\n } else if (category === 'excel') {\n await this._loadExcel(url);\n } else {\n await this._loadText(url);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to load file content';\n this.conversionError.set(message);\n } finally {\n this.isConverting.set(false);\n this._completeLoading();\n }\n }\n\n private async _loadDocx(url: string): Promise<void> {\n const response = await fetch(url);\n this._assertSuccessfulResponse(response);\n const arrayBuffer = await response.arrayBuffer();\n const mammothModule = await import('mammoth');\n const mammoth = mammothModule.default ?? mammothModule;\n const result = await mammoth.convertToHtml({ arrayBuffer });\n this.docHtmlContent.set(this._sanitizer.bypassSecurityTrustHtml(result.value));\n }\n\n private async _loadExcel(url: string): Promise<void> {\n const response = await fetch(url);\n this._assertSuccessfulResponse(response);\n const arrayBuffer = await response.arrayBuffer();\n const xlsxModule = await import('xlsx');\n const XLSX = xlsxModule.default ?? xlsxModule;\n const workbook = XLSX.read(arrayBuffer);\n const firstSheet = workbook.Sheets[workbook.SheetNames[0]];\n const html = XLSX.utils.sheet_to_html(firstSheet);\n this.docHtmlContent.set(this._sanitizer.bypassSecurityTrustHtml(html));\n }\n\n private async _loadText(url: string): Promise<void> {\n const response = await fetch(url);\n this._assertSuccessfulResponse(response);\n const text = await response.text();\n this.textContent.set(text);\n }\n\n private _assertSuccessfulResponse(response: Response): void {\n if (!response.ok) {\n throw new Error(`Failed to fetch file: ${response.status}`);\n }\n }\n\n private _completeLoading(): void {\n const elapsed = Date.now() - this._loadingStartTime;\n const remaining = this._minLoadingTime - elapsed;\n\n if (remaining > 0) {\n setTimeout(() => this.isLoading.set(false), remaining);\n return;\n }\n\n this.isLoading.set(false);\n }\n\n protected readonly currentIndex = computed(() => {\n const allFiles = this.files();\n const current = this.file();\n return allFiles.findIndex(f => f.id === current.id);\n });\n\n protected readonly hasPrev = computed(() => this.currentIndex() > 0);\n protected readonly hasNext = computed(() => this.currentIndex() < this.files().length - 1);\n\n protected readonly isImageFile = computed(() => isImage(this.file()));\n protected readonly isPdf = computed(() => getFileCategory(this.file()) === 'pdf');\n protected readonly safePdfUrl = computed<SafeResourceUrl | null>(() => {\n const { url } = this.file();\n if (!url) {\n return null;\n }\n\n if (!this._isAllowedResourceUrl(url)) {\n return null;\n }\n\n return this._sanitizer.bypassSecurityTrustResourceUrl(url);\n });\n\n protected readonly isVideo = computed(() => getFileCategory(this.file()) === 'video');\n protected readonly isWordFile = computed(() => getFileCategory(this.file()) === 'word');\n protected readonly isExcelFile = computed(() => getFileCategory(this.file()) === 'excel');\n protected readonly isTextFile = computed(() => {\n const category = getFileCategory(this.file());\n return category === 'text' || category === 'code';\n });\n\n protected readonly canPreview = computed(() => isPreviewable(this.file()));\n\n protected readonly formattedSize = computed(() => formatFileSize(this.file().size));\n\n protected readonly imageTransform = computed(() => {\n const rot = this.rotation();\n const zoom = this.zoomed() ? 'scale(1.5)' : 'scale(1)';\n return `rotate(${rot}deg) ${zoom}`;\n });\n\n private _isAllowedResourceUrl(url: string): boolean {\n const currentOrigin = globalThis.location?.origin;\n const baseUrl = currentOrigin ?? 'http://localhost';\n\n try {\n const parsedUrl = new URL(url, baseUrl);\n if (parsedUrl.protocol === 'blob:') {\n return parsedUrl.origin === baseUrl;\n }\n\n return parsedUrl.origin === baseUrl || this._trustedOrigins().has(parsedUrl.origin);\n } catch {\n return false;\n }\n }\n\n private readonly _trustedOrigins = computed(\n () =>\n new Set(\n this.zTrustedResourceOrigins()\n .map(origin => this._normalizeOrigin(origin))\n .filter((origin): origin is string => Boolean(origin))\n )\n );\n\n private _normalizeOrigin(origin: string): string | null {\n try {\n return new URL(origin).origin;\n } catch {\n return null;\n }\n }\n\n protected readonly fileIcon = computed<ZIcon>(() => {\n const category = getFileCategory(this.file());\n const iconMap: Record<string, ZIcon> = {\n pdf: 'lucideFileText',\n word: 'lucideFileText',\n excel: 'lucideFileSpreadsheet',\n video: 'lucideVideo',\n audio: 'lucideMusic',\n archive: 'lucideFileArchive',\n code: 'lucideCode',\n text: 'lucideFileText',\n unknown: 'lucideFile',\n };\n return iconMap[category] || 'lucideFile';\n });\n\n protected onKeyDown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'Escape':\n this.close();\n break;\n case 'ArrowLeft':\n if (this.hasPrev()) {\n this.navigate(-1);\n }\n break;\n case 'ArrowRight':\n if (this.hasNext()) {\n this.navigate(1);\n }\n break;\n case 'r':\n case 'R':\n if (this.isImageFile()) {\n this.rotateRight();\n }\n break;\n }\n }\n\n protected close(): void {\n this.zOnClose.emit();\n }\n\n protected navigate(direction: -1 | 1): void {\n const allFiles = this.files();\n const newIndex = this.currentIndex() + direction;\n if (newIndex >= 0 && newIndex < allFiles.length) {\n this.zoomed.set(false);\n this.rotation.set(0);\n this.isLoading.set(true);\n this._mediaLoaded.set(false);\n this._loadingStartTime = Date.now();\n this.zOnNavigate.emit(allFiles[newIndex]);\n }\n }\n\n protected toggleZoom(): void {\n if (this.isImageFile()) {\n this.zoomed.update(z => !z);\n }\n }\n\n protected rotateLeft(): void {\n this.rotation.update(r => (r - 90 + 360) % 360);\n }\n\n protected rotateRight(): void {\n this.rotation.update(r => (r + 90) % 360);\n }\n\n protected onImageLoad(): void {\n this._completeLoading();\n }\n\n protected onVideoLoad(): void {\n this._completeLoading();\n }\n\n protected onPdfLoad(): void {\n this._completeLoading();\n }\n\n protected onMediaError(): void {\n this._completeLoading();\n }\n\n protected download(): void {\n this.zOnDownload.emit(this.file());\n }\n\n protected remove(): void {\n this.zOnRemove.emit(this.file());\n }\n\n protected onBackdropClick(event: Event): void {\n if ((event.target as HTMLElement).classList.contains('fixed')) {\n this.close();\n }\n }\n}\n","import { cva, type VariantProps } from 'class-variance-authority';\n\nexport const zGalleryVariants = cva('z-gallery', {\n variants: {\n zSize: {\n sm: 'z-gallery--sm',\n default: 'z-gallery--default',\n lg: 'z-gallery--lg',\n },\n },\n defaultVariants: {\n zSize: 'default',\n },\n});\n\nexport type ZGalleryVariants = VariantProps<typeof zGalleryVariants>;\n\n// Grid item variants\nexport const zGalleryItemVariants = cva(\n 'group relative overflow-hidden rounded-lg border border-border bg-card transition-all duration-200 cursor-pointer',\n {\n variants: {\n zMode: {\n grid: 'flex flex-col hover:scale-[1.02] hover:shadow-md hover:border-primary/50',\n list: 'flex flex-row items-center gap-3 p-3 hover:bg-accent hover:border-primary/50',\n },\n zSize: {\n sm: '',\n default: '',\n lg: '',\n },\n },\n compoundVariants: [\n // Grid sizes\n { zMode: 'grid', zSize: 'sm', class: '' },\n { zMode: 'grid', zSize: 'default', class: '' },\n { zMode: 'grid', zSize: 'lg', class: '' },\n // List sizes\n { zMode: 'list', zSize: 'sm', class: 'p-2' },\n { zMode: 'list', zSize: 'default', class: 'p-3' },\n { zMode: 'list', zSize: 'lg', class: 'p-4' },\n ],\n defaultVariants: {\n zMode: 'grid',\n zSize: 'default',\n },\n }\n);\n\nexport type ZGalleryItemVariants = VariantProps<typeof zGalleryItemVariants>;\n\n// File icon badge variants\nexport const zGalleryFileIconVariants = cva(\n 'flex items-center justify-center rounded-md font-bold uppercase select-none',\n {\n variants: {\n zSize: {\n sm: 'w-full h-16 text-xs',\n default: 'w-full h-24 text-sm',\n lg: 'w-full h-32 text-base',\n },\n zMode: {\n grid: '',\n list: '',\n },\n },\n compoundVariants: [\n { zMode: 'list', zSize: 'sm', class: 'size-8 text-[0.625rem]' },\n { zMode: 'list', zSize: 'default', class: 'size-10 text-xs' },\n { zMode: 'list', zSize: 'lg', class: 'size-12 text-sm' },\n ],\n defaultVariants: {\n zSize: 'default',\n zMode: 'grid',\n },\n }\n);\n\nexport type ZGalleryFileIconVariants = VariantProps<typeof zGalleryFileIconVariants>;\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n model,\n output,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ZButtonComponent } from '@shival99/z-ui/components/z-button';\nimport { ZButtonGroupComponent, ZButtonGroupItemDirective } from '@shival99/z-ui/components/z-button-group';\nimport { ZCheckboxComponent } from '@shival99/z-ui/components/z-checkbox';\nimport { ZEmptyComponent } from '@shival99/z-ui/components/z-empty';\nimport { ZIconComponent, type ZIcon } from '@shival99/z-ui/components/z-icon';\nimport { ZInputComponent } from '@shival99/z-ui/components/z-input';\nimport { ZSkeletonComponent } from '@shival99/z-ui/components/z-skeleton';\nimport { zMergeClasses } from '@shival99/z-ui/utils';\nimport type { ClassValue } from 'clsx';\nimport { ZGalleryItemComponent } from './z-gallery-item.component';\nimport { ZGalleryPreviewComponent } from './z-gallery-preview.component';\nimport type {\n ZGalleryActionEvent,\n ZGalleryControl,\n ZGalleryFile,\n ZGalleryMode,\n ZGallerySelectionChange,\n ZGallerySize,\n ZGalleryToggleSize,\n} from './z-gallery.types';\nimport { zGalleryVariants } from './z-gallery.variants';\n\n@Component({\n selector: 'z-gallery',\n imports: [\n FormsModule,\n TranslatePipe,\n ZGalleryItemComponent,\n ZGalleryPreviewComponent,\n ZButtonGroupComponent,\n ZButtonGroupItemDirective,\n ZButtonComponent,\n ZCheckboxComponent,\n ZIconComponent,\n ZEmptyComponent,\n ZInputComponent,\n ZSkeletonComponent,\n ],\n standalone: true,\n template: `\n <div [class]=\"containerClasses()\">\n @if (showHeader()) {\n <div class=\"mb-4 flex flex-wrap items-center justify-between gap-3\">\n <div class=\"flex items-center gap-3\">\n @if (zTitle()) {\n @if (zLoading()) {\n <z-skeleton class=\"w-28\" zHeight=\"1.25rem\" />\n } @else {\n <h3 class=\"text-sm font-medium\">{{ zTitle() }}</h3>\n }\n }\n\n @if (zShowSearch()) {\n @if (zLoading()) {\n <z-skeleton class=\"w-64\" [zHeight]=\"headerControlHeight()\" zRadius=\"0.375rem\" />\n } @else {\n <z-input\n zSearch\n [zSize]=\"searchInputSize()\"\n [zPlaceholder]=\"zSearchPlaceholder() || ('i18n_z_ui_gallery_search_placeholder' | translate)\"\n [zDebounce]=\"zSearchDebounce()\"\n [ngModel]=\"searchInputQuery()\"\n (ngModelChange)=\"searchInputQuery.set($event)\"\n (zOnSearch)=\"onSearchChange($event)\"\n class=\"w-64\"\n />\n }\n }\n </div>\n\n @if (zShowModeToggle() && (zFiles().length > 0 || zLoading())) {\n @if (zLoading()) {\n <z-skeleton class=\"w-20\" [zHeight]=\"headerControlHeight()\" zRadius=\"0.375rem\" />\n } @else {\n <z-button-group [(zActive)]=\"modeIndex\">\n <button z-button zType=\"outline\" [zSize]=\"zToggleSize()\" z-button-group-item>\n <i z-icon zType=\"lucideLayoutGrid\" [zSize]=\"toggleIconSize()\"></i>\n </button>\n <button z-button zType=\"outline\" [zSize]=\"zToggleSize()\" z-button-group-item>\n <i z-icon zType=\"lucideList\" [zSize]=\"toggleIconSize()\"></i>\n </button>\n </z-button-group>\n }\n }\n </div>\n }\n\n @if (zLoading()) {\n @if (currentMode() === 'grid') {\n <div class=\"grid gap-4\" [class]=\"gridColumnsClass()\" [style.gridTemplateColumns]=\"gridTemplateColumns()\">\n @for (item of skeletonItems(); track item) {\n <div class=\"border-border bg-card overflow-hidden rounded-md border shadow-sm\">\n <z-skeleton class=\"w-full\" [zHeight]=\"skeletonMediaHeight()\" zRadius=\"0\" />\n <div class=\"space-y-2 p-3\">\n <z-skeleton class=\"w-3/4\" zHeight=\"0.875rem\" />\n <z-skeleton class=\"w-2/5\" zHeight=\"0.75rem\" />\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"flex flex-col gap-2\">\n @for (item of skeletonItems(); track item) {\n <div class=\"border-border bg-card flex items-center gap-3 rounded-xl border px-3 py-2.5 shadow-sm\">\n <z-skeleton class=\"size-11 shrink-0\" zHeight=\"2.75rem\" zRadius=\"0.75rem\" />\n <div class=\"min-w-0 flex-1 space-y-2\">\n <z-skeleton class=\"w-2/5\" zHeight=\"0.875rem\" />\n <z-skeleton class=\"w-1/4\" zHeight=\"0.75rem\" />\n </div>\n <z-skeleton class=\"w-14 shrink-0\" zHeight=\"1.5rem\" zRadius=\"9999px\" />\n </div>\n }\n </div>\n }\n } @else if (zSelectable() && filteredFiles().length > 0) {\n <div\n class=\"bg-muted/30 shadow-card dark:!border-border mb-4 flex h-11 items-center justify-between gap-3 rounded-[0.375rem] border border-transparent px-3\"\n >\n <div class=\"flex items-center gap-3\">\n <z-checkbox\n [zChecked]=\"isAllSelected()\"\n [zIndeterminate]=\"isIndeterminate()\"\n (zChange)=\"toggleSelectAll()\"\n zSize=\"sm\"\n />\n <span class=\"text-muted-foreground text-sm\">\n @if (selectedCount() > 0) {\n {{ selectedCount() }} {{ 'i18n_z_ui_gallery_selected' | translate }}\n } @else {\n {{ 'i18n_z_ui_gallery_select_all' | translate }}\n }\n </span>\n </div>\n\n @if (selectedCount() > 0) {\n <div class=\"flex items-center gap-1\">\n @if (zShowDownload()) {\n <button\n z-button\n zType=\"ghost\"\n zSize=\"xs\"\n (click)=\"onBulkDownload()\"\n class=\"text-muted-foreground hover:text-foreground\"\n >\n <i z-icon zType=\"lucideDownload\" zSize=\"14\"></i>\n <span class=\"ml-1\">{{ 'i18n_z_ui_gallery_download' | translate }}</span>\n </button>\n }\n @if (zShowRemove()) {\n <button\n z-button\n zType=\"ghost\"\n zSize=\"xs\"\n (click)=\"onBulkDelete()\"\n class=\"text-destructive hover:text-destructive\"\n >\n <i z-icon zType=\"lucideTrash2\" zSize=\"14\"></i>\n <span class=\"ml-1\">{{ 'i18n_z_ui_gallery_delete' | translate }}</span>\n </button>\n }\n <button z-button zType=\"ghost\" zSize=\"xs\" (click)=\"deselectAll()\">\n <i z-icon zType=\"lucideX\" zSize=\"14\"></i>\n </button>\n </div>\n }\n </div>\n }\n\n @if (!zLoading() && filteredFiles().length > 0) {\n @if (currentMode() === 'grid') {\n <div class=\"grid gap-4\" [class]=\"gridColumnsClass()\" [style.gridTemplateColumns]=\"gridTemplateColumns()\">\n @for (file of filteredFiles(); track file.id) {\n <z-gallery-item\n [file]=\"file\"\n zMode=\"grid\"\n [zSize]=\"zSize()\"\n [zShowDownload]=\"zShowDownload()\"\n [zShowPreview]=\"zShowPreview()\"\n [zShowRemove]=\"zShowRemove()\"\n [zSelectable]=\"zSelectable()\"\n [zSelected]=\"isFileSelected(file)\"\n (zOnDownload)=\"onDownload($event)\"\n (zOnPreview)=\"onPreview($event)\"\n (zOnRemove)=\"onRemove($event)\"\n (zOnSelect)=\"toggleSelection($event)\"\n />\n }\n </div>\n } @else {\n <div class=\"flex flex-col gap-2\">\n @for (file of filteredFiles(); track file.id) {\n <z-gallery-item\n [file]=\"file\"\n zMode=\"list\"\n [zSize]=\"zSize()\"\n [zShowDownload]=\"zShowDownload()\"\n [zShowPreview]=\"zShowPreview()\"\n [zShowRemove]=\"zShowRemove()\"\n [zSelectable]=\"zSelectable()\"\n [zSelected]=\"isFileSelected(file)\"\n (zOnDownload)=\"onDownload($event)\"\n (zOnPreview)=\"onPreview($event)\"\n (zOnRemove)=\"onRemove($event)\"\n (zOnSelect)=\"toggleSelection($event)\"\n />\n }\n </div>\n }\n } @else if (!zLoading() && zFiles().length > 0 && searchQuery()) {\n <z-empty zIcon=\"lucideSearchX\" [zMessage]=\"'i18n_z_ui_gallery_no_search_results' | translate\" zSize=\"sm\" />\n } @else if (!zLoading()) {\n <z-empty\n [zIcon]=\"zEmptyIcon()\"\n [zMessage]=\"zEmptyText() || ('i18n_z_ui_gallery_no_files' | translate)\"\n zSize=\"sm\"\n />\n }\n\n @if (previewFile()) {\n <z-gallery-preview\n [file]=\"previewFile()!\"\n [files]=\"filteredFiles()\"\n [zShowRemove]=\"zShowRemove()\"\n [zTrustedResourceOrigins]=\"zTrustedResourceOrigins()\"\n (zOnClose)=\"closePreview()\"\n (zOnDownload)=\"onDownload($event)\"\n (zOnNavigate)=\"onNavigatePreview($event)\"\n (zOnRemove)=\"onRemoveFromPreview($event)\"\n />\n }\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'z-gallery block',\n },\n exportAs: 'zGallery',\n})\nexport class ZGalleryComponent implements AfterViewInit {\n public readonly zFiles = input<ZGalleryFile[]>([]);\n public readonly zMode = model<ZGalleryMode>('grid');\n public readonly zSize = input<ZGallerySize>('default');\n public readonly zColumns = input<number>(4);\n public readonly zItemWidth = input<string | null>(null);\n public readonly zLoading = input(false);\n public readonly zSkeletonRows = input(2);\n public readonly zSkeletonItems = input<number | null>(null);\n public readonly zShowDownload = input(true);\n public readonly zShowPreview = input(true);\n public readonly zShowRemove = input(false);\n public readonly zTrustedResourceOrigins = input<string[]>([]);\n public readonly zShowModeToggle = input(true);\n public readonly zShowSearch = input(false);\n public readonly zServerSearch = input(false);\n public readonly zSearchDebounce = input(300);\n public readonly zSearchPlaceholder = input<string>('Search files...');\n public readonly zToggleSize = input<ZGalleryToggleSize>('default');\n public readonly zTitle = input<string>('');\n public readonly zEmptyText = input<string>('No files');\n public readonly zEmptyIcon = input<ZIcon>('lucideImage');\n public readonly zClass = input<ClassValue>('');\n public readonly zSelectable = input(false);\n public readonly zSelectedFiles = model<ZGalleryFile[]>([]);\n\n public readonly zOnDownload = output<ZGalleryFile>();\n public readonly zOnPreview = output<ZGalleryFile>();\n public readonly zOnRemove = output<ZGalleryFile>();\n public readonly zModeChange = output<ZGalleryMode>();\n public readonly zSearchChange = output<string>();\n public readonly zControl = output<ZGalleryControl>();\n public readonly zSelectionChange = output<ZGallerySelectionChange>();\n public readonly zOnAction = output<ZGalleryActionEvent>();\n\n protected readonly modeIndex = signal<number | null>(0);\n protected readonly previewFile = signal<ZGalleryFile | null>(null);\n protected readonly searchInputQuery = signal<string>('');\n protected readonly searchQuery = signal<string>('');\n protected readonly skeletonItems = computed(() => {\n const itemCount = this.zSkeletonItems();\n if (itemCount !== null) {\n return Array.from({ length: Math.max(1, itemCount) }, (_, index) => index);\n }\n\n const columns = this.currentMode() === 'list' ? 1 : Math.max(1, this.zColumns());\n const rows = Math.max(1, this.zSkeletonRows());\n return Array.from({ length: columns * rows }, (_, index) => index);\n });\n\n protected readonly currentMode = computed<ZGalleryMode>(() => {\n const index = this.modeIndex();\n return index === 1 ? 'list' : 'grid';\n });\n\n protected readonly gridColumnsClass = computed(() => {\n if (this.zItemWidth()) {\n return 'justify-start';\n }\n\n const cols = this.zColumns();\n switch (cols) {\n case 1:\n return 'grid-cols-1';\n case 2:\n return 'grid-cols-1 sm:grid-cols-2';\n case 3:\n return 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3';\n case 4:\n return 'grid-cols-2 sm:grid-cols-3 lg:grid-cols-4';\n case 5:\n return 'grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5';\n case 6:\n return 'grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-6';\n default:\n return `grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-${cols}`;\n }\n });\n\n protected readonly gridTemplateColumns = computed(() => {\n const itemWidth = this.zItemWidth();\n return itemWidth ? `repeat(auto-fill, minmax(${itemWidth}, ${itemWidth}))` : null;\n });\n\n protected readonly containerClasses = computed(() =>\n zMergeClasses(zGalleryVariants({ zSize: this.zSize() }), this.zClass())\n );\n\n protected readonly showHeader = computed(\n () =>\n this.zTitle() || this.zShowSearch() || (this.zShowModeToggle() && (this.zFiles().length > 0 || this.zLoading()))\n );\n\n protected readonly headerControlHeight = computed(() => {\n switch (this.zToggleSize()) {\n case 'xs':\n return '1.75rem';\n case 'sm':\n return '2rem';\n case 'lg':\n return '2.5rem';\n default:\n return '2.25rem';\n }\n });\n\n protected readonly skeletonMediaHeight = computed(() => {\n switch (this.zSize()) {\n case 'sm':\n return '9rem';\n case 'lg':\n return '14rem';\n default:\n return '11rem';\n }\n });\n\n protected readonly toggleIconSize = computed(() => {\n const size = this.zToggleSize();\n switch (size) {\n case 'xs':\n return '14';\n case 'sm':\n return '16';\n case 'lg':\n return '20';\n default:\n return '18';\n }\n });\n\n protected readonly searchInputSize = computed<'sm' | 'default' | 'lg'>(() => {\n const size = this.zToggleSize();\n if (size === 'xs') {\n return 'sm';\n }\n return size;\n });\n\n protected readonly filteredFiles = computed(() => {\n const files = this.zFiles();\n const query = this.searchQuery().toLowerCase().trim();\n\n if (!query || this.zServerSearch()) {\n return files;\n }\n\n return files.filter(file => file.name.toLowerCase().includes(query));\n });\n\n protected readonly selectedIds = computed(() => new Set(this.zSelectedFiles().map(f => f.id)));\n protected readonly isAllSelected = computed(() => {\n const files = this.filteredFiles();\n const selectedIds = this.selectedIds();\n return files.length > 0 && files.every(f => selectedIds.has(f.id));\n });\n\n protected readonly isIndeterminate = computed(() => {\n const files = this.filteredFiles();\n const selectedIds = this.selectedIds();\n const selectedCount = files.filter(f => selectedIds.has(f.id)).length;\n return selectedCount > 0 && selectedCount < files.length;\n });\n\n protected readonly selectedCount = computed(() => this.zSelectedFiles().length);\n\n ngAfterViewInit(): void {\n this.zControl.emit({\n setMode: mode => {\n this.modeIndex.set(mode === 'list' ? 1 : 0);\n this.zMode.set(mode);\n this.zModeChange.emit(mode);\n },\n getMode: () => this.currentMode(),\n getFiles: () => this.zFiles(),\n openPreview: file => this.previewFile.set(file),\n closePreview: () => this.previewFile.set(null),\n selectAll: () => this.selectAll(),\n deselectAll: () => this.deselectAll(),\n toggleSelection: file => this.toggleSelection(file),\n getSelectedFiles: () => this.zSelectedFiles(),\n isSelected: file => this.isFileSelected(file),\n });\n }\n\n protected onSearchChange(query: string | number | null): void {\n const normalizedQuery = String(query ?? '');\n this.searchQuery.set(normalizedQuery);\n this.zSearchChange.emit(normalizedQuery);\n }\n\n protected onDownload(file: ZGalleryFile): void {\n this.zOnDownload.emit(file);\n const downloadLink = file.downloadUrl || file.url;\n if (downloadLink) {\n const link = document.createElement('a');\n link.href = downloadLink;\n link.download = file.name;\n link.target = '_blank';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n }\n\n protected onPreview(file: ZGalleryFile): void {\n this.previewFile.set(file);\n this.zOnPreview.emit(file);\n }\n\n protected onRemove(file: ZGalleryFile): void {\n this.zOnRemove.emit(file);\n }\n\n protected closePreview(): void {\n this.previewFile.set(null);\n }\n\n protected onNavigatePreview(file: ZGalleryFile): void {\n this.previewFile.set(file);\n }\n\n protected onRemoveFromPreview(file: ZGalleryFile): void {\n this.zOnRemove.emit(file);\n const allFiles = this.filteredFiles();\n const currentIndex = allFiles.findIndex(f => f.id === file.id);\n\n if (allFiles.length <= 1) {\n this.closePreview();\n }\n\n if (currentIndex < allFiles.length - 1) {\n this.previewFile.set(allFiles[currentIndex + 1]);\n return;\n }\n\n this.previewFile.set(allFiles[currentIndex - 1]);\n }\n\n protected isFileSelected(file: ZGalleryFile): boolean {\n return this.selectedIds().has(file.id);\n }\n\n protected toggleSelection(file: ZGalleryFile): void {\n const currentSelected = this.zSelectedFiles();\n const isSelected = this.isFileSelected(file);\n\n const newSelected = isSelected ? currentSelected.filter(f => f.id !== file.id) : [...currentSelected, file];\n\n this.zOnAction.emit({ type: isSelected ? 'deselect' : 'select', file });\n\n this.zSelectedFiles.set(newSelected);\n this.zSelectionChange.emit({\n selectedFiles: newSelected,\n addedFiles: isSelected ? undefined : [file],\n removedFiles: isSelected ? [file] : undefined,\n });\n }\n\n protected selectAll(): void {\n const files = this.filteredFiles();\n this.zSelectedFiles.set([...files]);\n this.zOnAction.emit({ type: 'select-all', files });\n this.zSelectionChange.emit({\n selectedFiles: files,\n addedFiles: files,\n });\n }\n\n protected deselectAll(): void {\n const previousSelected = this.zSelectedFiles();\n this.zSelectedFiles.set([]);\n this.zOnAction.emit({ type: 'deselect-all', files: previousSelected });\n this.zSelectionChange.emit({\n selectedFiles: [],\n removedFiles: previousSelected,\n });\n }\n\n protected toggleSelectAll(): void {\n if (this.isAllSelected()) {\n this.deselectAll();\n return;\n }\n\n this.selectAll();\n }\n\n protected onBulkDelete(): void {\n const selectedFiles = this.zSelectedFiles();\n this.zOnAction.emit({ type: 'delete', files: selectedFiles });\n }\n\n protected onBulkDownload(): void {\n const selectedFiles = this.zSelectedFiles();\n this.zOnAction.emit({ type: 'download', files: selectedFiles });\n selectedFiles.forEach(file => this.onDownload(file));\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input, signal, ViewEncapsulation } from '@angular/core';\nimport { ZSkeletonComponent } from '@shival99/z-ui/components/z-skeleton';\nimport { zMergeClasses } from '@shival99/z-ui/utils';\nimport {\n FILE_CATEGORY_STYLES,\n type ZFileCategory,\n type ZGalleryFile,\n type ZGalleryMode,\n type ZGallerySize,\n} from './z-gallery.types';\nimport { getFileCategory } from './z-gallery.utils';\nimport { zGalleryFileIconVariants } from './z-gallery.variants';\n\n@Component({\n selector: 'z-gallery-file-icon',\n imports: [ZSkeletonComponent],\n standalone: true,\n template: `\n <div [class]=\"containerClasses()\" class=\"group/icon overflow-hidden\">\n @if (showThumbnail()) {\n @if (isLoading()) {\n <z-skeleton class=\"absolute inset-0 size-full\" />\n }\n <img\n [src]=\"file().thumbnailUrl || file().url\"\n [alt]=\"file().name\"\n class=\"size-full object-cover transition-transform duration-300 group-hover/icon:scale-105\"\n loading=\"lazy\"\n [class.opacity-0]=\"isLoading()\"\n [class.opacity-100]=\"!isLoading()\"\n (load)=\"onImageLoad()\"\n (error)=\"onImageError($event)\"\n />\n } @else {\n <div class=\"flex flex-col items-center justify-center gap-1\">\n <span class=\"font-bold tracking-wide\">{{ style().label }}</span>\n </div>\n }\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'z-gallery-file-icon block',\n },\n})\nexport class ZGalleryFileIconComponent {\n public readonly file = input.required<ZGalleryFile>();\n public readonly zSize = input<ZGallerySize>('default');\n public readonly zMode = input<ZGalleryMode>('grid');\n\n protected readonly imageError = signal(false);\n protected readonly isLoading = signal(true);\n protected readonly category = computed<ZFileCategory>(() => getFileCategory(this.file()));\n protected readonly style = computed(() => FILE_CATEGORY_STYLES[this.category()]);\n\n protected readonly showThumbnail = computed(() => {\n const file = this.file();\n const cat = this.category();\n return cat === 'image' && (file.thumbnailUrl || file.url) && !this.imageError();\n });\n\n protected readonly containerClasses = computed(() => {\n const style = this.style();\n const showThumb = this.showThumbnail();\n\n return zMergeClasses(\n zGalleryFileIconVariants({\n zSize: this.zSize(),\n zMode: this.zMode(),\n }),\n showThumb ? 'bg-muted relative' : [style.bg, style.text]\n );\n });\n\n protected onImageLoad(): void {\n this.isLoading.set(false);\n }\n\n protected onImageError(event: Event): void {\n this.imageError.set(true);\n this.isLoading.set(false);\n const img = event.target as HTMLImageElement;\n img.style.display = 'none';\n }\n}\n","import type { OverlayRef } from '@angular/cdk/overlay';\nimport { EventEmitter } from '@angular/core';\nimport type { ZGalleryPreviewComponent } from './z-gallery-preview.component';\n\nexport class ZGalleryPreviewRef {\n private _closed = false;\n\n public componentInstance: ZGalleryPreviewComponent | null = null;\n public readonly zAfterClose = new EventEmitter<void>();\n\n public constructor(private readonly _overlayRef: OverlayRef | null) {}\n\n public close(): void {\n if (this._closed) {\n return;\n }\n\n this._closed = true;\n this.zAfterClose.emit();\n this.zAfterClose.complete();\n this._overlayRef?.dispose();\n }\n}\n","import { Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { inject, Injectable, Injector, PLATFORM_ID } from '@angular/core';\nimport { ZOverlayZIndexService } from '@shival99/z-ui/services';\nimport { ZGalleryPreviewComponent } from './z-gallery-preview.component';\nimport { ZGalleryPreviewRef } from './z-gallery-preview.ref';\nimport type { ZGalleryFile, ZGalleryPreviewOptions } from './z-gallery.types';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ZGalleryPreviewService {\n private readonly _document = inject(DOCUMENT);\n private readonly _injector = inject(Injector);\n private readonly _overlay = inject(Overlay);\n private readonly _platformId = inject(PLATFORM_ID);\n private readonly _zIndexService = inject(ZOverlayZIndexService);\n\n public open(file: ZGalleryFile, options?: Omit<ZGalleryPreviewOptions, 'file'>): ZGalleryPreviewRef;\n public open(options: ZGalleryPreviewOptions): ZGalleryPreviewRef;\n public open(\n fileOrOptions: ZGalleryFile | ZGalleryPreviewOptions,\n options: Omit<ZGalleryPreviewOptions, 'file'> = {}\n ): ZGalleryPreviewRef {\n const previewOptions = this._normalizeOptions(fileOrOptions, options);\n const overlayRef = this._createOverlay();\n const previewRef = new ZGalleryPreviewRef(overlayRef ?? null);\n\n if (!overlayRef) {\n return previewRef;\n }\n\n const componentRef = overlayRef.attach(new ComponentPortal(ZGalleryPreviewComponent, null, this._injector));\n previewRef.componentInstance = componentRef.instance;\n\n componentRef.setInput('file', previewOptions.file);\n componentRef.setInput('files', previewOptions.files);\n componentRef.setInput('zShowRemove', previewOptions.zShowRemove ?? false);\n componentRef.setInput('zTrustedResourceOrigins', previewOptions.zTrustedResourceOrigins ?? []);\n\n componentRef.instance.zOnClose.subscribe(() => {\n previewOptions.zOnClose?.();\n previewRef.close();\n });\n componentRef.instance.zOnDownload.subscribe(file => this._handleDownload(file, previewOptions));\n componentRef.instance.zOnNavigate.subscribe(file => {\n componentRef.setInput('file', file);\n previewOptions.zOnNavigate?.(file);\n });\n componentRef.instance.zOnRemove.subscribe(file => previewOptions.zOnRemove?.(file));\n\n return previewRef;\n }\n\n private _createOverlay(): OverlayRef | undefined {\n if (!isPlatformBrowser(this._platformId)) {\n return undefined;\n }\n\n const overlayRef = this._overlay.create(\n new OverlayConfig({\n hasBackdrop: false,\n panelClass: 'z-gallery-preview-overlay-pane',\n positionStrategy: this._overlay.position().global(),\n scrollStrategy: this._overlay.scrollStrategies.block(),\n })\n );\n\n this._zIndexService.applyToOverlay(overlayRef);\n this._zIndexService.deferMoveToTop(overlayRef);\n\n return overlayRef;\n }\n\n private _normalizeOptions(\n fileOrOptions: ZGalleryFile | ZGalleryPreviewOptions,\n options: Omit<ZGalleryPreviewOptions, 'file'>\n ): ZGalleryPreviewOptions {\n const previewOptions = 'file' in fileOrOptions ? fileOrOptions : { ...options, file: fileOrOptions };\n const files = previewOptions.files?.length ? previewOptions.files : [previewOptions.file];\n const hasCurrentFile = files.some(file => file.id === previewOptions.file.id);\n\n return {\n ...previewOptions,\n files: hasCurrentFile ? files : [previewOptions.file, ...files],\n };\n }\n\n private _handleDownload(file: ZGalleryFile, options: ZGalleryPreviewOptions): void {\n options.zOnDownload?.(file);\n\n if (options.zDownload === false) {\n return;\n }\n\n const downloadLink = file.downloadUrl || file.url;\n if (!downloadLink || !isPlatformBrowser(this._platformId)) {\n return;\n }\n\n const link = this._document.createElement('a');\n link.href = downloadLink;\n link.download = file.name;\n link.target = '_blank';\n this._document.body.appendChild(link);\n link.click();\n this._document.body.removeChild(link);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shival99-z-ui-components-z-gallery.mjs","sources":["../../../../libs/core-ui/components/z-gallery/z-gallery.types.ts","../../../../libs/core-ui/components/z-gallery/z-gallery.utils.ts","../../../../libs/core-ui/components/z-gallery/z-gallery-item.component.ts","../../../../libs/core-ui/components/z-gallery/z-gallery-preview.component.ts","../../../../libs/core-ui/components/z-gallery/z-gallery.variants.ts","../../../../libs/core-ui/components/z-gallery/z-gallery.component.ts","../../../../libs/core-ui/components/z-gallery/z-gallery-file-icon.component.ts","../../../../libs/core-ui/components/z-gallery/z-gallery-preview.ref.ts","../../../../libs/core-ui/components/z-gallery/z-gallery-preview.service.ts","../../../../libs/core-ui/components/z-gallery/shival99-z-ui-components-z-gallery.ts"],"sourcesContent":["export type ZGalleryMode = 'grid' | 'list';\nexport type ZGallerySize = 'sm' | 'default' | 'lg';\nexport type ZGalleryToggleSize = 'xs' | 'sm' | 'default' | 'lg';\n\nexport interface ZGalleryFile {\n id: string;\n name: string;\n size: number;\n type: string;\n url?: string;\n downloadUrl?: string;\n thumbnailUrl?: string;\n createdAt?: Date;\n updatedAt?: Date;\n}\n\nexport type ZFileCategory =\n | 'image'\n | 'pdf'\n | 'word'\n | 'excel'\n | 'powerpoint'\n | 'video'\n | 'audio'\n | 'archive'\n | 'code'\n | 'text'\n | 'unknown';\n\nexport interface ZFileCategoryStyle {\n bg: string;\n text: string;\n label: string;\n icon: string;\n}\n\nexport const FILE_CATEGORY_STYLES: Record<ZFileCategory, ZFileCategoryStyle> = {\n image: {\n bg: 'bg-purple-100 dark:bg-purple-900/30',\n text: 'text-purple-600 dark:text-purple-400',\n label: 'IMG',\n icon: 'lucideImage',\n },\n pdf: {\n bg: 'bg-red-100 dark:bg-red-900/30',\n text: 'text-red-600 dark:text-red-400',\n label: 'PDF',\n icon: 'lucideFileText',\n },\n word: {\n bg: 'bg-blue-100 dark:bg-blue-900/30',\n text: 'text-blue-600 dark:text-blue-400',\n label: 'DOC',\n icon: 'lucideFileText',\n },\n excel: {\n bg: 'bg-green-100 dark:bg-green-900/30',\n text: 'text-green-600 dark:text-green-400',\n label: 'XLS',\n icon: 'lucideFileSpreadsheet',\n },\n powerpoint: {\n bg: 'bg-orange-100 dark:bg-orange-900/30',\n text: 'text-orange-600 dark:text-orange-400',\n label: 'PPT',\n icon: 'lucideFileText',\n },\n video: {\n bg: 'bg-pink-100 dark:bg-pink-900/30',\n text: 'text-pink-600 dark:text-pink-400',\n label: 'VID',\n icon: 'lucideVideo',\n },\n audio: {\n bg: 'bg-yellow-100 dark:bg-yellow-900/30',\n text: 'text-yellow-700 dark:text-yellow-400',\n label: 'AUD',\n icon: 'lucideMusic',\n },\n archive: {\n bg: 'bg-amber-100 dark:bg-amber-900/30',\n text: 'text-amber-600 dark:text-amber-400',\n label: 'ZIP',\n icon: 'lucideFileArchive',\n },\n code: {\n bg: 'bg-slate-100 dark:bg-slate-800',\n text: 'text-slate-600 dark:text-slate-400',\n label: 'CODE',\n icon: 'lucideCode',\n },\n text: {\n bg: 'bg-gray-100 dark:bg-gray-800',\n text: 'text-gray-600 dark:text-gray-400',\n label: 'TXT',\n icon: 'lucideFileText',\n },\n unknown: {\n bg: 'bg-gray-100 dark:bg-gray-800',\n text: 'text-gray-500 dark:text-gray-400',\n label: 'FILE',\n icon: 'lucideFile',\n },\n};\n\nexport interface ZGalleryControl {\n setMode: (mode: ZGalleryMode) => void;\n getMode: () => ZGalleryMode;\n getFiles: () => ZGalleryFile[];\n openPreview: (file: ZGalleryFile) => void;\n closePreview: () => void;\n // Selection methods\n selectAll: () => void;\n deselectAll: () => void;\n toggleSelection: (file: ZGalleryFile) => void;\n getSelectedFiles: () => ZGalleryFile[];\n isSelected: (file: ZGalleryFile) => boolean;\n}\n\n/**\n * Action types emitted by gallery events\n */\nexport type ZGalleryActionType =\n | 'select'\n | 'deselect'\n | 'select-all'\n | 'deselect-all'\n | 'delete'\n | 'download'\n | 'preview';\n\n/**\n * Event payload for zOnAction output\n */\nexport interface ZGalleryActionEvent {\n type: ZGalleryActionType;\n file?: ZGalleryFile;\n files?: ZGalleryFile[];\n}\n\n/**\n * Selection change event\n */\nexport interface ZGallerySelectionChange {\n selectedFiles: ZGalleryFile[];\n addedFiles?: ZGalleryFile[];\n removedFiles?: ZGalleryFile[];\n}\n\nexport interface ZGalleryPreviewOptions {\n file: ZGalleryFile;\n files?: ZGalleryFile[];\n zDownload?: boolean;\n zShowRemove?: boolean;\n zTrustedResourceOrigins?: string[];\n zOnClose?: () => void;\n zOnDownload?: (file: ZGalleryFile) => void;\n zOnNavigate?: (file: ZGalleryFile) => void;\n zOnRemove?: (file: ZGalleryFile) => void;\n}\n","import type { ZFileCategory, ZGalleryFile } from './z-gallery.types';\n\nconst IMAGE_EXTENSIONS = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'bmp', 'ico'];\nconst VIDEO_EXTENSIONS = ['mp4', 'avi', 'mov', 'wmv', 'flv', 'webm', 'mkv'];\nconst AUDIO_EXTENSIONS = ['mp3', 'wav', 'ogg', 'flac', 'aac', 'm4a'];\nconst ARCHIVE_EXTENSIONS = ['zip', 'rar', 'tar', 'gz', '7z', 'bz2'];\nconst CODE_EXTENSIONS = [\n 'js',\n 'ts',\n 'jsx',\n 'tsx',\n 'html',\n 'css',\n 'scss',\n 'json',\n 'xml',\n 'py',\n 'java',\n 'c',\n 'cpp',\n 'go',\n 'rs',\n 'php',\n 'rb',\n 'swift',\n 'kt',\n];\nconst TEXT_EXTENSIONS = ['txt', 'md', 'log'];\nconst WORD_EXTENSIONS = ['doc', 'docx', 'odt', 'rtf'];\nconst EXCEL_EXTENSIONS = ['xls', 'xlsx', 'csv', 'ods'];\nconst POWERPOINT_EXTENSIONS = ['ppt', 'pptx', 'odp'];\n\nconst FILE_SIZE_UNITS = ['B', 'KB', 'MB', 'GB'];\nconst FILE_SIZE_BASE = 1024;\n\nexport const getFileCategory = (file: ZGalleryFile): ZFileCategory => {\n const type = file.type?.toLowerCase() || '';\n const name = file.name?.toLowerCase() || '';\n const ext = name.split('.').pop() || '';\n\n if (type.startsWith('image/') || IMAGE_EXTENSIONS.includes(ext)) {\n return 'image';\n }\n\n if (type === 'application/pdf' || ext === 'pdf') {\n return 'pdf';\n }\n\n if (type.includes('excel') || type.includes('spreadsheet') || EXCEL_EXTENSIONS.includes(ext)) {\n return 'excel';\n }\n\n if (type.includes('powerpoint') || type.includes('presentation') || POWERPOINT_EXTENSIONS.includes(ext)) {\n return 'powerpoint';\n }\n\n if (type.includes('word') || type.includes('wordprocessingml') || WORD_EXTENSIONS.includes(ext)) {\n return 'word';\n }\n\n if (type.startsWith('video/') || VIDEO_EXTENSIONS.includes(ext)) {\n return 'video';\n }\n\n if (type.startsWith('audio/') || AUDIO_EXTENSIONS.includes(ext)) {\n return 'audio';\n }\n\n if (\n type.includes('zip') ||\n type.includes('rar') ||\n type.includes('tar') ||\n type.includes('compressed') ||\n ARCHIVE_EXTENSIONS.includes(ext)\n ) {\n return 'archive';\n }\n\n if (CODE_EXTENSIONS.includes(ext)) {\n return 'code';\n }\n\n if (type.startsWith('text/') || TEXT_EXTENSIONS.includes(ext)) {\n return 'text';\n }\n\n return 'unknown';\n};\n\nexport const formatFileSize = (bytes: number): string => {\n if (bytes === 0) {\n return '0 B';\n }\n\n const i = Math.floor(Math.log(bytes) / Math.log(FILE_SIZE_BASE));\n const size = bytes / Math.pow(FILE_SIZE_BASE, i);\n return `${size.toFixed(i > 0 ? 1 : 0)} ${FILE_SIZE_UNITS[i]}`;\n};\n\nexport const isPreviewable = (file: ZGalleryFile): boolean => {\n const category = getFileCategory(file);\n return (\n category === 'image' ||\n category === 'pdf' ||\n category === 'video' ||\n category === 'word' ||\n category === 'excel' ||\n category === 'text' ||\n category === 'code'\n );\n};\n\nexport const isImage = (file: ZGalleryFile): boolean => getFileCategory(file) === 'image';\n","import { ChangeDetectionStrategy, Component, computed, input, output, signal, ViewEncapsulation } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ZButtonComponent } from '@shival99/z-ui/components/z-button';\nimport { ZIconComponent, type ZIcon } from '@shival99/z-ui/components/z-icon';\nimport { ZSkeletonComponent } from '@shival99/z-ui/components/z-skeleton';\nimport { ZTooltipDirective } from '@shival99/z-ui/components/z-tooltip';\nimport { zMergeClasses } from '@shival99/z-ui/utils';\nimport {\n FILE_CATEGORY_STYLES,\n type ZFileCategoryStyle,\n type ZGalleryFile,\n type ZGalleryMode,\n type ZGallerySize,\n} from './z-gallery.types';\nimport { formatFileSize, getFileCategory, isPreviewable } from './z-gallery.utils';\n\n@Component({\n selector: 'z-gallery-item',\n imports: [ZButtonComponent, ZIconComponent, ZTooltipDirective, ZSkeletonComponent, TranslatePipe],\n standalone: true,\n template: `\n @if (zMode() === 'grid') {\n <div\n class=\"group border-border bg-card hover:border-primary/30 relative cursor-pointer overflow-hidden rounded-md border shadow-sm transition-all duration-300 hover:shadow-lg\"\n [class.border-primary]=\"zSelected()\"\n [class.ring-1]=\"zSelected()\"\n [class.ring-primary/35]=\"zSelected()\"\n (click)=\"onItemClick()\"\n >\n @if (zSelectable()) {\n <div\n class=\"bg-primary shadow-card absolute top-3 right-3 z-20 flex size-6 items-center justify-center rounded-full transition-all duration-200\"\n [class.scale-100]=\"zSelected()\"\n [class.opacity-100]=\"zSelected()\"\n [class.scale-90]=\"!zSelected()\"\n [class.opacity-0]=\"!zSelected()\"\n >\n <i z-icon zType=\"lucideCheck\" zSize=\"14\" class=\"text-primary-foreground\"></i>\n </div>\n }\n\n <div class=\"relative overflow-hidden\" [class]=\"mediaHeightClass()\">\n @if (isImage()) {\n @if (isLoading()) {\n <div class=\"absolute inset-0\">\n <z-skeleton class=\"size-full\" />\n </div>\n }\n <img\n [src]=\"file().thumbnailUrl || file().url\"\n [alt]=\"file().name\"\n class=\"size-full object-cover transition-all duration-500\"\n [class.opacity-0]=\"isLoading()\"\n [class.scale-100]=\"!isLoading()\"\n [class.group-hover:scale-110]=\"!isLoading()\"\n loading=\"lazy\"\n (load)=\"onImageLoad()\"\n (error)=\"onImageError()\"\n />\n } @else {\n <div\n class=\"flex size-full flex-col items-center justify-center gap-2 bg-gradient-to-br\"\n [class]=\"categoryStyle().bg\"\n >\n <i z-icon [zType]=\"categoryStyle().icon\" zSize=\"34\" [class]=\"categoryStyle().text\"></i>\n <span class=\"text-xs font-semibold tracking-wide\" [class]=\"categoryStyle().text\">\n {{ categoryStyle().label }}\n </span>\n </div>\n }\n\n <div class=\"absolute inset-x-0 top-0 z-10 flex items-start justify-between p-3\">\n <span\n class=\"rounded-full border border-white/35 bg-black/45 px-2.5 py-1 text-[0.6875rem] font-semibold tracking-wide text-white backdrop-blur-md\"\n >\n {{ fileExtension() }}\n </span>\n <span\n class=\"rounded-full border border-white/25 bg-black/35 px-2 py-1 text-[0.625rem] font-medium text-white/95 backdrop-blur-md\"\n >\n {{ formattedSize() }}\n </span>\n </div>\n\n <div\n class=\"absolute inset-x-0 bottom-0 h-24 bg-gradient-to-t from-black/70 via-black/30 to-transparent opacity-85 transition-opacity duration-300 group-hover:opacity-100\"\n ></div>\n\n <div\n class=\"absolute right-3 bottom-3 z-20 flex items-center gap-1.5 rounded-full border border-white/20 bg-black/40 p-1 opacity-0 backdrop-blur-md transition-all duration-200 group-hover:opacity-100\"\n >\n @if (zShowPreview() && canPreview()) {\n <button\n z-button\n zType=\"secondary\"\n zSize=\"xs\"\n zShape=\"circle\"\n class=\"shadow-lg\"\n (click)=\"onPreviewClick($event)\"\n z-tooltip\n [zContent]=\"'i18n_z_ui_gallery_preview' | translate\"\n >\n <i z-icon zType=\"lucideEye\" zSize=\"14\"></i>\n </button>\n }\n @if (zShowDownload() && (file().downloadUrl || file().url)) {\n <button\n z-button\n zType=\"secondary\"\n zSize=\"xs\"\n zShape=\"circle\"\n class=\"shadow-lg\"\n (click)=\"onDownload($event)\"\n z-tooltip\n [zContent]=\"'i18n_z_ui_gallery_download' | translate\"\n >\n <i z-icon zType=\"lucideDownload\" zSize=\"14\"></i>\n </button>\n }\n @if (zShowRemove()) {\n <button\n z-button\n zType=\"secondary\"\n zSize=\"xs\"\n zShape=\"circle\"\n class=\"shadow-lg\"\n (click)=\"onRemove($event)\"\n z-tooltip\n [zContent]=\"'i18n_z_ui_gallery_remove' | translate\"\n >\n <i z-icon zType=\"lucideTrash2\" zSize=\"14\"></i>\n </button>\n }\n </div>\n </div>\n\n <div class=\"p-3\">\n <p class=\"text-foreground truncate text-sm leading-normal font-semibold\" z-tooltip [zContent]=\"file().name\">\n {{ file().name }}\n </p>\n @if (formattedDate()) {\n <p class=\"text-muted-foreground mt-1 text-xs\">{{ formattedDate() }}</p>\n }\n </div>\n </div>\n } @else {\n <div\n class=\"group border-border bg-card hover:border-primary/35 flex cursor-pointer items-center gap-3 rounded-sm border px-3 py-2.5 shadow-sm transition-all duration-200 hover:shadow-md\"\n [class.border-primary]=\"zSelected()\"\n [class.ring-1]=\"zSelected()\"\n [class.ring-primary/30]=\"zSelected()\"\n (click)=\"onItemClick()\"\n >\n @if (zSelectable()) {\n <div\n class=\"bg-primary -ml-1 flex size-5 shrink-0 items-center justify-center rounded-full transition-all duration-200\"\n [class.scale-100]=\"zSelected()\"\n [class.opacity-100]=\"zSelected()\"\n [class.scale-90]=\"!zSelected()\"\n [class.opacity-0]=\"!zSelected()\"\n >\n <i z-icon zType=\"lucideCheck\" zSize=\"12\" class=\"text-primary-foreground\"></i>\n </div>\n }\n\n <div\n class=\"relative flex size-11 shrink-0 items-center justify-center overflow-hidden rounded-sm border border-black/5 bg-white/40 shadow-sm backdrop-blur-sm dark:border-white/10 dark:bg-white/5\"\n >\n @if (isImage() && (file().thumbnailUrl || file().url)) {\n <img\n [src]=\"file().thumbnailUrl || file().url\"\n [alt]=\"file().name\"\n class=\"size-full rounded-sm object-cover\"\n loading=\"lazy\"\n />\n } @else {\n <span class=\"absolute inset-0 opacity-30 dark:opacity-20\" [class]=\"categoryStyle().bg\"></span>\n <i\n z-icon\n [zType]=\"categoryStyle().icon\"\n zSize=\"18\"\n class=\"relative z-10\"\n [class]=\"categoryStyle().text\"\n ></i>\n }\n </div>\n\n <div class=\"min-w-0 flex-1\">\n <p class=\"text-foreground truncate text-sm font-medium\" z-tooltip [zContent]=\"file().name\">\n {{ file().name }}\n </p>\n <p class=\"text-muted-foreground truncate text-xs\">{{ formattedSize() }} · {{ categoryStyle().label }}</p>\n </div>\n\n <div class=\"ml-auto flex shrink-0 items-center gap-1.5\">\n <span [class]=\"fileTypeClasses()\">\n {{ fileExtension() }}\n </span>\n @if (zShowPreview() && canPreview()) {\n <button\n z-button\n zType=\"ghost\"\n zSize=\"xs\"\n zShape=\"circle\"\n class=\"text-muted-foreground hover:text-foreground\"\n (click)=\"onPreviewClick($event)\"\n z-tooltip\n [zContent]=\"'i18n_z_ui_gallery_preview' | translate\"\n >\n <i z-icon zType=\"lucideEye\" zSize=\"16\"></i>\n </button>\n }\n @if (zShowDownload() && (file().downloadUrl || file().url)) {\n <button\n z-button\n zType=\"ghost\"\n zSize=\"xs\"\n zShape=\"circle\"\n class=\"text-muted-foreground hover:text-foreground\"\n (click)=\"onDownload($event)\"\n z-tooltip\n [zContent]=\"'i18n_z_ui_gallery_download' | translate\"\n >\n <i z-icon zType=\"lucideDownload\" zSize=\"16\"></i>\n </button>\n }\n @if (zShowRemove()) {\n <button\n z-button\n zType=\"ghost\"\n zSize=\"xs\"\n zShape=\"circle\"\n class=\"text-muted-foreground hover:text-destructive\"\n (click)=\"onRemove($event)\"\n z-tooltip\n [zContent]=\"'i18n_z_ui_gallery_remove' | translate\"\n >\n <i z-icon zType=\"lucideTrash2\" zSize=\"16\"></i>\n </button>\n }\n </div>\n </div>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'z-gallery-item block',\n },\n})\nexport class ZGalleryItemComponent {\n public readonly file = input.required<ZGalleryFile>();\n public readonly zMode = input<ZGalleryMode>('grid');\n public readonly zSize = input<ZGallerySize>('default');\n public readonly zShowDownload = input(true);\n public readonly zShowPreview = input(true);\n public readonly zShowRemove = input(false);\n public readonly zSelectable = input(false);\n public readonly zSelected = input(false);\n\n public readonly zOnDownload = output<ZGalleryFile>();\n public readonly zOnPreview = output<ZGalleryFile>();\n public readonly zOnRemove = output<ZGalleryFile>();\n public readonly zOnSelect = output<ZGalleryFile>();\n\n protected readonly isLoading = signal(true);\n protected readonly formattedSize = computed(() => formatFileSize(this.file().size));\n protected readonly category = computed(() => getFileCategory(this.file()));\n protected readonly isImage = computed(() => this.category() === 'image');\n protected readonly fileExtension = computed(() => {\n const fileName = this.file().name;\n const parts = fileName.split('.');\n if (parts.length < 2) {\n return 'FILE';\n }\n\n return parts[parts.length - 1].toUpperCase();\n });\n\n protected readonly mediaHeightClass = computed(() => {\n const size = this.zSize();\n switch (size) {\n case 'sm':\n return 'h-36';\n case 'lg':\n return 'h-56';\n default:\n return 'h-44';\n }\n });\n\n protected readonly formattedDate = computed(() => {\n const file = this.file();\n const date = file.updatedAt || file.createdAt;\n if (!date) {\n return null;\n }\n\n return new Intl.DateTimeFormat(undefined, {\n month: 'short',\n day: '2-digit',\n year: 'numeric',\n }).format(date);\n });\n\n protected readonly categoryStyle = computed<ZFileCategoryStyle & { icon: ZIcon }>(() => {\n const style = FILE_CATEGORY_STYLES[this.category()];\n return {\n ...style,\n icon: style.icon as ZIcon,\n };\n });\n\n protected readonly fileTypeClasses = computed(() =>\n zMergeClasses(\n 'inline-flex min-w-14 items-center justify-center rounded-sm border border-black/5 px-2.5 py-1 text-[0.6875rem] font-semibold tracking-wide dark:border-white/10',\n this.categoryStyle().bg,\n this.categoryStyle().text\n )\n );\n\n protected readonly canPreview = computed(() => isPreviewable(this.file()));\n\n protected onImageLoad(): void {\n this.isLoading.set(false);\n }\n\n protected onImageError(): void {\n this.isLoading.set(false);\n }\n\n protected onDownload(event: Event): void {\n event.stopPropagation();\n this.zOnDownload.emit(this.file());\n }\n\n protected onPreviewClick(event: Event): void {\n event.stopPropagation();\n this.zOnPreview.emit(this.file());\n }\n\n protected onPreview(): void {\n if (this.canPreview()) {\n this.zOnPreview.emit(this.file());\n }\n }\n\n protected onItemClick(): void {\n if (this.zSelectable()) {\n this.zOnSelect.emit(this.file());\n return;\n }\n\n this.onPreview();\n }\n\n protected onRemove(event: Event): void {\n event.stopPropagation();\n this.zOnRemove.emit(this.file());\n }\n\n protected onSelectClick(event: Event): void {\n event.stopPropagation();\n this.zOnSelect.emit(this.file());\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml, SafeResourceUrl } from '@angular/platform-browser';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ZButtonComponent } from '@shival99/z-ui/components/z-button';\nimport { ZIconComponent, type ZIcon } from '@shival99/z-ui/components/z-icon';\nimport { ZSkeletonComponent } from '@shival99/z-ui/components/z-skeleton';\nimport { ZTooltipDirective } from '@shival99/z-ui/components/z-tooltip';\nimport type { ZGalleryFile } from './z-gallery.types';\nimport { formatFileSize, getFileCategory, isImage, isPreviewable } from './z-gallery.utils';\n\n@Component({\n selector: 'z-gallery-preview',\n imports: [ZButtonComponent, ZIconComponent, ZSkeletonComponent, ZTooltipDirective, TranslatePipe],\n standalone: true,\n template: `\n <div\n class=\"animate-in fade-in fixed inset-0 z-50 flex items-center justify-center bg-black/80 backdrop-blur-sm duration-200\"\n (click)=\"onBackdropClick($event)\"\n >\n <button\n z-button\n zType=\"ghost\"\n zShape=\"circle\"\n class=\"absolute top-4 right-4 z-10 text-white hover:bg-white/20\"\n (click)=\"close()\"\n >\n <i z-icon zType=\"lucideX\" zSize=\"24\"></i>\n </button>\n\n @if (hasPrev()) {\n <button\n z-button\n zType=\"ghost\"\n zShape=\"circle\"\n class=\"absolute left-4 z-10 text-white hover:bg-white/20\"\n (click)=\"navigate(-1)\"\n >\n <i z-icon zType=\"lucideChevronLeft\" zSize=\"32\"></i>\n </button>\n }\n\n @if (hasNext()) {\n <button\n z-button\n zType=\"ghost\"\n zShape=\"circle\"\n class=\"absolute right-4 z-10 text-white hover:bg-white/20\"\n (click)=\"navigate(1)\"\n >\n <i z-icon zType=\"lucideChevronRight\" zSize=\"32\"></i>\n </button>\n }\n\n <div class=\"flex h-full w-full flex-col items-center\" (click)=\"$event.stopPropagation()\">\n <div\n class=\"dark:!border-border absolute top-4 left-1/2 z-10 flex -translate-x-1/2 items-center gap-2 rounded-[0.375rem] border !border-transparent bg-black/60 px-4 py-2 text-sm text-white backdrop-blur-sm dark:border\"\n >\n <div class=\"flex min-w-0 items-baseline gap-1.5\">\n <span class=\"max-w-[12.5rem] truncate font-medium\">{{ file().name }}</span>\n <span class=\"shrink-0 text-white/70\">({{ formattedSize() }})</span>\n </div>\n\n @if (files().length > 1) {\n <span class=\"text-white/70\">{{ currentIndex() + 1 }} / {{ files().length }}</span>\n }\n\n <div class=\"ml-1 flex items-center gap-0.5\">\n @if (isImageFile()) {\n <button\n z-button\n zType=\"ghost\"\n zSize=\"xs\"\n zShape=\"circle\"\n class=\"text-white hover:bg-white/20\"\n z-tooltip\n [zContent]=\"'i18n_z_ui_gallery_rotate_left' | translate\"\n (click)=\"rotateLeft()\"\n >\n <i z-icon zType=\"lucideUndo\" zSize=\"14\"></i>\n </button>\n <button\n z-button\n zType=\"ghost\"\n zSize=\"xs\"\n zShape=\"circle\"\n class=\"text-white hover:bg-white/20\"\n z-tooltip\n [zContent]=\"'i18n_z_ui_gallery_rotate_right' | translate\"\n (click)=\"rotateRight()\"\n >\n <i z-icon zType=\"lucideRedo\" zSize=\"14\"></i>\n </button>\n }\n\n <button\n z-button\n zType=\"ghost\"\n zSize=\"xs\"\n zShape=\"circle\"\n class=\"text-white hover:bg-white/20\"\n z-tooltip\n [zContent]=\"'i18n_z_ui_gallery_download' | translate\"\n (click)=\"download()\"\n >\n <i z-icon zType=\"lucideDownload\" zSize=\"14\"></i>\n </button>\n\n @if (zShowRemove()) {\n <button\n z-button\n zType=\"ghost\"\n zSize=\"xs\"\n zShape=\"circle\"\n class=\"text-white hover:bg-white/20\"\n z-tooltip\n [zContent]=\"'i18n_z_ui_gallery_delete' | translate\"\n (click)=\"remove()\"\n >\n <i z-icon zType=\"lucideTrash2\" zSize=\"14\"></i>\n </button>\n }\n </div>\n </div>\n\n <div class=\"relative flex flex-1 items-center justify-center pt-16\">\n @if (isImageFile()) {\n <div class=\"relative flex h-[60vh] w-[70vw] items-center justify-center\">\n @if (isLoading()) {\n <z-skeleton class=\"absolute inset-0 rounded-lg\" />\n }\n <img\n [src]=\"file().url || file().thumbnailUrl\"\n [alt]=\"file().name\"\n class=\"max-h-full max-w-full rounded-lg object-contain shadow-2xl transition-opacity duration-300\"\n [class.opacity-0]=\"isLoading()\"\n [class.opacity-100]=\"!isLoading()\"\n [class.cursor-zoom-in]=\"!zoomed()\"\n [class.cursor-zoom-out]=\"zoomed()\"\n [style.transform]=\"imageTransform()\"\n (load)=\"onImageLoad()\"\n (error)=\"onMediaError()\"\n (click)=\"toggleZoom()\"\n />\n </div>\n } @else if (isPdf() && safePdfUrl()) {\n <div class=\"relative h-[75vh] w-[85vw]\">\n @if (isLoading()) {\n <z-skeleton class=\"absolute inset-0 rounded-lg\" />\n }\n <iframe\n [src]=\"safePdfUrl()\"\n class=\"absolute inset-0 size-full rounded-lg bg-white shadow-2xl transition-opacity duration-300\"\n [class.opacity-0]=\"isLoading()\"\n [class.opacity-100]=\"!isLoading()\"\n frameborder=\"0\"\n referrerpolicy=\"no-referrer\"\n (load)=\"onPdfLoad()\"\n ></iframe>\n </div>\n } @else if (isVideo()) {\n <div class=\"relative flex h-[60vh] w-[70vw] items-center justify-center\">\n @if (isLoading()) {\n <z-skeleton class=\"absolute inset-0 rounded-lg\" />\n }\n <video\n [src]=\"file().url\"\n controls\n autoplay\n class=\"max-h-full max-w-full rounded-lg shadow-2xl transition-opacity duration-300\"\n [class.opacity-0]=\"isLoading()\"\n [class.opacity-100]=\"!isLoading()\"\n (loadeddata)=\"onVideoLoad()\"\n (error)=\"onMediaError()\"\n >\n Your browser does not support the video tag.\n </video>\n </div>\n } @else if (isWordFile()) {\n <div class=\"relative h-[75vh] w-[85vw]\">\n @if (isLoading() || isConverting()) {\n <z-skeleton class=\"absolute inset-0 rounded-lg\" />\n }\n @if (conversionError()) {\n <div class=\"bg-card flex size-full flex-col items-center justify-center rounded-lg p-12 shadow-2xl\">\n <div class=\"bg-muted mb-4 flex size-24 items-center justify-center rounded-xl\">\n <i z-icon [zType]=\"fileIcon()\" zSize=\"40\" class=\"text-muted-foreground\"></i>\n </div>\n <span class=\"text-foreground mb-2 text-lg font-medium\">{{ file().name }}</span>\n <span class=\"text-muted-foreground rounded-md bg-red-100 px-3 py-1.5 text-xs dark:bg-red-900/30\">\n <span class=\"text-red-700 dark:text-red-300\">{{ conversionError() }}</span>\n </span>\n </div>\n } @else if (docHtmlContent()) {\n <div\n class=\"absolute inset-0 overflow-auto rounded-lg bg-white p-8 text-gray-950 shadow-2xl\"\n [innerHTML]=\"docHtmlContent()\"\n ></div>\n }\n </div>\n } @else if (isExcelFile()) {\n <div class=\"relative h-[75vh] w-[85vw]\">\n @if (isLoading() || isConverting()) {\n <z-skeleton class=\"absolute inset-0 rounded-lg\" />\n }\n @if (conversionError()) {\n <div class=\"bg-card flex size-full flex-col items-center justify-center rounded-lg p-12 shadow-2xl\">\n <div class=\"bg-muted mb-4 flex size-24 items-center justify-center rounded-xl\">\n <i z-icon [zType]=\"fileIcon()\" zSize=\"40\" class=\"text-muted-foreground\"></i>\n </div>\n <span class=\"text-foreground mb-2 text-lg font-medium\">{{ file().name }}</span>\n <span class=\"text-muted-foreground rounded-md bg-red-100 px-3 py-1.5 text-xs dark:bg-red-900/30\">\n <span class=\"text-red-700 dark:text-red-300\">{{ conversionError() }}</span>\n </span>\n </div>\n } @else if (docHtmlContent()) {\n <div\n class=\"absolute inset-0 overflow-auto rounded-lg bg-white p-4 text-gray-950 shadow-2xl\"\n [innerHTML]=\"docHtmlContent()\"\n ></div>\n }\n </div>\n } @else if (isTextFile()) {\n <div class=\"relative h-[75vh] w-[85vw]\">\n @if (isLoading() || isConverting()) {\n <z-skeleton class=\"absolute inset-0 rounded-lg\" />\n }\n @if (conversionError()) {\n <div class=\"bg-card flex size-full flex-col items-center justify-center rounded-lg p-12 shadow-2xl\">\n <div class=\"bg-muted mb-4 flex size-24 items-center justify-center rounded-xl\">\n <i z-icon [zType]=\"fileIcon()\" zSize=\"40\" class=\"text-muted-foreground\"></i>\n </div>\n <span class=\"text-foreground mb-2 text-lg font-medium\">{{ file().name }}</span>\n <span class=\"text-muted-foreground rounded-md bg-red-100 px-3 py-1.5 text-xs dark:bg-red-900/30\">\n <span class=\"text-red-700 dark:text-red-300\">{{ conversionError() }}</span>\n </span>\n </div>\n } @else if (textContent()) {\n <div class=\"absolute inset-0 overflow-auto rounded-lg bg-gray-950 p-6 shadow-2xl\">\n <pre class=\"font-mono text-sm leading-relaxed whitespace-pre-wrap text-gray-100\">{{\n textContent()\n }}</pre>\n </div>\n }\n </div>\n } @else {\n <div class=\"bg-card flex flex-col items-center justify-center rounded-lg p-12 shadow-2xl\">\n <div class=\"bg-muted mb-4 flex size-24 items-center justify-center rounded-xl\">\n <i z-icon [zType]=\"fileIcon()\" zSize=\"40\" class=\"text-muted-foreground\"></i>\n </div>\n <span class=\"text-foreground mb-2 text-lg font-medium\">{{ file().name }}</span>\n <span class=\"text-muted-foreground mb-4 text-sm\">{{ formattedSize() }}</span>\n <span class=\"text-muted-foreground rounded-md bg-amber-100 px-3 py-1.5 text-xs dark:bg-amber-900/30\">\n <i\n z-icon\n zType=\"lucideInfo\"\n zSize=\"14\"\n class=\"mr-1 inline-block align-middle text-amber-600 dark:text-amber-400\"\n ></i>\n <span class=\"align-middle text-amber-700 dark:text-amber-300\">\n {{ 'i18n_z_ui_gallery_preview_not_supported' | translate }}\n </span>\n </span>\n </div>\n }\n </div>\n </div>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'z-gallery-preview z-[9999]',\n '(document:keydown)': 'onKeyDown($event)',\n },\n})\nexport class ZGalleryPreviewComponent {\n private readonly _sanitizer = inject(DomSanitizer);\n\n public readonly file = input.required<ZGalleryFile>();\n public readonly files = input<ZGalleryFile[]>([]);\n public readonly zShowRemove = input(false);\n public readonly zTrustedResourceOrigins = input<string[]>([]);\n\n public readonly zOnClose = output<void>();\n public readonly zOnDownload = output<ZGalleryFile>();\n public readonly zOnNavigate = output<ZGalleryFile>();\n public readonly zOnRemove = output<ZGalleryFile>();\n\n protected readonly zoomed = signal(false);\n protected readonly isLoading = signal(true);\n protected readonly rotation = signal(0);\n protected readonly isConverting = signal(false);\n protected readonly conversionError = signal<string | null>(null);\n protected readonly docHtmlContent = signal<SafeHtml | null>(null);\n protected readonly textContent = signal<string>('');\n\n private readonly _mediaLoaded = signal(false);\n private _loadingStartTime = 0;\n private readonly _minLoadingTime = 300;\n\n constructor() {\n effect(() => {\n const currentFile = this.file();\n if (!currentFile) {\n return;\n }\n\n this.isLoading.set(true);\n this._mediaLoaded.set(false);\n this._loadingStartTime = Date.now();\n this.zoomed.set(false);\n this.rotation.set(0);\n this.isConverting.set(false);\n this.conversionError.set(null);\n this.docHtmlContent.set(null);\n this.textContent.set('');\n\n const category = getFileCategory(currentFile);\n if (category === 'word' || category === 'excel' || category === 'text' || category === 'code') {\n void this._loadFileContent(currentFile, category);\n }\n });\n }\n\n private async _loadFileContent(file: ZGalleryFile, category: string): Promise<void> {\n const url = file.url || file.downloadUrl;\n if (!url) {\n this.conversionError.set('No URL available for preview');\n this._completeLoading();\n return;\n }\n\n this.isConverting.set(true);\n\n try {\n if (category === 'word') {\n await this._loadDocx(url);\n } else if (category === 'excel') {\n await this._loadExcel(url);\n } else {\n await this._loadText(url);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to load file content';\n this.conversionError.set(message);\n } finally {\n this.isConverting.set(false);\n this._completeLoading();\n }\n }\n\n private async _loadDocx(url: string): Promise<void> {\n const response = await fetch(url);\n this._assertSuccessfulResponse(response);\n const arrayBuffer = await response.arrayBuffer();\n const mammothModule = await import('mammoth');\n const mammoth = mammothModule.default ?? mammothModule;\n const result = await mammoth.convertToHtml({ arrayBuffer });\n this.docHtmlContent.set(this._sanitizer.bypassSecurityTrustHtml(result.value));\n }\n\n private async _loadExcel(url: string): Promise<void> {\n const response = await fetch(url);\n this._assertSuccessfulResponse(response);\n const arrayBuffer = await response.arrayBuffer();\n const xlsxModule = await import('xlsx');\n const XLSX = xlsxModule.default ?? xlsxModule;\n const workbook = XLSX.read(arrayBuffer);\n const firstSheet = workbook.Sheets[workbook.SheetNames[0]];\n const html = XLSX.utils.sheet_to_html(firstSheet);\n this.docHtmlContent.set(this._sanitizer.bypassSecurityTrustHtml(html));\n }\n\n private async _loadText(url: string): Promise<void> {\n const response = await fetch(url);\n this._assertSuccessfulResponse(response);\n const text = await response.text();\n this.textContent.set(text);\n }\n\n private _assertSuccessfulResponse(response: Response): void {\n if (!response.ok) {\n throw new Error(`Failed to fetch file: ${response.status}`);\n }\n }\n\n private _completeLoading(): void {\n const elapsed = Date.now() - this._loadingStartTime;\n const remaining = this._minLoadingTime - elapsed;\n\n if (remaining > 0) {\n setTimeout(() => this.isLoading.set(false), remaining);\n return;\n }\n\n this.isLoading.set(false);\n }\n\n protected readonly currentIndex = computed(() => {\n const allFiles = this.files();\n const current = this.file();\n return allFiles.findIndex(f => f.id === current.id);\n });\n\n protected readonly hasPrev = computed(() => this.currentIndex() > 0);\n protected readonly hasNext = computed(() => this.currentIndex() < this.files().length - 1);\n\n protected readonly isImageFile = computed(() => isImage(this.file()));\n protected readonly isPdf = computed(() => getFileCategory(this.file()) === 'pdf');\n protected readonly safePdfUrl = computed<SafeResourceUrl | null>(() => {\n const { url } = this.file();\n if (!url) {\n return null;\n }\n\n if (!this._isAllowedResourceUrl(url)) {\n return null;\n }\n\n return this._sanitizer.bypassSecurityTrustResourceUrl(url);\n });\n\n protected readonly isVideo = computed(() => getFileCategory(this.file()) === 'video');\n protected readonly isWordFile = computed(() => getFileCategory(this.file()) === 'word');\n protected readonly isExcelFile = computed(() => getFileCategory(this.file()) === 'excel');\n protected readonly isTextFile = computed(() => {\n const category = getFileCategory(this.file());\n return category === 'text' || category === 'code';\n });\n\n protected readonly canPreview = computed(() => isPreviewable(this.file()));\n\n protected readonly formattedSize = computed(() => formatFileSize(this.file().size));\n\n protected readonly imageTransform = computed(() => {\n const rot = this.rotation();\n const zoom = this.zoomed() ? 'scale(1.5)' : 'scale(1)';\n return `rotate(${rot}deg) ${zoom}`;\n });\n\n private _isAllowedResourceUrl(url: string): boolean {\n const currentOrigin = globalThis.location?.origin;\n const baseUrl = currentOrigin ?? 'http://localhost';\n\n try {\n const parsedUrl = new URL(url, baseUrl);\n if (parsedUrl.protocol === 'blob:') {\n return parsedUrl.origin === baseUrl;\n }\n\n return parsedUrl.origin === baseUrl || this._trustedOrigins().has(parsedUrl.origin);\n } catch {\n return false;\n }\n }\n\n private readonly _trustedOrigins = computed(\n () =>\n new Set(\n this.zTrustedResourceOrigins()\n .map(origin => this._normalizeOrigin(origin))\n .filter((origin): origin is string => Boolean(origin))\n )\n );\n\n private _normalizeOrigin(origin: string): string | null {\n try {\n return new URL(origin).origin;\n } catch {\n return null;\n }\n }\n\n protected readonly fileIcon = computed<ZIcon>(() => {\n const category = getFileCategory(this.file());\n const iconMap: Record<string, ZIcon> = {\n pdf: 'lucideFileText',\n word: 'lucideFileText',\n excel: 'lucideFileSpreadsheet',\n video: 'lucideVideo',\n audio: 'lucideMusic',\n archive: 'lucideFileArchive',\n code: 'lucideCode',\n text: 'lucideFileText',\n unknown: 'lucideFile',\n };\n return iconMap[category] || 'lucideFile';\n });\n\n protected onKeyDown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'Escape':\n this.close();\n break;\n case 'ArrowLeft':\n if (this.hasPrev()) {\n this.navigate(-1);\n }\n break;\n case 'ArrowRight':\n if (this.hasNext()) {\n this.navigate(1);\n }\n break;\n case 'r':\n case 'R':\n if (this.isImageFile()) {\n this.rotateRight();\n }\n break;\n }\n }\n\n protected close(): void {\n this.zOnClose.emit();\n }\n\n protected navigate(direction: -1 | 1): void {\n const allFiles = this.files();\n const newIndex = this.currentIndex() + direction;\n if (newIndex >= 0 && newIndex < allFiles.length) {\n this.zoomed.set(false);\n this.rotation.set(0);\n this.isLoading.set(true);\n this._mediaLoaded.set(false);\n this._loadingStartTime = Date.now();\n this.zOnNavigate.emit(allFiles[newIndex]);\n }\n }\n\n protected toggleZoom(): void {\n if (this.isImageFile()) {\n this.zoomed.update(z => !z);\n }\n }\n\n protected rotateLeft(): void {\n this.rotation.update(r => (r - 90 + 360) % 360);\n }\n\n protected rotateRight(): void {\n this.rotation.update(r => (r + 90) % 360);\n }\n\n protected onImageLoad(): void {\n this._completeLoading();\n }\n\n protected onVideoLoad(): void {\n this._completeLoading();\n }\n\n protected onPdfLoad(): void {\n this._completeLoading();\n }\n\n protected onMediaError(): void {\n this._completeLoading();\n }\n\n protected download(): void {\n this.zOnDownload.emit(this.file());\n }\n\n protected remove(): void {\n this.zOnRemove.emit(this.file());\n }\n\n protected onBackdropClick(event: Event): void {\n if ((event.target as HTMLElement).classList.contains('fixed')) {\n this.close();\n }\n }\n}\n","import { cva, type VariantProps } from 'class-variance-authority';\n\nexport const zGalleryVariants = cva('z-gallery', {\n variants: {\n zSize: {\n sm: 'z-gallery--sm',\n default: 'z-gallery--default',\n lg: 'z-gallery--lg',\n },\n },\n defaultVariants: {\n zSize: 'default',\n },\n});\n\nexport type ZGalleryVariants = VariantProps<typeof zGalleryVariants>;\n\n// Grid item variants\nexport const zGalleryItemVariants = cva(\n 'group relative overflow-hidden rounded-lg border border-border bg-card transition-all duration-200 cursor-pointer',\n {\n variants: {\n zMode: {\n grid: 'flex flex-col hover:scale-[1.02] hover:shadow-md hover:border-primary/50',\n list: 'flex flex-row items-center gap-3 p-3 hover:bg-accent hover:border-primary/50',\n },\n zSize: {\n sm: '',\n default: '',\n lg: '',\n },\n },\n compoundVariants: [\n // Grid sizes\n { zMode: 'grid', zSize: 'sm', class: '' },\n { zMode: 'grid', zSize: 'default', class: '' },\n { zMode: 'grid', zSize: 'lg', class: '' },\n // List sizes\n { zMode: 'list', zSize: 'sm', class: 'p-2' },\n { zMode: 'list', zSize: 'default', class: 'p-3' },\n { zMode: 'list', zSize: 'lg', class: 'p-4' },\n ],\n defaultVariants: {\n zMode: 'grid',\n zSize: 'default',\n },\n }\n);\n\nexport type ZGalleryItemVariants = VariantProps<typeof zGalleryItemVariants>;\n\n// File icon badge variants\nexport const zGalleryFileIconVariants = cva(\n 'flex items-center justify-center rounded-md font-bold uppercase select-none',\n {\n variants: {\n zSize: {\n sm: 'w-full h-16 text-xs',\n default: 'w-full h-24 text-sm',\n lg: 'w-full h-32 text-base',\n },\n zMode: {\n grid: '',\n list: '',\n },\n },\n compoundVariants: [\n { zMode: 'list', zSize: 'sm', class: 'size-8 text-[0.625rem]' },\n { zMode: 'list', zSize: 'default', class: 'size-10 text-xs' },\n { zMode: 'list', zSize: 'lg', class: 'size-12 text-sm' },\n ],\n defaultVariants: {\n zSize: 'default',\n zMode: 'grid',\n },\n }\n);\n\nexport type ZGalleryFileIconVariants = VariantProps<typeof zGalleryFileIconVariants>;\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n model,\n output,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ZButtonComponent } from '@shival99/z-ui/components/z-button';\nimport { ZButtonGroupComponent, ZButtonGroupItemDirective } from '@shival99/z-ui/components/z-button-group';\nimport { ZCheckboxComponent } from '@shival99/z-ui/components/z-checkbox';\nimport { ZEmptyComponent } from '@shival99/z-ui/components/z-empty';\nimport { ZIconComponent, type ZIcon } from '@shival99/z-ui/components/z-icon';\nimport { ZInputComponent } from '@shival99/z-ui/components/z-input';\nimport { ZSkeletonComponent } from '@shival99/z-ui/components/z-skeleton';\nimport { zMergeClasses } from '@shival99/z-ui/utils';\nimport type { ClassValue } from 'clsx';\nimport { ZGalleryItemComponent } from './z-gallery-item.component';\nimport { ZGalleryPreviewComponent } from './z-gallery-preview.component';\nimport type {\n ZGalleryActionEvent,\n ZGalleryControl,\n ZGalleryFile,\n ZGalleryMode,\n ZGallerySelectionChange,\n ZGallerySize,\n ZGalleryToggleSize,\n} from './z-gallery.types';\nimport { zGalleryVariants } from './z-gallery.variants';\n\n@Component({\n selector: 'z-gallery',\n imports: [\n FormsModule,\n TranslatePipe,\n ZGalleryItemComponent,\n ZGalleryPreviewComponent,\n ZButtonGroupComponent,\n ZButtonGroupItemDirective,\n ZButtonComponent,\n ZCheckboxComponent,\n ZIconComponent,\n ZEmptyComponent,\n ZInputComponent,\n ZSkeletonComponent,\n ],\n standalone: true,\n template: `\n <div [class]=\"containerClasses()\">\n @if (showHeader()) {\n <div class=\"mb-4 flex flex-wrap items-center justify-between gap-3\">\n <div class=\"flex items-center gap-3\">\n @if (zTitle()) {\n @if (zLoading()) {\n <z-skeleton zWidth=\"7rem\" zHeight=\"1.25rem\" />\n } @else {\n <h3 class=\"text-sm font-medium\">{{ zTitle() }}</h3>\n }\n }\n\n @if (zShowSearch()) {\n @if (zLoading()) {\n <z-skeleton zWidth=\"16rem\" [zHeight]=\"headerControlHeight()\" zRadius=\"0.375rem\" />\n } @else {\n <z-input\n zSearch\n [zSize]=\"searchInputSize()\"\n [zPlaceholder]=\"zSearchPlaceholder() || ('i18n_z_ui_gallery_search_placeholder' | translate)\"\n [zDebounce]=\"zSearchDebounce()\"\n [ngModel]=\"searchInputQuery()\"\n (ngModelChange)=\"searchInputQuery.set($event)\"\n (zOnSearch)=\"onSearchChange($event)\"\n class=\"w-64\"\n />\n }\n }\n </div>\n\n @if (zShowModeToggle() && (zFiles().length > 0 || zLoading())) {\n @if (zLoading()) {\n <z-skeleton zWidth=\"5rem\" [zHeight]=\"headerControlHeight()\" zRadius=\"0.375rem\" />\n } @else {\n <z-button-group [(zActive)]=\"modeIndex\">\n <button z-button zType=\"outline\" [zSize]=\"zToggleSize()\" z-button-group-item>\n <i z-icon zType=\"lucideLayoutGrid\" [zSize]=\"toggleIconSize()\"></i>\n </button>\n <button z-button zType=\"outline\" [zSize]=\"zToggleSize()\" z-button-group-item>\n <i z-icon zType=\"lucideList\" [zSize]=\"toggleIconSize()\"></i>\n </button>\n </z-button-group>\n }\n }\n </div>\n }\n\n @if (zLoading()) {\n @if (currentMode() === 'grid') {\n <div class=\"grid gap-4\" [class]=\"gridColumnsClass()\" [style.gridTemplateColumns]=\"gridTemplateColumns()\">\n @for (item of skeletonItems(); track item) {\n <div class=\"border-border bg-card overflow-hidden rounded-md border shadow-sm\">\n <z-skeleton [zHeight]=\"skeletonMediaHeight()\" zRadius=\"0\" />\n <div class=\"p-3\">\n <z-skeleton zWidth=\"75%\" zHeight=\"0.875rem\" />\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"flex flex-col gap-2\">\n @for (item of skeletonItems(); track item) {\n <div class=\"border-border bg-card flex items-center gap-3 rounded-sm border px-3 py-2.5 shadow-sm\">\n <z-skeleton class=\"shrink-0\" zWidth=\"2.75rem\" zHeight=\"2.75rem\" zRadius=\"0.125rem\" />\n <div class=\"min-w-0 flex-1 space-y-2\">\n <z-skeleton zWidth=\"40%\" zHeight=\"0.875rem\" />\n <z-skeleton zWidth=\"25%\" zHeight=\"0.75rem\" />\n </div>\n <z-skeleton class=\"shrink-0\" zWidth=\"3.5rem\" zHeight=\"1.5rem\" zRadius=\"0.125rem\" />\n </div>\n }\n </div>\n }\n } @else if (zSelectable() && filteredFiles().length > 0) {\n <div\n class=\"bg-muted/30 shadow-card dark:!border-border mb-4 flex h-11 items-center justify-between gap-3 rounded-[0.375rem] border border-transparent px-3\"\n >\n <div class=\"flex items-center gap-3\">\n <z-checkbox\n [zChecked]=\"isAllSelected()\"\n [zIndeterminate]=\"isIndeterminate()\"\n (zChange)=\"toggleSelectAll()\"\n zSize=\"sm\"\n />\n <span class=\"text-muted-foreground text-sm\">\n @if (selectedCount() > 0) {\n {{ selectedCount() }} {{ 'i18n_z_ui_gallery_selected' | translate }}\n } @else {\n {{ 'i18n_z_ui_gallery_select_all' | translate }}\n }\n </span>\n </div>\n\n @if (selectedCount() > 0) {\n <div class=\"flex items-center gap-1\">\n @if (zShowDownload()) {\n <button\n z-button\n zType=\"ghost\"\n zSize=\"xs\"\n (click)=\"onBulkDownload()\"\n class=\"text-muted-foreground hover:text-foreground\"\n >\n <i z-icon zType=\"lucideDownload\" zSize=\"14\"></i>\n <span class=\"ml-1\">{{ 'i18n_z_ui_gallery_download' | translate }}</span>\n </button>\n }\n @if (zShowRemove()) {\n <button\n z-button\n zType=\"ghost\"\n zSize=\"xs\"\n (click)=\"onBulkDelete()\"\n class=\"text-destructive hover:text-destructive\"\n >\n <i z-icon zType=\"lucideTrash2\" zSize=\"14\"></i>\n <span class=\"ml-1\">{{ 'i18n_z_ui_gallery_delete' | translate }}</span>\n </button>\n }\n <button z-button zType=\"ghost\" zSize=\"xs\" (click)=\"deselectAll()\">\n <i z-icon zType=\"lucideX\" zSize=\"14\"></i>\n </button>\n </div>\n }\n </div>\n }\n\n @if (!zLoading() && filteredFiles().length > 0) {\n @if (currentMode() === 'grid') {\n <div class=\"grid gap-4\" [class]=\"gridColumnsClass()\" [style.gridTemplateColumns]=\"gridTemplateColumns()\">\n @for (file of filteredFiles(); track file.id) {\n <z-gallery-item\n [file]=\"file\"\n zMode=\"grid\"\n [zSize]=\"zSize()\"\n [zShowDownload]=\"zShowDownload()\"\n [zShowPreview]=\"zShowPreview()\"\n [zShowRemove]=\"zShowRemove()\"\n [zSelectable]=\"zSelectable()\"\n [zSelected]=\"isFileSelected(file)\"\n (zOnDownload)=\"onDownload($event)\"\n (zOnPreview)=\"onPreview($event)\"\n (zOnRemove)=\"onRemove($event)\"\n (zOnSelect)=\"toggleSelection($event)\"\n />\n }\n </div>\n } @else {\n <div class=\"flex flex-col gap-2\">\n @for (file of filteredFiles(); track file.id) {\n <z-gallery-item\n [file]=\"file\"\n zMode=\"list\"\n [zSize]=\"zSize()\"\n [zShowDownload]=\"zShowDownload()\"\n [zShowPreview]=\"zShowPreview()\"\n [zShowRemove]=\"zShowRemove()\"\n [zSelectable]=\"zSelectable()\"\n [zSelected]=\"isFileSelected(file)\"\n (zOnDownload)=\"onDownload($event)\"\n (zOnPreview)=\"onPreview($event)\"\n (zOnRemove)=\"onRemove($event)\"\n (zOnSelect)=\"toggleSelection($event)\"\n />\n }\n </div>\n }\n } @else if (!zLoading() && zFiles().length > 0 && searchQuery()) {\n <z-empty zIcon=\"lucideSearchX\" [zMessage]=\"'i18n_z_ui_gallery_no_search_results' | translate\" zSize=\"sm\" />\n } @else if (!zLoading()) {\n <z-empty\n [zIcon]=\"zEmptyIcon()\"\n [zMessage]=\"zEmptyText() || ('i18n_z_ui_gallery_no_files' | translate)\"\n zSize=\"sm\"\n />\n }\n\n @if (previewFile()) {\n <z-gallery-preview\n [file]=\"previewFile()!\"\n [files]=\"filteredFiles()\"\n [zShowRemove]=\"zShowRemove()\"\n [zTrustedResourceOrigins]=\"zTrustedResourceOrigins()\"\n (zOnClose)=\"closePreview()\"\n (zOnDownload)=\"onDownload($event)\"\n (zOnNavigate)=\"onNavigatePreview($event)\"\n (zOnRemove)=\"onRemoveFromPreview($event)\"\n />\n }\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'z-gallery block',\n },\n exportAs: 'zGallery',\n})\nexport class ZGalleryComponent implements AfterViewInit {\n public readonly zFiles = input<ZGalleryFile[]>([]);\n public readonly zMode = model<ZGalleryMode>('grid');\n public readonly zSize = input<ZGallerySize>('default');\n public readonly zColumns = input<number>(4);\n public readonly zItemWidth = input<string | null>(null);\n public readonly zLoading = input(false);\n public readonly zSkeletonRows = input(2);\n public readonly zSkeletonItems = input<number | null>(null);\n public readonly zShowDownload = input(true);\n public readonly zShowPreview = input(true);\n public readonly zShowRemove = input(false);\n public readonly zTrustedResourceOrigins = input<string[]>([]);\n public readonly zShowModeToggle = input(true);\n public readonly zShowSearch = input(false);\n public readonly zServerSearch = input(false);\n public readonly zSearchDebounce = input(300);\n public readonly zSearchPlaceholder = input<string>('Search files...');\n public readonly zToggleSize = input<ZGalleryToggleSize>('default');\n public readonly zTitle = input<string>('');\n public readonly zEmptyText = input<string>('No files');\n public readonly zEmptyIcon = input<ZIcon>('lucideImage');\n public readonly zClass = input<ClassValue>('');\n public readonly zSelectable = input(false);\n public readonly zSelectedFiles = model<ZGalleryFile[]>([]);\n\n public readonly zOnDownload = output<ZGalleryFile>();\n public readonly zOnPreview = output<ZGalleryFile>();\n public readonly zOnRemove = output<ZGalleryFile>();\n public readonly zModeChange = output<ZGalleryMode>();\n public readonly zSearchChange = output<string>();\n public readonly zControl = output<ZGalleryControl>();\n public readonly zSelectionChange = output<ZGallerySelectionChange>();\n public readonly zOnAction = output<ZGalleryActionEvent>();\n\n protected readonly modeIndex = signal<number | null>(0);\n protected readonly previewFile = signal<ZGalleryFile | null>(null);\n protected readonly searchInputQuery = signal<string>('');\n protected readonly searchQuery = signal<string>('');\n protected readonly skeletonItems = computed(() => {\n const itemCount = this.zSkeletonItems();\n if (itemCount !== null) {\n return Array.from({ length: Math.max(1, itemCount) }, (_, index) => index);\n }\n\n const columns = this.currentMode() === 'list' ? 1 : Math.max(1, this.zColumns());\n const rows = Math.max(1, this.zSkeletonRows());\n return Array.from({ length: columns * rows }, (_, index) => index);\n });\n\n protected readonly currentMode = computed<ZGalleryMode>(() => {\n const index = this.modeIndex();\n return index === 1 ? 'list' : 'grid';\n });\n\n protected readonly gridColumnsClass = computed(() => {\n if (this.zItemWidth()) {\n return 'justify-start';\n }\n\n const cols = this.zColumns();\n switch (cols) {\n case 1:\n return 'grid-cols-1';\n case 2:\n return 'grid-cols-1 sm:grid-cols-2';\n case 3:\n return 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3';\n case 4:\n return 'grid-cols-2 sm:grid-cols-3 lg:grid-cols-4';\n case 5:\n return 'grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5';\n case 6:\n return 'grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-6';\n default:\n return `grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-${cols}`;\n }\n });\n\n protected readonly gridTemplateColumns = computed(() => {\n const itemWidth = this.zItemWidth();\n return itemWidth ? `repeat(auto-fill, minmax(${itemWidth}, ${itemWidth}))` : null;\n });\n\n protected readonly containerClasses = computed(() =>\n zMergeClasses(zGalleryVariants({ zSize: this.zSize() }), this.zClass())\n );\n\n protected readonly showHeader = computed(\n () =>\n this.zTitle() || this.zShowSearch() || (this.zShowModeToggle() && (this.zFiles().length > 0 || this.zLoading()))\n );\n\n protected readonly headerControlHeight = computed(() => {\n switch (this.zToggleSize()) {\n case 'xs':\n return '1.75rem';\n case 'sm':\n return '2rem';\n case 'lg':\n return '2.5rem';\n default:\n return '2.25rem';\n }\n });\n\n protected readonly skeletonMediaHeight = computed(() => {\n switch (this.zSize()) {\n case 'sm':\n return '9rem';\n case 'lg':\n return '14rem';\n default:\n return '11rem';\n }\n });\n\n protected readonly toggleIconSize = computed(() => {\n const size = this.zToggleSize();\n switch (size) {\n case 'xs':\n return '14';\n case 'sm':\n return '16';\n case 'lg':\n return '20';\n default:\n return '18';\n }\n });\n\n protected readonly searchInputSize = computed<'sm' | 'default' | 'lg'>(() => {\n const size = this.zToggleSize();\n if (size === 'xs') {\n return 'sm';\n }\n return size;\n });\n\n protected readonly filteredFiles = computed(() => {\n const files = this.zFiles();\n const query = this.searchQuery().toLowerCase().trim();\n\n if (!query || this.zServerSearch()) {\n return files;\n }\n\n return files.filter(file => file.name.toLowerCase().includes(query));\n });\n\n protected readonly selectedIds = computed(() => new Set(this.zSelectedFiles().map(f => f.id)));\n protected readonly isAllSelected = computed(() => {\n const files = this.filteredFiles();\n const selectedIds = this.selectedIds();\n return files.length > 0 && files.every(f => selectedIds.has(f.id));\n });\n\n protected readonly isIndeterminate = computed(() => {\n const files = this.filteredFiles();\n const selectedIds = this.selectedIds();\n const selectedCount = files.filter(f => selectedIds.has(f.id)).length;\n return selectedCount > 0 && selectedCount < files.length;\n });\n\n protected readonly selectedCount = computed(() => this.zSelectedFiles().length);\n\n ngAfterViewInit(): void {\n this.zControl.emit({\n setMode: mode => {\n this.modeIndex.set(mode === 'list' ? 1 : 0);\n this.zMode.set(mode);\n this.zModeChange.emit(mode);\n },\n getMode: () => this.currentMode(),\n getFiles: () => this.zFiles(),\n openPreview: file => this.previewFile.set(file),\n closePreview: () => this.previewFile.set(null),\n selectAll: () => this.selectAll(),\n deselectAll: () => this.deselectAll(),\n toggleSelection: file => this.toggleSelection(file),\n getSelectedFiles: () => this.zSelectedFiles(),\n isSelected: file => this.isFileSelected(file),\n });\n }\n\n protected onSearchChange(query: string | number | null): void {\n const normalizedQuery = String(query ?? '');\n this.searchQuery.set(normalizedQuery);\n this.zSearchChange.emit(normalizedQuery);\n }\n\n protected onDownload(file: ZGalleryFile): void {\n this.zOnDownload.emit(file);\n const downloadLink = file.downloadUrl || file.url;\n if (downloadLink) {\n const link = document.createElement('a');\n link.href = downloadLink;\n link.download = file.name;\n link.target = '_blank';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n }\n\n protected onPreview(file: ZGalleryFile): void {\n this.previewFile.set(file);\n this.zOnPreview.emit(file);\n }\n\n protected onRemove(file: ZGalleryFile): void {\n this.zOnRemove.emit(file);\n }\n\n protected closePreview(): void {\n this.previewFile.set(null);\n }\n\n protected onNavigatePreview(file: ZGalleryFile): void {\n this.previewFile.set(file);\n }\n\n protected onRemoveFromPreview(file: ZGalleryFile): void {\n this.zOnRemove.emit(file);\n const allFiles = this.filteredFiles();\n const currentIndex = allFiles.findIndex(f => f.id === file.id);\n\n if (allFiles.length <= 1) {\n this.closePreview();\n }\n\n if (currentIndex < allFiles.length - 1) {\n this.previewFile.set(allFiles[currentIndex + 1]);\n return;\n }\n\n this.previewFile.set(allFiles[currentIndex - 1]);\n }\n\n protected isFileSelected(file: ZGalleryFile): boolean {\n return this.selectedIds().has(file.id);\n }\n\n protected toggleSelection(file: ZGalleryFile): void {\n const currentSelected = this.zSelectedFiles();\n const isSelected = this.isFileSelected(file);\n\n const newSelected = isSelected ? currentSelected.filter(f => f.id !== file.id) : [...currentSelected, file];\n\n this.zOnAction.emit({ type: isSelected ? 'deselect' : 'select', file });\n\n this.zSelectedFiles.set(newSelected);\n this.zSelectionChange.emit({\n selectedFiles: newSelected,\n addedFiles: isSelected ? undefined : [file],\n removedFiles: isSelected ? [file] : undefined,\n });\n }\n\n protected selectAll(): void {\n const files = this.filteredFiles();\n this.zSelectedFiles.set([...files]);\n this.zOnAction.emit({ type: 'select-all', files });\n this.zSelectionChange.emit({\n selectedFiles: files,\n addedFiles: files,\n });\n }\n\n protected deselectAll(): void {\n const previousSelected = this.zSelectedFiles();\n this.zSelectedFiles.set([]);\n this.zOnAction.emit({ type: 'deselect-all', files: previousSelected });\n this.zSelectionChange.emit({\n selectedFiles: [],\n removedFiles: previousSelected,\n });\n }\n\n protected toggleSelectAll(): void {\n if (this.isAllSelected()) {\n this.deselectAll();\n return;\n }\n\n this.selectAll();\n }\n\n protected onBulkDelete(): void {\n const selectedFiles = this.zSelectedFiles();\n this.zOnAction.emit({ type: 'delete', files: selectedFiles });\n }\n\n protected onBulkDownload(): void {\n const selectedFiles = this.zSelectedFiles();\n this.zOnAction.emit({ type: 'download', files: selectedFiles });\n selectedFiles.forEach(file => this.onDownload(file));\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input, signal, ViewEncapsulation } from '@angular/core';\nimport { ZSkeletonComponent } from '@shival99/z-ui/components/z-skeleton';\nimport { zMergeClasses } from '@shival99/z-ui/utils';\nimport {\n FILE_CATEGORY_STYLES,\n type ZFileCategory,\n type ZGalleryFile,\n type ZGalleryMode,\n type ZGallerySize,\n} from './z-gallery.types';\nimport { getFileCategory } from './z-gallery.utils';\nimport { zGalleryFileIconVariants } from './z-gallery.variants';\n\n@Component({\n selector: 'z-gallery-file-icon',\n imports: [ZSkeletonComponent],\n standalone: true,\n template: `\n <div [class]=\"containerClasses()\" class=\"group/icon overflow-hidden\">\n @if (showThumbnail()) {\n @if (isLoading()) {\n <z-skeleton class=\"absolute inset-0 size-full\" />\n }\n <img\n [src]=\"file().thumbnailUrl || file().url\"\n [alt]=\"file().name\"\n class=\"size-full object-cover transition-transform duration-300 group-hover/icon:scale-105\"\n loading=\"lazy\"\n [class.opacity-0]=\"isLoading()\"\n [class.opacity-100]=\"!isLoading()\"\n (load)=\"onImageLoad()\"\n (error)=\"onImageError($event)\"\n />\n } @else {\n <div class=\"flex flex-col items-center justify-center gap-1\">\n <span class=\"font-bold tracking-wide\">{{ style().label }}</span>\n </div>\n }\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'z-gallery-file-icon block',\n },\n})\nexport class ZGalleryFileIconComponent {\n public readonly file = input.required<ZGalleryFile>();\n public readonly zSize = input<ZGallerySize>('default');\n public readonly zMode = input<ZGalleryMode>('grid');\n\n protected readonly imageError = signal(false);\n protected readonly isLoading = signal(true);\n protected readonly category = computed<ZFileCategory>(() => getFileCategory(this.file()));\n protected readonly style = computed(() => FILE_CATEGORY_STYLES[this.category()]);\n\n protected readonly showThumbnail = computed(() => {\n const file = this.file();\n const cat = this.category();\n return cat === 'image' && (file.thumbnailUrl || file.url) && !this.imageError();\n });\n\n protected readonly containerClasses = computed(() => {\n const style = this.style();\n const showThumb = this.showThumbnail();\n\n return zMergeClasses(\n zGalleryFileIconVariants({\n zSize: this.zSize(),\n zMode: this.zMode(),\n }),\n showThumb ? 'bg-muted relative' : [style.bg, style.text]\n );\n });\n\n protected onImageLoad(): void {\n this.isLoading.set(false);\n }\n\n protected onImageError(event: Event): void {\n this.imageError.set(true);\n this.isLoading.set(false);\n const img = event.target as HTMLImageElement;\n img.style.display = 'none';\n }\n}\n","import type { OverlayRef } from '@angular/cdk/overlay';\nimport { EventEmitter } from '@angular/core';\nimport type { ZGalleryPreviewComponent } from './z-gallery-preview.component';\n\nexport class ZGalleryPreviewRef {\n private _closed = false;\n\n public componentInstance: ZGalleryPreviewComponent | null = null;\n public readonly zAfterClose = new EventEmitter<void>();\n\n public constructor(private readonly _overlayRef: OverlayRef | null) {}\n\n public close(): void {\n if (this._closed) {\n return;\n }\n\n this._closed = true;\n this.zAfterClose.emit();\n this.zAfterClose.complete();\n this._overlayRef?.dispose();\n }\n}\n","import { Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { inject, Injectable, Injector, PLATFORM_ID } from '@angular/core';\nimport { ZOverlayZIndexService } from '@shival99/z-ui/services';\nimport { ZGalleryPreviewComponent } from './z-gallery-preview.component';\nimport { ZGalleryPreviewRef } from './z-gallery-preview.ref';\nimport type { ZGalleryFile, ZGalleryPreviewOptions } from './z-gallery.types';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ZGalleryPreviewService {\n private readonly _document = inject(DOCUMENT);\n private readonly _injector = inject(Injector);\n private readonly _overlay = inject(Overlay);\n private readonly _platformId = inject(PLATFORM_ID);\n private readonly _zIndexService = inject(ZOverlayZIndexService);\n\n public open(file: ZGalleryFile, options?: Omit<ZGalleryPreviewOptions, 'file'>): ZGalleryPreviewRef;\n public open(options: ZGalleryPreviewOptions): ZGalleryPreviewRef;\n public open(\n fileOrOptions: ZGalleryFile | ZGalleryPreviewOptions,\n options: Omit<ZGalleryPreviewOptions, 'file'> = {}\n ): ZGalleryPreviewRef {\n const previewOptions = this._normalizeOptions(fileOrOptions, options);\n const overlayRef = this._createOverlay();\n const previewRef = new ZGalleryPreviewRef(overlayRef ?? null);\n\n if (!overlayRef) {\n return previewRef;\n }\n\n const componentRef = overlayRef.attach(new ComponentPortal(ZGalleryPreviewComponent, null, this._injector));\n previewRef.componentInstance = componentRef.instance;\n\n componentRef.setInput('file', previewOptions.file);\n componentRef.setInput('files', previewOptions.files);\n componentRef.setInput('zShowRemove', previewOptions.zShowRemove ?? false);\n componentRef.setInput('zTrustedResourceOrigins', previewOptions.zTrustedResourceOrigins ?? []);\n\n componentRef.instance.zOnClose.subscribe(() => {\n previewOptions.zOnClose?.();\n previewRef.close();\n });\n componentRef.instance.zOnDownload.subscribe(file => this._handleDownload(file, previewOptions));\n componentRef.instance.zOnNavigate.subscribe(file => {\n componentRef.setInput('file', file);\n previewOptions.zOnNavigate?.(file);\n });\n componentRef.instance.zOnRemove.subscribe(file => previewOptions.zOnRemove?.(file));\n\n return previewRef;\n }\n\n private _createOverlay(): OverlayRef | undefined {\n if (!isPlatformBrowser(this._platformId)) {\n return undefined;\n }\n\n const overlayRef = this._overlay.create(\n new OverlayConfig({\n hasBackdrop: false,\n panelClass: 'z-gallery-preview-overlay-pane',\n positionStrategy: this._overlay.position().global(),\n scrollStrategy: this._overlay.scrollStrategies.block(),\n })\n );\n\n this._zIndexService.applyToOverlay(overlayRef);\n this._zIndexService.deferMoveToTop(overlayRef);\n\n return overlayRef;\n }\n\n private _normalizeOptions(\n fileOrOptions: ZGalleryFile | ZGalleryPreviewOptions,\n options: Omit<ZGalleryPreviewOptions, 'file'>\n ): ZGalleryPreviewOptions {\n const previewOptions = 'file' in fileOrOptions ? fileOrOptions : { ...options, file: fileOrOptions };\n const files = previewOptions.files?.length ? previewOptions.files : [previewOptions.file];\n const hasCurrentFile = files.some(file => file.id === previewOptions.file.id);\n\n return {\n ...previewOptions,\n files: hasCurrentFile ? files : [previewOptions.file, ...files],\n };\n }\n\n private _handleDownload(file: ZGalleryFile, options: ZGalleryPreviewOptions): void {\n options.zOnDownload?.(file);\n\n if (options.zDownload === false) {\n return;\n }\n\n const downloadLink = file.downloadUrl || file.url;\n if (!downloadLink || !isPlatformBrowser(this._platformId)) {\n return;\n }\n\n const link = this._document.createElement('a');\n link.href = downloadLink;\n link.download = file.name;\n link.target = '_blank';\n this._document.body.appendChild(link);\n link.click();\n this._document.body.removeChild(link);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shival99/z-ui",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.25",
|
|
4
4
|
"description": "Z-UI: Modern Angular UI Component Library - A comprehensive, high-performance design system built with Angular 20+, featuring 40+ customizable components with dark mode, accessibility, and enterprise-ready features.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"angular",
|
|
@@ -168,6 +168,7 @@ declare class ZGalleryItemComponent {
|
|
|
168
168
|
protected readonly categoryStyle: _angular_core.Signal<ZFileCategoryStyle & {
|
|
169
169
|
icon: ZIcon;
|
|
170
170
|
}>;
|
|
171
|
+
protected readonly fileTypeClasses: _angular_core.Signal<string>;
|
|
171
172
|
protected readonly canPreview: _angular_core.Signal<boolean>;
|
|
172
173
|
protected onImageLoad(): void;
|
|
173
174
|
protected onImageError(): void;
|