@xsmusices/ui 1.41.1 → 1.42.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/fesm2022/{xsmusices-ui-index-BpVmLxoG.mjs → xsmusices-ui-index-DRXscULI.mjs} +1 -4
  2. package/fesm2022/xsmusices-ui-index-DRXscULI.mjs.map +1 -0
  3. package/fesm2022/{xsmusices-ui-xs-badge.xsstory-BZnTAQWz.mjs → xsmusices-ui-xs-badge.xsstory-B1QXLQ4H.mjs} +1 -4
  4. package/fesm2022/xsmusices-ui-xs-badge.xsstory-B1QXLQ4H.mjs.map +1 -0
  5. package/fesm2022/{xsmusices-ui-xs-item-compact.xsstory-DuSgaCDY.mjs → xsmusices-ui-xs-item-compact.xsstory-LhApuPL7.mjs} +2 -2
  6. package/fesm2022/{xsmusices-ui-xs-item-compact.xsstory-DuSgaCDY.mjs.map → xsmusices-ui-xs-item-compact.xsstory-LhApuPL7.mjs.map} +1 -1
  7. package/fesm2022/{xsmusices-ui-xs-item-type.xsstory-BWJQ-hDk.mjs → xsmusices-ui-xs-item-type.xsstory-DUeCnW0R.mjs} +2 -2
  8. package/fesm2022/{xsmusices-ui-xs-item-type.xsstory-BWJQ-hDk.mjs.map → xsmusices-ui-xs-item-type.xsstory-DUeCnW0R.mjs.map} +1 -1
  9. package/fesm2022/{xsmusices-ui-xs-items-slider.xsstory-CS4xTKuJ.mjs → xsmusices-ui-xs-items-slider.xsstory-Dt0bXZI_.mjs} +2 -2
  10. package/fesm2022/{xsmusices-ui-xs-items-slider.xsstory-CS4xTKuJ.mjs.map → xsmusices-ui-xs-items-slider.xsstory-Dt0bXZI_.mjs.map} +1 -1
  11. package/fesm2022/{xsmusices-ui-xs-list.xsstory-BxAErIEF.mjs → xsmusices-ui-xs-list.xsstory-lElGfvcY.mjs} +2 -2
  12. package/fesm2022/{xsmusices-ui-xs-list.xsstory-BxAErIEF.mjs.map → xsmusices-ui-xs-list.xsstory-lElGfvcY.mjs.map} +1 -1
  13. package/fesm2022/{xsmusices-ui-xs-map.xsstory-DBT6h0Hv.mjs → xsmusices-ui-xs-map.xsstory-C__bUaLQ.mjs} +1 -5
  14. package/fesm2022/xsmusices-ui-xs-map.xsstory-C__bUaLQ.mjs.map +1 -0
  15. package/fesm2022/{xsmusices-ui-xs-navbar.xsstory-CkdvldoV.mjs → xsmusices-ui-xs-navbar.xsstory-DZrnLMId.mjs} +22 -1
  16. package/fesm2022/xsmusices-ui-xs-navbar.xsstory-DZrnLMId.mjs.map +1 -0
  17. package/fesm2022/{xsmusices-ui-xs-table.xsstory-DXiZHI7p.mjs → xsmusices-ui-xs-table.xsstory-s13JV3k9.mjs} +2 -2
  18. package/fesm2022/{xsmusices-ui-xs-table.xsstory-DXiZHI7p.mjs.map → xsmusices-ui-xs-table.xsstory-s13JV3k9.mjs.map} +1 -1
  19. package/fesm2022/xsmusices-ui.mjs +40 -131
  20. package/fesm2022/xsmusices-ui.mjs.map +1 -1
  21. package/index.d.ts +1 -17
  22. package/package.json +1 -1
  23. package/styles/shared-utilities.css +0 -1
  24. package/fesm2022/xsmusices-ui-index-BpVmLxoG.mjs.map +0 -1
  25. package/fesm2022/xsmusices-ui-xs-badge.xsstory-BZnTAQWz.mjs.map +0 -1
  26. package/fesm2022/xsmusices-ui-xs-map.xsstory-DBT6h0Hv.mjs.map +0 -1
  27. package/fesm2022/xsmusices-ui-xs-navbar.xsstory-CkdvldoV.mjs.map +0 -1
@@ -2143,7 +2143,6 @@ class XSDateFormatPipe {
2143
2143
  : dateTime);
2144
2144
  if (Number.isNaN(d.getTime()))
2145
2145
  return '';
2146
- // Handle specific formats
2147
2146
  if (format === 'MMMM') {
2148
2147
  try {
2149
2148
  return new Intl.DateTimeFormat(locale, {
@@ -2164,7 +2163,6 @@ class XSDateFormatPipe {
2164
2163
  return d.toLocaleString(locale, { month: 'short' });
2165
2164
  }
2166
2165
  }
2167
- // Handle time formats
2168
2166
  if (format === 'HH') {
2169
2167
  try {
2170
2168
  return new Intl.DateTimeFormat('es-ES', {
@@ -2225,7 +2223,6 @@ class XSDateFormatPipe {
2225
2223
  return `${day}-${month}-${year} ${hours}:${minutes}`;
2226
2224
  }
2227
2225
  }
2228
- // Fallback to default locale string
2229
2226
  return d.toLocaleString(locale);
2230
2227
  }
2231
2228
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: XSDateFormatPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
@@ -2331,13 +2328,10 @@ class XSAvatarService {
2331
2328
  getInitials(name) {
2332
2329
  if (!name)
2333
2330
  return 'U';
2334
- // 1. Quitar contenido entre paréntesis y corchetes (ej. Cream (KR) -> Cream)
2335
2331
  let clean = name
2336
2332
  .replace(/\(.*?\)/g, '')
2337
2333
  .replace(/\[.*?\]/g, '');
2338
- // 2. Dejar solo letras (incluyendo acentos y ñ/ü) y convertir otros caracteres a espacios
2339
2334
  clean = clean.replace(/[^a-zA-ZáéíóúÁÉÍÓÚñÑüÜ]/g, ' ');
2340
- // 3. Dividir por espacios y filtrar partes vacías
2341
2335
  const parts = clean
2342
2336
  .trim()
2343
2337
  .split(/\s+/)
@@ -2358,9 +2352,9 @@ class XSAvatarService {
2358
2352
  for (let i = 0; i < name.length; i++) {
2359
2353
  hash = name.codePointAt(i) + ((hash << 5) - hash);
2360
2354
  }
2361
- const hue = Math.abs(hash) % 360; // 360 tonos posibles
2362
- const saturation = 65; // %
2363
- const lightness = 45; // %
2355
+ const hue = Math.abs(hash) % 360;
2356
+ const saturation = 65;
2357
+ const lightness = 45;
2364
2358
  return this.hslToHex(hue, saturation, lightness);
2365
2359
  }
2366
2360
  hslToHex(h, s, l) {
@@ -2424,7 +2418,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImpo
2424
2418
  }]
2425
2419
  }] });
2426
2420
 
2427
- // file: lib/tokens/api-url.token.ts
2428
2421
  const XS_API_URL = new InjectionToken('URL del servidor API', {
2429
2422
  providedIn: 'root',
2430
2423
  factory: () => 'https://api-v2.xsmusic.es',
@@ -2653,7 +2646,6 @@ class NumberToMonthPipe {
2653
2646
  }
2654
2647
  // El constructor de Date usa meses de 0 a 11, por lo que restamos 1 al número.
2655
2648
  const date = new Date(2025, monthNumber - 1, 1);
2656
- // Usamos formatDate para obtener el nombre completo del mes.
2657
2649
  return formatDate(date, 'MMMM', locale);
2658
2650
  }
2659
2651
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: NumberToMonthPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
@@ -3841,9 +3833,7 @@ class XSSafeUrlPipe {
3841
3833
  return this.sanitizer.bypassSecurityTrustResourceUrl(value);
3842
3834
  }
3843
3835
  }
3844
- catch {
3845
- // URL inválida: devolver vacío seguro
3846
- }
3836
+ catch { }
3847
3837
  return this.sanitizer.bypassSecurityTrustResourceUrl(EMPTY_SAFE_URL);
3848
3838
  }
3849
3839
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: XSSafeUrlPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
@@ -4590,23 +4580,18 @@ class XSToastService {
4590
4580
  // Estado centralizado con Signals para máxima performance en Angular 20
4591
4581
  _toasts = signal([], ...(ngDevMode ? [{ debugName: "_toasts" }] : []));
4592
4582
  toasts = this._toasts.asReadonly();
4593
- // Eventos de stream para el chat
4594
4583
  _chatNotificationClicked = new Subject();
4595
4584
  chatNotificationClicked$ = this._chatNotificationClicked.asObservable();
4596
- /**
4597
- * Método core privado para instanciar cualquier toast
4598
- */
4599
4585
  show(config) {
4600
4586
  const id = config.id || v4();
4601
4587
  const newToast = {
4602
- message: '', // Default
4588
+ message: '',
4603
4589
  ...config,
4604
4590
  id,
4605
4591
  duration: config.duration ?? 3000,
4606
4592
  closable: config.closable ?? true,
4607
4593
  type: config.type ?? 'info',
4608
4594
  };
4609
- // Actualización atómica del estado
4610
4595
  this._toasts.update((state) => [...state, newToast]);
4611
4596
  // Auto-cierre: Solo si tiene duración 0 se considera permanente
4612
4597
  const isPermanent = newToast.duration === 0;
@@ -4614,15 +4599,11 @@ class XSToastService {
4614
4599
  setTimeout(() => this.removeToast(id), newToast.duration);
4615
4600
  }
4616
4601
  }
4617
- /**
4618
- * Elimina un toast por su ID
4619
- */
4620
4602
  removeToast(id) {
4621
4603
  if (!id)
4622
4604
  return;
4623
4605
  this._toasts.update((state) => state.filter((t) => t.id !== id));
4624
4606
  }
4625
- // --- Métodos de conveniencia ---
4626
4607
  showSuccess(message, title, duration) {
4627
4608
  this.show({ message, title, type: 'success', duration });
4628
4609
  }
@@ -4654,9 +4635,6 @@ class XSToastService {
4654
4635
  closable: true,
4655
4636
  });
4656
4637
  }
4657
- /**
4658
- * Notificación específica de Chat con avatares
4659
- */
4660
4638
  showNotification(message, chatId, items, senderName, messagePreview, duration = 0) {
4661
4639
  this.show({
4662
4640
  message,
@@ -4670,15 +4648,9 @@ class XSToastService {
4670
4648
  closable: true,
4671
4649
  });
4672
4650
  }
4673
- /**
4674
- * Emite el evento de click en chat y limpia el rastro
4675
- */
4676
4651
  emitChatNotificationClicked(chatId) {
4677
4652
  this._chatNotificationClicked.next(chatId);
4678
4653
  }
4679
- /**
4680
- * Limpia toda la pantalla de notificaciones
4681
- */
4682
4654
  closeAll() {
4683
4655
  this._toasts.set([]);
4684
4656
  }
@@ -5210,11 +5182,11 @@ class XSItemsSliderTitleButtonsComponent {
5210
5182
  return null;
5211
5183
  }
5212
5184
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: XSItemsSliderTitleButtonsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5213
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: XSItemsSliderTitleButtonsComponent, isStandalone: true, selector: "xs-items-slider-title-buttons", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, titleId: { classPropertyName: "titleId", publicName: "titleId", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: true, transformFunction: null }, hasSortButton: { classPropertyName: "hasSortButton", publicName: "hasSortButton", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, manage: { classPropertyName: "manage", publicName: "manage", isSignal: true, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, total: { classPropertyName: "total", publicName: "total", isSignal: true, isRequired: false, transformFunction: null }, view: { classPropertyName: "view", publicName: "view", isSignal: true, isRequired: false, transformFunction: null }, hasViewButtons: { classPropertyName: "hasViewButtons", publicName: "hasViewButtons", isSignal: true, isRequired: false, transformFunction: null }, hasSoundcloudItems: { classPropertyName: "hasSoundcloudItems", publicName: "hasSoundcloudItems", isSignal: true, isRequired: false, transformFunction: null }, tabs: { classPropertyName: "tabs", publicName: "tabs", isSignal: true, isRequired: false, transformFunction: null }, selectedTab: { classPropertyName: "selectedTab", publicName: "selectedTab", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, texts: { classPropertyName: "texts", publicName: "texts", isSignal: true, isRequired: false, transformFunction: null }, isPlayingAll: { classPropertyName: "isPlayingAll", publicName: "isPlayingAll", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedTab: "selectedTabChange", onClickChangeView: "onClickChangeView", onClickPlayAll: "onClickPlayAll", onClickSort: "onClickSort", onChangeState: "onChangeState", onClickTab: "onClickTab" }, host: { attributes: { "xs-items-slider-title-buttons-host": "" } }, ngImport: i0, template: "<div\n class=\"flex justify-between\"\n [ngClass]=\"{\n 'items-center w-full px-6 py-2 rounded-xl bg-zinc-900/50 hover:opacity-70 cursor-pointer':\n manage(),\n 'items-end': !manage(),\n }\"\n (click)=\"manage() ? onChangeState.emit(undefined) : null\"\n (keydown.enter)=\"manage() ? onChangeState.emit(undefined) : null\"\n>\n <div\n [id]=\"titleId() ? titleId() : 'profile-' + type() + '-title'\"\n class=\"flex items-center gap-1 font-black text-left\"\n [ngClass]=\"{ 'text-sm': manage() }\"\n >\n <!-- TYPE NO setup -->\n @if (type() !== 'setup') {\n @if (label()) {\n {{ label() }}\n }\n @if (label() && total() && total() > 0) {\n <span\n class=\"pt-0.5 text-xs font-extralight\"\n >\n ({{ total() }})\n </span>\n }\n }\n\n <!-- TYPE setup -->\n @if (type() === 'setup') {\n @if (label()) {\n Setup\n {{ tabSelected?.name | titlecase }}\n }\n @if (tabSelected?.components?.length) {\n <span\n class=\"pt-0.5 text-xs font-extralight\"\n >\n ({{ tabSelected?.components?.length }})\n </span>\n }\n }\n </div>\n\n <div class=\"flex items-center gap-2\">\n <div class=\"flex gap-2 text-xs text-zinc-400\">\n @if (tabs() && tabs()!.length <= 2 && tabs()!.length > 1) {\n @for (tab of tabs()!; track $index; let i = $index) {\n <xs-button\n [variant]=\"selectedTab() !== i ? 'primary' : 'selected'\"\n [label]=\"tab.label\"\n [layout]=\"'badge'\"\n (click)=\"onClickTab.emit(i)\"\n (keydown.enter)=\"onClickTab.emit(i)\"\n >\n {{ tab.label }}\n </xs-button>\n }\n }\n @if (tabs() && tabs()!.length > 2) {\n <xs-button\n label=\"\"\n [variant]=\"selectedTab() === 0 ? 'selected' : 'primary'\"\n [layout]=\"'iconOnlyMini'\"\n [icon]=\"{ name: 'chevron-left' }\"\n [disabled]=\"selectedTab() === 0\"\n (click)=\"onClickTabChevron('left')\"\n (keydown.enter)=\"onClickTabChevron('left')\"\n >\n </xs-button>\n <xs-button\n label=\"\"\n [variant]=\"\n selectedTab() === (tabs()?.length ?? 0) - 1\n ? 'selected'\n : 'primary'\n \"\n [layout]=\"'iconOnlyMini'\"\n [icon]=\"{ name: 'chevron-right' }\"\n [disabled]=\"selectedTab() === (tabs()?.length ?? 0) - 1\"\n (click)=\"onClickTabChevron('right')\"\n (keydown.enter)=\"onClickTabChevron('right')\"\n >\n </xs-button>\n }\n </div>\n\n @if (tabs() && tabs()!.length > 1) {\n <span class=\"text-zinc-900\">|</span>\n }\n\n @if (hasSoundcloudItems()) {\n <xs-button\n icon=\"play\"\n layout=\"iconOnlyMini\"\n variant=\"custom\"\n customClass=\"px-3 py-1 rounded-xl bg-zinc-900/50 hover:opacity-70\"\n (onClick)=\"!isPlayingAll() && onClickPlayAll.emit(undefined)\"\n [title]=\"texts().play\"\n [disabled]=\"loading().play || isPlayingAll()\"\n />\n }\n\n @if (hasSoundcloudItems()) {\n <span class=\"text-zinc-900\">|</span>\n }\n\n @if (hasViewButtons()) {\n <xs-button\n icon=\"image\"\n layout=\"iconOnlyMini\"\n variant=\"custom\"\n customClass=\"px-3 py-1 rounded-xl hover:opacity-70\"\n [ngClass]=\"{\n 'bg-zinc-700': view() === 'cards',\n 'bg-zinc-900': view() === 'list',\n }\"\n (onClick)=\"onClickChangeView.emit('cards')\"\n [title]=\"texts().changeView\"\n />\n <xs-button\n icon=\"list\"\n layout=\"iconOnlyMini\"\n variant=\"custom\"\n customClass=\"px-3 py-1 rounded-xl hover:opacity-70\"\n [ngClass]=\"{\n 'bg-zinc-700': view() === 'list',\n 'bg-zinc-900': view() === 'cards',\n }\"\n (onClick)=\"onClickChangeView.emit('list')\"\n [title]=\"texts().changeView\"\n />\n }\n\n @if (hasSortButton()) {\n <span class=\"text-zinc-900\">|</span>\n }\n\n @if (hasSortButton()) {\n <xs-button\n icon=\"sort\"\n layout=\"iconOnlyMini\"\n variant=\"custom\"\n customClass=\"px-3 py-1 rounded-xl bg-zinc-900/50 hover:opacity-70\"\n (onClick)=\"onClickSort.emit(undefined)\"\n [title]=\"texts().sort\"\n />\n }\n </div>\n\n @if (manage()) {\n <xs-button\n [icon]=\"{ name: !state() ? 'chevron-down' : 'chevron-up' }\"\n layout=\"iconOnlyMini\"\n variant=\"custom\"\n customClass=\"hover:opacity-70\"\n [title]=\"texts().changeView\"\n />\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: XSButtonComponent, selector: "xs-button", inputs: ["id", "label", "type", "icon", "action", "customClass", "variant", "layout", "badgeCount", "isFull", "disabled", "loading", "title", "ariaLabel", "borderRadius", "isGrouped", "groupPosition"], outputs: ["isGroupedChange", "groupPositionChange", "click", "onClick"] }, { kind: "ngmodule", type: PipesModule }, { kind: "pipe", type: i1$1.TitleCasePipe, name: "titlecase" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5185
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: XSItemsSliderTitleButtonsComponent, isStandalone: true, selector: "xs-items-slider-title-buttons", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, titleId: { classPropertyName: "titleId", publicName: "titleId", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: true, transformFunction: null }, hasSortButton: { classPropertyName: "hasSortButton", publicName: "hasSortButton", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, manage: { classPropertyName: "manage", publicName: "manage", isSignal: true, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, total: { classPropertyName: "total", publicName: "total", isSignal: true, isRequired: false, transformFunction: null }, view: { classPropertyName: "view", publicName: "view", isSignal: true, isRequired: false, transformFunction: null }, hasViewButtons: { classPropertyName: "hasViewButtons", publicName: "hasViewButtons", isSignal: true, isRequired: false, transformFunction: null }, hasSoundcloudItems: { classPropertyName: "hasSoundcloudItems", publicName: "hasSoundcloudItems", isSignal: true, isRequired: false, transformFunction: null }, tabs: { classPropertyName: "tabs", publicName: "tabs", isSignal: true, isRequired: false, transformFunction: null }, selectedTab: { classPropertyName: "selectedTab", publicName: "selectedTab", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, texts: { classPropertyName: "texts", publicName: "texts", isSignal: true, isRequired: false, transformFunction: null }, isPlayingAll: { classPropertyName: "isPlayingAll", publicName: "isPlayingAll", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedTab: "selectedTabChange", onClickChangeView: "onClickChangeView", onClickPlayAll: "onClickPlayAll", onClickSort: "onClickSort", onChangeState: "onChangeState", onClickTab: "onClickTab" }, host: { attributes: { "xs-items-slider-title-buttons-host": "" } }, ngImport: i0, template: "<div\n class=\"flex justify-between\"\n [ngClass]=\"{\n 'items-center w-full px-6 py-2 rounded-xl bg-zinc-900/50 hover:opacity-70 cursor-pointer':\n manage(),\n 'items-end': !manage(),\n }\"\n (click)=\"manage() ? onChangeState.emit(undefined) : null\"\n (keydown.enter)=\"manage() ? onChangeState.emit(undefined) : null\"\n>\n <div\n [id]=\"titleId() ? titleId() : 'profile-' + type() + '-title'\"\n class=\"flex items-center gap-1 font-black text-left\"\n [ngClass]=\"{ 'text-sm': manage() }\"\n >\n @if (type() !== 'setup') {\n @if (label()) {\n {{ label() }}\n }\n @if (label() && total() && total() > 0) {\n <span\n class=\"pt-0.5 text-xs font-extralight\"\n >\n ({{ total() }})\n </span>\n }\n }\n\n @if (type() === 'setup') {\n @if (label()) {\n Setup\n {{ tabSelected?.name | titlecase }}\n }\n @if (tabSelected?.components?.length) {\n <span\n class=\"pt-0.5 text-xs font-extralight\"\n >\n ({{ tabSelected?.components?.length }})\n </span>\n }\n }\n </div>\n\n <div class=\"flex items-center gap-2\">\n <div class=\"flex gap-2 text-xs text-zinc-400\">\n @if (tabs() && tabs()!.length <= 2 && tabs()!.length > 1) {\n @for (tab of tabs()!; track $index; let i = $index) {\n <xs-button\n [variant]=\"selectedTab() !== i ? 'primary' : 'selected'\"\n [label]=\"tab.label\"\n [layout]=\"'badge'\"\n (click)=\"onClickTab.emit(i)\"\n (keydown.enter)=\"onClickTab.emit(i)\"\n >\n {{ tab.label }}\n </xs-button>\n }\n }\n @if (tabs() && tabs()!.length > 2) {\n <xs-button\n label=\"\"\n [variant]=\"selectedTab() === 0 ? 'selected' : 'primary'\"\n [layout]=\"'iconOnlyMini'\"\n [icon]=\"{ name: 'chevron-left' }\"\n [disabled]=\"selectedTab() === 0\"\n (click)=\"onClickTabChevron('left')\"\n (keydown.enter)=\"onClickTabChevron('left')\"\n >\n </xs-button>\n <xs-button\n label=\"\"\n [variant]=\"\n selectedTab() === (tabs()?.length ?? 0) - 1\n ? 'selected'\n : 'primary'\n \"\n [layout]=\"'iconOnlyMini'\"\n [icon]=\"{ name: 'chevron-right' }\"\n [disabled]=\"selectedTab() === (tabs()?.length ?? 0) - 1\"\n (click)=\"onClickTabChevron('right')\"\n (keydown.enter)=\"onClickTabChevron('right')\"\n >\n </xs-button>\n }\n </div>\n\n @if (tabs() && tabs()!.length > 1) {\n <span class=\"text-zinc-900\">|</span>\n }\n\n @if (hasSoundcloudItems()) {\n <xs-button\n icon=\"play\"\n layout=\"iconOnlyMini\"\n variant=\"custom\"\n customClass=\"px-3 py-1 rounded-xl bg-zinc-900/50 hover:opacity-70\"\n (onClick)=\"!isPlayingAll() && onClickPlayAll.emit(undefined)\"\n [title]=\"texts().play\"\n [disabled]=\"loading().play || isPlayingAll()\"\n />\n }\n\n @if (hasSoundcloudItems()) {\n <span class=\"text-zinc-900\">|</span>\n }\n\n @if (hasViewButtons()) {\n <xs-button\n icon=\"image\"\n layout=\"iconOnlyMini\"\n variant=\"custom\"\n customClass=\"px-3 py-1 rounded-xl hover:opacity-70\"\n [ngClass]=\"{\n 'bg-zinc-700': view() === 'cards',\n 'bg-zinc-900': view() === 'list',\n }\"\n (onClick)=\"onClickChangeView.emit('cards')\"\n [title]=\"texts().changeView\"\n />\n <xs-button\n icon=\"list\"\n layout=\"iconOnlyMini\"\n variant=\"custom\"\n customClass=\"px-3 py-1 rounded-xl hover:opacity-70\"\n [ngClass]=\"{\n 'bg-zinc-700': view() === 'list',\n 'bg-zinc-900': view() === 'cards',\n }\"\n (onClick)=\"onClickChangeView.emit('list')\"\n [title]=\"texts().changeView\"\n />\n }\n\n @if (hasSortButton()) {\n <span class=\"text-zinc-900\">|</span>\n }\n\n @if (hasSortButton()) {\n <xs-button\n icon=\"sort\"\n layout=\"iconOnlyMini\"\n variant=\"custom\"\n customClass=\"px-3 py-1 rounded-xl bg-zinc-900/50 hover:opacity-70\"\n (onClick)=\"onClickSort.emit(undefined)\"\n [title]=\"texts().sort\"\n />\n }\n </div>\n\n @if (manage()) {\n <xs-button\n [icon]=\"{ name: !state() ? 'chevron-down' : 'chevron-up' }\"\n layout=\"iconOnlyMini\"\n variant=\"custom\"\n customClass=\"hover:opacity-70\"\n [title]=\"texts().changeView\"\n />\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: XSButtonComponent, selector: "xs-button", inputs: ["id", "label", "type", "icon", "action", "customClass", "variant", "layout", "badgeCount", "isFull", "disabled", "loading", "title", "ariaLabel", "borderRadius", "isGrouped", "groupPosition"], outputs: ["isGroupedChange", "groupPositionChange", "click", "onClick"] }, { kind: "ngmodule", type: PipesModule }, { kind: "pipe", type: i1$1.TitleCasePipe, name: "titlecase" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5214
5186
  }
5215
5187
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: XSItemsSliderTitleButtonsComponent, decorators: [{
5216
5188
  type: Component,
5217
- args: [{ selector: 'xs-items-slider-title-buttons', host: { 'xs-items-slider-title-buttons-host': '' }, imports: [CommonModule, XSButtonComponent, PipesModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"flex justify-between\"\n [ngClass]=\"{\n 'items-center w-full px-6 py-2 rounded-xl bg-zinc-900/50 hover:opacity-70 cursor-pointer':\n manage(),\n 'items-end': !manage(),\n }\"\n (click)=\"manage() ? onChangeState.emit(undefined) : null\"\n (keydown.enter)=\"manage() ? onChangeState.emit(undefined) : null\"\n>\n <div\n [id]=\"titleId() ? titleId() : 'profile-' + type() + '-title'\"\n class=\"flex items-center gap-1 font-black text-left\"\n [ngClass]=\"{ 'text-sm': manage() }\"\n >\n <!-- TYPE NO setup -->\n @if (type() !== 'setup') {\n @if (label()) {\n {{ label() }}\n }\n @if (label() && total() && total() > 0) {\n <span\n class=\"pt-0.5 text-xs font-extralight\"\n >\n ({{ total() }})\n </span>\n }\n }\n\n <!-- TYPE setup -->\n @if (type() === 'setup') {\n @if (label()) {\n Setup\n {{ tabSelected?.name | titlecase }}\n }\n @if (tabSelected?.components?.length) {\n <span\n class=\"pt-0.5 text-xs font-extralight\"\n >\n ({{ tabSelected?.components?.length }})\n </span>\n }\n }\n </div>\n\n <div class=\"flex items-center gap-2\">\n <div class=\"flex gap-2 text-xs text-zinc-400\">\n @if (tabs() && tabs()!.length <= 2 && tabs()!.length > 1) {\n @for (tab of tabs()!; track $index; let i = $index) {\n <xs-button\n [variant]=\"selectedTab() !== i ? 'primary' : 'selected'\"\n [label]=\"tab.label\"\n [layout]=\"'badge'\"\n (click)=\"onClickTab.emit(i)\"\n (keydown.enter)=\"onClickTab.emit(i)\"\n >\n {{ tab.label }}\n </xs-button>\n }\n }\n @if (tabs() && tabs()!.length > 2) {\n <xs-button\n label=\"\"\n [variant]=\"selectedTab() === 0 ? 'selected' : 'primary'\"\n [layout]=\"'iconOnlyMini'\"\n [icon]=\"{ name: 'chevron-left' }\"\n [disabled]=\"selectedTab() === 0\"\n (click)=\"onClickTabChevron('left')\"\n (keydown.enter)=\"onClickTabChevron('left')\"\n >\n </xs-button>\n <xs-button\n label=\"\"\n [variant]=\"\n selectedTab() === (tabs()?.length ?? 0) - 1\n ? 'selected'\n : 'primary'\n \"\n [layout]=\"'iconOnlyMini'\"\n [icon]=\"{ name: 'chevron-right' }\"\n [disabled]=\"selectedTab() === (tabs()?.length ?? 0) - 1\"\n (click)=\"onClickTabChevron('right')\"\n (keydown.enter)=\"onClickTabChevron('right')\"\n >\n </xs-button>\n }\n </div>\n\n @if (tabs() && tabs()!.length > 1) {\n <span class=\"text-zinc-900\">|</span>\n }\n\n @if (hasSoundcloudItems()) {\n <xs-button\n icon=\"play\"\n layout=\"iconOnlyMini\"\n variant=\"custom\"\n customClass=\"px-3 py-1 rounded-xl bg-zinc-900/50 hover:opacity-70\"\n (onClick)=\"!isPlayingAll() && onClickPlayAll.emit(undefined)\"\n [title]=\"texts().play\"\n [disabled]=\"loading().play || isPlayingAll()\"\n />\n }\n\n @if (hasSoundcloudItems()) {\n <span class=\"text-zinc-900\">|</span>\n }\n\n @if (hasViewButtons()) {\n <xs-button\n icon=\"image\"\n layout=\"iconOnlyMini\"\n variant=\"custom\"\n customClass=\"px-3 py-1 rounded-xl hover:opacity-70\"\n [ngClass]=\"{\n 'bg-zinc-700': view() === 'cards',\n 'bg-zinc-900': view() === 'list',\n }\"\n (onClick)=\"onClickChangeView.emit('cards')\"\n [title]=\"texts().changeView\"\n />\n <xs-button\n icon=\"list\"\n layout=\"iconOnlyMini\"\n variant=\"custom\"\n customClass=\"px-3 py-1 rounded-xl hover:opacity-70\"\n [ngClass]=\"{\n 'bg-zinc-700': view() === 'list',\n 'bg-zinc-900': view() === 'cards',\n }\"\n (onClick)=\"onClickChangeView.emit('list')\"\n [title]=\"texts().changeView\"\n />\n }\n\n @if (hasSortButton()) {\n <span class=\"text-zinc-900\">|</span>\n }\n\n @if (hasSortButton()) {\n <xs-button\n icon=\"sort\"\n layout=\"iconOnlyMini\"\n variant=\"custom\"\n customClass=\"px-3 py-1 rounded-xl bg-zinc-900/50 hover:opacity-70\"\n (onClick)=\"onClickSort.emit(undefined)\"\n [title]=\"texts().sort\"\n />\n }\n </div>\n\n @if (manage()) {\n <xs-button\n [icon]=\"{ name: !state() ? 'chevron-down' : 'chevron-up' }\"\n layout=\"iconOnlyMini\"\n variant=\"custom\"\n customClass=\"hover:opacity-70\"\n [title]=\"texts().changeView\"\n />\n }\n</div>\n" }]
5189
+ args: [{ selector: 'xs-items-slider-title-buttons', host: { 'xs-items-slider-title-buttons-host': '' }, imports: [CommonModule, XSButtonComponent, PipesModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"flex justify-between\"\n [ngClass]=\"{\n 'items-center w-full px-6 py-2 rounded-xl bg-zinc-900/50 hover:opacity-70 cursor-pointer':\n manage(),\n 'items-end': !manage(),\n }\"\n (click)=\"manage() ? onChangeState.emit(undefined) : null\"\n (keydown.enter)=\"manage() ? onChangeState.emit(undefined) : null\"\n>\n <div\n [id]=\"titleId() ? titleId() : 'profile-' + type() + '-title'\"\n class=\"flex items-center gap-1 font-black text-left\"\n [ngClass]=\"{ 'text-sm': manage() }\"\n >\n @if (type() !== 'setup') {\n @if (label()) {\n {{ label() }}\n }\n @if (label() && total() && total() > 0) {\n <span\n class=\"pt-0.5 text-xs font-extralight\"\n >\n ({{ total() }})\n </span>\n }\n }\n\n @if (type() === 'setup') {\n @if (label()) {\n Setup\n {{ tabSelected?.name | titlecase }}\n }\n @if (tabSelected?.components?.length) {\n <span\n class=\"pt-0.5 text-xs font-extralight\"\n >\n ({{ tabSelected?.components?.length }})\n </span>\n }\n }\n </div>\n\n <div class=\"flex items-center gap-2\">\n <div class=\"flex gap-2 text-xs text-zinc-400\">\n @if (tabs() && tabs()!.length <= 2 && tabs()!.length > 1) {\n @for (tab of tabs()!; track $index; let i = $index) {\n <xs-button\n [variant]=\"selectedTab() !== i ? 'primary' : 'selected'\"\n [label]=\"tab.label\"\n [layout]=\"'badge'\"\n (click)=\"onClickTab.emit(i)\"\n (keydown.enter)=\"onClickTab.emit(i)\"\n >\n {{ tab.label }}\n </xs-button>\n }\n }\n @if (tabs() && tabs()!.length > 2) {\n <xs-button\n label=\"\"\n [variant]=\"selectedTab() === 0 ? 'selected' : 'primary'\"\n [layout]=\"'iconOnlyMini'\"\n [icon]=\"{ name: 'chevron-left' }\"\n [disabled]=\"selectedTab() === 0\"\n (click)=\"onClickTabChevron('left')\"\n (keydown.enter)=\"onClickTabChevron('left')\"\n >\n </xs-button>\n <xs-button\n label=\"\"\n [variant]=\"\n selectedTab() === (tabs()?.length ?? 0) - 1\n ? 'selected'\n : 'primary'\n \"\n [layout]=\"'iconOnlyMini'\"\n [icon]=\"{ name: 'chevron-right' }\"\n [disabled]=\"selectedTab() === (tabs()?.length ?? 0) - 1\"\n (click)=\"onClickTabChevron('right')\"\n (keydown.enter)=\"onClickTabChevron('right')\"\n >\n </xs-button>\n }\n </div>\n\n @if (tabs() && tabs()!.length > 1) {\n <span class=\"text-zinc-900\">|</span>\n }\n\n @if (hasSoundcloudItems()) {\n <xs-button\n icon=\"play\"\n layout=\"iconOnlyMini\"\n variant=\"custom\"\n customClass=\"px-3 py-1 rounded-xl bg-zinc-900/50 hover:opacity-70\"\n (onClick)=\"!isPlayingAll() && onClickPlayAll.emit(undefined)\"\n [title]=\"texts().play\"\n [disabled]=\"loading().play || isPlayingAll()\"\n />\n }\n\n @if (hasSoundcloudItems()) {\n <span class=\"text-zinc-900\">|</span>\n }\n\n @if (hasViewButtons()) {\n <xs-button\n icon=\"image\"\n layout=\"iconOnlyMini\"\n variant=\"custom\"\n customClass=\"px-3 py-1 rounded-xl hover:opacity-70\"\n [ngClass]=\"{\n 'bg-zinc-700': view() === 'cards',\n 'bg-zinc-900': view() === 'list',\n }\"\n (onClick)=\"onClickChangeView.emit('cards')\"\n [title]=\"texts().changeView\"\n />\n <xs-button\n icon=\"list\"\n layout=\"iconOnlyMini\"\n variant=\"custom\"\n customClass=\"px-3 py-1 rounded-xl hover:opacity-70\"\n [ngClass]=\"{\n 'bg-zinc-700': view() === 'list',\n 'bg-zinc-900': view() === 'cards',\n }\"\n (onClick)=\"onClickChangeView.emit('list')\"\n [title]=\"texts().changeView\"\n />\n }\n\n @if (hasSortButton()) {\n <span class=\"text-zinc-900\">|</span>\n }\n\n @if (hasSortButton()) {\n <xs-button\n icon=\"sort\"\n layout=\"iconOnlyMini\"\n variant=\"custom\"\n customClass=\"px-3 py-1 rounded-xl bg-zinc-900/50 hover:opacity-70\"\n (onClick)=\"onClickSort.emit(undefined)\"\n [title]=\"texts().sort\"\n />\n }\n </div>\n\n @if (manage()) {\n <xs-button\n [icon]=\"{ name: !state() ? 'chevron-down' : 'chevron-up' }\"\n layout=\"iconOnlyMini\"\n variant=\"custom\"\n customClass=\"hover:opacity-70\"\n [title]=\"texts().changeView\"\n />\n }\n</div>\n" }]
5218
5190
  }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], titleId: [{ type: i0.Input, args: [{ isSignal: true, alias: "titleId", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: true }] }], hasSortButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasSortButton", required: false }] }], items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], manage: [{ type: i0.Input, args: [{ isSignal: true, alias: "manage", required: false }] }], state: [{ type: i0.Input, args: [{ isSignal: true, alias: "state", required: false }] }], total: [{ type: i0.Input, args: [{ isSignal: true, alias: "total", required: false }] }], view: [{ type: i0.Input, args: [{ isSignal: true, alias: "view", required: false }] }], hasViewButtons: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasViewButtons", required: false }] }], hasSoundcloudItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasSoundcloudItems", required: false }] }], tabs: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabs", required: false }] }], selectedTab: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedTab", required: false }] }, { type: i0.Output, args: ["selectedTabChange"] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], texts: [{ type: i0.Input, args: [{ isSignal: true, alias: "texts", required: false }] }], isPlayingAll: [{ type: i0.Input, args: [{ isSignal: true, alias: "isPlayingAll", required: false }] }], onClickChangeView: [{ type: i0.Output, args: ["onClickChangeView"] }], onClickPlayAll: [{ type: i0.Output, args: ["onClickPlayAll"] }], onClickSort: [{ type: i0.Output, args: ["onClickSort"] }], onChangeState: [{ type: i0.Output, args: ["onChangeState"] }], onClickTab: [{ type: i0.Output, args: ["onClickTab"] }] } });
