@forgeroute/ui 0.4.17 → 0.4.18

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.17",
3
+ "version": "0.4.18",
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<"sm" | "default">;
976
+ readonly size: import("@angular/core").InputSignal<"default" | "sm">;
977
977
  readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
978
978
  private readonly _cvaDisabled;
979
979
  protected readonly disabled: import("@angular/core").Signal<boolean>;
@@ -1237,6 +1237,13 @@ export declare class DataTableComponent<T extends Record<string, any>> implement
1237
1237
  * toolbar are all off, the header row above the table is not rendered at all.
1238
1238
  */
1239
1239
  readonly showSearch: import("@angular/core").InputSignal<boolean>;
1240
+ /**
1241
+ * Show the quick-filter tabs ("All / Active / ..."), which the table builds from the `/counts` endpoint. Defaults true:
1242
+ * with correct `/counts` data the tabs show. Set false for a table where the tabs add nothing (a small breakdown table in a
1243
+ * side panel); search, toolbar, column filters and the counts requests are unaffected. When the search box, the toolbar and the
1244
+ * tabs are all off, the header row is not rendered at all.
1245
+ */
1246
+ readonly showQuickTabs: import("@angular/core").InputSignal<boolean>;
1240
1247
  /** False when the header row would be empty (no search box, no toolbar, no quick-filter tabs). */
1241
1248
  protected readonly _showHeader: Signal<boolean>;
1242
1249
  /** Optional endpoint that returns Record<string,number> counts per quick-filter value. */
@@ -1765,6 +1772,11 @@ export declare class DataTableComponent<T extends Record<string, any>> implement
1765
1772
  "required": false;
1766
1773
  "isSignal": true;
1767
1774
  };
