@sinequa/atomic-angular 2.15.0 → 2.16.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.
@@ -2,7 +2,7 @@ import * as i0 from "@angular/core";
2
2
  import { ApplicationRef, ChangeDetectorRef, DestroyRef, ElementRef, EnvironmentProviders, InjectionToken, Injector, OnDestroy, OnInit, PipeTransform, Provider, ResourceRef, Signal, TemplateRef, Type, WritableSignal } from "@angular/core";
3
3
  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
- import { CanActivateFn, NavigationEnd, Params, ResolveFn, Route, Router } from "@angular/router";
5
+ import { CanActivateFn, CanMatchFn, NavigationEnd, Params, ResolveFn, Route, Router } from "@angular/router";
6
6
  import { VariantProps } from "class-variance-authority";
7
7
  import { BreakpointObserverService, DialogComponent, DialogEvent, DialogResult, DropdownDirective, PopoverDirective, SheetComponent, SwitchComponent, TooltipDirective } from "@sinequa/galactik";
8
8
  import { DomSanitizer, SafeHtml, Title } from "@angular/platform-browser";
@@ -246,7 +246,7 @@ export type CJ = {
246
246
  };
247
247
  };
248
248
  /**
249
- * An entry of `features.userProfile.customData`: a property name (`"nickname"`) or an object whose
249
+ * An entry of `features.userProfile.customData` or `features.userProfile.privateCustomData`: a property name (`"nickname"`) or an object whose
250
250
  * keys are property names and whose values are their default (`{ "nickname": "none" }`). A default can
251
251
  * be any JSON value, an object included (`{ "theme": { "mode": "dark" } }`).
252
252
  */
@@ -274,6 +274,7 @@ type CFeatures = {
274
274
  enabled?: boolean;
275
275
  data?: string[];
276
276
  customData?: CustomDataEntry[];
277
+ privateCustomData?: CustomDataEntry[];
277
278
  };
278
279
  previewMultiConversion?: boolean;
279
280
  persistFiltersAcrossTabs?: boolean;
@@ -492,6 +493,7 @@ export declare class ConverterSelectComponent {
492
493
  enabled?: boolean;
493
494
  data?: string[];
494
495
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
496
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
495
497
  };
496
498
  previewMultiConversion?: boolean;
497
499
  persistFiltersAcrossTabs?: boolean;
@@ -534,6 +536,7 @@ export declare class ConverterSelectComponent {
534
536
  enabled?: boolean;
535
537
  data?: string[];
536
538
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
539
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
537
540
  };
538
541
  previewMultiConversion?: boolean;
539
542
  persistFiltersAcrossTabs?: boolean;
@@ -598,6 +601,7 @@ export declare class ConverterSelectComponent {
598
601
  enabled?: boolean;
599
602
  data?: string[];
600
603
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
604
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
601
605
  };
602
606
  previewMultiConversion?: boolean;
603
607
  persistFiltersAcrossTabs?: boolean;
@@ -692,6 +696,7 @@ export declare class ConverterSelectComponent {
692
696
  enabled?: boolean;
693
697
  data?: string[];
694
698
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
699
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
695
700
  };
696
701
  previewMultiConversion?: boolean;
697
702
  persistFiltersAcrossTabs?: boolean;
@@ -734,6 +739,7 @@ export declare class ConverterSelectComponent {
734
739
  enabled?: boolean;
735
740
  data?: string[];
736
741
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
742
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
737
743
  };
738
744
  previewMultiConversion?: boolean;
739
745
  persistFiltersAcrossTabs?: boolean;