5219
5191
 
5220
5192
  class XSSkeletonForSliderComponent {
@@ -5524,7 +5496,7 @@ class XSItemsSliderComponent {
5524
5496
  this.loadMoreData.emit();
5525
5497
  }
5526
5498
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: XSItemsSliderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5527
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: XSItemsSliderComponent, isStandalone: true, selector: "xs-items-slider", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, typeFrom: { classPropertyName: "typeFrom", publicName: "typeFrom", isSignal: true, isRequired: false, transformFunction: null }, total: { classPropertyName: "total", publicName: "total", isSignal: true, isRequired: false, transformFunction: null }, view: { classPropertyName: "view", publicName: "view", isSignal: true, isRequired: false, transformFunction: null }, hasViewButtons: { classPropertyName: "hasViewButtons", publicName: "hasViewButtons", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, sortButtonInput: { classPropertyName: "sortButtonInput", publicName: "sortButtonInput", isSignal: true, isRequired: false, transformFunction: null }, sortValues: { classPropertyName: "sortValues", publicName: "sortValues", isSignal: true, isRequired: false, transformFunction: null }, manage: { classPropertyName: "manage", publicName: "manage", isSignal: true, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, user: { classPropertyName: "user", publicName: "user", isSignal: true, isRequired: false, transformFunction: null }, tabs: { classPropertyName: "tabs", publicName: "tabs", isSignal: true, isRequired: false, transformFunction: null }, selectedTab: { classPropertyName: "selectedTab", publicName: "selectedTab", isSignal: true, isRequired: false, transformFunction: null }, hasSoundcloudItems: { classPropertyName: "hasSoundcloudItems", publicName: "hasSoundcloudItems", isSignal: true, isRequired: false, transformFunction: null }, language: { classPropertyName: "language", publicName: "language", isSignal: true, isRequired: false, transformFunction: null }, texts: { classPropertyName: "texts", publicName: "texts", isSignal: true, isRequired: false, transformFunction: null }, itemCardTexts: { classPropertyName: "itemCardTexts", publicName: "itemCardTexts", isSignal: true, isRequired: false, transformFunction: null }, isPlayingAll: { classPropertyName: "isPlayingAll", publicName: "isPlayingAll", isSignal: true, isRequired: false, transformFunction: null }, titleId: { classPropertyName: "titleId", publicName: "titleId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { view: "viewChange", selectedTab: "selectedTabChange", loadMoreData: "loadMoreData", onClickChangeSort: "onClickChangeSort", onClickPlay: "onClickPlay" }, host: { attributes: { "xs-items-slider-host": "" } }, viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n class=\"pt-3 mx-auto max-w-full-xl max-w-7sm\"\n [ngClass]=\"{\n 'mb-3 pt-3': !manage(),\n 'mb-2': manage(),\n }\"\n>\n <xs-items-slider-title-buttons\n [label]=\"label()\"\n [items]=\"items()\"\n [type]=\"type()\"\n [titleId]=\"titleId()\"\n [hasSortButton]=\"hasSortButton()\"\n [manage]=\"manage()\"\n [state]=\"state()\"\n [total]=\"total()\"\n [view]=\"view()\"\n [hasViewButtons]=\"hasViewButtons()\"\n [hasSoundcloudItems]=\"hasSoundcloudItems()\"\n [tabs]=\"tabs()\"\n [selectedTab]=\"selectedTab()\"\n [texts]=\"texts()\"\n [isPlayingAll]=\"isPlayingAll()\"\n (onClickChangeView)=\"onClickChangeView($event)\"\n (onClickPlayAll)=\"onClickPlay.emit()\"\n (onClickSort)=\"onClickSort()\"\n (onClickTab)=\"onClickTab($event)\"\n ></xs-items-slider-title-buttons>\n\n @if ((manage() && state()) || (!manage() && !state())) {\n <!-- CARDS -->\n @if (!loading().items && view() === 'cards') {\n <div class=\"relative\">\n @if (canScrollLeft) {\n <button\n (click)=\"scrollLeftBtn()\"\n class=\"absolute z-10 p-2 text-white transition-opacity -translate-y-1/2 rounded-full shadow-lg left-2 top-1/2 bg-black/70 hover:bg-black/90\"\n >\n <svg\n class=\"w-6 h-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n </button>\n }\n\n @if (type() !== 'setup') {\n <div\n #scrollContainer\n class=\"flex gap-4 py-2 overflow-scroll overflow-x-auto scrollbar-hidden scroll-smooth\"\n (scroll)=\"onScroll()\"\n (wheel)=\"onHorizontalWheel($event)\"\n >\n @for (item of items(); track $index; let i = $index) {\n <div\n class=\"flex flex-col items-center flex-shrink-0\"\n >\n <xs-item-card\n [item]=\"item\"\n [type]=\"$any(type())\"\n [forSlider]=\"true\"\n [styles]=\"true\"\n [i]=\"i\"\n [user]=\"user()\"\n [year]=\"type() === 'media'\"\n [texts]=\"itemCardTexts()\"\n [language]=\"language()\"\n ></xs-item-card>\n </div>\n }\n </div>\n }\n @if (type() === 'setup') {\n <div\n #scrollContainer\n class=\"flex gap-4 py-2 overflow-scroll overflow-x-auto scrollbar-hidden scroll-smooth\"\n (wheel)=\"onHorizontalWheel($event)\"\n >\n @if (items() && items().length > 0 && selectedTab() !== undefined && selectedTab() >= 0 && selectedTab() < items().length && $any(items()[selectedTab()])?.components) {\n @for (component of $any(items()[selectedTab()]).components; track $index; let ii = $index) {\n <div\n class=\"flex flex-col items-center flex-shrink-0\"\n >\n <xs-item-card\n [item]=\"component\"\n [type]=\"'equipment'\"\n [forSlider]=\"true\"\n [styles]=\"true\"\n [i]=\"ii\"\n [user]=\"user()\"\n [texts]=\"itemCardTexts()\"\n [language]=\"language()\"\n ></xs-item-card>\n </div>\n }\n }\n </div>\n }\n\n @if (canScrollRight) {\n <button\n (click)=\"scrollRightBtn()\"\n class=\"absolute z-10 p-2 text-white transition-opacity -translate-y-1/2 rounded-full shadow-lg right-2 top-1/2 bg-black/70 hover:bg-black/90\"\n >\n <svg\n class=\"w-6 h-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n }\n </div>\n }\n\n @if (loading().items && view() === 'cards') {\n <div class=\"flex gap-4 py-2 overflow-scroll overflow-x-auto scrollbar-hidden scroll-smooth\" (wheel)=\"onHorizontalWheel($event)\">\n @for (i of [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; track $index) {\n <xs-skeleton-for-slider\n type=\"normal\"\n ></xs-skeleton-for-slider>\n }\n </div>\n }\n\n <!-- LIST -->\n @if (view() === 'list') {\n <div\n class=\"grid w-full grid-cols-1 gap-2 lg:gap-3 p-1.5 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\"\n >\n @if (type() !== 'setup') {\n @for (item of items(); track $index; let i = $index) {\n <!-- <xs-item-compact\n [item]=\"item\"\n [type]=\"type\"\n [user]=\"user\"\n [language]=\"language\"\n ></xs-item-compact> -->\n }\n }\n\n @if (items() && items().length > 0 && selectedTab() !== undefined && selectedTab() >= 0 && selectedTab() < items().length && $any(items()[selectedTab()])?.components) {\n @for (component of $any(items()[selectedTab()]).components; track $index; let ii = $index) {\n <!-- <xs-item-compact\n [item]=\"component\"\n [type]=\"'equipment'\"\n [user]=\"user\"\n [language]=\"language\"\n ></xs-item-compact> -->\n }\n }\n </div>\n @if (!loading().items && items().length >= 10 && total() > items().length) {\n <xs-button\n [label]=\"texts().viewMore\"\n [layout]=\"'between'\"\n [isFull]=\"true\"\n [icon]=\"{ name: 'plus' }\"\n [disabled]=\"loading().more || loading().items\"\n [loading]=\"loading().more || loading().items\"\n (onClick)=\"onScrollTable()\"\n >\n </xs-button>\n }\n }\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: XSItemCardComponent, selector: "xs-item-card", inputs: ["type", "subtypeForced", "item", "viewTransitionName", "forSlider", "forTop", "position", "edit", "year", "styles", "stylesLeft", "link", "clickEmit", "i", "user", "count", "showLabelType", "language", "texts"], outputs: ["onGoToItem"] }, { kind: "component", type: XSItemsSliderTitleButtonsComponent, selector: "xs-items-slider-title-buttons", inputs: ["label", "titleId", "type", "hasSortButton", "items", "manage", "state", "total", "view", "hasViewButtons", "hasSoundcloudItems", "tabs", "selectedTab", "loading", "texts", "isPlayingAll"], outputs: ["selectedTabChange", "onClickChangeView", "onClickPlayAll", "onClickSort", "onChangeState", "onClickTab"] }, { kind: "component", type: XSSkeletonForSliderComponent, selector: "xs-skeleton-for-slider", inputs: ["displayType", "forSlider"] }, { kind: "component", type: XSButtonComponent, selector: "xs-button", inputs: ["id", "label", "type", "icon", "action", "customClass", "variant", "layout", "badgeCount", "isFull", "disabled", "loading", "title", "ariaLabel", "borderRadius", "isGrouped", "groupPosition"], outputs: ["isGroupedChange", "groupPositionChange", "click", "onClick"] }, { kind: "ngmodule", type: PipesModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5499
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: XSItemsSliderComponent, isStandalone: true, selector: "xs-items-slider", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, typeFrom: { classPropertyName: "typeFrom", publicName: "typeFrom", isSignal: true, isRequired: false, transformFunction: null }, total: { classPropertyName: "total", publicName: "total", isSignal: true, isRequired: false, transformFunction: null }, view: { classPropertyName: "view", publicName: "view", isSignal: true, isRequired: false, transformFunction: null }, hasViewButtons: { classPropertyName: "hasViewButtons", publicName: "hasViewButtons", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, sortButtonInput: { classPropertyName: "sortButtonInput", publicName: "sortButtonInput", isSignal: true, isRequired: false, transformFunction: null }, sortValues: { classPropertyName: "sortValues", publicName: "sortValues", isSignal: true, isRequired: false, transformFunction: null }, manage: { classPropertyName: "manage", publicName: "manage", isSignal: true, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, user: { classPropertyName: "user", publicName: "user", isSignal: true, isRequired: false, transformFunction: null }, tabs: { classPropertyName: "tabs", publicName: "tabs", isSignal: true, isRequired: false, transformFunction: null }, selectedTab: { classPropertyName: "selectedTab", publicName: "selectedTab", isSignal: true, isRequired: false, transformFunction: null }, hasSoundcloudItems: { classPropertyName: "hasSoundcloudItems", publicName: "hasSoundcloudItems", isSignal: true, isRequired: false, transformFunction: null }, language: { classPropertyName: "language", publicName: "language", isSignal: true, isRequired: false, transformFunction: null }, texts: { classPropertyName: "texts", publicName: "texts", isSignal: true, isRequired: false, transformFunction: null }, itemCardTexts: { classPropertyName: "itemCardTexts", publicName: "itemCardTexts", isSignal: true, isRequired: false, transformFunction: null }, isPlayingAll: { classPropertyName: "isPlayingAll", publicName: "isPlayingAll", isSignal: true, isRequired: false, transformFunction: null }, titleId: { classPropertyName: "titleId", publicName: "titleId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { view: "viewChange", selectedTab: "selectedTabChange", loadMoreData: "loadMoreData", onClickChangeSort: "onClickChangeSort", onClickPlay: "onClickPlay" }, host: { attributes: { "xs-items-slider-host": "" } }, viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n class=\"pt-3 mx-auto max-w-full-xl max-w-7sm\"\n [ngClass]=\"{\n 'mb-3 pt-3': !manage(),\n 'mb-2': manage(),\n }\"\n>\n <xs-items-slider-title-buttons\n [label]=\"label()\"\n [items]=\"items()\"\n [type]=\"type()\"\n [titleId]=\"titleId()\"\n [hasSortButton]=\"hasSortButton()\"\n [manage]=\"manage()\"\n [state]=\"state()\"\n [total]=\"total()\"\n [view]=\"view()\"\n [hasViewButtons]=\"hasViewButtons()\"\n [hasSoundcloudItems]=\"hasSoundcloudItems()\"\n [tabs]=\"tabs()\"\n [selectedTab]=\"selectedTab()\"\n [texts]=\"texts()\"\n [isPlayingAll]=\"isPlayingAll()\"\n (onClickChangeView)=\"onClickChangeView($event)\"\n (onClickPlayAll)=\"onClickPlay.emit()\"\n (onClickSort)=\"onClickSort()\"\n (onClickTab)=\"onClickTab($event)\"\n ></xs-items-slider-title-buttons>\n\n @if ((manage() && state()) || (!manage() && !state())) {\n @if (!loading().items && view() === 'cards') {\n <div class=\"relative\">\n @if (canScrollLeft) {\n <button\n (click)=\"scrollLeftBtn()\"\n class=\"absolute z-10 p-2 text-white transition-opacity -translate-y-1/2 rounded-full shadow-lg left-2 top-1/2 bg-black/70 hover:bg-black/90\"\n >\n <svg\n class=\"w-6 h-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n </button>\n }\n\n @if (type() !== 'setup') {\n <div\n #scrollContainer\n class=\"flex gap-4 py-2 overflow-scroll overflow-x-auto scrollbar-hidden scroll-smooth\"\n (scroll)=\"onScroll()\"\n (wheel)=\"onHorizontalWheel($event)\"\n >\n @for (item of items(); track $index; let i = $index) {\n <div\n class=\"flex flex-col items-center flex-shrink-0\"\n >\n <xs-item-card\n [item]=\"item\"\n [type]=\"$any(type())\"\n [forSlider]=\"true\"\n [styles]=\"true\"\n [i]=\"i\"\n [user]=\"user()\"\n [year]=\"type() === 'media'\"\n [texts]=\"itemCardTexts()\"\n [language]=\"language()\"\n ></xs-item-card>\n </div>\n }\n </div>\n }\n @if (type() === 'setup') {\n <div\n #scrollContainer\n class=\"flex gap-4 py-2 overflow-scroll overflow-x-auto scrollbar-hidden scroll-smooth\"\n (wheel)=\"onHorizontalWheel($event)\"\n >\n @if (items() && items().length > 0 && selectedTab() !== undefined && selectedTab() >= 0 && selectedTab() < items().length && $any(items()[selectedTab()])?.components) {\n @for (component of $any(items()[selectedTab()]).components; track $index; let ii = $index) {\n <div\n class=\"flex flex-col items-center flex-shrink-0\"\n >\n <xs-item-card\n [item]=\"component\"\n [type]=\"'equipment'\"\n [forSlider]=\"true\"\n [styles]=\"true\"\n [i]=\"ii\"\n [user]=\"user()\"\n [texts]=\"itemCardTexts()\"\n [language]=\"language()\"\n ></xs-item-card>\n </div>\n }\n }\n </div>\n }\n\n @if (canScrollRight) {\n <button\n (click)=\"scrollRightBtn()\"\n class=\"absolute z-10 p-2 text-white transition-opacity -translate-y-1/2 rounded-full shadow-lg right-2 top-1/2 bg-black/70 hover:bg-black/90\"\n >\n <svg\n class=\"w-6 h-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n }\n </div>\n }\n\n @if (loading().items && view() === 'cards') {\n <div class=\"flex gap-4 py-2 overflow-scroll overflow-x-auto scrollbar-hidden scroll-smooth\" (wheel)=\"onHorizontalWheel($event)\">\n @for (i of [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; track $index) {\n <xs-skeleton-for-slider\n type=\"normal\"\n ></xs-skeleton-for-slider>\n }\n </div>\n }\n\n @if (view() === 'list') {\n <div\n class=\"grid w-full grid-cols-1 gap-2 lg:gap-3 p-1.5 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\"\n >\n @if (type() !== 'setup') {\n @for (item of items(); track $index; let i = $index) {\n }\n }\n\n @if (items() && items().length > 0 && selectedTab() !== undefined && selectedTab() >= 0 && selectedTab() < items().length && $any(items()[selectedTab()])?.components) {\n @for (component of $any(items()[selectedTab()]).components; track $index; let ii = $index) {\n }\n }\n </div>\n @if (!loading().items && items().length >= 10 && total() > items().length) {\n <xs-button\n [label]=\"texts().viewMore\"\n [layout]=\"'between'\"\n [isFull]=\"true\"\n [icon]=\"{ name: 'plus' }\"\n [disabled]=\"loading().more || loading().items\"\n [loading]=\"loading().more || loading().items\"\n (onClick)=\"onScrollTable()\"\n >\n </xs-button>\n }\n }\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: XSItemCardComponent, selector: "xs-item-card", inputs: ["type", "subtypeForced", "item", "viewTransitionName", "forSlider", "forTop", "position", "edit", "year", "styles", "stylesLeft", "link", "clickEmit", "i", "user", "count", "showLabelType", "language", "texts"], outputs: ["onGoToItem"] }, { kind: "component", type: XSItemsSliderTitleButtonsComponent, selector: "xs-items-slider-title-buttons", inputs: ["label", "titleId", "type", "hasSortButton", "items", "manage", "state", "total", "view", "hasViewButtons", "hasSoundcloudItems", "tabs", "selectedTab", "loading", "texts", "isPlayingAll"], outputs: ["selectedTabChange", "onClickChangeView", "onClickPlayAll", "onClickSort", "onChangeState", "onClickTab"] }, { kind: "component", type: XSSkeletonForSliderComponent, selector: "xs-skeleton-for-slider", inputs: ["displayType", "forSlider"] }, { kind: "component", type: XSButtonComponent, selector: "xs-button", inputs: ["id", "label", "type", "icon", "action", "customClass", "variant", "layout", "badgeCount", "isFull", "disabled", "loading", "title", "ariaLabel", "borderRadius", "isGrouped", "groupPosition"], outputs: ["isGroupedChange", "groupPositionChange", "click", "onClick"] }, { kind: "ngmodule", type: PipesModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5528
5500
  }
5529
5501
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: XSItemsSliderComponent, decorators: [{
5530
5502
  type: Component,
@@ -5535,7 +5507,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImpo
5535
5507
  XSSkeletonForSliderComponent,
5536
5508
  XSButtonComponent,
5537
5509
  PipesModule,
5538
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"pt-3 mx-auto max-w-full-xl max-w-7sm\"\n [ngClass]=\"{\n 'mb-3 pt-3': !manage(),\n 'mb-2': manage(),\n }\"\n>\n <xs-items-slider-title-buttons\n [label]=\"label()\"\n [items]=\"items()\"\n [type]=\"type()\"\n [titleId]=\"titleId()\"\n [hasSortButton]=\"hasSortButton()\"\n [manage]=\"manage()\"\n [state]=\"state()\"\n [total]=\"total()\"\n [view]=\"view()\"\n [hasViewButtons]=\"hasViewButtons()\"\n [hasSoundcloudItems]=\"hasSoundcloudItems()\"\n [tabs]=\"tabs()\"\n [selectedTab]=\"selectedTab()\"\n [texts]=\"texts()\"\n [isPlayingAll]=\"isPlayingAll()\"\n (onClickChangeView)=\"onClickChangeView($event)\"\n (onClickPlayAll)=\"onClickPlay.emit()\"\n (onClickSort)=\"onClickSort()\"\n (onClickTab)=\"onClickTab($event)\"\n ></xs-items-slider-title-buttons>\n\n @if ((manage() && state()) || (!manage() && !state())) {\n <!-- CARDS -->\n @if (!loading().items && view() === 'cards') {\n <div class=\"relative\">\n @if (canScrollLeft) {\n <button\n (click)=\"scrollLeftBtn()\"\n class=\"absolute z-10 p-2 text-white transition-opacity -translate-y-1/2 rounded-full shadow-lg left-2 top-1/2 bg-black/70 hover:bg-black/90\"\n >\n <svg\n class=\"w-6 h-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n </button>\n }\n\n @if (type() !== 'setup') {\n <div\n #scrollContainer\n class=\"flex gap-4 py-2 overflow-scroll overflow-x-auto scrollbar-hidden scroll-smooth\"\n (scroll)=\"onScroll()\"\n (wheel)=\"onHorizontalWheel($event)\"\n >\n @for (item of items(); track $index; let i = $index) {\n <div\n class=\"flex flex-col items-center flex-shrink-0\"\n >\n <xs-item-card\n [item]=\"item\"\n [type]=\"$any(type())\"\n [forSlider]=\"true\"\n [styles]=\"true\"\n [i]=\"i\"\n [user]=\"user()\"\n [year]=\"type() === 'media'\"\n [texts]=\"itemCardTexts()\"\n [language]=\"language()\"\n ></xs-item-card>\n </div>\n }\n </div>\n }\n @if (type() === 'setup') {\n <div\n #scrollContainer\n class=\"flex gap-4 py-2 overflow-scroll overflow-x-auto scrollbar-hidden scroll-smooth\"\n (wheel)=\"onHorizontalWheel($event)\"\n >\n @if (items() && items().length > 0 && selectedTab() !== undefined && selectedTab() >= 0 && selectedTab() < items().length && $any(items()[selectedTab()])?.components) {\n @for (component of $any(items()[selectedTab()]).components; track $index; let ii = $index) {\n <div\n class=\"flex flex-col items-center flex-shrink-0\"\n >\n <xs-item-card\n [item]=\"component\"\n [type]=\"'equipment'\"\n [forSlider]=\"true\"\n [styles]=\"true\"\n [i]=\"ii\"\n [user]=\"user()\"\n [texts]=\"itemCardTexts()\"\n [language]=\"language()\"\n ></xs-item-card>\n </div>\n }\n }\n </div>\n }\n\n @if (canScrollRight) {\n <button\n (click)=\"scrollRightBtn()\"\n class=\"absolute z-10 p-2 text-white transition-opacity -translate-y-1/2 rounded-full shadow-lg right-2 top-1/2 bg-black/70 hover:bg-black/90\"\n >\n <svg\n class=\"w-6 h-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n }\n </div>\n }\n\n @if (loading().items && view() === 'cards') {\n <div class=\"flex gap-4 py-2 overflow-scroll overflow-x-auto scrollbar-hidden scroll-smooth\" (wheel)=\"onHorizontalWheel($event)\">\n @for (i of [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; track $index) {\n <xs-skeleton-for-slider\n type=\"normal\"\n ></xs-skeleton-for-slider>\n }\n </div>\n }\n\n <!-- LIST -->\n @if (view() === 'list') {\n <div\n class=\"grid w-full grid-cols-1 gap-2 lg:gap-3 p-1.5 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\"\n >\n @if (type() !== 'setup') {\n @for (item of items(); track $index; let i = $index) {\n <!-- <xs-item-compact\n [item]=\"item\"\n [type]=\"type\"\n [user]=\"user\"\n [language]=\"language\"\n ></xs-item-compact> -->\n }\n }\n\n @if (items() && items().length > 0 && selectedTab() !== undefined && selectedTab() >= 0 && selectedTab() < items().length && $any(items()[selectedTab()])?.components) {\n @for (component of $any(items()[selectedTab()]).components; track $index; let ii = $index) {\n <!-- <xs-item-compact\n [item]=\"component\"\n [type]=\"'equipment'\"\n [user]=\"user\"\n [language]=\"language\"\n ></xs-item-compact> -->\n }\n }\n </div>\n @if (!loading().items && items().length >= 10 && total() > items().length) {\n <xs-button\n [label]=\"texts().viewMore\"\n [layout]=\"'between'\"\n [isFull]=\"true\"\n [icon]=\"{ name: 'plus' }\"\n [disabled]=\"loading().more || loading().items\"\n [loading]=\"loading().more || loading().items\"\n (onClick)=\"onScrollTable()\"\n >\n </xs-button>\n }\n }\n }\n</div>\n" }]
5510
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"pt-3 mx-auto max-w-full-xl max-w-7sm\"\n [ngClass]=\"{\n 'mb-3 pt-3': !manage(),\n 'mb-2': manage(),\n }\"\n>\n <xs-items-slider-title-buttons\n [label]=\"label()\"\n [items]=\"items()\"\n [type]=\"type()\"\n [titleId]=\"titleId()\"\n [hasSortButton]=\"hasSortButton()\"\n [manage]=\"manage()\"\n [state]=\"state()\"\n [total]=\"total()\"\n [view]=\"view()\"\n [hasViewButtons]=\"hasViewButtons()\"\n [hasSoundcloudItems]=\"hasSoundcloudItems()\"\n [tabs]=\"tabs()\"\n [selectedTab]=\"selectedTab()\"\n [texts]=\"texts()\"\n [isPlayingAll]=\"isPlayingAll()\"\n (onClickChangeView)=\"onClickChangeView($event)\"\n (onClickPlayAll)=\"onClickPlay.emit()\"\n (onClickSort)=\"onClickSort()\"\n (onClickTab)=\"onClickTab($event)\"\n ></xs-items-slider-title-buttons>\n\n @if ((manage() && state()) || (!manage() && !state())) {\n @if (!loading().items && view() === 'cards') {\n <div class=\"relative\">\n @if (canScrollLeft) {\n <button\n (click)=\"scrollLeftBtn()\"\n class=\"absolute z-10 p-2 text-white transition-opacity -translate-y-1/2 rounded-full shadow-lg left-2 top-1/2 bg-black/70 hover:bg-black/90\"\n >\n <svg\n class=\"w-6 h-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n </button>\n }\n\n @if (type() !== 'setup') {\n <div\n #scrollContainer\n class=\"flex gap-4 py-2 overflow-scroll overflow-x-auto scrollbar-hidden scroll-smooth\"\n (scroll)=\"onScroll()\"\n (wheel)=\"onHorizontalWheel($event)\"\n >\n @for (item of items(); track $index; let i = $index) {\n <div\n class=\"flex flex-col items-center flex-shrink-0\"\n >\n <xs-item-card\n [item]=\"item\"\n [type]=\"$any(type())\"\n [forSlider]=\"true\"\n [styles]=\"true\"\n [i]=\"i\"\n [user]=\"user()\"\n [year]=\"type() === 'media'\"\n [texts]=\"itemCardTexts()\"\n [language]=\"language()\"\n ></xs-item-card>\n </div>\n }\n </div>\n }\n @if (type() === 'setup') {\n <div\n #scrollContainer\n class=\"flex gap-4 py-2 overflow-scroll overflow-x-auto scrollbar-hidden scroll-smooth\"\n (wheel)=\"onHorizontalWheel($event)\"\n >\n @if (items() && items().length > 0 && selectedTab() !== undefined && selectedTab() >= 0 && selectedTab() < items().length && $any(items()[selectedTab()])?.components) {\n @for (component of $any(items()[selectedTab()]).components; track $index; let ii = $index) {\n <div\n class=\"flex flex-col items-center flex-shrink-0\"\n >\n <xs-item-card\n [item]=\"component\"\n [type]=\"'equipment'\"\n [forSlider]=\"true\"\n [styles]=\"true\"\n [i]=\"ii\"\n [user]=\"user()\"\n [texts]=\"itemCardTexts()\"\n [language]=\"language()\"\n ></xs-item-card>\n </div>\n }\n }\n </div>\n }\n\n @if (canScrollRight) {\n <button\n (click)=\"scrollRightBtn()\"\n class=\"absolute z-10 p-2 text-white transition-opacity -translate-y-1/2 rounded-full shadow-lg right-2 top-1/2 bg-black/70 hover:bg-black/90\"\n >\n <svg\n class=\"w-6 h-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n }\n </div>\n }\n\n @if (loading().items && view() === 'cards') {\n <div class=\"flex gap-4 py-2 overflow-scroll overflow-x-auto scrollbar-hidden scroll-smooth\" (wheel)=\"onHorizontalWheel($event)\">\n @for (i of [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; track $index) {\n <xs-skeleton-for-slider\n type=\"normal\"\n ></xs-skeleton-for-slider>\n }\n </div>\n }\n\n @if (view() === 'list') {\n <div\n class=\"grid w-full grid-cols-1 gap-2 lg:gap-3 p-1.5 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\"\n >\n @if (type() !== 'setup') {\n @for (item of items(); track $index; let i = $index) {\n }\n }\n\n @if (items() && items().length > 0 && selectedTab() !== undefined && selectedTab() >= 0 && selectedTab() < items().length && $any(items()[selectedTab()])?.components) {\n @for (component of $any(items()[selectedTab()]).components; track $index; let ii = $index) {\n }\n }\n </div>\n @if (!loading().items && items().length >= 10 && total() > items().length) {\n <xs-button\n [label]=\"texts().viewMore\"\n [layout]=\"'between'\"\n [isFull]=\"true\"\n [icon]=\"{ name: 'plus' }\"\n [disabled]=\"loading().more || loading().items\"\n [loading]=\"loading().more || loading().items\"\n (onClick)=\"onScrollTable()\"\n >\n </xs-button>\n }\n }\n }\n</div>\n" }]
5539
5511
  }], ctorParameters: () => [], propDecorators: { scrollContainer: [{ type: i0.ViewChild, args: ['scrollContainer', { isSignal: true }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: true }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], typeFrom: [{ type: i0.Input, args: [{ isSignal: true, alias: "typeFrom", required: false }] }], total: [{ type: i0.Input, args: [{ isSignal: true, alias: "total", required: false }] }], view: [{ type: i0.Input, args: [{ isSignal: true, alias: "view", required: false }] }, { type: i0.Output, args: ["viewChange"] }], hasViewButtons: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasViewButtons", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], sortButtonInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortButtonInput", required: false }] }], sortValues: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortValues", required: false }] }], manage: [{ type: i0.Input, args: [{ isSignal: true, alias: "manage", required: false }] }], state: [{ type: i0.Input, args: [{ isSignal: true, alias: "state", required: false }] }], user: [{ type: i0.Input, args: [{ isSignal: true, alias: "user", required: false }] }], tabs: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabs", required: false }] }], selectedTab: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedTab", required: false }] }, { type: i0.Output, args: ["selectedTabChange"] }], hasSoundcloudItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasSoundcloudItems", required: false }] }], language: [{ type: i0.Input, args: [{ isSignal: true, alias: "language", required: false }] }], texts: [{ type: i0.Input, args: [{ isSignal: true, alias: "texts", required: false }] }], itemCardTexts: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemCardTexts", required: false }] }], isPlayingAll: [{ type: i0.Input, args: [{ isSignal: true, alias: "isPlayingAll", required: false }] }], titleId: [{ type: i0.Input, args: [{ isSignal: true, alias: "titleId", required: false }] }], loadMoreData: [{ type: i0.Output, args: ["loadMoreData"] }], onClickChangeSort: [{ type: i0.Output, args: ["onClickChangeSort"] }], onClickPlay: [{ type: i0.Output, args: ["onClickPlay"] }] } });