1775
+ "showQuickTabs": {
1776
+ "alias": "showQuickTabs";
1777
+ "required": false;
1778
+ "isSignal": true;
1779
+ };
1768
1780
  "countsEndpoint": {
1769
1781
  "alias": "countsEndpoint";
1770
1782
  "required": false;
@@ -1990,7 +2002,7 @@ export declare class ModalComponent implements OnInit, OnDestroy {
1990
2002
  readonly title: import("@angular/core").InputSignal<string>;
1991
2003
  readonly description: import("@angular/core").InputSignal<string>;
1992
2004
  readonly maxWidth: import("@angular/core").InputSignal<string>;
1993
- readonly bodyOverflow: import("@angular/core").InputSignal<"auto" | "visible" | "hidden">;
2005
+ readonly bodyOverflow: import("@angular/core").InputSignal<"hidden" | "auto" | "visible">;
1994
2006
  /** `data-testid` of the dialog element itself (the host `<ui-modal>` is always in the page, the dialog only while open). None when empty. */
1995
2007
  readonly dialogTestId: import("@angular/core").InputSignal<string>;
1996
2008
  /** Hides the header X button (e.g. while a request is running). Escape and a backdrop click still close unless `closable` is false. */
@@ -2374,7 +2386,7 @@ export declare class AudioPlayerComponent {
2374
2386
  /** Accessible name of the player. */
2375
2387
  readonly ariaLabel: import("@angular/core").InputSignal<string>;
2376
2388
  /** How much to load before play: 'metadata' (default), 'auto' or 'none'. */
2377
- readonly preload: import("@angular/core").InputSignal<"auto" | "none" | "metadata">;
2389
+ readonly preload: import("@angular/core").InputSignal<"none" | "auto" | "metadata">;
2378
2390
  /** Fires when the browser can't load or decode the source. */
2379
2391
  readonly playbackError: import("@angular/core").OutputEmitterRef<void>;
2380
2392
  protected readonly failed: import("@angular/core").WritableSignal<boolean>;
@@ -2624,7 +2636,7 @@ export declare class CheckboxComponent implements ControlValueAccessor, Validato
2624
2636
  * 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.
2625
2637
  * Default null: plain label text, exactly as before. Single mode only.
2626
2638
  */
2627
- readonly headingLevel: import("@angular/core").InputSignal<5 | 3 | 1 | 2 | 4 | 6 | null>;
2639
+ readonly headingLevel: import("@angular/core").InputSignal<1 | 2 | 3 | 4 | 5 | 6 | null>;
2628
2640
  readonly indeterminate: import("@angular/core").InputSignal<boolean>;
2629
2641
  readonly checked: import("@angular/core").ModelSignal<boolean>;
2630
2642
  /**
@@ -3514,7 +3526,7 @@ export declare class PhoneNumberPickerComponent {
3514
3526
  protected readonly modeCtl: FormControl<string>;
3515
3527
  protected readonly zipCtl: FormControl<string>;
3516
3528
  protected readonly areaCtl: FormControl<string>;
3517
- protected readonly step: import("@angular/core").WritableSignal<3 | 1 | 2>;
3529
+ protected readonly step: import("@angular/core").WritableSignal<1 | 2 | 3>;
3518
3530
  protected readonly mode: import("@angular/core").WritableSignal<PhoneNumberSearchMode>;
3519
3531
  private readonly _zip;
3520
3532
  private readonly _area;
@@ -3628,7 +3640,7 @@ export declare class ButtonComponent {
3628
3640
  * `ghost-start`: a ghost button for list / section toggles - a full-width row with its content aligned to the start, transparent
3629
3641
  * background, hover tint and the normal focus ring. Pair it with `ariaExpanded` / `ariaPressed`; the label may contain a heading element.
3630
3642
  */
3631
- readonly variant: import("@angular/core").InputSignal<"primary" | "danger" | "warning" | "link" | "secondary" | "ghost" | "ghost-start" | "tab" | "icon" | "icon-danger">;
3643
+ readonly variant: import("@angular/core").InputSignal<"primary" | "secondary" | "danger" | "warning" | "link" | "ghost" | "ghost-start" | "tab" | "icon" | "icon-danger">;
3632
3644
  /** 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`). */
3633
3645
  readonly routerLink: import("@angular/core").InputSignal<string | readonly unknown[] | null>;
3634
3646
  /** Query params of the `routerLink` (e.g. `{ section: 'deal-defaults' }`). */
@@ -3674,7 +3686,7 @@ export declare class ButtonComponent {
3674
3686
  readonly color: import("@angular/core").InputSignal<string | undefined>;
3675
3687
  readonly active: import("@angular/core").InputSignal<boolean>;
3676
3688
  readonly size: import("@angular/core").InputSignal<"sm" | "md" | "lg" | "xs">;
3677
- readonly type: import("@angular/core").InputSignal<"button" | "submit" | "reset">;
3689
+ readonly type: import("@angular/core").InputSignal<"reset" | "submit" | "button">;
3678
3690
  readonly disabled: import("@angular/core").InputSignal<boolean>;
3679
3691
  readonly loading: import("@angular/core").InputSignal<boolean>;
3680
3692
  readonly fullWidth: import("@angular/core").InputSignal<boolean>;
@@ -4069,7 +4081,7 @@ export declare class BulkMessagePanelComponent {
4069
4081
  readonly sending: import("@angular/core").InputSignal<boolean>;
4070
4082
  readonly closed: import("@angular/core").OutputEmitterRef<void>;
4071
4083
  readonly send: import("@angular/core").OutputEmitterRef<BulkMessageSendEvent>;
4072
- readonly channel: import("@angular/core").WritableSignal<"email" | "text">;
4084
+ readonly channel: import("@angular/core").WritableSignal<"text" | "email">;
4073
4085
  private readonly _subject;
4074
4086
  private readonly _body;
4075
4087
  get subject(): string;
@@ -4278,7 +4290,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
4278
4290
  readonly passwordRequirements: import("@angular/core").InputSignal<boolean>;
4279
4291
  /** Rules for `passwordRequirements`; default = the library's five rules (8+ characters, upper, lower, digit, special). */
4280
4292
  readonly passwordRules: import("@angular/core").InputSignal<readonly PasswordRule[] | undefined>;
4281
- readonly type: import("@angular/core").InputSignal<"number" | "email" | "text" | "tel" | "password" | "url">;
4293
+ readonly type: import("@angular/core").InputSignal<"number" | "text" | "email" | "tel" | "password" | "url">;
4282
4294
  readonly maxlength: import("@angular/core").InputSignal<number | undefined>;
4283
4295
  readonly required: import("@angular/core").InputSignal<boolean>;
4284
4296
  readonly autocomplete: import("@angular/core").InputSignal<string>;
@@ -4287,7 +4299,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
4287
4299
  * `search`, `text`, `none`). Empty (default) = the browser's default for the field, except `type="tel"`, which keeps `tel`.
4288
4300
  * It only picks the keyboard; it does not restrict what can be typed or pasted.
4289
4301
  */
4290
- readonly inputmode: import("@angular/core").InputSignal<"" | "email" | "text" | "none" | "search" | "tel" | "url" | "decimal" | "numeric">;
4302
+ readonly inputmode: import("@angular/core").InputSignal<"" | "none" | "text" | "search" | "email" | "tel" | "url" | "decimal" | "numeric">;
4291
4303
  readonly readonly: import("@angular/core").InputSignal<boolean>;
4292
4304
  readonly hint: import("@angular/core").InputSignal<string>;
4293
4305
  readonly error: import("@angular/core").InputSignal<string>;
@@ -4351,7 +4363,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
4351
4363
  protected readonly _stepAttr: import("@angular/core").Signal<string | null>;
4352
4364
  protected readonly _revealable: import("@angular/core").Signal<boolean>;
4353
4365
  protected readonly _shown: import("@angular/core").WritableSignal<boolean>;
4354
- protected readonly _inputType: import("@angular/core").Signal<"number" | "email" | "text" | "tel" | "password" | "url">;
4366
+ protected readonly _inputType: import("@angular/core").Signal<"number" | "text" | "email" | "tel" | "password" | "url">;
4355
4367
  protected readonly _eyePath: string;
4356
4368
  protected readonly _eyeOffPath: string;
4357
4369
  protected readonly _showRequirements: import("@angular/core").Signal<boolean>;
@@ -5875,7 +5887,7 @@ export declare class FormSectionComponent {
5875
5887
  }, {}, never, ["*"], true, never>;
5876
5888
  }
5877
5889
  export declare class FormRowComponent {
5878
- readonly cols: import("@angular/core").InputSignal<3 | 1 | 2 | 4>;
5890
+ readonly cols: import("@angular/core").InputSignal<1 | 2 | 3 | 4>;
5879
5891
  static ɵfac: i0.ɵɵFactoryDeclaration<FormRowComponent, never>;
5880
5892
  static ɵcmp: i0.ɵɵComponentDeclaration<FormRowComponent, "ui-form-row", never, {
5881
5893
  "cols": {
@@ -5892,7 +5904,7 @@ export declare class FormRowComponent {
5892
5904
  * child simply takes the full width. Keep a numeric span within the row's `cols` (use `all` for the whole row).
5893
5905
  */
5894
5906
  export declare class FormColSpanDirective {
5895
- readonly uiColSpan: import("@angular/core").InputSignal<"" | 3 | 2 | "2" | "3" | "all">;
5907
+ readonly uiColSpan: import("@angular/core").InputSignal<"" | "2" | "3" | 2 | 3 | "all">;
5896
5908
  protected readonly _class: import("@angular/core").Signal<string>;
5897
5909
  static ɵfac: i0.ɵɵFactoryDeclaration<FormColSpanDirective, never>;
5898
5910
  static ɵdir: i0.ɵɵDirectiveDeclaration<FormColSpanDirective, "[uiColSpan]", never, {
@@ -5932,6 +5944,14 @@ export declare class FormColSpanDirective {
5932
5944
  * <ui-button list-item-action variant="icon" ariaLabel="Remove" (click)="remove(d)">…</ui-button>
5933
5945
  * </ui-list-item>
5934
5946
  */
5947
+ /** One secondary line under the title: plain text, or text with a small icon and a tone (`danger` red, `warning` amber). */
5948
+ export type ListItemDetail = string | {
5949
+ text: string;
5950
+ icon?: string;
5951
+ tone?: 'default' | 'warning' | 'danger';
5952
+ };
5953
+ /** Colour of the optional leading icon tile. */
5954
+ export type ListItemIconColor = 'slate' | 'amber' | 'red' | 'blue' | 'green' | 'purple' | 'teal' | 'orange';
5935
5955
  export declare class ListItemComponent {
5936
5956
  /** Show a radio button, checkbox, or nothing on the left. */
5937
5957
  readonly leading: import("@angular/core").InputSignal<"none" | "checkbox" | "radio">;
@@ -5970,10 +5990,19 @@ export declare class ListItemComponent {
5970
5990
  * Pass whatever is relevant — email, phone, date, role, address, etc.
5971
5991
  * Falsy entries (null, undefined, '') are filtered out automatically.
5972
5992
  */
5973
- readonly details: import("@angular/core").InputSignal<(string | null | undefined)[]>;
5993
+ readonly details: import("@angular/core").InputSignal<(ListItemDetail | null | undefined)[]>;
5994
+ /** Optional leading icon: an icon key of `<ui-icon>` (e.g. `bell`, `task`, `email`) drawn in a tinted tile before the text. Default none. */
5995
+ readonly icon: import("@angular/core").InputSignal<string>;
5996
+ /** Colour of the icon tile. */
5997
+ readonly iconColor: import("@angular/core").InputSignal<ListItemIconColor>;
5998
+ protected readonly iconD: () => string | null;
5974
5999
  /** Emitted when the radio/checkbox changes. */
5975
6000
  readonly select: import("@angular/core").OutputEmitterRef<void>;
5976
- protected readonly visibleDetails: () => string[];
6001
+ protected readonly visibleDetails: () => {
6002
+ text: string;
6003
+ d: string | null;
6004
+ tone: "default" | "warning" | "danger";
6005
+ }[];
5977
6006
  static ɵfac: i0.ɵɵFactoryDeclaration<ListItemComponent, never>;
5978
6007
  static ɵcmp: i0.ɵɵComponentDeclaration<ListItemComponent, "ui-list-item", never, {
5979
6008
  "leading": {
@@ -6041,6 +6070,16 @@ export declare class ListItemComponent {
6041
6070
  "required": false;
6042
6071
  "isSignal": true;
6043
6072
  };
6073
+ "icon": {
6074
+ "alias": "icon";
6075
+ "required": false;
6076
+ "isSignal": true;
6077
+ };
6078
+ "iconColor": {
6079
+ "alias": "iconColor";
6080
+ "required": false;
6081
+ "isSignal": true;
6082
+ };
6044
6083
  }, {
6045
6084
  "select": "select";
6046
6085
  }, never, ["[list-item-action], [li-action]"], true, never>;
@@ -6174,6 +6213,10 @@ export declare class ListComponent<T = unknown> {
6174
6213
  /** Announcement after a move; receives the row label, the new position (1-based) and the list size. */
6175
6214
  readonly moveAnnouncement: import("@angular/core").InputSignal<(label: string, position: number, total: number) => string>;
6176
6215
  /** Fires with the new array when the user moves a row (`[(items)]`). The list does not change `items` itself. */
6216
+ /** Shows an arrow at the end of every row and makes the row open something: a click or Enter on the row (not on a button or link inside it) emits `itemClick`. Default false: no arrow, rows are not clickable. */
6217
+ readonly navigable: import("@angular/core").InputSignal<boolean>;
6218
+ /** The row of `[navigable]` that was clicked (or Enter was pressed on). */
6219
+ readonly itemClick: import("@angular/core").OutputEmitterRef<T>;
6177
6220
  readonly itemsChange: import("@angular/core").OutputEmitterRef<T[]>;
6178
6221
  /** Fires when the user moves a row. The host applies it (or uses `[(items)]`) and passes the new `items`. */
6179
6222
  readonly reorder: import("@angular/core").OutputEmitterRef<ListReorderEvent<T>>;
@@ -6202,6 +6245,8 @@ export declare class ListComponent<T = unknown> {
6202
6245
  * reordering is off or disabled, `from` is out of range, or nothing would change. Does not touch focus.
6203
6246
  */
6204
6247
  move(from: number, to: number): boolean;
6248
+ /** `[navigable]`: a click / Enter on the row itself emits the item; clicks on a control inside the row (button, link, field) are theirs. */
6249
+ private emitItemClick;
6205
6250
  protected onKeydown(e: KeyboardEvent): void;
6206
6251
  protected onClick(e: Event): void;
6207
6252
  protected onFocusOut(e: FocusEvent): void;
@@ -6301,7 +6346,13 @@ export declare class ListComponent<T = unknown> {
6301
6346
  "required": false;
6302
6347
  "isSignal": true;
6303
6348
  };
6349
+ "navigable": {
6350
+ "alias": "navigable";
6351
+ "required": false;
6352
+ "isSignal": true;
6353
+ };
6304
6354
  }, {
6355
+ "itemClick": "itemClick";
6305
6356
  "itemsChange": "itemsChange";
6306
6357
  "reorder": "reorder";
6307
6358
  }, ["rowTemplate"], ["[list-empty]"], true, never>;
@@ -6924,7 +6975,7 @@ export declare class AlertComponent {
6924
6975
  /** The SVG path (24×24 stroke icon) for an icon key, or undefined when the key is unknown. */
6925
6976
  export declare function iconPath(name: string): string | undefined;
6926
6977
  /** Keys with an icon of their own (the data-table action keys are accepted too — see `builtInActionIcon`). */
6927
- export type IconName = 'add' | 'close' | 'check' | 'upload' | 'image' | 'chevron-up' | 'chevron-down' | 'arrow-left' | 'bell' | 'print' | 'lock' | 'shield' | 'arrow-up' | 'arrow-down' | 'arrow-right' | 'document' | 'grip' | 'card' | 'bank' | 'view' | 'view-off' | 'edit' | 'delete' | 'download' | 'duplicate' | 'archive' | 'restore' | 'share' | 'email' | 'message' | 'call';
6978
+ export type IconName = 'add' | 'close' | 'check' | 'upload' | 'image' | 'chevron-up' | 'chevron-down' | 'arrow-left' | 'bell' | 'print' | 'lock' | 'shield' | 'arrow-up' | 'arrow-down' | 'arrow-right' | 'document' | 'grip' | 'card' | 'bank' | 'view' | 'view-off' | 'edit' | 'delete' | 'download' | 'duplicate' | 'archive' | 'restore' | 'share' | 'email' | 'message' | 'call' | 'refund' | 'chevron-right';
6928
6979
  /**
6929
6980
  * A clickable icon. The host passes a key (`name="delete"`) and the library draws that icon; clicking it emits
6930
6981
  * `iconClick`, and the host does the actual work (delete the row, open a panel, …).
@@ -7527,7 +7578,7 @@ export type KpiCardValueColor = 'default' | 'green' | 'blue' | 'red';
7527
7578
  * Optional background: `background="#fef2f2"` fills the card with any CSS colour (default white), e.g. a soft red for money going out; the
7528
7579
  * text keeps its own colours, so pick a light shade.
7529
7580
  *
7530
- * Optional ring: `[progress]="67"` (+ `progressMax`, `progressVariant`, `progressSize`) draws a ui-progress-ring beside the label; extra lines
7581
+ * Optional ring (top-right corner, level with the icon when the card has one — no extra height; beside the label otherwise): `[progress]="67"` (+ `progressMax`, `progressVariant`, `progressSize`) draws a ui-progress-ring beside the label; extra lines
7531
7582
  * (a pace badge, a projection…) go in an element with the `kpi-footer` attribute.
7532
7583
  *
7533
7584
  * <ui-kpi-card label="Deals Closed" [value]="'' + deals" subtitle="Year to Date" icon="check-circle" color="blue" />
@@ -8483,7 +8534,7 @@ export declare class DetailCardComponent {
8483
8534
  /** true (default) = the title is displayed in capitals (CSS only); false = shown as written. The text, aria-label and heading name are never changed. */
8484
8535
  readonly uppercaseTitle: import("@angular/core").InputSignal<boolean>;
8485
8536
  /** 1-6 makes the title a real heading for screen readers (role=heading, aria-level); null keeps it plain text. */
8486
- readonly headingLevel: import("@angular/core").InputSignal<5 | 3 | 1 | 2 | 4 | 6 | null>;
8537
+ readonly headingLevel: import("@angular/core").InputSignal<1 | 2 | 3 | 4 | 5 | 6 | null>;
8487
8538
  /** Optional id for the title text; the card is then labelled by it. Without it the title is the card's aria-label. */
8488
8539
  readonly titleId: import("@angular/core").InputSignal<string>;
8489
8540
  /** Accessible name of the card when the header gives none (no header, or no title). A visible title wins; blank = no name. */
@@ -8941,7 +8992,8 @@ export declare class ColorInputComponent implements ControlValueAccessor, Valida
8941
8992
  * 'md' (default) 1rem (16px) title, 0.8125rem description, 28px tile, 16px icon; padding 14px 18px (12px 14px at 480px and narrower)
8942
8993
  * 'lg' 1.25rem (20px) title, 0.9375rem description, 36px tile, 20px icon; padding 18px 22px (14px 16px at 480px and narrower)
8943
8994
  * 'xl' 1.5rem (24px) title (1.375rem at 480px and narrower), 1rem description, 44px tile, 24px icon; padding 22px 26px (16px 18px at 480px and narrower)
8944
- * Padding is built in per size - there is no padding input.
8995
+ * Padding is built in per size. To drop one side of it use `noPaddingTop`, `noPaddingLeft` or `noPaddingBottom` (booleans, default
8996
+ * false; combine freely). Only that side becomes 0 at every size and screen width; the other sides keep their padding.
8945
8997
  *
8946
8998
  * Content slots:
8947
8999
  * - `[section-header-icon]`: your own icon (an `<svg>`, an `<img>` ...) shown in the tile instead of the `icon` input.
@@ -8974,6 +9026,12 @@ export declare class SectionHeaderComponent {
8974
9026
  readonly bordered: import("@angular/core").InputSignal<boolean>;
8975
9027
  /** Visual size: 'sm', 'md' (default), 'lg' or 'xl'. Independent of `level`; anything else renders as 'md'. */
8976
9028
  readonly size: import("@angular/core").InputSignal<"sm" | "md" | "lg" | "xl">;
9029
+ /** Remove the built-in top padding. */
9030
+ readonly noPaddingTop: import("@angular/core").InputSignal<boolean>;
9031
+ /** Remove the built-in left padding. */
9032
+ readonly noPaddingLeft: import("@angular/core").InputSignal<boolean>;
9033
+ /** Remove the built-in bottom padding. */
9034
+ readonly noPaddingBottom: import("@angular/core").InputSignal<boolean>;
8977
9035
  protected readonly titleId: string;
8978
9036
  protected readonly descriptionId: string;
8979
9037
  protected readonly headingLevel: import("@angular/core").Signal<number>;
@@ -9030,6 +9088,21 @@ export declare class SectionHeaderComponent {
9030
9088
  "required": false;
9031
9089
  "isSignal": true;
9032
9090
  };
9091
+ "noPaddingTop": {
9092
+ "alias": "noPaddingTop";
9093
+ "required": false;
9094
+ "isSignal": true;
9095
+ };
9096
+ "noPaddingLeft": {
9097
+ "alias": "noPaddingLeft";
9098
+ "required": false;
9099
+ "isSignal": true;
9100
+ };
9101
+ "noPaddingBottom": {
9102
+ "alias": "noPaddingBottom";
9103
+ "required": false;
9104
+ "isSignal": true;
9105
+ };
9033
9106
  }, {}, never, ["[section-header-icon]", "[section-header-actions]"], true, never>;
9034
9107
  }
9035
9108
  /**