@forgeroute/ui 0.4.43 → 0.4.44

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.43",
3
+ "version": "0.4.44",
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. */
@@ -1375,18 +1375,36 @@ interface SendInAppPayload {
1375
1375
  contactId?: string;
1376
1376
  /** Only present when the Subject field is shown. */
1377
1377
  subject?: string;
1378
+ /** The Message: plain text, or sanitized HTML when `richText` is on (then `bodyIsHtml` is true). */
1378
1379
  body: string;
1380
+ /** Only present (true) when the Message was written in the rich-text editor. */
1381
+ bodyIsHtml?: true;
1382
+ /** Only present when attachments are on and the sender added at least one (base64 contents, like the email form). */
1383
+ attachments?: SendInAppAttachment[];
1384
+ }
1385
+ /** A file the sender attached, read as base64 (the same shape the email form sends). */
1386
+ interface SendInAppAttachment {
1387
+ filename: string;
1388
+ content: string;
1389
+ contentType: string;
1379
1390
  }
1380
1391
  /**
1381
1392
  * The form of a message that is not delivered by email or text but handed to the host's own function (e.g. a client portal message to the
1382
- * agent): "To" card with the name only, an optional Subject, the Message. No address, templates, video, attachments or scheduling, and it makes
1383
- * no request of its own: `sendFn` does the sending. Used by `<ui-send-message-panel recipientMode="in-app">`.
1393
+ * agent): "To" card with the name (and the address when the host gives one), an optional Subject, the Message (plain, or the rich-text editor with
1394
+ * `richText`) and optional attachments (`allowAttachments`). No templates, video or scheduling, and it makes no request of its own: `sendFn` does the sending. Used by `<ui-send-message-panel recipientMode="in-app">`.
1384
1395
  */
