@sinequa/atomic-angular 2.13.0 → 2.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,7 +4,7 @@ import { TranslocoService } from "@jsverse/transloco";
4
4
  import { Aggregation, AggregationItem, Article, AtomicClient, AtomicClientConfig, AuditEventType, AuditEventTypeValues, AuditEvents, CCApp, CCColumn, CCQuery, CCSortingChoice, CCWebService, Conversion, Credentials, CustomHighlights, DidYouMeanAction, ExportOutputFormat, ExportQueryModel, Filter as Filter$1, FilterOperator, KeyOf, LegacyFilter, LinkResult, PreviewData, Principal, Query, QueryParams, RequestOptions, Result, SpellingCorrectionMode, Suggestion, TextChunk, TextLocation, TreeAggregation, TreeAggregationNode, UserProfile } from "@sinequa/atomic";
5
5
  import { CanActivateFn, NavigationEnd, Params, ResolveFn, Route, Router } from "@angular/router";
6
6
  import { VariantProps } from "class-variance-authority";
7
- import { BreakpointObserverService, DialogComponent, DialogEvent, DialogResult, DropdownDirective, PopoverDirective, SheetComponent, SwitchComponent } from "@sinequa/galactik";
7
+ import { BreakpointObserverService, DialogComponent, DialogEvent, DialogResult, DropdownDirective, PopoverDirective, SheetComponent, SwitchComponent, TooltipDirective } from "@sinequa/galactik";
8
8
  import { DomSanitizer, SafeHtml, Title } from "@angular/platform-browser";
9
9
  import { BehaviorSubject, Observable, Subject } from "rxjs";
10
10
  import { FieldTree } from "@angular/forms/signals";
