@forgeroute/ui 0.4.16 → 0.4.17

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.16",
3
+ "version": "0.4.17",
4
4
  "peerDependencies": {
5
5
  "@angular/common": ">=22.0.0",
6
6
  "@angular/core": ">=22.0.0",
@@ -973,7 +973,7 @@ export declare class SelectComponent implements ControlValueAccessor, Validator,
973
973
  readonly error: import("@angular/core").InputSignal<string>;
974
974
  /** Reveal the built-in error messages now (e.g. after a failed Save click), without waiting for blur. */
975
975
  readonly showErrors: import("@angular/core").InputSignal<boolean>;
976
- readonly size: import("@angular/core").InputSignal<"default" | "sm">;
976
+ readonly size: import("@angular/core").InputSignal<"sm" | "default">;
977
977
  readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
978
978
  private readonly _cvaDisabled;
979
979
  protected readonly disabled: import("@angular/core").Signal<boolean>;
@@ -1225,6 +1225,12 @@ export declare class DataTableComponent<T extends Record<string, any>> implement
1225
1225
  readonly page: import("@angular/core").InputSignal<string>;
1226
1226
  /** Show column config + saved views toolbar. Defaults true. Set false to hide both. */
1227
1227
  readonly showToolbar: import("@angular/core").InputSignal<boolean>;
1228
+ /**
1229
+ * Show the More Actions menu in the toolbar (Import, Columns, Save/Saved Views and page-defined menu items). Defaults true.
1230
+ * Set false for a page that has nothing to offer there; Export, page-defined primary/secondary buttons and the search box
1231
+ * are unaffected. The table still hides the menu by itself when it is empty and unfiltered.
1232
+ */
1233
+ readonly showMoreActions: import("@angular/core").InputSignal<boolean>;
1228
1234
  /**
1229
1235
  * Show the search box above the table. Defaults true. Set false for small fixed tables where searching is meaningless
1230
1236
  * (a handful of summary rows). Quick-filter tabs and the toolbar are unaffected; when the search box, the tabs and the
@@ -1426,7 +1432,8 @@ export declare class DataTableComponent<T extends Record<string, any>> implement
1426
1432
  protected readonly _reorderOn: Signal<boolean>;
1427
1433
  /** Moves are allowed: the list is in its stored order (no sort / search / tab / filter), loaded, and has more than one row. */
1428
1434
  protected readonly _reorderActive: Signal<boolean>;
1429
- protected readonly _reorderHint: Signal<"There is nothing to reorder" | "Clear the sort, search and filters to change the order">;
1435
+ /** Why the grips are off: an active sort / search / tab / filter is the reason to name even when it left one row ("nothing to reorder" would hide it). */
1436
+ protected readonly _reorderHint: Signal<"Clear the sort, search and filters to change the order" | "There is nothing to reorder" | "Reordering is not available right now">;
1430
1437
  /** One id per table, so each grip can point to the instructions (aria-describedby) even with several tables on a page. */
1431
1438
  protected readonly _reorderHelpId: string;
1432
1439
  protected readonly _dragFrom: import("@angular/core").WritableSignal<number | null>;
@@ -1748,6 +1755,11 @@ export declare class DataTableComponent<T extends Record<string, any>> implement
1748
1755
  "required": false;
1749
1756
  "isSignal": true;
1750
1757
  };
