@shival99/z-ui 2.0.19 → 2.0.21

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.
@@ -13,7 +13,6 @@ import { zMergeClasses } from '@shival99/z-ui/utils';
13
13
  import { ZSkeletonComponent } from '@shival99/z-ui/components/z-skeleton';
14
14
  import { ZTooltipDirective } from '@shival99/z-ui/components/z-tooltip';
15
15
  import { DomSanitizer } from '@angular/platform-browser';
16
- import { ZSafeResourceUrlPipe } from '@shival99/z-ui/pipes';
17
16
  import { cva } from 'class-variance-authority';
18
17
  import { Overlay, OverlayConfig } from '@angular/cdk/overlay';
19
18
  import { ComponentPortal } from '@angular/cdk/portal';
@@ -295,7 +294,9 @@ class ZGalleryItemComponent {
295
294
  <div class="relative overflow-hidden" [class]="mediaHeightClass()">
296
295
  @if (isImage()) {
297
296
  @if (isLoading()) {
298
- <z-skeleton class="absolute inset-0" />
297
+ <div class="absolute inset-0">
298
+ <z-skeleton class="size-full" />
299
+ </div>
299
300
  }
300
301
  <img
301
302
  [src]="file().thumbnailUrl || file().url"
@@ -520,7 +521,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
520
521
  <div class="relative overflow-hidden" [class]="mediaHeightClass()">
521
522
  @if (isImage()) {
522
523
  @if (isLoading()) {
523
- <z-skeleton class="absolute inset-0" />
524
+ <div class="absolute inset-0">
525
+ <z-skeleton class="size-full" />
526
+ </div>
524
527
  }
525
528
  <img
526
529
  [src]="file().thumbnailUrl || file().url"
@@ -727,6 +730,7 @@ class ZGalleryPreviewComponent {
727
730
  file = input.required(...(ngDevMode ? [{ debugName: "file" }] : []));
728
731
  files = input([], ...(ngDevMode ? [{ debugName: "files" }] : []));
729
732
  zShowRemove = input(false, ...(ngDevMode ? [{ debugName: "zShowRemove" }] : []));
733
+ zTrustedResourceOrigins = input([], ...(ngDevMode ? [{ debugName: "zTrustedResourceOrigins" }] : []));
730
734
  zOnClose = output();
731
735
  zOnDownload = output();
732
736
  zOnNavigate = output();
@@ -839,6 +843,16 @@ class ZGalleryPreviewComponent {
839
843
  hasNext = computed(() => this.currentIndex() < this.files().length - 1, ...(ngDevMode ? [{ debugName: "hasNext" }] : []));
840
844
  isImageFile = computed(() => isImage(this.file()), ...(ngDevMode ? [{ debugName: "isImageFile" }] : []));
841
845
  isPdf = computed(() => getFileCategory(this.file()) === 'pdf', ...(ngDevMode ? [{ debugName: "isPdf" }] : []));
846
+ safePdfUrl = computed(() => {
847
+ const { url } = this.file();
848
+ if (!url) {
849
+ return null;
850
+ }
851
+ if (!this._isAllowedResourceUrl(url)) {
852
+ return null;
853
+ }
854
+ return this._sanitizer.bypassSecurityTrustResourceUrl(url);
855
+ }, ...(ngDevMode ? [{ debugName: "safePdfUrl" }] : []));
842
856
  isVideo = computed(() => getFileCategory(this.file()) === 'video', ...(ngDevMode ? [{ debugName: "isVideo" }] : []));
843
857
  isWordFile = computed(() => getFileCategory(this.file()) === 'word', ...(ngDevMode ? [{ debugName: "isWordFile" }] : []));
844
858
  isExcelFile = computed(() => getFileCategory(this.file()) === 'excel', ...(ngDevMode ? [{ debugName: "isExcelFile" }] : []));
@@ -853,6 +867,31 @@ class ZGalleryPreviewComponent {
853
867
  const zoom = this.zoomed() ? 'scale(1.5)' : 'scale(1)';
854
868
  return `rotate(${rot}deg) ${zoom}`;
855
869
  }, ...(ngDevMode ? [{ debugName: "imageTransform" }] : []));
870
+ _isAllowedResourceUrl(url) {
871
+ const currentOrigin = globalThis.location?.origin;
872
+ const baseUrl = currentOrigin ?? 'http://localhost';
873
+ try {
874
+ const parsedUrl = new URL(url, baseUrl);
875
+ if (parsedUrl.protocol === 'blob:') {
876
+ return parsedUrl.origin === baseUrl;
877
+ }
878
+ return parsedUrl.origin === baseUrl || this._trustedOrigins().has(parsedUrl.origin);
879
+ }
880
+ catch {
881
+ return false;
882
+ }
883
+ }
884
+ _trustedOrigins = computed(() => new Set(this.zTrustedResourceOrigins()
885
+ .map(origin => this._normalizeOrigin(origin))
886
+ .filter((origin) => Boolean(origin))), ...(ngDevMode ? [{ debugName: "_trustedOrigins" }] : []));
887
+ _normalizeOrigin(origin) {
888
+ try {
889
+ return new URL(origin).origin;
890
+ }
891
+ catch {
892
+ return null;
893
+ }
894
+ }
856
895
  fileIcon = computed(() => {
857
896
  const category = getFileCategory(this.file());
858
897
  const iconMap = {
@@ -941,7 +980,7 @@ class ZGalleryPreviewComponent {
941
980
  }
942
981
  }
943
982
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: ZGalleryPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
944
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.9", type: ZGalleryPreviewComponent, isStandalone: true, selector: "z-gallery-preview", inputs: { file: { classPropertyName: "file", publicName: "file", isSignal: true, isRequired: true, transformFunction: null }, files: { classPropertyName: "files", publicName: "files", isSignal: true, isRequired: false, transformFunction: null }, zShowRemove: { classPropertyName: "zShowRemove", publicName: "zShowRemove", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { zOnClose: "zOnClose", zOnDownload: "zOnDownload", zOnNavigate: "zOnNavigate", zOnRemove: "zOnRemove" }, host: { listeners: { "document:keydown": "onKeyDown($event)" }, classAttribute: "z-gallery-preview z-[9999]" }, ngImport: i0, template: `
983
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.9", type: ZGalleryPreviewComponent, isStandalone: true, selector: "z-gallery-preview", inputs: { file: { classPropertyName: "file", publicName: "file", isSignal: true, isRequired: true, transformFunction: null }, files: { classPropertyName: "files", publicName: "files", 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 } }, outputs: { zOnClose: "zOnClose", zOnDownload: "zOnDownload", zOnNavigate: "zOnNavigate", zOnRemove: "zOnRemove" }, host: { listeners: { "document:keydown": "onKeyDown($event)" }, classAttribute: "z-gallery-preview z-[9999]" }, ngImport: i0, template: `
945
984
  <div
946
985
  class="animate-in fade-in fixed inset-0 z-50 flex items-center justify-center bg-black/80 backdrop-blur-sm duration-200"
947
986
  (click)="onBackdropClick($event)"
@@ -1071,17 +1110,19 @@ class ZGalleryPreviewComponent {
1071
1110
  (click)="toggleZoom()"
1072
1111
  />
1073
1112
  </div>
1074
- } @else if (isPdf()) {
1113
+ } @else if (isPdf() && safePdfUrl()) {
1075
1114
  <div class="relative h-[75vh] w-[85vw]">
1076
1115
  @if (isLoading()) {
1077
1116
  <z-skeleton class="absolute inset-0 rounded-lg" />
1078
1117
  }
1079
1118
  <iframe
1080
- [src]="file().url | zSafeResourceUrl"
1119
+ [src]="safePdfUrl()"
1081
1120
  class="absolute inset-0 size-full rounded-lg bg-white shadow-2xl transition-opacity duration-300"
1082
1121
  [class.opacity-0]="isLoading()"
1083
1122
  [class.opacity-100]="!isLoading()"
1084
1123
  frameborder="0"
1124
+ sandbox="allow-scripts allow-same-origin allow-downloads"
1125
+ referrerpolicy="no-referrer"
1085
1126
  (load)="onPdfLoad()"
1086
1127
  ></iframe>
1087
1128
  </div>
@@ -1193,20 +1234,13 @@ class ZGalleryPreviewComponent {
1193
1234
  </div>
1194
1235
  </div>
1195
1236
  </div>
1196
- `, isInline: true, dependencies: [{ 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: ZIconComponent, selector: "z-icon, [z-icon]", inputs: ["class", "zType", "zAnimatedType", "zAnimate", "zAnimationTrigger", "zSize", "zStrokeWidth", "zSvg"] }, { kind: "component", type: ZSkeletonComponent, selector: "z-skeleton", inputs: ["class", "zType", "zSize", "zWidth", "zHeight", "zRows", "zGap", "zAnimated", "zRadius"] }, { kind: "directive", type: ZTooltipDirective, selector: "[z-tooltip], [zTooltip]", inputs: ["zContent", "zPosition", "zTooltipPosition", "zTrigger", "zTooltipTrigger", "zTooltipType", "zTooltipSize", "zClass", "zTooltipClass", "zShowDelay", "zTooltipShowDelay", "zHideDelay", "zTooltipHideDelay", "zArrow", "zTooltipArrow", "zDisabled", "zTooltipDisabled", "zOffset", "zTooltipOffset", "zAutoDetect", "zTriggerElement", "zAlwaysShow", "zMaxWidth"], outputs: ["zShow", "zHide"], exportAs: ["zTooltip"] }, { kind: "pipe", type: ZSafeResourceUrlPipe, name: "zSafeResourceUrl" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1237
+ `, isInline: true, dependencies: [{ 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: ZIconComponent, selector: "z-icon, [z-icon]", inputs: ["class", "zType", "zAnimatedType", "zAnimate", "zAnimationTrigger", "zSize", "zStrokeWidth", "zSvg"] }, { kind: "component", type: ZSkeletonComponent, selector: "z-skeleton", inputs: ["class", "zType", "zSize", "zWidth", "zHeight", "zRows", "zGap", "zAnimated", "zRadius"] }, { kind: "directive", type: ZTooltipDirective, selector: "[z-tooltip], [zTooltip]", inputs: ["zContent", "zPosition", "zTooltipPosition", "zTrigger", "zTooltipTrigger", "zTooltipType", "zTooltipSize", "zClass", "zTooltipClass", "zShowDelay", "zTooltipShowDelay", "zHideDelay", "zTooltipHideDelay", "zArrow", "zTooltipArrow", "zDisabled", "zTooltipDisabled", "zOffset", "zTooltipOffset", "zAutoDetect", "zTriggerElement", "zAlwaysShow", "zMaxWidth"], outputs: ["zShow", "zHide"], exportAs: ["zTooltip"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1197
1238
  }
1198
1239
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: ZGalleryPreviewComponent, decorators: [{
1199
1240
  type: Component,
1200
1241
  args: [{
1201
1242
  selector: 'z-gallery-preview',
1202
- imports: [
1203
- ZButtonComponent,
1204
- ZIconComponent,
1205
- ZSkeletonComponent,
1206
- ZTooltipDirective,
1207
- ZSafeResourceUrlPipe,
1208
- TranslatePipe,
1209
- ],
1243
+ imports: [ZButtonComponent, ZIconComponent, ZSkeletonComponent, ZTooltipDirective, TranslatePipe],
1210
1244
  standalone: true,
1211
1245
  template: `
1212
1246
  <div
@@ -1338,17 +1372,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
1338
1372
  (click)="toggleZoom()"
1339
1373
  />
1340
1374
  </div>
1341
- } @else if (isPdf()) {
1375
+ } @else if (isPdf() && safePdfUrl()) {
1342
1376
  <div class="relative h-[75vh] w-[85vw]">
1343
1377
  @if (isLoading()) {
1344
1378
  <z-skeleton class="absolute inset-0 rounded-lg" />
1345
1379
  }
1346
1380
  <iframe
1347
- [src]="file().url | zSafeResourceUrl"
1381
+ [src]="safePdfUrl()"
1348
1382
  class="absolute inset-0 size-full rounded-lg bg-white shadow-2xl transition-opacity duration-300"
1349
1383
  [class.opacity-0]="isLoading()"
1350
1384
  [class.opacity-100]="!isLoading()"
1351
1385
  frameborder="0"
1386
+ sandbox="allow-scripts allow-same-origin allow-downloads"
1387
+ referrerpolicy="no-referrer"
1352
1388
  (load)="onPdfLoad()"
1353
1389
  ></iframe>
1354
1390
  </div>
@@ -1468,7 +1504,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
1468
1504
  '(document:keydown)': 'onKeyDown($event)',
1469
1505
  },
1470
1506
  }]
1471
- }], ctorParameters: () => [], propDecorators: { file: [{ type: i0.Input, args: [{ isSignal: true, alias: "file", required: true }] }], files: [{ type: i0.Input, args: [{ isSignal: true, alias: "files", required: false }] }], zShowRemove: [{ type: i0.Input, args: [{ isSignal: true, alias: "zShowRemove", required: false }] }], zOnClose: [{ type: i0.Output, args: ["zOnClose"] }], zOnDownload: [{ type: i0.Output, args: ["zOnDownload"] }], zOnNavigate: [{ type: i0.Output, args: ["zOnNavigate"] }], zOnRemove: [{ type: i0.Output, args: ["zOnRemove"] }] } });
1507
+ }], ctorParameters: () => [], propDecorators: { file: [{ type: i0.Input, args: [{ isSignal: true, alias: "file", required: true }] }], files: [{ type: i0.Input, args: [{ isSignal: true, alias: "files", required: false }] }], zShowRemove: [{ type: i0.Input, args: [{ isSignal: true, alias: "zShowRemove", required: false }] }], zTrustedResourceOrigins: [{ type: i0.Input, args: [{ isSignal: true, alias: "zTrustedResourceOrigins", required: false }] }], zOnClose: [{ type: i0.Output, args: ["zOnClose"] }], zOnDownload: [{ type: i0.Output, args: ["zOnDownload"] }], zOnNavigate: [{ type: i0.Output, args: ["zOnNavigate"] }], zOnRemove: [{ type: i0.Output, args: ["zOnRemove"] }] } });
1472
1508
 
1473
1509
  const zGalleryVariants = cva('z-gallery', {
1474
1510
  variants: {
@@ -1543,9 +1579,11 @@ class ZGalleryComponent {
1543
1579
  zShowDownload = input(true, ...(ngDevMode ? [{ debugName: "zShowDownload" }] : []));
1544
1580
  zShowPreview = input(true, ...(ngDevMode ? [{ debugName: "zShowPreview" }] : []));
1545
1581
  zShowRemove = input(false, ...(ngDevMode ? [{ debugName: "zShowRemove" }] : []));
1582
+ zTrustedResourceOrigins = input([], ...(ngDevMode ? [{ debugName: "zTrustedResourceOrigins" }] : []));
1546
1583
  zShowModeToggle = input(true, ...(ngDevMode ? [{ debugName: "zShowModeToggle" }] : []));
1547
1584
  zShowSearch = input(false, ...(ngDevMode ? [{ debugName: "zShowSearch" }] : []));
1548
1585
  zServerSearch = input(false, ...(ngDevMode ? [{ debugName: "zServerSearch" }] : []));
1586
+ zSearchDebounce = input(300, ...(ngDevMode ? [{ debugName: "zSearchDebounce" }] : []));
1549
1587
  zSearchPlaceholder = input('Search files...', ...(ngDevMode ? [{ debugName: "zSearchPlaceholder" }] : []));
1550
1588
  zToggleSize = input('default', ...(ngDevMode ? [{ debugName: "zToggleSize" }] : []));
1551
1589
  zTitle = input('', ...(ngDevMode ? [{ debugName: "zTitle" }] : []));
@@ -1564,6 +1602,7 @@ class ZGalleryComponent {
1564
1602
  zOnAction = output();
1565
1603
  modeIndex = signal(0, ...(ngDevMode ? [{ debugName: "modeIndex" }] : []));
1566
1604
  previewFile = signal(null, ...(ngDevMode ? [{ debugName: "previewFile" }] : []));
1605
+ searchInputQuery = signal('', ...(ngDevMode ? [{ debugName: "searchInputQuery" }] : []));
1567
1606
  searchQuery = signal('', ...(ngDevMode ? [{ debugName: "searchQuery" }] : []));
1568
1607
  currentMode = computed(() => {
1569
1608
  const index = this.modeIndex();
@@ -1593,7 +1632,7 @@ class ZGalleryComponent {
1593
1632
  }, ...(ngDevMode ? [{ debugName: "gridColumnsClass" }] : []));
1594
1633
  gridTemplateColumns = computed(() => {
1595
1634
  const itemWidth = this.zItemWidth();
1596
- return itemWidth ? `repeat(auto-fit, minmax(${itemWidth}, 1fr))` : null;
1635
+ return itemWidth ? `repeat(auto-fill, minmax(${itemWidth}, ${itemWidth}))` : null;
1597
1636
  }, ...(ngDevMode ? [{ debugName: "gridTemplateColumns" }] : []));
1598
1637
  containerClasses = computed(() => zMergeClasses(zGalleryVariants({ zSize: this.zSize() }), this.zClass()), ...(ngDevMode ? [{ debugName: "containerClasses" }] : []));
1599
1638
  showHeader = computed(() => this.zTitle() || this.zShowSearch() || (this.zShowModeToggle() && this.zFiles().length > 0), ...(ngDevMode ? [{ debugName: "showHeader" }] : []));
@@ -1657,8 +1696,9 @@ class ZGalleryComponent {
1657
1696
  });
1658
1697
  }
1659
1698
  onSearchChange(query) {
1660
- this.searchQuery.set(query);
1661
- this.zSearchChange.emit(query);
1699
+ const normalizedQuery = String(query ?? '');
1700
+ this.searchQuery.set(normalizedQuery);
1701
+ this.zSearchChange.emit(normalizedQuery);
1662
1702
  }
1663
1703
  onDownload(file) {
1664
1704
  this.zOnDownload.emit(file);
@@ -1749,7 +1789,7 @@ class ZGalleryComponent {
1749
1789
  selectedFiles.forEach(file => this.onDownload(file));
1750
1790
  }
1751
1791
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: ZGalleryComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1752
- 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 }, 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 }, 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: `
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: `
1753
1793
  <div [class]="containerClasses()">
1754
1794
  @if (showHeader()) {
1755
1795
  <div class="mb-4 flex flex-wrap items-center justify-between gap-3">
@@ -1763,8 +1803,10 @@ class ZGalleryComponent {
1763
1803
  zSearch
1764
1804
  [zSize]="searchInputSize()"
1765
1805
  [zPlaceholder]="zSearchPlaceholder() || ('i18n_z_ui_gallery_search_placeholder' | translate)"
1766
- [ngModel]="searchQuery()"
1767
- (ngModelChange)="onSearchChange($event)"
1806
+ [zDebounce]="zSearchDebounce()"
1807
+ [ngModel]="searchInputQuery()"
1808
+ (ngModelChange)="searchInputQuery.set($event)"
1809
+ (zOnSearch)="onSearchChange($event)"
1768
1810
  class="w-64"
1769
1811
  />
1770
1812
  }
@@ -1892,6 +1934,7 @@ class ZGalleryComponent {
1892
1934
  [file]="previewFile()!"
1893
1935
  [files]="filteredFiles()"
1894
1936
  [zShowRemove]="zShowRemove()"
1937
+ [zTrustedResourceOrigins]="zTrustedResourceOrigins()"
1895
1938
  (zOnClose)="closePreview()"
1896
1939
  (zOnDownload)="onDownload($event)"
1897
1940
  (zOnNavigate)="onNavigatePreview($event)"
@@ -1899,7 +1942,7 @@ class ZGalleryComponent {
1899
1942
  />
1900
1943
  }
1901
1944
  </div>
1902
- `, 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"], 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 });
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 });
1903
1946
  }
1904
1947
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: ZGalleryComponent, decorators: [{
1905
1948
  type: Component,
@@ -1933,8 +1976,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
1933
1976
  zSearch
1934
1977
  [zSize]="searchInputSize()"
1935
1978
  [zPlaceholder]="zSearchPlaceholder() || ('i18n_z_ui_gallery_search_placeholder' | translate)"
1936
- [ngModel]="searchQuery()"
1937
- (ngModelChange)="onSearchChange($event)"
1979
+ [zDebounce]="zSearchDebounce()"
1980
+ [ngModel]="searchInputQuery()"
1981
+ (ngModelChange)="searchInputQuery.set($event)"
1982
+ (zOnSearch)="onSearchChange($event)"
1938
1983
  class="w-64"
1939
1984
  />
1940
1985
  }
@@ -2062,6 +2107,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
2062
2107
  [file]="previewFile()!"
2063
2108
  [files]="filteredFiles()"
2064
2109
  [zShowRemove]="zShowRemove()"
2110
+ [zTrustedResourceOrigins]="zTrustedResourceOrigins()"
2065
2111
  (zOnClose)="closePreview()"
2066
2112
  (zOnDownload)="onDownload($event)"
2067
2113
  (zOnNavigate)="onNavigatePreview($event)"
@@ -2077,7 +2123,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
2077
2123
  },
2078
2124
  exportAs: 'zGallery',
2079
2125
  }]
2080
- }], 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 }] }], 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 }] }], 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"] }] } });
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"] }] } });
2081
2127
 