5540
5512
 
5541
5513
  class XSTitleCollapseComponent {
@@ -9147,7 +9119,6 @@ class XSModalService {
9147
9119
  this.translateService.registerTranslations({ es: es$l, en: en$l });
9148
9120
  }
9149
9121
  open(componentType, options = {}) {
9150
- // Set default values
9151
9122
  const defaultOptions = {
9152
9123
  type: 'bottom-sheet',
9153
9124
  };
@@ -11408,7 +11379,6 @@ class XSAuthComponent {
11408
11379
  get showInfoIcons() {
11409
11380
  return this.cfg?.showInfoIcons !== false;
11410
11381
  }
11411
- // --- Header ---
11412
11382
  get title() {
11413
11383
  this.syncTranslations();
11414
11384
  switch (this.activeMode) {
@@ -11447,7 +11417,6 @@ class XSAuthComponent {
11447
11417
  return '';
11448
11418
  }
11449
11419
  }
11450
- // --- Form fields ---
11451
11420
  get loginFields() {
11452
11421
  this.syncTranslations();
11453
11422
  if (!this._loginFields) {
@@ -11553,7 +11522,6 @@ class XSAuthComponent {
11553
11522
  }
11554
11523
  return this._twoFactorFields;
11555
11524
  }
11556
- // --- Mode switching ---
11557
11525
  changeMode(mode) {
11558
11526
  this.service.activeMode = mode;
11559
11527
  this.formModel = {};
@@ -11564,7 +11532,6 @@ class XSAuthComponent {
11564
11532
  markEmailSent() {
11565
11533
  this.emailSent.set(true);
11566
11534
  }
11567
- // --- Form handlers ---
11568
11535
  onFormReady(form) {
11569
11536
  this.formGroup = form;
11570
11537
  Promise.resolve().then(() => {
@@ -11578,7 +11545,6 @@ class XSAuthComponent {
11578
11545
  this.formModel = formData ?? {};
11579
11546
  this.isFormValid = this.formGroup?.valid ?? false;
11580
11547
  }
11581
- // --- Actions ---
11582
11548
  actionSocial(provider) {
11583
11549
  this.onAction.emit({
11584
11550
  action: provider === 'google'
@@ -12649,7 +12615,6 @@ class XSFullImageComponent {
12649
12615
  this.dismiss();
12650
12616
  }
12651
12617
  }
12652
- /* ---- Zoom helpers ---- */
12653
12618
  resetZoom() {
12654
12619
  this.zoom.set(1);
12655
12620
  this.translateX.set(0);
@@ -12665,7 +12630,6 @@ class XSFullImageComponent {
12665
12630
  this.translateY.set(0);
12666
12631
  }
12667
12632
  }
12668
- /* ---- Backdrop click ---- */
12669
12633
  onBackdropClick(event) {
12670
12634
  if (event.target === event.currentTarget) {
12671
12635
  this.dismiss();
@@ -12676,7 +12640,6 @@ class XSFullImageComponent {
12676
12640
  event.stopPropagation();
12677
12641
  this.dismiss();
12678
12642
  }
12679
- /* ---- Pointer pan (desktop) ---- */
12680
12643
  onImagePointerDown(event) {
12681
12644
  event.stopPropagation();
12682
12645
  if (this.zoom() <= 1)
@@ -12699,7 +12662,6 @@ class XSFullImageComponent {
12699
12662
  onPointerUp(_event) {
12700
12663
  this.isPointerPanning = false;
12701
12664
  }
12702
- /* ---- Touch handlers (mobile) ---- */
12703
12665
  onTouchStart(event) {
12704
12666
  if (!isPlatformBrowser(this.platformId))
12705
12667
  return;
@@ -12778,7 +12740,6 @@ class XSFullImageComponent {
12778
12740
  const dy = touches[0].clientY - touches[1].clientY;
12779
12741
  return Math.sqrt(dx * dx + dy * dy);
12780
12742
  }
12781
- /* ---- Scroll wheel zoom (desktop) ---- */
12782
12743
  onWheel(event) {
12783
12744
  if (!isPlatformBrowser(this.platformId))
12784
12745
  return;
@@ -12786,7 +12747,6 @@ class XSFullImageComponent {
12786
12747
  const delta = event.deltaY > 0 ? -0.1 : 0.1;
12787
12748
  this.setZoom(this.zoom() + delta);
12788
12749
  }
12789
- /* ---- Download ---- */
12790
12750
  onDownload(event) {
12791
12751
  event.stopPropagation();
12792
12752
  if (!isPlatformBrowser(this.platformId))
@@ -12815,7 +12775,6 @@ class XSFullImageComponent {
12815
12775
  a.click();
12816
12776
  });
12817
12777
  }
12818
- /* ---- Share ---- */
12819
12778
  async onShare(event) {
12820
12779
  event.stopPropagation();
12821
12780
  if (!isPlatformBrowser(this.platformId))
@@ -16121,7 +16080,7 @@ class XSNavbarComponent {
16121
16080
  this.translateService.setLanguage(newLang);
16122
16081
  }
16123
16082
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: XSNavbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
16124
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: XSNavbarComponent, isStandalone: true, selector: "xs-navbar", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, mobileTitle: { classPropertyName: "mobileTitle", publicName: "mobileTitle", isSignal: true, isRequired: false, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null }, mobileSubtitle: { classPropertyName: "mobileSubtitle", publicName: "mobileSubtitle", isSignal: true, isRequired: false, transformFunction: null }, showBorder: { classPropertyName: "showBorder", publicName: "showBorder", isSignal: true, isRequired: false, transformFunction: null }, transparent: { classPropertyName: "transparent", publicName: "transparent", isSignal: true, isRequired: false, transformFunction: null }, sticky: { classPropertyName: "sticky", publicName: "sticky", isSignal: true, isRequired: false, transformFunction: null }, showBack: { classPropertyName: "showBack", publicName: "showBack", isSignal: true, isRequired: false, transformFunction: null }, showMenu: { classPropertyName: "showMenu", publicName: "showMenu", isSignal: true, isRequired: false, transformFunction: null }, menuIcon: { classPropertyName: "menuIcon", publicName: "menuIcon", isSignal: true, isRequired: false, transformFunction: null }, showLanguage: { classPropertyName: "showLanguage", publicName: "showLanguage", isSignal: true, isRequired: false, transformFunction: null }, showNotifications: { classPropertyName: "showNotifications", publicName: "showNotifications", isSignal: true, isRequired: false, transformFunction: null }, showChat: { classPropertyName: "showChat", publicName: "showChat", isSignal: true, isRequired: false, transformFunction: null }, showImpersonation: { classPropertyName: "showImpersonation", publicName: "showImpersonation", isSignal: true, isRequired: false, transformFunction: null }, unreadChatMessages: { classPropertyName: "unreadChatMessages", publicName: "unreadChatMessages", isSignal: true, isRequired: false, transformFunction: null }, unreadNotifications: { classPropertyName: "unreadNotifications", publicName: "unreadNotifications", isSignal: true, isRequired: false, transformFunction: null }, homeRoute: { classPropertyName: "homeRoute", publicName: "homeRoute", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, hidden: { classPropertyName: "hidden", publicName: "hidden", isSignal: true, isRequired: false, transformFunction: null }, hideEnvBadge: { classPropertyName: "hideEnvBadge", publicName: "hideEnvBadge", isSignal: true, isRequired: false, transformFunction: null }, maxWidth: { classPropertyName: "maxWidth", publicName: "maxWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { back: "back", menuToggle: "menuToggle", titleClick: "titleClick", notificationsClick: "notificationsClick", chatClick: "chatClick", impersonationClick: "impersonationClick" }, host: { attributes: { "role": "banner" }, properties: { "class.sticky": "sticky()", "class.top-0": "sticky()", "class.z-50": "sticky()" } }, queries: [{ propertyName: "bottomContent", first: true, predicate: ["[bottom]"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "@if (!hidden()) {\n<header\n [class.bg-black/80]=\"!transparent()\"\n [class.backdrop-blur-xl]=\"!transparent()\"\n class=\"ease-in-out transition-all duration-300\"\n [attr.aria-label]=\"ariaLabel() || title()\"\n>\n <div\n class=\"mx-auto px-4 pt-3 pb-2\"\n [class.border-b]=\"showBorder()\"\n [class.border-white/5]=\"showBorder()\"\n [style.max-width]=\"maxWidth()\"\n >\n <div class=\"flex items-center justify-between gap-4 w-full\">\n <div class=\"flex items-center min-w-0 flex-1\">\n @if (showLeftButton) {\n <xs-button\n (onClick)=\"showBack() ? back.emit() : menuToggle.emit()\"\n [icon]=\"{ name: showBack() ? 'arrow-left' : (menuIcon()) }\"\n layout=\"iconOnlyHeader\"\n variant=\"custom\"\n customClass=\"flex-none p-2 -ml-2 text-zinc-400 hover:text-white active:scale-90 rounded-xl hover:bg-zinc-900/50\"\n [title]=\"showBack() ? t('GO_BACK') : t('OPEN_MENU')\"\n />\n }\n\n <div class=\"flex flex-col min-w-0 flex-1\">\n <a\n [routerLink]=\"homeRoute()\"\n (click)=\"titleClick.emit()\"\n class=\"inline-block text-2xl sm:text-3xl font-black tracking-[0.01em] text-white uppercase leading-none truncate transition-[letter-spacing_0.5s_ease-out,color_0.2s_ease] hover:tracking-[0.05em] hover:text-zinc-300 will-change-[letter-spacing] no-underline\"\n [attr.aria-label]=\"t('GO_TO') + ' ' + (homeRoute() || t('HOME'))\"\n >\n @if (mobileTitle()) {\n <span class=\"lg:hidden\">{{ mobileTitle() }}</span>\n <span class=\"hidden lg:inline\">{{ title() }}</span>\n } @else {\n {{ title() }}\n }\n </a>\n\n @if (subtitle()) {\n <div\n class=\"flex items-center gap-2 mt-1 animate-in fade-in slide-in-from-left-2 duration-500 min-w-0\"\n >\n <div\n class=\"text-zinc-400 text-[10px] font-black tracking-[0.2em] uppercase leading-none truncate\"\n >\n @if (mobileSubtitle()) {\n <span class=\"lg:hidden\">{{ mobileSubtitle() }}</span>\n <span class=\"hidden lg:inline\">{{ subtitle() }}</span>\n } @else {\n {{ subtitle() }}\n }\n </div>\n </div>\n }\n </div>\n </div>\n\n <div class=\"flex items-center justify-end gap-3 min-w-0\">\n <ng-content select=\"[actions]\"></ng-content>\n\n @if (envName !== 'prod' && !hideEnvBadge() && !isCapacitorNative) {\n <span\n class=\"hidden sm:flex flex-none items-center justify-center w-9 h-9 rounded-xl border text-[9px] font-black tracking-[0.1em] select-none\"\n [class.bg-amber-500/10]=\"envName === 'dev'\"\n [class.border-amber-500/20]=\"envName === 'dev'\"\n [class.text-amber-500]=\"envName === 'dev'\"\n [class.bg-orange-500/10]=\"envName === 'uat'\"\n [class.border-orange-500/20]=\"envName === 'uat'\"\n [class.text-orange-500]=\"envName === 'uat'\"\n [title]=\"envName\"\n >{{ envName }}</span>\n }\n\n @if (showChat()) {\n <button\n (click)=\"chatClick.emit()\"\n class=\"relative flex-none flex items-center justify-center w-9 h-9 bg-zinc-900/40 rounded-xl border border-white/5 hover:bg-zinc-800 active:scale-95 transition-all\"\n type=\"button\"\n [attr.aria-label]=\"t('CHAT')\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" class=\"w-4 h-4\">\n <path d=\"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H5.17L4 17.17V4h16v12z\"/>\n </svg>\n @if (unreadChatMessages() > 0) {\n <span\n class=\"absolute -top-1 -right-1 min-w-[16px] h-4 px-1 bg-green-500 rounded-full text-[8px] font-bold text-white flex items-center justify-center\"\n [attr.aria-label]=\"unreadChatMessages() + ' ' + t('UNREAD_MESSAGES')\"\n >\n {{ unreadChatMessages() > 9 ? '9+' : unreadChatMessages() }}\n </span>\n }\n </button>\n }\n\n @if (showNotifications()) {\n <xs-button\n (onClick)=\"notificationsClick.emit()\"\n icon=\"bell\"\n layout=\"iconOnly\"\n variant=\"custom\"\n customClass=\"w-9 h-9 bg-zinc-900/40 rounded-xl border border-white/5 hover:bg-zinc-800 active:scale-95\"\n [title]=\"t('NOTIFICATIONS')\"\n [badgeCount]=\"unreadNotifications()\"\n />\n }\n\n @if (showImpersonation()) {\n <button\n (click)=\"impersonationClick.emit()\"\n class=\"flex-none flex items-center justify-center w-9 h-9 bg-amber-500/10 rounded-xl border border-amber-500/20 hover:bg-amber-500/20 active:scale-95 transition-all\"\n type=\"button\"\n [attr.aria-label]=\"t('BACK_TO_ADMIN')\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" class=\"w-4 h-4 text-amber-500\">\n <path d=\"M12 1L3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5l-9-4zm0 10.99h7c-.53 4.12-3.28 7.79-7 8.94V12H5V6.3l7-3.11v8.8z\"/>\n </svg>\n </button>\n }\n\n @if (showLanguage()) {\n <button\n (click)=\"onToggleLang()\"\n class=\"flex-none flex items-center justify-center w-9 h-9 bg-zinc-900/40 rounded-xl border border-white/5 hover:bg-zinc-800 active:scale-95 transition-all\"\n type=\"button\"\n [attr.aria-label]=\"t('SWITCH_LANG_TO') + ' ' + (langSignal() === 'es' ? t('ENGLISH') : t('SPANISH'))\"\n >\n <img\n [src]=\"\n langSignal() === 'es'\n ? ('es' | countryFlag)\n : ('us' | countryFlag)\n \"\n class=\"w-4 h-3 object-cover rounded-[1px] shadow-sm\"\n [alt]=\"langSignal() === 'es' ? t('SPANISH') : t('ENGLISH')\"\n />\n </button>\n }\n </div>\n </div>\n\n @if (hasBottom) {\n <div\n class=\"mt-6 animate-in fade-in slide-in-from-top-2 duration-700\"\n >\n <ng-content select=\"[bottom]\"></ng-content>\n </div>\n }\n </div>\n</header>\n}\n", styles: [":host{display:block;width:100%}:host(.sticky){position:sticky}header{-webkit-backdrop-filter:blur(20px)}button:focus-visible{outline:2px solid rgb(113 113 122);outline-offset:2px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: XSButtonComponent, selector: "xs-button", inputs: ["id", "label", "type", "icon", "action", "customClass", "variant", "layout", "badgeCount", "isFull", "disabled", "loading", "title", "ariaLabel", "borderRadius", "isGrouped", "groupPosition"], outputs: ["isGroupedChange", "groupPositionChange", "click", "onClick"] }, { kind: "pipe", type: CountryFlagPipe, name: "countryFlag" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
16083
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: XSNavbarComponent, isStandalone: true, selector: "xs-navbar", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, mobileTitle: { classPropertyName: "mobileTitle", publicName: "mobileTitle", isSignal: true, isRequired: false, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null }, mobileSubtitle: { classPropertyName: "mobileSubtitle", publicName: "mobileSubtitle", isSignal: true, isRequired: false, transformFunction: null }, showBorder: { classPropertyName: "showBorder", publicName: "showBorder", isSignal: true, isRequired: false, transformFunction: null }, transparent: { classPropertyName: "transparent", publicName: "transparent", isSignal: true, isRequired: false, transformFunction: null }, sticky: { classPropertyName: "sticky", publicName: "sticky", isSignal: true, isRequired: false, transformFunction: null }, showBack: { classPropertyName: "showBack", publicName: "showBack", isSignal: true, isRequired: false, transformFunction: null }, showMenu: { classPropertyName: "showMenu", publicName: "showMenu", isSignal: true, isRequired: false, transformFunction: null }, menuIcon: { classPropertyName: "menuIcon", publicName: "menuIcon", isSignal: true, isRequired: false, transformFunction: null }, showLanguage: { classPropertyName: "showLanguage", publicName: "showLanguage", isSignal: true, isRequired: false, transformFunction: null }, showNotifications: { classPropertyName: "showNotifications", publicName: "showNotifications", isSignal: true, isRequired: false, transformFunction: null }, showChat: { classPropertyName: "showChat", publicName: "showChat", isSignal: true, isRequired: false, transformFunction: null }, showImpersonation: { classPropertyName: "showImpersonation", publicName: "showImpersonation", isSignal: true, isRequired: false, transformFunction: null }, unreadChatMessages: { classPropertyName: "unreadChatMessages", publicName: "unreadChatMessages", isSignal: true, isRequired: false, transformFunction: null }, unreadNotifications: { classPropertyName: "unreadNotifications", publicName: "unreadNotifications", isSignal: true, isRequired: false, transformFunction: null }, homeRoute: { classPropertyName: "homeRoute", publicName: "homeRoute", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, hidden: { classPropertyName: "hidden", publicName: "hidden", isSignal: true, isRequired: false, transformFunction: null }, hideEnvBadge: { classPropertyName: "hideEnvBadge", publicName: "hideEnvBadge", isSignal: true, isRequired: false, transformFunction: null }, maxWidth: { classPropertyName: "maxWidth", publicName: "maxWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { back: "back", menuToggle: "menuToggle", titleClick: "titleClick", notificationsClick: "notificationsClick", chatClick: "chatClick", impersonationClick: "impersonationClick" }, host: { attributes: { "role": "banner" }, properties: { "class.sticky": "sticky()", "class.top-0": "sticky()", "class.z-50": "sticky()" } }, queries: [{ propertyName: "bottomContent", first: true, predicate: ["[bottom]"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "@if (!hidden()) {\n<header\n [class.bg-black/80]=\"!transparent()\"\n [class.backdrop-blur-xl]=\"!transparent()\"\n class=\"ease-in-out transition-all duration-300\"\n [attr.aria-label]=\"ariaLabel() || title()\"\n>\n <div\n class=\"mx-auto px-4 pt-3 pb-2\"\n [class.border-b]=\"showBorder()\"\n [class.border-white/5]=\"showBorder()\"\n [style.max-width]=\"maxWidth()\"\n >\n <div class=\"flex items-center justify-between gap-4 w-full\">\n <div class=\"flex items-center min-w-0 flex-1\">\n @if (showLeftButton) {\n <xs-button\n (onClick)=\"showBack() ? back.emit() : menuToggle.emit()\"\n [icon]=\"{ name: showBack() ? 'arrow-left' : (menuIcon()) }\"\n layout=\"iconOnlyHeader\"\n variant=\"custom\"\n customClass=\"flex-none p-2 -ml-2 text-zinc-400 hover:text-white active:scale-90 rounded-xl hover:bg-zinc-900/50\"\n [title]=\"showBack() ? t('GO_BACK') : t('OPEN_MENU')\"\n />\n }\n\n <div class=\"navbar-leading lg:hidden flex-none\">\n <ng-content select=\"[leading]\"></ng-content>\n </div>\n\n <div class=\"navbar-title-wrap flex flex-col min-w-0 flex-1\">\n <a\n [routerLink]=\"homeRoute()\"\n (click)=\"titleClick.emit()\"\n class=\"navbar-default-title inline-block text-2xl sm:text-3xl font-black tracking-[0.01em] text-white uppercase leading-none truncate transition-[letter-spacing_0.5s_ease-out,color_0.2s_ease] hover:tracking-[0.05em] hover:text-zinc-300 will-change-[letter-spacing] no-underline\"\n [attr.aria-label]=\"t('GO_TO') + ' ' + (homeRoute() || t('HOME'))\"\n >\n @if (mobileTitle()) {\n <span class=\"lg:hidden\">{{ mobileTitle() }}</span>\n <span class=\"hidden lg:inline\">{{ title() }}</span>\n } @else {\n {{ title() }}\n }\n </a>\n\n @if (subtitle()) {\n <div\n class=\"navbar-default-subtitle flex items-center gap-2 mt-1 animate-in fade-in slide-in-from-left-2 duration-500 min-w-0\"\n >\n <div\n class=\"text-zinc-400 text-[10px] font-black tracking-[0.2em] uppercase leading-none truncate\"\n >\n @if (mobileSubtitle()) {\n <span class=\"lg:hidden\">{{ mobileSubtitle() }}</span>\n <span class=\"hidden lg:inline\">{{ subtitle() }}</span>\n } @else {\n {{ subtitle() }}\n }\n </div>\n </div>\n }\n </div>\n </div>\n\n <div class=\"flex items-center justify-end gap-3 min-w-0\">\n <ng-content select=\"[actions]\"></ng-content>\n\n @if (envName !== 'prod' && !hideEnvBadge() && !isCapacitorNative) {\n <span\n class=\"hidden sm:flex flex-none items-center justify-center w-9 h-9 rounded-xl border text-[9px] font-black tracking-[0.1em] select-none\"\n [class.bg-amber-500/10]=\"envName === 'dev'\"\n [class.border-amber-500/20]=\"envName === 'dev'\"\n [class.text-amber-500]=\"envName === 'dev'\"\n [class.bg-orange-500/10]=\"envName === 'uat'\"\n [class.border-orange-500/20]=\"envName === 'uat'\"\n [class.text-orange-500]=\"envName === 'uat'\"\n [title]=\"envName\"\n >{{ envName }}</span>\n }\n\n @if (showChat()) {\n <button\n (click)=\"chatClick.emit()\"\n class=\"relative flex-none flex items-center justify-center w-9 h-9 bg-zinc-900/40 rounded-xl border border-white/5 hover:bg-zinc-800 active:scale-95 transition-all\"\n type=\"button\"\n [attr.aria-label]=\"t('CHAT')\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" class=\"w-4 h-4\">\n <path d=\"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H5.17L4 17.17V4h16v12z\"/>\n </svg>\n @if (unreadChatMessages() > 0) {\n <span\n class=\"absolute -top-1 -right-1 min-w-[16px] h-4 px-1 bg-green-500 rounded-full text-[8px] font-bold text-white flex items-center justify-center\"\n [attr.aria-label]=\"unreadChatMessages() + ' ' + t('UNREAD_MESSAGES')\"\n >\n {{ unreadChatMessages() > 9 ? '9+' : unreadChatMessages() }}\n </span>\n }\n </button>\n }\n\n @if (showNotifications()) {\n <xs-button\n (onClick)=\"notificationsClick.emit()\"\n icon=\"bell\"\n layout=\"iconOnly\"\n variant=\"custom\"\n customClass=\"w-9 h-9 bg-zinc-900/40 rounded-xl border border-white/5 hover:bg-zinc-800 active:scale-95\"\n [title]=\"t('NOTIFICATIONS')\"\n [badgeCount]=\"unreadNotifications()\"\n />\n }\n\n @if (showImpersonation()) {\n <button\n (click)=\"impersonationClick.emit()\"\n class=\"flex-none flex items-center justify-center w-9 h-9 bg-amber-500/10 rounded-xl border border-amber-500/20 hover:bg-amber-500/20 active:scale-95 transition-all\"\n type=\"button\"\n [attr.aria-label]=\"t('BACK_TO_ADMIN')\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" class=\"w-4 h-4 text-amber-500\">\n <path d=\"M12 1L3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5l-9-4zm0 10.99h7c-.53 4.12-3.28 7.79-7 8.94V12H5V6.3l7-3.11v8.8z\"/>\n </svg>\n </button>\n }\n\n @if (showLanguage()) {\n <button\n (click)=\"onToggleLang()\"\n class=\"flex-none flex items-center justify-center w-9 h-9 bg-zinc-900/40 rounded-xl border border-white/5 hover:bg-zinc-800 active:scale-95 transition-all\"\n type=\"button\"\n [attr.aria-label]=\"t('SWITCH_LANG_TO') + ' ' + (langSignal() === 'es' ? t('ENGLISH') : t('SPANISH'))\"\n >\n <img\n [src]=\"\n langSignal() === 'es'\n ? ('es' | countryFlag)\n : ('us' | countryFlag)\n \"\n class=\"w-4 h-3 object-cover rounded-[1px] shadow-sm\"\n [alt]=\"langSignal() === 'es' ? t('SPANISH') : t('ENGLISH')\"\n />\n </button>\n }\n </div>\n </div>\n\n @if (hasBottom) {\n <div\n class=\"mt-6 animate-in fade-in slide-in-from-top-2 duration-700\"\n >\n <ng-content select=\"[bottom]\"></ng-content>\n </div>\n }\n </div>\n</header>\n}\n", styles: [":host{display:block;width:100%}:host(.sticky){position:sticky}header{-webkit-backdrop-filter:blur(20px)}button:focus-visible{outline:2px solid rgb(113 113 122);outline-offset:2px}@media(max-width:1023.98px){.navbar-leading:has(>*)+.navbar-title-wrap .navbar-default-title{font-size:1rem;line-height:1.25rem;letter-spacing:.01em}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: XSButtonComponent, selector: "xs-button", inputs: ["id", "label", "type", "icon", "action", "customClass", "variant", "layout", "badgeCount", "isFull", "disabled", "loading", "title", "ariaLabel", "borderRadius", "isGrouped", "groupPosition"], outputs: ["isGroupedChange", "groupPositionChange", "click", "onClick"] }, { kind: "pipe", type: CountryFlagPipe, name: "countryFlag" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
16125
16084
  }
16126
16085
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: XSNavbarComponent, decorators: [{
16127
16086
  type: Component,
@@ -16135,7 +16094,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImpo
16135
16094
  '[class.sticky]': 'sticky()',
16136
16095
  '[class.top-0]': 'sticky()',
16137
16096
  '[class.z-50]': 'sticky()',
16138
- }, changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (!hidden()) {\n<header\n [class.bg-black/80]=\"!transparent()\"\n [class.backdrop-blur-xl]=\"!transparent()\"\n class=\"ease-in-out transition-all duration-300\"\n [attr.aria-label]=\"ariaLabel() || title()\"\n>\n <div\n class=\"mx-auto px-4 pt-3 pb-2\"\n [class.border-b]=\"showBorder()\"\n [class.border-white/5]=\"showBorder()\"\n [style.max-width]=\"maxWidth()\"\n >\n <div class=\"flex items-center justify-between gap-4 w-full\">\n <div class=\"flex items-center min-w-0 flex-1\">\n @if (showLeftButton) {\n <xs-button\n (onClick)=\"showBack() ? back.emit() : menuToggle.emit()\"\n [icon]=\"{ name: showBack() ? 'arrow-left' : (menuIcon()) }\"\n layout=\"iconOnlyHeader\"\n variant=\"custom\"\n customClass=\"flex-none p-2 -ml-2 text-zinc-400 hover:text-white active:scale-90 rounded-xl hover:bg-zinc-900/50\"\n [title]=\"showBack() ? t('GO_BACK') : t('OPEN_MENU')\"\n />\n }\n\n <div class=\"flex flex-col min-w-0 flex-1\">\n <a\n [routerLink]=\"homeRoute()\"\n (click)=\"titleClick.emit()\"\n class=\"inline-block text-2xl sm:text-3xl font-black tracking-[0.01em] text-white uppercase leading-none truncate transition-[letter-spacing_0.5s_ease-out,color_0.2s_ease] hover:tracking-[0.05em] hover:text-zinc-300 will-change-[letter-spacing] no-underline\"\n [attr.aria-label]=\"t('GO_TO') + ' ' + (homeRoute() || t('HOME'))\"\n >\n @if (mobileTitle()) {\n <span class=\"lg:hidden\">{{ mobileTitle() }}</span>\n <span class=\"hidden lg:inline\">{{ title() }}</span>\n } @else {\n {{ title() }}\n }\n </a>\n\n @if (subtitle()) {\n <div\n class=\"flex items-center gap-2 mt-1 animate-in fade-in slide-in-from-left-2 duration-500 min-w-0\"\n >\n <div\n class=\"text-zinc-400 text-[10px] font-black tracking-[0.2em] uppercase leading-none truncate\"\n >\n @if (mobileSubtitle()) {\n <span class=\"lg:hidden\">{{ mobileSubtitle() }}</span>\n <span class=\"hidden lg:inline\">{{ subtitle() }}</span>\n } @else {\n {{ subtitle() }}\n }\n </div>\n </div>\n }\n </div>\n </div>\n\n <div class=\"flex items-center justify-end gap-3 min-w-0\">\n <ng-content select=\"[actions]\"></ng-content>\n\n @if (envName !== 'prod' && !hideEnvBadge() && !isCapacitorNative) {\n <span\n class=\"hidden sm:flex flex-none items-center justify-center w-9 h-9 rounded-xl border text-[9px] font-black tracking-[0.1em] select-none\"\n [class.bg-amber-500/10]=\"envName === 'dev'\"\n [class.border-amber-500/20]=\"envName === 'dev'\"\n [class.text-amber-500]=\"envName === 'dev'\"\n [class.bg-orange-500/10]=\"envName === 'uat'\"\n [class.border-orange-500/20]=\"envName === 'uat'\"\n [class.text-orange-500]=\"envName === 'uat'\"\n [title]=\"envName\"\n >{{ envName }}</span>\n }\n\n @if (showChat()) {\n <button\n (click)=\"chatClick.emit()\"\n class=\"relative flex-none flex items-center justify-center w-9 h-9 bg-zinc-900/40 rounded-xl border border-white/5 hover:bg-zinc-800 active:scale-95 transition-all\"\n type=\"button\"\n [attr.aria-label]=\"t('CHAT')\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" class=\"w-4 h-4\">\n <path d=\"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H5.17L4 17.17V4h16v12z\"/>\n </svg>\n @if (unreadChatMessages() > 0) {\n <span\n class=\"absolute -top-1 -right-1 min-w-[16px] h-4 px-1 bg-green-500 rounded-full text-[8px] font-bold text-white flex items-center justify-center\"\n [attr.aria-label]=\"unreadChatMessages() + ' ' + t('UNREAD_MESSAGES')\"\n >\n {{ unreadChatMessages() > 9 ? '9+' : unreadChatMessages() }}\n </span>\n }\n </button>\n }\n\n @if (showNotifications()) {\n <xs-button\n (onClick)=\"notificationsClick.emit()\"\n icon=\"bell\"\n layout=\"iconOnly\"\n variant=\"custom\"\n customClass=\"w-9 h-9 bg-zinc-900/40 rounded-xl border border-white/5 hover:bg-zinc-800 active:scale-95\"\n [title]=\"t('NOTIFICATIONS')\"\n [badgeCount]=\"unreadNotifications()\"\n />\n }\n\n @if (showImpersonation()) {\n <button\n (click)=\"impersonationClick.emit()\"\n class=\"flex-none flex items-center justify-center w-9 h-9 bg-amber-500/10 rounded-xl border border-amber-500/20 hover:bg-amber-500/20 active:scale-95 transition-all\"\n type=\"button\"\n [attr.aria-label]=\"t('BACK_TO_ADMIN')\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" class=\"w-4 h-4 text-amber-500\">\n <path d=\"M12 1L3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5l-9-4zm0 10.99h7c-.53 4.12-3.28 7.79-7 8.94V12H5V6.3l7-3.11v8.8z\"/>\n </svg>\n </button>\n }\n\n @if (showLanguage()) {\n <button\n (click)=\"onToggleLang()\"\n class=\"flex-none flex items-center justify-center w-9 h-9 bg-zinc-900/40 rounded-xl border border-white/5 hover:bg-zinc-800 active:scale-95 transition-all\"\n type=\"button\"\n [attr.aria-label]=\"t('SWITCH_LANG_TO') + ' ' + (langSignal() === 'es' ? t('ENGLISH') : t('SPANISH'))\"\n >\n <img\n [src]=\"\n langSignal() === 'es'\n ? ('es' | countryFlag)\n : ('us' | countryFlag)\n \"\n class=\"w-4 h-3 object-cover rounded-[1px] shadow-sm\"\n [alt]=\"langSignal() === 'es' ? t('SPANISH') : t('ENGLISH')\"\n />\n </button>\n }\n </div>\n </div>\n\n @if (hasBottom) {\n <div\n class=\"mt-6 animate-in fade-in slide-in-from-top-2 duration-700\"\n >\n <ng-content select=\"[bottom]\"></ng-content>\n </div>\n }\n </div>\n</header>\n}\n", styles: [":host{display:block;width:100%}:host(.sticky){position:sticky}header{-webkit-backdrop-filter:blur(20px)}button:focus-visible{outline:2px solid rgb(113 113 122);outline-offset:2px}\n"] }]
16097
+ }, changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (!hidden()) {\n<header\n [class.bg-black/80]=\"!transparent()\"\n [class.backdrop-blur-xl]=\"!transparent()\"\n class=\"ease-in-out transition-all duration-300\"\n [attr.aria-label]=\"ariaLabel() || title()\"\n>\n <div\n class=\"mx-auto px-4 pt-3 pb-2\"\n [class.border-b]=\"showBorder()\"\n [class.border-white/5]=\"showBorder()\"\n [style.max-width]=\"maxWidth()\"\n >\n <div class=\"flex items-center justify-between gap-4 w-full\">\n <div class=\"flex items-center min-w-0 flex-1\">\n @if (showLeftButton) {\n <xs-button\n (onClick)=\"showBack() ? back.emit() : menuToggle.emit()\"\n [icon]=\"{ name: showBack() ? 'arrow-left' : (menuIcon()) }\"\n layout=\"iconOnlyHeader\"\n variant=\"custom\"\n customClass=\"flex-none p-2 -ml-2 text-zinc-400 hover:text-white active:scale-90 rounded-xl hover:bg-zinc-900/50\"\n [title]=\"showBack() ? t('GO_BACK') : t('OPEN_MENU')\"\n />\n }\n\n <div class=\"navbar-leading lg:hidden flex-none\">\n <ng-content select=\"[leading]\"></ng-content>\n </div>\n\n <div class=\"navbar-title-wrap flex flex-col min-w-0 flex-1\">\n <a\n [routerLink]=\"homeRoute()\"\n (click)=\"titleClick.emit()\"\n class=\"navbar-default-title inline-block text-2xl sm:text-3xl font-black tracking-[0.01em] text-white uppercase leading-none truncate transition-[letter-spacing_0.5s_ease-out,color_0.2s_ease] hover:tracking-[0.05em] hover:text-zinc-300 will-change-[letter-spacing] no-underline\"\n [attr.aria-label]=\"t('GO_TO') + ' ' + (homeRoute() || t('HOME'))\"\n >\n @if (mobileTitle()) {\n <span class=\"lg:hidden\">{{ mobileTitle() }}</span>\n <span class=\"hidden lg:inline\">{{ title() }}</span>\n } @else {\n {{ title() }}\n }\n </a>\n\n @if (subtitle()) {\n <div\n class=\"navbar-default-subtitle flex items-center gap-2 mt-1 animate-in fade-in slide-in-from-left-2 duration-500 min-w-0\"\n >\n <div\n class=\"text-zinc-400 text-[10px] font-black tracking-[0.2em] uppercase leading-none truncate\"\n >\n @if (mobileSubtitle()) {\n <span class=\"lg:hidden\">{{ mobileSubtitle() }}</span>\n <span class=\"hidden lg:inline\">{{ subtitle() }}</span>\n } @else {\n {{ subtitle() }}\n }\n </div>\n </div>\n }\n </div>\n </div>\n\n <div class=\"flex items-center justify-end gap-3 min-w-0\">\n <ng-content select=\"[actions]\"></ng-content>\n\n @if (envName !== 'prod' && !hideEnvBadge() && !isCapacitorNative) {\n <span\n class=\"hidden sm:flex flex-none items-center justify-center w-9 h-9 rounded-xl border text-[9px] font-black tracking-[0.1em] select-none\"\n [class.bg-amber-500/10]=\"envName === 'dev'\"\n [class.border-amber-500/20]=\"envName === 'dev'\"\n [class.text-amber-500]=\"envName === 'dev'\"\n [class.bg-orange-500/10]=\"envName === 'uat'\"\n [class.border-orange-500/20]=\"envName === 'uat'\"\n [class.text-orange-500]=\"envName === 'uat'\"\n [title]=\"envName\"\n >{{ envName }}</span>\n }\n\n @if (showChat()) {\n <button\n (click)=\"chatClick.emit()\"\n class=\"relative flex-none flex items-center justify-center w-9 h-9 bg-zinc-900/40 rounded-xl border border-white/5 hover:bg-zinc-800 active:scale-95 transition-all\"\n type=\"button\"\n [attr.aria-label]=\"t('CHAT')\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" class=\"w-4 h-4\">\n <path d=\"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H5.17L4 17.17V4h16v12z\"/>\n </svg>\n @if (unreadChatMessages() > 0) {\n <span\n class=\"absolute -top-1 -right-1 min-w-[16px] h-4 px-1 bg-green-500 rounded-full text-[8px] font-bold text-white flex items-center justify-center\"\n [attr.aria-label]=\"unreadChatMessages() + ' ' + t('UNREAD_MESSAGES')\"\n >\n {{ unreadChatMessages() > 9 ? '9+' : unreadChatMessages() }}\n </span>\n }\n </button>\n }\n\n @if (showNotifications()) {\n <xs-button\n (onClick)=\"notificationsClick.emit()\"\n icon=\"bell\"\n layout=\"iconOnly\"\n variant=\"custom\"\n customClass=\"w-9 h-9 bg-zinc-900/40 rounded-xl border border-white/5 hover:bg-zinc-800 active:scale-95\"\n [title]=\"t('NOTIFICATIONS')\"\n [badgeCount]=\"unreadNotifications()\"\n />\n }\n\n @if (showImpersonation()) {\n <button\n (click)=\"impersonationClick.emit()\"\n class=\"flex-none flex items-center justify-center w-9 h-9 bg-amber-500/10 rounded-xl border border-amber-500/20 hover:bg-amber-500/20 active:scale-95 transition-all\"\n type=\"button\"\n [attr.aria-label]=\"t('BACK_TO_ADMIN')\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" class=\"w-4 h-4 text-amber-500\">\n <path d=\"M12 1L3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5l-9-4zm0 10.99h7c-.53 4.12-3.28 7.79-7 8.94V12H5V6.3l7-3.11v8.8z\"/>\n </svg>\n </button>\n }\n\n @if (showLanguage()) {\n <button\n (click)=\"onToggleLang()\"\n class=\"flex-none flex items-center justify-center w-9 h-9 bg-zinc-900/40 rounded-xl border border-white/5 hover:bg-zinc-800 active:scale-95 transition-all\"\n type=\"button\"\n [attr.aria-label]=\"t('SWITCH_LANG_TO') + ' ' + (langSignal() === 'es' ? t('ENGLISH') : t('SPANISH'))\"\n >\n <img\n [src]=\"\n langSignal() === 'es'\n ? ('es' | countryFlag)\n : ('us' | countryFlag)\n \"\n class=\"w-4 h-3 object-cover rounded-[1px] shadow-sm\"\n [alt]=\"langSignal() === 'es' ? t('SPANISH') : t('ENGLISH')\"\n />\n </button>\n }\n </div>\n </div>\n\n @if (hasBottom) {\n <div\n class=\"mt-6 animate-in fade-in slide-in-from-top-2 duration-700\"\n >\n <ng-content select=\"[bottom]\"></ng-content>\n </div>\n }\n </div>\n</header>\n}\n", styles: [":host{display:block;width:100%}:host(.sticky){position:sticky}header{-webkit-backdrop-filter:blur(20px)}button:focus-visible{outline:2px solid rgb(113 113 122);outline-offset:2px}@media(max-width:1023.98px){.navbar-leading:has(>*)+.navbar-title-wrap .navbar-default-title{font-size:1rem;line-height:1.25rem;letter-spacing:.01em}}\n"] }]
16139
16098
  }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], mobileTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "mobileTitle", required: false }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], mobileSubtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "mobileSubtitle", required: false }] }], showBorder: [{ type: i0.Input, args: [{ isSignal: true, alias: "showBorder", required: false }] }], transparent: [{ type: i0.Input, args: [{ isSignal: true, alias: "transparent", required: false }] }], sticky: [{ type: i0.Input, args: [{ isSignal: true, alias: "sticky", required: false }] }], showBack: [{ type: i0.Input, args: [{ isSignal: true, alias: "showBack", required: false }] }], showMenu: [{ type: i0.Input, args: [{ isSignal: true, alias: "showMenu", required: false }] }], menuIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "menuIcon", required: false }] }], showLanguage: [{ type: i0.Input, args: [{ isSignal: true, alias: "showLanguage", required: false }] }], showNotifications: [{ type: i0.Input, args: [{ isSignal: true, alias: "showNotifications", required: false }] }], showChat: [{ type: i0.Input, args: [{ isSignal: true, alias: "showChat", required: false }] }], showImpersonation: [{ type: i0.Input, args: [{ isSignal: true, alias: "showImpersonation", required: false }] }], unreadChatMessages: [{ type: i0.Input, args: [{ isSignal: true, alias: "unreadChatMessages", required: false }] }], unreadNotifications: [{ type: i0.Input, args: [{ isSignal: true, alias: "unreadNotifications", required: false }] }], homeRoute: [{ type: i0.Input, args: [{ isSignal: true, alias: "homeRoute", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], hidden: [{ type: i0.Input, args: [{ isSignal: true, alias: "hidden", required: false }] }], hideEnvBadge: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideEnvBadge", required: false }] }], maxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxWidth", required: false }] }], back: [{ type: i0.Output, args: ["back"] }], menuToggle: [{ type: i0.Output, args: ["menuToggle"] }], titleClick: [{ type: i0.Output, args: ["titleClick"] }], notificationsClick: [{ type: i0.Output, args: ["notificationsClick"] }], chatClick: [{ type: i0.Output, args: ["chatClick"] }], impersonationClick: [{ type: i0.Output, args: ["impersonationClick"] }], bottomContent: [{ type: i0.ContentChild, args: ['[bottom]', { ...{
16140
16099
  read: ElementRef,
16141
16100
  }, isSignal: true }] }] } });
@@ -16545,7 +16504,6 @@ class OnImageErrorDirective {
16545
16504
  el.src = this.defaultImagePath;
16546
16505
  return;
16547
16506
  }
16548
- // Generar avatar con iniciales
16549
16507
  el.src = this.avatarService.generateAvatar(nameForAvatar);
16550
16508
  }
16551
16509
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: OnImageErrorDirective, deps: [{ token: i0.ElementRef }, { token: XS_DEFAULT_IMAGE_PATH }, { token: XSAvatarService }], target: i0.ɵɵFactoryTarget.Directive });
@@ -16802,7 +16760,7 @@ class XSItemTypeUserComponent extends XSItemTypeBaseComponent {
16802
16760
  return typeof type === 'string' ? type : '';
16803
16761
  }
16804
16762
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: XSItemTypeUserComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
16805
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: XSItemTypeUserComponent, isStandalone: true, selector: "xs-item-type-user", host: { attributes: { "xs-item-type-user-host": "" } }, usesInheritance: true, ngImport: i0, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <!-- Imagen del usuario -->\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n <xs-image\n [src]=\"item() | imageApi: 'user' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ item()['name'] }}\n </span>\n </h3>\n\n <!-- Second line content -->\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <img\n [src]=\"getCountryCode() | countryFlag\"\n [alt]=\"getCountryName()\"\n class=\"flex-shrink-0 w-3 h-3 rounded-sm \"\n />\n <span class=\"flex-1 truncate\">\n {{ getItemType() | XSTypeUser }}\n </span>\n </div>\n </div>\n </div>\n\n <!-- Value/Unit display -->\n @if (\n item()['value'] !== undefined && item()['unit']\n ) {\n <div class=\"flex items-center text-right mr-2\">\n <span class=\"text-white font-semibold text-sm\">\n {{ item()['value'] }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ item()['unit'] }}\n </span>\n </div>\n }\n\n <!-- Chevron / loading spinner -->\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n item()['value'] !== undefined && item()['unit']\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n ", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: XSImageComponent, selector: "xs-image", inputs: ["config", "viewTransitionName", "src", "alt", "width", "height", "size", "rounded", "objectFit", "clickable", "item", "typeItem", "imageType", "fallbackSrc", "loading", "priority", "customClass", "generateAvatar"], outputs: ["onClick", "onLoad", "onError"] }, { kind: "component", type: XSIconComponent, selector: "xs-icon", inputs: ["icon", "size", "class"] }, { kind: "pipe", type: XSTypeUserPipe, name: "XSTypeUser" }, { kind: "pipe", type: ImageApiPipe, name: "imageApi" }, { kind: "pipe", type: CountryFlagPipe, name: "countryFlag" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
16763
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: XSItemTypeUserComponent, isStandalone: true, selector: "xs-item-type-user", host: { attributes: { "xs-item-type-user-host": "" } }, usesInheritance: true, ngImport: i0, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n <xs-image\n [src]=\"item() | imageApi: 'user' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ item()['name'] }}\n </span>\n </h3>\n\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <img\n [src]=\"getCountryCode() | countryFlag\"\n [alt]=\"getCountryName()\"\n class=\"flex-shrink-0 w-3 h-3 rounded-sm \"\n />\n <span class=\"flex-1 truncate\">\n {{ getItemType() | XSTypeUser }}\n </span>\n </div>\n </div>\n </div>\n\n @if (\n item()['value'] !== undefined && item()['unit']\n ) {\n <div class=\"flex items-center text-right mr-2\">\n <span class=\"text-white font-semibold text-sm\">\n {{ item()['value'] }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ item()['unit'] }}\n </span>\n </div>\n }\n\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n item()['value'] !== undefined && item()['unit']\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n ", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: XSImageComponent, selector: "xs-image", inputs: ["config", "viewTransitionName", "src", "alt", "width", "height", "size", "rounded", "objectFit", "clickable", "item", "typeItem", "imageType", "fallbackSrc", "loading", "priority", "customClass", "generateAvatar"], outputs: ["onClick", "onLoad", "onError"] }, { kind: "component", type: XSIconComponent, selector: "xs-icon", inputs: ["icon", "size", "class"] }, { kind: "pipe", type: XSTypeUserPipe, name: "XSTypeUser" }, { kind: "pipe", type: ImageApiPipe, name: "imageApi" }, { kind: "pipe", type: CountryFlagPipe, name: "countryFlag" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
16806
16764
  }
16807
16765
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: XSItemTypeUserComponent, decorators: [{
16808
16766
  type: Component,
@@ -16814,7 +16772,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImpo
16814
16772
  XSIconComponent,
16815
16773
  ImageApiPipe,
16816
16774
  CountryFlagPipe,
16817
- ], host: { 'xs-item-type-user-host': '' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <!-- Imagen del usuario -->\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n <xs-image\n [src]=\"item() | imageApi: 'user' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ item()['name'] }}\n </span>\n </h3>\n\n <!-- Second line content -->\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <img\n [src]=\"getCountryCode() | countryFlag\"\n [alt]=\"getCountryName()\"\n class=\"flex-shrink-0 w-3 h-3 rounded-sm \"\n />\n <span class=\"flex-1 truncate\">\n {{ getItemType() | XSTypeUser }}\n </span>\n </div>\n </div>\n </div>\n\n <!-- Value/Unit display -->\n @if (\n item()['value'] !== undefined && item()['unit']\n ) {\n <div class=\"flex items-center text-right mr-2\">\n <span class=\"text-white font-semibold text-sm\">\n {{ item()['value'] }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ item()['unit'] }}\n </span>\n </div>\n }\n\n <!-- Chevron / loading spinner -->\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n item()['value'] !== undefined && item()['unit']\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n " }]
16775
+ ], host: { 'xs-item-type-user-host': '' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n <xs-image\n [src]=\"item() | imageApi: 'user' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ item()['name'] }}\n </span>\n </h3>\n\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <img\n [src]=\"getCountryCode() | countryFlag\"\n [alt]=\"getCountryName()\"\n class=\"flex-shrink-0 w-3 h-3 rounded-sm \"\n />\n <span class=\"flex-1 truncate\">\n {{ getItemType() | XSTypeUser }}\n </span>\n </div>\n </div>\n </div>\n\n @if (\n item()['value'] !== undefined && item()['unit']\n ) {\n <div class=\"flex items-center text-right mr-2\">\n <span class=\"text-white font-semibold text-sm\">\n {{ item()['value'] }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ item()['unit'] }}\n </span>\n </div>\n }\n\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n item()['value'] !== undefined && item()['unit']\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n " }]
16818
16776
  }] });
