@forgeroute/ui 0.4.58 → 0.4.60

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.
@@ -1095,7 +1095,7 @@ export declare class SelectComponent implements ControlValueAccessor, Validator,
1095
1095
  readonly error: import("@angular/core").InputSignal<string>;
1096
1096
  /** Reveal the built-in error messages now (e.g. after a failed Save click), without waiting for blur. */
1097
1097
  readonly showErrors: import("@angular/core").InputSignal<boolean>;
1098
- readonly size: import("@angular/core").InputSignal<"sm" | "default">;
1098
+ readonly size: import("@angular/core").InputSignal<"default" | "sm">;
1099
1099
  readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
1100
1100
  private readonly _cvaDisabled;
1101
1101
  protected readonly disabled: import("@angular/core").Signal<boolean>;
@@ -2152,7 +2152,7 @@ export declare class SidePanelComponent implements OnDestroy {
2152
2152
  readonly cancelLabel: import("@angular/core").InputSignal<string>;
2153
2153
  /** Right-aligned primary action button label. Empty string = hidden. */
2154
2154
  readonly primaryLabel: import("@angular/core").InputSignal<string>;
2155
- readonly primaryVariant: import("@angular/core").InputSignal<"danger" | "warning" | "primary">;
2155
+ readonly primaryVariant: import("@angular/core").InputSignal<"primary" | "danger" | "warning">;
2156
2156
  readonly primaryLoading: import("@angular/core").InputSignal<boolean>;
2157
2157
  readonly primaryDisabled: import("@angular/core").InputSignal<boolean>;
2158
2158
  /** `data-testid` of the Cancel button; none when empty (default). */
@@ -2260,7 +2260,7 @@ export declare class ModalComponent implements OnInit, OnDestroy {
2260
2260
  readonly title: import("@angular/core").InputSignal<string>;
2261
2261
  readonly description: import("@angular/core").InputSignal<string>;
2262
2262
  readonly maxWidth: import("@angular/core").InputSignal<string>;
2263
- readonly bodyOverflow: import("@angular/core").InputSignal<"auto" | "hidden" | "visible">;
2263
+ readonly bodyOverflow: import("@angular/core").InputSignal<"hidden" | "visible" | "auto">;
2264
2264
  /** `data-testid` of the dialog element itself (the host `<ui-modal>` is always in the page, the dialog only while open). None when empty. */
2265
2265
  readonly dialogTestId: import("@angular/core").InputSignal<string>;
2266
2266
  /** Hides the header X button (e.g. while a request is running). Escape and a backdrop click still close unless `closable` is false. */
@@ -2682,7 +2682,7 @@ export declare class AudioPlayerComponent {
2682
2682
  /** Accessible name of the player. */
2683
2683
  readonly ariaLabel: import("@angular/core").InputSignal<string>;
2684
2684
  /** How much to load before play: 'metadata' (default), 'auto' or 'none'. */
2685
- readonly preload: import("@angular/core").InputSignal<"none" | "auto" | "metadata">;
2685
+ readonly preload: import("@angular/core").InputSignal<"metadata" | "none" | "auto">;
2686
2686
  /** Fires when the browser can't load or decode the source. */
2687
2687
  readonly playbackError: import("@angular/core").OutputEmitterRef<void>;
2688
2688
  protected readonly failed: import("@angular/core").WritableSignal<boolean>;
@@ -2936,7 +2936,7 @@ export declare class CheckboxComponent implements ControlValueAccessor, Validato
2936
2936
  * 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.
2937
2937
  * Default null: plain label text, exactly as before. Single mode only.
2938
2938
  */
2939
- readonly headingLevel: import("@angular/core").InputSignal<1 | 2 | 3 | 4 | 5 | 6 | null>;
2939
+ readonly headingLevel: import("@angular/core").InputSignal<2 | 1 | 6 | 3 | 4 | 5 | null>;
2940
2940
  readonly indeterminate: import("@angular/core").InputSignal<boolean>;
2941
2941
  readonly checked: import("@angular/core").ModelSignal<boolean>;
2942
2942
  /**
@@ -3847,7 +3847,7 @@ export declare class PhoneNumberPickerComponent {
3847
3847
  protected readonly modeCtl: FormControl<string>;
3848
3848
  protected readonly zipCtl: FormControl<string>;
3849
3849
  protected readonly areaCtl: FormControl<string>;
3850
- protected readonly step: import("@angular/core").WritableSignal<1 | 2 | 3>;
3850
+ protected readonly step: import("@angular/core").WritableSignal<2 | 1 | 3>;
3851
3851
  protected readonly mode: import("@angular/core").WritableSignal<PhoneNumberSearchMode>;
3852
3852
  private readonly _zip;
3853
3853
  private readonly _area;
@@ -3963,7 +3963,7 @@ export declare class ButtonComponent {
3963
3963
  * `ghost-start`: a ghost button for list / section toggles - a full-width row with its content aligned to the start, transparent
3964
3964
  * background, hover tint and the normal focus ring. Pair it with `ariaExpanded` / `ariaPressed`; the label may contain a heading element.
3965
3965
  */
3966
- readonly variant: import("@angular/core").InputSignal<"link" | "danger" | "warning" | "primary" | "secondary" | "ghost" | "ghost-start" | "tab" | "icon" | "icon-danger">;
3966
+ readonly variant: import("@angular/core").InputSignal<"link" | "primary" | "secondary" | "danger" | "warning" | "ghost" | "ghost-start" | "tab" | "icon" | "icon-danger">;
3967
3967
  /** 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`). */
3968
3968
  readonly routerLink: import("@angular/core").InputSignal<string | readonly unknown[] | null>;
3969
3969
  /** Query params of the `routerLink` (e.g. `{ section: 'deal-defaults' }`). */
@@ -4008,8 +4008,8 @@ export declare class ButtonComponent {
4008
4008
  private readonly _narrow;
4009
4009
  readonly color: import("@angular/core").InputSignal<string | undefined>;
4010
4010
  readonly active: import("@angular/core").InputSignal<boolean>;
4011
- readonly size: import("@angular/core").InputSignal<"xs" | "sm" | "md" | "lg">;
4012
- readonly type: import("@angular/core").InputSignal<"button" | "reset" | "submit">;
4011
+ readonly size: import("@angular/core").InputSignal<"sm" | "md" | "lg" | "xs">;
4012
+ readonly type: import("@angular/core").InputSignal<"reset" | "submit" | "button">;
4013
4013
  readonly disabled: import("@angular/core").InputSignal<boolean>;
4014
4014
  readonly loading: import("@angular/core").InputSignal<boolean>;
4015
4015
  readonly fullWidth: import("@angular/core").InputSignal<boolean>;
@@ -4948,7 +4948,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
4948
4948
  readonly passwordRequirements: import("@angular/core").InputSignal<boolean>;
4949
4949
  /** Rules for `passwordRequirements`; default = the library's five rules (8+ characters, upper, lower, digit, special). */
4950
4950
  readonly passwordRules: import("@angular/core").InputSignal<readonly PasswordRule[] | undefined>;
4951
- readonly type: import("@angular/core").InputSignal<"number" | "text" | "email" | "tel" | "password" | "url">;
4951
+ readonly type: import("@angular/core").InputSignal<"number" | "tel" | "text" | "email" | "password" | "url">;
4952
4952
  readonly maxlength: import("@angular/core").InputSignal<number | undefined>;
4953
4953
  readonly required: import("@angular/core").InputSignal<boolean>;
4954
4954
  readonly autocomplete: import("@angular/core").InputSignal<string>;
@@ -4957,7 +4957,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
4957
4957
  * `search`, `text`, `none`). Empty (default) = the browser's default for the field, except `type="tel"`, which keeps `tel`.
4958
4958
  * It only picks the keyboard; it does not restrict what can be typed or pasted.
4959
4959
  */
4960
- readonly inputmode: import("@angular/core").InputSignal<"" | "none" | "search" | "text" | "email" | "tel" | "url" | "decimal" | "numeric">;
4960
+ readonly inputmode: import("@angular/core").InputSignal<"" | "tel" | "search" | "text" | "none" | "email" | "url" | "decimal" | "numeric">;
4961
4961
  readonly readonly: import("@angular/core").InputSignal<boolean>;
4962
4962
  readonly hint: import("@angular/core").InputSignal<string>;
4963
4963
  /** Id(s) of an external element that also describes this control (e.g. one shared error text for a group of fields). Space separated; MERGED after the control's own hint / error id in `aria-describedby`, never replacing it. Empty = unchanged. */
@@ -5023,7 +5023,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
5023
5023
  protected readonly _stepAttr: import("@angular/core").Signal<string | null>;
5024
5024
  protected readonly _revealable: import("@angular/core").Signal<boolean>;
5025
5025
  protected readonly _shown: import("@angular/core").WritableSignal<boolean>;
5026
- protected readonly _inputType: import("@angular/core").Signal<"number" | "text" | "email" | "tel" | "password" | "url">;
5026
+ protected readonly _inputType: import("@angular/core").Signal<"number" | "tel" | "text" | "email" | "password" | "url">;
5027
5027
  protected readonly _eyePath: string;
5028
5028
  protected readonly _eyeOffPath: string;
5029
5029
  protected readonly _showRequirements: import("@angular/core").Signal<boolean>;
@@ -6728,7 +6728,7 @@ export declare class FormSectionComponent {
6728
6728
  }, {}, never, ["*"], true, never>;
6729
6729
  }
6730
6730
  export declare class FormRowComponent {
6731
- readonly cols: import("@angular/core").InputSignal<1 | 2 | 3 | 4>;
6731
+ readonly cols: import("@angular/core").InputSignal<2 | 1 | 3 | 4>;
6732
6732
  static ɵfac: i0.ɵɵFactoryDeclaration<FormRowComponent, never>;
6733
6733
  static ɵcmp: i0.ɵɵComponentDeclaration<FormRowComponent, "ui-form-row", never, {
6734
6734
  "cols": {
@@ -6745,7 +6745,7 @@ export declare class FormRowComponent {
6745
6745
  * child simply takes the full width. Keep a numeric span within the row's `cols` (use `all` for the whole row).
6746
6746
  */
6747
6747
  export declare class FormColSpanDirective {
6748
- readonly uiColSpan: import("@angular/core").InputSignal<"" | "all" | "2" | 2 | "3" | 3>;
6748
+ readonly uiColSpan: import("@angular/core").InputSignal<"" | 2 | "2" | "3" | 3 | "all">;
6749
6749
  protected readonly _class: import("@angular/core").Signal<string>;
6750
6750
  static ɵfac: i0.ɵɵFactoryDeclaration<FormColSpanDirective, never>;
6751
6751
  static ɵdir: i0.ɵɵDirectiveDeclaration<FormColSpanDirective, "[uiColSpan]", never, {
@@ -7364,8 +7364,10 @@ export declare class ListComponent<T = unknown> {
7364
7364
  /** Announcement after a move; receives the row label, the new position (1-based) and the list size. */
7365
7365
  readonly moveAnnouncement: import("@angular/core").InputSignal<(label: string, position: number, total: number) => string>;
7366
7366
  /** Fires with the new array when the user moves a row (`[(items)]`). The list does not change `items` itself. */
7367
- /** Shows an arrow at the end of every row and makes the row open something: a click or Enter on the row (not on a button or link inside it) emits `itemClick`. Default false: no arrow, rows are not clickable. */
7367
+ /** Makes the row open something: a click or Enter on the row (not on a button or link inside it) emits `itemClick`; the arrow only shows with `[arrow]="true"`. Default false: rows are not clickable. */
7368
7368
  readonly navigable: import("@angular/core").InputSignal<boolean>;
7369
+ /** The arrow at the end of each row, drawn only with `[navigable]`. Default false (hidden): not every clickable list wants one. `[navigable]` alone keeps the click / Enter / focus behaviour; add `[arrow]="true"` to show it. */
7370
+ readonly arrow: import("@angular/core").InputSignal<boolean>;
7369
7371
  /** The row of `[navigable]` that was clicked (or Enter was pressed on). */
7370
7372
  readonly itemClick: import("@angular/core").OutputEmitterRef<T>;
7371
7373
  readonly itemsChange: import("@angular/core").OutputEmitterRef<T[]>;
@@ -7502,6 +7504,11 @@ export declare class ListComponent<T = unknown> {
7502
7504
  "required": false;
7503
7505
  "isSignal": true;
7504
7506
  };
7507
+ "arrow": {
7508
+ "alias": "arrow";
7509
+ "required": false;
7510
+ "isSignal": true;
7511
+ };
7505
7512
  }, {
7506
7513
  "itemClick": "itemClick";
7507
7514
  "itemsChange": "itemsChange";
@@ -7693,13 +7700,15 @@ export interface PanelInfoSection {
7693
7700
  * A small secondary button at the end of the section's header bar (e.g. "Add item" for a list of line items). `action` runs on
7694
7701
  * click; `ariaLabel` is the accessible name when the visible label is not enough (default: the label). The header bar is shown
7695
7702
  * for a section with a `headerAction` even when it has no `title`. Not rendered for a section with no visible items unless
7696
- * `showEmptyState` keeps the section.
7703
+ * `showEmptyState` keeps the section. `icon` is an optional SVG path (the `d` value, 24x24 grid, same convention as a toolbar action's
7704
+ * `icon`) drawn before the label; it is decorative, so the accessible name stays the label / `ariaLabel`.
7697
7705
  */
7698
7706
  headerAction?: {
7699
7707
  label: string;
7700
7708
  action: () => void;
7701
7709
  ariaLabel?: string;
7702
7710
  disabled?: boolean;
7711
+ icon?: string;
7703
7712
  };
7704
7713
  items: PanelInfoItem[];
7705
7714
  columns?: 2;
@@ -7862,9 +7871,9 @@ export declare class ChipGroupComponent {
7862
7871
  readonly spaceAbove: import("@angular/core").InputSignal<"none" | "sm" | "md">;
7863
7872
  /** Space below the chip group. */
7864
7873
  readonly spaceBelow: import("@angular/core").InputSignal<"none" | "sm" | "md">;
7865
- protected readonly _gap: import("@angular/core").Signal<"12px" | "6px" | "8px">;
7866
- protected readonly _spaceAbove: import("@angular/core").Signal<"12px" | "0" | "6px">;
7867
- protected readonly _spaceBelow: import("@angular/core").Signal<"12px" | "0" | "6px">;
7874
+ protected readonly _gap: import("@angular/core").Signal<"6px" | "12px" | "8px">;
7875
+ protected readonly _spaceAbove: import("@angular/core").Signal<"0" | "6px" | "12px">;
7876
+ protected readonly _spaceBelow: import("@angular/core").Signal<"0" | "6px" | "12px">;
7868
7877
  static ɵfac: i0.ɵɵFactoryDeclaration<ChipGroupComponent, never>;
7869
7878
  static ɵcmp: i0.ɵɵComponentDeclaration<ChipGroupComponent, "ui-chip-group", never, {
7870
7879
  "gap": {
@@ -9657,7 +9666,7 @@ export declare class PdfHotspotComponent {
9657
9666
  /** `ready`: clickable; `blocked`: disabled (a prerequisite is missing); `signed`: shows `image`. */
9658
9667
  readonly state: import("@angular/core").InputSignal<"ready" | "blocked" | "signed">;
9659
9668
  /** `warning` gives the ready state an amber look (e.g. for initials), default is blue. */
9660
- readonly tone: import("@angular/core").InputSignal<"warning" | "primary">;
9669
+ readonly tone: import("@angular/core").InputSignal<"primary" | "warning">;
9661
9670
  /** Text of the ready button (e.g. "Sign Here"). */
9662
9671
  readonly label: import("@angular/core").InputSignal<string>;
9663
9672
  /** Text of the blocked button (e.g. "Add signature above"). */
@@ -9791,7 +9800,7 @@ export declare class DetailCardComponent {
9791
9800
  /** true (default) = the title is displayed in capitals (CSS only); false = shown as written. The text, aria-label and heading name are never changed. */
9792
9801
  readonly uppercaseTitle: import("@angular/core").InputSignal<boolean>;
9793
9802
  /** 1-6 makes the title a real heading for screen readers (role=heading, aria-level); null keeps it plain text. */
9794
- readonly headingLevel: import("@angular/core").InputSignal<1 | 2 | 3 | 4 | 5 | 6 | null>;
9803
+ readonly headingLevel: import("@angular/core").InputSignal<2 | 1 | 6 | 3 | 4 | 5 | null>;
9795
9804
  /** Optional id for the title text; the card is then labelled by it. Without it the title is the card's aria-label. */
9796
9805
  readonly titleId: import("@angular/core").InputSignal<string>;
9797
9806
  /** Accessible name of the card when the header gives none (no header, or no title). A visible title wins; blank = no name. */
@@ -12234,7 +12243,7 @@ export declare class SetupWizardComponent {
12234
12243
  protected customHintId(): string;
12235
12244
  protected readonly importBlocked: import("@angular/core").Signal<boolean>;
12236
12245
  /** 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). */
12237
- protected readonly splitTab: import("@angular/core").WritableSignal<"main" | "extra">;
12246
+ protected readonly splitTab: import("@angular/core").WritableSignal<"extra" | "main">;
12238
12247
  protected readonly splitTabs: import("@angular/core").Signal<{
12239
12248
  key: string;
12240
12249
  label: string;
@@ -13166,4 +13175,727 @@ export declare class ReminderAlertsComponent {
13166
13175
  "hidden": "hidden";
13167
13176
  }, never, never, true, never>;
13168
13177
  }
13178
+ /** One row of the conversation list. The HOST maps its own record to this shape (phone formatting aside, the component shows the values as given). */
13179
+ export interface ConversationItem {
13180
+ id: string;
13181
+ /** Who the conversation is with; also the avatar initial and the thread heading. */
13182
+ name: string;
13183
+ /** Second line under the name, e.g. a phone number already formatted by the host (see `formatConversationPhone`). */
13184
+ subtitle?: string | null;
13185
+ /** ISO instant of the last message: shown as a short relative time ("5m", "2d", "Oct 12"). */
13186
+ lastMessageAt?: string | null;
13187
+ /** The last message's text; cut at 60 characters. Empty shows "No messages". */
13188
+ preview?: string | null;
13189
+ /** Unread messages; above 0 the row is highlighted and shows a count badge. */
13190
+ unreadCount?: number;
13191
+ /** A gray badge on the row, e.g. "Closed" or "Archived". Omit for an open conversation. */
13192
+ statusLabel?: string | null;
13193
+ }
13194
+ export type ConversationMessageDirection = 'inbound' | 'outbound';
13195
+ /** A file shown inside a message bubble. */
13196
+ export interface ConversationMedia {
13197
+ url: string;
13198
+ /** MIME type: `image/*` is shown as a picture, `video/*` as a player, anything else as a link. */
13199
+ type?: string | null;
13200
+ fileName?: string | null;
13201
+ }
13202
+ /** One message of the open thread. */
13203
+ export interface ConversationMessage {
13204
+ id: string;
13205
+ direction: ConversationMessageDirection;
13206
+ body?: string | null;
13207
+ /** ISO instant. Drives the time under the bubble and the date separators. */
13208
+ sentAt: string;
13209
+ /** Outbound only: `sent` (✓), `delivered` (✓✓), `failed`, `scheduled`. Other values show nothing. */
13210
+ status?: string | null;
13211
+ media?: ConversationMedia | null;
13212
+ /** Outbound only: who wrote it (e.g. the agent's name), shown before the time. Omit when the sender is always "You". */
13213
+ sender?: string | null;
13214
+ /** A link-style button under the text, e.g. "View transaction"; clicking it emits `(messageAction)` with this message. */
13215
+ action?: ConversationMessageAction | null;
13216
+ }
13217
+ /** The button a message can carry (see `ConversationMessage.action`). */
13218
+ export interface ConversationMessageAction {
13219
+ label: string;
13220
+ }
13221
+ /** The file waiting to be sent with the next message. */
13222
+ export interface ConversationAttachment {
13223
+ fileName: string;
13224
+ /** Shown as a thumbnail when set; otherwise the file name. */
13225
+ previewUrl?: string | null;
13226
+ }
13227
+ /** What `(send)` reports. */
13228
+ export interface ConversationSendEvent {
13229
+ text: string;
13230
+ }
13231
+ /** A message with the date separator that goes above it ('' when it shares the day of the previous message). */
13232
+ export interface ConversationMessageRow {
13233
+ message: ConversationMessage;
13234
+ separator: string;
13235
+ }
13236
+ /**
13237
+ * Pure display helpers of `ui-conversations` (no Angular). Dates are formatted with an explicit 'en-US' locale and are only ever
13238
+ * read from ISO strings, so Chrome, Edge, Firefox and Safari print the same text.
13239
+ */
13240
+ /** "(512) 555-0100"; "+1 (512) 555-0100" for an 11-digit number that starts with 1; anything else is returned as stored ('' for none). */
13241
+ export declare function formatConversationPhone(phone: string | null | undefined): string;
13242
+ /** The text cut at `len` characters with "..." ('' for none). */
13243
+ export declare function truncateConversationText(text: string | null | undefined, len: number): string;
13244
+ /** "now", "5m", "3h", "2d", then "Oct 12" (the list's time column). '' for a missing or unreadable date. */
13245
+ export declare function formatConversationTime(iso: string | null | undefined, now?: Date): string;
13246
+ /** "3:05 PM" (a message's time). '' for an unreadable date. */
13247
+ export declare function formatMessageTime(iso: string): string;
13248
+ /** "Today", "Yesterday" or "Oct 12, 2026" (the date separator in a thread). '' for an unreadable date (never "Invalid Date"). */
13249
+ export declare function conversationDateLabel(iso: string, now?: Date): string;
13250
+ /** First letter of the name, upper case, for the avatar ('?' for a blank name). */
13251
+ export declare function conversationInitial(name: string | null | undefined): string;
13252
+ /** Each message with the date separator that goes above it ('' when it shares the day of the previous message). */
13253
+ export declare function groupMessagesByDay(messages: readonly ConversationMessage[], now?: Date): ConversationMessageRow[];
13254
+ /** What the status mark beside an outbound message says to a screen reader ('' for a status that shows nothing). */
13255
+ export declare function conversationMessageStatusLabel(status: string | null | undefined): string;
13256
+ /** The mark shown beside an outbound message: ticks for sent / delivered, the word for the rest. */
13257
+ export declare function conversationMessageStatusMark(status: string | null | undefined): string;
13258
+ /**
13259
+ * The text-message inbox: a conversation list (search, filter tabs, pagination) on the left, the open thread (header, messages with date
13260
+ * separators and media, composer) in the middle and an optional contact panel on the right. On a phone the list and the thread take turns.
13261
+ *
13262
+ * <ui-conversations
13263
+ * [conversations]="rows()" [selected]="open()" [messages]="messages()" [loading]="loading()" [messagesLoading]="threadLoading()"
13264
+ * [filterTabs]="tabs" [filterCounts]="counts()" [activeFilter]="filter()" [page]="page()" [pageSize]="25" [totalItems]="total()"
13265
+ * [(draft)]="draft" [sending]="sending()" [canWrite]="canWrite()" [hasContext]="true" [(contextOpen)]="contextOpen"
13266
+ * (searchChange)="onSearch($event)" (filterChange)="filter.set($event)" (pageChange)="page.set($event)"
13267
+ * (selectConversation)="open.set($event)" (send)="onSend($event)" ...>
13268
+ * <div uiConversationsContext> ...contact details... </div>
13269
+ * </ui-conversations>
13270
+ *
13271
+ * The component keeps NO data and makes NO requests: the host loads, polls, sends, uploads, deletes and changes status, and passes the
13272
+ * results back in. It owns the layout, the keyboard / screen-reader behaviour, the scroll-to-latest rule (the thread follows new messages
13273
+ * only while the user is at its end), the focus moves of the one-column layout and the Enter-to-send rule (Shift+Enter is a new line; the
13274
+ * Enter that confirms an IME composition is not a send). `[canWrite]="false"` is the read-only view: no New / Delete / status / template
13275
+ * buttons and no composer.
13276
+ *
13277
+ * `[allowNew]="false"` / `[allowDelete]="false"` hide the New and Delete buttons for a host that cannot start or delete conversations while the composer
13278
+ * stays (a reply-only inbox such as Portal Messages). A message may carry a `sender` and an `action` link button (`(messageAction)`); a long thread
13279
+ * shows "Load earlier messages" while `[hasEarlier]` (`(loadEarlier)`); a failed thread load shows `[messagesError]` with Retry (`(messagesRetry)`).
13280
+ *
13281
+ * Test ids: conversations, conv-search, conv-filters, new-message-btn, conv-loading, conv-error, conv-retry, conv-empty, conv-item, conv-unread,
13282
+ * conv-arrow, conv-delete-btn, thread-empty, thread-error, thread-retry, load-earlier, msg-sender, msg-action, back-to-list, thread-name, thread-phone, use-template-btn, context-toggle, status-btn, thread-delete-btn,
13283
+ * messages, messages-loading, messages-empty, message, msg-status, attach-btn, attach-input, attachment-preview, attachment-remove,
13284
+ * compose-input, send-btn, compose-opted-out, compose-loading-contact, context-panel, context-close.
13285
+ */
13286
+ export declare class ConversationsComponent {
13287
+ readonly conversations: import("@angular/core").InputSignal<readonly ConversationItem[]>;
13288
+ /** The open conversation (null = none: the empty thread shows, and on a phone the list). It need not be on the current list page. */
13289
+ readonly selected: import("@angular/core").InputSignal<ConversationItem | null>;
13290
+ readonly title: import("@angular/core").InputSignal<string>;
13291
+ readonly loading: import("@angular/core").InputSignal<boolean>;
13292
+ /** A failed list load: the message, with a Retry button. */
13293
+ readonly error: import("@angular/core").InputSignal<string | null>;
13294
+ /** The search text (two-way). The host usually reacts to `(searchChange)`, which fires after the search box's own debounce. */
13295
+ readonly searchText: import("@angular/core").ModelSignal<string>;
13296
+ readonly searchPlaceholder: import("@angular/core").InputSignal<string>;
13297
+ readonly searchAriaLabel: import("@angular/core").InputSignal<string>;
13298
+ /** Search and filter tabs are hidden until the host says the first load is done (they would flash while loading). */
13299
+ readonly showFilters: import("@angular/core").InputSignal<boolean>;
13300
+ /** Filter tabs; none = no filter row. The empty value `''` is the "All" tab. */
13301
+ readonly filterTabs: import("@angular/core").InputSignal<QuickFilterTab[]>;
13302
+ readonly filterCounts: import("@angular/core").InputSignal<Record<string, number>>;
13303
+ readonly activeFilter: import("@angular/core").InputSignal<string>;
13304
+ readonly filterAriaLabel: import("@angular/core").InputSignal<string>;
13305
+ /** 1-based page, page size and total of the list. */
13306
+ readonly page: import("@angular/core").InputSignal<number>;
13307
+ readonly pageSize: import("@angular/core").InputSignal<number>;
13308
+ readonly totalItems: import("@angular/core").InputSignal<number>;
13309
+ readonly paginationAriaLabel: import("@angular/core").InputSignal<string>;
13310
+ readonly listAriaLabel: import("@angular/core").InputSignal<string>;
13311
+ readonly loadingLabel: import("@angular/core").InputSignal<string>;
13312
+ readonly emptyTitle: import("@angular/core").InputSignal<string>;
13313
+ readonly emptyMessage: import("@angular/core").InputSignal<string>;
13314
+ /** The empty-list text for a read-only user (who has no + button). */
13315
+ readonly emptyReadOnlyMessage: import("@angular/core").InputSignal<string>;
13316
+ readonly filteredEmptyTitle: import("@angular/core").InputSignal<string>;
13317
+ readonly filteredEmptyMessage: import("@angular/core").InputSignal<string>;
13318
+ readonly noMessagesText: import("@angular/core").InputSignal<string>;
13319
+ /** Shows the + (New) button for a writer. `false` for a host that cannot start conversations. */
13320
+ readonly allowNew: import("@angular/core").InputSignal<boolean>;
13321
+ /** Shows the bins (row and thread header) for a writer. `false` for a host that cannot delete conversations. */
13322
+ readonly allowDelete: import("@angular/core").InputSignal<boolean>;
13323
+ /** The arrow at the end of each conversation row, drawn inside the row so its highlight covers it. Default false (hidden); `true` where the arrow helps (rows that open a thread on a phone). */
13324
+ readonly showRowArrow: import("@angular/core").InputSignal<boolean>;
13325
+ readonly newLabel: import("@angular/core").InputSignal<string>;
13326
+ readonly newTooltip: import("@angular/core").InputSignal<string>;
13327
+ readonly deleteRowLabel: import("@angular/core").InputSignal<string>;
13328
+ readonly messages: import("@angular/core").InputSignal<readonly ConversationMessage[]>;
13329
+ readonly messagesLoading: import("@angular/core").InputSignal<boolean>;
13330
+ /** A failed thread load: the message, with a Retry button (`(messagesRetry)`). */
13331
+ readonly messagesError: import("@angular/core").InputSignal<string | null>;
13332
+ /** The loaded messages are only the newest ones: a "Load earlier messages" button shows above them. */
13333
+ readonly hasEarlier: import("@angular/core").InputSignal<boolean>;
13334
+ readonly loadingEarlier: import("@angular/core").InputSignal<boolean>;
13335
+ readonly loadEarlierLabel: import("@angular/core").InputSignal<string>;
13336
+ /** The thread header's Close / Reopen button: its label (also the tooltip); null = no button. */
13337
+ readonly statusActionLabel: import("@angular/core").InputSignal<string | null>;
13338
+ /** `close` (a check) or `reopen` (a circular arrow): which icon the status button shows. */
13339
+ readonly statusActionIcon: import("@angular/core").InputSignal<"close" | "reopen">;
13340
+ readonly statusChanging: import("@angular/core").InputSignal<boolean>;
13341
+ /** Shows the "Use a template" button (disabled with the composer). */
13342
+ readonly templatesEnabled: import("@angular/core").InputSignal<boolean>;
13343
+ readonly templateLabel: import("@angular/core").InputSignal<string>;
13344
+ readonly deleteThreadLabel: import("@angular/core").InputSignal<string>;
13345
+ readonly backLabel: import("@angular/core").InputSignal<string>;
13346
+ readonly threadAriaLabel: import("@angular/core").InputSignal<string>;
13347
+ readonly messagesAriaLabel: import("@angular/core").InputSignal<string>;
13348
+ readonly threadEmptyTitle: import("@angular/core").InputSignal<string>;
13349
+ readonly threadEmptyMessage: import("@angular/core").InputSignal<string>;
13350
+ readonly noMessagesWriteText: import("@angular/core").InputSignal<string>;
13351
+ readonly noMessagesReadText: import("@angular/core").InputSignal<string>;
13352
+ readonly youLabel: import("@angular/core").InputSignal<string>;
13353
+ readonly openMediaLabel: import("@angular/core").InputSignal<string>;
13354
+ readonly imageFallbackName: import("@angular/core").InputSignal<string>;
13355
+ readonly fileFallbackName: import("@angular/core").InputSignal<string>;
13356
+ /** Shows the contact-info toggle. The panel's content is the host's, projected with the `uiConversationsContext` attribute. */
13357
+ readonly hasContext: import("@angular/core").InputSignal<boolean>;
13358
+ /** The panel is open (two-way). It closes itself on Escape, the X and (one column) the backdrop, and when the conversation is closed. */
13359
+ readonly contextOpen: import("@angular/core").ModelSignal<boolean>;
13360
+ readonly contextTitle: import("@angular/core").InputSignal<string>;
13361
+ readonly showContextLabel: import("@angular/core").InputSignal<string>;
13362
+ readonly hideContextLabel: import("@angular/core").InputSignal<string>;
13363
+ readonly closeContextLabel: import("@angular/core").InputSignal<string>;
13364
+ /** Read-only view: no New / Delete / status / template buttons and no composer. */
13365
+ readonly canWrite: import("@angular/core").InputSignal<boolean>;
13366
+ /** The message being typed (two-way). The host clears it after a successful send. */
13367
+ readonly draft: import("@angular/core").ModelSignal<string>;
13368
+ readonly sending: import("@angular/core").InputSignal<boolean>;
13369
+ /** The composer is locked (e.g. the contact opted out): the box, attach and template buttons are disabled and nothing can be sent. */
13370
+ readonly composerDisabled: import("@angular/core").InputSignal<boolean>;
13371
+ /** A host-side reason nothing can be sent right now (e.g. the contact is still loading); the Send button is disabled. */
13372
+ readonly sendBlocked: import("@angular/core").InputSignal<boolean>;
13373
+ /** A warning under the composer, e.g. "This contact has opted out of text messages." */
13374
+ readonly composerNotice: import("@angular/core").InputSignal<string>;
13375
+ /** A polite status line under the composer (a live region), e.g. "Loading contact...". */
13376
+ readonly composerStatus: import("@angular/core").InputSignal<string>;
13377
+ /** An error on the message box. */
13378
+ readonly composerError: import("@angular/core").InputSignal<string>;
13379
+ /** Longest message the box accepts (1600 = the SMS provider's limit for one send). */
13380
+ readonly maxLength: import("@angular/core").InputSignal<number>;
13381
+ readonly attachment: import("@angular/core").InputSignal<ConversationAttachment | null>;
13382
+ readonly uploading: import("@angular/core").InputSignal<boolean>;
13383
+ readonly attachEnabled: import("@angular/core").InputSignal<boolean>;
13384
+ readonly acceptedFiles: import("@angular/core").InputSignal<string>;
13385
+ readonly maxFileSize: import("@angular/core").InputSignal<number | null>;
13386
+ readonly typeMessage: import("@angular/core").InputSignal<string>;
13387
+ readonly sizeMessage: import("@angular/core").InputSignal<string>;
13388
+ readonly composeLabel: import("@angular/core").InputSignal<string>;
13389
+ readonly composePlaceholder: import("@angular/core").InputSignal<string>;
13390
+ readonly sendLabel: import("@angular/core").InputSignal<string>;
13391
+ readonly attachLabel: import("@angular/core").InputSignal<string>;
13392
+ readonly removeAttachmentLabel: import("@angular/core").InputSignal<string>;
13393
+ readonly attachmentPreviewLabel: import("@angular/core").InputSignal<string>;
13394
+ /** "Now" for the relative times and date separators; null = the real clock. For tests and demos. */
13395
+ readonly now: import("@angular/core").InputSignal<Date | null>;
13396
+ readonly searchChange: import("@angular/core").OutputEmitterRef<string>;
13397
+ readonly filterChange: import("@angular/core").OutputEmitterRef<string>;
13398
+ readonly pageChange: import("@angular/core").OutputEmitterRef<number>;
13399
+ /** A row was clicked or opened with the keyboard. */
13400
+ readonly selectConversation: import("@angular/core").OutputEmitterRef<ConversationItem>;
13401
+ /** Back (one column): the host clears `selected`; the focus returns to the row that was open. */
13402
+ readonly back: import("@angular/core").OutputEmitterRef<void>;
13403
+ readonly newConversation: import("@angular/core").OutputEmitterRef<void>;
13404
+ readonly retry: import("@angular/core").OutputEmitterRef<void>;
13405
+ /** The bin on a row, or in the thread header. The host asks for confirmation. */
13406
+ readonly deleteConversation: import("@angular/core").OutputEmitterRef<ConversationItem>;
13407
+ /** The Close / Reopen button of the open conversation. */
13408
+ readonly statusChange: import("@angular/core").OutputEmitterRef<ConversationItem>;
13409
+ readonly templateRequest: import("@angular/core").OutputEmitterRef<void>;
13410
+ readonly send: import("@angular/core").OutputEmitterRef<ConversationSendEvent>;
13411
+ /** Files accepted by the attach picker (type and size already checked against `acceptedFiles` / `maxFileSize`). */
13412
+ readonly filesSelected: import("@angular/core").OutputEmitterRef<File[]>;
13413
+ readonly attachmentRemove: import("@angular/core").OutputEmitterRef<void>;
13414
+ /** An image in a bubble was clicked: the host opens it (usually in a new tab). */
13415
+ readonly mediaOpen: import("@angular/core").OutputEmitterRef<string>;
13416
+ /** The link-style button of a message (`ConversationMessage.action`) was clicked. */
13417
+ readonly messageAction: import("@angular/core").OutputEmitterRef<ConversationMessage>;
13418
+ /** "Load earlier messages": the host puts the older page above the loaded messages. */
13419
+ readonly loadEarlier: import("@angular/core").OutputEmitterRef<void>;
13420
+ /** Retry after a failed thread load. */
13421
+ readonly messagesRetry: import("@angular/core").OutputEmitterRef<void>;
13422
+ protected readonly titleId: string;
13423
+ protected readonly skeletonRows: number[];
13424
+ protected readonly skeletonBubbles: number[];
13425
+ protected readonly trackConversation: (c: ConversationItem) => string;
13426
+ protected readonly initial: typeof conversationInitial;
13427
+ protected readonly statusLabel: typeof conversationMessageStatusLabel;
13428
+ protected readonly statusMark: typeof conversationMessageStatusMark;
13429
+ private readonly injector;
13430
+ private readonly host;
13431
+ private readonly threadHeading;
13432
+ private readonly messagesEl;
13433
+ private readonly contextPanel;
13434
+ private readonly fileInput;
13435
+ /** True while the thread is scrolled to (or within NEAR_BOTTOM_PX of) its end; kept by the scroll handler. */
13436
+ private atBottom;
13437
+ private lastThreadId;
13438
+ protected readonly filtering: import("@angular/core").Signal<boolean>;
13439
+ protected readonly emptyText: import("@angular/core").Signal<string>;
13440
+ protected readonly messageRows: import("@angular/core").Signal<import("@forgeroute/ui").ConversationMessageRow[]>;
13441
+ protected readonly contextVisible: import("@angular/core").Signal<boolean>;
13442
+ /** Something to send (text or a file), the composer is open and no request is running. */
13443
+ readonly canSend: import("@angular/core").Signal<boolean>;
13444
+ constructor();
13445
+ protected relativeTime(iso: string | null | undefined): string;
13446
+ protected preview(text: string | null | undefined): string;
13447
+ protected time(message: ConversationMessage): string;
13448
+ /** A row was clicked or opened with the keyboard. */
13449
+ protected onRowOpen(conv: ConversationItem): void;
13450
+ protected onBack(): void;
13451
+ protected onMessagesScroll(): void;
13452
+ protected toggleContext(): void;
13453
+ /** Closes the contact panel; `restoreFocus` puts the focus back on the toggle that opened it. */
13454
+ protected closeContext(restoreFocus?: boolean): void;
13455
+ protected openFilePicker(): void;
13456
+ protected onComposeKeydown(event: KeyboardEvent): void;
13457
+ protected sendMessage(): void;
13458
+ private clock;
13459
+ private singleColumn;
13460
+ private scrollToBottom;
13461
+ static ɵfac: i0.ɵɵFactoryDeclaration<ConversationsComponent, never>;
13462
+ static ɵcmp: i0.ɵɵComponentDeclaration<ConversationsComponent, "ui-conversations", never, {
13463
+ "conversations": {
13464
+ "alias": "conversations";
13465
+ "required": false;
13466
+ "isSignal": true;
13467
+ };
13468
+ "selected": {
13469
+ "alias": "selected";
13470
+ "required": false;
13471
+ "isSignal": true;
13472
+ };
13473
+ "title": {
13474
+ "alias": "title";
13475
+ "required": false;
13476
+ "isSignal": true;
13477
+ };
13478
+ "loading": {
13479
+ "alias": "loading";
13480
+ "required": false;
13481
+ "isSignal": true;
13482
+ };
13483
+ "error": {
13484
+ "alias": "error";
13485
+ "required": false;
13486
+ "isSignal": true;
13487
+ };
13488
+ "searchText": {
13489
+ "alias": "searchText";
13490
+ "required": false;
13491
+ "isSignal": true;
13492
+ };
13493
+ "searchPlaceholder": {
13494
+ "alias": "searchPlaceholder";
13495
+ "required": false;
13496
+ "isSignal": true;
13497
+ };
13498
+ "searchAriaLabel": {
13499
+ "alias": "searchAriaLabel";
13500
+ "required": false;
13501
+ "isSignal": true;
13502
+ };
13503
+ "showFilters": {
13504
+ "alias": "showFilters";
13505
+ "required": false;
13506
+ "isSignal": true;
13507
+ };
13508
+ "filterTabs": {
13509
+ "alias": "filterTabs";
13510
+ "required": false;
13511
+ "isSignal": true;
13512
+ };
13513
+ "filterCounts": {
13514
+ "alias": "filterCounts";
13515
+ "required": false;
13516
+ "isSignal": true;
13517
+ };
13518
+ "activeFilter": {
13519
+ "alias": "activeFilter";
13520
+ "required": false;
13521
+ "isSignal": true;
13522
+ };
13523
+ "filterAriaLabel": {
13524
+ "alias": "filterAriaLabel";
13525
+ "required": false;
13526
+ "isSignal": true;
13527
+ };
13528
+ "page": {
13529
+ "alias": "page";
13530
+ "required": false;
13531
+ "isSignal": true;
13532
+ };
13533
+ "pageSize": {
13534
+ "alias": "pageSize";
13535
+ "required": false;
13536
+ "isSignal": true;
13537
+ };
13538
+ "totalItems": {
13539
+ "alias": "totalItems";
13540
+ "required": false;
13541
+ "isSignal": true;
13542
+ };
13543
+ "paginationAriaLabel": {
13544
+ "alias": "paginationAriaLabel";
13545
+ "required": false;
13546
+ "isSignal": true;
13547
+ };
13548
+ "listAriaLabel": {
13549
+ "alias": "listAriaLabel";
13550
+ "required": false;
13551
+ "isSignal": true;
13552
+ };
13553
+ "loadingLabel": {
13554
+ "alias": "loadingLabel";
13555
+ "required": false;
13556
+ "isSignal": true;
13557
+ };
13558
+ "emptyTitle": {
13559
+ "alias": "emptyTitle";
13560
+ "required": false;
13561
+ "isSignal": true;
13562
+ };
13563
+ "emptyMessage": {
13564
+ "alias": "emptyMessage";
13565
+ "required": false;
13566
+ "isSignal": true;
13567
+ };
13568
+ "emptyReadOnlyMessage": {
13569
+ "alias": "emptyReadOnlyMessage";
13570
+ "required": false;
13571
+ "isSignal": true;
13572
+ };
13573
+ "filteredEmptyTitle": {
13574
+ "alias": "filteredEmptyTitle";
13575
+ "required": false;
13576
+ "isSignal": true;
13577
+ };
13578
+ "filteredEmptyMessage": {
13579
+ "alias": "filteredEmptyMessage";
13580
+ "required": false;
13581
+ "isSignal": true;
13582
+ };
13583
+ "noMessagesText": {
13584
+ "alias": "noMessagesText";
13585
+ "required": false;
13586
+ "isSignal": true;
13587
+ };
13588
+ "allowNew": {
13589
+ "alias": "allowNew";
13590
+ "required": false;
13591
+ "isSignal": true;
13592
+ };
13593
+ "allowDelete": {
13594
+ "alias": "allowDelete";
13595
+ "required": false;
13596
+ "isSignal": true;
13597
+ };
13598
+ "showRowArrow": {
13599
+ "alias": "showRowArrow";
13600
+ "required": false;
13601
+ "isSignal": true;
13602
+ };
13603
+ "newLabel": {
13604
+ "alias": "newLabel";
13605
+ "required": false;
13606
+ "isSignal": true;
13607
+ };
13608
+ "newTooltip": {
13609
+ "alias": "newTooltip";
13610
+ "required": false;
13611
+ "isSignal": true;
13612
+ };
13613
+ "deleteRowLabel": {
13614
+ "alias": "deleteRowLabel";
13615
+ "required": false;
13616
+ "isSignal": true;
13617
+ };
13618
+ "messages": {
13619
+ "alias": "messages";
13620
+ "required": false;
13621
+ "isSignal": true;
13622
+ };
13623
+ "messagesLoading": {
13624
+ "alias": "messagesLoading";
13625
+ "required": false;
13626
+ "isSignal": true;
13627
+ };
13628
+ "messagesError": {
13629
+ "alias": "messagesError";
13630
+ "required": false;
13631
+ "isSignal": true;
13632
+ };
13633
+ "hasEarlier": {
13634
+ "alias": "hasEarlier";
13635
+ "required": false;
13636
+ "isSignal": true;
13637
+ };
13638
+ "loadingEarlier": {
13639
+ "alias": "loadingEarlier";
13640
+ "required": false;
13641
+ "isSignal": true;
13642
+ };
13643
+ "loadEarlierLabel": {
13644
+ "alias": "loadEarlierLabel";
13645
+ "required": false;
13646
+ "isSignal": true;
13647
+ };
13648
+ "statusActionLabel": {
13649
+ "alias": "statusActionLabel";
13650
+ "required": false;
13651
+ "isSignal": true;
13652
+ };
13653
+ "statusActionIcon": {
13654
+ "alias": "statusActionIcon";
13655
+ "required": false;
13656
+ "isSignal": true;
13657
+ };
13658
+ "statusChanging": {
13659
+ "alias": "statusChanging";
13660
+ "required": false;
13661
+ "isSignal": true;
13662
+ };
13663
+ "templatesEnabled": {
13664
+ "alias": "templatesEnabled";
13665
+ "required": false;
13666
+ "isSignal": true;
13667
+ };
13668
+ "templateLabel": {
13669
+ "alias": "templateLabel";
13670
+ "required": false;
13671
+ "isSignal": true;
13672
+ };
13673
+ "deleteThreadLabel": {
13674
+ "alias": "deleteThreadLabel";
13675
+ "required": false;
13676
+ "isSignal": true;
13677
+ };
13678
+ "backLabel": {
13679
+ "alias": "backLabel";
13680
+ "required": false;
13681
+ "isSignal": true;
13682
+ };
13683
+ "threadAriaLabel": {
13684
+ "alias": "threadAriaLabel";
13685
+ "required": false;
13686
+ "isSignal": true;
13687
+ };
13688
+ "messagesAriaLabel": {
13689
+ "alias": "messagesAriaLabel";
13690
+ "required": false;
13691
+ "isSignal": true;
13692
+ };
13693
+ "threadEmptyTitle": {
13694
+ "alias": "threadEmptyTitle";
13695
+ "required": false;
13696
+ "isSignal": true;
13697
+ };
13698
+ "threadEmptyMessage": {
13699
+ "alias": "threadEmptyMessage";
13700
+ "required": false;
13701
+ "isSignal": true;
13702
+ };
13703
+ "noMessagesWriteText": {
13704
+ "alias": "noMessagesWriteText";
13705
+ "required": false;
13706
+ "isSignal": true;
13707
+ };
13708
+ "noMessagesReadText": {
13709
+ "alias": "noMessagesReadText";
13710
+ "required": false;
13711
+ "isSignal": true;
13712
+ };
13713
+ "youLabel": {
13714
+ "alias": "youLabel";
13715
+ "required": false;
13716
+ "isSignal": true;
13717
+ };
13718
+ "openMediaLabel": {
13719
+ "alias": "openMediaLabel";
13720
+ "required": false;
13721
+ "isSignal": true;
13722
+ };
13723
+ "imageFallbackName": {
13724
+ "alias": "imageFallbackName";
13725
+ "required": false;
13726
+ "isSignal": true;
13727
+ };
13728
+ "fileFallbackName": {
13729
+ "alias": "fileFallbackName";
13730
+ "required": false;
13731
+ "isSignal": true;
13732
+ };
13733
+ "hasContext": {
13734
+ "alias": "hasContext";
13735
+ "required": false;
13736
+ "isSignal": true;
13737
+ };
13738
+ "contextOpen": {
13739
+ "alias": "contextOpen";
13740
+ "required": false;
13741
+ "isSignal": true;
13742
+ };
13743
+ "contextTitle": {
13744
+ "alias": "contextTitle";
13745
+ "required": false;
13746
+ "isSignal": true;
13747
+ };
13748
+ "showContextLabel": {
13749
+ "alias": "showContextLabel";
13750
+ "required": false;
13751
+ "isSignal": true;
13752
+ };
13753
+ "hideContextLabel": {
13754
+ "alias": "hideContextLabel";
13755
+ "required": false;
13756
+ "isSignal": true;
13757
+ };
13758
+ "closeContextLabel": {
13759
+ "alias": "closeContextLabel";
13760
+ "required": false;
13761
+ "isSignal": true;
13762
+ };
13763
+ "canWrite": {
13764
+ "alias": "canWrite";
13765
+ "required": false;
13766
+ "isSignal": true;
13767
+ };
13768
+ "draft": {
13769
+ "alias": "draft";
13770
+ "required": false;
13771
+ "isSignal": true;
13772
+ };
13773
+ "sending": {
13774
+ "alias": "sending";
13775
+ "required": false;
13776
+ "isSignal": true;
13777
+ };
13778
+ "composerDisabled": {
13779
+ "alias": "composerDisabled";
13780
+ "required": false;
13781
+ "isSignal": true;
13782
+ };
13783
+ "sendBlocked": {
13784
+ "alias": "sendBlocked";
13785
+ "required": false;
13786
+ "isSignal": true;
13787
+ };
13788
+ "composerNotice": {
13789
+ "alias": "composerNotice";
13790
+ "required": false;
13791
+ "isSignal": true;
13792
+ };
13793
+ "composerStatus": {
13794
+ "alias": "composerStatus";
13795
+ "required": false;
13796
+ "isSignal": true;
13797
+ };
13798
+ "composerError": {
13799
+ "alias": "composerError";
13800
+ "required": false;
13801
+ "isSignal": true;
13802
+ };
13803
+ "maxLength": {
13804
+ "alias": "maxLength";
13805
+ "required": false;
13806
+ "isSignal": true;
13807
+ };
13808
+ "attachment": {
13809
+ "alias": "attachment";
13810
+ "required": false;
13811
+ "isSignal": true;
13812
+ };
13813
+ "uploading": {
13814
+ "alias": "uploading";
13815
+ "required": false;
13816
+ "isSignal": true;
13817
+ };
13818
+ "attachEnabled": {
13819
+ "alias": "attachEnabled";
13820
+ "required": false;
13821
+ "isSignal": true;
13822
+ };
13823
+ "acceptedFiles": {
13824
+ "alias": "acceptedFiles";
13825
+ "required": false;
13826
+ "isSignal": true;
13827
+ };
13828
+ "maxFileSize": {
13829
+ "alias": "maxFileSize";
13830
+ "required": false;
13831
+ "isSignal": true;
13832
+ };
13833
+ "typeMessage": {
13834
+ "alias": "typeMessage";
13835
+ "required": false;
13836
+ "isSignal": true;
13837
+ };
13838
+ "sizeMessage": {
13839
+ "alias": "sizeMessage";
13840
+ "required": false;
13841
+ "isSignal": true;
13842
+ };
13843
+ "composeLabel": {
13844
+ "alias": "composeLabel";
13845
+ "required": false;
13846
+ "isSignal": true;
13847
+ };
13848
+ "composePlaceholder": {
13849
+ "alias": "composePlaceholder";
13850
+ "required": false;
13851
+ "isSignal": true;
13852
+ };
13853
+ "sendLabel": {
13854
+ "alias": "sendLabel";
13855
+ "required": false;
13856
+ "isSignal": true;
13857
+ };
13858
+ "attachLabel": {
13859
+ "alias": "attachLabel";
13860
+ "required": false;
13861
+ "isSignal": true;
13862
+ };
13863
+ "removeAttachmentLabel": {
13864
+ "alias": "removeAttachmentLabel";
13865
+ "required": false;
13866
+ "isSignal": true;
13867
+ };
13868
+ "attachmentPreviewLabel": {
13869
+ "alias": "attachmentPreviewLabel";
13870
+ "required": false;
13871
+ "isSignal": true;
13872
+ };
13873
+ "now": {
13874
+ "alias": "now";
13875
+ "required": false;
13876
+ "isSignal": true;
13877
+ };
13878
+ }, {
13879
+ "searchText": "searchTextChange";
13880
+ "contextOpen": "contextOpenChange";
13881
+ "draft": "draftChange";
13882
+ "searchChange": "searchChange";
13883
+ "filterChange": "filterChange";
13884
+ "pageChange": "pageChange";
13885
+ "selectConversation": "selectConversation";
13886
+ "back": "back";
13887
+ "newConversation": "newConversation";
13888
+ "retry": "retry";
13889
+ "deleteConversation": "deleteConversation";
13890
+ "statusChange": "statusChange";
13891
+ "templateRequest": "templateRequest";
13892
+ "send": "send";
13893
+ "filesSelected": "filesSelected";
13894
+ "attachmentRemove": "attachmentRemove";
13895
+ "mediaOpen": "mediaOpen";
13896
+ "messageAction": "messageAction";
13897
+ "loadEarlier": "loadEarlier";
13898
+ "messagesRetry": "messagesRetry";
13899
+ }, never, ["[uiConversationsContext]"], true, never>;
13900
+ }
13169
13901
  export type { CalendarDay, CalendarRange, CalendarViewMode };