@@ -891,7 +891,7 @@ export declare class DocumentLocatorComponent implements OnDestroy {
891
891
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
892
892
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
893
893
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
894
- aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
894
+ aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
895
895
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
896
896
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
897
897
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -1074,9 +1074,9 @@ export declare class MetadataComponent {
1074
1074
  event: Event;
1075
1075
  }>;
1076
1076
  class: import("@angular/core").InputSignal<string | undefined>;
1077
- variant: import("@angular/core").InputSignal<"primary" | "secondary" | null | undefined>;
1078
- size: import("@angular/core").InputSignal<"small" | "sm" | "md" | "xs" | "xsmall" | "medium" | null | undefined>;
1079
- scheme: import("@angular/core").InputSignal<"error" | "sage" | "success" | "almond" | "pink" | "grey" | "yellow" | "cherry" | "indigo" | "cyan" | "warning" | "info" | null | undefined>;
1077
+ variant: import("@angular/core").InputSignal<"secondary" | "primary" | null | undefined>;
1078
+ size: import("@angular/core").InputSignal<"md" | "small" | "medium" | "sm" | "xs" | "xsmall" | null | undefined>;
1079
+ scheme: import("@angular/core").InputSignal<"error" | "sage" | "almond" | "pink" | "grey" | "yellow" | "cherry" | "indigo" | "cyan" | "success" | "warning" | "info" | null | undefined>;
1080
1080
  metadata: import("@angular/core").InputSignal<(string & Record<never, never>) | KeyOf<Article>>;
1081
1081
  article: import("@angular/core").InputSignal<(string & Record<never, never>) | Partial<Article>>;
1082
1082
  limit: import("@angular/core").InputSignalWithTransform<number | undefined, string | number | undefined>;
@@ -1152,7 +1152,7 @@ export declare class MissingTermsComponent {
1152
1152
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
1153
1153
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
1154
1154
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
1155
- aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
1155
+ aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
1156
1156
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
1157
1157
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
1158
1158
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -1252,7 +1252,7 @@ export declare class MissingTermsComponent {
1252
1252
  }, {}, never, never, true, never>;
1253
1253
  }
1254
1254
  export declare const multiSelectionToolbarVariants: (props?: ({
1255
- variant?: "dark" | "light" | "glassy" | null | undefined;
1255
+ variant?: "light" | "dark" | "glassy" | "floating" | null | undefined;
1256
1256
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
1257
1257
  export type MultiSelectionToolbarVariants = VariantProps<typeof multiSelectionToolbarVariants>;
1258
1258
  export declare class MultiSelectionToolbarComponent {
@@ -1575,27 +1575,27 @@ export declare class MultiSelectionToolbarComponent {
1575
1575
  columnMap?: Record<string, import("@sinequa/atomic").CCColumn> | undefined;
1576
1576
  }>;
1577
1577
  readonly selection: {
1578
- article?: import("@angular/core").Signal<undefined> | import("@ngrx/signals").DeepSignal<import("@sinequa/atomic").Article> | undefined;
1578
+ article?: import("@ngrx/signals").DeepSignal<Article> | import("@angular/core").Signal<undefined> | undefined;
1579
1579
  id?: import("@angular/core").Signal<string | undefined> | undefined;
1580
1580
  queryText?: import("@angular/core").Signal<string | undefined> | undefined;
1581
1581
  queryName?: import("@angular/core").Signal<string | undefined> | undefined;
1582
1582
  previewHighlights?: import("@angular/core").Signal<undefined> | import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").PreviewHighlights> | undefined;
1583
1583
  assistantIdsToAttach: import("@angular/core").Signal<string[]>;
1584
- multiSelection: import("@angular/core").Signal<import("@sinequa/atomic").Article[]>;
1584
+ multiSelection: import("@angular/core").Signal<Article[]>;
1585
1585
  multiSelectCount: import("@angular/core").Signal<number>;
1586
1586
  update: (newState: Partial<import("@sinequa/atomic-angular").SelectionState>) => void;
1587
1587
  clear: () => void;
1588
- addArticleToMultiSelection: (article: import("@sinequa/atomic").Article) => void;
1589
- removeArticleFromMultiSelection: (article: import("@sinequa/atomic").Article) => void;
1588
+ addArticleToMultiSelection: (article: Article) => void;
1589
+ removeArticleFromMultiSelection: (article: Article) => void;
1590
1590
  clearMultiSelection: () => void;
1591
1591
  } & import("@ngrx/signals").StateSource<{
1592
- article?: import("@sinequa/atomic").Article | undefined;
1592
+ article?: Article | undefined;
1593
1593
  id?: string | undefined;
1594
1594
  queryText?: string | undefined;
1595
1595
  queryName?: string | undefined;
1596
1596
  previewHighlights?: import("@sinequa/atomic-angular").PreviewHighlights | undefined;
1597
1597
  assistantIdsToAttach: string[];
1598
- multiSelection: import("@sinequa/atomic").Article[];
1598
+ multiSelection: Article[];
1599
1599
  }>;
1600
1600
  private readonly injector;
1601
1601
  readonly appFeatures: {
@@ -1643,7 +1643,11 @@ export declare class MultiSelectionToolbarComponent {
1643
1643
  feedback?: import("@sinequa/atomic-angular").CFeedback;
1644
1644
  } | undefined;
1645
1645
  readonly class: import("@angular/core").InputSignal<string>;
1646
- readonly variant: import("@angular/core").InputSignal<"dark" | "light" | "glassy" | null | undefined>;
1646
+ /**
1647
+ * `dark`, `light`, `glassy`: one bar at the bottom centre of the window. `floating`: detached buttons
1648
+ * in the bottom-right corner of the window, as in lexiQ.
1649
+ */
1650
+ readonly variant: import("@angular/core").InputSignal<"light" | "dark" | "glassy" | "floating" | null | undefined>;
1647
1651
  /**
1648
1652
  * Texte ajouté à l'annonce lecteur d'écran lors de la **première** sélection (ex. « F6 pour accéder
1649
1653
  * aux actions »). Il est fourni par l'application : seule elle sait par quel raccourci elle rend la
@@ -1653,6 +1657,12 @@ export declare class MultiSelectionToolbarComponent {
1653
1657
  readonly updatedCollections: import("@angular/core").OutputEmitterRef<void>;
1654
1658
  /** La sélection vient d'être vidée (bouton, Échap) : l'application replace le focus, la barre devient inerte. */
1655
1659
  readonly cleared: import("@angular/core").OutputEmitterRef<void>;
1660
+ /**
1661
+ * `floating` only: the selection has just been filed in a collection (its name). The panel has
1662
+ * closed and the selection has been emptied (`cleared` fired first); an application with a
1663
+ * "selection mode" leaves it here.
1664
+ */
1665
+ readonly addedToCollection: import("@angular/core").OutputEmitterRef<string>;
1656
1666
  readonly count: import("@angular/core").Signal<number>;
1657
1667
  readonly variants: import("@angular/core").Signal<string>;
1658
1668
  readonly ids: import("@angular/core").Signal<string[]>;
@@ -1669,11 +1679,36 @@ export declare class MultiSelectionToolbarComponent {
1669
1679
  /** Vrai uniquement à la première sélection : ensuite, seul le décompte est annoncé. */
1670
1680
  protected readonly showHint: import("@angular/core").WritableSignal<boolean>;
1671
1681
  private armed;
1682
+ protected readonly floatingButton = "shadow-(--shadow-2) pointer-coarse:h-11";
1683
+ protected readonly hostClass: import("@angular/core").Signal<string>;
1684
+ protected readonly toolbarClass: import("@angular/core").Signal<string>;
1685
+ private static nextId;
1686
+ protected readonly panelId: string;
1687
+ protected readonly panelOpen: import("@angular/core").WritableSignal<boolean>;
1688
+ /** The documents the panel files: the selection at the moment it was opened. */
1689
+ protected readonly panelArticles: import("@angular/core").WritableSignal<Article[]>;
1690
+ /** Read by the status region once the selection is emptied after filing. */
1691
+ protected readonly lastFiled: import("@angular/core").WritableSignal<{
1692
+ count: number;
1693
+ name: string;
1694
+ } | null>;
1695
+ protected collectionsChanged: boolean;
1696
+ private readonly collectionTrigger;
1697
+ private readonly panel;
1698
+ private lastFiledTimer;
1672
1699
  constructor();
1673
1700
  clearSelection: () => void;
1674
1701
  openCollectionDialog: () => Promise<void>;
1675
1702
  openExportDialog: () => void;
1676
1703
  attachToAssistant: () => void;
1704
+ protected togglePanel(): void;
1705
+ /** Close button, emptied selection: hides the popover; its `toggle` event does the rest. */
1706
+ protected closePanel(): void;
1707
+ /** The popover closed — by Escape, a click outside, the close button or after filing. */
1708
+ protected onPanelToggle(event: Event): void;
1709
+ /** Filed: the panel's confirmation has been seen; the selection is done with. */
1710
+ protected onFiled(name: string): void;
1711
+ private panelClosed;
1677
1712
  static ɵfac: i0.ɵɵFactoryDeclaration<MultiSelectionToolbarComponent, never>;
1678
1713
  static ɵcmp: i0.ɵɵComponentDeclaration<MultiSelectionToolbarComponent, "MultiSelectionToolbar, multi-selection-toolbar", never, {
1679
1714
  "class": {
@@ -1699,6 +1734,7 @@ export declare class MultiSelectionToolbarComponent {
1699
1734
  }, {
1700
1735
  "updatedCollections": "updatedCollections";
1701
1736
  "cleared": "cleared";
1737
+ "addedToCollection": "addedToCollection";
1702
1738
  }, never, never, true, never>;
1703
1739
  }
1704
1740
  export interface NavRouteTab {
@@ -2058,7 +2094,7 @@ export declare class NavbarTabsComponent {
2058
2094
  *
2059
2095
  * @default "primary"
2060
2096
  */
2061
- variant: import("@angular/core").InputSignal<"primary" | "secondary" | "inner">;
2097
+ variant: import("@angular/core").InputSignal<"secondary" | "primary" | "inner">;
2062
2098
  /** The pill strip is the only variant whose tabs keep galactik's own, smaller size. */
2063
2099
  protected readonly isPill: import("@angular/core").Signal<boolean>;
2064
2100
  showCount: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
@@ -3237,7 +3273,7 @@ export declare const PrincipalStore: import("@angular/core").Type<{
3237
3273
  param9: import("@angular/core").Signal<string>;
3238
3274
  param10: import("@angular/core").Signal<string>;
3239
3275
  userOverrideActive: import("@angular/core").Signal<boolean>;
3240
- state: import("@angular/core").Signal<"error" | "initial" | "loading" | "loaded">;
3276
+ state: import("@angular/core").Signal<"error" | "loading" | "loaded" | "initial">;
3241
3277
  allowUserOverride: import("@angular/core").Signal<boolean>;
3242
3278
  isOverridingUser: import("@angular/core").Signal<boolean>;
3243
3279
  initials: import("@angular/core").Signal<string>;
@@ -3319,7 +3355,7 @@ export declare const QueryParamsStore: import("@angular/core").Type<{
3319
3355
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
3320
3356
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
3321
3357
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
3322
- aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
3358
+ aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
3323
3359
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
3324
3360
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
3325
3361
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -3464,7 +3500,7 @@ export type SelectionState = {
3464
3500
  * - `clear()`: Clears the selection state, setting `article`, `id`, and `queryText` to `undefined`.
3465
3501
  */
3466
3502
  export declare const SelectionStore: import("@angular/core").Type<{
3467
- article?: import("@angular/core").Signal<undefined> | import("@ngrx/signals").DeepSignal<Article> | undefined;
3503
+ article?: import("@ngrx/signals").DeepSignal<Article> | import("@angular/core").Signal<undefined> | undefined;
3468
3504
  id?: import("@angular/core").Signal<string | undefined> | undefined;
3469
3505
  queryText?: import("@angular/core").Signal<string | undefined> | undefined;
3470
3506
  queryName?: import("@angular/core").Signal<string | undefined> | undefined;
@@ -3635,8 +3671,8 @@ export declare const UserSettingsStore: import("@angular/core").Type<{
3635
3671
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
3636
3672
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
3637
3673
  language?: import("@angular/core").Signal<string | undefined> | undefined;
3638
- userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
3639
- agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
3674
+ userTheme: import("@angular/core").Signal<"light" | "dark" | "system" | undefined>;
3675
+ agents: import("@angular/core").Signal<undefined> | import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings>;
3640
3676
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
3641
3677
  isDebugMode: import("@angular/core").Signal<boolean>;
3642
3678
  isDarkMode: import("@angular/core").Signal<boolean>;
@@ -5244,7 +5280,7 @@ export declare class PreviewService {
5244
5280
  extracts: Map<string, Extract[]>;
5245
5281
  }>;
5246
5282
  protected readonly selectionStore: {
5247
- article?: import("@angular/core").Signal<undefined> | import("@ngrx/signals").DeepSignal<Article> | undefined;
5283
+ article?: import("@ngrx/signals").DeepSignal<Article> | import("@angular/core").Signal<undefined> | undefined;
5248
5284
  id?: import("@angular/core").Signal<string | undefined> | undefined;
5249
5285
  queryText?: import("@angular/core").Signal<string | undefined> | undefined;
5250
5286
  queryName?: import("@angular/core").Signal<string | undefined> | undefined;
@@ -5293,7 +5329,7 @@ export declare class PreviewService {
5293
5329
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
5294
5330
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
5295
5331
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
5296
- aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
5332
+ aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
5297
5333
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
5298
5334
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
5299
5335
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -6343,7 +6379,7 @@ export declare class AggregationsService {
6343
6379
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
6344
6380
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
6345
6381
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
6346
- aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
6382
+ aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
6347
6383
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
6348
6384
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
6349
6385
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -6591,8 +6627,8 @@ export declare class ApplicationService {
6591
6627
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
6592
6628
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
6593
6629
  language?: import("@angular/core").Signal<string | undefined> | undefined;
6594
- userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
6595
- agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
6630
+ userTheme: import("@angular/core").Signal<"light" | "dark" | "system" | undefined>;
6631
+ agents: import("@angular/core").Signal<undefined> | import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings>;
6596
6632
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
6597
6633
  isDebugMode: import("@angular/core").Signal<boolean>;
6598
6634
  isDarkMode: import("@angular/core").Signal<boolean>;
@@ -6678,7 +6714,7 @@ export declare class ApplicationService {
6678
6714
  param9: import("@angular/core").Signal<string>;
6679
6715
  param10: import("@angular/core").Signal<string>;
6680
6716
  userOverrideActive: import("@angular/core").Signal<boolean>;
6681
- state: import("@angular/core").Signal<"error" | "initial" | "loading" | "loaded">;
6717
+ state: import("@angular/core").Signal<"error" | "loading" | "loaded" | "initial">;
6682
6718
  allowUserOverride: import("@angular/core").Signal<boolean>;
6683
6719
  isOverridingUser: import("@angular/core").Signal<boolean>;
6684
6720
  initials: import("@angular/core").Signal<string>;
@@ -7059,7 +7095,7 @@ export declare class ApplicationService {
7059
7095
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
7060
7096
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
7061
7097
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
7062
- aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
7098
+ aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
7063
7099
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
7064
7100
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
7065
7101
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -7285,8 +7321,8 @@ export declare class AutocompleteService {
7285
7321
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
7286
7322
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
7287
7323
  language?: import("@angular/core").Signal<string | undefined> | undefined;
7288
- userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
7289
- agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
7324
+ userTheme: import("@angular/core").Signal<"light" | "dark" | "system" | undefined>;
7325
+ agents: import("@angular/core").Signal<undefined> | import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings>;
7290
7326
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
7291
7327
  isDebugMode: import("@angular/core").Signal<boolean>;
7292
7328
  isDarkMode: import("@angular/core").Signal<boolean>;
@@ -7929,8 +7965,8 @@ export declare class SavedSearchesService {
7929
7965
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
7930
7966
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
7931
7967
  language?: import("@angular/core").Signal<string | undefined> | undefined;
7932
- userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
7933
- agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
7968
+ userTheme: import("@angular/core").Signal<"light" | "dark" | "system" | undefined>;
7969
+ agents: import("@angular/core").Signal<undefined> | import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings>;
7934
7970
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
7935
7971
  isDebugMode: import("@angular/core").Signal<boolean>;
7936
7972
  isDarkMode: import("@angular/core").Signal<boolean>;
@@ -8016,7 +8052,7 @@ export declare class SavedSearchesService {
8016
8052
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
8017
8053
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
8018
8054
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
8019
- aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
8055
+ aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
8020
8056
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
8021
8057
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
8022
8058
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -8201,7 +8237,7 @@ export declare class SearchService {
8201
8237
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
8202
8238
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
8203
8239
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
8204
- aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
8240
+ aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
8205
8241
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
8206
8242
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
8207
8243
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -8295,8 +8331,8 @@ export declare class SearchService {
8295
8331
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
8296
8332
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
8297
8333
  language?: import("@angular/core").Signal<string | undefined> | undefined;
8298
- userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
8299
- agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
8334
+ userTheme: import("@angular/core").Signal<"light" | "dark" | "system" | undefined>;
8335
+ agents: import("@angular/core").Signal<undefined> | import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings>;
8300
8336
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
8301
8337
  isDebugMode: import("@angular/core").Signal<boolean>;
8302
8338
  isDarkMode: import("@angular/core").Signal<boolean>;
@@ -8430,7 +8466,7 @@ export declare class SelectionService {
8430
8466
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
8431
8467
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
8432
8468
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
8433
- aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
8469
+ aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
8434
8470
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
8435
8471
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
8436
8472
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -9175,8 +9211,8 @@ export declare class ShowBookmarkDirective {
9175
9211
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
9176
9212
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
9177
9213
  language?: import("@angular/core").Signal<string | undefined> | undefined;
9178
- userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
9179
- agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
9214
+ userTheme: import("@angular/core").Signal<"light" | "dark" | "system" | undefined>;
9215
+ agents: import("@angular/core").Signal<undefined> | import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings>;
9180
9216
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
9181
9217
  isDebugMode: import("@angular/core").Signal<boolean>;
9182
9218
  isDarkMode: import("@angular/core").Signal<boolean>;
@@ -9399,6 +9435,14 @@ export declare class OverflowManagerDirective {
9399
9435
  readonly stop: import("@angular/core").Signal<ElementRef<any> | undefined>;
9400
9436
  readonly target: import("@angular/core").InputSignal<HTMLElement | undefined>;
9401
9437
  readonly margin: import("@angular/core").InputSignal<number>;
9438
+ /**
9439
+ * Margin used only by the "does every item fit?" test, instead of `margin`.
9440
+ * Defaults to `margin`. A container that is exactly as wide as its content
9441
+ * (a centered bar, say) has no spare room, so `margin` would always report an
9442
+ * overflow there: pass a value <= 0 (a negative one is a sub-pixel tolerance).
9443
+ * `margin` still applies to the space reserved for the stop element.
9444
+ */
9445
+ readonly fitMargin: import("@angular/core").InputSignal<number | undefined>;
9402
9446
  readonly direction: import("@angular/core").InputSignal<"horizontal" | "vertical">;
9403
9447
  /**
9404
9448
  * Always reserve the stop element's size, even when every item fits inside
@@ -9407,11 +9451,18 @@ export declare class OverflowManagerDirective {
9407
9451
  * the container), so the last item never overlaps it.
9408
9452
  */
9409
9453
  readonly reserveStop: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
9454
+ /**
9455
+ * Fade an item in when it comes back into view (it was hidden by the previous
9456
+ * count), instead of popping in. Skipped when the user prefers reduced motion.
9457
+ */
9458
+ readonly animate: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
9410
9459
  readonly count: import("@angular/core").OutputEmitterRef<number>;
9411
9460
  private readonly el;
9412
9461
  private readonly destroyRef;
9413
9462
  private readonly resizeObserver;
9414
9463
  private readonly itemsResizeObserver;
9464
+ /** Items hidden by the last committed count, to tell a reveal from an item that stayed visible. */
9465
+ private readonly hiddenItems;
9415
9466
  private countSub;
9416
9467
  private _lastCount;
9417
9468
  constructor();
@@ -9432,6 +9483,7 @@ export declare class OverflowManagerDirective {
9432
9483
  * @param count - The number of items to keep visible.
9433
9484
  */
9434
9485
  toggleToCount(count: number): void;
9486
+ private fadeIn;
9435
9487
  static ɵfac: i0.ɵɵFactoryDeclaration<OverflowManagerDirective, never>;
9436
9488
  static ɵdir: i0.ɵɵDirectiveDeclaration<OverflowManagerDirective, "[overflowManager]", never, {
9437
9489
  "target": {
@@ -9444,6 +9496,11 @@ export declare class OverflowManagerDirective {
9444
9496
  "required": false;
9445
9497
  "isSignal": true;
9446
9498
  };
9499
+ "fitMargin": {
9500
+ "alias": "fitMargin";
9501
+ "required": false;
9502
+ "isSignal": true;
9503
+ };
9447
9504
  "direction": {
9448
9505
  "alias": "direction";
9449
9506
  "required": false;
@@ -9454,6 +9511,11 @@ export declare class OverflowManagerDirective {
9454
9511
  "required": false;
9455
9512
  "isSignal": true;
9456
9513
  };
9514
+ "animate": {
9515
+ "alias": "animate";
9516
+ "required": false;
9517
+ "isSignal": true;
9518
+ };
9457
9519
  }, {
9458
9520
  "count": "count";
9459
9521
  }, ["items", "stop"], never, true, never>;
@@ -9952,7 +10014,7 @@ export declare class SponsoredResultsComponent {
9952
10014
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
9953
10015
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
9954
10016
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
9955
- aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
10017
+ aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
9956
10018
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
9957
10019
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
9958
10020
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -10991,7 +11053,7 @@ export declare class AdvancedSearch {
10991
11053
  readonly similarDocuments: import("@angular/core").InputSignal<Article[] | undefined>;
10992
11054
  readonly selected: import("@angular/core").OutputEmitterRef<Article>;
10993
11055
  protected readonly selectionStore: {
10994
- article?: import("@angular/core").Signal<undefined> | import("@ngrx/signals").DeepSignal<Article> | undefined;
11056
+ article?: import("@ngrx/signals").DeepSignal<Article> | import("@angular/core").Signal<undefined> | undefined;
10995
11057
  id?: import("@angular/core").Signal<string | undefined> | undefined;
10996
11058
  queryText?: import("@angular/core").Signal<string | undefined> | undefined;
10997
11059
  queryName?: import("@angular/core").Signal<string | undefined> | undefined;
@@ -11040,7 +11102,7 @@ export declare class AdvancedSearch {
11040
11102
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
11041
11103
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
11042
11104
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
11043
- aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
11105
+ aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
11044
11106
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
11045
11107
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
11046
11108
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -11210,7 +11272,7 @@ export declare class AdvancedSearchTabs {
11210
11272
  readonly similarDocuments: import("@angular/core").InputSignal<Article[] | undefined>;
11211
11273
  readonly selected: import("@angular/core").OutputEmitterRef<Article>;
11212
11274
  protected readonly selectionStore: {
11213
- article?: import("@angular/core").Signal<undefined> | import("@ngrx/signals").DeepSignal<Article> | undefined;
11275
+ article?: import("@ngrx/signals").DeepSignal<Article> | import("@angular/core").Signal<undefined> | undefined;
11214
11276
  id?: import("@angular/core").Signal<string | undefined> | undefined;
11215
11277
  queryText?: import("@angular/core").Signal<string | undefined> | undefined;
11216
11278
  queryName?: import("@angular/core").Signal<string | undefined> | undefined;
@@ -11332,6 +11394,11 @@ export declare class ArticleEntities {
11332
11394
  navigateNext: (entity: string, data: import("@sinequa/atomic-angular").ArticleMetadata) => void;
11333
11395
  navigatePrev: (entity: string, data: import("@sinequa/atomic-angular").ArticleMetadata) => void;
11334
11396
  };
11397
+ protected readonly row: {
11398
+ enter: (value: string) => void;
11399
+ leave: () => void;
11400
+ activate: (value: string) => void;
11401
+ };
11335
11402
  static ɵfac: i0.ɵɵFactoryDeclaration<ArticleEntities, never>;
11336
11403
  static ɵcmp: i0.ɵɵComponentDeclaration<ArticleEntities, "article-entities,ArticleEntities,articleentities", never, {
11337
11404
  "article": {
@@ -11477,6 +11544,11 @@ export declare class ArticleMatchLocations {
11477
11544
  navigateNext: (data: import("@sinequa/atomic-angular").ArticleMetadata) => void;
11478
11545
  navigatePrev: (data: import("@sinequa/atomic-angular").ArticleMetadata) => void;
11479
11546
  };
11547
+ protected readonly row: {
11548
+ enter: (value: string) => void;
11549
+ leave: () => void;
11550
+ activate: (value: string) => void;
11551
+ };
11480
11552
  static ɵfac: i0.ɵɵFactoryDeclaration<ArticleMatchLocations, never>;
11481
11553
  static ɵcmp: i0.ɵɵComponentDeclaration<ArticleMatchLocations, "article-match-locations, ArticleMatchLocations, articlematchlocations", never, {}, {}, never, never, true, never>;
11482
11554
  }
@@ -11547,6 +11619,12 @@ export declare class ArticleEntitiesTabPanel {
11547
11619
  navigateNext: (entity: string, data: ArticleMetadata) => void;
11548
11620
  navigatePrev: (entity: string, data: ArticleMetadata) => void;
11549
11621
  }>;
11622
+ /** Hover for a mouse, a tap for a finger (see {@link injectRowActivation}). */
11623
+ protected readonly row: {
11624
+ enter: (value: string) => void;
11625
+ leave: () => void;
11626
+ activate: (value: string) => void;
11627
+ };
11550
11628
  /** Category expansion state, keyed by entity name — categories default closed. */
11551
11629
  private readonly expandedCategories;
11552
11630
  protected isExpanded(entity: string): boolean;
@@ -11654,6 +11732,14 @@ export declare class ArticleMatchLocationsTabPanel {
11654
11732
  navigateNext: (data: ArticleMetadata) => void;
11655
11733
  navigatePrev: (data: ArticleMetadata) => void;
11656
11734
  }>;
11735
+ /** The text being searched for: tells an empty panel "no search yet" from "no match". */
11736
+ readonly queryText: import("@angular/core").InputSignal<string>;
11737
+ /** Hover for a mouse, a tap for a finger (see {@link injectRowActivation}). */
11738
+ protected readonly row: {
11739
+ enter: (value: string) => void;
11740
+ leave: () => void;
11741
+ activate: (value: string) => void;
11742
+ };
11657
11743
  /**
11658
11744
  * Which row currently has keyboard focus — tracked independently of `state().hovering` (mouse
11659
11745
  * only) so the prev/next affordance shows on either input method without one clearing the other:
@@ -11683,6 +11769,11 @@ export declare class ArticleMatchLocationsTabPanel {
11683
11769
  "required": true;
11684
11770
  "isSignal": true;
11685
11771
  };
11772
+ "queryText": {
11773
+ "alias": "queryText";
11774
+ "required": false;
11775
+ "isSignal": true;
11776
+ };
11686
11777
  }, {}, never, never, true, never>;
11687
11778
  }
11688
11779
  /**
@@ -11793,6 +11884,12 @@ export declare class AlertsComponent {
11793
11884
  /** The second line of each row. */
11794
11885
  private readonly summaries;
11795
11886
  protected readonly summaryOf: (alert: Alert) => AlertSummaryPart[];
11887
+ /** False while the page is driven with a finger: the line that explains the keys to reorder a row is then not shown. */
11888
+ protected readonly keyboardAvailable: import("@angular/core").Signal<boolean>;
11889
+ /** The name and the second line of a row as one text, for the tooltip that shows them whole when they are cut off. */
11890
+ protected fullText(alert: Alert): string;
11891
+ /** The info button of a row: shows the whole text in the tooltip, or takes it away at a second tap. A tap elsewhere closes it (the tooltip's own). */
11892
+ protected toggleText(tip: TooltipDirective): void;
11796
11893
  /** What a screen reader hears after a keyboard move. */
11797
11894
  protected readonly announceMove: (alert: Alert, position: number, total: number) => string;
11798
11895
  constructor();
@@ -12438,10 +12535,10 @@ export declare class SignedOutComponent {
12438
12535
  static ɵcmp: i0.ɵɵComponentDeclaration<SignedOutComponent, "signed-out, SignedOut, signedout", never, {}, {}, never, never, true, never>;
12439
12536
  }
12440
12537
  export declare class BookmarkButtonComponent {
12441
- variant: import("@angular/core").InputSignal<"none" | "primary" | "secondary" | "light-accent" | "accent" | "tertiary" | null | undefined>;
12538
+ variant: import("@angular/core").InputSignal<"secondary" | "tertiary" | "none" | "primary" | "light-accent" | "accent" | null | undefined>;
12442
12539
  /** `neutral` gives a tertiary button the dark icon of the other neutral icon buttons of a toolbar. */
12443
12540
  scheme: import("@angular/core").InputSignal<"default" | "neutral" | null | undefined>;
12444
- size: import("@angular/core").InputSignal<"small" | "large" | "sm" | "md" | "lg" | "xs" | "xsmall" | "medium" | null | undefined>;
12541
+ size: import("@angular/core").InputSignal<"md" | "small" | "medium" | "large" | "lg" | "sm" | "xs" | "xsmall" | null | undefined>;
12445
12542
  /**
12446
12543
  * Tab index applied to the inner button.
12447
12544
  *
@@ -12519,7 +12616,7 @@ declare class ListPanelComponent<T> {
12519
12616
  getLabel: import("@angular/core").InputSignal<((item: T) => string) | undefined>;
12520
12617
  deleteButtonTitle: import("@angular/core").InputSignal<string>;
12521
12618
  /**
12522
- * Whether rows can be deleted. On by default. Off, rows carry no trash icon, `Delete` does nothing and
12619
+ * Whether rows can be deleted. On by default. Off, rows carry no cross, `Delete` does nothing and
12523
12620
  * nothing announces it (no `aria-keyshortcuts`, no hint) — a list that cannot delete must not say
12524
12621
  * that it can.
12525
12622
  */
@@ -12698,7 +12795,7 @@ export declare class CollectionsDialog {
12698
12795
  readonly showSearch: import("@angular/core").Signal<boolean>;
12699
12796
  /** Collections matching the search text (case-insensitive, by name). */
12700
12797
  readonly filteredCollections: import("@angular/core").Signal<Basket[]>;
12701
- readonly collectionsMap: import("@angular/core").WritableSignal<Record<string, "some" | "none" | "all">>;
12798
+ readonly collectionsMap: import("@angular/core").WritableSignal<Record<string, "some" | "all" | "none">>;
12702
12799
  /** Windowing over the filtered list — renders only the visible rows. */
12703
12800
  readonly virtualizer: import("@tanstack/angular-virtual").AngularVirtualizer<HTMLDivElement, Element>;
12704
12801
  constructor();
@@ -12738,6 +12835,106 @@ export declare class DeleteCollectionDialog {
12738
12835
  }
12739
12836
  /** Imperative entry point: `await DeleteCollection.call({ collection, index })`. */
12740
12837
  export declare const DeleteCollection: import("@sinequa/galactik").Callable<DeleteCollectionArgs, DialogResult>;
12838
+ /** How many of the documents a collection already holds. */
12839
+ export type CollectionCoverage = "all" | "some" | "none";
12840
+ /** What the panel just did, shown in its header (and announced): an addition, a removal or a creation. */
12841
+ type PanelStatus = {
12842
+ kind: "added" | "removed" | "created";
12843
+ name: string;
12844
+ };
12845
+ /**
12846
+ * The "add to collection" panel opened from the multi-selection actions: a list of the user's
12847
+ * collections, each with a button that says where the selected documents stand in it — `+` to add
12848
+ * them, `✓` when they are all there (clicking it takes them out). A collection holding only part of
12849
+ * them keeps the `+` and says so under its name. A new collection is named in place, at the top of
12850
+ * the list (which stays on screen, dimmed), and appears there once created, ready for its `+`.
12851
+ *
12852
+ * The panel owns no positioning: the host shows it (in a popover, a sheet…) and listens to it.
12853
+ * - `done` — an addition has just been saved and confirmed in the header: the panel's
12854
+ * job is over, the host closes it. It fires about a second after the click, so the confirmation is
12855
+ * seen; a removal never ends the panel.
12856
+ * - `changed` — a collection was saved (added to, removed from, created): the host refreshes.
12857
+ * - `closeRequested` — the close button.
12858
+ *
12859
+ * Every change is saved at once, as in the dialog it replaces for the multi-selection: there is no
12860
+ * "Save" button to forget.
12861
+ */
12862
+ export declare class AddToCollectionPanelComponent {
12863
+ /** The documents to file. */
12864
+ readonly articles: import("@angular/core").InputSignal<Article[]>;
12865
+ /** An addition was saved and confirmed: the host closes the panel. Carries the collection's name. */
12866
+ readonly done: import("@angular/core").OutputEmitterRef<string>;
12867
+ /** A collection was saved (added to, removed from, created). */
12868
+ readonly changed: import("@angular/core").OutputEmitterRef<void>;
12869
+ /** The close button. */
12870
+ readonly closeRequested: import("@angular/core").OutputEmitterRef<void>;
12871
+ private readonly userSettingsStore;
12872
+ private readonly injector;
12873
+ protected readonly titleId: string;
12874
+ protected readonly nameId: string;
12875
+ protected readonly errorId: string;
12876
+ private readonly scrollElement;
12877
+ private readonly searchInput;
12878
+ private readonly nameInput;
12879
+ protected readonly collections: import("@angular/core").Signal<Basket[]>;
12880
+ /** Same threshold as the dialog: the field only earns its place past six collections. */
12881
+ protected readonly showSearch: import("@angular/core").Signal<boolean>;
12882
+ protected readonly count: import("@angular/core").Signal<number>;
12883
+ private readonly ids;
12884
+ protected readonly searchText: import("@angular/core").WritableSignal<string>;
12885
+ protected readonly searchField: import("@angular/forms/signals").FieldTree<string, string | number, "writable">;
12886
+ /** Collections created from this panel, newest first: they are listed at the top, where the name field was. */
12887
+ private readonly createdHere;
12888
+ protected readonly filteredCollections: import("@angular/core").Signal<Basket[]>;
12889
+ protected readonly status: import("@angular/core").WritableSignal<PanelStatus | null>;
12890
+ protected readonly creating: import("@angular/core").WritableSignal<boolean>;
12891
+ private readonly createModel;
12892
+ protected readonly createForm: import("@angular/forms/signals").FieldTree<{
12893
+ name: string;
12894
+ }, string | number, "writable">;
12895
+ /**
12896
+ * The message under the name field. A taken name shows as it is typed — the user should not have
12897
+ * to try first — an empty one only once a submission was attempted (the field is then touched).
12898
+ */
12899
+ protected readonly nameError: import("@angular/core").Signal<"nameExists" | "nameRequired" | null>;
12900
+ /** A collection holding part of the documents says so on a second line: its row is taller. */
12901
+ protected readonly virtualizer: import("@tanstack/angular-virtual").AngularVirtualizer<HTMLElement, Element>;
12902
+ private doneTimer;
12903
+ constructor();
12904
+ coverageOf(collection: Basket | undefined): CollectionCoverage;
12905
+ /** How many of the documents the collection already holds. */
12906
+ heldIn(collection: Basket): number;
12907
+ /** `+` adds every document the collection lacks; `✓` takes them all out. */
12908
+ toggle(collection: Basket): Promise<void>;
12909
+ protected startCreation(): void;
12910
+ /**
12911
+ * Leaves the name field for the list. On Escape, the key is kept from the popover around the panel,
12912
+ * which would otherwise close as well: one Escape undoes one thing.
12913
+ */
12914
+ protected cancelCreation(event?: Event): void;
12915
+ /**
12916
+ * Reached only with a valid name (see the schema). As in lexiQ, the collection is created empty and
12917
+ * takes its place at the top of the list, highlighted, with the focus on its `+`: filing the
12918
+ * documents in it is the user's next click, the same one as for any other collection.
12919
+ */
12920
+ private create;
12921
+ private confirmAdded;
12922
+ private nameTaken;
12923
+ protected onHostToggle(event: Event): void;
12924
+ private focusFirst;
12925
+ static ɵfac: i0.ɵɵFactoryDeclaration<AddToCollectionPanelComponent, never>;
12926
+ static ɵcmp: i0.ɵɵComponentDeclaration<AddToCollectionPanelComponent, "AddToCollectionPanel, add-to-collection-panel", never, {
12927
+ "articles": {
12928
+ "alias": "articles";
12929
+ "required": true;
12930
+ "isSignal": true;
12931
+ };
12932
+ }, {
12933
+ "done": "done";
12934
+ "changed": "changed";
12935
+ "closeRequested": "closeRequested";
12936
+ }, never, never, true, never>;
12937
+ }
12741
12938
  /** Editable text/boolean fields of a converter (the app-filled `conversion` is excluded). */
12742
12939
  type ConverterField = "name" | "converter" | "format" | "primary" | "display" | "default";
12743
12940
  /** Groups the toggles are bucketed into, in display order. */
@@ -13053,7 +13250,7 @@ export declare class ExportDialog {
13053
13250
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
13054
13251
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
13055
13252
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
13056
- aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
13253
+ aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
13057
13254
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
13058
13255
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
13059
13256
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -13537,9 +13734,9 @@ export declare class SearchFeedbackComponent {
13537
13734
  onClose: import("@angular/core").OutputEmitterRef<void>;
13538
13735
  private readonly injector;
13539
13736
  pages: import("@angular/core").InputSignal<any>;
13540
- variant: import("@angular/core").InputSignal<"none" | "primary" | "secondary" | "light-accent" | "accent" | "tertiary" | null | undefined>;
13737
+ variant: import("@angular/core").InputSignal<"secondary" | "tertiary" | "none" | "primary" | "light-accent" | "accent" | null | undefined>;
13541
13738
  /** Size of the trigger button. `sm` fits a row of result options. */
13542
- size: import("@angular/core").InputSignal<"small" | "large" | "sm" | "md" | "lg" | "xs" | "xsmall" | "medium" | null | undefined>;
13739
+ size: import("@angular/core").InputSignal<"md" | "small" | "medium" | "large" | "lg" | "sm" | "xs" | "xsmall" | null | undefined>;
13543
13740
  /** Shows the close cross on the button. Turn it off where the button belongs to the page and is not a suggestion to dismiss. */
13544
13741
  dismissible: import("@angular/core").InputSignal<boolean>;
13545
13742
  readonly auditService: AuditService;
@@ -13570,7 +13767,7 @@ export declare class SearchFeedbackComponent {
13570
13767
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
13571
13768
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
13572
13769
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
13573
- aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
13770
+ aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
13574
13771
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
13575
13772
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
13576
13773
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -13892,7 +14089,7 @@ export declare class AggregationDateComponent {
13892
14089
  *
13893
14090
  * @default 'selection'
13894
14091
  */
13895
- emitOn: import("@angular/core").InputSignal<"apply" | "selection">;
14092
+ emitOn: import("@angular/core").InputSignal<"selection" | "apply">;
13896
14093
  readonly title: import("@angular/core").InputSignal<AggregationTitle>;
13897
14094
  readonly displayEmptyDistributionIntervals: import("@angular/core").InputSignal<boolean>;
13898
14095
  onSelect: import("@angular/core").OutputEmitterRef<AggregationItem[]>;
@@ -13960,7 +14157,7 @@ export declare class AggregationDateComponent {
13960
14157
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
13961
14158
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
13962
14159
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
13963
- aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
14160
+ aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
13964
14161
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
13965
14162
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
13966
14163
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -14048,6 +14245,9 @@ export declare class AggregationDateComponent {
14048
14245
  readonly allowCustomRange: boolean;
14049
14246
  readonly transloco: TranslocoService;
14050
14247
  private readonly injector;
14248
+ private readonly breakpoints;
14249
+ /** Clear all / Apply: a 44px target on touch (a finger, no hover), one step smaller with a mouse. */
14250
+ protected readonly actionSize: import("@angular/core").Signal<"md" | "lg">;
14051
14251
  private readonly host;
14052
14252
  protected readonly selection: import("@angular/core").WritableSignal<boolean>;
14053
14253
  protected readonly validSelection: import("@angular/core").WritableSignal<boolean>;
@@ -14472,7 +14672,7 @@ export declare class AggregationTreeComponent {
14472
14672
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
14473
14673
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
14474
14674
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
14475
- aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
14675
+ aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
14476
14676
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
14477
14677
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
14478
14678
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -15347,7 +15547,7 @@ export declare class AggregationListComponent {
15347
15547
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
15348
15548
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
15349
15549
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
15350
- aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
15550
+ aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
15351
15551
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
15352
15552
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
15353
15553
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -15478,14 +15678,7 @@ export declare class AggregationListComponent {
15478
15678
  };
15479
15679
  userProfile?: {
15480
15680
  enabled?: boolean;
15481
- data? /**
15482
- * Leaves out the header of the facet — its icon, its title, the collapse chevron — for a popover that holds this one facet
15483
- * (the popover of a filter button, whose button already says which facet it is). Select all, clear and apply are not in the
15484
- * header, whichever way the facet is shown: they sit in a bar under the search field. A popover that holds several facets
15485
- * (the "more filters" one) keeps the headers: each of them collapses and expands from its title.
15486
- *
15487
- * @default false
15488
- */ : string[];
15681
+ data?: string[];
15489
15682
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
15490
15683
  };
15491
15684
  previewMultiConversion?: boolean;
@@ -15499,7 +15692,19 @@ export declare class AggregationListComponent {
15499
15692
  light?: {
15500
15693
  small?: string;
15501
15694
  large?: string;
15502
- sidebar?: string;
15695
+ sidebar?
15696
+ /**
15697
+ * When `false`, applying or clearing filters updates the store without
15698
+ * synchronizing the URL (no browser history entry, not shareable/restorable).
15699
+ *
15700
+ * @default true
15701
+ */
15702
+ /**
15703
+ * When `false`, applying or clearing filters updates the store without
15704
+ * synchronizing the URL (no browser history entry, not shareable/restorable).
15705
+ *
15706
+ * @default true
15707
+ */ : string;
15503
15708
  };
15504
15709
  dark?: {
15505
15710
  small?: string;
@@ -15527,14 +15732,7 @@ export declare class AggregationListComponent {
15527
15732
  };
15528
15733
  userProfile?: {
15529
15734
  enabled?: boolean;
15530
- data? /**
15531
- * Leaves out the header of the facet — its icon, its title, the collapse chevron — for a popover that holds this one facet
15532
- * (the popover of a filter button, whose button already says which facet it is). Select all, clear and apply are not in the
15533
- * header, whichever way the facet is shown: they sit in a bar under the search field. A popover that holds several facets
15534
- * (the "more filters" one) keeps the headers: each of them collapses and expands from its title.
15535
- *
15536
- * @default false
15537
- */ : string[];
15735
+ data?: string[];
15538
15736
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
15539
15737
  };
15540
15738
  previewMultiConversion?: boolean;
@@ -15570,7 +15768,19 @@ export declare class AggregationListComponent {
15570
15768
  light?: {
15571
15769
  small?: string;
15572
15770
  large?: string;
15573
- sidebar?: string;
15771
+ sidebar?
15772
+ /**
15773
+ * When `false`, applying or clearing filters updates the store without
15774
+ * synchronizing the URL (no browser history entry, not shareable/restorable).
15775
+ *
15776
+ * @default true
15777
+ */
15778
+ /**
15779
+ * When `false`, applying or clearing filters updates the store without
15780
+ * synchronizing the URL (no browser history entry, not shareable/restorable).
15781
+ *
15782
+ * @default true
15783
+ */ : string;
15574
15784
  };
15575
15785
  dark?: {
15576
15786
  small?: string;
@@ -15598,14 +15808,7 @@ export declare class AggregationListComponent {
15598
15808
  };
15599
15809
  userProfile?: {
15600
15810
  enabled?: boolean;
15601
- data? /**
15602
- * Leaves out the header of the facet — its icon, its title, the collapse chevron — for a popover that holds this one facet
15603
- * (the popover of a filter button, whose button already says which facet it is). Select all, clear and apply are not in the
15604
- * header, whichever way the facet is shown: they sit in a bar under the search field. A popover that holds several facets
15605
- * (the "more filters" one) keeps the headers: each of them collapses and expands from its title.
15606
- *
15607
- * @default false
15608
- */ : string[];
15811
+ data?: string[];
15609
15812
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
15610
15813
  };
15611
15814
  previewMultiConversion?: boolean;
@@ -15699,14 +15902,7 @@ export declare class AggregationListComponent {
15699
15902
  };
15700
15903
  userProfile?: {
15701
15904
  enabled?: boolean;
15702
- data? /**
15703
- * Leaves out the header of the facet — its icon, its title, the collapse chevron — for a popover that holds this one facet
15704
- * (the popover of a filter button, whose button already says which facet it is). Select all, clear and apply are not in the
15705
- * header, whichever way the facet is shown: they sit in a bar under the search field. A popover that holds several facets
15706
- * (the "more filters" one) keeps the headers: each of them collapses and expands from its title.
15707
- *
15708
- * @default false
15709
- */ : string[];
15905
+ data?: string[];
15710
15906
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
15711
15907
  };
15712
15908
  previewMultiConversion?: boolean;
@@ -15720,7 +15916,19 @@ export declare class AggregationListComponent {
15720
15916
  light?: {
15721
15917
  small?: string;
15722
15918
  large?: string;
15723
- sidebar?: string;
15919
+ sidebar?
15920
+ /**
15921
+ * When `false`, applying or clearing filters updates the store without
15922
+ * synchronizing the URL (no browser history entry, not shareable/restorable).
15923
+ *
15924
+ * @default true
15925
+ */
15926
+ /**
15927
+ * When `false`, applying or clearing filters updates the store without
15928
+ * synchronizing the URL (no browser history entry, not shareable/restorable).
15929
+ *
15930
+ * @default true
15931
+ */ : string;
15724
15932
  };
15725
15933
  dark?: {
15726
15934
  small?: string;
@@ -15748,14 +15956,7 @@ export declare class AggregationListComponent {
15748
15956
  };
15749
15957
  userProfile?: {
15750
15958
  enabled?: boolean;
15751
- data? /**
15752
- * Leaves out the header of the facet — its icon, its title, the collapse chevron — for a popover that holds this one facet
15753
- * (the popover of a filter button, whose button already says which facet it is). Select all, clear and apply are not in the
15754
- * header, whichever way the facet is shown: they sit in a bar under the search field. A popover that holds several facets
15755
- * (the "more filters" one) keeps the headers: each of them collapses and expands from its title.
15756
- *
15757
- * @default false
15758
- */ : string[];
15959
+ data?: string[];
15759
15960
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
15760
15961
  };
15761
15962
  previewMultiConversion?: boolean;
@@ -16433,7 +16634,7 @@ export declare class AggregationComponent {
16433
16634
  *
16434
16635
  * @default 'selection'
16435
16636
  */
16436
- emitOn: import("@angular/core").InputSignal<"apply" | "selection">;
16637
+ emitOn: import("@angular/core").InputSignal<"selection" | "apply">;
16437
16638
  /**
16438
16639
  * Which sub-component renders the aggregation.
16439
16640
  *
@@ -16446,7 +16647,7 @@ export declare class AggregationComponent {
16446
16647
  *
16447
16648
  * @default "auto"
16448
16649
  */
16449
- type: import("@angular/core").InputSignal<"date" | "list" | "tree" | "auto">;
16650
+ type: import("@angular/core").InputSignal<"list" | "auto" | "tree" | "date">;
16450
16651
  /**
16451
16652
  * Whether the host removes itself from the layout (Tailwind's `hidden`, i.e.
16452
16653
  * `display: none`) when it resolves to zero items. When `false` (default), the
@@ -16498,7 +16699,7 @@ export declare class AggregationComponent {
16498
16699
  * The sub-component to render: the explicit `type` input, or the current
16499
16700
  * date/tree/list heuristic when `type` is `"auto"`.
16500
16701
  */
16501
- protected resolvedType: import("@angular/core").Signal<"date" | "list" | "tree">;
16702
+ protected resolvedType: import("@angular/core").Signal<"list" | "tree" | "date">;
16502
16703
  /** Whether a filter is currently applied on this aggregation. */
16503
16704
  private readonly hasFilters;
16504
16705
  /**
@@ -16694,6 +16895,9 @@ export declare class AggregationPanelComponent {
16694
16895
  private readonly searchBox;
16695
16896
  private readonly searchToggle;
16696
16897
  private readonly injector;
16898
+ private readonly breakpoints;
16899
+ /** Clear all / Apply: a 44px target on touch (a finger, no hover), one step smaller with a mouse. */
16900
+ protected readonly actionSize: import("@angular/core").Signal<"md" | "lg">;
16697
16901
  /** The galactik popover (`[popover]` / `[dropdown]`) this panel is shown in, if any — resolved through the injector tree. */
16698
16902
  protected readonly isInPopover: boolean;
16699
16903
  private static nextId;
@@ -16825,6 +17029,8 @@ export type AppliedFilterChip = {
16825
17029
  readonly field: string;
16826
17030
  /** Aggregation name, when the filter carries one. */
16827
17031
  readonly name?: string;
17032
+ /** Icon configured for the aggregation in the custom JSON (FontAwesome class string), when there is one. */
17033
+ readonly icon?: string;
16828
17034
  /** The value as stored. */
16829
17035
  readonly value: string;
16830
17036
  /** What to show. Pipe it through `syslang`. */
@@ -16901,6 +17107,7 @@ export declare function filterKey(leaf: LegacyFilter): string;
16901
17107
  */
16902
17108
  export declare class AppliedFiltersComponent {
16903
17109
  private readonly queryParamsStore;
17110
+ private readonly appStore;
16904
17111
  private static nextId;
16905
17112
  protected readonly listId: string;
16906
17113
  private readonly list;
@@ -16928,6 +17135,12 @@ export declare class AppliedFiltersComponent {
16928
17135
  readonly syncUrl: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
16929
17136
  /** Whether each chip is prefixed with its aggregation (or field) name. */
16930
17137
  readonly showField: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
17138
+ /**
17139
+ * Whether the aggregation's icon replaces its name in the prefix, when the custom JSON configures one.
17140
+ * The name remains the tooltip and the accessible text. Aggregations without an icon keep `<name>:`.
17141
+ * Only applies while `showField` is on.
17142
+ */
17143
+ readonly fieldIcon: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
16931
17144
  /**
16932
17145
  * Chip fill, passed straight to galactik's `tag`.
16933
17146
  *
@@ -16939,11 +17152,11 @@ export declare class AppliedFiltersComponent {
16939
17152
  * than as "unset". A `null` here would therefore silently neutralise `scheme` — the chips would keep
16940
17153
  * their base look whatever colour was asked for. `undefined` lets the tag apply its own default.
16941
17154
  */
16942
- readonly variant: import("@angular/core").InputSignal<"primary" | "secondary" | null | undefined>;
17155
+ readonly variant: import("@angular/core").InputSignal<"secondary" | "primary" | null | undefined>;
16943
17156
  /** Chip colour scheme, passed to galactik's `tag`. */
16944
- readonly scheme: import("@angular/core").InputSignal<"error" | "sage" | "success" | "almond" | "pink" | "grey" | "yellow" | "cherry" | "indigo" | "cyan" | "warning" | "info" | null | undefined>;
17157
+ readonly scheme: import("@angular/core").InputSignal<"error" | "sage" | "almond" | "pink" | "grey" | "yellow" | "cherry" | "indigo" | "cyan" | "success" | "warning" | "info" | null | undefined>;
16945
17158
  /** Chip size, passed to galactik's `tag`. */
16946
- readonly size: import("@angular/core").InputSignal<"small" | "sm" | "md" | "xs" | "xsmall" | "medium" | null | undefined>;
17159
+ readonly size: import("@angular/core").InputSignal<"md" | "small" | "medium" | "sm" | "xs" | "xsmall" | null | undefined>;
16947
17160
  /** Extra classes for each chip, merged by galactik's `tag`. */
16948
17161
  readonly chipClass: import("@angular/core").InputSignal<string>;
16949
17162
  /**
@@ -17001,6 +17214,11 @@ export declare class AppliedFiltersComponent {
17001
17214
  "required": false;
17002
17215
  "isSignal": true;
17003
17216
  };
17217
+ "fieldIcon": {
17218
+ "alias": "fieldIcon";
17219
+ "required": false;
17220
+ "isSignal": true;
17221
+ };
17004
17222
  "variant": {
17005
17223
  "alias": "variant";
17006
17224
  "required": false;
@@ -17190,7 +17408,7 @@ export declare class FilterButtonComponent {
17190
17408
  * @default "sage"
17191
17409
  */
17192
17410
  scheme: import("@angular/core").InputSignal<FilterScheme>;
17193
- protected variant: import("@angular/core").WritableSignal<"none" | "primary" | "secondary" | "light-accent" | "accent" | "tertiary" | null | undefined>;
17411
+ protected variant: import("@angular/core").WritableSignal<"secondary" | "tertiary" | "none" | "primary" | "light-accent" | "accent" | null | undefined>;
17194
17412
  protected filter: import("@angular/core").WritableSignal<CFilterEx>;
17195
17413
  /** Unique id wiring the trigger's `popovertarget` to the `<div popover>` `id`. */
17196
17414
  protected readonly popoverId: string;
@@ -17247,7 +17465,7 @@ export declare class FilterButtonComponent {
17247
17465
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
17248
17466
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
17249
17467
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
17250
- aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
17468
+ aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
17251
17469
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
17252
17470
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
17253
17471
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -18238,7 +18456,7 @@ export declare class MoreButtonComponent {
18238
18456
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
18239
18457
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
18240
18458
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
18241
- aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
18459
+ aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
18242
18460
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
18243
18461
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
18244
18462
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -18595,7 +18813,7 @@ export declare class FiltersBarComponent {
18595
18813
  *
18596
18814
  * @default "start"
18597
18815
  */
18598
- align: import("@angular/core").InputSignal<"start" | "center">;
18816
+ align: import("@angular/core").InputSignal<"center" | "start">;
18599
18817
  /**
18600
18818
  * How far apart the buttons are. `compact` (the default) is the tight spacing of a toolbar; `comfortable` puts
18601
18819
  * `--spacing-lg` (20px) between every button, the quick filters pill and the "more" button included, as under the
@@ -19024,7 +19242,7 @@ export declare class FiltersBarComponent {
19024
19242
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
19025
19243
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
19026
19244
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
19027
- aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
19245
+ aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
19028
19246
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
19029
19247
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
19030
19248
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -19994,8 +20212,8 @@ export declare class HistoryPanelComponent {
19994
20212
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
19995
20213
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
19996
20214
  language?: import("@angular/core").Signal<string | undefined> | undefined;
19997
- userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
19998
- agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
20215
+ userTheme: import("@angular/core").Signal<"light" | "dark" | "system" | undefined>;
20216
+ agents: import("@angular/core").Signal<undefined> | import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings>;
19999
20217
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
20000
20218
  isDebugMode: import("@angular/core").Signal<boolean>;
20001
20219
  isDarkMode: import("@angular/core").Signal<boolean>;
@@ -20061,7 +20279,8 @@ export declare class HistoryPanelComponent {
20061
20279
  protected readonly isMobile: import("@angular/core").Signal<boolean>;
20062
20280
  protected readonly sheetClasses: string;
20063
20281
  protected readonly rowButton = "flex size-5 shrink-0 cursor-pointer items-center justify-center overflow-hidden rounded-full border-0 bg-transparent p-0 transition-[max-width,opacity,background-color,color] duration-150 motion-reduce:transition-none focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-(--stroke-focus) focus-visible:-outline-offset-2";
20064
- protected readonly rowButtonHidden = "max-w-0 opacity-0 group-hover/row:max-w-5 group-hover/row:opacity-100 group-focus-within/row:max-w-5 group-focus-within/row:opacity-100";
20282
+ protected readonly rowButtonHidden = "max-w-0 opacity-0 group-hover/row:max-w-5 group-hover/row:opacity-100 group-focus-within/row:max-w-5 group-focus-within/row:opacity-100 pointer-coarse:sr-only";
20283
+ protected readonly infoButton = "hidden size-8 shrink-0 cursor-pointer items-center justify-center rounded-full border-0 bg-transparent p-0 text-(--history-panel-icon,var(--font-neutral-muted)) active:bg-(--history-panel-active,var(--bg-neutral-hovered)) focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-(--stroke-focus) focus-visible:-outline-offset-2 pointer-coarse:flex";
20065
20284
  /**
20066
20285
  * Gives a `<history-panel>` an opening and closing animation that does not depend on the host
20067
20286
  * app: width, padding and margin ease out together, and reduced motion drops the movement. The panel is as tall as
@@ -20076,6 +20295,8 @@ export declare class HistoryPanelComponent {
20076
20295
  protected titleOf: (search: SearchItem) => string;
20077
20296
  protected isFavorite: (search: SearchItem) => boolean;
20078
20297
  protected onTab(value: string[]): void;
20298
+ /** The ⓘ of a row: shows the whole title in its tooltip, or takes it away at a second tap. A tap elsewhere closes it (the tooltip's own). */
20299
+ protected toggleTitle(tip: TooltipDirective): void;
20079
20300
  protected onEscape(event: Event): void;
20080
20301
  protected select(search: SearchItem): void;
20081
20302
  protected toggleFavorite(search: SearchItem): Promise<boolean>;
@@ -20145,7 +20366,7 @@ export declare class QuickFiltersComponent {
20145
20366
  private readonly popover;
20146
20367
  protected readonly isOpen: import("@angular/core").Signal<boolean>;
20147
20368
  constructor();
20148
- protected readonly variant: import("@angular/core").Signal<"none" | "primary" | "secondary" | "light-accent" | "accent" | "tertiary" | null | undefined>;
20369
+ protected readonly variant: import("@angular/core").Signal<"secondary" | "tertiary" | "none" | "primary" | "light-accent" | "accent" | null | undefined>;
20149
20370
  protected readonly triggerClass: import("@angular/core").Signal<string>;
20150
20371
  /** What was just done, for the screen readers: kept here, as the list goes with the popover once a quick filter is applied. */
20151
20372
  protected readonly announcement: import("@angular/core").WritableSignal<string>;
@@ -20217,6 +20438,7 @@ export declare class QuickFiltersListComponent {
20217
20438
  private readonly transloco;
20218
20439
  private readonly host;
20219
20440
  private readonly injector;
20441
+ private readonly isTouch;
20220
20442
  protected readonly deleteKeys: string[];
20221
20443
  protected readonly quickFilters: import("@angular/core").Signal<QuickFilter[]>;
20222
20444
  protected readonly query: import("@angular/core").WritableSignal<string>;
@@ -20231,6 +20453,8 @@ export declare class QuickFiltersListComponent {
20231
20453
  private readonly detailsCard;
20232
20454
  private hideTimer;
20233
20455
  private readonly deleting;
20456
+ /** True while `remove()` hands the focus to a row: the `focusin` it raises is not a reader's visit. */
20457
+ private restoringFocus;
20234
20458
  constructor();
20235
20459
  /**
20236
20460
  * What a quick filter holds, one chip per filter: the icon the application gave the aggregation of the filter in the
@@ -20243,6 +20467,22 @@ export declare class QuickFiltersListComponent {
20243
20467
  }[];
20244
20468
  /** Shows what a quick filter holds, under the line of its count of filters. */
20245
20469
  protected showDetails(quickFilter: QuickFilter, anchor: HTMLElement): void;
20470
+ /**
20471
+ * The keyboard focus reached a row: shows its filters. Not when the list itself put the focus there — after a deletion the
20472
+ * focus is handed to the row that took the place of the deleted one, and its card would open for a row nobody was looking at.
20473
+ * Not on a touch screen either: a tap focuses the row BEFORE the click of the ⓘ, which would then find the card open and close it —
20474
+ * the first tap on the ⓘ did nothing. There, the ⓘ is the only way to the card.
20475
+ */
20476
+ protected onRowFocus(quickFilter: QuickFilter, anchor: HTMLElement): void;
20477
+ /**
20478
+ * The hover of the count line. A touch screen has none, but a browser still fires a synthetic `mouseenter` at a tap — the card
20479
+ * would flash and be closed by the click that follows: it is the ⓘ that opens it there.
20480
+ */
20481
+ protected onCountEnter(quickFilter: QuickFilter, anchor: HTMLElement): void;
20482
+ /** The ⓘ of a touch screen: opens the card of the row, or closes it when it is that row's. It never applies the quick filter. */
20483
+ protected toggleDetails(quickFilter: QuickFilter, anchor: HTMLElement, event: Event): void;
20484
+ /** A press outside the card, and outside the ⓘ that toggles it, closes it. */
20485
+ protected onDocumentPointerDown(event: Event): void;
20246
20486
  /** Hides the card a moment later, so the pointer can cross from the row to the card. */
20247
20487
  protected scheduleHideDetails(): void;
20248
20488
  protected cancelHideDetails(): void;
@@ -20262,7 +20502,7 @@ export declare class QuickFiltersListComponent {
20262
20502
  * focus was in the list it goes to the row that took its place, or to the list itself when it was the last, so it is never dropped
20263
20503
  * on the page.
20264
20504
  */
20265
- protected remove(quickFilter: QuickFilter, index: number, event: Event): Promise<void>;
20505
+ protected remove(quickFilter: QuickFilter, index: number, event?: Event): Promise<void>;
20266
20506
  static ɵfac: i0.ɵɵFactoryDeclaration<QuickFiltersListComponent, never>;
20267
20507
  static ɵcmp: i0.ɵɵComponentDeclaration<QuickFiltersListComponent, "QuickFiltersList, quick-filters-list", never, {
20268
20508
  "searchable": {
@@ -20399,7 +20639,7 @@ export type SearchBoxTab = "suggestions" | "saved";
20399
20639
  */
20400
20640
  export declare class SearchBoxComponent {
20401
20641
  /** Scale of the field: `hero` for a home page (the prototype's pill), `medium` (36px) for the header of a results page. */
20402
- readonly size: import("@angular/core").InputSignal<"small" | "large" | "medium" | "hero" | null | undefined>;
20642
+ readonly size: import("@angular/core").InputSignal<"small" | "medium" | "large" | "hero" | null | undefined>;
20403
20643
  /** Shows the saved-search star once there is something to save. */
20404
20644
  readonly showSave: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
20405
20645
  /** The route a search leads to. */
@@ -20480,7 +20720,7 @@ export declare class SearchBoxComponent {
20480
20720
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
20481
20721
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
20482
20722
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
20483
- aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
20723
+ aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
20484
20724
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
20485
20725
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
20486
20726
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -20891,8 +21131,8 @@ export declare class SearchBoxComponent {
20891
21131
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
20892
21132
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
20893
21133
  language?: import("@angular/core").Signal<string | undefined> | undefined;
20894
- userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
20895
- agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
21134
+ userTheme: import("@angular/core").Signal<"light" | "dark" | "system" | undefined>;
21135
+ agents: import("@angular/core").Signal<undefined> | import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings>;
20896
21136
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
20897
21137
  isDebugMode: import("@angular/core").Signal<boolean>;
20898
21138
  isDarkMode: import("@angular/core").Signal<boolean>;
@@ -21202,8 +21442,8 @@ export declare class RecentSearchesComponent {
21202
21442
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
21203
21443
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
21204
21444
  language?: import("@angular/core").Signal<string | undefined> | undefined;
21205
- userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
21206
- agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
21445
+ userTheme: import("@angular/core").Signal<"light" | "dark" | "system" | undefined>;
21446
+ agents: import("@angular/core").Signal<undefined> | import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings>;
21207
21447
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
21208
21448
  isDebugMode: import("@angular/core").Signal<boolean>;
21209
21449
  isDarkMode: import("@angular/core").Signal<boolean>;
@@ -21327,8 +21567,8 @@ export declare class SavedSearchPopover {
21327
21567
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
21328
21568
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
21329
21569
  language?: import("@angular/core").Signal<string | undefined> | undefined;
21330
- userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
21331
- agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
21570
+ userTheme: import("@angular/core").Signal<"light" | "dark" | "system" | undefined>;
21571
+ agents: import("@angular/core").Signal<undefined> | import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings>;
21332
21572
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
21333
21573
  isDebugMode: import("@angular/core").Signal<boolean>;
21334
21574
  isDarkMode: import("@angular/core").Signal<boolean>;
@@ -21423,8 +21663,8 @@ export declare class SavedSearchesComponent {
21423
21663
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
21424
21664
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
21425
21665
  language?: import("@angular/core").Signal<string | undefined> | undefined;
21426
- userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
21427
- agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
21666
+ userTheme: import("@angular/core").Signal<"light" | "dark" | "system" | undefined>;
21667
+ agents: import("@angular/core").Signal<undefined> | import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings>;
21428
21668
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
21429
21669
  isDebugMode: import("@angular/core").Signal<boolean>;
21430
21670
  isDarkMode: import("@angular/core").Signal<boolean>;
@@ -21518,13 +21758,29 @@ export interface SettingsDialogProps {
21518
21758
  export declare class SettingsDialogComponent {
21519
21759
  protected readonly call: import("@sinequa/galactik").CallRef<SettingsDialogProps, DialogResult>;
21520
21760
  private readonly dialog;
21761
+ /** The navigation: a column, and under md a strip that scrolls sideways. */
21762
+ private readonly strip;
21763
+ private stripPositioned;
21521
21764
  protected readonly items: {
21522
21765
  id: SettingsPanelId;
21523
21766
  labelKey: string;
21524
21767
  }[];
21525
21768
  protected readonly panel: import("@angular/core").WritableSignal<SettingsPanelId>;
21769
+ /** False while the page is driven with a finger: a list of keyboard shortcuts means nothing on a tablet that has no keyboard. */
21770
+ private readonly keyboardAvailable;
21771
+ /**
21772
+ * The entries of the navigation. "Keyboard shortcuts" is left out without a keyboard — unless it is the panel being shown, which an
21773
+ * application asked for (`Settings.call({ panel: "shortcuts" })`) and must not lose from under the user.
21774
+ */
21775
+ protected readonly visibleItems: import("@angular/core").Signal<{
21776
+ id: SettingsPanelId;
21777
+ labelKey: string;
21778
+ }[]>;
21526
21779
  /** Once the user picks a panel, the focus is theirs: the account panel stops claiming it. */
21527
21780
  protected readonly navigated: import("@angular/core").WritableSignal<boolean>;
21781
+ private resizeObserver?;
21782
+ private reveal;
21783
+ private revealWhenLaidOut;
21528
21784
  protected navigate(id: SettingsPanelId): void;
21529
21785
  /** Set when another instance is already open: this one only redirects it, then ends. */
21530
21786
  protected readonly duplicate: boolean;
@@ -21581,7 +21837,7 @@ export declare class SettingsAccountPanelComponent {
21581
21837
  param9: import("@angular/core").Signal<string>;
21582
21838
  param10: import("@angular/core").Signal<string>;
21583
21839
  userOverrideActive: import("@angular/core").Signal<boolean>;
21584
- state: import("@angular/core").Signal<"error" | "initial" | "loading" | "loaded">;
21840
+ state: import("@angular/core").Signal<"error" | "loading" | "loaded" | "initial">;
21585
21841
  allowUserOverride: import("@angular/core").Signal<boolean>;
21586
21842
  isOverridingUser: import("@angular/core").Signal<boolean>;
21587
21843
  initials: import("@angular/core").Signal<string>;
@@ -21656,7 +21912,7 @@ export declare class SettingsAppearancePanelComponent {
21656
21912
  private readonly themeIcons;
21657
21913
  private readonly languageIcons;
21658
21914
  private readonly languageLabels;
21659
- protected readonly currentTheme: import("@angular/core").Signal<"dark" | "light" | "system">;
21915
+ protected readonly currentTheme: import("@angular/core").Signal<"light" | "dark" | "system">;
21660
21916
  protected readonly currentLanguage: import("@angular/core").Signal<string>;
21661
21917
  protected readonly themeLabel: (code: string | null) => string;
21662
21918
  protected readonly languageLabel: (code: string | null) => string;
@@ -21713,6 +21969,11 @@ export interface UserProfileFormModel {
21713
21969
  customData: Record<string, string>;
21714
21970
  }
21715
21971
  export declare class UserProfileFormComponent {
21972
+ /**
21973
+ * Whether the form pads itself (16px). On by default, for a page that holds nothing else. Off where the host already has its own
21974
+ * padding, as the settings do: the card of the profile was then 37px from the edge of the panel, while its other sections sat at 0.
21975
+ */
21976
+ readonly padded: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
21716
21977
  protected readonly principalStore: {
21717
21978
  id: Signal<string>;
21718
21979
  id2: Signal<string>;
@@ -21740,7 +22001,7 @@ export declare class UserProfileFormComponent {
21740
22001
  param9: Signal<string>;
21741
22002
  param10: Signal<string>;
21742
22003
  userOverrideActive: Signal<boolean>;
21743
- state: Signal<"error" | "initial" | "loading" | "loaded">;
22004
+ state: Signal<"error" | "loading" | "loaded" | "initial">;
21744
22005
  allowUserOverride: Signal<boolean>;
21745
22006
  isOverridingUser: Signal<boolean>;
21746
22007
  initials: Signal<string>;
@@ -22332,7 +22593,13 @@ export declare class UserProfileFormComponent {
22332
22593
  */
22333
22594
  protected uploadAvatar(event: Event): void;
22334
22595
  static ɵfac: i0.ɵɵFactoryDeclaration<UserProfileFormComponent, never>;
22335
- static ɵcmp: i0.ɵɵComponentDeclaration<UserProfileFormComponent, "user-profile-form, UserProfileForm, userprofileform", never, {}, {}, never, never, true, never>;
22596
+ static ɵcmp: i0.ɵɵComponentDeclaration<UserProfileFormComponent, "user-profile-form, UserProfileForm, userprofileform", never, {
22597
+ "padded": {
22598
+ "alias": "padded";
22599
+ "required": false;
22600
+ "isSignal": true;
22601
+ };
22602
+ }, {}, never, never, true, never>;
22336
22603
  }
22337
22604
  /**
22338
22605
  * Returns a guard function that checks if the user is authenticated.