@forgeroute/ui 0.4.65 → 0.4.67

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.65",
3
+ "version": "0.4.67",
4
4
  "peerDependencies": {
5
5
  "@angular/common": ">=22.0.0",
6
6
  "@angular/core": ">=22.0.0",
@@ -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>;
@@ -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<"metadata" | "none" | "auto">;
2685
+ readonly preload: import("@angular/core").InputSignal<"none" | "metadata" | "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<6 | 1 | 2 | 3 | 4 | 5 | null>;
2939
+ readonly headingLevel: import("@angular/core").InputSignal<1 | 2 | 5 | 3 | 6 | 4 | null>;
2940
2940
  readonly indeterminate: import("@angular/core").InputSignal<boolean>;
2941
2941
  readonly checked: import("@angular/core").ModelSignal<boolean>;
2942
2942
  /**
@@ -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" | "text" | "tel" | "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<"" | "search" | "text" | "numeric" | "none" | "email" | "tel" | "url" | "decimal">;
4960
+ readonly inputmode: import("@angular/core").InputSignal<"" | "none" | "text" | "search" | "tel" | "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" | "text" | "tel" | "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>;
@@ -5231,6 +5231,8 @@ export declare class KeypadComponent implements ControlValueAccessor {
5231
5231
  /** Host error message, shown under the dots. */
5232
5232
  readonly error: import("@angular/core").InputSignal<string>;
5233
5233
  readonly disabled: import("@angular/core").InputSignal<boolean>;
5234
+ /** Enter was pressed while the pad had focus: nothing is appended (Enter on a focused key would otherwise press it); the host submits its form. */
5235
+ readonly submitted: import("@angular/core").OutputEmitterRef<void>;
5234
5236
  protected readonly _labelId: string;
5235
5237
  protected readonly _keys: readonly ["1", "2", "3", "4", "5", "6", "7", "8", "9", "", "0", "del"];
5236
5238
  protected readonly _dots: import("@angular/core").Signal<unknown[]>;
@@ -5278,6 +5280,7 @@ export declare class KeypadComponent implements ControlValueAccessor {
5278
5280
  };
5279
5281
  }, {
5280
5282
  "value": "valueChange";
5283
+ "submitted": "submitted";
5281
5284
  }, never, never, true, never>;
5282
5285
  }
