@forgeroute/ui 0.4.40 → 0.4.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,8 @@
1
1
  import * as i0 from "@angular/core";
2
2
  import { EnvironmentProviders, InjectionToken, OnDestroy, OnInit, Signal, TemplateRef, WritableSignal } from "@angular/core";
3
3
  import { UrlTree } from "@angular/router";
4
- import { AbstractControl, ControlValueAccessor, FormControl, ValidationErrors, Validator } from "@angular/forms";
5
4
  import { Observable } from "rxjs";
5
+ import { AbstractControl, ControlValueAccessor, FormControl, ValidationErrors, Validator } from "@angular/forms";
6
6
  import { HttpInterceptorFn } from "@angular/common/http";
7
7
  import { SafeHtml } from "@angular/platform-browser";
8
8
  export interface ForgerouteConfig {
@@ -1088,7 +1088,7 @@ export declare class SelectComponent implements ControlValueAccessor, Validator,
1088
1088
  readonly error: import("@angular/core").InputSignal<string>;
1089
1089
  /** Reveal the built-in error messages now (e.g. after a failed Save click), without waiting for blur. */
1090
1090
  readonly showErrors: import("@angular/core").InputSignal<boolean>;
1091
- readonly size: import("@angular/core").InputSignal<"default" | "sm">;
1091
+ readonly size: import("@angular/core").InputSignal<"sm" | "default">;
1092
1092
  readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
1093
1093
  private readonly _cvaDisabled;
1094
1094
  protected readonly disabled: import("@angular/core").Signal<boolean>;
@@ -1222,6 +1222,8 @@ export interface ImportExportConfig {
1222
1222
  importFields?: ImportFieldDef[];
1223
1223
  columnAliases?: Record<string, string[]>;
1224
1224
  templateSampleRows?: string[][];
1225
+ /** Text of the template download button inside the import window, e.g. "Download Cases CSV Template" (default: "Download template"). */
1226
+ templateLabel?: string;
1225
1227
  /** When true, the Export button appears in the More Actions dropdown instead of as a standalone button. */
1226
1228
  exportInMoreActions?: boolean;
1227
1229
  }
@@ -1229,12 +1231,37 @@ interface ImportError {
1229
1231
  row: number;
1230
1232
  message: string;
1231
1233
  }
1234
+ export interface ImportSubmitRequest {
1235
+ file: File | null;
1236
+ records: Record<string, string>[];
1237
+ mapping: Record<string, string>;
1238
+ }
1239
+ export interface ImportSubmitResult {
1240
+ imported: number;
1241
+ errors?: {
1242
+ row: number;
1243
+ message: string;
1244
+ }[];
1245
+ warnings?: {
1246
+ row: number;
1247
+ message: string;
1248
+ }[];
1249
+ }
1232
1250
  type ImportStep = 'source' | 'upload' | 'mapping' | 'preview' | 'result';
1233
1251
  export declare class ImportExportComponent {
1234
1252
  readonly _configInput: import("@angular/core").InputSignal<ImportExportConfig | null>;
1235
1253
  readonly importSources: import("@angular/core").InputSignal<ImportSource[] | undefined>;
1236
1254
  readonly exportParams: import("@angular/core").InputSignal<Record<string, string>>;
1237
1255
  readonly exportOnly: import("@angular/core").InputSignal<boolean>;
1256
+ /** The window's footer has one Close button that closes it at once, never Back / Cancel (the setup wizard). */
1257
+ readonly closeOnly: import("@angular/core").InputSignal<boolean>;
1258
+ /**
1259
+ * Replaces the built-in `POST importEndpoint { records }` for an app whose import runs differently (e.g. the server reads the CSV file itself):
1260
+ * receives the chosen file, the parsed rows (field key -> value) and the mapping (field key -> CSV column) and answers the result.
1261
+ */
1262
+ readonly submit: import("@angular/core").InputSignal<((request: ImportSubmitRequest) => Observable<ImportSubmitResult>) | null>;
1263
+ /** Fired when the user presses Done after an import, with what the import answered (also `imported`). */
1264
+ readonly finished: import("@angular/core").OutputEmitterRef<ImportSubmitResult>;
1238
1265
  readonly imported: import("@angular/core").OutputEmitterRef<void>;
1239
1266
  config: ImportExportConfig;
1240
1267
  private readonly http;
@@ -1273,6 +1300,7 @@ export declare class ImportExportComponent {
1273
1300
  closeImport(): void;
1274
1301
  finishImport(): void;
1275
1302
  onFileChange(event: Event): void;
1303
+ private csvFile;
1276
1304
  private readCsvFile;
1277
1305
  private autoMap;
1278
1306
  get canSubmit(): boolean;
@@ -1308,7 +1336,18 @@ export declare class ImportExportComponent {
1308
1336
  "required": false;
1309
1337
  "isSignal": true;
1310
1338
  };
1339
+ "closeOnly": {
1340
+ "alias": "closeOnly";
1341
+ "required": false;
1342
+ "isSignal": true;
1343
+ };
1344
+ "submit": {
1345
+ "alias": "submit";
1346
+ "required": false;
1347
+ "isSignal": true;
1348
+ };
1311
1349
  }, {
1350
+ "finished": "finished";
1312
1351
  "imported": "imported";
1313
1352
  }, never, never, true, never>;
1314
1353
  }
@@ -2167,7 +2206,7 @@ export declare class ModalComponent implements OnInit, OnDestroy {
2167
2206
  readonly title: import("@angular/core").InputSignal<string>;
2168
2207
  readonly description: import("@angular/core").InputSignal<string>;
2169
2208
  readonly maxWidth: import("@angular/core").InputSignal<string>;
2170
- readonly bodyOverflow: import("@angular/core").InputSignal<"hidden" | "auto" | "visible">;
2209
+ readonly bodyOverflow: import("@angular/core").InputSignal<"hidden" | "visible" | "auto">;
2171
2210
  /** `data-testid` of the dialog element itself (the host `<ui-modal>` is always in the page, the dialog only while open). None when empty. */
2172
2211
  readonly dialogTestId: import("@angular/core").InputSignal<string>;
2173
2212
  /** Hides the header X button (e.g. while a request is running). Escape and a backdrop click still close unless `closable` is false. */
@@ -2551,7 +2590,7 @@ export declare class AudioPlayerComponent {
2551
2590
  /** Accessible name of the player. */
2552
2591
  readonly ariaLabel: import("@angular/core").InputSignal<string>;
2553
2592
  /** How much to load before play: 'metadata' (default), 'auto' or 'none'. */
2554
- readonly preload: import("@angular/core").InputSignal<"none" | "auto" | "metadata">;
2593
+ readonly preload: import("@angular/core").InputSignal<"none" | "metadata" | "auto">;
2555
2594
  /** Fires when the browser can't load or decode the source. */
2556
2595
  readonly playbackError: import("@angular/core").OutputEmitterRef<void>;
2557
2596
  protected readonly failed: import("@angular/core").WritableSignal<boolean>;
@@ -2805,7 +2844,7 @@ export declare class CheckboxComponent implements ControlValueAccessor, Validato
2805
2844
  * clicking it still toggles the box - e.g. a product name that is both the heading of its card and the label of its checkbox.
2806
2845
  * Default null: plain label text, exactly as before. Single mode only.
2807
2846
  */
2808
- readonly headingLevel: import("@angular/core").InputSignal<1 | 2 | 3 | 4 | 5 | 6 | null>;
2847
+ readonly headingLevel: import("@angular/core").InputSignal<2 | 1 | 5 | 3 | 4 | 6 | null>;
2809
2848
  readonly indeterminate: import("@angular/core").InputSignal<boolean>;
2810
2849
  readonly checked: import("@angular/core").ModelSignal<boolean>;
2811
2850
  /**
@@ -3716,7 +3755,7 @@ export declare class PhoneNumberPickerComponent {
3716
3755
  protected readonly modeCtl: FormControl<string>;
3717
3756
  protected readonly zipCtl: FormControl<string>;
3718
3757
  protected readonly areaCtl: FormControl<string>;
3719
- protected readonly step: import("@angular/core").WritableSignal<1 | 2 | 3>;
3758
+ protected readonly step: import("@angular/core").WritableSignal<2 | 1 | 3>;
3720
3759
  protected readonly mode: import("@angular/core").WritableSignal<PhoneNumberSearchMode>;
3721
3760
  private readonly _zip;
3722
3761
  private readonly _area;
@@ -3830,7 +3869,7 @@ export declare class ButtonComponent {
3830
3869
  * `ghost-start`: a ghost button for list / section toggles - a full-width row with its content aligned to the start, transparent
3831
3870
  * background, hover tint and the normal focus ring. Pair it with `ariaExpanded` / `ariaPressed`; the label may contain a heading element.
3832
3871
  */
3833
- readonly variant: import("@angular/core").InputSignal<"primary" | "secondary" | "danger" | "warning" | "link" | "ghost" | "ghost-start" | "tab" | "icon" | "icon-danger">;
3872
+ readonly variant: import("@angular/core").InputSignal<"link" | "primary" | "secondary" | "danger" | "warning" | "ghost" | "ghost-start" | "tab" | "icon" | "icon-danger">;
3834
3873
  /** Renders an anchor to this route instead of a button (use with `variant="link"` for an inline text link). `['/settings']` or `'/settings'`. While `disabled` or `loading` it renders a non-clickable `<span role="link" aria-disabled>` with no href (like `href`). */
3835
3874
  readonly routerLink: import("@angular/core").InputSignal<string | readonly unknown[] | null>;
3836
3875
  /** Query params of the `routerLink` (e.g. `{ section: 'deal-defaults' }`). */
@@ -3851,7 +3890,7 @@ export declare class ButtonComponent {
3851
3890
  */
3852
3891
  readonly href: import("@angular/core").InputSignal<string | null>;
3853
3892
  /** Where to open the `href` (`_blank` = a new tab). */
3854
- readonly target: import("@angular/core").InputSignal<"_self" | "_blank" | "_parent" | "_top" | null>;
3893
+ readonly target: import("@angular/core").InputSignal<"_blank" | "_self" | "_parent" | "_top" | null>;
3855
3894
  /** `rel` of the `href` link. A `_blank` target always gets `noopener noreferrer` added. */
3856
3895
  readonly rel: import("@angular/core").InputSignal<string | null>;
3857
3896
  /** The href when it is allowed (http, https, mailto, tel, sms or a relative URL), else null. */
@@ -3876,7 +3915,7 @@ export declare class ButtonComponent {
3876
3915
  readonly color: import("@angular/core").InputSignal<string | undefined>;
3877
3916
  readonly active: import("@angular/core").InputSignal<boolean>;
3878
3917
  readonly size: import("@angular/core").InputSignal<"sm" | "md" | "lg" | "xs">;
3879
- readonly type: import("@angular/core").InputSignal<"reset" | "submit" | "button">;
3918
+ readonly type: import("@angular/core").InputSignal<"button" | "reset" | "submit">;
3880
3919
  readonly disabled: import("@angular/core").InputSignal<boolean>;
3881
3920
  readonly loading: import("@angular/core").InputSignal<boolean>;
3882
3921
  readonly fullWidth: import("@angular/core").InputSignal<boolean>;
@@ -4363,7 +4402,7 @@ export declare class ImportSourceGridComponent {
4363
4402
  /** The `value` of the picked source (highlighted). `tile` only: the `card` appearance does not keep a selection. */
4364
4403
  readonly selected: import("@angular/core").InputSignal<string>;
4365
4404
  /** `tile`: the compact buttons of the import window. `card`: one `ui-detail-card` per source with its own select button (used on a page). */
4366
- readonly appearance: import("@angular/core").InputSignal<"card" | "tile">;
4405
+ readonly appearance: import("@angular/core").InputSignal<"tile" | "card">;
4367
4406
  /** `card`: disables every card's button (for example while the page is saving). */
4368
4407
  readonly disabled: import("@angular/core").InputSignal<boolean>;
4369
4408
  /** `card`: the text of each card's button. */
@@ -4672,7 +4711,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
4672
4711
  readonly passwordRequirements: import("@angular/core").InputSignal<boolean>;
4673
4712
  /** Rules for `passwordRequirements`; default = the library's five rules (8+ characters, upper, lower, digit, special). */
4674
4713
  readonly passwordRules: import("@angular/core").InputSignal<readonly PasswordRule[] | undefined>;
4675
- readonly type: import("@angular/core").InputSignal<"number" | "text" | "email" | "tel" | "password" | "url">;
4714
+ readonly type: import("@angular/core").InputSignal<"number" | "text" | "email" | "password" | "tel" | "url">;
4676
4715
  readonly maxlength: import("@angular/core").InputSignal<number | undefined>;
4677
4716
  readonly required: import("@angular/core").InputSignal<boolean>;
4678
4717
  readonly autocomplete: import("@angular/core").InputSignal<string>;
@@ -4745,7 +4784,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
4745
4784
  protected readonly _stepAttr: import("@angular/core").Signal<string | null>;
4746
4785
  protected readonly _revealable: import("@angular/core").Signal<boolean>;
4747
4786
  protected readonly _shown: import("@angular/core").WritableSignal<boolean>;
4748
- protected readonly _inputType: import("@angular/core").Signal<"number" | "text" | "email" | "tel" | "password" | "url">;
4787
+ protected readonly _inputType: import("@angular/core").Signal<"number" | "text" | "email" | "password" | "tel" | "url">;
4749
4788
  protected readonly _eyePath: string;
4750
4789
  protected readonly _eyeOffPath: string;
4751
4790
  protected readonly _showRequirements: import("@angular/core").Signal<boolean>;
@@ -6296,7 +6335,7 @@ export declare class FormSectionComponent {
6296
6335
  }, {}, never, ["*"], true, never>;
6297
6336
  }
6298
6337
  export declare class FormRowComponent {
6299
- readonly cols: import("@angular/core").InputSignal<1 | 2 | 3 | 4>;
6338
+ readonly cols: import("@angular/core").InputSignal<2 | 1 | 3 | 4>;
6300
6339
  static ɵfac: i0.ɵɵFactoryDeclaration<FormRowComponent, never>;
6301
6340
  static ɵcmp: i0.ɵɵComponentDeclaration<FormRowComponent, "ui-form-row", never, {
6302
6341
  "cols": {
@@ -6313,7 +6352,7 @@ export declare class FormRowComponent {
6313
6352
  * child simply takes the full width. Keep a numeric span within the row's `cols` (use `all` for the whole row).
6314
6353
  */
6315
6354
  export declare class FormColSpanDirective {
6316
- readonly uiColSpan: import("@angular/core").InputSignal<"" | "2" | "3" | 2 | 3 | "all">;
6355
+ readonly uiColSpan: import("@angular/core").InputSignal<"" | 2 | "2" | "3" | 3 | "all">;
6317
6356
  protected readonly _class: import("@angular/core").Signal<string>;
6318
6357
  static ɵfac: i0.ɵɵFactoryDeclaration<FormColSpanDirective, never>;
6319
6358
  static ɵdir: i0.ɵɵDirectiveDeclaration<FormColSpanDirective, "[uiColSpan]", never, {
@@ -7599,6 +7638,8 @@ export declare class AlertComponent {
7599
7638
  * Default false: the body is a flex row with a gap, exactly as before (use it for text plus a button).
7600
7639
  */
7601
7640
  readonly inline: import("@angular/core").InputSignal<boolean>;
7641
+ /** The box fills the height of its parent cell (two alerts in one grid row get the same height whatever their text length). Default false. */
7642
+ readonly fill: import("@angular/core").InputSignal<boolean>;
7602
7643
  readonly dismissed: import("@angular/core").OutputEmitterRef<void>;
7603
7644
  static ɵfac: i0.ɵɵFactoryDeclaration<AlertComponent, never>;
7604
7645
  static ɵcmp: i0.ɵɵComponentDeclaration<AlertComponent, "ui-alert", never, {
@@ -7637,6 +7678,11 @@ export declare class AlertComponent {
7637
7678
  "required": false;
7638
7679
  "isSignal": true;
7639
7680
  };
7681
+ "fill": {
7682
+ "alias": "fill";
7683
+ "required": false;
7684
+ "isSignal": true;
7685
+ };
7640
7686
  }, {
7641
7687
  "dismissed": "dismissed";
7642
7688
  }, never, ["*"], true, never>;
@@ -9247,7 +9293,7 @@ export declare class DetailCardComponent {
9247
9293
  /** true (default) = the title is displayed in capitals (CSS only); false = shown as written. The text, aria-label and heading name are never changed. */
9248
9294
  readonly uppercaseTitle: import("@angular/core").InputSignal<boolean>;
9249
9295
  /** 1-6 makes the title a real heading for screen readers (role=heading, aria-level); null keeps it plain text. */
9250
- readonly headingLevel: import("@angular/core").InputSignal<1 | 2 | 3 | 4 | 5 | 6 | null>;
9296
+ readonly headingLevel: import("@angular/core").InputSignal<2 | 1 | 5 | 3 | 4 | 6 | null>;
9251
9297
  /** Optional id for the title text; the card is then labelled by it. Without it the title is the card's aria-label. */
9252
9298
  readonly titleId: import("@angular/core").InputSignal<string>;
9253
9299
  /** Accessible name of the card when the header gives none (no header, or no title). A visible title wins; blank = no name. */
@@ -9466,6 +9512,55 @@ export declare class DividerComponent {
9466
9512
  };
9467
9513
  }, {}, never, never, true, never>;
9468
9514
  }
9515
+ export type FixedFooterAlign = 'start' | 'center' | 'end' | 'between';
9516
+ /**
9517
+ * A footer bar fixed to the bottom of the page: it stays visible while the page scrolls, sits flush with the bottom of the viewport
9518
+ * and spans the full width of the content area (from the side nav to the end of the screen). Put it as the LAST child of the page:
9519
+ *
9520
+ * <div class="settings-page">
9521
+ * ...the page content...
9522
+ * <ui-fixed-footer>
9523
+ * <ui-button variant="primary" (click)="save()">Save All Settings</ui-button>
9524
+ * </ui-fixed-footer>
9525
+ * </div>
9526
+ *
9527
+ * How it works: the bar is `position: sticky` at the bottom of the scrolling page. Inside `ui-app-shell` the content area is padded
9528
+ * (24px / 16px / 12px by width) and the shell publishes that padding as `--shell-content-padding`; the footer cancels it with negative
9529
+ * margins and a negative `bottom`, so it reaches the viewport edges instead of stopping inside the padding. Outside the shell the
9530
+ * variable is unset (0px) and the bar simply sticks to the bottom of its scrolling parent. Nothing else needs to be set up.
9531
+ *
9532
+ * Inputs:
9533
+ * - `align` (default `end`): where the projected content sits: start | center | end | between.
9534
+ * - `ariaLabel` (default `Page actions`): the accessible name of the bar (a labelled region).
9535
+ * - `elevated` (default true): the soft shadow above the bar; false = just the top border.
9536
+ * Theming by CSS custom properties: `--ui-footer-bg` (white), `--ui-footer-border` (#e2e8f0), `--ui-footer-pad-y` (20px; 16px up to 1024px, 14px up to 480px).
9537
+ */
9538
+ export declare class FixedFooterComponent {
9539
+ /** Where the projected content sits in the bar. */
9540
+ readonly align: import("@angular/core").InputSignal<FixedFooterAlign>;
9541
+ /** Accessible name of the bar. */
9542
+ readonly ariaLabel: import("@angular/core").InputSignal<string>;
9543
+ /** The soft shadow above the bar (false = only the top border). */
9544
+ readonly elevated: import("@angular/core").InputSignal<boolean>;
9545
+ static ɵfac: i0.ɵɵFactoryDeclaration<FixedFooterComponent, never>;
9546
+ static ɵcmp: i0.ɵɵComponentDeclaration<FixedFooterComponent, "ui-fixed-footer", never, {
9547
+ "align": {
9548
+ "alias": "align";
9549
+ "required": false;
9550
+ "isSignal": true;
9551
+ };
9552
+ "ariaLabel": {
9553
+ "alias": "ariaLabel";
9554
+ "required": false;
9555
+ "isSignal": true;
9556
+ };
9557
+ "elevated": {
9558
+ "alias": "elevated";
9559
+ "required": false;
9560
+ "isSignal": true;
9561
+ };
9562
+ }, {}, never, ["*"], true, never>;
9563
+ }
9469
9564
  /** One column (stage) of a [ui-board]. `items` are the host's own records; the board never reads their fields. */
9470
9565
  export interface BoardColumn<T = unknown> {
9471
9566
  /** Unique id of the column (the stage key); reported in `from` / `to` of a move. */
@@ -11313,12 +11408,13 @@ export interface IntegrationPlainText {
11313
11408
  export declare function integrationPlainText(html: string): IntegrationPlainText;
11314
11409
  /**
11315
11410
  * How a connect button for an integration works.
11316
- * - `oauth`: GET `authorizeEndpoint` answers `{ url }` (or `{ authUrl }`) and the browser goes there (QuickBooks, Slack, Gmail, Outlook, Google / Outlook calendar, Stripe, Square).
11411
+ * - `oauth`: GET `authorizeEndpoint` answers `{ url }` (or `{ authUrl }`) and the browser goes there (in a NEW tab with `newTab: true`, opened inside the click so popup blockers allow it, else in this tab) (QuickBooks, Slack, Gmail, Outlook, Google / Outlook calendar, Stripe, Square).
11317
11412
  * - `area-code`: asks for a US area code and POSTs `{ areaCode }` to `connectEndpoint` (Twilio buys a number that way); the status is reloaded after.
11318
11413
  */
11319
11414
  export type SetupIntegrationConnect = {
11320
11415
  type: 'oauth';
11321
11416
  authorizeEndpoint: string;
11417
+ newTab?: boolean;
11322
11418
  } | {
11323
11419
  type: 'area-code';
11324
11420
  connectEndpoint: string;
@@ -11394,6 +11490,8 @@ export interface SetupImportStep {
11394
11490
  buttonLabel: string;
11395
11491
  /** Hint above the button. */
11396
11492
  hint?: string;
11493
+ /** Runs the import instead of `config.importEndpoint` (see `ImportExportComponent.submit`), e.g. when the server reads the CSV file itself. */
11494
+ submit?: (request: ImportSubmitRequest) => Observable<ImportSubmitResult>;
11397
11495
  /** Result alert title, built from the number imported (default `${n} ${config.entityNamePlural.toLowerCase()} imported successfully.`). */
11398
11496
  resultTitle?: (imported: number) => string;
11399
11497
  /** Result alert body. */
@@ -11550,7 +11648,7 @@ export declare class SetupWizardComponent {
11550
11648
  /** An import step with `requireImport` keeps Continue off until something came in (a CSV import or `markCompleted`, e.g. a live sync). */
11551
11649
  protected readonly importBlocked: import("@angular/core").Signal<boolean>;
11552
11650
  /** The step's own two parts (`splitLayout`) show as two tabs, one card at a time; this is the open one (it starts on the app's part on every visit). */
11553
- protected readonly splitTab: import("@angular/core").WritableSignal<"main" | "extra">;
11651
+ protected readonly splitTab: import("@angular/core").WritableSignal<"extra" | "main">;
11554
11652
  protected readonly splitTabs: import("@angular/core").Signal<{
11555
11653
  key: string;
11556
11654
  label: string;
@@ -11560,6 +11658,8 @@ export declare class SetupWizardComponent {
11560
11658
  readonly steps: import("@angular/core").InputSignal<SetupStep[]>;
11561
11659
  /** Replaces any of the built-in texts. */
11562
11660
  readonly texts: import("@angular/core").InputSignal<Partial<SetupWizardTexts>>;
11661
+ /** The key of the step to open first (for example the one a payment provider's return address names); default (empty or unknown) = the first step. Read once, when the wizard starts. */
11662
+ readonly initialStep: import("@angular/core").InputSignal<string>;
11563
11663
  /** The last step's button ("Go to Dashboard"). */
11564
11664
  readonly finished: import("@angular/core").OutputEmitterRef<void>;
11565
11665
  /** "Exit Setup". */
@@ -11579,6 +11679,12 @@ export declare class SetupWizardComponent {
11579
11679
  private readonly importErrors;
11580
11680
  private readonly statuses;
11581
11681
  readonly busy: import("@angular/core").WritableSignal<boolean>;
11682
+ /** Key of the integration whose authorization address is being requested: only that card's button shows a loader (the footer's Save & Continue is not busy), and no second press starts a second connection. */
11683
+ protected readonly connecting: import("@angular/core").WritableSignal<string>;
11684
+ /** The blank tab opened on the Connect click (the click is the user gesture; the address arrives later), or null when none was opened / the browser blocked it. */
11685
+ private pendingTab;
11686
+ /** A provider's page was opened in another tab: when this tab becomes visible again the step's statuses are read again. */
11687
+ private connectTabOpened;
11582
11688
  /** What a custom step's template receives (`let-wizard`). */
11583
11689
  protected readonly api: SetupWizardApi;
11584
11690
  protected readonly error: import("@angular/core").WritableSignal<string>;
@@ -11638,13 +11744,18 @@ export declare class SetupWizardComponent {
11638
11744
  protected isConnected(i: SetupIntegration): boolean;
11639
11745
  protected detailFor(i: SetupIntegration): string;
11640
11746
  protected connect(i: SetupIntegration): void;
11747
+ /** Opens an empty tab for the provider's page (null when the browser refuses; the address then opens in this tab). */
11748
+ protected openTab(): Window | null;
11749
+ private closePendingTab;
11641
11750
  private startConnect;
11642
11751
  private isWebAddress;
11643
11752
  /** SVG path of a library icon (the buttons' leading / trailing glyph). */
11644
11753
  protected iconD(name: string): string;
11645
11754
  protected areaCodeLabelFor(i: SetupIntegration): string;
11646
- /** Sends the browser to the provider's authorization page. */
11755
+ /** Opens the provider's authorization page: in the tab opened on the click, else (a blocked tab) in this one. */
11647
11756
  protected redirect(url: string): void;
11757
+ /** Sends THIS tab to the address (no new tab was opened, the browser refused it or the user closed it). */
11758
+ protected navigateHere(url: string): void;
11648
11759
  protected submitAreaCode(i: SetupIntegration): void;
11649
11760
  static ɵfac: i0.ɵɵFactoryDeclaration<SetupWizardComponent, never>;
11650
11761
  static ɵcmp: i0.ɵɵComponentDeclaration<SetupWizardComponent, "ui-setup-wizard", never, {
@@ -11658,6 +11769,11 @@ export declare class SetupWizardComponent {
11658
11769
  "required": false;
11659
11770
  "isSignal": true;
11660
11771
  };
11772
+ "initialStep": {
11773
+ "alias": "initialStep";
11774
+ "required": false;
11775
+ "isSignal": true;
11776
+ };
11661
11777
  }, {
11662
11778
  "finished": "finished";
11663
11779
  "exited": "exited";