@forgeroute/ui 0.4.57 → 0.4.58

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<"default" | "sm">;
1098
+ readonly size: import("@angular/core").InputSignal<"sm" | "default">;
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<"primary" | "danger" | "warning">;
2155
+ readonly primaryVariant: import("@angular/core").InputSignal<"danger" | "warning" | "primary">;
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<"hidden" | "auto" | "visible">;
2263
+ readonly bodyOverflow: import("@angular/core").InputSignal<"auto" | "hidden" | "visible">;
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. */
@@ -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<"primary" | "secondary" | "danger" | "warning" | "link" | "ghost" | "ghost-start" | "tab" | "icon" | "icon-danger">;
3966
+ readonly variant: import("@angular/core").InputSignal<"link" | "danger" | "warning" | "primary" | "secondary" | "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' }`). */
@@ -3984,7 +3984,7 @@ export declare class ButtonComponent {
3984
3984
  */
3985
3985
  readonly href: import("@angular/core").InputSignal<string | null>;
3986
3986
  /** Where to open the `href` (`_blank` = a new tab). */
3987
- readonly target: import("@angular/core").InputSignal<"_self" | "_blank" | "_parent" | "_top" | null>;
3987
+ readonly target: import("@angular/core").InputSignal<"_blank" | "_self" | "_parent" | "_top" | null>;
3988
3988
  /** `rel` of the `href` link. A `_blank` target always gets `noopener noreferrer` added. */
3989
3989
  readonly rel: import("@angular/core").InputSignal<string | null>;
3990
3990
  /** The href when it is allowed (http, https, mailto, tel, sms or a relative URL), else null. */
@@ -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<"sm" | "md" | "lg" | "xs">;
4012
- readonly type: import("@angular/core").InputSignal<"reset" | "submit" | "button">;
4011
+ readonly size: import("@angular/core").InputSignal<"xs" | "sm" | "md" | "lg">;
4012
+ readonly type: import("@angular/core").InputSignal<"button" | "reset" | "submit">;
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>;
@@ -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" | "text" | "search" | "email" | "tel" | "url" | "decimal" | "numeric">;
4960
+ readonly inputmode: import("@angular/core").InputSignal<"" | "none" | "search" | "text" | "email" | "tel" | "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. */
@@ -6424,7 +6424,7 @@ export declare class DropdownComponent {
6424
6424
  readonly loader: import("@angular/core").InputSignal<(() => Promise<DropdownItem[]>) | null>;
6425
6425
  readonly active: import("@angular/core").InputSignal<boolean>;
6426
6426
  readonly activeValue: import("@angular/core").InputSignal<string>;
6427
- readonly variant: import("@angular/core").InputSignal<"badge" | "button">;
6427
+ readonly variant: import("@angular/core").InputSignal<"button" | "badge">;
6428
6428
  readonly menuWidth: import("@angular/core").InputSignal<string>;
6429
6429
  /**
6430
6430
  * Fixed width of the trigger as a CSS length (e.g. `'280px'`). Empty (default) = the trigger is as wide as its label. When set, the trigger keeps that
@@ -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<"" | "2" | "3" | 2 | 3 | "all">;
6748
+ readonly uiColSpan: import("@angular/core").InputSignal<"" | "all" | "2" | 2 | "3" | 3>;
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, {
@@ -7862,9 +7862,9 @@ export declare class ChipGroupComponent {
7862
7862
  readonly spaceAbove: import("@angular/core").InputSignal<"none" | "sm" | "md">;
7863
7863
  /** Space below the chip group. */
7864
7864
  readonly spaceBelow: import("@angular/core").InputSignal<"none" | "sm" | "md">;
7865
- protected readonly _gap: import("@angular/core").Signal<"6px" | "12px" | "8px">;
7866
- protected readonly _spaceAbove: import("@angular/core").Signal<"0" | "6px" | "12px">;
7867
- protected readonly _spaceBelow: import("@angular/core").Signal<"0" | "6px" | "12px">;
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">;
7868
7868
  static ɵfac: i0.ɵɵFactoryDeclaration<ChipGroupComponent, never>;
7869
7869
  static ɵcmp: i0.ɵɵComponentDeclaration<ChipGroupComponent, "ui-chip-group", never, {
7870
7870
  "gap": {
@@ -9657,7 +9657,7 @@ export declare class PdfHotspotComponent {
9657
9657
  /** `ready`: clickable; `blocked`: disabled (a prerequisite is missing); `signed`: shows `image`. */
9658
9658
  readonly state: import("@angular/core").InputSignal<"ready" | "blocked" | "signed">;
9659
9659
  /** `warning` gives the ready state an amber look (e.g. for initials), default is blue. */
9660
- readonly tone: import("@angular/core").InputSignal<"primary" | "warning">;
9660
+ readonly tone: import("@angular/core").InputSignal<"warning" | "primary">;
9661
9661
  /** Text of the ready button (e.g. "Sign Here"). */
9662
9662
  readonly label: import("@angular/core").InputSignal<string>;
9663
9663
  /** Text of the blocked button (e.g. "Add signature above"). */
@@ -12919,4 +12919,251 @@ export declare const DEFAULT_EMAIL_TEMPLATE_VARIABLE_GROUPS: {
12919
12919
  * Content-Security-Policy meta blocks scripts and anything but images / inline styles, and links open nowhere (sandbox, no popups).
12920
12920
  */
12921
12921
  export declare function buildPreviewDocument(bodyHtml: string): string;
12922
+ export type ShareOption = 'native' | 'facebook' | 'x' | 'linkedin' | 'email' | 'gmail' | 'outlook' | 'copy';
12923
+ interface ShareTile {
12924
+ value: ShareOption;
12925
+ label: string;
12926
+ background: string;
12927
+ }
12928
+ /**
12929
+ * "Share" control for a public page (an obituary, a blog post, any shareable item). The button opens a floating panel (over the page, so nothing moves)
12930
+ * with one round icon per option and its name underneath, in a row like a phone's share sheet. Phones and tablets get Facebook, X,
12931
+ * LinkedIn, Email (their mail app), Copy link and "More" (the device's own share sheet). Desktops get Gmail and Outlook instead of Email:
12932
+ * a `mailto:` link does nothing on a computer without a mail app, while the webmail compose windows always open. "Link copied" is the library toast. The link is the public page
12933
+ * of the item (never an `?embed=true` widget URL). Theming: `--ui-share-accent` (focus ring and the Copy link tile; default the library `--primary`).
12934
+ *
12935
+ * <ui-share-menu [url]="pageUrl" [title]="post.title" label="blog post" />
12936
+ */
12937
+ export declare class ShareMenuComponent {
12938
+ /** The public page link to share. */
12939
+ readonly url: import("@angular/core").InputSignal<string>;
12940
+ /** The headline: the item's name or title (the X text, the email subject and the share-sheet title). */
12941
+ readonly title: import("@angular/core").InputSignal<string>;
12942
+ /** Used in the accessible name, e.g. "obituary" or "blog post" (→ "Share obituary"). */
12943
+ readonly label: import("@angular/core").InputSignal<string>;
12944
+ /** Unique id of the floating panel (several menus can be on one page). */
12945
+ protected readonly panelId: string;
12946
+ private readonly doc;
12947
+ private readonly toast;
12948
+ private readonly injector;
12949
+ private readonly host;
12950
+ private readonly trigger;
12951
+ private readonly panel;
12952
+ readonly open: import("@angular/core").WritableSignal<boolean>;
12953
+ /** Pixels the panel is moved sideways so it never runs off either edge of the screen (or of the embedding frame). */
12954
+ readonly shiftX: import("@angular/core").WritableSignal<number>;
12955
+ /**
12956
+ * "More" opens the device's own share sheet (Messages, AirDrop, Mail, WhatsApp…). It is offered on touch devices only: a desktop
12957
+ * browser has the other options already, and its share sheet is limited (or absent), so "More" there would look broken.
12958
+ */
12959
+ private readonly isTouchDevice;
12960
+ private readonly canNativeShare;
12961
+ readonly tiles: import("@angular/core").Signal<ShareTile[]>;
12962
+ /** The link each option opens (social sites in a new tab; the mail app in this window). */
12963
+ readonly links: import("@angular/core").Signal<{
12964
+ facebook: string;
12965
+ x: string;
12966
+ linkedin: string;
12967
+ email: string;
12968
+ gmail: string;
12969
+ outlook: string;
12970
+ }>;
12971
+ toggle(event: Event): void;
12972
+ private show;
12973
+ close(returnFocus?: boolean): void;
12974
+ onEscape(): void;
12975
+ onDocumentClick(event: Event): void;
12976
+ onFocusOut(event: FocusEvent): void;
12977
+ /** Left / Right / Home / End move between the options. */
12978
+ onPanelKeydown(event: KeyboardEvent): void;
12979
+ choose(option: ShareOption): void;
12980
+ private nativeShare;
12981
+ /** Phones and tablets: opens the device's mail app with the subject and body filled in. */
12982
+ private email;
12983
+ private copy;
12984
+ private legacyCopy;
12985
+ static ɵfac: i0.ɵɵFactoryDeclaration<ShareMenuComponent, never>;
12986
+ static ɵcmp: i0.ɵɵComponentDeclaration<ShareMenuComponent, "ui-share-menu", never, {
12987
+ "url": {
12988
+ "alias": "url";
12989
+ "required": true;
12990
+ "isSignal": true;
12991
+ };
12992
+ "title": {
12993
+ "alias": "title";
12994
+ "required": true;
12995
+ "isSignal": true;
12996
+ };
12997
+ "label": {
12998
+ "alias": "label";
12999
+ "required": false;
13000
+ "isSignal": true;
13001
+ };
13002
+ }, {}, never, never, true, never>;
13003
+ }
13004
+ /**
13005
+ * The links the public Share control builds. Pure functions so the component and its spec produce the exact same text.
13006
+ * Every value is URL-encoded, so a title holding `&`, `#`, quotes or non-ASCII text can never break out of its query parameter.
13007
+ */
13008
+ export declare const facebookShareUrl: (url: string) => string;
13009
+ export declare const xShareUrl: (url: string, text: string) => string;
13010
+ export declare const linkedInShareUrl: (url: string) => string;
13011
+ /** Gmail's compose window (a new tab) with the subject and body filled in: for desktop visitors, who often have no mail app for `mailto:`. */
13012
+ export declare const gmailShareUrl: (url: string, title: string) => string;
13013
+ /** Outlook.com's compose window (a new tab) with the subject and body filled in. */
13014
+ export declare const outlookShareUrl: (url: string, title: string) => string;
13015
+ /** `mailto:` with the title as the subject and the title plus the link as the body (encodeURIComponent, never `+` for spaces). */
13016
+ export declare const emailShareUrl: (url: string, title: string) => string;
13017
+ export type SnackbarType = 'success' | 'error' | 'info';
13018
+ /** An optional button inside a snackbar (e.g. "View"): clicking it runs `callback` and closes the snackbar. */
13019
+ export interface SnackbarAction {
13020
+ label: string;
13021
+ callback: () => void;
13022
+ }
13023
+ export interface SnackbarMessage {
13024
+ id: number;
13025
+ message: string;
13026
+ type: SnackbarType;
13027
+ action?: SnackbarAction;
13028
+ }
13029
+ /**
13030
+ * Stacked, top-right notifications: several can be on screen at once, each closes itself after `duration` ms (0 = stays until closed)
13031
+ * and can carry one action button. Render them once, near the root of the app, with `<ui-snackbar />`.
13032
+ * (`ToastService` / `<ui-toast>` is the single bottom-centre message; this is the stack with actions.)
13033
+ */
13034
+ export declare class SnackbarService {
13035
+ private readonly _messages;
13036
+ private nextId;
13037
+ private readonly timers;
13038
+ /** The messages on screen, oldest first (a copy). */
13039
+ messages$(): SnackbarMessage[];
13040
+ showSuccess(message: string, duration?: number): void;
13041
+ showError(message: string, duration?: number): void;
13042
+ showInfo(message: string, duration?: number, action?: SnackbarAction): void;
13043
+ private show;
13044
+ dismiss(id: number): void;
13045
+ static ɵfac: i0.ɵɵFactoryDeclaration<SnackbarService, never>;
13046
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
13047
+ }
13048
+ /**
13049
+ * The on-screen stack of `SnackbarService` messages (top-right, above the page). Put one `<ui-snackbar />` near the root of the app.
13050
+ * Each message is a library `ui-alert` (green success, red error, blue info) with a close button and, when the message has one, an
13051
+ * action button. Test ids: `success-message` / `error-message` / `info-message` on each message, `snackbar-action` on the action button.
13052
+ */
13053
+ export declare class SnackbarComponent {
13054
+ private readonly service;
13055
+ /** The messages on screen. */
13056
+ protected readonly messages: import("@angular/core").Signal<SnackbarMessage[]>;
13057
+ protected variant(m: SnackbarMessage): 'success' | 'danger' | 'info';
13058
+ protected dismiss(id: number): void;
13059
+ /** Runs the action, then closes the message. */
13060
+ protected runAction(m: SnackbarMessage, callback: () => void): void;
13061
+ static ɵfac: i0.ɵɵFactoryDeclaration<SnackbarComponent, never>;
13062
+ static ɵcmp: i0.ɵɵComponentDeclaration<SnackbarComponent, "ui-snackbar", never, {}, {}, never, never, true, never>;
13063
+ }
13064
+ /**
13065
+ * A banner across the top of the page while the browser is offline (`navigator.onLine`, kept current by the window's `online` /
13066
+ * `offline` events). The user can dismiss it; it comes back the next time the connection drops. Put one near the root of the app:
13067
+ *
13068
+ * <ui-offline-banner />
13069
+ *
13070
+ * `offline` overrides the browser's own state (for an app that does its own connectivity check). Texts can be changed with `title`
13071
+ * and `message`. Test ids: `offline-banner`, `offline-banner-dismiss`.
13072
+ */
13073
+ export declare class OfflineBannerComponent {
13074
+ readonly title: import("@angular/core").InputSignal<string>;
13075
+ readonly message: import("@angular/core").InputSignal<string>;
13076
+ /** Forces the state (true = offline); `null` (default) follows the browser. */
13077
+ readonly offline: import("@angular/core").InputSignal<boolean | null>;
13078
+ private readonly browserOffline;
13079
+ private readonly dismissed;
13080
+ protected readonly isOffline: import("@angular/core").Signal<boolean>;
13081
+ protected readonly visible: import("@angular/core").Signal<boolean>;
13082
+ constructor();
13083
+ protected dismiss(): void;
13084
+ static ɵfac: i0.ɵɵFactoryDeclaration<OfflineBannerComponent, never>;
13085
+ static ɵcmp: i0.ɵɵComponentDeclaration<OfflineBannerComponent, "ui-offline-banner", never, {
13086
+ "title": {
13087
+ "alias": "title";
13088
+ "required": false;
13089
+ "isSignal": true;
13090
+ };
13091
+ "message": {
13092
+ "alias": "message";
13093
+ "required": false;
13094
+ "isSignal": true;
13095
+ };
13096
+ "offline": {
13097
+ "alias": "offline";
13098
+ "required": false;
13099
+ "isSignal": true;
13100
+ };
13101
+ }, {}, never, never, true, never>;
13102
+ }
13103
+ export type ReminderAlertTone = 'danger' | 'warning' | 'info' | 'neutral';
13104
+ export interface ReminderAlertAction {
13105
+ /** Reported by `(action)`; also part of the button's test id (`alert-<id>`). */
13106
+ id: string;
13107
+ label: string;
13108
+ variant?: 'primary' | 'secondary' | 'ghost';
13109
+ }
13110
+ /** One in-app alert: a due reminder, an event starting soon, anything the user should notice now. The HOST decides what is due and what the buttons do. */
13111
+ export interface ReminderAlertItem {
13112
+ id: string;
13113
+ tone: ReminderAlertTone;
13114
+ /** Small uppercase line above the title, e.g. "Overdue Reminder". */
13115
+ label: string;
13116
+ title: string;
13117
+ /** Plain lines under the title (case name, description, due date…). */
13118
+ lines?: string[];
13119
+ /** A small purple pill under the title, e.g. the organization that created the item. */
13120
+ badge?: {
13121
+ label: string;
13122
+ ariaLabel?: string;
13123
+ testId?: string;
13124
+ };
13125
+ actions?: ReminderAlertAction[];
13126
+ /** Accessible name of the hide (X) button; default "Hide alert". */
13127
+ hideLabel?: string;
13128
+ /** Test id of the hide button; default `alert-hide`. */
13129
+ hideTestId?: string;
13130
+ }
13131
+ /**
13132
+ * The stack of in-app alerts in the top-right corner (above the page, newest app state wins: the host passes the list). Each alert is a
13133
+ * library `ui-alert` with a coloured tone, its label / title / lines, an optional badge, action buttons and a hide (X) button:
13134
+ *
13135
+ * <ui-reminder-alerts [items]="alerts()" (action)="onAction($event)" (hidden)="hide($event)" />
13136
+ *
13137
+ * `(action)` gives `{ item, actionId }`; `(hidden)` gives the item. The component keeps no state: the host removes an item from `items`
13138
+ * to make it go away (hiding, completing, snoozing are the host's rules). Nothing is drawn for an empty list.
13139
+ */
13140
+ export declare class ReminderAlertsComponent {
13141
+ readonly items: import("@angular/core").InputSignal<ReminderAlertItem[]>;
13142
+ /** Accessible name of the region. */
13143
+ readonly ariaLabel: import("@angular/core").InputSignal<string>;
13144
+ /** An action button was clicked. */
13145
+ readonly action: import("@angular/core").OutputEmitterRef<{
13146
+ item: ReminderAlertItem;
13147
+ actionId: string;
13148
+ }>;
13149
+ /** The hide (X) button was clicked. */
13150
+ readonly hidden: import("@angular/core").OutputEmitterRef<ReminderAlertItem>;
13151
+ protected variant(item: ReminderAlertItem): AlertVariant;
13152
+ static ɵfac: i0.ɵɵFactoryDeclaration<ReminderAlertsComponent, never>;
13153
+ static ɵcmp: i0.ɵɵComponentDeclaration<ReminderAlertsComponent, "ui-reminder-alerts", never, {
13154
+ "items": {
13155
+ "alias": "items";
13156
+ "required": false;
13157
+ "isSignal": true;
13158
+ };
13159
+ "ariaLabel": {
13160
+ "alias": "ariaLabel";
13161
+ "required": false;
13162
+ "isSignal": true;
13163
+ };
13164
+ }, {
13165
+ "action": "action";
13166
+ "hidden": "hidden";
13167
+ }, never, never, true, never>;
13168
+ }
12922
13169
  export type { CalendarDay, CalendarRange, CalendarViewMode };