@@ -891,7 +897,7 @@ export declare class DocumentLocatorComponent implements OnDestroy {
891
897
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
892
898
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
893
899
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
894
- aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
900
+ aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
895
901
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
896
902
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
897
903
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -1074,9 +1080,9 @@ export declare class MetadataComponent {
1074
1080
  event: Event;
1075
1081
  }>;
1076
1082
  class: import("@angular/core").InputSignal<string | 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>;
1083
+ variant: import("@angular/core").InputSignal<"primary" | "secondary" | null | undefined>;
1084
+ size: import("@angular/core").InputSignal<"small" | "sm" | "md" | "xs" | "xsmall" | "medium" | null | undefined>;
1085
+ scheme: import("@angular/core").InputSignal<"error" | "sage" | "success" | "almond" | "pink" | "grey" | "yellow" | "cherry" | "indigo" | "cyan" | "warning" | "info" | null | undefined>;
1080
1086
  metadata: import("@angular/core").InputSignal<(string & Record<never, never>) | KeyOf<Article>>;
1081
1087
  article: import("@angular/core").InputSignal<(string & Record<never, never>) | Partial<Article>>;
1082
1088
  limit: import("@angular/core").InputSignalWithTransform<number | undefined, string | number | undefined>;
@@ -1152,7 +1158,7 @@ export declare class MissingTermsComponent {
1152
1158
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
1153
1159
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
1154
1160
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
1155
- aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
1161
+ aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
1156
1162
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
1157
1163
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
1158
1164
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -1252,7 +1258,7 @@ export declare class MissingTermsComponent {
1252
1258
  }, {}, never, never, true, never>;
1253
1259
  }
1254
1260
  export declare const multiSelectionToolbarVariants: (props?: ({
1255
- variant?: "light" | "dark" | "glassy" | "floating" | null | undefined;
1261
+ variant?: "dark" | "light" | "glassy" | "floating" | null | undefined;
1256
1262
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
1257
1263
  export type MultiSelectionToolbarVariants = VariantProps<typeof multiSelectionToolbarVariants>;
1258
1264
  export declare class MultiSelectionToolbarComponent {
@@ -1307,6 +1313,7 @@ export declare class MultiSelectionToolbarComponent {
1307
1313
  enabled?: boolean;
1308
1314
  data?: string[];
1309
1315
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
1316
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
1310
1317
  };
1311
1318
  previewMultiConversion?: boolean;
1312
1319
  persistFiltersAcrossTabs?: boolean;
@@ -1349,6 +1356,7 @@ export declare class MultiSelectionToolbarComponent {
1349
1356
  enabled?: boolean;
1350
1357
  data?: string[];
1351
1358
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
1359
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
1352
1360
  };
1353
1361
  previewMultiConversion?: boolean;
1354
1362
  persistFiltersAcrossTabs?: boolean;
@@ -1413,6 +1421,7 @@ export declare class MultiSelectionToolbarComponent {
1413
1421
  enabled?: boolean;
1414
1422
  data?: string[];
1415
1423
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
1424
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
1416
1425
  };
1417
1426
  previewMultiConversion?: boolean;
1418
1427
  persistFiltersAcrossTabs?: boolean;
@@ -1507,6 +1516,7 @@ export declare class MultiSelectionToolbarComponent {
1507
1516
  enabled?: boolean;
1508
1517
  data?: string[];
1509
1518
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
1519
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
1510
1520
  };
1511
1521
  previewMultiConversion?: boolean;
1512
1522
  persistFiltersAcrossTabs?: boolean;
@@ -1549,6 +1559,7 @@ export declare class MultiSelectionToolbarComponent {
1549
1559
  enabled?: boolean;
1550
1560
  data?: string[];
1551
1561
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
1562
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
1552
1563
  };
1553
1564
  previewMultiConversion?: boolean;
1554
1565
  persistFiltersAcrossTabs?: boolean;
@@ -1575,7 +1586,7 @@ export declare class MultiSelectionToolbarComponent {
1575
1586
  columnMap?: Record<string, import("@sinequa/atomic").CCColumn> | undefined;
1576
1587
  }>;
1577
1588
  readonly selection: {
1578
- article?: import("@ngrx/signals").DeepSignal<Article> | import("@angular/core").Signal<undefined> | undefined;
1589
+ article?: import("@angular/core").Signal<undefined> | import("@ngrx/signals").DeepSignal<Article> | undefined;
1579
1590
  id?: import("@angular/core").Signal<string | undefined> | undefined;
1580
1591
  queryText?: import("@angular/core").Signal<string | undefined> | undefined;
1581
1592
  queryName?: import("@angular/core").Signal<string | undefined> | undefined;
@@ -1635,6 +1646,7 @@ export declare class MultiSelectionToolbarComponent {
1635
1646
  enabled?: boolean;
1636
1647
  data?: string[];
1637
1648
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
1649
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
1638
1650
  };
1639
1651
  previewMultiConversion?: boolean;
1640
1652
  persistFiltersAcrossTabs?: boolean;
@@ -1647,7 +1659,7 @@ export declare class MultiSelectionToolbarComponent {
1647
1659
  * `dark`, `light`, `glassy`: one bar at the bottom centre of the window. `floating`: detached buttons
1648
1660
  * in the bottom-right corner of the window, as in lexiQ.
1649
1661
  */
1650
- readonly variant: import("@angular/core").InputSignal<"light" | "dark" | "glassy" | "floating" | null | undefined>;
1662
+ readonly variant: import("@angular/core").InputSignal<"dark" | "light" | "glassy" | "floating" | null | undefined>;
1651
1663
  /**
1652
1664
  * Texte ajouté à l'annonce lecteur d'écran lors de la **première** sélection (ex. « F6 pour accéder
1653
1665
  * aux actions »). Il est fourni par l'application : seule elle sait par quel raccourci elle rend la
@@ -1807,6 +1819,7 @@ export declare class NavbarTabsComponent {
1807
1819
  enabled?: boolean;
1808
1820
  data?: string[];
1809
1821
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
1822
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
1810
1823
  };
1811
1824
  previewMultiConversion?: boolean;
1812
1825
  persistFiltersAcrossTabs?: boolean;
@@ -1849,6 +1862,7 @@ export declare class NavbarTabsComponent {
1849
1862
  enabled?: boolean;
1850
1863
  data?: string[];
1851
1864
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
1865
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
1852
1866
  };
1853
1867
  previewMultiConversion?: boolean;
1854
1868
  persistFiltersAcrossTabs?: boolean;
@@ -1913,6 +1927,7 @@ export declare class NavbarTabsComponent {
1913
1927
  enabled?: boolean;
1914
1928
  data?: string[];
1915
1929
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
1930
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
1916
1931
  };
1917
1932
  previewMultiConversion?: boolean;
1918
1933
  persistFiltersAcrossTabs?: boolean;
@@ -2007,6 +2022,7 @@ export declare class NavbarTabsComponent {
2007
2022
  enabled?: boolean;
2008
2023
  data?: string[];
2009
2024
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
2025
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
2010
2026
  };
2011
2027
  previewMultiConversion?: boolean;
2012
2028
  persistFiltersAcrossTabs?: boolean;
@@ -2049,6 +2065,7 @@ export declare class NavbarTabsComponent {
2049
2065
  enabled?: boolean;
2050
2066
  data?: string[];
2051
2067
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
2068
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
2052
2069
  };
2053
2070
  previewMultiConversion?: boolean;
2054
2071
  persistFiltersAcrossTabs?: boolean;
@@ -2094,7 +2111,7 @@ export declare class NavbarTabsComponent {
2094
2111
  *
2095
2112
  * @default "primary"
2096
2113
  */
2097
- variant: import("@angular/core").InputSignal<"secondary" | "primary" | "inner">;
2114
+ variant: import("@angular/core").InputSignal<"primary" | "secondary" | "inner">;
2098
2115
  /** The pill strip is the only variant whose tabs keep galactik's own, smaller size. */
2099
2116
  protected readonly isPill: import("@angular/core").Signal<boolean>;
2100
2117
  showCount: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
@@ -2261,6 +2278,11 @@ export declare class OverflowActionsComponent {
2261
2278
  private readonly appConfig;
2262
2279
  /** The document the actions are about. Without one there is no bookmark and no link to copy. */
2263
2280
  readonly article: import("@angular/core").InputSignal<Article | undefined>;
2281
+ /**
2282
+ * Where the bookmark button files the document: `bookmarks` (default, the historical behaviour) or `collections`,
2283
+ * where a click opens the "add to collection" panel. Same input as `<bookmark-button [target]>`.
2284
+ */
2285
+ readonly bookmarkTarget: import("@angular/core").InputSignal<"bookmarks" | "collections">;
2264
2286
  /** Which built-in buttons to bring, merged over `OVERFLOW_ACTIONS_CONFIG` and the defaults (all on). */
2265
2287
  readonly config: import("@angular/core").InputSignal<Partial<OverflowActionsConfig>>;
2266
2288
  /** `false` where there is no bigger container to grow into (a full-screen sheet): the expand button goes. */
@@ -2309,6 +2331,11 @@ export declare class OverflowActionsComponent {
2309
2331
  "required": false;
2310
2332
  "isSignal": true;
2311
2333
  };
2334
+ "bookmarkTarget": {
2335
+ "alias": "bookmarkTarget";
2336
+ "required": false;
2337
+ "isSignal": true;
2338
+ };
2312
2339
  "config": {
2313
2340
  "alias": "config";
2314
2341
  "required": false;
@@ -2706,6 +2733,7 @@ export declare const AppStore: import("@angular/core").Type<{
2706
2733
  enabled?: boolean;
2707
2734
  data?: string[];
2708
2735
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
2736
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
2709
2737
  };
2710
2738
  previewMultiConversion?: boolean;
2711
2739
  persistFiltersAcrossTabs?: boolean;
@@ -2748,6 +2776,7 @@ export declare const AppStore: import("@angular/core").Type<{
2748
2776
  enabled?: boolean;
2749
2777
  data?: string[];
2750
2778
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
2779
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
2751
2780
  };
2752
2781
  previewMultiConversion?: boolean;
2753
2782
  persistFiltersAcrossTabs?: boolean;
@@ -2812,6 +2841,7 @@ export declare const AppStore: import("@angular/core").Type<{
2812
2841
  enabled?: boolean;
2813
2842
  data?: string[];
2814
2843
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
2844
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
2815
2845
  };
2816
2846
  previewMultiConversion?: boolean;
2817
2847
  persistFiltersAcrossTabs?: boolean;
@@ -2900,6 +2930,7 @@ export declare const AppStore: import("@angular/core").Type<{
2900
2930
  enabled?: boolean;
2901
2931
  data?: string[];
2902
2932
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
2933
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
2903
2934
  };
2904
2935
  previewMultiConversion?: boolean;
2905
2936
  persistFiltersAcrossTabs?: boolean;
@@ -2942,6 +2973,7 @@ export declare const AppStore: import("@angular/core").Type<{
2942
2973
  enabled?: boolean;
2943
2974
  data?: string[];
2944
2975
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
2976
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
2945
2977
  };
2946
2978
  previewMultiConversion?: boolean;
2947
2979
  persistFiltersAcrossTabs?: boolean;
@@ -3021,6 +3053,7 @@ export declare function withAppFeatures(): import("@ngrx/signals").SignalStoreFe
3021
3053
  enabled?: boolean;
3022
3054
  data?: string[];
3023
3055
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
3056
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
3024
3057
  };
3025
3058
  previewMultiConversion?: boolean;
3026
3059
  persistFiltersAcrossTabs?: boolean;
@@ -3063,6 +3096,7 @@ export declare function withAppFeatures(): import("@ngrx/signals").SignalStoreFe
3063
3096
  enabled?: boolean;
3064
3097
  data?: string[];
3065
3098
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
3099
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
3066
3100
  };
3067
3101
  previewMultiConversion?: boolean;
3068
3102
  persistFiltersAcrossTabs?: boolean;
@@ -3129,6 +3163,7 @@ export declare function withAppFeatures(): import("@ngrx/signals").SignalStoreFe
3129
3163
  enabled?: boolean;
3130
3164
  data?: string[];
3131
3165
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
3166
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
3132
3167
  };
3133
3168
  previewMultiConversion?: boolean;
3134
3169
  persistFiltersAcrossTabs?: boolean;
@@ -3273,7 +3308,7 @@ export declare const PrincipalStore: import("@angular/core").Type<{
3273
3308
  param9: import("@angular/core").Signal<string>;
3274
3309
  param10: import("@angular/core").Signal<string>;
3275
3310
  userOverrideActive: import("@angular/core").Signal<boolean>;
3276
- state: import("@angular/core").Signal<"error" | "loading" | "loaded" | "initial">;
3311
+ state: import("@angular/core").Signal<"error" | "initial" | "loading" | "loaded">;
3277
3312
  allowUserOverride: import("@angular/core").Signal<boolean>;
3278
3313
  isOverridingUser: import("@angular/core").Signal<boolean>;
3279
3314
  initials: import("@angular/core").Signal<string>;
@@ -3355,7 +3390,7 @@ export declare const QueryParamsStore: import("@angular/core").Type<{
3355
3390
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
3356
3391
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
3357
3392
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
3358
- aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
3393
+ aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
3359
3394
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
3360
3395
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
3361
3396
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -3500,7 +3535,7 @@ export type SelectionState = {
3500
3535
  * - `clear()`: Clears the selection state, setting `article`, `id`, and `queryText` to `undefined`.
3501
3536
  */
3502
3537
  export declare const SelectionStore: import("@angular/core").Type<{
3503
- article?: import("@ngrx/signals").DeepSignal<Article> | import("@angular/core").Signal<undefined> | undefined;
3538
+ article?: import("@angular/core").Signal<undefined> | import("@ngrx/signals").DeepSignal<Article> | undefined;
3504
3539
  id?: import("@angular/core").Signal<string | undefined> | undefined;
3505
3540
  queryText?: import("@angular/core").Signal<string | undefined> | undefined;
3506
3541
  queryName?: import("@angular/core").Signal<string | undefined> | undefined;
@@ -3671,14 +3706,15 @@ export declare const UserSettingsStore: import("@angular/core").Type<{
3671
3706
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
3672
3707
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
3673
3708
  language?: import("@angular/core").Signal<string | undefined> | 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>;
3709
+ userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
3710
+ agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
3676
3711
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
3677
3712
  isDebugMode: import("@angular/core").Signal<boolean>;
3678
3713
  isDarkMode: import("@angular/core").Signal<boolean>;
3679
3714
  updateBookmarks: (bookmarks: import("@sinequa/atomic-angular").UserSettingsState["bookmarks"], auditEvents?: import("@sinequa/atomic").AuditEvents) => Promise<void>;
3680
3715
  bookmark: (article: import("@sinequa/atomic").Article, queryName?: string) => Promise<void>;
3681
3716
  unbookmark: (id: string) => Promise<void>;
3717
+ unbookmarkMany: (ids: string[]) => Promise<void>;
3682
3718
  isBookmarked: (article: Partial<import("@sinequa/atomic").Article>) => boolean;
3683
3719
  toggleBookmark: (article: import("@sinequa/atomic").Article) => Promise<void>;
3684
3720
  isFavoriteSearch: (search: Pick<import("@sinequa/atomic-angular").SearchItem, "label" | "display">) => boolean;
@@ -3777,6 +3813,7 @@ export declare function withBookmarkFeatures(): import("@ngrx/signals").SignalSt
3777
3813
  updateBookmarks: (bookmarks: UserSettingsState["bookmarks"], auditEvents?: AuditEvents) => Promise<void>;
3778
3814
  bookmark: (article: Article, queryName?: string) => Promise<void>;
3779
3815
  unbookmark: (id: string) => Promise<void>;
3816
+ unbookmarkMany: (ids: string[]) => Promise<void>;
3780
3817
  isBookmarked: (article: Partial<Article>) => boolean;
3781
3818
  toggleBookmark: (article: Article) => Promise<void>;
3782
3819
  };
@@ -3895,6 +3932,12 @@ export declare class PreviewContentComponent {
3895
3932
  #private;
3896
3933
  cn: import("cn").CnFunction;
3897
3934
  iframe: import("@angular/core").Signal<ElementRef<HTMLIFrameElement> | undefined>;
3935
+ /**
3936
+ * The box that holds the rendered Markdown (there is no iframe, hence no `ready` message, in that branch). It is
3937
+ * not necessarily the element that scrolls: depending on the host layout it can be an ancestor, so scrolling
3938
+ * and scroll tracking never assume it.
3939
+ */
3940
+ private readonly markdownScroller;
3898
3941
  private readonly findPanelTemplate;
3899
3942
  breakpointService: BreakpointObserverService;
3900
3943
  protected readonly appStore: {
@@ -3947,6 +3990,7 @@ export declare class PreviewContentComponent {
3947
3990
  enabled?: boolean;
3948
3991
  data?: string[];
3949
3992
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
3993
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
3950
3994
  };
3951
3995
  previewMultiConversion?: boolean;
3952
3996
  persistFiltersAcrossTabs?: boolean;
@@ -3989,6 +4033,7 @@ export declare class PreviewContentComponent {
3989
4033
  enabled?: boolean;
3990
4034
  data?: string[];
3991
4035
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
4036
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
3992
4037
  };
3993
4038
  previewMultiConversion?: boolean;
3994
4039
  persistFiltersAcrossTabs?: boolean;
@@ -4053,6 +4098,7 @@ export declare class PreviewContentComponent {
4053
4098
  enabled?: boolean;
4054
4099
  data?: string[];
4055
4100
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
4101
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
4056
4102
  };
4057
4103
  previewMultiConversion?: boolean;
4058
4104
  persistFiltersAcrossTabs?: boolean;
@@ -4147,6 +4193,7 @@ export declare class PreviewContentComponent {
4147
4193
  enabled?: boolean;
4148
4194
  data?: string[];
4149
4195
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
4196
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
4150
4197
  };
4151
4198
  previewMultiConversion?: boolean;
4152
4199
  persistFiltersAcrossTabs?: boolean;
@@ -4189,6 +4236,7 @@ export declare class PreviewContentComponent {
4189
4236
  enabled?: boolean;
4190
4237
  data?: string[];
4191
4238
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
4239
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
4192
4240
  };
4193
4241
  previewMultiConversion?: boolean;
4194
4242
  persistFiltersAcrossTabs?: boolean;
@@ -4282,6 +4330,12 @@ export declare class PreviewContentComponent {
4282
4330
  /** `false` hides `<preview-actions>`'s search-in-document trigger/popover (e.g. a narrower host
4283
4331
  * with no room for it, like `/chat`'s ResizablePanel). Zoom/highlights stay unaffected. */
4284
4332
  showSearchActions: import("@angular/core").InputSignal<boolean>;
4333
+ /**
4334
+ * `false` hides the whole action bar above the document (search, converter, highlights, zoom, page navigation), for a
4335
+ * host that only wants to show the document — a shortlist's preview, a narrow side panel. The document itself, and the
4336
+ * page navigation the iframe content offers, are unaffected.
4337
+ */
4338
+ showActions: import("@angular/core").InputSignal<boolean>;
4285
4339
  /**
4286
4340
  * Where the results of the find field show: `"popover"` (the default) under the field, as it takes the focus;
4287
4341
  * `"pinned"` in a panel beside the document, for a preview that has room for it (the expanded one). The panel is
@@ -4401,6 +4455,15 @@ export declare class PreviewContentComponent {
4401
4455
  * reveal it anyway after a short delay so the spinner overlay cannot stay stuck.
4402
4456
  */
4403
4457
  onLoaded(): void;
4458
+ /** Scrolls so that the page anchor `anchorId` sits at the top edge of whichever ancestor scrolls the Markdown. */
4459
+ private scrollMarkdownTo;
4460
+ private markdownScrollFrame;
4461
+ /**
4462
+ * Keeps `currentPage` in sync with the page the reader is on in the Markdown branch (the iframe branch gets it
4463
+ * from preview.js's `current-page` message), so that switching to another conversion lands on the same page.
4464
+ * Throttled to one measure per frame.
4465
+ */
4466
+ private onMarkdownScroll;
4404
4467
  protected zoomInMarkdown(): void;
4405
4468
  protected zoomOutMarkdown(): void;
4406
4469
  protected zoomFitMarkdown(): void;
@@ -4450,6 +4513,11 @@ export declare class PreviewContentComponent {
4450
4513
  "required": false;
4451
4514
  "isSignal": true;
4452
4515
  };
4516
+ "showActions": {
4517
+ "alias": "showActions";
4518
+ "required": false;
4519
+ "isSignal": true;
4520
+ };
4453
4521
  "findPanel": {
4454
4522
  "alias": "findPanel";
4455
4523
  "required": false;
@@ -4656,13 +4724,6 @@ export declare function getCurrentQueryName(): string | undefined;
4656
4724
  * `gap-4` (CardContent) → `--spacing-md` (16px) · `shadow-sm` → `--shadow-2`, avec un liseré `--layer-page-edge`
4657
4725
  */
4658
4726
  export declare const FORM_SURFACE_CLASS = "flex w-full flex-col gap-(--spacing-md) rounded-(--radius-md) border border-solid border-(--layer-page-edge) bg-(--layer-page-layer) p-(--spacing-md) shadow-(--shadow-2)";
4659
- /**
4660
- * Same layout, no card: no background, no padding, no shadow.
4661
- *
4662
- * Used when the form is embedded in a container that already provides the surface — a dialog body,
4663
- * a settings panel — where the card would otherwise nest inside another card.
4664
- */
4665
- export declare const FORM_BARE_CLASS = "flex w-full flex-col gap-(--spacing-md)";
4666
4727
  /** Groupe « label + contrôle + message d'erreur » — ex-`<div class="grid gap-2">`. */
4667
4728
  export declare const FORM_FIELD_CLASS = "flex flex-col gap-(--spacing-2xs)";
4668
4729
  /**
@@ -4674,6 +4735,11 @@ export declare const FORM_FIELD_CLASS = "flex flex-col gap-(--spacing-2xs)";
4674
4735
  * reprend son rayon.
4675
4736
  */
4676
4737
  export declare const FORM_FOOTER_CLASS = "flex justify-end gap-(--spacing-2xs) -mx-(--spacing-md) -mb-(--spacing-md) rounded-b-(--radius-md) bg-(--layer-page-on-layer) px-(--spacing-md) py-(--spacing-sm)";
4738
+ /**
4739
+ * Rangée de boutons d'un formulaire affiché hors dialogue (inline, carte). Rien de plus qu'une ligne
4740
+ * alignée à droite : dans un dialogue, ce sont les boutons du `DialogFooter` standard qui s'en chargent.
4741
+ */
4742
+ export declare const FORM_ACTIONS_CLASS = "flex justify-end gap-(--spacing-2xs)";
4677
4743
  /**
4678
4744
  * Libellé d'un champ — ex-`text-sm font-medium`.
4679
4745
  *
@@ -4871,6 +4937,7 @@ export declare class AuditService {
4871
4937
  enabled?: boolean;
4872
4938
  data?: string[];
4873
4939
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
4940
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
4874
4941
  };
4875
4942
  previewMultiConversion?: boolean;
4876
4943
  persistFiltersAcrossTabs?: boolean;
@@ -4913,6 +4980,7 @@ export declare class AuditService {
4913
4980
  enabled?: boolean;
4914
4981
  data?: string[];
4915
4982
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
4983
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
4916
4984
  };
4917
4985
  previewMultiConversion?: boolean;
4918
4986
  persistFiltersAcrossTabs?: boolean;
@@ -4977,6 +5045,7 @@ export declare class AuditService {
4977
5045
  enabled?: boolean;
4978
5046
  data?: string[];
4979
5047
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
5048
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
4980
5049
  };
4981
5050
  previewMultiConversion?: boolean;
4982
5051
  persistFiltersAcrossTabs?: boolean;
@@ -5071,6 +5140,7 @@ export declare class AuditService {
5071
5140
  enabled?: boolean;
5072
5141
  data?: string[];
5073
5142
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
5143
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
5074
5144
  };
5075
5145
  previewMultiConversion?: boolean;
5076
5146
  persistFiltersAcrossTabs?: boolean;
@@ -5113,6 +5183,7 @@ export declare class AuditService {
5113
5183
  enabled?: boolean;
5114
5184
  data?: string[];
5115
5185
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
5186
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
5116
5187
  };
5117
5188
  previewMultiConversion?: boolean;
5118
5189
  persistFiltersAcrossTabs?: boolean;
@@ -5280,7 +5351,7 @@ export declare class PreviewService {
5280
5351
  extracts: Map<string, Extract[]>;
5281
5352
  }>;
5282
5353
  protected readonly selectionStore: {
5283
- article?: import("@ngrx/signals").DeepSignal<Article> | import("@angular/core").Signal<undefined> | undefined;
5354
+ article?: import("@angular/core").Signal<undefined> | import("@ngrx/signals").DeepSignal<Article> | undefined;
5284
5355
  id?: import("@angular/core").Signal<string | undefined> | undefined;
5285
5356
  queryText?: import("@angular/core").Signal<string | undefined> | undefined;
5286
5357
  queryName?: import("@angular/core").Signal<string | undefined> | undefined;
@@ -5329,7 +5400,7 @@ export declare class PreviewService {
5329
5400
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
5330
5401
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
5331
5402
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
5332
- aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
5403
+ aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
5333
5404
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
5334
5405
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
5335
5406
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -5462,6 +5533,7 @@ export declare class PreviewService {
5462
5533
  enabled?: boolean;
5463
5534
  data?: string[];
5464
5535
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
5536
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
5465
5537
  };
5466
5538
  previewMultiConversion?: boolean;
5467
5539
  persistFiltersAcrossTabs?: boolean;
@@ -5504,6 +5576,7 @@ export declare class PreviewService {
5504
5576
  enabled?: boolean;
5505
5577
  data?: string[];
5506
5578
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
5579
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
5507
5580
  };
5508
5581
  previewMultiConversion?: boolean;
5509
5582
  persistFiltersAcrossTabs?: boolean;
@@ -5568,6 +5641,7 @@ export declare class PreviewService {
5568
5641
  enabled?: boolean;
5569
5642
  data?: string[];
5570
5643
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
5644
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
5571
5645
  };
5572
5646
  previewMultiConversion?: boolean;
5573
5647
  persistFiltersAcrossTabs?: boolean;
@@ -5662,6 +5736,7 @@ export declare class PreviewService {
5662
5736
  enabled?: boolean;
5663
5737
  data?: string[];
5664
5738
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
5739
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
5665
5740
  };
5666
5741
  previewMultiConversion?: boolean;
5667
5742
  persistFiltersAcrossTabs?: boolean;
@@ -5704,6 +5779,7 @@ export declare class PreviewService {
5704
5779
  enabled?: boolean;
5705
5780
  data?: string[];
5706
5781
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
5782
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
5707
5783
  };
5708
5784
  previewMultiConversion?: boolean;
5709
5785
  persistFiltersAcrossTabs?: boolean;
@@ -6076,6 +6152,7 @@ export declare class AggregationsService {
6076
6152
  enabled?: boolean;
6077
6153
  data?: string[];
6078
6154
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
6155
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
6079
6156
  };
6080
6157
  previewMultiConversion?: boolean;
6081
6158
  persistFiltersAcrossTabs?: boolean;
@@ -6118,6 +6195,7 @@ export declare class AggregationsService {
6118
6195
  enabled?: boolean;
6119
6196
  data?: string[];
6120
6197
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
6198
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
6121
6199
  };
6122
6200
  previewMultiConversion?: boolean;
6123
6201
  persistFiltersAcrossTabs?: boolean;
@@ -6182,6 +6260,7 @@ export declare class AggregationsService {
6182
6260
  enabled?: boolean;
6183
6261
  data?: string[];
6184
6262
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
6263
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
6185
6264
  };
6186
6265
  previewMultiConversion?: boolean;
6187
6266
  persistFiltersAcrossTabs?: boolean;
@@ -6276,6 +6355,7 @@ export declare class AggregationsService {
6276
6355
  enabled?: boolean;
6277
6356
  data?: string[];
6278
6357
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
6358
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
6279
6359
  };
6280
6360
  previewMultiConversion?: boolean;
6281
6361
  persistFiltersAcrossTabs?: boolean;
@@ -6318,6 +6398,7 @@ export declare class AggregationsService {
6318
6398
  enabled?: boolean;
6319
6399
  data?: string[];
6320
6400
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
6401
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
6321
6402
  };
6322
6403
  previewMultiConversion?: boolean;
6323
6404
  persistFiltersAcrossTabs?: boolean;
@@ -6379,7 +6460,7 @@ export declare class AggregationsService {
6379
6460
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
6380
6461
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
6381
6462
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
6382
- aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
6463
+ aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
6383
6464
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
6384
6465
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
6385
6466
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -6627,14 +6708,15 @@ export declare class ApplicationService {
6627
6708
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
6628
6709
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
6629
6710
  language?: import("@angular/core").Signal<string | undefined> | 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>;
6711
+ userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
6712
+ agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
6632
6713
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
6633
6714
  isDebugMode: import("@angular/core").Signal<boolean>;
6634
6715
  isDarkMode: import("@angular/core").Signal<boolean>;
6635
6716
  updateBookmarks: (bookmarks: UserSettingsState["bookmarks"], auditEvents?: import("@sinequa/atomic").AuditEvents) => Promise<void>;
6636
6717
  bookmark: (article: import("@sinequa/atomic").Article, queryName?: string) => Promise<void>;
6637
6718
  unbookmark: (id: string) => Promise<void>;
6719
+ unbookmarkMany: (ids: string[]) => Promise<void>;
6638
6720
  isBookmarked: (article: Partial<import("@sinequa/atomic").Article>) => boolean;
6639
6721
  toggleBookmark: (article: import("@sinequa/atomic").Article) => Promise<void>;
6640
6722
  isFavoriteSearch: (search: Pick<import("@sinequa/atomic-angular").SearchItem, "label" | "display">) => boolean;
@@ -6714,7 +6796,7 @@ export declare class ApplicationService {
6714
6796
  param9: import("@angular/core").Signal<string>;
6715
6797
  param10: import("@angular/core").Signal<string>;
6716
6798
  userOverrideActive: import("@angular/core").Signal<boolean>;
6717
- state: import("@angular/core").Signal<"error" | "loading" | "loaded" | "initial">;
6799
+ state: import("@angular/core").Signal<"error" | "initial" | "loading" | "loaded">;
6718
6800
  allowUserOverride: import("@angular/core").Signal<boolean>;
6719
6801
  isOverridingUser: import("@angular/core").Signal<boolean>;
6720
6802
  initials: import("@angular/core").Signal<string>;
@@ -6801,6 +6883,7 @@ export declare class ApplicationService {
6801
6883
  enabled?: boolean;
6802
6884
  data?: string[];
6803
6885
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
6886
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
6804
6887
  };
6805
6888
  previewMultiConversion?: boolean;
6806
6889
  persistFiltersAcrossTabs?: boolean;
@@ -6843,6 +6926,7 @@ export declare class ApplicationService {
6843
6926
  enabled?: boolean;
6844
6927
  data?: string[];
6845
6928
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
6929
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
6846
6930
  };
6847
6931
  previewMultiConversion?: boolean;
6848
6932
  persistFiltersAcrossTabs?: boolean;
@@ -6907,6 +6991,7 @@ export declare class ApplicationService {
6907
6991
  enabled?: boolean;
6908
6992
  data?: string[];
6909
6993
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
6994
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
6910
6995
  };
6911
6996
  previewMultiConversion?: boolean;
6912
6997
  persistFiltersAcrossTabs?: boolean;
@@ -7001,6 +7086,7 @@ export declare class ApplicationService {
7001
7086
  enabled?: boolean;
7002
7087
  data?: string[];
7003
7088
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
7089
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
7004
7090
  };
7005
7091
  previewMultiConversion?: boolean;
7006
7092
  persistFiltersAcrossTabs?: boolean;
@@ -7043,6 +7129,7 @@ export declare class ApplicationService {
7043
7129
  enabled?: boolean;
7044
7130
  data?: string[];
7045
7131
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
7132
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
7046
7133
  };
7047
7134
  previewMultiConversion?: boolean;
7048
7135
  persistFiltersAcrossTabs?: boolean;
@@ -7095,7 +7182,7 @@ export declare class ApplicationService {
7095
7182
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
7096
7183
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
7097
7184
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
7098
- aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
7185
+ aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
7099
7186
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
7100
7187
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
7101
7188
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -7321,14 +7408,15 @@ export declare class AutocompleteService {
7321
7408
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
7322
7409
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
7323
7410
  language?: import("@angular/core").Signal<string | undefined> | 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>;
7411
+ userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
7412
+ agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
7326
7413
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
7327
7414
  isDebugMode: import("@angular/core").Signal<boolean>;
7328
7415
  isDarkMode: import("@angular/core").Signal<boolean>;
7329
7416
  updateBookmarks: (bookmarks: import("@sinequa/atomic-angular").UserSettingsState["bookmarks"], auditEvents?: import("@sinequa/atomic").AuditEvents) => Promise<void>;
7330
7417
  bookmark: (article: import("@sinequa/atomic").Article, queryName?: string) => Promise<void>;
7331
7418
  unbookmark: (id: string) => Promise<void>;
7419
+ unbookmarkMany: (ids: string[]) => Promise<void>;
7332
7420
  isBookmarked: (article: Partial<import("@sinequa/atomic").Article>) => boolean;
7333
7421
  toggleBookmark: (article: import("@sinequa/atomic").Article) => Promise<void>;
7334
7422
  isFavoriteSearch: (search: Pick<import("@sinequa/atomic-angular").SearchItem, "label" | "display">) => boolean;
@@ -7431,6 +7519,7 @@ export declare class AutocompleteService {
7431
7519
  enabled?: boolean;
7432
7520
  data?: string[];
7433
7521
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
7522
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
7434
7523
  };
7435
7524
  previewMultiConversion?: boolean;
7436
7525
  persistFiltersAcrossTabs?: boolean;
@@ -7473,6 +7562,7 @@ export declare class AutocompleteService {
7473
7562
  enabled?: boolean;
7474
7563
  data?: string[];
7475
7564
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
7565
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
7476
7566
  };
7477
7567
  previewMultiConversion?: boolean;
7478
7568
  persistFiltersAcrossTabs?: boolean;
@@ -7537,6 +7627,7 @@ export declare class AutocompleteService {
7537
7627
  enabled?: boolean;
7538
7628
  data?: string[];
7539
7629
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
7630
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
7540
7631
  };
7541
7632
  previewMultiConversion?: boolean;
7542
7633
  persistFiltersAcrossTabs?: boolean;
@@ -7631,6 +7722,7 @@ export declare class AutocompleteService {
7631
7722
  enabled?: boolean;
7632
7723
  data?: string[];
7633
7724
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
7725
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
7634
7726
  };
7635
7727
  previewMultiConversion?: boolean;
7636
7728
  persistFiltersAcrossTabs?: boolean;
@@ -7673,6 +7765,7 @@ export declare class AutocompleteService {
7673
7765
  enabled?: boolean;
7674
7766
  data?: string[];
7675
7767
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
7768
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
7676
7769
  };
7677
7770
  previewMultiConversion?: boolean;
7678
7771
  persistFiltersAcrossTabs?: boolean;
@@ -7864,6 +7957,43 @@ export declare class KeyboardShortcutsService {
7864
7957
  static ɵfac: i0.ɵɵFactoryDeclaration<KeyboardShortcutsService, never>;
7865
7958
  static ɵprov: i0.ɵɵInjectableDeclaration<any>;
7866
7959
  }
7960
+ /**
7961
+ * The license-driven capabilities of the grid, as reported by `GET /api/v2/version`.
7962
+ *
7963
+ * Only the capabilities in `features.isAvailable` are read — neither the raw `license.featureFlags`
7964
+ * nor `features.beta`: the server already combines the flags with the Beta option, and says so in one
7965
+ * place. A capability is `true` only when the server says exactly `true`.
7966
+ *
7967
+ * The Agent Builder has no capability of its own: it relies on `agentStore`, which is `true` when the
7968
+ * license grants `FeatureFlag_AgentHub` or `FeatureFlag_AgentBuilder` and the Beta option is on.
7969
+ *
7970
+ * Every failure reads as "not available" — an older server without `features.isAvailable`, a missing
7971
+ * field, a failing request — so that what depends on a capability is hidden instead of the application
7972
+ * being blocked.
7973
+ *
7974
+ * Call {@link load} once the application is bootstrapped (the request needs the `backendUrl` and the
7975
+ * sign-in), typically from the same application initializer as `bootstrapApp`. Until then every
7976
+ * capability is `false`.
7977
+ */
7978
+ export declare class LicenseCapabilitiesService {
7979
+ private readonly client;
7980
+ private readonly _agentStoreAvailable;
7981
+ /**
7982
+ * Whether the Agent store is available (`features.isAvailable.agentStore === true`): the license
7983
+ * grants `FeatureFlag_AgentHub` or `FeatureFlag_AgentBuilder` and the Beta option is on.
7984
+ * Use it to show or hide the Agent Builder.
7985
+ */
7986
+ readonly agentStoreAvailable: import("@angular/core").Signal<boolean>;
7987
+ /**
7988
+ * Reads the capabilities from `GET /api/v2/version`.
7989
+ *
7990
+ * Never rejects: it is meant to run inside an application initializer, where a rejection would stop
7991
+ * the application from starting. On failure the capabilities are reset to `false`.
7992
+ */
7993
+ load(): Promise<void>;
7994
+ static ɵfac: i0.ɵɵFactoryDeclaration<LicenseCapabilitiesService, never>;
7995
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
7996
+ }
7867
7997
  export declare class NavigationService {
7868
7998
  private readonly router;
7869
7999
  private readonly auditService;
@@ -7965,14 +8095,15 @@ export declare class SavedSearchesService {
7965
8095
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
7966
8096
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
7967
8097
  language?: import("@angular/core").Signal<string | undefined> | 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>;
8098
+ userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
8099
+ agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
7970
8100
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
7971
8101
  isDebugMode: import("@angular/core").Signal<boolean>;
7972
8102
  isDarkMode: import("@angular/core").Signal<boolean>;
7973
8103
  updateBookmarks: (bookmarks: import("@sinequa/atomic-angular").UserSettingsState["bookmarks"], auditEvents?: import("@sinequa/atomic").AuditEvents) => Promise<void>;
7974
8104
  bookmark: (article: import("@sinequa/atomic").Article, queryName?: string) => Promise<void>;
7975
8105
  unbookmark: (id: string) => Promise<void>;
8106
+ unbookmarkMany: (ids: string[]) => Promise<void>;
7976
8107
  isBookmarked: (article: Partial<import("@sinequa/atomic").Article>) => boolean;
7977
8108
  toggleBookmark: (article: import("@sinequa/atomic").Article) => Promise<void>;
7978
8109
  isFavoriteSearch: (search: Pick<SearchItem, "label" | "display">) => boolean;
@@ -8052,7 +8183,7 @@ export declare class SavedSearchesService {
8052
8183
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
8053
8184
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
8054
8185
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
8055
- aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
8186
+ aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
8056
8187
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
8057
8188
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
8058
8189
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -8237,7 +8368,7 @@ export declare class SearchService {
8237
8368
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
8238
8369
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
8239
8370
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
8240
- aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
8371
+ aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
8241
8372
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
8242
8373
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
8243
8374
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -8331,14 +8462,15 @@ export declare class SearchService {
8331
8462
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
8332
8463
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
8333
8464
  language?: import("@angular/core").Signal<string | undefined> | 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>;
8465
+ userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
8466
+ agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
8336
8467
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
8337
8468
  isDebugMode: import("@angular/core").Signal<boolean>;
8338
8469
  isDarkMode: import("@angular/core").Signal<boolean>;
8339
8470
  updateBookmarks: (bookmarks: import("@sinequa/atomic-angular").UserSettingsState["bookmarks"], auditEvents?: AuditEvents) => Promise<void>;
8340
8471
  bookmark: (article: import("@sinequa/atomic").Article, queryName?: string) => Promise<void>;
8341
8472
  unbookmark: (id: string) => Promise<void>;
8473
+ unbookmarkMany: (ids: string[]) => Promise<void>;
8342
8474
  isBookmarked: (article: Partial<import("@sinequa/atomic").Article>) => boolean;
8343
8475
  toggleBookmark: (article: import("@sinequa/atomic").Article) => Promise<void>;
8344
8476
  isFavoriteSearch: (search: Pick<import("@sinequa/atomic-angular").SearchItem, "label" | "display">) => boolean;
@@ -8466,7 +8598,7 @@ export declare class SelectionService {
8466
8598
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
8467
8599
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
8468
8600
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
8469
- aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
8601
+ aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
8470
8602
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
8471
8603
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
8472
8604
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -8611,6 +8743,8 @@ export declare class TextChunkService {
8611
8743
  export declare class UserProfileService {
8612
8744
  private readonly client;
8613
8745
  private readonly injector;
8746
+ private readonly appStore;
8747
+ private readonly principal;
8614
8748
  private readonly resources;
8615
8749
  /**
8616
8750
  * Retrieves the user profile by user ID.
@@ -8624,6 +8758,24 @@ export declare class UserProfileService {
8624
8758
  * @returns A resource exposing the UserProfile.
8625
8759
  */
8626
8760
  getUserProfile(userId: Signal<string | undefined>): ResourceRef<UserProfile | undefined>;
8761
+ /**
8762
+ * The id of the signed-in user, once known, and only when the `userProfile` feature is on; `undefined` otherwise,
8763
+ * which leaves the profile resource idle (no request).
8764
+ */
8765
+ readonly currentUserId: Signal<string | undefined>;
8766
+ /**
8767
+ * The profile of the signed-in user, fetched once for the whole application: the sidebar (avatar), the home page
8768
+ * (greeting) and the profile form all read this same resource, so a value set by one shows up in the others.
8769
+ */
8770
+ readonly current: ResourceRef<UserProfile | undefined>;
8771
+ /** The loaded profile of the signed-in user, `undefined` while it loads, when it failed to load, or when the feature is off. */
8772
+ readonly profile: Signal<UserProfile | undefined>;
8773
+ /**
8774
+ * The profile of the signed-in user is about to be, or is being, fetched. `idle` with an id to fetch is the instant
8775
+ * between the id being known and the resource starting: still pending. A failed fetch is not pending: it gives way
8776
+ * to the next source of a name.
8777
+ */
8778
+ readonly pending: Signal<boolean>;
8627
8779
  static ɵfac: i0.ɵɵFactoryDeclaration<UserProfileService, never>;
8628
8780
  static ɵprov: i0.ɵɵInjectableDeclaration<any>;
8629
8781
  }
@@ -8758,6 +8910,7 @@ export declare class SortSelectorComponent {
8758
8910
  enabled?: boolean;
8759
8911
  data?: string[];
8760
8912
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
8913
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
8761
8914
  };
8762
8915
  previewMultiConversion?: boolean;
8763
8916
  persistFiltersAcrossTabs?: boolean;
@@ -8800,6 +8953,7 @@ export declare class SortSelectorComponent {
8800
8953
  enabled?: boolean;
8801
8954
  data?: string[];
8802
8955
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
8956
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
8803
8957
  };
8804
8958
  previewMultiConversion?: boolean;
8805
8959
  persistFiltersAcrossTabs?: boolean;
@@ -8864,6 +9018,7 @@ export declare class SortSelectorComponent {
8864
9018
  enabled?: boolean;
8865
9019
  data?: string[];
8866
9020
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
9021
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
8867
9022
  };
8868
9023
  previewMultiConversion?: boolean;
8869
9024
  persistFiltersAcrossTabs?: boolean;
@@ -8958,6 +9113,7 @@ export declare class SortSelectorComponent {
8958
9113
  enabled?: boolean;
8959
9114
  data?: string[];
8960
9115
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
9116
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
8961
9117
  };
8962
9118
  previewMultiConversion?: boolean;
8963
9119
  persistFiltersAcrossTabs?: boolean;
@@ -9000,6 +9156,7 @@ export declare class SortSelectorComponent {
9000
9156
  enabled?: boolean;
9001
9157
  data?: string[];
9002
9158
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
9159
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
9003
9160
  };
9004
9161
  previewMultiConversion?: boolean;
9005
9162
  persistFiltersAcrossTabs?: boolean;
@@ -9211,14 +9368,15 @@ export declare class ShowBookmarkDirective {
9211
9368
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
9212
9369
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
9213
9370
  language?: import("@angular/core").Signal<string | undefined> | 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>;
9371
+ userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
9372
+ agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
9216
9373
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
9217
9374
  isDebugMode: import("@angular/core").Signal<boolean>;
9218
9375
  isDarkMode: import("@angular/core").Signal<boolean>;
9219
9376
  updateBookmarks: (bookmarks: import("@sinequa/atomic-angular").UserSettingsState["bookmarks"], auditEvents?: import("@sinequa/atomic").AuditEvents) => Promise<void>;
9220
9377
  bookmark: (article: Article, queryName?: string) => Promise<void>;
9221
9378
  unbookmark: (id: string) => Promise<void>;
9379
+ unbookmarkMany: (ids: string[]) => Promise<void>;
9222
9380
  isBookmarked: (article: Partial<Article>) => boolean;
9223
9381
  toggleBookmark: (article: Article) => Promise<void>;
9224
9382
  isFavoriteSearch: (search: Pick<import("@sinequa/atomic-angular").SearchItem, "label" | "display">) => boolean;
@@ -9720,6 +9878,7 @@ export declare class SponsoredResultsComponent {
9720
9878
  enabled?: boolean;
9721
9879
  data?: string[];
9722
9880
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
9881
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
9723
9882
  };
9724
9883
  previewMultiConversion?: boolean;
9725
9884
  persistFiltersAcrossTabs?: boolean;
@@ -9762,6 +9921,7 @@ export declare class SponsoredResultsComponent {
9762
9921
  enabled?: boolean;
9763
9922
  data?: string[];
9764
9923
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
9924
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
9765
9925
  };
9766
9926
  previewMultiConversion?: boolean;
9767
9927
  persistFiltersAcrossTabs?: boolean;
@@ -9826,6 +9986,7 @@ export declare class SponsoredResultsComponent {
9826
9986
  enabled?: boolean;
9827
9987
  data?: string[];
9828
9988
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
9989
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
9829
9990
  };
9830
9991
  previewMultiConversion?: boolean;
9831
9992
  persistFiltersAcrossTabs?: boolean;
@@ -9920,6 +10081,7 @@ export declare class SponsoredResultsComponent {
9920
10081
  enabled?: boolean;
9921
10082
  data?: string[];
9922
10083
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
10084
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
9923
10085
  };
9924
10086
  previewMultiConversion?: boolean;
9925
10087
  persistFiltersAcrossTabs?: boolean;
@@ -9962,6 +10124,7 @@ export declare class SponsoredResultsComponent {
9962
10124
  enabled?: boolean;
9963
10125
  data?: string[];
9964
10126
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
10127
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
9965
10128
  };
9966
10129
  previewMultiConversion?: boolean;
9967
10130
  persistFiltersAcrossTabs?: boolean;
@@ -10014,7 +10177,7 @@ export declare class SponsoredResultsComponent {
10014
10177
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
10015
10178
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
10016
10179
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
10017
- aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
10180
+ aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
10018
10181
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
10019
10182
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
10020
10183
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -11053,7 +11216,7 @@ export declare class AdvancedSearch {
11053
11216
  readonly similarDocuments: import("@angular/core").InputSignal<Article[] | undefined>;
11054
11217
  readonly selected: import("@angular/core").OutputEmitterRef<Article>;
11055
11218
  protected readonly selectionStore: {
11056
- article?: import("@ngrx/signals").DeepSignal<Article> | import("@angular/core").Signal<undefined> | undefined;
11219
+ article?: import("@angular/core").Signal<undefined> | import("@ngrx/signals").DeepSignal<Article> | undefined;
11057
11220
  id?: import("@angular/core").Signal<string | undefined> | undefined;
11058
11221
  queryText?: import("@angular/core").Signal<string | undefined> | undefined;
11059
11222
  queryName?: import("@angular/core").Signal<string | undefined> | undefined;
@@ -11102,7 +11265,7 @@ export declare class AdvancedSearch {
11102
11265
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
11103
11266
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
11104
11267
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
11105
- aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
11268
+ aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
11106
11269
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
11107
11270
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
11108
11271
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -11272,7 +11435,7 @@ export declare class AdvancedSearchTabs {
11272
11435
  readonly similarDocuments: import("@angular/core").InputSignal<Article[] | undefined>;
11273
11436
  readonly selected: import("@angular/core").OutputEmitterRef<Article>;
11274
11437
  protected readonly selectionStore: {
11275
- article?: import("@ngrx/signals").DeepSignal<Article> | import("@angular/core").Signal<undefined> | undefined;
11438
+ article?: import("@angular/core").Signal<undefined> | import("@ngrx/signals").DeepSignal<Article> | undefined;
11276
11439
  id?: import("@angular/core").Signal<string | undefined> | undefined;
11277
11440
  queryText?: import("@angular/core").Signal<string | undefined> | undefined;
11278
11441
  queryName?: import("@angular/core").Signal<string | undefined> | undefined;
@@ -12145,25 +12308,75 @@ export declare class AuthPageComponent {
12145
12308
  };
12146
12309
  }, {}, never, never, true, never>;
12147
12310
  }
12311
+ /**
12312
+ * The change-password form dressed as an auth page block: the product logo above the form, inside a card.
12313
+ *
12314
+ * It only adds the dressing — every behaviour lives in {@link ChangePasswordFormComponent}, which is
12315
+ * what to use anywhere the logo has no place (a settings panel, a dialog body).
12316
+ */
12317
+ export declare class ChangePasswordComponent {
12318
+ readonly success: import("@angular/core").OutputEmitterRef<void>;
12319
+ readonly cancel: import("@angular/core").OutputEmitterRef<void>;
12320
+ readonly username: import("@angular/core").InputSignal<string | null>;
12321
+ readonly alert: import("@angular/core").InputSignal<string | undefined>;
12322
+ readonly redirectAfterSuccess: import("@angular/core").InputSignal<boolean>;
12323
+ readonly redirectAfterCancel: import("@angular/core").InputSignal<boolean>;
12324
+ protected readonly surfaceClass = "flex w-full flex-col gap-(--spacing-md) rounded-(--radius-md) border border-solid border-(--layer-page-edge) bg-(--layer-page-layer) p-(--spacing-md) shadow-(--shadow-2)";
12325
+ static ɵfac: i0.ɵɵFactoryDeclaration<ChangePasswordComponent, never>;
12326
+ static ɵcmp: i0.ɵɵComponentDeclaration<ChangePasswordComponent, "change-password, ChangePassword, changepassword", never, {
12327
+ "username": {
12328
+ "alias": "username";
12329
+ "required": false;
12330
+ "isSignal": true;
12331
+ };
12332
+ "alert": {
12333
+ "alias": "alert";
12334
+ "required": false;
12335
+ "isSignal": true;
12336
+ };
12337
+ "redirectAfterSuccess": {
12338
+ "alias": "redirectAfterSuccess";
12339
+ "required": false;
12340
+ "isSignal": true;
12341
+ };
12342
+ "redirectAfterCancel": {
12343
+ "alias": "redirectAfterCancel";
12344
+ "required": false;
12345
+ "isSignal": true;
12346
+ };
12347
+ }, {
12348
+ "success": "success";
12349
+ "cancel": "cancel";
12350
+ }, never, never, true, never>;
12351
+ }
12148
12352
  /** Model of the change-password form. */
12149
12353
  export interface PasswordChange {
12150
12354
  currentPassword: string;
12151
12355
  newPassword: string;
12152
12356
  confirmPassword: string;
12153
12357
  }
12154
- type PasswordFieldType = "password" | "text";
12155
- export declare class ChangePasswordComponent {
12358
+ /**
12359
+ * The change-password form, and nothing else: no logo, no card, no surface of its own.
12360
+ *
12361
+ * It lays out like any block of content, so it can be dropped anywhere — inline in a settings panel,
12362
+ * in the body of a dialog, or inside the card of an auth page (`<change-password>`).
12363
+ *
12364
+ * Buttons: by default the form renders its own Cancel / Confirm row. A container that already owns
12365
+ * the buttons (a dialog's footer) sets `[showActions]="false"` and drives the form through
12366
+ * {@link changePassword}, {@link canSubmit} and {@link pending}.
12367
+ */
12368
+ export declare class ChangePasswordFormComponent {
12156
12369
  readonly success: import("@angular/core").OutputEmitterRef<void>;
12157
12370
  readonly cancel: import("@angular/core").OutputEmitterRef<void>;
12158
- username: import("@angular/core").InputSignal<string | null>;
12159
- alert: import("@angular/core").InputSignal<string | undefined>;
12160
- redirectAfterSuccess: import("@angular/core").InputSignal<boolean>;
12161
- redirectAfterCancel: import("@angular/core").InputSignal<boolean>;
12371
+ readonly username: import("@angular/core").InputSignal<string | null>;
12372
+ readonly alert: import("@angular/core").InputSignal<string | undefined>;
12373
+ readonly redirectAfterSuccess: import("@angular/core").InputSignal<boolean>;
12374
+ readonly redirectAfterCancel: import("@angular/core").InputSignal<boolean>;
12162
12375
  /**
12163
- * Renders the form as a card (background, padding, shadow). Set `false` when the container
12164
- * already provides the surface — a dialog body, a settings panel — to avoid nesting cards.
12376
+ * Renders the Cancel / Confirm row. Set `false` when the container owns the buttons — a dialog
12377
+ * footer — and drive the form through `changePassword()` / `canSubmit()`.
12165
12378
  */
12166
- surface: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
12379
+ readonly showActions: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
12167
12380
  private readonly client;
12168
12381
  private readonly transloco;
12169
12382
  private readonly router;
@@ -12171,41 +12384,57 @@ export declare class ChangePasswordComponent {
12171
12384
  private readonly applicationService;
12172
12385
  private readonly location;
12173
12386
  private readonly auditService;
12174
- protected readonly containerClass: import("@angular/core").Signal<"flex w-full flex-col gap-(--spacing-md) rounded-(--radius-md) border border-solid border-(--layer-page-edge) bg-(--layer-page-layer) p-(--spacing-md) shadow-(--shadow-2)" | "flex w-full flex-col gap-(--spacing-md)">;
12175
- protected readonly footerClass = "flex justify-end gap-(--spacing-2xs) -mx-(--spacing-md) -mb-(--spacing-md) rounded-b-(--radius-md) bg-(--layer-page-on-layer) px-(--spacing-md) py-(--spacing-sm)";
12176
- protected readonly fieldClass = "flex flex-col gap-(--spacing-2xs)";
12177
- protected readonly labelClass = "text-(length:--size-base) font-(--weight-semibold) text-(--font-primary-base)";
12178
- protected readonly errorClass = "text-(length:--size-base) text-(--font-error-base)";
12179
- protected readonly alertClass = "rounded-(--radius-sm) bg-(--bg-error-lightest) p-(--spacing-xs) text-(length:--size-base) text-(--font-error-base)";
12180
- /** Form model. Replaces the three former scalar models. */
12181
- readonly passwords: import("@angular/core").ModelSignal<PasswordChange>;
12182
- /** `protected` and not `private`: a subclass template must be able to bind its own controls. */
12387
+ protected readonly css: {
12388
+ form: string;
12389
+ field: string;
12390
+ label: string;
12391
+ error: string;
12392
+ alert: string;
12393
+ actions: string;
12394
+ };
12395
+ protected readonly fields: readonly [{
12396
+ readonly name: "currentPassword";
12397
+ readonly id: "change-current-password";
12398
+ readonly label: "login.currentPassword";
12399
+ readonly autocomplete: "current-password";
12400
+ }, {
12401
+ readonly name: "newPassword";
12402
+ readonly id: "change-new-password";
12403
+ readonly label: "login.newPassword";
12404
+ readonly autocomplete: "new-password";
12405
+ }, {
12406
+ readonly name: "confirmPassword";
12407
+ readonly id: "change-confirm-password";
12408
+ readonly label: "login.confirmPassword";
12409
+ readonly autocomplete: "new-password";
12410
+ }];
12411
+ protected readonly showError: typeof fieldShowsError;
12412
+ protected readonly errorKey: (field: FieldTree<string>) => string;
12413
+ readonly passwords: import("@angular/core").WritableSignal<PasswordChange>;
12183
12414
  protected readonly passwordForm: FieldTree<PasswordChange, string | number, "writable">;
12184
- pending: WritableSignal<boolean>;
12185
- errorMsg: WritableSignal<string | null>;
12186
- readonly currentPasswordType: WritableSignal<PasswordFieldType>;
12187
- readonly newPasswordType: WritableSignal<PasswordFieldType>;
12188
- readonly confirmPasswordType: WritableSignal<PasswordFieldType>;
12189
- valid: import("@angular/core").Signal<boolean>;
12190
- confirmInvalid: import("@angular/core").Signal<boolean>;
12415
+ readonly pending: import("@angular/core").WritableSignal<boolean>;
12416
+ readonly errorMsg: import("@angular/core").WritableSignal<string | null>;
12417
+ /** The server rejects a password change made while acting as another user (HTTP 400). */
12418
+ protected readonly overridingUser: import("@angular/core").Signal<boolean>;
12419
+ /** Whether a submission would run: valid form, nothing in flight, not impersonating. */
12420
+ readonly canSubmit: import("@angular/core").Signal<boolean>;
12421
+ /** Names of the fields currently shown in clear text. */
12422
+ private readonly revealed;
12191
12423
  readonly effectiveUsername: import("@angular/core").Signal<string | null>;
12192
- protected togglePasswordType(field: WritableSignal<PasswordFieldType>): void;
12193
- /** A field shows its error only once the user has left it — never while typing the first time. */
12194
- protected showError<T>(field: FieldTree<T>): boolean;
12195
- /** Maps the first validation error to its translation key (`login.errors.passwordMismatch`, …). */
12196
- protected errorKey<T>(field: FieldTree<T>): string;
12424
+ constructor();
12425
+ protected isRevealed(name: keyof PasswordChange): boolean;
12426
+ protected toggleReveal(name: keyof PasswordChange): void;
12197
12427
  private clearLocalAuthState;
12198
12428
  /**
12199
12429
  * Submits the form. `submit()` marks every field as touched — revealing the validation
12200
- * messages — and only runs the action when the form is valid, replacing the former
12201
- * `if (!this.valid()) return;` guard.
12430
+ * messages — and only runs the action when the form is valid.
12202
12431
  */
12203
12432
  changePassword(): Promise<boolean>;
12204
12433
  /** The submission itself. Only ever reached with a valid form. */
12205
12434
  private performChange;
12206
12435
  onCancel(): void;
12207
- static ɵfac: i0.ɵɵFactoryDeclaration<ChangePasswordComponent, never>;
12208
- static ɵcmp: i0.ɵɵComponentDeclaration<ChangePasswordComponent, "change-password, ChangePassword, changepassword", never, {
12436
+ static ɵfac: i0.ɵɵFactoryDeclaration<ChangePasswordFormComponent, never>;
12437
+ static ɵcmp: i0.ɵɵComponentDeclaration<ChangePasswordFormComponent, "change-password-form, ChangePasswordForm, changepasswordform", never, {
12209
12438
  "username": {
12210
12439
  "alias": "username";
12211
12440
  "required": false;
@@ -12226,25 +12455,22 @@ export declare class ChangePasswordComponent {
12226
12455
  "required": false;
12227
12456
  "isSignal": true;
12228
12457
  };
12229
- "surface": {
12230
- "alias": "surface";
12231
- "required": false;
12232
- "isSignal": true;
12233
- };
12234
- "passwords": {
12235
- "alias": "passwords";
12458
+ "showActions": {
12459
+ "alias": "showActions";
12236
12460
  "required": false;
12237
12461
  "isSignal": true;
12238
12462
  };
12239
12463
  }, {
12240
12464
  "success": "success";
12241
12465
  "cancel": "cancel";
12242
- "passwords": "passwordsChange";
12243
12466
  }, never, never, true, never>;
12244
12467
  }
12245
12468
  /**
12246
- * Represents the LoginComponent class, which is responsible for handling the login functionality.
12247
- * This component is used to authenticate users and manage the user's authentication status.
12469
+ * The sign-in screen: the credentials form (`<sign-in-form>`) dressed as an auth page block — logo and
12470
+ * card — plus everything around the form: the SSO / OAuth / SAML / bearer handshake, the loader shown
12471
+ * while it runs, and the password-expiry notice.
12472
+ *
12473
+ * Use `<sign-in-form>` directly anywhere the logo, the card and the handshake have no place.
12248
12474
  */
12249
12475
  export declare class SignInComponent implements OnInit {
12250
12476
  cn: import("cn").CnFunction;
@@ -12252,6 +12478,7 @@ export declare class SignInComponent implements OnInit {
12252
12478
  config: Readonly<Partial<{
12253
12479
  app: string;
12254
12480
  backendUrl: string;
12481
+ apiPrefix: string;
12255
12482
  autoOAuthProvider: string;
12256
12483
  autoSAMLProvider: string;
12257
12484
  bearerToken: string;
@@ -12271,10 +12498,9 @@ export declare class SignInComponent implements OnInit {
12271
12498
  loginPath: string;
12272
12499
  createRoutes: boolean;
12273
12500
  }> & Record<string, unknown>>;
12274
- protected readonly containerClass: import("@angular/core").Signal<"flex w-full flex-col gap-(--spacing-md) rounded-(--radius-md) border border-solid border-(--layer-page-edge) bg-(--layer-page-layer) p-(--spacing-md) shadow-(--shadow-2)" | "flex w-full flex-col gap-(--spacing-md)">;
12275
- protected readonly fieldClass = "flex flex-col gap-(--spacing-2xs)";
12276
- protected readonly labelClass = "text-(length:--size-base) font-(--weight-semibold) text-(--font-primary-base)";
12277
- protected readonly errorClass = "text-(length:--size-base) text-(--font-error-base)";
12501
+ protected readonly surfaceClass = "flex w-full flex-col gap-(--spacing-md) rounded-(--radius-md) border border-solid border-(--layer-page-edge) bg-(--layer-page-layer) p-(--spacing-md) shadow-(--shadow-2)";
12502
+ /** The credentials form, once rendered: its username feeds the password-expiry notice. */
12503
+ private readonly signInForm;
12278
12504
  /**
12279
12505
  * True when authentication is handled outside the credentials form — the browser or a proxy
12280
12506
  * (`sso`), an auto-configured OAuth/SAML provider, or a configured token (`bearer`). In those modes
@@ -12291,11 +12517,6 @@ export declare class SignInComponent implements OnInit {
12291
12517
  * step, a wizard — where `h-dvh` would blow the container out.
12292
12518
  */
12293
12519
  fullscreen: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
12294
- /**
12295
- * Renders the form as a card (background, padding, shadow). Set `false` when the container
12296
- * already provides the surface — a dialog body, a settings panel — to avoid nesting cards.
12297
- */
12298
- surface: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
12299
12520
  /**
12300
12521
  * Navigate to the `returnUrl` once authenticated. Opt-out when the host owns what comes next
12301
12522
  * (same contract as `ChangePasswordComponent`): the component then only emits `success`.
@@ -12311,17 +12532,6 @@ export declare class SignInComponent implements OnInit {
12311
12532
  readonly changePassword: import("@angular/core").OutputEmitterRef<string>;
12312
12533
  /** Emitted once authenticated and the application is initialized — before any navigation. */
12313
12534
  readonly success: import("@angular/core").OutputEmitterRef<void>;
12314
- /**
12315
- * Form model. Keeps the exact shape of the `credentials` computed it replaces, so reading
12316
- * `credentials()` is unchanged for consumers — only `.set()` is new.
12317
- */
12318
- readonly credentials: import("@angular/core").ModelSignal<Credentials>;
12319
- /**
12320
- * The sign-in form itself. `protected` and not `private`: extending this component is documented
12321
- * publicly, and a subclass template must be able to bind `[formField]="signInForm.username"`.
12322
- */
12323
- protected readonly signInForm: FieldTree<Credentials, string | number, "writable">;
12324
- isValid: import("@angular/core").Signal<boolean>;
12325
12535
  private readonly router;
12326
12536
  private readonly route;
12327
12537
  private readonly applicationService;
@@ -12367,10 +12577,6 @@ export declare class SignInComponent implements OnInit {
12367
12577
  * instead of routing to /error.
12368
12578
  */
12369
12579
  readonly showCredentialsFallback: import("@angular/core").WritableSignal<boolean>;
12370
- /** A field shows its error only once the user has left it — never while typing the first time. */
12371
- protected showError<T>(field: FieldTree<T>): boolean;
12372
- /** Maps the first validation error to its translation key (`login.errors.required`, …). */
12373
- protected errorKey<T>(field: FieldTree<T>): string;
12374
12580
  private readonly destroyRef;
12375
12581
  constructor();
12376
12582
  /**
@@ -12406,14 +12612,8 @@ export declare class SignInComponent implements OnInit {
12406
12612
  private checkPasswordExpiresSoon;
12407
12613
  handleLogout(): Promise<void>;
12408
12614
  handleLogin(): Promise<boolean>;
12409
- /**
12410
- * Submits the credentials form. `submit()` marks every field as touched — which reveals the
12411
- * validation messages — and only runs the action when the form is valid, replacing the former
12412
- * `if (!this.isValid()) return;` guard.
12413
- */
12414
- handleLoginWithCredentials(): Promise<boolean>;
12415
- /** The submission itself. Only ever reached with a valid form (see `handleLoginWithCredentials`). */
12416
- private performLogin;
12615
+ /** The form authenticated and initialized the app — before any navigation. */
12616
+ protected onSuccess(): void;
12417
12617
  handleBack(): void;
12418
12618
  static ɵfac: i0.ɵɵFactoryDeclaration<SignInComponent, never>;
12419
12619
  static ɵcmp: i0.ɵɵComponentDeclaration<SignInComponent, "signIn, signin, sign-in", never, {
@@ -12427,18 +12627,84 @@ export declare class SignInComponent implements OnInit {
12427
12627
  "required": false;
12428
12628
  "isSignal": true;
12429
12629
  };
12430
- "surface": {
12431
- "alias": "surface";
12630
+ "redirectAfterSuccess": {
12631
+ "alias": "redirectAfterSuccess";
12632
+ "required": false;
12633
+ "isSignal": true;
12634
+ };
12635
+ "autoStart": {
12636
+ "alias": "autoStart";
12432
12637
  "required": false;
12433
12638
  "isSignal": true;
12434
12639
  };
12640
+ }, {
12641
+ "forgotPassword": "forgotPassword";
12642
+ "changePassword": "changePassword";
12643
+ "success": "success";
12644
+ }, never, never, true, never>;
12645
+ }
12646
+ /**
12647
+ * The credentials form, and nothing else: no logo, no card, no loader, no external handshake.
12648
+ *
12649
+ * It lays out like any block of content, so it can be dropped anywhere — inline in a page, in the
12650
+ * body of a dialog, or inside the card of an auth page (`<sign-in>`, which also drives the SSO / OAuth /
12651
+ * SAML handshake). A container that owns the submit button sets `[showActions]="false"` and drives the
12652
+ * form through {@link handleLoginWithCredentials} and {@link canSubmit}.
12653
+ */
12654
+ export declare class SignInFormComponent {
12655
+ private readonly client;
12656
+ private readonly router;
12657
+ private readonly route;
12658
+ private readonly applicationService;
12659
+ private readonly auditService;
12660
+ /**
12661
+ * Navigate to the `returnUrl` once authenticated. Opt-out when the host owns what comes next
12662
+ * (same contract as `ChangePasswordFormComponent`): the component then only emits `success` — and, on an
12663
+ * expired password, `changePassword` without navigating to the change-password page.
12664
+ */
12665
+ readonly redirectAfterSuccess: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
12666
+ /**
12667
+ * Renders the submit button. Set `false` when the container owns it — a dialog footer — and drive
12668
+ * the form through `handleLoginWithCredentials()` / `canSubmit()`.
12669
+ */
12670
+ readonly showActions: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
12671
+ readonly forgotPassword: import("@angular/core").OutputEmitterRef<void>;
12672
+ /** Emitted when the server requires a password change (401 « password expired »). Payload: username. */
12673
+ readonly changePassword: import("@angular/core").OutputEmitterRef<string>;
12674
+ /** Emitted once authenticated and the application is initialized — before any navigation. */
12675
+ readonly success: import("@angular/core").OutputEmitterRef<void>;
12676
+ protected readonly css: {
12677
+ form: string;
12678
+ field: string;
12679
+ label: string;
12680
+ error: string;
12681
+ };
12682
+ protected readonly showError: typeof fieldShowsError;
12683
+ protected readonly errorKey: (field: FieldTree<string>) => string;
12684
+ /** Form model. */
12685
+ readonly credentials: import("@angular/core").ModelSignal<Credentials>;
12686
+ protected readonly signInForm: FieldTree<Credentials, string | number, "writable">;
12687
+ /** Whether a submission would run: both fields filled, nothing in flight. */
12688
+ readonly canSubmit: import("@angular/core").Signal<boolean>;
12689
+ protected onForgotPassword(event: Event): void;
12690
+ constructor();
12691
+ /**
12692
+ * Submits the credentials form. `submit()` marks every field as touched — which reveals the
12693
+ * validation messages — and only runs the action when the form is valid, replacing the former
12694
+ * `if (!this.isValid()) return;` guard.
12695
+ */
12696
+ handleLoginWithCredentials(): Promise<boolean>;
12697
+ /** The submission itself. Only ever reached with a valid form (see `handleLoginWithCredentials`). */
12698
+ private performLogin;
12699
+ static ɵfac: i0.ɵɵFactoryDeclaration<SignInFormComponent, never>;
12700
+ static ɵcmp: i0.ɵɵComponentDeclaration<SignInFormComponent, "sign-in-form, SignInForm, signinform", never, {
12435
12701
  "redirectAfterSuccess": {
12436
12702
  "alias": "redirectAfterSuccess";
12437
12703
  "required": false;
12438
12704
  "isSignal": true;
12439
12705
  };
12440
- "autoStart": {
12441
- "alias": "autoStart";
12706
+ "showActions": {
12707
+ "alias": "showActions";
12442
12708
  "required": false;
12443
12709
  "isSignal": true;
12444
12710
  };
@@ -12454,37 +12720,64 @@ export declare class SignInComponent implements OnInit {
12454
12720
  "credentials": "credentialsChange";
12455
12721
  }, never, never, true, never>;
12456
12722
  }
12723
+ /**
12724
+ * The password-reset form dressed as an auth page block: the product logo above the form, inside a card.
12725
+ *
12726
+ * It only adds the dressing — every behaviour lives in {@link ForgotPasswordFormComponent}, which is
12727
+ * what to use anywhere the logo has no place.
12728
+ */
12729
+ export declare class ForgotPasswordComponent {
12730
+ readonly cancel: import("@angular/core").OutputEmitterRef<void>;
12731
+ readonly success: import("@angular/core").OutputEmitterRef<void>;
12732
+ protected readonly surfaceClass = "flex w-full flex-col gap-(--spacing-md) rounded-(--radius-md) border border-solid border-(--layer-page-edge) bg-(--layer-page-layer) p-(--spacing-md) shadow-(--shadow-2)";
12733
+ static ɵfac: i0.ɵɵFactoryDeclaration<ForgotPasswordComponent, never>;
12734
+ static ɵcmp: i0.ɵɵComponentDeclaration<ForgotPasswordComponent, "forgot-password, ForgotPassword, forgotpassword", never, {}, {
12735
+ "cancel": "cancel";
12736
+ "success": "success";
12737
+ }, never, never, true, never>;
12738
+ }
12457
12739
  /** Model of the password-reset request. `username` matches `Credentials.username` and the `login.username` key. */
12458
12740
  export interface PasswordResetRequest {
12459
12741
  username: string;
12460
12742
  }
12461
- export declare class ForgotPasswordComponent {
12743
+ /**
12744
+ * The password-reset request form, and nothing else: no logo, no card, no surface of its own.
12745
+ *
12746
+ * It lays out like any block of content, so it can be dropped anywhere — inline in a page, in the
12747
+ * body of a dialog, or inside the card of an auth page (`<forgot-password>`). A container that owns
12748
+ * the buttons sets `[showActions]="false"` and drives it through {@link submit} and {@link canSubmit}.
12749
+ */
12750
+ export declare class ForgotPasswordFormComponent {
12462
12751
  readonly cancel: import("@angular/core").OutputEmitterRef<void>;
12463
12752
  readonly success: import("@angular/core").OutputEmitterRef<void>;
12464
12753
  /**
12465
- * Renders the form as a card (background, padding, shadow). Set `false` when the container
12466
- * already provides the surface — a dialog body, a settings panel — to avoid nesting cards.
12754
+ * Renders the Cancel / Send row. Set `false` when the container owns the buttons — a dialog
12755
+ * footer — and drive the form through `submit()` / `canSubmit()`.
12467
12756
  */
12468
- surface: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
12757
+ readonly showActions: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
12758
+ /** Renders the title above the description. Set `false` when the container already shows it — a dialog header. */
12759
+ readonly showTitle: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
12469
12760
  private readonly client;
12470
12761
  private readonly transloco;
12471
12762
  private readonly auditService;
12472
- protected readonly containerClass: import("@angular/core").Signal<"flex w-full flex-col gap-(--spacing-md) rounded-(--radius-md) border border-solid border-(--layer-page-edge) bg-(--layer-page-layer) p-(--spacing-md) shadow-(--shadow-2)" | "flex w-full flex-col gap-(--spacing-md)">;
12473
- protected readonly footerClass = "flex justify-end gap-(--spacing-2xs) -mx-(--spacing-md) -mb-(--spacing-md) rounded-b-(--radius-md) bg-(--layer-page-on-layer) px-(--spacing-md) py-(--spacing-sm)";
12474
- protected readonly fieldClass = "flex flex-col gap-(--spacing-2xs)";
12475
- protected readonly labelClass = "text-(length:--size-base) font-(--weight-semibold) text-(--font-primary-base)";
12476
- protected readonly errorClass = "text-(length:--size-base) text-(--font-error-base)";
12477
- protected readonly alertClass = "rounded-(--radius-sm) bg-(--bg-error-lightest) p-(--spacing-xs) text-(length:--size-base) text-(--font-error-base)";
12478
- /** Form model. Replaces the former `userName` model — note the lowercase `n`. */
12763
+ protected readonly css: {
12764
+ form: string;
12765
+ field: string;
12766
+ label: string;
12767
+ error: string;
12768
+ alert: string;
12769
+ actions: string;
12770
+ };
12771
+ protected readonly showError: typeof fieldShowsError;
12772
+ protected readonly errorKey: (field: FieldTree<string>) => string;
12773
+ /** Form model. Two-way bindable, so a wizard can carry the username over from a previous step. */
12479
12774
  readonly resetRequest: import("@angular/core").ModelSignal<PasswordResetRequest>;
12480
- /** `protected` and not `private`: a subclass template must be able to bind its own controls. */
12481
12775
  protected readonly resetForm: FieldTree<PasswordResetRequest, string | number, "writable">;
12482
- pending: import("@angular/core").WritableSignal<boolean>;
12483
- errorMsg: import("@angular/core").WritableSignal<string | null>;
12484
- /** A field shows its error only once the user has left it — never while typing the first time. */
12485
- protected showError<T>(field: FieldTree<T>): boolean;
12486
- /** Maps the first validation error to its translation key (`login.errors.required`, …). */
12487
- protected errorKey<T>(field: FieldTree<T>): string;
12776
+ readonly pending: import("@angular/core").WritableSignal<boolean>;
12777
+ readonly errorMsg: import("@angular/core").WritableSignal<string | null>;
12778
+ /** Whether a submission would run: valid form, nothing in flight. */
12779
+ readonly canSubmit: import("@angular/core").Signal<boolean>;
12780
+ constructor();
12488
12781
  /**
12489
12782
  * Submits the form. `submit()` marks every field as touched — revealing the validation
12490
12783
  * messages — and only runs the action when the form is valid.
@@ -12492,10 +12785,15 @@ export declare class ForgotPasswordComponent {
12492
12785
  submit(): Promise<boolean>;
12493
12786
  /** The submission itself. Only ever reached with a valid form. */
12494
12787
  private sendResetLink;
12495
- static ɵfac: i0.ɵɵFactoryDeclaration<ForgotPasswordComponent, never>;
12496
- static ɵcmp: i0.ɵɵComponentDeclaration<ForgotPasswordComponent, "forgot-password, ForgotPassword, forgotpassword", never, {
12497
- "surface": {
12498
- "alias": "surface";
12788
+ static ɵfac: i0.ɵɵFactoryDeclaration<ForgotPasswordFormComponent, never>;
12789
+ static ɵcmp: i0.ɵɵComponentDeclaration<ForgotPasswordFormComponent, "forgot-password-form, ForgotPasswordForm, forgotpasswordform", never, {
12790
+ "showActions": {
12791
+ "alias": "showActions";
12792
+ "required": false;
12793
+ "isSignal": true;
12794
+ };
12795
+ "showTitle": {
12796
+ "alias": "showTitle";
12499
12797
  "required": false;
12500
12798
  "isSignal": true;
12501
12799
  };
@@ -12535,10 +12833,10 @@ export declare class SignedOutComponent {
12535
12833
  static ɵcmp: i0.ɵɵComponentDeclaration<SignedOutComponent, "signed-out, SignedOut, signedout", never, {}, {}, never, never, true, never>;
12536
12834
  }
12537
12835
  export declare class BookmarkButtonComponent {
12538
- variant: import("@angular/core").InputSignal<"secondary" | "tertiary" | "none" | "primary" | "light-accent" | "accent" | null | undefined>;
12836
+ variant: import("@angular/core").InputSignal<"none" | "primary" | "secondary" | "light-accent" | "accent" | "tertiary" | null | undefined>;
12539
12837
  /** `neutral` gives a tertiary button the dark icon of the other neutral icon buttons of a toolbar. */
12540
12838
  scheme: import("@angular/core").InputSignal<"default" | "neutral" | null | undefined>;
12541
- size: import("@angular/core").InputSignal<"md" | "small" | "medium" | "large" | "lg" | "sm" | "xs" | "xsmall" | null | undefined>;
12839
+ size: import("@angular/core").InputSignal<"small" | "large" | "sm" | "md" | "lg" | "xs" | "xsmall" | "medium" | null | undefined>;
12542
12840
  /**
12543
12841
  * Tab index applied to the inner button.
12544
12842
  *
@@ -12548,10 +12846,25 @@ export declare class BookmarkButtonComponent {
12548
12846
  */
12549
12847
  tabIndex: import("@angular/core").InputSignal<number | undefined>;
12550
12848
  readonly article: import("@angular/core").InputSignal<Partial<Article>>;
12849
+ /**
12850
+ * Where the button files the document. `bookmarks` (default) is the historical behaviour: a click toggles
12851
+ * the bookmark. `collections` opts in to the collections: a click opens the "add to collection" panel, and the
12852
+ * button reads as pressed when the document is in at least one collection. Bookmarks are then left alone.
12853
+ */
12854
+ readonly target: import("@angular/core").InputSignal<"bookmarks" | "collections">;
12551
12855
  private readonly userSettingsStore;
12552
12856
  private readonly route;
12553
12857
  private readonly transloco;
12858
+ protected readonly panelId: string;
12859
+ protected readonly panelOpen: import("@angular/core").WritableSignal<boolean>;
12860
+ /** The panel only reads the id: a partial article is all it needs. */
12861
+ protected readonly panelArticles: import("@angular/core").Signal<Article[]>;
12862
+ private readonly trigger;
12863
+ private readonly panel;
12554
12864
  protected isBookmarked: import("@angular/core").Signal<boolean>;
12865
+ constructor();
12866
+ protected closePanel(): void;
12867
+ protected onPanelToggle(event: Event): void;
12555
12868
  bookmark(e: Event): Promise<void>;
12556
12869
  static ɵfac: i0.ɵɵFactoryDeclaration<BookmarkButtonComponent, never>;
12557
12870
  static ɵcmp: i0.ɵɵComponentDeclaration<BookmarkButtonComponent, "bookmark-button, bookmarkbutton, BookmarkButton", never, {
@@ -12580,6 +12893,11 @@ export declare class BookmarkButtonComponent {
12580
12893
  "required": true;
12581
12894
  "isSignal": true;
12582
12895
  };
12896
+ "target": {
12897
+ "alias": "target";
12898
+ "required": false;
12899
+ "isSignal": true;
12900
+ };
12583
12901
  }, {}, never, never, true, never>;
12584
12902
  }
12585
12903
  interface ListPanelDeleteEvent<T> {
@@ -12717,12 +13035,8 @@ export declare const BOOKMARKS_OPTIONS: BookmarksConfig;
12717
13035
  export declare const BOOKMARKS_CONFIG: InjectionToken<ListPanelConfig>;
12718
13036
  export declare class BookmarksComponent {
12719
13037
  floating: PopoverDirective | null;
12720
- private readonly selection;
12721
- private readonly queryService;
12722
13038
  private readonly userSettingsStore;
12723
- private readonly appStore;
12724
13039
  private readonly transloco;
12725
- private destroyRef;
12726
13040
  options: import("@angular/core").InputSignal<ListPanelConfig | undefined>;
12727
13041
  config: ListPanelConfig;
12728
13042
  protected idOf: (bookmark: Bookmark) => string;
@@ -12732,8 +13046,8 @@ export declare class BookmarksComponent {
12732
13046
  paginatedBookmarks: import("@angular/core").Signal<Bookmark[]>;
12733
13047
  hasMore: import("@angular/core").Signal<boolean>;
12734
13048
  constructor();
13049
+ private readonly openBookmark;
12735
13050
  onClick(bookmark: Bookmark): void;
12736
- private performSecondSearch;
12737
13051
  onDelete(event: ListPanelDeleteEvent<Bookmark>): void;
12738
13052
  loadMore(): void;
12739
13053
  static ɵfac: i0.ɵɵFactoryDeclaration<BookmarksComponent, never>;
@@ -12745,14 +13059,20 @@ export declare class BookmarksComponent {
12745
13059
  };
12746
13060
  }, {}, never, never, true, never>;
12747
13061
  }
13062
+ /**
13063
+ * Returns a function that opens a bookmark: it looks the document up by id (in the query the bookmark was made
13064
+ * from, then in the default query) and makes it the current article, or warns that it is outdated.
13065
+ *
13066
+ * Call it in an injection context. Shared by the bookmarks list and the collections manager.
13067
+ */
13068
+ export declare function injectOpenBookmark(): (bookmark: Pick<Bookmark, "id" | "queryName">) => void;
12748
13069
  export type CollectionsConfig = ListPanelConfig;
12749
13070
  export declare const COLLECTIONS_OPTIONS: CollectionsConfig;
12750
13071
  export declare const COLLECTIONS_CONFIG: InjectionToken<ListPanelConfig>;
12751
13072
  export declare class CollectionsComponent {
12752
13073
  floating: PopoverDirective | null;
12753
13074
  private readonly userSettingsStore;
12754
- private readonly queryParamsStore;
12755
- private readonly router;
13075
+ private readonly applyCollection;
12756
13076
  private readonly injector;
12757
13077
  options: import("@angular/core").InputSignal<ListPanelConfig | undefined>;
12758
13078
  config: ListPanelConfig;
@@ -12774,6 +13094,78 @@ export declare class CollectionsComponent {
12774
13094
  };
12775
13095
  }, {}, never, never, true, never>;
12776
13096
  }
13097
+ /**
13098
+ * Returns a function that applies a collection as a filter: it opens `/search` scoped to it (`?b=<name>`).
13099
+ *
13100
+ * The basket is written into `QueryParamsStore` **before** navigating: `patchState` is synchronous while
13101
+ * `router.navigate` is not, so the destination page must already see the basket when it fires its first query.
13102
+ * `syncUrl: false` because the navigation below already writes the URL, and `patch()` must not race it.
13103
+ *
13104
+ * Call it from an injection context.
13105
+ */
13106
+ export declare function injectApplyCollection(): (collection: Pick<Basket, "name">) => Promise<boolean>;
13107
+ type ViewMode = "grid" | "list";
13108
+ type ManagerTab = "collections" | "bookmarks";
13109
+ /**
13110
+ * Manages the user's collections. Two views, one component:
13111
+ *
13112
+ * - **the list**: every collection as a grid or a list, filtered by name; it can create one, delete one,
13113
+ * open one (a click) or apply one to the filters. Its content is centered and stops at `max-w-4xl`, however wide the
13114
+ * host is;
13115
+ * - **the detail** of a collection: its name (which can be changed), its documents (each can be previewed,
13116
+ * beside the list, or taken out of the collection), and the same "apply to the filters" action.
13117
+ *
13118
+ * "Apply to the filters" opens `/search` scoped to the collection (`?b=<name>`), see `injectApplyCollection`.
13119
+ * An application that wants to do it itself sets `navigateOnApply` to `false` and listens to `applied`.
13120
+ *
13121
+ * It reads `UserSettingsStore.baskets`; nothing needs to be passed in.
13122
+ */
13123
+ export declare class CollectionsManager {
13124
+ /**
13125
+ * Apply a collection by opening `/search` scoped to it. Set to `false` when the host does it itself
13126
+ * from `applied`.
13127
+ */
13128
+ readonly navigateOnApply: import("@angular/core").InputSignal<boolean>;
13129
+ /** The user asked to apply this collection to the filters (from the list or from its detail). */
13130
+ readonly applied: import("@angular/core").OutputEmitterRef<Basket>;
13131
+ private readonly userSettingsStore;
13132
+ private readonly applyCollection;
13133
+ private readonly injector;
13134
+ private readonly host;
13135
+ protected readonly collections: import("@angular/core").Signal<Basket[]>;
13136
+ protected readonly viewMode: import("@angular/core").WritableSignal<ViewMode>;
13137
+ private readonly activeTab;
13138
+ protected readonly bookmarkCount: import("@angular/core").Signal<number>;
13139
+ protected readonly hasBookmarks: import("@angular/core").Signal<boolean>;
13140
+ /** The tab shown: with no bookmark left the tab bar is gone, and the list of collections is all there is. */
13141
+ protected readonly tab: import("@angular/core").Signal<ManagerTab>;
13142
+ protected onTabChange(value: string | undefined): void;
13143
+ /** The filter box, bound to its own query signal. */
13144
+ protected readonly query: import("@angular/core").WritableSignal<string>;
13145
+ protected readonly searchForm: import("@angular/forms/signals").FieldTree<string, string | number, "writable">;
13146
+ protected readonly filtered: import("@angular/core").Signal<Basket[]>;
13147
+ /**
13148
+ * The collection whose detail is shown, by name: if it disappears (deleted elsewhere) the list comes back.
13149
+ * The detail reports a rename (`renamed`), which is how this follows the collection to its new name.
13150
+ */
13151
+ protected readonly openedName: import("@angular/core").WritableSignal<string | null>;
13152
+ protected readonly opened: import("@angular/core").Signal<Basket | undefined>;
13153
+ protected open(collection: Basket): void;
13154
+ protected closeDetail(): void;
13155
+ protected apply(collection: Basket): void;
13156
+ protected create(): void;
13157
+ protected remove(collection: Basket): void;
13158
+ static ɵfac: i0.ɵɵFactoryDeclaration<CollectionsManager, never>;
13159
+ static ɵcmp: i0.ɵɵComponentDeclaration<CollectionsManager, "CollectionsManager, collections-manager", never, {
13160
+ "navigateOnApply": {
13161
+ "alias": "navigateOnApply";
13162
+ "required": false;
13163
+ "isSignal": true;
13164
+ };
13165
+ }, {
13166
+ "applied": "applied";
13167
+ }, never, never, true, never>;
13168
+ }
12777
13169
  export declare class CollectionsDialog {
12778
13170
  protected readonly call: import("@sinequa/galactik").CallRef<Article | Article[], DialogResult>;
12779
13171
  readonly createInputElement: import("@angular/core").Signal<ElementRef<HTMLInputElement> | undefined>;
@@ -12795,7 +13187,7 @@ export declare class CollectionsDialog {
12795
13187
  readonly showSearch: import("@angular/core").Signal<boolean>;
12796
13188
  /** Collections matching the search text (case-insensitive, by name). */
12797
13189
  readonly filteredCollections: import("@angular/core").Signal<Basket[]>;
12798
- readonly collectionsMap: import("@angular/core").WritableSignal<Record<string, "some" | "all" | "none">>;
13190
+ readonly collectionsMap: import("@angular/core").WritableSignal<Record<string, "some" | "none" | "all">>;
12799
13191
  /** Windowing over the filtered list — renders only the visible rows. */
12800
13192
  readonly virtualizer: import("@tanstack/angular-virtual").AngularVirtualizer<HTMLDivElement, Element>;
12801
13193
  constructor();
@@ -12819,6 +13211,37 @@ export declare class CollectionsDialog {
12819
13211
  }
12820
13212
  /** Imperative entry point: `await AddToCollection.call(articles)` → "dialog-yes"/"dialog-no"/event. */
12821
13213
  export declare const AddToCollection: import("@sinequa/galactik").Callable<Article | Article[], DialogResult>;
13214
+ /**
13215
+ * Names a new, empty collection. The name is checked as it is typed (a taken name shows at once),
13216
+ * an empty one only once a submission was attempted. Closes with `dialog-yes` once the collection exists.
13217
+ */
13218
+ export declare class CreateCollectionDialog {
13219
+ protected readonly call: import("@sinequa/galactik").CallRef<Record<string, never>, DialogResult>;
13220
+ private readonly dialog;
13221
+ private readonly nameInput;
13222
+ private readonly injector;
13223
+ private readonly userSettingsStore;
13224
+ private readonly transloco;
13225
+ protected readonly formId: string;
13226
+ protected readonly nameId: string;
13227
+ protected readonly errorId: string;
13228
+ private readonly model;
13229
+ protected readonly createForm: import("@angular/forms/signals").FieldTree<{
13230
+ name: string;
13231
+ }, string | number, "writable">;
13232
+ /**
13233
+ * Set when "Create" is pressed. An empty name is only reported then, not when the field loses the focus:
13234
+ * leaving it for "Cancel" or the close button is not an error. (A taken name shows as it is typed.)
13235
+ */
13236
+ protected readonly attempted: import("@angular/core").WritableSignal<boolean>;
13237
+ protected readonly nameError: import("@angular/core").Signal<"nameExists" | "nameRequired" | null>;
13238
+ constructor();
13239
+ private create;
13240
+ static ɵfac: i0.ɵɵFactoryDeclaration<CreateCollectionDialog, never>;
13241
+ static ɵcmp: i0.ɵɵComponentDeclaration<CreateCollectionDialog, "create-collection-dialog", never, {}, {}, never, never, true, never>;
13242
+ }
13243
+ /** Imperative entry point: `await CreateCollection.call({})` — resolves `dialog-yes` once created. */
13244
+ export declare const CreateCollection: import("@sinequa/galactik").Callable<Record<string, never>, DialogResult>;
12822
13245
  export interface DeleteCollectionArgs {
12823
13246
  collection: Basket;
12824
13247
  index: number;
@@ -12862,6 +13285,16 @@ type PanelStatus = {
12862
13285
  export declare class AddToCollectionPanelComponent {
12863
13286
  /** The documents to file. */
12864
13287
  readonly articles: import("@angular/core").InputSignal<Article[]>;
13288
+ /**
13289
+ * `add` (default): each collection offers `+` / `✓`, the documents stay where they are.
13290
+ * `move`: each collection offers a single "move here" button; the panel only adds the documents to the
13291
+ * chosen collection and reports `moved`. Taking them out of their source is the host's job.
13292
+ */
13293
+ readonly mode: import("@angular/core").InputSignal<"add" | "move">;
13294
+ /** `move` only: a collection left out of the list, the one the documents come from. */
13295
+ readonly exclude: import("@angular/core").InputSignal<string | undefined>;
13296
+ /** `move` only: the documents were added to this collection (its name). The host removes them from the source. */
13297
+ readonly moved: import("@angular/core").OutputEmitterRef<string>;
12865
13298
  /** An addition was saved and confirmed: the host closes the panel. Carries the collection's name. */
12866
13299
  readonly done: import("@angular/core").OutputEmitterRef<string>;
12867
13300
  /** A collection was saved (added to, removed from, created). */
@@ -12892,9 +13325,12 @@ export declare class AddToCollectionPanelComponent {
12892
13325
  protected readonly createForm: import("@angular/forms/signals").FieldTree<{
12893
13326
  name: string;
12894
13327
  }, string | number, "writable">;
13328
+ /** Whether a submission was refused since the form was opened: a blur alone must not report an empty name. */
13329
+ private readonly submitAttempted;
12895
13330
  /**
12896
13331
  * 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).
13332
+ * to try first — an empty one only once a submission was attempted, never on a mere blur (leaving
13333
+ * the field to cancel would otherwise flash it and shift the row under the pointer).
12898
13334
  */
12899
13335
  protected readonly nameError: import("@angular/core").Signal<"nameExists" | "nameRequired" | null>;
12900
13336
  /** A collection holding part of the documents says so on a second line: its row is taller. */
@@ -12906,6 +13342,8 @@ export declare class AddToCollectionPanelComponent {
12906
13342
  heldIn(collection: Basket): number;
12907
13343
  /** `+` adds every document the collection lacks; `✓` takes them all out. */
12908
13344
  toggle(collection: Basket): Promise<void>;
13345
+ /** `move` mode: files every document in the collection, then tells the host, which empties the source. */
13346
+ protected move(collection: Basket): Promise<void>;
12909
13347
  protected startCreation(): void;
12910
13348
  /**
12911
13349
  * Leaves the name field for the list. On Escape, the key is kept from the popover around the panel,
@@ -12929,12 +13367,91 @@ export declare class AddToCollectionPanelComponent {
12929
13367
  "required": true;
12930
13368
  "isSignal": true;
12931
13369
  };
13370
+ "mode": {
13371
+ "alias": "mode";
13372
+ "required": false;
13373
+ "isSignal": true;
13374
+ };
13375
+ "exclude": {
13376
+ "alias": "exclude";
13377
+ "required": false;
13378
+ "isSignal": true;
13379
+ };
12932
13380
  }, {
13381
+ "moved": "moved";
12933
13382
  "done": "done";
12934
13383
  "changed": "changed";
12935
13384
  "closeRequested": "closeRequested";
12936
13385
  }, never, never, true, never>;
12937
13386
  }
13387
+ /** What `ChangePassword.call()` takes. */
13388
+ export interface ChangePasswordDialogProps {
13389
+ /** Account to log back in with after the change. Defaults to the signed-in user. */
13390
+ username?: string | null;
13391
+ }
13392
+ /**
13393
+ * The change-password form in a standard dialog. The form owns no button here (`[showActions]="false"`):
13394
+ * Cancel and Confirm live in the `DialogFooter`, and drive the form through its public API.
13395
+ */
13396
+ export declare class ChangePasswordDialogComponent {
13397
+ protected readonly call: import("@sinequa/galactik").CallRef<ChangePasswordDialogProps | undefined, DialogResult>;
13398
+ readonly dialog: import("@angular/core").Signal<DialogComponent | undefined>;
13399
+ private readonly focusFirstInput;
13400
+ constructor();
13401
+ static ɵfac: i0.ɵɵFactoryDeclaration<ChangePasswordDialogComponent, never>;
13402
+ static ɵcmp: i0.ɵɵComponentDeclaration<ChangePasswordDialogComponent, "change-password-dialog", never, {}, {}, never, never, true, never>;
13403
+ }
13404
+ /** Imperative entry point: `await ChangePassword.call({ username })`. */
13405
+ export declare const ChangePassword: import("@sinequa/galactik").Callable<ChangePasswordDialogProps | undefined, DialogResult>;
13406
+ /**
13407
+ * The password-reset request form in a standard dialog. The form owns no button here
13408
+ * (`[showActions]="false"`): Cancel and Send live in the `DialogFooter`, and drive the form through its
13409
+ * public API. The promise resolves with `"dialog-confirm"` once the reset email was requested.
13410
+ */
13411
+ export declare class ForgotPasswordDialogComponent {
13412
+ protected readonly call: import("@sinequa/galactik").CallRef<void, DialogResult>;
13413
+ readonly dialog: import("@angular/core").Signal<DialogComponent | undefined>;
13414
+ private readonly focusFirstInput;
13415
+ constructor();
13416
+ static ɵfac: i0.ɵɵFactoryDeclaration<ForgotPasswordDialogComponent, never>;
13417
+ static ɵcmp: i0.ɵɵComponentDeclaration<ForgotPasswordDialogComponent, "forgot-password-dialog", never, {}, {}, never, never, true, never>;
13418
+ }
13419
+ /** Imperative entry point: `await ForgotPassword.call()`. */
13420
+ export declare const ForgotPassword: import("@sinequa/galactik").Callable<void, DialogResult>;
13421
+ /** The steps of the dialog. */
13422
+ type SignInStep = "sign-in" | "forgot-password" | "change-password";
13423
+ /**
13424
+ * The credentials form in a standard dialog, as a wizard: one dialog, whose content switches in place.
13425
+ *
13426
+ * - `sign-in` — the credentials form. "Forgot password" moves to `forgot-password`; an expired password
13427
+ * reported by the server moves to `change-password`.
13428
+ * - `forgot-password` — requests the reset email, then goes back to `sign-in`.
13429
+ * - `change-password` — changes the expired password, which also signs the user in with the new one.
13430
+ *
13431
+ * No form owns a button here (`[showActions]="false"`): the `DialogFooter` has the buttons of the current
13432
+ * step, and drives its form through the public API. Only the credentials form is shown: no external
13433
+ * handshake is ever started from here.
13434
+ *
13435
+ * Resolves with `"dialog-confirm"` once signed in (the application is initialized) and `"dialog-cancel"`
13436
+ * when dismissed.
13437
+ */
13438
+ export declare class SignInDialogComponent {
13439
+ protected readonly call: import("@sinequa/galactik").CallRef<void, DialogResult>;
13440
+ readonly dialog: import("@angular/core").Signal<DialogComponent | undefined>;
13441
+ protected readonly step: import("@angular/core").WritableSignal<SignInStep>;
13442
+ /** The account whose password expired, carried over to the change-password step. */
13443
+ protected readonly expiredUsername: import("@angular/core").WritableSignal<string | null>;
13444
+ protected readonly signInForm: import("@angular/core").Signal<SignInFormComponent | undefined>;
13445
+ protected readonly resetForm: import("@angular/core").Signal<ForgotPasswordFormComponent | undefined>;
13446
+ protected readonly passwordForm: import("@angular/core").Signal<ChangePasswordFormComponent | undefined>;
13447
+ private readonly focusFirstInput;
13448
+ constructor();
13449
+ protected onPasswordExpired(username: string): void;
13450
+ static ɵfac: i0.ɵɵFactoryDeclaration<SignInDialogComponent, never>;
13451
+ static ɵcmp: i0.ɵɵComponentDeclaration<SignInDialogComponent, "sign-in-dialog", never, {}, {}, never, never, true, never>;
13452
+ }
13453
+ /** Imperative entry point: `await SignIn.call()`. */
13454
+ export declare const SignIn: import("@sinequa/galactik").Callable<void, DialogResult>;
12938
13455
  /** Editable text/boolean fields of a converter (the app-filled `conversion` is excluded). */
12939
13456
  type ConverterField = "name" | "converter" | "format" | "primary" | "display" | "default";
12940
13457
  /** Groups the toggles are bucketed into, in display order. */
@@ -13250,7 +13767,7 @@ export declare class ExportDialog {
13250
13767
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
13251
13768
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
13252
13769
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
13253
- aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
13770
+ aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
13254
13771
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
13255
13772
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
13256
13773
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -13440,6 +13957,7 @@ export declare class FeedbackDialogComponent {
13440
13957
  enabled?: boolean;
13441
13958
  data?: string[];
13442
13959
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
13960
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
13443
13961
  };
13444
13962
  previewMultiConversion?: boolean;
13445
13963
  persistFiltersAcrossTabs?: boolean;
@@ -13482,6 +14000,7 @@ export declare class FeedbackDialogComponent {
13482
14000
  enabled?: boolean;
13483
14001
  data?: string[];
13484
14002
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
14003
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
13485
14004
  };
13486
14005
  previewMultiConversion?: boolean;
13487
14006
  persistFiltersAcrossTabs?: boolean;
@@ -13546,6 +14065,7 @@ export declare class FeedbackDialogComponent {
13546
14065
  enabled?: boolean;
13547
14066
  data?: string[];
13548
14067
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
14068
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
13549
14069
  };
13550
14070
  previewMultiConversion?: boolean;
13551
14071
  persistFiltersAcrossTabs?: boolean;
@@ -13640,6 +14160,7 @@ export declare class FeedbackDialogComponent {
13640
14160
  enabled?: boolean;
13641
14161
  data?: string[];
13642
14162
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
14163
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
13643
14164
  };
13644
14165
  previewMultiConversion?: boolean;
13645
14166
  persistFiltersAcrossTabs?: boolean;
@@ -13682,6 +14203,7 @@ export declare class FeedbackDialogComponent {
13682
14203
  enabled?: boolean;
13683
14204
  data?: string[];
13684
14205
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
14206
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
13685
14207
  };
13686
14208
  previewMultiConversion?: boolean;
13687
14209
  persistFiltersAcrossTabs?: boolean;
@@ -13734,9 +14256,9 @@ export declare class SearchFeedbackComponent {
13734
14256
  onClose: import("@angular/core").OutputEmitterRef<void>;
13735
14257
  private readonly injector;
13736
14258
  pages: import("@angular/core").InputSignal<any>;
13737
- variant: import("@angular/core").InputSignal<"secondary" | "tertiary" | "none" | "primary" | "light-accent" | "accent" | null | undefined>;
14259
+ variant: import("@angular/core").InputSignal<"none" | "primary" | "secondary" | "light-accent" | "accent" | "tertiary" | null | undefined>;
13738
14260
  /** Size of the trigger button. `sm` fits a row of result options. */
13739
- size: import("@angular/core").InputSignal<"md" | "small" | "medium" | "large" | "lg" | "sm" | "xs" | "xsmall" | null | undefined>;
14261
+ size: import("@angular/core").InputSignal<"small" | "large" | "sm" | "md" | "lg" | "xs" | "xsmall" | "medium" | null | undefined>;
13740
14262
  /** Shows the close cross on the button. Turn it off where the button belongs to the page and is not a suggestion to dismiss. */
13741
14263
  dismissible: import("@angular/core").InputSignal<boolean>;
13742
14264
  readonly auditService: AuditService;
@@ -13767,7 +14289,7 @@ export declare class SearchFeedbackComponent {
13767
14289
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
13768
14290
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
13769
14291
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
13770
- aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
14292
+ aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
13771
14293
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
13772
14294
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
13773
14295
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -14089,7 +14611,7 @@ export declare class AggregationDateComponent {
14089
14611
  *
14090
14612
  * @default 'selection'
14091
14613
  */
14092
- emitOn: import("@angular/core").InputSignal<"selection" | "apply">;
14614
+ emitOn: import("@angular/core").InputSignal<"apply" | "selection">;
14093
14615
  readonly title: import("@angular/core").InputSignal<AggregationTitle>;
14094
14616
  readonly displayEmptyDistributionIntervals: import("@angular/core").InputSignal<boolean>;
14095
14617
  onSelect: import("@angular/core").OutputEmitterRef<AggregationItem[]>;
@@ -14157,7 +14679,7 @@ export declare class AggregationDateComponent {
14157
14679
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
14158
14680
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
14159
14681
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
14160
- aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
14682
+ aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
14161
14683
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
14162
14684
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
14163
14685
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -14672,7 +15194,7 @@ export declare class AggregationTreeComponent {
14672
15194
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
14673
15195
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
14674
15196
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
14675
- aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
15197
+ aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
14676
15198
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
14677
15199
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
14678
15200
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -14805,6 +15327,7 @@ export declare class AggregationTreeComponent {
14805
15327
  enabled?: boolean;
14806
15328
  data?: string[];
14807
15329
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
15330
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
14808
15331
  };
14809
15332
  previewMultiConversion?: boolean;
14810
15333
  persistFiltersAcrossTabs?: boolean;
@@ -14847,6 +15370,7 @@ export declare class AggregationTreeComponent {
14847
15370
  enabled?: boolean;
14848
15371
  data?: string[];
14849
15372
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
15373
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
14850
15374
  };
14851
15375
  previewMultiConversion?: boolean;
14852
15376
  persistFiltersAcrossTabs?: boolean;
@@ -14911,6 +15435,7 @@ export declare class AggregationTreeComponent {
14911
15435
  enabled?: boolean;
14912
15436
  data?: string[];
14913
15437
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
15438
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
14914
15439
  };
14915
15440
  previewMultiConversion?: boolean;
14916
15441
  persistFiltersAcrossTabs?: boolean;
@@ -15005,6 +15530,7 @@ export declare class AggregationTreeComponent {
15005
15530
  enabled?: boolean;
15006
15531
  data?: string[];
15007
15532
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
15533
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
15008
15534
  };
15009
15535
  previewMultiConversion?: boolean;
15010
15536
  persistFiltersAcrossTabs?: boolean;
@@ -15047,6 +15573,7 @@ export declare class AggregationTreeComponent {
15047
15573
  enabled?: boolean;
15048
15574
  data?: string[];
15049
15575
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
15576
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
15050
15577
  };
15051
15578
  previewMultiConversion?: boolean;
15052
15579
  persistFiltersAcrossTabs?: boolean;
@@ -15547,7 +16074,7 @@ export declare class AggregationListComponent {
15547
16074
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
15548
16075
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
15549
16076
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
15550
- aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
16077
+ aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
15551
16078
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
15552
16079
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
15553
16080
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -15680,6 +16207,7 @@ export declare class AggregationListComponent {
15680
16207
  enabled?: boolean;
15681
16208
  data?: string[];
15682
16209
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
16210
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
15683
16211
  };
15684
16212
  previewMultiConversion?: boolean;
15685
16213
  persistFiltersAcrossTabs?: boolean;
@@ -15692,19 +16220,7 @@ export declare class AggregationListComponent {
15692
16220
  light?: {
15693
16221
  small?: string;
15694
16222
  large?: 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;
16223
+ sidebar?: string;
15708
16224
  };
15709
16225
  dark?: {
15710
16226
  small?: string;
@@ -15734,6 +16250,7 @@ export declare class AggregationListComponent {
15734
16250
  enabled?: boolean;
15735
16251
  data?: string[];
15736
16252
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
16253
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
15737
16254
  };
15738
16255
  previewMultiConversion?: boolean;
15739
16256
  persistFiltersAcrossTabs?: boolean;
@@ -15768,19 +16285,7 @@ export declare class AggregationListComponent {
15768
16285
  light?: {
15769
16286
  small?: string;
15770
16287
  large?: 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;
16288
+ sidebar?: string;
15784
16289
  };
15785
16290
  dark?: {
15786
16291
  small?: string;
@@ -15810,6 +16315,7 @@ export declare class AggregationListComponent {
15810
16315
  enabled?: boolean;
15811
16316
  data?: string[];
15812
16317
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
16318
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
15813
16319
  };
15814
16320
  previewMultiConversion?: boolean;
15815
16321
  persistFiltersAcrossTabs?: boolean;
@@ -15904,6 +16410,7 @@ export declare class AggregationListComponent {
15904
16410
  enabled?: boolean;
15905
16411
  data?: string[];
15906
16412
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
16413
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
15907
16414
  };
15908
16415
  previewMultiConversion?: boolean;
15909
16416
  persistFiltersAcrossTabs?: boolean;
@@ -15916,19 +16423,7 @@ export declare class AggregationListComponent {
15916
16423
  light?: {
15917
16424
  small?: string;
15918
16425
  large?: 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;
16426
+ sidebar?: string;
15932
16427
  };
15933
16428
  dark?: {
15934
16429
  small?: string;
@@ -15958,6 +16453,7 @@ export declare class AggregationListComponent {
15958
16453
  enabled?: boolean;
15959
16454
  data?: string[];
15960
16455
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
16456
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
15961
16457
  };
15962
16458
  previewMultiConversion?: boolean;
15963
16459
  persistFiltersAcrossTabs?: boolean;
@@ -16221,6 +16717,7 @@ export declare class AggregationComponent {
16221
16717
  enabled?: boolean;
16222
16718
  data?: string[];
16223
16719
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
16720
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
16224
16721
  };
16225
16722
  previewMultiConversion?: boolean;
16226
16723
  persistFiltersAcrossTabs?: boolean;
@@ -16263,6 +16760,7 @@ export declare class AggregationComponent {
16263
16760
  enabled?: boolean;
16264
16761
  data?: string[];
16265
16762
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
16763
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
16266
16764
  };
16267
16765
  previewMultiConversion?: boolean;
16268
16766
  persistFiltersAcrossTabs?: boolean;
@@ -16327,6 +16825,7 @@ export declare class AggregationComponent {
16327
16825
  enabled?: boolean;
16328
16826
  data?: string[];
16329
16827
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
16828
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
16330
16829
  };
16331
16830
  previewMultiConversion?: boolean;
16332
16831
  persistFiltersAcrossTabs?: boolean;
@@ -16421,6 +16920,7 @@ export declare class AggregationComponent {
16421
16920
  enabled?: boolean;
16422
16921
  data?: string[];
16423
16922
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
16923
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
16424
16924
  };
16425
16925
  previewMultiConversion?: boolean;
16426
16926
  persistFiltersAcrossTabs?: boolean;
@@ -16463,6 +16963,7 @@ export declare class AggregationComponent {
16463
16963
  enabled?: boolean;
16464
16964
  data?: string[];
16465
16965
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
16966
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
16466
16967
  };
16467
16968
  previewMultiConversion?: boolean;
16468
16969
  persistFiltersAcrossTabs?: boolean;
@@ -16634,7 +17135,7 @@ export declare class AggregationComponent {
16634
17135
  *
16635
17136
  * @default 'selection'
16636
17137
  */
16637
- emitOn: import("@angular/core").InputSignal<"selection" | "apply">;
17138
+ emitOn: import("@angular/core").InputSignal<"apply" | "selection">;
16638
17139
  /**
16639
17140
  * Which sub-component renders the aggregation.
16640
17141
  *
@@ -16647,7 +17148,7 @@ export declare class AggregationComponent {
16647
17148
  *
16648
17149
  * @default "auto"
16649
17150
  */
16650
- type: import("@angular/core").InputSignal<"list" | "auto" | "tree" | "date">;
17151
+ type: import("@angular/core").InputSignal<"date" | "list" | "tree" | "auto">;
16651
17152
  /**
16652
17153
  * Whether the host removes itself from the layout (Tailwind's `hidden`, i.e.
16653
17154
  * `display: none`) when it resolves to zero items. When `false` (default), the
@@ -16699,7 +17200,7 @@ export declare class AggregationComponent {
16699
17200
  * The sub-component to render: the explicit `type` input, or the current
16700
17201
  * date/tree/list heuristic when `type` is `"auto"`.
16701
17202
  */
16702
- protected resolvedType: import("@angular/core").Signal<"list" | "tree" | "date">;
17203
+ protected resolvedType: import("@angular/core").Signal<"date" | "list" | "tree">;
16703
17204
  /** Whether a filter is currently applied on this aggregation. */
16704
17205
  private readonly hasFilters;
16705
17206
  /**
@@ -17152,11 +17653,11 @@ export declare class AppliedFiltersComponent {
17152
17653
  * than as "unset". A `null` here would therefore silently neutralise `scheme` — the chips would keep
17153
17654
  * their base look whatever colour was asked for. `undefined` lets the tag apply its own default.
17154
17655
  */
17155
- readonly variant: import("@angular/core").InputSignal<"secondary" | "primary" | null | undefined>;
17656
+ readonly variant: import("@angular/core").InputSignal<"primary" | "secondary" | null | undefined>;
17156
17657
  /** Chip colour scheme, passed to galactik's `tag`. */
17157
- readonly scheme: import("@angular/core").InputSignal<"error" | "sage" | "almond" | "pink" | "grey" | "yellow" | "cherry" | "indigo" | "cyan" | "success" | "warning" | "info" | null | undefined>;
17658
+ readonly scheme: import("@angular/core").InputSignal<"error" | "sage" | "success" | "almond" | "pink" | "grey" | "yellow" | "cherry" | "indigo" | "cyan" | "warning" | "info" | null | undefined>;
17158
17659
  /** Chip size, passed to galactik's `tag`. */
17159
- readonly size: import("@angular/core").InputSignal<"md" | "small" | "medium" | "sm" | "xs" | "xsmall" | null | undefined>;
17660
+ readonly size: import("@angular/core").InputSignal<"small" | "sm" | "md" | "xs" | "xsmall" | "medium" | null | undefined>;
17160
17661
  /** Extra classes for each chip, merged by galactik's `tag`. */
17161
17662
  readonly chipClass: import("@angular/core").InputSignal<string>;
17162
17663
  /**
@@ -17408,7 +17909,7 @@ export declare class FilterButtonComponent {
17408
17909
  * @default "sage"
17409
17910
  */
17410
17911
  scheme: import("@angular/core").InputSignal<FilterScheme>;
17411
- protected variant: import("@angular/core").WritableSignal<"secondary" | "tertiary" | "none" | "primary" | "light-accent" | "accent" | null | undefined>;
17912
+ protected variant: import("@angular/core").WritableSignal<"none" | "primary" | "secondary" | "light-accent" | "accent" | "tertiary" | null | undefined>;
17412
17913
  protected filter: import("@angular/core").WritableSignal<CFilterEx>;
17413
17914
  /** Unique id wiring the trigger's `popovertarget` to the `<div popover>` `id`. */
17414
17915
  protected readonly popoverId: string;
@@ -17465,7 +17966,7 @@ export declare class FilterButtonComponent {
17465
17966
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
17466
17967
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
17467
17968
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
17468
- aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
17969
+ aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
17469
17970
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
17470
17971
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
17471
17972
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -17598,6 +18099,7 @@ export declare class FilterButtonComponent {
17598
18099
  enabled?: boolean;
17599
18100
  data?: string[];
17600
18101
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
18102
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
17601
18103
  };
17602
18104
  previewMultiConversion?: boolean;
17603
18105
  persistFiltersAcrossTabs?: boolean;
@@ -17640,6 +18142,7 @@ export declare class FilterButtonComponent {
17640
18142
  enabled?: boolean;
17641
18143
  data?: string[];
17642
18144
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
18145
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
17643
18146
  };
17644
18147
  previewMultiConversion?: boolean;
17645
18148
  persistFiltersAcrossTabs?: boolean;
@@ -17704,6 +18207,7 @@ export declare class FilterButtonComponent {
17704
18207
  enabled?: boolean;
17705
18208
  data?: string[];
17706
18209
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
18210
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
17707
18211
  };
17708
18212
  previewMultiConversion?: boolean;
17709
18213
  persistFiltersAcrossTabs?: boolean;
@@ -17798,6 +18302,7 @@ export declare class FilterButtonComponent {
17798
18302
  enabled?: boolean;
17799
18303
  data?: string[];
17800
18304
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
18305
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
17801
18306
  };
17802
18307
  previewMultiConversion?: boolean;
17803
18308
  persistFiltersAcrossTabs?: boolean;
@@ -17840,6 +18345,7 @@ export declare class FilterButtonComponent {
17840
18345
  enabled?: boolean;
17841
18346
  data?: string[];
17842
18347
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
18348
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
17843
18349
  };
17844
18350
  previewMultiConversion?: boolean;
17845
18351
  persistFiltersAcrossTabs?: boolean;
@@ -18162,6 +18668,7 @@ export declare class MoreButtonComponent {
18162
18668
  enabled?: boolean;
18163
18669
  data?: string[];
18164
18670
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
18671
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
18165
18672
  };
18166
18673
  previewMultiConversion?: boolean;
18167
18674
  persistFiltersAcrossTabs?: boolean;
@@ -18204,6 +18711,7 @@ export declare class MoreButtonComponent {
18204
18711
  enabled?: boolean;
18205
18712
  data?: string[];
18206
18713
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
18714
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
18207
18715
  };
18208
18716
  previewMultiConversion?: boolean;
18209
18717
  persistFiltersAcrossTabs?: boolean;
@@ -18268,6 +18776,7 @@ export declare class MoreButtonComponent {
18268
18776
  enabled?: boolean;
18269
18777
  data?: string[];
18270
18778
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
18779
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
18271
18780
  };
18272
18781
  previewMultiConversion?: boolean;
18273
18782
  persistFiltersAcrossTabs?: boolean;
@@ -18362,6 +18871,7 @@ export declare class MoreButtonComponent {
18362
18871
  enabled?: boolean;
18363
18872
  data?: string[];
18364
18873
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
18874
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
18365
18875
  };
18366
18876
  previewMultiConversion?: boolean;
18367
18877
  persistFiltersAcrossTabs?: boolean;
@@ -18404,6 +18914,7 @@ export declare class MoreButtonComponent {
18404
18914
  enabled?: boolean;
18405
18915
  data?: string[];
18406
18916
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
18917
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
18407
18918
  };
18408
18919
  previewMultiConversion?: boolean;
18409
18920
  persistFiltersAcrossTabs?: boolean;
@@ -18456,7 +18967,7 @@ export declare class MoreButtonComponent {
18456
18967
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
18457
18968
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
18458
18969
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
18459
- aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
18970
+ aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
18460
18971
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
18461
18972
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
18462
18973
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -18813,7 +19324,7 @@ export declare class FiltersBarComponent {
18813
19324
  *
18814
19325
  * @default "start"
18815
19326
  */
18816
- align: import("@angular/core").InputSignal<"center" | "start">;
19327
+ align: import("@angular/core").InputSignal<"start" | "center">;
18817
19328
  /**
18818
19329
  * How far apart the buttons are. `compact` (the default) is the tight spacing of a toolbar; `comfortable` puts
18819
19330
  * `--spacing-lg` (20px) between every button, the quick filters pill and the "more" button included, as under the
@@ -18939,6 +19450,7 @@ export declare class FiltersBarComponent {
18939
19450
  enabled?: boolean;
18940
19451
  data?: string[];
18941
19452
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
19453
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
18942
19454
  };
18943
19455
  previewMultiConversion?: boolean;
18944
19456
  persistFiltersAcrossTabs?: boolean;
@@ -18981,6 +19493,7 @@ export declare class FiltersBarComponent {
18981
19493
  enabled?: boolean;
18982
19494
  data?: string[];
18983
19495
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
19496
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
18984
19497
  };
18985
19498
  previewMultiConversion?: boolean;
18986
19499
  persistFiltersAcrossTabs?: boolean;
@@ -19045,6 +19558,7 @@ export declare class FiltersBarComponent {
19045
19558
  enabled?: boolean;
19046
19559
  data?: string[];
19047
19560
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
19561
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
19048
19562
  };
19049
19563
  previewMultiConversion?: boolean;
19050
19564
  persistFiltersAcrossTabs?: boolean;
@@ -19139,6 +19653,7 @@ export declare class FiltersBarComponent {
19139
19653
  enabled?: boolean;
19140
19654
  data?: string[];
19141
19655
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
19656
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
19142
19657
  };
19143
19658
  previewMultiConversion?: boolean;
19144
19659
  persistFiltersAcrossTabs?: boolean;
@@ -19181,6 +19696,7 @@ export declare class FiltersBarComponent {
19181
19696
  enabled?: boolean;
19182
19697
  data?: string[];
19183
19698
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
19699
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
19184
19700
  };
19185
19701
  previewMultiConversion?: boolean;
19186
19702
  persistFiltersAcrossTabs?: boolean;
@@ -19242,7 +19758,7 @@ export declare class FiltersBarComponent {
19242
19758
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
19243
19759
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
19244
19760
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
19245
- aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
19761
+ aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
19246
19762
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
19247
19763
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
19248
19764
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -19529,7 +20045,7 @@ type FiltersTab = "all" | "quick";
19529
20045
  /**
19530
20046
  * The filters panel: the facets of the search, and the quick filters of the user, in one card-sized column.
19531
20047
  *
19532
- * "All" holds the facets (`<aside-filters>`, driven by the application's filters configuration) with a field that narrows them by
20048
+ * "All" holds every configured facet (`<aside-filters>`, whatever its `position`: LexiQ has no left/right notion) with a field that narrows them by
19533
20049
  * name, the count of documents, and a button that saves the filters applied right now as a quick filter (a card under the button
19534
20050
  * asks for its name). "Quick Filters" is the list of the `<quick-filters>` pill, inline (`<quick-filters-list>`): one line per quick filter, with the
19535
20051
  * count of its filters — hovering it shows them as tags — and a cross that deletes it. A click on a quick filter replaces **all** the
@@ -19552,6 +20068,7 @@ export declare class FiltersPanelComponent {
19552
20068
  readonly closed: import("@angular/core").OutputEmitterRef<void>;
19553
20069
  private readonly appStore;
19554
20070
  private readonly aggregationsStore;
20071
+ private readonly aggregationsService;
19555
20072
  private readonly queryParamsStore;
19556
20073
  private readonly userSettingsStore;
19557
20074
  private readonly transloco;
@@ -19567,11 +20084,13 @@ export declare class FiltersPanelComponent {
19567
20084
  private readonly nameInput;
19568
20085
  private readonly saveButton;
19569
20086
  /**
19570
- * The facets whose name contains the query, as the names `<aside-filters [aggregations]>` takes.
19571
- * Empty query → the component's own configuration-driven list (the input is left empty).
19572
- *
19573
- * An explicit list bypasses the `position` and "hidden" rules of that configuration, so the same two
19574
- * rules are applied here first.
20087
+ * Every configured facet the user may see: the `position` of the configuration (`left` / `both`) does not apply here — the panel
20088
+ * is the only place the facets live — but the authorizations and the admin "hidden" rule do.
20089
+ */
20090
+ private readonly facets;
20091
+ /**
20092
+ * The names of the facets whose name contains the query (all of them when it is empty), as `<aside-filters [aggregations]>` takes them.
20093
+ * The list is always explicit: an empty one would make `<aside-filters>` fall back on its own `position`-driven configuration.
19575
20094
  */
19576
20095
  protected readonly matching: import("@angular/core").Signal<string[]>;
19577
20096
  protected selectTab(values: readonly string[]): void;
@@ -19676,6 +20195,7 @@ export declare class LabelService {
19676
20195
  enabled?: boolean;
19677
20196
  data?: string[];
19678
20197
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
20198
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
19679
20199
  };
19680
20200
  previewMultiConversion?: boolean;
19681
20201
  persistFiltersAcrossTabs?: boolean;
@@ -19718,6 +20238,7 @@ export declare class LabelService {
19718
20238
  enabled?: boolean;
19719
20239
  data?: string[];
19720
20240
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
20241
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
19721
20242
  };
19722
20243
  previewMultiConversion?: boolean;
19723
20244
  persistFiltersAcrossTabs?: boolean;
@@ -19782,6 +20303,7 @@ export declare class LabelService {
19782
20303
  enabled?: boolean;
19783
20304
  data?: string[];
19784
20305
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
20306
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
19785
20307
  };
19786
20308
  previewMultiConversion?: boolean;
19787
20309
  persistFiltersAcrossTabs?: boolean;
@@ -19876,6 +20398,7 @@ export declare class LabelService {
19876
20398
  enabled?: boolean;
19877
20399
  data?: string[];
19878
20400
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
20401
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
19879
20402
  };
19880
20403
  previewMultiConversion?: boolean;
19881
20404
  persistFiltersAcrossTabs?: boolean;
@@ -19918,6 +20441,7 @@ export declare class LabelService {
19918
20441
  enabled?: boolean;
19919
20442
  data?: string[];
19920
20443
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
20444
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
19921
20445
  };
19922
20446
  previewMultiConversion?: boolean;
19923
20447
  persistFiltersAcrossTabs?: boolean;
@@ -20212,14 +20736,15 @@ export declare class HistoryPanelComponent {
20212
20736
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
20213
20737
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
20214
20738
  language?: import("@angular/core").Signal<string | undefined> | 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>;
20739
+ userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
20740
+ agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
20217
20741
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
20218
20742
  isDebugMode: import("@angular/core").Signal<boolean>;
20219
20743
  isDarkMode: import("@angular/core").Signal<boolean>;
20220
20744
  updateBookmarks: (bookmarks: import("@sinequa/atomic-angular").UserSettingsState["bookmarks"], auditEvents?: import("@sinequa/atomic").AuditEvents) => Promise<void>;
20221
20745
  bookmark: (article: import("@sinequa/atomic").Article, queryName?: string) => Promise<void>;
20222
20746
  unbookmark: (id: string) => Promise<void>;
20747
+ unbookmarkMany: (ids: string[]) => Promise<void>;
20223
20748
  isBookmarked: (article: Partial<import("@sinequa/atomic").Article>) => boolean;
20224
20749
  toggleBookmark: (article: import("@sinequa/atomic").Article) => Promise<void>;
20225
20750
  isFavoriteSearch: (search: Pick<SearchItem, "label" | "display">) => boolean;
@@ -20366,7 +20891,7 @@ export declare class QuickFiltersComponent {
20366
20891
  private readonly popover;
20367
20892
  protected readonly isOpen: import("@angular/core").Signal<boolean>;
20368
20893
  constructor();
20369
- protected readonly variant: import("@angular/core").Signal<"secondary" | "tertiary" | "none" | "primary" | "light-accent" | "accent" | null | undefined>;
20894
+ protected readonly variant: import("@angular/core").Signal<"none" | "primary" | "secondary" | "light-accent" | "accent" | "tertiary" | null | undefined>;
20370
20895
  protected readonly triggerClass: import("@angular/core").Signal<string>;
20371
20896
  /** What was just done, for the screen readers: kept here, as the list goes with the popover once a quick filter is applied. */
20372
20897
  protected readonly announcement: import("@angular/core").WritableSignal<string>;
@@ -20639,7 +21164,7 @@ export type SearchBoxTab = "suggestions" | "saved";
20639
21164
  */
20640
21165
  export declare class SearchBoxComponent {
20641
21166
  /** Scale of the field: `hero` for a home page (the prototype's pill), `medium` (36px) for the header of a results page. */
20642
- readonly size: import("@angular/core").InputSignal<"small" | "medium" | "large" | "hero" | null | undefined>;
21167
+ readonly size: import("@angular/core").InputSignal<"small" | "large" | "medium" | "hero" | null | undefined>;
20643
21168
  /** Shows the saved-search star once there is something to save. */
20644
21169
  readonly showSave: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
20645
21170
  /** The route a search leads to. */
@@ -20720,7 +21245,7 @@ export declare class SearchBoxComponent {
20720
21245
  relevanceTransforms?: import("@angular/core").Signal<string | undefined> | undefined;
20721
21246
  removeDuplicates?: import("@angular/core").Signal<boolean | undefined> | undefined;
20722
21247
  queryId?: import("@angular/core").Signal<string | undefined> | undefined;
20723
- aggregations?: import("@angular/core").Signal<Record<string, import("@sinequa/atomic").AggregationOptions> | string[] | undefined> | undefined;
21248
+ aggregations?: import("@angular/core").Signal<string[] | Record<string, import("@sinequa/atomic").AggregationOptions> | undefined> | undefined;
20724
21249
  orderBy?: import("@angular/core").Signal<string | undefined> | undefined;
20725
21250
  groupBy?: import("@angular/core").Signal<string | undefined> | undefined;
20726
21251
  neuralSearch?: import("@angular/core").Signal<boolean | undefined> | undefined;
@@ -20853,6 +21378,7 @@ export declare class SearchBoxComponent {
20853
21378
  enabled?: boolean;
20854
21379
  data?: string[];
20855
21380
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
21381
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
20856
21382
  };
20857
21383
  previewMultiConversion?: boolean;
20858
21384
  persistFiltersAcrossTabs?: boolean;
@@ -20895,6 +21421,7 @@ export declare class SearchBoxComponent {
20895
21421
  enabled?: boolean;
20896
21422
  data?: string[];
20897
21423
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
21424
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
20898
21425
  };
20899
21426
  previewMultiConversion?: boolean;
20900
21427
  persistFiltersAcrossTabs?: boolean;
@@ -20959,6 +21486,7 @@ export declare class SearchBoxComponent {
20959
21486
  enabled?: boolean;
20960
21487
  data?: string[];
20961
21488
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
21489
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
20962
21490
  };
20963
21491
  previewMultiConversion?: boolean;
20964
21492
  persistFiltersAcrossTabs?: boolean;
@@ -21053,6 +21581,7 @@ export declare class SearchBoxComponent {
21053
21581
  enabled?: boolean;
21054
21582
  data?: string[];
21055
21583
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
21584
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
21056
21585
  };
21057
21586
  previewMultiConversion?: boolean;
21058
21587
  persistFiltersAcrossTabs?: boolean;
@@ -21095,6 +21624,7 @@ export declare class SearchBoxComponent {
21095
21624
  enabled?: boolean;
21096
21625
  data?: string[];
21097
21626
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
21627
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
21098
21628
  };
21099
21629
  previewMultiConversion?: boolean;
21100
21630
  persistFiltersAcrossTabs?: boolean;
@@ -21131,14 +21661,15 @@ export declare class SearchBoxComponent {
21131
21661
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
21132
21662
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
21133
21663
  language?: import("@angular/core").Signal<string | undefined> | 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>;
21664
+ userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
21665
+ agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
21136
21666
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
21137
21667
  isDebugMode: import("@angular/core").Signal<boolean>;
21138
21668
  isDarkMode: import("@angular/core").Signal<boolean>;
21139
21669
  updateBookmarks: (bookmarks: import("@sinequa/atomic-angular").UserSettingsState["bookmarks"], auditEvents?: import("@sinequa/atomic").AuditEvents) => Promise<void>;
21140
21670
  bookmark: (article: import("@sinequa/atomic").Article, queryName?: string) => Promise<void>;
21141
21671
  unbookmark: (id: string) => Promise<void>;
21672
+ unbookmarkMany: (ids: string[]) => Promise<void>;
21142
21673
  isBookmarked: (article: Partial<import("@sinequa/atomic").Article>) => boolean;
21143
21674
  toggleBookmark: (article: import("@sinequa/atomic").Article) => Promise<void>;
21144
21675
  isFavoriteSearch: (search: Pick<SearchItem, "label" | "display">) => boolean;
@@ -21442,14 +21973,15 @@ export declare class RecentSearchesComponent {
21442
21973
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
21443
21974
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
21444
21975
  language?: import("@angular/core").Signal<string | undefined> | 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>;
21976
+ userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
21977
+ agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
21447
21978
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
21448
21979
  isDebugMode: import("@angular/core").Signal<boolean>;
21449
21980
  isDarkMode: import("@angular/core").Signal<boolean>;
21450
21981
  updateBookmarks: (bookmarks: import("@sinequa/atomic-angular").UserSettingsState["bookmarks"], auditEvents?: import("@sinequa/atomic").AuditEvents) => Promise<void>;
21451
21982
  bookmark: (article: import("@sinequa/atomic").Article, queryName?: string) => Promise<void>;
21452
21983
  unbookmark: (id: string) => Promise<void>;
21984
+ unbookmarkMany: (ids: string[]) => Promise<void>;
21453
21985
  isBookmarked: (article: Partial<import("@sinequa/atomic").Article>) => boolean;
21454
21986
  toggleBookmark: (article: import("@sinequa/atomic").Article) => Promise<void>;
21455
21987
  isFavoriteSearch: (search: Pick<SearchItem, "label" | "display">) => boolean;
@@ -21567,14 +22099,15 @@ export declare class SavedSearchPopover {
21567
22099
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
21568
22100
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
21569
22101
  language?: import("@angular/core").Signal<string | undefined> | 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>;
22102
+ userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
22103
+ agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
21572
22104
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
21573
22105
  isDebugMode: import("@angular/core").Signal<boolean>;
21574
22106
  isDarkMode: import("@angular/core").Signal<boolean>;
21575
22107
  updateBookmarks: (bookmarks: import("@sinequa/atomic-angular").UserSettingsState["bookmarks"], auditEvents?: import("@sinequa/atomic").AuditEvents) => Promise<void>;
21576
22108
  bookmark: (article: import("@sinequa/atomic").Article, queryName?: string) => Promise<void>;
21577
22109
  unbookmark: (id: string) => Promise<void>;
22110
+ unbookmarkMany: (ids: string[]) => Promise<void>;
21578
22111
  isBookmarked: (article: Partial<import("@sinequa/atomic").Article>) => boolean;
21579
22112
  toggleBookmark: (article: import("@sinequa/atomic").Article) => Promise<void>;
21580
22113
  isFavoriteSearch: (search: Pick<SearchItem, "label" | "display">) => boolean;
@@ -21663,14 +22196,15 @@ export declare class SavedSearchesComponent {
21663
22196
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
21664
22197
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
21665
22198
  language?: import("@angular/core").Signal<string | undefined> | 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>;
22199
+ userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
22200
+ agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
21668
22201
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
21669
22202
  isDebugMode: import("@angular/core").Signal<boolean>;
21670
22203
  isDarkMode: import("@angular/core").Signal<boolean>;
21671
22204
  updateBookmarks: (bookmarks: import("@sinequa/atomic-angular").UserSettingsState["bookmarks"], auditEvents?: import("@sinequa/atomic").AuditEvents) => Promise<void>;
21672
22205
  bookmark: (article: import("@sinequa/atomic").Article, queryName?: string) => Promise<void>;
21673
22206
  unbookmark: (id: string) => Promise<void>;
22207
+ unbookmarkMany: (ids: string[]) => Promise<void>;
21674
22208
  isBookmarked: (article: Partial<import("@sinequa/atomic").Article>) => boolean;
21675
22209
  toggleBookmark: (article: import("@sinequa/atomic").Article) => Promise<void>;
21676
22210
  isFavoriteSearch: (search: Pick<SearchItem, "label" | "display">) => boolean;
@@ -21837,7 +22371,7 @@ export declare class SettingsAccountPanelComponent {
21837
22371
  param9: import("@angular/core").Signal<string>;
21838
22372
  param10: import("@angular/core").Signal<string>;
21839
22373
  userOverrideActive: import("@angular/core").Signal<boolean>;
21840
- state: import("@angular/core").Signal<"error" | "loading" | "loaded" | "initial">;
22374
+ state: import("@angular/core").Signal<"error" | "initial" | "loading" | "loaded">;
21841
22375
  allowUserOverride: import("@angular/core").Signal<boolean>;
21842
22376
  isOverridingUser: import("@angular/core").Signal<boolean>;
21843
22377
  initials: import("@angular/core").Signal<string>;
@@ -21912,7 +22446,7 @@ export declare class SettingsAppearancePanelComponent {
21912
22446
  private readonly themeIcons;
21913
22447
  private readonly languageIcons;
21914
22448
  private readonly languageLabels;
21915
- protected readonly currentTheme: import("@angular/core").Signal<"light" | "dark" | "system">;
22449
+ protected readonly currentTheme: import("@angular/core").Signal<"dark" | "light" | "system">;
21916
22450
  protected readonly currentLanguage: import("@angular/core").Signal<string>;
21917
22451
  protected readonly themeLabel: (code: string | null) => string;
21918
22452
  protected readonly languageLabel: (code: string | null) => string;
@@ -21950,8 +22484,12 @@ export declare class SettingsShortcutsPanelComponent {
21950
22484
  static ɵfac: i0.ɵɵFactoryDeclaration<SettingsShortcutsPanelComponent, never>;
21951
22485
  static ɵcmp: i0.ɵɵComponentDeclaration<SettingsShortcutsPanelComponent, "settings-shortcuts-panel", never, {}, {}, never, never, true, never>;
21952
22486
  }
21953
- /** The two buckets of a `UserProfile`: the configured fields, and the free-form ones. */
21954
- export type UserProfileCategory = "data" | "customData";
22487
+ /**
22488
+ * The buckets of a `UserProfile`: the configured fields, the free-form ones, and the private free-form
22489
+ * ones. `privateCustomData` is only returned for the caller's own profile and only ever goes through the
22490
+ * private endpoints.
22491
+ */
22492
+ export type UserProfileCategory = "data" | "customData" | "privateCustomData";
21955
22493
  /**
21956
22494
  * Model of the profile form.
21957
22495
  *
@@ -21967,6 +22505,7 @@ export type UserProfileCategory = "data" | "customData";
21967
22505
  export interface UserProfileFormModel {
21968
22506
  data: Record<string, string>;
21969
22507
  customData: Record<string, string>;
22508
+ privateCustomData: Record<string, string>;
21970
22509
  }
21971
22510
  export declare class UserProfileFormComponent {
21972
22511
  /**
@@ -22001,7 +22540,7 @@ export declare class UserProfileFormComponent {
22001
22540
  param9: Signal<string>;
22002
22541
  param10: Signal<string>;
22003
22542
  userOverrideActive: Signal<boolean>;
22004
- state: Signal<"error" | "loading" | "loaded" | "initial">;
22543
+ state: Signal<"error" | "initial" | "loading" | "loaded">;
22005
22544
  allowUserOverride: Signal<boolean>;
22006
22545
  isOverridingUser: Signal<boolean>;
22007
22546
  initials: Signal<string>;
@@ -22089,6 +22628,7 @@ export declare class UserProfileFormComponent {
22089
22628
  enabled?: boolean;
22090
22629
  data?: string[];
22091
22630
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
22631
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
22092
22632
  };
22093
22633
  previewMultiConversion?: boolean;
22094
22634
  persistFiltersAcrossTabs?: boolean;
@@ -22131,6 +22671,7 @@ export declare class UserProfileFormComponent {
22131
22671
  enabled?: boolean;
22132
22672
  data?: string[];
22133
22673
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
22674
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
22134
22675
  };
22135
22676
  previewMultiConversion?: boolean;
22136
22677
  persistFiltersAcrossTabs?: boolean;
@@ -22195,6 +22736,7 @@ export declare class UserProfileFormComponent {
22195
22736
  enabled?: boolean;
22196
22737
  data?: string[];
22197
22738
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
22739
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
22198
22740
  };
22199
22741
  previewMultiConversion?: boolean;
22200
22742
  persistFiltersAcrossTabs?: boolean;
@@ -22289,6 +22831,7 @@ export declare class UserProfileFormComponent {
22289
22831
  enabled?: boolean;
22290
22832
  data?: string[];
22291
22833
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
22834
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
22292
22835
  };
22293
22836
  previewMultiConversion?: boolean;
22294
22837
  persistFiltersAcrossTabs?: boolean;
@@ -22331,6 +22874,7 @@ export declare class UserProfileFormComponent {
22331
22874
  enabled?: boolean;
22332
22875
  data?: string[];
22333
22876
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
22877
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
22334
22878
  };
22335
22879
  previewMultiConversion?: boolean;
22336
22880
  persistFiltersAcrossTabs?: boolean;
@@ -22368,7 +22912,7 @@ export declare class UserProfileFormComponent {
22368
22912
  * pairs for contrast (it is the `light-accent` button): a neutral background with a neutral text was
22369
22913
  * unreadable.
22370
22914
  */
22371
- protected readonly chipClass = "inline-flex items-center rounded-(--radius-rounded) bg-(--bg-accent-base-alt) px-(--spacing-2xs) text-(length:--size-sm) font-medium text-(--font-accent-base)";
22915
+ protected readonly chipClass = "inline-flex items-center gap-(--spacing-3xs) rounded-(--radius-rounded) bg-(--bg-accent-base-alt) px-(--spacing-2xs) text-(length:--size-sm) font-medium text-(--font-accent-base)";
22372
22916
  /**
22373
22917
  * Polite announcement of what just happened — entering edit mode, saving, cancelling, deleting.
22374
22918
  *
@@ -22386,17 +22930,26 @@ export declare class UserProfileFormComponent {
22386
22930
  protected readonly formKeys: Signal<string[]>;
22387
22931
  protected readonly allowProfilePhoto: Signal<boolean>;
22388
22932
  private readonly customDataConfig;
22933
+ private readonly privateCustomDataConfig;
22389
22934
  /**
22390
- * The rows of the free-form properties.
22935
+ * The rows of the free-form properties of a bucket.
22391
22936
  *
22392
- * Users only edit values, and the structure is the administrator's, in the custom JSON. So a property
22393
- * that is an object — by its default, or by what the profile holds — is not one row but one row per
22394
- * leaf (`workingHours › start`), each read-only: the form shows the values without any way to change
22395
- * the shape. A scalar is an editable row, and an array a read-only one.
22937
+ * A property is a `/`-separated path (`agent/favorites`), and the structure is the administrator's, in
22938
+ * the custom JSON. A property that is an object — by its default, or by what the profile holds — is not
22939
+ * one row but one row per leaf (`workingHours › start`). A leaf and a scalar are editable rows, and an
22940
+ * array a read-only one. A row is written at its path, the rest of the bucket untouched.
22396
22941
  */
22942
+ private rowsOf;
22397
22943
  private readonly customRows;
22944
+ private readonly privateRows;
22398
22945
  protected readonly customData: Signal<string[]>;
22946
+ protected readonly privateCustomData: Signal<string[]>;
22399
22947
  private readonly customRowIndex;
22948
+ private readonly privateRowIndex;
22949
+ /** The row of a free-form property; `undefined` for a `data` key. */
22950
+ private rowOf;
22951
+ /** Where the profile holds a property, from the root of its bucket. */
22952
+ private pathOf;
22400
22953
  /**
22401
22954
  * The editable properties, flattened in display order — one row per entry.
22402
22955
  *
@@ -22411,19 +22964,33 @@ export declare class UserProfileFormComponent {
22411
22964
  translated: boolean;
22412
22965
  }[]>;
22413
22966
  /**
22414
- * The rows grouped in the two cards of the form — the configured fields, then the free-form ones.
22415
- * A group with no row is left out, so a profile without custom properties shows a single card.
22967
+ * The rows grouped in the cards of the form — the configured fields, the free-form ones, then the private
22968
+ * ones. A group with no row is left out, so a profile without custom properties shows a single card, and
22969
+ * one without `privateCustomData` shows no private card. `visibility` says who can see the card's values.
22416
22970
  */
22417
22971
  protected readonly sections: Signal<{
22418
- id: string;
22972
+ id: "information" | "preferences" | "private";
22973
+ visibility: "public" | "private";
22419
22974
  rows: {
22420
22975
  category: UserProfileCategory;
22421
22976
  key: string;
22422
22977
  translated: boolean;
22423
22978
  }[];
22424
22979
  }[]>;
22980
+ /** Whether the sections are tabs: a profile with a single block shows its card alone, with no tab. */
22981
+ protected readonly tabbed: Signal<boolean>;
22982
+ /**
22983
+ * The tab being looked at, one of the `sections()`. It falls back on the first one when the section it held
22984
+ * is gone (the configuration changed), and is otherwise kept.
22985
+ */
22986
+ protected readonly activeSection: import("@angular/core").WritableSignal<string | undefined>;
22425
22987
  protected readonly initials: Signal<string>;
22426
22988
  protected readonly username: Signal<string | null>;
22989
+ /**
22990
+ * The properties deleted since the profile was loaded, `"<category>.<key>"`, until they are saved again. Their
22991
+ * local value is an empty string, so the value alone cannot tell "deleted" from "saved as empty".
22992
+ */
22993
+ private readonly deletedProperties;
22427
22994
  /** Id of the property being edited, `"<category>.<key>"` — at most one at a time. */
22428
22995
  protected readonly propertyToEdit: import("@angular/core").WritableSignal<string | undefined>;
22429
22996
  readonly changingPassword: import("@angular/core").WritableSignal<boolean>;
@@ -22463,6 +23030,11 @@ export declare class UserProfileFormComponent {
22463
23030
  protected showError(field: FieldTree<string> | undefined): boolean;
22464
23031
  /** Maps the first validation error to its translation key (`userProfile.errors.required`, …). */
22465
23032
  protected errorKey(field: FieldTree<string> | undefined): string;
23033
+ /**
23034
+ * Switches tab. An edit in progress is discarded: its field is about to be hidden, and a draft left behind a
23035
+ * tab would still hold the form in edit mode.
23036
+ */
23037
+ protected onSectionChange(id: string | undefined): void;
22466
23038
  /** Whether `key` is the property currently being edited. */
22467
23039
  protected isEditing(category: UserProfileCategory, key: string): boolean;
22468
23040
  /**
@@ -22474,7 +23046,7 @@ export declare class UserProfileFormComponent {
22474
23046
  protected getDataValue(category: UserProfileCategory, key: string): string | undefined;
22475
23047
  /** The default of a custom property, shown while the profile holds no value for it. */
22476
23048
  private defaultValue;
22477
- /** Whether a row is a leaf of an object: shown, never edited. */
23049
+ /** Whether a row is nested: a leaf of an object, or a `/`-separated path. */
22478
23050
  protected isLeaf(category: UserProfileCategory, key: string): boolean;
22479
23051
  /** What the profile holds for a property — at its path, for a leaf. */
22480
23052
  private storedValue;
@@ -22485,8 +23057,11 @@ export declare class UserProfileFormComponent {
22485
23057
  protected isBoolean(category: UserProfileCategory, key: string): boolean;
22486
23058
  /** Whether a boolean property is on. */
22487
23059
  protected booleanValue(category: UserProfileCategory, key: string): boolean;
22488
- /** Whether a property holds an array, which the form shows but never edits. */
22489
- protected isReadOnlyValue(category: UserProfileCategory, key: string): boolean;
23060
+ /**
23061
+ * Whether a property holds an array. It is shown as tags and edited as JSON, in a text area, since its items
23062
+ * can be anything: values, objects, arrays.
23063
+ */
23064
+ protected isArray(category: UserProfileCategory, key: string): boolean;
22490
23065
  /** The tags of an array property: a string as is, anything else as its JSON, a repeated value once. */
22491
23066
  protected arrayTags(category: UserProfileCategory, key: string): string[];
22492
23067
  /** The stored value of a property, else its default — what the field shows when it is not being edited. */
@@ -22529,6 +23104,8 @@ export declare class UserProfileFormComponent {
22529
23104
  * (Transloco answers a missing entry with the path it was asked for).
22530
23105
  */
22531
23106
  protected labelFor(category: UserProfileCategory, key: string): string;
23107
+ /** A free-form key, translated under `userProfile.<category>.<key>` when the application provides it; the key otherwise. */
23108
+ private translatedName;
22532
23109
  /** Whether a property shows its default: the profile holds no value for it and the administrator gave one. */
22533
23110
  protected isDefault(category: UserProfileCategory, key: string): boolean;
22534
23111
  /** Whether a property has just been saved — its row shows a confirmation for a few seconds. */
@@ -22577,12 +23154,26 @@ export declare class UserProfileFormComponent {
22577
23154
  * back before the next render never changes it.
22578
23155
  */
22579
23156
  protected onToggleBoolean(category: UserProfileCategory, key: string, checked: boolean, toggle: SwitchComponent): Promise<void>;
23157
+ /** A path as the API takes it: the bare name for one segment, the segments otherwise (a name may hold a `/`). */
23158
+ private endpointPath;
22580
23159
  /**
22581
23160
  * Patches a single property and folds the response back into the stored profile.
22582
23161
  *
23162
+ * The server does not create the nodes on the way (it answers 404): the write is made at the first missing
23163
+ * one, carrying the rest of the path (see `writeTarget`). A private property only goes through the private
23164
+ * endpoint, never the public one.
23165
+ *
22583
23166
  * @returns whether the property was persisted.
22584
23167
  */
22585
23168
  private patchProperty;
23169
+ /**
23170
+ * Folds the answer of a PATCH back into the stored profile, so the form shows what was just saved.
23171
+ *
23172
+ * The answer is the value alone — the string for `data`, any JSON value for `customData` — since the
23173
+ * profile routes answer with the addressed resource and nothing else (ES-34373). A server that still
23174
+ * answers with the whole profile (`{ data, customData, … }`) keeps working: it is merged as before.
23175
+ */
23176
+ private foldSavedValue;
22586
23177
  /**
22587
23178
  * Reads the picked image and stores it as the profile photo.
22588
23179
  *
@@ -22607,6 +23198,17 @@ export declare class UserProfileFormComponent {
22607
23198
  * @returns The guard function.
22608
23199
  */
22609
23200
  export declare function AuthGuard(): CanActivateFn;
23201
+ /**
23202
+ * Returns a guard function that lets a route match only when the Agent store is available
23203
+ * (`features.isAvailable.agentStore` of `GET /api/v2/version`, see {@link LicenseCapabilitiesService}).
23204
+ *
23205
+ * It is a `canMatch` guard: when the store is not available, the router falls through to the next route
23206
+ * that matches the URL (typically the catch-all), so neither the route nor its lazy chunk is reachable.
23207
+ * It only reads a signal: load it first with `LicenseCapabilitiesService.load()`, before the first
23208
+ * navigation (an application initializer), otherwise the capability reads as `false`.
23209
+ * @returns The guard function.
23210
+ */
23211
+ export declare function AgentStoreGuard(): CanMatchFn;
22610
23212
  /**
22611
23213
  * Intercepts HTTP requests to add audit information if the request URL includes the API path.
22612
23214
  *
@@ -22809,6 +23411,7 @@ export declare class SourceIconPipe implements PipeTransform {
22809
23411
  enabled?: boolean;
22810
23412
  data?: string[];
22811
23413
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
23414
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
22812
23415
  };
22813
23416
  previewMultiConversion?: boolean;
22814
23417
  persistFiltersAcrossTabs?: boolean;
@@ -22851,6 +23454,7 @@ export declare class SourceIconPipe implements PipeTransform {
22851
23454
  enabled?: boolean;
22852
23455
  data?: string[];
22853
23456
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
23457
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
22854
23458
  };
22855
23459
  previewMultiConversion?: boolean;
22856
23460
  persistFiltersAcrossTabs?: boolean;
@@ -22915,6 +23519,7 @@ export declare class SourceIconPipe implements PipeTransform {
22915
23519
  enabled?: boolean;
22916
23520
  data?: string[];
22917
23521
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
23522
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
22918
23523
  };
22919
23524
  previewMultiConversion?: boolean;
22920
23525
  persistFiltersAcrossTabs?: boolean;
@@ -23009,6 +23614,7 @@ export declare class SourceIconPipe implements PipeTransform {
23009
23614
  enabled?: boolean;
23010
23615
  data?: string[];
23011
23616
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
23617
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
23012
23618
  };
23013
23619
  previewMultiConversion?: boolean;
23014
23620
  persistFiltersAcrossTabs?: boolean;
@@ -23051,6 +23657,7 @@ export declare class SourceIconPipe implements PipeTransform {
23051
23657
  enabled?: boolean;
23052
23658
  data?: string[];
23053
23659
  customData?: import("@sinequa/atomic-angular").CustomDataEntry[];
23660
+ privateCustomData?: import("@sinequa/atomic-angular").CustomDataEntry[];
23054
23661
  };
23055
23662
  previewMultiConversion?: boolean;
23056
23663
  persistFiltersAcrossTabs?: boolean;
@@ -23258,7 +23865,7 @@ export declare function injectAtomicClient(): AtomicClient;
23258
23865
  *
23259
23866
  * Only HTTP statuses `400`, `403`, `500` and `503` produce a toast, plus the explicit "Cannot override
23260
23867
  * user" message for an impersonation rejected with a `401`. `404`, `429`, `502`, `504` and any failure
23261
- * without an HTTP response (network error) stay silent, as does everything on `api/v1/preview` and a
23868
+ * without an HTTP response (network error) stay silent, as do `api/v1/preview` and `api/v2/security/password/change` (surfaced by their own UI) and a
23262
23869
  * `400` on `api/v2/user-profile`.
23263
23870
  *
23264
23871
  * The library renders nothing: `notify.error(...)` only dispatches a `notification` `CustomEvent` on
@@ -23439,10 +24046,14 @@ export type SessionExpiryOptions = {
23439
24046
  /**
23440
24047
  * Action of the "about to expire" notification: lets the user keep working without losing the session.
23441
24048
  *
23442
- * Defaults to one light authenticated request (`principal`). The platform has no refresh endpoint: it only
23443
- * renews the token as a side effect of a request, and only when the server's JSON Web Token auto-refresh
23444
- * is enabled and the token's maximum lifetime is not reached. When the expiry did not move afterwards,
23445
- * `onReconnect` runs instead, so the action never leaves the user believing the session was extended.
24049
+ * Defaults to renewing the session through `security.webtoken`: it needs no credentials as long as the JSON
24050
+ * Web Token cookie is still valid, and renews it whatever the way the user signed in. It cannot revive a
24051
+ * session that already expired, and a bearer access token whose JSON method rules exclude `webtoken` is
24052
+ * refused. In both cases, and when the server returns no token, one light authenticated request
24053
+ * (`principal`) is tried instead: the platform then only renews the token as a side effect of a request,
24054
+ * and only when the server's JSON Web Token auto-refresh is enabled and the token's maximum lifetime is not
24055
+ * reached. When the expiry did not move afterwards, `onReconnect` runs, so the action never leaves the user
24056
+ * believing the session was extended.
23446
24057
  *
23447
24058
  * A custom handler replaces all of this, including that fallback.
23448
24059
  */