16819
16777
 
16820
16778
  class XSItemTypeUserStatsComponent extends XSItemTypeBaseComponent {
@@ -17051,7 +17009,7 @@ class XSItemTypeTrackingComponent extends XSItemTypeBaseComponent {
17051
17009
  };
17052
17010
  }
17053
17011
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: XSItemTypeTrackingComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
17054
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: XSItemTypeTrackingComponent, isStandalone: true, selector: "xs-item-type-tracking", host: { attributes: { "xs-item-type-tracking-host": "" } }, usesInheritance: true, ngImport: i0, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <!-- Imagen para tracking -->\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n <xs-image\n [item]=\"userForImage\"\n typeItem=\"user\"\n imageType=\"small\"\n size=\"full\"\n objectFit=\"cover\"\n [generateAvatar]=\"true\"\n ></xs-image>\n </div>\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getModule() | firstLetterCase }}\n {{ getAction() }}\n </span>\n </h3>\n <!-- Second line content -->\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex items-center gap-1\">\n <!-- Bandera del pa\u00EDs del usuario si existe, o 'nd' para an\u00F3nimo -->\n\n <img\n [src]=\"getDeviceCountry() | countryFlag\"\n [alt]=\"getDeviceCountry()\"\n class=\"flex-shrink-0 w-3 h-3 rounded-sm\"\n />\n\n {{ getUserName() }}\n </span>\n </div>\n </div>\n </div>\n\n <!-- Contenido especial para tracking -->\n <div\n class=\"flex flex-col items-end justify-center gap-0 py-0 text-xs text-zinc-300\"\n >\n <span class=\"font-semibold\">{{\n item()['created'] | dateChat | firstLetterCase\n }}</span>\n <span\n class=\"font-extralight\"\n [ngClass]=\"{\n 'text-red-600': item()['isError'],\n 'text-green-500': !item()['isError'],\n }\"\n >\n {{ item()['isError'] ? 'Error' : 'OK' }}\n </span>\n </div>\n </div>\n </a>\n }\n ", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: XSImageComponent, selector: "xs-image", inputs: ["config", "viewTransitionName", "src", "alt", "width", "height", "size", "rounded", "objectFit", "clickable", "item", "typeItem", "imageType", "fallbackSrc", "loading", "priority", "customClass", "generateAvatar"], outputs: ["onClick", "onLoad", "onError"] }, { kind: "pipe", type: CountryFlagPipe, name: "countryFlag" }, { kind: "pipe", type: DateChatPipe, name: "dateChat" }, { kind: "pipe", type: XSFirstLetterPipe, name: "firstLetterCase" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
17012
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: XSItemTypeTrackingComponent, isStandalone: true, selector: "xs-item-type-tracking", host: { attributes: { "xs-item-type-tracking-host": "" } }, usesInheritance: true, ngImport: i0, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n <xs-image\n [item]=\"userForImage\"\n typeItem=\"user\"\n imageType=\"small\"\n size=\"full\"\n objectFit=\"cover\"\n [generateAvatar]=\"true\"\n ></xs-image>\n </div>\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getModule() | firstLetterCase }}\n {{ getAction() }}\n </span>\n </h3>\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex items-center gap-1\">\n\n <img\n [src]=\"getDeviceCountry() | countryFlag\"\n [alt]=\"getDeviceCountry()\"\n class=\"flex-shrink-0 w-3 h-3 rounded-sm\"\n />\n\n {{ getUserName() }}\n </span>\n </div>\n </div>\n </div>\n\n <div\n class=\"flex flex-col items-end justify-center gap-0 py-0 text-xs text-zinc-300\"\n >\n <span class=\"font-semibold\">{{\n item()['created'] | dateChat | firstLetterCase\n }}</span>\n <span\n class=\"font-extralight\"\n [ngClass]=\"{\n 'text-red-600': item()['isError'],\n 'text-green-500': !item()['isError'],\n }\"\n >\n {{ item()['isError'] ? 'Error' : 'OK' }}\n </span>\n </div>\n </div>\n </a>\n }\n ", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: XSImageComponent, selector: "xs-image", inputs: ["config", "viewTransitionName", "src", "alt", "width", "height", "size", "rounded", "objectFit", "clickable", "item", "typeItem", "imageType", "fallbackSrc", "loading", "priority", "customClass", "generateAvatar"], outputs: ["onClick", "onLoad", "onError"] }, { kind: "pipe", type: CountryFlagPipe, name: "countryFlag" }, { kind: "pipe", type: DateChatPipe, name: "dateChat" }, { kind: "pipe", type: XSFirstLetterPipe, name: "firstLetterCase" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
17055
17013
  }