2082
2128
  class ZGalleryFileIconComponent {
2083
2129
  file = input.required(...(ngDevMode ? [{ debugName: "file" }] : []));
@@ -2208,6 +2254,7 @@ class ZGalleryPreviewService {
2208
2254
  componentRef.setInput('file', previewOptions.file);
2209
2255
  componentRef.setInput('files', previewOptions.files);
2210
2256
  componentRef.setInput('zShowRemove', previewOptions.zShowRemove ?? false);
2257
+ componentRef.setInput('zTrustedResourceOrigins', previewOptions.zTrustedResourceOrigins ?? []);
2211
2258
  componentRef.instance.zOnClose.subscribe(() => {
2212
2259
  previewOptions.zOnClose?.();
2213
2260
  previewRef.close();
@@ -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 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 <z-skeleton class=\"absolute inset-0\" />\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 } 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 { ZSafeResourceUrlPipe } from '@shival99/z-ui/pipes';\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: [\n ZButtonComponent,\n ZIconComponent,\n ZSkeletonComponent,\n ZTooltipDirective,\n ZSafeResourceUrlPipe,\n TranslatePipe,\n ],\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()) {\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]=\"file().url | zSafeResourceUrl\"\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 (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\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 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 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 [ngModel]=\"searchQuery()\"\n (ngModelChange)=\"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 (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 zShowModeToggle = input(true);\n public readonly zShowSearch = input(false);\n public readonly zServerSearch = input(false);\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 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-fit, minmax(${itemWidth}, 1fr))` : 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): void {\n this.searchQuery.set(query);\n this.zSearchChange.emit(query);\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\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 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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shival99/z-ui",
3
- "version": "2.0.19",
3
+ "version": "2.0.21",
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",
@@ -270,7 +270,7 @@ declare class ZAutocompleteComponent<T = unknown> implements OnInit, ControlValu
270
270
 
271
271
  declare const zAutocompleteInputVariants: (props?: ({
272
272
  zSize?: "sm" | "default" | "lg" | null | undefined;
273
- zStatus?: "default" | "disabled" | "readonly" | "open" | "error" | null | undefined;
273
+ zStatus?: "default" | "open" | "error" | "disabled" | "readonly" | null | undefined;
274
274
  } & class_variance_authority_types.ClassProp) | undefined) => string;
275
275
  type ZAutocompleteInputVariants = VariantProps<typeof zAutocompleteInputVariants>;
276
276
  declare const zAutocompleteOptionVariants: (props?: ({
@@ -323,7 +323,7 @@ declare const Z_EDITOR_DEFAULT_TOOLBAR: readonly ZEditorToolbarItem[];
323
323
 
324
324
  declare const zEditorVariants: (props?: ({
325
325
  zSize?: "sm" | "default" | "lg" | null | undefined;
326
- zStatus?: "default" | "disabled" | "readonly" | "error" | null | undefined;
326
+ zStatus?: "default" | "error" | "disabled" | "readonly" | null | undefined;
327
327
  zPlaceholderMode?: "firstLine" | "everyLine" | null | undefined;
328
328
  } & class_variance_authority_types.ClassProp) | undefined) => string;
329
329
  type ZEditorVariants = VariantProps<typeof zEditorVariants>;
@@ -3,7 +3,7 @@ import { AfterViewInit, EventEmitter } from '@angular/core';
3
3
  import { ZIcon } from '@shival99/z-ui/components/z-icon';
4
4
  import { ClassValue } from 'clsx';
5
5
  import * as _shival99_z_ui_components_z_gallery from '@shival99/z-ui/components/z-gallery';
6
- import { SafeHtml } from '@angular/platform-browser';
6
+ import { SafeHtml, SafeResourceUrl } from '@angular/platform-browser';
7
7
  import { OverlayRef } from '@angular/cdk/overlay';
8
8
  import * as class_variance_authority_types from 'class-variance-authority/types';
9
9
  import { VariantProps } from 'class-variance-authority';
@@ -67,6 +67,7 @@ interface ZGalleryPreviewOptions {
67
67
  files?: ZGalleryFile[];
68
68
  zDownload?: boolean;
69
69
  zShowRemove?: boolean;
70
+ zTrustedResourceOrigins?: string[];
70
71
  zOnClose?: () => void;
71
72
  zOnDownload?: (file: ZGalleryFile) => void;
72
73
  zOnNavigate?: (file: ZGalleryFile) => void;
@@ -82,9 +83,11 @@ declare class ZGalleryComponent implements AfterViewInit {
82
83
  readonly zShowDownload: _angular_core.InputSignal<boolean>;
83
84
  readonly zShowPreview: _angular_core.InputSignal<boolean>;
84
85
  readonly zShowRemove: _angular_core.InputSignal<boolean>;
86
+ readonly zTrustedResourceOrigins: _angular_core.InputSignal<string[]>;
85
87
  readonly zShowModeToggle: _angular_core.InputSignal<boolean>;
86
88
  readonly zShowSearch: _angular_core.InputSignal<boolean>;
87
89
  readonly zServerSearch: _angular_core.InputSignal<boolean>;
90
+ readonly zSearchDebounce: _angular_core.InputSignal<number>;
88
91
  readonly zSearchPlaceholder: _angular_core.InputSignal<string>;
89
92
  readonly zToggleSize: _angular_core.InputSignal<ZGalleryToggleSize>;
90
93
  readonly zTitle: _angular_core.InputSignal<string>;
@@ -103,6 +106,7 @@ declare class ZGalleryComponent implements AfterViewInit {
103
106
  readonly zOnAction: _angular_core.OutputEmitterRef<ZGalleryActionEvent>;
104
107
  protected readonly modeIndex: _angular_core.WritableSignal<number | null>;
105
108
  protected readonly previewFile: _angular_core.WritableSignal<ZGalleryFile | null>;
109
+ protected readonly searchInputQuery: _angular_core.WritableSignal<string>;
106
110
  protected readonly searchQuery: _angular_core.WritableSignal<string>;
107
111
  protected readonly currentMode: _angular_core.Signal<ZGalleryMode>;
108
112
  protected readonly gridColumnsClass: _angular_core.Signal<string>;
@@ -117,7 +121,7 @@ declare class ZGalleryComponent implements AfterViewInit {
117
121
  protected readonly isIndeterminate: _angular_core.Signal<boolean>;
118
122
  protected readonly selectedCount: _angular_core.Signal<number>;
119
123
  ngAfterViewInit(): void;
120
- protected onSearchChange(query: string): void;
124
+ protected onSearchChange(query: string | number | null): void;
121
125
  protected onDownload(file: ZGalleryFile): void;
122
126
  protected onPreview(file: ZGalleryFile): void;
123
127
  protected onRemove(file: ZGalleryFile): void;
@@ -132,7 +136,7 @@ declare class ZGalleryComponent implements AfterViewInit {
132
136
  protected onBulkDelete(): void;
133
137
  protected onBulkDownload(): void;
134
138
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ZGalleryComponent, never>;
135
- 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; }; "zShowModeToggle": { "alias": "zShowModeToggle"; "required": false; "isSignal": true; }; "zShowSearch": { "alias": "zShowSearch"; "required": false; "isSignal": true; }; "zServerSearch": { "alias": "zServerSearch"; "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>;
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>;
136
140
  }
137
141
 
138
142
  declare class ZGalleryItemComponent {
@@ -192,6 +196,7 @@ declare class ZGalleryPreviewComponent {
192
196
  readonly file: _angular_core.InputSignal<ZGalleryFile>;
193
197
  readonly files: _angular_core.InputSignal<ZGalleryFile[]>;
194
198
  readonly zShowRemove: _angular_core.InputSignal<boolean>;
199
+ readonly zTrustedResourceOrigins: _angular_core.InputSignal<string[]>;
195
200
  readonly zOnClose: _angular_core.OutputEmitterRef<void>;
196
201
  readonly zOnDownload: _angular_core.OutputEmitterRef<ZGalleryFile>;
197
202
  readonly zOnNavigate: _angular_core.OutputEmitterRef<ZGalleryFile>;
@@ -218,6 +223,7 @@ declare class ZGalleryPreviewComponent {
218
223
  protected readonly hasNext: _angular_core.Signal<boolean>;
219
224
  protected readonly isImageFile: _angular_core.Signal<boolean>;
220
225
  protected readonly isPdf: _angular_core.Signal<boolean>;
226
+ protected readonly safePdfUrl: _angular_core.Signal<SafeResourceUrl | null>;
221
227
  protected readonly isVideo: _angular_core.Signal<boolean>;
222
228
  protected readonly isWordFile: _angular_core.Signal<boolean>;
223
229
  protected readonly isExcelFile: _angular_core.Signal<boolean>;
@@ -225,6 +231,9 @@ declare class ZGalleryPreviewComponent {
225
231
  protected readonly canPreview: _angular_core.Signal<boolean>;
226
232
  protected readonly formattedSize: _angular_core.Signal<string>;
227
233
  protected readonly imageTransform: _angular_core.Signal<string>;
234
+ private _isAllowedResourceUrl;
235
+ private readonly _trustedOrigins;
236
+ private _normalizeOrigin;
228
237
  protected readonly fileIcon: _angular_core.Signal<ZIcon>;
229
238
  protected onKeyDown(event: KeyboardEvent): void;
230
239
  protected close(): void;
@@ -240,7 +249,7 @@ declare class ZGalleryPreviewComponent {
240
249
  protected remove(): void;
241
250
  protected onBackdropClick(event: Event): void;
242
251
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ZGalleryPreviewComponent, never>;
243
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ZGalleryPreviewComponent, "z-gallery-preview", never, { "file": { "alias": "file"; "required": true; "isSignal": true; }; "files": { "alias": "files"; "required": false; "isSignal": true; }; "zShowRemove": { "alias": "zShowRemove"; "required": false; "isSignal": true; }; }, { "zOnClose": "zOnClose"; "zOnDownload": "zOnDownload"; "zOnNavigate": "zOnNavigate"; "zOnRemove": "zOnRemove"; }, never, never, true, never>;
252
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ZGalleryPreviewComponent, "z-gallery-preview", never, { "file": { "alias": "file"; "required": true; "isSignal": true; }; "files": { "alias": "files"; "required": false; "isSignal": true; }; "zShowRemove": { "alias": "zShowRemove"; "required": false; "isSignal": true; }; "zTrustedResourceOrigins": { "alias": "zTrustedResourceOrigins"; "required": false; "isSignal": true; }; }, { "zOnClose": "zOnClose"; "zOnDownload": "zOnDownload"; "zOnNavigate": "zOnNavigate"; "zOnRemove": "zOnRemove"; }, never, never, true, never>;
244
253
  }
245
254
 
246
255
  declare class ZGalleryPreviewRef {
@@ -89,7 +89,7 @@ declare class ZPopoverDirective implements OnInit, OnDestroy {
89
89
  readonly zHideDelay: _angular_core.InputSignal<number>;
90
90
  readonly zDisabled: _angular_core.InputSignalWithTransform<boolean, string | boolean>;
91
91
  readonly zOffset: _angular_core.InputSignal<number>;
92
- readonly zPopoverWidth: _angular_core.InputSignal<number | "auto" | "trigger">;
92
+ readonly zPopoverWidth: _angular_core.InputSignal<number | "trigger" | "auto">;
93
93
  readonly zTriggerRef: _angular_core.InputSignal<HTMLElement | ElementRef<HTMLElement> | null>;
94
94
  readonly zManualClose: _angular_core.InputSignalWithTransform<boolean, string | boolean>;
95
95
  readonly zOutsideClickClose: _angular_core.InputSignalWithTransform<boolean, string | boolean>;
@@ -315,7 +315,7 @@ declare class ZTagClassesPipe implements PipeTransform {
315
315
 
316
316
  declare const zSelectVariants: (props?: ({
317
317
  zSize?: "sm" | "default" | "lg" | null | undefined;
318
- zStatus?: "default" | "disabled" | "readonly" | "open" | "error" | null | undefined;
318
+ zStatus?: "default" | "open" | "error" | "disabled" | "readonly" | null | undefined;
319
319
  } & class_variance_authority_types.ClassProp) | undefined) => string;
320
320
  declare const zSelectTagVariants: (props?: ({
321
321
  zSize?: "sm" | "default" | "lg" | null | undefined;
@@ -1149,7 +1149,7 @@ declare class ZTableActionsComponent<T = unknown> {
1149
1149
  readonly zConfig: _angular_core.InputSignal<ZTableActionColumnConfig<T>>;
1150
1150
  readonly zRow: _angular_core.InputSignal<T>;
1151
1151
  readonly zRowId: _angular_core.InputSignal<string>;
1152
- readonly zDropdownButtonSize: _angular_core.InputSignal<"default" | "sm" | "lg" | "xs" | "xl" | null | undefined>;
1152
+ readonly zDropdownButtonSize: _angular_core.InputSignal<"sm" | "default" | "lg" | "xs" | "xl" | null | undefined>;
1153
1153
  readonly zActionClick: _angular_core.OutputEmitterRef<ZTableActionClickEvent<T>>;
1154
1154
  protected readonly allActions: _angular_core.Signal<ZTableActionItem<T>[]>;
1155
1155
  protected readonly shouldShowAsButtons: _angular_core.Signal<boolean>;