@forgeroute/ui 0.4.36 → 0.4.38

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forgeroute/ui",
3
- "version": "0.4.36",
3
+ "version": "0.4.38",
4
4
  "peerDependencies": {
5
5
  "@angular/common": ">=22.0.0",
6
6
  "@angular/core": ">=22.0.0",
@@ -115,7 +115,7 @@ export declare class TemplatePickerComponent {
115
115
  private readonly host;
116
116
  private readonly search$;
117
117
  /** Filter results to a specific channel: 'email', 'text', or omit for all. */
118
- readonly channel: import("@angular/core").InputSignal<"" | "email" | "text">;
118
+ readonly channel: import("@angular/core").InputSignal<"" | "text" | "email">;
119
119
  readonly selectedId: import("@angular/core").InputSignal<string | null>;
120
120
  readonly label: import("@angular/core").InputSignal<string>;
121
121
  /** Shows the red required asterisk (same as the library inputs) — e.g. when a template must be picked to send. */
@@ -543,7 +543,7 @@ export declare class DocumentSendOptionsComponent implements UiFieldValidity {
543
543
  /** API root from FORGEROUTE_CONFIG (e.g. a cross-origin prod API); falls back to same-origin `/api`. */
544
544
  private readonly apiBase;
545
545
  /** `email` → purpose select + attachment allowed; `text` → link only (purpose fixed to e-signature). */
546
- readonly channel: import("@angular/core").InputSignal<"email" | "text">;
546
+ readonly channel: import("@angular/core").InputSignal<"text" | "email">;
547
547
  readonly label: import("@angular/core").InputSignal<string>;
548
548
  /** When true, at least one document must be chosen. The message forms leave it false: documents are optional there. */
549
549
  readonly required: import("@angular/core").InputSignal<boolean>;
@@ -608,7 +608,7 @@ export declare class DocumentSendOptionsComponent implements UiFieldValidity {
608
608
  /** Roles of documents whose row had no `signerRoles` and that the host resolves (`signers().resolveRoles`). */
609
609
  readonly roleStates: import("@angular/core").WritableSignal<Record<string, RoleState>>;
610
610
  /** The envelope's documents: `loading` / `error` while the panel reads them (`loadDocuments`), `ready` once known. */
611
- readonly envelopeStatus: import("@angular/core").WritableSignal<"idle" | "loading" | "ready" | "error">;
611
+ readonly envelopeStatus: import("@angular/core").WritableSignal<"error" | "loading" | "ready" | "idle">;
612
612
  private envelopeSub;
613
613
  private readonly roleSubs;
614
614
  /** The sender opened the collapsed "Signing options" line. */
@@ -1813,7 +1813,7 @@ export declare class SendMessagePanelComponent {
1813
1813
  readonly activeContact: import("@angular/core").WritableSignal<MessageContact | null>;
1814
1814
  /** What the sender should know about the picked contact before sending (why a channel is missing, what to add). */
1815
1815
  readonly contactNotices: import("@angular/core").Signal<string[]>;
1816
- readonly channel: import("@angular/core").WritableSignal<"email" | "text">;
1816
+ readonly channel: import("@angular/core").WritableSignal<"text" | "email">;
1817
1817
  readonly valid: import("@angular/core").WritableSignal<boolean>;
1818
1818
  /** Bumped on every fresh open / new contact — re-creates the email and text forms so no draft carries over. */
1819
1819
  readonly formEpoch: import("@angular/core").WritableSignal<number>;
@@ -11279,7 +11279,15 @@ export interface SetupWizardTexts {
11279
11279
  selectSource: string;
11280
11280
  connected: string;
11281
11281
  importMore: string;
11282
+ /** Shown (and described by the disabled Continue) on an import step with `requireImport` until data came in. */
11283
+ importRequired: string;
11284
+ /** An import where some rows were refused: the warning's title and text (rows that failed must be fixed and imported again before Continue) and the button that returns to the sources. */
11285
+ importErrorsTitle: (errors: number) => string;
11286
+ importErrorsText: (imported: number, errors: number) => string;
11287
+ importAgain: string;
11282
11288
  whatGetsImported: string;
11289
+ /** Title of the card with the summary on the last page. */
11290
+ summaryTitle: string;
11283
11291
  doneTitle: string;
11284
11292
  doneDescription: string;
11285
11293
  doneHint: string;
@@ -11327,14 +11335,23 @@ export interface SetupStep {
11327
11335
  canContinue?: () => boolean;
11328
11336
  /** `custom`: text of the continue button (default "Save & Continue"). */
11329
11337
  saveLabel?: string;
11338
+ /**
11339
+ * Import / integrations steps with app content (`<ng-template uiSetupStep>`): show two tabs below the intro, one card at a time. The first tab holds the app's
11340
+ * content in a card titled `extraTitle`, the second the step's own card. Tab labels: `extraTab` / `mainTab` (default `extraTitle` / `cardTitle`).
11341
+ */
11342
+ splitLayout?: boolean;
11343
+ extraTitle?: string;
11344
+ extraTab?: string;
11345
+ mainTab?: string;
11346
+ /** Status line under the app content of a `splitLayout` step (e.g. "Not connected yet"); read on every render, so it can follow signals. */
11347
+ extraFooter?: () => string;
11348
+ /** Import steps: Continue stays disabled until the data came in (CSV import done with no refused rows, or the app called `markCompleted(key)` after a live sync). Skip stays available. */
11349
+ requireImport?: boolean;
11330
11350
  /**
11331
11351
  * `custom`: the step draws its own continue button (for example in the footer of a `ui-detail-card`), so the wizard does not show its own. The step's
11332
11352
  * template receives the wizard as `let-wizard` and calls `wizard.saveAndContinue()` (runs `save`, then moves on) and reads `wizard.busy()`.
11333
11353
  * Back / Skip stay the wizard's.
11334
11354
  */
11335
- /** Import / integrations steps with app content: show that content in its own card (titled `extraTitle`) beside the step card on a wide screen, stacked on a phone. */
11336
- splitLayout?: boolean;
11337
- extraTitle?: string;
11338
11355
  ownActions?: boolean;
11339
11356
  import?: SetupImportStep;
11340
11357
  integrations?: SetupIntegration[];
@@ -11442,6 +11459,14 @@ export declare class SetupWizardComponent {
11442
11459
  /** Phone layout: the step's Back / Skip / Continue buttons fill the width and stack (primary on top). */
11443
11460
  protected readonly narrow: import("@angular/core").WritableSignal<boolean>;
11444
11461
  /** A step with `splitLayout`: the app's own content gets its own card, side by side with the step card on a wide screen. */
11462
+ /** An import step with `requireImport` keeps Continue off until something came in (a CSV import or `markCompleted`, e.g. a live sync). */
11463
+ protected readonly importBlocked: import("@angular/core").Signal<boolean>;
11464
+ /** 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). */
11465
+ protected readonly splitTab: import("@angular/core").WritableSignal<"main" | "extra">;
11466
+ protected readonly splitTabs: import("@angular/core").Signal<{
11467
+ key: string;
11468
+ label: string;
11469
+ }[]>;
11445
11470
  protected readonly split: import("@angular/core").Signal<boolean>;
11446
11471
  /** The steps in walking order. A `done` summary step is appended automatically. */
11447
11472
  readonly steps: import("@angular/core").InputSignal<SetupStep[]>;
@@ -11463,6 +11488,7 @@ export declare class SetupWizardComponent {
11463
11488
  private readonly completed;
11464
11489
  private readonly skipped;
11465
11490
  private readonly imports;
11491
+ private readonly importErrors;
11466
11492
  private readonly statuses;
11467
11493
  readonly busy: import("@angular/core").WritableSignal<boolean>;
11468
11494
  /** What a custom step's template receives (`let-wizard`). */
@@ -11510,6 +11536,7 @@ export declare class SetupWizardComponent {
11510
11536
  protected openImport(key: string): void;
11511
11537
  protected onImported(key: string): void;
11512
11538
  protected importResult(key: string): number | null;
11539
+ protected importErrorCount(key: string): number;
11513
11540
  protected clearImport(key: string): void;
11514
11541
  protected importTitle(key: string): string;
11515
11542
  protected continueFromImport(): void;
@@ -11728,6 +11755,8 @@ export declare class EmailTemplateEditorComponent {
11728
11755
  readonly headingOptions: SelectOption<string>[];
11729
11756
  readonly fontSizeOptions: SelectOption<string>[];
11730
11757
  readonly spacingTabs: PillTab[];
11758
+ /** The grey hint shown in the empty first block. */
11759
+ protected readonly startPlaceholder = "Start writing your email...";
11731
11760
  readonly ctaTypeOptions: SelectOption<string>[];
11732
11761
  readonly playbackOptions: {
11733
11762
  value: string;
@@ -11762,6 +11791,9 @@ export declare class EmailTemplateEditorComponent {
11762
11791
  readonly filteredBlockGroups: import("@angular/core").Signal<EmailTemplateBlockGroup[]>;
11763
11792
  private readonly serialized;
11764
11793
  readonly previewHtml: import("@angular/core").Signal<string>;
11794
+ private readonly sanitizer;
11795
+ /** The Preview / Mobile document: a full page with the email's own styles. It is shown in a sandboxed iframe (no scripts, no popups), so trusting the markup here cannot run anything. */
11796
+ readonly previewDoc: import("@angular/core").Signal<SafeHtml>;
11765
11797
  /** Characters in the body as it is saved. */
11766
11798
  readonly bodyLength: import("@angular/core").Signal<number>;
11767
11799
  readonly bodyHasContent: import("@angular/core").Signal<boolean>;
@@ -12076,4 +12108,9 @@ export declare const DEFAULT_EMAIL_TEMPLATE_VARIABLE_GROUPS: {
12076
12108
  example: string;
12077
12109
  }[];
12078
12110
  }[];
12111
+ /**
12112
+ * The document the Preview / Mobile tabs show (inside a sandboxed iframe): the serialised message with the base look of a sent email. A
12113
+ * Content-Security-Policy meta blocks scripts and anything but images / inline styles, and links open nowhere (sandbox, no popups).
12114
+ */
12115
+ export declare function buildPreviewDocument(bodyHtml: string): string;
12079
12116
  export type { CalendarDay, CalendarRange, CalendarViewMode };