17056
17014
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: XSItemTypeTrackingComponent, decorators: [{
17057
17015
  type: Component,
@@ -17062,7 +17020,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImpo
17062
17020
  DateChatPipe,
17063
17021
  XSImageComponent,
17064
17022
  XSFirstLetterPipe,
17065
- ], host: { 'xs-item-type-tracking-host': '' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <!-- Imagen para tracking -->\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n <xs-image\n [item]=\"userForImage\"\n typeItem=\"user\"\n imageType=\"small\"\n size=\"full\"\n objectFit=\"cover\"\n [generateAvatar]=\"true\"\n ></xs-image>\n </div>\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getModule() | firstLetterCase }}\n {{ getAction() }}\n </span>\n </h3>\n <!-- Second line content -->\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex items-center gap-1\">\n <!-- Bandera del pa\u00EDs del usuario si existe, o 'nd' para an\u00F3nimo -->\n\n <img\n [src]=\"getDeviceCountry() | countryFlag\"\n [alt]=\"getDeviceCountry()\"\n class=\"flex-shrink-0 w-3 h-3 rounded-sm\"\n />\n\n {{ getUserName() }}\n </span>\n </div>\n </div>\n </div>\n\n <!-- Contenido especial para tracking -->\n <div\n class=\"flex flex-col items-end justify-center gap-0 py-0 text-xs text-zinc-300\"\n >\n <span class=\"font-semibold\">{{\n item()['created'] | dateChat | firstLetterCase\n }}</span>\n <span\n class=\"font-extralight\"\n [ngClass]=\"{\n 'text-red-600': item()['isError'],\n 'text-green-500': !item()['isError'],\n }\"\n >\n {{ item()['isError'] ? 'Error' : 'OK' }}\n </span>\n </div>\n </div>\n </a>\n }\n " }]
17023
+ ], host: { 'xs-item-type-tracking-host': '' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n <xs-image\n [item]=\"userForImage\"\n typeItem=\"user\"\n imageType=\"small\"\n size=\"full\"\n objectFit=\"cover\"\n [generateAvatar]=\"true\"\n ></xs-image>\n </div>\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getModule() | firstLetterCase }}\n {{ getAction() }}\n </span>\n </h3>\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex items-center gap-1\">\n\n <img\n [src]=\"getDeviceCountry() | countryFlag\"\n [alt]=\"getDeviceCountry()\"\n class=\"flex-shrink-0 w-3 h-3 rounded-sm\"\n />\n\n {{ getUserName() }}\n </span>\n </div>\n </div>\n </div>\n\n <div\n class=\"flex flex-col items-end justify-center gap-0 py-0 text-xs text-zinc-300\"\n >\n <span class=\"font-semibold\">{{\n item()['created'] | dateChat | firstLetterCase\n }}</span>\n <span\n class=\"font-extralight\"\n [ngClass]=\"{\n 'text-red-600': item()['isError'],\n 'text-green-500': !item()['isError'],\n }\"\n >\n {{ item()['isError'] ? 'Error' : 'OK' }}\n </span>\n </div>\n </div>\n </a>\n }\n " }]
17066
17024
  }] });
17067
17025
 
17068
17026
  class XSItemTypeEventComponent extends XSItemTypeBaseComponent {
@@ -17088,7 +17046,7 @@ class XSItemTypeEventComponent extends XSItemTypeBaseComponent {
17088
17046
  });
17089
17047
  }