5283
5286
  export declare class TextareaInputComponent implements ControlValueAccessor, Validator, UiFieldValidity {
@@ -6490,7 +6493,9 @@ export declare class DropdownComponent {
6490
6493
  readonly loader: import("@angular/core").InputSignal<(() => Promise<DropdownItem[]>) | null>;
6491
6494
  readonly active: import("@angular/core").InputSignal<boolean>;
6492
6495
  readonly activeValue: import("@angular/core").InputSignal<string>;
6493
- readonly variant: import("@angular/core").InputSignal<"button" | "badge">;
6496
+ readonly variant: import("@angular/core").InputSignal<"badge" | "button">;
6497
+ /** Trigger size for `variant="button"`: `sm` (default, the compact toolbar look) or `md` (same padding and type as a medium `ui-button`). */
6498
+ readonly size: import("@angular/core").InputSignal<"sm" | "md">;
6494
6499
  readonly menuWidth: import("@angular/core").InputSignal<string>;
6495
6500
  /**
6496
6501
  * 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
@@ -6521,6 +6526,8 @@ export declare class DropdownComponent {
6521
6526
  private _typeahead;
6522
6527
  private _typeaheadTimer;
6523
6528
  private _destroyed;
6529
+ /** Identifies the current loader request, so a late or stale answer (menu closed / reopened meanwhile) is ignored. */
6530
+ private _loadToken;
6524
6531
  protected readonly triggerId: string;
6525
6532
  protected readonly menuId: string;
6526
6533
  protected readonly _ariaLabel: import("@angular/core").Signal<string | null>;
@@ -6590,6 +6597,11 @@ export declare class DropdownComponent {
6590
6597
  "required": false;
6591
6598
  "isSignal": true;
6592
6599
  };
6600
+ "size": {
6601
+ "alias": "size";
6602
+ "required": false;
6603
+ "isSignal": true;
6604
+ };
6593
6605
  "menuWidth": {
6594
6606
  "alias": "menuWidth";
6595
6607
  "required": false;
@@ -6811,7 +6823,7 @@ export declare class FormRowComponent {
6811
6823
  * child simply takes the full width. Keep a numeric span within the row's `cols` (use `all` for the whole row).
6812
6824
  */
6813
6825
  export declare class FormColSpanDirective {
6814
- readonly uiColSpan: import("@angular/core").InputSignal<"" | "2" | "3" | 2 | 3 | "all">;
6826
+ readonly uiColSpan: import("@angular/core").InputSignal<"" | 2 | 3 | "2" | "3" | "all">;
6815
6827
  protected readonly _class: import("@angular/core").Signal<string>;
6816
6828
  static ɵfac: i0.ɵɵFactoryDeclaration<FormColSpanDirective, never>;
6817
6829
  static ɵdir: i0.ɵɵDirectiveDeclaration<FormColSpanDirective, "[uiColSpan]", never, {
@@ -7813,6 +7825,10 @@ export declare class PanelInfoListComponent {
7813
7825
  isWeb(href: string): boolean;
7814
7826
  /** Link text: the value, else the email / phone as written. */
7815
7827
  textOf(item: PanelInfoItem): string;
7828
+ /** Plain value, or the dash for an empty / blank one. */
7829
+ valueOf(item: PanelInfoItem): string;
7830
+ /** A disabled header action never runs, even when the click reaches the host element. */
7831
+ runHeaderAction(ha: NonNullable<PanelInfoSection['headerAction']>): void;
7816
7832
  visibleItems(section: PanelInfoSection): PanelInfoItem[];
7817
7833
  static ɵfac: i0.ɵɵFactoryDeclaration<PanelInfoListComponent, never>;
7818
7834
  static ɵcmp: i0.ɵɵComponentDeclaration<PanelInfoListComponent, "ui-panel-info-list", never, {
@@ -8088,6 +8104,8 @@ export declare class AppShellComponent implements OnInit, OnDestroy {
8088
8104
  readonly logoutClick: import("@angular/core").OutputEmitterRef<void>;
8089
8105
  protected readonly _sidebarOpen: import("@angular/core").WritableSignal<boolean>;
8090
8106
  protected readonly _collapsed: import("@angular/core").WritableSignal<boolean>;
8107
+ /** The rail (icons-only sidebar) only exists on the desktop layout; on the drawer layout (≤1024px) a saved rail choice is ignored. */
8108
+ protected readonly _drawerLayout: import("@angular/core").WritableSignal<boolean>;
8091
8109
  protected readonly _isRail: import("@angular/core").Signal<boolean>;
8092
8110
  private readonly _collapsedGroups;
8093
8111
  protected readonly _visibleGroups: import("@angular/core").Signal<NavGroup[]>;
@@ -8096,6 +8114,8 @@ export declare class AppShellComponent implements OnInit, OnDestroy {
8096
8114
  private readonly _iconCache;
8097
8115
  _safeIcon(svg: string): SafeHtml;
8098
8116
  _visibleLinks(group: NavGroup): NavLink[];
8117
+ /** Groups can only be collapsed when there is more than one: a lone group stays open so the navigation can never be hidden. */
8118
+ protected _canCollapseGroups(): boolean;
8099
8119
  _isCollapsed(key: string): boolean;
8100
8120
  toggleGroup(key: string): void;
8101
8121
  private _readSavedGroups;
@@ -8104,9 +8124,26 @@ export declare class AppShellComponent implements OnInit, OnDestroy {
8104
8124
  toggleCollapsed(): void;
8105
8125
  private static readonly _COLLAPSE_KEY;
8106
8126
  private static _loadCollapsed;
8127
+ private readonly _host;
8128
+ private readonly _injector;
8129
+ private readonly _document;
8130
+ /** The drawer layout is exactly the complement of the desktop layout the CSS rail rules use (min-width: 1025px): no viewport width falls in between. */
8131
+ private static readonly _DRAWER_MQ;
8132
+ private static readonly _FOCUSABLE;
8133
+ private _sidebarFocusables;
8134
+ private _hamburger;
8107
8135
  toggleSidebar(): void;
8108
- closeSidebar(): void;
8136
+ /** Opens the drawer (drawer layout only; a no-op on desktop) and moves keyboard focus into it, so the links behind the backdrop are not reachable until it closes. */
8137
+ openSidebar(): void;
8138
+ /** Closes the drawer; `returnFocus` puts focus back on the hamburger that opened it (keyboard users keep their place). */
8139
+ closeSidebar(returnFocus?: boolean): void;
8140
+ /** Escape closes an open drawer; Tab stays inside it while it is open. */
8141
+ onShellKeydown(e: KeyboardEvent): void;
8142
+ /** Skip link: focuses the main content (`tabindex="-1"`) without changing the URL (the app uses the router). */
8143
+ skipToContent(e: Event): void;
8109
8144
  ngOnInit(): void;
8145
+ private _drawerMq?;
8146
+ private readonly _onDrawerMqChange;
8110
8147
  ngOnDestroy(): void;
8111
8148
  private _expandActiveGroup;
8112
8149
  static ɵfac: i0.ɵɵFactoryDeclaration<AppShellComponent, never>;
@@ -9876,7 +9913,7 @@ export declare class DetailCardComponent {
9876
9913
  /** true (default) = the title is displayed in capitals (CSS only); false = shown as written. The text, aria-label and heading name are never changed. */
9877
9914
  readonly uppercaseTitle: import("@angular/core").InputSignal<boolean>;
9878
9915
  /** 1-6 makes the title a real heading for screen readers (role=heading, aria-level); null keeps it plain text. */
9879
- readonly headingLevel: import("@angular/core").InputSignal<6 | 1 | 2 | 3 | 4 | 5 | null>;
9916
+ readonly headingLevel: import("@angular/core").InputSignal<1 | 2 | 5 | 3 | 6 | 4 | null>;
9880
9917
  /** Optional id for the title text; the card is then labelled by it. Without it the title is the card's aria-label. */
9881
9918
  readonly titleId: import("@angular/core").InputSignal<string>;
9882
9919
  /** Accessible name of the card when the header gives none (no header, or no title). A visible title wins; blank = no name. */