1758
+ "showMoreActions": {
1759
+ "alias": "showMoreActions";
1760
+ "required": false;
1761
+ "isSignal": true;
1762
+ };
1751
1763
  "showSearch": {
1752
1764
  "alias": "showSearch";
1753
1765
  "required": false;
@@ -1877,6 +1889,11 @@ export declare class SidePanelComponent implements OnDestroy {
1877
1889
  readonly cancelTestId: import("@angular/core").InputSignal<string>;
1878
1890
  /** `data-testid` of the primary footer button; none when empty (default). */
1879
1891
  readonly primaryTestId: import("@angular/core").InputSignal<string>;
1892
+ /**
1893
+ * Element that gets focus back when the panel closes. Takes precedence over the element that was focused (or last
1894
+ * clicked / activated) when it opened; used only if it is still in the page and visible. Default null = the opener.
1895
+ */
1896
+ readonly returnFocusTo: import("@angular/core").InputSignal<HTMLElement | null>;
1880
1897
  readonly closed: import("@angular/core").OutputEmitterRef<void>;
1881
1898
  readonly primaryClick: import("@angular/core").OutputEmitterRef<void>;
1882
1899
  protected readonly titleId: string;
@@ -1886,8 +1903,12 @@ export declare class SidePanelComponent implements OnDestroy {
1886
1903
  private _prevFocus;
1887
1904
  private _scrollLocked;
1888
1905
  private _stopViewport;
1906
+ private _stopIframeKeys;
1907
+ private readonly _interaction;
1889
1908
  constructor();
1890
1909
  onKeydown(event: KeyboardEvent): void;
1910
+ /** A focus-guard sentinel received focus (Tab left the panel's tab order, e.g. out of an iframe): send it back inside. */
1911
+ protected onGuardFocus(which: 'start' | 'end', event?: FocusEvent): void;
1891
1912
  /** Initial focus — see `focusInitial` (autofocus target → first usable field → dialog container). */
1892
1913
  private _focusFirst;
1893
1914
  private _focusable;
@@ -1954,6 +1975,11 @@ export declare class SidePanelComponent implements OnDestroy {
1954
1975
  "required": false;
1955
1976
  "isSignal": true;
1956
1977
  };
1978
+ "returnFocusTo": {
1979
+ "alias": "returnFocusTo";
1980
+ "required": false;
1981
+ "isSignal": true;
1982
+ };
1957
1983
  }, {
1958
1984
  "closed": "closed";
1959
1985
  "primaryClick": "primaryClick";
@@ -1964,7 +1990,7 @@ export declare class ModalComponent implements OnInit, OnDestroy {
1964
1990
  readonly title: import("@angular/core").InputSignal<string>;
1965
1991
  readonly description: import("@angular/core").InputSignal<string>;
1966
1992
  readonly maxWidth: import("@angular/core").InputSignal<string>;
1967
- readonly bodyOverflow: import("@angular/core").InputSignal<"hidden" | "auto" | "visible">;
1993
+ readonly bodyOverflow: import("@angular/core").InputSignal<"auto" | "visible" | "hidden">;
1968
1994
  /** `data-testid` of the dialog element itself (the host `<ui-modal>` is always in the page, the dialog only while open). None when empty. */
1969
1995
  readonly dialogTestId: import("@angular/core").InputSignal<string>;
1970
1996
  /** Hides the header X button (e.g. while a request is running). Escape and a backdrop click still close unless `closable` is false. */
@@ -1975,6 +2001,11 @@ export declare class ModalComponent implements OnInit, OnDestroy {
1975
2001
  */
1976
2002
  readonly closable: import("@angular/core").InputSignal<boolean>;
1977
2003
  readonly close: import("@angular/core").OutputEmitterRef<void>;
2004
+ /**
2005
+ * Element that gets focus back when the dialog closes. Takes precedence over the element that was focused (or last
2006
+ * clicked / activated) when it opened; used only if it is still in the page and visible. Default null = the opener.
2007
+ */
2008
+ readonly returnFocusTo: import("@angular/core").InputSignal<HTMLElement | null>;
1978
2009
  protected readonly titleId: string;
1979
2010
  private readonly el;
1980
2011
  private readonly ren;
@@ -1983,8 +2014,12 @@ export declare class ModalComponent implements OnInit, OnDestroy {
1983
2014
  private _prevFocus;
1984
2015
  private _scrollLocked;
1985
2016
  private _stopViewport;
2017
+ private _stopIframeKeys;
2018
+ private readonly _interaction;
1986
2019
  constructor();
1987
2020
  onKeydown(event: KeyboardEvent): void;
2021
+ /** A focus-guard sentinel received focus (Tab left the dialog's tab order, e.g. out of an iframe): send it back inside. */
2022
+ protected onGuardFocus(which: 'start' | 'end', event?: FocusEvent): void;
1988
2023
  /** Initial focus — see `focusInitial` (autofocus target → first usable field → dialog container). */
1989
2024
  private _focusFirst;
1990
2025
  private _focusable;
@@ -2032,6 +2067,11 @@ export declare class ModalComponent implements OnInit, OnDestroy {
2032
2067
  "required": false;
2033
2068
  "isSignal": true;
2034
2069
  };
2070
+ "returnFocusTo": {
2071
+ "alias": "returnFocusTo";
2072
+ "required": false;
2073
+ "isSignal": true;
2074
+ };
2035
2075
  }, {
2036
2076
  "close": "close";
2037
2077
  }, never, ["*", "[modal-footer-left]", "[modal-footer-center]", "[modal-footer-right]"], true, never>;
@@ -2334,7 +2374,7 @@ export declare class AudioPlayerComponent {
2334
2374
  /** Accessible name of the player. */
2335
2375
  readonly ariaLabel: import("@angular/core").InputSignal<string>;
2336
2376
  /** How much to load before play: 'metadata' (default), 'auto' or 'none'. */
2337
- readonly preload: import("@angular/core").InputSignal<"none" | "auto" | "metadata">;
2377
+ readonly preload: import("@angular/core").InputSignal<"auto" | "none" | "metadata">;
2338
2378
  /** Fires when the browser can't load or decode the source. */
2339
2379
  readonly playbackError: import("@angular/core").OutputEmitterRef<void>;
2340
2380
  protected readonly failed: import("@angular/core").WritableSignal<boolean>;
@@ -2584,7 +2624,7 @@ export declare class CheckboxComponent implements ControlValueAccessor, Validato
2584
2624
  * 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.
2585
2625
  * Default null: plain label text, exactly as before. Single mode only.
2586
2626
  */
2587
- readonly headingLevel: import("@angular/core").InputSignal<1 | 2 | 3 | 4 | 5 | 6 | null>;
2627
+ readonly headingLevel: import("@angular/core").InputSignal<5 | 3 | 1 | 2 | 4 | 6 | null>;
2588
2628
  readonly indeterminate: import("@angular/core").InputSignal<boolean>;
2589
2629
  readonly checked: import("@angular/core").ModelSignal<boolean>;
2590
2630
  /**
@@ -2797,7 +2837,7 @@ export declare class CheckboxTrailingDirective {
2797
2837
  *
2798
2838
  * Built on a native `<input type="checkbox" role="switch">`, so Space toggles it, it is focusable, and a screen reader
2799
2839
  * announces it as a switch (on / off). The label and hint name and describe it. `disabled` (input or form control) dims it
2800
- * and blocks changes. On touch devices and phones the switch has a >= 44px hit area.
2840
+ * and blocks changes. `ariaDescribedBy` adds the id of a description rendered elsewhere. On touch devices and phones the switch has a >= 44px hit area.
2801
2841
  */
2802
2842
  export declare class ToggleComponent implements ControlValueAccessor {
2803
2843
  /** Bold line on the left. */
@@ -2806,6 +2846,8 @@ export declare class ToggleComponent implements ControlValueAccessor {
2806
2846
  readonly hint: import("@angular/core").InputSignal<string>;
2807
2847
  /** Accessible name when there is no visible `label`. */
2808
2848
  readonly ariaLabel: import("@angular/core").InputSignal<string>;
2849
+ /** Id of another element that describes the switch (e.g. a description rendered elsewhere); announced after the hint. Absent when empty. */
2850
+ readonly ariaDescribedBy: import("@angular/core").InputSignal<string>;
2809
2851
  /** Whether the switch is on. Two-way: `[(checked)]`. */
2810
2852
  readonly checked: import("@angular/core").ModelSignal<boolean>;
2811
2853
  /** Public so a host template can bind `[disabled]` (a protected input fails strict template type-checking, TS2445). */
@@ -2816,6 +2858,8 @@ export declare class ToggleComponent implements ControlValueAccessor {
2816
2858
  protected readonly _inputId: string;
2817
2859
  protected readonly _labelId: string;
2818
2860
  protected readonly _hintId: string;
2861
+ /** The hint's id (when there is a hint) followed by the host's `ariaDescribedBy`; null when neither exists. */
2862
+ protected readonly _describedBy: import("@angular/core").Signal<string | null>;
2819
2863
  private _onChange;
2820
2864
  private _onTouched;
2821
2865
  writeValue(val: boolean): void;
@@ -2841,6 +2885,11 @@ export declare class ToggleComponent implements ControlValueAccessor {
2841
2885
  "required": false;
2842
2886
  "isSignal": true;
2843
2887
  };
2888
+ "ariaDescribedBy": {
2889
+ "alias": "ariaDescribedBy";
2890
+ "required": false;
2891
+ "isSignal": true;
2892
+ };
2844
2893
  "checked": {
2845
2894
  "alias": "checked";
2846
2895
  "required": false;
@@ -3465,7 +3514,7 @@ export declare class PhoneNumberPickerComponent {
3465
3514
  protected readonly modeCtl: FormControl<string>;
3466
3515
  protected readonly zipCtl: FormControl<string>;
3467
3516
  protected readonly areaCtl: FormControl<string>;
3468
- protected readonly step: import("@angular/core").WritableSignal<1 | 2 | 3>;
3517
+ protected readonly step: import("@angular/core").WritableSignal<3 | 1 | 2>;
3469
3518
  protected readonly mode: import("@angular/core").WritableSignal<PhoneNumberSearchMode>;
3470
3519
  private readonly _zip;
3471
3520
  private readonly _area;
@@ -3579,7 +3628,7 @@ export declare class ButtonComponent {
3579
3628
  * `ghost-start`: a ghost button for list / section toggles - a full-width row with its content aligned to the start, transparent
3580
3629
  * background, hover tint and the normal focus ring. Pair it with `ariaExpanded` / `ariaPressed`; the label may contain a heading element.
3581
3630
  */
3582
- readonly variant: import("@angular/core").InputSignal<"primary" | "secondary" | "danger" | "warning" | "link" | "ghost" | "ghost-start" | "tab" | "icon" | "icon-danger">;
3631
+ readonly variant: import("@angular/core").InputSignal<"primary" | "danger" | "warning" | "link" | "secondary" | "ghost" | "ghost-start" | "tab" | "icon" | "icon-danger">;
3583
3632
  /** 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`). */
3584
3633
  readonly routerLink: import("@angular/core").InputSignal<string | readonly unknown[] | null>;
3585
3634
  /** Query params of the `routerLink` (e.g. `{ section: 'deal-defaults' }`). */
@@ -3625,7 +3674,7 @@ export declare class ButtonComponent {
3625
3674
  readonly color: import("@angular/core").InputSignal<string | undefined>;
3626
3675
  readonly active: import("@angular/core").InputSignal<boolean>;
3627
3676
  readonly size: import("@angular/core").InputSignal<"sm" | "md" | "lg" | "xs">;
3628
- readonly type: import("@angular/core").InputSignal<"reset" | "submit" | "button">;
3677
+ readonly type: import("@angular/core").InputSignal<"button" | "submit" | "reset">;
3629
3678
  readonly disabled: import("@angular/core").InputSignal<boolean>;
3630
3679
  readonly loading: import("@angular/core").InputSignal<boolean>;
3631
3680
  readonly fullWidth: import("@angular/core").InputSignal<boolean>;
@@ -4020,7 +4069,7 @@ export declare class BulkMessagePanelComponent {
4020
4069
  readonly sending: import("@angular/core").InputSignal<boolean>;
4021
4070
  readonly closed: import("@angular/core").OutputEmitterRef<void>;
4022
4071
  readonly send: import("@angular/core").OutputEmitterRef<BulkMessageSendEvent>;
4023
- readonly channel: import("@angular/core").WritableSignal<"text" | "email">;
4072
+ readonly channel: import("@angular/core").WritableSignal<"email" | "text">;
4024
4073
  private readonly _subject;
4025
4074
  private readonly _body;
4026
4075
  get subject(): string;
@@ -4229,7 +4278,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
4229
4278
  readonly passwordRequirements: import("@angular/core").InputSignal<boolean>;
4230
4279
  /** Rules for `passwordRequirements`; default = the library's five rules (8+ characters, upper, lower, digit, special). */
4231
4280
  readonly passwordRules: import("@angular/core").InputSignal<readonly PasswordRule[] | undefined>;
4232
- readonly type: import("@angular/core").InputSignal<"number" | "text" | "email" | "tel" | "password" | "url">;
4281
+ readonly type: import("@angular/core").InputSignal<"number" | "email" | "text" | "tel" | "password" | "url">;
4233
4282
  readonly maxlength: import("@angular/core").InputSignal<number | undefined>;
4234
4283
  readonly required: import("@angular/core").InputSignal<boolean>;
4235
4284
  readonly autocomplete: import("@angular/core").InputSignal<string>;
@@ -4238,7 +4287,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
4238
4287
  * `search`, `text`, `none`). Empty (default) = the browser's default for the field, except `type="tel"`, which keeps `tel`.
4239
4288
  * It only picks the keyboard; it does not restrict what can be typed or pasted.
4240
4289
  */
4241
- readonly inputmode: import("@angular/core").InputSignal<"" | "none" | "text" | "search" | "email" | "tel" | "url" | "decimal" | "numeric">;
4290
+ readonly inputmode: import("@angular/core").InputSignal<"" | "email" | "text" | "none" | "search" | "tel" | "url" | "decimal" | "numeric">;
4242
4291
  readonly readonly: import("@angular/core").InputSignal<boolean>;
4243
4292
  readonly hint: import("@angular/core").InputSignal<string>;
4244
4293
  readonly error: import("@angular/core").InputSignal<string>;
@@ -4302,7 +4351,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
4302
4351
  protected readonly _stepAttr: import("@angular/core").Signal<string | null>;
4303
4352
  protected readonly _revealable: import("@angular/core").Signal<boolean>;
4304
4353
  protected readonly _shown: import("@angular/core").WritableSignal<boolean>;
4305
- protected readonly _inputType: import("@angular/core").Signal<"number" | "text" | "email" | "tel" | "password" | "url">;
4354
+ protected readonly _inputType: import("@angular/core").Signal<"number" | "email" | "text" | "tel" | "password" | "url">;
4306
4355
  protected readonly _eyePath: string;
4307
4356
  protected readonly _eyeOffPath: string;
4308
4357
  protected readonly _showRequirements: import("@angular/core").Signal<boolean>;
@@ -5826,7 +5875,7 @@ export declare class FormSectionComponent {
5826
5875
  }, {}, never, ["*"], true, never>;
5827
5876
  }
5828
5877
  export declare class FormRowComponent {
5829
- readonly cols: import("@angular/core").InputSignal<1 | 2 | 3 | 4>;
5878
+ readonly cols: import("@angular/core").InputSignal<3 | 1 | 2 | 4>;
5830
5879
  static ɵfac: i0.ɵɵFactoryDeclaration<FormRowComponent, never>;
5831
5880
  static ɵcmp: i0.ɵɵComponentDeclaration<FormRowComponent, "ui-form-row", never, {
5832
5881
  "cols": {
@@ -5843,7 +5892,7 @@ export declare class FormRowComponent {
5843
5892
  * child simply takes the full width. Keep a numeric span within the row's `cols` (use `all` for the whole row).
5844
5893
  */
5845
5894
  export declare class FormColSpanDirective {
5846
- readonly uiColSpan: import("@angular/core").InputSignal<"" | "2" | "3" | 2 | 3 | "all">;
5895
+ readonly uiColSpan: import("@angular/core").InputSignal<"" | 3 | 2 | "2" | "3" | "all">;
5847
5896
  protected readonly _class: import("@angular/core").Signal<string>;
5848
5897
  static ɵfac: i0.ɵɵFactoryDeclaration<FormColSpanDirective, never>;
5849
5898
  static ɵdir: i0.ɵɵDirectiveDeclaration<FormColSpanDirective, "[uiColSpan]", never, {
@@ -7611,7 +7660,9 @@ export interface DateRange {
7611
7660
  }
7612
7661
  /**
7613
7662
  * Date range picker: preset pills (Today … Year to Date, optional All Time, Custom Range) plus
7614
- * From / To date inputs with an Apply button for the custom range. Emits `rangeChange` with the
7663
+ * From / To date inputs with an Apply button for the custom range. With the presets shown, the custom range opens in a
7664
+ * popover card under the pills (right-aligned, closes on Apply / Escape / outside click; picking Custom Range again
7665
+ * reopens it); with `showPresets` false the From / To row is rendered inline. Emits `rangeChange` with the
7615
7666
  * resolved ISO dates whenever a preset is picked or a custom range is applied.
7616
7667
  *
7617
7668
  * <ui-date-range-picker [activePreset]="preset()" [includeAllTime]="true" (rangeChange)="onRange($event)" />
@@ -7627,9 +7678,19 @@ export declare class DateRangePickerComponent {
7627
7678
  readonly rangeChange: import("@angular/core").OutputEmitterRef<DateRange>;
7628
7679
  /** Follows `activePreset` from the host, and the user's own picks in between. */
7629
7680
  protected readonly selectedPreset: import("@angular/core").WritableSignal<DatePreset>;
7681
+ /** The popover was closed (Apply / Escape / outside click); any preset change reopens it. */
7682
+ private readonly popoverDismissed;
7683
+ protected readonly popoverVisible: import("@angular/core").Signal<boolean>;
7684
+ protected readonly popTop: import("@angular/core").WritableSignal<number>;
7685
+ protected readonly popRight: import("@angular/core").WritableSignal<number>;
7686
+ private readonly host;
7630
7687
  protected readonly customStart: import("@angular/core").WritableSignal<string>;
7631
7688
  protected readonly customEnd: import("@angular/core").WritableSignal<string>;
7632
7689
  protected readonly presetTabs: import("@angular/core").Signal<PillTab[]>;
7690
+ constructor();
7691
+ private place;
7692
+ protected onDocumentClick(e: Event): void;
7693
+ protected onEscape(e: Event): void;
7633
7694
  selectPreset(key: DatePreset): void;
7634
7695
  applyCustom(): void;
7635
7696
  static ɵfac: i0.ɵɵFactoryDeclaration<DateRangePickerComponent, never>;
@@ -8422,7 +8483,7 @@ export declare class DetailCardComponent {
8422
8483
  /** true (default) = the title is displayed in capitals (CSS only); false = shown as written. The text, aria-label and heading name are never changed. */
8423
8484
  readonly uppercaseTitle: import("@angular/core").InputSignal<boolean>;
8424
8485
  /** 1-6 makes the title a real heading for screen readers (role=heading, aria-level); null keeps it plain text. */
8425
- readonly headingLevel: import("@angular/core").InputSignal<1 | 2 | 3 | 4 | 5 | 6 | null>;
8486
+ readonly headingLevel: import("@angular/core").InputSignal<5 | 3 | 1 | 2 | 4 | 6 | null>;
8426
8487
  /** Optional id for the title text; the card is then labelled by it. Without it the title is the card's aria-label. */
8427
8488
  readonly titleId: import("@angular/core").InputSignal<string>;
8428
8489
  /** Accessible name of the card when the header gives none (no header, or no title). A visible title wins; blank = no name. */