17090
17048
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: XSItemTypeEventComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
17091
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: XSItemTypeEventComponent, isStandalone: true, selector: "xs-item-type-event", host: { attributes: { "xs-item-type-event-host": "" } }, usesInheritance: true, ngImport: i0, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <!-- Imagen del evento -->\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n @if (!item()['imageUrl']) {\n <xs-image\n [src]=\"item() | imageApi: 'event' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (item()['imageUrl']) {\n <xs-image\n [src]=\"item()['imageUrl']\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n <!-- Fallback: icono de evento -->\n @if (!item()['imageUrl']) {\n <div\n class=\"flex items-center justify-center w-full h-full rounded-xl bg-zinc-700\"\n >\n <xs-icon\n icon=\"calendar\"\n class=\"text-zinc-400\"\n ></xs-icon>\n </div>\n }\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getItemTitle() }}\n </span>\n </h3>\n\n <!-- Second line content -->\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex-1 truncate\"> Evento </span>\n @if (item()['date']) {\n <span class=\"text-zinc-400\">\n \u2022 {{ formatDate(getItemDate()) }}\n </span>\n }\n </div>\n </div>\n </div>\n\n <!-- Value/Unit display -->\n @if (item()['value'] !== undefined && item()['unit']) {\n <div\n class=\"flex items-center text-right mr-2\"\n >\n <span class=\"text-white font-semibold text-sm\">\n {{ item()['value'] }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ item()['unit'] }}\n </span>\n </div>\n }\n\n <!-- Chevron / loading spinner -->\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n item()['value'] !== undefined && item()['unit']\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n ", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: XSImageComponent, selector: "xs-image", inputs: ["config", "viewTransitionName", "src", "alt", "width", "height", "size", "rounded", "objectFit", "clickable", "item", "typeItem", "imageType", "fallbackSrc", "loading", "priority", "customClass", "generateAvatar"], outputs: ["onClick", "onLoad", "onError"] }, { kind: "component", type: XSIconComponent, selector: "xs-icon", inputs: ["icon", "size", "class"] }, { kind: "pipe", type: ImageApiPipe, name: "imageApi" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
17049
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: XSItemTypeEventComponent, isStandalone: true, selector: "xs-item-type-event", host: { attributes: { "xs-item-type-event-host": "" } }, usesInheritance: true, ngImport: i0, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n @if (!item()['imageUrl']) {\n <xs-image\n [src]=\"item() | imageApi: 'event' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (item()['imageUrl']) {\n <xs-image\n [src]=\"item()['imageUrl']\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (!item()['imageUrl']) {\n <div\n class=\"flex items-center justify-center w-full h-full rounded-xl bg-zinc-700\"\n >\n <xs-icon\n icon=\"calendar\"\n class=\"text-zinc-400\"\n ></xs-icon>\n </div>\n }\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getItemTitle() }}\n </span>\n </h3>\n\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex-1 truncate\"> Evento </span>\n @if (item()['date']) {\n <span class=\"text-zinc-400\">\n \u2022 {{ formatDate(getItemDate()) }}\n </span>\n }\n </div>\n </div>\n </div>\n\n @if (item()['value'] !== undefined && item()['unit']) {\n <div\n class=\"flex items-center text-right mr-2\"\n >\n <span class=\"text-white font-semibold text-sm\">\n {{ item()['value'] }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ item()['unit'] }}\n </span>\n </div>\n }\n\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n item()['value'] !== undefined && item()['unit']\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n ", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: XSImageComponent, selector: "xs-image", inputs: ["config", "viewTransitionName", "src", "alt", "width", "height", "size", "rounded", "objectFit", "clickable", "item", "typeItem", "imageType", "fallbackSrc", "loading", "priority", "customClass", "generateAvatar"], outputs: ["onClick", "onLoad", "onError"] }, { kind: "component", type: XSIconComponent, selector: "xs-icon", inputs: ["icon", "size", "class"] }, { kind: "pipe", type: ImageApiPipe, name: "imageApi" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
17092
17050
  }
17093
17051
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: XSItemTypeEventComponent, decorators: [{
17094
17052
  type: Component,
@@ -17098,7 +17056,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImpo
17098
17056
  ImageApiPipe,
17099
17057
  XSImageComponent,
17100
17058
  XSIconComponent,
17101
- ], host: { 'xs-item-type-event-host': '' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <!-- Imagen del evento -->\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n @if (!item()['imageUrl']) {\n <xs-image\n [src]=\"item() | imageApi: 'event' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (item()['imageUrl']) {\n <xs-image\n [src]=\"item()['imageUrl']\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n <!-- Fallback: icono de evento -->\n @if (!item()['imageUrl']) {\n <div\n class=\"flex items-center justify-center w-full h-full rounded-xl bg-zinc-700\"\n >\n <xs-icon\n icon=\"calendar\"\n class=\"text-zinc-400\"\n ></xs-icon>\n </div>\n }\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getItemTitle() }}\n </span>\n </h3>\n\n <!-- Second line content -->\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex-1 truncate\"> Evento </span>\n @if (item()['date']) {\n <span class=\"text-zinc-400\">\n \u2022 {{ formatDate(getItemDate()) }}\n </span>\n }\n </div>\n </div>\n </div>\n\n <!-- Value/Unit display -->\n @if (item()['value'] !== undefined && item()['unit']) {\n <div\n class=\"flex items-center text-right mr-2\"\n >\n <span class=\"text-white font-semibold text-sm\">\n {{ item()['value'] }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ item()['unit'] }}\n </span>\n </div>\n }\n\n <!-- Chevron / loading spinner -->\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n item()['value'] !== undefined && item()['unit']\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n " }]
17059
+ ], host: { 'xs-item-type-event-host': '' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n @if (!item()['imageUrl']) {\n <xs-image\n [src]=\"item() | imageApi: 'event' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (item()['imageUrl']) {\n <xs-image\n [src]=\"item()['imageUrl']\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (!item()['imageUrl']) {\n <div\n class=\"flex items-center justify-center w-full h-full rounded-xl bg-zinc-700\"\n >\n <xs-icon\n icon=\"calendar\"\n class=\"text-zinc-400\"\n ></xs-icon>\n </div>\n }\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getItemTitle() }}\n </span>\n </h3>\n\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex-1 truncate\"> Evento </span>\n @if (item()['date']) {\n <span class=\"text-zinc-400\">\n \u2022 {{ formatDate(getItemDate()) }}\n </span>\n }\n </div>\n </div>\n </div>\n\n @if (item()['value'] !== undefined && item()['unit']) {\n <div\n class=\"flex items-center text-right mr-2\"\n >\n <span class=\"text-white font-semibold text-sm\">\n {{ item()['value'] }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ item()['unit'] }}\n </span>\n </div>\n }\n\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n item()['value'] !== undefined && item()['unit']\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n " }]
17102
17060
  }] });
17103
17061
 
17104
17062
  class XSItemTypeEquipmentComponent extends XSItemTypeBaseComponent {
@@ -17118,7 +17076,7 @@ class XSItemTypeEquipmentComponent extends XSItemTypeBaseComponent {
17118
17076
  return this.item()?.['unit'];
17119
17077
  }
17120
17078
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: XSItemTypeEquipmentComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
17121
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: XSItemTypeEquipmentComponent, isStandalone: true, selector: "xs-item-type-equipment", host: { attributes: { "xs-item-type-equipment-host": "" } }, usesInheritance: true, ngImport: i0, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <!-- Imagen del equipo -->\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n @if (!getItemImageUrl()) {\n <xs-image\n [src]=\"item() | imageApi: 'equipment' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (getItemImageUrl()) {\n <xs-image\n [src]=\"getItemImageUrl()\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n <!-- Fallback: icono de equipo -->\n @if (!getItemImageUrl()) {\n <div\n class=\"flex items-center justify-center w-full h-full rounded-xl bg-zinc-700\"\n >\n <xs-icon\n icon=\"cogs\"\n class=\"text-zinc-400\"\n ></xs-icon>\n </div>\n }\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getItemTitle() }}\n </span>\n </h3>\n\n <!-- Second line content -->\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex-1 truncate\"> Equipo </span>\n @if (getItemCategory()) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ getItemCategory() }}\n </span>\n }\n </div>\n </div>\n </div>\n\n <!-- Value/Unit display -->\n @if (getItemValue() !== undefined && getItemUnit()) {\n <div\n class=\"flex items-center text-right mr-2\"\n >\n <span class=\"text-white font-semibold text-sm\">\n {{ getItemValue() }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ getItemUnit() }}\n </span>\n </div>\n }\n\n <!-- Chevron / loading spinner -->\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n getItemValue() !== undefined && getItemUnit()\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n ", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: XSImageComponent, selector: "xs-image", inputs: ["config", "viewTransitionName", "src", "alt", "width", "height", "size", "rounded", "objectFit", "clickable", "item", "typeItem", "imageType", "fallbackSrc", "loading", "priority", "customClass", "generateAvatar"], outputs: ["onClick", "onLoad", "onError"] }, { kind: "component", type: XSIconComponent, selector: "xs-icon", inputs: ["icon", "size", "class"] }, { kind: "pipe", type: ImageApiPipe, name: "imageApi" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
17079
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: XSItemTypeEquipmentComponent, isStandalone: true, selector: "xs-item-type-equipment", host: { attributes: { "xs-item-type-equipment-host": "" } }, usesInheritance: true, ngImport: i0, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n @if (!getItemImageUrl()) {\n <xs-image\n [src]=\"item() | imageApi: 'equipment' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (getItemImageUrl()) {\n <xs-image\n [src]=\"getItemImageUrl()\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (!getItemImageUrl()) {\n <div\n class=\"flex items-center justify-center w-full h-full rounded-xl bg-zinc-700\"\n >\n <xs-icon\n icon=\"cogs\"\n class=\"text-zinc-400\"\n ></xs-icon>\n </div>\n }\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getItemTitle() }}\n </span>\n </h3>\n\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex-1 truncate\"> Equipo </span>\n @if (getItemCategory()) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ getItemCategory() }}\n </span>\n }\n </div>\n </div>\n </div>\n\n @if (getItemValue() !== undefined && getItemUnit()) {\n <div\n class=\"flex items-center text-right mr-2\"\n >\n <span class=\"text-white font-semibold text-sm\">\n {{ getItemValue() }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ getItemUnit() }}\n </span>\n </div>\n }\n\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n getItemValue() !== undefined && getItemUnit()\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n ", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: XSImageComponent, selector: "xs-image", inputs: ["config", "viewTransitionName", "src", "alt", "width", "height", "size", "rounded", "objectFit", "clickable", "item", "typeItem", "imageType", "fallbackSrc", "loading", "priority", "customClass", "generateAvatar"], outputs: ["onClick", "onLoad", "onError"] }, { kind: "component", type: XSIconComponent, selector: "xs-icon", inputs: ["icon", "size", "class"] }, { kind: "pipe", type: ImageApiPipe, name: "imageApi" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
17122
17080
  }
17123
17081
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: XSItemTypeEquipmentComponent, decorators: [{
17124
17082
  type: Component,
@@ -17128,7 +17086,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImpo
17128
17086
  ImageApiPipe,
17129
17087
  XSImageComponent,
17130
17088
  XSIconComponent,
17131
- ], host: { 'xs-item-type-equipment-host': '' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <!-- Imagen del equipo -->\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n @if (!getItemImageUrl()) {\n <xs-image\n [src]=\"item() | imageApi: 'equipment' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (getItemImageUrl()) {\n <xs-image\n [src]=\"getItemImageUrl()\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n <!-- Fallback: icono de equipo -->\n @if (!getItemImageUrl()) {\n <div\n class=\"flex items-center justify-center w-full h-full rounded-xl bg-zinc-700\"\n >\n <xs-icon\n icon=\"cogs\"\n class=\"text-zinc-400\"\n ></xs-icon>\n </div>\n }\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getItemTitle() }}\n </span>\n </h3>\n\n <!-- Second line content -->\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex-1 truncate\"> Equipo </span>\n @if (getItemCategory()) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ getItemCategory() }}\n </span>\n }\n </div>\n </div>\n </div>\n\n <!-- Value/Unit display -->\n @if (getItemValue() !== undefined && getItemUnit()) {\n <div\n class=\"flex items-center text-right mr-2\"\n >\n <span class=\"text-white font-semibold text-sm\">\n {{ getItemValue() }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ getItemUnit() }}\n </span>\n </div>\n }\n\n <!-- Chevron / loading spinner -->\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n getItemValue() !== undefined && getItemUnit()\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n " }]
17089
+ ], host: { 'xs-item-type-equipment-host': '' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n @if (!getItemImageUrl()) {\n <xs-image\n [src]=\"item() | imageApi: 'equipment' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (getItemImageUrl()) {\n <xs-image\n [src]=\"getItemImageUrl()\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (!getItemImageUrl()) {\n <div\n class=\"flex items-center justify-center w-full h-full rounded-xl bg-zinc-700\"\n >\n <xs-icon\n icon=\"cogs\"\n class=\"text-zinc-400\"\n ></xs-icon>\n </div>\n }\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getItemTitle() }}\n </span>\n </h3>\n\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex-1 truncate\"> Equipo </span>\n @if (getItemCategory()) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ getItemCategory() }}\n </span>\n }\n </div>\n </div>\n </div>\n\n @if (getItemValue() !== undefined && getItemUnit()) {\n <div\n class=\"flex items-center text-right mr-2\"\n >\n <span class=\"text-white font-semibold text-sm\">\n {{ getItemValue() }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ getItemUnit() }}\n </span>\n </div>\n }\n\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n getItemValue() !== undefined && getItemUnit()\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n " }]
17132
17090
  }] });
17133
17091
 
17134
17092
  class XSItemTypeMediaComponent extends XSItemTypeBaseComponent {
@@ -17148,7 +17106,7 @@ class XSItemTypeMediaComponent extends XSItemTypeBaseComponent {
17148
17106
  return `${minutes}:${remainingSeconds.toString().padStart(2, '0')}`;
17149
17107
  }
17150
17108
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: XSItemTypeMediaComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
17151
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: XSItemTypeMediaComponent, isStandalone: true, selector: "xs-item-type-media", host: { attributes: { "xs-item-type-media-host": "" } }, usesInheritance: true, ngImport: i0, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <!-- Imagen del media -->\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n @if (!item()['imageUrl']) {\n <xs-image\n [src]=\"item() | imageApi: 'media' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (item()['imageUrl']) {\n <xs-image\n [src]=\"item()['imageUrl']\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n <!-- Fallback: icono de media -->\n @if (!item()['imageUrl']) {\n <div\n class=\"flex items-center justify-center w-full h-full rounded-xl bg-zinc-700\"\n >\n <xs-icon\n icon=\"music\"\n class=\"text-zinc-400\"\n ></xs-icon>\n </div>\n }\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getItemTitle() }}\n </span>\n </h3>\n\n <!-- Second line content -->\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex-1 truncate\"> Media </span>\n @if (item()['duration']) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ formatDuration(getItemDuration()) }}\n </span>\n }\n @if (item()['genre']) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ item()['genre'] }}\n </span>\n }\n </div>\n </div>\n </div>\n\n <!-- Value/Unit display -->\n @if (item()['value'] !== undefined && item()['unit']) {\n <div\n class=\"flex items-center text-right mr-2\"\n >\n <span class=\"text-white font-semibold text-sm\">\n {{ item()['value'] }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ item()['unit'] }}\n </span>\n </div>\n }\n\n <!-- Chevron / loading spinner -->\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n item()['value'] !== undefined && item()['unit']\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n ", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: XSImageComponent, selector: "xs-image", inputs: ["config", "viewTransitionName", "src", "alt", "width", "height", "size", "rounded", "objectFit", "clickable", "item", "typeItem", "imageType", "fallbackSrc", "loading", "priority", "customClass", "generateAvatar"], outputs: ["onClick", "onLoad", "onError"] }, { kind: "component", type: XSIconComponent, selector: "xs-icon", inputs: ["icon", "size", "class"] }, { kind: "pipe", type: ImageApiPipe, name: "imageApi" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
17109
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: XSItemTypeMediaComponent, isStandalone: true, selector: "xs-item-type-media", host: { attributes: { "xs-item-type-media-host": "" } }, usesInheritance: true, ngImport: i0, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n @if (!item()['imageUrl']) {\n <xs-image\n [src]=\"item() | imageApi: 'media' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (item()['imageUrl']) {\n <xs-image\n [src]=\"item()['imageUrl']\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (!item()['imageUrl']) {\n <div\n class=\"flex items-center justify-center w-full h-full rounded-xl bg-zinc-700\"\n >\n <xs-icon\n icon=\"music\"\n class=\"text-zinc-400\"\n ></xs-icon>\n </div>\n }\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getItemTitle() }}\n </span>\n </h3>\n\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex-1 truncate\"> Media </span>\n @if (item()['duration']) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ formatDuration(getItemDuration()) }}\n </span>\n }\n @if (item()['genre']) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ item()['genre'] }}\n </span>\n }\n </div>\n </div>\n </div>\n\n @if (item()['value'] !== undefined && item()['unit']) {\n <div\n class=\"flex items-center text-right mr-2\"\n >\n <span class=\"text-white font-semibold text-sm\">\n {{ item()['value'] }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ item()['unit'] }}\n </span>\n </div>\n }\n\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n item()['value'] !== undefined && item()['unit']\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n ", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: XSImageComponent, selector: "xs-image", inputs: ["config", "viewTransitionName", "src", "alt", "width", "height", "size", "rounded", "objectFit", "clickable", "item", "typeItem", "imageType", "fallbackSrc", "loading", "priority", "customClass", "generateAvatar"], outputs: ["onClick", "onLoad", "onError"] }, { kind: "component", type: XSIconComponent, selector: "xs-icon", inputs: ["icon", "size", "class"] }, { kind: "pipe", type: ImageApiPipe, name: "imageApi" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
17152
17110
  }
17153
17111
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: XSItemTypeMediaComponent, decorators: [{
17154
17112
  type: Component,
@@ -17158,7 +17116,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImpo
17158
17116
  ImageApiPipe,
17159
17117
  XSImageComponent,
17160
17118
  XSIconComponent,
17161
- ], host: { 'xs-item-type-media-host': '' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <!-- Imagen del media -->\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n @if (!item()['imageUrl']) {\n <xs-image\n [src]=\"item() | imageApi: 'media' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (item()['imageUrl']) {\n <xs-image\n [src]=\"item()['imageUrl']\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n <!-- Fallback: icono de media -->\n @if (!item()['imageUrl']) {\n <div\n class=\"flex items-center justify-center w-full h-full rounded-xl bg-zinc-700\"\n >\n <xs-icon\n icon=\"music\"\n class=\"text-zinc-400\"\n ></xs-icon>\n </div>\n }\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getItemTitle() }}\n </span>\n </h3>\n\n <!-- Second line content -->\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex-1 truncate\"> Media </span>\n @if (item()['duration']) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ formatDuration(getItemDuration()) }}\n </span>\n }\n @if (item()['genre']) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ item()['genre'] }}\n </span>\n }\n </div>\n </div>\n </div>\n\n <!-- Value/Unit display -->\n @if (item()['value'] !== undefined && item()['unit']) {\n <div\n class=\"flex items-center text-right mr-2\"\n >\n <span class=\"text-white font-semibold text-sm\">\n {{ item()['value'] }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ item()['unit'] }}\n </span>\n </div>\n }\n\n <!-- Chevron / loading spinner -->\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n item()['value'] !== undefined && item()['unit']\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n " }]
17119
+ ], host: { 'xs-item-type-media-host': '' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n @if (!item()['imageUrl']) {\n <xs-image\n [src]=\"item() | imageApi: 'media' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (item()['imageUrl']) {\n <xs-image\n [src]=\"item()['imageUrl']\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (!item()['imageUrl']) {\n <div\n class=\"flex items-center justify-center w-full h-full rounded-xl bg-zinc-700\"\n >\n <xs-icon\n icon=\"music\"\n class=\"text-zinc-400\"\n ></xs-icon>\n </div>\n }\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getItemTitle() }}\n </span>\n </h3>\n\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex-1 truncate\"> Media </span>\n @if (item()['duration']) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ formatDuration(getItemDuration()) }}\n </span>\n }\n @if (item()['genre']) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ item()['genre'] }}\n </span>\n }\n </div>\n </div>\n </div>\n\n @if (item()['value'] !== undefined && item()['unit']) {\n <div\n class=\"flex items-center text-right mr-2\"\n >\n <span class=\"text-white font-semibold text-sm\">\n {{ item()['value'] }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ item()['unit'] }}\n </span>\n </div>\n }\n\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n item()['value'] !== undefined && item()['unit']\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n " }]
17162
17120
  }] });
17163
17121
 
17164
17122
  class XSItemTypePlaylistComponent extends XSItemTypeBaseComponent {
@@ -17182,7 +17140,7 @@ class XSItemTypePlaylistComponent extends XSItemTypeBaseComponent {
17182
17140
  return `${minutes}:${remainingSeconds.toString().padStart(2, '0')}`;
17183
17141
  }
17184
17142
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: XSItemTypePlaylistComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
17185
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: XSItemTypePlaylistComponent, isStandalone: true, selector: "xs-item-type-playlist", host: { attributes: { "xs-item-type-playlist-host": "" } }, usesInheritance: true, ngImport: i0, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <!-- Imagen de la playlist -->\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n @if (!item()['imageUrl']) {\n <xs-image\n [src]=\"item() | imageApi: 'playlist' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (item()['imageUrl']) {\n <xs-image\n [src]=\"item()['imageUrl']\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n <!-- Fallback: icono de playlist -->\n @if (!item()['imageUrl']) {\n <div\n class=\"flex items-center justify-center w-full h-full rounded-xl bg-zinc-700\"\n >\n <xs-icon\n icon=\"list\"\n class=\"text-zinc-400\"\n ></xs-icon>\n </div>\n }\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getItemTitle() }}\n </span>\n </h3>\n\n <!-- Second line content -->\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex-1 truncate\"> Playlist </span>\n @if (getTracksLength() > 0) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ getTracksLength() }} pistas\n </span>\n }\n @if (getItemDuration() > 0) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ formatDuration(getItemDuration()) }}\n </span>\n }\n </div>\n </div>\n </div>\n\n <!-- Value/Unit display -->\n @if (item()['value'] !== undefined && item()['unit']) {\n <div\n class=\"flex items-center text-right mr-2\"\n >\n <span class=\"text-white font-semibold text-sm\">\n {{ item()['value'] }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ item()['unit'] }}\n </span>\n </div>\n }\n\n <!-- Chevron / loading spinner -->\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n item()['value'] !== undefined && item()['unit']\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n ", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: XSImageComponent, selector: "xs-image", inputs: ["config", "viewTransitionName", "src", "alt", "width", "height", "size", "rounded", "objectFit", "clickable", "item", "typeItem", "imageType", "fallbackSrc", "loading", "priority", "customClass", "generateAvatar"], outputs: ["onClick", "onLoad", "onError"] }, { kind: "component", type: XSIconComponent, selector: "xs-icon", inputs: ["icon", "size", "class"] }, { kind: "pipe", type: ImageApiPipe, name: "imageApi" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
17143
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: XSItemTypePlaylistComponent, isStandalone: true, selector: "xs-item-type-playlist", host: { attributes: { "xs-item-type-playlist-host": "" } }, usesInheritance: true, ngImport: i0, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n @if (!item()['imageUrl']) {\n <xs-image\n [src]=\"item() | imageApi: 'playlist' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (item()['imageUrl']) {\n <xs-image\n [src]=\"item()['imageUrl']\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (!item()['imageUrl']) {\n <div\n class=\"flex items-center justify-center w-full h-full rounded-xl bg-zinc-700\"\n >\n <xs-icon\n icon=\"list\"\n class=\"text-zinc-400\"\n ></xs-icon>\n </div>\n }\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getItemTitle() }}\n </span>\n </h3>\n\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex-1 truncate\"> Playlist </span>\n @if (getTracksLength() > 0) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ getTracksLength() }} pistas\n </span>\n }\n @if (getItemDuration() > 0) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ formatDuration(getItemDuration()) }}\n </span>\n }\n </div>\n </div>\n </div>\n\n @if (item()['value'] !== undefined && item()['unit']) {\n <div\n class=\"flex items-center text-right mr-2\"\n >\n <span class=\"text-white font-semibold text-sm\">\n {{ item()['value'] }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ item()['unit'] }}\n </span>\n </div>\n }\n\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n item()['value'] !== undefined && item()['unit']\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n ", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: XSImageComponent, selector: "xs-image", inputs: ["config", "viewTransitionName", "src", "alt", "width", "height", "size", "rounded", "objectFit", "clickable", "item", "typeItem", "imageType", "fallbackSrc", "loading", "priority", "customClass", "generateAvatar"], outputs: ["onClick", "onLoad", "onError"] }, { kind: "component", type: XSIconComponent, selector: "xs-icon", inputs: ["icon", "size", "class"] }, { kind: "pipe", type: ImageApiPipe, name: "imageApi" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
17186
17144
  }
17187
17145
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: XSItemTypePlaylistComponent, decorators: [{
17188
17146
  type: Component,
@@ -17192,7 +17150,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImpo
17192
17150
  ImageApiPipe,
17193
17151
  XSImageComponent,
17194
17152
  XSIconComponent,
17195
- ], host: { 'xs-item-type-playlist-host': '' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <!-- Imagen de la playlist -->\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n @if (!item()['imageUrl']) {\n <xs-image\n [src]=\"item() | imageApi: 'playlist' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (item()['imageUrl']) {\n <xs-image\n [src]=\"item()['imageUrl']\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n <!-- Fallback: icono de playlist -->\n @if (!item()['imageUrl']) {\n <div\n class=\"flex items-center justify-center w-full h-full rounded-xl bg-zinc-700\"\n >\n <xs-icon\n icon=\"list\"\n class=\"text-zinc-400\"\n ></xs-icon>\n </div>\n }\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getItemTitle() }}\n </span>\n </h3>\n\n <!-- Second line content -->\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex-1 truncate\"> Playlist </span>\n @if (getTracksLength() > 0) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ getTracksLength() }} pistas\n </span>\n }\n @if (getItemDuration() > 0) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ formatDuration(getItemDuration()) }}\n </span>\n }\n </div>\n </div>\n </div>\n\n <!-- Value/Unit display -->\n @if (item()['value'] !== undefined && item()['unit']) {\n <div\n class=\"flex items-center text-right mr-2\"\n >\n <span class=\"text-white font-semibold text-sm\">\n {{ item()['value'] }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ item()['unit'] }}\n </span>\n </div>\n }\n\n <!-- Chevron / loading spinner -->\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n item()['value'] !== undefined && item()['unit']\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n " }]
17153
+ ], host: { 'xs-item-type-playlist-host': '' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n @if (!item()['imageUrl']) {\n <xs-image\n [src]=\"item() | imageApi: 'playlist' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (item()['imageUrl']) {\n <xs-image\n [src]=\"item()['imageUrl']\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (!item()['imageUrl']) {\n <div\n class=\"flex items-center justify-center w-full h-full rounded-xl bg-zinc-700\"\n >\n <xs-icon\n icon=\"list\"\n class=\"text-zinc-400\"\n ></xs-icon>\n </div>\n }\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getItemTitle() }}\n </span>\n </h3>\n\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex-1 truncate\"> Playlist </span>\n @if (getTracksLength() > 0) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ getTracksLength() }} pistas\n </span>\n }\n @if (getItemDuration() > 0) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ formatDuration(getItemDuration()) }}\n </span>\n }\n </div>\n </div>\n </div>\n\n @if (item()['value'] !== undefined && item()['unit']) {\n <div\n class=\"flex items-center text-right mr-2\"\n >\n <span class=\"text-white font-semibold text-sm\">\n {{ item()['value'] }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ item()['unit'] }}\n </span>\n </div>\n }\n\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n item()['value'] !== undefined && item()['unit']\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n " }]
17196
17154
  }] });
17197
17155
 
