@forgeroute/ui 0.4.24 → 0.4.26

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.24",
3
+ "version": "0.4.26",
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>;
@@ -489,6 +489,8 @@ export declare class PaginationComponent {
489
489
  readonly detached: import("@angular/core").InputSignal<boolean>;
490
490
  /** Embedded look for a container that already has its own background and edge (a `ui-detail-card` footer, a panel): transparent, no border, no radius, no padding. Default false: unchanged. Wins over `detached`. */
491
491
  readonly embedded: import("@angular/core").InputSignal<boolean>;
492
+ /** Accessible name of the pager's navigation landmark (default `Pagination`). Give each pager of a page its own name (`Contacts pages`) so assistive tech can tell them apart; empty or blank falls back to the default. */
493
+ readonly ariaLabel: import("@angular/core").InputSignal<string>;
492
494
  readonly pageChange: import("@angular/core").OutputEmitterRef<number>;
493
495
  readonly totalPages: import("@angular/core").Signal<number>;
494
496
  readonly startItem: import("@angular/core").Signal<number>;
@@ -522,6 +524,11 @@ export declare class PaginationComponent {
522
524
  "required": false;
523
525
  "isSignal": true;
524
526
  };
527
+ "ariaLabel": {
528
+ "alias": "ariaLabel";
529
+ "required": false;
530
+ "isSignal": true;
531
+ };
525
532
  }, {
526
533
  "pageChange": "pageChange";
527
534
  }, never, never, true, never>;
@@ -1320,6 +1327,12 @@ export declare class DataTableComponent<T extends Record<string, any>> implement
1320
1327
  * tabs are all off, the header row is not rendered at all.
1321
1328
  */
1322
1329
  readonly showQuickTabs: import("@angular/core").InputSignal<boolean>;
1330
+ /**
1331
+ * Keep the Actions column (the row "⋮" menu) pinned to the right edge while the table scrolls sideways, so a wide table never hides it
1332
+ * off-screen. Default false: every existing table is unchanged. Only matters when the table is wider than its container (columns scroll);
1333
+ * phones use the card list, which has no sideways scroll.
1334
+ */
1335
+ readonly stickyActions: import("@angular/core").InputSignal<boolean>;
1323
1336
  /**
1324
1337
  * Optional heading shown at the start of the header row, on the same row as the search box / tabs on the left and the
1325
1338
  * Export / primary buttons on the right (rendered as an `<h3>`, also while the table is loading and when it is empty).
@@ -1859,6 +1872,11 @@ export declare class DataTableComponent<T extends Record<string, any>> implement
1859
1872
  "required": false;
1860
1873
  "isSignal": true;
1861
1874
  };
1875
+ "stickyActions": {
1876
+ "alias": "stickyActions";
1877
+ "required": false;
1878
+ "isSignal": true;
1879
+ };
1862
1880
  "tableTitle": {
1863
1881
  "alias": "tableTitle";
1864
1882
  "required": false;
@@ -6882,6 +6900,18 @@ export interface PanelInfoSection {
6882
6900
  label: string;
6883
6901
  url: string;
6884
6902
  };
6903
+ /**
6904
+ * 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
6905
+ * click; `ariaLabel` is the accessible name when the visible label is not enough (default: the label). The header bar is shown
6906
+ * for a section with a `headerAction` even when it has no `title`. Not rendered for a section with no visible items unless
6907
+ * `showEmptyState` keeps the section.
6908
+ */
6909
+ headerAction?: {
6910
+ label: string;
6911
+ action: () => void;
6912
+ ariaLabel?: string;
6913
+ disabled?: boolean;
6914
+ };
6885
6915
  items: PanelInfoItem[];
6886
6916
  columns?: 2;
6887
6917
  }
@@ -6954,6 +6984,9 @@ export declare class PanelInfoListComponent {
6954
6984
  * readers announce it as pressed / not pressed. A dismissible chip is a removable tag, not a toggle, so it carries no
6955
6985
  * `aria-pressed` (the ✕ button is named "Remove <label>").
6956
6986
  *
6987
+ * Dismissible chips can be removed from the keyboard: Tab to the ✕ (focusable, named "Remove <label>") and press Enter or
6988
+ * Space, or press Delete / Backspace while the chip itself is focused.
6989
+ *
6957
6990
  * Dismissible (shows an ✕ button — parent removes the chip on dismiss):
6958
6991
  * <ui-chip label="Austin" size="sm" [dismissible]="true" (dismiss)="removeCity('Austin')" />
6959
6992
  *
@@ -6992,6 +7025,11 @@ export declare class ChipComponent implements ControlValueAccessor {
6992
7025
  protected _onTouched: () => void;
6993
7026
  protected onClick(): void;
6994
7027
  protected onDismiss(event: Event): void;
7028
+ /**
7029
+ * Keyboard removal: Enter / Space on the focused ✕, or Delete / Backspace on the chip itself (dismissible chips only).
7030
+ * Handled here so the key never also toggles the chip.
7031
+ */
7032
+ protected onDismissKey(event: Event): void;
6995
7033
  writeValue(v: boolean): void;
6996
7034
  registerOnChange(fn: (v: boolean) => void): void;
6997
7035
  registerOnTouched(fn: () => void): void;
@@ -7259,7 +7297,7 @@ export declare class AppShellComponent implements OnInit, OnDestroy {
7259
7297
  };
7260
7298
  }, {
7261
7299
  "logoutClick": "logoutClick";
7262
- }, never, ["[shell-brand]", "[shell-header-end]", "[shell-banners]", "*"], true, never>;
7300
+ }, never, ["[shell-brand]", "[shell-header-start]", "[shell-header-end]", "[shell-banners]", "*"], true, never>;
7263
7301
  }
7264
7302
  export type AlertVariant = 'info' | 'success' | 'warning' | 'danger' | 'neutral';
7265
7303
  /**
@@ -7277,6 +7315,11 @@ export declare class AlertComponent {
7277
7315
  readonly variant: import("@angular/core").InputSignal<AlertVariant>;
7278
7316
  readonly title: import("@angular/core").InputSignal<string>;
7279
7317
  readonly dismissible: import("@angular/core").InputSignal<boolean>;
7318
+ /**
7319
+ * Accessible name of the dismiss (X) button. Default "Dismiss". In a list of alerts give each its own name
7320
+ * ("Dismiss Significant alert from Sep 20, 2026") so a screen-reader user can tell the buttons apart.
7321
+ */
7322
+ readonly dismissAriaLabel: import("@angular/core").InputSignal<string>;
7280
7323
  /**
7281
7324
  * Quiet: no live-region role, so a screen reader does NOT announce it when it appears. Use it for an alert that is already on
7282
7325
  * the page when the user gets there, or for each item of a long list of alerts (e.g. one per failed import row — 500 danger
@@ -7310,6 +7353,11 @@ export declare class AlertComponent {
7310
7353
  "required": false;
7311
7354
  "isSignal": true;
7312
7355
  };
7356
+ "dismissAriaLabel": {
7357
+ "alias": "dismissAriaLabel";
7358
+ "required": false;
7359
+ "isSignal": true;
7360
+ };
7313
7361
  "quiet": {
7314
7362
  "alias": "quiet";
7315
7363
  "required": false;