@shival99/z-ui 2.0.21 → 2.0.23
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.
- package/fesm2022/shival99-z-ui-components-z-gallery.mjs +166 -55
- package/fesm2022/shival99-z-ui-components-z-gallery.mjs.map +1 -1
- package/package.json +1 -1
- package/types/shival99-z-ui-components-z-calendar.d.ts +4 -4
- package/types/shival99-z-ui-components-z-gallery.d.ts +7 -1
- package/types/shival99-z-ui-components-z-table.d.ts +1 -1
|
@@ -9,8 +9,8 @@ import { ZCheckboxComponent } from '@shival99/z-ui/components/z-checkbox';
|
|
|
9
9
|
import { ZEmptyComponent } from '@shival99/z-ui/components/z-empty';
|
|
10
10
|
import { ZIconComponent } from '@shival99/z-ui/components/z-icon';
|
|
11
11
|
import { ZInputComponent } from '@shival99/z-ui/components/z-input';
|
|
12
|
-
import { zMergeClasses } from '@shival99/z-ui/utils';
|
|
13
12
|
import { ZSkeletonComponent } from '@shival99/z-ui/components/z-skeleton';
|
|
13
|
+
import { zMergeClasses } from '@shival99/z-ui/utils';
|
|
14
14
|
import { ZTooltipDirective } from '@shival99/z-ui/components/z-tooltip';
|
|
15
15
|
import { DomSanitizer } from '@angular/platform-browser';
|
|
16
16
|
import { cva } from 'class-variance-authority';
|
|
@@ -1121,7 +1121,6 @@ class ZGalleryPreviewComponent {
|
|
|
1121
1121
|
[class.opacity-0]="isLoading()"
|
|
1122
1122
|
[class.opacity-100]="!isLoading()"
|
|
1123
1123
|
frameborder="0"
|
|
1124
|
-
sandbox="allow-scripts allow-same-origin allow-downloads"
|
|
1125
1124
|
referrerpolicy="no-referrer"
|
|
1126
1125
|
(load)="onPdfLoad()"
|
|
1127
1126
|
></iframe>
|
|
@@ -1383,7 +1382,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
|
|
|
1383
1382
|
[class.opacity-0]="isLoading()"
|
|
1384
1383
|
[class.opacity-100]="!isLoading()"
|
|
1385
1384
|
frameborder="0"
|
|
1386
|
-
sandbox="allow-scripts allow-same-origin allow-downloads"
|
|
1387
1385
|
referrerpolicy="no-referrer"
|
|
1388
1386
|
(load)="onPdfLoad()"
|
|
1389
1387
|
></iframe>
|
|
@@ -1576,6 +1574,9 @@ class ZGalleryComponent {
|
|
|
1576
1574
|
zSize = input('default', ...(ngDevMode ? [{ debugName: "zSize" }] : []));
|
|
1577
1575
|
zColumns = input(4, ...(ngDevMode ? [{ debugName: "zColumns" }] : []));
|
|
1578
1576
|
zItemWidth = input(null, ...(ngDevMode ? [{ debugName: "zItemWidth" }] : []));
|
|
1577
|
+
zLoading = input(false, ...(ngDevMode ? [{ debugName: "zLoading" }] : []));
|
|
1578
|
+
zSkeletonRows = input(2, ...(ngDevMode ? [{ debugName: "zSkeletonRows" }] : []));
|
|
1579
|
+
zSkeletonItems = input(null, ...(ngDevMode ? [{ debugName: "zSkeletonItems" }] : []));
|
|
1579
1580
|
zShowDownload = input(true, ...(ngDevMode ? [{ debugName: "zShowDownload" }] : []));
|
|
1580
1581
|
zShowPreview = input(true, ...(ngDevMode ? [{ debugName: "zShowPreview" }] : []));
|
|
1581
1582
|
zShowRemove = input(false, ...(ngDevMode ? [{ debugName: "zShowRemove" }] : []));
|
|
@@ -1604,6 +1605,15 @@ class ZGalleryComponent {
|
|
|
1604
1605
|
previewFile = signal(null, ...(ngDevMode ? [{ debugName: "previewFile" }] : []));
|
|
1605
1606
|
searchInputQuery = signal('', ...(ngDevMode ? [{ debugName: "searchInputQuery" }] : []));
|
|
1606
1607
|
searchQuery = signal('', ...(ngDevMode ? [{ debugName: "searchQuery" }] : []));
|
|
1608
|
+
skeletonItems = computed(() => {
|
|
1609
|
+
const itemCount = this.zSkeletonItems();
|
|
1610
|
+
if (itemCount !== null) {
|
|
1611
|
+
return Array.from({ length: Math.max(1, itemCount) }, (_, index) => index);
|
|
1612
|
+
}
|
|
1613
|
+
const columns = this.currentMode() === 'list' ? 1 : Math.max(1, this.zColumns());
|
|
1614
|
+
const rows = Math.max(1, this.zSkeletonRows());
|
|
1615
|
+
return Array.from({ length: columns * rows }, (_, index) => index);
|
|
1616
|
+
}, ...(ngDevMode ? [{ debugName: "skeletonItems" }] : []));
|
|
1607
1617
|
currentMode = computed(() => {
|
|
1608
1618
|
const index = this.modeIndex();
|
|
1609
1619
|
return index === 1 ? 'list' : 'grid';
|
|
@@ -1635,7 +1645,29 @@ class ZGalleryComponent {
|
|
|
1635
1645
|
return itemWidth ? `repeat(auto-fill, minmax(${itemWidth}, ${itemWidth}))` : null;
|
|
1636
1646
|
}, ...(ngDevMode ? [{ debugName: "gridTemplateColumns" }] : []));
|
|
1637
1647
|
containerClasses = computed(() => zMergeClasses(zGalleryVariants({ zSize: this.zSize() }), this.zClass()), ...(ngDevMode ? [{ debugName: "containerClasses" }] : []));
|
|
1638
|
-
showHeader = computed(() => this.zTitle() || this.zShowSearch() || (this.zShowModeToggle() && this.zFiles().length > 0), ...(ngDevMode ? [{ debugName: "showHeader" }] : []));
|
|
1648
|
+
showHeader = computed(() => this.zTitle() || this.zShowSearch() || (this.zShowModeToggle() && (this.zFiles().length > 0 || this.zLoading())), ...(ngDevMode ? [{ debugName: "showHeader" }] : []));
|
|
1649
|
+
headerControlHeight = computed(() => {
|
|
1650
|
+
switch (this.zToggleSize()) {
|
|
1651
|
+
case 'xs':
|
|
1652
|
+
return '1.75rem';
|
|
1653
|
+
case 'sm':
|
|
1654
|
+
return '2rem';
|
|
1655
|
+
case 'lg':
|
|
1656
|
+
return '2.5rem';
|
|
1657
|
+
default:
|
|
1658
|
+
return '2.25rem';
|
|
1659
|
+
}
|
|
1660
|
+
}, ...(ngDevMode ? [{ debugName: "headerControlHeight" }] : []));
|
|
1661
|
+
skeletonMediaHeight = computed(() => {
|
|
1662
|
+
switch (this.zSize()) {
|
|
1663
|
+
case 'sm':
|
|
1664
|
+
return '9rem';
|
|
1665
|
+
case 'lg':
|
|
1666
|
+
return '14rem';
|
|
1667
|
+
default:
|
|
1668
|
+
return '11rem';
|
|
1669
|
+
}
|
|
1670
|
+
}, ...(ngDevMode ? [{ debugName: "skeletonMediaHeight" }] : []));
|
|
1639
1671
|
toggleIconSize = computed(() => {
|
|
1640
1672
|
const size = this.zToggleSize();
|
|
1641
1673
|
switch (size) {
|
|
@@ -1789,43 +1821,82 @@ class ZGalleryComponent {
|
|
|
1789
1821
|
selectedFiles.forEach(file => this.onDownload(file));
|
|
1790
1822
|
}
|
|
1791
1823
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: ZGalleryComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1792
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.9", type: ZGalleryComponent, isStandalone: true, selector: "z-gallery", inputs: { zFiles: { classPropertyName: "zFiles", publicName: "zFiles", isSignal: true, isRequired: false, transformFunction: null }, zMode: { classPropertyName: "zMode", publicName: "zMode", isSignal: true, isRequired: false, transformFunction: null }, zSize: { classPropertyName: "zSize", publicName: "zSize", isSignal: true, isRequired: false, transformFunction: null }, zColumns: { classPropertyName: "zColumns", publicName: "zColumns", isSignal: true, isRequired: false, transformFunction: null }, zItemWidth: { classPropertyName: "zItemWidth", publicName: "zItemWidth", isSignal: true, isRequired: false, transformFunction: null }, zShowDownload: { classPropertyName: "zShowDownload", publicName: "zShowDownload", isSignal: true, isRequired: false, transformFunction: null }, zShowPreview: { classPropertyName: "zShowPreview", publicName: "zShowPreview", isSignal: true, isRequired: false, transformFunction: null }, zShowRemove: { classPropertyName: "zShowRemove", publicName: "zShowRemove", isSignal: true, isRequired: false, transformFunction: null }, zTrustedResourceOrigins: { classPropertyName: "zTrustedResourceOrigins", publicName: "zTrustedResourceOrigins", isSignal: true, isRequired: false, transformFunction: null }, zShowModeToggle: { classPropertyName: "zShowModeToggle", publicName: "zShowModeToggle", isSignal: true, isRequired: false, transformFunction: null }, zShowSearch: { classPropertyName: "zShowSearch", publicName: "zShowSearch", isSignal: true, isRequired: false, transformFunction: null }, zServerSearch: { classPropertyName: "zServerSearch", publicName: "zServerSearch", isSignal: true, isRequired: false, transformFunction: null }, zSearchDebounce: { classPropertyName: "zSearchDebounce", publicName: "zSearchDebounce", isSignal: true, isRequired: false, transformFunction: null }, zSearchPlaceholder: { classPropertyName: "zSearchPlaceholder", publicName: "zSearchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, zToggleSize: { classPropertyName: "zToggleSize", publicName: "zToggleSize", isSignal: true, isRequired: false, transformFunction: null }, zTitle: { classPropertyName: "zTitle", publicName: "zTitle", isSignal: true, isRequired: false, transformFunction: null }, zEmptyText: { classPropertyName: "zEmptyText", publicName: "zEmptyText", isSignal: true, isRequired: false, transformFunction: null }, zEmptyIcon: { classPropertyName: "zEmptyIcon", publicName: "zEmptyIcon", isSignal: true, isRequired: false, transformFunction: null }, zClass: { classPropertyName: "zClass", publicName: "zClass", isSignal: true, isRequired: false, transformFunction: null }, zSelectable: { classPropertyName: "zSelectable", publicName: "zSelectable", isSignal: true, isRequired: false, transformFunction: null }, zSelectedFiles: { classPropertyName: "zSelectedFiles", publicName: "zSelectedFiles", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { zMode: "zModeChange", zSelectedFiles: "zSelectedFilesChange", zOnDownload: "zOnDownload", zOnPreview: "zOnPreview", zOnRemove: "zOnRemove", zModeChange: "zModeChange", zSearchChange: "zSearchChange", zControl: "zControl", zSelectionChange: "zSelectionChange", zOnAction: "zOnAction" }, host: { classAttribute: "z-gallery block" }, exportAs: ["zGallery"], ngImport: i0, template: `
|
|
1824
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.9", type: ZGalleryComponent, isStandalone: true, selector: "z-gallery", inputs: { zFiles: { classPropertyName: "zFiles", publicName: "zFiles", isSignal: true, isRequired: false, transformFunction: null }, zMode: { classPropertyName: "zMode", publicName: "zMode", isSignal: true, isRequired: false, transformFunction: null }, zSize: { classPropertyName: "zSize", publicName: "zSize", isSignal: true, isRequired: false, transformFunction: null }, zColumns: { classPropertyName: "zColumns", publicName: "zColumns", isSignal: true, isRequired: false, transformFunction: null }, zItemWidth: { classPropertyName: "zItemWidth", publicName: "zItemWidth", isSignal: true, isRequired: false, transformFunction: null }, zLoading: { classPropertyName: "zLoading", publicName: "zLoading", isSignal: true, isRequired: false, transformFunction: null }, zSkeletonRows: { classPropertyName: "zSkeletonRows", publicName: "zSkeletonRows", isSignal: true, isRequired: false, transformFunction: null }, zSkeletonItems: { classPropertyName: "zSkeletonItems", publicName: "zSkeletonItems", isSignal: true, isRequired: false, transformFunction: null }, zShowDownload: { classPropertyName: "zShowDownload", publicName: "zShowDownload", isSignal: true, isRequired: false, transformFunction: null }, zShowPreview: { classPropertyName: "zShowPreview", publicName: "zShowPreview", isSignal: true, isRequired: false, transformFunction: null }, zShowRemove: { classPropertyName: "zShowRemove", publicName: "zShowRemove", isSignal: true, isRequired: false, transformFunction: null }, zTrustedResourceOrigins: { classPropertyName: "zTrustedResourceOrigins", publicName: "zTrustedResourceOrigins", isSignal: true, isRequired: false, transformFunction: null }, zShowModeToggle: { classPropertyName: "zShowModeToggle", publicName: "zShowModeToggle", isSignal: true, isRequired: false, transformFunction: null }, zShowSearch: { classPropertyName: "zShowSearch", publicName: "zShowSearch", isSignal: true, isRequired: false, transformFunction: null }, zServerSearch: { classPropertyName: "zServerSearch", publicName: "zServerSearch", isSignal: true, isRequired: false, transformFunction: null }, zSearchDebounce: { classPropertyName: "zSearchDebounce", publicName: "zSearchDebounce", isSignal: true, isRequired: false, transformFunction: null }, zSearchPlaceholder: { classPropertyName: "zSearchPlaceholder", publicName: "zSearchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, zToggleSize: { classPropertyName: "zToggleSize", publicName: "zToggleSize", isSignal: true, isRequired: false, transformFunction: null }, zTitle: { classPropertyName: "zTitle", publicName: "zTitle", isSignal: true, isRequired: false, transformFunction: null }, zEmptyText: { classPropertyName: "zEmptyText", publicName: "zEmptyText", isSignal: true, isRequired: false, transformFunction: null }, zEmptyIcon: { classPropertyName: "zEmptyIcon", publicName: "zEmptyIcon", isSignal: true, isRequired: false, transformFunction: null }, zClass: { classPropertyName: "zClass", publicName: "zClass", isSignal: true, isRequired: false, transformFunction: null }, zSelectable: { classPropertyName: "zSelectable", publicName: "zSelectable", isSignal: true, isRequired: false, transformFunction: null }, zSelectedFiles: { classPropertyName: "zSelectedFiles", publicName: "zSelectedFiles", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { zMode: "zModeChange", zSelectedFiles: "zSelectedFilesChange", zOnDownload: "zOnDownload", zOnPreview: "zOnPreview", zOnRemove: "zOnRemove", zModeChange: "zModeChange", zSearchChange: "zSearchChange", zControl: "zControl", zSelectionChange: "zSelectionChange", zOnAction: "zOnAction" }, host: { classAttribute: "z-gallery block" }, exportAs: ["zGallery"], ngImport: i0, template: `
|
|
1793
1825
|
<div [class]="containerClasses()">
|
|
1794
1826
|
@if (showHeader()) {
|
|
1795
1827
|
<div class="mb-4 flex flex-wrap items-center justify-between gap-3">
|
|
1796
1828
|
<div class="flex items-center gap-3">
|
|
1797
1829
|
@if (zTitle()) {
|
|
1798
|
-
|
|
1830
|
+
@if (zLoading()) {
|
|
1831
|
+
<z-skeleton class="w-28" zHeight="1.25rem" />
|
|
1832
|
+
} @else {
|
|
1833
|
+
<h3 class="text-sm font-medium">{{ zTitle() }}</h3>
|
|
1834
|
+
}
|
|
1799
1835
|
}
|
|
1800
1836
|
|
|
1801
1837
|
@if (zShowSearch()) {
|
|
1802
|
-
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
|
|
1838
|
+
@if (zLoading()) {
|
|
1839
|
+
<z-skeleton class="w-64" [zHeight]="headerControlHeight()" zRadius="0.375rem" />
|
|
1840
|
+
} @else {
|
|
1841
|
+
<z-input
|
|
1842
|
+
zSearch
|
|
1843
|
+
[zSize]="searchInputSize()"
|
|
1844
|
+
[zPlaceholder]="zSearchPlaceholder() || ('i18n_z_ui_gallery_search_placeholder' | translate)"
|
|
1845
|
+
[zDebounce]="zSearchDebounce()"
|
|
1846
|
+
[ngModel]="searchInputQuery()"
|
|
1847
|
+
(ngModelChange)="searchInputQuery.set($event)"
|
|
1848
|
+
(zOnSearch)="onSearchChange($event)"
|
|
1849
|
+
class="w-64"
|
|
1850
|
+
/>
|
|
1851
|
+
}
|
|
1812
1852
|
}
|
|
1813
1853
|
</div>
|
|
1814
1854
|
|
|
1815
|
-
@if (zShowModeToggle() && zFiles().length > 0) {
|
|
1816
|
-
|
|
1817
|
-
<
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1855
|
+
@if (zShowModeToggle() && (zFiles().length > 0 || zLoading())) {
|
|
1856
|
+
@if (zLoading()) {
|
|
1857
|
+
<z-skeleton class="w-20" [zHeight]="headerControlHeight()" zRadius="0.375rem" />
|
|
1858
|
+
} @else {
|
|
1859
|
+
<z-button-group [(zActive)]="modeIndex">
|
|
1860
|
+
<button z-button zType="outline" [zSize]="zToggleSize()" z-button-group-item>
|
|
1861
|
+
<i z-icon zType="lucideLayoutGrid" [zSize]="toggleIconSize()"></i>
|
|
1862
|
+
</button>
|
|
1863
|
+
<button z-button zType="outline" [zSize]="zToggleSize()" z-button-group-item>
|
|
1864
|
+
<i z-icon zType="lucideList" [zSize]="toggleIconSize()"></i>
|
|
1865
|
+
</button>
|
|
1866
|
+
</z-button-group>
|
|
1867
|
+
}
|
|
1824
1868
|
}
|
|
1825
1869
|
</div>
|
|
1826
1870
|
}
|
|
1827
1871
|
|
|
1828
|
-
@if (
|
|
1872
|
+
@if (zLoading()) {
|
|
1873
|
+
@if (currentMode() === 'grid') {
|
|
1874
|
+
<div class="grid gap-4" [class]="gridColumnsClass()" [style.gridTemplateColumns]="gridTemplateColumns()">
|
|
1875
|
+
@for (item of skeletonItems(); track item) {
|
|
1876
|
+
<div class="border-border bg-card overflow-hidden rounded-md border shadow-sm">
|
|
1877
|
+
<z-skeleton class="w-full" [zHeight]="skeletonMediaHeight()" zRadius="0" />
|
|
1878
|
+
<div class="space-y-2 p-3">
|
|
1879
|
+
<z-skeleton class="w-3/4" zHeight="0.875rem" />
|
|
1880
|
+
<z-skeleton class="w-2/5" zHeight="0.75rem" />
|
|
1881
|
+
</div>
|
|
1882
|
+
</div>
|
|
1883
|
+
}
|
|
1884
|
+
</div>
|
|
1885
|
+
} @else {
|
|
1886
|
+
<div class="flex flex-col gap-2">
|
|
1887
|
+
@for (item of skeletonItems(); track item) {
|
|
1888
|
+
<div class="border-border bg-card flex items-center gap-3 rounded-xl border px-3 py-2.5 shadow-sm">
|
|
1889
|
+
<z-skeleton class="size-11 shrink-0" zHeight="2.75rem" zRadius="0.75rem" />
|
|
1890
|
+
<div class="min-w-0 flex-1 space-y-2">
|
|
1891
|
+
<z-skeleton class="w-2/5" zHeight="0.875rem" />
|
|
1892
|
+
<z-skeleton class="w-1/4" zHeight="0.75rem" />
|
|
1893
|
+
</div>
|
|
1894
|
+
<z-skeleton class="w-14 shrink-0" zHeight="1.5rem" zRadius="9999px" />
|
|
1895
|
+
</div>
|
|
1896
|
+
}
|
|
1897
|
+
</div>
|
|
1898
|
+
}
|
|
1899
|
+
} @else if (zSelectable() && filteredFiles().length > 0) {
|
|
1829
1900
|
<div
|
|
1830
1901
|
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"
|
|
1831
1902
|
>
|
|
@@ -1879,7 +1950,7 @@ class ZGalleryComponent {
|
|
|
1879
1950
|
</div>
|
|
1880
1951
|
}
|
|
1881
1952
|
|
|
1882
|
-
@if (filteredFiles().length > 0) {
|
|
1953
|
+
@if (!zLoading() && filteredFiles().length > 0) {
|
|
1883
1954
|
@if (currentMode() === 'grid') {
|
|
1884
1955
|
<div class="grid gap-4" [class]="gridColumnsClass()" [style.gridTemplateColumns]="gridTemplateColumns()">
|
|
1885
1956
|
@for (file of filteredFiles(); track file.id) {
|
|
@@ -1919,9 +1990,9 @@ class ZGalleryComponent {
|
|
|
1919
1990
|
}
|
|
1920
1991
|
</div>
|
|
1921
1992
|
}
|
|
1922
|
-
} @else if (zFiles().length > 0 && searchQuery()) {
|
|
1993
|
+
} @else if (!zLoading() && zFiles().length > 0 && searchQuery()) {
|
|
1923
1994
|
<z-empty zIcon="lucideSearchX" [zMessage]="'i18n_z_ui_gallery_no_search_results' | translate" zSize="sm" />
|
|
1924
|
-
} @else {
|
|
1995
|
+
} @else if (!zLoading()) {
|
|
1925
1996
|
<z-empty
|
|
1926
1997
|
[zIcon]="zEmptyIcon()"
|
|
1927
1998
|
[zMessage]="zEmptyText() || ('i18n_z_ui_gallery_no_files' | translate)"
|
|
@@ -1942,7 +2013,7 @@ class ZGalleryComponent {
|
|
|
1942
2013
|
/>
|
|
1943
2014
|
}
|
|
1944
2015
|
</div>
|
|
1945
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ZGalleryItemComponent, selector: "z-gallery-item", inputs: ["file", "zMode", "zSize", "zShowDownload", "zShowPreview", "zShowRemove", "zSelectable", "zSelected"], outputs: ["zOnDownload", "zOnPreview", "zOnRemove", "zOnSelect"] }, { kind: "component", type: ZGalleryPreviewComponent, selector: "z-gallery-preview", inputs: ["file", "files", "zShowRemove", "zTrustedResourceOrigins"], outputs: ["zOnClose", "zOnDownload", "zOnNavigate", "zOnRemove"] }, { kind: "component", type: ZButtonGroupComponent, selector: "z-button-group", inputs: ["zClass", "zOrientation", "zActive"], outputs: ["zActiveChange"], exportAs: ["zButtonGroup"] }, { kind: "directive", type: ZButtonGroupItemDirective, selector: "[z-button-group-item]", exportAs: ["zButtonGroupItem"] }, { kind: "component", type: ZButtonComponent, selector: "z-button, button[z-button], a[z-button]", inputs: ["class", "zType", "zSize", "zShape", "zLabel", "zLoading", "zDisabled", "zTypeIcon", "zAnimatedTypeIcon", "zAnimateIcon", "zAnimationTriggerIcon", "zSizeIcon", "zStrokeWidthIcon", "zWave"], exportAs: ["zButton"] }, { kind: "component", type: ZCheckboxComponent, selector: "z-checkbox", inputs: ["class", "zType", "zSize", "zLabel", "zText", "zDisabled", "zIndeterminate", "zValue", "zOptions", "zOrientation", "zCheckAll", "zCheckAllText", "zChecked", "zGroupValue"], outputs: ["zChange", "zGroupChange", "zOnBlur", "zOnFocus", "zControl", "zEvent", "zCheckedChange", "zGroupValueChange"] }, { kind: "component", type: ZIconComponent, selector: "z-icon, [z-icon]", inputs: ["class", "zType", "zAnimatedType", "zAnimate", "zAnimationTrigger", "zSize", "zStrokeWidth", "zSvg"] }, { kind: "component", type: ZEmptyComponent, selector: "z-empty", inputs: ["class", "zType", "zIcon", "zIconSize", "zSize", "zMessage", "zDescription"] }, { kind: "component", type: ZInputComponent, selector: "z-input", inputs: ["class", "zType", "zSize", "zAlign", "zLabel", "zLabelClass", "zPlaceholder", "zRequired", "zDisabled", "zReadonly", "zPrefix", "zSuffix", "zMin", "zMax", "zStep", "zShowArrows", "zMask", "zDecimalPlaces", "zAllowNegative", "zThousandSeparator", "zDecimalMarker", "zValidators", "zAsyncValidators", "zAsyncDebounce", "zAsyncValidateOn", "zShowPasswordToggle", "zSearch", "zDebounce", "zAutofocus", "zAutoComplete", "zAllowClear", "zAutoSizeContent", "zRows", "zResize", "zMaxLength", "zAutoSuggest", "zColorConfig"], outputs: ["zOnSearch", "zOnChange", "zOnBlur", "zOnFocus", "zOnKeydown", "zOnEnter", "zOnColorCollapse", "zControl", "zEvent"], exportAs: ["zInput"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
2016
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ZGalleryItemComponent, selector: "z-gallery-item", inputs: ["file", "zMode", "zSize", "zShowDownload", "zShowPreview", "zShowRemove", "zSelectable", "zSelected"], outputs: ["zOnDownload", "zOnPreview", "zOnRemove", "zOnSelect"] }, { kind: "component", type: ZGalleryPreviewComponent, selector: "z-gallery-preview", inputs: ["file", "files", "zShowRemove", "zTrustedResourceOrigins"], outputs: ["zOnClose", "zOnDownload", "zOnNavigate", "zOnRemove"] }, { kind: "component", type: ZButtonGroupComponent, selector: "z-button-group", inputs: ["zClass", "zOrientation", "zActive"], outputs: ["zActiveChange"], exportAs: ["zButtonGroup"] }, { kind: "directive", type: ZButtonGroupItemDirective, selector: "[z-button-group-item]", exportAs: ["zButtonGroupItem"] }, { kind: "component", type: ZButtonComponent, selector: "z-button, button[z-button], a[z-button]", inputs: ["class", "zType", "zSize", "zShape", "zLabel", "zLoading", "zDisabled", "zTypeIcon", "zAnimatedTypeIcon", "zAnimateIcon", "zAnimationTriggerIcon", "zSizeIcon", "zStrokeWidthIcon", "zWave"], exportAs: ["zButton"] }, { kind: "component", type: ZCheckboxComponent, selector: "z-checkbox", inputs: ["class", "zType", "zSize", "zLabel", "zText", "zDisabled", "zIndeterminate", "zValue", "zOptions", "zOrientation", "zCheckAll", "zCheckAllText", "zChecked", "zGroupValue"], outputs: ["zChange", "zGroupChange", "zOnBlur", "zOnFocus", "zControl", "zEvent", "zCheckedChange", "zGroupValueChange"] }, { kind: "component", type: ZIconComponent, selector: "z-icon, [z-icon]", inputs: ["class", "zType", "zAnimatedType", "zAnimate", "zAnimationTrigger", "zSize", "zStrokeWidth", "zSvg"] }, { kind: "component", type: ZEmptyComponent, selector: "z-empty", inputs: ["class", "zType", "zIcon", "zIconSize", "zSize", "zMessage", "zDescription"] }, { kind: "component", type: ZInputComponent, selector: "z-input", inputs: ["class", "zType", "zSize", "zAlign", "zLabel", "zLabelClass", "zPlaceholder", "zRequired", "zDisabled", "zReadonly", "zPrefix", "zSuffix", "zMin", "zMax", "zStep", "zShowArrows", "zMask", "zDecimalPlaces", "zAllowNegative", "zThousandSeparator", "zDecimalMarker", "zValidators", "zAsyncValidators", "zAsyncDebounce", "zAsyncValidateOn", "zShowPasswordToggle", "zSearch", "zDebounce", "zAutofocus", "zAutoComplete", "zAllowClear", "zAutoSizeContent", "zRows", "zResize", "zMaxLength", "zAutoSuggest", "zColorConfig"], outputs: ["zOnSearch", "zOnChange", "zOnBlur", "zOnFocus", "zOnKeydown", "zOnEnter", "zOnColorCollapse", "zControl", "zEvent"], exportAs: ["zInput"] }, { kind: "component", type: ZSkeletonComponent, selector: "z-skeleton", inputs: ["class", "zType", "zSize", "zWidth", "zHeight", "zRows", "zGap", "zAnimated", "zRadius"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
1946
2017
|
}
|
|
1947
2018
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: ZGalleryComponent, decorators: [{
|
|
1948
2019
|
type: Component,
|
|
@@ -1960,6 +2031,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
|
|
|
1960
2031
|
ZIconComponent,
|
|
1961
2032
|
ZEmptyComponent,
|
|
1962
2033
|
ZInputComponent,
|
|
2034
|
+
ZSkeletonComponent,
|
|
1963
2035
|
],
|
|
1964
2036
|
standalone: true,
|
|
1965
2037
|
template: `
|
|
@@ -1968,37 +2040,76 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
|
|
|
1968
2040
|
<div class="mb-4 flex flex-wrap items-center justify-between gap-3">
|
|
1969
2041
|
<div class="flex items-center gap-3">
|
|
1970
2042
|
@if (zTitle()) {
|
|
1971
|
-
|
|
2043
|
+
@if (zLoading()) {
|
|
2044
|
+
<z-skeleton class="w-28" zHeight="1.25rem" />
|
|
2045
|
+
} @else {
|
|
2046
|
+
<h3 class="text-sm font-medium">{{ zTitle() }}</h3>
|
|
2047
|
+
}
|
|
1972
2048
|
}
|
|
1973
2049
|
|
|
1974
2050
|
@if (zShowSearch()) {
|
|
1975
|
-
|
|
1976
|
-
|
|
1977
|
-
|
|
1978
|
-
|
|
1979
|
-
|
|
1980
|
-
|
|
1981
|
-
|
|
1982
|
-
|
|
1983
|
-
|
|
1984
|
-
|
|
2051
|
+
@if (zLoading()) {
|
|
2052
|
+
<z-skeleton class="w-64" [zHeight]="headerControlHeight()" zRadius="0.375rem" />
|
|
2053
|
+
} @else {
|
|
2054
|
+
<z-input
|
|
2055
|
+
zSearch
|
|
2056
|
+
[zSize]="searchInputSize()"
|
|
2057
|
+
[zPlaceholder]="zSearchPlaceholder() || ('i18n_z_ui_gallery_search_placeholder' | translate)"
|
|
2058
|
+
[zDebounce]="zSearchDebounce()"
|
|
2059
|
+
[ngModel]="searchInputQuery()"
|
|
2060
|
+
(ngModelChange)="searchInputQuery.set($event)"
|
|
2061
|
+
(zOnSearch)="onSearchChange($event)"
|
|
2062
|
+
class="w-64"
|
|
2063
|
+
/>
|
|
2064
|
+
}
|
|
1985
2065
|
}
|
|
1986
2066
|
</div>
|
|
1987
2067
|
|
|
1988
|
-
@if (zShowModeToggle() && zFiles().length > 0) {
|
|
1989
|
-
|
|
1990
|
-
<
|
|
1991
|
-
|
|
1992
|
-
|
|
1993
|
-
|
|
1994
|
-
|
|
1995
|
-
|
|
1996
|
-
|
|
2068
|
+
@if (zShowModeToggle() && (zFiles().length > 0 || zLoading())) {
|
|
2069
|
+
@if (zLoading()) {
|
|
2070
|
+
<z-skeleton class="w-20" [zHeight]="headerControlHeight()" zRadius="0.375rem" />
|
|
2071
|
+
} @else {
|
|
2072
|
+
<z-button-group [(zActive)]="modeIndex">
|
|
2073
|
+
<button z-button zType="outline" [zSize]="zToggleSize()" z-button-group-item>
|
|
2074
|
+
<i z-icon zType="lucideLayoutGrid" [zSize]="toggleIconSize()"></i>
|
|
2075
|
+
</button>
|
|
2076
|
+
<button z-button zType="outline" [zSize]="zToggleSize()" z-button-group-item>
|
|
2077
|
+
<i z-icon zType="lucideList" [zSize]="toggleIconSize()"></i>
|
|
2078
|
+
</button>
|
|
2079
|
+
</z-button-group>
|
|
2080
|
+
}
|
|
1997
2081
|
}
|
|
1998
2082
|
</div>
|
|
1999
2083
|
}
|
|
2000
2084
|
|
|
2001
|
-
@if (
|
|
2085
|
+
@if (zLoading()) {
|
|
2086
|
+
@if (currentMode() === 'grid') {
|
|
2087
|
+
<div class="grid gap-4" [class]="gridColumnsClass()" [style.gridTemplateColumns]="gridTemplateColumns()">
|
|
2088
|
+
@for (item of skeletonItems(); track item) {
|
|
2089
|
+
<div class="border-border bg-card overflow-hidden rounded-md border shadow-sm">
|
|
2090
|
+
<z-skeleton class="w-full" [zHeight]="skeletonMediaHeight()" zRadius="0" />
|
|
2091
|
+
<div class="space-y-2 p-3">
|
|
2092
|
+
<z-skeleton class="w-3/4" zHeight="0.875rem" />
|
|
2093
|
+
<z-skeleton class="w-2/5" zHeight="0.75rem" />
|
|
2094
|
+
</div>
|
|
2095
|
+
</div>
|
|
2096
|
+
}
|
|
2097
|
+
</div>
|
|
2098
|
+
} @else {
|
|
2099
|
+
<div class="flex flex-col gap-2">
|
|
2100
|
+
@for (item of skeletonItems(); track item) {
|
|
2101
|
+
<div class="border-border bg-card flex items-center gap-3 rounded-xl border px-3 py-2.5 shadow-sm">
|
|
2102
|
+
<z-skeleton class="size-11 shrink-0" zHeight="2.75rem" zRadius="0.75rem" />
|
|
2103
|
+
<div class="min-w-0 flex-1 space-y-2">
|
|
2104
|
+
<z-skeleton class="w-2/5" zHeight="0.875rem" />
|
|
2105
|
+
<z-skeleton class="w-1/4" zHeight="0.75rem" />
|
|
2106
|
+
</div>
|
|
2107
|
+
<z-skeleton class="w-14 shrink-0" zHeight="1.5rem" zRadius="9999px" />
|
|
2108
|
+
</div>
|
|
2109
|
+
}
|
|
2110
|
+
</div>
|
|
2111
|
+
}
|
|
2112
|
+
} @else if (zSelectable() && filteredFiles().length > 0) {
|
|
2002
2113
|
<div
|
|
2003
2114
|
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"
|
|
2004
2115
|
>
|
|
@@ -2052,7 +2163,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
|
|
|
2052
2163
|
</div>
|
|
2053
2164
|
}
|
|
2054
2165
|
|
|
2055
|
-
@if (filteredFiles().length > 0) {
|
|
2166
|
+
@if (!zLoading() && filteredFiles().length > 0) {
|
|
2056
2167
|
@if (currentMode() === 'grid') {
|
|
2057
2168
|
<div class="grid gap-4" [class]="gridColumnsClass()" [style.gridTemplateColumns]="gridTemplateColumns()">
|
|
2058
2169
|
@for (file of filteredFiles(); track file.id) {
|
|
@@ -2092,9 +2203,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
|
|
|
2092
2203
|
}
|
|
2093
2204
|
</div>
|
|
2094
2205
|
}
|
|
2095
|
-
} @else if (zFiles().length > 0 && searchQuery()) {
|
|
2206
|
+
} @else if (!zLoading() && zFiles().length > 0 && searchQuery()) {
|
|
2096
2207
|
<z-empty zIcon="lucideSearchX" [zMessage]="'i18n_z_ui_gallery_no_search_results' | translate" zSize="sm" />
|
|
2097
|
-
} @else {
|
|
2208
|
+
} @else if (!zLoading()) {
|
|
2098
2209
|
<z-empty
|
|
2099
2210
|
[zIcon]="zEmptyIcon()"
|
|
2100
2211
|
[zMessage]="zEmptyText() || ('i18n_z_ui_gallery_no_files' | translate)"
|
|
@@ -2123,7 +2234,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
|
|
|
2123
2234
|
},
|
|
2124
2235
|
exportAs: 'zGallery',
|
|
2125
2236
|
}]
|
|
2126
|
-
}], propDecorators: { zFiles: [{ type: i0.Input, args: [{ isSignal: true, alias: "zFiles", required: false }] }], zMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "zMode", required: false }] }, { type: i0.Output, args: ["zModeChange"] }], zSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "zSize", required: false }] }], zColumns: [{ type: i0.Input, args: [{ isSignal: true, alias: "zColumns", required: false }] }], zItemWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "zItemWidth", required: false }] }], zShowDownload: [{ type: i0.Input, args: [{ isSignal: true, alias: "zShowDownload", required: false }] }], zShowPreview: [{ type: i0.Input, args: [{ isSignal: true, alias: "zShowPreview", required: false }] }], zShowRemove: [{ type: i0.Input, args: [{ isSignal: true, alias: "zShowRemove", required: false }] }], zTrustedResourceOrigins: [{ type: i0.Input, args: [{ isSignal: true, alias: "zTrustedResourceOrigins", required: false }] }], zShowModeToggle: [{ type: i0.Input, args: [{ isSignal: true, alias: "zShowModeToggle", required: false }] }], zShowSearch: [{ type: i0.Input, args: [{ isSignal: true, alias: "zShowSearch", required: false }] }], zServerSearch: [{ type: i0.Input, args: [{ isSignal: true, alias: "zServerSearch", required: false }] }], zSearchDebounce: [{ type: i0.Input, args: [{ isSignal: true, alias: "zSearchDebounce", required: false }] }], zSearchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "zSearchPlaceholder", required: false }] }], zToggleSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "zToggleSize", required: false }] }], zTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "zTitle", required: false }] }], zEmptyText: [{ type: i0.Input, args: [{ isSignal: true, alias: "zEmptyText", required: false }] }], zEmptyIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "zEmptyIcon", required: false }] }], zClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "zClass", required: false }] }], zSelectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "zSelectable", required: false }] }], zSelectedFiles: [{ type: i0.Input, args: [{ isSignal: true, alias: "zSelectedFiles", required: false }] }, { type: i0.Output, args: ["zSelectedFilesChange"] }], zOnDownload: [{ type: i0.Output, args: ["zOnDownload"] }], zOnPreview: [{ type: i0.Output, args: ["zOnPreview"] }], zOnRemove: [{ type: i0.Output, args: ["zOnRemove"] }], zModeChange: [{ type: i0.Output, args: ["zModeChange"] }], zSearchChange: [{ type: i0.Output, args: ["zSearchChange"] }], zControl: [{ type: i0.Output, args: ["zControl"] }], zSelectionChange: [{ type: i0.Output, args: ["zSelectionChange"] }], zOnAction: [{ type: i0.Output, args: ["zOnAction"] }] } });
|
|
2237
|
+
}], propDecorators: { zFiles: [{ type: i0.Input, args: [{ isSignal: true, alias: "zFiles", required: false }] }], zMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "zMode", required: false }] }, { type: i0.Output, args: ["zModeChange"] }], zSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "zSize", required: false }] }], zColumns: [{ type: i0.Input, args: [{ isSignal: true, alias: "zColumns", required: false }] }], zItemWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "zItemWidth", required: false }] }], zLoading: [{ type: i0.Input, args: [{ isSignal: true, alias: "zLoading", required: false }] }], zSkeletonRows: [{ type: i0.Input, args: [{ isSignal: true, alias: "zSkeletonRows", required: false }] }], zSkeletonItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "zSkeletonItems", required: false }] }], zShowDownload: [{ type: i0.Input, args: [{ isSignal: true, alias: "zShowDownload", required: false }] }], zShowPreview: [{ type: i0.Input, args: [{ isSignal: true, alias: "zShowPreview", required: false }] }], zShowRemove: [{ type: i0.Input, args: [{ isSignal: true, alias: "zShowRemove", required: false }] }], zTrustedResourceOrigins: [{ type: i0.Input, args: [{ isSignal: true, alias: "zTrustedResourceOrigins", required: false }] }], zShowModeToggle: [{ type: i0.Input, args: [{ isSignal: true, alias: "zShowModeToggle", required: false }] }], zShowSearch: [{ type: i0.Input, args: [{ isSignal: true, alias: "zShowSearch", required: false }] }], zServerSearch: [{ type: i0.Input, args: [{ isSignal: true, alias: "zServerSearch", required: false }] }], zSearchDebounce: [{ type: i0.Input, args: [{ isSignal: true, alias: "zSearchDebounce", required: false }] }], zSearchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "zSearchPlaceholder", required: false }] }], zToggleSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "zToggleSize", required: false }] }], zTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "zTitle", required: false }] }], zEmptyText: [{ type: i0.Input, args: [{ isSignal: true, alias: "zEmptyText", required: false }] }], zEmptyIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "zEmptyIcon", required: false }] }], zClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "zClass", required: false }] }], zSelectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "zSelectable", required: false }] }], zSelectedFiles: [{ type: i0.Input, args: [{ isSignal: true, alias: "zSelectedFiles", required: false }] }, { type: i0.Output, args: ["zSelectedFilesChange"] }], zOnDownload: [{ type: i0.Output, args: ["zOnDownload"] }], zOnPreview: [{ type: i0.Output, args: ["zOnPreview"] }], zOnRemove: [{ type: i0.Output, args: ["zOnRemove"] }], zModeChange: [{ type: i0.Output, args: ["zModeChange"] }], zSearchChange: [{ type: i0.Output, args: ["zSearchChange"] }], zControl: [{ type: i0.Output, args: ["zControl"] }], zSelectionChange: [{ type: i0.Output, args: ["zSelectionChange"] }], zOnAction: [{ type: i0.Output, args: ["zOnAction"] }] } });
|
|
2127
2238
|
|
|
2128
2239
|
class ZGalleryFileIconComponent {
|
|
2129
2240
|
file = input.required(...(ngDevMode ? [{ debugName: "file" }] : []));
|
|
@@ -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 sandbox=\"allow-scripts allow-same-origin allow-downloads\"\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 { 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 ],\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 <h3 class=\"text-sm font-medium\">{{ zTitle() }}</h3>\n }\n\n @if (zShowSearch()) {\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 </div>\n\n @if (zShowModeToggle() && zFiles().length > 0) {\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 </div>\n }\n\n @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 (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 (zFiles().length > 0 && searchQuery()) {\n <z-empty zIcon=\"lucideSearchX\" [zMessage]=\"'i18n_z_ui_gallery_no_search_results' | translate\" zSize=\"sm\" />\n } @else {\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 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\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 () => this.zTitle() || this.zShowSearch() || (this.zShowModeToggle() && this.zFiles().length > 0)\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 {\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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shival99/z-ui",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.23",
|
|
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",
|
|
@@ -418,16 +418,16 @@ declare class ZCalendarComponent implements OnInit, ControlValueAccessor {
|
|
|
418
418
|
|
|
419
419
|
declare const zCalendarVariants: (props?: ({
|
|
420
420
|
zSize?: "sm" | "default" | "lg" | null | undefined;
|
|
421
|
-
zStatus?: "default" | "disabled" | "
|
|
421
|
+
zStatus?: "default" | "disabled" | "open" | "error" | "readonly" | null | undefined;
|
|
422
422
|
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
423
423
|
declare const zCalendarDayVariants: (props?: ({
|
|
424
|
-
state?: "default" | "
|
|
424
|
+
state?: "default" | "today" | "selected" | "inRange" | "rangeStart" | "rangeEnd" | "rangeSingle" | "disabled" | "otherMonth" | "hovered" | null | undefined;
|
|
425
425
|
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
426
426
|
declare const zCalendarMonthVariants: (props?: ({
|
|
427
|
-
state?: "default" | "
|
|
427
|
+
state?: "default" | "selected" | "disabled" | "current" | null | undefined;
|
|
428
428
|
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
429
429
|
declare const zCalendarYearVariants: (props?: ({
|
|
430
|
-
state?: "default" | "
|
|
430
|
+
state?: "default" | "selected" | "disabled" | "current" | null | undefined;
|
|
431
431
|
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
432
432
|
|
|
433
433
|
export { ZCalendarComponent, zCalendarDayVariants, zCalendarMonthVariants, zCalendarVariants, zCalendarYearVariants };
|
|
@@ -80,6 +80,9 @@ declare class ZGalleryComponent implements AfterViewInit {
|
|
|
80
80
|
readonly zSize: _angular_core.InputSignal<ZGallerySize>;
|
|
81
81
|
readonly zColumns: _angular_core.InputSignal<number>;
|
|
82
82
|
readonly zItemWidth: _angular_core.InputSignal<string | null>;
|
|
83
|
+
readonly zLoading: _angular_core.InputSignal<boolean>;
|
|
84
|
+
readonly zSkeletonRows: _angular_core.InputSignal<number>;
|
|
85
|
+
readonly zSkeletonItems: _angular_core.InputSignal<number | null>;
|
|
83
86
|
readonly zShowDownload: _angular_core.InputSignal<boolean>;
|
|
84
87
|
readonly zShowPreview: _angular_core.InputSignal<boolean>;
|
|
85
88
|
readonly zShowRemove: _angular_core.InputSignal<boolean>;
|
|
@@ -108,11 +111,14 @@ declare class ZGalleryComponent implements AfterViewInit {
|
|
|
108
111
|
protected readonly previewFile: _angular_core.WritableSignal<ZGalleryFile | null>;
|
|
109
112
|
protected readonly searchInputQuery: _angular_core.WritableSignal<string>;
|
|
110
113
|
protected readonly searchQuery: _angular_core.WritableSignal<string>;
|
|
114
|
+
protected readonly skeletonItems: _angular_core.Signal<number[]>;
|
|
111
115
|
protected readonly currentMode: _angular_core.Signal<ZGalleryMode>;
|
|
112
116
|
protected readonly gridColumnsClass: _angular_core.Signal<string>;
|
|
113
117
|
protected readonly gridTemplateColumns: _angular_core.Signal<string | null>;
|
|
114
118
|
protected readonly containerClasses: _angular_core.Signal<string>;
|
|
115
119
|
protected readonly showHeader: _angular_core.Signal<string | boolean>;
|
|
120
|
+
protected readonly headerControlHeight: _angular_core.Signal<"1.75rem" | "2rem" | "2.5rem" | "2.25rem">;
|
|
121
|
+
protected readonly skeletonMediaHeight: _angular_core.Signal<"9rem" | "14rem" | "11rem">;
|
|
116
122
|
protected readonly toggleIconSize: _angular_core.Signal<"14" | "16" | "20" | "18">;
|
|
117
123
|
protected readonly searchInputSize: _angular_core.Signal<"sm" | "default" | "lg">;
|
|
118
124
|
protected readonly filteredFiles: _angular_core.Signal<ZGalleryFile[]>;
|
|
@@ -136,7 +142,7 @@ declare class ZGalleryComponent implements AfterViewInit {
|
|
|
136
142
|
protected onBulkDelete(): void;
|
|
137
143
|
protected onBulkDownload(): void;
|
|
138
144
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ZGalleryComponent, never>;
|
|
139
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ZGalleryComponent, "z-gallery", ["zGallery"], { "zFiles": { "alias": "zFiles"; "required": false; "isSignal": true; }; "zMode": { "alias": "zMode"; "required": false; "isSignal": true; }; "zSize": { "alias": "zSize"; "required": false; "isSignal": true; }; "zColumns": { "alias": "zColumns"; "required": false; "isSignal": true; }; "zItemWidth": { "alias": "zItemWidth"; "required": false; "isSignal": true; }; "zShowDownload": { "alias": "zShowDownload"; "required": false; "isSignal": true; }; "zShowPreview": { "alias": "zShowPreview"; "required": false; "isSignal": true; }; "zShowRemove": { "alias": "zShowRemove"; "required": false; "isSignal": true; }; "zTrustedResourceOrigins": { "alias": "zTrustedResourceOrigins"; "required": false; "isSignal": true; }; "zShowModeToggle": { "alias": "zShowModeToggle"; "required": false; "isSignal": true; }; "zShowSearch": { "alias": "zShowSearch"; "required": false; "isSignal": true; }; "zServerSearch": { "alias": "zServerSearch"; "required": false; "isSignal": true; }; "zSearchDebounce": { "alias": "zSearchDebounce"; "required": false; "isSignal": true; }; "zSearchPlaceholder": { "alias": "zSearchPlaceholder"; "required": false; "isSignal": true; }; "zToggleSize": { "alias": "zToggleSize"; "required": false; "isSignal": true; }; "zTitle": { "alias": "zTitle"; "required": false; "isSignal": true; }; "zEmptyText": { "alias": "zEmptyText"; "required": false; "isSignal": true; }; "zEmptyIcon": { "alias": "zEmptyIcon"; "required": false; "isSignal": true; }; "zClass": { "alias": "zClass"; "required": false; "isSignal": true; }; "zSelectable": { "alias": "zSelectable"; "required": false; "isSignal": true; }; "zSelectedFiles": { "alias": "zSelectedFiles"; "required": false; "isSignal": true; }; }, { "zMode": "zModeChange"; "zSelectedFiles": "zSelectedFilesChange"; "zOnDownload": "zOnDownload"; "zOnPreview": "zOnPreview"; "zOnRemove": "zOnRemove"; "zModeChange": "zModeChange"; "zSearchChange": "zSearchChange"; "zControl": "zControl"; "zSelectionChange": "zSelectionChange"; "zOnAction": "zOnAction"; }, never, never, true, never>;
|
|
145
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ZGalleryComponent, "z-gallery", ["zGallery"], { "zFiles": { "alias": "zFiles"; "required": false; "isSignal": true; }; "zMode": { "alias": "zMode"; "required": false; "isSignal": true; }; "zSize": { "alias": "zSize"; "required": false; "isSignal": true; }; "zColumns": { "alias": "zColumns"; "required": false; "isSignal": true; }; "zItemWidth": { "alias": "zItemWidth"; "required": false; "isSignal": true; }; "zLoading": { "alias": "zLoading"; "required": false; "isSignal": true; }; "zSkeletonRows": { "alias": "zSkeletonRows"; "required": false; "isSignal": true; }; "zSkeletonItems": { "alias": "zSkeletonItems"; "required": false; "isSignal": true; }; "zShowDownload": { "alias": "zShowDownload"; "required": false; "isSignal": true; }; "zShowPreview": { "alias": "zShowPreview"; "required": false; "isSignal": true; }; "zShowRemove": { "alias": "zShowRemove"; "required": false; "isSignal": true; }; "zTrustedResourceOrigins": { "alias": "zTrustedResourceOrigins"; "required": false; "isSignal": true; }; "zShowModeToggle": { "alias": "zShowModeToggle"; "required": false; "isSignal": true; }; "zShowSearch": { "alias": "zShowSearch"; "required": false; "isSignal": true; }; "zServerSearch": { "alias": "zServerSearch"; "required": false; "isSignal": true; }; "zSearchDebounce": { "alias": "zSearchDebounce"; "required": false; "isSignal": true; }; "zSearchPlaceholder": { "alias": "zSearchPlaceholder"; "required": false; "isSignal": true; }; "zToggleSize": { "alias": "zToggleSize"; "required": false; "isSignal": true; }; "zTitle": { "alias": "zTitle"; "required": false; "isSignal": true; }; "zEmptyText": { "alias": "zEmptyText"; "required": false; "isSignal": true; }; "zEmptyIcon": { "alias": "zEmptyIcon"; "required": false; "isSignal": true; }; "zClass": { "alias": "zClass"; "required": false; "isSignal": true; }; "zSelectable": { "alias": "zSelectable"; "required": false; "isSignal": true; }; "zSelectedFiles": { "alias": "zSelectedFiles"; "required": false; "isSignal": true; }; }, { "zMode": "zModeChange"; "zSelectedFiles": "zSelectedFilesChange"; "zOnDownload": "zOnDownload"; "zOnPreview": "zOnPreview"; "zOnRemove": "zOnRemove"; "zModeChange": "zModeChange"; "zSearchChange": "zSearchChange"; "zControl": "zControl"; "zSelectionChange": "zSelectionChange"; "zOnAction": "zOnAction"; }, never, never, true, never>;
|
|
140
146
|
}
|
|
141
147
|
|
|
142
148
|
declare class ZGalleryItemComponent {
|
|
@@ -1081,7 +1081,7 @@ declare class ZTableFilterComponent<T> {
|
|
|
1081
1081
|
protected readonly filterBadgeCount: _angular_core.Signal<number>;
|
|
1082
1082
|
protected readonly hasFilterValue: _angular_core.Signal<boolean>;
|
|
1083
1083
|
protected readonly isActive: _angular_core.Signal<boolean>;
|
|
1084
|
-
protected readonly draftSortValue: _angular_core.Signal<"
|
|
1084
|
+
protected readonly draftSortValue: _angular_core.Signal<"none" | "asc" | "desc">;
|
|
1085
1085
|
protected readonly rangeMinValue: _angular_core.Signal<any>;
|
|
1086
1086
|
protected readonly rangeMaxValue: _angular_core.Signal<any>;
|
|
1087
1087
|
protected readonly dateValue: _angular_core.Signal<Date | null>;
|