@forgeroute/ui 0.4.77 → 0.4.78

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.77",
3
+ "version": "0.4.78",
4
4
  "peerDependencies": {
5
5
  "@angular/common": ">=22.0.0",
6
6
  "@angular/core": ">=22.0.0",
@@ -2376,7 +2376,7 @@ export declare class SidePanelComponent implements OnDestroy {
2376
2376
  readonly cancelLabel: import("@angular/core").InputSignal<string>;
2377
2377
  /** Right-aligned primary action button label. Empty string = hidden. */
2378
2378
  readonly primaryLabel: import("@angular/core").InputSignal<string>;
2379
- readonly primaryVariant: import("@angular/core").InputSignal<"warning" | "danger" | "primary">;
2379
+ readonly primaryVariant: import("@angular/core").InputSignal<"primary" | "danger" | "warning">;
2380
2380
  readonly primaryLoading: import("@angular/core").InputSignal<boolean>;
2381
2381
  readonly primaryDisabled: import("@angular/core").InputSignal<boolean>;
2382
2382
  /** `data-testid` of the Cancel button; none when empty (default). */
@@ -2507,7 +2507,7 @@ export declare class ModalComponent implements OnInit, OnDestroy {
2507
2507
  */
2508
2508
  readonly describedBy: import("@angular/core").InputSignal<string | null>;
2509
2509
  readonly maxWidth: import("@angular/core").InputSignal<string>;
2510
- readonly bodyOverflow: import("@angular/core").InputSignal<"hidden" | "visible" | "auto">;
2510
+ readonly bodyOverflow: import("@angular/core").InputSignal<"hidden" | "auto" | "visible">;
2511
2511
  /** `data-testid` of the dialog element itself (the host `<ui-modal>` is always in the page, the dialog only while open). None when empty. */
2512
2512
  readonly dialogTestId: import("@angular/core").InputSignal<string>;
2513
2513
  /** Hides the header X button (e.g. while a request is running). Escape and a backdrop click still close unless `closable` is false. */
@@ -3167,7 +3167,7 @@ export declare class AudioPlayerComponent {
3167
3167
  /** Accessible name of the player. */
3168
3168
  readonly ariaLabel: import("@angular/core").InputSignal<string>;
3169
3169
  /** How much to load before play: 'metadata' (default), 'auto' or 'none'. */
3170
- readonly preload: import("@angular/core").InputSignal<"none" | "metadata" | "auto">;
3170
+ readonly preload: import("@angular/core").InputSignal<"none" | "auto" | "metadata">;
3171
3171
  /** Fires when the browser can't load or decode the source. */
3172
3172
  readonly playbackError: import("@angular/core").OutputEmitterRef<void>;
3173
3173
  protected readonly failed: import("@angular/core").WritableSignal<boolean>;
@@ -3555,6 +3555,22 @@ export interface CheckboxOption {
3555
3555
  /** `data-testid` of this option's label text; none when omitted. */
3556
3556
  labelTestId?: string;
3557
3557
  }
3558
+ /** A link a single `ui-checkbox` label can hold: the label text names it with `{key}`, `labelLinks` says what `{key}` shows and where it goes. */
3559
+ export interface CheckboxLabelLink {
3560
+ /** The link's text (plain text, never HTML). A link with no text is not drawn. */
3561
+ label: string;
3562
+ /** Where it goes: `http:`, `https:`, `mailto:`, `tel:` or an in-app path (`/terms`, `#top`). Anything else (`javascript:`, `data:`, `//host`, empty) draws the text without a link. */
3563
+ url: string;
3564
+ /** `data-testid` of the link; none when omitted. */
3565
+ testId?: string;
3566
+ }
3567
+ /** One piece of a label that holds links: plain text, or a link when `href` is set. */
3568
+ interface CheckboxLabelSegment {
3569
+ text: string;
3570
+ href?: string;
3571
+ newTab?: boolean;
3572
+ testId?: string;
3573
+ }
3558
3574
  export declare class CheckboxComponent implements ControlValueAccessor, Validator, UiFieldValidity {
3559
3575
  readonly label: import("@angular/core").InputSignal<string>;
3560
3576
  /** Accessible name for the native checkbox when there is no visible `label` (e.g. a table row's selector). */
@@ -3592,6 +3608,23 @@ export declare class CheckboxComponent implements ControlValueAccessor, Validato
3592
3608
  * group is driven by ngModel / FormControl only. Values that are not an option are dropped and the order follows `options`.
3593
3609
  */
3594
3610
  readonly values: import("@angular/core").ModelSignal<string[] | undefined>;
3611
+ /**
3612
+ * Single mode: links inside the label. The label text names where each link goes with `{key}` and this object says what it is, so a sentence can hold links
3613
+ * without HTML and without the host assembling markup:
3614
+ *
3615
+ * <ui-checkbox label="I agree to the {terms} and the {privacy}" [labelLinks]="{ terms: { label: 'Terms of Service', url: '/terms' }, privacy: { label: 'Privacy Policy', url: '/privacy' } }" />
3616
+ *
3617
+ * Only `http:`, `https:`, `mailto:`, `tel:` addresses and in-app paths are linked (see `CheckboxLabelLink`); a link whose address is unsafe or empty still shows its text,
3618
+ * just not as a link, and a link without text is left out. An absolute http(s) address opens in a new tab (`noopener noreferrer`, with "(opens in a new tab)" for
3619
+ * screen readers). A `{key}` that is not in `labelLinks` stays as typed. Clicking a link follows it and does not toggle the box; clicking the rest of the label does.
3620
+ * The checkbox's name is the whole sentence; the "required" message uses the sentence with the link texts in place of the `{key}`s. Without `labelLinks` (default) the
3621
+ * label is plain text exactly as before.
3622
+ */
3623
+ readonly labelLinks: import("@angular/core").InputSignal<Record<string, CheckboxLabelLink>>;
3624
+ /** The label as text and links, or null when the label has no `{key}` that `labelLinks` knows (then it is drawn as plain text, as before). */
3625
+ protected readonly _labelSegments: import("@angular/core").Signal<CheckboxLabelSegment[] | null>;
3626
+ /** The label as plain text: the link texts in place of their `{key}`s (used for the "required" message). */
3627
+ protected readonly _plainLabel: import("@angular/core").Signal<string>;
3595
3628
  /** Single mode: small helper text under the label, linked to the native checkbox with `aria-describedby`. None when empty (default). */
3596
3629
  readonly description: import("@angular/core").InputSignal<string>;
3597
3630
  /** Set when the host projects a `[checkbox-trailing]` element (see `CheckboxTrailingDirective`). */
@@ -3711,6 +3744,11 @@ export declare class CheckboxComponent implements ControlValueAccessor, Validato
3711
3744
  "required": false;
3712
3745
  "isSignal": true;
3713
3746
  };
3747
+ "labelLinks": {
3748
+ "alias": "labelLinks";
3749
+ "required": false;
3750
+ "isSignal": true;
3751
+ };
3714
3752
  "description": {
3715
3753
  "alias": "description";
3716
3754
  "required": false;
@@ -3973,7 +4011,7 @@ export declare class StepperComponent {
3973
4011
  * its circle, one continuous line behind the circles that fills as steps complete; a complete step shows a check, the current step an
3974
4012
  * accent ring with a dot, an upcoming step an empty circle (no numbers). Circles are 40px (32px with `size="sm"`).
3975
4013
  */
3976
- readonly labelPosition: import("@angular/core").InputSignal<"below" | "beside">;
4014
+ readonly labelPosition: import("@angular/core").InputSignal<"beside" | "below">;
3977
4015
  /** Viewport width in px below which a horizontal stepper is drawn vertical (labels beside the circles), e.g. `640`. null (default) = never. */
3978
4016
  readonly stackBelow: import("@angular/core").InputSignal<number | null>;
3979
4017
  /** CSS length (e.g. `10.5rem`): horizontal only - the list gets `min-width: calc(<step count> * <value>)`. Empty (default) = no minimum. */
@@ -4616,7 +4654,7 @@ export declare class ButtonComponent {
4616
4654
  * `ghost-start`: a ghost button for list / section toggles - a full-width row with its content aligned to the start, transparent
4617
4655
  * background, hover tint and the normal focus ring. Pair it with `ariaExpanded` / `ariaPressed`; the label may contain a heading element.
4618
4656
  */
4619
- readonly variant: import("@angular/core").InputSignal<"link" | "icon" | "warning" | "danger" | "primary" | "secondary" | "ghost" | "ghost-start" | "tab" | "icon-danger">;
4657
+ readonly variant: import("@angular/core").InputSignal<"primary" | "secondary" | "danger" | "warning" | "link" | "ghost" | "ghost-start" | "tab" | "icon" | "icon-danger">;
4620
4658
  /** 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`). */
4621
4659
  readonly routerLink: import("@angular/core").InputSignal<string | readonly unknown[] | null>;
4622
4660
  /** Query params of the `routerLink` (e.g. `{ section: 'deal-defaults' }`). */
@@ -4662,7 +4700,7 @@ export declare class ButtonComponent {
4662
4700
  readonly color: import("@angular/core").InputSignal<string | undefined>;
4663
4701
  readonly active: import("@angular/core").InputSignal<boolean>;
4664
4702
  readonly size: import("@angular/core").InputSignal<"sm" | "md" | "lg" | "xs">;
4665
- readonly type: import("@angular/core").InputSignal<"button" | "reset" | "submit">;
4703
+ readonly type: import("@angular/core").InputSignal<"reset" | "submit" | "button">;
4666
4704
  readonly disabled: import("@angular/core").InputSignal<boolean>;
4667
4705
  readonly loading: import("@angular/core").InputSignal<boolean>;
4668
4706
  readonly fullWidth: import("@angular/core").InputSignal<boolean>;
@@ -5245,7 +5283,7 @@ export declare class BulkMessagePanelComponent {
5245
5283
  readonly sending: import("@angular/core").InputSignal<boolean>;
5246
5284
  readonly closed: import("@angular/core").OutputEmitterRef<void>;
5247
5285
  readonly send: import("@angular/core").OutputEmitterRef<BulkMessageSendEvent>;
5248
- readonly channel: import("@angular/core").WritableSignal<"email" | "text">;
5286
+ readonly channel: import("@angular/core").WritableSignal<"text" | "email">;
5249
5287
  private readonly _subject;
5250
5288
  private readonly _body;
5251
5289
  get subject(): string;
@@ -5773,7 +5811,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
5773
5811
  readonly passwordRequirements: import("@angular/core").InputSignal<boolean>;
5774
5812
  /** Rules for `passwordRequirements`; default = the library's five rules (8+ characters, upper, lower, digit, special). */
5775
5813
  readonly passwordRules: import("@angular/core").InputSignal<readonly PasswordRule[] | undefined>;
5776
- readonly type: import("@angular/core").InputSignal<"number" | "email" | "text" | "tel" | "password" | "url">;
5814
+ readonly type: import("@angular/core").InputSignal<"number" | "text" | "email" | "tel" | "password" | "url">;
5777
5815
  readonly maxlength: import("@angular/core").InputSignal<number | undefined>;
5778
5816
  readonly required: import("@angular/core").InputSignal<boolean>;
5779
5817
  readonly autocomplete: import("@angular/core").InputSignal<string>;
@@ -5782,7 +5820,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
5782
5820
  * `search`, `text`, `none`). Empty (default) = the browser's default for the field, except `type="tel"`, which keeps `tel`.
5783
5821
  * It only picks the keyboard; it does not restrict what can be typed or pasted.
5784
5822
  */
5785
- readonly inputmode: import("@angular/core").InputSignal<"" | "none" | "email" | "search" | "text" | "numeric" | "tel" | "url" | "decimal">;
5823
+ readonly inputmode: import("@angular/core").InputSignal<"" | "none" | "text" | "search" | "email" | "tel" | "url" | "decimal" | "numeric">;
5786
5824
  readonly readonly: import("@angular/core").InputSignal<boolean>;
5787
5825
  readonly hint: import("@angular/core").InputSignal<string>;
5788
5826
  /** 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. */
@@ -5854,7 +5892,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
5854
5892
  protected readonly _stepAttr: import("@angular/core").Signal<string | null>;
5855
5893
  protected readonly _revealable: import("@angular/core").Signal<boolean>;
5856
5894
  protected readonly _shown: import("@angular/core").WritableSignal<boolean>;
5857
- protected readonly _inputType: import("@angular/core").Signal<"number" | "email" | "text" | "tel" | "password" | "url">;
5895
+ protected readonly _inputType: import("@angular/core").Signal<"number" | "text" | "email" | "tel" | "password" | "url">;
5858
5896
  protected readonly _eyePath: string;
5859
5897
  protected readonly _eyeOffPath: string;
5860
5898
  protected readonly _showRequirements: import("@angular/core").Signal<boolean>;
@@ -6776,7 +6814,7 @@ export declare class CopyFieldComponent implements OnDestroy {
6776
6814
  /** Neither the Clipboard API nor the fallback could copy. */
6777
6815
  readonly copyFailed: import("@angular/core").OutputEmitterRef<void>;
6778
6816
  protected readonly _id: string;
6779
- protected readonly _state: import("@angular/core").WritableSignal<"idle" | "failed" | "copied">;
6817
+ protected readonly _state: import("@angular/core").WritableSignal<"idle" | "copied" | "failed">;
6780
6818
  protected readonly _announcement: import("@angular/core").Signal<string>;
6781
6819
  protected readonly _buttonName: import("@angular/core").Signal<string>;
6782
6820
  protected readonly _describedBy: import("@angular/core").Signal<string | null>;
@@ -7892,7 +7930,7 @@ export declare class FormRowComponent {
7892
7930
  * child simply takes the full width. Keep a numeric span within the row's `cols` (use `all` for the whole row).
7893
7931
  */
7894
7932
  export declare class FormColSpanDirective {
7895
- readonly uiColSpan: import("@angular/core").InputSignal<"" | 2 | 3 | "2" | "3" | "all">;
7933
+ readonly uiColSpan: import("@angular/core").InputSignal<"" | "2" | "3" | 2 | 3 | "all">;
7896
7934
  protected readonly _class: import("@angular/core").Signal<string>;
7897
7935
  static ɵfac: i0.ɵɵFactoryDeclaration<FormColSpanDirective, never>;
7898
7936
  static ɵdir: i0.ɵɵDirectiveDeclaration<FormColSpanDirective, "[uiColSpan]", never, {
@@ -7972,7 +8010,7 @@ export type ListItemIconColor = 'slate' | 'amber' | 'red' | 'blue' | 'green' | '
7972
8010
  export declare class ListItemComponent implements AfterContentChecked {
7973
8011
  private readonly host;
7974
8012
  /** Show a radio button, checkbox, or nothing on the left. */
7975
- readonly leading: import("@angular/core").InputSignal<"none" | "radio" | "checkbox">;
8013
+ readonly leading: import("@angular/core").InputSignal<"none" | "checkbox" | "radio">;
7976
8014
  /** `name` attribute for the radio/checkbox (groups radios together). */
7977
8015
  readonly inputName: import("@angular/core").InputSignal<string>;
7978
8016
  /** `id` attribute for the radio/checkbox (links the label). */
@@ -9114,7 +9152,7 @@ export declare class ChipGroupComponent {
9114
9152
  readonly spaceAbove: import("@angular/core").InputSignal<"none" | "sm" | "md">;
9115
9153
  /** Space below the chip group. */
9116
9154
  readonly spaceBelow: import("@angular/core").InputSignal<"none" | "sm" | "md">;
9117
- protected readonly _gap: import("@angular/core").Signal<"8px" | "6px" | "12px">;
9155
+ protected readonly _gap: import("@angular/core").Signal<"6px" | "12px" | "8px">;
9118
9156
  protected readonly _spaceAbove: import("@angular/core").Signal<"0" | "6px" | "12px">;
9119
9157
  protected readonly _spaceBelow: import("@angular/core").Signal<"0" | "6px" | "12px">;
9120
9158
  static ɵfac: i0.ɵɵFactoryDeclaration<ChipGroupComponent, never>;
@@ -9527,7 +9565,7 @@ export declare class IconComponent {
9527
9565
  readonly ariaLabel: import("@angular/core").InputSignal<string>;
9528
9566
  /** Icon size in px. */
9529
9567
  readonly size: import("@angular/core").InputSignal<number>;
9530
- readonly variant: import("@angular/core").InputSignal<"default" | "danger">;
9568
+ readonly variant: import("@angular/core").InputSignal<"danger" | "default">;
9531
9569
  readonly disabled: import("@angular/core").InputSignal<boolean>;
9532
9570
  /** The host is running the request this icon started: a spinner replaces the picture and the button is disabled (no click) until it is false again. */
9533
9571
  readonly loading: import("@angular/core").InputSignal<boolean>;
@@ -9639,7 +9677,7 @@ export declare class TimelineComponent {
9639
9677
  /** Any CSS length (e.g. `600px`). When set, the list scrolls inside a keyboard-focusable region of at most this height. Empty = no wrapper. */
9640
9678
  readonly maxHeight: import("@angular/core").InputSignal<string>;
9641
9679
  /** `below` (default): the time is under the title / description. `end`: the time sits right-aligned on the title row. */
9642
- readonly timePosition: import("@angular/core").InputSignal<"below" | "end">;
9680
+ readonly timePosition: import("@angular/core").InputSignal<"end" | "below">;
9643
9681
  /**
9644
9682
  * Group the items under a heading per calendar day of `dateTime` ("Today", "Yesterday", "Oct 3", "Oct 3, 2025"). Default false = no headings,
9645
9683
  * DOM unchanged. The given order is kept: consecutive items of one day share a heading, the same day appearing again later starts a new group.
@@ -10949,7 +10987,7 @@ export declare class RadioComponent {
10949
10987
  protected readonly disabled: import("@angular/core").InputSignal<boolean>;
10950
10988
  /** Path of the icon: a known icon key, else the text itself when it looks like an SVG path (drawing commands and numbers only), else none. */
10951
10989
  protected readonly _iconD: import("@angular/core").Signal<string | null>;
10952
- /** The address to link, or null when the link is not drawn (no label, empty or unsafe address). */
10990
+ /** The address to link, or null when the link is not drawn (no label, empty or unsafe address: see [safeLinkHref]). */
10953
10991
  protected readonly _linkHref: import("@angular/core").Signal<string | null>;
10954
10992
  protected readonly _linkNewTab: import("@angular/core").Signal<boolean>;
10955
10993
  /** Id of the visible label text. Optional: a host (e.g. `ui-radio-group`) can set it to point another element at the label with `aria-labelledby`; a unique id is generated when empty. */
@@ -11648,7 +11686,7 @@ export declare class PdfHotspotComponent {
11648
11686
  /** `ready`: clickable; `blocked`: disabled (a prerequisite is missing); `signed`: shows `image`. */
11649
11687
  readonly state: import("@angular/core").InputSignal<"ready" | "blocked" | "signed">;
11650
11688
  /** `warning` gives the ready state an amber look (e.g. for initials), default is blue. */
11651
- readonly tone: import("@angular/core").InputSignal<"warning" | "primary">;
11689
+ readonly tone: import("@angular/core").InputSignal<"primary" | "warning">;
11652
11690
  /** Text of the ready button (e.g. "Sign Here"). */
11653
11691
  readonly label: import("@angular/core").InputSignal<string>;
11654
11692
  /** Text of the blocked button (e.g. "Add signature above"). */
@@ -11799,7 +11837,7 @@ export declare class DetailCardComponent {
11799
11837
  /** Background colour of the footer bar (the `[card-footer]` slot) as any CSS colour. Empty = no colour of its own. */
11800
11838
  readonly footerBackground: import("@angular/core").InputSignal<string>;
11801
11839
  /** Alignment of the `[card-footer]` content: `'start'` (default, unchanged) or `'end'` = a right-aligned action row with an 8px gap. */
11802
- readonly footerAlign: import("@angular/core").InputSignal<"end" | "start">;
11840
+ readonly footerAlign: import("@angular/core").InputSignal<"start" | "end">;
11803
11841
  /** Text colour as any CSS colour (`#fff`, `var(--on-dark)` …). Empty = the default colours. Colours the title, subtitle, chevron and body text. */
11804
11842
  readonly textColor: import("@angular/core").InputSignal<string>;
11805
11843
  /** false = no header at all (no title, edit button, toggle or divider): the card is only the body, always open. */
@@ -16569,7 +16607,7 @@ export declare class PaymentSidePanelComponent {
16569
16607
  private readonly terminalAvailable;
16570
16608
  /** value -> label of every live method the rendered plugins contribute (the first plugin wins a duplicate value). */
16571
16609
  private readonly liveMethods;
16572
- protected readonly kind: import("@angular/core").Signal<"none" | "manual" | "live" | "terminal">;
16610
+ protected readonly kind: import("@angular/core").Signal<"none" | "live" | "terminal" | "manual">;
16573
16611
  private kindOf;
16574
16612
  /** The method list as shown: record-only built-ins (a plugin takes over its own values), plugin extras, and only manual ones while a split is being built. */
16575
16613
  readonly methodList: import("@angular/core").Signal<PaymentMethodOption[]>;