1385
1396
  declare class SendInAppComponent implements OnInit {
1386
1397
  private readonly destroyRef;
1387
1398
  private readonly toast;
1399
+ private readonly cdr;
1388
1400
  readonly contactName: import("@angular/core").InputSignal<string>;
1389
1401
  readonly contactId: import("@angular/core").InputSignal<string>;
1402
+ /** The address the message reaches the recipient at; shown under the name when given (the form never asks for one). */
1403
+ readonly contactEmail: import("@angular/core").InputSignal<string>;
1404
+ /** true shows "Attach Files" (any number of files); they are sent in the payload as base64. */
1405
+ readonly allowAttachments: import("@angular/core").InputSignal<boolean>;
1406
+ /** true writes the Message in the rich-text editor (bold, lists, ...); the payload body is then sanitized HTML. */
1407
+ readonly richText: import("@angular/core").InputSignal<boolean>;
1390
1408
  /** Prefills Subject / Message. */
1391
1409
  readonly defaultSubject: import("@angular/core").InputSignal<string>;
1392
1410
  readonly defaultBody: import("@angular/core").InputSignal<string>;
@@ -1404,8 +1422,20 @@ declare class SendInAppComponent implements OnInit {
1404
1422
  readonly sending: import("@angular/core").WritableSignal<boolean>;
1405
1423
  subject: string;
1406
1424
  body: string;
1425
+ attachments: {
1426
+ filename: string;
1427
+ content: string;
1428
+ contentType: string;
1429
+ sizeLabel: string;
1430
+ }[];
1407
1431
  ngOnInit(): void;
1432
+ /** The Message as the limit and the "is it empty" check see it: the text of the rich-text HTML, or the plain text. */
1433
+ private bodyText;
1434
+ /** Rich text only: the HTML is longer than the host's limit (the limit is on what the server stores). */
1435
+ protected richTooLong(): boolean;
1408
1436
  get canSend(): boolean;
1437
+ onFilesSelected(event: Event): void;
1438
+ removeAttachment(index: number): void;
1409
1439
  notifyValid(): void;
1410
1440
  submit(): void;
1411
1441
  static ɵfac: i0.ɵɵFactoryDeclaration<SendInAppComponent, never>;
@@ -1420,6 +1450,21 @@ declare class SendInAppComponent implements OnInit {
1420
1450
  "required": false;
1421
1451
  "isSignal": true;
1422
1452
  };
1453
+ "contactEmail": {
1454
+ "alias": "contactEmail";
1455
+ "required": false;
1456
+ "isSignal": true;
1457
+ };
1458
+ "allowAttachments": {
1459
+ "alias": "allowAttachments";
1460
+ "required": false;
1461
+ "isSignal": true;
1462
+ };
1463
+ "richText": {
1464
+ "alias": "richText";
1465
+ "required": false;
1466
+ "isSignal": true;
1467
+ };
1423
1468
  "defaultSubject": {
1424
1469
  "alias": "defaultSubject";
1425
1470
  "required": false;
@@ -1825,6 +1870,10 @@ export declare class SendMessagePanelComponent {
1825
1870
  readonly sendMessage: import("@angular/core").InputSignal<((payload: SendInAppPayload) => Observable<unknown>) | null>;
1826
1871
  /** `recipientMode="in-app"` only: the longest Message the host's backend accepts; null (default) = no limit. */
1827
1872
  readonly maxBodyLength: import("@angular/core").InputSignal<number | null>;
1873
+ /** `recipientMode="in-app"` only: shows "Attach Files" (any number of files, sent in the payload as base64). Default false. */
1874
+ readonly inAppAttachments: import("@angular/core").InputSignal<boolean>;
1875
+ /** `recipientMode="in-app"` only: the Message is written in the rich-text editor and the payload body is sanitized HTML (`bodyIsHtml`). Default false. */
1876
+ readonly inAppRichText: import("@angular/core").InputSignal<boolean>;
1828
1877
  /** false hides the Subject field in the email form and the in-app form (Send then needs only a Message). Default true. */
1829
1878
  readonly showSubject: import("@angular/core").InputSignal<boolean>;
1830
1879
  /** false hides the "Use Existing Template" tab in the email and text forms (Create Message only; the template picker, `GET /templates`, is never used). Default true. */
@@ -1948,7 +1997,7 @@ export declare class SendMessagePanelComponent {
1948
1997
  readonly activeContact: import("@angular/core").WritableSignal<MessageContact | null>;
1949
1998
  /** What the sender should know about the picked contact before sending (why a channel is missing, what to add). */
1950
1999
  readonly contactNotices: import("@angular/core").Signal<string[]>;
1951
- readonly channel: import("@angular/core").WritableSignal<"email" | "text">;
2000
+ readonly channel: import("@angular/core").WritableSignal<"text" | "email">;
1952
2001
  readonly valid: import("@angular/core").WritableSignal<boolean>;
1953
2002
  /** Bumped on every fresh open / new contact — re-creates the email and text forms so no draft carries over. */
1954
2003
  readonly formEpoch: import("@angular/core").WritableSignal<number>;
@@ -2063,6 +2112,16 @@ export declare class SendMessagePanelComponent {
2063
2112
  "required": false;
2064
2113
  "isSignal": true;
2065
2114
  };
2115
+ "inAppAttachments": {
2116
+ "alias": "inAppAttachments";
2117
+ "required": false;
2118
+ "isSignal": true;
2119
+ };
2120
+ "inAppRichText": {
2121
+ "alias": "inAppRichText";
2122
+ "required": false;
2123
+ "isSignal": true;
2124
+ };
2066
2125
  "showSubject": {
2067
2126
  "alias": "showSubject";
2068
2127
  "required": false;
@@ -2327,4 +2386,4 @@ export declare class DocumentMergeCheckComponent {
2327
2386
  "warningsChange": "warningsChange";
2328
2387
  }, never, never, true, never>;
2329
2388
  }
2330
- export type { CreateDocumentRequestBody, DocuSignSendBody, DocumentSentInfo, DocumentSentMessage, DocumentsPayloadExtras, ExistingEnvelopeSendBody, SendDocumentsPayload, SendEmailPayload, SendInAppPayload, SendTextPayload, VideoDefaults, VideoLinkOptions };
2389
+ export type { CreateDocumentRequestBody, DocuSignSendBody, DocumentSentInfo, DocumentSentMessage, DocumentsPayloadExtras, ExistingEnvelopeSendBody, SendDocumentsPayload, SendEmailPayload, SendInAppAttachment, SendInAppPayload, SendTextPayload, VideoDefaults, VideoLinkOptions };
@@ -2206,7 +2206,7 @@ export declare class ModalComponent implements OnInit, OnDestroy {
2206
2206
  readonly title: import("@angular/core").InputSignal<string>;
2207
2207
  readonly description: import("@angular/core").InputSignal<string>;
2208
2208
  readonly maxWidth: import("@angular/core").InputSignal<string>;
2209
- readonly bodyOverflow: import("@angular/core").InputSignal<"hidden" | "visible" | "auto">;
2209
+ readonly bodyOverflow: import("@angular/core").InputSignal<"hidden" | "auto" | "visible">;
2210
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. */
2211
2211
  readonly dialogTestId: import("@angular/core").InputSignal<string>;
2212
2212
  /** Hides the header X button (e.g. while a request is running). Escape and a backdrop click still close unless `closable` is false. */
@@ -2844,7 +2844,7 @@ export declare class CheckboxComponent implements ControlValueAccessor, Validato
2844
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.
2845
2845
  * Default null: plain label text, exactly as before. Single mode only.
2846
2846
  */
2847
- readonly headingLevel: import("@angular/core").InputSignal<1 | 3 | 4 | 2 | 5 | 6 | null>;
2847
+ readonly headingLevel: import("@angular/core").InputSignal<1 | 2 | 3 | 4 | 5 | 6 | null>;
2848
2848
  readonly indeterminate: import("@angular/core").InputSignal<boolean>;
2849
2849
  readonly checked: import("@angular/core").ModelSignal<boolean>;
2850
2850
  /**
@@ -3755,7 +3755,7 @@ export declare class PhoneNumberPickerComponent {
3755
3755
  protected readonly modeCtl: FormControl<string>;
3756
3756
  protected readonly zipCtl: FormControl<string>;
3757
3757
  protected readonly areaCtl: FormControl<string>;
3758
- protected readonly step: import("@angular/core").WritableSignal<1 | 3 | 2>;
3758
+ protected readonly step: import("@angular/core").WritableSignal<1 | 2 | 3>;
3759
3759
  protected readonly mode: import("@angular/core").WritableSignal<PhoneNumberSearchMode>;
3760
3760
  private readonly _zip;
3761
3761
  private readonly _area;
@@ -3869,7 +3869,7 @@ export declare class ButtonComponent {
3869
3869
  * `ghost-start`: a ghost button for list / section toggles - a full-width row with its content aligned to the start, transparent
3870
3870
  * background, hover tint and the normal focus ring. Pair it with `ariaExpanded` / `ariaPressed`; the label may contain a heading element.
3871
3871
  */
3872
- readonly variant: import("@angular/core").InputSignal<"link" | "primary" | "secondary" | "danger" | "warning" | "ghost" | "ghost-start" | "tab" | "icon" | "icon-danger">;
3872
+ readonly variant: import("@angular/core").InputSignal<"primary" | "secondary" | "danger" | "warning" | "link" | "ghost" | "ghost-start" | "tab" | "icon" | "icon-danger">;
3873
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`). */
3874
3874
  readonly routerLink: import("@angular/core").InputSignal<string | readonly unknown[] | null>;
3875
3875
  /** Query params of the `routerLink` (e.g. `{ section: 'deal-defaults' }`). */
@@ -3890,7 +3890,7 @@ export declare class ButtonComponent {
3890
3890
  */
3891
3891
  readonly href: import("@angular/core").InputSignal<string | null>;
3892
3892
  /** Where to open the `href` (`_blank` = a new tab). */
3893
- readonly target: import("@angular/core").InputSignal<"_blank" | "_self" | "_parent" | "_top" | null>;
3893
+ readonly target: import("@angular/core").InputSignal<"_self" | "_blank" | "_parent" | "_top" | null>;
3894
3894
  /** `rel` of the `href` link. A `_blank` target always gets `noopener noreferrer` added. */
3895
3895
  readonly rel: import("@angular/core").InputSignal<string | null>;
3896
3896
  /** The href when it is allowed (http, https, mailto, tel, sms or a relative URL), else null. */
@@ -3915,7 +3915,7 @@ export declare class ButtonComponent {
3915
3915
  readonly color: import("@angular/core").InputSignal<string | undefined>;
3916
3916
  readonly active: import("@angular/core").InputSignal<boolean>;
3917
3917
  readonly size: import("@angular/core").InputSignal<"sm" | "md" | "lg" | "xs">;
3918
- readonly type: import("@angular/core").InputSignal<"button" | "reset" | "submit">;
3918
+ readonly type: import("@angular/core").InputSignal<"reset" | "submit" | "button">;
3919
3919
  readonly disabled: import("@angular/core").InputSignal<boolean>;
3920
3920
  readonly loading: import("@angular/core").InputSignal<boolean>;
3921
3921
  readonly fullWidth: import("@angular/core").InputSignal<boolean>;
@@ -4711,7 +4711,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
4711
4711
  readonly passwordRequirements: import("@angular/core").InputSignal<boolean>;
4712
4712
  /** Rules for `passwordRequirements`; default = the library's five rules (8+ characters, upper, lower, digit, special). */
4713
4713
  readonly passwordRules: import("@angular/core").InputSignal<readonly PasswordRule[] | undefined>;
4714
- readonly type: import("@angular/core").InputSignal<"number" | "text" | "email" | "password" | "tel" | "url">;
4714
+ readonly type: import("@angular/core").InputSignal<"number" | "text" | "email" | "tel" | "password" | "url">;
4715
4715
  readonly maxlength: import("@angular/core").InputSignal<number | undefined>;
4716
4716
  readonly required: import("@angular/core").InputSignal<boolean>;
4717
4717
  readonly autocomplete: import("@angular/core").InputSignal<string>;
@@ -4720,7 +4720,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
4720
4720
  * `search`, `text`, `none`). Empty (default) = the browser's default for the field, except `type="tel"`, which keeps `tel`.
4721
4721
  * It only picks the keyboard; it does not restrict what can be typed or pasted.
4722
4722
  */
4723
- readonly inputmode: import("@angular/core").InputSignal<"" | "search" | "text" | "email" | "none" | "tel" | "url" | "decimal" | "numeric">;
4723
+ readonly inputmode: import("@angular/core").InputSignal<"" | "none" | "text" | "search" | "email" | "tel" | "url" | "decimal" | "numeric">;
4724
4724
  readonly readonly: import("@angular/core").InputSignal<boolean>;
4725
4725
  readonly hint: import("@angular/core").InputSignal<string>;
4726
4726
  readonly error: import("@angular/core").InputSignal<string>;
@@ -4784,7 +4784,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
4784
4784
  protected readonly _stepAttr: import("@angular/core").Signal<string | null>;
4785
4785
  protected readonly _revealable: import("@angular/core").Signal<boolean>;
4786
4786
  protected readonly _shown: import("@angular/core").WritableSignal<boolean>;
4787
- protected readonly _inputType: import("@angular/core").Signal<"number" | "text" | "email" | "password" | "tel" | "url">;
4787
+ protected readonly _inputType: import("@angular/core").Signal<"number" | "text" | "email" | "tel" | "password" | "url">;
4788
4788
  protected readonly _eyePath: string;
4789
4789
  protected readonly _eyeOffPath: string;
4790
4790
  protected readonly _showRequirements: import("@angular/core").Signal<boolean>;
@@ -6136,7 +6136,7 @@ export declare class DropdownComponent {
6136
6136
  readonly loader: import("@angular/core").InputSignal<(() => Promise<DropdownItem[]>) | null>;
6137
6137
  readonly active: import("@angular/core").InputSignal<boolean>;
6138
6138
  readonly activeValue: import("@angular/core").InputSignal<string>;
6139
- readonly variant: import("@angular/core").InputSignal<"button" | "badge">;
6139
+ readonly variant: import("@angular/core").InputSignal<"badge" | "button">;
6140
6140
  readonly menuWidth: import("@angular/core").InputSignal<string>;
6141
6141
  /**
6142
6142
  * Accessible name. Set it when the trigger has no meaningful visible text. Applied as `aria-label` on the
@@ -6335,7 +6335,7 @@ export declare class FormSectionComponent {
6335
6335
  }, {}, never, ["*"], true, never>;
6336
6336
  }
6337
6337
  export declare class FormRowComponent {
6338
- readonly cols: import("@angular/core").InputSignal<1 | 3 | 4 | 2>;
6338
+ readonly cols: import("@angular/core").InputSignal<1 | 2 | 3 | 4>;
6339
6339
  static ɵfac: i0.ɵɵFactoryDeclaration<FormRowComponent, never>;
6340
6340
  static ɵcmp: i0.ɵɵComponentDeclaration<FormRowComponent, "ui-form-row", never, {
6341
6341
  "cols": {
@@ -6352,7 +6352,7 @@ export declare class FormRowComponent {
6352
6352
  * child simply takes the full width. Keep a numeric span within the row's `cols` (use `all` for the whole row).
6353
6353
  */
6354
6354
  export declare class FormColSpanDirective {
6355
- readonly uiColSpan: import("@angular/core").InputSignal<"" | "2" | "3" | 3 | 2 | "all">;
6355
+ readonly uiColSpan: import("@angular/core").InputSignal<"" | "2" | "3" | 2 | 3 | "all">;
6356
6356
  protected readonly _class: import("@angular/core").Signal<string>;
6357
6357
  static ɵfac: i0.ɵɵFactoryDeclaration<FormColSpanDirective, never>;
6358
6358
  static ɵdir: i0.ɵɵDirectiveDeclaration<FormColSpanDirective, "[uiColSpan]", never, {
@@ -9293,7 +9293,7 @@ export declare class DetailCardComponent {
9293
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. */
9294
9294
  readonly uppercaseTitle: import("@angular/core").InputSignal<boolean>;
9295
9295
  /** 1-6 makes the title a real heading for screen readers (role=heading, aria-level); null keeps it plain text. */
9296
- readonly headingLevel: import("@angular/core").InputSignal<1 | 3 | 4 | 2 | 5 | 6 | null>;
9296
+ readonly headingLevel: import("@angular/core").InputSignal<1 | 2 | 3 | 4 | 5 | 6 | null>;
9297
9297
  /** Optional id for the title text; the card is then labelled by it. Without it the title is the card's aria-label. */
9298
9298
  readonly titleId: import("@angular/core").InputSignal<string>;
9299
9299
  /** Accessible name of the card when the header gives none (no header, or no title). A visible title wins; blank = no name. */