17198
17156
  class XSItemTypeOrganizationComponent extends XSItemTypeBaseComponent {
@@ -17212,7 +17170,7 @@ class XSItemTypeOrganizationComponent extends XSItemTypeBaseComponent {
17212
17170
  return this.item()?.['unit'];
17213
17171
  }
17214
17172
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: XSItemTypeOrganizationComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
17215
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: XSItemTypeOrganizationComponent, isStandalone: true, selector: "xs-item-type-organization", host: { attributes: { "xs-item-type-organization-host": "" } }, usesInheritance: true, ngImport: i0, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <!-- Imagen de la organizaci\u00F3n -->\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n @if (!getItemImageUrl()) {\n <xs-image\n [src]=\"item() | imageApi: 'organization' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (getItemImageUrl()) {\n <xs-image\n [src]=\"getItemImageUrl()\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n <!-- Fallback: icono de organizaci\u00F3n -->\n @if (!getItemImageUrl()) {\n <div\n class=\"flex items-center justify-center w-full h-full rounded-xl bg-zinc-700\"\n >\n <xs-icon\n icon=\"building\"\n class=\"text-zinc-400\"\n ></xs-icon>\n </div>\n }\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getItemTitle() }}\n </span>\n </h3>\n\n <!-- Second line content -->\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex-1 truncate\"> Organizaci\u00F3n </span>\n @if (getItemOrgType()) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ getItemOrgType() }}\n </span>\n }\n </div>\n </div>\n </div>\n\n <!-- Value/Unit display -->\n @if (getItemValue() !== undefined && getItemUnit()) {\n <div\n class=\"flex items-center text-right mr-2\"\n >\n <span class=\"text-white font-semibold text-sm\">\n {{ getItemValue() }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ getItemUnit() }}\n </span>\n </div>\n }\n\n <!-- Chevron / loading spinner -->\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n getItemValue() !== undefined && getItemUnit()\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n ", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: XSImageComponent, selector: "xs-image", inputs: ["config", "viewTransitionName", "src", "alt", "width", "height", "size", "rounded", "objectFit", "clickable", "item", "typeItem", "imageType", "fallbackSrc", "loading", "priority", "customClass", "generateAvatar"], outputs: ["onClick", "onLoad", "onError"] }, { kind: "component", type: XSIconComponent, selector: "xs-icon", inputs: ["icon", "size", "class"] }, { kind: "pipe", type: ImageApiPipe, name: "imageApi" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
17173
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: XSItemTypeOrganizationComponent, isStandalone: true, selector: "xs-item-type-organization", host: { attributes: { "xs-item-type-organization-host": "" } }, usesInheritance: true, ngImport: i0, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n @if (!getItemImageUrl()) {\n <xs-image\n [src]=\"item() | imageApi: 'organization' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (getItemImageUrl()) {\n <xs-image\n [src]=\"getItemImageUrl()\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (!getItemImageUrl()) {\n <div\n class=\"flex items-center justify-center w-full h-full rounded-xl bg-zinc-700\"\n >\n <xs-icon\n icon=\"building\"\n class=\"text-zinc-400\"\n ></xs-icon>\n </div>\n }\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getItemTitle() }}\n </span>\n </h3>\n\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex-1 truncate\"> Organizaci\u00F3n </span>\n @if (getItemOrgType()) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ getItemOrgType() }}\n </span>\n }\n </div>\n </div>\n </div>\n\n @if (getItemValue() !== undefined && getItemUnit()) {\n <div\n class=\"flex items-center text-right mr-2\"\n >\n <span class=\"text-white font-semibold text-sm\">\n {{ getItemValue() }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ getItemUnit() }}\n </span>\n </div>\n }\n\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n getItemValue() !== undefined && getItemUnit()\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n ", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: XSImageComponent, selector: "xs-image", inputs: ["config", "viewTransitionName", "src", "alt", "width", "height", "size", "rounded", "objectFit", "clickable", "item", "typeItem", "imageType", "fallbackSrc", "loading", "priority", "customClass", "generateAvatar"], outputs: ["onClick", "onLoad", "onError"] }, { kind: "component", type: XSIconComponent, selector: "xs-icon", inputs: ["icon", "size", "class"] }, { kind: "pipe", type: ImageApiPipe, name: "imageApi" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
17216
17174
  }
17217
17175
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: XSItemTypeOrganizationComponent, decorators: [{
17218
17176
  type: Component,
@@ -17222,7 +17180,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImpo
17222
17180
  ImageApiPipe,
17223
17181
  XSImageComponent,
17224
17182
  XSIconComponent,
17225
- ], host: { 'xs-item-type-organization-host': '' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <!-- Imagen de la organizaci\u00F3n -->\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n @if (!getItemImageUrl()) {\n <xs-image\n [src]=\"item() | imageApi: 'organization' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (getItemImageUrl()) {\n <xs-image\n [src]=\"getItemImageUrl()\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n <!-- Fallback: icono de organizaci\u00F3n -->\n @if (!getItemImageUrl()) {\n <div\n class=\"flex items-center justify-center w-full h-full rounded-xl bg-zinc-700\"\n >\n <xs-icon\n icon=\"building\"\n class=\"text-zinc-400\"\n ></xs-icon>\n </div>\n }\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getItemTitle() }}\n </span>\n </h3>\n\n <!-- Second line content -->\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex-1 truncate\"> Organizaci\u00F3n </span>\n @if (getItemOrgType()) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ getItemOrgType() }}\n </span>\n }\n </div>\n </div>\n </div>\n\n <!-- Value/Unit display -->\n @if (getItemValue() !== undefined && getItemUnit()) {\n <div\n class=\"flex items-center text-right mr-2\"\n >\n <span class=\"text-white font-semibold text-sm\">\n {{ getItemValue() }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ getItemUnit() }}\n </span>\n </div>\n }\n\n <!-- Chevron / loading spinner -->\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n getItemValue() !== undefined && getItemUnit()\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n " }]
17183
+ ], host: { 'xs-item-type-organization-host': '' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n @if (!getItemImageUrl()) {\n <xs-image\n [src]=\"item() | imageApi: 'organization' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (getItemImageUrl()) {\n <xs-image\n [src]=\"getItemImageUrl()\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (!getItemImageUrl()) {\n <div\n class=\"flex items-center justify-center w-full h-full rounded-xl bg-zinc-700\"\n >\n <xs-icon\n icon=\"building\"\n class=\"text-zinc-400\"\n ></xs-icon>\n </div>\n }\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getItemTitle() }}\n </span>\n </h3>\n\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex-1 truncate\"> Organizaci\u00F3n </span>\n @if (getItemOrgType()) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ getItemOrgType() }}\n </span>\n }\n </div>\n </div>\n </div>\n\n @if (getItemValue() !== undefined && getItemUnit()) {\n <div\n class=\"flex items-center text-right mr-2\"\n >\n <span class=\"text-white font-semibold text-sm\">\n {{ getItemValue() }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ getItemUnit() }}\n </span>\n </div>\n }\n\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n getItemValue() !== undefined && getItemUnit()\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n " }]
17226
17184
  }] });
17227
17185
 
17228
17186
  class XSItemTypeSiteComponent extends XSItemTypeBaseComponent {
@@ -17240,12 +17198,11 @@ class XSItemTypeSiteComponent extends XSItemTypeBaseComponent {
17240
17198
  getShortAddress(address) {
17241
17199
  if (!address || typeof address !== 'string')
17242
17200
  return '';
17243
- // Mostrar solo la primera parte de la dirección
17244
17201
  const parts = address.split(',');
17245
17202
  return parts[0].trim();
17246
17203
  }
17247
17204
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: XSItemTypeSiteComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
17248
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: XSItemTypeSiteComponent, isStandalone: true, selector: "xs-item-type-site", host: { attributes: { "xs-item-type-site-host": "" } }, usesInheritance: true, ngImport: i0, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <!-- Imagen del sitio -->\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n @if (!item()['imageUrl']) {\n <xs-image\n [src]=\"item() | imageApi: 'site' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (item()['imageUrl']) {\n <xs-image\n [src]=\"item()['imageUrl']\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n <!-- Fallback: icono de sitio -->\n @if (!item()['imageUrl']) {\n <div\n class=\"flex items-center justify-center w-full h-full rounded-xl bg-zinc-700\"\n >\n <xs-icon\n icon=\"map-marker-alt\"\n class=\"text-zinc-400\"\n ></xs-icon>\n </div>\n }\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getItemTitle() }}\n </span>\n </h3>\n\n <!-- Second line content -->\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex-1 truncate\"> Sitio </span>\n @if (item()['address']) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ getShortAddress(getItemAddress()) }}\n </span>\n }\n </div>\n </div>\n </div>\n\n <!-- Value/Unit display -->\n @if (item()['value'] !== undefined && item()['unit']) {\n <div\n class=\"flex items-center text-right mr-2\"\n >\n <span class=\"text-white font-semibold text-sm\">\n {{ item()['value'] }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ item()['unit'] }}\n </span>\n </div>\n }\n\n <!-- Chevron / loading spinner -->\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n item()['value'] !== undefined && item()['unit']\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n ", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: XSImageComponent, selector: "xs-image", inputs: ["config", "viewTransitionName", "src", "alt", "width", "height", "size", "rounded", "objectFit", "clickable", "item", "typeItem", "imageType", "fallbackSrc", "loading", "priority", "customClass", "generateAvatar"], outputs: ["onClick", "onLoad", "onError"] }, { kind: "component", type: XSIconComponent, selector: "xs-icon", inputs: ["icon", "size", "class"] }, { kind: "pipe", type: ImageApiPipe, name: "imageApi" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
17205
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: XSItemTypeSiteComponent, isStandalone: true, selector: "xs-item-type-site", host: { attributes: { "xs-item-type-site-host": "" } }, usesInheritance: true, ngImport: i0, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n @if (!item()['imageUrl']) {\n <xs-image\n [src]=\"item() | imageApi: 'site' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (item()['imageUrl']) {\n <xs-image\n [src]=\"item()['imageUrl']\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (!item()['imageUrl']) {\n <div\n class=\"flex items-center justify-center w-full h-full rounded-xl bg-zinc-700\"\n >\n <xs-icon\n icon=\"map-marker-alt\"\n class=\"text-zinc-400\"\n ></xs-icon>\n </div>\n }\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getItemTitle() }}\n </span>\n </h3>\n\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex-1 truncate\"> Sitio </span>\n @if (item()['address']) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ getShortAddress(getItemAddress()) }}\n </span>\n }\n </div>\n </div>\n </div>\n\n @if (item()['value'] !== undefined && item()['unit']) {\n <div\n class=\"flex items-center text-right mr-2\"\n >\n <span class=\"text-white font-semibold text-sm\">\n {{ item()['value'] }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ item()['unit'] }}\n </span>\n </div>\n }\n\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n item()['value'] !== undefined && item()['unit']\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n ", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: XSImageComponent, selector: "xs-image", inputs: ["config", "viewTransitionName", "src", "alt", "width", "height", "size", "rounded", "objectFit", "clickable", "item", "typeItem", "imageType", "fallbackSrc", "loading", "priority", "customClass", "generateAvatar"], outputs: ["onClick", "onLoad", "onError"] }, { kind: "component", type: XSIconComponent, selector: "xs-icon", inputs: ["icon", "size", "class"] }, { kind: "pipe", type: ImageApiPipe, name: "imageApi" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
17249
17206
  }
17250
17207
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: XSItemTypeSiteComponent, decorators: [{
17251
17208
  type: Component,
@@ -17255,7 +17212,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImpo
17255
17212
  ImageApiPipe,
17256
17213
  XSImageComponent,
17257
17214
  XSIconComponent,
17258
- ], host: { 'xs-item-type-site-host': '' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <!-- Imagen del sitio -->\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n @if (!item()['imageUrl']) {\n <xs-image\n [src]=\"item() | imageApi: 'site' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (item()['imageUrl']) {\n <xs-image\n [src]=\"item()['imageUrl']\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n <!-- Fallback: icono de sitio -->\n @if (!item()['imageUrl']) {\n <div\n class=\"flex items-center justify-center w-full h-full rounded-xl bg-zinc-700\"\n >\n <xs-icon\n icon=\"map-marker-alt\"\n class=\"text-zinc-400\"\n ></xs-icon>\n </div>\n }\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getItemTitle() }}\n </span>\n </h3>\n\n <!-- Second line content -->\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex-1 truncate\"> Sitio </span>\n @if (item()['address']) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ getShortAddress(getItemAddress()) }}\n </span>\n }\n </div>\n </div>\n </div>\n\n <!-- Value/Unit display -->\n @if (item()['value'] !== undefined && item()['unit']) {\n <div\n class=\"flex items-center text-right mr-2\"\n >\n <span class=\"text-white font-semibold text-sm\">\n {{ item()['value'] }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ item()['unit'] }}\n </span>\n </div>\n }\n\n <!-- Chevron / loading spinner -->\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n item()['value'] !== undefined && item()['unit']\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n " }]
17215
+ ], host: { 'xs-item-type-site-host': '' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n @if (!item()['imageUrl']) {\n <xs-image\n [src]=\"item() | imageApi: 'site' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (item()['imageUrl']) {\n <xs-image\n [src]=\"item()['imageUrl']\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (!item()['imageUrl']) {\n <div\n class=\"flex items-center justify-center w-full h-full rounded-xl bg-zinc-700\"\n >\n <xs-icon\n icon=\"map-marker-alt\"\n class=\"text-zinc-400\"\n ></xs-icon>\n </div>\n }\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getItemTitle() }}\n </span>\n </h3>\n\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex-1 truncate\"> Sitio </span>\n @if (item()['address']) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ getShortAddress(getItemAddress()) }}\n </span>\n }\n </div>\n </div>\n </div>\n\n @if (item()['value'] !== undefined && item()['unit']) {\n <div\n class=\"flex items-center text-right mr-2\"\n >\n <span class=\"text-white font-semibold text-sm\">\n {{ item()['value'] }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ item()['unit'] }}\n </span>\n </div>\n }\n\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n item()['value'] !== undefined && item()['unit']\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n " }]
17259
17216
  }] });
17260
17217
 
17261
17218
  class XSItemTypeTipComponent extends XSItemTypeBaseComponent {
@@ -17279,7 +17236,7 @@ class XSItemTypeTipComponent extends XSItemTypeBaseComponent {
17279
17236
  return this.item()?.['unit'];
17280
17237
  }
17281
17238
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: XSItemTypeTipComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
17282
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: XSItemTypeTipComponent, isStandalone: true, selector: "xs-item-type-tip", host: { attributes: { "xs-item-type-tip-host": "" } }, usesInheritance: true, ngImport: i0, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <!-- Imagen del tip -->\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n @if (!getItemImageUrl()) {\n <xs-image\n [src]=\"item() | imageApi: 'tip' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (getItemImageUrl()) {\n <xs-image\n [src]=\"getItemImageUrl()\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n <!-- Fallback: icono de tip -->\n @if (!getItemImageUrl()) {\n <div\n class=\"flex items-center justify-center w-full h-full rounded-xl bg-zinc-700\"\n >\n <xs-icon\n icon=\"lightbulb\"\n class=\"text-zinc-400\"\n ></xs-icon>\n </div>\n }\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getItemTitle() }}\n </span>\n </h3>\n\n <!-- Second line content -->\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex-1 truncate\"> Tip </span>\n @if (getItemCategory()) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ getItemCategory() }}\n </span>\n }\n </div>\n </div>\n </div>\n\n <!-- Value/Unit display -->\n @if (getItemValue() !== undefined && getItemUnit()) {\n <div\n class=\"flex items-center text-right mr-2\"\n >\n <span class=\"text-white font-semibold text-sm\">\n {{ getItemValue() }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ getItemUnit() }}\n </span>\n </div>\n }\n\n <!-- Chevron / loading spinner -->\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n getItemValue() !== undefined && getItemUnit()\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n ", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: XSImageComponent, selector: "xs-image", inputs: ["config", "viewTransitionName", "src", "alt", "width", "height", "size", "rounded", "objectFit", "clickable", "item", "typeItem", "imageType", "fallbackSrc", "loading", "priority", "customClass", "generateAvatar"], outputs: ["onClick", "onLoad", "onError"] }, { kind: "component", type: XSIconComponent, selector: "xs-icon", inputs: ["icon", "size", "class"] }, { kind: "pipe", type: ImageApiPipe, name: "imageApi" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
17239
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: XSItemTypeTipComponent, isStandalone: true, selector: "xs-item-type-tip", host: { attributes: { "xs-item-type-tip-host": "" } }, usesInheritance: true, ngImport: i0, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n @if (!getItemImageUrl()) {\n <xs-image\n [src]=\"item() | imageApi: 'tip' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (getItemImageUrl()) {\n <xs-image\n [src]=\"getItemImageUrl()\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (!getItemImageUrl()) {\n <div\n class=\"flex items-center justify-center w-full h-full rounded-xl bg-zinc-700\"\n >\n <xs-icon\n icon=\"lightbulb\"\n class=\"text-zinc-400\"\n ></xs-icon>\n </div>\n }\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getItemTitle() }}\n </span>\n </h3>\n\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex-1 truncate\"> Tip </span>\n @if (getItemCategory()) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ getItemCategory() }}\n </span>\n }\n </div>\n </div>\n </div>\n\n @if (getItemValue() !== undefined && getItemUnit()) {\n <div\n class=\"flex items-center text-right mr-2\"\n >\n <span class=\"text-white font-semibold text-sm\">\n {{ getItemValue() }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ getItemUnit() }}\n </span>\n </div>\n }\n\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n getItemValue() !== undefined && getItemUnit()\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n ", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: XSImageComponent, selector: "xs-image", inputs: ["config", "viewTransitionName", "src", "alt", "width", "height", "size", "rounded", "objectFit", "clickable", "item", "typeItem", "imageType", "fallbackSrc", "loading", "priority", "customClass", "generateAvatar"], outputs: ["onClick", "onLoad", "onError"] }, { kind: "component", type: XSIconComponent, selector: "xs-icon", inputs: ["icon", "size", "class"] }, { kind: "pipe", type: ImageApiPipe, name: "imageApi" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
17283
17240
  }
17284
17241
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: XSItemTypeTipComponent, decorators: [{
17285
17242
  type: Component,
@@ -17289,7 +17246,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImpo
17289
17246
  ImageApiPipe,
17290
17247
  XSImageComponent,
17291
17248
  XSIconComponent,
17292
- ], host: { 'xs-item-type-tip-host': '' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <!-- Imagen del tip -->\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n @if (!getItemImageUrl()) {\n <xs-image\n [src]=\"item() | imageApi: 'tip' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (getItemImageUrl()) {\n <xs-image\n [src]=\"getItemImageUrl()\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n <!-- Fallback: icono de tip -->\n @if (!getItemImageUrl()) {\n <div\n class=\"flex items-center justify-center w-full h-full rounded-xl bg-zinc-700\"\n >\n <xs-icon\n icon=\"lightbulb\"\n class=\"text-zinc-400\"\n ></xs-icon>\n </div>\n }\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getItemTitle() }}\n </span>\n </h3>\n\n <!-- Second line content -->\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex-1 truncate\"> Tip </span>\n @if (getItemCategory()) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ getItemCategory() }}\n </span>\n }\n </div>\n </div>\n </div>\n\n <!-- Value/Unit display -->\n @if (getItemValue() !== undefined && getItemUnit()) {\n <div\n class=\"flex items-center text-right mr-2\"\n >\n <span class=\"text-white font-semibold text-sm\">\n {{ getItemValue() }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ getItemUnit() }}\n </span>\n </div>\n }\n\n <!-- Chevron / loading spinner -->\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n getItemValue() !== undefined && getItemUnit()\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n " }]
17249
+ ], host: { 'xs-item-type-tip-host': '' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "\n @if (isLink()) {\n <a\n [class]=\"itemClasses\"\n (click)=\"handleClick($event)\"\n >\n <div class=\"flex items-center justify-between w-full\">\n <div class=\"flex items-center flex-1 min-w-0 gap-2\">\n <div\n class=\"flex-shrink-0 w-10 h-10 overflow-hidden rounded-xl\"\n [ngClass]=\"[\n size() === 'small' ? 'w-8 h-8' : 'w-10 h-10 mr-1',\n ]\"\n >\n @if (!getItemImageUrl()) {\n <xs-image\n [src]=\"item() | imageApi: 'tip' : 'small'\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (getItemImageUrl()) {\n <xs-image\n [src]=\"getItemImageUrl()\"\n size=\"full\"\n objectFit=\"cover\"\n ></xs-image>\n }\n @if (!getItemImageUrl()) {\n <div\n class=\"flex items-center justify-center w-full h-full rounded-xl bg-zinc-700\"\n >\n <xs-icon\n icon=\"lightbulb\"\n class=\"text-zinc-400\"\n ></xs-icon>\n </div>\n }\n </div>\n\n <div\n class=\"flex flex-col items-start justify-start w-full min-w-0\"\n >\n <h3\n class=\"w-full text-[16px] font-semibold text-white pr-2\"\n >\n <span class=\"block max-w-full pr-2 truncate\">\n {{ getItemTitle() }}\n </span>\n </h3>\n\n <div\n class=\"flex items-center min-w-0 gap-1 text-xs text-zinc-500\"\n >\n <span class=\"flex-1 truncate\"> Tip </span>\n @if (getItemCategory()) {\n <span\n class=\"text-zinc-400\"\n >\n \u2022 {{ getItemCategory() }}\n </span>\n }\n </div>\n </div>\n </div>\n\n @if (getItemValue() !== undefined && getItemUnit()) {\n <div\n class=\"flex items-center text-right mr-2\"\n >\n <span class=\"text-white font-semibold text-sm\">\n {{ getItemValue() }}\n </span>\n <span class=\"text-zinc-400 text-xs ml-1\">\n {{ getItemUnit() }}\n </span>\n </div>\n }\n\n @if (showChevron() || loading()) {\n <div\n class=\"flex items-center flex-shrink-0 h-full ml-2\"\n >\n @if (loading()) {\n <div\n class=\"w-4 h-4 border-2 border-white rounded-full border-t-transparent animate-spin\"\n aria-label=\"Cargando\"\n ></div>\n }\n @if (!loading()) {\n <xs-icon\n icon=\"chevron-right\"\n class=\"text-zinc-400\"\n [ngClass]=\"\n getItemValue() !== undefined && getItemUnit()\n ? 'ml-1'\n : 'ml-2'\n \"\n ></xs-icon>\n }\n </div>\n }\n </div>\n </a>\n }\n " }]
17293
17250
  }] });
17294
17251
 
