@sinequa/atomic-angular 0.1.43 → 0.1.50

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.
@@ -1,30 +1,32 @@
1
1
  import * as i0 from '@angular/core';
2
- import { input, output, Component, Injectable, inject, HostBinding, InjectionToken, computed, signal, effect, assertInInjectionContext, runInInjectionContext, Injector, EventEmitter, Inject, viewChild, ElementRef, afterNextRender, untracked, linkedSignal, model, DestroyRef, Directive, Renderer2, HostListener, contentChildren, contentChild, TemplateRef, Pipe, ChangeDetectorRef, LOCALE_ID, Optional, afterEveryRender, Output, viewChildren, ViewContainerRef } from '@angular/core';
3
- import { DropdownComponent, DropdownContentComponent, ButtonComponent, MenuComponent, MenuContentComponent, MenuItemComponent, BadgeComponent, DialogComponent, DialogHeaderComponent, DialogTitleComponent, DialogContentComponent, DialogFooterComponent, ListItemComponent, InputComponent, cn, SwitchComponent, DialogService, TabsComponent, TabComponent, searchVariants, SearchIcon, XMarkIConComponent, PopoverContentComponent, HorizontalDividerComponent, PopoverComponent, ChevronRightIconComponent, LoadingCircleIconComponent, CircleCheckIconComponent, CardComponent, CardHeaderComponent, CardContentComponent, CardFooterComponent, VerticalDividerComponent } from '@sinequa/ui';
2
+ import { input, output, Component, Injectable, inject, HostBinding, InjectionToken, computed, signal, effect, assertInInjectionContext, runInInjectionContext, Injector, Inject, EventEmitter, viewChild, ElementRef, afterNextRender, untracked, Pipe, ChangeDetectorRef, DestroyRef, LOCALE_ID, Optional, linkedSignal, model, Directive, Renderer2, HostListener, contentChildren, contentChild, TemplateRef, booleanAttribute, afterEveryRender, Output, viewChildren, ViewContainerRef, resource } from '@angular/core';
3
+ import { DropdownComponent, DropdownContentComponent, ButtonComponent, MenuComponent, MenuContentComponent, MenuItemComponent, BadgeComponent, DialogComponent, DialogHeaderComponent, DialogTitleComponent, DialogContentComponent, DialogFooterComponent, ListItemComponent, InputComponent, cn, SwitchComponent, SelectOptionDirective, DialogService, TabsComponent, TabComponent, SearchIcon, XMarkIConComponent, PopoverContentComponent, HorizontalDividerComponent, PopoverComponent, ChevronRightIconComponent, LoadingCircleIconComponent, CircleCheckIconComponent, CardComponent, CardHeaderComponent, CardContentComponent, CardFooterComponent, VerticalDividerComponent } from '@sinequa/ui';
4
4
  import { BehaviorSubject, Subscription, catchError, EMPTY, firstValueFrom, map, Subject, of, tap, throwError, from, forkJoin, filter, shareReplay, fromEvent, switchMap, debounceTime } from 'rxjs';
5
5
  import { ActivatedRoute, Router, NavigationEnd, RouterLink, RouterModule } from '@angular/router';
6
6
  import { signalStore, signalStoreFeature, withState, withMethods, patchState, getState, withComputed } from '@ngrx/signals';
7
7
  import { withDevtools } from '@angular-architects/ngrx-toolkit';
8
- import { globalConfig, EngineType, getQueryParamsFromUrl, warn, error, buildPathsAndLevels, info, escapeExpr, notify, isAuthenticated, patchUserSettings, deleteUserSettings, fetchUserSettings, fetchSuggest, isObject, Audit, login, setGlobalConfig, addConcepts, queryParamsFromUrl, getMetadata, bisect, isNotInputEvent, sysLang, fetchSponsoredLinks, isJsonable, addAuditAdditionalInfo, getToken, setToken, logout, getRelativeDate, labels, fetchLabels, guid, suggestionsToTreeAggregationNodes, fetchSuggestField, translateAggregationToDateOptions, fetchSimilarDocuments } from '@sinequa/atomic';
8
+ import { globalConfig, EngineType, getQueryParamsFromUrl, warn, error, buildPathsAndLevels, info, escapeExpr, notify, isAuthenticated, patchUserSettings, deleteUserSettings, fetchUserSettings, fetchSuggest, isObject, Audit, login, setGlobalConfig, addConcepts, queryParamsFromUrl, sysLang, getMetadata, bisect, isNotInputEvent, fetchSponsoredLinks, isJsonable, addAuditAdditionalInfo, getToken, setToken, logout, getRelativeDate, labels, fetchLabels, guid, suggestionsToTreeAggregationNodes, fetchSuggestField, translateAggregationToDateOptions, fetchSimilarDocuments } from '@sinequa/atomic';
9
9
  import { HttpClient, HttpParams, HttpResponse } from '@angular/common/http';
10
10
  import { Title, DomSanitizer } from '@angular/platform-browser';
11
- import { Location, DatePipe, DATE_PIPE_DEFAULT_TIMEZONE, DATE_PIPE_DEFAULT_OPTIONS, NgTemplateOutlet, NgStyle, NgClass, NgComponentOutlet, AsyncPipe } from '@angular/common';
11
+ import { Location, DatePipe, DATE_PIPE_DEFAULT_TIMEZONE, DATE_PIPE_DEFAULT_OPTIONS, NgTemplateOutlet, NgStyle, NgClass, NgComponentOutlet } from '@angular/common';
12
12
  import { TranslocoPipe, provideTranslocoScope, TranslocoService } from '@jsverse/transloco';
13
+ import highlightWords from 'highlight-words';
14
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
13
15
  import { cva } from 'class-variance-authority';
14
16
  import * as i1 from '@angular/forms';
15
17
  import { FormsModule, ReactiveFormsModule, FormGroup, FormControl, NonNullableFormBuilder } from '@angular/forms';
16
- import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
17
- import highlightWords from 'highlight-words';
18
18
  import { catchError as catchError$1 } from 'rxjs/operators';
19
19
  import * as i1$1 from '@angular/cdk/drag-drop';
20
20
  import { DragDropModule } from '@angular/cdk/drag-drop';
21
+ import * as i2 from '@angular/cdk/a11y';
22
+ import { A11yModule } from '@angular/cdk/a11y';
21
23
  import { Overlay } from '@angular/cdk/overlay';
22
24
 
23
25
  class DropdownListComponent {
24
26
  items = input.required(...(ngDevMode ? [{ debugName: "items" }] : []));
25
27
  onClick = output();
26
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: DropdownListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
27
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: DropdownListComponent, isStandalone: true, selector: "dropdown-list, DropdownList", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { onClick: "onClick" }, ngImport: i0, template: `
28
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: DropdownListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
29
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: DropdownListComponent, isStandalone: true, selector: "dropdown-list, DropdownList", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { onClick: "onClick" }, ngImport: i0, template: `
28
30
  @for (item of items(); track $index) {
29
31
  <span class="bg-primary text-primary-foreground m-1 inline-flex cursor-default select-none items-center rounded-full px-2 py-1 text-sm font-semibold">
30
32
  {{ item.display || item.value }}
@@ -45,7 +47,7 @@ class DropdownListComponent {
45
47
  }
46
48
  `, isInline: true });
47
49
  }
48
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: DropdownListComponent, decorators: [{
50
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: DropdownListComponent, decorators: [{
49
51
  type: Component,
50
52
  args: [{
51
53
  selector: 'dropdown-list, DropdownList',
@@ -83,8 +85,8 @@ class DropdownInputComponent {
83
85
  onKeyUp = output(); // emits the input value
84
86
  removeItem = output();
85
87
  addItem = output();
86
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: DropdownInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
87
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: DropdownInputComponent, isStandalone: true, selector: "dropdown-input, DropdownInput", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, noResultLabel: { classPropertyName: "noResultLabel", publicName: "noResultLabel", isSignal: true, isRequired: false, transformFunction: null }, suggestions: { classPropertyName: "suggestions", publicName: "suggestions", isSignal: true, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { onFocus: "onFocus", onKeyUp: "onKeyUp", removeItem: "removeItem", addItem: "addItem" }, ngImport: i0, template: `
88
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: DropdownInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
89
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: DropdownInputComponent, isStandalone: true, selector: "dropdown-input, DropdownInput", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, noResultLabel: { classPropertyName: "noResultLabel", publicName: "noResultLabel", isSignal: true, isRequired: false, transformFunction: null }, suggestions: { classPropertyName: "suggestions", publicName: "suggestions", isSignal: true, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { onFocus: "onFocus", onKeyUp: "onKeyUp", removeItem: "removeItem", addItem: "addItem" }, ngImport: i0, template: `
88
90
  @if (label()) {
89
91
  <p class="font-semibold">{{ label() }}</p>
90
92
  }
@@ -118,7 +120,7 @@ class DropdownInputComponent {
118
120
  </Dropdown>
119
121
  `, isInline: true, dependencies: [{ kind: "component", type: DropdownComponent, selector: "dropdown, Dropdown", inputs: ["disabled"] }, { kind: "component", type: DropdownListComponent, selector: "dropdown-list, DropdownList", inputs: ["items"], outputs: ["onClick"] }, { kind: "directive", type: DropdownContentComponent, selector: "dropdown-content, dropdowncontent, DropdownContent", inputs: ["class", "position"] }] });
120
122
  }
121
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: DropdownInputComponent, decorators: [{
123
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: DropdownInputComponent, decorators: [{
122
124
  type: Component,
123
125
  args: [{
124
126
  selector: 'dropdown-input, DropdownInput',
@@ -168,10 +170,10 @@ class BackdropService {
168
170
  hide() {
169
171
  this.isVisible.next(false);
170
172
  }
171
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: BackdropService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
172
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: BackdropService, providedIn: 'root' });
173
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: BackdropService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
174
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: BackdropService, providedIn: 'root' });
173
175
  }
174
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: BackdropService, decorators: [{
176
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: BackdropService, decorators: [{
175
177
  type: Injectable,
176
178
  args: [{
177
179
  providedIn: 'root'
@@ -188,13 +190,13 @@ class BackdropComponent {
188
190
  ngOnDestroy() {
189
191
  this.sub.unsubscribe();
190
192
  }
191
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: BackdropComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
192
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.1.2", type: BackdropComponent, isStandalone: true, selector: "app-backdrop", host: { properties: { "attr.backdrop-visible": "this.backdropVisible" }, classAttribute: "z-[var(--z-backdrop)] bg-backdrop absolute bottom-0 left-0 right-0 top-0 hidden select-none" }, ngImport: i0, template: ``, isInline: true, styles: [":host{--backdrop-animation-duration: .25s;animation:hide-backdrop var(--backdrop-animation-duration, .25s) ease-out;@keyframes show-backdrop{0%{display:none;opacity:0}1%{display:block}to{opacity:1}}@keyframes hide-backdrop{0%{display:block;opacity:1}99%{opacity:0}to{display:none}}}:host[backdrop-visible=true]{display:block;animation:show-backdrop var(--backdrop-animation-duration, .25s) ease-out}\n"] });
193
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: BackdropComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
194
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.1.7", type: BackdropComponent, isStandalone: true, selector: "Backdrop, backdrop", host: { properties: { "attr.backdrop-visible": "this.backdropVisible" }, classAttribute: "z-[var(--z-backdrop)] bg-backdrop fixed bottom-0 left-0 right-0 top-0 hidden select-none" }, ngImport: i0, template: ``, isInline: true, styles: [":host{--backdrop-animation-duration: .25s;animation:hide-backdrop var(--backdrop-animation-duration, .25s) ease-out;@keyframes show-backdrop{0%{display:none;opacity:0}1%{display:block}to{opacity:1}}@keyframes hide-backdrop{0%{display:block;opacity:1}99%{opacity:0}to{display:none}}}:host[backdrop-visible=true]{display:block;animation:show-backdrop var(--backdrop-animation-duration, .25s) ease-out}\n"] });
193
195
  }
194
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: BackdropComponent, decorators: [{
196
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: BackdropComponent, decorators: [{
195
197
  type: Component,
196
- args: [{ selector: 'app-backdrop', standalone: true, imports: [], template: ``, host: {
197
- class: 'z-[var(--z-backdrop)] bg-backdrop absolute bottom-0 left-0 right-0 top-0 hidden select-none'
198
+ args: [{ selector: 'Backdrop, backdrop', standalone: true, imports: [], template: ``, host: {
199
+ class: 'z-[var(--z-backdrop)] bg-backdrop fixed bottom-0 left-0 right-0 top-0 hidden select-none'
198
200
  }, styles: [":host{--backdrop-animation-duration: .25s;animation:hide-backdrop var(--backdrop-animation-duration, .25s) ease-out;@keyframes show-backdrop{0%{display:none;opacity:0}1%{display:block}to{opacity:1}}@keyframes hide-backdrop{0%{display:block;opacity:1}99%{opacity:0}to{display:none}}}:host[backdrop-visible=true]{display:block;animation:show-backdrop var(--backdrop-animation-duration, .25s) ease-out}\n"] }]
199
201
  }], ctorParameters: () => [], propDecorators: { backdropVisible: [{
200
202
  type: HostBinding,
@@ -295,10 +297,10 @@ class AppService {
295
297
  return EMPTY;
296
298
  }));
297
299
  }
298
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: AppService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
299
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: AppService, providedIn: 'root' });
300
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: AppService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
301
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: AppService, providedIn: 'root' });
300
302
  }
301
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: AppService, decorators: [{
303
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: AppService, decorators: [{
302
304
  type: Injectable,
303
305
  args: [{
304
306
  providedIn: 'root'
@@ -492,7 +494,7 @@ function withAppFeatures() {
492
494
  const schema = state.indexes?.['_']?.columns;
493
495
  const col = schema[column];
494
496
  if (col) {
495
- return col.aliases?.[0] || column;
497
+ return col.aliases?.[0] ? `${col.aliases[0].charAt(0).toLowerCase()}${col.aliases[0].slice(1)}` : column;
496
498
  }
497
499
  return column;
498
500
  },
@@ -763,7 +765,7 @@ function withExtractsFeatures() {
763
765
  * @returns The extracts associated with the given ID.
764
766
  */
765
767
  getExtracts(id) {
766
- return store.extracts().get(id);
768
+ return store.extracts().get(id) || [];
767
769
  }
768
770
  })));
769
771
  }
@@ -796,10 +798,10 @@ class PrincipalService {
796
798
  return EMPTY;
797
799
  }));
798
800
  }
799
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: PrincipalService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
800
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: PrincipalService, providedIn: 'root' });
801
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: PrincipalService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
802
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: PrincipalService, providedIn: 'root' });
801
803
  }
802
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: PrincipalService, decorators: [{
804
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: PrincipalService, decorators: [{
803
805
  type: Injectable,
804
806
  args: [{
805
807
  providedIn: 'root'
@@ -1228,10 +1230,10 @@ class QueryService {
1228
1230
  };
1229
1231
  this.queryParamsStore.patch({ page }, audit);
1230
1232
  }
1231
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: QueryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1232
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: QueryService, providedIn: 'root' });
1233
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: QueryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1234
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: QueryService, providedIn: 'root' });
1233
1235
  }
1234
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: QueryService, decorators: [{
1236
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: QueryService, decorators: [{
1235
1237
  type: Injectable,
1236
1238
  args: [{
1237
1239
  providedIn: 'root'
@@ -1478,10 +1480,10 @@ class AggregationsService {
1478
1480
  }
1479
1481
  return node;
1480
1482
  }
1481
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: AggregationsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1482
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: AggregationsService, providedIn: 'root' });
1483
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: AggregationsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1484
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: AggregationsService, providedIn: 'root' });
1483
1485
  }
1484
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: AggregationsService, decorators: [{
1486
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: AggregationsService, decorators: [{
1485
1487
  type: Injectable,
1486
1488
  args: [{
1487
1489
  providedIn: 'root'
@@ -1888,6 +1890,25 @@ function withBookmarkFeatures() {
1888
1890
  })));
1889
1891
  }
1890
1892
 
1893
+ function withDarkModeFeatures() {
1894
+ return signalStoreFeature(withState({ useDarkMode: false }), withMethods(store => ({
1895
+ async setDarkMode(useDarkMode) {
1896
+ const currentDarkMode = store.useDarkMode();
1897
+ if (currentDarkMode === useDarkMode)
1898
+ return;
1899
+ await patchUserSettings({ useDarkMode });
1900
+ patchState(store, state => {
1901
+ return { ...state, useDarkMode };
1902
+ });
1903
+ }
1904
+ })), withMethods(store => ({
1905
+ async toggleDarkMode() {
1906
+ const currentDarkMode = store.useDarkMode();
1907
+ await store.setDarkMode(!currentDarkMode);
1908
+ }
1909
+ })));
1910
+ }
1911
+
1891
1912
  function withRecentSearchesFeatures() {
1892
1913
  return signalStoreFeature(withState({ recentSearches: [] }), withMethods(store => ({
1893
1914
  /**
@@ -2021,7 +2042,13 @@ function withSavedSearchesFeatures() {
2021
2042
  if (!search)
2022
2043
  return undefined;
2023
2044
  const savedSearches = store.savedSearches();
2024
- return savedSearches?.find(savedSearch => savedSearch.display === search);
2045
+ return savedSearches?.find(savedSearch => {
2046
+ const queryParams = savedSearch.url.split('?')[1];
2047
+ if (!queryParams)
2048
+ return false;
2049
+ const q = queryParams.split('&').find(qp => qp.startsWith('q='));
2050
+ return !!q && decodeURI(q.substring(2)) === search;
2051
+ });
2025
2052
  }
2026
2053
  })));
2027
2054
  }
@@ -2070,7 +2097,7 @@ function withUserSettingsFeatures() {
2070
2097
  })));
2071
2098
  }
2072
2099
 
2073
- const UserSettingsStore = signalStore({ providedIn: 'root' }, withDevtools('UserSettings'), withBookmarkFeatures(), withRecentSearchesFeatures(), withSavedSearchesFeatures(), withBasketsFeatures(), withAssistantFeatures(), withUserSettingsFeatures(), withAlertsFeatures());
2100
+ const UserSettingsStore = signalStore({ providedIn: 'root' }, withDevtools('UserSettings'), withBookmarkFeatures(), withRecentSearchesFeatures(), withSavedSearchesFeatures(), withBasketsFeatures(), withAssistantFeatures(), withUserSettingsFeatures(), withAlertsFeatures(), withDarkModeFeatures());
2074
2101
 
2075
2102
  const ROUTE_COMPONENTS = new InjectionToken('ROUTE_COMPONENTS', { factory: () => [] });
2076
2103
  class ApplicationService {
@@ -2311,10 +2338,10 @@ class ApplicationService {
2311
2338
  document.documentElement.style.setProperty('--logo-large', `url('${light.large}')`);
2312
2339
  }
2313
2340
  }
2314
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: ApplicationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2315
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: ApplicationService, providedIn: 'root' });
2341
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ApplicationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2342
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ApplicationService, providedIn: 'root' });
2316
2343
  }
2317
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: ApplicationService, decorators: [{
2344
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ApplicationService, decorators: [{
2318
2345
  type: Injectable,
2319
2346
  args: [{
2320
2347
  providedIn: 'root'
@@ -2426,10 +2453,10 @@ class AuditService {
2426
2453
  }
2427
2454
  });
2428
2455
  }
2429
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: AuditService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2430
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: AuditService, providedIn: 'root' });
2456
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: AuditService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2457
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: AuditService, providedIn: 'root' });
2431
2458
  }
2432
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: AuditService, decorators: [{
2459
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: AuditService, decorators: [{
2433
2460
  type: Injectable,
2434
2461
  args: [{
2435
2462
  providedIn: 'root'
@@ -2500,10 +2527,10 @@ class AutocompleteService {
2500
2527
  }
2501
2528
  return items;
2502
2529
  }
2503
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: AutocompleteService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2504
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: AutocompleteService, providedIn: 'root' });
2530
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: AutocompleteService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2531
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: AutocompleteService, providedIn: 'root' });
2505
2532
  }
2506
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: AutocompleteService, decorators: [{
2533
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: AutocompleteService, decorators: [{
2507
2534
  type: Injectable,
2508
2535
  args: [{
2509
2536
  providedIn: 'root'
@@ -2541,10 +2568,10 @@ class JsonMethodPluginService {
2541
2568
  ...options
2542
2569
  });
2543
2570
  }
2544
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: JsonMethodPluginService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2545
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: JsonMethodPluginService, providedIn: 'root' });
2571
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: JsonMethodPluginService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2572
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: JsonMethodPluginService, providedIn: 'root' });
2546
2573
  }
2547
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: JsonMethodPluginService, decorators: [{
2574
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: JsonMethodPluginService, decorators: [{
2548
2575
  type: Injectable,
2549
2576
  args: [{
2550
2577
  providedIn: 'root'
@@ -2576,10 +2603,10 @@ class NavigationService {
2576
2603
  this.auditService.notifyRouteChange(url);
2577
2604
  }
2578
2605
  }), tap(event => (this.urlAfterNavigation = event.url)), shareReplay(1));
2579
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: NavigationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2580
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: NavigationService, providedIn: 'root' });
2606
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: NavigationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2607
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: NavigationService, providedIn: 'root' });
2581
2608
  }
2582
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: NavigationService, decorators: [{
2609
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: NavigationService, decorators: [{
2583
2610
  type: Injectable,
2584
2611
  args: [{
2585
2612
  providedIn: 'root'
@@ -2637,7 +2664,8 @@ class PreviewService {
2637
2664
  sanitizer = inject(DomSanitizer);
2638
2665
  queryService = inject(QueryService);
2639
2666
  auditService = inject(AuditService);
2640
- events = new EventEmitter();
2667
+ events = signal('idle', ...(ngDevMode ? [{ debugName: "events" }] : []));
2668
+ DOMContentLoaded = signal(false, ...(ngDevMode ? [{ debugName: "DOMContentLoaded" }] : []));
2641
2669
  // ! worker
2642
2670
  onMessage = new Subject();
2643
2671
  worker;
@@ -2679,12 +2707,13 @@ class PreviewService {
2679
2707
  const { app } = globalConfig;
2680
2708
  // when the iframe is ready, we can send the init message
2681
2709
  if (message.type === 'ready') {
2710
+ this.DOMContentLoaded.set(true);
2682
2711
  // Initialize the preview iframe with the app name and highlights
2683
2712
  // app name is used to intialize the webworker
2684
2713
  this.sendMessage({ action: 'init', highlights: this.highlights, appname: app });
2685
2714
  if (this.previewData) {
2686
2715
  const { id } = getState(this.selectionStore);
2687
- this.events.emit('fetching');
2716
+ this.events.set('fetching');
2688
2717
  this.retrieveHtmlContent(id, this.highlightCategory, this.previewData);
2689
2718
  }
2690
2719
  }
@@ -2697,7 +2726,7 @@ class PreviewService {
2697
2726
  if (this.previewData) {
2698
2727
  const extracts = this.fetchExtracts(id, message.data, this.previewData);
2699
2728
  this.applicationStore.updateExtracts(this.previewData?.record.id || '', extracts);
2700
- this.events.emit('fetched');
2729
+ this.events.set('fetched');
2701
2730
  }
2702
2731
  }
2703
2732
  }
@@ -2706,7 +2735,7 @@ class PreviewService {
2706
2735
  if (message.type === 'get-html-results-webworker') {
2707
2736
  info('get html results with worker');
2708
2737
  if (message.data.extracts.length === 0) {
2709
- this.events.emit('fetched');
2738
+ this.events.set('fetched');
2710
2739
  this.applicationStore.updateExtracts(this.previewData?.record.id || '', []);
2711
2740
  return;
2712
2741
  }
@@ -2715,7 +2744,7 @@ class PreviewService {
2715
2744
  text: this.sanitizer.bypassSecurityTrustHtml(item.text)
2716
2745
  }));
2717
2746
  this.applicationStore.updateExtracts(this.previewData?.record.id || '', extracts);
2718
- this.events.emit('fetched');
2747
+ this.events.set('fetched');
2719
2748
  }
2720
2749
  }
2721
2750
  /**
@@ -2953,10 +2982,10 @@ class PreviewService {
2953
2982
  // merge the entities with the default highlights without duplicates
2954
2983
  this.entities = [...new Set([...this.entities, ...entities])];
2955
2984
  }
2956
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: PreviewService, deps: [{ token: i0.DestroyRef }, { token: HIGHLIGHTS }], target: i0.ɵɵFactoryTarget.Injectable });
2957
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: PreviewService, providedIn: 'root' });
2985
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: PreviewService, deps: [{ token: i0.DestroyRef }, { token: HIGHLIGHTS }], target: i0.ɵɵFactoryTarget.Injectable });
2986
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: PreviewService, providedIn: 'root' });
2958
2987
  }
2959
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: PreviewService, decorators: [{
2988
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: PreviewService, decorators: [{
2960
2989
  type: Injectable,
2961
2990
  args: [{
2962
2991
  providedIn: 'root'
@@ -3025,10 +3054,10 @@ class SavedSearchesService {
3025
3054
  deleteSavedSearch(index) {
3026
3055
  this.userSettingsStore.deleteSavedSearch(index);
3027
3056
  }
3028
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SavedSearchesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
3029
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SavedSearchesService, providedIn: 'root' });
3057
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SavedSearchesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
3058
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SavedSearchesService, providedIn: 'root' });
3030
3059
  }
3031
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SavedSearchesService, decorators: [{
3060
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SavedSearchesService, decorators: [{
3032
3061
  type: Injectable,
3033
3062
  args: [{
3034
3063
  providedIn: 'root'
@@ -3121,10 +3150,10 @@ class SearchService {
3121
3150
  }
3122
3151
  });
3123
3152
  }
3124
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SearchService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
3125
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SearchService, providedIn: 'root' });
3153
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SearchService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
3154
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SearchService, providedIn: 'root' });
3126
3155
  }
3127
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SearchService, decorators: [{
3156
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SearchService, decorators: [{
3128
3157
  type: Injectable,
3129
3158
  args: [{
3130
3159
  providedIn: 'root'
@@ -3273,10 +3302,10 @@ class SelectionService {
3273
3302
  const url = this.router.createUrlTree([], { relativeTo: this.route, queryParams }).toString();
3274
3303
  this.location.replaceState(url);
3275
3304
  }
3276
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SelectionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
3277
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SelectionService, providedIn: 'root' });
3305
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SelectionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
3306
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SelectionService, providedIn: 'root' });
3278
3307
  }
3279
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SelectionService, decorators: [{
3308
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SelectionService, decorators: [{
3280
3309
  type: Injectable,
3281
3310
  args: [{
3282
3311
  providedIn: 'root'
@@ -3360,10 +3389,10 @@ class SelectionHistoryService {
3360
3389
  this.selectionHistoryEvent.next('back');
3361
3390
  return last;
3362
3391
  }
3363
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SelectionHistoryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
3364
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SelectionHistoryService, providedIn: 'root' });
3392
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SelectionHistoryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
3393
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SelectionHistoryService, providedIn: 'root' });
3365
3394
  }
3366
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SelectionHistoryService, decorators: [{
3395
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SelectionHistoryService, decorators: [{
3367
3396
  type: Injectable,
3368
3397
  args: [{
3369
3398
  providedIn: 'root'
@@ -3398,10 +3427,10 @@ class TextChunkService {
3398
3427
  return [];
3399
3428
  }));
3400
3429
  }
3401
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: TextChunkService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
3402
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: TextChunkService, providedIn: 'root' });
3430
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: TextChunkService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
3431
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: TextChunkService, providedIn: 'root' });
3403
3432
  }
3404
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: TextChunkService, decorators: [{
3433
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: TextChunkService, decorators: [{
3405
3434
  type: Injectable,
3406
3435
  args: [{
3407
3436
  providedIn: 'root'
@@ -3703,8 +3732,11 @@ function withQueryParamsFeatures() {
3703
3732
  }
3704
3733
  if (filter && filter.value)
3705
3734
  return { ...filter, count: 1 };
3706
- if (filter && filter.values)
3707
- return { ...filter, count: filter.values.length };
3735
+ if (filter && filter.values) {
3736
+ // "filter.values" is an array of strings, Set() automatically deletes duplicates
3737
+ const uniqueValues = new Set(filter.values);
3738
+ return { ...filter, count: uniqueValues.size };
3739
+ }
3708
3740
  if (filter && Array.isArray(filter.filters) === false)
3709
3741
  return { ...filter, count: 1 };
3710
3742
  if (filter && Array.isArray(filter.filters))
@@ -3889,10 +3921,10 @@ class SourceComponent {
3889
3921
  }
3890
3922
  return { iconClass: defaultIconClass };
3891
3923
  }, ...(ngDevMode ? [{ debugName: "iconDetails" }] : []));
3892
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SourceComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3893
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: SourceComponent, isStandalone: true, selector: "source, Source", inputs: { collection: { classPropertyName: "collection", publicName: "collection", isSignal: true, isRequired: false, transformFunction: null }, connector: { classPropertyName: "connector", publicName: "connector", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideTranslocoScope('sources')], ngImport: i0, template: "@if (iconDetails()?.iconPath) {\n <img [src]=\"iconDetails()?.iconPath\" [alt]=\"collection()?.[0] || ('sources.sourceIcon' | transloco)\" />\n} @else {\n <i class=\"{{ iconDetails()?.iconClass }}\" [attr.aria-label]=\"'sources.sourceIcon' | transloco\"></i>\n}\n", dependencies: [{ kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
3924
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SourceComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3925
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: SourceComponent, isStandalone: true, selector: "source, Source", inputs: { collection: { classPropertyName: "collection", publicName: "collection", isSignal: true, isRequired: false, transformFunction: null }, connector: { classPropertyName: "connector", publicName: "connector", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideTranslocoScope('sources')], ngImport: i0, template: "@if (iconDetails()?.iconPath) {\n <img [src]=\"iconDetails()?.iconPath\" [alt]=\"collection()?.[0] || ('sources.sourceIcon' | transloco)\" />\n} @else {\n <i class=\"{{ iconDetails()?.iconClass }}\" [attr.aria-label]=\"'sources.sourceIcon' | transloco\"></i>\n}\n", dependencies: [{ kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
3894
3926
  }
3895
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SourceComponent, decorators: [{
3927
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SourceComponent, decorators: [{
3896
3928
  type: Component,
3897
3929
  args: [{ selector: 'source, Source', standalone: true, imports: [TranslocoPipe], providers: [provideTranslocoScope('sources')], template: "@if (iconDetails()?.iconPath) {\n <img [src]=\"iconDetails()?.iconPath\" [alt]=\"collection()?.[0] || ('sources.sourceIcon' | transloco)\" />\n} @else {\n <i class=\"{{ iconDetails()?.iconClass }}\" [attr.aria-label]=\"'sources.sourceIcon' | transloco\"></i>\n}\n" }]
3898
3930
  }] });
@@ -3977,8 +4009,8 @@ class DocumentLocatorComponent {
3977
4009
  const { filters } = getState(this.queryParamStore);
3978
4010
  this.router.navigate([], { queryParams: { f: JSON.stringify(filters) }, queryParamsHandling: 'merge' });
3979
4011
  }
3980
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: DocumentLocatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3981
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: DocumentLocatorComponent, isStandalone: true, selector: "document-locator, DocumentLocator", inputs: { article: { classPropertyName: "article", publicName: "article", isSignal: true, isRequired: true, transformFunction: null }, aggregation: { classPropertyName: "aggregation", publicName: "aggregation", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: "flex items-center grow gap-2 overflow-hidden" }, viewQueries: [{ propertyName: "shadow", first: true, predicate: ["shadowRender"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "client", first: true, predicate: ["documentLocator"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: `
4012
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: DocumentLocatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4013
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: DocumentLocatorComponent, isStandalone: true, selector: "document-locator, DocumentLocator", inputs: { article: { classPropertyName: "article", publicName: "article", isSignal: true, isRequired: true, transformFunction: null }, aggregation: { classPropertyName: "aggregation", publicName: "aggregation", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: "flex items-center grow gap-2 overflow-hidden" }, viewQueries: [{ propertyName: "shadow", first: true, predicate: ["shadowRender"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "client", first: true, predicate: ["documentLocator"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: `
3982
4014
  <!-- Renders all segment hidden to user to compute width -->
3983
4015
  <div #shadowRender class="pointer-events-none invisible absolute left-0 top-0 -z-10 flex gap-2">
3984
4016
  @for (segment of locationSegments(); track $index) {
@@ -3996,7 +4028,7 @@ class DocumentLocatorComponent {
3996
4028
 
3997
4029
  <div #documentLocator class="flex grow items-center gap-2 overflow-auto">
3998
4030
  @for (segment of visibleSegments(); track $index) {
3999
- <span class="cursor-pointer whitespace-nowrap" role="button" (click)="navigateToSegment($index)">{{ segment }}</span>
4031
+ <button decoration="underline" class="text-foreground cursor-pointer whitespace-nowrap p-0" (click)="navigateToSegment($index)">{{ segment }}</button>
4000
4032
 
4001
4033
  @if (!$last) {
4002
4034
  <i class="fa fal fa-chevron-right"></i>
@@ -4009,7 +4041,7 @@ class DocumentLocatorComponent {
4009
4041
 
4010
4042
  @if (invisibleSegments().length > 0) {
4011
4043
  <menu>
4012
- <button variant="outline" class="h-0 w-full p-2">...</button>
4044
+ <button class="h-0 w-full p-2">...</button>
4013
4045
 
4014
4046
  <MenuContent position="bottom">
4015
4047
  @for (segment of invisibleSegments(); track $index) {
@@ -4021,9 +4053,9 @@ class DocumentLocatorComponent {
4021
4053
  </menu>
4022
4054
  }
4023
4055
  </div>
4024
- `, isInline: true, dependencies: [{ kind: "component", type: SourceComponent, selector: "source, Source", inputs: ["collection", "connector"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "component", type: MenuComponent, selector: "menu, Menu", inputs: ["disabled"] }, { kind: "directive", type: MenuContentComponent, selector: "MenuContent, menucontent, menu-content", inputs: ["class", "position"] }, { kind: "directive", type: MenuItemComponent, selector: "menu-item, menuitem, MenuItem", inputs: ["class", "variant"] }] });
4056
+ `, isInline: true, dependencies: [{ kind: "component", type: SourceComponent, selector: "source, Source", inputs: ["collection", "connector"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "decoration", "size"] }, { kind: "component", type: MenuComponent, selector: "menu, Menu", inputs: ["disabled"] }, { kind: "directive", type: MenuContentComponent, selector: "MenuContent, menucontent, menu-content", inputs: ["class", "position"] }, { kind: "directive", type: MenuItemComponent, selector: "menu-item, menuitem, MenuItem", inputs: ["class", "variant", "decoration"] }] });
4025
4057
  }
4026
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: DocumentLocatorComponent, decorators: [{
4058
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: DocumentLocatorComponent, decorators: [{
4027
4059
  type: Component,
4028
4060
  args: [{
4029
4061
  selector: 'document-locator, DocumentLocator',
@@ -4047,7 +4079,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
4047
4079
 
4048
4080
  <div #documentLocator class="flex grow items-center gap-2 overflow-auto">
4049
4081
  @for (segment of visibleSegments(); track $index) {
4050
- <span class="cursor-pointer whitespace-nowrap" role="button" (click)="navigateToSegment($index)">{{ segment }}</span>
4082
+ <button decoration="underline" class="text-foreground cursor-pointer whitespace-nowrap p-0" (click)="navigateToSegment($index)">{{ segment }}</button>
4051
4083
 
4052
4084
  @if (!$last) {
4053
4085
  <i class="fa fal fa-chevron-right"></i>
@@ -4060,7 +4092,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
4060
4092
 
4061
4093
  @if (invisibleSegments().length > 0) {
4062
4094
  <menu>
4063
- <button variant="outline" class="h-0 w-full p-2">...</button>
4095
+ <button class="h-0 w-full p-2">...</button>
4064
4096
 
4065
4097
  <MenuContent position="bottom">
4066
4098
  @for (segment of invisibleSegments(); track $index) {
@@ -4084,8 +4116,8 @@ class ErrorComponent {
4084
4116
  reload() {
4085
4117
  this.router.navigate(['/']).then(() => window.location.reload());
4086
4118
  }
4087
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: ErrorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4088
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.1.2", type: ErrorComponent, isStandalone: true, selector: "error-component, ErrorComponent", ngImport: i0, template: `
4119
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ErrorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4120
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.1.7", type: ErrorComponent, isStandalone: true, selector: "error-component, ErrorComponent", ngImport: i0, template: `
4089
4121
  <div class="bg-background text-foreground flex min-h-screen flex-col items-center justify-center">
4090
4122
  <svg
4091
4123
  class="mb-8 h-20 w-20 text-red-600"
@@ -4128,7 +4160,7 @@ class ErrorComponent {
4128
4160
  </div>
4129
4161
  `, isInline: true });
4130
4162
  }
4131
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: ErrorComponent, decorators: [{
4163
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ErrorComponent, decorators: [{
4132
4164
  type: Component,
4133
4165
  args: [{
4134
4166
  selector: 'error-component, ErrorComponent',
@@ -4225,8 +4257,8 @@ class LoadingComponent {
4225
4257
  });
4226
4258
  }
4227
4259
  }
4228
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: LoadingComponent, deps: [{ token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Component });
4229
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.1.2", type: LoadingComponent, isStandalone: true, selector: "app-wait", ngImport: i0, template: `
4260
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: LoadingComponent, deps: [{ token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Component });
4261
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.1.7", type: LoadingComponent, isStandalone: true, selector: "app-wait", ngImport: i0, template: `
4230
4262
  <div class="flex h-[100dvh] w-full items-center justify-center">
4231
4263
  <div class="flex flex-col items-center space-y-4">
4232
4264
  <span class="loader"></span>
@@ -4234,7 +4266,7 @@ class LoadingComponent {
4234
4266
  </div>
4235
4267
  `, isInline: true, styles: [".loader{--w: 96px;--h: 96px;transform:rotate(45deg);perspective:1000px;border-radius:50%;width:var(--w);height:var(--h);color:#0040bf}.loader:before,.loader:after{content:\"\";display:block;position:absolute;top:0;left:0;width:inherit;height:inherit;border-radius:50%;transform:rotateX(70deg);animation:1s spin linear infinite}.loader:after{color:#ff854a;transform:rotateY(70deg);animation-delay:.4s}@keyframes rotate{0%{transform:translate(-50%,-50%) rotate(0)}to{transform:translate(-50%,-50%) rotate(360deg)}}@keyframes rotateccw{0%{transform:translate(-50%,-50%) rotate(0)}to{transform:translate(-50%,-50%) rotate(-360deg)}}@keyframes spin{0%,to{box-shadow:.4em 0 0 0 currentcolor}12%{box-shadow:.4em .4em 0 0 currentcolor}25%{box-shadow:0 .4em 0 0 currentcolor}37%{box-shadow:-.4em .4em 0 0 currentcolor}50%{box-shadow:-.4em 0 0 0 currentcolor}62%{box-shadow:-.4em -.4em 0 0 currentcolor}75%{box-shadow:0 -.4em 0 0 currentcolor}87%{box-shadow:.4em -.4em 0 0 currentcolor}}\n"] });
4236
4268
  }
4237
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: LoadingComponent, decorators: [{
4269
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: LoadingComponent, decorators: [{
4238
4270
  type: Component,
4239
4271
  args: [{ selector: 'app-wait', standalone: true, imports: [], template: `
4240
4272
  <div class="flex h-[100dvh] w-full items-center justify-center">
@@ -4245,10 +4277,311 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
4245
4277
  `, styles: [".loader{--w: 96px;--h: 96px;transform:rotate(45deg);perspective:1000px;border-radius:50%;width:var(--w);height:var(--h);color:#0040bf}.loader:before,.loader:after{content:\"\";display:block;position:absolute;top:0;left:0;width:inherit;height:inherit;border-radius:50%;transform:rotateX(70deg);animation:1s spin linear infinite}.loader:after{color:#ff854a;transform:rotateY(70deg);animation-delay:.4s}@keyframes rotate{0%{transform:translate(-50%,-50%) rotate(0)}to{transform:translate(-50%,-50%) rotate(360deg)}}@keyframes rotateccw{0%{transform:translate(-50%,-50%) rotate(0)}to{transform:translate(-50%,-50%) rotate(-360deg)}}@keyframes spin{0%,to{box-shadow:.4em 0 0 0 currentcolor}12%{box-shadow:.4em .4em 0 0 currentcolor}25%{box-shadow:0 .4em 0 0 currentcolor}37%{box-shadow:-.4em .4em 0 0 currentcolor}50%{box-shadow:-.4em 0 0 0 currentcolor}62%{box-shadow:-.4em -.4em 0 0 currentcolor}75%{box-shadow:0 -.4em 0 0 currentcolor}87%{box-shadow:.4em -.4em 0 0 currentcolor}}\n"] }]
4246
4278
  }], ctorParameters: () => [{ type: i0.DestroyRef }] });
4247
4279
 
4280
+ /**
4281
+ * The HighlightWordPipe class is a custom pipe in the Atomic Angular library.
4282
+ * It is used to highlight a specific word within a given text.
4283
+ *
4284
+ * @remarks
4285
+ * This pipe takes in a `value` string, a `word` string to highlight, and an optional `clipBy` number to limit the length of the highlighted text.
4286
+ * It returns an array of `HighlightWords.Chunk` objects representing the highlighted portions of the text.
4287
+ *
4288
+ * @example
4289
+ * ```html
4290
+ * <div [innerHTML]="text | highlightWord:'search':10"></div>
4291
+ * ```
4292
+ *
4293
+ */
4294
+ class HighlightWordPipe {
4295
+ transform(value, word, clipBy) {
4296
+ const valueNormalized = value.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
4297
+ const wordNormalized = word.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
4298
+ return highlightWords({ text: valueNormalized, query: wordNormalized, clipBy });
4299
+ }
4300
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: HighlightWordPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
4301
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.1.7", ngImport: i0, type: HighlightWordPipe, isStandalone: true, name: "highlightWord" });
4302
+ }
4303
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: HighlightWordPipe, decorators: [{
4304
+ type: Pipe,
4305
+ args: [{
4306
+ name: 'highlightWord',
4307
+ standalone: true,
4308
+ pure: true
4309
+ }]
4310
+ }] });
4311
+
4312
+ /**
4313
+ * Pipe that transforms a collection of strings into a corresponding icon class.
4314
+ *
4315
+ * This pipe uses the first element of the collection to determine the icon class
4316
+ * based on the source name. If the collection is empty or undefined, it returns
4317
+ * a default icon class.
4318
+ *
4319
+ * @deprecated This pipe is deprecated and will be removed in the future.
4320
+ *
4321
+ * @param collection - An array of strings representing the collection.
4322
+ * @returns A string representing the icon class.
4323
+ */
4324
+ class SourceIconPipe {
4325
+ appStore = inject(AppStore);
4326
+ transform(collection) {
4327
+ if (collection === undefined || collection.length === 0) {
4328
+ return 'far fa-file';
4329
+ }
4330
+ const name = collection[0].split('/')[1];
4331
+ const sources = this.appStore.sources();
4332
+ // workplace search uses a different format for sources
4333
+ if (Array.isArray(sources)) {
4334
+ return sources.find((source) => source.name === name)?.icon || 'far fa-file';
4335
+ }
4336
+ return 'far fa-file';
4337
+ }
4338
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SourceIconPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
4339
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.1.7", ngImport: i0, type: SourceIconPipe, isStandalone: true, name: "sourceIcon" });
4340
+ }
4341
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SourceIconPipe, decorators: [{
4342
+ type: Pipe,
4343
+ args: [{
4344
+ name: 'sourceIcon',
4345
+ standalone: true,
4346
+ pure: true
4347
+ }]
4348
+ }] });
4349
+
4350
+ class OperatorPipe {
4351
+ transloco = inject(TranslocoService);
4352
+ lastTransformedValue = null;
4353
+ cdr = inject(ChangeDetectorRef);
4354
+ destroyRef = inject(DestroyRef);
4355
+ transform(filter) {
4356
+ this.transloco.langChanges$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(locale => {
4357
+ const transformedValue = this.transformFilter(filter, locale);
4358
+ if (transformedValue !== this.lastTransformedValue) {
4359
+ this.lastTransformedValue = transformedValue;
4360
+ this.cdr.markForCheck();
4361
+ }
4362
+ });
4363
+ return this.lastTransformedValue || this.transformFilter(filter);
4364
+ }
4365
+ transformFilter(filter, locale) {
4366
+ let op = this.transformOperator(filter?.operator);
4367
+ if (filter?.operator === 'between') {
4368
+ const { start, end } = filter;
4369
+ if (!start || !end) {
4370
+ return 'bad date range';
4371
+ }
4372
+ return `&gt; ${new Intl.DateTimeFormat(locale).format(new Date(start))} &le; ${new Intl.DateTimeFormat(locale).format(new Date(end))}`;
4373
+ }
4374
+ if (filter?.operator === 'and') {
4375
+ const value = filter?.display ?? filter?.value ?? '';
4376
+ const date = new Date(value);
4377
+ if (isNaN(date.getTime())) {
4378
+ return value;
4379
+ }
4380
+ else {
4381
+ return new Intl.DateTimeFormat(locale).format(date);
4382
+ }
4383
+ }
4384
+ const date = new Date(filter?.value || '');
4385
+ if (isNaN(date.getTime())) {
4386
+ return `${op} ${filter?.value || ''}`;
4387
+ }
4388
+ else {
4389
+ return `${op} ${new Intl.DateTimeFormat(locale).format(date)}`;
4390
+ }
4391
+ }
4392
+ transformOperator(operator) {
4393
+ switch (operator) {
4394
+ case 'lt':
4395
+ return '&lt;';
4396
+ case 'lte':
4397
+ return '&le;';
4398
+ case 'eq':
4399
+ return '=';
4400
+ case 'neq':
4401
+ return '&ne;';
4402
+ case 'gte':
4403
+ return '&ge;';
4404
+ case 'gt':
4405
+ return '&gt;';
4406
+ default:
4407
+ return '';
4408
+ }
4409
+ }
4410
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: OperatorPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
4411
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.1.7", ngImport: i0, type: OperatorPipe, isStandalone: true, name: "operator", pure: false });
4412
+ }
4413
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: OperatorPipe, decorators: [{
4414
+ type: Pipe,
4415
+ args: [{
4416
+ name: 'operator',
4417
+ standalone: true,
4418
+ pure: false
4419
+ }]
4420
+ }] });
4421
+
4422
+ /**
4423
+ * The `SyslangPipe` class is a custom pipe that transforms a string value using the current language.
4424
+ * This pipe is used to translate strings that are not part of the Angular i18n system.
4425
+ * This pipe exists to keep the compatibility with a legacy system that uses a custom language syntax.
4426
+ *
4427
+ * This pipe can be used in the following way:
4428
+ *
4429
+ * @example
4430
+ * <div>{{ 'Hello[fr]Bonjour' | syslang }}</div>
4431
+ * // output: `Bonjour` if your current language is 'fr'
4432
+ * // output: `Hello` if your current language is not 'fr'
4433
+ *
4434
+ * <div>{{ 'Hello[fr]Bonjour' | syslang: 'fr' }}</div>
4435
+ * // output: `Bonjour` even if your current language is not 'fr'
4436
+ */
4437
+ class SyslangPipe {
4438
+ transloco = inject(TranslocoService);
4439
+ cdr = inject(ChangeDetectorRef);
4440
+ lastValue = null;
4441
+ currentLang;
4442
+ subscription = null;
4443
+ ngOnDestroy() {
4444
+ this.subscription?.unsubscribe();
4445
+ this.subscription = null;
4446
+ }
4447
+ constructor() {
4448
+ this.currentLang = this.transloco.getActiveLang();
4449
+ this.subscription = this.transloco.langChanges$.subscribe(locale => (this.currentLang = locale));
4450
+ }
4451
+ /**
4452
+ * Transforms the input value using the current language.
4453
+ * @param value The input string value to be transformed.
4454
+ * @returns The transformed string value.
4455
+ */
4456
+ transform(value, lang) {
4457
+ const transformedValue = sysLang(value || '', lang || this.currentLang);
4458
+ if (transformedValue !== this.lastValue) {
4459
+ this.lastValue = transformedValue;
4460
+ this.cdr.markForCheck();
4461
+ }
4462
+ return this.lastValue;
4463
+ }
4464
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SyslangPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
4465
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.1.7", ngImport: i0, type: SyslangPipe, isStandalone: true, name: "syslang", pure: false });
4466
+ }
4467
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SyslangPipe, decorators: [{
4468
+ type: Pipe,
4469
+ args: [{
4470
+ name: 'syslang',
4471
+ standalone: true,
4472
+ pure: false
4473
+ }]
4474
+ }], ctorParameters: () => [] });
4475
+
4476
+ class TranslocoDateImpurePipe extends DatePipe {
4477
+ transloco = inject(TranslocoService);
4478
+ cdr = inject(ChangeDetectorRef);
4479
+ lastTransformedValue = null;
4480
+ subscription = null;
4481
+ constructor(locale, defaultTimezone, defaultOptions) {
4482
+ super(locale, defaultTimezone, defaultOptions);
4483
+ }
4484
+ ngOnDestroy() {
4485
+ this.subscription?.unsubscribe();
4486
+ this.subscription = null;
4487
+ }
4488
+ transform(value, format, timezone) {
4489
+ this.subscription?.unsubscribe();
4490
+ this.subscription = this.transloco.langChanges$.subscribe(locale => {
4491
+ const transformedValue = super.transform(value, format, timezone, locale);
4492
+ if (transformedValue !== this.lastTransformedValue) {
4493
+ this.lastTransformedValue = transformedValue;
4494
+ this.cdr.markForCheck();
4495
+ }
4496
+ });
4497
+ return this.lastTransformedValue;
4498
+ }
4499
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: TranslocoDateImpurePipe, deps: [{ token: LOCALE_ID }, { token: DATE_PIPE_DEFAULT_TIMEZONE, optional: true }, { token: DATE_PIPE_DEFAULT_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Pipe });
4500
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.1.7", ngImport: i0, type: TranslocoDateImpurePipe, isStandalone: true, name: "translocoDate", pure: false });
4501
+ }
4502
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: TranslocoDateImpurePipe, decorators: [{
4503
+ type: Pipe,
4504
+ args: [{
4505
+ name: 'translocoDate',
4506
+ pure: false,
4507
+ standalone: true
4508
+ }]
4509
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
4510
+ type: Inject,
4511
+ args: [LOCALE_ID]
4512
+ }] }, { type: undefined, decorators: [{
4513
+ type: Inject,
4514
+ args: [DATE_PIPE_DEFAULT_TIMEZONE]
4515
+ }, {
4516
+ type: Optional
4517
+ }] }, { type: undefined, decorators: [{
4518
+ type: Inject,
4519
+ args: [DATE_PIPE_DEFAULT_OPTIONS]
4520
+ }, {
4521
+ type: Optional
4522
+ }] }] });
4523
+
4524
+ class FileSizePipe {
4525
+ transform(value) {
4526
+ return this.formatMemorySize(value);
4527
+ }
4528
+ /**
4529
+ * Formats a given size in bytes into a more readable format.
4530
+ * It converts the size into kilobytes, megabytes, gigabytes, terabytes, or petabytes as appropriate.
4531
+ *
4532
+ * @param size - The size in bytes to be formatted.
4533
+ * @returns An object containing the key representing the unit and the value in that unit.
4534
+ *
4535
+ * @example
4536
+ * In a component template:
4537
+ * {{ 1048576 | fileSize | json }}
4538
+ * Output: { "key": "memorySize.mb", "value": 1 }
4539
+ */
4540
+ formatMemorySize(size) {
4541
+ const kiloBytes = size / 1024;
4542
+ const megaBytes = kiloBytes / 1024;
4543
+ const gigaBytes = megaBytes / 1024;
4544
+ const teraBytes = gigaBytes / 1024;
4545
+ const petaBytes = teraBytes / 1024;
4546
+ const obj = { key: 'memorySize.bytes', value: size };
4547
+ if (Math.abs(petaBytes) >= 1) {
4548
+ obj.key = 'memorySize.pb';
4549
+ obj.value = petaBytes;
4550
+ }
4551
+ else if (Math.abs(teraBytes) >= 1) {
4552
+ obj.key = 'memorySize.tb';
4553
+ obj.value = teraBytes;
4554
+ }
4555
+ else if (Math.abs(gigaBytes) >= 1) {
4556
+ obj.key = 'memorySize.gb';
4557
+ obj.value = gigaBytes;
4558
+ }
4559
+ else if (Math.abs(megaBytes) >= 1) {
4560
+ obj.key = 'memorySize.mb';
4561
+ obj.value = megaBytes;
4562
+ }
4563
+ else if (Math.abs(kiloBytes) >= 1) {
4564
+ obj.key = 'memorySize.kb';
4565
+ obj.value = kiloBytes;
4566
+ }
4567
+ return obj;
4568
+ }
4569
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: FileSizePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
4570
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.1.7", ngImport: i0, type: FileSizePipe, isStandalone: true, name: "fileSize" });
4571
+ }
4572
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: FileSizePipe, decorators: [{
4573
+ type: Pipe,
4574
+ args: [{
4575
+ name: 'fileSize'
4576
+ }]
4577
+ }] });
4578
+
4248
4579
  class MetadataComponent {
4249
4580
  click = output();
4250
4581
  class = input(...(ngDevMode ? [undefined, { debugName: "class" }] : []));
4251
4582
  variant = input('default', ...(ngDevMode ? [{ debugName: "variant" }] : []));
4583
+ decoration = input('outline', ...(ngDevMode ? [{ debugName: "decoration" }] : []));
4584
+ hover = input('yes', ...(ngDevMode ? [{ debugName: "hover" }] : []));
4252
4585
  metadata = input.required(...(ngDevMode ? [{ debugName: "metadata" }] : []));
4253
4586
  article = input.required(...(ngDevMode ? [{ debugName: "article" }] : []));
4254
4587
  limit = input(undefined, ...(ngDevMode ? [{ debugName: "limit", transform: (value) => (value ? Math.max(0, Number(value)) : undefined) }] : [{ transform: (value) => (value ? Math.max(0, Number(value)) : undefined) }]));
@@ -4256,21 +4589,37 @@ class MetadataComponent {
4256
4589
  handleClick(event, item) {
4257
4590
  this.click.emit({ filter: item, event });
4258
4591
  }
4259
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: MetadataComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4260
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: MetadataComponent, isStandalone: true, selector: "Metadata, metadata", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, metadata: { classPropertyName: "metadata", publicName: "metadata", isSignal: true, isRequired: true, transformFunction: null }, article: { classPropertyName: "article", publicName: "article", isSignal: true, isRequired: true, transformFunction: null }, limit: { classPropertyName: "limit", publicName: "limit", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { click: "click" }, host: { properties: { "class.hidden": "items().length === 0" } }, exportAs: ["metadata"], ngImport: i0, template: `
4592
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: MetadataComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4593
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: MetadataComponent, isStandalone: true, selector: "Metadata, metadata", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, decoration: { classPropertyName: "decoration", publicName: "decoration", isSignal: true, isRequired: false, transformFunction: null }, hover: { classPropertyName: "hover", publicName: "hover", isSignal: true, isRequired: false, transformFunction: null }, metadata: { classPropertyName: "metadata", publicName: "metadata", isSignal: true, isRequired: true, transformFunction: null }, article: { classPropertyName: "article", publicName: "article", isSignal: true, isRequired: true, transformFunction: null }, limit: { classPropertyName: "limit", publicName: "limit", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { click: "click" }, host: { properties: { "class.hidden": "items().length === 0" } }, exportAs: ["metadata"], ngImport: i0, template: `
4261
4594
  @for (item of items().slice(0, limit()); track $index) {
4262
4595
  @if (item) {
4263
- <badge [variant]="variant()" [class]="class()" (click)="handleClick($event, { field: this.metadata(), value: item })">{{ item }}</badge>
4596
+ <badge
4597
+ [variant]="variant()"
4598
+ [decoration]="decoration()"
4599
+ [hover]="hover()"
4600
+ size="xs"
4601
+ [class]="class()"
4602
+ (click)="handleClick($event, { field: this.metadata(), value: item })">
4603
+ {{ item | syslang }}
4604
+ </badge>
4264
4605
  }
4265
4606
  }
4266
- `, isInline: true, styles: [":host{display:contents}:host,:host:hover{background-color:transparent}\n"], dependencies: [{ kind: "directive", type: BadgeComponent, selector: "badge, Badge", inputs: ["class", "variant"] }] });
4607
+ `, isInline: true, styles: [":host{display:contents}:host,:host:hover{background-color:transparent}\n"], dependencies: [{ kind: "directive", type: BadgeComponent, selector: "badge, Badge", inputs: ["class", "variant", "size", "decoration", "hover"] }, { kind: "pipe", type: SyslangPipe, name: "syslang" }] });
4267
4608
  }
4268
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: MetadataComponent, decorators: [{
4609
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: MetadataComponent, decorators: [{
4269
4610
  type: Component,
4270
- args: [{ selector: 'Metadata, metadata', exportAs: 'metadata', standalone: true, imports: [BadgeComponent], template: `
4611
+ args: [{ selector: 'Metadata, metadata', exportAs: 'metadata', standalone: true, imports: [SyslangPipe, BadgeComponent], template: `
4271
4612
  @for (item of items().slice(0, limit()); track $index) {
4272
4613
  @if (item) {
4273
- <badge [variant]="variant()" [class]="class()" (click)="handleClick($event, { field: this.metadata(), value: item })">{{ item }}</badge>
4614
+ <badge
4615
+ [variant]="variant()"
4616
+ [decoration]="decoration()"
4617
+ [hover]="hover()"
4618
+ size="xs"
4619
+ [class]="class()"
4620
+ (click)="handleClick($event, { field: this.metadata(), value: item })">
4621
+ {{ item | syslang }}
4622
+ </badge>
4274
4623
  }
4275
4624
  }
4276
4625
  `, host: {
@@ -4294,10 +4643,10 @@ class MissingTermsComponent {
4294
4643
  };
4295
4644
  });
4296
4645
  }, ...(ngDevMode ? [{ debugName: "missingTerms" }] : []));
4297
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: MissingTermsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4298
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: MissingTermsComponent, isStandalone: true, selector: "missing-terms, MissingTerms, missingterms", inputs: { article: { classPropertyName: "article", publicName: "article", isSignal: true, isRequired: true, transformFunction: null } }, providers: [provideTranslocoScope('article')], ngImport: i0, template: "@if ((missingTerms() || []).length > 0) {\n <span class=\"terms-label\">{{ 'article.missingTerms' | transloco }}</span>\n <span class=\"terms\">\n @for (term of missingTerms(); track $index) {\n <span class=\"term ms-1\">{{ term.value }}</span>\n }\n </span>\n <span class=\"mx-1\">|</span>\n <span class=\"terms-label ms-1\">{{ 'article.mustInclude' | transloco }}</span>\n <span class=\"terms\">\n @for (term of missingTerms(); track $index) {\n <a role=\"button\" class=\"ms-1\" routerLink=\"search\" [queryParams]=\"term.queryParams\" (click)=\"$event.stopPropagation()\">{{ term.value }}</a>\n }\n </span>\n}\n", styles: [".term{text-decoration-line:line-through}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
4646
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: MissingTermsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4647
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: MissingTermsComponent, isStandalone: true, selector: "missing-terms, MissingTerms, missingterms", inputs: { article: { classPropertyName: "article", publicName: "article", isSignal: true, isRequired: true, transformFunction: null } }, providers: [provideTranslocoScope('article')], ngImport: i0, template: "@if ((missingTerms() || []).length > 0) {\n <span class=\"terms-label\">{{ 'article.missingTerms' | transloco }}</span>\n <span class=\"terms\">\n @for (term of missingTerms(); track $index) {\n <span class=\"term ms-1\">{{ term.value }}</span>\n }\n </span>\n <span class=\"mx-1\">|</span>\n <span class=\"terms-label ms-1\">{{ 'article.mustInclude' | transloco }}</span>\n <span class=\"terms\">\n @for (term of missingTerms(); track $index) {\n <a role=\"button\" class=\"ms-1\" routerLink=\"search\" [queryParams]=\"term.queryParams\" (click)=\"$event.stopPropagation()\">{{ term.value }}</a>\n }\n </span>\n}\n", styles: [".term{text-decoration-line:line-through}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
4299
4648
  }
4300
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: MissingTermsComponent, decorators: [{
4649
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: MissingTermsComponent, decorators: [{
4301
4650
  type: Component,
4302
4651
  args: [{ selector: 'missing-terms, MissingTerms, missingterms', standalone: true, imports: [TranslocoPipe, RouterLink], providers: [provideTranslocoScope('article')], template: "@if ((missingTerms() || []).length > 0) {\n <span class=\"terms-label\">{{ 'article.missingTerms' | transloco }}</span>\n <span class=\"terms\">\n @for (term of missingTerms(); track $index) {\n <span class=\"term ms-1\">{{ term.value }}</span>\n }\n </span>\n <span class=\"mx-1\">|</span>\n <span class=\"terms-label ms-1\">{{ 'article.mustInclude' | transloco }}</span>\n <span class=\"terms\">\n @for (term of missingTerms(); track $index) {\n <a role=\"button\" class=\"ms-1\" routerLink=\"search\" [queryParams]=\"term.queryParams\" (click)=\"$event.stopPropagation()\">{{ term.value }}</a>\n }\n </span>\n}\n", styles: [".term{text-decoration-line:line-through}\n"] }]
4303
4652
  }] });
@@ -4392,8 +4741,8 @@ class CollectionsDialog {
4392
4741
  this.newCollectionName.set('');
4393
4742
  this.creating.set(false);
4394
4743
  }
4395
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: CollectionsDialog, deps: [], target: i0.ɵɵFactoryTarget.Component });
4396
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: CollectionsDialog, isStandalone: true, selector: "add-to-collection-dialog", outputs: { closed: "closed" }, providers: [provideTranslocoScope('collections')], viewQueries: [{ propertyName: "createInputElement", first: true, predicate: ["createInput"], descendants: true, isSignal: true }, { propertyName: "dialogElement", first: true, predicate: DialogComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
4744
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CollectionsDialog, deps: [], target: i0.ɵɵFactoryTarget.Component });
4745
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: CollectionsDialog, isStandalone: true, selector: "add-to-collection-dialog", outputs: { closed: "closed" }, providers: [provideTranslocoScope('collections')], viewQueries: [{ propertyName: "createInputElement", first: true, predicate: ["createInput"], descendants: true, isSignal: true }, { propertyName: "dialogElement", first: true, predicate: DialogComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
4397
4746
  <dialog #dialog (closed)="closeBtn.click()">
4398
4747
  <DialogHeader>
4399
4748
  <DialogTitle>{{ 'collections.addToCollection' | transloco }}</DialogTitle>
@@ -4438,7 +4787,7 @@ class CollectionsDialog {
4438
4787
  <DialogFooter class="flex flex-col">
4439
4788
  <div class="flex w-full gap-1">
4440
4789
  <button
4441
- variant="outline"
4790
+ decoration="outline"
4442
4791
  class="grow"
4443
4792
  tabindex="0"
4444
4793
  [attr.title]="(creating() ? 'collections.cancelCreation' : 'collections.createCollection') | transloco"
@@ -4446,19 +4795,25 @@ class CollectionsDialog {
4446
4795
  {{ (creating() ? 'collections.cancelCreation' : 'collections.createCollection') | transloco }}
4447
4796
  </button>
4448
4797
  @if (creating()) {
4449
- <button class="grow" tabindex="0" [attr.title]="'collections.create' | transloco" [disabled]="!newCollectionName()" (click)="createCollection()">
4798
+ <button
4799
+ variant="primary"
4800
+ class="grow"
4801
+ tabindex="0"
4802
+ [attr.title]="'collections.create' | transloco"
4803
+ [disabled]="!newCollectionName()"
4804
+ (click)="createCollection()">
4450
4805
  {{ 'collections.create' | transloco }}
4451
4806
  </button>
4452
4807
  }
4453
4808
  </div>
4454
- <button #closeBtn (click)="onClose($event)" class="self-end">
4809
+ <button variant="primary" #closeBtn (click)="onClose($event)" class="self-end">
4455
4810
  {{ 'collections.close' | transloco }}
4456
4811
  </button>
4457
4812
  </DialogFooter>
4458
4813
  </dialog>
4459
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "component", type: DialogComponent, selector: "dialog", inputs: ["class"], outputs: ["closed"] }, { kind: "component", type: DialogHeaderComponent, selector: "DialogHeader" }, { kind: "directive", type: DialogTitleComponent, selector: "DialogTitle" }, { kind: "directive", type: DialogContentComponent, selector: "DialogContent" }, { kind: "directive", type: DialogFooterComponent, selector: "DialogFooter" }, { kind: "directive", type: ListItemComponent, selector: "[role=\"listitem\"], [role=\"option\"]", inputs: ["class", "variant"] }, { kind: "directive", type: InputComponent, selector: "input[type=\"text\"], input[type=\"email\"], input[type=\"password\"], input[type=\"number\"], input[type=\"tel\"], input[type=\"url\"], input[type=\"time\"]", inputs: ["class", "variant"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
4814
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "decoration", "size"] }, { kind: "component", type: DialogComponent, selector: "dialog", inputs: ["class", "variant"], outputs: ["closed"] }, { kind: "component", type: DialogHeaderComponent, selector: "DialogHeader" }, { kind: "directive", type: DialogTitleComponent, selector: "DialogTitle" }, { kind: "directive", type: DialogContentComponent, selector: "DialogContent" }, { kind: "directive", type: DialogFooterComponent, selector: "DialogFooter" }, { kind: "directive", type: ListItemComponent, selector: "[role=\"listitem\"], [role=\"option\"]", inputs: ["class", "variant", "decoration"] }, { kind: "directive", type: InputComponent, selector: "input[type=\"text\"], input[type=\"email\"], input[type=\"number\"], input[type=\"password\"], input[type=\"tel\"], input[type=\"url\"], input[type=\"time\"]", inputs: ["class", "variant", "decoration"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
4460
4815
  }
4461
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: CollectionsDialog, decorators: [{
4816
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CollectionsDialog, decorators: [{
4462
4817
  type: Component,
4463
4818
  args: [{
4464
4819
  selector: 'add-to-collection-dialog',
@@ -4521,7 +4876,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
4521
4876
  <DialogFooter class="flex flex-col">
4522
4877
  <div class="flex w-full gap-1">
4523
4878
  <button
4524
- variant="outline"
4879
+ decoration="outline"
4525
4880
  class="grow"
4526
4881
  tabindex="0"
4527
4882
  [attr.title]="(creating() ? 'collections.cancelCreation' : 'collections.createCollection') | transloco"
@@ -4529,12 +4884,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
4529
4884
  {{ (creating() ? 'collections.cancelCreation' : 'collections.createCollection') | transloco }}
4530
4885
  </button>
4531
4886
  @if (creating()) {
4532
- <button class="grow" tabindex="0" [attr.title]="'collections.create' | transloco" [disabled]="!newCollectionName()" (click)="createCollection()">
4887
+ <button
4888
+ variant="primary"
4889
+ class="grow"
4890
+ tabindex="0"
4891
+ [attr.title]="'collections.create' | transloco"
4892
+ [disabled]="!newCollectionName()"
4893
+ (click)="createCollection()">
4533
4894
  {{ 'collections.create' | transloco }}
4534
4895
  </button>
4535
4896
  }
4536
4897
  </div>
4537
- <button #closeBtn (click)="onClose($event)" class="self-end">
4898
+ <button variant="primary" #closeBtn (click)="onClose($event)" class="self-end">
4538
4899
  {{ 'collections.close' | transloco }}
4539
4900
  </button>
4540
4901
  </DialogFooter>
@@ -4636,10 +4997,10 @@ class ExportService {
4636
4997
  responseType: 'blob'
4637
4998
  });
4638
4999
  }
4639
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: ExportService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
4640
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: ExportService, providedIn: 'root' });
5000
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ExportService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
5001
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ExportService, providedIn: 'root' });
4641
5002
  }
4642
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: ExportService, decorators: [{
5003
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ExportService, decorators: [{
4643
5004
  type: Injectable,
4644
5005
  args: [{
4645
5006
  providedIn: 'root'
@@ -4707,15 +5068,15 @@ class ExportDialog {
4707
5068
  this.maxCount.set(1);
4708
5069
  }
4709
5070
  }
4710
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: ExportDialog, deps: [], target: i0.ɵɵFactoryTarget.Component });
4711
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: ExportDialog, isStandalone: true, selector: "export-dialog", inputs: { format: { classPropertyName: "format", publicName: "format", isSignal: true, isRequired: false, transformFunction: null }, maxCount: { classPropertyName: "maxCount", publicName: "maxCount", isSignal: true, isRequired: false, transformFunction: null }, columnsToExport: { classPropertyName: "columnsToExport", publicName: "columnsToExport", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onExport: "onExport", format: "formatChange", maxCount: "maxCountChange", columnsToExport: "columnsToExportChange" }, providers: [provideTranslocoScope('export')], viewQueries: [{ propertyName: "dialog", first: true, predicate: DialogComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
5071
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ExportDialog, deps: [], target: i0.ɵɵFactoryTarget.Component });
5072
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: ExportDialog, isStandalone: true, selector: "export-dialog", inputs: { format: { classPropertyName: "format", publicName: "format", isSignal: true, isRequired: false, transformFunction: null }, maxCount: { classPropertyName: "maxCount", publicName: "maxCount", isSignal: true, isRequired: false, transformFunction: null }, columnsToExport: { classPropertyName: "columnsToExport", publicName: "columnsToExport", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onExport: "onExport", format: "formatChange", maxCount: "maxCountChange", columnsToExport: "columnsToExportChange" }, providers: [provideTranslocoScope('export')], viewQueries: [{ propertyName: "dialog", first: true, predicate: DialogComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
4712
5073
  <dialog #dialog>
4713
5074
  <DialogHeader>
4714
5075
  <DialogTitle>{{ 'export.title' | transloco }}</DialogTitle>
4715
5076
  </DialogHeader>
4716
5077
 
4717
5078
  <DialogContent
4718
- class="flex flex-col gap-4 [&_section>h1]:text-sm [&_section>h1]:font-semibold [&_section>h1]:text-gray-500 [&_section]:flex [&_section]:flex-col [&_section]:gap-2">
5079
+ class="[&_section>h1]:text-muted-foreground flex flex-col gap-4 [&_section>h1]:text-sm [&_section>h1]:font-semibold [&_section]:flex [&_section]:flex-col [&_section]:gap-2">
4719
5080
  <section>
4720
5081
  <h1>{{ 'export.from' | transloco }}</h1>
4721
5082
  <div class="flex items-center gap-2">
@@ -4732,7 +5093,7 @@ class ExportDialog {
4732
5093
  <section>
4733
5094
  <h1>{{ 'export.outputFormat' | transloco }}</h1>
4734
5095
  <select
4735
- class="hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline"
5096
+ class="hover:outline-primary focus:outline-primary border-foreground/18 h-8 w-full rounded-md border px-2 hover:outline focus:outline"
4736
5097
  id="format"
4737
5098
  [(ngModel)]="format">
4738
5099
  @for (format of supportedFormats; track $index) {
@@ -4745,7 +5106,7 @@ class ExportDialog {
4745
5106
  <h1>{{ 'export.exportColumns' | transloco }}</h1>
4746
5107
  <select
4747
5108
  id="exportedColumns"
4748
- class="hover:outline-primary focus:outline-primary w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline"
5109
+ class="hover:outline-primary focus:outline-primary border-foreground/18 w-full rounded-md border px-2 hover:outline focus:outline"
4749
5110
  multiple
4750
5111
  [(ngModel)]="columnsToExport">
4751
5112
  @for (column of exportableColumns(); track $index) {
@@ -4762,14 +5123,14 @@ class ExportDialog {
4762
5123
  min="1"
4763
5124
  autocomplete="off"
4764
5125
  spellcheck="off"
4765
- class="hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline"
5126
+ class="hover:outline-primary focus:outline-primary border-foreground/18 h-8 w-full rounded-md border px-2 hover:outline focus:outline"
4766
5127
  [(ngModel)]="maxCount"
4767
5128
  (input)="onMaxCountInput($event)" />
4768
5129
  </section>
4769
5130
  </DialogContent>
4770
5131
 
4771
5132
  <DialogFooter>
4772
- <button variant="outline" (click)="dialog.close($event)">
5133
+ <button decoration="outline" (click)="dialog.close($event)">
4773
5134
  {{ 'cancel' | transloco }}
4774
5135
  </button>
4775
5136
  <button tabindex="0" [attr.title]="'export.download' | transloco" (click)="onDownload($event)">
@@ -4777,9 +5138,9 @@ class ExportDialog {
4777
5138
  </button>
4778
5139
  </DialogFooter>
4779
5140
  </dialog>
4780
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.SelectMultipleControlValueAccessor, selector: "select[multiple][formControlName],select[multiple][formControl],select[multiple][ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "component", type: DialogComponent, selector: "dialog", inputs: ["class"], outputs: ["closed"] }, { kind: "component", type: DialogHeaderComponent, selector: "DialogHeader" }, { kind: "directive", type: DialogTitleComponent, selector: "DialogTitle" }, { kind: "directive", type: DialogContentComponent, selector: "DialogContent" }, { kind: "directive", type: DialogFooterComponent, selector: "DialogFooter" }, { kind: "component", type: SwitchComponent, selector: "switch, Switch", inputs: ["toggled", "disabled", "className", "size"], outputs: ["toggledChange"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
5141
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.SelectMultipleControlValueAccessor, selector: "select[multiple][formControlName],select[multiple][formControl],select[multiple][ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "decoration", "size"] }, { kind: "component", type: DialogComponent, selector: "dialog", inputs: ["class", "variant"], outputs: ["closed"] }, { kind: "component", type: DialogHeaderComponent, selector: "DialogHeader" }, { kind: "directive", type: DialogTitleComponent, selector: "DialogTitle" }, { kind: "directive", type: DialogContentComponent, selector: "DialogContent" }, { kind: "directive", type: DialogFooterComponent, selector: "DialogFooter" }, { kind: "component", type: SwitchComponent, selector: "switch, Switch", inputs: ["toggled", "disabled", "className", "variant", "size"], outputs: ["toggledChange"] }, { kind: "directive", type: SelectOptionDirective, selector: "option", inputs: ["class"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
4781
5142
  }
4782
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: ExportDialog, decorators: [{
5143
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ExportDialog, decorators: [{
4783
5144
  type: Component,
4784
5145
  args: [{
4785
5146
  selector: 'export-dialog',
@@ -4793,7 +5154,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
4793
5154
  DialogTitleComponent,
4794
5155
  DialogContentComponent,
4795
5156
  DialogFooterComponent,
4796
- SwitchComponent
5157
+ SwitchComponent,
5158
+ SelectOptionDirective
4797
5159
  ],
4798
5160
  providers: [provideTranslocoScope('export')],
4799
5161
  template: `
@@ -4803,7 +5165,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
4803
5165
  </DialogHeader>
4804
5166
 
4805
5167
  <DialogContent
4806
- class="flex flex-col gap-4 [&_section>h1]:text-sm [&_section>h1]:font-semibold [&_section>h1]:text-gray-500 [&_section]:flex [&_section]:flex-col [&_section]:gap-2">
5168
+ class="[&_section>h1]:text-muted-foreground flex flex-col gap-4 [&_section>h1]:text-sm [&_section>h1]:font-semibold [&_section]:flex [&_section]:flex-col [&_section]:gap-2">
4807
5169
  <section>
4808
5170
  <h1>{{ 'export.from' | transloco }}</h1>
4809
5171
  <div class="flex items-center gap-2">
@@ -4820,7 +5182,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
4820
5182
  <section>
4821
5183
  <h1>{{ 'export.outputFormat' | transloco }}</h1>
4822
5184
  <select
4823
- class="hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline"
5185
+ class="hover:outline-primary focus:outline-primary border-foreground/18 h-8 w-full rounded-md border px-2 hover:outline focus:outline"
4824
5186
  id="format"
4825
5187
  [(ngModel)]="format">
4826
5188
  @for (format of supportedFormats; track $index) {
@@ -4833,7 +5195,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
4833
5195
  <h1>{{ 'export.exportColumns' | transloco }}</h1>
4834
5196
  <select
4835
5197
  id="exportedColumns"
4836
- class="hover:outline-primary focus:outline-primary w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline"
5198
+ class="hover:outline-primary focus:outline-primary border-foreground/18 w-full rounded-md border px-2 hover:outline focus:outline"
4837
5199
  multiple
4838
5200
  [(ngModel)]="columnsToExport">
4839
5201
  @for (column of exportableColumns(); track $index) {
@@ -4850,14 +5212,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
4850
5212
  min="1"
4851
5213
  autocomplete="off"
4852
5214
  spellcheck="off"
4853
- class="hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline"
5215
+ class="hover:outline-primary focus:outline-primary border-foreground/18 h-8 w-full rounded-md border px-2 hover:outline focus:outline"
4854
5216
  [(ngModel)]="maxCount"
4855
5217
  (input)="onMaxCountInput($event)" />
4856
5218
  </section>
4857
5219
  </DialogContent>
4858
5220
 
4859
5221
  <DialogFooter>
4860
- <button variant="outline" (click)="dialog.close($event)">
5222
+ <button decoration="outline" (click)="dialog.close($event)">
4861
5223
  {{ 'cancel' | transloco }}
4862
5224
  </button>
4863
5225
  <button tabindex="0" [attr.title]="'export.download' | transloco" (click)="onDownload($event)">
@@ -4905,8 +5267,8 @@ class MultiSelectionToolbarComponent {
4905
5267
  openCollectionDialog = () => this.dialog.open(CollectionsDialog, getState(this.selection).multiSelection);
4906
5268
  openExportDialog = () => this.dialog.open(ExportDialog, this.ids());
4907
5269
  attachToAssistant = () => this.selection.update({ assistantIdsToAttach: this.ids() });
4908
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: MultiSelectionToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4909
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: MultiSelectionToolbarComponent, isStandalone: true, selector: "MultiSelectionToolbar, multi-selection-toolbar", inputs: { className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.opacity-100": "count() > 0", "class.-translate-y-14": "count() > 0" }, classAttribute: "fixed bottom-[-40px] left-[50%] translate-x-[-50%] z-50 transition-[translate,opacity,discrete] duration-300 opacity-0" }, ngImport: i0, template: `
5270
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: MultiSelectionToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5271
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: MultiSelectionToolbarComponent, isStandalone: true, selector: "MultiSelectionToolbar, multi-selection-toolbar", inputs: { className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.opacity-100": "count() > 0", "class.-translate-y-14": "count() > 0" }, classAttribute: "fixed bottom-[-40px] left-[50%] translate-x-[-50%] z-50 transition-[translate,opacity,discrete] duration-300 opacity-0" }, ngImport: i0, template: `
4910
5272
  <menu id="multi-select-toolbar" [class]="cn(variants(), className())">
4911
5273
  <li class="!ps-0">
4912
5274
  {{ count() }} items selected
@@ -4940,7 +5302,7 @@ class MultiSelectionToolbarComponent {
4940
5302
  </menu>
4941
5303
  `, isInline: true });
4942
5304
  }
4943
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: MultiSelectionToolbarComponent, decorators: [{
5305
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: MultiSelectionToolbarComponent, decorators: [{
4944
5306
  type: Component,
4945
5307
  args: [{
4946
5308
  selector: 'MultiSelectionToolbar, multi-selection-toolbar',
@@ -5019,10 +5381,10 @@ class InfinityScrollDirective {
5019
5381
  ngOnDestroy() {
5020
5382
  this.observer.disconnect();
5021
5383
  }
5022
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: InfinityScrollDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
5023
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.1.2", type: InfinityScrollDirective, isStandalone: true, selector: "[infinity-scroll]", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onScroll: "onScroll" }, ngImport: i0 });
5384
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: InfinityScrollDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
5385
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.1.7", type: InfinityScrollDirective, isStandalone: true, selector: "[infinity-scroll]", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onScroll: "onScroll" }, ngImport: i0 });
5024
5386
  }
5025
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: InfinityScrollDirective, decorators: [{
5387
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: InfinityScrollDirective, decorators: [{
5026
5388
  type: Directive,
5027
5389
  args: [{
5028
5390
  // eslint-disable-next-line @angular-eslint/directive-selector
@@ -5326,10 +5688,10 @@ class KeyboardNavigatorDirective {
5326
5688
  this.renderer.setAttribute(this.listboxElement(), 'aria-hidden', 'true');
5327
5689
  this.ariaExpanded.set(false);
5328
5690
  }
5329
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: KeyboardNavigatorDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5330
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.1.2", type: KeyboardNavigatorDirective, isStandalone: true, selector: "input[role=\"combobox\"]", inputs: { keyboardNavigator: { classPropertyName: "keyboardNavigator", publicName: "keyboardNavigator", isSignal: true, isRequired: false, transformFunction: null }, listboxId: { classPropertyName: "listboxId", publicName: "aria-controls", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onFocus: "onFocus", onBlur: "onBlur", onSelected: "onSelected" }, host: { listeners: { "focus": "focus()", "blur": "blur()", "keydown.arrowup": "up()", "keydown.arrowdown": "down()", "keydown.arrowleft": "left()", "keydown.arrowright": "right()", "keydown.home": "home()", "keydown.end": "end()", "keydown.pageup": "pageUp()", "keydown.pagedown": "pageDown()", "keydown.enter": "enter()", "keydown.escape": "escape()" }, properties: { "attr.aria-expanded": "ariaExpanded()", "attr.aria-activedescendant": "activeDescendant()" } }, ngImport: i0 });
5691
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: KeyboardNavigatorDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5692
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.1.7", type: KeyboardNavigatorDirective, isStandalone: true, selector: "input[role=\"combobox\"]", inputs: { keyboardNavigator: { classPropertyName: "keyboardNavigator", publicName: "keyboardNavigator", isSignal: true, isRequired: false, transformFunction: null }, listboxId: { classPropertyName: "listboxId", publicName: "aria-controls", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onFocus: "onFocus", onBlur: "onBlur", onSelected: "onSelected" }, host: { listeners: { "focus": "focus()", "blur": "blur()", "keydown.arrowup": "up()", "keydown.arrowdown": "down()", "keydown.arrowleft": "left()", "keydown.arrowright": "right()", "keydown.home": "home()", "keydown.end": "end()", "keydown.pageup": "pageUp()", "keydown.pagedown": "pageDown()", "keydown.enter": "enter()", "keydown.escape": "escape()" }, properties: { "attr.aria-expanded": "ariaExpanded()", "attr.aria-activedescendant": "activeDescendant()" } }, ngImport: i0 });
5331
5693
  }
5332
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: KeyboardNavigatorDirective, decorators: [{
5694
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: KeyboardNavigatorDirective, decorators: [{
5333
5695
  type: Directive,
5334
5696
  args: [{
5335
5697
  selector: 'input[role="combobox"]',
@@ -5364,10 +5726,10 @@ class OpenArticleOnCtrlEnterDirective {
5364
5726
  return;
5365
5727
  this.previewService.openExternal(this.article());
5366
5728
  }
5367
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: OpenArticleOnCtrlEnterDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5368
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.1.2", type: OpenArticleOnCtrlEnterDirective, isStandalone: true, selector: "[appOpenArticleOnCtrlEnter],[openArticleOnCtrlEnter]", inputs: { article: { classPropertyName: "article", publicName: "article", isSignal: true, isRequired: true, transformFunction: null } }, host: { listeners: { "keydown.control.Enter": "onCtrlEnter()" } }, ngImport: i0 });
5729
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: OpenArticleOnCtrlEnterDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5730
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.1.7", type: OpenArticleOnCtrlEnterDirective, isStandalone: true, selector: "[appOpenArticleOnCtrlEnter],[openArticleOnCtrlEnter]", inputs: { article: { classPropertyName: "article", publicName: "article", isSignal: true, isRequired: true, transformFunction: null } }, host: { listeners: { "keydown.control.Enter": "onCtrlEnter()" } }, ngImport: i0 });
5369
5731
  }
5370
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: OpenArticleOnCtrlEnterDirective, decorators: [{
5732
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: OpenArticleOnCtrlEnterDirective, decorators: [{
5371
5733
  type: Directive,
5372
5734
  args: [{
5373
5735
  selector: '[appOpenArticleOnCtrlEnter],[openArticleOnCtrlEnter]',
@@ -5383,10 +5745,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
5383
5745
  * overflow manager.
5384
5746
  */
5385
5747
  class OverflowItemDirective {
5386
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: OverflowItemDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5387
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.1.2", type: OverflowItemDirective, isStandalone: true, selector: "[overflowItem]", ngImport: i0 });
5748
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: OverflowItemDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5749
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.1.7", type: OverflowItemDirective, isStandalone: true, selector: "[overflowItem]", ngImport: i0 });
5388
5750
  }
5389
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: OverflowItemDirective, decorators: [{
5751
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: OverflowItemDirective, decorators: [{
5390
5752
  type: Directive,
5391
5753
  args: [{
5392
5754
  selector: '[overflowItem]',
@@ -5398,10 +5760,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
5398
5760
  * for the overflow manager.
5399
5761
  */
5400
5762
  class OverflowStopDirective {
5401
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: OverflowStopDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5402
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.1.2", type: OverflowStopDirective, isStandalone: true, selector: "[overflowStop]", ngImport: i0 });
5763
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: OverflowStopDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5764
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.1.7", type: OverflowStopDirective, isStandalone: true, selector: "[overflowStop]", ngImport: i0 });
5403
5765
  }
5404
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: OverflowStopDirective, decorators: [{
5766
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: OverflowStopDirective, decorators: [{
5405
5767
  type: Directive,
5406
5768
  args: [{
5407
5769
  selector: '[overflowStop]',
@@ -5511,10 +5873,10 @@ class OverflowManagerDirective {
5511
5873
  item.nativeElement.style.visibility = state;
5512
5874
  });
5513
5875
  }
5514
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: OverflowManagerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5515
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "20.1.2", type: OverflowManagerDirective, isStandalone: true, selector: "[overflowManager]", inputs: { target: { classPropertyName: "target", publicName: "target", isSignal: true, isRequired: false, transformFunction: null }, margin: { classPropertyName: "margin", publicName: "margin", isSignal: true, isRequired: false, transformFunction: null }, direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { count: "count" }, queries: [{ propertyName: "items", predicate: OverflowItemDirective, descendants: true, read: ElementRef, isSignal: true }, { propertyName: "stop", first: true, predicate: OverflowStopDirective, descendants: true, read: ElementRef, isSignal: true }], ngImport: i0 });
5876
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: OverflowManagerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5877
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "20.1.7", type: OverflowManagerDirective, isStandalone: true, selector: "[overflowManager]", inputs: { target: { classPropertyName: "target", publicName: "target", isSignal: true, isRequired: false, transformFunction: null }, margin: { classPropertyName: "margin", publicName: "margin", isSignal: true, isRequired: false, transformFunction: null }, direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { count: "count" }, queries: [{ propertyName: "items", predicate: OverflowItemDirective, descendants: true, read: ElementRef, isSignal: true }, { propertyName: "stop", first: true, predicate: OverflowStopDirective, descendants: true, read: ElementRef, isSignal: true }], ngImport: i0 });
5516
5878
  }
5517
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: OverflowManagerDirective, decorators: [{
5879
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: OverflowManagerDirective, decorators: [{
5518
5880
  type: Directive,
5519
5881
  args: [{
5520
5882
  selector: '[overflowManager]',
@@ -5656,10 +6018,10 @@ class DrawerStackService {
5656
6018
  this.openAssistant();
5657
6019
  this.askAI$.next(text);
5658
6020
  }
5659
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: DrawerStackService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
5660
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: DrawerStackService, providedIn: 'root' });
6021
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: DrawerStackService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
6022
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: DrawerStackService, providedIn: 'root' });
5661
6023
  }
5662
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: DrawerStackService, decorators: [{
6024
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: DrawerStackService, decorators: [{
5663
6025
  type: Injectable,
5664
6026
  args: [{
5665
6027
  providedIn: 'root'
@@ -5691,13 +6053,13 @@ class SelectArticleOnClickDirective {
5691
6053
  break;
5692
6054
  }
5693
6055
  }
5694
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SelectArticleOnClickDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5695
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.1.2", type: SelectArticleOnClickDirective, isStandalone: true, selector: "[appSelectArticleOnClick],[selectArticleOnClick]", inputs: { article: { classPropertyName: "article", publicName: "article", isSignal: true, isRequired: true, transformFunction: null }, strategy: { classPropertyName: "strategy", publicName: "strategy", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "keydown.enter": "onEnter($event)", "click": "onClick()" } }, ngImport: i0 });
6056
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SelectArticleOnClickDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6057
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.1.7", type: SelectArticleOnClickDirective, isStandalone: true, selector: "[selectArticleOnClick]", inputs: { article: { classPropertyName: "article", publicName: "article", isSignal: true, isRequired: true, transformFunction: null }, strategy: { classPropertyName: "strategy", publicName: "strategy", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "keydown.enter": "onEnter($event)", "click": "onClick()" } }, ngImport: i0 });
5696
6058
  }
5697
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SelectArticleOnClickDirective, decorators: [{
6059
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SelectArticleOnClickDirective, decorators: [{
5698
6060
  type: Directive,
5699
6061
  args: [{
5700
- selector: '[appSelectArticleOnClick],[selectArticleOnClick]',
6062
+ selector: '[selectArticleOnClick]',
5701
6063
  standalone: true,
5702
6064
  host: {
5703
6065
  '(keydown.enter)': 'onEnter($event)'
@@ -5743,10 +6105,10 @@ class ShowBookmarkDirective {
5743
6105
  this.showBookmark.emit(bookmarkHovered || isBookmarked);
5744
6106
  });
5745
6107
  }
5746
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: ShowBookmarkDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5747
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.1.2", type: ShowBookmarkDirective, isStandalone: true, selector: "[showBookmark]", inputs: { article: { classPropertyName: "article", publicName: "article", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { showBookmark: "showBookmark" }, host: { listeners: { "mouseenter": "mouseEnter()", "mouseleave": "mouseLeave()" } }, ngImport: i0 });
6108
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ShowBookmarkDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6109
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.1.7", type: ShowBookmarkDirective, isStandalone: true, selector: "[showBookmark]", inputs: { article: { classPropertyName: "article", publicName: "article", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { showBookmark: "showBookmark" }, host: { listeners: { "mouseenter": "mouseEnter()", "mouseleave": "mouseLeave()" } }, ngImport: i0 });
5748
6110
  }
5749
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: ShowBookmarkDirective, decorators: [{
6111
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ShowBookmarkDirective, decorators: [{
5750
6112
  type: Directive,
5751
6113
  args: [{
5752
6114
  selector: '[showBookmark]',
@@ -5777,10 +6139,10 @@ class ThemeProviderDirective {
5777
6139
  applyThemeToNativeElement(this.host.nativeElement, vars);
5778
6140
  });
5779
6141
  }
5780
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: ThemeProviderDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5781
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.1.2", type: ThemeProviderDirective, isStandalone: true, selector: "[themeProvider]", inputs: { themeProvider: { classPropertyName: "themeProvider", publicName: "themeProvider", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 });
6142
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ThemeProviderDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6143
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.1.7", type: ThemeProviderDirective, isStandalone: true, selector: "[themeProvider]", inputs: { themeProvider: { classPropertyName: "themeProvider", publicName: "themeProvider", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 });
5782
6144
  }
5783
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: ThemeProviderDirective, decorators: [{
6145
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ThemeProviderDirective, decorators: [{
5784
6146
  type: Directive,
5785
6147
  args: [{
5786
6148
  selector: '[themeProvider]',
@@ -5804,266 +6166,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
5804
6166
  */
5805
6167
  class ChildMarkerDirective {
5806
6168
  template = inject((TemplateRef));
5807
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: ChildMarkerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5808
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.1.2", type: ChildMarkerDirective, isStandalone: true, selector: "[childMarker]", ngImport: i0 });
6169
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ChildMarkerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6170
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.1.7", type: ChildMarkerDirective, isStandalone: true, selector: "[childMarker]", ngImport: i0 });
5809
6171
  }
5810
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: ChildMarkerDirective, decorators: [{
6172
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ChildMarkerDirective, decorators: [{
5811
6173
  type: Directive,
5812
6174
  args: [{
5813
6175
  selector: '[childMarker]'
5814
6176
  }]
5815
6177
  }] });
5816
6178
 
5817
- /**
5818
- * The HighlightWordPipe class is a custom pipe in the Atomic Angular library.
5819
- * It is used to highlight a specific word within a given text.
5820
- *
5821
- * @remarks
5822
- * This pipe takes in a `value` string, a `word` string to highlight, and an optional `clipBy` number to limit the length of the highlighted text.
5823
- * It returns an array of `HighlightWords.Chunk` objects representing the highlighted portions of the text.
5824
- *
5825
- * @example
5826
- * ```html
5827
- * <div [innerHTML]="text | highlightWord:'search':10"></div>
5828
- * ```
5829
- *
5830
- */
5831
- class HighlightWordPipe {
5832
- transform(value, word, clipBy) {
5833
- const valueNormalized = value.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
5834
- const wordNormalized = word.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
5835
- return highlightWords({ text: valueNormalized, query: wordNormalized, clipBy });
5836
- }
5837
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: HighlightWordPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
5838
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.1.2", ngImport: i0, type: HighlightWordPipe, isStandalone: true, name: "highlightWord" });
5839
- }
5840
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: HighlightWordPipe, decorators: [{
5841
- type: Pipe,
5842
- args: [{
5843
- name: 'highlightWord',
5844
- standalone: true,
5845
- pure: true
5846
- }]
5847
- }] });
5848
-
5849
- /**
5850
- * Pipe that transforms a collection of strings into a corresponding icon class.
5851
- *
5852
- * This pipe uses the first element of the collection to determine the icon class
5853
- * based on the source name. If the collection is empty or undefined, it returns
5854
- * a default icon class.
5855
- *
5856
- * @deprecated This pipe is deprecated and will be removed in the future.
5857
- *
5858
- * @param collection - An array of strings representing the collection.
5859
- * @returns A string representing the icon class.
5860
- */
5861
- class SourceIconPipe {
5862
- appStore = inject(AppStore);
5863
- transform(collection) {
5864
- if (collection === undefined || collection.length === 0) {
5865
- return 'far fa-file';
5866
- }
5867
- const name = collection[0].split('/')[1];
5868
- const sources = this.appStore.sources();
5869
- // workplace search uses a different format for sources
5870
- if (Array.isArray(sources)) {
5871
- return sources.find((source) => source.name === name)?.icon || 'far fa-file';
5872
- }
5873
- return 'far fa-file';
5874
- }
5875
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SourceIconPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
5876
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.1.2", ngImport: i0, type: SourceIconPipe, isStandalone: true, name: "sourceIcon" });
5877
- }
5878
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SourceIconPipe, decorators: [{
5879
- type: Pipe,
5880
- args: [{
5881
- name: 'sourceIcon',
5882
- standalone: true,
5883
- pure: true
5884
- }]
5885
- }] });
5886
-
5887
- class OperatorPipe {
5888
- transloco = inject(TranslocoService);
5889
- lastTransformedValue = null;
5890
- cdr = inject(ChangeDetectorRef);
5891
- destroyRef = inject(DestroyRef);
5892
- transform(filter) {
5893
- this.transloco.langChanges$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(locale => {
5894
- const transformedValue = this.transformFilter(filter, locale);
5895
- if (transformedValue !== this.lastTransformedValue) {
5896
- this.lastTransformedValue = transformedValue;
5897
- this.cdr.markForCheck();
5898
- }
5899
- });
5900
- return this.lastTransformedValue || this.transformFilter(filter);
5901
- }
5902
- transformFilter(filter, locale) {
5903
- let op = this.transformOperator(filter?.operator);
5904
- if (filter?.operator === 'between') {
5905
- const { start, end } = filter;
5906
- if (!start || !end) {
5907
- return 'bad date range';
5908
- }
5909
- return `&gt; ${new Intl.DateTimeFormat(locale).format(new Date(start))} &le; ${new Intl.DateTimeFormat(locale).format(new Date(end))}`;
5910
- }
5911
- if (filter?.operator === 'and') {
5912
- const value = filter?.display ?? filter?.value ?? '';
5913
- const date = new Date(value);
5914
- if (isNaN(date.getTime())) {
5915
- return value;
5916
- }
5917
- else {
5918
- return new Intl.DateTimeFormat(locale).format(date);
5919
- }
5920
- }
5921
- const date = new Date(filter?.value || '');
5922
- if (isNaN(date.getTime())) {
5923
- return `${op} ${filter?.value || ''}`;
5924
- }
5925
- else {
5926
- return `${op} ${new Intl.DateTimeFormat(locale).format(date)}`;
5927
- }
5928
- }
5929
- transformOperator(operator) {
5930
- switch (operator) {
5931
- case 'lt':
5932
- return '&lt;';
5933
- case 'lte':
5934
- return '&le;';
5935
- case 'eq':
5936
- return '=';
5937
- case 'neq':
5938
- return '&ne;';
5939
- case 'gte':
5940
- return '&ge;';
5941
- case 'gt':
5942
- return '&gt;';
5943
- default:
5944
- return '';
5945
- }
5946
- }
5947
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: OperatorPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
5948
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.1.2", ngImport: i0, type: OperatorPipe, isStandalone: true, name: "operator", pure: false });
5949
- }
5950
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: OperatorPipe, decorators: [{
5951
- type: Pipe,
5952
- args: [{
5953
- name: 'operator',
5954
- standalone: true,
5955
- pure: false
5956
- }]
5957
- }] });
5958
-
5959
- /**
5960
- * The `SyslangPipe` class is a custom pipe that transforms a string value using the current language.
5961
- * This pipe is used to translate strings that are not part of the Angular i18n system.
5962
- * This pipe exists to keep the compatibility with a legacy system that uses a custom language syntax.
5963
- *
5964
- * This pipe can be used in the following way:
5965
- *
5966
- * @example
5967
- * <div>{{ 'Hello[fr]Bonjour' | syslang }}</div>
5968
- * // output: `Bonjour` if your current language is 'fr'
5969
- * // output: `Hello` if your current language is not 'fr'
5970
- *
5971
- * <div>{{ 'Hello[fr]Bonjour' | syslang: 'fr' }}</div>
5972
- * // output: `Bonjour` even if your current language is not 'fr'
5973
- */
5974
- class SyslangPipe {
5975
- transloco = inject(TranslocoService);
5976
- cdr = inject(ChangeDetectorRef);
5977
- lastValue = null;
5978
- currentLang;
5979
- subscription = null;
5980
- ngOnDestroy() {
5981
- this.subscription?.unsubscribe();
5982
- this.subscription = null;
5983
- }
5984
- constructor() {
5985
- this.currentLang = this.transloco.getActiveLang();
5986
- this.subscription = this.transloco.langChanges$.subscribe(locale => (this.currentLang = locale));
5987
- }
5988
- /**
5989
- * Transforms the input value using the current language.
5990
- * @param value The input string value to be transformed.
5991
- * @returns The transformed string value.
5992
- */
5993
- transform(value, lang) {
5994
- const transformedValue = sysLang(value || '', lang || this.currentLang);
5995
- if (transformedValue !== this.lastValue) {
5996
- this.lastValue = transformedValue;
5997
- this.cdr.markForCheck();
5998
- }
5999
- return this.lastValue;
6000
- }
6001
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SyslangPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
6002
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.1.2", ngImport: i0, type: SyslangPipe, isStandalone: true, name: "syslang", pure: false });
6003
- }
6004
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SyslangPipe, decorators: [{
6005
- type: Pipe,
6006
- args: [{
6007
- name: 'syslang',
6008
- standalone: true,
6009
- pure: false
6010
- }]
6011
- }], ctorParameters: () => [] });
6012
-
6013
- class TranslocoDateImpurePipe extends DatePipe {
6014
- transloco = inject(TranslocoService);
6015
- cdr = inject(ChangeDetectorRef);
6016
- lastTransformedValue = null;
6017
- subscription = null;
6018
- constructor(locale, defaultTimezone, defaultOptions) {
6019
- super(locale, defaultTimezone, defaultOptions);
6020
- }
6021
- ngOnDestroy() {
6022
- this.subscription?.unsubscribe();
6023
- this.subscription = null;
6024
- }
6025
- transform(value, format, timezone) {
6026
- this.subscription?.unsubscribe();
6027
- this.subscription = this.transloco.langChanges$.subscribe(locale => {
6028
- const transformedValue = super.transform(value, format, timezone, locale);
6029
- if (transformedValue !== this.lastTransformedValue) {
6030
- this.lastTransformedValue = transformedValue;
6031
- this.cdr.markForCheck();
6032
- }
6033
- });
6034
- return this.lastTransformedValue;
6035
- }
6036
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: TranslocoDateImpurePipe, deps: [{ token: LOCALE_ID }, { token: DATE_PIPE_DEFAULT_TIMEZONE, optional: true }, { token: DATE_PIPE_DEFAULT_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Pipe });
6037
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.1.2", ngImport: i0, type: TranslocoDateImpurePipe, isStandalone: true, name: "translocoDate", pure: false });
6038
- }
6039
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: TranslocoDateImpurePipe, decorators: [{
6040
- type: Pipe,
6041
- args: [{
6042
- name: 'translocoDate',
6043
- pure: false,
6044
- standalone: true
6045
- }]
6046
- }], ctorParameters: () => [{ type: undefined, decorators: [{
6047
- type: Inject,
6048
- args: [LOCALE_ID]
6049
- }] }, { type: undefined, decorators: [{
6050
- type: Inject,
6051
- args: [DATE_PIPE_DEFAULT_TIMEZONE]
6052
- }, {
6053
- type: Optional
6054
- }] }, { type: undefined, decorators: [{
6055
- type: Inject,
6056
- args: [DATE_PIPE_DEFAULT_OPTIONS]
6057
- }, {
6058
- type: Optional
6059
- }] }] });
6060
-
6061
6179
  class NavbarTabsComponent {
6062
6180
  router = inject(Router);
6063
6181
  route = inject(ActivatedRoute);
6064
6182
  drawerStack = inject(DrawerStackService);
6065
6183
  drawerOpened = signal(false, ...(ngDevMode ? [{ debugName: "drawerOpened" }] : []));
6066
6184
  queryParamsStore = inject(QueryParamsStore);
6185
+ // Injecting the QueryService to access last search results
6186
+ queryService = inject(QueryService);
6187
+ /**
6188
+ * Determines whether the count should be displayed in the navbar tabs component.
6189
+ * This value is provided as an input property.
6190
+ *
6191
+ * @remarks
6192
+ * This works only if tabSearch is enabled in the administration panel.
6193
+ */
6194
+ showCount = input(false, ...(ngDevMode ? [{ debugName: "showCount" }] : []));
6067
6195
  searchText = computed(() => {
6068
6196
  const state = getState(this.queryParamsStore);
6069
6197
  return state.text || '';
@@ -6078,17 +6206,21 @@ class NavbarTabsComponent {
6078
6206
  return childPath || 'all';
6079
6207
  }, ...(ngDevMode ? [{ debugName: "currentPath" }] : []));
6080
6208
  // create tabs from the search routes
6081
- tabs = computed(() => this.router.config
6082
- .find(item => item.path === 'search')
6083
- ?.children?.filter(c => c.path !== '**')
6084
- .map(child => ({
6085
- display: child.data?.['display'] || child.path,
6086
- wsQueryTab: child.data?.['wsQueryTab'] || child.path,
6087
- path: child.path,
6088
- routerLink: `/search/${child.path}`,
6089
- icon: child.data?.['icon'],
6090
- queryName: child.data?.['queryName']
6091
- })) ?? [], ...(ngDevMode ? [{ debugName: "tabs" }] : []));
6209
+ tabs = computed(() => {
6210
+ const r = this.router.config
6211
+ .find(item => item.path === 'search')
6212
+ ?.children?.filter(c => c.path !== '**')
6213
+ .map(child => ({
6214
+ display: child.data?.['display'] || child.path,
6215
+ wsQueryTab: child.data?.['wsQueryTab'] || child.path,
6216
+ path: child.path,
6217
+ routerLink: `/search/${child.path}`,
6218
+ icon: child.data?.['icon'],
6219
+ queryName: child.data?.['queryName'],
6220
+ count: this.showCount() ? this.queryService.result?.tabs?.find(tab => tab.name === (child.data?.['wsQueryTab'] || child.path))?.count : undefined
6221
+ })) ?? [];
6222
+ return r;
6223
+ }, ...(ngDevMode ? [{ debugName: "tabs" }] : []));
6092
6224
  moreTabs = computed(() => this.tabs().slice(this.visibleTabCount()), ...(ngDevMode ? [{ debugName: "moreTabs" }] : []));
6093
6225
  changeTab(tab) {
6094
6226
  // we use the routerlink to navigate, so just close the drawer and remove the id parameter from the query params
@@ -6097,15 +6229,15 @@ class NavbarTabsComponent {
6097
6229
  constructor() {
6098
6230
  this.drawerStack.isOpened.pipe(takeUntilDestroyed()).subscribe(state => this.drawerOpened.set(state));
6099
6231
  }
6100
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: NavbarTabsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6101
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: NavbarTabsComponent, isStandalone: true, selector: "navbar-tabs", ngImport: i0, template: `
6232
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: NavbarTabsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6233
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: NavbarTabsComponent, isStandalone: true, selector: "navbar-tabs", inputs: { showCount: { classPropertyName: "showCount", publicName: "showCount", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
6102
6234
  <!-- do not display the tabs if there are no tabs -->
6103
6235
  @if (tabs().length > 0) {
6104
6236
  <div overflowManager class="relative col-span-2 col-start-2 row-start-2 flex" (count)="visibleTabCount.set($event)">
6105
6237
  <tabs class="w-full">
6106
6238
  @for (tab of tabs(); track $index) {
6107
6239
  <tab
6108
- class="w-fit"
6240
+ class="bg-muted w-fit"
6109
6241
  value="{{ tab.display | syslang | transloco }}"
6110
6242
  overflowItem
6111
6243
  [attr.aria-selected]="this.currentPath() === tab.path"
@@ -6117,6 +6249,7 @@ class NavbarTabsComponent {
6117
6249
  <i class="fa-fw {{ tab.icon }} " aria-hidden="true"></i>
6118
6250
  }
6119
6251
  <span>{{ tab.display | syslang | transloco }}</span>
6252
+ <span class="empty:hidden">{{ tab.count }}</span>
6120
6253
  </tab>
6121
6254
  }
6122
6255
  </tabs>
@@ -6151,9 +6284,9 @@ class NavbarTabsComponent {
6151
6284
  }
6152
6285
  </div>
6153
6286
  }
6154
- `, isInline: true, dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "component", type: MenuComponent, selector: "menu, Menu", inputs: ["disabled"] }, { kind: "directive", type: MenuItemComponent, selector: "menu-item, menuitem, MenuItem", inputs: ["class", "variant"] }, { kind: "directive", type: MenuContentComponent, selector: "MenuContent, menucontent, menu-content", inputs: ["class", "position"] }, { kind: "directive", type: TabsComponent, selector: "tabs, Tabs", inputs: ["class", "variant", "size"] }, { kind: "component", type: TabComponent, selector: "tab, Tab", inputs: ["class", "variant", "size", "value", "active"], outputs: ["clicked"] }, { kind: "directive", type: OverflowManagerDirective, selector: "[overflowManager]", inputs: ["target", "margin", "direction"], outputs: ["count"] }, { kind: "directive", type: OverflowItemDirective, selector: "[overflowItem]" }, { kind: "directive", type: OverflowStopDirective, selector: "[overflowStop]" }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }, { kind: "pipe", type: SyslangPipe, name: "syslang" }] });
6287
+ `, isInline: true, dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "decoration", "size"] }, { kind: "component", type: MenuComponent, selector: "menu, Menu", inputs: ["disabled"] }, { kind: "directive", type: MenuItemComponent, selector: "menu-item, menuitem, MenuItem", inputs: ["class", "variant", "decoration"] }, { kind: "directive", type: MenuContentComponent, selector: "MenuContent, menucontent, menu-content", inputs: ["class", "position"] }, { kind: "directive", type: TabsComponent, selector: "tabs, Tabs", inputs: ["class", "variant", "size"] }, { kind: "component", type: TabComponent, selector: "tab, Tab", inputs: ["class", "variant", "shadow", "size", "decoration", "value", "active"], outputs: ["clicked"] }, { kind: "directive", type: OverflowManagerDirective, selector: "[overflowManager]", inputs: ["target", "margin", "direction"], outputs: ["count"] }, { kind: "directive", type: OverflowItemDirective, selector: "[overflowItem]" }, { kind: "directive", type: OverflowStopDirective, selector: "[overflowStop]" }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }, { kind: "pipe", type: SyslangPipe, name: "syslang" }] });
6155
6288
  }
6156
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: NavbarTabsComponent, decorators: [{
6289
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: NavbarTabsComponent, decorators: [{
6157
6290
  type: Component,
6158
6291
  args: [{
6159
6292
  selector: 'navbar-tabs',
@@ -6165,7 +6298,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
6165
6298
  <tabs class="w-full">
6166
6299
  @for (tab of tabs(); track $index) {
6167
6300
  <tab
6168
- class="w-fit"
6301
+ class="bg-muted w-fit"
6169
6302
  value="{{ tab.display | syslang | transloco }}"
6170
6303
  overflowItem
6171
6304
  [attr.aria-selected]="this.currentPath() === tab.path"
@@ -6177,6 +6310,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
6177
6310
  <i class="fa-fw {{ tab.icon }} " aria-hidden="true"></i>
6178
6311
  }
6179
6312
  <span>{{ tab.display | syslang | transloco }}</span>
6313
+ <span class="empty:hidden">{{ tab.count }}</span>
6180
6314
  </tab>
6181
6315
  }
6182
6316
  </tabs>
@@ -6230,8 +6364,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
6230
6364
  }], ctorParameters: () => [] });
6231
6365
 
6232
6366
  class NoResultComponent {
6233
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: NoResultComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6234
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.1.2", type: NoResultComponent, isStandalone: true, selector: "NoResult", host: { classAttribute: "p-4 flex flex-col gap-2 bg-gray-100 rounded-md" }, providers: [provideTranslocoScope('no-result')], ngImport: i0, template: `
6367
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: NoResultComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6368
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.1.7", type: NoResultComponent, isStandalone: true, selector: "NoResult", host: { classAttribute: "p-4 flex flex-col gap-2 bg-neutral-100 dark:bg-menu rounded-md" }, providers: [provideTranslocoScope('no-result')], ngImport: i0, template: `
6235
6369
  <header class="flex items-center gap-2 text-xl font-semibold">
6236
6370
  <i class="fa-fw far fa-face-sad-sweat text-3xl"></i>
6237
6371
  <p>{{ 'noResult.noResult' | transloco }}</p>
@@ -6244,7 +6378,7 @@ class NoResultComponent {
6244
6378
  <p>{{ 'noResult.noResultAssistance' | transloco }}</p>
6245
6379
  `, isInline: true, dependencies: [{ kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
6246
6380
  }
6247
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: NoResultComponent, decorators: [{
6381
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: NoResultComponent, decorators: [{
6248
6382
  type: Component,
6249
6383
  args: [{
6250
6384
  selector: 'NoResult',
@@ -6264,7 +6398,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
6264
6398
  <p>{{ 'noResult.noResultAssistance' | transloco }}</p>
6265
6399
  `,
6266
6400
  host: {
6267
- class: 'p-4 flex flex-col gap-2 bg-gray-100 rounded-md'
6401
+ class: 'p-4 flex flex-col gap-2 bg-neutral-100 dark:bg-menu rounded-md'
6268
6402
  }
6269
6403
  }]
6270
6404
  }] });
@@ -6290,8 +6424,8 @@ class PagerComponent {
6290
6424
  this.page.set(this.page() - 1);
6291
6425
  this.queryService.gotoPage(this.page());
6292
6426
  }
6293
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: PagerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6294
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: PagerComponent, isStandalone: true, selector: "pager", inputs: { configuration: { classPropertyName: "configuration", publicName: "configuration", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
6427
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: PagerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6428
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: PagerComponent, isStandalone: true, selector: "pager", inputs: { configuration: { classPropertyName: "configuration", publicName: "configuration", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
6295
6429
  <div class="flex gap-2">
6296
6430
  @if ((hasPages() && page() > 1) || (!hasPages() && page() > 1)) {
6297
6431
  <button variant="ghost" [attr.title]="'previousPage' | transloco" (click)="previousPage()">
@@ -6313,9 +6447,9 @@ class PagerComponent {
6313
6447
  </button>
6314
6448
  }
6315
6449
  </div>
6316
- `, isInline: true, dependencies: [{ kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
6450
+ `, isInline: true, dependencies: [{ kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "decoration", "size"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
6317
6451
  }
6318
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: PagerComponent, decorators: [{
6452
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: PagerComponent, decorators: [{
6319
6453
  type: Component,
6320
6454
  args: [{
6321
6455
  selector: 'pager',
@@ -6347,6 +6481,35 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
6347
6481
  }]
6348
6482
  }], ctorParameters: () => [] });
6349
6483
 
6484
+ const searchVariants = cva(cn('group flex gap-1 px-2 py-3 min-w-0 h-9 rounded-full items-center text-sm/5', 'dark:bg-muted border border-foreground/20 text-foreground', 'hover:cursor-pointer hover:bg-foreground/2', '[&[disabled]]:pointer-events-none [&[disabled]]:opacity-50', 'transition-colors'), {
6485
+ variants: {
6486
+ variant: {
6487
+ default: '',
6488
+ primary: ['bg-primary/5 text-primary', 'hover:bg-primary/10', 'focus-within:bg-primary/10'],
6489
+ secondary: ['bg-secondary/5 text-secondary', 'hover:bg-secondary/10', 'focus-within:bg-secondary/10'],
6490
+ destructive: ['bg-destructive/5 text-destructive', 'hover:bg-destructive/10 ', 'focus-within:bg-destructive/10'],
6491
+ ai: [
6492
+ 'bg-gradient-to-r text-foreground',
6493
+ 'from-ai-from/10 via-ai-via/10 to-ai-to/10',
6494
+ 'hover:from-ai-from/20 hover:via-ai-via/20 hover:to-ai-to/20',
6495
+ 'focus-within:from-ai-from/20 focus-within:via-ai-via/20 focus-within:to-ai-to/20'
6496
+ ]
6497
+ },
6498
+ decoration: {
6499
+ outline: 'border border-foreground/20 hover:border-foreground',
6500
+ none: ''
6501
+ }
6502
+ },
6503
+ compoundVariants: [
6504
+ { decoration: 'outline', variant: 'primary', class: ['border-primary/50 hover:border-primary-hover focus-within:border-primary'] },
6505
+ { decoration: 'outline', variant: 'secondary', class: ['border-secondary/50 hover:border-secondary-hover focus-within:border-secondary'] },
6506
+ { decoration: 'outline', variant: 'destructive', class: ['border-destructive/50 hover:border-destructive-hover focus-within:border-destructive'] },
6507
+ { decoration: 'outline', variant: 'ai', class: ['border-bg-ai-50/20 hover:border-bg-ai focus-within:border-bg-ai'] }
6508
+ ],
6509
+ defaultVariants: {
6510
+ variant: 'default'
6511
+ }
6512
+ });
6350
6513
  class SearchInputComponent {
6351
6514
  cn = cn;
6352
6515
  searchInput = viewChild.required('search');
@@ -6385,12 +6548,13 @@ class SearchInputComponent {
6385
6548
  }
6386
6549
  }, ...(ngDevMode ? [{ debugName: "keyboardNavigatorOptions" }] : []));
6387
6550
  placeholder = input('Search...', ...(ngDevMode ? [{ debugName: "placeholder" }] : []));
6388
- disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
6551
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
6389
6552
  hotkey = input('shift+/', ...(ngDevMode ? [{ debugName: "hotkey" }] : []));
6390
6553
  class = input(...(ngDevMode ? [undefined, { debugName: "class" }] : []));
6391
6554
  variant = input('default', ...(ngDevMode ? [{ debugName: "variant" }] : []));
6555
+ decoration = input('none', ...(ngDevMode ? [{ debugName: "decoration" }] : []));
6392
6556
  variants = computed(() => {
6393
- return searchVariants({ variant: this.variant(), class: this.class() });
6557
+ return searchVariants({ variant: this.variant(), decoration: this.decoration(), class: this.class() });
6394
6558
  }, ...(ngDevMode ? [{ debugName: "variants" }] : []));
6395
6559
  onInput(event) {
6396
6560
  const inputElement = event.target;
@@ -6402,10 +6566,9 @@ class SearchInputComponent {
6402
6566
  e.stopImmediatePropagation();
6403
6567
  this.control().reset();
6404
6568
  this.control().updateValueAndValidity();
6405
- this.searchInput()?.nativeElement.focus();
6406
6569
  }
6407
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SearchInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6408
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.1.2", type: SearchInputComponent, isStandalone: true, selector: "SearchInput", inputs: { control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: true, transformFunction: null }, controls: { classPropertyName: "controls", publicName: "controls", isSignal: true, isRequired: true, transformFunction: null }, keyboardNavigatorOptions: { classPropertyName: "keyboardNavigatorOptions", publicName: "keyboardNavigatorOptions", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, hotkey: { classPropertyName: "hotkey", publicName: "hotkey", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onSelected: "onSelected" }, host: { properties: { "class": "cn(variants(), disabled() && 'pointer-events-none opacity-50')" } }, viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["search"], descendants: true, isSignal: true }], ngImport: i0, template: `
6570
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SearchInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6571
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.1.7", type: SearchInputComponent, isStandalone: true, selector: "SearchInput", inputs: { control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: true, transformFunction: null }, controls: { classPropertyName: "controls", publicName: "controls", isSignal: true, isRequired: true, transformFunction: null }, keyboardNavigatorOptions: { classPropertyName: "keyboardNavigatorOptions", publicName: "keyboardNavigatorOptions", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, hotkey: { classPropertyName: "hotkey", publicName: "hotkey", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, decoration: { classPropertyName: "decoration", publicName: "decoration", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onSelected: "onSelected" }, host: { properties: { "class": "cn(variants(), disabled() && 'pointer-events-none opacity-50')" } }, viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["search"], descendants: true, isSignal: true }], ngImport: i0, template: `
6409
6572
  <SearchIcon class="text-foreground size-4 rotate-0 transition-[rotate] duration-500 group-focus-within:rotate-90" />
6410
6573
  <input
6411
6574
  #search
@@ -6425,18 +6588,17 @@ class SearchInputComponent {
6425
6588
  (input)="onInput($event)" />
6426
6589
 
6427
6590
  <button
6428
- variant="icon"
6591
+ class="text-foreground peer-not-placeholder-shown:rotate-90 peer-not-placeholder-shown:cursor-pointer peer-not-placeholder-shown:opacity-100 rotate-0 transform opacity-0 transition-[rotate,opacity] duration-500 peer-placeholder-shown:pointer-events-none"
6429
6592
  [tabindex]="control().value ? 0 : -1"
6430
- class="text-foreground peer-not-placeholder-shown:rotate-90 peer-not-placeholder-shown:cursor-pointer peer-not-placeholder-shown:opacity-100 mr-1 rotate-0 transform opacity-0 transition-[rotate,opacity] duration-500 peer-placeholder-shown:pointer-events-none"
6431
6593
  (keydown.enter)="clearSearch($event)"
6432
6594
  (click)="clearSearch($event)">
6433
6595
  <XMark class="size-4" aria-hidden="true" />
6434
6596
  </button>
6435
6597
 
6436
6598
  <ng-content />
6437
- `, isInline: true, styles: [":host input[type=search]::-ms-clear,:host input[type=search]::-ms-reveal{appearance:none;width:0;height:0}:host input[type=search]::-webkit-search-decoration,:host input[type=search]::-webkit-search-cancel-button,:host input[type=search]::-webkit-search-results-button,:host input[type=search]::-webkit-search-results-decoration{appearance:none}\n"], dependencies: [{ kind: "component", type: SearchIcon, selector: "SearchIcon", inputs: ["class", "width", "height"] }, { kind: "component", type: XMarkIConComponent, selector: "XMark, xmark, x-mark", inputs: ["class", "width", "height"] }, { kind: "directive", type: KeyboardNavigatorDirective, selector: "input[role=\"combobox\"]", inputs: ["keyboardNavigator", "aria-controls"], outputs: ["onFocus", "onBlur", "onSelected"] }] });
6599
+ `, isInline: true, styles: [":host input[type=search]::-ms-clear,:host input[type=search]::-ms-reveal{appearance:none;width:0;height:0}:host input[type=search]::-webkit-search-decoration,:host input[type=search]::-webkit-search-cancel-button,:host input[type=search]::-webkit-search-results-button,:host input[type=search]::-webkit-search-results-decoration{appearance:none}\n"], dependencies: [{ kind: "component", type: SearchIcon, selector: "SearchIcon", inputs: ["class"] }, { kind: "component", type: XMarkIConComponent, selector: "XMark, xmark, x-mark", inputs: ["class"] }, { kind: "directive", type: KeyboardNavigatorDirective, selector: "input[role=\"combobox\"]", inputs: ["keyboardNavigator", "aria-controls"], outputs: ["onFocus", "onBlur", "onSelected"] }] });
6438
6600
  }
6439
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SearchInputComponent, decorators: [{
6601
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SearchInputComponent, decorators: [{
6440
6602
  type: Component,
6441
6603
  args: [{ selector: 'SearchInput', standalone: true, imports: [SearchIcon, XMarkIConComponent, KeyboardNavigatorDirective], template: `
6442
6604
  <SearchIcon class="text-foreground size-4 rotate-0 transition-[rotate] duration-500 group-focus-within:rotate-90" />
@@ -6458,9 +6620,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
6458
6620
  (input)="onInput($event)" />
6459
6621
 
6460
6622
  <button
6461
- variant="icon"
6623
+ class="text-foreground peer-not-placeholder-shown:rotate-90 peer-not-placeholder-shown:cursor-pointer peer-not-placeholder-shown:opacity-100 rotate-0 transform opacity-0 transition-[rotate,opacity] duration-500 peer-placeholder-shown:pointer-events-none"
6462
6624
  [tabindex]="control().value ? 0 : -1"
6463
- class="text-foreground peer-not-placeholder-shown:rotate-90 peer-not-placeholder-shown:cursor-pointer peer-not-placeholder-shown:opacity-100 mr-1 rotate-0 transform opacity-0 transition-[rotate,opacity] duration-500 peer-placeholder-shown:pointer-events-none"
6464
6625
  (keydown.enter)="clearSearch($event)"
6465
6626
  (click)="clearSearch($event)">
6466
6627
  <XMark class="size-4" aria-hidden="true" />
@@ -6517,10 +6678,10 @@ class SortSelectorComponent {
6517
6678
  this.onSort.emit(sort);
6518
6679
  }
6519
6680
  }
6520
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SortSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6521
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: SortSelectorComponent, isStandalone: true, selector: "sort-selector, sortselector, SortSelector", inputs: { result: { classPropertyName: "result", publicName: "result", isSignal: true, isRequired: true, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onSort: "onSort" }, providers: [provideTranslocoScope('sort-selector')], viewQueries: [{ propertyName: "dropdown", first: true, predicate: DropdownComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<menu>\n <button tabindex=\"0\" variant=\"ghost\" [attr.title]=\"'sortSelector.selectSort' | transloco\">\n <i class=\"fa-fw fa-regular fa-arrow-{{ sort()?.$isDesc ? 'down' : 'up' }}-big-small me-1\"></i>\n <span>{{ sort()?.display | transloco }}</span>\n </button>\n\n <MenuContent [position]=\"position()\" class=\"min-w-max\">\n @if (sortOptions().length > 0) {\n @for (option of sortOptions(); track $index) {\n <menuitem (click)=\"onSortOptionClicked(option)\" class=\"justify-between\">\n <span>{{ option.display | transloco }}</span>\n <i class=\"fa-fw fa-regular fa-arrow-{{ option.$isDesc ? 'down' : 'up' }}-big-small\"></i>\n </menuitem>\n }\n }\n </MenuContent>\n</menu>\n", dependencies: [{ kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "component", type: MenuComponent, selector: "menu, Menu", inputs: ["disabled"] }, { kind: "directive", type: MenuContentComponent, selector: "MenuContent, menucontent, menu-content", inputs: ["class", "position"] }, { kind: "directive", type: MenuItemComponent, selector: "menu-item, menuitem, MenuItem", inputs: ["class", "variant"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
6681
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SortSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6682
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: SortSelectorComponent, isStandalone: true, selector: "sort-selector, sortselector, SortSelector", inputs: { result: { classPropertyName: "result", publicName: "result", isSignal: true, isRequired: true, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onSort: "onSort" }, providers: [provideTranslocoScope('sort-selector')], viewQueries: [{ propertyName: "dropdown", first: true, predicate: DropdownComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<menu>\n <button tabindex=\"0\" variant=\"ghost\" [attr.title]=\"'sortSelector.selectSort' | transloco\">\n <i class=\"fa-fw fa-regular fa-arrow-{{ sort()?.$isDesc ? 'down' : 'up' }}-big-small me-1\"></i>\n <span>{{ sort()?.display | transloco }}</span>\n </button>\n\n <MenuContent [position]=\"position()\" class=\"min-w-max\">\n @if (sortOptions().length > 0) {\n @for (option of sortOptions(); track $index) {\n <menuitem (click)=\"onSortOptionClicked(option)\" class=\"justify-between\">\n <span>{{ option.display | transloco }}</span>\n <i class=\"fa-fw fa-regular fa-arrow-{{ option.$isDesc ? 'down' : 'up' }}-big-small\"></i>\n </menuitem>\n }\n }\n </MenuContent>\n</menu>\n", dependencies: [{ kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "decoration", "size"] }, { kind: "component", type: MenuComponent, selector: "menu, Menu", inputs: ["disabled"] }, { kind: "directive", type: MenuContentComponent, selector: "MenuContent, menucontent, menu-content", inputs: ["class", "position"] }, { kind: "directive", type: MenuItemComponent, selector: "menu-item, menuitem, MenuItem", inputs: ["class", "variant", "decoration"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
6522
6683
  }
6523
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SortSelectorComponent, decorators: [{
6684
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SortSelectorComponent, decorators: [{
6524
6685
  type: Component,
6525
6686
  args: [{ selector: 'sort-selector, sortselector, SortSelector', standalone: true, imports: [TranslocoPipe, ButtonComponent, MenuComponent, MenuContentComponent, MenuItemComponent], providers: [provideTranslocoScope('sort-selector')], template: "<menu>\n <button tabindex=\"0\" variant=\"ghost\" [attr.title]=\"'sortSelector.selectSort' | transloco\">\n <i class=\"fa-fw fa-regular fa-arrow-{{ sort()?.$isDesc ? 'down' : 'up' }}-big-small me-1\"></i>\n <span>{{ sort()?.display | transloco }}</span>\n </button>\n\n <MenuContent [position]=\"position()\" class=\"min-w-max\">\n @if (sortOptions().length > 0) {\n @for (option of sortOptions(); track $index) {\n <menuitem (click)=\"onSortOptionClicked(option)\" class=\"justify-between\">\n <span>{{ option.display | transloco }}</span>\n <i class=\"fa-fw fa-regular fa-arrow-{{ option.$isDesc ? 'down' : 'up' }}-big-small\"></i>\n </menuitem>\n }\n }\n </MenuContent>\n</menu>\n" }]
6526
6687
  }] });
@@ -6571,8 +6732,8 @@ class SponsoredResultsComponent {
6571
6732
  }
6572
6733
  });
6573
6734
  }
6574
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SponsoredResultsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6575
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: SponsoredResultsComponent, isStandalone: true, selector: "sponsored-results, SponsoredResults, sponsoredresults", inputs: { slice: { classPropertyName: "slice", publicName: "slice", isSignal: true, isRequired: false, transformFunction: null }, displayPromoted: { classPropertyName: "displayPromoted", publicName: "displayPromoted", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "list" } }, queries: [{ propertyName: "childElement", first: true, predicate: ChildMarkerDirective, descendants: true, isSignal: true }], ngImport: i0, template: ` @if (sponsoredResults()?.length) {
6735
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SponsoredResultsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6736
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: SponsoredResultsComponent, isStandalone: true, selector: "sponsored-results, SponsoredResults, sponsoredresults", inputs: { slice: { classPropertyName: "slice", publicName: "slice", isSignal: true, isRequired: false, transformFunction: null }, displayPromoted: { classPropertyName: "displayPromoted", publicName: "displayPromoted", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "list" } }, queries: [{ propertyName: "childElement", first: true, predicate: ChildMarkerDirective, descendants: true, isSignal: true }], ngImport: i0, template: ` @if (sponsoredResults()?.length) {
6576
6737
  @for (link of sponsoredResults(); track $index) {
6577
6738
  <li role="listitem" class="text-primary flex items-center gap-2 rounded px-3 py-2 font-bold">
6578
6739
  <a href="{{ link.url }}" target="_blank" rel="noopener" title="{{ link.tooltip }}" class="result-link peer flex items-center gap-2 hover:underline">
@@ -6590,7 +6751,7 @@ class SponsoredResultsComponent {
6590
6751
  }
6591
6752
  }`, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
6592
6753
  }
6593
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SponsoredResultsComponent, decorators: [{
6754
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SponsoredResultsComponent, decorators: [{
6594
6755
  type: Component,
6595
6756
  args: [{
6596
6757
  selector: 'sponsored-results, SponsoredResults, sponsoredresults',
@@ -6638,8 +6799,8 @@ class ThemeSelectorComponent {
6638
6799
  theme = theme.name;
6639
6800
  this.themeStore.setCurrentTheme(this.scope(), theme);
6640
6801
  }
6641
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: ThemeSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6642
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: ThemeSelectorComponent, isStandalone: true, selector: "theme-selector", inputs: { scope: { classPropertyName: "scope", publicName: "scope", isSignal: true, isRequired: true, transformFunction: null }, showPrivate: { classPropertyName: "showPrivate", publicName: "showPrivate", isSignal: true, isRequired: false, transformFunction: null }, selectedTheme: { classPropertyName: "selectedTheme", publicName: "selectedTheme", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedTheme: "selectedThemeChange" }, ngImport: i0, template: `
6802
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ThemeSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6803
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: ThemeSelectorComponent, isStandalone: true, selector: "theme-selector", inputs: { scope: { classPropertyName: "scope", publicName: "scope", isSignal: true, isRequired: true, transformFunction: null }, showPrivate: { classPropertyName: "showPrivate", publicName: "showPrivate", isSignal: true, isRequired: false, transformFunction: null }, selectedTheme: { classPropertyName: "selectedTheme", publicName: "selectedTheme", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedTheme: "selectedThemeChange" }, ngImport: i0, template: `
6643
6804
  <Menu>
6644
6805
  <ng-content></ng-content>
6645
6806
 
@@ -6658,7 +6819,7 @@ class ThemeSelectorComponent {
6658
6819
  </Menu>
6659
6820
  `, isInline: true, styles: [""], dependencies: [{ kind: "component", type: MenuComponent, selector: "menu, Menu", inputs: ["disabled"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: MenuContentComponent, selector: "MenuContent, menucontent, menu-content", inputs: ["class", "position"] }] });
6660
6821
  }
6661
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: ThemeSelectorComponent, decorators: [{
6822
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ThemeSelectorComponent, decorators: [{
6662
6823
  type: Component,
6663
6824
  args: [{ selector: 'theme-selector', standalone: true, imports: [MenuComponent, NgStyle, MenuContentComponent], template: `
6664
6825
  <Menu>
@@ -6698,8 +6859,8 @@ class ThemeToggleComponent {
6698
6859
  return;
6699
6860
  this.themeStore.setDarkMode(this.scope(), status);
6700
6861
  }
6701
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: ThemeToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6702
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: ThemeToggleComponent, isStandalone: true, selector: "theme-toggle", inputs: { scope: { classPropertyName: "scope", publicName: "scope", isSignal: true, isRequired: true, transformFunction: null }, darkMode: { classPropertyName: "darkMode", publicName: "darkMode", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { darkMode: "darkModeChange" }, ngImport: i0, template: `
6862
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ThemeToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6863
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: ThemeToggleComponent, isStandalone: true, selector: "theme-toggle", inputs: { scope: { classPropertyName: "scope", publicName: "scope", isSignal: true, isRequired: true, transformFunction: null }, darkMode: { classPropertyName: "darkMode", publicName: "darkMode", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { darkMode: "darkModeChange" }, ngImport: i0, template: `
6703
6864
  <label class="flex cursor-pointer select-none items-center gap-2">
6704
6865
  @if (darkMode()) {
6705
6866
  <i class="fa-fw far fa-toggle-large-on text-primary"></i>
@@ -6713,7 +6874,7 @@ class ThemeToggleComponent {
6713
6874
  </label>
6714
6875
  `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
6715
6876
  }
6716
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: ThemeToggleComponent, decorators: [{
6877
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ThemeToggleComponent, decorators: [{
6717
6878
  type: Component,
6718
6879
  args: [{ selector: 'theme-toggle', standalone: true, imports: [FormsModule], template: `
6719
6880
  <label class="flex cursor-pointer select-none items-center gap-2">
@@ -6915,28 +7076,32 @@ class SearchFooterComponent {
6915
7076
  event.stopPropagation();
6916
7077
  this.loadMore.emit();
6917
7078
  }
6918
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SearchFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6919
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: SearchFooterComponent, isStandalone: true, selector: "search-footer, searchfooter, SearchFooter", inputs: { hasMore: { classPropertyName: "hasMore", publicName: "hasMore", isSignal: true, isRequired: true, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { loadMore: "loadMore" }, ngImport: i0, template: ` <div class="flex flex-col px-2">
7079
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SearchFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7080
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: SearchFooterComponent, isStandalone: true, selector: "search-footer, searchfooter, SearchFooter", inputs: { hasMore: { classPropertyName: "hasMore", publicName: "hasMore", isSignal: true, isRequired: true, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { loadMore: "loadMore" }, ngImport: i0, template: ` <div class="flex flex-col px-2">
6920
7081
  @if (hasMore() && config().showLoadMore) {
6921
- <button variant="outline" class="w-full" tabindex="0" [attr.title]="'loadMore' | transloco" (click)="onLoadMore($event)">
7082
+ <button decoration="outline" class="w-full" tabindex="0" [attr.title]="'loadMore' | transloco" (click)="onLoadMore($event)">
6922
7083
  {{ 'loadMore' | transloco }}
6923
7084
  </button>
6924
7085
  }
6925
- <button variant="link" class="ml-auto" [attr.title]="'seeMore' | transloco" [routerLink]="[config().routerLink]">{{ 'seeMore' | transloco }}</button>
6926
- </div>`, isInline: true, dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
7086
+ <button decoration="underline" class="ml-auto" [attr.title]="'seeMore' | transloco" [routerLink]="[config().routerLink]">
7087
+ {{ 'seeMore' | transloco }}
7088
+ </button>
7089
+ </div>`, isInline: true, dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "decoration", "size"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
6927
7090
  }
6928
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SearchFooterComponent, decorators: [{
7091
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SearchFooterComponent, decorators: [{
6929
7092
  type: Component,
6930
7093
  args: [{
6931
7094
  selector: 'search-footer, searchfooter, SearchFooter',
6932
7095
  imports: [TranslocoPipe, RouterLink, ButtonComponent],
6933
7096
  template: ` <div class="flex flex-col px-2">
6934
7097
  @if (hasMore() && config().showLoadMore) {
6935
- <button variant="outline" class="w-full" tabindex="0" [attr.title]="'loadMore' | transloco" (click)="onLoadMore($event)">
7098
+ <button decoration="outline" class="w-full" tabindex="0" [attr.title]="'loadMore' | transloco" (click)="onLoadMore($event)">
6936
7099
  {{ 'loadMore' | transloco }}
6937
7100
  </button>
6938
7101
  }
6939
- <button variant="link" class="ml-auto" [attr.title]="'seeMore' | transloco" [routerLink]="[config().routerLink]">{{ 'seeMore' | transloco }}</button>
7102
+ <button decoration="underline" class="ml-auto" [attr.title]="'seeMore' | transloco" [routerLink]="[config().routerLink]">
7103
+ {{ 'seeMore' | transloco }}
7104
+ </button>
6940
7105
  </div>`
6941
7106
  }]
6942
7107
  }] });
@@ -6944,17 +7109,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
6944
7109
  class SearchHeaderComponent {
6945
7110
  floating = inject(PopoverContentComponent, { skipSelf: true, optional: true });
6946
7111
  label = input('', ...(ngDevMode ? [{ debugName: "label" }] : []));
6947
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SearchHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6948
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: SearchHeaderComponent, isStandalone: true, selector: "search-header, searchheader, SearchHeader", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
7112
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SearchHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7113
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: SearchHeaderComponent, isStandalone: true, selector: "search-header, searchheader, SearchHeader", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
6949
7114
  @if (floating) {
6950
7115
  <div class="p-2">
6951
7116
  <label class="text-xl font-bold">{{ label() }}</label>
6952
- <MenuSeparator />
7117
+ <HorizontalDivider />
6953
7118
  </div>
6954
7119
  }
6955
- `, isInline: true, dependencies: [{ kind: "component", type: HorizontalDividerComponent, selector: "menu-separator, MenuSeparator, menuseparator, horizontal-divider, HorizontalDivider, horizontaldivider" }] });
7120
+ `, isInline: true, dependencies: [{ kind: "component", type: HorizontalDividerComponent, selector: "horizontal-divider, HorizontalDivider, horizontaldivider" }] });
6956
7121
  }
6957
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SearchHeaderComponent, decorators: [{
7122
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SearchHeaderComponent, decorators: [{
6958
7123
  type: Component,
6959
7124
  args: [{
6960
7125
  selector: 'search-header, searchheader, SearchHeader',
@@ -6963,7 +7128,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
6963
7128
  @if (floating) {
6964
7129
  <div class="p-2">
6965
7130
  <label class="text-xl font-bold">{{ label() }}</label>
6966
- <MenuSeparator />
7131
+ <HorizontalDivider />
6967
7132
  </div>
6968
7133
  }
6969
7134
  `
@@ -6982,7 +7147,8 @@ class SearchListComponent {
6982
7147
  transloco = inject(TranslocoService);
6983
7148
  onClick(search) {
6984
7149
  const queryParams = {
6985
- q: search.queryParams?.text
7150
+ q: search.queryParams?.text,
7151
+ t: search.queryParams?.tab
6986
7152
  };
6987
7153
  if (search.queryParams?.filters && search.queryParams?.filters?.length > 0)
6988
7154
  queryParams.f = JSON.stringify(search.queryParams?.filters);
@@ -6992,8 +7158,8 @@ class SearchListComponent {
6992
7158
  e.stopPropagation();
6993
7159
  this.delete.emit(index);
6994
7160
  }
6995
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SearchListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6996
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: SearchListComponent, isStandalone: true, selector: "search-list, searchlist, SearchList", inputs: { paginatedSearches: { classPropertyName: "paginatedSearches", publicName: "paginatedSearches", isSignal: true, isRequired: true, transformFunction: null }, deleteButtonTitle: { classPropertyName: "deleteButtonTitle", publicName: "deleteButtonTitle", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { delete: "delete" }, host: { attributes: { "role": "list" }, classAttribute: "flex max-h-[460px] flex-col overflow-auto" }, providers: [provideTranslocoScope('searches')], queries: [{ propertyName: "iconTemplate", first: true, predicate: ChildMarkerDirective, descendants: true, isSignal: true }], ngImport: i0, template: `
7161
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SearchListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7162
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: SearchListComponent, isStandalone: true, selector: "search-list, searchlist, SearchList", inputs: { paginatedSearches: { classPropertyName: "paginatedSearches", publicName: "paginatedSearches", isSignal: true, isRequired: true, transformFunction: null }, deleteButtonTitle: { classPropertyName: "deleteButtonTitle", publicName: "deleteButtonTitle", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { delete: "delete" }, host: { attributes: { "role": "list" }, classAttribute: "flex max-h-[460px] flex-col overflow-auto" }, providers: [provideTranslocoScope('searches')], queries: [{ propertyName: "iconTemplate", first: true, predicate: ChildMarkerDirective, descendants: true, isSignal: true }], ngImport: i0, template: `
6997
7163
  @for (search of paginatedSearches(); track $index) {
6998
7164
  <li
6999
7165
  role="listitem"
@@ -7035,9 +7201,9 @@ class SearchListComponent {
7035
7201
  <ng-content />
7036
7202
  </li>
7037
7203
  }
7038
- `, isInline: true, dependencies: [{ kind: "directive", type: ListItemComponent, selector: "[role=\"listitem\"], [role=\"option\"]", inputs: ["class", "variant"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
7204
+ `, isInline: true, dependencies: [{ kind: "directive", type: ListItemComponent, selector: "[role=\"listitem\"], [role=\"option\"]", inputs: ["class", "variant", "decoration"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
7039
7205
  }
7040
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SearchListComponent, decorators: [{
7206
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SearchListComponent, decorators: [{
7041
7207
  type: Component,
7042
7208
  args: [{
7043
7209
  selector: 'search-list, searchlist, SearchList',
@@ -7141,8 +7307,8 @@ class RecentSearchesComponent {
7141
7307
  loadMore() {
7142
7308
  this.range.set(this.range() + (this.config.itemsPerPage ?? 10));
7143
7309
  }
7144
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: RecentSearchesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7145
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.1.2", type: RecentSearchesComponent, isStandalone: true, selector: "RecentSearches, recent-searches", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideTranslocoScope('searches')], ngImport: i0, template: `
7310
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: RecentSearchesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7311
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.1.7", type: RecentSearchesComponent, isStandalone: true, selector: "RecentSearches, recent-searches", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideTranslocoScope('searches')], ngImport: i0, template: `
7146
7312
  <SearchHeader [label]="'searches.recent.label' | transloco" />
7147
7313
 
7148
7314
  <SearchList
@@ -7158,7 +7324,7 @@ class RecentSearchesComponent {
7158
7324
  <SearchFooter [hasMore]="hasMore()" [config]="config" (loadMore)="loadMore()" />
7159
7325
  `, isInline: true, styles: [":host ul{scrollbar-width:thin}\n"], dependencies: [{ kind: "directive", type: ChildMarkerDirective, selector: "[childMarker]" }, { kind: "component", type: SearchHeaderComponent, selector: "search-header, searchheader, SearchHeader", inputs: ["label"] }, { kind: "component", type: SearchListComponent, selector: "search-list, searchlist, SearchList", inputs: ["paginatedSearches", "deleteButtonTitle"], outputs: ["delete"] }, { kind: "component", type: SearchFooterComponent, selector: "search-footer, searchfooter, SearchFooter", inputs: ["hasMore", "config"], outputs: ["loadMore"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
7160
7326
  }
7161
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: RecentSearchesComponent, decorators: [{
7327
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: RecentSearchesComponent, decorators: [{
7162
7328
  type: Component,
7163
7329
  args: [{ selector: 'RecentSearches, recent-searches', standalone: true, providers: [provideTranslocoScope('searches')], imports: [TranslocoPipe, ChildMarkerDirective, SearchHeaderComponent, SearchListComponent, SearchFooterComponent], template: `
7164
7330
  <SearchHeader [label]="'searches.recent.label' | transloco" />
@@ -7214,8 +7380,8 @@ class SavedSearchesComponent {
7214
7380
  loadMore() {
7215
7381
  this.range.set(this.range() + (this.config.itemsPerPage ?? 10));
7216
7382
  }
7217
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SavedSearchesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7218
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.1.2", type: SavedSearchesComponent, isStandalone: true, selector: "saved-searches, SavedSearches", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideTranslocoScope('searches')], ngImport: i0, template: `
7383
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SavedSearchesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7384
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.1.7", type: SavedSearchesComponent, isStandalone: true, selector: "saved-searches, SavedSearches", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideTranslocoScope('searches')], ngImport: i0, template: `
7219
7385
  <SearchHeader [label]="'searches.saved.label' | transloco" />
7220
7386
 
7221
7387
  <SearchList [paginatedSearches]="paginatedSearches()" deleteButtonTitle="searches.saved.remove" (delete)="onDelete($event)">
@@ -7227,7 +7393,7 @@ class SavedSearchesComponent {
7227
7393
  <SearchFooter [hasMore]="hasMore()" [config]="config" (loadMore)="loadMore()" />
7228
7394
  `, isInline: true, styles: [":host ul{scrollbar-width:thin}\n"], dependencies: [{ kind: "directive", type: ChildMarkerDirective, selector: "[childMarker]" }, { kind: "component", type: SearchHeaderComponent, selector: "search-header, searchheader, SearchHeader", inputs: ["label"] }, { kind: "component", type: SearchListComponent, selector: "search-list, searchlist, SearchList", inputs: ["paginatedSearches", "deleteButtonTitle"], outputs: ["delete"] }, { kind: "component", type: SearchFooterComponent, selector: "search-footer, searchfooter, SearchFooter", inputs: ["hasMore", "config"], outputs: ["loadMore"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
7229
7395
  }
7230
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SavedSearchesComponent, decorators: [{
7396
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SavedSearchesComponent, decorators: [{
7231
7397
  type: Component,
7232
7398
  args: [{ selector: 'saved-searches, SavedSearches', standalone: true, imports: [TranslocoPipe, ChildMarkerDirective, SearchHeaderComponent, SearchListComponent, SearchFooterComponent], providers: [provideTranslocoScope('searches')], template: `
7233
7399
  <SearchHeader [label]="'searches.saved.label' | transloco" />
@@ -7259,8 +7425,8 @@ class SavedSearchDialog {
7259
7425
  // emit closed event for the diaglog service
7260
7426
  this.closed.emit('dialog-confirm');
7261
7427
  }
7262
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SavedSearchDialog, deps: [], target: i0.ɵɵFactoryTarget.Component });
7263
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.1.2", type: SavedSearchDialog, isStandalone: true, selector: "saved-search-dialog, savedsearchdialog, SavedSearchDialog", outputs: { closed: "closed" }, providers: [provideTranslocoScope('searches')], viewQueries: [{ propertyName: "dialog", first: true, predicate: DialogComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
7428
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SavedSearchDialog, deps: [], target: i0.ɵɵFactoryTarget.Component });
7429
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.1.7", type: SavedSearchDialog, isStandalone: true, selector: "saved-search-dialog, savedsearchdialog, SavedSearchDialog", outputs: { closed: "closed" }, providers: [provideTranslocoScope('searches')], viewQueries: [{ propertyName: "dialog", first: true, predicate: DialogComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
7264
7430
  <dialog #dialog>
7265
7431
  <DialogHeader>
7266
7432
  <DialogTitle>{{ 'searches.saved.save' | transloco }}</DialogTitle>
@@ -7279,7 +7445,7 @@ class SavedSearchDialog {
7279
7445
 
7280
7446
  <DialogFooter class="flex-col">
7281
7447
  <div class="ml-auto flex justify-end gap-2">
7282
- <button variant="outline" (click)="dialog.close($event)">
7448
+ <button decoration="outline" (click)="dialog.close($event)">
7283
7449
  {{ 'cancel' | transloco }}
7284
7450
  </button>
7285
7451
  <button (click)="confirm($event)" [disabled]="!saveName()">
@@ -7288,9 +7454,9 @@ class SavedSearchDialog {
7288
7454
  </div>
7289
7455
  </DialogFooter>
7290
7456
  </dialog>
7291
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "component", type: DialogComponent, selector: "dialog", inputs: ["class"], outputs: ["closed"] }, { kind: "component", type: DialogHeaderComponent, selector: "DialogHeader" }, { kind: "directive", type: DialogTitleComponent, selector: "DialogTitle" }, { kind: "directive", type: DialogContentComponent, selector: "DialogContent" }, { kind: "directive", type: DialogFooterComponent, selector: "DialogFooter" }, { kind: "directive", type: InputComponent, selector: "input[type=\"text\"], input[type=\"email\"], input[type=\"password\"], input[type=\"number\"], input[type=\"tel\"], input[type=\"url\"], input[type=\"time\"]", inputs: ["class", "variant"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
7457
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "decoration", "size"] }, { kind: "component", type: DialogComponent, selector: "dialog", inputs: ["class", "variant"], outputs: ["closed"] }, { kind: "component", type: DialogHeaderComponent, selector: "DialogHeader" }, { kind: "directive", type: DialogTitleComponent, selector: "DialogTitle" }, { kind: "directive", type: DialogContentComponent, selector: "DialogContent" }, { kind: "directive", type: DialogFooterComponent, selector: "DialogFooter" }, { kind: "directive", type: InputComponent, selector: "input[type=\"text\"], input[type=\"email\"], input[type=\"number\"], input[type=\"password\"], input[type=\"tel\"], input[type=\"url\"], input[type=\"time\"]", inputs: ["class", "variant", "decoration"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
7292
7458
  }
7293
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SavedSearchDialog, decorators: [{
7459
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SavedSearchDialog, decorators: [{
7294
7460
  type: Component,
7295
7461
  args: [{
7296
7462
  selector: 'saved-search-dialog, savedsearchdialog, SavedSearchDialog',
@@ -7326,7 +7492,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
7326
7492
 
7327
7493
  <DialogFooter class="flex-col">
7328
7494
  <div class="ml-auto flex justify-end gap-2">
7329
- <button variant="outline" (click)="dialog.close($event)">
7495
+ <button decoration="outline" (click)="dialog.close($event)">
7330
7496
  {{ 'cancel' | transloco }}
7331
7497
  </button>
7332
7498
  <button (click)="confirm($event)" [disabled]="!saveName()">
@@ -7365,14 +7531,14 @@ class BookmarkButtonComponent {
7365
7531
  notify.success(this.transloco.translate('bookmarks.bookmarkAdded'), { duration: 2000 });
7366
7532
  }
7367
7533
  }
7368
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: BookmarkButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7369
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: BookmarkButtonComponent, isStandalone: true, selector: "bookmark-button, bookmarkbutton, BookmarkButton", inputs: { article: { classPropertyName: "article", publicName: "article", isSignal: true, isRequired: true, transformFunction: null } }, host: { listeners: { "click": "bookmark($event)" }, properties: { "title": "title()" }, classAttribute: "cursor-pointer" }, providers: [provideTranslocoScope('bookmark')], ngImport: i0, template: ` @if (isBookmarked()) {
7534
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: BookmarkButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7535
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: BookmarkButtonComponent, isStandalone: true, selector: "bookmark-button, bookmarkbutton, BookmarkButton", inputs: { article: { classPropertyName: "article", publicName: "article", isSignal: true, isRequired: true, transformFunction: null } }, host: { listeners: { "click": "bookmark($event)" }, properties: { "title": "title()" }, classAttribute: "cursor-pointer" }, providers: [provideTranslocoScope('bookmark')], ngImport: i0, template: ` @if (isBookmarked()) {
7370
7536
  <i class="fa-fw fa-bookmark fa-solid"></i>
7371
7537
  } @else {
7372
7538
  <i class="fa-fw fa-bookmark fa-regular"></i>
7373
7539
  }`, isInline: true });
7374
7540
  }
7375
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: BookmarkButtonComponent, decorators: [{
7541
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: BookmarkButtonComponent, decorators: [{
7376
7542
  type: Component,
7377
7543
  args: [{
7378
7544
  selector: 'bookmark-button, bookmarkbutton, BookmarkButton',
@@ -7464,12 +7630,12 @@ class BookmarksComponent {
7464
7630
  e.stopPropagation();
7465
7631
  this.range.set(this.range() + (this.config.itemsPerPage ?? 10));
7466
7632
  }
7467
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: BookmarksComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7468
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: BookmarksComponent, isStandalone: true, selector: "bookmarks, Bookmarks", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideTranslocoScope('bookmarks')], ngImport: i0, template: "@if (floating) {\n <div class=\"p-2\">\n <label class=\"text-xl font-bold\">{{ 'bookmarks.label' | transloco }}</label>\n <MenuSeparator />\n </div>\n}\n\n<ul class=\"flex max-h-[460px] flex-col overflow-auto\" role=\"list\">\n @for (bookmark of paginatedBookmarks(); track $index) {\n <li role=\"listitem\" class=\"group h-10\" tabindex=\"0\" (click)=\"onClick(bookmark)\" (keydown.enter)=\"onClick(bookmark)\">\n <i class=\"fa-fw fas fa-bookmark shrink-0\" aria-hidden=\"true\"></i>\n\n <p class=\"line-clamp-1\">{{ bookmark.label }}</p>\n\n @if (bookmark.author) {\n <p class=\"line-clamp-1 text-neutral-500\">\n <i class=\"fa-fw far fa-user\" aria-hidden=\"true\"></i>\n {{ bookmark.author }}\n </p>\n }\n @if (bookmark.parentFolder) {\n <p class=\"line-clamp-1 text-neutral-500\">\n <i class=\"fa-fw far fa-folder\" aria-hidden=\"true\"></i>\n {{ bookmark.parentFolder }}\n </p>\n }\n\n <button\n variant=\"icon\"\n title=\"{{ 'bookmarks.openBookmark' | transloco }}\"\n class=\"text-destructive hover:text-destructive invisible ms-auto transition-transform hover:scale-125 group-hover:visible\"\n [attr.title]=\"'bookmarks.removeBookmark' | transloco\"\n [attr.aria-label]=\"'bookmarks.removeBookmark' | transloco\"\n (click)=\"onDelete(bookmark, $event)\">\n <i class=\"fa-fw fa-regular fa-trash-can\" aria-hidden=\"true\"></i>\n </button>\n </li>\n } @empty {\n <li class=\"py-4 text-center text-neutral-500\">{{ 'bookmarks.noBookmarks' | transloco }}</li>\n }\n</ul>\n\n<div class=\"flex flex-col px-2\">\n @if (hasMore() && config.showLoadMore) {\n <button variant=\"outline\" class=\"w-full\" tabindex=\"0\" [attr.title]=\"'loadMore' | transloco\" (click)=\"loadMore($event)\">{{ 'loadMore' | transloco }}</button>\n }\n <button variant=\"link\" class=\"ml-auto\" [attr.title]=\"'seeMore' | transloco\" [routerLink]=\"[config.routerLink]\">{{ 'seeMore' | transloco }}</button>\n</div>\n", styles: [":host ul{scrollbar-width:thin}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "component", type: HorizontalDividerComponent, selector: "menu-separator, MenuSeparator, menuseparator, horizontal-divider, HorizontalDivider, horizontaldivider" }, { kind: "directive", type: ListItemComponent, selector: "[role=\"listitem\"], [role=\"option\"]", inputs: ["class", "variant"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
7633
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: BookmarksComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7634
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: BookmarksComponent, isStandalone: true, selector: "bookmarks, Bookmarks", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideTranslocoScope('bookmarks')], ngImport: i0, template: "@if (floating) {\n <div class=\"p-2\">\n <label class=\"text-xl font-bold\">{{ 'bookmarks.label' | transloco }}</label>\n <HorizontalDivider />\n </div>\n}\n\n<ul class=\"flex max-h-[460px] flex-col overflow-auto\" role=\"list\">\n @for (bookmark of paginatedBookmarks(); track $index) {\n <li role=\"listitem\" class=\"group h-10\" tabindex=\"0\" (click)=\"onClick(bookmark)\" (keydown.enter)=\"onClick(bookmark)\">\n <i class=\"fa-fw fas fa-bookmark shrink-0\" aria-hidden=\"true\"></i>\n\n <p class=\"line-clamp-1\">{{ bookmark.label }}</p>\n\n @if (bookmark.author) {\n <p class=\"line-clamp-1 text-neutral-500\">\n <i class=\"fa-fw far fa-user\" aria-hidden=\"true\"></i>\n {{ bookmark.author }}\n </p>\n }\n @if (bookmark.parentFolder) {\n <p class=\"line-clamp-1 text-neutral-500\">\n <i class=\"fa-fw far fa-folder\" aria-hidden=\"true\"></i>\n {{ bookmark.parentFolder }}\n </p>\n }\n\n <button\n title=\"{{ 'bookmarks.openBookmark' | transloco }}\"\n class=\"text-destructive hover:text-destructive invisible ms-auto transition-transform hover:scale-125 group-hover:visible\"\n [attr.title]=\"'bookmarks.removeBookmark' | transloco\"\n [attr.aria-label]=\"'bookmarks.removeBookmark' | transloco\"\n (click)=\"onDelete(bookmark, $event)\">\n <i class=\"fa-fw fa-regular fa-trash-can\" aria-hidden=\"true\"></i>\n </button>\n </li>\n } @empty {\n <li class=\"py-4 text-center text-neutral-500\">{{ 'bookmarks.noBookmarks' | transloco }}</li>\n }\n</ul>\n\n<div class=\"flex flex-col px-2\">\n @if (hasMore() && config.showLoadMore) {\n <button decoration=\"outline\" class=\"w-full\" tabindex=\"0\" [attr.title]=\"'loadMore' | transloco\" (click)=\"loadMore($event)\">\n {{ 'loadMore' | transloco }}\n </button>\n }\n <button decoration=\"underline\" class=\"ml-auto\" [attr.title]=\"'seeMore' | transloco\" [routerLink]=\"[config.routerLink]\">{{ 'seeMore' | transloco }}</button>\n</div>\n", styles: [":host ul{scrollbar-width:thin}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "decoration", "size"] }, { kind: "component", type: HorizontalDividerComponent, selector: "horizontal-divider, HorizontalDivider, horizontaldivider" }, { kind: "directive", type: ListItemComponent, selector: "[role=\"listitem\"], [role=\"option\"]", inputs: ["class", "variant", "decoration"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
7469
7635
  }
7470
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: BookmarksComponent, decorators: [{
7636
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: BookmarksComponent, decorators: [{
7471
7637
  type: Component,
7472
- args: [{ selector: 'bookmarks, Bookmarks', standalone: true, imports: [TranslocoPipe, RouterLink, ButtonComponent, HorizontalDividerComponent, ListItemComponent], providers: [provideTranslocoScope('bookmarks')], template: "@if (floating) {\n <div class=\"p-2\">\n <label class=\"text-xl font-bold\">{{ 'bookmarks.label' | transloco }}</label>\n <MenuSeparator />\n </div>\n}\n\n<ul class=\"flex max-h-[460px] flex-col overflow-auto\" role=\"list\">\n @for (bookmark of paginatedBookmarks(); track $index) {\n <li role=\"listitem\" class=\"group h-10\" tabindex=\"0\" (click)=\"onClick(bookmark)\" (keydown.enter)=\"onClick(bookmark)\">\n <i class=\"fa-fw fas fa-bookmark shrink-0\" aria-hidden=\"true\"></i>\n\n <p class=\"line-clamp-1\">{{ bookmark.label }}</p>\n\n @if (bookmark.author) {\n <p class=\"line-clamp-1 text-neutral-500\">\n <i class=\"fa-fw far fa-user\" aria-hidden=\"true\"></i>\n {{ bookmark.author }}\n </p>\n }\n @if (bookmark.parentFolder) {\n <p class=\"line-clamp-1 text-neutral-500\">\n <i class=\"fa-fw far fa-folder\" aria-hidden=\"true\"></i>\n {{ bookmark.parentFolder }}\n </p>\n }\n\n <button\n variant=\"icon\"\n title=\"{{ 'bookmarks.openBookmark' | transloco }}\"\n class=\"text-destructive hover:text-destructive invisible ms-auto transition-transform hover:scale-125 group-hover:visible\"\n [attr.title]=\"'bookmarks.removeBookmark' | transloco\"\n [attr.aria-label]=\"'bookmarks.removeBookmark' | transloco\"\n (click)=\"onDelete(bookmark, $event)\">\n <i class=\"fa-fw fa-regular fa-trash-can\" aria-hidden=\"true\"></i>\n </button>\n </li>\n } @empty {\n <li class=\"py-4 text-center text-neutral-500\">{{ 'bookmarks.noBookmarks' | transloco }}</li>\n }\n</ul>\n\n<div class=\"flex flex-col px-2\">\n @if (hasMore() && config.showLoadMore) {\n <button variant=\"outline\" class=\"w-full\" tabindex=\"0\" [attr.title]=\"'loadMore' | transloco\" (click)=\"loadMore($event)\">{{ 'loadMore' | transloco }}</button>\n }\n <button variant=\"link\" class=\"ml-auto\" [attr.title]=\"'seeMore' | transloco\" [routerLink]=\"[config.routerLink]\">{{ 'seeMore' | transloco }}</button>\n</div>\n", styles: [":host ul{scrollbar-width:thin}\n"] }]
7638
+ args: [{ selector: 'bookmarks, Bookmarks', standalone: true, imports: [TranslocoPipe, RouterLink, ButtonComponent, HorizontalDividerComponent, ListItemComponent], providers: [provideTranslocoScope('bookmarks')], template: "@if (floating) {\n <div class=\"p-2\">\n <label class=\"text-xl font-bold\">{{ 'bookmarks.label' | transloco }}</label>\n <HorizontalDivider />\n </div>\n}\n\n<ul class=\"flex max-h-[460px] flex-col overflow-auto\" role=\"list\">\n @for (bookmark of paginatedBookmarks(); track $index) {\n <li role=\"listitem\" class=\"group h-10\" tabindex=\"0\" (click)=\"onClick(bookmark)\" (keydown.enter)=\"onClick(bookmark)\">\n <i class=\"fa-fw fas fa-bookmark shrink-0\" aria-hidden=\"true\"></i>\n\n <p class=\"line-clamp-1\">{{ bookmark.label }}</p>\n\n @if (bookmark.author) {\n <p class=\"line-clamp-1 text-neutral-500\">\n <i class=\"fa-fw far fa-user\" aria-hidden=\"true\"></i>\n {{ bookmark.author }}\n </p>\n }\n @if (bookmark.parentFolder) {\n <p class=\"line-clamp-1 text-neutral-500\">\n <i class=\"fa-fw far fa-folder\" aria-hidden=\"true\"></i>\n {{ bookmark.parentFolder }}\n </p>\n }\n\n <button\n title=\"{{ 'bookmarks.openBookmark' | transloco }}\"\n class=\"text-destructive hover:text-destructive invisible ms-auto transition-transform hover:scale-125 group-hover:visible\"\n [attr.title]=\"'bookmarks.removeBookmark' | transloco\"\n [attr.aria-label]=\"'bookmarks.removeBookmark' | transloco\"\n (click)=\"onDelete(bookmark, $event)\">\n <i class=\"fa-fw fa-regular fa-trash-can\" aria-hidden=\"true\"></i>\n </button>\n </li>\n } @empty {\n <li class=\"py-4 text-center text-neutral-500\">{{ 'bookmarks.noBookmarks' | transloco }}</li>\n }\n</ul>\n\n<div class=\"flex flex-col px-2\">\n @if (hasMore() && config.showLoadMore) {\n <button decoration=\"outline\" class=\"w-full\" tabindex=\"0\" [attr.title]=\"'loadMore' | transloco\" (click)=\"loadMore($event)\">\n {{ 'loadMore' | transloco }}\n </button>\n }\n <button decoration=\"underline\" class=\"ml-auto\" [attr.title]=\"'seeMore' | transloco\" [routerLink]=\"[config.routerLink]\">{{ 'seeMore' | transloco }}</button>\n</div>\n", styles: [":host ul{scrollbar-width:thin}\n"] }]
7473
7639
  }], ctorParameters: () => [] });
7474
7640
 
7475
7641
  class DeleteCollectionDialog {
@@ -7489,8 +7655,8 @@ class DeleteCollectionDialog {
7489
7655
  const message = this.translocoService.translate('collections.deleted');
7490
7656
  notify.success(message, { duration: 2000 });
7491
7657
  }
7492
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: DeleteCollectionDialog, deps: [], target: i0.ɵɵFactoryTarget.Component });
7493
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.1.2", type: DeleteCollectionDialog, isStandalone: true, selector: "delete-collection-dialog", providers: [provideTranslocoScope('collections')], viewQueries: [{ propertyName: "dialog", first: true, predicate: DialogComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
7658
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: DeleteCollectionDialog, deps: [], target: i0.ɵɵFactoryTarget.Component });
7659
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.1.7", type: DeleteCollectionDialog, isStandalone: true, selector: "delete-collection-dialog", providers: [provideTranslocoScope('collections')], viewQueries: [{ propertyName: "dialog", first: true, predicate: DialogComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
7494
7660
  <dialog #dialog>
7495
7661
  <DialogHeader>
7496
7662
  <DialogTitle>{{ 'collections.deleteCollection' | transloco }}</DialogTitle>
@@ -7501,7 +7667,7 @@ class DeleteCollectionDialog {
7501
7667
  </DialogContent>
7502
7668
 
7503
7669
  <DialogFooter>
7504
- <button variant="outline" (click)="dialog.cancel($event)">
7670
+ <button decoration="outline" (click)="dialog.cancel($event)">
7505
7671
  {{ 'cancel' | transloco }}
7506
7672
  </button>
7507
7673
 
@@ -7510,9 +7676,9 @@ class DeleteCollectionDialog {
7510
7676
  </button>
7511
7677
  </DialogFooter>
7512
7678
  </dialog>
7513
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "component", type: DialogComponent, selector: "dialog", inputs: ["class"], outputs: ["closed"] }, { kind: "component", type: DialogHeaderComponent, selector: "DialogHeader" }, { kind: "directive", type: DialogTitleComponent, selector: "DialogTitle" }, { kind: "directive", type: DialogContentComponent, selector: "DialogContent" }, { kind: "directive", type: DialogFooterComponent, selector: "DialogFooter" }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
7679
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "decoration", "size"] }, { kind: "component", type: DialogComponent, selector: "dialog", inputs: ["class", "variant"], outputs: ["closed"] }, { kind: "component", type: DialogHeaderComponent, selector: "DialogHeader" }, { kind: "directive", type: DialogTitleComponent, selector: "DialogTitle" }, { kind: "directive", type: DialogContentComponent, selector: "DialogContent" }, { kind: "directive", type: DialogFooterComponent, selector: "DialogFooter" }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
7514
7680
  }
7515
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: DeleteCollectionDialog, decorators: [{
7681
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: DeleteCollectionDialog, decorators: [{
7516
7682
  type: Component,
7517
7683
  args: [{
7518
7684
  selector: 'delete-collection-dialog',
@@ -7539,7 +7705,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
7539
7705
  </DialogContent>
7540
7706
 
7541
7707
  <DialogFooter>
7542
- <button variant="outline" (click)="dialog.cancel($event)">
7708
+ <button decoration="outline" (click)="dialog.cancel($event)">
7543
7709
  {{ 'cancel' | transloco }}
7544
7710
  </button>
7545
7711
 
@@ -7592,12 +7758,12 @@ class CollectionsComponent {
7592
7758
  e.stopPropagation();
7593
7759
  this.range.set(this.range() + (this.config.itemsPerPage ?? 10));
7594
7760
  }
7595
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: CollectionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7596
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: CollectionsComponent, isStandalone: true, selector: "app-collections", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideTranslocoScope('collections')], viewQueries: [{ propertyName: "deleteCollectionDialog", first: true, predicate: DeleteCollectionDialog, descendants: true, isSignal: true }], ngImport: i0, template: "@if (floating) {\n <div class=\"p-2\">\n <label class=\"text-xl font-bold\">{{ 'collections.label' | transloco }}</label>\n <MenuSeparator />\n </div>\n}\n<ul class=\"flex max-h-[460px] flex-col overflow-auto\">\n @for (collection of paginatedCollections(); track $index) {\n <li role=\"listitem\" class=\"group h-10\" tabindex=\"0\" (click)=\"onClick(collection)\" (keydown.enter)=\"onClick(collection)\">\n <i class=\"fas fa-inbox\"></i>\n\n <p class=\"line-clamp-1\">{{ collection.name }}</p>\n\n <button\n variant=\"icon\"\n class=\"text-destructive hover:text-destructive invisible ms-auto transition-transform hover:scale-125 group-hover:visible\"\n title=\"{{ 'collections.deleteCollection' | transloco }}\"\n [attr.aria-label]=\"'collections.deleteCollection' | transloco\"\n (click)=\"onDelete(collection, $index, $event)\">\n <i class=\"fa-fw fa-regular fa-trash-can\" aria-hidden=\"true\"></i>\n </button>\n </li>\n } @empty {\n <li class=\"list-none py-4 text-center text-neutral-500\">{{ 'collections.noCollections' | transloco }}</li>\n }\n</ul>\n\n<div class=\"flex flex-col px-2\">\n @if (hasMore() && config.showLoadMore) {\n <button variant=\"outline\" class=\"w-full\" tabindex=\"0\" [attr.title]=\"'loadMore' | transloco\" (click)=\"loadMore($event)\">{{ 'loadMore' | transloco }}</button>\n }\n <button variant=\"link\" class=\"ml-auto\" [attr.title]=\"'seeMore' | transloco\" [routerLink]=\"[config.routerLink]\">{{ 'seeMore' | transloco }}</button>\n</div>\n\n<delete-collection-dialog />\n", dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: HorizontalDividerComponent, selector: "menu-separator, MenuSeparator, menuseparator, horizontal-divider, HorizontalDivider, horizontaldivider" }, { kind: "component", type: DeleteCollectionDialog, selector: "delete-collection-dialog" }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "directive", type: ListItemComponent, selector: "[role=\"listitem\"], [role=\"option\"]", inputs: ["class", "variant"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
7761
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CollectionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7762
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: CollectionsComponent, isStandalone: true, selector: "app-collections", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideTranslocoScope('collections')], viewQueries: [{ propertyName: "deleteCollectionDialog", first: true, predicate: DeleteCollectionDialog, descendants: true, isSignal: true }], ngImport: i0, template: "@if (floating) {\n <div class=\"p-2\">\n <label class=\"text-xl font-bold\">{{ 'collections.label' | transloco }}</label>\n <HorizontalDivider />\n </div>\n}\n<ul class=\"flex max-h-[460px] flex-col overflow-auto\">\n @for (collection of paginatedCollections(); track $index) {\n <li role=\"listitem\" class=\"group h-10\" tabindex=\"0\" (click)=\"onClick(collection)\" (keydown.enter)=\"onClick(collection)\">\n <i class=\"fas fa-inbox\"></i>\n\n <p class=\"line-clamp-1\">{{ collection.name }}</p>\n\n <button\n class=\"text-destructive hover:text-destructive invisible ms-auto transition-transform hover:scale-125 group-hover:visible\"\n title=\"{{ 'collections.deleteCollection' | transloco }}\"\n [attr.aria-label]=\"'collections.deleteCollection' | transloco\"\n (click)=\"onDelete(collection, $index, $event)\">\n <i class=\"fa-fw fa-regular fa-trash-can\" aria-hidden=\"true\"></i>\n </button>\n </li>\n } @empty {\n <li class=\"list-none py-4 text-center text-neutral-500\">{{ 'collections.noCollections' | transloco }}</li>\n }\n</ul>\n\n<div class=\"flex flex-col px-2\">\n @if (hasMore() && config.showLoadMore) {\n <button decoration=\"outline\" class=\"w-full\" tabindex=\"0\" [attr.title]=\"'loadMore' | transloco\" (click)=\"loadMore($event)\">\n {{ 'loadMore' | transloco }}\n </button>\n }\n <button decoration=\"underline\" class=\"ml-auto\" [attr.title]=\"'seeMore' | transloco\" [routerLink]=\"[config.routerLink]\">{{ 'seeMore' | transloco }}</button>\n</div>\n\n<delete-collection-dialog />\n", dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: HorizontalDividerComponent, selector: "horizontal-divider, HorizontalDivider, horizontaldivider" }, { kind: "component", type: DeleteCollectionDialog, selector: "delete-collection-dialog" }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "decoration", "size"] }, { kind: "directive", type: ListItemComponent, selector: "[role=\"listitem\"], [role=\"option\"]", inputs: ["class", "variant", "decoration"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
7597
7763
  }
7598
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: CollectionsComponent, decorators: [{
7764
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CollectionsComponent, decorators: [{
7599
7765
  type: Component,
7600
- args: [{ selector: 'app-collections', standalone: true, imports: [TranslocoPipe, RouterLink, HorizontalDividerComponent, DeleteCollectionDialog, ButtonComponent, ListItemComponent], providers: [provideTranslocoScope('collections')], template: "@if (floating) {\n <div class=\"p-2\">\n <label class=\"text-xl font-bold\">{{ 'collections.label' | transloco }}</label>\n <MenuSeparator />\n </div>\n}\n<ul class=\"flex max-h-[460px] flex-col overflow-auto\">\n @for (collection of paginatedCollections(); track $index) {\n <li role=\"listitem\" class=\"group h-10\" tabindex=\"0\" (click)=\"onClick(collection)\" (keydown.enter)=\"onClick(collection)\">\n <i class=\"fas fa-inbox\"></i>\n\n <p class=\"line-clamp-1\">{{ collection.name }}</p>\n\n <button\n variant=\"icon\"\n class=\"text-destructive hover:text-destructive invisible ms-auto transition-transform hover:scale-125 group-hover:visible\"\n title=\"{{ 'collections.deleteCollection' | transloco }}\"\n [attr.aria-label]=\"'collections.deleteCollection' | transloco\"\n (click)=\"onDelete(collection, $index, $event)\">\n <i class=\"fa-fw fa-regular fa-trash-can\" aria-hidden=\"true\"></i>\n </button>\n </li>\n } @empty {\n <li class=\"list-none py-4 text-center text-neutral-500\">{{ 'collections.noCollections' | transloco }}</li>\n }\n</ul>\n\n<div class=\"flex flex-col px-2\">\n @if (hasMore() && config.showLoadMore) {\n <button variant=\"outline\" class=\"w-full\" tabindex=\"0\" [attr.title]=\"'loadMore' | transloco\" (click)=\"loadMore($event)\">{{ 'loadMore' | transloco }}</button>\n }\n <button variant=\"link\" class=\"ml-auto\" [attr.title]=\"'seeMore' | transloco\" [routerLink]=\"[config.routerLink]\">{{ 'seeMore' | transloco }}</button>\n</div>\n\n<delete-collection-dialog />\n" }]
7766
+ args: [{ selector: 'app-collections', standalone: true, imports: [TranslocoPipe, RouterLink, HorizontalDividerComponent, DeleteCollectionDialog, ButtonComponent, ListItemComponent], providers: [provideTranslocoScope('collections')], template: "@if (floating) {\n <div class=\"p-2\">\n <label class=\"text-xl font-bold\">{{ 'collections.label' | transloco }}</label>\n <HorizontalDivider />\n </div>\n}\n<ul class=\"flex max-h-[460px] flex-col overflow-auto\">\n @for (collection of paginatedCollections(); track $index) {\n <li role=\"listitem\" class=\"group h-10\" tabindex=\"0\" (click)=\"onClick(collection)\" (keydown.enter)=\"onClick(collection)\">\n <i class=\"fas fa-inbox\"></i>\n\n <p class=\"line-clamp-1\">{{ collection.name }}</p>\n\n <button\n class=\"text-destructive hover:text-destructive invisible ms-auto transition-transform hover:scale-125 group-hover:visible\"\n title=\"{{ 'collections.deleteCollection' | transloco }}\"\n [attr.aria-label]=\"'collections.deleteCollection' | transloco\"\n (click)=\"onDelete(collection, $index, $event)\">\n <i class=\"fa-fw fa-regular fa-trash-can\" aria-hidden=\"true\"></i>\n </button>\n </li>\n } @empty {\n <li class=\"list-none py-4 text-center text-neutral-500\">{{ 'collections.noCollections' | transloco }}</li>\n }\n</ul>\n\n<div class=\"flex flex-col px-2\">\n @if (hasMore() && config.showLoadMore) {\n <button decoration=\"outline\" class=\"w-full\" tabindex=\"0\" [attr.title]=\"'loadMore' | transloco\" (click)=\"loadMore($event)\">\n {{ 'loadMore' | transloco }}\n </button>\n }\n <button decoration=\"underline\" class=\"ml-auto\" [attr.title]=\"'seeMore' | transloco\" [routerLink]=\"[config.routerLink]\">{{ 'seeMore' | transloco }}</button>\n</div>\n\n<delete-collection-dialog />\n" }]
7601
7767
  }], ctorParameters: () => [] });
7602
7768
 
7603
7769
  class AlertDialog {
@@ -7722,8 +7888,8 @@ class AlertDialog {
7722
7888
  this.queryParamsStore.patch({ text: q.text, tab: q.tab, basket: q.basket, sort: q.sort, filters, name: q.name });
7723
7889
  this.dialog().close(e);
7724
7890
  }
7725
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: AlertDialog, deps: [], target: i0.ɵɵFactoryTarget.Component });
7726
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: AlertDialog, isStandalone: true, selector: "alert-dialog, alertdialog, AlertDialog", outputs: { closed: "closed" }, providers: [provideTranslocoScope('alerts')], viewQueries: [{ propertyName: "dialog", first: true, predicate: DialogComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
7891
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: AlertDialog, deps: [], target: i0.ɵɵFactoryTarget.Component });
7892
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: AlertDialog, isStandalone: true, selector: "alert-dialog, alertdialog, AlertDialog", outputs: { closed: "closed" }, providers: [provideTranslocoScope('alerts')], viewQueries: [{ propertyName: "dialog", first: true, predicate: DialogComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
7727
7893
  <dialog #dialog>
7728
7894
  <DialogHeader class="px-1">
7729
7895
  <DialogTitle>{{ 'alerts.createAlert' | transloco }}</DialogTitle>
@@ -7731,7 +7897,7 @@ class AlertDialog {
7731
7897
 
7732
7898
  <DialogContent class="flex flex-col gap-2 overflow-auto px-1">
7733
7899
  <div class="mb-2">
7734
- <label for="alertName" class="mb-1 block text-sm font-medium text-gray-700">{{ 'alerts.alertName' | transloco }}</label>
7900
+ <label for="alertName" class="text-muted-foreground mb-1 block text-sm font-medium">{{ 'alerts.alertName' | transloco }}</label>
7735
7901
  <input
7736
7902
  id="alertName"
7737
7903
  name="alertName"
@@ -7745,12 +7911,12 @@ class AlertDialog {
7745
7911
  </div>
7746
7912
 
7747
7913
  <div class="mb-2">
7748
- <label class="mb-1 block text-sm font-medium text-gray-700" for="frequency">{{ 'alerts.alertFrequency' | transloco }}</label>
7914
+ <label class="text-muted-foreground mb-1 block text-sm font-medium" for="frequency">{{ 'alerts.alertFrequency' | transloco }}</label>
7749
7915
  <div class="relative">
7750
7916
  <select
7751
7917
  id="frequency"
7752
7918
  name="frequency"
7753
- class="hover:outline-primary focus:outline-primary h-8 w-full appearance-none rounded-md border border-gray-200 bg-neutral-50 px-2 pr-8 hover:bg-white hover:outline focus:bg-white focus:outline"
7919
+ class="hover:outline-primary focus:outline-primary border-foreground/18 h-8 w-full appearance-none rounded-md border px-2 pr-8 hover:outline focus:outline"
7754
7920
  id="alertFrequency"
7755
7921
  [ngModel]="alertFrequency()"
7756
7922
  (ngModelChange)="alertFrequency.set($event)">
@@ -7758,26 +7924,29 @@ class AlertDialog {
7758
7924
  <option [value]="frequencyValue">{{ 'alerts.frequency.' + frequency[frequencyValue] | transloco }}</option>
7759
7925
  }
7760
7926
  </select>
7761
- <ChevronRight width="16" height="16" class="pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 rotate-90 transform text-gray-400" />
7927
+ <ChevronRight
7928
+ width="16"
7929
+ height="16"
7930
+ class="text-muted-foreground pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 rotate-90 transform" />
7762
7931
  </div>
7763
7932
  </div>
7764
7933
 
7765
7934
  <div class="mb-2">
7766
- <p class="mb-2 block text-sm font-medium text-gray-700">{{ 'alerts.repeatOn' | transloco }}</p>
7935
+ <p class="text-muted-foreground mb-2 block text-sm font-medium">{{ 'alerts.repeatOn' | transloco }}</p>
7767
7936
  <div class="weekdays-grid gap-1.5 px-2.5 py-0">
7768
7937
  @for (day of weekdays; track $index) {
7769
7938
  <div>
7770
7939
  <input class="me-1" type="checkbox" id="day_{{ day.value }}" [checked]="dayChecked(day.value)" (change)="dayChange($event, day.value)" />
7771
- <label role="button" for="day_{{ day.value }}" class="form-check-label user-select-none cursor-pointer">{{
7772
- 'alerts.weekdays.' + day.key | transloco
7773
- }}</label>
7940
+ <label role="button" for="day_{{ day.value }}" class="form-check-label user-select-none cursor-pointer">
7941
+ {{ 'alerts.weekdays.' + day.key | transloco }}
7942
+ </label>
7774
7943
  </div>
7775
7944
  }
7776
7945
  </div>
7777
7946
  </div>
7778
7947
 
7779
7948
  <div class="mb-6">
7780
- <label class="mb-1 block text-sm font-medium text-gray-700" for="alertTimes">Time</label>
7949
+ <label class="text-muted-foreground mb-1 block text-sm font-medium" for="alertTimes">Time</label>
7781
7950
  <input
7782
7951
  type="time"
7783
7952
  id="alertTimes"
@@ -7800,12 +7969,12 @@ class AlertDialog {
7800
7969
  @if (alert || canUpdateQuery()) {
7801
7970
  <div class="flex w-full flex-col gap-2">
7802
7971
  @if (alert) {
7803
- <button variant="outline" (click)="execute($event)" [disabled]="!canUpdateQuery()">
7972
+ <button decoration="outline" (click)="execute($event)" [disabled]="!canUpdateQuery()">
7804
7973
  {{ 'alerts.execute' | transloco }}
7805
7974
  </button>
7806
7975
  }
7807
7976
  @if (canUpdateQuery()) {
7808
- <button [disabled]="updateStatus() !== 'idle'" variant="outline" (click)="updateQuery()">
7977
+ <button [disabled]="updateStatus() !== 'idle'" decoration="outline" (click)="updateQuery()">
7809
7978
  @switch (updateStatus()) {
7810
7979
  @case ('updating') {
7811
7980
  <LoadingCircle class="size-4 animate-spin" width="16" height="16" />
@@ -7824,18 +7993,18 @@ class AlertDialog {
7824
7993
  </div>
7825
7994
  }
7826
7995
  <div class="ml-auto flex justify-end gap-2">
7827
- <button variant="outline" (click)="dialog.cancel($event)">
7996
+ <button decoration="outline" (click)="dialog.cancel($event)">
7828
7997
  {{ 'cancel' | transloco }}
7829
7998
  </button>
7830
- <button (click)="confirm($event)" [disabled]="invalidForm()">
7999
+ <button variant="primary" (click)="confirm($event)" [disabled]="invalidForm()">
7831
8000
  {{ 'confirm' | transloco }}
7832
8001
  </button>
7833
8002
  </div>
7834
8003
  </DialogFooter>
7835
8004
  </dialog>
7836
- `, isInline: true, styles: [".weekdays-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(100px,1fr))}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "component", type: DialogComponent, selector: "dialog", inputs: ["class"], outputs: ["closed"] }, { kind: "component", type: DialogHeaderComponent, selector: "DialogHeader" }, { kind: "directive", type: DialogTitleComponent, selector: "DialogTitle" }, { kind: "directive", type: DialogContentComponent, selector: "DialogContent" }, { kind: "directive", type: DialogFooterComponent, selector: "DialogFooter" }, { kind: "directive", type: InputComponent, selector: "input[type=\"text\"], input[type=\"email\"], input[type=\"password\"], input[type=\"number\"], input[type=\"tel\"], input[type=\"url\"], input[type=\"time\"]", inputs: ["class", "variant"] }, { kind: "component", type: ChevronRightIconComponent, selector: "chevron-right, ChevronRight, chevronright", inputs: ["class", "width", "height"] }, { kind: "component", type: LoadingCircleIconComponent, selector: "loading-circle, LoadingCircle, loadingcircle", inputs: ["class", "width", "height"] }, { kind: "component", type: CircleCheckIconComponent, selector: "circle-check, CircleCheck, circlecheck", inputs: ["class", "width", "height"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
8005
+ `, isInline: true, styles: [".weekdays-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(100px,1fr))}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "decoration", "size"] }, { kind: "component", type: DialogComponent, selector: "dialog", inputs: ["class", "variant"], outputs: ["closed"] }, { kind: "component", type: DialogHeaderComponent, selector: "DialogHeader" }, { kind: "directive", type: DialogTitleComponent, selector: "DialogTitle" }, { kind: "directive", type: DialogContentComponent, selector: "DialogContent" }, { kind: "directive", type: DialogFooterComponent, selector: "DialogFooter" }, { kind: "directive", type: InputComponent, selector: "input[type=\"text\"], input[type=\"email\"], input[type=\"number\"], input[type=\"password\"], input[type=\"tel\"], input[type=\"url\"], input[type=\"time\"]", inputs: ["class", "variant", "decoration"] }, { kind: "component", type: ChevronRightIconComponent, selector: "chevron-right, ChevronRight, chevronright", inputs: ["class"] }, { kind: "component", type: LoadingCircleIconComponent, selector: "loading-circle, LoadingCircle, loadingcircle", inputs: ["class"] }, { kind: "component", type: CircleCheckIconComponent, selector: "circle-check, CircleCheck, circlecheck", inputs: ["class"] }, { kind: "directive", type: SelectOptionDirective, selector: "option", inputs: ["class"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
7837
8006
  }
7838
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: AlertDialog, decorators: [{
8007
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: AlertDialog, decorators: [{
7839
8008
  type: Component,
7840
8009
  args: [{ selector: 'alert-dialog, alertdialog, AlertDialog', standalone: true, imports: [
7841
8010
  FormsModule,
@@ -7849,7 +8018,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
7849
8018
  InputComponent,
7850
8019
  ChevronRightIconComponent,
7851
8020
  LoadingCircleIconComponent,
7852
- CircleCheckIconComponent
8021
+ CircleCheckIconComponent,
8022
+ SelectOptionDirective
7853
8023
  ], providers: [provideTranslocoScope('alerts')], template: `
7854
8024
  <dialog #dialog>
7855
8025
  <DialogHeader class="px-1">
@@ -7858,7 +8028,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
7858
8028
 
7859
8029
  <DialogContent class="flex flex-col gap-2 overflow-auto px-1">
7860
8030
  <div class="mb-2">
7861
- <label for="alertName" class="mb-1 block text-sm font-medium text-gray-700">{{ 'alerts.alertName' | transloco }}</label>
8031
+ <label for="alertName" class="text-muted-foreground mb-1 block text-sm font-medium">{{ 'alerts.alertName' | transloco }}</label>
7862
8032
  <input
7863
8033
  id="alertName"
7864
8034
  name="alertName"
@@ -7872,12 +8042,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
7872
8042
  </div>
7873
8043
 
7874
8044
  <div class="mb-2">
7875
- <label class="mb-1 block text-sm font-medium text-gray-700" for="frequency">{{ 'alerts.alertFrequency' | transloco }}</label>
8045
+ <label class="text-muted-foreground mb-1 block text-sm font-medium" for="frequency">{{ 'alerts.alertFrequency' | transloco }}</label>
7876
8046
  <div class="relative">
7877
8047
  <select
7878
8048
  id="frequency"
7879
8049
  name="frequency"
7880
- class="hover:outline-primary focus:outline-primary h-8 w-full appearance-none rounded-md border border-gray-200 bg-neutral-50 px-2 pr-8 hover:bg-white hover:outline focus:bg-white focus:outline"
8050
+ class="hover:outline-primary focus:outline-primary border-foreground/18 h-8 w-full appearance-none rounded-md border px-2 pr-8 hover:outline focus:outline"
7881
8051
  id="alertFrequency"
7882
8052
  [ngModel]="alertFrequency()"
7883
8053
  (ngModelChange)="alertFrequency.set($event)">
@@ -7885,26 +8055,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
7885
8055
  <option [value]="frequencyValue">{{ 'alerts.frequency.' + frequency[frequencyValue] | transloco }}</option>
7886
8056
  }
7887
8057
  </select>
7888
- <ChevronRight width="16" height="16" class="pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 rotate-90 transform text-gray-400" />
8058
+ <ChevronRight
8059
+ width="16"
8060
+ height="16"
8061
+ class="text-muted-foreground pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 rotate-90 transform" />
7889
8062
  </div>
7890
8063
  </div>
7891
8064
 
7892
8065
  <div class="mb-2">
7893
- <p class="mb-2 block text-sm font-medium text-gray-700">{{ 'alerts.repeatOn' | transloco }}</p>
8066
+ <p class="text-muted-foreground mb-2 block text-sm font-medium">{{ 'alerts.repeatOn' | transloco }}</p>
7894
8067
  <div class="weekdays-grid gap-1.5 px-2.5 py-0">
7895
8068
  @for (day of weekdays; track $index) {
7896
8069
  <div>
7897
8070
  <input class="me-1" type="checkbox" id="day_{{ day.value }}" [checked]="dayChecked(day.value)" (change)="dayChange($event, day.value)" />
7898
- <label role="button" for="day_{{ day.value }}" class="form-check-label user-select-none cursor-pointer">{{
7899
- 'alerts.weekdays.' + day.key | transloco
7900
- }}</label>
8071
+ <label role="button" for="day_{{ day.value }}" class="form-check-label user-select-none cursor-pointer">
8072
+ {{ 'alerts.weekdays.' + day.key | transloco }}
8073
+ </label>
7901
8074
  </div>
7902
8075
  }
7903
8076
  </div>
7904
8077
  </div>
7905
8078
 
7906
8079
  <div class="mb-6">
7907
- <label class="mb-1 block text-sm font-medium text-gray-700" for="alertTimes">Time</label>
8080
+ <label class="text-muted-foreground mb-1 block text-sm font-medium" for="alertTimes">Time</label>
7908
8081
  <input
7909
8082
  type="time"
7910
8083
  id="alertTimes"
@@ -7927,12 +8100,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
7927
8100
  @if (alert || canUpdateQuery()) {
7928
8101
  <div class="flex w-full flex-col gap-2">
7929
8102
  @if (alert) {
7930
- <button variant="outline" (click)="execute($event)" [disabled]="!canUpdateQuery()">
8103
+ <button decoration="outline" (click)="execute($event)" [disabled]="!canUpdateQuery()">
7931
8104
  {{ 'alerts.execute' | transloco }}
7932
8105
  </button>
7933
8106
  }
7934
8107
  @if (canUpdateQuery()) {
7935
- <button [disabled]="updateStatus() !== 'idle'" variant="outline" (click)="updateQuery()">
8108
+ <button [disabled]="updateStatus() !== 'idle'" decoration="outline" (click)="updateQuery()">
7936
8109
  @switch (updateStatus()) {
7937
8110
  @case ('updating') {
7938
8111
  <LoadingCircle class="size-4 animate-spin" width="16" height="16" />
@@ -7951,10 +8124,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
7951
8124
  </div>
7952
8125
  }
7953
8126
  <div class="ml-auto flex justify-end gap-2">
7954
- <button variant="outline" (click)="dialog.cancel($event)">
8127
+ <button decoration="outline" (click)="dialog.cancel($event)">
7955
8128
  {{ 'cancel' | transloco }}
7956
8129
  </button>
7957
- <button (click)="confirm($event)" [disabled]="invalidForm()">
8130
+ <button variant="primary" (click)="confirm($event)" [disabled]="invalidForm()">
7958
8131
  {{ 'confirm' | transloco }}
7959
8132
  </button>
7960
8133
  </div>
@@ -8005,12 +8178,12 @@ class AlertsComponent {
8005
8178
  }
8006
8179
  this.tmpAlerts.splice(drop.currentIndex, 0, this.tmpAlerts.splice(drop.previousIndex, 1)[0]);
8007
8180
  }
8008
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: AlertsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8009
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: AlertsComponent, isStandalone: true, selector: "Alerts", providers: [provideTranslocoScope('alerts')], viewQueries: [{ propertyName: "alertFormDialog", first: true, predicate: AlertDialog, descendants: true, isSignal: true }], ngImport: i0, template: "<ul\n role=\"list\"\n class=\"flex min-w-80 flex-col p-2\"\n cdkDropList\n [cdkDropListData]=\"tmpAlerts\"\n [cdkDropListDisabled]=\"!reordering()\"\n (cdkDropListDropped)=\"dropped($event)\">\n @if (floating) {\n <label class=\"text-xl font-bold\">{{ 'alerts.label' | transloco }}</label>\n <MenuSeparator />\n }\n @for (alert of tmpAlerts; track $index) {\n <li role=\"listitem\" class=\"group h-10\" tabindex=\"0\" cdkDrag (click)=\"onClick($index)\" (keydown.enter)=\"onClick($index)\">\n <i class=\"fa-fw fas fa-bell shrink-0\" aria-hidden=\"true\"></i>\n <p class=\"line-clamp-1\">{{ alert.name }}</p>\n @if (!reordering()) {\n <button\n variant=\"icon\"\n class=\"text-destructive hover:text-destructive invisible ms-auto transition-transform hover:scale-125 group-hover:visible\"\n title=\"{{ 'alerts.deleteAlert' | transloco }}\"\n [attr.aria-label]=\"'alerts.deleteAlert' | transloco\"\n (click)=\"deleteAlert($event, $index)\">\n <i class=\"fa-fw fa-regular fa-trash-can\" aria-hidden=\"true\"></i>\n </button>\n } @else {\n <i class=\"fa-fw fa-regular fa-bars\"></i>\n }\n </li>\n } @empty {\n <li role=\"listitem\" class=\"py-4 text-center text-neutral-500\">{{ 'alerts.noAlerts' | transloco }}</li>\n }\n</ul>\n<div class=\"flex flex-col gap-2 p-2\">\n <button variant=\"outline\" class=\"w-full\" tabindex=\"0\" [attr.title]=\"'alerts.manageAlerts' | transloco\" [disabled]=\"!alerts().length\" (click)=\"reorder()\">\n {{ (reordering() ? 'save' : 'alerts.manageAlerts') | transloco }}\n </button>\n <button class=\"w-full\" [attr.title]=\"'alerts.createAlert' | transloco\" (click)=\"createAlert()\">{{ 'alerts.createAlert' | transloco }}</button>\n</div>\n", dependencies: [{ kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "component", type: HorizontalDividerComponent, selector: "menu-separator, MenuSeparator, menuseparator, horizontal-divider, HorizontalDivider, horizontaldivider" }, { kind: "directive", type: ListItemComponent, selector: "[role=\"listitem\"], [role=\"option\"]", inputs: ["class", "variant"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i1$1.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i1$1.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
8181
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: AlertsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8182
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: AlertsComponent, isStandalone: true, selector: "Alerts", providers: [provideTranslocoScope('alerts')], viewQueries: [{ propertyName: "alertFormDialog", first: true, predicate: AlertDialog, descendants: true, isSignal: true }], ngImport: i0, template: "<ul\n role=\"list\"\n class=\"flex min-w-80 flex-col p-2\"\n cdkDropList\n [cdkDropListData]=\"tmpAlerts\"\n [cdkDropListDisabled]=\"!reordering()\"\n (cdkDropListDropped)=\"dropped($event)\">\n @if (floating) {\n <label class=\"text-xl font-bold\">{{ 'alerts.label' | transloco }}</label>\n <HorizontalDivider />\n }\n @for (alert of tmpAlerts; track $index) {\n <li role=\"listitem\" class=\"group h-10\" tabindex=\"0\" cdkDrag (click)=\"onClick($index)\" (keydown.enter)=\"onClick($index)\">\n <i class=\"fa-fw fas fa-bell shrink-0\" aria-hidden=\"true\"></i>\n <p class=\"line-clamp-1\">{{ alert.name }}</p>\n @if (!reordering()) {\n <button\n class=\"text-destructive hover:text-destructive invisible ms-auto transition-transform hover:scale-125 group-hover:visible\"\n title=\"{{ 'alerts.deleteAlert' | transloco }}\"\n [attr.aria-label]=\"'alerts.deleteAlert' | transloco\"\n (click)=\"deleteAlert($event, $index)\">\n <i class=\"fa-fw fa-regular fa-trash-can\" aria-hidden=\"true\"></i>\n </button>\n } @else {\n <i class=\"fa-fw fa-regular fa-bars\"></i>\n }\n </li>\n } @empty {\n <li role=\"listitem\" class=\"py-4 text-center text-neutral-500\">{{ 'alerts.noAlerts' | transloco }}</li>\n }\n</ul>\n<div class=\"flex flex-col gap-2 p-2\">\n <button decoration=\"outline\" class=\"w-full\" tabindex=\"0\" [attr.title]=\"'alerts.manageAlerts' | transloco\" [disabled]=\"!alerts().length\" (click)=\"reorder()\">\n {{ (reordering() ? 'save' : 'alerts.manageAlerts') | transloco }}\n </button>\n <button variant=\"primary\" class=\"w-full\" [attr.title]=\"'alerts.createAlert' | transloco\" (click)=\"createAlert()\">\n {{ 'alerts.createAlert' | transloco }}\n </button>\n</div>\n", dependencies: [{ kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "decoration", "size"] }, { kind: "component", type: HorizontalDividerComponent, selector: "horizontal-divider, HorizontalDivider, horizontaldivider" }, { kind: "directive", type: ListItemComponent, selector: "[role=\"listitem\"], [role=\"option\"]", inputs: ["class", "variant", "decoration"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i1$1.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i1$1.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
8010
8183
  }
8011
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: AlertsComponent, decorators: [{
8184
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: AlertsComponent, decorators: [{
8012
8185
  type: Component,
8013
- args: [{ selector: 'Alerts', standalone: true, imports: [TranslocoPipe, ButtonComponent, HorizontalDividerComponent, ListItemComponent, DragDropModule], providers: [provideTranslocoScope('alerts')], template: "<ul\n role=\"list\"\n class=\"flex min-w-80 flex-col p-2\"\n cdkDropList\n [cdkDropListData]=\"tmpAlerts\"\n [cdkDropListDisabled]=\"!reordering()\"\n (cdkDropListDropped)=\"dropped($event)\">\n @if (floating) {\n <label class=\"text-xl font-bold\">{{ 'alerts.label' | transloco }}</label>\n <MenuSeparator />\n }\n @for (alert of tmpAlerts; track $index) {\n <li role=\"listitem\" class=\"group h-10\" tabindex=\"0\" cdkDrag (click)=\"onClick($index)\" (keydown.enter)=\"onClick($index)\">\n <i class=\"fa-fw fas fa-bell shrink-0\" aria-hidden=\"true\"></i>\n <p class=\"line-clamp-1\">{{ alert.name }}</p>\n @if (!reordering()) {\n <button\n variant=\"icon\"\n class=\"text-destructive hover:text-destructive invisible ms-auto transition-transform hover:scale-125 group-hover:visible\"\n title=\"{{ 'alerts.deleteAlert' | transloco }}\"\n [attr.aria-label]=\"'alerts.deleteAlert' | transloco\"\n (click)=\"deleteAlert($event, $index)\">\n <i class=\"fa-fw fa-regular fa-trash-can\" aria-hidden=\"true\"></i>\n </button>\n } @else {\n <i class=\"fa-fw fa-regular fa-bars\"></i>\n }\n </li>\n } @empty {\n <li role=\"listitem\" class=\"py-4 text-center text-neutral-500\">{{ 'alerts.noAlerts' | transloco }}</li>\n }\n</ul>\n<div class=\"flex flex-col gap-2 p-2\">\n <button variant=\"outline\" class=\"w-full\" tabindex=\"0\" [attr.title]=\"'alerts.manageAlerts' | transloco\" [disabled]=\"!alerts().length\" (click)=\"reorder()\">\n {{ (reordering() ? 'save' : 'alerts.manageAlerts') | transloco }}\n </button>\n <button class=\"w-full\" [attr.title]=\"'alerts.createAlert' | transloco\" (click)=\"createAlert()\">{{ 'alerts.createAlert' | transloco }}</button>\n</div>\n" }]
8186
+ args: [{ selector: 'Alerts', standalone: true, imports: [TranslocoPipe, ButtonComponent, HorizontalDividerComponent, ListItemComponent, DragDropModule], providers: [provideTranslocoScope('alerts')], template: "<ul\n role=\"list\"\n class=\"flex min-w-80 flex-col p-2\"\n cdkDropList\n [cdkDropListData]=\"tmpAlerts\"\n [cdkDropListDisabled]=\"!reordering()\"\n (cdkDropListDropped)=\"dropped($event)\">\n @if (floating) {\n <label class=\"text-xl font-bold\">{{ 'alerts.label' | transloco }}</label>\n <HorizontalDivider />\n }\n @for (alert of tmpAlerts; track $index) {\n <li role=\"listitem\" class=\"group h-10\" tabindex=\"0\" cdkDrag (click)=\"onClick($index)\" (keydown.enter)=\"onClick($index)\">\n <i class=\"fa-fw fas fa-bell shrink-0\" aria-hidden=\"true\"></i>\n <p class=\"line-clamp-1\">{{ alert.name }}</p>\n @if (!reordering()) {\n <button\n class=\"text-destructive hover:text-destructive invisible ms-auto transition-transform hover:scale-125 group-hover:visible\"\n title=\"{{ 'alerts.deleteAlert' | transloco }}\"\n [attr.aria-label]=\"'alerts.deleteAlert' | transloco\"\n (click)=\"deleteAlert($event, $index)\">\n <i class=\"fa-fw fa-regular fa-trash-can\" aria-hidden=\"true\"></i>\n </button>\n } @else {\n <i class=\"fa-fw fa-regular fa-bars\"></i>\n }\n </li>\n } @empty {\n <li role=\"listitem\" class=\"py-4 text-center text-neutral-500\">{{ 'alerts.noAlerts' | transloco }}</li>\n }\n</ul>\n<div class=\"flex flex-col gap-2 p-2\">\n <button decoration=\"outline\" class=\"w-full\" tabindex=\"0\" [attr.title]=\"'alerts.manageAlerts' | transloco\" [disabled]=\"!alerts().length\" (click)=\"reorder()\">\n {{ (reordering() ? 'save' : 'alerts.manageAlerts') | transloco }}\n </button>\n <button variant=\"primary\" class=\"w-full\" [attr.title]=\"'alerts.createAlert' | transloco\" (click)=\"createAlert()\">\n {{ 'alerts.createAlert' | transloco }}\n </button>\n</div>\n" }]
8014
8187
  }], ctorParameters: () => [] });
8015
8188
 
8016
8189
  class OverrideUserDialogComponent {
@@ -8070,8 +8243,8 @@ class OverrideUserDialogComponent {
8070
8243
  });
8071
8244
  }
8072
8245
  }
8073
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: OverrideUserDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8074
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.1.2", type: OverrideUserDialogComponent, isStandalone: true, selector: "override-user-dialog", inputs: { overrideUser: { classPropertyName: "overrideUser", publicName: "overrideUser", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { overrideUser: "overrideUserChange" }, providers: [provideTranslocoScope('dialogs')], viewQueries: [{ propertyName: "dialog", first: true, predicate: DialogComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
8246
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: OverrideUserDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8247
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.1.7", type: OverrideUserDialogComponent, isStandalone: true, selector: "override-user-dialog", inputs: { overrideUser: { classPropertyName: "overrideUser", publicName: "overrideUser", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { overrideUser: "overrideUserChange" }, providers: [provideTranslocoScope('dialogs')], viewQueries: [{ propertyName: "dialog", first: true, predicate: DialogComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
8075
8248
  <dialog #dialog class="max-w-md">
8076
8249
  <DialogHeader>
8077
8250
  <DialogTitle>{{ 'dialogs.overrideUser.title' | transloco }}</DialogTitle>
@@ -8108,7 +8281,7 @@ class OverrideUserDialogComponent {
8108
8281
  </DialogContent>
8109
8282
 
8110
8283
  <DialogFooter>
8111
- <button variant="outline" (click)="dialog.close($event)">
8284
+ <button decoration="outline" (click)="dialog.close($event)">
8112
8285
  {{ 'cancel' | transloco }}
8113
8286
  </button>
8114
8287
 
@@ -8117,9 +8290,9 @@ class OverrideUserDialogComponent {
8117
8290
  </button>
8118
8291
  </DialogFooter>
8119
8292
  </dialog>
8120
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "directive", type: InputComponent, selector: "input[type=\"text\"], input[type=\"email\"], input[type=\"password\"], input[type=\"number\"], input[type=\"tel\"], input[type=\"url\"], input[type=\"time\"]", inputs: ["class", "variant"] }, { kind: "component", type: DialogComponent, selector: "dialog", inputs: ["class"], outputs: ["closed"] }, { kind: "directive", type: DialogContentComponent, selector: "DialogContent" }, { kind: "directive", type: DialogTitleComponent, selector: "DialogTitle" }, { kind: "component", type: DialogHeaderComponent, selector: "DialogHeader" }, { kind: "directive", type: DialogFooterComponent, selector: "DialogFooter" }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
8293
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "decoration", "size"] }, { kind: "directive", type: InputComponent, selector: "input[type=\"text\"], input[type=\"email\"], input[type=\"number\"], input[type=\"password\"], input[type=\"tel\"], input[type=\"url\"], input[type=\"time\"]", inputs: ["class", "variant", "decoration"] }, { kind: "component", type: DialogComponent, selector: "dialog", inputs: ["class", "variant"], outputs: ["closed"] }, { kind: "directive", type: DialogContentComponent, selector: "DialogContent" }, { kind: "directive", type: DialogTitleComponent, selector: "DialogTitle" }, { kind: "component", type: DialogHeaderComponent, selector: "DialogHeader" }, { kind: "directive", type: DialogFooterComponent, selector: "DialogFooter" }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
8121
8294
  }
8122
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: OverrideUserDialogComponent, decorators: [{
8295
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: OverrideUserDialogComponent, decorators: [{
8123
8296
  type: Component,
8124
8297
  args: [{
8125
8298
  selector: 'override-user-dialog',
@@ -8173,7 +8346,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
8173
8346
  </DialogContent>
8174
8347
 
8175
8348
  <DialogFooter>
8176
- <button variant="outline" (click)="dialog.close($event)">
8349
+ <button decoration="outline" (click)="dialog.close($event)">
8177
8350
  {{ 'cancel' | transloco }}
8178
8351
  </button>
8179
8352
 
@@ -8200,8 +8373,8 @@ class ResetUserSettingsDialogComponent {
8200
8373
  notify.success(message, { duration: 2000 });
8201
8374
  });
8202
8375
  }
8203
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: ResetUserSettingsDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8204
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.1.2", type: ResetUserSettingsDialogComponent, isStandalone: true, selector: "reset-user-settings-dialog", providers: [provideTranslocoScope('dialogs')], viewQueries: [{ propertyName: "dialog", first: true, predicate: DialogComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
8376
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ResetUserSettingsDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8377
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.1.7", type: ResetUserSettingsDialogComponent, isStandalone: true, selector: "reset-user-settings-dialog", providers: [provideTranslocoScope('dialogs')], viewQueries: [{ propertyName: "dialog", first: true, predicate: DialogComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
8205
8378
  <dialog #dialog>
8206
8379
  <DialogHeader>
8207
8380
  <DialogTitle>{{ 'dialogs.resetUserSettings.title' | transloco }}</DialogTitle>
@@ -8212,7 +8385,7 @@ class ResetUserSettingsDialogComponent {
8212
8385
  </DialogContent>
8213
8386
 
8214
8387
  <DialogFooter>
8215
- <button variant="outline" (click)="dialog.close($event)">
8388
+ <button decoration="outline" (click)="dialog.close($event)">
8216
8389
  {{ 'cancel' | transloco }}
8217
8390
  </button>
8218
8391
 
@@ -8221,9 +8394,9 @@ class ResetUserSettingsDialogComponent {
8221
8394
  </button>
8222
8395
  </DialogFooter>
8223
8396
  </dialog>
8224
- `, isInline: true, dependencies: [{ kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "component", type: DialogComponent, selector: "dialog", inputs: ["class"], outputs: ["closed"] }, { kind: "directive", type: DialogTitleComponent, selector: "DialogTitle" }, { kind: "directive", type: DialogContentComponent, selector: "DialogContent" }, { kind: "directive", type: DialogFooterComponent, selector: "DialogFooter" }, { kind: "component", type: DialogHeaderComponent, selector: "DialogHeader" }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
8397
+ `, isInline: true, dependencies: [{ kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "decoration", "size"] }, { kind: "component", type: DialogComponent, selector: "dialog", inputs: ["class", "variant"], outputs: ["closed"] }, { kind: "directive", type: DialogTitleComponent, selector: "DialogTitle" }, { kind: "directive", type: DialogContentComponent, selector: "DialogContent" }, { kind: "directive", type: DialogFooterComponent, selector: "DialogFooter" }, { kind: "component", type: DialogHeaderComponent, selector: "DialogHeader" }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
8225
8398
  }
8226
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: ResetUserSettingsDialogComponent, decorators: [{
8399
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ResetUserSettingsDialogComponent, decorators: [{
8227
8400
  type: Component,
8228
8401
  args: [{
8229
8402
  selector: 'reset-user-settings-dialog',
@@ -8241,7 +8414,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
8241
8414
  </DialogContent>
8242
8415
 
8243
8416
  <DialogFooter>
8244
- <button variant="outline" (click)="dialog.close($event)">
8417
+ <button decoration="outline" (click)="dialog.close($event)">
8245
8418
  {{ 'cancel' | transloco }}
8246
8419
  </button>
8247
8420
 
@@ -8269,12 +8442,12 @@ class DidYouMeanComponent {
8269
8442
  this.queryParamsStore.patch({ spellingCorrectionMode: 'dymonly' });
8270
8443
  this.router.navigate([], { queryParamsHandling: 'merge', queryParams: { c: 'dymonly', q: this.original() } });
8271
8444
  }
8272
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: DidYouMeanComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8273
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: DidYouMeanComponent, isStandalone: true, selector: "app-did-you-mean", inputs: { result: { classPropertyName: "result", publicName: "result", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideTranslocoScope('did-you-mean')], ngImport: i0, template: "@switch (spellingCorrectionMode()?.toLowerCase()) { @case ('dymonly') {\n<p>\n <span class=\"me-1\">{{ 'didYouMean.didYouMean' | transloco }}</span>\n <a class=\"text-primary\" role=\"button\" (click)=\"selectCorrected()\">{{ correction() }}</a>\n <span>?</span>\n</p>\n} @case ('correct') {\n<p>\n <span class=\"me-1\">{{ 'didYouMean.showingResultsFor' | transloco }}</span>\n <a class=\"text-primary font-bold\" role=\"button\" (click)=\"selectCorrected()\">{{ correction() }}</a>\n\n <span class=\"me-1\">. {{ 'didYouMean.searchInsteadFor' | transloco }}</span>\n <a class=\"text-primary\" role=\"button\" (click)=\"selectOriginal()\">{{ original() }}</a>\n</p>\n} @case ('smart') {\n<p>\n <span class=\"me-1\">{{ 'didYouMean.showingResultsFor' | transloco }}</span>\n <a class=\"text-primary\" role=\"button\" (click)=\"selectOriginal()\">{{ original() }}</a>\n\n <span class=\"mx-1\">and</span>\n <a class=\"text-primary font-bold\" role=\"button\" (click)=\"selectCorrected()\">{{ correction() }}</a>\n</p>\n} }\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
8445
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: DidYouMeanComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8446
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: DidYouMeanComponent, isStandalone: true, selector: "did-you-mean, DidYouMean, didyoumean", inputs: { result: { classPropertyName: "result", publicName: "result", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideTranslocoScope('did-you-mean')], ngImport: i0, template: "@switch (spellingCorrectionMode()?.toLowerCase()) {\n @case ('dymonly') {\n <p>\n <span class=\"me-1\">{{ 'didYouMean.didYouMean' | transloco }}</span>\n <a class=\"text-primary\" role=\"button\" (click)=\"selectCorrected()\">{{ correction() }}</a>\n <span>?</span>\n </p>\n }\n @case ('correct') {\n <p>\n <span class=\"me-1\">{{ 'didYouMean.showingResultsFor' | transloco }}</span>\n <a class=\"text-primary font-bold\" role=\"button\" (click)=\"selectCorrected()\">{{ correction() }}</a>\n\n <span class=\"me-1\">. {{ 'didYouMean.searchInsteadFor' | transloco }}</span>\n <a class=\"text-primary\" role=\"button\" (click)=\"selectOriginal()\">{{ original() }}</a>\n </p>\n }\n @case ('smart') {\n <p>\n <span class=\"me-1\">{{ 'didYouMean.showingResultsFor' | transloco }}</span>\n <a class=\"text-primary\" role=\"button\" (click)=\"selectOriginal()\">{{ original() }}</a>\n\n <span class=\"mx-1\">and</span>\n <a class=\"text-primary font-bold\" role=\"button\" (click)=\"selectCorrected()\">{{ correction() }}</a>\n </p>\n }\n}\n", dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
8274
8447
  }
8275
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: DidYouMeanComponent, decorators: [{
8448
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: DidYouMeanComponent, decorators: [{
8276
8449
  type: Component,
8277
- args: [{ selector: 'app-did-you-mean', standalone: true, imports: [RouterModule, TranslocoPipe], providers: [provideTranslocoScope('did-you-mean')], template: "@switch (spellingCorrectionMode()?.toLowerCase()) { @case ('dymonly') {\n<p>\n <span class=\"me-1\">{{ 'didYouMean.didYouMean' | transloco }}</span>\n <a class=\"text-primary\" role=\"button\" (click)=\"selectCorrected()\">{{ correction() }}</a>\n <span>?</span>\n</p>\n} @case ('correct') {\n<p>\n <span class=\"me-1\">{{ 'didYouMean.showingResultsFor' | transloco }}</span>\n <a class=\"text-primary font-bold\" role=\"button\" (click)=\"selectCorrected()\">{{ correction() }}</a>\n\n <span class=\"me-1\">. {{ 'didYouMean.searchInsteadFor' | transloco }}</span>\n <a class=\"text-primary\" role=\"button\" (click)=\"selectOriginal()\">{{ original() }}</a>\n</p>\n} @case ('smart') {\n<p>\n <span class=\"me-1\">{{ 'didYouMean.showingResultsFor' | transloco }}</span>\n <a class=\"text-primary\" role=\"button\" (click)=\"selectOriginal()\">{{ original() }}</a>\n\n <span class=\"mx-1\">and</span>\n <a class=\"text-primary font-bold\" role=\"button\" (click)=\"selectCorrected()\">{{ correction() }}</a>\n</p>\n} }\n", styles: [":host{display:block}\n"] }]
8450
+ args: [{ selector: 'did-you-mean, DidYouMean, didyoumean', standalone: true, imports: [RouterModule, TranslocoPipe], providers: [provideTranslocoScope('did-you-mean')], template: "@switch (spellingCorrectionMode()?.toLowerCase()) {\n @case ('dymonly') {\n <p>\n <span class=\"me-1\">{{ 'didYouMean.didYouMean' | transloco }}</span>\n <a class=\"text-primary\" role=\"button\" (click)=\"selectCorrected()\">{{ correction() }}</a>\n <span>?</span>\n </p>\n }\n @case ('correct') {\n <p>\n <span class=\"me-1\">{{ 'didYouMean.showingResultsFor' | transloco }}</span>\n <a class=\"text-primary font-bold\" role=\"button\" (click)=\"selectCorrected()\">{{ correction() }}</a>\n\n <span class=\"me-1\">. {{ 'didYouMean.searchInsteadFor' | transloco }}</span>\n <a class=\"text-primary\" role=\"button\" (click)=\"selectOriginal()\">{{ original() }}</a>\n </p>\n }\n @case ('smart') {\n <p>\n <span class=\"me-1\">{{ 'didYouMean.showingResultsFor' | transloco }}</span>\n <a class=\"text-primary\" role=\"button\" (click)=\"selectOriginal()\">{{ original() }}</a>\n\n <span class=\"mx-1\">and</span>\n <a class=\"text-primary font-bold\" role=\"button\" (click)=\"selectCorrected()\">{{ correction() }}</a>\n </p>\n }\n}\n" }]
8278
8451
  }] });
8279
8452
 
8280
8453
  /**
@@ -8393,14 +8566,15 @@ class SignInComponent {
8393
8566
  this.router.navigate(['/']);
8394
8567
  }
8395
8568
  }
8396
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SignInComponent, deps: [{ token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Component });
8397
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: SignInComponent, isStandalone: true, selector: "signIn, signin, sign-in", providers: [provideTranslocoScope('login')], ngImport: i0, template: "<Card>\n <CardHeader>\n <a href=\"#\" title=\"Logo\">\n <ng-content select=\"[logo]\">\n <svg\n version=\"1.1\"\n id=\"Calque_1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n x=\"0px\"\n y=\"0px\"\n viewBox=\"0 0 858 228\"\n style=\"enable-background: new 0 0 858 228\"\n xml:space=\"preserve\">\n <style type=\"text/css\">\n .st0 {\n fill: #0040bf;\n }\n .st1 {\n fill: url(#SVGID_1_);\n }\n .st2 {\n fill: url(#SVGID_00000085217246274894832600000009342302383523206054_);\n }\n </style>\n <path\n class=\"st0\"\n d=\"M44.7,168.7c-10.1-4.1-17.6-9.9-22.5-17.1c-5-7.3-7.6-15.7-8.1-25.2h25.7c0.5,10.2,4.6,17.9,12.2,23.1\n c7.6,5.2,18.4,7.8,32.4,7.8c13.5,0,23.5-2.2,30.2-6.5c6.7-4.3,10-10.4,10-18.1c0-6.5-1.7-11.4-5.2-14.6c-3.5-3.2-8.5-5.5-15.1-7\n c-6.6-1.5-14.6-2.9-24.2-4.1c-12.5-1.6-23.4-3.8-32.7-6.4C38.1,98,31,93.9,25.9,88.4c-5-5.5-7.5-13.1-7.5-22.9\n c0-9.1,2.6-16.8,7.7-23.1c5.2-6.3,12.5-11.1,22-14.5c9.5-3.3,20.7-5,33.4-5c19.3,0,34.3,3.8,45.1,11.5c10.8,7.7,16.6,18.4,17.4,32.1\n h-24.9c-0.5-9-4.2-15.6-11.1-19.9c-6.9-4.3-16.1-6.4-27.6-6.4c-11.8,0-21,2-27.4,6.1c-6.5,4.1-9.7,9.6-9.7,16.5\n c0,5.8,1.6,10.2,4.7,13.1c3.1,2.9,7.9,5.1,14.3,6.5c6.4,1.4,14.5,2.8,24.3,4c9.6,1.2,18.3,2.7,26.1,4.4c7.7,1.7,14.4,4.1,20,7.2\n c5.6,3.1,9.8,7.3,12.7,12.5c2.9,5.2,4.4,12,4.4,20.3c0,13.6-5.6,24.3-16.9,32.2c-11.3,7.9-27.7,11.8-49.3,11.8\n C67.7,174.9,54.7,172.9,44.7,168.7z\" />\n <path\n class=\"st0\"\n d=\"M346.6,168.2c-9.4-4.5-16.6-10.9-21.7-19.2c-5.1-8.3-7.6-18.1-7.6-29.4c0-11.5,2.5-21.5,7.6-29.9\n c5.1-8.4,12.3-14.8,21.5-19.4c9.2-4.6,20.1-6.8,32.6-6.8c13,0,24.2,2.4,33.3,7.1c9.2,4.8,16.1,11.6,20.7,20.6\n c4.6,9,6.5,19.8,5.7,32.4h-97.8c0.3,10.9,3.9,19.3,10.9,25.3c7,6,16.5,9,28.4,9c9.2,0,17-1.7,23.2-5c6.2-3.3,10.3-7.8,12-13.4h22.6\n c-1.1,7.1-4.3,13.2-9.7,18.5c-5.4,5.3-12.3,9.4-20.7,12.3c-8.4,2.9-17.8,4.4-28.1,4.4C367,174.9,356,172.7,346.6,168.2z M352.5,88.4\n c-6.7,5.2-10.6,12.4-11.8,21.5h74.4c-0.4-9.4-3.8-16.6-10.3-21.7c-6.5-5.1-15.1-7.6-26-7.6C367.9,80.6,359.2,83.2,352.5,88.4z\" />\n <path\n class=\"st0\"\n d=\"M546,151.9h-1c-3.4,7.1-9,12.7-16.9,16.8c-7.9,4.1-16.7,6.2-26.5,6.2c-10.7,0-20.1-2.3-28.1-6.8\n c-8-4.6-14.3-11-18.8-19.5c-4.5-8.4-6.7-18.3-6.7-29.6c0-11.4,2.2-21.3,6.7-29.6c4.5-8.3,10.8-14.7,18.9-19.2\n c8.1-4.5,17.4-6.7,28-6.7c11,0,20.3,2,27.8,6c7.5,4,12.9,9.3,16,15.8h1l0.8-20.2h22.4v141.9H546V151.9z M528.6,151.9\n c5.6-3.1,10-7.3,12.9-12.4c3-5.2,4.5-10.7,4.5-16.7v-7.9c0-6-1.5-11.4-4.5-16.4c-3-5-7.3-8.9-12.9-11.9c-5.6-3-12.5-4.5-20.5-4.5\n c-10.7,0-19.5,3.2-26.2,9.7c-6.7,6.5-10.1,15.6-10.1,27.4c0,11.6,3.3,20.7,10,27.4c6.7,6.7,15.4,10.1,26.3,10.1\n C516.1,156.6,522.9,155,528.6,151.9z\" />\n <linearGradient id=\"SVGID_1_\" gradientUnits=\"userSpaceOnUse\" x1=\"780.8157\" y1=\"119.2805\" x2=\"690.0867\" y2=\"119.2805\">\n <stop offset=\"0\" style=\"stop-color: #ff854a\" />\n <stop offset=\"0.8407\" style=\"stop-color: #0040bf\" />\n </linearGradient>\n <path\n class=\"st1\"\n d=\"M803.4,65.3l-0.8,20.2h-1c-3.3-6.5-8.6-11.8-16.1-15.8c-7.5-4-16.7-6-27.7-6c-10.6,0-19.9,2.2-28,6.7\n c-8.1,4.5-14.4,10.9-18.9,19.2c-4.5,8.3-6.7,18.2-6.7,29.8c0,11.3,2.2,21.1,6.7,29.5s10.7,14.8,18.8,19.4c8,4.6,17.4,6.8,28.1,6.8\n c9.9,0,18.8-2.1,26.6-6.2c7.8-4.1,14.4-12.2,17.8-19.3h23.6V65.3H803.4z M802.2,122.7c0,6-1.5,11.6-4.5,16.7\n c-3,5.2-7.3,9.3-12.9,12.4c-5.6,3.1-12.5,4.7-20.5,4.7c-10.9,0-19.6-3.3-26.3-10c-6.7-6.7-10-15.8-10-27.3c0-12,3.4-21.2,10.1-27.6\n c6.7-6.5,15.5-9.7,26.2-9.7c8,0,14.8,1.5,20.5,4.5c5.6,3,10,7,12.9,11.9c3,5,4.5,10.4,4.5,16.2V122.7z\" />\n <linearGradient\n id=\"SVGID_00000152963432808947599350000011020247854886079881_\"\n gradientUnits=\"userSpaceOnUse\"\n x1=\"780.8157\"\n y1=\"161.271\"\n x2=\"690.0867\"\n y2=\"161.271\">\n <stop offset=\"0\" style=\"stop-color: #ff854a\" />\n <stop offset=\"0.8407\" style=\"stop-color: #0040bf\" />\n </linearGradient>\n <path\n style=\"fill: url(#SVGID_00000152963432808947599350000011020247854886079881_)\"\n d=\"M843.9,161.3c0,6.5-5.3,11.8-11.8,11.8l0,0\n c-6.5,0-11.8-5.3-11.8-11.8v0c0-6.5,5.3-11.8,11.8-11.8l0,0C838.6,149.4,843.9,154.7,843.9,161.3\" />\n <rect x=\"159.2\" y=\"25.3\" class=\"st0\" width=\"23.6\" height=\"23.6\" />\n <g>\n <polygon class=\"st0\" points=\"159.2,149.4 159.2,173.1 182.8,173.1 182.8,149.4 182.8,65.3 159.2,65.3 \t\" />\n <rect x=\"159.2\" y=\"25.3\" class=\"st0\" width=\"23.6\" height=\"23.6\" />\n </g>\n <path\n class=\"st0\"\n d=\"M302.7,84.2c-4-7.3-9.5-12.6-16.5-15.8c-7-3.2-15.1-4.8-24.4-4.8c-9.2,0-17.8,2.1-25.8,6.2\n c-7.9,4.1-13.9,10-17.8,17.6h-1.4l-0.6-22.2h-23v107.8h23.6v-53.4c0-7.5,1.6-14,4.7-19.7c3.1-5.6,7.5-10.1,13.1-13.2\n c5.6-3.2,12.2-4.8,19.7-4.8c10.6,0,18.4,3,23.3,8.9c5,5.9,7.4,15,7.4,27.2v55h23.6V114C308.7,101.5,306.7,91.6,302.7,84.2z\" />\n <path\n class=\"st0\"\n d=\"M671.7,65.3v53.4c0,7.5-1.6,14.1-4.7,19.8c-3.1,5.7-7.5,10.2-13.1,13.4c-5.6,3.2-12.2,4.8-19.7,4.8\n c-10.7,0-18.6-3-23.5-9.1c-5-6-7.4-15-7.4-27V65.3h-23.4v59.5c0,12.2,2,22,5.9,29.4c3.9,7.3,9.4,12.6,16.5,15.9\n c7.1,3.3,15.2,4.9,24.5,4.9c9.6,0,18.4-2.1,26.2-6.3c7.6-4.1,15-11.3,18.9-18.6v23.1h23.4v-23.6v-5.2v-79H671.7z\" />\n </svg>\n </ng-content>\n </a>\n @if (authenticated()) {\n <h3 class=\"whitespace-nowrap text-2xl font-semibold tracking-tight\">{{ 'login.welcomeBack' | transloco : { name: user()?.fullName ?? '' } }}</h3>\n <p class=\"text-muted-foreground text-sm\">{{ 'login.youAreLoggedIn' | transloco }}</p>\n }\n </CardHeader>\n\n @if (!authenticated()) {\n <CardContent>\n <div class=\"grid gap-4\">\n @if (!config.autoOAuthProvider && !config.autoSAMLProvider) {\n <div class=\"grid gap-2\">\n <label class=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\" for=\"username\"\n >{{ 'login.username' | transloco }}</label\n >\n\n <input\n type=\"text\"\n id=\"username\"\n required\n [ngModel]=\"credentials().username\"\n (ngModelChange)=\"updateCredentials({ username: $event })\"\n (keydown.enter)=\"handleLoginWithCredentials()\" />\n </div>\n <div class=\"grid gap-2\">\n <div class=\"flex items-center\">\n <label class=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\" for=\"password\"\n >{{ 'login.password' | transloco }}</label\n >\n </div>\n <input\n type=\"password\"\n id=\"password\"\n required\n [ngModel]=\"credentials().password\"\n (ngModelChange)=\"updateCredentials({ password: $event })\"\n (keydown.enter)=\"handleLoginWithCredentials()\" />\n </div>\n <button [disabled]=\"!valid()\" (click)=\"handleLoginWithCredentials()\">{{ 'login.connect' | transloco }}</button>\n } @else {\n <button (click)=\"handleLogin()\">{{ 'login.SignInWith' | transloco: { provider: config.autoOAuthProvider ? 'OAuth' : 'SAML' } }}</button>\n }\n </div>\n </CardContent>\n } @else {\n <CardFooter class=\"justify-between gap-2\">\n <button class=\"w-full\" (click)=\"handleLogout()\" type=\"submit\">{{ 'login.disconnect' | transloco }}</button>\n <button class=\"w-full\" variant=\"ghost\" (click)=\"handleBack()\">{{ 'login.back' | transloco }}</button>\n </CardFooter>\n }\n</Card>\n", styles: [":host{min-height:100vh;display:flex;justify-content:center;align-items:center;padding:2rem}.btn-primary{background-color:#000;color:#fff}\n"], dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: InputComponent, selector: "input[type=\"text\"], input[type=\"email\"], input[type=\"password\"], input[type=\"number\"], input[type=\"tel\"], input[type=\"url\"], input[type=\"time\"]", inputs: ["class", "variant"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "directive", type: CardComponent, selector: ".card, card, Card", inputs: ["class"] }, { kind: "directive", type: CardHeaderComponent, selector: ".card-header, card-header, CardHeader, cardheader", inputs: ["class"] }, { kind: "directive", type: CardContentComponent, selector: ".card-content, card-content, CardContent, cardcontent", inputs: ["class"] }, { kind: "directive", type: CardFooterComponent, selector: ".card-footer, card-footer, CardFooter, cardfooter", inputs: ["class"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
8569
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SignInComponent, deps: [{ token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Component });
8570
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: SignInComponent, isStandalone: true, selector: "signIn, signin, sign-in", providers: [provideTranslocoScope('login')], ngImport: i0, template: "<Card hover=\"no\" cdkTrapFocus cdkTrapFocusAutoCapture=\"true\">\n <CardHeader>\n <ng-content select=\"[logo]\">\n <svg\n version=\"1.1\"\n id=\"Calque_1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n x=\"0px\"\n y=\"0px\"\n viewBox=\"0 0 858 228\"\n style=\"enable-background: new 0 0 858 228\"\n xml:space=\"preserve\">\n <style type=\"text/css\">\n .st0 {\n fill: #0040bf;\n }\n .st1 {\n fill: url(#SVGID_1_);\n }\n .st2 {\n fill: url(#SVGID_00000085217246274894832600000009342302383523206054_);\n }\n </style>\n <path\n class=\"st0\"\n d=\"M44.7,168.7c-10.1-4.1-17.6-9.9-22.5-17.1c-5-7.3-7.6-15.7-8.1-25.2h25.7c0.5,10.2,4.6,17.9,12.2,23.1\n c7.6,5.2,18.4,7.8,32.4,7.8c13.5,0,23.5-2.2,30.2-6.5c6.7-4.3,10-10.4,10-18.1c0-6.5-1.7-11.4-5.2-14.6c-3.5-3.2-8.5-5.5-15.1-7\n c-6.6-1.5-14.6-2.9-24.2-4.1c-12.5-1.6-23.4-3.8-32.7-6.4C38.1,98,31,93.9,25.9,88.4c-5-5.5-7.5-13.1-7.5-22.9\n c0-9.1,2.6-16.8,7.7-23.1c5.2-6.3,12.5-11.1,22-14.5c9.5-3.3,20.7-5,33.4-5c19.3,0,34.3,3.8,45.1,11.5c10.8,7.7,16.6,18.4,17.4,32.1\n h-24.9c-0.5-9-4.2-15.6-11.1-19.9c-6.9-4.3-16.1-6.4-27.6-6.4c-11.8,0-21,2-27.4,6.1c-6.5,4.1-9.7,9.6-9.7,16.5\n c0,5.8,1.6,10.2,4.7,13.1c3.1,2.9,7.9,5.1,14.3,6.5c6.4,1.4,14.5,2.8,24.3,4c9.6,1.2,18.3,2.7,26.1,4.4c7.7,1.7,14.4,4.1,20,7.2\n c5.6,3.1,9.8,7.3,12.7,12.5c2.9,5.2,4.4,12,4.4,20.3c0,13.6-5.6,24.3-16.9,32.2c-11.3,7.9-27.7,11.8-49.3,11.8\n C67.7,174.9,54.7,172.9,44.7,168.7z\" />\n <path\n class=\"st0\"\n d=\"M346.6,168.2c-9.4-4.5-16.6-10.9-21.7-19.2c-5.1-8.3-7.6-18.1-7.6-29.4c0-11.5,2.5-21.5,7.6-29.9\n c5.1-8.4,12.3-14.8,21.5-19.4c9.2-4.6,20.1-6.8,32.6-6.8c13,0,24.2,2.4,33.3,7.1c9.2,4.8,16.1,11.6,20.7,20.6\n c4.6,9,6.5,19.8,5.7,32.4h-97.8c0.3,10.9,3.9,19.3,10.9,25.3c7,6,16.5,9,28.4,9c9.2,0,17-1.7,23.2-5c6.2-3.3,10.3-7.8,12-13.4h22.6\n c-1.1,7.1-4.3,13.2-9.7,18.5c-5.4,5.3-12.3,9.4-20.7,12.3c-8.4,2.9-17.8,4.4-28.1,4.4C367,174.9,356,172.7,346.6,168.2z M352.5,88.4\n c-6.7,5.2-10.6,12.4-11.8,21.5h74.4c-0.4-9.4-3.8-16.6-10.3-21.7c-6.5-5.1-15.1-7.6-26-7.6C367.9,80.6,359.2,83.2,352.5,88.4z\" />\n <path\n class=\"st0\"\n d=\"M546,151.9h-1c-3.4,7.1-9,12.7-16.9,16.8c-7.9,4.1-16.7,6.2-26.5,6.2c-10.7,0-20.1-2.3-28.1-6.8\n c-8-4.6-14.3-11-18.8-19.5c-4.5-8.4-6.7-18.3-6.7-29.6c0-11.4,2.2-21.3,6.7-29.6c4.5-8.3,10.8-14.7,18.9-19.2\n c8.1-4.5,17.4-6.7,28-6.7c11,0,20.3,2,27.8,6c7.5,4,12.9,9.3,16,15.8h1l0.8-20.2h22.4v141.9H546V151.9z M528.6,151.9\n c5.6-3.1,10-7.3,12.9-12.4c3-5.2,4.5-10.7,4.5-16.7v-7.9c0-6-1.5-11.4-4.5-16.4c-3-5-7.3-8.9-12.9-11.9c-5.6-3-12.5-4.5-20.5-4.5\n c-10.7,0-19.5,3.2-26.2,9.7c-6.7,6.5-10.1,15.6-10.1,27.4c0,11.6,3.3,20.7,10,27.4c6.7,6.7,15.4,10.1,26.3,10.1\n C516.1,156.6,522.9,155,528.6,151.9z\" />\n <linearGradient id=\"SVGID_1_\" gradientUnits=\"userSpaceOnUse\" x1=\"780.8157\" y1=\"119.2805\" x2=\"690.0867\" y2=\"119.2805\">\n <stop offset=\"0\" style=\"stop-color: #ff854a\" />\n <stop offset=\"0.8407\" style=\"stop-color: #0040bf\" />\n </linearGradient>\n <path\n class=\"st1\"\n d=\"M803.4,65.3l-0.8,20.2h-1c-3.3-6.5-8.6-11.8-16.1-15.8c-7.5-4-16.7-6-27.7-6c-10.6,0-19.9,2.2-28,6.7\n c-8.1,4.5-14.4,10.9-18.9,19.2c-4.5,8.3-6.7,18.2-6.7,29.8c0,11.3,2.2,21.1,6.7,29.5s10.7,14.8,18.8,19.4c8,4.6,17.4,6.8,28.1,6.8\n c9.9,0,18.8-2.1,26.6-6.2c7.8-4.1,14.4-12.2,17.8-19.3h23.6V65.3H803.4z M802.2,122.7c0,6-1.5,11.6-4.5,16.7\n c-3,5.2-7.3,9.3-12.9,12.4c-5.6,3.1-12.5,4.7-20.5,4.7c-10.9,0-19.6-3.3-26.3-10c-6.7-6.7-10-15.8-10-27.3c0-12,3.4-21.2,10.1-27.6\n c6.7-6.5,15.5-9.7,26.2-9.7c8,0,14.8,1.5,20.5,4.5c5.6,3,10,7,12.9,11.9c3,5,4.5,10.4,4.5,16.2V122.7z\" />\n <linearGradient\n id=\"SVGID_00000152963432808947599350000011020247854886079881_\"\n gradientUnits=\"userSpaceOnUse\"\n x1=\"780.8157\"\n y1=\"161.271\"\n x2=\"690.0867\"\n y2=\"161.271\">\n <stop offset=\"0\" style=\"stop-color: #ff854a\" />\n <stop offset=\"0.8407\" style=\"stop-color: #0040bf\" />\n </linearGradient>\n <path\n style=\"fill: url(#SVGID_00000152963432808947599350000011020247854886079881_)\"\n d=\"M843.9,161.3c0,6.5-5.3,11.8-11.8,11.8l0,0\n c-6.5,0-11.8-5.3-11.8-11.8v0c0-6.5,5.3-11.8,11.8-11.8l0,0C838.6,149.4,843.9,154.7,843.9,161.3\" />\n <rect x=\"159.2\" y=\"25.3\" class=\"st0\" width=\"23.6\" height=\"23.6\" />\n <g>\n <polygon class=\"st0\" points=\"159.2,149.4 159.2,173.1 182.8,173.1 182.8,149.4 182.8,65.3 159.2,65.3 \t\" />\n <rect x=\"159.2\" y=\"25.3\" class=\"st0\" width=\"23.6\" height=\"23.6\" />\n </g>\n <path\n class=\"st0\"\n d=\"M302.7,84.2c-4-7.3-9.5-12.6-16.5-15.8c-7-3.2-15.1-4.8-24.4-4.8c-9.2,0-17.8,2.1-25.8,6.2\n c-7.9,4.1-13.9,10-17.8,17.6h-1.4l-0.6-22.2h-23v107.8h23.6v-53.4c0-7.5,1.6-14,4.7-19.7c3.1-5.6,7.5-10.1,13.1-13.2\n c5.6-3.2,12.2-4.8,19.7-4.8c10.6,0,18.4,3,23.3,8.9c5,5.9,7.4,15,7.4,27.2v55h23.6V114C308.7,101.5,306.7,91.6,302.7,84.2z\" />\n <path\n class=\"st0\"\n d=\"M671.7,65.3v53.4c0,7.5-1.6,14.1-4.7,19.8c-3.1,5.7-7.5,10.2-13.1,13.4c-5.6,3.2-12.2,4.8-19.7,4.8\n c-10.7,0-18.6-3-23.5-9.1c-5-6-7.4-15-7.4-27V65.3h-23.4v59.5c0,12.2,2,22,5.9,29.4c3.9,7.3,9.4,12.6,16.5,15.9\n c7.1,3.3,15.2,4.9,24.5,4.9c9.6,0,18.4-2.1,26.2-6.3c7.6-4.1,15-11.3,18.9-18.6v23.1h23.4v-23.6v-5.2v-79H671.7z\" />\n </svg>\n </ng-content>\n @if (authenticated()) {\n <h3 class=\"whitespace-nowrap text-2xl font-semibold tracking-tight\">{{ 'login.welcomeBack' | transloco: { name: user()?.fullName ?? '' } }}</h3>\n <p class=\"text-muted-foreground text-sm\">{{ 'login.youAreLoggedIn' | transloco }}</p>\n }\n </CardHeader>\n\n @if (!authenticated()) {\n <CardContent>\n <div class=\"grid gap-4\">\n @if (!config.autoOAuthProvider && !config.autoSAMLProvider) {\n <div class=\"grid gap-2\">\n <label class=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\" for=\"username\">{{\n 'login.username' | transloco\n }}</label>\n\n <input\n type=\"text\"\n id=\"username\"\n required\n [ngModel]=\"credentials().username\"\n (ngModelChange)=\"updateCredentials({ username: $event })\"\n (keydown.enter)=\"handleLoginWithCredentials()\" />\n </div>\n\n <div class=\"grid gap-2\">\n <div class=\"flex items-center\">\n <label class=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\" for=\"password\">\n {{ 'login.password' | transloco }}\n </label>\n </div>\n\n <input\n type=\"password\"\n id=\"password\"\n required\n [ngModel]=\"credentials().password\"\n (ngModelChange)=\"updateCredentials({ password: $event })\"\n (keydown.enter)=\"handleLoginWithCredentials()\" />\n </div>\n\n <button [disabled]=\"!valid()\" (click)=\"handleLoginWithCredentials()\">{{ 'login.connect' | transloco }}</button>\n } @else {\n <button (click)=\"handleLogin()\">{{ 'login.SignInWith' | transloco: { provider: config.autoOAuthProvider ? 'OAuth' : 'SAML' } }}</button>\n }\n </div>\n </CardContent>\n }\n\n @if (authenticated()) {\n <CardFooter class=\"justify-between gap-2\">\n <button class=\"w-full\" (click)=\"handleLogout()\" type=\"submit\">{{ 'login.disconnect' | transloco }}</button>\n <button class=\"w-full\" variant=\"ghost\" (click)=\"handleBack()\">{{ 'login.back' | transloco }}</button>\n </CardFooter>\n }\n</Card>\n", styles: [":host{min-height:100vh;display:flex;justify-content:center;align-items:center;padding:2rem}.btn-primary{background-color:#000;color:#fff}\n"], dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: A11yModule }, { kind: "directive", type: i2.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: InputComponent, selector: "input[type=\"text\"], input[type=\"email\"], input[type=\"number\"], input[type=\"password\"], input[type=\"tel\"], input[type=\"url\"], input[type=\"time\"]", inputs: ["class", "variant", "decoration"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "decoration", "size"] }, { kind: "directive", type: CardComponent, selector: ".card, card, Card", inputs: ["class", "variant", "hover"] }, { kind: "directive", type: CardHeaderComponent, selector: ".card-header, card-header, CardHeader, cardheader", inputs: ["class"] }, { kind: "directive", type: CardContentComponent, selector: ".card-content, card-content, CardContent, cardcontent", inputs: ["class"] }, { kind: "directive", type: CardFooterComponent, selector: ".card-footer, card-footer, CardFooter, cardfooter", inputs: ["class"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
8398
8571
  }
8399
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SignInComponent, decorators: [{
8572
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SignInComponent, decorators: [{
8400
8573
  type: Component,
8401
8574
  args: [{ selector: 'signIn, signin, sign-in', standalone: true, providers: [provideTranslocoScope('login')], imports: [
8402
8575
  RouterModule,
8403
8576
  FormsModule,
8577
+ A11yModule,
8404
8578
  TranslocoPipe,
8405
8579
  InputComponent,
8406
8580
  ButtonComponent,
@@ -8408,7 +8582,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
8408
8582
  CardHeaderComponent,
8409
8583
  CardContentComponent,
8410
8584
  CardFooterComponent
8411
- ], template: "<Card>\n <CardHeader>\n <a href=\"#\" title=\"Logo\">\n <ng-content select=\"[logo]\">\n <svg\n version=\"1.1\"\n id=\"Calque_1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n x=\"0px\"\n y=\"0px\"\n viewBox=\"0 0 858 228\"\n style=\"enable-background: new 0 0 858 228\"\n xml:space=\"preserve\">\n <style type=\"text/css\">\n .st0 {\n fill: #0040bf;\n }\n .st1 {\n fill: url(#SVGID_1_);\n }\n .st2 {\n fill: url(#SVGID_00000085217246274894832600000009342302383523206054_);\n }\n </style>\n <path\n class=\"st0\"\n d=\"M44.7,168.7c-10.1-4.1-17.6-9.9-22.5-17.1c-5-7.3-7.6-15.7-8.1-25.2h25.7c0.5,10.2,4.6,17.9,12.2,23.1\n c7.6,5.2,18.4,7.8,32.4,7.8c13.5,0,23.5-2.2,30.2-6.5c6.7-4.3,10-10.4,10-18.1c0-6.5-1.7-11.4-5.2-14.6c-3.5-3.2-8.5-5.5-15.1-7\n c-6.6-1.5-14.6-2.9-24.2-4.1c-12.5-1.6-23.4-3.8-32.7-6.4C38.1,98,31,93.9,25.9,88.4c-5-5.5-7.5-13.1-7.5-22.9\n c0-9.1,2.6-16.8,7.7-23.1c5.2-6.3,12.5-11.1,22-14.5c9.5-3.3,20.7-5,33.4-5c19.3,0,34.3,3.8,45.1,11.5c10.8,7.7,16.6,18.4,17.4,32.1\n h-24.9c-0.5-9-4.2-15.6-11.1-19.9c-6.9-4.3-16.1-6.4-27.6-6.4c-11.8,0-21,2-27.4,6.1c-6.5,4.1-9.7,9.6-9.7,16.5\n c0,5.8,1.6,10.2,4.7,13.1c3.1,2.9,7.9,5.1,14.3,6.5c6.4,1.4,14.5,2.8,24.3,4c9.6,1.2,18.3,2.7,26.1,4.4c7.7,1.7,14.4,4.1,20,7.2\n c5.6,3.1,9.8,7.3,12.7,12.5c2.9,5.2,4.4,12,4.4,20.3c0,13.6-5.6,24.3-16.9,32.2c-11.3,7.9-27.7,11.8-49.3,11.8\n C67.7,174.9,54.7,172.9,44.7,168.7z\" />\n <path\n class=\"st0\"\n d=\"M346.6,168.2c-9.4-4.5-16.6-10.9-21.7-19.2c-5.1-8.3-7.6-18.1-7.6-29.4c0-11.5,2.5-21.5,7.6-29.9\n c5.1-8.4,12.3-14.8,21.5-19.4c9.2-4.6,20.1-6.8,32.6-6.8c13,0,24.2,2.4,33.3,7.1c9.2,4.8,16.1,11.6,20.7,20.6\n c4.6,9,6.5,19.8,5.7,32.4h-97.8c0.3,10.9,3.9,19.3,10.9,25.3c7,6,16.5,9,28.4,9c9.2,0,17-1.7,23.2-5c6.2-3.3,10.3-7.8,12-13.4h22.6\n c-1.1,7.1-4.3,13.2-9.7,18.5c-5.4,5.3-12.3,9.4-20.7,12.3c-8.4,2.9-17.8,4.4-28.1,4.4C367,174.9,356,172.7,346.6,168.2z M352.5,88.4\n c-6.7,5.2-10.6,12.4-11.8,21.5h74.4c-0.4-9.4-3.8-16.6-10.3-21.7c-6.5-5.1-15.1-7.6-26-7.6C367.9,80.6,359.2,83.2,352.5,88.4z\" />\n <path\n class=\"st0\"\n d=\"M546,151.9h-1c-3.4,7.1-9,12.7-16.9,16.8c-7.9,4.1-16.7,6.2-26.5,6.2c-10.7,0-20.1-2.3-28.1-6.8\n c-8-4.6-14.3-11-18.8-19.5c-4.5-8.4-6.7-18.3-6.7-29.6c0-11.4,2.2-21.3,6.7-29.6c4.5-8.3,10.8-14.7,18.9-19.2\n c8.1-4.5,17.4-6.7,28-6.7c11,0,20.3,2,27.8,6c7.5,4,12.9,9.3,16,15.8h1l0.8-20.2h22.4v141.9H546V151.9z M528.6,151.9\n c5.6-3.1,10-7.3,12.9-12.4c3-5.2,4.5-10.7,4.5-16.7v-7.9c0-6-1.5-11.4-4.5-16.4c-3-5-7.3-8.9-12.9-11.9c-5.6-3-12.5-4.5-20.5-4.5\n c-10.7,0-19.5,3.2-26.2,9.7c-6.7,6.5-10.1,15.6-10.1,27.4c0,11.6,3.3,20.7,10,27.4c6.7,6.7,15.4,10.1,26.3,10.1\n C516.1,156.6,522.9,155,528.6,151.9z\" />\n <linearGradient id=\"SVGID_1_\" gradientUnits=\"userSpaceOnUse\" x1=\"780.8157\" y1=\"119.2805\" x2=\"690.0867\" y2=\"119.2805\">\n <stop offset=\"0\" style=\"stop-color: #ff854a\" />\n <stop offset=\"0.8407\" style=\"stop-color: #0040bf\" />\n </linearGradient>\n <path\n class=\"st1\"\n d=\"M803.4,65.3l-0.8,20.2h-1c-3.3-6.5-8.6-11.8-16.1-15.8c-7.5-4-16.7-6-27.7-6c-10.6,0-19.9,2.2-28,6.7\n c-8.1,4.5-14.4,10.9-18.9,19.2c-4.5,8.3-6.7,18.2-6.7,29.8c0,11.3,2.2,21.1,6.7,29.5s10.7,14.8,18.8,19.4c8,4.6,17.4,6.8,28.1,6.8\n c9.9,0,18.8-2.1,26.6-6.2c7.8-4.1,14.4-12.2,17.8-19.3h23.6V65.3H803.4z M802.2,122.7c0,6-1.5,11.6-4.5,16.7\n c-3,5.2-7.3,9.3-12.9,12.4c-5.6,3.1-12.5,4.7-20.5,4.7c-10.9,0-19.6-3.3-26.3-10c-6.7-6.7-10-15.8-10-27.3c0-12,3.4-21.2,10.1-27.6\n c6.7-6.5,15.5-9.7,26.2-9.7c8,0,14.8,1.5,20.5,4.5c5.6,3,10,7,12.9,11.9c3,5,4.5,10.4,4.5,16.2V122.7z\" />\n <linearGradient\n id=\"SVGID_00000152963432808947599350000011020247854886079881_\"\n gradientUnits=\"userSpaceOnUse\"\n x1=\"780.8157\"\n y1=\"161.271\"\n x2=\"690.0867\"\n y2=\"161.271\">\n <stop offset=\"0\" style=\"stop-color: #ff854a\" />\n <stop offset=\"0.8407\" style=\"stop-color: #0040bf\" />\n </linearGradient>\n <path\n style=\"fill: url(#SVGID_00000152963432808947599350000011020247854886079881_)\"\n d=\"M843.9,161.3c0,6.5-5.3,11.8-11.8,11.8l0,0\n c-6.5,0-11.8-5.3-11.8-11.8v0c0-6.5,5.3-11.8,11.8-11.8l0,0C838.6,149.4,843.9,154.7,843.9,161.3\" />\n <rect x=\"159.2\" y=\"25.3\" class=\"st0\" width=\"23.6\" height=\"23.6\" />\n <g>\n <polygon class=\"st0\" points=\"159.2,149.4 159.2,173.1 182.8,173.1 182.8,149.4 182.8,65.3 159.2,65.3 \t\" />\n <rect x=\"159.2\" y=\"25.3\" class=\"st0\" width=\"23.6\" height=\"23.6\" />\n </g>\n <path\n class=\"st0\"\n d=\"M302.7,84.2c-4-7.3-9.5-12.6-16.5-15.8c-7-3.2-15.1-4.8-24.4-4.8c-9.2,0-17.8,2.1-25.8,6.2\n c-7.9,4.1-13.9,10-17.8,17.6h-1.4l-0.6-22.2h-23v107.8h23.6v-53.4c0-7.5,1.6-14,4.7-19.7c3.1-5.6,7.5-10.1,13.1-13.2\n c5.6-3.2,12.2-4.8,19.7-4.8c10.6,0,18.4,3,23.3,8.9c5,5.9,7.4,15,7.4,27.2v55h23.6V114C308.7,101.5,306.7,91.6,302.7,84.2z\" />\n <path\n class=\"st0\"\n d=\"M671.7,65.3v53.4c0,7.5-1.6,14.1-4.7,19.8c-3.1,5.7-7.5,10.2-13.1,13.4c-5.6,3.2-12.2,4.8-19.7,4.8\n c-10.7,0-18.6-3-23.5-9.1c-5-6-7.4-15-7.4-27V65.3h-23.4v59.5c0,12.2,2,22,5.9,29.4c3.9,7.3,9.4,12.6,16.5,15.9\n c7.1,3.3,15.2,4.9,24.5,4.9c9.6,0,18.4-2.1,26.2-6.3c7.6-4.1,15-11.3,18.9-18.6v23.1h23.4v-23.6v-5.2v-79H671.7z\" />\n </svg>\n </ng-content>\n </a>\n @if (authenticated()) {\n <h3 class=\"whitespace-nowrap text-2xl font-semibold tracking-tight\">{{ 'login.welcomeBack' | transloco : { name: user()?.fullName ?? '' } }}</h3>\n <p class=\"text-muted-foreground text-sm\">{{ 'login.youAreLoggedIn' | transloco }}</p>\n }\n </CardHeader>\n\n @if (!authenticated()) {\n <CardContent>\n <div class=\"grid gap-4\">\n @if (!config.autoOAuthProvider && !config.autoSAMLProvider) {\n <div class=\"grid gap-2\">\n <label class=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\" for=\"username\"\n >{{ 'login.username' | transloco }}</label\n >\n\n <input\n type=\"text\"\n id=\"username\"\n required\n [ngModel]=\"credentials().username\"\n (ngModelChange)=\"updateCredentials({ username: $event })\"\n (keydown.enter)=\"handleLoginWithCredentials()\" />\n </div>\n <div class=\"grid gap-2\">\n <div class=\"flex items-center\">\n <label class=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\" for=\"password\"\n >{{ 'login.password' | transloco }}</label\n >\n </div>\n <input\n type=\"password\"\n id=\"password\"\n required\n [ngModel]=\"credentials().password\"\n (ngModelChange)=\"updateCredentials({ password: $event })\"\n (keydown.enter)=\"handleLoginWithCredentials()\" />\n </div>\n <button [disabled]=\"!valid()\" (click)=\"handleLoginWithCredentials()\">{{ 'login.connect' | transloco }}</button>\n } @else {\n <button (click)=\"handleLogin()\">{{ 'login.SignInWith' | transloco: { provider: config.autoOAuthProvider ? 'OAuth' : 'SAML' } }}</button>\n }\n </div>\n </CardContent>\n } @else {\n <CardFooter class=\"justify-between gap-2\">\n <button class=\"w-full\" (click)=\"handleLogout()\" type=\"submit\">{{ 'login.disconnect' | transloco }}</button>\n <button class=\"w-full\" variant=\"ghost\" (click)=\"handleBack()\">{{ 'login.back' | transloco }}</button>\n </CardFooter>\n }\n</Card>\n", styles: [":host{min-height:100vh;display:flex;justify-content:center;align-items:center;padding:2rem}.btn-primary{background-color:#000;color:#fff}\n"] }]
8585
+ ], template: "<Card hover=\"no\" cdkTrapFocus cdkTrapFocusAutoCapture=\"true\">\n <CardHeader>\n <ng-content select=\"[logo]\">\n <svg\n version=\"1.1\"\n id=\"Calque_1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n x=\"0px\"\n y=\"0px\"\n viewBox=\"0 0 858 228\"\n style=\"enable-background: new 0 0 858 228\"\n xml:space=\"preserve\">\n <style type=\"text/css\">\n .st0 {\n fill: #0040bf;\n }\n .st1 {\n fill: url(#SVGID_1_);\n }\n .st2 {\n fill: url(#SVGID_00000085217246274894832600000009342302383523206054_);\n }\n </style>\n <path\n class=\"st0\"\n d=\"M44.7,168.7c-10.1-4.1-17.6-9.9-22.5-17.1c-5-7.3-7.6-15.7-8.1-25.2h25.7c0.5,10.2,4.6,17.9,12.2,23.1\n c7.6,5.2,18.4,7.8,32.4,7.8c13.5,0,23.5-2.2,30.2-6.5c6.7-4.3,10-10.4,10-18.1c0-6.5-1.7-11.4-5.2-14.6c-3.5-3.2-8.5-5.5-15.1-7\n c-6.6-1.5-14.6-2.9-24.2-4.1c-12.5-1.6-23.4-3.8-32.7-6.4C38.1,98,31,93.9,25.9,88.4c-5-5.5-7.5-13.1-7.5-22.9\n c0-9.1,2.6-16.8,7.7-23.1c5.2-6.3,12.5-11.1,22-14.5c9.5-3.3,20.7-5,33.4-5c19.3,0,34.3,3.8,45.1,11.5c10.8,7.7,16.6,18.4,17.4,32.1\n h-24.9c-0.5-9-4.2-15.6-11.1-19.9c-6.9-4.3-16.1-6.4-27.6-6.4c-11.8,0-21,2-27.4,6.1c-6.5,4.1-9.7,9.6-9.7,16.5\n c0,5.8,1.6,10.2,4.7,13.1c3.1,2.9,7.9,5.1,14.3,6.5c6.4,1.4,14.5,2.8,24.3,4c9.6,1.2,18.3,2.7,26.1,4.4c7.7,1.7,14.4,4.1,20,7.2\n c5.6,3.1,9.8,7.3,12.7,12.5c2.9,5.2,4.4,12,4.4,20.3c0,13.6-5.6,24.3-16.9,32.2c-11.3,7.9-27.7,11.8-49.3,11.8\n C67.7,174.9,54.7,172.9,44.7,168.7z\" />\n <path\n class=\"st0\"\n d=\"M346.6,168.2c-9.4-4.5-16.6-10.9-21.7-19.2c-5.1-8.3-7.6-18.1-7.6-29.4c0-11.5,2.5-21.5,7.6-29.9\n c5.1-8.4,12.3-14.8,21.5-19.4c9.2-4.6,20.1-6.8,32.6-6.8c13,0,24.2,2.4,33.3,7.1c9.2,4.8,16.1,11.6,20.7,20.6\n c4.6,9,6.5,19.8,5.7,32.4h-97.8c0.3,10.9,3.9,19.3,10.9,25.3c7,6,16.5,9,28.4,9c9.2,0,17-1.7,23.2-5c6.2-3.3,10.3-7.8,12-13.4h22.6\n c-1.1,7.1-4.3,13.2-9.7,18.5c-5.4,5.3-12.3,9.4-20.7,12.3c-8.4,2.9-17.8,4.4-28.1,4.4C367,174.9,356,172.7,346.6,168.2z M352.5,88.4\n c-6.7,5.2-10.6,12.4-11.8,21.5h74.4c-0.4-9.4-3.8-16.6-10.3-21.7c-6.5-5.1-15.1-7.6-26-7.6C367.9,80.6,359.2,83.2,352.5,88.4z\" />\n <path\n class=\"st0\"\n d=\"M546,151.9h-1c-3.4,7.1-9,12.7-16.9,16.8c-7.9,4.1-16.7,6.2-26.5,6.2c-10.7,0-20.1-2.3-28.1-6.8\n c-8-4.6-14.3-11-18.8-19.5c-4.5-8.4-6.7-18.3-6.7-29.6c0-11.4,2.2-21.3,6.7-29.6c4.5-8.3,10.8-14.7,18.9-19.2\n c8.1-4.5,17.4-6.7,28-6.7c11,0,20.3,2,27.8,6c7.5,4,12.9,9.3,16,15.8h1l0.8-20.2h22.4v141.9H546V151.9z M528.6,151.9\n c5.6-3.1,10-7.3,12.9-12.4c3-5.2,4.5-10.7,4.5-16.7v-7.9c0-6-1.5-11.4-4.5-16.4c-3-5-7.3-8.9-12.9-11.9c-5.6-3-12.5-4.5-20.5-4.5\n c-10.7,0-19.5,3.2-26.2,9.7c-6.7,6.5-10.1,15.6-10.1,27.4c0,11.6,3.3,20.7,10,27.4c6.7,6.7,15.4,10.1,26.3,10.1\n C516.1,156.6,522.9,155,528.6,151.9z\" />\n <linearGradient id=\"SVGID_1_\" gradientUnits=\"userSpaceOnUse\" x1=\"780.8157\" y1=\"119.2805\" x2=\"690.0867\" y2=\"119.2805\">\n <stop offset=\"0\" style=\"stop-color: #ff854a\" />\n <stop offset=\"0.8407\" style=\"stop-color: #0040bf\" />\n </linearGradient>\n <path\n class=\"st1\"\n d=\"M803.4,65.3l-0.8,20.2h-1c-3.3-6.5-8.6-11.8-16.1-15.8c-7.5-4-16.7-6-27.7-6c-10.6,0-19.9,2.2-28,6.7\n c-8.1,4.5-14.4,10.9-18.9,19.2c-4.5,8.3-6.7,18.2-6.7,29.8c0,11.3,2.2,21.1,6.7,29.5s10.7,14.8,18.8,19.4c8,4.6,17.4,6.8,28.1,6.8\n c9.9,0,18.8-2.1,26.6-6.2c7.8-4.1,14.4-12.2,17.8-19.3h23.6V65.3H803.4z M802.2,122.7c0,6-1.5,11.6-4.5,16.7\n c-3,5.2-7.3,9.3-12.9,12.4c-5.6,3.1-12.5,4.7-20.5,4.7c-10.9,0-19.6-3.3-26.3-10c-6.7-6.7-10-15.8-10-27.3c0-12,3.4-21.2,10.1-27.6\n c6.7-6.5,15.5-9.7,26.2-9.7c8,0,14.8,1.5,20.5,4.5c5.6,3,10,7,12.9,11.9c3,5,4.5,10.4,4.5,16.2V122.7z\" />\n <linearGradient\n id=\"SVGID_00000152963432808947599350000011020247854886079881_\"\n gradientUnits=\"userSpaceOnUse\"\n x1=\"780.8157\"\n y1=\"161.271\"\n x2=\"690.0867\"\n y2=\"161.271\">\n <stop offset=\"0\" style=\"stop-color: #ff854a\" />\n <stop offset=\"0.8407\" style=\"stop-color: #0040bf\" />\n </linearGradient>\n <path\n style=\"fill: url(#SVGID_00000152963432808947599350000011020247854886079881_)\"\n d=\"M843.9,161.3c0,6.5-5.3,11.8-11.8,11.8l0,0\n c-6.5,0-11.8-5.3-11.8-11.8v0c0-6.5,5.3-11.8,11.8-11.8l0,0C838.6,149.4,843.9,154.7,843.9,161.3\" />\n <rect x=\"159.2\" y=\"25.3\" class=\"st0\" width=\"23.6\" height=\"23.6\" />\n <g>\n <polygon class=\"st0\" points=\"159.2,149.4 159.2,173.1 182.8,173.1 182.8,149.4 182.8,65.3 159.2,65.3 \t\" />\n <rect x=\"159.2\" y=\"25.3\" class=\"st0\" width=\"23.6\" height=\"23.6\" />\n </g>\n <path\n class=\"st0\"\n d=\"M302.7,84.2c-4-7.3-9.5-12.6-16.5-15.8c-7-3.2-15.1-4.8-24.4-4.8c-9.2,0-17.8,2.1-25.8,6.2\n c-7.9,4.1-13.9,10-17.8,17.6h-1.4l-0.6-22.2h-23v107.8h23.6v-53.4c0-7.5,1.6-14,4.7-19.7c3.1-5.6,7.5-10.1,13.1-13.2\n c5.6-3.2,12.2-4.8,19.7-4.8c10.6,0,18.4,3,23.3,8.9c5,5.9,7.4,15,7.4,27.2v55h23.6V114C308.7,101.5,306.7,91.6,302.7,84.2z\" />\n <path\n class=\"st0\"\n d=\"M671.7,65.3v53.4c0,7.5-1.6,14.1-4.7,19.8c-3.1,5.7-7.5,10.2-13.1,13.4c-5.6,3.2-12.2,4.8-19.7,4.8\n c-10.7,0-18.6-3-23.5-9.1c-5-6-7.4-15-7.4-27V65.3h-23.4v59.5c0,12.2,2,22,5.9,29.4c3.9,7.3,9.4,12.6,16.5,15.9\n c7.1,3.3,15.2,4.9,24.5,4.9c9.6,0,18.4-2.1,26.2-6.3c7.6-4.1,15-11.3,18.9-18.6v23.1h23.4v-23.6v-5.2v-79H671.7z\" />\n </svg>\n </ng-content>\n @if (authenticated()) {\n <h3 class=\"whitespace-nowrap text-2xl font-semibold tracking-tight\">{{ 'login.welcomeBack' | transloco: { name: user()?.fullName ?? '' } }}</h3>\n <p class=\"text-muted-foreground text-sm\">{{ 'login.youAreLoggedIn' | transloco }}</p>\n }\n </CardHeader>\n\n @if (!authenticated()) {\n <CardContent>\n <div class=\"grid gap-4\">\n @if (!config.autoOAuthProvider && !config.autoSAMLProvider) {\n <div class=\"grid gap-2\">\n <label class=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\" for=\"username\">{{\n 'login.username' | transloco\n }}</label>\n\n <input\n type=\"text\"\n id=\"username\"\n required\n [ngModel]=\"credentials().username\"\n (ngModelChange)=\"updateCredentials({ username: $event })\"\n (keydown.enter)=\"handleLoginWithCredentials()\" />\n </div>\n\n <div class=\"grid gap-2\">\n <div class=\"flex items-center\">\n <label class=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\" for=\"password\">\n {{ 'login.password' | transloco }}\n </label>\n </div>\n\n <input\n type=\"password\"\n id=\"password\"\n required\n [ngModel]=\"credentials().password\"\n (ngModelChange)=\"updateCredentials({ password: $event })\"\n (keydown.enter)=\"handleLoginWithCredentials()\" />\n </div>\n\n <button [disabled]=\"!valid()\" (click)=\"handleLoginWithCredentials()\">{{ 'login.connect' | transloco }}</button>\n } @else {\n <button (click)=\"handleLogin()\">{{ 'login.SignInWith' | transloco: { provider: config.autoOAuthProvider ? 'OAuth' : 'SAML' } }}</button>\n }\n </div>\n </CardContent>\n }\n\n @if (authenticated()) {\n <CardFooter class=\"justify-between gap-2\">\n <button class=\"w-full\" (click)=\"handleLogout()\" type=\"submit\">{{ 'login.disconnect' | transloco }}</button>\n <button class=\"w-full\" variant=\"ghost\" (click)=\"handleBack()\">{{ 'login.back' | transloco }}</button>\n </CardFooter>\n }\n</Card>\n", styles: [":host{min-height:100vh;display:flex;justify-content:center;align-items:center;padding:2rem}.btn-primary{background-color:#000;color:#fff}\n"] }]
8412
8586
  }], ctorParameters: () => [{ type: i0.DestroyRef }] });
8413
8587
 
8414
8588
  class LabelService {
@@ -8547,10 +8721,10 @@ class LabelService {
8547
8721
  return from(labels.bulkRemove(labelsToRemove, query, publicOnly));
8548
8722
  }));
8549
8723
  }
8550
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: LabelService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
8551
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: LabelService, providedIn: 'root' });
8724
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: LabelService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
8725
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: LabelService, providedIn: 'root' });
8552
8726
  }
8553
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: LabelService, decorators: [{
8727
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: LabelService, decorators: [{
8554
8728
  type: Injectable,
8555
8729
  args: [{
8556
8730
  providedIn: 'root'
@@ -8657,8 +8831,8 @@ class MultiSelectLabelsComponent {
8657
8831
  updateArticleWithLabels() {
8658
8832
  this.article()[this.labelsField()] = this.labels();
8659
8833
  }
8660
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: MultiSelectLabelsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8661
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: MultiSelectLabelsComponent, isStandalone: true, selector: "multiselect-labels, multiselectlabels, MultiSelectLabels", inputs: { article: { classPropertyName: "article", publicName: "article", isSignal: true, isRequired: false, transformFunction: null }, isPublic: { classPropertyName: "isPublic", publicName: "isPublic", isSignal: true, isRequired: false, transformFunction: null }, allowModification: { classPropertyName: "allowModification", publicName: "allowModification", isSignal: true, isRequired: false, transformFunction: null }, labelsField: { classPropertyName: "labelsField", publicName: "labelsField", isSignal: true, isRequired: false, transformFunction: null }, labelInput: { classPropertyName: "labelInput", publicName: "labelInput", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { article: "articleChange", labelInput: "labelInputChange" }, viewQueries: [{ propertyName: "popover", first: true, predicate: ["LabelsPopover"], descendants: true, isSignal: true }], ngImport: i0, template: `
8834
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: MultiSelectLabelsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8835
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: MultiSelectLabelsComponent, isStandalone: true, selector: "multiselect-labels, multiselectlabels, MultiSelectLabels", inputs: { article: { classPropertyName: "article", publicName: "article", isSignal: true, isRequired: false, transformFunction: null }, isPublic: { classPropertyName: "isPublic", publicName: "isPublic", isSignal: true, isRequired: false, transformFunction: null }, allowModification: { classPropertyName: "allowModification", publicName: "allowModification", isSignal: true, isRequired: false, transformFunction: null }, labelsField: { classPropertyName: "labelsField", publicName: "labelsField", isSignal: true, isRequired: false, transformFunction: null }, labelInput: { classPropertyName: "labelInput", publicName: "labelInput", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { article: "articleChange", labelInput: "labelInputChange" }, viewQueries: [{ propertyName: "popover", first: true, predicate: ["LabelsPopover"], descendants: true, isSignal: true }], ngImport: i0, template: `
8662
8836
  <div class="anchor" [ngStyle]="{ 'anchor-name': anchor() }">
8663
8837
  <label [htmlFor]="id()" class="font-semibold">{{ (isPublic() ? 'labels.publicLabels' : 'labels.privateLabels') | transloco }}</label>
8664
8838
  <input
@@ -8695,9 +8869,9 @@ class MultiSelectLabelsComponent {
8695
8869
  </Badge>
8696
8870
  }
8697
8871
  </div>
8698
- `, isInline: true, styles: [".anchor:has(.popover:popover-open){z-index:var(--z-menu, 1000);border-radius:var(--radius) var(--radius) 0 0}.anchor .popover::backdrop{background-color:transparent;-webkit-backdrop-filter:none;backdrop-filter:none}.popover{width:anchor-size(width);top:anchor(bottom);left:anchor(left)}@supports (-moz-appearance: none){.popover{margin:calc(33.3333333333vh + 30px) 25vw;width:50vw}}@supports (background: -webkit-named-image(i)){.popover{margin:calc(33.3333333333vh + 30px) 25vw;width:50vw}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: InputComponent, selector: "input[type=\"text\"], input[type=\"email\"], input[type=\"password\"], input[type=\"number\"], input[type=\"tel\"], input[type=\"url\"], input[type=\"time\"]", inputs: ["class", "variant"] }, { kind: "directive", type: BadgeComponent, selector: "badge, Badge", inputs: ["class", "variant"] }, { kind: "directive", type: ListItemComponent, selector: "[role=\"listitem\"], [role=\"option\"]", inputs: ["class", "variant"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
8872
+ `, isInline: true, styles: [".anchor:has(.popover:popover-open){z-index:var(--z-menu, 1000);border-radius:var(--radius) var(--radius) 0 0}.anchor .popover::backdrop{background-color:transparent;-webkit-backdrop-filter:none;backdrop-filter:none}.popover{width:anchor-size(width);top:anchor(bottom);left:anchor(left)}@supports (-moz-appearance: none){.popover{margin:calc(33.3333333333vh + 30px) 25vw;width:50vw}}@supports (background: -webkit-named-image(i)){.popover{margin:calc(33.3333333333vh + 30px) 25vw;width:50vw}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: InputComponent, selector: "input[type=\"text\"], input[type=\"email\"], input[type=\"number\"], input[type=\"password\"], input[type=\"tel\"], input[type=\"url\"], input[type=\"time\"]", inputs: ["class", "variant", "decoration"] }, { kind: "directive", type: BadgeComponent, selector: "badge, Badge", inputs: ["class", "variant", "size", "decoration", "hover"] }, { kind: "directive", type: ListItemComponent, selector: "[role=\"listitem\"], [role=\"option\"]", inputs: ["class", "variant", "decoration"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
8699
8873
  }
8700
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: MultiSelectLabelsComponent, decorators: [{
8874
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: MultiSelectLabelsComponent, decorators: [{
8701
8875
  type: Component,
8702
8876
  args: [{ selector: 'multiselect-labels, multiselectlabels, MultiSelectLabels', standalone: true, imports: [FormsModule, NgStyle, TranslocoPipe, InputComponent, BadgeComponent, ListItemComponent], template: `
8703
8877
  <div class="anchor" [ngStyle]="{ 'anchor-name': anchor() }">
@@ -8760,8 +8934,8 @@ class LabelsEditDialog {
8760
8934
  close(event) {
8761
8935
  this.closed.emit({ type: event, article: this.article() });
8762
8936
  }
8763
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: LabelsEditDialog, deps: [{ token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Component });
8764
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: LabelsEditDialog, isStandalone: true, selector: "labels-edit-dialog, labelseditdialog, LabelsEditDialog", inputs: { article: { classPropertyName: "article", publicName: "article", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed", article: "articleChange" }, providers: [provideTranslocoScope('labels')], viewQueries: [{ propertyName: "dialog", first: true, predicate: DialogComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
8937
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: LabelsEditDialog, deps: [{ token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Component });
8938
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: LabelsEditDialog, isStandalone: true, selector: "labels-edit-dialog, labelseditdialog, LabelsEditDialog", inputs: { article: { classPropertyName: "article", publicName: "article", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed", article: "articleChange" }, providers: [provideTranslocoScope('labels')], viewQueries: [{ propertyName: "dialog", first: true, predicate: DialogComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
8765
8939
  <dialog #dialog (closed)="close($event)">
8766
8940
  <DialogHeader>
8767
8941
  <DialogTitle>{{ 'labels.title' | transloco }}</DialogTitle>
@@ -8789,9 +8963,9 @@ class LabelsEditDialog {
8789
8963
  </button>
8790
8964
  </DialogFooter>
8791
8965
  </dialog>
8792
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "component", type: DialogComponent, selector: "dialog", inputs: ["class"], outputs: ["closed"] }, { kind: "component", type: DialogHeaderComponent, selector: "DialogHeader" }, { kind: "directive", type: DialogFooterComponent, selector: "DialogFooter" }, { kind: "directive", type: DialogTitleComponent, selector: "DialogTitle" }, { kind: "directive", type: DialogContentComponent, selector: "DialogContent" }, { kind: "component", type: MultiSelectLabelsComponent, selector: "multiselect-labels, multiselectlabels, MultiSelectLabels", inputs: ["article", "isPublic", "allowModification", "labelsField", "labelInput"], outputs: ["articleChange", "labelInputChange"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
8966
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "decoration", "size"] }, { kind: "component", type: DialogComponent, selector: "dialog", inputs: ["class", "variant"], outputs: ["closed"] }, { kind: "component", type: DialogHeaderComponent, selector: "DialogHeader" }, { kind: "directive", type: DialogFooterComponent, selector: "DialogFooter" }, { kind: "directive", type: DialogTitleComponent, selector: "DialogTitle" }, { kind: "directive", type: DialogContentComponent, selector: "DialogContent" }, { kind: "component", type: MultiSelectLabelsComponent, selector: "multiselect-labels, multiselectlabels, MultiSelectLabels", inputs: ["article", "isPublic", "allowModification", "labelsField", "labelInput"], outputs: ["articleChange", "labelInputChange"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
8793
8967
  }
8794
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: LabelsEditDialog, decorators: [{
8968
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: LabelsEditDialog, decorators: [{
8795
8969
  type: Component,
8796
8970
  args: [{
8797
8971
  selector: 'labels-edit-dialog, labelseditdialog, LabelsEditDialog',
@@ -8866,8 +9040,8 @@ class FeedbackDialogComponent {
8866
9040
  this.dialog().close(e);
8867
9041
  notify.success(this.transloco.translate('feedback.feedbackSuccess'), { duration: 2000 });
8868
9042
  }
8869
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: FeedbackDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8870
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: FeedbackDialogComponent, isStandalone: true, selector: "feedback-dialog, feedbackdialog, FeedbackDialog", inputs: { comment: { classPropertyName: "comment", publicName: "comment", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { comment: "commentChange" }, providers: [provideTranslocoScope('feedback')], viewQueries: [{ propertyName: "dialog", first: true, predicate: DialogComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
9043
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: FeedbackDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9044
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: FeedbackDialogComponent, isStandalone: true, selector: "feedback-dialog, feedbackdialog, FeedbackDialog", inputs: { comment: { classPropertyName: "comment", publicName: "comment", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { comment: "commentChange" }, providers: [provideTranslocoScope('feedback')], viewQueries: [{ propertyName: "dialog", first: true, predicate: DialogComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
8871
9045
  <dialog #dialog>
8872
9046
  <DialogHeader>
8873
9047
  <DialogTitle>{{ 'feedback.dialogTitle' | transloco }}</DialogTitle>
@@ -8886,7 +9060,7 @@ class FeedbackDialogComponent {
8886
9060
  </DialogContent>
8887
9061
 
8888
9062
  <DialogFooter>
8889
- <button variant="outline" (click)="dialog.close($event)">
9063
+ <button decoration="outline" (click)="dialog.close($event)">
8890
9064
  {{ 'cancel' | transloco }}
8891
9065
  </button>
8892
9066
  <button [disabled]="!comment()" (click)="submit($event)">
@@ -8894,9 +9068,9 @@ class FeedbackDialogComponent {
8894
9068
  </button>
8895
9069
  </DialogFooter>
8896
9070
  </dialog>
8897
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "component", type: DialogComponent, selector: "dialog", inputs: ["class"], outputs: ["closed"] }, { kind: "component", type: DialogHeaderComponent, selector: "DialogHeader" }, { kind: "directive", type: DialogFooterComponent, selector: "DialogFooter" }, { kind: "directive", type: DialogTitleComponent, selector: "DialogTitle" }, { kind: "directive", type: DialogContentComponent, selector: "DialogContent" }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
9071
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "decoration", "size"] }, { kind: "component", type: DialogComponent, selector: "dialog", inputs: ["class", "variant"], outputs: ["closed"] }, { kind: "component", type: DialogHeaderComponent, selector: "DialogHeader" }, { kind: "directive", type: DialogFooterComponent, selector: "DialogFooter" }, { kind: "directive", type: DialogTitleComponent, selector: "DialogTitle" }, { kind: "directive", type: DialogContentComponent, selector: "DialogContent" }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
8898
9072
  }
8899
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: FeedbackDialogComponent, decorators: [{
9073
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: FeedbackDialogComponent, decorators: [{
8900
9074
  type: Component,
8901
9075
  args: [{
8902
9076
  selector: 'feedback-dialog, feedbackdialog, FeedbackDialog',
@@ -8931,7 +9105,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
8931
9105
  </DialogContent>
8932
9106
 
8933
9107
  <DialogFooter>
8934
- <button variant="outline" (click)="dialog.close($event)">
9108
+ <button decoration="outline" (click)="dialog.close($event)">
8935
9109
  {{ 'cancel' | transloco }}
8936
9110
  </button>
8937
9111
  <button [disabled]="!comment()" (click)="submit($event)">
@@ -9001,12 +9175,12 @@ class SearchFeedbackComponent {
9001
9175
  openFeedbackDialog(type) {
9002
9176
  this.feedbackDialog()?.open(type);
9003
9177
  }
9004
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SearchFeedbackComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9005
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: SearchFeedbackComponent, isStandalone: true, selector: "feedback, Feedback", inputs: { pages: { classPropertyName: "pages", publicName: "pages", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { onClose: "onClose" }, providers: [provideTranslocoScope('feedback')], viewQueries: [{ propertyName: "feedbackDialog", first: true, predicate: FeedbackDialogComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<menu>\n <button class=\"border border-gray-200 p-5\" variant=\"ghost\" title=\"{{'feedback.button' | transloco }}\">\n <i class=\"fa-fw far fa-commenting\" aria-hidden=\"true\"></i>\n {{ 'feedback.label' | transloco }}\n <i class=\"fa-fw fas fa-xmark ms-2\" (click)=\"close($event);\" aria-hidden=\"true\"></i>\n </button>\n\n <MenuContent>\n @if (!disliked()) {\n <menuitem (click)=\"like()\" [attr.aria-label]=\"'feedback.like' | transloco\">\n @if (liked()) {\n <i class=\"fa-fw fas fa-thumbs-up\"></i> {{ 'feedback.liked' | transloco }} } @else { <i class=\"fa-fw far fa-thumbs-up\"></i> {{ 'feedback.like' | transloco\n }} }\n </menuitem>\n } @if (!liked()) {\n <menuitem (click)=\"dislike()\" [attr.aria-label]=\"'feedback.dislike' | transloco\">\n @if (disliked()) {\n <i class=\"fa-fw fas fa-thumbs-down\"></i> {{ 'feedback.disliked' | transloco }} } @else { <i class=\"fa-fw far fa-thumbs-down\"></i> {{ 'feedback.dislike' |\n transloco }} }\n </menuitem>\n } @for (menu of menus; track $index) {\n <menuitem (click)=\"openFeedbackDialog(menu.type)\" [attr.aria-label]=\"'feedback.' + menu.type + '.title' | transloco\">\n <i class=\"fa-fw {{menu.icon}}\"></i> {{ 'feedback.' + menu.type + '.title' | transloco }}\n </menuitem>\n }\n </MenuContent>\n</menu>\n\n<feedback-dialog />\n", dependencies: [{ kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "component", type: MenuComponent, selector: "menu, Menu", inputs: ["disabled"] }, { kind: "directive", type: MenuContentComponent, selector: "MenuContent, menucontent, menu-content", inputs: ["class", "position"] }, { kind: "directive", type: MenuItemComponent, selector: "menu-item, menuitem, MenuItem", inputs: ["class", "variant"] }, { kind: "component", type: FeedbackDialogComponent, selector: "feedback-dialog, feedbackdialog, FeedbackDialog", inputs: ["comment"], outputs: ["commentChange"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
9178
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SearchFeedbackComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9179
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: SearchFeedbackComponent, isStandalone: true, selector: "feedback, Feedback", inputs: { pages: { classPropertyName: "pages", publicName: "pages", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { onClose: "onClose" }, providers: [provideTranslocoScope('feedback')], viewQueries: [{ propertyName: "feedbackDialog", first: true, predicate: FeedbackDialogComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<menu>\n <button class=\"border-foreground/18 border p-5\" variant=\"ghost\" title=\"{{ 'feedback.button' | transloco }}\">\n <i class=\"fa-fw far fa-commenting\" aria-hidden=\"true\"></i>\n {{ 'feedback.label' | transloco }}\n <i class=\"fa-fw fas fa-xmark ms-2\" (click)=\"close($event)\" aria-hidden=\"true\"></i>\n </button>\n\n <MenuContent>\n @if (!disliked()) {\n <menuitem (click)=\"like()\" [attr.aria-label]=\"'feedback.like' | transloco\">\n @if (liked()) {\n <i class=\"fa-fw fas fa-thumbs-up\"></i> {{ 'feedback.liked' | transloco }}\n } @else {\n <i class=\"fa-fw far fa-thumbs-up\"></i> {{ 'feedback.like' | transloco }}\n }\n </menuitem>\n }\n @if (!liked()) {\n <menuitem (click)=\"dislike()\" [attr.aria-label]=\"'feedback.dislike' | transloco\">\n @if (disliked()) {\n <i class=\"fa-fw fas fa-thumbs-down\"></i> {{ 'feedback.disliked' | transloco }}\n } @else {\n <i class=\"fa-fw far fa-thumbs-down\"></i> {{ 'feedback.dislike' | transloco }}\n }\n </menuitem>\n }\n @for (menu of menus; track $index) {\n <menuitem (click)=\"openFeedbackDialog(menu.type)\" [attr.aria-label]=\"'feedback.' + menu.type + '.title' | transloco\">\n <i class=\"fa-fw {{ menu.icon }}\"></i> {{ 'feedback.' + menu.type + '.title' | transloco }}\n </menuitem>\n }\n </MenuContent>\n</menu>\n\n<feedback-dialog />\n", dependencies: [{ kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "decoration", "size"] }, { kind: "component", type: MenuComponent, selector: "menu, Menu", inputs: ["disabled"] }, { kind: "directive", type: MenuContentComponent, selector: "MenuContent, menucontent, menu-content", inputs: ["class", "position"] }, { kind: "directive", type: MenuItemComponent, selector: "menu-item, menuitem, MenuItem", inputs: ["class", "variant", "decoration"] }, { kind: "component", type: FeedbackDialogComponent, selector: "feedback-dialog, feedbackdialog, FeedbackDialog", inputs: ["comment"], outputs: ["commentChange"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
9006
9180
  }
9007
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SearchFeedbackComponent, decorators: [{
9181
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SearchFeedbackComponent, decorators: [{
9008
9182
  type: Component,
9009
- args: [{ selector: 'feedback, Feedback', standalone: true, imports: [ButtonComponent, MenuComponent, MenuContentComponent, MenuItemComponent, TranslocoPipe, FeedbackDialogComponent], providers: [provideTranslocoScope('feedback')], template: "<menu>\n <button class=\"border border-gray-200 p-5\" variant=\"ghost\" title=\"{{'feedback.button' | transloco }}\">\n <i class=\"fa-fw far fa-commenting\" aria-hidden=\"true\"></i>\n {{ 'feedback.label' | transloco }}\n <i class=\"fa-fw fas fa-xmark ms-2\" (click)=\"close($event);\" aria-hidden=\"true\"></i>\n </button>\n\n <MenuContent>\n @if (!disliked()) {\n <menuitem (click)=\"like()\" [attr.aria-label]=\"'feedback.like' | transloco\">\n @if (liked()) {\n <i class=\"fa-fw fas fa-thumbs-up\"></i> {{ 'feedback.liked' | transloco }} } @else { <i class=\"fa-fw far fa-thumbs-up\"></i> {{ 'feedback.like' | transloco\n }} }\n </menuitem>\n } @if (!liked()) {\n <menuitem (click)=\"dislike()\" [attr.aria-label]=\"'feedback.dislike' | transloco\">\n @if (disliked()) {\n <i class=\"fa-fw fas fa-thumbs-down\"></i> {{ 'feedback.disliked' | transloco }} } @else { <i class=\"fa-fw far fa-thumbs-down\"></i> {{ 'feedback.dislike' |\n transloco }} }\n </menuitem>\n } @for (menu of menus; track $index) {\n <menuitem (click)=\"openFeedbackDialog(menu.type)\" [attr.aria-label]=\"'feedback.' + menu.type + '.title' | transloco\">\n <i class=\"fa-fw {{menu.icon}}\"></i> {{ 'feedback.' + menu.type + '.title' | transloco }}\n </menuitem>\n }\n </MenuContent>\n</menu>\n\n<feedback-dialog />\n" }]
9183
+ args: [{ selector: 'feedback, Feedback', standalone: true, imports: [ButtonComponent, MenuComponent, MenuContentComponent, MenuItemComponent, TranslocoPipe, FeedbackDialogComponent], providers: [provideTranslocoScope('feedback')], template: "<menu>\n <button class=\"border-foreground/18 border p-5\" variant=\"ghost\" title=\"{{ 'feedback.button' | transloco }}\">\n <i class=\"fa-fw far fa-commenting\" aria-hidden=\"true\"></i>\n {{ 'feedback.label' | transloco }}\n <i class=\"fa-fw fas fa-xmark ms-2\" (click)=\"close($event)\" aria-hidden=\"true\"></i>\n </button>\n\n <MenuContent>\n @if (!disliked()) {\n <menuitem (click)=\"like()\" [attr.aria-label]=\"'feedback.like' | transloco\">\n @if (liked()) {\n <i class=\"fa-fw fas fa-thumbs-up\"></i> {{ 'feedback.liked' | transloco }}\n } @else {\n <i class=\"fa-fw far fa-thumbs-up\"></i> {{ 'feedback.like' | transloco }}\n }\n </menuitem>\n }\n @if (!liked()) {\n <menuitem (click)=\"dislike()\" [attr.aria-label]=\"'feedback.dislike' | transloco\">\n @if (disliked()) {\n <i class=\"fa-fw fas fa-thumbs-down\"></i> {{ 'feedback.disliked' | transloco }}\n } @else {\n <i class=\"fa-fw far fa-thumbs-down\"></i> {{ 'feedback.dislike' | transloco }}\n }\n </menuitem>\n }\n @for (menu of menus; track $index) {\n <menuitem (click)=\"openFeedbackDialog(menu.type)\" [attr.aria-label]=\"'feedback.' + menu.type + '.title' | transloco\">\n <i class=\"fa-fw {{ menu.icon }}\"></i> {{ 'feedback.' + menu.type + '.title' | transloco }}\n </menuitem>\n }\n </MenuContent>\n</menu>\n\n<feedback-dialog />\n" }]
9010
9184
  }] });
9011
9185
 
9012
9186
  class AggregationItemComponent {
@@ -9048,10 +9222,10 @@ class AggregationItemComponent {
9048
9222
  }
9049
9223
  this.onOpen.emit(node);
9050
9224
  }
9051
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: AggregationItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9052
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: AggregationItemComponent, isStandalone: true, selector: "aggregation-item, AggregationItem, aggregationitem", inputs: { node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { onSelect: "onSelect", onOpen: "onOpen" }, host: { properties: { "attr.disabled": "this.disabled" } }, ngImport: i0, template: "<a\n role=\"listitem\"\n [attr.aria-selected]=\"node().$selected\"\n [attr.aria-label]=\"name() | syslang\"\n [style.--level]=\"level()\"\n [class]=\"\n cn(\n 'flex grow items-center gap-2 p-1 leading-7',\n node().count === 0 && 'disabled pointer-events-none text-neutral-300',\n node().$selected && 'bg-primary-100 text-primary'\n )\n \"\n (click)=\"select($event, node())\">\n <!-- chrevron is visible only if the node has children -->\n <button (click)=\"open($event, node())\" class=\"transition-transform ease-in hover:scale-125\" aria-label=\"Open\">\n <ChevronRight [class]=\"cn('size-4 translate-x-1', node().$opened && 'rotate-90', !node().hasChildren && 'hidden')\" width=\"16\" height=\"16\" />\n </button>\n\n <input\n type=\"checkbox\"\n role=\"checkbox\"\n value=\"{{ node().value }}\"\n [attr.disabled]=\"node().count === 0 ? true : null\"\n [attr.aria-disabled]=\"node().count === 0\"\n (keydown.enter)=\"select($event, node())\"\n [checked]=\"node().$selected\" />\n\n @if (node().icon) {\n <i class=\"fa-fw {{ node().icon }} self-center justify-self-center\" aria-hidden=\"true\"></i>\n }\n <p class=\"line-clamp-1 text-ellipsis break-all\" [title]=\"name() | syslang\">\n @for (chunk of (name() | syslang) ?? '' | highlightWord: searchText() : 10; track $index) {\n <span [class]=\"{ 'font-bold': chunk.match }\" aria-hidden=\"true\">{{ chunk.text }}</span>\n }\n </p>\n</a>\n\n@if (node().hasChildren && node().$opened) {\n @for (item of node().items; track $index) {\n <AggregationItem [node]=\"item\" (onOpen)=\"onOpen.emit($event)\" (onSelect)=\"onSelect.emit($event)\" />\n }\n}\n", styles: [":host{display:block;-webkit-user-select:none;user-select:none}:host a{padding-left:calc((var(--agg-tree-indent, .5rem) * var(--level)))}a{line-height:var(--agg-item-height, inherit)}\n"], dependencies: [{ kind: "component", type: AggregationItemComponent, selector: "aggregation-item, AggregationItem, aggregationitem", inputs: ["node"], outputs: ["onSelect", "onOpen"] }, { kind: "directive", type: ListItemComponent, selector: "[role=\"listitem\"], [role=\"option\"]", inputs: ["class", "variant"] }, { kind: "component", type: ChevronRightIconComponent, selector: "chevron-right, ChevronRight, chevronright", inputs: ["class", "width", "height"] }, { kind: "pipe", type: HighlightWordPipe, name: "highlightWord" }, { kind: "pipe", type: SyslangPipe, name: "syslang" }] });
9225
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: AggregationItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9226
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: AggregationItemComponent, isStandalone: true, selector: "aggregation-item, AggregationItem, aggregationitem", inputs: { node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { onSelect: "onSelect", onOpen: "onOpen" }, host: { properties: { "attr.disabled": "this.disabled" } }, ngImport: i0, template: "<a\n role=\"listitem\"\n [attr.aria-selected]=\"node().$selected\"\n [attr.aria-label]=\"name() | syslang\"\n [style.--level]=\"level()\"\n [class]=\"\n cn(\n 'flex grow items-center gap-2 p-1 leading-7',\n node().count === 0 && 'disabled pointer-events-none text-neutral-300',\n node().$selected && 'bg-primary-100 text-primary'\n )\n \"\n (click)=\"select($event, node())\">\n <!-- chrevron is visible only if the node has children -->\n <button (click)=\"open($event, node())\" class=\"transition-transform ease-in hover:scale-125\" aria-label=\"Open\">\n <ChevronRight [class]=\"cn('size-4 translate-x-1', node().$opened && 'rotate-90', !node().hasChildren && 'hidden')\" width=\"16\" height=\"16\" />\n </button>\n\n <input\n type=\"checkbox\"\n role=\"checkbox\"\n value=\"{{ node().value }}\"\n [attr.disabled]=\"node().count === 0 ? true : null\"\n [attr.aria-disabled]=\"node().count === 0\"\n (keydown.enter)=\"select($event, node())\"\n [checked]=\"node().$selected\" />\n\n @if (node().icon) {\n <i class=\"fa-fw {{ node().icon }} self-center justify-self-center\" aria-hidden=\"true\"></i>\n }\n <p class=\"line-clamp-1 text-ellipsis break-all\" [title]=\"name() | syslang\">\n @for (chunk of (name() | syslang) ?? '' | highlightWord: searchText() : 10; track $index) {\n <span [class]=\"{ 'font-bold': chunk.match }\" aria-hidden=\"true\">{{ chunk.text }}</span>\n }\n </p>\n</a>\n\n@if (node().hasChildren && node().$opened) {\n @for (item of node().items; track $index) {\n <AggregationItem [node]=\"item\" (onOpen)=\"onOpen.emit($event)\" (onSelect)=\"onSelect.emit($event)\" />\n }\n}\n", styles: [":host{display:block;-webkit-user-select:none;user-select:none}:host a{padding-left:calc((var(--agg-tree-indent, .5rem) * var(--level)))}a{line-height:var(--agg-item-height, inherit)}\n"], dependencies: [{ kind: "component", type: AggregationItemComponent, selector: "aggregation-item, AggregationItem, aggregationitem", inputs: ["node"], outputs: ["onSelect", "onOpen"] }, { kind: "directive", type: ListItemComponent, selector: "[role=\"listitem\"], [role=\"option\"]", inputs: ["class", "variant", "decoration"] }, { kind: "component", type: ChevronRightIconComponent, selector: "chevron-right, ChevronRight, chevronright", inputs: ["class"] }, { kind: "pipe", type: HighlightWordPipe, name: "highlightWord" }, { kind: "pipe", type: SyslangPipe, name: "syslang" }] });
9053
9227
  }
9054
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: AggregationItemComponent, decorators: [{
9228
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: AggregationItemComponent, decorators: [{
9055
9229
  type: Component,
9056
9230
  args: [{ selector: 'aggregation-item, AggregationItem, aggregationitem', standalone: true, imports: [HighlightWordPipe, ListItemComponent, SyslangPipe, ChevronRightIconComponent], template: "<a\n role=\"listitem\"\n [attr.aria-selected]=\"node().$selected\"\n [attr.aria-label]=\"name() | syslang\"\n [style.--level]=\"level()\"\n [class]=\"\n cn(\n 'flex grow items-center gap-2 p-1 leading-7',\n node().count === 0 && 'disabled pointer-events-none text-neutral-300',\n node().$selected && 'bg-primary-100 text-primary'\n )\n \"\n (click)=\"select($event, node())\">\n <!-- chrevron is visible only if the node has children -->\n <button (click)=\"open($event, node())\" class=\"transition-transform ease-in hover:scale-125\" aria-label=\"Open\">\n <ChevronRight [class]=\"cn('size-4 translate-x-1', node().$opened && 'rotate-90', !node().hasChildren && 'hidden')\" width=\"16\" height=\"16\" />\n </button>\n\n <input\n type=\"checkbox\"\n role=\"checkbox\"\n value=\"{{ node().value }}\"\n [attr.disabled]=\"node().count === 0 ? true : null\"\n [attr.aria-disabled]=\"node().count === 0\"\n (keydown.enter)=\"select($event, node())\"\n [checked]=\"node().$selected\" />\n\n @if (node().icon) {\n <i class=\"fa-fw {{ node().icon }} self-center justify-self-center\" aria-hidden=\"true\"></i>\n }\n <p class=\"line-clamp-1 text-ellipsis break-all\" [title]=\"name() | syslang\">\n @for (chunk of (name() | syslang) ?? '' | highlightWord: searchText() : 10; track $index) {\n <span [class]=\"{ 'font-bold': chunk.match }\" aria-hidden=\"true\">{{ chunk.text }}</span>\n }\n </p>\n</a>\n\n@if (node().hasChildren && node().$opened) {\n @for (item of node().items; track $index) {\n <AggregationItem [node]=\"item\" (onOpen)=\"onOpen.emit($event)\" (onSelect)=\"onSelect.emit($event)\" />\n }\n}\n", styles: [":host{display:block;-webkit-user-select:none;user-select:none}:host a{padding-left:calc((var(--agg-tree-indent, .5rem) * var(--level)))}a{line-height:var(--agg-item-height, inherit)}\n"] }]
9057
9231
  }], propDecorators: { disabled: [{
@@ -9091,7 +9265,7 @@ class AggregationComponent {
9091
9265
  * A boolean flag indicating whether we want to see the filters count when some is applied
9092
9266
  * This property is initialized to `false` by default.
9093
9267
  */
9094
- showCount = input(false, ...(ngDevMode ? [{ debugName: "showCount" }] : []));
9268
+ showFiltersCount = input(false, ...(ngDevMode ? [{ debugName: "showFiltersCount" }] : []));
9095
9269
  /* aggregation */
9096
9270
  aggregation = computed(() => {
9097
9271
  // when the aggegation store updates, we need to check if the aggregation is still valid
@@ -9410,15 +9584,14 @@ class AggregationComponent {
9410
9584
  }
9411
9585
  return currentItems;
9412
9586
  }
9413
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: AggregationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9414
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: AggregationComponent, isStandalone: true, selector: "Aggregation, aggregation", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null }, column: { classPropertyName: "column", publicName: "column", isSignal: true, isRequired: true, transformFunction: null }, headless: { classPropertyName: "headless", publicName: "headless", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, showCount: { classPropertyName: "showCount", publicName: "showCount", isSignal: true, isRequired: false, transformFunction: null }, searchText: { classPropertyName: "searchText", publicName: "searchText", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onSelect: "onSelect", searchText: "searchTextChange" }, host: { properties: { "style.--header-height": "`${this.computeHeight()}rem`" }, classAttribute: "d-flex flex-column h-100" }, ngImport: i0, template: "<fieldset class=\"flex flex-col gap-2\">\n @if (!headless()) {\n <legend class=\"mb-1 flex h-8 w-full select-none items-center pl-1 text-sm font-semibold text-gray-600\">\n <ng-content select=\"label\">\n @if (aggregation()?.icon) {\n <i class=\"fa-fw {{ aggregation()?.icon }} mr-1\" aria-hidden=\"true\"></i>\n }\n <span class=\"grow\">{{ aggregation()?.display | syslang | transloco }}</span>\n </ng-content>\n\n @if (showCount() && filtersCount() > 0) {\n <!-- count -->\n <Badge>\n {{ filtersCount() }}\n </Badge>\n }\n @if (hasFilters()) {\n <button\n variant=\"ghost\"\n size=\"icon\"\n [attr.title]=\"'filters.clearFilters' | transloco\"\n [attr.aria-label]=\"'filters.clearFilters' | transloco\"\n (click)=\"clear()\">\n <i class=\"fa-fw far fa-filter-circle-xmark\"></i>\n </button>\n }\n @if (selection()) {\n <button\n variant=\"ghost\"\n size=\"icon\"\n [attr.title]=\"'filters.applyFilters' | transloco\"\n [attr.aria-label]=\"'filters.applyFilters' | transloco\"\n (click)=\"apply()\">\n <i class=\"fa-fw far fa-filter\"></i>\n </button>\n }\n </legend>\n }\n\n @if (aggregation()?.searchable && items().length) {\n <input type=\"text\" [placeholder]=\"'search' | transloco\" [(ngModel)]=\"searchText\" />\n }\n\n <ul class=\"snap-y snap-start overflow-auto\" role=\"list\" [attr.aria-label]=\"aggregation()?.display | syslang | transloco\">\n @for (item of items(); track $index) {\n <AggregationItem [node]=\"item\" (onSelect)=\"select()\" (onOpen)=\"open($event)\" />\n }\n </ul>\n @if (aggregation()?.$hasMore && this.searchedItems().length === 0) {\n <button variant=\"link\" class=\"mt-1 flex w-full justify-center\" [attr.aria-label]=\"'loadMore' | transloco\" (click)=\"loadMore()\">\n {{ 'loadMore' | transloco }}\n </button>\n }\n</fieldset>\n", styles: [":host{display:block}fieldset{height:100%;max-height:inherit;scrollbar-width:thin}ul[role=list]{scrollbar-width:inherit;max-height:calc(100vh - var(--header-height, 0px) - var(--agg-header-height, 0px))}AggregationItem:has(+AggregationItem){margin-bottom:var(--agg-item-gap, inherit)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "directive", type: InputComponent, selector: "input[type=\"text\"], input[type=\"email\"], input[type=\"password\"], input[type=\"number\"], input[type=\"tel\"], input[type=\"url\"], input[type=\"time\"]", inputs: ["class", "variant"] }, { kind: "component", type: AggregationItemComponent, selector: "aggregation-item, AggregationItem, aggregationitem", inputs: ["node"], outputs: ["onSelect", "onOpen"] }, { kind: "directive", type: BadgeComponent, selector: "badge, Badge", inputs: ["class", "variant"] }, { kind: "pipe", type: SyslangPipe, name: "syslang" }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
9587
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: AggregationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9588
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: AggregationComponent, isStandalone: true, selector: "Aggregation, aggregation", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null }, column: { classPropertyName: "column", publicName: "column", isSignal: true, isRequired: true, transformFunction: null }, headless: { classPropertyName: "headless", publicName: "headless", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, showFiltersCount: { classPropertyName: "showFiltersCount", publicName: "showFiltersCount", isSignal: true, isRequired: false, transformFunction: null }, searchText: { classPropertyName: "searchText", publicName: "searchText", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onSelect: "onSelect", searchText: "searchTextChange" }, host: { properties: { "style.--header-height": "`${this.computeHeight()}rem`" } }, ngImport: i0, template: "<fieldset class=\"flex flex-col gap-2\">\n @if (!headless()) {\n <legend class=\"text-muted-foreground mb-1 flex h-8 w-full select-none items-center pl-1 text-sm font-semibold\">\n <ng-content select=\"label\">\n @if (aggregation()?.icon) {\n <i class=\"fa-fw {{ aggregation()?.icon }} mr-1\" aria-hidden=\"true\"></i>\n }\n <span class=\"grow\">{{ aggregation()?.display | syslang | transloco }}</span>\n </ng-content>\n\n @if (showFiltersCount() && filtersCount() > 0) {\n <!-- count -->\n <Badge>\n {{ filtersCount() }}\n </Badge>\n }\n @if (hasFilters()) {\n <button\n variant=\"ghost\"\n size=\"icon\"\n [attr.title]=\"'filters.clearFilters' | transloco\"\n [attr.aria-label]=\"'filters.clearFilters' | transloco\"\n (click)=\"clear()\">\n <i class=\"fa-fw far fa-filter-circle-xmark\"></i>\n </button>\n }\n @if (selection()) {\n <button\n variant=\"ghost\"\n size=\"icon\"\n [attr.title]=\"'filters.applyFilters' | transloco\"\n [attr.aria-label]=\"'filters.applyFilters' | transloco\"\n (click)=\"apply()\">\n <i class=\"fa-fw far fa-filter\"></i>\n </button>\n }\n </legend>\n }\n\n @if (aggregation()?.searchable && items().length) {\n <input type=\"text\" [placeholder]=\"'search' | transloco\" [(ngModel)]=\"searchText\" />\n }\n\n <ul class=\"snap-y snap-start overflow-auto\" role=\"list\" [attr.aria-label]=\"aggregation()?.display | syslang | transloco\">\n @for (item of items(); track $index) {\n <AggregationItem [node]=\"item\" (onSelect)=\"select()\" (onOpen)=\"open($event)\" />\n }\n </ul>\n @if (aggregation()?.$hasMore && this.searchedItems().length === 0) {\n <button decoration=\"underline\" class=\"mt-1 flex w-full justify-center\" [attr.aria-label]=\"'loadMore' | transloco\" (click)=\"loadMore()\">\n {{ 'loadMore' | transloco }}\n </button>\n }\n</fieldset>\n", styles: [":host{display:block}fieldset{height:100%;max-height:inherit;scrollbar-width:thin}ul[role=list]{scrollbar-width:inherit;max-height:calc(100vh - var(--header-height, 0px) - var(--agg-header-height, 0px))}AggregationItem:has(+AggregationItem){margin-bottom:var(--agg-item-gap, inherit)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "decoration", "size"] }, { kind: "directive", type: InputComponent, selector: "input[type=\"text\"], input[type=\"email\"], input[type=\"number\"], input[type=\"password\"], input[type=\"tel\"], input[type=\"url\"], input[type=\"time\"]", inputs: ["class", "variant", "decoration"] }, { kind: "component", type: AggregationItemComponent, selector: "aggregation-item, AggregationItem, aggregationitem", inputs: ["node"], outputs: ["onSelect", "onOpen"] }, { kind: "directive", type: BadgeComponent, selector: "badge, Badge", inputs: ["class", "variant", "size", "decoration", "hover"] }, { kind: "pipe", type: SyslangPipe, name: "syslang" }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
9415
9589
  }
9416
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: AggregationComponent, decorators: [{
9590
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: AggregationComponent, decorators: [{
9417
9591
  type: Component,
9418
9592
  args: [{ selector: 'Aggregation, aggregation', imports: [FormsModule, ReactiveFormsModule, ButtonComponent, InputComponent, AggregationItemComponent, SyslangPipe, TranslocoPipe, BadgeComponent], standalone: true, host: {
9419
- class: 'd-flex flex-column h-100',
9420
9593
  '[style.--header-height]': '`${this.computeHeight()}rem`'
9421
- }, template: "<fieldset class=\"flex flex-col gap-2\">\n @if (!headless()) {\n <legend class=\"mb-1 flex h-8 w-full select-none items-center pl-1 text-sm font-semibold text-gray-600\">\n <ng-content select=\"label\">\n @if (aggregation()?.icon) {\n <i class=\"fa-fw {{ aggregation()?.icon }} mr-1\" aria-hidden=\"true\"></i>\n }\n <span class=\"grow\">{{ aggregation()?.display | syslang | transloco }}</span>\n </ng-content>\n\n @if (showCount() && filtersCount() > 0) {\n <!-- count -->\n <Badge>\n {{ filtersCount() }}\n </Badge>\n }\n @if (hasFilters()) {\n <button\n variant=\"ghost\"\n size=\"icon\"\n [attr.title]=\"'filters.clearFilters' | transloco\"\n [attr.aria-label]=\"'filters.clearFilters' | transloco\"\n (click)=\"clear()\">\n <i class=\"fa-fw far fa-filter-circle-xmark\"></i>\n </button>\n }\n @if (selection()) {\n <button\n variant=\"ghost\"\n size=\"icon\"\n [attr.title]=\"'filters.applyFilters' | transloco\"\n [attr.aria-label]=\"'filters.applyFilters' | transloco\"\n (click)=\"apply()\">\n <i class=\"fa-fw far fa-filter\"></i>\n </button>\n }\n </legend>\n }\n\n @if (aggregation()?.searchable && items().length) {\n <input type=\"text\" [placeholder]=\"'search' | transloco\" [(ngModel)]=\"searchText\" />\n }\n\n <ul class=\"snap-y snap-start overflow-auto\" role=\"list\" [attr.aria-label]=\"aggregation()?.display | syslang | transloco\">\n @for (item of items(); track $index) {\n <AggregationItem [node]=\"item\" (onSelect)=\"select()\" (onOpen)=\"open($event)\" />\n }\n </ul>\n @if (aggregation()?.$hasMore && this.searchedItems().length === 0) {\n <button variant=\"link\" class=\"mt-1 flex w-full justify-center\" [attr.aria-label]=\"'loadMore' | transloco\" (click)=\"loadMore()\">\n {{ 'loadMore' | transloco }}\n </button>\n }\n</fieldset>\n", styles: [":host{display:block}fieldset{height:100%;max-height:inherit;scrollbar-width:thin}ul[role=list]{scrollbar-width:inherit;max-height:calc(100vh - var(--header-height, 0px) - var(--agg-header-height, 0px))}AggregationItem:has(+AggregationItem){margin-bottom:var(--agg-item-gap, inherit)}\n"] }]
9594
+ }, template: "<fieldset class=\"flex flex-col gap-2\">\n @if (!headless()) {\n <legend class=\"text-muted-foreground mb-1 flex h-8 w-full select-none items-center pl-1 text-sm font-semibold\">\n <ng-content select=\"label\">\n @if (aggregation()?.icon) {\n <i class=\"fa-fw {{ aggregation()?.icon }} mr-1\" aria-hidden=\"true\"></i>\n }\n <span class=\"grow\">{{ aggregation()?.display | syslang | transloco }}</span>\n </ng-content>\n\n @if (showFiltersCount() && filtersCount() > 0) {\n <!-- count -->\n <Badge>\n {{ filtersCount() }}\n </Badge>\n }\n @if (hasFilters()) {\n <button\n variant=\"ghost\"\n size=\"icon\"\n [attr.title]=\"'filters.clearFilters' | transloco\"\n [attr.aria-label]=\"'filters.clearFilters' | transloco\"\n (click)=\"clear()\">\n <i class=\"fa-fw far fa-filter-circle-xmark\"></i>\n </button>\n }\n @if (selection()) {\n <button\n variant=\"ghost\"\n size=\"icon\"\n [attr.title]=\"'filters.applyFilters' | transloco\"\n [attr.aria-label]=\"'filters.applyFilters' | transloco\"\n (click)=\"apply()\">\n <i class=\"fa-fw far fa-filter\"></i>\n </button>\n }\n </legend>\n }\n\n @if (aggregation()?.searchable && items().length) {\n <input type=\"text\" [placeholder]=\"'search' | transloco\" [(ngModel)]=\"searchText\" />\n }\n\n <ul class=\"snap-y snap-start overflow-auto\" role=\"list\" [attr.aria-label]=\"aggregation()?.display | syslang | transloco\">\n @for (item of items(); track $index) {\n <AggregationItem [node]=\"item\" (onSelect)=\"select()\" (onOpen)=\"open($event)\" />\n }\n </ul>\n @if (aggregation()?.$hasMore && this.searchedItems().length === 0) {\n <button decoration=\"underline\" class=\"mt-1 flex w-full justify-center\" [attr.aria-label]=\"'loadMore' | transloco\" (click)=\"loadMore()\">\n {{ 'loadMore' | transloco }}\n </button>\n }\n</fieldset>\n", styles: [":host{display:block}fieldset{height:100%;max-height:inherit;scrollbar-width:thin}ul[role=list]{scrollbar-width:inherit;max-height:calc(100vh - var(--header-height, 0px) - var(--agg-header-height, 0px))}AggregationItem:has(+AggregationItem){margin-bottom:var(--agg-item-gap, inherit)}\n"] }]
9422
9595
  }], ctorParameters: () => [] });
9423
9596
 
9424
9597
  /**
@@ -9583,12 +9756,12 @@ class DateComponent extends AggregationComponent {
9583
9756
  }
9584
9757
  throw new Error('filters.filterInvalid');
9585
9758
  }
9586
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: DateComponent, deps: [{ token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Component });
9587
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: DateComponent, isStandalone: true, selector: "date-filter,DateFilter", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, displayEmptyDistributionIntervals: { classPropertyName: "displayEmptyDistributionIntervals", publicName: "displayEmptyDistributionIntervals", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideTranslocoScope('filters')], usesInheritance: true, ngImport: i0, template: "<form [formGroup]=\"form\">\n <fieldset class=\"overflow-auto\">\n @if (!headless()) {\n <legend class=\"mb-1 flex h-8 w-full select-none items-center pl-1 text-sm font-semibold text-gray-600\">\n <p class=\"me-4 grow\">\n <i class=\"fa-fw {{ title().icon }}\" aria-hidden=\"true\"></i>\n {{ title().label | syslang | transloco }}\n </p>\n <div class=\"ms-4\">\n @if (hasFilters()) {\n <button\n variant=\"ghost\"\n size=\"icon\"\n [attr.title]=\"'filters.clearFilters' | transloco\"\n [attr.aria-label]=\"'filters.clearFilters' | transloco\"\n (click)=\"clear()\"\n (keydown.enter)=\"clear()\">\n <i class=\"fa-fw far fa-filter-circle-xmark\" aria-hidden=\"true\"></i>\n </button>\n }\n\n @if (selection() && validSelection()) {\n <button\n variant=\"ghost\"\n size=\"icon\"\n [attr.title]=\"'filters.applyFilters' | transloco\"\n [attr.aria-label]=\"'filters.applyFilters' | transloco\"\n (click)=\"apply()\"\n (keydown.enter)=\"apply()\">\n <i class=\"fa-fw far fa-filter\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </legend>\n }\n\n <ul class=\"flex flex-col gap-1 pt-2\" role=\"list\">\n @for (option of dateOptions(); track $index) {\n <li\n role=\"listitem\"\n tabindex=\"0\"\n (click)=\"radio.click()\"\n [attr.aria-label]=\"option.display | syslang | transloco\"\n [class]=\"\n cn(\n 'flex p-0 px-2 leading-7',\n form.get('option')?.value === option.display && 'bg-accent',\n option.hidden && 'hidden',\n option.disabled && 'disabled pointer-events-none text-neutral-300'\n )\n \"\n [attr.aria-hidden]=\"option.disabled\">\n <input\n #radio\n type=\"radio\"\n formControlName=\"option\"\n id=\"date-filter-{{ option.display }}\"\n [attr.disabled]=\"option.disabled ? true : null\"\n [attr.aria-disabled]=\"option.disabled\"\n (click)=\"select()\"\n value=\"{{ option.display }}\" />\n\n <label for=\"date-filter-{{ option.display }}\" class=\"grow cursor-pointer p-1\">\n {{ option.display | syslang | transloco }}\n </label>\n </li>\n }\n\n @if (allowCustomRange) {\n <li role=\"listitem\" aria-label=\"custom range\" class=\"flex px-2 leading-7\" [ngClass]=\"{ selected: form.get('option')?.value === 'custom-range' }\">\n <input #radiorange type=\"radio\" formControlName=\"option\" id=\"date-filter-custom-range\" value=\"custom-range\" (click)=\"select()\" />\n\n <div class=\"grid grow grid-cols-[4rem_auto] p-1 *:cursor-pointer\" formGroupName=\"customRange\" (click)=\"radiorange.click()\">\n <label for=\"date-filter-custom-from\">{{ 'from' | transloco }}</label>\n\n <input\n class=\"grow border-b border-neutral-400 bg-transparent text-neutral-600\"\n type=\"date\"\n id=\"date-filter-custom-from\"\n #dateFilterCustomFrom\n formControlName=\"from\"\n [max]=\"form.get('customRange.to')?.value ?? today\" />\n\n <label for=\"date-filter-custom-to\">{{ 'to' | transloco }}</label>\n\n <input\n class=\"border-b border-neutral-400 bg-transparent text-neutral-600\"\n type=\"date\"\n id=\"date-filter-custom-to\"\n formControlName=\"to\"\n [min]=\"form.get('customRange.from')?.value\"\n [max]=\"today\" />\n </div>\n </li>\n }\n </ul>\n </fieldset>\n</form>\n", styles: [":host{display:block}ul[role=list]{scrollbar-width:thin}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "directive", type: ListItemComponent, selector: "[role=\"listitem\"], [role=\"option\"]", inputs: ["class", "variant"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }, { kind: "pipe", type: SyslangPipe, name: "syslang" }] });
9759
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: DateComponent, deps: [{ token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Component });
9760
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: DateComponent, isStandalone: true, selector: "date-filter,DateFilter", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, displayEmptyDistributionIntervals: { classPropertyName: "displayEmptyDistributionIntervals", publicName: "displayEmptyDistributionIntervals", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideTranslocoScope('filters')], usesInheritance: true, ngImport: i0, template: "<form [formGroup]=\"form\">\n <fieldset class=\"overflow-auto\">\n @if (!headless()) {\n <legend class=\"text-muted-foreground mb-1 flex h-8 w-full select-none items-center pl-1 text-sm font-semibold\">\n <p class=\"me-4 grow\">\n <i class=\"fa-fw {{ title().icon }}\" aria-hidden=\"true\"></i>\n {{ title().label | syslang | transloco }}\n </p>\n <div class=\"ms-4\">\n @if (hasFilters()) {\n <button\n variant=\"ghost\"\n size=\"icon\"\n [attr.title]=\"'filters.clearFilters' | transloco\"\n [attr.aria-label]=\"'filters.clearFilters' | transloco\"\n (click)=\"clear()\"\n (keydown.enter)=\"clear()\">\n <i class=\"fa-fw far fa-filter-circle-xmark\" aria-hidden=\"true\"></i>\n </button>\n }\n\n @if (selection() && validSelection()) {\n <button\n variant=\"ghost\"\n size=\"icon\"\n [attr.title]=\"'filters.applyFilters' | transloco\"\n [attr.aria-label]=\"'filters.applyFilters' | transloco\"\n (click)=\"apply()\"\n (keydown.enter)=\"apply()\">\n <i class=\"fa-fw far fa-filter\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </legend>\n }\n\n <ul class=\"flex flex-col gap-1 pt-2\" role=\"list\">\n @for (option of dateOptions(); track $index) {\n <li\n role=\"listitem\"\n tabindex=\"0\"\n (click)=\"radio.click()\"\n [attr.aria-label]=\"option.display | syslang | transloco\"\n [class]=\"\n cn(\n 'flex p-0 px-2 leading-7',\n form.get('option')?.value === option.display && 'bg-accent',\n option.hidden && 'hidden',\n option.disabled && 'disabled pointer-events-none text-neutral-300'\n )\n \"\n [attr.aria-hidden]=\"option.disabled\">\n <input\n #radio\n type=\"radio\"\n formControlName=\"option\"\n id=\"date-filter-{{ option.display }}\"\n [attr.disabled]=\"option.disabled ? true : null\"\n [attr.aria-disabled]=\"option.disabled\"\n (click)=\"select()\"\n value=\"{{ option.display }}\" />\n\n <label for=\"date-filter-{{ option.display }}\" class=\"grow cursor-pointer p-1\">\n {{ option.display | syslang | transloco }}\n </label>\n </li>\n }\n\n @if (allowCustomRange) {\n <li role=\"listitem\" aria-label=\"custom range\" class=\"flex px-2 leading-7\" [ngClass]=\"{ selected: form.get('option')?.value === 'custom-range' }\">\n <input #radiorange type=\"radio\" formControlName=\"option\" id=\"date-filter-custom-range\" value=\"custom-range\" (click)=\"select()\" />\n\n <div class=\"grid grow grid-cols-[4rem_auto] p-1 *:cursor-pointer\" formGroupName=\"customRange\" (click)=\"radiorange.click()\">\n <label for=\"date-filter-custom-from\">{{ 'from' | transloco }}</label>\n\n <input\n class=\"grow border-b border-neutral-400 bg-transparent text-neutral-600\"\n type=\"date\"\n id=\"date-filter-custom-from\"\n #dateFilterCustomFrom\n formControlName=\"from\"\n [max]=\"form.get('customRange.to')?.value ?? today\" />\n\n <label for=\"date-filter-custom-to\">{{ 'to' | transloco }}</label>\n\n <input\n class=\"border-b border-neutral-400 bg-transparent text-neutral-600\"\n type=\"date\"\n id=\"date-filter-custom-to\"\n formControlName=\"to\"\n [min]=\"form.get('customRange.from')?.value\"\n [max]=\"today\" />\n </div>\n </li>\n }\n </ul>\n </fieldset>\n</form>\n", styles: [":host{display:block}ul[role=list]{scrollbar-width:thin}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "decoration", "size"] }, { kind: "directive", type: ListItemComponent, selector: "[role=\"listitem\"], [role=\"option\"]", inputs: ["class", "variant", "decoration"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }, { kind: "pipe", type: SyslangPipe, name: "syslang" }] });
9588
9761
  }
9589
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: DateComponent, decorators: [{
9762
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: DateComponent, decorators: [{
9590
9763
  type: Component,
9591
- args: [{ selector: 'date-filter,DateFilter', standalone: true, providers: [provideTranslocoScope('filters')], imports: [NgClass, ButtonComponent, ListItemComponent, ReactiveFormsModule, TranslocoPipe, SyslangPipe], template: "<form [formGroup]=\"form\">\n <fieldset class=\"overflow-auto\">\n @if (!headless()) {\n <legend class=\"mb-1 flex h-8 w-full select-none items-center pl-1 text-sm font-semibold text-gray-600\">\n <p class=\"me-4 grow\">\n <i class=\"fa-fw {{ title().icon }}\" aria-hidden=\"true\"></i>\n {{ title().label | syslang | transloco }}\n </p>\n <div class=\"ms-4\">\n @if (hasFilters()) {\n <button\n variant=\"ghost\"\n size=\"icon\"\n [attr.title]=\"'filters.clearFilters' | transloco\"\n [attr.aria-label]=\"'filters.clearFilters' | transloco\"\n (click)=\"clear()\"\n (keydown.enter)=\"clear()\">\n <i class=\"fa-fw far fa-filter-circle-xmark\" aria-hidden=\"true\"></i>\n </button>\n }\n\n @if (selection() && validSelection()) {\n <button\n variant=\"ghost\"\n size=\"icon\"\n [attr.title]=\"'filters.applyFilters' | transloco\"\n [attr.aria-label]=\"'filters.applyFilters' | transloco\"\n (click)=\"apply()\"\n (keydown.enter)=\"apply()\">\n <i class=\"fa-fw far fa-filter\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </legend>\n }\n\n <ul class=\"flex flex-col gap-1 pt-2\" role=\"list\">\n @for (option of dateOptions(); track $index) {\n <li\n role=\"listitem\"\n tabindex=\"0\"\n (click)=\"radio.click()\"\n [attr.aria-label]=\"option.display | syslang | transloco\"\n [class]=\"\n cn(\n 'flex p-0 px-2 leading-7',\n form.get('option')?.value === option.display && 'bg-accent',\n option.hidden && 'hidden',\n option.disabled && 'disabled pointer-events-none text-neutral-300'\n )\n \"\n [attr.aria-hidden]=\"option.disabled\">\n <input\n #radio\n type=\"radio\"\n formControlName=\"option\"\n id=\"date-filter-{{ option.display }}\"\n [attr.disabled]=\"option.disabled ? true : null\"\n [attr.aria-disabled]=\"option.disabled\"\n (click)=\"select()\"\n value=\"{{ option.display }}\" />\n\n <label for=\"date-filter-{{ option.display }}\" class=\"grow cursor-pointer p-1\">\n {{ option.display | syslang | transloco }}\n </label>\n </li>\n }\n\n @if (allowCustomRange) {\n <li role=\"listitem\" aria-label=\"custom range\" class=\"flex px-2 leading-7\" [ngClass]=\"{ selected: form.get('option')?.value === 'custom-range' }\">\n <input #radiorange type=\"radio\" formControlName=\"option\" id=\"date-filter-custom-range\" value=\"custom-range\" (click)=\"select()\" />\n\n <div class=\"grid grow grid-cols-[4rem_auto] p-1 *:cursor-pointer\" formGroupName=\"customRange\" (click)=\"radiorange.click()\">\n <label for=\"date-filter-custom-from\">{{ 'from' | transloco }}</label>\n\n <input\n class=\"grow border-b border-neutral-400 bg-transparent text-neutral-600\"\n type=\"date\"\n id=\"date-filter-custom-from\"\n #dateFilterCustomFrom\n formControlName=\"from\"\n [max]=\"form.get('customRange.to')?.value ?? today\" />\n\n <label for=\"date-filter-custom-to\">{{ 'to' | transloco }}</label>\n\n <input\n class=\"border-b border-neutral-400 bg-transparent text-neutral-600\"\n type=\"date\"\n id=\"date-filter-custom-to\"\n formControlName=\"to\"\n [min]=\"form.get('customRange.from')?.value\"\n [max]=\"today\" />\n </div>\n </li>\n }\n </ul>\n </fieldset>\n</form>\n", styles: [":host{display:block}ul[role=list]{scrollbar-width:thin}\n"] }]
9764
+ args: [{ selector: 'date-filter,DateFilter', standalone: true, providers: [provideTranslocoScope('filters')], imports: [NgClass, ButtonComponent, ListItemComponent, ReactiveFormsModule, TranslocoPipe, SyslangPipe], template: "<form [formGroup]=\"form\">\n <fieldset class=\"overflow-auto\">\n @if (!headless()) {\n <legend class=\"text-muted-foreground mb-1 flex h-8 w-full select-none items-center pl-1 text-sm font-semibold\">\n <p class=\"me-4 grow\">\n <i class=\"fa-fw {{ title().icon }}\" aria-hidden=\"true\"></i>\n {{ title().label | syslang | transloco }}\n </p>\n <div class=\"ms-4\">\n @if (hasFilters()) {\n <button\n variant=\"ghost\"\n size=\"icon\"\n [attr.title]=\"'filters.clearFilters' | transloco\"\n [attr.aria-label]=\"'filters.clearFilters' | transloco\"\n (click)=\"clear()\"\n (keydown.enter)=\"clear()\">\n <i class=\"fa-fw far fa-filter-circle-xmark\" aria-hidden=\"true\"></i>\n </button>\n }\n\n @if (selection() && validSelection()) {\n <button\n variant=\"ghost\"\n size=\"icon\"\n [attr.title]=\"'filters.applyFilters' | transloco\"\n [attr.aria-label]=\"'filters.applyFilters' | transloco\"\n (click)=\"apply()\"\n (keydown.enter)=\"apply()\">\n <i class=\"fa-fw far fa-filter\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </legend>\n }\n\n <ul class=\"flex flex-col gap-1 pt-2\" role=\"list\">\n @for (option of dateOptions(); track $index) {\n <li\n role=\"listitem\"\n tabindex=\"0\"\n (click)=\"radio.click()\"\n [attr.aria-label]=\"option.display | syslang | transloco\"\n [class]=\"\n cn(\n 'flex p-0 px-2 leading-7',\n form.get('option')?.value === option.display && 'bg-accent',\n option.hidden && 'hidden',\n option.disabled && 'disabled pointer-events-none text-neutral-300'\n )\n \"\n [attr.aria-hidden]=\"option.disabled\">\n <input\n #radio\n type=\"radio\"\n formControlName=\"option\"\n id=\"date-filter-{{ option.display }}\"\n [attr.disabled]=\"option.disabled ? true : null\"\n [attr.aria-disabled]=\"option.disabled\"\n (click)=\"select()\"\n value=\"{{ option.display }}\" />\n\n <label for=\"date-filter-{{ option.display }}\" class=\"grow cursor-pointer p-1\">\n {{ option.display | syslang | transloco }}\n </label>\n </li>\n }\n\n @if (allowCustomRange) {\n <li role=\"listitem\" aria-label=\"custom range\" class=\"flex px-2 leading-7\" [ngClass]=\"{ selected: form.get('option')?.value === 'custom-range' }\">\n <input #radiorange type=\"radio\" formControlName=\"option\" id=\"date-filter-custom-range\" value=\"custom-range\" (click)=\"select()\" />\n\n <div class=\"grid grow grid-cols-[4rem_auto] p-1 *:cursor-pointer\" formGroupName=\"customRange\" (click)=\"radiorange.click()\">\n <label for=\"date-filter-custom-from\">{{ 'from' | transloco }}</label>\n\n <input\n class=\"grow border-b border-neutral-400 bg-transparent text-neutral-600\"\n type=\"date\"\n id=\"date-filter-custom-from\"\n #dateFilterCustomFrom\n formControlName=\"from\"\n [max]=\"form.get('customRange.to')?.value ?? today\" />\n\n <label for=\"date-filter-custom-to\">{{ 'to' | transloco }}</label>\n\n <input\n class=\"border-b border-neutral-400 bg-transparent text-neutral-600\"\n type=\"date\"\n id=\"date-filter-custom-to\"\n formControlName=\"to\"\n [min]=\"form.get('customRange.from')?.value\"\n [max]=\"today\" />\n </div>\n </li>\n }\n </ul>\n </fieldset>\n</form>\n", styles: [":host{display:block}ul[role=list]{scrollbar-width:thin}\n"] }]
9592
9765
  }], ctorParameters: () => [{ type: i0.DestroyRef }] });
9593
9766
 
9594
9767
  class FilterButtonComponent {
@@ -9648,12 +9821,12 @@ class FilterButtonComponent {
9648
9821
  isDate(column) {
9649
9822
  return this.appStore.isDateColumn(column);
9650
9823
  }
9651
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: FilterButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9652
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: FilterButtonComponent, isStandalone: true, selector: "filter-button, FilterButton", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null }, column: { classPropertyName: "column", publicName: "column", isSignal: true, isRequired: true, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.hidden": "filter().hidden" } }, ngImport: i0, template: `
9824
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: FilterButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9825
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: FilterButtonComponent, isStandalone: true, selector: "filter-button, FilterButton", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null }, column: { classPropertyName: "column", publicName: "column", isSignal: true, isRequired: true, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.hidden": "filter().hidden" } }, ngImport: i0, template: `
9653
9826
  <Popover [disabled]="filter().disabled" class="group">
9654
9827
  <button
9655
9828
  [variant]="variant()"
9656
- class="group-data-[open=true]:border group-data-[open=true]:border-gray-200"
9829
+ class="group-data-[open=true]:border-foreground/50 group-data-[open=true]:border"
9657
9830
  [attr.data-disabled]="filter().disabled"
9658
9831
  [disabled]="filter().disabled || null">
9659
9832
  <!-- display the filter icon if set -->
@@ -9671,13 +9844,14 @@ class FilterButtonComponent {
9671
9844
 
9672
9845
  <!-- show the count of selected items -->
9673
9846
  @if (filter().isTree && filter().count > 0) {
9674
- <Badge class="text-primary bg-primary-foreground min-w-5 px-1">
9847
+ <Badge size="xs" variant="primary">
9675
9848
  {{ filter().count }}
9676
9849
  </Badge>
9677
9850
  } @else if (filter().count > 1) {
9678
- <Badge class="text-primary bg-primary-foreground hover:bg-primary-foreground size-5 min-w-5 px-1"> +{{ filter().count - 1 }} </Badge>
9851
+ <Badge size="xs" variant="primary">+{{ filter().count - 1 }}</Badge>
9679
9852
  }
9680
9853
  </button>
9854
+
9681
9855
  <PopoverContent class="w-max" [position]="position()">
9682
9856
  @if (isDate(filter().column)) {
9683
9857
  <DateFilter
@@ -9691,9 +9865,9 @@ class FilterButtonComponent {
9691
9865
  }
9692
9866
  </PopoverContent>
9693
9867
  </Popover>
9694
- `, isInline: true, dependencies: [{ kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "component", type: PopoverComponent, selector: "popover, Popover", inputs: ["disabled", "closeOnScroll"] }, { kind: "directive", type: PopoverContentComponent, selector: "popover-content, PopoverContent, popovercontent", inputs: ["position", "keepOpen", "class"] }, { kind: "component", type: AggregationComponent, selector: "Aggregation, aggregation", inputs: ["name", "column", "headless", "searchable", "showCount", "searchText"], outputs: ["onSelect", "searchTextChange"] }, { kind: "component", type: DateComponent, selector: "date-filter,DateFilter", inputs: ["title", "displayEmptyDistributionIntervals"] }, { kind: "directive", type: BadgeComponent, selector: "badge, Badge", inputs: ["class", "variant"] }, { kind: "pipe", type: OperatorPipe, name: "operator" }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }, { kind: "pipe", type: SyslangPipe, name: "syslang" }] });
9868
+ `, isInline: true, dependencies: [{ kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "decoration", "size"] }, { kind: "component", type: PopoverComponent, selector: "popover, Popover", inputs: ["disabled", "closeOnScroll"], outputs: ["closed"] }, { kind: "directive", type: PopoverContentComponent, selector: "popover-content, PopoverContent, popovercontent", inputs: ["position", "keepOpen", "class"] }, { kind: "component", type: AggregationComponent, selector: "Aggregation, aggregation", inputs: ["name", "column", "headless", "searchable", "showFiltersCount", "searchText"], outputs: ["onSelect", "searchTextChange"] }, { kind: "component", type: DateComponent, selector: "date-filter,DateFilter", inputs: ["title", "displayEmptyDistributionIntervals"] }, { kind: "directive", type: BadgeComponent, selector: "badge, Badge", inputs: ["class", "variant", "size", "decoration", "hover"] }, { kind: "pipe", type: OperatorPipe, name: "operator" }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }, { kind: "pipe", type: SyslangPipe, name: "syslang" }] });
9695
9869
  }
9696
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: FilterButtonComponent, decorators: [{
9870
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: FilterButtonComponent, decorators: [{
9697
9871
  type: Component,
9698
9872
  args: [{
9699
9873
  selector: 'filter-button, FilterButton',
@@ -9713,7 +9887,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
9713
9887
  <Popover [disabled]="filter().disabled" class="group">
9714
9888
  <button
9715
9889
  [variant]="variant()"
9716
- class="group-data-[open=true]:border group-data-[open=true]:border-gray-200"
9890
+ class="group-data-[open=true]:border-foreground/50 group-data-[open=true]:border"
9717
9891
  [attr.data-disabled]="filter().disabled"
9718
9892
  [disabled]="filter().disabled || null">
9719
9893
  <!-- display the filter icon if set -->
@@ -9731,13 +9905,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
9731
9905
 
9732
9906
  <!-- show the count of selected items -->
9733
9907
  @if (filter().isTree && filter().count > 0) {
9734
- <Badge class="text-primary bg-primary-foreground min-w-5 px-1">
9908
+ <Badge size="xs" variant="primary">
9735
9909
  {{ filter().count }}
9736
9910
  </Badge>
9737
9911
  } @else if (filter().count > 1) {
9738
- <Badge class="text-primary bg-primary-foreground hover:bg-primary-foreground size-5 min-w-5 px-1"> +{{ filter().count - 1 }} </Badge>
9912
+ <Badge size="xs" variant="primary">+{{ filter().count - 1 }}</Badge>
9739
9913
  }
9740
9914
  </button>
9915
+
9741
9916
  <PopoverContent class="w-max" [position]="position()">
9742
9917
  @if (isDate(filter().column)) {
9743
9918
  <DateFilter
@@ -9835,16 +10010,16 @@ class MoreComponent {
9835
10010
  const { count = 0 } = this.queryParamsStore.getFilter({ field: aggregation.column, name: aggregation.name }) || {};
9836
10011
  return count > 0;
9837
10012
  }
9838
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: MoreComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9839
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: MoreComponent, isStandalone: true, selector: "more, More", inputs: { count: { classPropertyName: "count", publicName: "count", isSignal: true, isRequired: false, transformFunction: null }, excludedFilters: { classPropertyName: "excludedFilters", publicName: "excludedFilters", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "divide-y divide-gray-200" }, ngImport: i0, template: `
10013
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: MoreComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10014
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: MoreComponent, isStandalone: true, selector: "more, More", inputs: { count: { classPropertyName: "count", publicName: "count", isSignal: true, isRequired: false, transformFunction: null }, excludedFilters: { classPropertyName: "excludedFilters", publicName: "excludedFilters", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "divide-y divide-muted-foreground/18" }, ngImport: i0, template: `
9840
10015
  @for (filter of filters(); track $index) {
9841
- <li [class]="cn('collapse pb-1', filter.hidden && 'hidden')">
10016
+ <li [class]="cn('hover:bg-foreground/5 collapse', filter.hidden && 'hidden')">
9842
10017
  <!-- header -->
9843
10018
  <input
9844
10019
  role="button"
9845
10020
  type="checkbox"
9846
10021
  name="more-filters"
9847
- [class]="cn('min-h-8 w-full', filter.disabled && 'pointer-events-none cursor-default select-none')"
10022
+ [class]="cn('min-h-10 w-full', filter.disabled && 'pointer-events-none cursor-default select-none')"
9848
10023
  [attr.title]="'filters.openFilter' | transloco: { filter: filter.display || filter.name }" />
9849
10024
 
9850
10025
  @if (isDate(filter.column)) {
@@ -9864,7 +10039,7 @@ class MoreComponent {
9864
10039
 
9865
10040
  <!-- actions fragment -->
9866
10041
  <ng-template #actions let-filter="filter" let-agg="agg">
9867
- <div [class]="cn('collapse-title flex items-center gap-1 px-2 py-1 text-gray-600', filter.disabled && 'text-slate-300')">
10042
+ <div [class]="cn('collapse-title text-foreground flex items-center gap-1 px-2 py-1', filter.disabled && 'text-muted-foreground')">
9868
10043
  <!-- aggregation's icon -->
9869
10044
  <i class="me-1 fa-fw {{ filter.icon }}" aria-hidden="true"></i>
9870
10045
 
@@ -9872,7 +10047,7 @@ class MoreComponent {
9872
10047
  <span class="me-4 grow text-sm font-semibold">{{ filter.display || filter.name | transloco }}</span>
9873
10048
  @if (filter.count > 0) {
9874
10049
  <!-- count -->
9875
- <Badge class="min-w-5 px-1">
10050
+ <Badge size="xs" variant="primary">
9876
10051
  {{ filter.count }}
9877
10052
  </Badge>
9878
10053
  }
@@ -9881,7 +10056,7 @@ class MoreComponent {
9881
10056
  <button
9882
10057
  variant="ghost"
9883
10058
  size="icon"
9884
- class="z-10 text-gray-600"
10059
+ class="z-10"
9885
10060
  [attr.title]="'filters.clearFilters' | transloco"
9886
10061
  (click)="clearFilter(filter.column)"
9887
10062
  (keydown.enter)="clearFilter(filter.column)">
@@ -9896,19 +10071,19 @@ class MoreComponent {
9896
10071
  </div>
9897
10072
  </ng-template>
9898
10073
  }
9899
- `, isInline: true, styles: [":host{scrollbar-width:none}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "component", type: AggregationComponent, selector: "Aggregation, aggregation", inputs: ["name", "column", "headless", "searchable", "showCount", "searchText"], outputs: ["onSelect", "searchTextChange"] }, { kind: "component", type: DateComponent, selector: "date-filter,DateFilter", inputs: ["title", "displayEmptyDistributionIntervals"] }, { kind: "directive", type: BadgeComponent, selector: "badge, Badge", inputs: ["class", "variant"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
10074
+ `, isInline: true, styles: [":host{scrollbar-width:none}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "decoration", "size"] }, { kind: "component", type: AggregationComponent, selector: "Aggregation, aggregation", inputs: ["name", "column", "headless", "searchable", "showFiltersCount", "searchText"], outputs: ["onSelect", "searchTextChange"] }, { kind: "component", type: DateComponent, selector: "date-filter,DateFilter", inputs: ["title", "displayEmptyDistributionIntervals"] }, { kind: "directive", type: BadgeComponent, selector: "badge, Badge", inputs: ["class", "variant", "size", "decoration", "hover"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
9900
10075
  }
9901
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: MoreComponent, decorators: [{
10076
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: MoreComponent, decorators: [{
9902
10077
  type: Component,
9903
10078
  args: [{ selector: 'more, More', standalone: true, imports: [NgTemplateOutlet, ButtonComponent, AggregationComponent, TranslocoPipe, DateComponent, BadgeComponent], template: `
9904
10079
  @for (filter of filters(); track $index) {
9905
- <li [class]="cn('collapse pb-1', filter.hidden && 'hidden')">
10080
+ <li [class]="cn('hover:bg-foreground/5 collapse', filter.hidden && 'hidden')">
9906
10081
  <!-- header -->
9907
10082
  <input
9908
10083
  role="button"
9909
10084
  type="checkbox"
9910
10085
  name="more-filters"
9911
- [class]="cn('min-h-8 w-full', filter.disabled && 'pointer-events-none cursor-default select-none')"
10086
+ [class]="cn('min-h-10 w-full', filter.disabled && 'pointer-events-none cursor-default select-none')"
9912
10087
  [attr.title]="'filters.openFilter' | transloco: { filter: filter.display || filter.name }" />
9913
10088
 
9914
10089
  @if (isDate(filter.column)) {
@@ -9928,7 +10103,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
9928
10103
 
9929
10104
  <!-- actions fragment -->
9930
10105
  <ng-template #actions let-filter="filter" let-agg="agg">
9931
- <div [class]="cn('collapse-title flex items-center gap-1 px-2 py-1 text-gray-600', filter.disabled && 'text-slate-300')">
10106
+ <div [class]="cn('collapse-title text-foreground flex items-center gap-1 px-2 py-1', filter.disabled && 'text-muted-foreground')">
9932
10107
  <!-- aggregation's icon -->
9933
10108
  <i class="me-1 fa-fw {{ filter.icon }}" aria-hidden="true"></i>
9934
10109
 
@@ -9936,7 +10111,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
9936
10111
  <span class="me-4 grow text-sm font-semibold">{{ filter.display || filter.name | transloco }}</span>
9937
10112
  @if (filter.count > 0) {
9938
10113
  <!-- count -->
9939
- <Badge class="min-w-5 px-1">
10114
+ <Badge size="xs" variant="primary">
9940
10115
  {{ filter.count }}
9941
10116
  </Badge>
9942
10117
  }
@@ -9945,7 +10120,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
9945
10120
  <button
9946
10121
  variant="ghost"
9947
10122
  size="icon"
9948
- class="z-10 text-gray-600"
10123
+ class="z-10"
9949
10124
  [attr.title]="'filters.clearFilters' | transloco"
9950
10125
  (click)="clearFilter(filter.column)"
9951
10126
  (keydown.enter)="clearFilter(filter.column)">
@@ -9961,7 +10136,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
9961
10136
  </ng-template>
9962
10137
  }
9963
10138
  `, host: {
9964
- class: 'divide-y divide-gray-200'
10139
+ class: 'divide-y divide-muted-foreground/18'
9965
10140
  }, styles: [":host{scrollbar-width:none}\n"] }]
9966
10141
  }], ctorParameters: () => [] });
9967
10142
 
@@ -9987,18 +10162,18 @@ class MoreButtonComponent {
9987
10162
  }, 0);
9988
10163
  return total;
9989
10164
  }, ...(ngDevMode ? [{ debugName: "totalFiltersCount" }] : []));
9990
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: MoreButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9991
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: MoreButtonComponent, isStandalone: true, selector: "more-button, MoreButton", inputs: { count: { classPropertyName: "count", publicName: "count", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, excludedFilters: { classPropertyName: "excludedFilters", publicName: "excludedFilters", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
10165
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: MoreButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10166
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: MoreButtonComponent, isStandalone: true, selector: "more-button, MoreButton", inputs: { count: { classPropertyName: "count", publicName: "count", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, excludedFilters: { classPropertyName: "excludedFilters", publicName: "excludedFilters", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
9992
10167
  <Popover class="group">
9993
10168
  <button
9994
10169
  variant="ghost"
9995
- class="gap-1 truncate font-semibold group-data-[open=true]:border group-data-[open=true]:border-gray-200"
10170
+ class="group-data-[open=true]:border-foreground/18 gap-1 truncate font-semibold group-data-[open=true]:border"
9996
10171
  aria-label="more filters">
9997
10172
  <i class="far fa-filters" aria-hidden="true"></i>
9998
10173
  <span>{{ 'filters.moreFilters' | transloco }}</span>
9999
10174
 
10000
10175
  @if (totalFiltersCount() > 0) {
10001
- <Badge class="min-w-5 px-1">
10176
+ <Badge size="xs" variant="primary">
10002
10177
  {{ totalFiltersCount() }}
10003
10178
  </Badge>
10004
10179
  }
@@ -10008,21 +10183,21 @@ class MoreButtonComponent {
10008
10183
  <More [count]="count()" [excludedFilters]="excludedFilters()" class="h-full max-w-80 overflow-y-scroll" />
10009
10184
  </PopoverContent>
10010
10185
  </Popover>
10011
- `, isInline: true, styles: [".more-filters{overflow:var(--scrollbar-overflow, hidden);padding-right:0;scrollbar-width:thin;scrollbar-gutter:stable}.more-filters:hover{--scrollbar-overflow: overlay}\n"], dependencies: [{ kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "component", type: PopoverComponent, selector: "popover, Popover", inputs: ["disabled", "closeOnScroll"] }, { kind: "directive", type: PopoverContentComponent, selector: "popover-content, PopoverContent, popovercontent", inputs: ["position", "keepOpen", "class"] }, { kind: "component", type: MoreComponent, selector: "more, More", inputs: ["count", "excludedFilters"] }, { kind: "directive", type: BadgeComponent, selector: "badge, Badge", inputs: ["class", "variant"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
10186
+ `, isInline: true, styles: [".more-filters{overflow:var(--scrollbar-overflow, hidden);padding-right:0;scrollbar-width:thin;scrollbar-gutter:stable}.more-filters:hover{--scrollbar-overflow: overlay}\n"], dependencies: [{ kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "decoration", "size"] }, { kind: "component", type: PopoverComponent, selector: "popover, Popover", inputs: ["disabled", "closeOnScroll"], outputs: ["closed"] }, { kind: "directive", type: PopoverContentComponent, selector: "popover-content, PopoverContent, popovercontent", inputs: ["position", "keepOpen", "class"] }, { kind: "component", type: MoreComponent, selector: "more, More", inputs: ["count", "excludedFilters"] }, { kind: "directive", type: BadgeComponent, selector: "badge, Badge", inputs: ["class", "variant", "size", "decoration", "hover"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
10012
10187
  }
10013
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: MoreButtonComponent, decorators: [{
10188
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: MoreButtonComponent, decorators: [{
10014
10189
  type: Component,
10015
10190
  args: [{ selector: 'more-button, MoreButton', standalone: true, imports: [ButtonComponent, PopoverComponent, PopoverContentComponent, TranslocoPipe, MoreComponent, BadgeComponent], template: `
10016
10191
  <Popover class="group">
10017
10192
  <button
10018
10193
  variant="ghost"
10019
- class="gap-1 truncate font-semibold group-data-[open=true]:border group-data-[open=true]:border-gray-200"
10194
+ class="group-data-[open=true]:border-foreground/18 gap-1 truncate font-semibold group-data-[open=true]:border"
10020
10195
  aria-label="more filters">
10021
10196
  <i class="far fa-filters" aria-hidden="true"></i>
10022
10197
  <span>{{ 'filters.moreFilters' | transloco }}</span>
10023
10198
 
10024
10199
  @if (totalFiltersCount() > 0) {
10025
- <Badge class="min-w-5 px-1">
10200
+ <Badge size="xs" variant="primary">
10026
10201
  {{ totalFiltersCount() }}
10027
10202
  </Badge>
10028
10203
  }
@@ -10038,6 +10213,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
10038
10213
  class FiltersBarComponent {
10039
10214
  class = input(...(ngDevMode ? [undefined, { debugName: "class" }] : []));
10040
10215
  position = input('bottom-start', ...(ngDevMode ? [{ debugName: "position" }] : []));
10216
+ morePosition = input('bottom-end', ...(ngDevMode ? [{ debugName: "morePosition" }] : []));
10041
10217
  /**
10042
10218
  * Filters that should be excluded from the filters bar.
10043
10219
  * This can be used to hide specific filters from the UI.
@@ -10144,8 +10320,8 @@ class FiltersBarComponent {
10144
10320
  // filtersCount is the number of filters that can be displayed before the "more filters" option is shown
10145
10321
  this.moreFilterCount.set(count > this.filtersCount() ? this.filtersCount() : count);
10146
10322
  }
10147
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: FiltersBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10148
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: FiltersBarComponent, isStandalone: true, selector: "filters-bar, FiltersBar, filtersbar", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, excludeFilters: { classPropertyName: "excludeFilters", publicName: "excludeFilters", isSignal: true, isRequired: false, transformFunction: null }, filtersCount: { classPropertyName: "filtersCount", publicName: "filtersCount", isSignal: true, isRequired: false, transformFunction: null }, direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onClearFilters: "onClearFilters", onClearBasket: "onClearBasket" }, host: { attributes: { "role": "list", "aria-label": "Filters list" }, properties: { "class": "cn(\"flex relative z-filter gap-2\", direction() === \"vertical\" ? \"flex-col items-start\" : \"flex-row\", class())" } }, providers: [provideTranslocoScope('filters')], viewQueries: [{ propertyName: "moreFilterElement", first: true, predicate: MoreButtonComponent, descendants: true, isSignal: true }, { propertyName: "dropdownElements", predicate: FilterButtonComponent, descendants: true, isSignal: true }, { propertyName: "overflowManager", first: true, predicate: OverflowManagerDirective, descendants: true, isSignal: true }], ngImport: i0, template: `
10323
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: FiltersBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10324
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: FiltersBarComponent, isStandalone: true, selector: "filters-bar, FiltersBar, filtersbar", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, morePosition: { classPropertyName: "morePosition", publicName: "morePosition", isSignal: true, isRequired: false, transformFunction: null }, excludeFilters: { classPropertyName: "excludeFilters", publicName: "excludeFilters", isSignal: true, isRequired: false, transformFunction: null }, filtersCount: { classPropertyName: "filtersCount", publicName: "filtersCount", isSignal: true, isRequired: false, transformFunction: null }, direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onClearFilters: "onClearFilters", onClearBasket: "onClearBasket" }, host: { attributes: { "role": "list", "aria-label": "Filters list" }, properties: { "class": "cn(\"flex relative z-filter gap-2\", direction() === \"vertical\" ? \"flex-col items-start\" : \"flex-row\", class())" } }, providers: [provideTranslocoScope('filters')], viewQueries: [{ propertyName: "moreFilterElement", first: true, predicate: MoreButtonComponent, descendants: true, isSignal: true }, { propertyName: "dropdownElements", predicate: FilterButtonComponent, descendants: true, isSignal: true }, { propertyName: "overflowManager", first: true, predicate: OverflowManagerDirective, descendants: true, isSignal: true }], ngImport: i0, template: `
10149
10325
  <ng-container overflowManager [direction]="direction()" [target]="el.nativeElement" (count)="adjustFiltersCount($event)">
10150
10326
  @if (hasFilters()) {
10151
10327
  <button
@@ -10176,13 +10352,13 @@ class FiltersBarComponent {
10176
10352
  overflowStop
10177
10353
  [class]="cn('invisible absolute', direction() === 'horizontal' ? 'right-0' : 'bottom-0', hasMoreFilters().length > 0 && 'visible')"
10178
10354
  [count]="moreFilterCount()"
10179
- [position]="position()"
10355
+ [position]="morePosition()"
10180
10356
  [excludedFilters]="excludeFilters()" />
10181
10357
  }
10182
10358
  </ng-container>
10183
- `, isInline: true, dependencies: [{ kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "component", type: MoreButtonComponent, selector: "more-button, MoreButton", inputs: ["count", "position", "excludedFilters"] }, { kind: "component", type: FilterButtonComponent, selector: "filter-button, FilterButton", inputs: ["name", "column", "position"] }, { kind: "directive", type: OverflowManagerDirective, selector: "[overflowManager]", inputs: ["target", "margin", "direction"], outputs: ["count"] }, { kind: "directive", type: OverflowItemDirective, selector: "[overflowItem]" }, { kind: "directive", type: OverflowStopDirective, selector: "[overflowStop]" }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
10359
+ `, isInline: true, dependencies: [{ kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "decoration", "size"] }, { kind: "component", type: MoreButtonComponent, selector: "more-button, MoreButton", inputs: ["count", "position", "excludedFilters"] }, { kind: "component", type: FilterButtonComponent, selector: "filter-button, FilterButton", inputs: ["name", "column", "position"] }, { kind: "directive", type: OverflowManagerDirective, selector: "[overflowManager]", inputs: ["target", "margin", "direction"], outputs: ["count"] }, { kind: "directive", type: OverflowItemDirective, selector: "[overflowItem]" }, { kind: "directive", type: OverflowStopDirective, selector: "[overflowStop]" }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
10184
10360
  }
10185
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: FiltersBarComponent, decorators: [{
10361
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: FiltersBarComponent, decorators: [{
10186
10362
  type: Component,
10187
10363
  args: [{
10188
10364
  selector: 'filters-bar, FiltersBar, filtersbar',
@@ -10220,7 +10396,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
10220
10396
  overflowStop
10221
10397
  [class]="cn('invisible absolute', direction() === 'horizontal' ? 'right-0' : 'bottom-0', hasMoreFilters().length > 0 && 'visible')"
10222
10398
  [count]="moreFilterCount()"
10223
- [position]="position()"
10399
+ [position]="morePosition()"
10224
10400
  [excludedFilters]="excludeFilters()" />
10225
10401
  }
10226
10402
  </ng-container>
@@ -10330,46 +10506,46 @@ class DrawerStackComponent {
10330
10506
  drawer?.destroy();
10331
10507
  }, 250);
10332
10508
  }
10333
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: DrawerStackComponent, deps: [{ token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Component });
10334
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.1.2", type: DrawerStackComponent, isStandalone: true, selector: "app-drawer-stack", host: { properties: { "attr.drawer-opened": "this.drawerOpened" } }, ngImport: i0, template: ``, isInline: true, styles: [":host{position:absolute;top:50%;right:0;--drawer-width: 46;--drawer-subdrawer-width: 400px;z-index:var(--z-drawer);transition:right .3s linear}:host[drawer-opened=true]{right:calc(1% * var(--drawer-width))}\n"] });
10509
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: DrawerStackComponent, deps: [{ token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Component });
10510
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.1.7", type: DrawerStackComponent, isStandalone: true, selector: "DrawerStack, drawerstack", host: { properties: { "attr.drawer-opened": "this.drawerOpened" } }, ngImport: i0, template: ``, isInline: true, styles: [":host{position:absolute;top:50%;right:0;--drawer-width: 46;--drawer-subdrawer-width: 400px;z-index:var(--z-drawer);transition:right .3s linear}:host[drawer-opened=true]{right:calc(1% * var(--drawer-width))}\n"] });
10335
10511
  }
10336
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: DrawerStackComponent, decorators: [{
10512
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: DrawerStackComponent, decorators: [{
10337
10513
  type: Component,
10338
- args: [{ selector: 'app-drawer-stack', template: ``, styles: [":host{position:absolute;top:50%;right:0;--drawer-width: 46;--drawer-subdrawer-width: 400px;z-index:var(--z-drawer);transition:right .3s linear}:host[drawer-opened=true]{right:calc(1% * var(--drawer-width))}\n"] }]
10514
+ args: [{ selector: 'DrawerStack, drawerstack', template: ``, styles: [":host{position:absolute;top:50%;right:0;--drawer-width: 46;--drawer-subdrawer-width: 400px;z-index:var(--z-drawer);transition:right .3s linear}:host[drawer-opened=true]{right:calc(1% * var(--drawer-width))}\n"] }]
10339
10515
  }], ctorParameters: () => [{ type: i0.DestroyRef }], propDecorators: { drawerOpened: [{
10340
10516
  type: HostBinding,
10341
10517
  args: ['attr.drawer-opened']
10342
10518
  }] } });
10343
10519
 
10344
10520
  class DrawerService {
10345
- isOpened = new BehaviorSubject(false);
10346
- isExtended = new BehaviorSubject(false);
10521
+ isOpened = signal(false, ...(ngDevMode ? [{ debugName: "isOpened" }] : []));
10522
+ isExtended = signal(false, ...(ngDevMode ? [{ debugName: "isExtended" }] : []));
10347
10523
  backdrop = inject(BackdropService);
10348
10524
  open() {
10349
- this.isOpened.next(true);
10525
+ this.isOpened.set(true);
10350
10526
  }
10351
10527
  close() {
10352
10528
  this.collapse();
10353
- this.isOpened.next(false);
10529
+ this.isOpened.set(false);
10354
10530
  }
10355
10531
  toggle() {
10356
- this.isOpened.getValue() ? this.close() : this.open();
10532
+ this.isOpened() ? this.close() : this.open();
10357
10533
  }
10358
10534
  extend() {
10359
- this.isExtended.next(true);
10535
+ this.isExtended.set(true);
10360
10536
  this.backdrop.show();
10361
10537
  }
10362
10538
  collapse() {
10363
10539
  this.backdrop.hide();
10364
- this.isExtended.next(false);
10540
+ this.isExtended.set(false);
10365
10541
  }
10366
10542
  toggleExtension() {
10367
- this.isExtended.getValue() ? this.collapse() : this.extend();
10543
+ this.isExtended() ? this.collapse() : this.extend();
10368
10544
  }
10369
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: DrawerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
10370
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: DrawerService });
10545
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: DrawerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
10546
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: DrawerService });
10371
10547
  }
10372
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: DrawerService, decorators: [{
10548
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: DrawerService, decorators: [{
10373
10549
  type: Injectable
10374
10550
  }] });
10375
10551
 
@@ -10410,14 +10586,14 @@ class DrawerComponent {
10410
10586
  afterNextRender(() => {
10411
10587
  this.drawerGridTemplateColumns = this.element.style.gridTemplateColumns;
10412
10588
  });
10413
- this.drawer.isOpened.pipe(takeUntilDestroyed()).subscribe(state => {
10414
- this.drawerOpened.set(state);
10415
- if (!state)
10589
+ effect(() => {
10590
+ this.drawerOpened.set(this.drawer.isOpened());
10591
+ if (!this.drawer.isOpened())
10416
10592
  this.resetGridTemplateColumns();
10417
10593
  });
10418
- this.drawer.isExtended.pipe(takeUntilDestroyed()).subscribe(state => {
10419
- this.drawerExtended.set(state);
10420
- if (!state)
10594
+ effect(() => {
10595
+ this.drawerExtended.set(this.drawer.isExtended());
10596
+ if (!this.drawer.isExtended())
10421
10597
  this.resetGridTemplateColumns();
10422
10598
  });
10423
10599
  }
@@ -10430,12 +10606,12 @@ class DrawerComponent {
10430
10606
  resetGridTemplateColumns() {
10431
10607
  this.element.style.gridTemplateColumns = this.defaultDrawerGridTemplate;
10432
10608
  }
10433
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: DrawerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10434
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.1.2", type: DrawerComponent, isStandalone: true, selector: "app-drawer", host: { listeners: { "mousemove": "mouseMove($event)", "mousedown": "mouseDown($event)", "mouseup": "mouseUp()" }, properties: { "attr.drawer-opened": "drawerOpened()", "attr.drawer-extended": "drawerExtended()", "style.grid-template-columns": "this.drawerGridTemplateColumns" } }, providers: [DrawerService], viewQueries: [{ propertyName: "drawerHandle", first: true, predicate: ["drawerHandle"], descendants: true, isSignal: true }], ngImport: i0, template: ``, isInline: true, styles: [":host{--drawer-width: 46;--drawer-subdrawer-width: 400px;display:grid;position:absolute;height:100%;top:0;right:-100%;justify-content:flex-end;width:calc(100vw / 100 * var(--drawer-width) + var(--drawer-subdrawer-width));z-index:var(--z-drawer);grid-template-columns:0 1fr var(--drawer-subdrawer-width);transition:right .3s ease-in-out,transform .3s ease-in-out}:host[drawer-opened=true]{right:calc(var(--drawer-subdrawer-width) * -1);box-shadow:var(--drawer-box-shadow)}:host[drawer-extended=true]{right:0;width:100vw;grid-template-columns:1fr calc(var(--drawer-width) * 1%) var(--drawer-subdrawer-width);box-shadow:unset}\n"] });
10609
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: DrawerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10610
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.1.7", type: DrawerComponent, isStandalone: true, selector: "Drawer, drawer", host: { listeners: { "mousemove": "mouseMove($event)", "mousedown": "mouseDown($event)", "mouseup": "mouseUp()" }, properties: { "attr.drawer-opened": "drawerOpened()", "attr.drawer-extended": "drawerExtended()", "style.grid-template-columns": "this.drawerGridTemplateColumns" } }, providers: [DrawerService], viewQueries: [{ propertyName: "drawerHandle", first: true, predicate: ["drawerHandle"], descendants: true, isSignal: true }], ngImport: i0, template: ``, isInline: true, styles: [":host{--drawer-width: 46;--drawer-subdrawer-width: 400px;display:grid;position:absolute;height:100%;top:0;right:-100%;justify-content:flex-end;width:calc(100vw / 100 * var(--drawer-width) + var(--drawer-subdrawer-width));z-index:var(--z-drawer);grid-template-columns:0 1fr var(--drawer-subdrawer-width);transition:right .3s ease-in-out,transform .3s ease-in-out}:host[drawer-opened=true]{right:calc(var(--drawer-subdrawer-width) * -1);box-shadow:var(--drawer-box-shadow)}:host[drawer-extended=true]{right:0;width:100vw;grid-template-columns:1fr calc(var(--drawer-width) * 1%) var(--drawer-subdrawer-width);box-shadow:unset}\n"] });
10435
10611
  }
10436
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: DrawerComponent, decorators: [{
10612
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: DrawerComponent, decorators: [{
10437
10613
  type: Component,
10438
- args: [{ selector: 'app-drawer', standalone: true, providers: [DrawerService], template: ``, host: {
10614
+ args: [{ selector: 'Drawer, drawer', standalone: true, providers: [DrawerService], template: ``, host: {
10439
10615
  '[attr.drawer-opened]': 'drawerOpened()',
10440
10616
  '[attr.drawer-extended]': 'drawerExtended()'
10441
10617
  }, styles: [":host{--drawer-width: 46;--drawer-subdrawer-width: 400px;display:grid;position:absolute;height:100%;top:0;right:-100%;justify-content:flex-end;width:calc(100vw / 100 * var(--drawer-width) + var(--drawer-subdrawer-width));z-index:var(--z-drawer);grid-template-columns:0 1fr var(--drawer-subdrawer-width);transition:right .3s ease-in-out,transform .3s ease-in-out}:host[drawer-opened=true]{right:calc(var(--drawer-subdrawer-width) * -1);box-shadow:var(--drawer-box-shadow)}:host[drawer-extended=true]{right:0;width:100vw;grid-template-columns:1fr calc(var(--drawer-width) * 1%) var(--drawer-subdrawer-width);box-shadow:unset}\n"] }]
@@ -10456,13 +10632,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
10456
10632
  class DrawerNavbarComponent {
10457
10633
  drawerStack = inject(DrawerStackService);
10458
10634
  drawerService = inject(DrawerService);
10459
- isExtended = toSignal(this.drawerService.isExtended);
10460
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: DrawerNavbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10461
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.1.2", type: DrawerNavbarComponent, isStandalone: true, selector: "app-drawer-navbar", ngImport: i0, template: "<menu class=\"flex items-center gap-2 p-4 font-semibold\">\n <button variant=\"ghost\" class=\"group\" [attr.title]=\"'back' | transloco\" (click)=\"drawerStack.close()\">\n <i class=\"fa-fw far fa-arrow-left [&_svg]-ms-1 [&_svg]transition-transform opacity-60 group-hover:-translate-x-0.5\"></i>\n {{ 'back' | transloco }}\n </button>\n\n <VerticalDivider />\n\n <ng-content></ng-content>\n</menu>\n", dependencies: [{ kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "component", type: VerticalDividerComponent, selector: "vertical-divider, VerticalDivider, verticaldivider" }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
10635
+ isExtended = this.drawerService.isExtended();
10636
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: DrawerNavbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10637
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.1.7", type: DrawerNavbarComponent, isStandalone: true, selector: "DrawerNavbar, drawernavbar", ngImport: i0, template: "<menu class=\"flex items-center gap-2 p-4 font-semibold\">\n <li>\n <button variant=\"ghost\" class=\"group\" [attr.title]=\"'back' | transloco\" (click)=\"drawerStack.close()\">\n <i class=\"fa-fw far fa-arrow-left [&_svg]-ms-1 [&_svg]transition-transform opacity-60 group-hover:-translate-x-0.5\"></i>\n {{ 'back' | transloco }}\n </button>\n </li>\n\n <li role=\"presentation\">\n <VerticalDivider class=\"min-h-8\" />\n </li>\n\n <ng-content></ng-content>\n</menu>\n", dependencies: [{ kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "decoration", "size"] }, { kind: "component", type: VerticalDividerComponent, selector: "vertical-divider, VerticalDivider, verticaldivider" }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
10462
10638
  }
10463
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: DrawerNavbarComponent, decorators: [{
10639
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: DrawerNavbarComponent, decorators: [{
10464
10640
  type: Component,
10465
- args: [{ selector: 'app-drawer-navbar', standalone: true, imports: [TranslocoPipe, ButtonComponent, VerticalDividerComponent], template: "<menu class=\"flex items-center gap-2 p-4 font-semibold\">\n <button variant=\"ghost\" class=\"group\" [attr.title]=\"'back' | transloco\" (click)=\"drawerStack.close()\">\n <i class=\"fa-fw far fa-arrow-left [&_svg]-ms-1 [&_svg]transition-transform opacity-60 group-hover:-translate-x-0.5\"></i>\n {{ 'back' | transloco }}\n </button>\n\n <VerticalDivider />\n\n <ng-content></ng-content>\n</menu>\n" }]
10641
+ args: [{ selector: 'DrawerNavbar, drawernavbar', standalone: true, imports: [TranslocoPipe, ButtonComponent, VerticalDividerComponent], template: "<menu class=\"flex items-center gap-2 p-4 font-semibold\">\n <li>\n <button variant=\"ghost\" class=\"group\" [attr.title]=\"'back' | transloco\" (click)=\"drawerStack.close()\">\n <i class=\"fa-fw far fa-arrow-left [&_svg]-ms-1 [&_svg]transition-transform opacity-60 group-hover:-translate-x-0.5\"></i>\n {{ 'back' | transloco }}\n </button>\n </li>\n\n <li role=\"presentation\">\n <VerticalDivider class=\"min-h-8\" />\n </li>\n\n <ng-content></ng-content>\n</menu>\n" }]
10466
10642
  }] });
10467
10643
 
10468
10644
  const searchRoute = 'search';
@@ -10470,6 +10646,7 @@ class DrawerAdvancedFiltersComponent extends DrawerComponent {
10470
10646
  queryParamsStore = inject(QueryParamsStore);
10471
10647
  appStore = inject(AppStore);
10472
10648
  router = inject(Router);
10649
+ route = inject(ActivatedRoute);
10473
10650
  formBuilder = inject(NonNullableFormBuilder);
10474
10651
  overlay = inject(Overlay);
10475
10652
  transloco = inject(TranslocoService);
@@ -10491,10 +10668,6 @@ class DrawerAdvancedFiltersComponent extends DrawerComponent {
10491
10668
  title: this.formBuilder.group({
10492
10669
  operator: this.formBuilder.control('all'),
10493
10670
  value: this.formBuilder.control(undefined)
10494
- }),
10495
- location: this.formBuilder.group({
10496
- operator: this.formBuilder.control('all'),
10497
- value: this.formBuilder.control(undefined)
10498
10671
  })
10499
10672
  });
10500
10673
  currentTab = signal('all', ...(ngDevMode ? [{ debugName: "currentTab" }] : []));
@@ -10504,17 +10677,30 @@ class DrawerAdvancedFiltersComponent extends DrawerComponent {
10504
10677
  aggregations = signal(undefined, ...(ngDevMode ? [{ debugName: "aggregations" }] : []));
10505
10678
  tabs = computed(() => {
10506
10679
  const routeData = this.router.config.find(c => c.path === searchRoute);
10507
- return !routeData ? [] : ['all'].concat(routeData.children.filter(c => !!c.path && c.path !== 'all' && c.path !== '**').map(c => c.path));
10680
+ return !routeData
10681
+ ? []
10682
+ : [{ path: 'all', display: 'All' }].concat(routeData.children.filter(c => !!c.path && c.path !== 'all' && c.path !== '**').map(c => ({ path: c.path, display: c.data?.['display'] })));
10508
10683
  }, ...(ngDevMode ? [{ debugName: "tabs" }] : []));
10509
10684
  filters = computed(() => {
10510
- return (this.appStore
10685
+ const cjsonFilters = this.appStore
10511
10686
  .customizationJson()
10512
10687
  .filters?.filter(f => f.column !== '#date')
10513
10688
  .map(f => ({
10514
10689
  column: f.column,
10515
10690
  alias: this.appStore.getColumnAlias(f.column),
10691
+ display: f.display,
10692
+ items: this.aggregations()?.find(a => a.column === f.column)?.items
10693
+ })) || [];
10694
+ const appStoreFilters = this.appStore
10695
+ .getAuthorizedFilters(this.route)
10696
+ .filter(f => !cjsonFilters.some(cf => cf.column === f.column))
10697
+ .map((f) => ({
10698
+ column: f.column,
10699
+ alias: this.appStore.getColumnAlias(f.column),
10700
+ display: f.display,
10516
10701
  items: this.aggregations()?.find(a => a.column === f.column)?.items
10517
- })) || []);
10702
+ })) || [];
10703
+ return cjsonFilters.concat(appStoreFilters);
10518
10704
  }, ...(ngDevMode ? [{ debugName: "filters" }] : []));
10519
10705
  text = '';
10520
10706
  constructor() {
@@ -10534,7 +10720,7 @@ class DrawerAdvancedFiltersComponent extends DrawerComponent {
10534
10720
  }
10535
10721
  onSearch() {
10536
10722
  // this params alters the query text
10537
- const { content, title, location } = this.form.value;
10723
+ const { content, title } = this.form.value;
10538
10724
  let fieldedText = [];
10539
10725
  if (content && content.value) {
10540
10726
  const { operator = 'any', value = '' } = content;
@@ -10546,11 +10732,6 @@ class DrawerAdvancedFiltersComponent extends DrawerComponent {
10546
10732
  const text = this.formatFilter(operator, value, 'title');
10547
10733
  fieldedText.push(text);
10548
10734
  }
10549
- if (location && location.value) {
10550
- const { operator = 'any', value = '' } = location;
10551
- const text = this.formatFilter(operator, value, 'location');
10552
- fieldedText.push(text);
10553
- }
10554
10735
  let text = this.text;
10555
10736
  // now we have to join the fieldedText with the text
10556
10737
  // if text is empty, we must remove the leading space
@@ -10612,7 +10793,7 @@ class DrawerAdvancedFiltersComponent extends DrawerComponent {
10612
10793
  }
10613
10794
  }
10614
10795
  }
10615
- /** Format content/title/location filters */
10796
+ /** Format content/title filters */
10616
10797
  formatFilter(operator, value, field = '') {
10617
10798
  const fieldStr = field ? `${field}::` : '';
10618
10799
  switch (operator) {
@@ -10649,7 +10830,10 @@ class DrawerAdvancedFiltersComponent extends DrawerComponent {
10649
10830
  /** add item to current selection */
10650
10831
  addItem(item, filter) {
10651
10832
  const appliedFilter = this.appliedFilters().find(af => af.column === filter.column);
10652
- if (!appliedFilter.values.some(v => v.value === item.value)) {
10833
+ if (!appliedFilter) {
10834
+ this.appliedFilters.set(this.appliedFilters().concat([{ column: filter.column, values: [item] }]));
10835
+ }
10836
+ else if (!appliedFilter.values.some(v => v.value === item.value)) {
10653
10837
  appliedFilter.values.push(item);
10654
10838
  }
10655
10839
  }
@@ -10679,31 +10863,19 @@ class DrawerAdvancedFiltersComponent extends DrawerComponent {
10679
10863
  // todo handle tree items
10680
10864
  return res;
10681
10865
  }
10682
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: DrawerAdvancedFiltersComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10683
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: DrawerAdvancedFiltersComponent, isStandalone: true, selector: "advanced-filters", providers: [DrawerService, provideTranslocoScope('drawers')], usesInheritance: true, ngImport: i0, template: "<div (click)=\"drawer.toggleExtension()\" (keydown.escape)=\"drawer.toggleExtension()\" [attr.aria-hidden]=\"true\"></div>\n\n<div class=\"flex h-full flex-col overflow-auto bg-white\">\n <app-drawer-navbar class=\"block border-b border-neutral-300 bg-white\">\n <button [attr.title]=\"'drawers.search' | transloco\" (click)=\"onSearch()\">\n {{ 'drawers.search' | transloco }}\n </button>\n </app-drawer-navbar>\n\n <div class=\"flex h-full flex-grow flex-col overflow-auto\">\n <section class=\"flex flex-col gap-4 p-6\" [formGroup]=\"form\">\n <!-- FIND IN -->\n <h1 class=\"text-xl font-bold\">{{ 'drawers.findInContent' | transloco }}</h1>\n <div class=\"flex items-center gap-4\" formGroupName=\"content\">\n <span class=\"w-1/3 font-semibold\">{{ 'drawers.findInContent' | transloco }}</span>\n <select\n id=\"content-operator\"\n class=\"hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n formControlName=\"operator\">\n @for (data of selectData; track $index) {\n <option [value]=\"data.operator\">{{ 'drawers.' + data.display | transloco }}</option>\n }\n </select>\n <input\n id=\"content-value\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [placeholder]=\"getPlaceholder('content.operator')\"\n formControlName=\"value\" />\n </div>\n <div class=\"flex items-center gap-4\" formGroupName=\"title\">\n <span class=\"w-1/3 font-semibold\">{{ 'drawers.findInTitle' | transloco }}</span>\n <select\n id=\"title-operator\"\n class=\"hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n formControlName=\"operator\">\n @for (data of selectData; track $index) {\n <option [value]=\"data.operator\">{{ 'drawers.' + data.display | transloco }}</option>\n }\n </select>\n <input id=\"title-value\" type=\"text\" autocomplete=\"off\" spellcheck=\"false\" [placeholder]=\"getPlaceholder('title.operator')\" formControlName=\"value\" />\n </div>\n <div class=\"flex items-center gap-4\" formGroupName=\"location\">\n <span class=\"w-1/3 font-semibold\">{{ 'drawers.findInLocation' | transloco }}</span>\n <select\n id=\"location-operator\"\n class=\"hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n formControlName=\"operator\">\n @for (data of selectData; track $index) {\n <option [value]=\"data.operator\">{{ 'drawers.' + data.display | transloco }}</option>\n }\n </select>\n <input\n id=\"location-value\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [placeholder]=\"getPlaceholder('location.operator')\"\n formControlName=\"value\" />\n </div>\n\n <!-- TABS -->\n <h1 class=\"mt-4 text-xl font-bold\">{{ 'drawers.inScope' | transloco }}&nbsp;&quot;{{ currentTab() }}&quot;</h1>\n <div class=\"inline-flex -space-x-px rtl:space-x-reverse\">\n @for (tab of tabs(); track $index) {\n <button\n [variant]=\"tab !== currentTab() ? 'outline' : 'default'\"\n class=\"rounded-none shadow-none first:rounded-s-md last:rounded-e-md\"\n (click)=\"onTabChange(tab)\">\n {{ tab }}\n </button>\n }\n </div>\n\n <!-- FILTERS -->\n <h1 class=\"mt-4 text-xl font-bold\">{{ 'drawers.applyFilters' | transloco }}</h1>\n @for (filter of filters(); track $index) {\n <DropdownInput\n [suggestions]=\"suggestions()\"\n [selected]=\"getItems(filter.column)\"\n [label]=\"filter.alias\"\n [placeholder]=\"'drawers.startTyping' | transloco\"\n [noResultLabel]=\"'drawers.noResult' | transloco\"\n (onFocus)=\"setFilterFocus($event, filter)\"\n (onKeyUp)=\"onInputTyping($event)\"\n (removeItem)=\"removeItem($event, filter)\"\n (addItem)=\"addItem($event, filter)\" />\n } @empty {\n {{ 'drawers.noFilters' | transloco }}\n }\n </section>\n </div>\n</div>\n", styles: [":host{--drawer-width: 46;--drawer-subdrawer-width: 400px;display:grid;justify-content:flex-end;position:absolute;top:0;height:100%;right:-100%;width:calc(100vw / 100 * var(--drawer-width) + var(--drawer-subdrawer-width));z-index:var(--z-drawer);grid-template-columns:0 1fr var(--drawer-subdrawer-width);transition:right .3s ease-in-out,transform .3s ease-in-out}:host[drawer-opened=true]{right:calc(var(--drawer-subdrawer-width) * -1);box-shadow:var(--drawer-box-shadow)}:host[drawer-extended=true]{width:100vw;right:calc(var(--spacing) * 0);grid-template-columns:1fr calc(var(--drawer-width) * 1%) var(--drawer-subdrawer-width);box-shadow:unset}:is() .dropdown{width:100%}:is() .dropdown-content{width:50%}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "component", type: DrawerNavbarComponent, selector: "app-drawer-navbar" }, { kind: "component", type: DropdownInputComponent, selector: "dropdown-input, DropdownInput", inputs: ["label", "placeholder", "noResultLabel", "suggestions", "selected"], outputs: ["onFocus", "onKeyUp", "removeItem", "addItem"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "directive", type: InputComponent, selector: "input[type=\"text\"], input[type=\"email\"], input[type=\"password\"], input[type=\"number\"], input[type=\"tel\"], input[type=\"url\"], input[type=\"time\"]", inputs: ["class", "variant"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
10866
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: DrawerAdvancedFiltersComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10867
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: DrawerAdvancedFiltersComponent, isStandalone: true, selector: "advanced-filters", providers: [DrawerService, provideTranslocoScope('drawers')], usesInheritance: true, ngImport: i0, template: "<div (click)=\"drawer.toggleExtension()\" (keydown.escape)=\"drawer.toggleExtension()\" [attr.aria-hidden]=\"true\"></div>\n\n<div class=\"flex h-full flex-col overflow-auto bg-white\">\n <DrawerNavbar class=\"block border-b border-neutral-300 bg-white\">\n <button [attr.title]=\"'drawers.search' | transloco\" (click)=\"onSearch()\">\n {{ 'drawers.search' | transloco }}\n </button>\n </DrawerNavbar>\n\n <div class=\"flex h-full flex-grow flex-col overflow-auto\">\n <section class=\"flex flex-col gap-4 p-6\" [formGroup]=\"form\">\n <!-- FIND IN -->\n <h1 class=\"text-xl font-bold\">{{ 'drawers.findInContent' | transloco }}</h1>\n <div class=\"flex items-center gap-4\" formGroupName=\"content\">\n <span class=\"w-1/3 font-semibold\">{{ 'drawers.findInContent' | transloco }}</span>\n <select\n id=\"content-operator\"\n class=\"hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n formControlName=\"operator\">\n @for (data of selectData; track $index) {\n <option [value]=\"data.operator\">{{ 'drawers.' + data.display | transloco }}</option>\n }\n </select>\n <input\n id=\"content-value\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [placeholder]=\"getPlaceholder('content.operator')\"\n formControlName=\"value\" />\n </div>\n <div class=\"flex items-center gap-4\" formGroupName=\"title\">\n <span class=\"w-1/3 font-semibold\">{{ 'drawers.findInTitle' | transloco }}</span>\n <select\n id=\"title-operator\"\n class=\"hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n formControlName=\"operator\">\n @for (data of selectData; track $index) {\n <option [value]=\"data.operator\">{{ 'drawers.' + data.display | transloco }}</option>\n }\n </select>\n <input id=\"title-value\" type=\"text\" autocomplete=\"off\" spellcheck=\"false\" [placeholder]=\"getPlaceholder('title.operator')\" formControlName=\"value\" />\n </div>\n\n <!-- TABS -->\n <h1 class=\"mt-4 text-xl font-bold\">{{ 'drawers.inScope' | transloco }}&nbsp;&quot;{{ currentTab() }}&quot;</h1>\n <div class=\"inline-flex -space-x-px rtl:space-x-reverse\">\n @for (tab of tabs(); track $index) {\n <button\n [decoration]=\"tab.path !== currentTab() ? 'outline' : 'none'\"\n class=\"rounded-none shadow-none first:rounded-s-md last:rounded-e-md\"\n (click)=\"onTabChange(tab.path)\">\n {{ tab.display | syslang | transloco }}\n </button>\n }\n </div>\n\n <!-- FILTERS -->\n <h1 class=\"mt-4 text-xl font-bold\">{{ 'drawers.applyFilters' | transloco }}</h1>\n @for (filter of filters(); track $index) {\n {{ filter.display || filter.alias | syslang | transloco }}\n <DropdownInput\n [suggestions]=\"suggestions()\"\n [selected]=\"getItems(filter.column)\"\n [label]=\"filter.display || filter.alias | syslang | transloco\"\n [placeholder]=\"'drawers.startTyping' | transloco\"\n [noResultLabel]=\"'drawers.noResult' | transloco\"\n (onFocus)=\"setFilterFocus($event, filter)\"\n (onKeyUp)=\"onInputTyping($event)\"\n (removeItem)=\"removeItem($event, filter)\"\n (addItem)=\"addItem($event, filter)\" />\n } @empty {\n {{ 'drawers.noFilters' | transloco }}\n }\n </section>\n </div>\n</div>\n", styles: [":host{--drawer-width: 46;--drawer-subdrawer-width: 400px;display:grid;justify-content:flex-end;position:absolute;top:0;height:100%;right:-100%;width:calc(100vw / 100 * var(--drawer-width) + var(--drawer-subdrawer-width));z-index:var(--z-drawer);grid-template-columns:0 1fr var(--drawer-subdrawer-width);transition:right .3s ease-in-out,transform .3s ease-in-out}:host[drawer-opened=true]{right:calc(var(--drawer-subdrawer-width) * -1);box-shadow:var(--drawer-box-shadow)}:host[drawer-extended=true]{width:100vw;right:calc(var(--spacing) * 0);grid-template-columns:1fr calc(var(--drawer-width) * 1%) var(--drawer-subdrawer-width);box-shadow:unset}:is() .dropdown{width:100%}:is() .dropdown-content{width:50%}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "component", type: DrawerNavbarComponent, selector: "DrawerNavbar, drawernavbar" }, { kind: "component", type: DropdownInputComponent, selector: "dropdown-input, DropdownInput", inputs: ["label", "placeholder", "noResultLabel", "suggestions", "selected"], outputs: ["onFocus", "onKeyUp", "removeItem", "addItem"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "decoration", "size"] }, { kind: "directive", type: InputComponent, selector: "input[type=\"text\"], input[type=\"email\"], input[type=\"number\"], input[type=\"password\"], input[type=\"tel\"], input[type=\"url\"], input[type=\"time\"]", inputs: ["class", "variant", "decoration"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }, { kind: "pipe", type: SyslangPipe, name: "syslang" }] });
10684
10868
  }
10685
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: DrawerAdvancedFiltersComponent, decorators: [{
10869
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: DrawerAdvancedFiltersComponent, decorators: [{
10686
10870
  type: Component,
10687
- args: [{ selector: 'advanced-filters', standalone: true, imports: [ReactiveFormsModule, TranslocoPipe, DrawerNavbarComponent, DropdownInputComponent, ButtonComponent, InputComponent], providers: [DrawerService, provideTranslocoScope('drawers')], template: "<div (click)=\"drawer.toggleExtension()\" (keydown.escape)=\"drawer.toggleExtension()\" [attr.aria-hidden]=\"true\"></div>\n\n<div class=\"flex h-full flex-col overflow-auto bg-white\">\n <app-drawer-navbar class=\"block border-b border-neutral-300 bg-white\">\n <button [attr.title]=\"'drawers.search' | transloco\" (click)=\"onSearch()\">\n {{ 'drawers.search' | transloco }}\n </button>\n </app-drawer-navbar>\n\n <div class=\"flex h-full flex-grow flex-col overflow-auto\">\n <section class=\"flex flex-col gap-4 p-6\" [formGroup]=\"form\">\n <!-- FIND IN -->\n <h1 class=\"text-xl font-bold\">{{ 'drawers.findInContent' | transloco }}</h1>\n <div class=\"flex items-center gap-4\" formGroupName=\"content\">\n <span class=\"w-1/3 font-semibold\">{{ 'drawers.findInContent' | transloco }}</span>\n <select\n id=\"content-operator\"\n class=\"hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n formControlName=\"operator\">\n @for (data of selectData; track $index) {\n <option [value]=\"data.operator\">{{ 'drawers.' + data.display | transloco }}</option>\n }\n </select>\n <input\n id=\"content-value\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [placeholder]=\"getPlaceholder('content.operator')\"\n formControlName=\"value\" />\n </div>\n <div class=\"flex items-center gap-4\" formGroupName=\"title\">\n <span class=\"w-1/3 font-semibold\">{{ 'drawers.findInTitle' | transloco }}</span>\n <select\n id=\"title-operator\"\n class=\"hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n formControlName=\"operator\">\n @for (data of selectData; track $index) {\n <option [value]=\"data.operator\">{{ 'drawers.' + data.display | transloco }}</option>\n }\n </select>\n <input id=\"title-value\" type=\"text\" autocomplete=\"off\" spellcheck=\"false\" [placeholder]=\"getPlaceholder('title.operator')\" formControlName=\"value\" />\n </div>\n <div class=\"flex items-center gap-4\" formGroupName=\"location\">\n <span class=\"w-1/3 font-semibold\">{{ 'drawers.findInLocation' | transloco }}</span>\n <select\n id=\"location-operator\"\n class=\"hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n formControlName=\"operator\">\n @for (data of selectData; track $index) {\n <option [value]=\"data.operator\">{{ 'drawers.' + data.display | transloco }}</option>\n }\n </select>\n <input\n id=\"location-value\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [placeholder]=\"getPlaceholder('location.operator')\"\n formControlName=\"value\" />\n </div>\n\n <!-- TABS -->\n <h1 class=\"mt-4 text-xl font-bold\">{{ 'drawers.inScope' | transloco }}&nbsp;&quot;{{ currentTab() }}&quot;</h1>\n <div class=\"inline-flex -space-x-px rtl:space-x-reverse\">\n @for (tab of tabs(); track $index) {\n <button\n [variant]=\"tab !== currentTab() ? 'outline' : 'default'\"\n class=\"rounded-none shadow-none first:rounded-s-md last:rounded-e-md\"\n (click)=\"onTabChange(tab)\">\n {{ tab }}\n </button>\n }\n </div>\n\n <!-- FILTERS -->\n <h1 class=\"mt-4 text-xl font-bold\">{{ 'drawers.applyFilters' | transloco }}</h1>\n @for (filter of filters(); track $index) {\n <DropdownInput\n [suggestions]=\"suggestions()\"\n [selected]=\"getItems(filter.column)\"\n [label]=\"filter.alias\"\n [placeholder]=\"'drawers.startTyping' | transloco\"\n [noResultLabel]=\"'drawers.noResult' | transloco\"\n (onFocus)=\"setFilterFocus($event, filter)\"\n (onKeyUp)=\"onInputTyping($event)\"\n (removeItem)=\"removeItem($event, filter)\"\n (addItem)=\"addItem($event, filter)\" />\n } @empty {\n {{ 'drawers.noFilters' | transloco }}\n }\n </section>\n </div>\n</div>\n", styles: [":host{--drawer-width: 46;--drawer-subdrawer-width: 400px;display:grid;justify-content:flex-end;position:absolute;top:0;height:100%;right:-100%;width:calc(100vw / 100 * var(--drawer-width) + var(--drawer-subdrawer-width));z-index:var(--z-drawer);grid-template-columns:0 1fr var(--drawer-subdrawer-width);transition:right .3s ease-in-out,transform .3s ease-in-out}:host[drawer-opened=true]{right:calc(var(--drawer-subdrawer-width) * -1);box-shadow:var(--drawer-box-shadow)}:host[drawer-extended=true]{width:100vw;right:calc(var(--spacing) * 0);grid-template-columns:1fr calc(var(--drawer-width) * 1%) var(--drawer-subdrawer-width);box-shadow:unset}:is() .dropdown{width:100%}:is() .dropdown-content{width:50%}\n"] }]
10871
+ args: [{ selector: 'advanced-filters', standalone: true, imports: [ReactiveFormsModule, TranslocoPipe, SyslangPipe, DrawerNavbarComponent, DropdownInputComponent, ButtonComponent, InputComponent], providers: [DrawerService, provideTranslocoScope('drawers')], template: "<div (click)=\"drawer.toggleExtension()\" (keydown.escape)=\"drawer.toggleExtension()\" [attr.aria-hidden]=\"true\"></div>\n\n<div class=\"flex h-full flex-col overflow-auto bg-white\">\n <DrawerNavbar class=\"block border-b border-neutral-300 bg-white\">\n <button [attr.title]=\"'drawers.search' | transloco\" (click)=\"onSearch()\">\n {{ 'drawers.search' | transloco }}\n </button>\n </DrawerNavbar>\n\n <div class=\"flex h-full flex-grow flex-col overflow-auto\">\n <section class=\"flex flex-col gap-4 p-6\" [formGroup]=\"form\">\n <!-- FIND IN -->\n <h1 class=\"text-xl font-bold\">{{ 'drawers.findInContent' | transloco }}</h1>\n <div class=\"flex items-center gap-4\" formGroupName=\"content\">\n <span class=\"w-1/3 font-semibold\">{{ 'drawers.findInContent' | transloco }}</span>\n <select\n id=\"content-operator\"\n class=\"hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n formControlName=\"operator\">\n @for (data of selectData; track $index) {\n <option [value]=\"data.operator\">{{ 'drawers.' + data.display | transloco }}</option>\n }\n </select>\n <input\n id=\"content-value\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [placeholder]=\"getPlaceholder('content.operator')\"\n formControlName=\"value\" />\n </div>\n <div class=\"flex items-center gap-4\" formGroupName=\"title\">\n <span class=\"w-1/3 font-semibold\">{{ 'drawers.findInTitle' | transloco }}</span>\n <select\n id=\"title-operator\"\n class=\"hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n formControlName=\"operator\">\n @for (data of selectData; track $index) {\n <option [value]=\"data.operator\">{{ 'drawers.' + data.display | transloco }}</option>\n }\n </select>\n <input id=\"title-value\" type=\"text\" autocomplete=\"off\" spellcheck=\"false\" [placeholder]=\"getPlaceholder('title.operator')\" formControlName=\"value\" />\n </div>\n\n <!-- TABS -->\n <h1 class=\"mt-4 text-xl font-bold\">{{ 'drawers.inScope' | transloco }}&nbsp;&quot;{{ currentTab() }}&quot;</h1>\n <div class=\"inline-flex -space-x-px rtl:space-x-reverse\">\n @for (tab of tabs(); track $index) {\n <button\n [decoration]=\"tab.path !== currentTab() ? 'outline' : 'none'\"\n class=\"rounded-none shadow-none first:rounded-s-md last:rounded-e-md\"\n (click)=\"onTabChange(tab.path)\">\n {{ tab.display | syslang | transloco }}\n </button>\n }\n </div>\n\n <!-- FILTERS -->\n <h1 class=\"mt-4 text-xl font-bold\">{{ 'drawers.applyFilters' | transloco }}</h1>\n @for (filter of filters(); track $index) {\n {{ filter.display || filter.alias | syslang | transloco }}\n <DropdownInput\n [suggestions]=\"suggestions()\"\n [selected]=\"getItems(filter.column)\"\n [label]=\"filter.display || filter.alias | syslang | transloco\"\n [placeholder]=\"'drawers.startTyping' | transloco\"\n [noResultLabel]=\"'drawers.noResult' | transloco\"\n (onFocus)=\"setFilterFocus($event, filter)\"\n (onKeyUp)=\"onInputTyping($event)\"\n (removeItem)=\"removeItem($event, filter)\"\n (addItem)=\"addItem($event, filter)\" />\n } @empty {\n {{ 'drawers.noFilters' | transloco }}\n }\n </section>\n </div>\n</div>\n", styles: [":host{--drawer-width: 46;--drawer-subdrawer-width: 400px;display:grid;justify-content:flex-end;position:absolute;top:0;height:100%;right:-100%;width:calc(100vw / 100 * var(--drawer-width) + var(--drawer-subdrawer-width));z-index:var(--z-drawer);grid-template-columns:0 1fr var(--drawer-subdrawer-width);transition:right .3s ease-in-out,transform .3s ease-in-out}:host[drawer-opened=true]{right:calc(var(--drawer-subdrawer-width) * -1);box-shadow:var(--drawer-box-shadow)}:host[drawer-extended=true]{width:100vw;right:calc(var(--spacing) * 0);grid-template-columns:1fr calc(var(--drawer-width) * 1%) var(--drawer-subdrawer-width);box-shadow:unset}:is() .dropdown{width:100%}:is() .dropdown-content{width:50%}\n"] }]
10688
10872
  }], ctorParameters: () => [] });
10689
10873
 
10690
- class AdvancedSearchComponent {
10691
- article = input.required(...(ngDevMode ? [{ debugName: "article" }] : []));
10692
- destroyRef = inject(DestroyRef);
10693
- labels = inject(AppStore).getLabels();
10694
- applicationStore = inject(ApplicationStore);
10874
+ class EntitiesPanel {
10875
+ cn = cn;
10695
10876
  appStore = inject(AppStore);
10696
- selectionStore = inject(SelectionStore);
10697
10877
  previewService = inject(PreviewService);
10698
- queryParamsStore = inject(QueryParamsStore);
10699
- input = signal(getState(this.selectionStore).queryText || '', ...(ngDevMode ? [{ debugName: "input" }] : []));
10700
- extracts = computed(() => {
10701
- getState(this.applicationStore);
10702
- if (!this.article())
10703
- return [];
10704
- return this.applicationStore.getExtracts(this.article().id);
10705
- }, ...(ngDevMode ? [{ debugName: "extracts" }] : []));
10706
- similarDocuments = signal([], ...(ngDevMode ? [{ debugName: "similarDocuments" }] : []));
10878
+ article = input.required(...(ngDevMode ? [{ debugName: "article" }] : []));
10707
10879
  previewHighlights = computed(() => {
10708
10880
  const highlights = this.appStore.getWebServiceByType('preview')?.highlights
10709
10881
  ?.split(',')
@@ -10717,42 +10889,10 @@ class AdvancedSearchComponent {
10717
10889
  navigation = signal(undefined, ...(ngDevMode ? [{ debugName: "navigation" }] : []));
10718
10890
  hovering = signal(undefined, ...(ngDevMode ? [{ debugName: "hovering" }] : []));
10719
10891
  hoverIndex = computed(() => (this.navigation()?.value === this.hovering() ? this.navigation().index : 0), ...(ngDevMode ? [{ debugName: "hoverIndex" }] : []));
10720
- hasLabels = computed(() => {
10721
- const article = this.article(); // required as any otherwise the lines below won't compile
10722
- const publicLabels = article[this.labels.public];
10723
- const privateLabels = article[this.labels.private];
10724
- return (publicLabels && publicLabels.length > 0) || (privateLabels && privateLabels.length > 0);
10725
- }, ...(ngDevMode ? [{ debugName: "hasLabels" }] : []));
10726
- loading = signal(true, ...(ngDevMode ? [{ debugName: "loading" }] : []));
10727
- constructor() {
10728
- this.previewService.events.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(event => {
10729
- switch (event) {
10730
- case 'fetching':
10731
- this.loading.set(true);
10732
- break;
10733
- default:
10734
- this.loading.set(false);
10735
- break;
10736
- }
10737
- });
10738
- effect(() => {
10739
- const id = this.article().id;
10740
- untracked(() => {
10741
- const queryName = this.queryParamsStore.getQuery().name;
10742
- fetchSimilarDocuments(id, queryName).then(res => this.similarDocuments.set(res.data));
10743
- });
10744
- });
10745
- }
10746
- executeSearch() {
10747
- this.selectionStore.update({ queryText: this.input() });
10748
- }
10749
- clearInput() {
10750
- this.input.set('');
10751
- }
10752
10892
  scrollTo(type, index, usePassageHighlighter = false) {
10753
10893
  // if previewData contains "matchingpassages" then we use the passage highlighter otherwise we use "extractslocations"
10754
10894
  const category = type || this.previewService.highlightCategory;
10755
- this.previewService.events.emit('scrollTo');
10895
+ this.previewService.events.set('scrollTo');
10756
10896
  this.previewService.sendMessage({ action: 'select', id: `${category}_${index}`, usePassageHighlighter });
10757
10897
  }
10758
10898
  navigateNext(entity, data) {
@@ -10777,14 +10917,399 @@ class AdvancedSearchComponent {
10777
10917
  this.scrollTo(entity, id);
10778
10918
  }
10779
10919
  }
10780
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: AdvancedSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10781
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: AdvancedSearchComponent, isStandalone: true, selector: "advanced-search", inputs: { article: { classPropertyName: "article", publicName: "article", isSignal: true, isRequired: true, transformFunction: null } }, providers: [provideTranslocoScope('drawers')], ngImport: i0, template: "@if (article()) {\n <div class=\"scroll-stable flex h-screen flex-col overflow-y-auto pb-6 pl-6 pr-3\">\n <section class=\"mb-4 mt-6 flex w-full flex-col gap-6\">\n <header\n id=\"panel-control\"\n class=\"focus-within:outline-primary group flex rounded focus-within:outline hover:outline [&:not(:focus-within)]:hover:outline-neutral-300\">\n <div class=\"flex grow items-center gap-2 rounded-e-none rounded-s bg-neutral-50 pl-2 group-hover:bg-white\">\n <input\n id=\"advanced-search-input\"\n type=\"search\"\n class=\"grow bg-neutral-50 focus:outline-none group-hover:bg-white\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [attr.placeholder]=\"'drawers.inputPlaceholder' | transloco\"\n [attr.aria-label]=\"'drawers.inputPlaceholder' | transloco\"\n [ngModel]=\"input()\"\n (ngModelChange)=\"input.set($event)\"\n (keydown.enter)=\"executeSearch()\" />\n\n @if (input() !== '') {\n <button\n variant=\"icon\"\n size=\"icon\"\n [attr.title]=\"'clear' | transloco\"\n [attr.aria-label]=\"'clear' | transloco\"\n (click)=\"clearInput()\"\n (keydown.enter)=\"clearInput()\">\n <i class=\"fa-fw far fa-circle-xmark\"></i>\n </button>\n }\n </div>\n\n <button\n size=\"icon\"\n class=\"rounded-e rounded-s-none group-focus-within:rounded-br-none\"\n [disabled]=\"input() === '' || null\"\n [attr.title]=\"'search' | transloco\"\n [attr.aria-label]=\"'search' | transloco\"\n (click)=\"executeSearch()\">\n <i class=\"fa-fw far fa-magnifying-glass\"></i>\n </button>\n </header>\n </section>\n\n <!-- the same name is used everywhere to simulate an accordion -->\n <!-- extracts -->\n <details name=\"advanced-search-panels\" class=\"group border-b border-neutral-300\" open>\n <summary class=\"sticky top-0 flex cursor-pointer select-none items-baseline justify-between bg-white p-3\">\n <p class=\"flex items-baseline gap-2 font-semibold\">\n <i class=\"fa-fw far fa-magnifying-glass\"></i>\n {{ 'extracts' | transloco }}\n </p>\n\n <i class=\"fa-fw far fa-chevron-down group-open:rotate-180\"></i>\n </summary>\n\n @if (loading()) {\n <div class=\"flex h-32 items-center justify-center\">\n <i class=\"fa-fw far fa-spinner-third fa-spin text-primary\"></i>\n </div>\n } @else {\n <ul>\n @for (extract of extracts(); track $index) {\n <li class=\"hover:bg-highlight mr-2 rounded px-2 py-1\" [id]=\"extract.id\" [attr.data-id]=\"extract.textIndex\">\n <p class=\"cursor-pointer\" role=\"button\" [innerHTML]=\"extract.text\" (click)=\"scrollTo(undefined, extract.textIndex, true)\"></p>\n </li>\n\n <li class=\"mr-2 h-[1px] bg-neutral-200 px-2\"></li>\n } @empty {\n <li class=\"text-slate-300\">{{ 'drawers.noRelevantExtracts' | transloco }}</li>\n }\n </ul>\n }\n </details>\n\n <!-- labels -->\n @if (hasLabels()) {\n <details class=\"group border-b border-neutral-300\" name=\"advanced-search-panels\">\n <summary class=\"sticky top-0 flex cursor-pointer select-none items-baseline justify-between bg-white p-3\">\n <p class=\"flex items-baseline gap-2 font-semibold\">\n <i class=\"fa-fw far fa-tags\"></i>\n {{ 'labels' | transloco }}\n </p>\n\n <i class=\"fa-fw far fa-chevron-down group-open:rotate-180\"></i>\n </summary>\n\n <div>\n <ul class=\"mt-4 flex flex-col flex-wrap gap-2\">\n <li>\n <Metadata variant=\"outline\" [article]=\"article()!\" [metadata]=\"labels.public\" />\n </li>\n\n <li>\n <Metadata variant=\"outline\" [article]=\"article()!\" [metadata]=\"labels.private\" />\n </li>\n </ul>\n </div>\n </details>\n }\n\n <!-- entities -->\n <details name=\"advanced-search-panels\" class=\"group border-b border-neutral-300\">\n <summary class=\"sticky top-0 flex cursor-pointer select-none items-baseline justify-between bg-white p-3\">\n <p class=\"flex items-baseline gap-2 font-semibold capitalize\">\n <i class=\"fa-fw far fa-highlighter\"></i>\n {{ 'entities' | transloco }}\n </p>\n\n <i class=\"fa-fw far fa-chevron-down group-open:rotate-180\"></i>\n </summary>\n @for (highlight of previewHighlights(); track $index) {\n @if (highlight.metadata) {\n <ng-container *ngTemplateOutlet=\"metadataPanel; context: highlight\" />\n }\n }\n </details>\n\n <!-- similar documents -->\n @if (similarDocuments().length > 0) {\n <details class=\"group border-b border-neutral-300\" name=\"advanced-search-panels\">\n <summary class=\"sticky top-0 flex cursor-pointer select-none items-baseline justify-between bg-white p-3\">\n <p class=\"flex items-baseline gap-2 font-semibold\">\n <i class=\"fa-fw far fa-tags\"></i>\n {{ 'drawers.similarDocuments' | transloco }}\n </p>\n\n <i class=\"fa-fw far fa-chevron-down group-open:rotate-180\"></i>\n </summary>\n\n <div>\n <ul class=\"mb-2 mt-4 flex flex-col flex-wrap px-2\" role=\"list\">\n @for (document of similarDocuments(); track $index) {\n <li role=\"listitem\" selectArticleOnClick [article]=\"document\" strategy=\"stack\">\n <div class=\"text-primary flex size-[20px] items-center justify-center rounded-full bg-neutral-50\">\n <source [collection]=\"article().collection\" [connector]=\"article().connector\" class=\"text-xs\" />\n </div>\n\n <span>{{ document.displayTitle ?? document.title }}</span>\n </li>\n }\n </ul>\n </div>\n </details>\n }\n </div>\n}\n\n<!-- entities's template -->\n<ng-template #metadataPanel let-metadata=\"metadata\" let-name=\"name\" let-iconClass=\"iconClass\" let-entity=\"entity\">\n <details name=\"advanced-search-entities\" class=\"group/entities px-3 pb-3\">\n <summary class=\"sticky top-8 flex cursor-pointer select-none items-baseline justify-between bg-white\">\n <p class=\"flex items-baseline gap-2 font-semibold capitalize\">\n <i class=\"fa-fw {{ iconClass || 'far fa-list' }}\"></i>\n {{ name | transloco }}\n </p>\n\n <i class=\"fa-fw far fa-chevron-down group-open/entities:rotate-180\"></i>\n </summary>\n\n <ul role=\"list\">\n @for (data of metadata; track $index) {\n <li role=\"listitem\" class=\"flex justify-between py-1 pl-2\" (mouseenter)=\"hovering.set(data.value)\" (mouseleave)=\"hovering.set(undefined)\">\n <!-- shrink w-1/2 grow truncate ovoid the overlap when hovering the row -->\n <p class=\"w-1/2 shrink grow truncate\">{{ data.display }}</p>\n\n <p class=\"flex items-center gap-2\">\n @if (hovering() === data.value) {\n <i class=\"fa-light fa-chevron-left\" aria-label=\"previous entity\" role=\"button\" (click)=\"navigatePrev(entity, data)\"></i>\n\n <span>{{ hoverIndex() }} / {{ data.count }}</span>\n\n <i class=\"fa-light fa-chevron-right\" aria-label=\"next entity\" role=\"button\" (click)=\"navigateNext(entity, data)\"></i>\n } @else {\n {{ data.count }}\n }\n </p>\n </li>\n }\n </ul>\n </details>\n</ng-template>\n", styles: [":host{--panel-max-height: none}input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "component", type: MetadataComponent, selector: "Metadata, metadata", inputs: ["class", "variant", "metadata", "article", "limit"], outputs: ["click"], exportAs: ["metadata"] }, { kind: "directive", type: ListItemComponent, selector: "[role=\"listitem\"], [role=\"option\"]", inputs: ["class", "variant"] }, { kind: "component", type: SourceComponent, selector: "source, Source", inputs: ["collection", "connector"] }, { kind: "directive", type: SelectArticleOnClickDirective, selector: "[appSelectArticleOnClick],[selectArticleOnClick]", inputs: ["article", "strategy"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
10920
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: EntitiesPanel, deps: [], target: i0.ɵɵFactoryTarget.Component });
10921
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: EntitiesPanel, isStandalone: true, selector: "entities-panel,EntitiesPanel,entitiesPanel", inputs: { article: { classPropertyName: "article", publicName: "article", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
10922
+ <details [class]="cn('group/parent', '[&>details>summary>i>svg]:group-open/entities:rotate-180')" name="advanced-search-panels">
10923
+ <summary class="sticky top-0 flex cursor-pointer select-none items-baseline justify-between p-3">
10924
+ <p class="flex items-baseline gap-2 font-semibold capitalize">
10925
+ <i class="fa-fw far fa-highlighter"></i>
10926
+ {{ 'entities' | transloco }}
10927
+ </p>
10928
+
10929
+ <i class="fa-fw far fa-chevron-down group-open:rotate-180"></i>
10930
+ </summary>
10931
+ @for (highlight of previewHighlights(); track $index) {
10932
+ @if (highlight.metadata) {
10933
+ <ng-container *ngTemplateOutlet="metadataPanel; context: highlight" />
10934
+ }
10935
+ }
10936
+ </details>
10937
+
10938
+ <!-- entities's template -->
10939
+ <ng-template #metadataPanel let-metadata="metadata" let-name="name" let-iconClass="iconClass" let-entity="entity">
10940
+ <details class="group/entities p-3 first:pt-0" name="advanced-search-entities">
10941
+ <summary class="sticky top-8 flex cursor-pointer select-none items-baseline justify-between">
10942
+ <p class="flex items-baseline gap-2 font-semibold capitalize">
10943
+ <i class="fa-fw {{ iconClass || 'far fa-list' }}"></i>
10944
+ {{ name | transloco }}
10945
+ </p>
10946
+
10947
+ <i class="fa-fw far fa-chevron-down"></i>
10948
+ </summary>
10949
+
10950
+ <ul role="list">
10951
+ @for (data of metadata; track $index) {
10952
+ <li role="listitem" class="flex justify-between py-1 pl-2" (mouseenter)="hovering.set(data.value)" (mouseleave)="hovering.set(undefined)">
10953
+ <!-- shrink w-1/2 grow truncate ovoid the overlap when hovering the row -->
10954
+ <p class="w-1/2 shrink grow truncate">{{ data.display }}</p>
10955
+
10956
+ <p class="flex items-center gap-2">
10957
+ @if (hovering() === data.value) {
10958
+ <i class="fa-light fa-chevron-left" aria-label="previous entity" role="button" (click)="navigatePrev(entity, data)"></i>
10959
+
10960
+ <span>{{ hoverIndex() }} / {{ data.count }}</span>
10961
+
10962
+ <i class="fa-light fa-chevron-right" aria-label="next entity" role="button" (click)="navigateNext(entity, data)"></i>
10963
+ } @else {
10964
+ {{ data.count }}
10965
+ }
10966
+ </p>
10967
+ </li>
10968
+ }
10969
+ </ul>
10970
+ </details>
10971
+ </ng-template>
10972
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: ListItemComponent, selector: "[role=\"listitem\"], [role=\"option\"]", inputs: ["class", "variant", "decoration"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
10973
+ }
10974
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: EntitiesPanel, decorators: [{
10975
+ type: Component,
10976
+ args: [{
10977
+ selector: 'entities-panel,EntitiesPanel,entitiesPanel',
10978
+ imports: [TranslocoPipe, NgTemplateOutlet, ListItemComponent],
10979
+ template: `
10980
+ <details [class]="cn('group/parent', '[&>details>summary>i>svg]:group-open/entities:rotate-180')" name="advanced-search-panels">
10981
+ <summary class="sticky top-0 flex cursor-pointer select-none items-baseline justify-between p-3">
10982
+ <p class="flex items-baseline gap-2 font-semibold capitalize">
10983
+ <i class="fa-fw far fa-highlighter"></i>
10984
+ {{ 'entities' | transloco }}
10985
+ </p>
10986
+
10987
+ <i class="fa-fw far fa-chevron-down group-open:rotate-180"></i>
10988
+ </summary>
10989
+ @for (highlight of previewHighlights(); track $index) {
10990
+ @if (highlight.metadata) {
10991
+ <ng-container *ngTemplateOutlet="metadataPanel; context: highlight" />
10992
+ }
10993
+ }
10994
+ </details>
10995
+
10996
+ <!-- entities's template -->
10997
+ <ng-template #metadataPanel let-metadata="metadata" let-name="name" let-iconClass="iconClass" let-entity="entity">
10998
+ <details class="group/entities p-3 first:pt-0" name="advanced-search-entities">
10999
+ <summary class="sticky top-8 flex cursor-pointer select-none items-baseline justify-between">
11000
+ <p class="flex items-baseline gap-2 font-semibold capitalize">
11001
+ <i class="fa-fw {{ iconClass || 'far fa-list' }}"></i>
11002
+ {{ name | transloco }}
11003
+ </p>
11004
+
11005
+ <i class="fa-fw far fa-chevron-down"></i>
11006
+ </summary>
11007
+
11008
+ <ul role="list">
11009
+ @for (data of metadata; track $index) {
11010
+ <li role="listitem" class="flex justify-between py-1 pl-2" (mouseenter)="hovering.set(data.value)" (mouseleave)="hovering.set(undefined)">
11011
+ <!-- shrink w-1/2 grow truncate ovoid the overlap when hovering the row -->
11012
+ <p class="w-1/2 shrink grow truncate">{{ data.display }}</p>
11013
+
11014
+ <p class="flex items-center gap-2">
11015
+ @if (hovering() === data.value) {
11016
+ <i class="fa-light fa-chevron-left" aria-label="previous entity" role="button" (click)="navigatePrev(entity, data)"></i>
11017
+
11018
+ <span>{{ hoverIndex() }} / {{ data.count }}</span>
11019
+
11020
+ <i class="fa-light fa-chevron-right" aria-label="next entity" role="button" (click)="navigateNext(entity, data)"></i>
11021
+ } @else {
11022
+ {{ data.count }}
11023
+ }
11024
+ </p>
11025
+ </li>
11026
+ }
11027
+ </ul>
11028
+ </details>
11029
+ </ng-template>
11030
+ `
11031
+ }]
11032
+ }] });
11033
+
11034
+ class ExtractsPanel {
11035
+ cn = cn;
11036
+ destroyRef = inject(DestroyRef);
11037
+ applicationStore = inject(ApplicationStore);
11038
+ previewService = inject(PreviewService);
11039
+ article = input.required(...(ngDevMode ? [{ debugName: "article" }] : []));
11040
+ loading = signal(true, ...(ngDevMode ? [{ debugName: "loading" }] : []));
11041
+ extracts = signal([], ...(ngDevMode ? [{ debugName: "extracts" }] : []));
11042
+ constructor() {
11043
+ effect(() => {
11044
+ this.loading.set(this.previewService.events() === 'fetching');
11045
+ });
11046
+ effect(() => {
11047
+ const { id } = this.article();
11048
+ if (id && !this.loading()) {
11049
+ this.extracts.set(this.applicationStore.getExtracts(id));
11050
+ }
11051
+ });
11052
+ }
11053
+ scrollTo(type, index, usePassageHighlighter = false) {
11054
+ // if previewData contains "matchingpassages" then we use the passage highlighter otherwise we use "extractslocations"
11055
+ const category = type || this.previewService.highlightCategory;
11056
+ this.previewService.events.set('scrollTo');
11057
+ this.previewService.sendMessage({ action: 'select', id: `${category}_${index}`, usePassageHighlighter });
11058
+ }
11059
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ExtractsPanel, deps: [], target: i0.ɵɵFactoryTarget.Component });
11060
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: ExtractsPanel, isStandalone: true, selector: "extracts-panel, ExtractsPanel, extractspanel", inputs: { article: { classPropertyName: "article", publicName: "article", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
11061
+ <details class="group/parent" name="advanced-search-panels" open>
11062
+ <summary [class]="cn('sticky top-0 flex cursor-pointer select-none items-baseline justify-between p-3', '')">
11063
+ <p class="flex items-baseline gap-2 font-semibold">
11064
+ <i class="fa-fw far fa-tags"></i>
11065
+ {{ 'extracts' | transloco }}
11066
+ </p>
11067
+
11068
+ <i class="fa-fw far fa-chevron-down"></i>
11069
+ </summary>
11070
+
11071
+ @if (loading()) {
11072
+ <div class="flex h-32 items-center justify-center">
11073
+ <i class="fa-fw far fa-spinner-third fa-spin text-primary"></i>
11074
+ </div>
11075
+ } @else {
11076
+ <ul>
11077
+ @for (extract of extracts(); track $index) {
11078
+ <li class="hover:bg-muted mr-2 rounded px-2 py-1" [id]="extract.id" [attr.data-id]="extract.textIndex">
11079
+ <p class="cursor-pointer" role="button" [innerHTML]="extract.text" (click)="scrollTo(undefined, extract.textIndex, true)"></p>
11080
+ </li>
11081
+ } @empty {
11082
+ <li class="text-slate-300">{{ 'drawers.noRelevantExtracts' | transloco }}</li>
11083
+ }
11084
+ </ul>
11085
+ }
11086
+ </details>
11087
+ `, isInline: true, dependencies: [{ kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
10782
11088
  }
10783
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: AdvancedSearchComponent, decorators: [{
11089
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ExtractsPanel, decorators: [{
10784
11090
  type: Component,
10785
- args: [{ selector: 'advanced-search', standalone: true, providers: [provideTranslocoScope('drawers')], imports: [NgTemplateOutlet, FormsModule, ButtonComponent, MetadataComponent, ListItemComponent, TranslocoPipe, SourceComponent, SelectArticleOnClickDirective], template: "@if (article()) {\n <div class=\"scroll-stable flex h-screen flex-col overflow-y-auto pb-6 pl-6 pr-3\">\n <section class=\"mb-4 mt-6 flex w-full flex-col gap-6\">\n <header\n id=\"panel-control\"\n class=\"focus-within:outline-primary group flex rounded focus-within:outline hover:outline [&:not(:focus-within)]:hover:outline-neutral-300\">\n <div class=\"flex grow items-center gap-2 rounded-e-none rounded-s bg-neutral-50 pl-2 group-hover:bg-white\">\n <input\n id=\"advanced-search-input\"\n type=\"search\"\n class=\"grow bg-neutral-50 focus:outline-none group-hover:bg-white\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [attr.placeholder]=\"'drawers.inputPlaceholder' | transloco\"\n [attr.aria-label]=\"'drawers.inputPlaceholder' | transloco\"\n [ngModel]=\"input()\"\n (ngModelChange)=\"input.set($event)\"\n (keydown.enter)=\"executeSearch()\" />\n\n @if (input() !== '') {\n <button\n variant=\"icon\"\n size=\"icon\"\n [attr.title]=\"'clear' | transloco\"\n [attr.aria-label]=\"'clear' | transloco\"\n (click)=\"clearInput()\"\n (keydown.enter)=\"clearInput()\">\n <i class=\"fa-fw far fa-circle-xmark\"></i>\n </button>\n }\n </div>\n\n <button\n size=\"icon\"\n class=\"rounded-e rounded-s-none group-focus-within:rounded-br-none\"\n [disabled]=\"input() === '' || null\"\n [attr.title]=\"'search' | transloco\"\n [attr.aria-label]=\"'search' | transloco\"\n (click)=\"executeSearch()\">\n <i class=\"fa-fw far fa-magnifying-glass\"></i>\n </button>\n </header>\n </section>\n\n <!-- the same name is used everywhere to simulate an accordion -->\n <!-- extracts -->\n <details name=\"advanced-search-panels\" class=\"group border-b border-neutral-300\" open>\n <summary class=\"sticky top-0 flex cursor-pointer select-none items-baseline justify-between bg-white p-3\">\n <p class=\"flex items-baseline gap-2 font-semibold\">\n <i class=\"fa-fw far fa-magnifying-glass\"></i>\n {{ 'extracts' | transloco }}\n </p>\n\n <i class=\"fa-fw far fa-chevron-down group-open:rotate-180\"></i>\n </summary>\n\n @if (loading()) {\n <div class=\"flex h-32 items-center justify-center\">\n <i class=\"fa-fw far fa-spinner-third fa-spin text-primary\"></i>\n </div>\n } @else {\n <ul>\n @for (extract of extracts(); track $index) {\n <li class=\"hover:bg-highlight mr-2 rounded px-2 py-1\" [id]=\"extract.id\" [attr.data-id]=\"extract.textIndex\">\n <p class=\"cursor-pointer\" role=\"button\" [innerHTML]=\"extract.text\" (click)=\"scrollTo(undefined, extract.textIndex, true)\"></p>\n </li>\n\n <li class=\"mr-2 h-[1px] bg-neutral-200 px-2\"></li>\n } @empty {\n <li class=\"text-slate-300\">{{ 'drawers.noRelevantExtracts' | transloco }}</li>\n }\n </ul>\n }\n </details>\n\n <!-- labels -->\n @if (hasLabels()) {\n <details class=\"group border-b border-neutral-300\" name=\"advanced-search-panels\">\n <summary class=\"sticky top-0 flex cursor-pointer select-none items-baseline justify-between bg-white p-3\">\n <p class=\"flex items-baseline gap-2 font-semibold\">\n <i class=\"fa-fw far fa-tags\"></i>\n {{ 'labels' | transloco }}\n </p>\n\n <i class=\"fa-fw far fa-chevron-down group-open:rotate-180\"></i>\n </summary>\n\n <div>\n <ul class=\"mt-4 flex flex-col flex-wrap gap-2\">\n <li>\n <Metadata variant=\"outline\" [article]=\"article()!\" [metadata]=\"labels.public\" />\n </li>\n\n <li>\n <Metadata variant=\"outline\" [article]=\"article()!\" [metadata]=\"labels.private\" />\n </li>\n </ul>\n </div>\n </details>\n }\n\n <!-- entities -->\n <details name=\"advanced-search-panels\" class=\"group border-b border-neutral-300\">\n <summary class=\"sticky top-0 flex cursor-pointer select-none items-baseline justify-between bg-white p-3\">\n <p class=\"flex items-baseline gap-2 font-semibold capitalize\">\n <i class=\"fa-fw far fa-highlighter\"></i>\n {{ 'entities' | transloco }}\n </p>\n\n <i class=\"fa-fw far fa-chevron-down group-open:rotate-180\"></i>\n </summary>\n @for (highlight of previewHighlights(); track $index) {\n @if (highlight.metadata) {\n <ng-container *ngTemplateOutlet=\"metadataPanel; context: highlight\" />\n }\n }\n </details>\n\n <!-- similar documents -->\n @if (similarDocuments().length > 0) {\n <details class=\"group border-b border-neutral-300\" name=\"advanced-search-panels\">\n <summary class=\"sticky top-0 flex cursor-pointer select-none items-baseline justify-between bg-white p-3\">\n <p class=\"flex items-baseline gap-2 font-semibold\">\n <i class=\"fa-fw far fa-tags\"></i>\n {{ 'drawers.similarDocuments' | transloco }}\n </p>\n\n <i class=\"fa-fw far fa-chevron-down group-open:rotate-180\"></i>\n </summary>\n\n <div>\n <ul class=\"mb-2 mt-4 flex flex-col flex-wrap px-2\" role=\"list\">\n @for (document of similarDocuments(); track $index) {\n <li role=\"listitem\" selectArticleOnClick [article]=\"document\" strategy=\"stack\">\n <div class=\"text-primary flex size-[20px] items-center justify-center rounded-full bg-neutral-50\">\n <source [collection]=\"article().collection\" [connector]=\"article().connector\" class=\"text-xs\" />\n </div>\n\n <span>{{ document.displayTitle ?? document.title }}</span>\n </li>\n }\n </ul>\n </div>\n </details>\n }\n </div>\n}\n\n<!-- entities's template -->\n<ng-template #metadataPanel let-metadata=\"metadata\" let-name=\"name\" let-iconClass=\"iconClass\" let-entity=\"entity\">\n <details name=\"advanced-search-entities\" class=\"group/entities px-3 pb-3\">\n <summary class=\"sticky top-8 flex cursor-pointer select-none items-baseline justify-between bg-white\">\n <p class=\"flex items-baseline gap-2 font-semibold capitalize\">\n <i class=\"fa-fw {{ iconClass || 'far fa-list' }}\"></i>\n {{ name | transloco }}\n </p>\n\n <i class=\"fa-fw far fa-chevron-down group-open/entities:rotate-180\"></i>\n </summary>\n\n <ul role=\"list\">\n @for (data of metadata; track $index) {\n <li role=\"listitem\" class=\"flex justify-between py-1 pl-2\" (mouseenter)=\"hovering.set(data.value)\" (mouseleave)=\"hovering.set(undefined)\">\n <!-- shrink w-1/2 grow truncate ovoid the overlap when hovering the row -->\n <p class=\"w-1/2 shrink grow truncate\">{{ data.display }}</p>\n\n <p class=\"flex items-center gap-2\">\n @if (hovering() === data.value) {\n <i class=\"fa-light fa-chevron-left\" aria-label=\"previous entity\" role=\"button\" (click)=\"navigatePrev(entity, data)\"></i>\n\n <span>{{ hoverIndex() }} / {{ data.count }}</span>\n\n <i class=\"fa-light fa-chevron-right\" aria-label=\"next entity\" role=\"button\" (click)=\"navigateNext(entity, data)\"></i>\n } @else {\n {{ data.count }}\n }\n </p>\n </li>\n }\n </ul>\n </details>\n</ng-template>\n", styles: [":host{--panel-max-height: none}input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none}\n"] }]
11091
+ args: [{
11092
+ selector: 'extracts-panel, ExtractsPanel, extractspanel',
11093
+ imports: [TranslocoPipe],
11094
+ template: `
11095
+ <details class="group/parent" name="advanced-search-panels" open>
11096
+ <summary [class]="cn('sticky top-0 flex cursor-pointer select-none items-baseline justify-between p-3', '')">
11097
+ <p class="flex items-baseline gap-2 font-semibold">
11098
+ <i class="fa-fw far fa-tags"></i>
11099
+ {{ 'extracts' | transloco }}
11100
+ </p>
11101
+
11102
+ <i class="fa-fw far fa-chevron-down"></i>
11103
+ </summary>
11104
+
11105
+ @if (loading()) {
11106
+ <div class="flex h-32 items-center justify-center">
11107
+ <i class="fa-fw far fa-spinner-third fa-spin text-primary"></i>
11108
+ </div>
11109
+ } @else {
11110
+ <ul>
11111
+ @for (extract of extracts(); track $index) {
11112
+ <li class="hover:bg-muted mr-2 rounded px-2 py-1" [id]="extract.id" [attr.data-id]="extract.textIndex">
11113
+ <p class="cursor-pointer" role="button" [innerHTML]="extract.text" (click)="scrollTo(undefined, extract.textIndex, true)"></p>
11114
+ </li>
11115
+ } @empty {
11116
+ <li class="text-slate-300">{{ 'drawers.noRelevantExtracts' | transloco }}</li>
11117
+ }
11118
+ </ul>
11119
+ }
11120
+ </details>
11121
+ `
11122
+ }]
10786
11123
  }], ctorParameters: () => [] });
10787
11124
 
11125
+ class LabelsPanel {
11126
+ labels = inject(AppStore).getLabels();
11127
+ article = input.required(...(ngDevMode ? [{ debugName: "article" }] : []));
11128
+ hasLabels = computed(() => {
11129
+ const article = this.article(); // required as any otherwise the lines below won't compile
11130
+ const publicLabels = article[this.labels.public];
11131
+ const privateLabels = article[this.labels.private];
11132
+ return (publicLabels && publicLabels.length > 0) || (privateLabels && privateLabels.length > 0);
11133
+ }, ...(ngDevMode ? [{ debugName: "hasLabels" }] : []));
11134
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: LabelsPanel, deps: [], target: i0.ɵɵFactoryTarget.Component });
11135
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: LabelsPanel, isStandalone: true, selector: "labels-panel, LabelsPanel, labelspanel", inputs: { article: { classPropertyName: "article", publicName: "article", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
11136
+ @if (hasLabels()) {
11137
+ <details class="group/parent" name="advanced-search-panels">
11138
+ <summary class="sticky top-0 flex cursor-pointer select-none items-baseline justify-between p-3">
11139
+ <p class="flex items-baseline gap-2 font-semibold">
11140
+ <i class="fa-fw far fa-tags"></i>
11141
+ {{ 'labels' | transloco }}
11142
+ </p>
11143
+
11144
+ <i class="fa-fw far fa-chevron-down group-open:rotate-180"></i>
11145
+ </summary>
11146
+
11147
+ <div>
11148
+ <ul class="mt-4 flex flex-col flex-wrap gap-2">
11149
+ <li>
11150
+ <Metadata decoration="outline" hover="yes" [article]="article()!" [metadata]="labels.public" />
11151
+ </li>
11152
+
11153
+ <li>
11154
+ <Metadata decoration="outline" hover="yes" [article]="article()!" [metadata]="labels.private" />
11155
+ </li>
11156
+ </ul>
11157
+ </div>
11158
+ </details>
11159
+ }
11160
+ `, isInline: true, dependencies: [{ kind: "component", type: MetadataComponent, selector: "Metadata, metadata", inputs: ["class", "variant", "decoration", "hover", "metadata", "article", "limit"], outputs: ["click"], exportAs: ["metadata"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
11161
+ }
11162
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: LabelsPanel, decorators: [{
11163
+ type: Component,
11164
+ args: [{
11165
+ selector: 'labels-panel, LabelsPanel, labelspanel',
11166
+ imports: [TranslocoPipe, MetadataComponent],
11167
+ template: `
11168
+ @if (hasLabels()) {
11169
+ <details class="group/parent" name="advanced-search-panels">
11170
+ <summary class="sticky top-0 flex cursor-pointer select-none items-baseline justify-between p-3">
11171
+ <p class="flex items-baseline gap-2 font-semibold">
11172
+ <i class="fa-fw far fa-tags"></i>
11173
+ {{ 'labels' | transloco }}
11174
+ </p>
11175
+
11176
+ <i class="fa-fw far fa-chevron-down group-open:rotate-180"></i>
11177
+ </summary>
11178
+
11179
+ <div>
11180
+ <ul class="mt-4 flex flex-col flex-wrap gap-2">
11181
+ <li>
11182
+ <Metadata decoration="outline" hover="yes" [article]="article()!" [metadata]="labels.public" />
11183
+ </li>
11184
+
11185
+ <li>
11186
+ <Metadata decoration="outline" hover="yes" [article]="article()!" [metadata]="labels.private" />
11187
+ </li>
11188
+ </ul>
11189
+ </div>
11190
+ </details>
11191
+ }
11192
+ `
11193
+ }]
11194
+ }] });
11195
+
11196
+ class SimilarDocumentsPanel {
11197
+ queryParamsStore = inject(QueryParamsStore);
11198
+ article = input.required(...(ngDevMode ? [{ debugName: "article" }] : []));
11199
+ queryName = computed(() => this.queryParamsStore.getQuery().name, ...(ngDevMode ? [{ debugName: "queryName" }] : []));
11200
+ similarDocumentsResource = resource({
11201
+ params: () => {
11202
+ const { id } = this.article() || {};
11203
+ return { id };
11204
+ },
11205
+ loader: ({ params: { id }, abortSignal }) => {
11206
+ const queryName = this.queryName();
11207
+ return fetchSimilarDocuments(id, queryName, abortSignal);
11208
+ },
11209
+ defaultValue: []
11210
+ });
11211
+ similarDocuments = computed(() => {
11212
+ if (this.similarDocumentsResource.hasValue()) {
11213
+ return this.similarDocumentsResource.value() || [];
11214
+ }
11215
+ return [];
11216
+ }, ...(ngDevMode ? [{ debugName: "similarDocuments" }] : []));
11217
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SimilarDocumentsPanel, deps: [], target: i0.ɵɵFactoryTarget.Component });
11218
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: SimilarDocumentsPanel, isStandalone: true, selector: "similar-documents-panel, SimilarDocumentsPanel, similardocumentspanel", inputs: { article: { classPropertyName: "article", publicName: "article", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
11219
+ @if (similarDocuments().length > 0) {
11220
+ <details class="group/parent" name="advanced-search-panels">
11221
+ <summary class="sticky top-0 flex cursor-pointer select-none items-baseline justify-between p-3">
11222
+ <p class="flex items-baseline gap-2 font-semibold">
11223
+ <i class="fa-fw far fa-tags"></i>
11224
+ {{ 'drawers.similarDocuments' | transloco }}
11225
+ </p>
11226
+
11227
+ <i class="fa-fw far fa-chevron-down group-open:rotate-180"></i>
11228
+ </summary>
11229
+
11230
+ <div>
11231
+ <ul class="mb-2 mt-4 flex flex-col flex-wrap px-2" role="list">
11232
+ @for (document of similarDocuments(); track $index) {
11233
+ <li role="listitem" selectArticleOnClick [article]="document" strategy="stack">
11234
+ <div class="text-primary flex size-[20px] items-center justify-center rounded-full">
11235
+ <source [collection]="article().collection" [connector]="article().connector" class="text-xs" />
11236
+ </div>
11237
+
11238
+ <span>{{ document.displayTitle ?? document.title }}</span>
11239
+ </li>
11240
+ }
11241
+ </ul>
11242
+ </div>
11243
+ </details>
11244
+ }
11245
+ `, isInline: true, dependencies: [{ kind: "directive", type: SelectArticleOnClickDirective, selector: "[selectArticleOnClick]", inputs: ["article", "strategy"] }, { kind: "component", type: SourceComponent, selector: "source, Source", inputs: ["collection", "connector"] }, { kind: "directive", type: ListItemComponent, selector: "[role=\"listitem\"], [role=\"option\"]", inputs: ["class", "variant", "decoration"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
11246
+ }
11247
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SimilarDocumentsPanel, decorators: [{
11248
+ type: Component,
11249
+ args: [{
11250
+ selector: 'similar-documents-panel, SimilarDocumentsPanel, similardocumentspanel',
11251
+ imports: [TranslocoPipe, SelectArticleOnClickDirective, SourceComponent, ListItemComponent],
11252
+ template: `
11253
+ @if (similarDocuments().length > 0) {
11254
+ <details class="group/parent" name="advanced-search-panels">
11255
+ <summary class="sticky top-0 flex cursor-pointer select-none items-baseline justify-between p-3">
11256
+ <p class="flex items-baseline gap-2 font-semibold">
11257
+ <i class="fa-fw far fa-tags"></i>
11258
+ {{ 'drawers.similarDocuments' | transloco }}
11259
+ </p>
11260
+
11261
+ <i class="fa-fw far fa-chevron-down group-open:rotate-180"></i>
11262
+ </summary>
11263
+
11264
+ <div>
11265
+ <ul class="mb-2 mt-4 flex flex-col flex-wrap px-2" role="list">
11266
+ @for (document of similarDocuments(); track $index) {
11267
+ <li role="listitem" selectArticleOnClick [article]="document" strategy="stack">
11268
+ <div class="text-primary flex size-[20px] items-center justify-center rounded-full">
11269
+ <source [collection]="article().collection" [connector]="article().connector" class="text-xs" />
11270
+ </div>
11271
+
11272
+ <span>{{ document.displayTitle ?? document.title }}</span>
11273
+ </li>
11274
+ }
11275
+ </ul>
11276
+ </div>
11277
+ </details>
11278
+ }
11279
+ `
11280
+ }]
11281
+ }] });
11282
+
11283
+ class AdvancedSearchComponent {
11284
+ cn = cn;
11285
+ article = input.required(...(ngDevMode ? [{ debugName: "article" }] : []));
11286
+ selectionStore = inject(SelectionStore);
11287
+ queryParamsStore = inject(QueryParamsStore);
11288
+ queryText = linkedSignal({
11289
+ source: () => {
11290
+ const { queryText } = getState(this.selectionStore);
11291
+ return queryText;
11292
+ },
11293
+ computation: queryText => {
11294
+ const text = queryText || '';
11295
+ return text ? text.trim() : '';
11296
+ }
11297
+ });
11298
+ queryName = computed(() => this.queryParamsStore.getQuery().name, ...(ngDevMode ? [{ debugName: "queryName" }] : []));
11299
+ executeSearch() {
11300
+ this.selectionStore.update({ queryText: this.queryText() });
11301
+ }
11302
+ clearInput() {
11303
+ this.queryText.set('');
11304
+ }
11305
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: AdvancedSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11306
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: AdvancedSearchComponent, isStandalone: true, selector: "advanced-search", inputs: { article: { classPropertyName: "article", publicName: "article", isSignal: true, isRequired: true, transformFunction: null } }, providers: [provideTranslocoScope('drawers')], ngImport: i0, template: "@if (article()) {\n <div\n [class]=\"\n cn(\n 'scroll-stable flex h-screen flex-col overflow-y-auto pb-6 pl-6 pr-3',\n '[&_details]:border-muted-foreground/18 [&_details]:border-b',\n '[&_details>summary]:bg-menu [&_details_details]:last:border-b-0',\n '[&_details>summary>i>svg]:transition-transform [&_details>summary>i>svg]:duration-300',\n '[&>details>summary>i>svg]:group-open/parent:rotate-180'\n )\n \">\n <section class=\"mb-4 mt-6 flex w-full flex-col gap-6\">\n <header\n id=\"panel-control\"\n class=\"focus-within:outline-primary [&:not(:focus-within)]:hover:outline-muted-foreground group flex rounded focus-within:outline hover:outline\">\n <div class=\"bg-muted flex grow items-center gap-2 rounded-e-none rounded-s px-3\">\n <input\n id=\"advanced-search-input\"\n type=\"search\"\n class=\"grow focus:outline-none\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [attr.placeholder]=\"'drawers.inputPlaceholder' | transloco\"\n [attr.aria-label]=\"'drawers.inputPlaceholder' | transloco\"\n [ngModel]=\"queryText()\"\n (ngModelChange)=\"queryText.set($event)\"\n (keydown.enter)=\"executeSearch()\" />\n\n @if (queryText() !== '') {\n <button\n variant=\"icon\"\n size=\"xs\"\n [attr.title]=\"'clear' | transloco\"\n [attr.aria-label]=\"'clear' | transloco\"\n (click)=\"clearInput()\"\n (keydown.enter)=\"clearInput()\">\n <i class=\"fa-fw far fa-xmark\"></i>\n </button>\n }\n </div>\n\n <button\n size=\"default\"\n class=\"size-8 rounded-e rounded-s-none\"\n [disabled]=\"queryText() === '' || null\"\n [attr.title]=\"'search' | transloco\"\n [attr.aria-label]=\"'search' | transloco\"\n (click)=\"executeSearch()\">\n <i class=\"fa-fw far fa-magnifying-glass\"></i>\n </button>\n </header>\n </section>\n\n <!-- the same name is used everywhere to simulate an accordion -->\n <!-- extracts -->\n <ExtractsPanel [article]=\"article()\" />\n\n <!-- labels -->\n <LabelsPanel [article]=\"article()\" />\n\n <!-- entities -->\n <EntitiesPanel [article]=\"article()\" />\n\n <!-- similar documents -->\n <SimilarDocumentsPanel [article]=\"article()\" />\n </div>\n}\n", styles: [":host{--panel-max-height: none}input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "decoration", "size"] }, { kind: "component", type: SimilarDocumentsPanel, selector: "similar-documents-panel, SimilarDocumentsPanel, similardocumentspanel", inputs: ["article"] }, { kind: "component", type: EntitiesPanel, selector: "entities-panel,EntitiesPanel,entitiesPanel", inputs: ["article"] }, { kind: "component", type: LabelsPanel, selector: "labels-panel, LabelsPanel, labelspanel", inputs: ["article"] }, { kind: "component", type: ExtractsPanel, selector: "extracts-panel, ExtractsPanel, extractspanel", inputs: ["article"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
11307
+ }
11308
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: AdvancedSearchComponent, decorators: [{
11309
+ type: Component,
11310
+ args: [{ selector: 'advanced-search', standalone: true, providers: [provideTranslocoScope('drawers')], imports: [FormsModule, ButtonComponent, TranslocoPipe, SimilarDocumentsPanel, EntitiesPanel, LabelsPanel, ExtractsPanel], template: "@if (article()) {\n <div\n [class]=\"\n cn(\n 'scroll-stable flex h-screen flex-col overflow-y-auto pb-6 pl-6 pr-3',\n '[&_details]:border-muted-foreground/18 [&_details]:border-b',\n '[&_details>summary]:bg-menu [&_details_details]:last:border-b-0',\n '[&_details>summary>i>svg]:transition-transform [&_details>summary>i>svg]:duration-300',\n '[&>details>summary>i>svg]:group-open/parent:rotate-180'\n )\n \">\n <section class=\"mb-4 mt-6 flex w-full flex-col gap-6\">\n <header\n id=\"panel-control\"\n class=\"focus-within:outline-primary [&:not(:focus-within)]:hover:outline-muted-foreground group flex rounded focus-within:outline hover:outline\">\n <div class=\"bg-muted flex grow items-center gap-2 rounded-e-none rounded-s px-3\">\n <input\n id=\"advanced-search-input\"\n type=\"search\"\n class=\"grow focus:outline-none\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [attr.placeholder]=\"'drawers.inputPlaceholder' | transloco\"\n [attr.aria-label]=\"'drawers.inputPlaceholder' | transloco\"\n [ngModel]=\"queryText()\"\n (ngModelChange)=\"queryText.set($event)\"\n (keydown.enter)=\"executeSearch()\" />\n\n @if (queryText() !== '') {\n <button\n variant=\"icon\"\n size=\"xs\"\n [attr.title]=\"'clear' | transloco\"\n [attr.aria-label]=\"'clear' | transloco\"\n (click)=\"clearInput()\"\n (keydown.enter)=\"clearInput()\">\n <i class=\"fa-fw far fa-xmark\"></i>\n </button>\n }\n </div>\n\n <button\n size=\"default\"\n class=\"size-8 rounded-e rounded-s-none\"\n [disabled]=\"queryText() === '' || null\"\n [attr.title]=\"'search' | transloco\"\n [attr.aria-label]=\"'search' | transloco\"\n (click)=\"executeSearch()\">\n <i class=\"fa-fw far fa-magnifying-glass\"></i>\n </button>\n </header>\n </section>\n\n <!-- the same name is used everywhere to simulate an accordion -->\n <!-- extracts -->\n <ExtractsPanel [article]=\"article()\" />\n\n <!-- labels -->\n <LabelsPanel [article]=\"article()\" />\n\n <!-- entities -->\n <EntitiesPanel [article]=\"article()\" />\n\n <!-- similar documents -->\n <SimilarDocumentsPanel [article]=\"article()\" />\n </div>\n}\n", styles: [":host{--panel-max-height: none}input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none}\n"] }]
11311
+ }] });
11312
+
10788
11313
  const COMPONENTS_FOR_DOCUMENT_TYPE = new InjectionToken('COMPONENTS_FOR_DOCUMENT_TYPE');
10789
11314
  const GLOBAL_QUERY_NAME = new InjectionToken('GLOBAL_QUERY_NAME', {
10790
11315
  factory() {
@@ -10799,69 +11324,44 @@ const GLOBAL_QUERY_NAME = new InjectionToken('GLOBAL_QUERY_NAME', {
10799
11324
  class DrawerPreviewComponent extends DrawerComponent {
10800
11325
  globalQueryName;
10801
11326
  destroyRef;
11327
+ /* injections */
10802
11328
  injector = inject(Injector);
10803
11329
  appStore = inject(AppStore);
10804
11330
  selectionStore = inject(SelectionStore);
10805
11331
  queryParamsStore = inject(QueryParamsStore);
10806
11332
  previewService = inject(PreviewService);
10807
11333
  getComponentsForDocumentType = inject(COMPONENTS_FOR_DOCUMENT_TYPE);
11334
+ /* inputs */
11335
+ articleId = input.required(...(ngDevMode ? [{ debugName: "articleId" }] : []));
11336
+ /* computed signals */
10808
11337
  queryText = computed(() => {
10809
11338
  const { queryText } = getState(this.selectionStore);
10810
11339
  const { text } = getState(this.queryParamsStore);
10811
11340
  return queryText ?? text;
10812
11341
  }, ...(ngDevMode ? [{ debugName: "queryText" }] : []));
10813
- articleId = input.required(...(ngDevMode ? [{ debugName: "articleId" }] : []));
10814
- previewData = signal(undefined, ...(ngDevMode ? [{ debugName: "previewData" }] : []));
10815
- article = computed(() => this.previewData()?.record, ...(ngDevMode ? [{ debugName: "article" }] : []));
10816
- inputs = computed(() => ({ previewData: this.previewData() }), ...(ngDevMode ? [{ debugName: "inputs" }] : []));
10817
- previewType = computed(() => {
10818
- return this.getComponentsForDocumentType(this.article()?.docformat || '').previewComponent;
10819
- }, ...(ngDevMode ? [{ debugName: "previewType" }] : []));
11342
+ article = computed(() => {
11343
+ const { article } = getState(this.selectionStore);
11344
+ return article;
11345
+ }, ...(ngDevMode ? [{ debugName: "article" }] : []));
11346
+ previewType = computed(() => this.getComponentsForDocumentType(this.article()?.docformat || '').previewComponent, ...(ngDevMode ? [{ debugName: "previewType" }] : []));
10820
11347
  constructor(globalQueryName, destroyRef) {
10821
11348
  super();
10822
11349
  this.globalQueryName = globalQueryName;
10823
11350
  this.destroyRef = destroyRef;
10824
11351
  this.destroyRef.onDestroy(() => {
10825
- this.previewService.close(this.articleId(), { name: this.globalQueryName });
10826
- });
10827
- effect(() => {
10828
- const articleId = this.articleId();
10829
- const text = this.queryText();
10830
- untracked(async () => {
10831
- const state = getState(this.selectionStore);
10832
- try {
10833
- const previewData = await firstValueFrom(this.previewService.preview(articleId, {
10834
- name: this.globalQueryName,
10835
- text
10836
- }, state.previewHighlights?.highlights));
10837
- this.previewData.set(previewData);
10838
- }
10839
- catch (err) {
10840
- this.previewData.set(undefined);
10841
- if (err.status === 401) {
10842
- error('preview service 401: ', err);
10843
- this.drawerStack.close();
10844
- runInInjectionContext(this.injector, () => signIn().then(() => {
10845
- const { useCredentials } = globalConfig;
10846
- if (!useCredentials) {
10847
- notify.success('You have been signed in.');
10848
- }
10849
- }));
10850
- }
10851
- else {
10852
- error('Error fetching preview data:', err);
10853
- throw err;
10854
- }
10855
- }
10856
- });
11352
+ if (this.articleId()) {
11353
+ this.previewService.close(this.articleId(), { name: this.globalQueryName });
11354
+ }
10857
11355
  });
10858
11356
  }
10859
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: DrawerPreviewComponent, deps: [{ token: GLOBAL_QUERY_NAME }, { token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Component });
10860
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: DrawerPreviewComponent, isStandalone: true, selector: "app-drawer-preview", inputs: { articleId: { classPropertyName: "articleId", publicName: "articleId", isSignal: true, isRequired: true, transformFunction: null } }, providers: [DrawerService, PreviewService], usesInheritance: true, ngImport: i0, template: "<div (click)=\"drawer.toggleExtension()\" (keydown.escape)=\"drawer.toggleExtension()\" [attr.aria-hidden]=\"true\"></div>\n\n<div class=\"flex overflow-auto bg-white\">\n <div\n #drawerHandle\n class=\"fixed h-full w-[5px] select-none hover:cursor-ew-resize hover:bg-orange-300\"\n [ngClass]=\"{ hidden: (drawer.isExtended | async) === false }\"></div>\n\n @if (previewType()) {\n <ng-container *ngComponentOutlet=\"previewType()!; inputs: inputs()\" />\n }\n</div>\n\n@if (article()) {\n <div class=\"flex flex-col border-l border-gray-200 bg-white\">\n <div class=\"relative flex grow flex-col\">\n <advanced-search class=\"absolute h-full w-full overflow-y-auto\" [article]=\"article()!\" (close)=\"drawer.collapse()\" />\n </div>\n </div>\n}\n", styles: [":host{--drawer-width: 46;--drawer-subdrawer-width: 400px;display:grid;height:100%;top:0;right:-100%;justify-content:flex-end;width:calc(100vw / 100 * var(--drawer-width) + var(--drawer-subdrawer-width));z-index:var(--z-drawer);grid-template-columns:0 1fr var(--drawer-subdrawer-width);transition:right .3s ease-in-out,transform .3s ease-in-out}:host[drawer-opened=true]{right:calc(var(--drawer-subdrawer-width) * -1);box-shadow:var(--drawer-box-shadow)}:host[drawer-extended=true]{right:0;width:100vw;grid-template-columns:1fr calc(var(--drawer-width) * 1%) var(--drawer-subdrawer-width);box-shadow:unset}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "component", type: AdvancedSearchComponent, selector: "advanced-search", inputs: ["article"] }, { kind: "pipe", type: AsyncPipe, name: "async" }] });
11357
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: DrawerPreviewComponent, deps: [{ token: GLOBAL_QUERY_NAME }, { token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Component });
11358
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: DrawerPreviewComponent, isStandalone: true, selector: "DrawerPreview, drawerpreview", inputs: { articleId: { classPropertyName: "articleId", publicName: "articleId", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: "bg-transparent text-foreground" }, providers: [DrawerService, PreviewService], usesInheritance: true, ngImport: i0, template: "<!-- when the extended panel is open clicking in the backdrop panel close it -->\n<div (click)=\"drawer.toggleExtension()\" (keydown.escape)=\"drawer.toggleExtension()\" [attr.aria-hidden]=\"true\"></div>\n\n<div class=\"bg-menu flex overflow-auto\">\n <!-- Drawer handle when extended -->\n <div\n #drawerHandle\n class=\"fixed h-full w-[5px] select-none hover:cursor-ew-resize hover:bg-orange-300\"\n [ngClass]=\"{ hidden: drawer.isExtended() === false }\"></div>\n\n @if (previewType()) {\n <ng-container *ngComponentOutlet=\"previewType()\" />\n }\n</div>\n\n<!-- this is the extended panel -->\n@if (article() && drawer.isExtended()) {\n <div class=\"bg-menu border-foreground/18 flex flex-col border-l\">\n <div class=\"relative flex grow flex-col\">\n <advanced-search class=\"absolute h-full w-full overflow-y-auto\" [article]=\"article()!\" (close)=\"drawer.collapse()\" />\n </div>\n </div>\n}\n", styles: [":host{--drawer-width: 46;--drawer-subdrawer-width: 400px;display:grid;height:100%;top:0;right:-100%;justify-content:flex-end;width:calc(100vw / 100 * var(--drawer-width) + var(--drawer-subdrawer-width));z-index:var(--z-drawer);grid-template-columns:0 1fr var(--drawer-subdrawer-width);transition:right .3s ease-in-out,transform .3s ease-in-out}:host[drawer-opened=true]{right:calc(var(--drawer-subdrawer-width) * -1);box-shadow:var(--drawer-box-shadow)}:host[drawer-extended=true]{right:0;width:100vw;grid-template-columns:1fr calc(var(--drawer-width) * 1%) var(--drawer-subdrawer-width);box-shadow:unset}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "component", type: AdvancedSearchComponent, selector: "advanced-search", inputs: ["article"] }] });
10861
11359
  }
10862
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: DrawerPreviewComponent, decorators: [{
11360
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: DrawerPreviewComponent, decorators: [{
10863
11361
  type: Component,
10864
- args: [{ selector: 'app-drawer-preview', standalone: true, imports: [NgClass, NgComponentOutlet, AsyncPipe, AdvancedSearchComponent], providers: [DrawerService, PreviewService], template: "<div (click)=\"drawer.toggleExtension()\" (keydown.escape)=\"drawer.toggleExtension()\" [attr.aria-hidden]=\"true\"></div>\n\n<div class=\"flex overflow-auto bg-white\">\n <div\n #drawerHandle\n class=\"fixed h-full w-[5px] select-none hover:cursor-ew-resize hover:bg-orange-300\"\n [ngClass]=\"{ hidden: (drawer.isExtended | async) === false }\"></div>\n\n @if (previewType()) {\n <ng-container *ngComponentOutlet=\"previewType()!; inputs: inputs()\" />\n }\n</div>\n\n@if (article()) {\n <div class=\"flex flex-col border-l border-gray-200 bg-white\">\n <div class=\"relative flex grow flex-col\">\n <advanced-search class=\"absolute h-full w-full overflow-y-auto\" [article]=\"article()!\" (close)=\"drawer.collapse()\" />\n </div>\n </div>\n}\n", styles: [":host{--drawer-width: 46;--drawer-subdrawer-width: 400px;display:grid;height:100%;top:0;right:-100%;justify-content:flex-end;width:calc(100vw / 100 * var(--drawer-width) + var(--drawer-subdrawer-width));z-index:var(--z-drawer);grid-template-columns:0 1fr var(--drawer-subdrawer-width);transition:right .3s ease-in-out,transform .3s ease-in-out}:host[drawer-opened=true]{right:calc(var(--drawer-subdrawer-width) * -1);box-shadow:var(--drawer-box-shadow)}:host[drawer-extended=true]{right:0;width:100vw;grid-template-columns:1fr calc(var(--drawer-width) * 1%) var(--drawer-subdrawer-width);box-shadow:unset}\n"] }]
11362
+ args: [{ selector: 'DrawerPreview, drawerpreview', standalone: true, imports: [NgClass, NgComponentOutlet, AdvancedSearchComponent], providers: [DrawerService, PreviewService], host: {
11363
+ class: 'bg-transparent text-foreground'
11364
+ }, template: "<!-- when the extended panel is open clicking in the backdrop panel close it -->\n<div (click)=\"drawer.toggleExtension()\" (keydown.escape)=\"drawer.toggleExtension()\" [attr.aria-hidden]=\"true\"></div>\n\n<div class=\"bg-menu flex overflow-auto\">\n <!-- Drawer handle when extended -->\n <div\n #drawerHandle\n class=\"fixed h-full w-[5px] select-none hover:cursor-ew-resize hover:bg-orange-300\"\n [ngClass]=\"{ hidden: drawer.isExtended() === false }\"></div>\n\n @if (previewType()) {\n <ng-container *ngComponentOutlet=\"previewType()\" />\n }\n</div>\n\n<!-- this is the extended panel -->\n@if (article() && drawer.isExtended()) {\n <div class=\"bg-menu border-foreground/18 flex flex-col border-l\">\n <div class=\"relative flex grow flex-col\">\n <advanced-search class=\"absolute h-full w-full overflow-y-auto\" [article]=\"article()!\" (close)=\"drawer.collapse()\" />\n </div>\n </div>\n}\n", styles: [":host{--drawer-width: 46;--drawer-subdrawer-width: 400px;display:grid;height:100%;top:0;right:-100%;justify-content:flex-end;width:calc(100vw / 100 * var(--drawer-width) + var(--drawer-subdrawer-width));z-index:var(--z-drawer);grid-template-columns:0 1fr var(--drawer-subdrawer-width);transition:right .3s ease-in-out,transform .3s ease-in-out}:host[drawer-opened=true]{right:calc(var(--drawer-subdrawer-width) * -1);box-shadow:var(--drawer-box-shadow)}:host[drawer-extended=true]{right:0;width:100vw;grid-template-columns:1fr calc(var(--drawer-width) * 1%) var(--drawer-subdrawer-width);box-shadow:unset}\n"] }]
10865
11365
  }], ctorParameters: () => [{ type: undefined, decorators: [{
10866
11366
  type: Inject,
10867
11367
  args: [GLOBAL_QUERY_NAME]
@@ -10875,5 +11375,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
10875
11375
  * Generated bundle index. Do not edit.
10876
11376
  */
10877
11377
 
10878
- export { AGGREGATIONS_NAMES, AGGREGATIONS_NAMES_PRESET_DEFAULT, APP_FEATURES, AdvancedSearchComponent, AggregationComponent, AggregationsService, AggregationsStore, Alert, AlertDialog, AlertsComponent, AppService, AppStore, ApplicationService, ApplicationStore, AuditFeedbackType, AuditService, AuthGuard, AutocompleteService, BOOKMARKS_CONFIG, BOOKMARKS_OPTIONS, BackdropComponent, BackdropService, BookmarkButtonComponent, BookmarksComponent, COLLECTIONS_CONFIG, COLLECTIONS_OPTIONS, COMPONENTS_FOR_DOCUMENT_TYPE, ChildMarkerDirective, CollectionsComponent, CollectionsDialog, DRAWER_COMPONENT, DRAWER_STACK_MAX_COUNT, DateComponent, DeleteCollectionDialog, DidYouMeanComponent, DocumentLocatorComponent, DrawerAdvancedFiltersComponent, DrawerComponent, DrawerNavbarComponent, DrawerPreviewComponent, DrawerService, DrawerStackComponent, DrawerStackService, DropdownInputComponent, DropdownListComponent, ErrorComponent, ExportDialog, ExportService, FILTERS_BREAKPOINT, FILTER_DATE_ALLOW_CUSTOM_RANGE, FeedbackDialogComponent, FilterButtonComponent, FiltersBarComponent, HIGHLIGHTS, HighlightWordPipe, InfinityScrollDirective, InlineWorker, JsonMethodPluginService, KeyboardNavigatorDirective, LabelService, LabelsEditDialog, LoadingComponent, MetadataComponent, MissingTermsComponent, MoreButtonComponent, MoreComponent, MultiSelectLabelsComponent, MultiSelectionToolbarComponent, NON_SEARCHABLE_COLUMNS, NON_SEARCHABLE_DEFAULTS, NavbarTabsComponent, NavigationService, NoResultComponent, OpenArticleOnCtrlEnterDirective, OperatorPipe, OverflowItemDirective, OverflowManagerDirective, OverflowStopDirective, OverrideUserDialogComponent, PREVIEW_CONFIG, PagerComponent, PreviewService, PrincipalService, PrincipalStore, QueryParamsStore, QueryService, RECENT_SEARCHES_CONFIG, RECENT_SEARCHES_OPTIONS, ROUTE_COMPONENTS, RecentSearchesComponent, ResetUserSettingsDialogComponent, SAVED_SEARCHES_CONFIG, SAVED_SEARCHES_OPTIONS, SavedSearchDialog, SavedSearchesComponent, SavedSearchesService, SearchFeedbackComponent, SearchInputComponent, SearchService, SelectArticleOnClickDirective, SelectionHistoryService, SelectionService, SelectionStore, ShowBookmarkDirective, SignInComponent, SortSelectorComponent, SourceComponent, SourceIconPipe, SponsoredResultsComponent, SyslangPipe, THEMES, TextChunkService, ThemeProviderDirective, ThemeSelectorComponent, ThemeStore, ThemeToggleComponent, TranslocoDateImpurePipe, UserSettingsStore, applyThemeToNativeElement, auditInterceptorFn, authInterceptorFn, bodyInterceptorFn, bootstrapApp, buildQuery, debouncedSignal, errorInterceptorFn, getCurrentPath, getCurrentQueryName, getQueryNameFromRoute, processCssVars, queryNameResolver, signIn, themeColorNameToCssVariable, themeColorsToCssVariables, toastInterceptorFn, withAggregationsFeatures, withAlertsFeatures, withAppCustomizationFeatures, withAppFeatures, withApplicationFeatures, withAssistantFeatures, withBasketsFeatures, withBookmarkFeatures, withExtractsFeatures, withMultiSelectionFeatures, withPrincipalFeatures, withQueryParamsFeatures, withRecentSearchesFeatures, withSavedSearchesFeatures, withSelectionFeatures, withThemeBodyHook, withThemes, withThemesFeatures, withUserSettingsFeatures };
11378
+ export { AGGREGATIONS_NAMES, AGGREGATIONS_NAMES_PRESET_DEFAULT, APP_FEATURES, AdvancedSearchComponent, AggregationComponent, AggregationsService, AggregationsStore, Alert, AlertDialog, AlertsComponent, AppService, AppStore, ApplicationService, ApplicationStore, AuditFeedbackType, AuditService, AuthGuard, AutocompleteService, BOOKMARKS_CONFIG, BOOKMARKS_OPTIONS, BackdropComponent, BackdropService, BookmarkButtonComponent, BookmarksComponent, COLLECTIONS_CONFIG, COLLECTIONS_OPTIONS, COMPONENTS_FOR_DOCUMENT_TYPE, ChildMarkerDirective, CollectionsComponent, CollectionsDialog, DRAWER_COMPONENT, DRAWER_STACK_MAX_COUNT, DateComponent, DeleteCollectionDialog, DidYouMeanComponent, DocumentLocatorComponent, DrawerAdvancedFiltersComponent, DrawerComponent, DrawerNavbarComponent, DrawerPreviewComponent, DrawerService, DrawerStackComponent, DrawerStackService, DropdownInputComponent, DropdownListComponent, ErrorComponent, ExportDialog, ExportService, FILTERS_BREAKPOINT, FILTER_DATE_ALLOW_CUSTOM_RANGE, FeedbackDialogComponent, FileSizePipe, FilterButtonComponent, FiltersBarComponent, HIGHLIGHTS, HighlightWordPipe, InfinityScrollDirective, InlineWorker, JsonMethodPluginService, KeyboardNavigatorDirective, LabelService, LabelsEditDialog, LoadingComponent, MetadataComponent, MissingTermsComponent, MoreButtonComponent, MoreComponent, MultiSelectLabelsComponent, MultiSelectionToolbarComponent, NON_SEARCHABLE_COLUMNS, NON_SEARCHABLE_DEFAULTS, NavbarTabsComponent, NavigationService, NoResultComponent, OpenArticleOnCtrlEnterDirective, OperatorPipe, OverflowItemDirective, OverflowManagerDirective, OverflowStopDirective, OverrideUserDialogComponent, PREVIEW_CONFIG, PagerComponent, PreviewService, PrincipalService, PrincipalStore, QueryParamsStore, QueryService, RECENT_SEARCHES_CONFIG, RECENT_SEARCHES_OPTIONS, ROUTE_COMPONENTS, RecentSearchesComponent, ResetUserSettingsDialogComponent, SAVED_SEARCHES_CONFIG, SAVED_SEARCHES_OPTIONS, SavedSearchDialog, SavedSearchesComponent, SavedSearchesService, SearchFeedbackComponent, SearchInputComponent, SearchService, SelectArticleOnClickDirective, SelectionHistoryService, SelectionService, SelectionStore, ShowBookmarkDirective, SignInComponent, SortSelectorComponent, SourceComponent, SourceIconPipe, SponsoredResultsComponent, SyslangPipe, THEMES, TextChunkService, ThemeProviderDirective, ThemeSelectorComponent, ThemeStore, ThemeToggleComponent, TranslocoDateImpurePipe, UserSettingsStore, applyThemeToNativeElement, auditInterceptorFn, authInterceptorFn, bodyInterceptorFn, bootstrapApp, buildQuery, debouncedSignal, errorInterceptorFn, getCurrentPath, getCurrentQueryName, getQueryNameFromRoute, processCssVars, queryNameResolver, searchVariants, signIn, themeColorNameToCssVariable, themeColorsToCssVariables, toastInterceptorFn, withAggregationsFeatures, withAlertsFeatures, withAppCustomizationFeatures, withAppFeatures, withApplicationFeatures, withAssistantFeatures, withBasketsFeatures, withBookmarkFeatures, withExtractsFeatures, withMultiSelectionFeatures, withPrincipalFeatures, withQueryParamsFeatures, withRecentSearchesFeatures, withSavedSearchesFeatures, withSelectionFeatures, withThemeBodyHook, withThemes, withThemesFeatures, withUserSettingsFeatures };
10879
11379
  //# sourceMappingURL=sinequa-atomic-angular.mjs.map