17295
17252
  class XSItemTypeComponent {
@@ -18009,7 +17966,6 @@ class XSTableItemsComponent {
18009
17966
  ngOnDestroy() {
18010
17967
  this.langSubscription.unsubscribe();
18011
17968
  }
18012
- // --- LÓGICA DE VALIDACIÓN ---
18013
17969
  isString(val) {
18014
17970
  return typeof val === 'string';
18015
17971
  }
@@ -18022,7 +17978,6 @@ class XSTableItemsComponent {
18022
17978
  isNotArray(value) {
18023
17979
  return !Array.isArray(value);
18024
17980
  }
18025
- // --- LÓGICA DE IMAGEN Y DISPLAY ---
18026
17981
  get typeForImage() {
18027
17982
  if (this.header().key === 'name' && this.item()?.['slides'])
18028
17983
  return 'tip';
@@ -18131,7 +18086,6 @@ class XSTableItemsComponent {
18131
18086
  }
18132
18087
  return type;
18133
18088
  }
18134
- // --- LÓGICA DE FECHAS Y TIEMPO ---
18135
18089
  isDateInRangeF(date, minDays, maxDays) {
18136
18090
  if (!date)
18137
18091
  return false;
@@ -18192,7 +18146,6 @@ class XSTableItemsComponent {
18192
18146
  return 0;
18193
18147
  }
18194
18148
  }
18195
- // --- LÓGICA DE ESTADOS Y CLASES ---
18196
18149
  getStateClasses(state) {
18197
18150
  const base = 'inline-flex items-center gap-2 px-3 py-1.5 text-sm font-semibold rounded-xl';
18198
18151
  switch (state?.toLowerCase()) {
@@ -18248,7 +18201,6 @@ class XSTableItemsComponent {
18248
18201
  getStateFullText = (state) => state
18249
18202
  ? state.toLowerCase().replaceAll('_', ' ')
18250
18203
  : 'desconocido';
18251
- // --- LÓGICA DE USUARIOS Y ROLES ---
18252
18204
  getRoleIcon(role) {
18253
18205
  const roles = {
18254
18206
  admin: 'crown',
@@ -18291,7 +18243,6 @@ class XSTableItemsComponent {
18291
18243
  });
18292
18244
  return buttons;
18293
18245
  }
18294
- // --- LÓGICA DE MÉTRICAS ---
18295
18246
  sumVisitsf(item) {
18296
18247
  if (!item)
18297
18248
  return 0;
@@ -18319,7 +18270,6 @@ class XSTableItemsComponent {
18319
18270
  return 0;
18320
18271
  return ((i.maxUses - (i.usedCount ?? 0)) / i.maxUses) * 100;
18321
18272
  }
18322
- // --- OTROS AYUDANTES ---
18323
18273
  getUrlStatsPage = (item) => {
18324
18274
  const i = item;
18325
18275
  return i.path ? `https://xsmusic.es${i.path}` : '';
@@ -18449,11 +18399,11 @@ class XSTableCheckboxComponent {
18449
18399
  this.checkedChange.emit(!this.checked());
18450
18400
  }
18451
18401
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: XSTableCheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
18452
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.33", type: XSTableCheckboxComponent, isStandalone: true, selector: "xs-table-checkbox", inputs: { checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checkedChange: "checkedChange" }, ngImport: i0, template: " <label\n class=\"relative flex items-center justify-center cursor-pointer\"\n >\n <input\n type=\"checkbox\"\n class=\"sr-only peer\"\n [checked]=\"checked()\"\n (change)=\"onToggle()\"\n [attr.aria-label]=\"checked() ? 'Deseleccionar fila' : 'Seleccionar fila'\"\n />\n <div\n class=\"w-5 h-5 border-2 border-zinc-800 rounded-md peer-checked:bg-zinc-100 peer-checked:border-zinc-100 transition-all duration-300\"\n [class.border-zinc-700]=\"checked()\"\n >\n <xs-icon\n icon=\"check\"\n class=\"hidden peer-checked:block text-zinc-900 text-[10px] m-auto\"\n />\n </div>\n </label>\n", dependencies: [{ kind: "component", type: XSIconComponent, selector: "xs-icon", inputs: ["icon", "size", "class"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
18402
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: XSTableCheckboxComponent, isStandalone: true, selector: "xs-table-checkbox", inputs: { checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checkedChange: "checkedChange" }, ngImport: i0, template: " <label\n class=\"relative flex items-center justify-center cursor-pointer\"\n >\n <input\n type=\"checkbox\"\n class=\"sr-only peer\"\n [checked]=\"checked()\"\n (change)=\"onToggle()\"\n [attr.aria-label]=\"checked() ? 'Deseleccionar fila' : 'Seleccionar fila'\"\n />\n <div\n class=\"flex items-center justify-center w-5 h-5 border-2 border-zinc-800 rounded-md peer-checked:bg-zinc-100 peer-checked:border-zinc-100 transition-all duration-300\"\n [class.border-zinc-700]=\"checked()\"\n >\n @if (checked()) {\n <xs-icon\n icon=\"check\"\n class=\"text-zinc-900 text-[10px]\"\n />\n }\n </div>\n </label>\n", dependencies: [{ kind: "component", type: XSIconComponent, selector: "xs-icon", inputs: ["icon", "size", "class"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
18453
18403
  }
18454
18404
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: XSTableCheckboxComponent, decorators: [{
18455
18405
  type: Component,
18456
- args: [{ selector: 'xs-table-checkbox', standalone: true, imports: [XSIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: " <label\n class=\"relative flex items-center justify-center cursor-pointer\"\n >\n <input\n type=\"checkbox\"\n class=\"sr-only peer\"\n [checked]=\"checked()\"\n (change)=\"onToggle()\"\n [attr.aria-label]=\"checked() ? 'Deseleccionar fila' : 'Seleccionar fila'\"\n />\n <div\n class=\"w-5 h-5 border-2 border-zinc-800 rounded-md peer-checked:bg-zinc-100 peer-checked:border-zinc-100 transition-all duration-300\"\n [class.border-zinc-700]=\"checked()\"\n >\n <xs-icon\n icon=\"check\"\n class=\"hidden peer-checked:block text-zinc-900 text-[10px] m-auto\"\n />\n </div>\n </label>\n" }]
18406
+ args: [{ selector: 'xs-table-checkbox', standalone: true, imports: [XSIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: " <label\n class=\"relative flex items-center justify-center cursor-pointer\"\n >\n <input\n type=\"checkbox\"\n class=\"sr-only peer\"\n [checked]=\"checked()\"\n (change)=\"onToggle()\"\n [attr.aria-label]=\"checked() ? 'Deseleccionar fila' : 'Seleccionar fila'\"\n />\n <div\n class=\"flex items-center justify-center w-5 h-5 border-2 border-zinc-800 rounded-md peer-checked:bg-zinc-100 peer-checked:border-zinc-100 transition-all duration-300\"\n [class.border-zinc-700]=\"checked()\"\n >\n @if (checked()) {\n <xs-icon\n icon=\"check\"\n class=\"text-zinc-900 text-[10px]\"\n />\n }\n </div>\n </label>\n" }]
18457
18407
  }], propDecorators: { checked: [{ type: i0.Input, args: [{ isSignal: true, alias: "checked", required: false }] }], checkedChange: [{ type: i0.Output, args: ["checkedChange"] }] } });
18458
18408
 
18459
18409
  function getVal(item, key) {
@@ -18552,7 +18502,6 @@ class XSTableComponent {
18552
18502
  langVersion = signal(0, ...(ngDevMode ? [{ debugName: "langVersion" }] : []));
18553
18503
  platformId = inject(PLATFORM_ID);
18554
18504
  uid = `xs-table-jump-${Math.random().toString(36).slice(2, 9)}`;
18555
- // -- Inputs --
18556
18505
  headers = input([], ...(ngDevMode ? [{ debugName: "headers" }] : []));
18557
18506
  items = input([], ...(ngDevMode ? [{ debugName: "items" }] : []));
18558
18507
  loading = input(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
@@ -18588,21 +18537,17 @@ class XSTableComponent {
18588
18537
  idKey = input('_id', ...(ngDevMode ? [{ debugName: "idKey" }] : []));
18589
18538
  page = model(1, ...(ngDevMode ? [{ debugName: "page" }] : []));
18590
18539
  pageSize = model(25, ...(ngDevMode ? [{ debugName: "pageSize" }] : []));
18591
- // -- Sticky mode --
18592
18540
  sticky = input(false, ...(ngDevMode ? [{ debugName: "sticky" }] : []));
18593
18541
  containerHeight = input('100%', ...(ngDevMode ? [{ debugName: "containerHeight" }] : []));
18594
- // -- Outputs --
18595
18542
  rowClick = output();
18596
18543
  selectionChange = output();
18597
18544
  selectedAction = output();
18598
18545
  sortChange = output();
18599
18546
  searchQuerySubmit = output();
18600
- // -- Content children --
18601
18547
  cellTemplate = contentChild('xsCell', ...(ngDevMode ? [{ debugName: "cellTemplate" }] : []));
18602
18548
  expandedContent = contentChild('xsExpandedRow', ...(ngDevMode ? [{ debugName: "expandedContent" }] : []));
18603
18549
  toolbarExtra = contentChild('toolbarExtra', ...(ngDevMode ? [{ debugName: "toolbarExtra" }] : []));
18604
18550
  columnTemplates = input({}, ...(ngDevMode ? [{ debugName: "columnTemplates" }] : []));
18605
- // -- State signals --
18606
18551
  selectedSet = signal(new Set(), ...(ngDevMode ? [{ debugName: "selectedSet" }] : []));
18607
18552
  expandedItemId = signal(null, ...(ngDevMode ? [{ debugName: "expandedItemId" }] : []));
18608
18553
  sortState = signal({
@@ -18617,7 +18562,6 @@ class XSTableComponent {
18617
18562
  searchTimer;
18618
18563
  saveTimeoutId;
18619
18564
  resizeData = null;
18620
- // -- Computeds --
18621
18565
  showSelection = computed(() => this.selectable() ||
18622
18566
  (this.selectedButtons()?.length ?? 0) > 0, ...(ngDevMode ? [{ debugName: "showSelection" }] : []));
18623
18567
  hasActions = computed(() => (this.actionButtons()?.length ?? 0) > 0 ||
@@ -18725,7 +18669,6 @@ class XSTableComponent {
18725
18669
  this.copyable() ||
18726
18670
  this.toolbarButtons().length > 0 ||
18727
18671
  !!this.toolbarExtra(), ...(ngDevMode ? [{ debugName: "showToolbar" }] : []));
18728
- // -- Lifecycle --
18729
18672
  constructor() {
18730
18673
  if (typeof this.translateService?.registerTranslations ===
18731
18674
  'function') {
@@ -18754,7 +18697,6 @@ class XSTableComponent {
18754
18697
  clearTimeout(this.saveTimeoutId);
18755
18698
  });
18756
18699
  }
18757
- // -- Search --
18758
18700
  onSearchInput(value) {
18759
18701
  clearTimeout(this.searchTimer);
18760
18702
  this.searchTimer = setTimeout(() => {
@@ -18774,7 +18716,6 @@ class XSTableComponent {
18774
18716
  this.searchQuery.set('');
18775
18717
  this.searchQuerySubmit.emit('');
18776
18718
  }
18777
- // -- Persistence --
18778
18719
  loadState() {
18779
18720
  const k = this.storageKey();
18780
18721
  if (!k)
@@ -18817,7 +18758,6 @@ class XSTableComponent {
18817
18758
  /* ignore */
18818
18759
  }
18819
18760
  }
18820
- // -- Pagination --
18821
18761
  jumpPageTimeoutId;
18822
18762
  onJumpPageInput(event) {
18823
18763
  const target = event.target;
@@ -18841,7 +18781,6 @@ class XSTableComponent {
18841
18781
  this.pageSize.set(Number(value));
18842
18782
  this.page.set(1);
18843
18783
  }
18844
- // -- Sort --
18845
18784
  toggleSort(header) {
18846
18785
  if (!header.action)
18847
18786
  return;
@@ -18858,7 +18797,6 @@ class XSTableComponent {
18858
18797
  });
18859
18798
  this.scheduleSave();
18860
18799
  }
18861
- // -- Selection --
18862
18800
  onToggleAll(checked) {
18863
18801
  this.selectedSet.update((set) => {
18864
18802
  const newSet = new Set(set);
@@ -18881,7 +18819,6 @@ class XSTableComponent {
18881
18819
  return newSet;
18882
18820
  });
18883
18821
  }
18884
- // -- Row click --
18885
18822
  onRowClick(item) {
18886
18823
  if (this.expandable()) {
18887
18824
  const id = getItemId(item, this.idKey());
@@ -18890,7 +18827,6 @@ class XSTableComponent {
18890
18827
  if (this.hasActions())
18891
18828
  this.rowClick.emit(item);
18892
18829
  }
18893
- // -- Three dots --
18894
18830
  onThreeDotsClick() {
18895
18831
  const items = this.selectedButtons().map((btn) => ({
18896
18832
  name: btn.name || btn.action,
@@ -18906,7 +18842,6 @@ class XSTableComponent {
18906
18842
  }
18907
18843
  });
18908
18844
  }
18909
- // -- Export --
18910
18845
  async onCopyVisible() {
18911
18846
  const h = this.processedHeaders();
18912
18847
  const rows = this.renderedItems();
@@ -18941,7 +18876,6 @@ class XSTableComponent {
18941
18876
  a.click();
18942
18877
  URL.revokeObjectURL(url);
18943
18878
  }
18944
- // -- Cell context --
18945
18879
  getCellContext(item, header, rowIndex) {
18946
18880
  return { $implicit: item, header, rowIndex };
18947
18881
  }
@@ -18964,7 +18898,6 @@ class XSTableComponent {
18964
18898
  return cellString(item, header, this.idKey());
18965
18899
  }
18966
18900
  trackById = (index, item) => getItemId(item, this.idKey()) || index;
18967
- // -- Column resize --
18968
18901
  onResizeStart(key, event) {
18969
18902
  event.preventDefault();
18970
18903
  const target = event.currentTarget;
@@ -18999,7 +18932,6 @@ class XSTableComponent {
18999
18932
  [this.resizeData.key]: newWidth,
19000
18933
  }));
19001
18934
  }
19002
- // -- Column toggle --
19003
18935
  toggleColumn(key) {
19004
18936
  this.visibleColumnKeys.update((current) => {
19005
18937
  const s = new Set(current ?? this.headers().map((h) => h.key));
@@ -19011,7 +18943,6 @@ class XSTableComponent {
19011
18943
  const v = this.visibleColumnKeys();
19012
18944
  return v ? v.has(key) : true;
19013
18945
  }
19014
- // -- Column reorder --
19015
18946
  onHeaderDragStart(key, event) {
19016
18947
  event.dataTransfer?.setData('text/plain', key);
19017
18948
  }
@@ -20800,9 +20731,7 @@ class XSMapLibreService {
20800
20731
  }
20801
20732
  this.loadedImages.add(url);
20802
20733
  }
20803
- catch {
20804
- // ignore
20805
- }
20734
+ catch { }
20806
20735
  }));
20807
20736
  await new Promise((r) => setTimeout(r, 50));
20808
20737
  }
@@ -23195,28 +23124,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImpo
23195
23124
  args: [{ selector: 'xs-feedback', host: { 'xs-feedback-host': '' }, imports: [CommonModule, FormsModule, XSIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"xs-feedback-container\">\n @if (state() === 'initial') {\n <div class=\"xs-feedback-row\">\n <span class=\"xs-feedback-question\">{{ effectiveQuestion() }}</span>\n <div class=\"xs-feedback-actions\">\n <button\n class=\"xs-feedback-btn xs-feedback-btn--positive\"\n (click)=\"onVote('positive')\"\n aria-label=\"Positivo\"\n type=\"button\">\n <xs-icon icon=\"thumbs-up\" size=\"sm\"></xs-icon>\n </button>\n <button\n class=\"xs-feedback-btn xs-feedback-btn--negative\"\n (click)=\"onVote('negative')\"\n aria-label=\"Negativo\"\n type=\"button\">\n <xs-icon icon=\"thumbs-down\" size=\"sm\"></xs-icon>\n </button>\n </div>\n </div>\n }\n\n @if (state() === 'positive') {\n <div class=\"xs-feedback-row\">\n <span class=\"xs-feedback-thanks\">Gracias por tu feedback</span>\n @if (effectiveAllowComment()) {\n <div class=\"xs-feedback-comment-row\">\n <input\n class=\"xs-feedback-input\"\n type=\"text\"\n placeholder=\"Comentario opcional...\"\n [ngModel]=\"commentText()\"\n (ngModelChange)=\"commentText.set($event)\"\n (keyup.enter)=\"onSubmitComment()\"\n />\n <button\n class=\"xs-feedback-submit\"\n (click)=\"onSubmitComment()\"\n type=\"button\">\n Enviar\n </button>\n <button\n class=\"xs-feedback-skip\"\n (click)=\"onSkipComment()\"\n type=\"button\">\n Omitir\n </button>\n </div>\n }\n </div>\n }\n\n @if (state() === 'negative') {\n <div class=\"xs-feedback-col\">\n <span class=\"xs-feedback-thanks\">Gracias por tu feedback</span>\n @if (effectiveShowNegativeOptions() && effectiveNegativeOptions().length > 0) {\n <span class=\"xs-feedback-subtitle\">\u00BFQu\u00E9 ha fallado?</span>\n <div class=\"xs-feedback-options\">\n @for (option of effectiveNegativeOptions(); track option) {\n <button\n class=\"xs-feedback-option\"\n [class.xs-feedback-option--selected]=\"selectedReason() === option\"\n (click)=\"onNegativeReasonSelect(option)\"\n type=\"button\">\n {{ option }}\n </button>\n }\n </div>\n }\n @if (effectiveAllowComment()) {\n <div class=\"xs-feedback-comment-row\">\n <input\n class=\"xs-feedback-input\"\n type=\"text\"\n placeholder=\"Comentario opcional...\"\n [ngModel]=\"commentText()\"\n (ngModelChange)=\"commentText.set($event)\"\n (keyup.enter)=\"onSubmitComment()\"\n />\n <button\n class=\"xs-feedback-submit\"\n (click)=\"onSubmitComment()\"\n type=\"button\">\n Enviar\n </button>\n <button\n class=\"xs-feedback-skip\"\n (click)=\"onSkipComment()\"\n type=\"button\">\n Omitir\n </button>\n </div>\n }\n </div>\n }\n\n @if (state() === 'submitted') {\n <div class=\"xs-feedback-row\">\n <span class=\"xs-feedback-thanks\">Gracias por tu feedback</span>\n </div>\n }\n</div>\n", styles: [":host{display:block;width:100%}.xs-feedback-container{width:100%;border-radius:.75rem;background-color:#18181b80;padding:.75rem 1rem}.xs-feedback-row{display:flex;align-items:center;justify-content:space-between;gap:.75rem}.xs-feedback-col{display:flex;flex-direction:column;gap:.5rem}.xs-feedback-question{font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(161 161 170 / var(--tw-text-opacity, 1))}.xs-feedback-thanks{font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.xs-feedback-subtitle{font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.xs-feedback-actions{display:flex;flex-shrink:0;align-items:center;gap:.25rem}.xs-feedback-btn{display:flex;height:1.75rem;width:1.75rem;cursor:pointer;align-items:center;justify-content:center;border-radius:.375rem;--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1));transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s}.xs-feedback-btn:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.xs-feedback-btn--positive:hover{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.xs-feedback-btn--negative:hover{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.xs-feedback-options{display:flex;flex-wrap:wrap;gap:.5rem}.xs-feedback-option{cursor:pointer;border-radius:.5rem;border-width:1px;border-color:#3f3f4680;background-color:transparent;padding:.375rem .75rem;font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(161 161 170 / var(--tw-text-opacity, 1));transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s}.xs-feedback-option:hover{--tw-border-opacity: 1;border-color:rgb(113 113 122 / var(--tw-border-opacity, 1));--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.xs-feedback-option--selected{--tw-border-opacity: 1;border-color:rgb(113 113 122 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.xs-feedback-comment-row{margin-top:.25rem;display:flex;align-items:center;gap:.5rem}.xs-feedback-input{flex:1 1 0%;border-radius:.5rem;border-width:1px;border-color:#3f3f4680;background-color:transparent;padding:.375rem .75rem;font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(212 212 216 / var(--tw-text-opacity, 1))}.xs-feedback-input::placeholder{--tw-placeholder-opacity: 1;color:rgb(82 82 91 / var(--tw-placeholder-opacity, 1))}.xs-feedback-input{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.xs-feedback-input:focus{--tw-border-opacity: 1;border-color:rgb(113 113 122 / var(--tw-border-opacity, 1));outline:2px solid transparent;outline-offset:2px}.xs-feedback-submit{cursor:pointer;border-radius:.5rem;--tw-bg-opacity: 1;background-color:rgb(63 63 70 / var(--tw-bg-opacity, 1));padding:.375rem .75rem;font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(212 212 216 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.xs-feedback-submit:hover{--tw-bg-opacity: 1;background-color:rgb(82 82 91 / var(--tw-bg-opacity, 1))}.xs-feedback-skip{cursor:pointer;border-radius:.5rem;padding:.375rem .75rem;font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.xs-feedback-skip:hover{--tw-text-opacity: 1;color:rgb(212 212 216 / var(--tw-text-opacity, 1))}\n"] }]
23196
23125
  }], propDecorators: { survey: [{ type: i0.Input, args: [{ isSignal: true, alias: "survey", required: true }] }], question: [{ type: i0.Input, args: [{ isSignal: true, alias: "question", required: false }] }], allowComment: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowComment", required: false }] }], showNegativeOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "showNegativeOptions", required: false }] }], negativeOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "negativeOptions", required: false }] }], voteSubmitted: [{ type: i0.Output, args: ["voteSubmitted"] }], commentSubmitted: [{ type: i0.Output, args: ["commentSubmitted"] }], negativeReasonSubmitted: [{ type: i0.Output, args: ["negativeReasonSubmitted"] }], dismissed: [{ type: i0.Output, args: ["dismissed"] }] } });
23197
23126
 
23198
- // Core UI primitives — always bundled
23199
-
23200
23127
  // Form components — lazy-loadable (brings @ngx-formly)
23201
23128
 
23202
- // Layout components — section titles, tabs, breadcrumbs, scroll
23203
-
23204
- // Data display — tables, lists, cards, filters, info blocks
23205
-
23206
23129
  // Chart components — lazy-loadable (brings chart.js ~220KB)
23207
23130
 
23208
- // Profile components — used in artist/event/site detail pages
23209
-
23210
- // Alert components — notification system
23211
-
23212
- // Auth components — login, register, 2FA
23213
-
23214
23131
  // Map components — lazy-loadable (brings maplibre ~1MB)
23215
23132
 
23216
- /*
23217
- * Public API Surface of xs-ui
23218
- */
23219
-
23220
23133
  const LIB_STORIES = [
23221
23134
  () => import('./xsmusices-ui-xs-action-sheet.xsstory-CBpZBlfx.mjs').then((m) => m.story),
23222
23135
  () => import('./xsmusices-ui-xs-block.xsstory-GXV6UFJo.mjs').then((m) => m.story),
@@ -23228,14 +23141,14 @@ const LIB_STORIES = [
23228
23141
  () => import('./xsmusices-ui-xs-icon.xsstory-asFaHy5H.mjs').then((m) => m.story),
23229
23142
  () => import('./xsmusices-ui-xs-image.xsstory-BaeUg3Zp.mjs').then((m) => m.story),
23230
23143
  () => import('./xsmusices-ui-xs-modal.xsstory-B96CYHF0.mjs').then((m) => m.story),
23231
- () => import('./xsmusices-ui-xs-navbar.xsstory-CkdvldoV.mjs').then((m) => m.story),
23144
+ () => import('./xsmusices-ui-xs-navbar.xsstory-DZrnLMId.mjs').then((m) => m.story),
23232
23145
  () => import('./xsmusices-ui-xs-navbar-sidebar.xsstory-DHmPSARx.mjs').then((m) => m.story),
23233
23146
  () => import('./xsmusices-ui-stats-card.xsstory-PWTUDysc.mjs').then((m) => m.story),
23234
23147
  () => import('./xsmusices-ui-xs-toast.xsstory-BBhGu-j4.mjs').then((m) => m.story),
23235
23148
  () => import('./xsmusices-ui-xs-alert.xsstory-CXTRbHHS.mjs').then((m) => m.story),
23236
23149
  () => import('./xsmusices-ui-xs-alert-group.xsstory-HMGGLHfv.mjs').then((m) => m.story),
23237
23150
  () => import('./xsmusices-ui-xs-auth.xsstory-DxO8iDpd.mjs').then((m) => m.story),
23238
- () => import('./xsmusices-ui-xs-badge.xsstory-BZnTAQWz.mjs').then((m) => m.story),
23151
+ () => import('./xsmusices-ui-xs-badge.xsstory-B1QXLQ4H.mjs').then((m) => m.story),
23239
23152
  () => import('./xsmusices-ui-xs-breadcrumbs.xsstory-CNyBeURd.mjs').then((m) => m.story),
23240
23153
  () => import('./xsmusices-ui-xs-date-mini.xsstory-DXog7Yhg.mjs').then((m) => m.story),
23241
23154
  () => import('./xsmusices-ui-xs-filter-panel.xsstory-DbvxGppo.mjs').then((m) => m.story),
@@ -23243,11 +23156,11 @@ const LIB_STORIES = [
23243
23156
  () => import('./xsmusices-ui-xs-info-blocks.xsstory-BHtaC7U6.mjs').then((m) => m.story),
23244
23157
  () => import('./xsmusices-ui-xs-item-card.xsstory-EGJ6itkx.mjs').then((m) => m.story),
23245
23158
  () => import('./xsmusices-ui-xs-item-action.xsstory-839UkJyC.mjs').then((m) => m.story),
23246
- () => import('./xsmusices-ui-xs-item-compact.xsstory-DuSgaCDY.mjs').then((m) => m.story),
23247
- () => import('./xsmusices-ui-xs-item-type.xsstory-BWJQ-hDk.mjs').then((m) => m.story),
23248
- () => import('./xsmusices-ui-xs-items-slider.xsstory-CS4xTKuJ.mjs').then((m) => m.story),
23249
- () => import('./xsmusices-ui-xs-list.xsstory-BxAErIEF.mjs').then((m) => m.story),
23250
- () => import('./xsmusices-ui-xs-map.xsstory-DBT6h0Hv.mjs').then((m) => m.story),
23159
+ () => import('./xsmusices-ui-xs-item-compact.xsstory-LhApuPL7.mjs').then((m) => m.story),
23160
+ () => import('./xsmusices-ui-xs-item-type.xsstory-DUeCnW0R.mjs').then((m) => m.story),
23161
+ () => import('./xsmusices-ui-xs-items-slider.xsstory-Dt0bXZI_.mjs').then((m) => m.story),
23162
+ () => import('./xsmusices-ui-xs-list.xsstory-lElGfvcY.mjs').then((m) => m.story),
23163
+ () => import('./xsmusices-ui-xs-map.xsstory-C__bUaLQ.mjs').then((m) => m.story),
23251
23164
  () => import('./xsmusices-ui-xs-maplibre.xsstory-u_NroLqJ.mjs').then((m) => m.story),
23252
23165
  () => import('./xsmusices-ui-xs-profile-comments.xsstory-CHpCDxLe.mjs').then((m) => m.story),
23253
23166
  () => import('./xsmusices-ui-xs-profile-current-event.xsstory-BtRq4wE4.mjs').then((m) => m.story),
@@ -23261,7 +23174,7 @@ const LIB_STORIES = [
23261
23174
  () => import('./xsmusices-ui-xs-profile-verified.xsstory-HtbUlJFX.mjs').then((m) => m.story),
23262
23175
  () => import('./xsmusices-ui-xs-skeleton-for-slider.xsstory-k-uutKIV.mjs').then((m) => m.story),
23263
23176
  () => import('./xsmusices-ui-xs-table-items.xsstory-vR5x6wZe.mjs').then((m) => m.story),
23264
- () => import('./xsmusices-ui-xs-table.xsstory-DXiZHI7p.mjs').then((m) => m.story),
23177
+ () => import('./xsmusices-ui-xs-table.xsstory-s13JV3k9.mjs').then((m) => m.story),
23265
23178
  () => import('./xsmusices-ui-xs-title-collapse.xsstory-COqb1jdP.mjs').then((m) => m.story),
23266
23179
  () => Promise.resolve().then(function () { return xsSpinner_xsstory; }).then((m) => m.story),
23267
23180
  () => import('./xsmusices-ui-country-flag.xsstory-BPTu5b4i.mjs').then((m) => m.story),
@@ -23417,10 +23330,6 @@ const uiComponentsExportWithDateMini = [
23417
23330
  XSDateMiniComponent,
23418
23331
  ];
23419
23332
 
23420
- /*
23421
- * Public API Surface of xs-ui
23422
- */
23423
-
23424
23333
  /**
23425
23334
  * Generated bundle index. Do not edit.
23426
23335
  */